diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 2da1c4d28..e1a9291b7 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -11,183 +11,189 @@ import Icons from "unplugin-icons/vite"; const webLib = fileURLToPath(new URL("../web/src/lib", import.meta.url)); export default defineConfig({ - site: "https://docs.tangled.org", - integrations: [ - starlight({ - title: "Tangled Docs", - titleDelimiter: "ยท", - description: - "Documentation for Tangled โ€” decentralized code collaboration built on the AT Protocol.", - favicon: "/favicon.svg", - head: [ - { - tag: "link", - attrs: { rel: "apple-touch-icon", href: "/apple-touch-icon.png" }, - }, - ], - logo: { - light: "./src/assets/logotype-light.svg", - dark: "./src/assets/logotype-dark.svg", - replacesTitle: true, - }, - editLink: { - baseUrl: "https://tangled.org/@tangled.org/core/blob/master/docs/", - }, - customCss: [ - "./src/styles/global.css", - "./src/styles/tangled.css", - "./src/styles/custom.css", - "./src/styles/diagrams.css", - ], - components: { - Header: "./src/components/Header.astro", - Hero: "./src/components/Hero.astro", - MarkdownContent: "./src/components/MarkdownContent.astro", - MobileMenuFooter: "./src/components/MobileMenuFooter.astro", - Sidebar: "./src/components/Sidebar.astro", - ThemeSelect: "./src/components/ThemeToggle.astro", - }, - expressiveCode: { - // same palettes as the web app's syntax tokens - themes: ["catppuccin-macchiato", "catppuccin-latte"], - // a plain bordered block like tangled.org's, no editor or terminal chrome - defaultProps: { frame: "none" }, - styleOverrides: { - borderRadius: "var(--radius-sm)", - borderColor: "var(--color-border-default)", - borderWidth: "1px", - codeBackground: "var(--color-background-canvas)", - codeFontFamily: "var(--font-mono)", - codeFontSize: "0.8125rem", - codeLineHeight: "1.5385", - codePaddingBlock: "0.75rem", - codePaddingInline: "0.75rem", - frames: { - shadowColor: "transparent", - frameBoxShadowCssValue: "none", - }, - }, - }, - sidebar: [ - { - label: "Getting started", - items: ["introduction", "quick-start", "coming-from-github", "why-atproto"], - }, - { - label: "Using Tangled", - items: [ - "guides/repositories", - "guides/issues", - "guides/pull-requests", - "guides/access", - "guides/social", - "guides/notifications", - "guides/search", - "guides/strings", - "guides/organizations", - "guides/signing-commits", - "guides/importing", - "sites", - "guides/account", - "troubleshooting", - ], - }, - { - label: "CI", - items: [ - "spindles", - "spindles/writing-workflows", - "spindles/workflows", - "spindles/secrets", - "spindles/runs", - "spindles/webhooks", - ], - }, - { - label: "Architecture", - items: [ - "architecture/overview", - "architecture/federation", - "architecture/identity", - "architecture/data-model", - "architecture/data-flow", - "architecture/security", - ], - }, - { - label: "Components", - items: [ - { label: "Knot", slug: "knots" }, - { label: "Spindle", slug: "spindles/architecture" }, - { label: "Bobbin", slug: "components/bobbin" }, - { label: "Gitmirror", slug: "components/gitmirror" }, - { label: "Other services", slug: "components/other-services" }, - ], - }, - { - label: "Self-hosting", - items: [ - "self-hosting", - { - label: "Knots", - items: [ - { label: "Running a knot", slug: "knots/self-hosting" }, - { label: "Migrating to knot 2", slug: "knots/migrating-to-knot-2" }, - ], - }, - { - label: "Spindles", - items: [ - { label: "Running a spindle", slug: "spindles/self-hosting" }, - { label: "Secrets with OpenBao", slug: "spindles/openbao" }, - ], - }, - "self-hosting/index-and-frontend", - "self-hosting/backups", - "self-hosting/network", - "reference/migrations", - ], - }, - { - label: "Reference", - items: [ - "reference/glossary", - "reference/records", - "reference/xrpc", - "reference/identifiers", - "reference/knot-config", - "reference/spindle-config", - "reference/bobbin", - "reference/webhooks", - ], - }, - { - label: "Contributing", - items: ["contributing/hacking", "contributing/guide", "status"], - }, - ], - }), - svelte(), - ], - vite: { - plugins: [tailwindcss(), Icons({ compiler: "svelte" })], - resolve: { - // same aliases the web app's components import through - alias: { - $lib: webLib, - "$icon/": "~icons/lucide/", - }, - // web/ has no node_modules in the nix build: resolve the components' - // runtime deps (and svelte itself, which must be a single copy) from here - dedupe: ["svelte", "tailwind-variants", "tailwind-merge"], - }, - server: { - fs: { - allow: [ - fileURLToPath(new URL(".", import.meta.url)), - fileURLToPath(new URL("../web/src", import.meta.url)), - ], - }, - }, - }, + site: "https://docs.tangled.org", + integrations: [ + starlight({ + title: "Tangled Docs", + titleDelimiter: "ยท", + disable404Route: true, + description: + "Documentation for Tangled โ€” decentralized code collaboration built on the AT Protocol.", + favicon: "/favicon.svg", + head: [ + { + tag: "link", + attrs: { rel: "apple-touch-icon", href: "/apple-touch-icon.png" }, + }, + ], + logo: { + light: "./src/assets/logotype-light.svg", + dark: "./src/assets/logotype-dark.svg", + replacesTitle: true, + }, + editLink: { + baseUrl: "https://tangled.org/@tangled.org/core/blob/master/docs/", + }, + customCss: [ + "./src/styles/global.css", + "./src/styles/tangled.css", + "./src/styles/custom.css", + "./src/styles/diagrams.css", + ], + components: { + Header: "./src/components/Header.astro", + Hero: "./src/components/Hero.astro", + MarkdownContent: "./src/components/MarkdownContent.astro", + MobileMenuFooter: "./src/components/MobileMenuFooter.astro", + Sidebar: "./src/components/Sidebar.astro", + ThemeSelect: "./src/components/ThemeToggle.astro", + }, + expressiveCode: { + // same palettes as the web app's syntax tokens + themes: ["catppuccin-macchiato", "catppuccin-latte"], + // a plain bordered block like tangled.org's, no editor or terminal chrome + defaultProps: { frame: "none" }, + styleOverrides: { + // expressive-code adds borderWidth to this for the outer + // radius, so subtract it to land on --radius-md exactly + borderRadius: "calc(var(--radius-md) - 1px)", + borderColor: "var(--color-border-default)", + borderWidth: "1px", + codeBackground: "var(--color-background-canvas)", + codeFontFamily: "var(--font-mono)", + codeFontSize: "0.8125rem", + codeLineHeight: "1.5385", + codePaddingBlock: "0.75rem", + codePaddingInline: "0.75rem", + frames: { + shadowColor: "transparent", + frameBoxShadowCssValue: "none", + }, + }, + }, + sidebar: [ + { + label: "Getting started", + items: [ + "introduction", + "quick-start", + "comparison-with-github", + "migrating-from-github", + "why-atproto", + ], + }, + { + label: "Using Tangled", + items: [ + "guides/repositories", + "guides/pull-requests", + "guides/access", + "guides/social", + "guides/notifications", + "guides/strings", + "guides/organizations", + "guides/signing-commits", + "guides/importing", + "sites", + "troubleshooting", + ], + }, + { + label: "CI", + items: [ + "spindles", + "spindles/writing-workflows", + "spindles/workflows", + "spindles/secrets", + "spindles/runs", + "spindles/webhooks", + ], + }, + { + label: "Architecture", + items: [ + "architecture/overview", + "architecture/federation", + "architecture/identity", + "architecture/data-model", + "architecture/data-flow", + "architecture/security", + ], + }, + { + label: "Components", + items: [ + { label: "Knot", slug: "knots" }, + { label: "Spindle", slug: "spindles/architecture" }, + { label: "Bobbin", slug: "components/bobbin" }, + { label: "Gitmirror", slug: "components/gitmirror" }, + { label: "Other services", slug: "components/other-services" }, + ], + }, + { + label: "Self-hosting", + items: [ + "self-hosting", + { + label: "Knots", + items: [ + { label: "Running a knot", slug: "knots/self-hosting" }, + { label: "Migrating to knot 2", slug: "knots/migrating-to-knot-2" }, + ], + }, + { + label: "Spindles", + items: [ + { label: "Running a spindle", slug: "spindles/self-hosting" }, + { label: "Secrets with OpenBao", slug: "spindles/openbao" }, + ], + }, + "self-hosting/index-and-frontend", + "self-hosting/backups", + "self-hosting/network", + "reference/migrations", + ], + }, + { + label: "Reference", + items: [ + "reference/glossary", + "reference/records", + "reference/xrpc", + "reference/identifiers", + "reference/knot-config", + "reference/spindle-config", + "reference/bobbin", + "reference/webhooks", + ], + }, + { + label: "Contributing", + items: ["contributing/hacking", "contributing/guide", "status"], + }, + ], + }), + svelte(), + ], + vite: { + plugins: [tailwindcss(), Icons({ compiler: "svelte" })], + resolve: { + // same aliases the web app's components import through + alias: { + $lib: webLib, + "$icon/": "~icons/lucide/", + }, + // web/ has no node_modules in the nix build: resolve the components' + // runtime deps (and svelte itself, which must be a single copy) from here + dedupe: ["svelte", "tailwind-variants", "tailwind-merge"], + }, + server: { + fs: { + allow: [ + fileURLToPath(new URL(".", import.meta.url)), + fileURLToPath(new URL("../web/src", import.meta.url)), + ], + }, + }, + }, }); diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 03d3169dc..43012ecaa 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -10,35 +10,52 @@ importers: dependencies: '@astrojs/starlight': specifier: ^0.36.0 - version: 0.36.3(astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3)) - '@fontsource-variable/inter': - specifier: ^5.2.5 - version: 5.3.0 - '@fontsource/ibm-plex-mono': - specifier: ^5.2.5 - version: 5.3.0 + version: 0.36.3(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3)) + '@astrojs/starlight-tailwind': + specifier: ^4.0.2 + version: 4.0.2(@astrojs/starlight@0.36.3(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3)))(tailwindcss@4.3.3) + '@astrojs/svelte': + specifier: ^7.2.5 + version: 7.2.5(@types/node@24.13.3)(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3))(jiti@2.7.0)(lightningcss@1.32.0)(svelte@5.57.2)(typescript@5.9.3) + '@tailwindcss/vite': + specifier: ^4.3.3 + version: 4.3.3(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)) astro: specifier: ^5.14.0 - version: 5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3) - lucide-astro: - specifier: ^0.545.0 - version: 0.545.0(astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3)) + version: 5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3) sharp: specifier: ^0.34.0 version: 0.34.5 - devDependencies: - '@tailwindcss/typography': - specifier: ^0.5.20 - version: 0.5.20(tailwindcss@3.4.19) + svelte: + specifier: ^5.57.2 + version: 5.57.2 + tailwind-merge: + specifier: ^3.7.0 + version: 3.7.0 + tailwind-variants: + specifier: ^3.3.1 + version: 3.3.1(tailwind-merge@3.7.0)(tailwindcss@4.3.3) tailwindcss: - specifier: ^3.4.19 - version: 3.4.19 + specifier: ^4.3.3 + version: 4.3.3 + devDependencies: + '@iconify-json/lucide': + specifier: ^1.2.140 + version: 1.2.142 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + unplugin-icons: + specifier: ^24.0.0 + version: 24.0.0(esbuild@0.27.7)(rollup@4.62.4)(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)) packages: - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/install-pkg@2.1.0': + resolution: {integrity: sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==} '@astrojs/compiler@2.13.1': resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} @@ -62,11 +79,25 @@ packages: '@astrojs/sitemap@3.7.3': resolution: {integrity: sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==} + '@astrojs/starlight-tailwind@4.0.2': + resolution: {integrity: sha512-SYN/6zq6hJO5tWqbQ2tWT9/jd8ubUkzkBCcF94vByC/ZJ20Mi5GPjFvAh89Yky/aIM+jXxT6W5q4p6l58GKHiQ==} + peerDependencies: + '@astrojs/starlight': '>=0.34.0' + tailwindcss: ^4.0.0 + '@astrojs/starlight@0.36.3': resolution: {integrity: sha512-5cm4QVQHUP6ZE52O43TtUpsTvLKdZa9XEs4l3suzuY7Ymsbz4ojtoL9NhistbMqM+/qk6fm6SmxbOL6hQ/LfNA==} peerDependencies: astro: ^5.5.0 + '@astrojs/svelte@7.2.5': + resolution: {integrity: sha512-Tl5aF/dYbzzd7sLpxMBX6pRz3yJ1B4pilt9G3GJbj0I0/doJHIEmerNQsnlxX0/InNKUhMXXN8wyyet9VhA+Zw==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + astro: ^5.0.0 + svelte: ^5.1.16 + typescript: ^5.3.3 + '@astrojs/telemetry@3.3.0': resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} @@ -427,11 +458,14 @@ packages: '@expressive-code/plugin-text-markers@0.41.7': resolution: {integrity: sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==} - '@fontsource-variable/inter@5.3.0': - resolution: {integrity: sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==} + '@iconify-json/lucide@1.2.142': + resolution: {integrity: sha512-vEGX5X52/l77jRMcmxXk3PiEebldDUs8WFdM8X3Evq1S9p5F+o0VZhx8sqaQsmFEB9Ukp5ND5Q/0g2kQ/LF+rQ==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@fontsource/ibm-plex-mono@5.3.0': - resolution: {integrity: sha512-eTgnZjZEGk1QtD3ZstF+Vclo2HLAni8YMy34/DxllwZvyz1lR/1RF/xTiAquOBO7MvqBx8D2Ig2WCPMVfdZu7Q==} + '@iconify/utils@3.1.7': + resolution: {integrity: sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==} '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} @@ -589,6 +623,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -596,6 +633,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -609,18 +649,6 @@ packages: os: [linux] libc: [glibc] - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} @@ -830,10 +858,119 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@tailwindcss/typography@0.5.20': - resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==} + '@sveltejs/acorn-typescript@1.0.13': + resolution: {integrity: sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - tailwindcss: '>=3.0.0 || >=4.0.0 || insiders' + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: {integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} + + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.3': + resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} @@ -902,9 +1039,6 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -915,6 +1049,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.1: + resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} + engines: {node: '>= 0.4'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -952,10 +1090,6 @@ packages: bcp-47@2.1.1: resolution: {integrity: sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -963,14 +1097,6 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -994,10 +1120,6 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} @@ -1024,13 +1146,15 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.3.1: + resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==} + cookie-es@1.2.3: resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} @@ -1080,6 +1204,13 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} @@ -1101,12 +1232,12 @@ packages: devalue@5.9.0: resolution: {integrity: sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==} + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff@8.0.4: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} @@ -1141,6 +1272,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + enhanced-resolve@5.26.0: + resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1149,10 +1284,6 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -1176,6 +1307,17 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esrap@2.4.0: + resolution: {integrity: sha512-CQPcneEHw/czj32uwQC52nYnax8H4SXt25FCM+LIwGZ49cMIxpOj3bP8wmzcI+Z0HIy5KkClaPhRLfCySzwHPA==} + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true + estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -1206,16 +1348,12 @@ packages: expressive-code@0.41.7: resolution: {integrity: sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==} + exsolve@1.1.3: + resolution: {integrity: sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1225,10 +1363,6 @@ packages: picomatch: optional: true - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} @@ -1245,9 +1379,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-east-asian-width@1.6.0: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} @@ -1255,21 +1386,12 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} - hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} @@ -1360,14 +1482,6 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-core-module@2.16.2: - resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} - engines: {node: '>= 0.4'} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -1376,18 +1490,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -1396,20 +1502,19 @@ packages: engines: {node: '>=14.16'} hasBin: true - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true js-yaml@4.3.1: @@ -1420,16 +1525,94 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -1438,12 +1621,6 @@ packages: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} - lucide-astro@0.545.0: - resolution: {integrity: sha512-KBSQTlW4e+tT6DvWEWcqxWa2WubWdqhLG7/WQgnAawQ29ZAEUfTqo2At9IW9xlrG1k8qrVwzeGQfeumiMsgI6Q==} - deprecated: 'Deprecated: Use `@lucide/astro`' - peerDependencies: - astro: '>=2.7.1' - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -1517,10 +1694,6 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -1629,9 +1802,8 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -1640,9 +1812,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.17: resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1668,13 +1837,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} @@ -1716,8 +1881,8 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} piccolore@0.1.3: resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} @@ -1733,43 +1898,15 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - postcss-js@4.1.0: - resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true + pkg-types@2.3.3: + resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} @@ -1777,17 +1914,10 @@ packages: peerDependencies: postcss: ^8.2.14 - postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - postcss-selector-parser@6.1.4: resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} engines: {node: '>=4'} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.25: resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} engines: {node: ^10 || ^12 || >=14} @@ -1803,19 +1933,12 @@ packages: property-information@7.2.0: resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -1886,11 +2009,6 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} - engines: {node: '>= 0.4'} - hasBin: true - retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -1903,22 +2021,18 @@ packages: retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.62.4: resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - sax@1.6.1: resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -1982,31 +2096,42 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + svelte2tsx@0.7.61: + resolution: {integrity: sha512-EpQ/+UHITBULeUojx/LLD3uTYasZXcX1BrqlrzfLUnT9vdUhaOWK59a3ryWcFU8L0sY1SP+gRhJ2Beiis98+qw==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 || ^6.0.0 - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + svelte@5.57.2: + resolution: {integrity: sha512-1YiPCAXT0Ct6g1vOMmSLa0Nsc3QRMvtDF32ihgglGVrugIuIK38RyDiFNXVDhtQ81TJjSO57NdMw6DyYLqSGDQ==} + engines: {node: '>=18'} svgo@4.0.2: resolution: {integrity: sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==} engines: {node: '>=16'} hasBin: true - tailwindcss@3.4.19: - resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} - engines: {node: '>=14.0.0'} - hasBin: true + tailwind-merge@3.7.0: + resolution: {integrity: sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==} + + tailwind-variants@3.3.1: + resolution: {integrity: sha512-4pAvwUtM4HKBiRZftncAbpn6V9Hhwoa5Fl7O2u5zbp7Z5Cvu+/o/6+176WY3WCEES209543quG8zFIcXCsc5Jw==} + engines: {node: '>=16.9.x', pnpm: '>=7.x'} + peerDependencies: + tailwind-merge: '>=3.0.0' + tailwindcss: '*' + peerDependenciesMeta: + tailwind-merge: + optional: true + tailwindcss: + optional: true - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -2015,23 +2140,20 @@ packages: resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -2103,6 +2225,62 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + unplugin-icons@24.0.0: + resolution: {integrity: sha512-wV6c7I0PtiIP8KIU7Z1Ukyc2uzgY9ind3RXNu7j63L9qTWDn7CzLnW9FD57DKbfGpWKQv3qyV2PCtBG8Y5Llcg==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 + '@vue/compiler-vapor': ^3.6.0-rc.5 + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + '@vue/compiler-vapor': + optional: true + svelte: + optional: true + + unplugin@3.4.0: + resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rsbuild/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rsbuild/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true + unstorage@1.17.5: resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} peerDependencies: @@ -2228,6 +2406,9 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} @@ -2259,6 +2440,9 @@ packages: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} + zimmerframe@1.1.5: + resolution: {integrity: sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==} + zod-to-json-schema@3.25.2: resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} peerDependencies: @@ -2281,7 +2465,15 @@ packages: snapshots: - '@alloc/quick-lru@5.2.0': {} + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.8.0 + tinyexec: 1.3.0 + + '@antfu/install-pkg@2.1.0': + dependencies: + package-manager-detector: 1.8.0 + tinyexec: 1.3.1 '@astrojs/compiler@2.13.1': {} @@ -2313,12 +2505,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.14(astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3))': + '@astrojs/mdx@4.3.14(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3))': dependencies: '@astrojs/markdown-remark': 6.3.11 '@mdx-js/mdx': 3.1.1 acorn: 8.18.0 - astro: 5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3) + astro: 5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -2342,17 +2534,22 @@ snapshots: stream-replace-string: 2.0.0 zod: 4.4.3 - '@astrojs/starlight@0.36.3(astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3))': + '@astrojs/starlight-tailwind@4.0.2(@astrojs/starlight@0.36.3(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3)))(tailwindcss@4.3.3)': + dependencies: + '@astrojs/starlight': 0.36.3(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3)) + tailwindcss: 4.3.3 + + '@astrojs/starlight@0.36.3(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3))': dependencies: '@astrojs/markdown-remark': 6.3.11 - '@astrojs/mdx': 4.3.14(astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3)) + '@astrojs/mdx': 4.3.14(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3)) '@astrojs/sitemap': 3.7.3 '@pagefind/default-ui': 1.5.2 '@types/hast': 3.0.5 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3) - astro-expressive-code: 0.41.7(astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3)) + astro: 5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3) + astro-expressive-code: 0.41.7(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3)) bcp-47: 2.1.1 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -2375,6 +2572,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@astrojs/svelte@7.2.5(@types/node@24.13.3)(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3))(jiti@2.7.0)(lightningcss@1.32.0)(svelte@5.57.2)(typescript@5.9.3)': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)) + astro: 5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3) + svelte: 5.57.2 + svelte2tsx: 0.7.61(svelte@5.57.2)(typescript@5.9.3) + typescript: 5.9.3 + vite: 6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + '@astrojs/telemetry@3.3.0': dependencies: ci-info: 4.4.0 @@ -2594,9 +2813,17 @@ snapshots: dependencies: '@expressive-code/core': 0.41.7 - '@fontsource-variable/inter@5.3.0': {} + '@iconify-json/lucide@1.2.142': + dependencies: + '@iconify/types': 2.0.0 - '@fontsource/ibm-plex-mono@5.3.0': {} + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.7': + dependencies: + '@antfu/install-pkg': 2.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 '@img/colour@1.1.0': {} @@ -2699,10 +2926,17 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -2741,18 +2975,6 @@ snapshots: '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - '@oslojs/encoding@1.1.0': {} '@pagefind/darwin-arm64@1.5.2': @@ -2894,10 +3116,99 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@tailwindcss/typography@0.5.20(tailwindcss@3.4.19)': + '@sveltejs/acorn-typescript@1.0.13(acorn@8.18.0)': dependencies: - postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.19 + acorn: 8.18.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)))(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)) + debug: 4.4.3 + svelte: 5.57.2 + vite: 6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)))(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.57.2 + vite: 6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0) + vitefu: 1.1.3(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)) + transitivePeerDependencies: + - supports-color + + '@tailwindcss/node@4.3.3': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.26.0 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.3 + + '@tailwindcss/oxide-android-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide@4.3.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 + + '@tailwindcss/vite@4.3.3(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0))': + dependencies: + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + tailwindcss: 4.3.3 + vite: 6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0) '@types/debug@4.1.13': dependencies: @@ -2957,8 +3268,6 @@ snapshots: ansi-styles@6.2.3: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -2968,18 +3277,20 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.1: {} + aria-query@5.3.2: {} array-iterate@2.0.1: {} astring@1.9.0: {} - astro-expressive-code@0.41.7(astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3)): + astro-expressive-code@0.41.7(astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3)): dependencies: - astro: 5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3) + astro: 5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3) rehype-expressive-code: 0.41.7 - astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3): + astro@5.18.2(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.62.4)(typescript@5.9.3): dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/internal-helpers': 0.7.6 @@ -3036,8 +3347,8 @@ snapshots: unist-util-visit: 5.1.0 unstorage: 1.17.5 vfile: 6.0.3 - vite: 6.4.3(@types/node@24.13.3)(jiti@1.21.7) - vitefu: 1.1.3(vite@6.4.3(@types/node@24.13.3)(jiti@1.21.7)) + vite: 6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0) + vitefu: 1.1.3(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -3095,8 +3406,6 @@ snapshots: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 - binary-extensions@2.3.0: {} - boolbase@1.0.0: {} boxen@8.0.1: @@ -3110,12 +3419,6 @@ snapshots: widest-line: 5.0.0 wrap-ansi: 9.0.2 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - camelcase-css@2.0.1: {} - camelcase@8.0.0: {} ccount@2.0.1: {} @@ -3130,18 +3433,6 @@ snapshots: character-reference-invalid@2.0.1: {} - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@5.0.0: dependencies: readdirp: 5.0.0 @@ -3158,10 +3449,12 @@ snapshots: commander@11.1.0: {} - commander@4.1.1: {} - common-ancestor-path@1.0.1: {} + confbox@0.1.8: {} + + confbox@0.3.1: {} + cookie-es@1.2.3: {} cookie@1.1.1: {} @@ -3206,6 +3499,10 @@ snapshots: dependencies: character-entities: 2.0.2 + dedent-js@1.0.1: {} + + deepmerge@4.3.1: {} + defu@6.1.7: {} dequal@2.0.3: {} @@ -3220,12 +3517,12 @@ snapshots: devalue@5.9.0: {} + devalue@5.9.4: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 - didyoumean@1.2.2: {} - diff@8.0.4: {} direction@2.0.1: {} @@ -3256,12 +3553,15 @@ snapshots: emoji-regex@8.0.0: {} + enhanced-resolve@5.26.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + entities@4.5.0: {} entities@6.0.1: {} - es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} esast-util-from-estree@2.0.0: @@ -3338,6 +3638,12 @@ snapshots: escape-string-regexp@5.0.0: {} + esm-env@1.2.2: {} + + esrap@2.4.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.9 @@ -3382,28 +3688,14 @@ snapshots: '@expressive-code/plugin-shiki': 0.41.7 '@expressive-code/plugin-text-markers': 0.41.7 - extend@3.0.2: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + exsolve@1.1.3: {} - fastq@1.20.1: - dependencies: - reusify: 1.1.0 + extend@3.0.2: {} fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - flattie@1.1.1: {} fontace@0.4.1: @@ -3417,19 +3709,11 @@ snapshots: fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - get-east-asian-width@1.6.0: {} github-slugger@2.0.0: {} - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 + graceful-fs@4.2.11: {} h3@1.15.11: dependencies: @@ -3443,10 +3727,6 @@ snapshots: ufo: 1.6.4 uncrypto: 0.1.3 - hasown@2.0.4: - dependencies: - function-bind: 1.1.2 - hast-util-embedded@3.0.0: dependencies: '@types/hast': 3.0.5 @@ -3661,41 +3941,29 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-core-module@2.16.2: - dependencies: - hasown: 2.0.4 - is-decimal@2.0.1: {} is-docker@3.0.0: {} - is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - is-hexadecimal@2.0.1: {} is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - is-number@7.0.0: {} - is-plain-obj@4.1.0: {} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.9 + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 - jiti@1.21.7: {} + jiti@2.7.0: {} js-yaml@4.3.1: dependencies: @@ -3703,19 +3971,70 @@ snapshots: kleur@3.0.3: {} + kleur@4.1.5: {} + klona@2.0.6: {} - lilconfig@3.1.3: {} + lightningcss-android-arm64@1.32.0: + optional: true - lines-and-columns@1.2.4: {} + lightningcss-darwin-arm64@1.32.0: + optional: true - longest-streak@3.1.0: {} + lightningcss-darwin-x64@1.32.0: + optional: true - lru-cache@11.5.2: {} + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true - lucide-astro@0.545.0(astro@5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3)): + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: dependencies: - astro: 5.18.2(@types/node@24.13.3)(jiti@1.21.7)(rollup@4.62.4)(typescript@5.9.3) + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.3 + quansync: 0.2.11 + + locate-character@3.0.0: {} + + longest-streak@3.1.0: {} + + lru-cache@11.5.2: {} magic-string@0.30.21: dependencies: @@ -3918,8 +4237,6 @@ snapshots: mdn-data@2.27.1: {} - merge2@1.4.1: {} - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -4194,21 +4511,17 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.8: + mlly@1.8.2: dependencies: - braces: 3.0.3 - picomatch: 2.3.2 + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 mrmime@2.0.1: {} ms@2.1.3: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nanoid@3.3.17: {} neotraverse@0.6.18: {} @@ -4227,9 +4540,7 @@ snapshots: dependencies: boolbase: 1.0.0 - object-assign@4.1.1: {} - - object-hash@3.0.0: {} + obug@2.2.1: {} ofetch@1.5.1: dependencies: @@ -4293,7 +4604,7 @@ snapshots: dependencies: entities: 6.0.1 - path-parse@1.0.7: {} + pathe@2.0.3: {} piccolore@0.1.3: {} @@ -4303,46 +4614,30 @@ snapshots: picomatch@4.0.5: {} - pify@2.3.0: {} - - pirates@4.0.7: {} + picomatch@4.0.7: {} - postcss-import@15.1.0(postcss@8.5.25): + pkg-types@1.3.1: dependencies: - postcss: 8.5.25 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.12 + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 - postcss-js@4.1.0(postcss@8.5.25): + pkg-types@2.3.3: dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.25 - - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.25): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 1.21.7 - postcss: 8.5.25 + confbox: 0.3.1 + exsolve: 1.1.3 + pathe: 2.0.3 postcss-nested@6.2.0(postcss@8.5.25): dependencies: postcss: 8.5.25 postcss-selector-parser: 6.1.4 - postcss-selector-parser@6.0.10: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-selector-parser@6.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} - postcss@8.5.25: dependencies: nanoid: 3.3.17 @@ -4358,18 +4653,10 @@ snapshots: property-information@7.2.0: {} - queue-microtask@1.2.3: {} + quansync@0.2.11: {} radix3@1.1.2: {} - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.2 - readdirp@5.0.0: {} recma-build-jsx@1.0.0: @@ -4510,13 +4797,6 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - resolve@1.22.12: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.2 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -4542,8 +4822,6 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - reusify@1.1.0: {} - rollup@4.62.4: dependencies: '@types/estree': 1.0.9 @@ -4576,12 +4854,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.62.4 fsevents: 2.3.3 - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - sax@1.6.1: {} + scule@1.3.0: {} + semver@7.8.5: {} sharp@0.34.5: @@ -4678,17 +4954,32 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - sucrase@3.35.1: + svelte2tsx@0.7.61(svelte@5.57.2)(typescript@5.9.3): dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - tinyglobby: 0.2.17 - ts-interface-checker: 0.1.13 + dedent-js: 1.0.1 + scule: 1.3.0 + svelte: 5.57.2 + typescript: 5.9.3 - supports-preserve-symlinks-flag@1.0.0: {} + svelte@5.57.2: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.6.0 + '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) + '@types/estree': 1.0.9 + acorn: 8.18.0 + aria-query: 5.3.1 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.9.4 + esm-env: 1.2.2 + esrap: 2.4.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.5 + transitivePeerDependencies: + - '@typescript-eslint/types' svgo@4.0.2: dependencies: @@ -4700,61 +4991,32 @@ snapshots: picocolors: 1.1.1 sax: 1.6.1 - tailwindcss@3.4.19: - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.25 - postcss-import: 15.1.0(postcss@8.5.25) - postcss-js: 4.1.0(postcss@8.5.25) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.25) - postcss-nested: 6.2.0(postcss@8.5.25) - postcss-selector-parser: 6.1.4 - resolve: 1.22.12 - sucrase: 3.35.1 - transitivePeerDependencies: - - tsx - - yaml + tailwind-merge@3.7.0: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 + tailwind-variants@3.3.1(tailwind-merge@3.7.0)(tailwindcss@4.3.3): + optionalDependencies: + tailwind-merge: 3.7.0 + tailwindcss: 4.3.3 - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 + tailwindcss@4.3.3: {} + + tapable@2.3.3: {} tiny-inflate@1.0.3: {} tinyexec@1.3.0: {} + tinyexec@1.3.1: {} + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - trim-lines@3.0.1: {} trough@2.2.0: {} - ts-interface-checker@0.1.13: {} - tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -4836,6 +5098,37 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + unplugin-icons@24.0.0(esbuild@0.27.7)(rollup@4.62.4)(svelte@5.57.2)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)): + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/utils': 3.1.7 + local-pkg: 1.2.1 + obug: 2.2.1 + unplugin: 3.4.0(esbuild@0.27.7)(rollup@4.62.4)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)) + optionalDependencies: + svelte: 5.57.2 + transitivePeerDependencies: + - '@farmfe/core' + - '@rsbuild/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rolldown + - rollup + - unloader + - vite + - webpack + + unplugin@3.4.0(esbuild@0.27.7)(rollup@4.62.4)(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)): + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.7 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.27.7 + rollup: 4.62.4 + vite: 6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0) + unstorage@1.17.5: dependencies: anymatch: 3.1.3 @@ -4864,7 +5157,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.3(@types/node@24.13.3)(jiti@1.21.7): + vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.5) @@ -4875,14 +5168,17 @@ snapshots: optionalDependencies: '@types/node': 24.13.3 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.7.0 + lightningcss: 1.32.0 - vitefu@1.1.3(vite@6.4.3(@types/node@24.13.3)(jiti@1.21.7)): + vitefu@1.1.3(vite@6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)): optionalDependencies: - vite: 6.4.3(@types/node@24.13.3)(jiti@1.21.7) + vite: 6.4.3(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0) web-namespaces@2.0.1: {} + webpack-virtual-modules@0.6.2: {} + which-pm-runs@1.1.0: {} widest-line@5.0.0: @@ -4907,6 +5203,8 @@ snapshots: yoctocolors@2.2.0: {} + zimmerframe@1.1.5: {} + zod-to-json-schema@3.25.2(zod@3.25.76): dependencies: zod: 3.25.76 diff --git a/docs/src/content/docs/coming-from-github.md b/docs/src/content/docs/coming-from-github.md deleted file mode 100644 index 0f259a373..000000000 --- a/docs/src/content/docs/coming-from-github.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Coming from GitHub -description: - How GitHub concepts map onto Tangled, and where the models differ. ---- - -Most of what you do on GitHub has a direct counterpart on Tangled. Git -itself is unchanged: commits, branches, tags and remotes work the same. -What differs is who stores what: your account, your git data, and your -CI can each live on a different server. Tangled is -[federated](/architecture/federation/): those servers can be run by -different people, including you, and still work together. - -## Concept mapping - -| GitHub | Tangled | Difference | -| --------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Account | atproto account on any PDS | Sign up for a `*.tngl.sh` account or sign in with an existing one, such as a Bluesky account. Your identity is a DID, not a row in Tangled's database. | -| Repository | Repository with its own DID, hosted on a knot | Host it with Tangled or on your own knot. The repo DID stays the same across renames. | -| github.com | tangled.org | Shows repositories and discussion from many accounts and knots. You can also self-host the whole thing. | -| Fork | Fork | A full copy, hosted with Tangled or on your own knot, independent of the original's knot. | -| Issue | Issue | Stored on the repository's knot, with your account recorded as the author. | -| Pull request | Pull request with rounds | Each submission is a fixed round. Reviewers compare rounds with an interdiff. | -| Labels | Labels | Defined per repository by the owner. | -| Actions | Spindle workflows | YAML in `.tangled/workflows/`, run on a Nixery container or microVM engine. Not compatible with Actions syntax. | -| Actions secrets | Spindle secrets | Stored on the repository's spindle. | -| Webhooks | Webhooks | Served by the spindle. | -| Stars, follows | Stars, follows | Stored in your own account. Tangled adds vouches. | -| Organizations | Organization accounts | A separate atproto account that members control through delegation, not a permission layer inside Tangled. | -| Collaborators | Collaborators | Granted per repository by the owner and enforced by the knot. | -| Gists | Strings | Snippets stored in your account. | -| Pages | Sites | Static sites served from a repository. Site settings can't be changed right now; see [Sites](/sites/). | -| Importer | Import | Imports git data from GitHub or any git URL. | - -## Accounts - -GitHub hosts every account itself. On Tangled, your account lives with -an account provider (a PDS), and Tangled is one app that uses it. If you -sign up with Tangled you get a handle like `alice.tngl.sh`. If you -already have an atproto account, sign in with that handle instead; there -is nothing to link. -[Identity and repository DIDs](/architecture/identity/) explains handles -and DIDs. - -## Repositories and hosting - -On GitHub, the website and the git server are one service. On Tangled, -the git server is a **knot**, and anyone can run one. Host repositories -with Tangled on the knots we run, or on your own knot; the web app shows -both the same way. Clone URLs name the knot: -`git@tangled.org:alice.tngl.sh/project` for the knots we run, -`git@knot.example.com:alice.tngl.sh/project` for another. - -Issues and pull requests are stored on the same knot as the code, not in -your account. That keeps a project's discussion with the project, and -the knot enforces who may write it. - -## Pull requests - -A GitHub pull request tracks a moving branch: force-push and the old -commits disappear from the review. A Tangled pull request is a series of -**rounds**. Each submission records a fixed base and head commit, -earlier rounds stay readable, and reviewers can view an interdiff -between any two rounds. [Pull requests](/guides/pull-requests/) covers -the workflow and its current limits. - -## CI - -Workflows live in `.tangled/workflows/*.yml` and run on a **spindle**: -run CI with Tangled, or run your own spindle. The syntax is Tangled's -own, so an Actions workflow won't run unchanged. -[Writing workflows](/spindles/writing-workflows/) has working examples. - -## Moving over - -**Import** (`/repo/migrate`) copies a repository from GitHub, including -private ones through the Tangled GitHub App, or from any public git URL. -It moves git data: commits, branches and tags. It does not convert -issues, pull requests, Actions workflows, secrets, branch rules or Pages -settings. [Importing repositories](/guides/importing/) has the details, -and [Quick start](/quick-start/) shows how to push both to GitHub and -Tangled from one remote. diff --git a/docs/src/content/docs/comparison-with-github.md b/docs/src/content/docs/comparison-with-github.md new file mode 100644 index 000000000..f37a19f91 --- /dev/null +++ b/docs/src/content/docs/comparison-with-github.md @@ -0,0 +1,59 @@ +--- +title: Comparison with GitHub +description: + How GitHub concepts map onto Tangled, and where the models differ. +--- + +Most of what you do on GitHub has a direct counterpart on Tangled. Git +itself is unchanged: commits, branches, tags and remotes work the same. +What differs is who stores what: your account, your git data, and your +CI can each live on a different server. Tangled is +[federated](/architecture/federation/): those servers can be run by +different people, including you, and still work together. + +## Accounts + +GitHub hosts every account itself. On Tangled, your account lives with +an account provider (a PDS), and Tangled is one app that uses it. If you +sign up with Tangled you get a handle like `alice.tngl.sh`. If you +already have an atproto account, sign in with that handle instead; there +is nothing to link. +[Identity and repository DIDs](/architecture/identity/) explains handles +and DIDs. + +## Repositories and hosting + +On GitHub, the website and the git server are one service. On Tangled, +the git server is a **knot**, and anyone can run one. Host repositories +with Tangled on the knots we run, or on your own knot; the web app shows +both the same way. + +Issues and pull requests are stored on the same knot as the code, not in +your account. That keeps a project's discussion with the project, and +the knot enforces who may write it. + +## Pull requests + +A GitHub pull request tracks a moving branch: force-push and the old +commits disappear from the review. In contrast, pull request submissions +in Tangled are immutable. + +When you create a pull request, it creates an immutable "round". To +update your pull request, you may push to the same branch, and hit +"resubmit" on the interface. This creates a new round. Each round +records a fixed base and head commit, reviewers can read earlier rounds +and observe a pull request as it evolves. + +Tangled also has support for the Jujutsu version control system: it can +automatically detect Jujutsu change-ids and can calculate interdiffs +across rounds. [Pull requests](/guides/pull-requests/) covers the +workflow and its current limits. + +## CI + +Workflows live in `.tangled/workflows/*.yml` and run on a **spindle**: +run CI with Tangled, or run your own spindle. [Writing +workflows](/spindles/writing-workflows/) has working examples. + +To move an existing repository over, see +[Migrating from GitHub](/migrating-from-github/). diff --git a/docs/src/content/docs/guides/account.md b/docs/src/content/docs/guides/account.md deleted file mode 100644 index ea69b64a1..000000000 --- a/docs/src/content/docs/guides/account.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Account settings -description: - Edit your profile, manage SSH keys and emails, set notification - preferences, save knots and spindles, and use several accounts. ---- - -Account settings live at `/settings`. Your profile and SSH keys are -saved to your account provider (your PDS); emails, notification -preferences, and saved knots and spindles are stored by us. - -| Tab | What it changes | -| --------------- | ---------------------------------------- | -| Profile | Bio, pronouns, location, links, avatar | -| SSH Keys | Keys used to push and sign | -| Emails | Addresses, verification, primary | -| Notifications | Event toggles, email digests | -| Knots, Spindles | Hosts offered when creating a repository | -| Organizations | Organizations you control | - -## Profile - -Edit your bio, pronouns, location, and up to five links, and upload an -avatar. The tab also shows your handle, DID, and PDS. The **Organization -layout** toggle marks the account as an organization; see -[Organizations](/guides/organizations/). - -## SSH keys - -Select **Add key**, give it a title, and paste a public key such as the -contents of `~/.ssh/id_ed25519.pub`. Knots use these keys to decide who -is pushing: a push is accepted only from a key published by an account -allowed to push to that repository. Knots remember keys for about an -hour, so a removed key can keep working for that long. The same key can -sign commits, see [Signing commits](/guides/signing-commits/). - -## Emails - -Add an address and Tangled sends a verification link; the address shows -**Verified** once you open it. You can resend the link, remove an -address, or choose the **Primary** one. Verified emails link your -commits to your account, and the verified primary address receives -notification digests. - -## Notifications - -One toggle per event and an **Email notifications** switch. -[Notifications and email](/guides/notifications/) explains what each -does. - -## Knots and spindles - -These tabs list your own knots and spindles, offered next to Tangled's -when you create a repository or set up CI. Adding one here doesn't give -you access to it; a knot only accepts repositories from its members. - -A knot operator can send you an invite link of the form -`/invite?knot=&code=`. Opening it while signed in shows -**Join <host>**: Tangled redeems the code, which makes you a -member of the knot, and saves the knot to your list. An invalid code or -host shows "Invalid invite link". - -## Several accounts - -Sign in with any atproto handle; your PDS is found from the handle. Use -**Add account** in the account menu to sign in with another one, and -**Switch account** to change which one you act as. When Tangled needs a -permission your session doesn't have yet (webhooks, invites, reports), -it asks you to sign in again rather than failing. - -[Troubleshooting](/troubleshooting/) covers sign-in and push problems. diff --git a/docs/src/content/docs/guides/issues.md b/docs/src/content/docs/guides/issues.md deleted file mode 100644 index c47061c0b..000000000 --- a/docs/src/content/docs/guides/issues.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Issues and labels -description: - Open, edit, close and label issues, mention people, react, and - subscribe to threads. ---- - -Issues live under a repository's **Issues** tab -(`///issues`). Issues are stored with the repository on its -knot, with you recorded as the author, so the knot decides who may write -them and the discussion stays with the code. - -```text -https://tangled.org/alice.tngl.sh/my-project/issues/new -``` - -## Opening an issue - -**New issue** asks for a title and a markdown body. If you control an -organization account, you can choose to open it as the organization. You -are subscribed to the issue automatically. - -Whether you can open one depends on the repository's -[contribution policy](/guides/access/#contribution-policy): `anyone`, -knot `members`, or `collaborators` only. When the policy shuts you out, -the knot refuses the write with a message asking you to contact the -repository owner. - -## Editing, closing and deleting - -| Action | Who | -| ------------------- | ------------------------------------------------------------ | -| Edit title and body | The author, the repository owner, collaborators, knot admins | -| Close or reopen | The author, the repository owner, collaborators, knot admins | -| Delete | The author, the repository owner, collaborators, knot admins | -| Comment, react | Anyone the contribution policy admits | - -The web app shows the close and reopen buttons to the author, the owner -and collaborators. Knot admins can moderate any repository on their -knot, but the web app doesn't show them these controls yet. - -An author whose access was later removed by a policy change can still -delete their own issues and comments, but can no longer edit them. - -## Comments and mentions - -Comments are markdown and can be edited by their author. Replies nest -under the comment they answer. Type `@` followed by a handle to mention -someone; the editor suggests people already in the thread. Mentioned -users get a notification if they have mention notifications turned on -([Notifications and email](/guides/notifications/)). - -## Reactions - -Issues and comments take reactions from a fixed set: ๐Ÿ‘ ๐Ÿ‘Ž ๐Ÿ˜† ๐ŸŽ‰ ๐Ÿซค โค๏ธ -๐Ÿš€ ๐Ÿ‘€. Click a reaction again to remove it. The list of who reacted is -public. - -## Subscribing - -**Subscribe** on an issue (or on a whole repository) sends you -notifications for new comments and state changes. The subscription is -saved to your account. You can unsubscribe from the same button. - -## Labels - -Labels are defined per repository, and **only the owner can define -them**: **Settings โ†’ General โ†’ Labels โ†’ Add label**, with a name and a -color. Each label is identified by a slug of its name -(`Good first issue` becomes `good-first-issue`). A deleted label's slug -can't be reused for a new label, and deleting a label removes it from -every issue and pull request. - -The owner and collaborators apply labels from the sidebar of an issue or -pull request. The knot only accepts labels that are defined in that -repository. - -[Pull requests](/guides/pull-requests/) use the same tools for -discussion. diff --git a/docs/src/content/docs/guides/notifications.md b/docs/src/content/docs/guides/notifications.md index b7a3f89af..3f90241cb 100644 --- a/docs/src/content/docs/guides/notifications.md +++ b/docs/src/content/docs/guides/notifications.md @@ -71,5 +71,3 @@ Digests go only to your **verified primary** email. Add and verify one under **Settings โ†’ Emails** first: Tangled sends a verification link, and the address shows as verified once you open it. Without a verified primary address, no email is sent. - -[Account settings](/guides/account/) covers emails. diff --git a/docs/src/content/docs/guides/pull-requests.md b/docs/src/content/docs/guides/pull-requests.md index d1d41d467..23035a9c9 100644 --- a/docs/src/content/docs/guides/pull-requests.md +++ b/docs/src/content/docs/guides/pull-requests.md @@ -70,8 +70,8 @@ another look. The commit list can show Jujutsu change IDs next to the commit hashes. Discussion happens in comments on the pull request: markdown, replies, -mentions and reactions work as they do on [issues](/guides/issues/). -Comments are not attached to specific lines or commits yet. +mentions and reactions. Comments are not attached to specific lines or +commits yet. ## Merging diff --git a/docs/src/content/docs/guides/search.md b/docs/src/content/docs/guides/search.md deleted file mode 100644 index 35240ab45..000000000 --- a/docs/src/content/docs/guides/search.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Search -description: - Search code across Tangled or inside one repository, and find people - by handle. ---- - -Open `/search?type=code&q=` or use the search box in the header. - -```text -https://tangled.org/search?type=code&q=lang:Go+parseManifest -``` - -## Code search - -Code search finds matching lines across repositories and groups them by -file, showing the branches and commit each match comes from. You must be -signed in. - -Plain words match file contents; the language list in the sidebar adds a -`lang:` filter to the query. Results load 50 at a time; you -can load more after that. - -To search a single repository, use the search tab on the repository -(`///search`). Results never include other repositories. - -A repository that was just pushed or imported can take a little while to -show up in code search. Until then, a query returns nothing for it. - -## Repository search - -The **Repositories** tab at `/search?type=repo` isn't available yet; it -shows "Repository search is coming soon." - -## Finding people - -When you add a collaborator, sign in, or type `@` in a comment, Tangled -suggests handles as you type. A leading `@` is ignored. Accounts that -have never used Tangled may not be suggested. - -[How data moves](/architecture/data-flow/) explains what happens behind -this. diff --git a/docs/src/content/docs/guides/signing-commits.md b/docs/src/content/docs/guides/signing-commits.md index 293289db9..ca189f44e 100644 --- a/docs/src/content/docs/guides/signing-commits.md +++ b/docs/src/content/docs/guides/signing-commits.md @@ -54,6 +54,5 @@ counted. Commits with an unverified or unknown email still exist and display normally; they just aren't linked to anyone. -[Account settings](/guides/account/) covers keys and emails. [Troubleshooting](/troubleshooting/#commits-not-linked-to-your-account) has the checklist. diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 8d92bae95..72c0d5ad9 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -7,7 +7,7 @@ head: content: Tangled Docs tableOfContents: false hero: - title: Docs and self-hosting guides for Tangled + title: The most hackable forge tagline: Tangled is a social code-collaboration platform built on an open protocol. It is designed to be self-hostable, hackable and @@ -23,17 +23,15 @@ hero: import ButtonCard from "$lib/components/ui/ButtonCard.svelte"; import Rocket from "~icons/lucide/rocket"; -import BookMarked from "~icons/lucide/book-marked"; -import GitPullRequest from "~icons/lucide/git-pull-request"; -import Workflow from "~icons/lucide/workflow"; -import MapIcon from "~icons/lucide/map"; +import GitCompareArrows from "~icons/lucide/git-compare-arrows"; +import Github from "~icons/lucide/github"; import HardDrive from "~icons/lucide/hard-drive"; -import Hammer from "~icons/lucide/hammer"; -import BookA from "~icons/lucide/book-a"; +import Braces from "~icons/lucide/braces"; import FileJson from "~icons/lucide/file-json"; -import Activity from "~icons/lucide/activity"; +import MapIcon from "~icons/lucide/map"; import Plug from "~icons/lucide/plug"; -import Braces from "~icons/lucide/braces"; +import Hammer from "~icons/lucide/hammer"; +import BookA from "~icons/lucide/book-a";
- -
-## Resources +## Hacking
- +
diff --git a/docs/src/content/docs/introduction.md b/docs/src/content/docs/introduction.md index a02189f70..11c479106 100644 --- a/docs/src/content/docs/introduction.md +++ b/docs/src/content/docs/introduction.md @@ -7,35 +7,42 @@ description: Tangled is a social code forge: you can host git repositories, collaborate on issues and pull requests, follow other devs and star -their repos. However, Tangled is different from the rest: every part of -Tangled is open source: you can self-host a single piece, like the -server that stores your code, or all of it. +their repos. However, Tangled is different from the rest: -It's also built to be hacked on. The pieces talk to each other through -public interfaces, so you can replace any of them with your own: people -have written a knot that keeps repositories on code.storage, and a -spindle that runs CI on Buildkite. -[Federation and hackability](/architecture/federation/) shows how. +- It is federated: you can self-host a server and still interact with + the broader network +- It is open source +- It is entirely self-hostable: you can host a single piece, like the + repository storage component, or the CI component, or all of it +- It is hackable -You don't need to run anything to use Tangled. Sign in, create a -repository, and push. [Quick start](/quick-start/) walks through it. +The individual servers talk to each other through public interfaces, so +you can replace any of them with your own: people have written a knot +that keeps repositories on code.storage, or Cloudflare Artifacts, and a +spindle that runs CI on Buildkite! [Federation and +hackability](/architecture/federation/) shows how. + +However, you don't need to run anything to use Tangled. Sign in, create +a repository, and push. [Quick start](/quick-start/) walks through it. ## How it is split Your account lives with an **account provider** (a PDS, or Personal Data Server), the same kind of account you might already use for Bluesky. It holds your profile, follows, stars, SSH public keys, and a small entry -for each repository you own. Git data lives on a **knot**, a git server. -Each repository has its own identity (a DID), and its issues, pull -requests, comments, reactions and labels are stored next to the code on -the knot, not in your account. - -**Spindles** run CI: they run the workflows in `.tangled/workflows/` -when you push. The web app saves your changes to your account or to the -knot, and shows everything gathered from across the network. No web app -holds a privileged copy of your data: it all comes from accounts and -knots. The [architecture overview](/architecture/overview/) shows how -the pieces connect. +for each repository you own. + +Git data lives on a **knot**, a git server. Each repository has its own +identity (a DID), and its issues, pull requests, comments, reactions and +labels are stored next to the code on the knot. + +**Spindles** run CI: they execute the workflows when you push. + +The web app saves your changes to your account or to the knot, and shows +everything gathered from across the network. No web app holds a +privileged copy of your data: it all comes from accounts and knots. The +[architecture overview](/architecture/overview/) shows how the pieces +connect. ## Hosted and self-hosted @@ -44,20 +51,15 @@ spindles, accounts and web apps run by different people work together, so you can run all of it, some of it, or none of it. See [Federation](/architecture/federation/). -| Piece | What we run | You can run your own | -| ----------------- | ----------------------------------------------- | --------------------------------------------------------------------------------- | -| Account (PDS) | Signup gives you a `.tngl.sh` account | Yes, any atproto PDS works | -| Knot | Shared knots, the default is `knot1.tangled.sh` | Yes, see [Self-hosting a knot](/knots/self-hosting/) | -| Spindle | `spindle.tangled.sh` | Yes, see [Self-hosting a spindle](/spindles/self-hosting/) | -| Web app and index | The website at `tangled.org` | Yes, see [Running your own index and frontend](/self-hosting/index-and-frontend/) | - -The usual reason to self-host is a knot: your code then lives on a -machine you control, while the web app still shows it and accepts issues -and pull requests against it. A self-hosted spindle lets you run CI on -your own hardware. Run every piece yourself and you have a fully -independent Tangled. [Choosing what to run](/self-hosting/) compares the -options. - -[Coming from GitHub](/coming-from-github/) maps familiar concepts onto -Tangled, and [Why AT Protocol](/why-atproto/) explains the design -choice. +| Component | What we run | You can run your own | +| ----------------- | ----------------------------------------------- | -----------------------------------------------------------------------------| +| Account (PDS) | Signup gives you a `.tngl.sh` account | Any atproto PDS works | +| Knot | Shared knots, the default is `knot1.tangled.sh` | See [Self-hosting a knot](/knots/self-hosting/) | +| Spindle | `spindle.tangled.sh` | See [Self-hosting a spindle](/spindles/self-hosting/) | +| Web app and index | The website at `tangled.org` | See [Running your own index and frontend](/self-hosting/index-and-frontend/) | + +Typically, users self-host a knot: your code then lives on a machine you +control, while the web app still shows it and accepts issues and pull +requests against it. A self-hosted spindle lets you run CI on your own +hardware. Run every piece yourself and you have a fully independent +Tangled. diff --git a/docs/src/content/docs/migrating-from-github.md b/docs/src/content/docs/migrating-from-github.md new file mode 100644 index 000000000..f49381ce2 --- /dev/null +++ b/docs/src/content/docs/migrating-from-github.md @@ -0,0 +1,107 @@ +--- +title: Migrating from GitHub +description: + Copy a repository from GitHub with the importer, then configure the Git + remotes to push to Tangled. +--- + +You can migrate your repositories, associated emails, and SSH keys from +GitHub to Tangled using the [importer +tool](https://tangled.org/repo/migrate). You can read more about the +importer tool [here](/guides/importing/). You may also migrate +repositories without the importer. + +## Using the importer tool + +This is a quick and easy way to migrate most of your data from GitHub to +Tangled: + +1. Head to the [importer](https://tangled.org/repo/migrate) +2. Authorize the importer to grant read access to your GitHub account +3. Configure repositories and migrate them! + +The importer requries read-only access to your GitHub account, and you +can revoke access once repositories are imported. If you wish to avoid +the tool, you can also migrate without it, as done below. + +## Without the importer tool + +You can move a repository without the importer. Use a local clone. + +1. Create an empty repository on Tangled. [Quick start](/quick-start/) + shows the procedure. +2. Open the repository on your computer. + + ```sh + cd /path/to/your/repository + ``` + +3. Show the current remote. + + ```sh + git remote -v + ``` + + The output might look like: + + ```text + origin git@github.com:alice/my-project.git (fetch) + origin git@github.com:alice/my-project.git (push) + ``` + +4. Set the remote URL to your Tangled repository. + + ```sh + git remote set-url origin git@tangled.org:alice.tngl.sh/my-project + ``` + +5. Push all branches and tags. + + ```sh + git push origin --all + git push origin --tags + ``` + +All commits, branches and tags are now on Tangled. + +## Pushing to GitHub and Tangled + +To keep GitHub and Tangled in step, use one remote with two push URLs. +Start with a repository whose remote points to GitHub. Git fetches from +the first URL. Git pushes to both URLs. + +1. Show the current remote. + + ```sh + git remote -v + ``` + + ```text + origin git@github.com:alice/my-project.git (fetch) + origin git@github.com:alice/my-project.git (push) + ``` + +2. Add the GitHub URL as the first push URL. Git then uses it to fetch + only. + + ```sh + git remote set-url --add --push origin git@github.com:alice/my-project.git + ``` + +3. Add the Tangled URL as the second push URL. + + ```sh + git remote set-url --add --push origin git@tangled.org:alice.tngl.sh/my-project + ``` + +4. Show the result. + + ```sh + git remote -v + ``` + + ```text + origin git@github.com:alice/my-project.git (fetch) + origin git@github.com:alice/my-project.git (push) + origin git@tangled.org:alice.tngl.sh/my-project (push) + ``` diff --git a/docs/src/content/docs/quick-start.md b/docs/src/content/docs/quick-start.md index 3ff2a9262..aa1e3ddb3 100644 --- a/docs/src/content/docs/quick-start.md +++ b/docs/src/content/docs/quick-start.md @@ -23,21 +23,18 @@ Bluesky account, for example), sign in at approve access; Tangled never sees your password. If you don't have an account, [sign up](https://tangled.org/signup). You -enter an email address, follow the link Tangled emails you, then choose -a username and password. The result is an account with a handle like -`alice.tngl.sh`, on the PDS we run. It works in any other atproto app -too. +enter an email address, choose a username and password. The result is an +account with a handle like `alice.tngl.sh`, on the PDS we run. It works +in any other atproto application too. You can sign in to several accounts and switch between them from the account menu. ## Onboarding -The first sign-in opens a short setup at `/welcome`: **Profile**, -**Emails**, **Discover** (people and repositories to follow), **SSH -keys**, and **Finish**. Every step can be revisited later in -[Account settings](/guides/account/). If you connect GitHub there, -Tangled can import your avatar, SSH keys and email addresses from it. +The first sign-in opens a short, optional setup. If you connect +GitHub, Tangled can import your avatar, SSH keys and email addresses +from it. Add at least one verified email if you want email notifications or want your commits linked to your profile. @@ -54,9 +51,7 @@ cat ~/.ssh/id_ed25519.pub Paste the output into **Settings โ†’ Keys โ†’ Add SSH key** (`/settings/keys/new`) with a title such as "Work laptop". The key is -saved in your account. Knots look up your keys when you connect and -remember them for about an hour, so a newly added key can take a little -while to work everywhere. +saved in your account. If your SSH agent holds many keys, the knot may give up before it sees the right one. Pin the key in `~/.ssh/config`: @@ -85,10 +80,6 @@ Open **New repository** (`/repo/new`) and fill in: 5. **CI**: optional, under **Advanced**. Run it with Tangled, or on a spindle you self-host. -All repositories are public. The knot creates the repository first, then -Tangled links it to your account. If linking fails, the half-created -repository is deleted again and you see the error. - ## Push An empty repository page shows its remote. Push an existing project to @@ -100,17 +91,10 @@ git remote add origin git@tangled.org:alice.tngl.sh/my-project git push -u origin main ``` -For repositories on `knot1.tangled.sh` the SSH host is `tangled.org`. On -a self-hosted knot it is the knot's own hostname, for example -`git@knot.example.com:alice.tngl.sh/my-project`. The **Clone** menu on -the repository page lists HTTPS and SSH URLs, and a permalink form that -uses the repository DID instead of the name, which keeps working after a -rename. [Repositories](/guides/repositories/) covers every URL form. - -When the push succeeds the knot prints an acknowledgement. For a branch -other than the default it also prints a link that opens a pull request -for that branch. If the push is refused, check -[Troubleshooting](/troubleshooting/). +For repositories hosted by Tangled, the SSH host is `tangled.org`. On a +self-hosted knot it is the knot's own hostname, for example +`git@knot.example.com:alice.tngl.sh/my-project`. Note that this entirely +depends on your self-hosted knot's SSH setup. ## Moving an existing repository @@ -134,13 +118,3 @@ git remote set-url --add --push origin git@tangled.org:alice.tngl.sh/my-project [Importing repositories](/guides/importing/) imports from a URL or from GitHub without a local clone. - -## Next steps - -- Open an issue from the repository's **Issues** tab: - [Issues and labels](/guides/issues/). -- Push a branch and open a pull request: - [Pull requests](/guides/pull-requests/). -- Add a workflow under `.tangled/workflows/`: - [Writing workflows](/spindles/writing-workflows/). -- Give someone push access: [Access and collaborators](/guides/access/). diff --git a/docs/src/content/docs/reference/glossary.md b/docs/src/content/docs/reference/glossary.md index 84290ab84..12e0d49be 100644 --- a/docs/src/content/docs/reference/glossary.md +++ b/docs/src/content/docs/reference/glossary.md @@ -198,7 +198,7 @@ A shareable text snippet (like a gist), stored as `org.tangled.track.ticket`, the record for both issues and pull requests. A ticket with `targetBranch` set is a pull request. See -[Issues and Labels](/guides/issues/). +[Pull requests](/guides/pull-requests/). ## Vouch diff --git a/docs/src/content/docs/troubleshooting.md b/docs/src/content/docs/troubleshooting.md index 30b3795e2..4562f3325 100644 --- a/docs/src/content/docs/troubleshooting.md +++ b/docs/src/content/docs/troubleshooting.md @@ -50,8 +50,7 @@ $ git push knot: this ssh key doesn't match any key published by the accounts that may push here. Authorized: โ€ฆ If your agent offers several keys, add -o IdentitiesOnly=yes so it offers your registered key. ``` -- Add the key under **Settings โ†’ SSH Keys** - ([Account settings](/guides/account/)). +- Add the key under **Settings โ†’ SSH Keys**. - If your SSH agent holds several keys, it may offer the wrong one first. Pin the right one: diff --git a/docs/src/pages/404.astro b/docs/src/pages/404.astro new file mode 100644 index 000000000..89300a1d2 --- /dev/null +++ b/docs/src/pages/404.astro @@ -0,0 +1,46 @@ +--- +import StarlightPage from "@astrojs/starlight/components/StarlightPage.astro"; +import ButtonCard from "$lib/components/ui/ButtonCard.svelte"; +import Rocket from "~icons/lucide/rocket"; +import BookMarked from "~icons/lucide/book-marked"; +import GitPullRequest from "~icons/lucide/git-pull-request"; +import BookA from "~icons/lucide/book-a"; +--- + + +

+ The page you are looking for does not exist, or it may have moved. Try + one of these instead. +

+ +
+ + + + +
+
diff --git a/docs/src/styles/custom.css b/docs/src/styles/custom.css index 5db8bb7eb..a6cadacc4 100644 --- a/docs/src/styles/custom.css +++ b/docs/src/styles/custom.css @@ -20,6 +20,7 @@ --sl-color-gray-5: var(--color-border-default); --sl-color-gray-6: var(--color-background-inset); --sl-color-gray-7: var(--color-background-subtle); + /* the page background, like the app shell: white in light mode */ --sl-color-black: var(--color-background-default); /* monochrome accents, like the web app's links */ @@ -36,14 +37,37 @@ --sl-text-h1: 1.875rem; /* heading-2, the app's page titles */ } +/* in dark mode the page falls back to the canvas shade, like the app shell */ +:root[data-theme="dark"] { + --sl-color-black: var(--color-background-canvas); +} + /* landing page */ .feature-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)); + grid-template-columns: 1fr; gap: 1rem; margin-top: 2rem; } +@media (min-width: 48rem) { + .feature-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +/* the cards are links, but shouldn't take the prose link's indigo hover color + (the icon inherits currentColor from the anchor) */ +.feature-grid > a, +.feature-grid > a:hover { + color: var(--color-foreground-default); +} + +/* the landing title is one line, so it needs a wider column than prose */ +:root[data-has-hero] { + --sl-content-width: 48rem; +} + /* ButtonCard is sized for app chrome (12px). on the landing page the cards are content, so step them up like the welcome tiles in web: title one step above the description, the description one step below the body */ diff --git a/docs/src/styles/tangled.css b/docs/src/styles/tangled.css index be5ce1eed..f2836dc49 100644 --- a/docs/src/styles/tangled.css +++ b/docs/src/styles/tangled.css @@ -2,11 +2,11 @@ dividers anywhere, a narrow reading column */ :root, :root[data-theme="light"] { - --sl-content-width: 38rem; + --sl-content-width: 36rem; --sl-sidebar-width: 18.5rem; --sl-sidebar-pad-x: 3rem; /* one top inset shared by sidebar, content and table of contents */ - --docs-top: 4.5rem; + --docs-top: 5rem; --sl-color-hairline: transparent; --sl-color-hairline-light: transparent; --sl-color-hairline-shade: transparent; @@ -49,11 +49,21 @@ @media (min-width: 50rem) { .sidebar-content { padding-top: var(--docs-top); - gap: 1.25rem; + /* more gutter on the left, with the freed space taken from the invisible + right side so the nav keeps its width and long labels don't wrap */ + padding-inline: 5rem 1rem; + gap: 1.75rem; } :root[data-has-sidebar] main > .content-panel:first-of-type { padding-top: var(--docs-top); + /* the title panel and the body panel each add 1.5rem of padding, which + leaves a 3rem gap under the title; trim it to the reference's 1rem */ + padding-bottom: 0.5rem; + } + + :root[data-has-sidebar] main > .content-panel:first-of-type + .content-panel { + padding-top: 0.5rem; } .right-sidebar-panel { @@ -65,6 +75,17 @@ } } +/* the "On this page" label is just a bold entry, the same size as the links */ +.right-sidebar-panel h2 { + font-size: var(--sl-text-xs); + font-weight: var(--font-weight-semibold); +} + +/* every ToC entry aligns with the label: no indent for nested headings */ +.right-sidebar-panel nav a { + padding-inline-start: 0; +} + .sidebar-top { align-items: center; justify-content: space-between; @@ -114,15 +135,52 @@ site-search dialog { } site-search dialog::backdrop { - background-color: color-mix(in srgb, var(--color-foreground-default) 18%, transparent); + /* the web app's modal scrim: black in both themes, so dark mode dims rather + than lightens the page behind the dialog */ + background-color: rgb(0 0 0 / 0.4); -webkit-backdrop-filter: none; backdrop-filter: none; } +/* the sidebar scrolls, but without a visible scrollbar */ +.sidebar-pane { + scrollbar-width: none; +} + +.sidebar-pane::-webkit-scrollbar { + display: none; +} + +/* the mobile menu toggle is a ghost button, like the theme toggle beside it */ +starlight-menu-button button { + background-color: transparent; + box-shadow: none; + border-radius: var(--radius-md); + color: var(--color-foreground-muted); +} + +starlight-menu-button button:hover, +starlight-menu-button[aria-expanded="true"] button { + background-color: var(--color-background-inset); +} + +starlight-menu-button button:focus-visible { + outline: 2px solid var(--color-border-focus); + outline-offset: 2px; +} + +/* on mobile the header reserves room for the fixed menu button: keep the gap + between the theme toggle and that button at 0.5rem */ +@media (max-width: 49.999rem) { + :root[data-has-sidebar] .header { + padding-inline-end: calc(0.5rem + var(--sl-nav-pad-x) + var(--sl-menu-button-size)); + } +} + /* the nav: one size throughout, bold group headings, whitespace between groups */ .docs-nav { font-size: 0.875rem; - line-height: 1.25rem; + line-height: 1.2; } .docs-nav ul { @@ -174,6 +232,49 @@ site-search dialog::backdrop { /* content: markup.css does the typography. what's left is fitting it around the elements starlight adds */ +/* body text sits a step below the brightest foreground; headings and links + stay bright. markup.css sets the container colour and each heading's, so a + rule on the container re-tints the prose without dimming the headings */ +.markup { + color: var(--color-foreground-muted); +} + +/* tables take the web app's card/panel radius (--radius-md). the outer border + sits on the table (a block scroll container), so its corners follow the + radius cleanly: the cells keep only their inner rules and no border is + clipped at the corners */ +.markup table { + border: 1px solid var(--color-border-default); + border-radius: var(--radius-md); + border-collapse: separate; + border-spacing: 0; +} + +.markup :is(th, td) { + border: 0; + border-inline-end: 1px solid var(--color-border-default); + border-block-end: 1px solid var(--color-border-default); +} + +/* the last column and row drop their inner rules, the table border closes them */ +.markup tr > :last-child { + border-inline-end: 0; +} + +.markup tbody tr:last-child > * { + border-block-end: 0; +} + +/* prose stays left-aligned; just avoid orphans and overlong tokens */ +.markup :is(p, li, dd, blockquote) { + text-wrap: pretty; + overflow-wrap: break-word; +} + +.markup :is(h1, h2, h3, h4, h5, h6) { + text-wrap: balance; +} + /* starlight wraps each heading with its anchor link. the rule under a readme's h1 and h2 goes on the wrapper, so it spans the column */ .markup .sl-heading-wrapper { @@ -197,6 +298,20 @@ site-search dialog::backdrop { margin-top: 0; } +/* keep the shared markup styles' always-on underline: the text stays the + brightest foreground, the underline is muted until hover, then brightens. + this drops the indigo link-hover colour (web/src/markup.css). the heading + anchor keeps its `#` */ +.markup a:not(.sl-anchor-link) { + color: var(--color-foreground-default); + text-decoration-color: var(--color-foreground-muted); +} + +.markup a:not(.sl-anchor-link):hover { + color: var(--color-foreground-default); + text-decoration-color: var(--color-foreground-default); +} + /* the anchor link, shown as tangled.org's `#` on hover */ .markup .sl-anchor-link { margin-inline-start: var(--spacing-xs); @@ -271,17 +386,9 @@ site-search dialog::backdrop { color: var(--color-foreground-danger); } -/* next/previous links, as plain text */ -.pagination-links a { - border: 0; - box-shadow: none; - padding: var(--spacing-xs) 0; - text-decoration: none; -} - -.pagination-links a .link-title { - font-size: 0.9375rem; - font-weight: var(--font-weight-medium); +/* no next/previous links at the foot of the page */ +.pagination-links { + display: none; } /* expressive code sets its own size on pre; markup.css sizes code at 0.875em of @@ -290,6 +397,11 @@ site-search dialog::backdrop { font-size: 0.9375rem; } +/* no copy button on code blocks */ +.expressive-code .copy { + display: none; +} + /* starlight sizes the heading wrapper with its own scale, which the anchor link inherits; match each level to the heading markup.css gives it */ .markup .sl-heading-wrapper.level-h1 {