From 3ae908995de83dac2a3bfa87db3e9d63a3d25630 Mon Sep 17 00:00:00 2001 From: Abeuty Date: Mon, 6 Jul 2026 11:15:46 -0600 Subject: [PATCH 1/2] feat(ds): propagate palette, extract MegaMenuItem, expand /ds pages Design-system follow-ups on top of the rebrand: - Palette: bridge legacy gray/twine to the warm DS neutral ramp in app.css so the whole site adopts the new palette; migrate the shared primitives (Button, Badge, FormInput, Tooltip) to semantic tokens. - Typography: add semantic .h1-.h6 classes; move Font families to the top of /ds/typography and make the family cards minimal. - MegaMenuItem: extract the mega-menu row into a reusable component matched to the Figma "Mega Menu Item" (bordered 44px icon, Bricolage-bold title, #aba594 description, adaptive hover/press); wire it into the Navbar with 8px spacing between items. - /ds/navbar: new Navbar DS page - anatomy preview with a device-size toggle (Auto/Mobile/iPad/Desktop) driven by container queries, plus a MegaMenuItem showcase. Add a "Design System" nav item under Support. - Home: remove the "Browse the stack" section; restructure "Why TanStack" into four centered principle sections. Refine navbar spacing. - Icons: finish the lucide->Phosphor migration (CheckCircleIcon->CheckCircle, CogsIcon->Gear); remove the orphaned custom icons. - Spinner: remove the Palm spinner demo from /ds/spinner. - Add @figma/code-connect dev dependency. Co-Authored-By: Claude Opus 4.8 --- package.json | 1 + pnpm-lock.yaml | 686 +++++++++++++++++++++++ src/components/FeatureGrid.tsx | 4 +- src/components/MegaMenuItem.tsx | 120 ++++ src/components/Navbar.tsx | 96 +--- src/components/ds/ds-nav.ts | 1 + src/components/icons/CheckCircleIcon.tsx | 28 - src/components/icons/CogsIcon.tsx | 25 - src/libraries/ai.tsx | 5 +- src/libraries/config.tsx | 5 +- src/libraries/db.tsx | 5 +- src/libraries/devtools.tsx | 5 +- src/libraries/form.tsx | 5 +- src/libraries/query.tsx | 5 +- src/libraries/table.tsx | 5 +- src/libraries/virtual.tsx | 5 +- src/routeTree.gen.ts | 21 + src/routes/ads.tsx | 4 +- src/routes/ds.index.tsx | 2 + src/routes/ds.navbar.tsx | 371 ++++++++++++ src/routes/ds.spinner.tsx | 17 +- src/routes/ds.typography.tsx | 89 ++- src/routes/index.tsx | 162 ++---- src/routes/learn.tsx | 16 +- src/routes/workshops.tsx | 7 +- src/styles/app.css | 78 ++- src/ui/Badge.tsx | 2 +- src/ui/Button.tsx | 8 +- src/ui/FormInput.tsx | 2 +- src/ui/Tooltip.tsx | 4 +- 30 files changed, 1437 insertions(+), 347 deletions(-) create mode 100644 src/components/MegaMenuItem.tsx delete mode 100644 src/components/icons/CheckCircleIcon.tsx delete mode 100644 src/components/icons/CogsIcon.tsx create mode 100644 src/routes/ds.navbar.tsx diff --git a/package.json b/package.json index bd8c8bc1e..93d2c82d6 100644 --- a/package.json +++ b/package.json @@ -124,6 +124,7 @@ "@cloudflare/vite-plugin": "^1.42.0", "@content-collections/core": "^0.14.3", "@content-collections/vite": "^0.2.9", + "@figma/code-connect": "^1.4.8", "@tanstack/devtools-vite": "^0.7.0", "@tanstack/react-devtools": "^0.10.5", "@tanstack/react-query-devtools": "^5.100.11", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e86314a1..a2e34d092 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -283,6 +283,9 @@ importers: '@content-collections/vite': specifier: ^0.2.9 version: 0.2.9(@content-collections/core@0.14.3(typescript@6.0.2))(vite@8.0.13(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + '@figma/code-connect': + specifier: ^1.4.8 + version: 1.4.8 '@tanstack/devtools-vite': specifier: ^0.7.0 version: 0.7.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) @@ -438,6 +441,9 @@ packages: zod: optional: true + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -601,6 +607,34 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@dimforge/rapier3d-compat@0.12.0': resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} @@ -1234,6 +1268,11 @@ packages: peerDependencies: '@opentelemetry/api': ^1.9.0 + '@figma/code-connect@1.4.8': + resolution: {integrity: sha512-Z9KyZPCx88ryFoRbe5M+vs3ZlPo7hFzD8yqeT+43nJM1PaIag04Xm2a0+9C7bCgwyn8jmKKNtDNG5f++Nn1tfA==} + engines: {node: '>=18'} + hasBin: true + '@fingerprintjs/fingerprintjs-pro-react@2.7.1': resolution: {integrity: sha512-/vQtjd+P8C9OFU8Wvd4AScoNRP6RKDIvYQwwaY/b31PcRBNDqVV9xm7DDBg9uTdDv4KZM3ubEY4JyyVWkXs4EA==} @@ -3598,6 +3637,9 @@ packages: resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} engines: {node: '>=20.19'} + '@ts-morph/common@0.28.1': + resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + '@tweenjs/tween.js@23.1.3': resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} @@ -3890,6 +3932,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -3910,6 +3956,9 @@ packages: resolution: {integrity: sha512-yE5I83Q2s8euVou8Y3feXK08wyZInJWLYXgWO6Xti9jBUEZAGUahyeQ7wSZWkifLWVnQVKEz5RAmBlXG5nqxog==} engines: {node: '>= 14.0.0'} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -3951,6 +4000,9 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -4031,6 +4083,9 @@ packages: binary-search-bounds@2.0.5: resolution: {integrity: sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -4041,6 +4096,10 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boxen@5.1.1: + resolution: {integrity: sha512-JtIQYts08AFAYGF4eSh3pUt3NQkYV/e75pRtQmAVTLNWR/1L7Bsswxlgzgk8nmLEM+gFszsIlA9BgD3XnSqp3g==} + engines: {node: '>=10'} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -4064,6 +4123,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -4083,6 +4145,10 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -4152,9 +4218,25 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -4165,6 +4247,9 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -4178,9 +4263,17 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -4189,6 +4282,9 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -4258,6 +4354,10 @@ packages: engines: {node: '>=4'} hasBin: true + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -4420,6 +4520,10 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -4444,9 +4548,15 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -4458,6 +4568,10 @@ packages: delaunator@5.1.0: resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -4793,6 +4907,9 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-fuzzy@1.12.0: + resolution: {integrity: sha512-sXxGgHS+ubYpsdLnvOvJ9w5GYYZrtL9mkosG3nfuD446ahvoWEsSKBP7ieGmWIKVLnaxRDgUJkZMdxRgA2Ni+Q==} + fast-sha256@1.3.0: resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} @@ -4843,6 +4960,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} @@ -4934,6 +5055,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemesplit@2.6.0: + resolution: {integrity: sha512-rG9w2wAfkpg0DILa1pjnjNfucng3usON360shisqIMUBw/87pojcBSrHmeE4UwryAuBih7g8m1oilf5/u8EWdQ==} + graphql@16.13.2: resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -4990,6 +5114,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} @@ -5031,6 +5159,10 @@ packages: htm@3.1.1: resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} @@ -5044,10 +5176,18 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@8.0.1: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} @@ -5190,6 +5330,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -5206,6 +5350,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} @@ -5240,6 +5387,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -5293,6 +5444,9 @@ packages: jose@6.2.2: resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} + js-base64@3.8.0: + resolution: {integrity: sha512-65kvbemyZhj+ExQt1PEFyBEjL5vAHysu1lJdW1AwhhChkO8ZBPizYk/m9GVrpbS2Je1hF+UYZ+6KywqtZV8mHw==} + js-cookie@3.0.8: resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==} @@ -5306,6 +5460,15 @@ packages: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true + jsdom@24.1.3: + resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -5346,6 +5509,10 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -5463,6 +5630,13 @@ packages: lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -5470,6 +5644,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.7: resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} @@ -5677,14 +5854,26 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mime-types@3.0.2: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + miniflare@4.20260617.1: resolution: {integrity: sha512-Go3/gzStm99QHptsSgU+q1S+xDfLoRgwjJNY80kaTVi0ENhTyqKq+sc4xZiWBSbM7uUcJwmzm8+QFKtcYLJ9nw==} engines: {node: '>=22.0.0'} @@ -5701,6 +5890,10 @@ packages: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -5782,6 +5975,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nwsapi@2.2.24: + resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -5805,6 +6001,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -5821,6 +6021,10 @@ packages: zod: optional: true + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -5866,6 +6070,9 @@ packages: package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -5900,6 +6107,9 @@ packages: partial-json@0.1.7: resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} @@ -6020,6 +6230,11 @@ packages: preact@10.29.0: resolution: {integrity: sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + prettier@3.8.1: resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} engines: {node: '>=14'} @@ -6039,6 +6254,10 @@ packages: promise-worker-transferable@1.0.4: resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -6052,6 +6271,13 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} @@ -6059,6 +6285,9 @@ packages: resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} engines: {node: '>=0.6'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -6150,6 +6379,10 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -6212,6 +6445,9 @@ packages: resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resend@6.10.0: resolution: {integrity: sha512-i7CwZpYj4Oho1RxsTpLcCUkO08+HiL4NXrm6jLJ2WzJ89UGI8eROSieLONJA3hnUrf1OYnCyfq5F6POnHUMv1Q==} engines: {node: '>=20'} @@ -6229,6 +6465,10 @@ packages: engines: {node: '>= 0.4'} hasBin: true + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -6262,6 +6502,12 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} @@ -6283,6 +6529,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -6378,10 +6628,16 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + solid-js@1.9.12: resolution: {integrity: sha512-QzKaSJq2/iDrWR1As6MHZQ8fQkdOBf8GReYb7L5iKwMGceg7HxDcaOHk0at66tNgn9U2U7dXo8ZZpLIAmGMzgw==} @@ -6535,6 +6791,9 @@ packages: svix@1.88.0: resolution: {integrity: sha512-vm/JrrUd3bVyBE+3L33TIyVSs8gS5fYx7lrISvKlDJXTYX1ACH4REX8P1tHxsSKoZi/rvifM1t0XRc5Vc45THw==} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} @@ -6587,6 +6846,9 @@ packages: three@0.183.2: resolution: {integrity: sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==} + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinyexec@1.0.4: resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} @@ -6614,9 +6876,17 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tree-dump@1.1.0: resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} engines: {node: '>=10.0'} @@ -6649,6 +6919,9 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + ts-morph@27.0.2: + resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -6660,6 +6933,10 @@ packages: tunnel-rat@0.1.2: resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -6689,6 +6966,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} @@ -6710,6 +6992,9 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + unicorn-magic@0.4.0: resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} engines: {node: '>=20'} @@ -6735,6 +7020,10 @@ packages: universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -6770,6 +7059,9 @@ packages: tailwindcss: optional: true + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -6918,6 +7210,13 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -6930,6 +7229,10 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -6942,6 +7245,10 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -6966,6 +7273,10 @@ packages: engines: {node: '>= 8'} hasBin: true + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + workerd@1.20260617.1: resolution: {integrity: sha512-Re5pl6pdowt3ZmWUzGlOuB7jbRIIPetgKalmo4cYmucQnVhpo7/3e4MfpekbhLi2EhZZz5EY9NWRu8zFzuEZew==} engines: {node: '>=16'} @@ -7016,10 +7327,17 @@ packages: utf-8-validate: optional: true + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + xmlbuilder2@4.0.3: resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} engines: {node: '>=20.0'} + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xstate@5.30.0: resolution: {integrity: sha512-mIzIuMjtYVkqXq9dUzYQoag7b/dF1CBS/yhliuPLfR0FwKPC18HiUivb/crcqY2gknhR8gJEhnppLg6ubQ0gGw==} @@ -7080,6 +7398,15 @@ packages: peerDependencies: zod: ^3.25.28 || ^4 + zod-validation-error@3.5.4: + resolution: {integrity: sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.24.4 + + zod@3.25.58: + resolution: {integrity: sha512-DVLmMQzSZwNYzQoMaM3MQWnxr2eq+AtM9Hx3w1/Yl0pH8sLTSjN4jGP7w6f7uand6Hw44tsnSu1hz1AOA6qI2Q==} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -7213,6 +7540,14 @@ snapshots: optionalDependencies: zod: 4.3.6 + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -7405,6 +7740,26 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + '@dimforge/rapier3d-compat@0.12.0': {} '@drizzle-team/brocli@0.10.2': {} @@ -7753,6 +8108,36 @@ snapshots: transitivePeerDependencies: - supports-color + '@figma/code-connect@1.4.8': + dependencies: + boxen: 5.1.1 + chalk: 4.1.2 + commander: 11.1.0 + compare-versions: 6.1.1 + cross-spawn: 7.0.6 + dotenv: 16.6.1 + fast-fuzzy: 1.12.0 + find-up: 5.0.0 + glob: 13.0.6 + jsdom: 24.1.3 + lodash: 4.18.1 + minimatch: 9.0.9 + ora: 5.4.1 + parse5: 7.3.0 + prettier: 2.8.8 + prompts: 2.4.2 + strip-ansi: 6.0.1 + ts-morph: 27.0.2 + typescript: 6.0.3 + undici: 7.28.0 + zod: 3.25.58 + zod-validation-error: 3.5.4(zod@3.25.58) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + '@fingerprintjs/fingerprintjs-pro-react@2.7.1': dependencies: '@fingerprintjs/fingerprintjs-pro-spa': 1.3.3 @@ -9960,6 +10345,12 @@ snapshots: '@tanstack/virtual-file-routes@1.162.0': {} + '@ts-morph/common@0.28.1': + dependencies: + minimatch: 10.2.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.16 + '@tweenjs/tween.js@23.1.3': {} '@tybys/wasm-util@0.10.1': @@ -10276,6 +10667,8 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.4: {} + ajv-formats@3.0.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -10309,6 +10702,10 @@ snapshots: '@algolia/requester-fetch': 5.50.0 '@algolia/requester-node-http': 5.50.0 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-regex@5.0.1: {} ansi-styles@3.2.1: @@ -10354,6 +10751,8 @@ snapshots: async@3.2.6: {} + asynckit@0.4.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -10417,6 +10816,12 @@ snapshots: binary-search-bounds@2.0.5: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blake3-wasm@2.1.5: {} body-parser@2.2.2: @@ -10435,6 +10840,17 @@ snapshots: boolbase@1.0.0: {} + boxen@5.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -10460,6 +10876,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -10484,6 +10905,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + camelcase@6.3.0: {} + camelcase@8.0.0: {} camera-controls@3.1.2(three@0.183.2): @@ -10564,12 +10987,22 @@ snapshots: classnames@2.5.1: {} + cli-boxes@2.2.1: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone@1.0.4: {} + clsx@2.1.1: {} cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): @@ -10584,6 +11017,8 @@ snapshots: - '@types/react' - '@types/react-dom' + code-block-writer@13.0.3: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -10596,12 +11031,20 @@ snapshots: color-name@1.1.4: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + commander@11.1.0: {} + commander@7.2.0: {} commander@8.3.0: {} + compare-versions@6.1.1: {} + concat-map@0.0.1: {} confbox@0.1.8: {} @@ -10659,6 +11102,11 @@ snapshots: cssesc@3.0.0: {} + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + csstype@3.2.3: {} cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): @@ -10847,6 +11295,11 @@ snapshots: d3: 7.9.0 lodash-es: 4.17.23 + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -10871,10 +11324,16 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.6.0: {} + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 + defaults@1.0.4: + dependencies: + clone: 1.0.4 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -10891,6 +11350,8 @@ snapshots: dependencies: robust-predicates: 3.0.3 + delayed-stream@1.0.0: {} + depd@2.0.0: {} dequal@2.0.3: {} @@ -11301,6 +11762,10 @@ snapshots: fast-fifo@1.3.2: {} + fast-fuzzy@1.12.0: + dependencies: + graphemesplit: 2.6.0 + fast-sha256@1.3.0: {} fast-uri@3.1.0: {} @@ -11349,6 +11814,14 @@ snapshots: dependencies: is-callable: 1.2.7 + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + forwarded-parse@2.1.2: {} forwarded@0.2.0: {} @@ -11437,6 +11910,11 @@ snapshots: graceful-fs@4.2.11: {} + graphemesplit@2.6.0: + dependencies: + js-base64: 3.8.0 + unicode-trie: 2.0.0 + graphql@16.13.2: {} gray-matter@4.0.3: @@ -11481,6 +11959,10 @@ snapshots: dependencies: function-bind: 1.1.2 + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + hast-util-from-parse5@8.0.3: dependencies: '@types/hast': 3.0.4 @@ -11573,6 +12055,10 @@ snapshots: htm@3.1.1: {} + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-url-attributes@3.0.1: {} html-void-elements@3.0.0: {} @@ -11592,6 +12078,13 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -11599,6 +12092,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-signals@8.0.1: {} husky@9.1.7: {} @@ -11755,6 +12255,8 @@ snapshots: is-hexadecimal@2.0.1: {} + is-interactive@1.0.0: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -11766,6 +12268,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: {} + is-promise@2.2.2: {} is-promise@4.0.0: {} @@ -11800,6 +12304,8 @@ snapshots: dependencies: which-typed-array: 1.1.20 + is-unicode-supported@0.1.0: {} + is-unicode-supported@2.1.0: {} is-weakmap@2.0.2: {} @@ -11844,6 +12350,8 @@ snapshots: jose@6.2.2: {} + js-base64@3.8.0: {} + js-cookie@3.0.8: {} js-tokens@10.0.0: {} @@ -11855,6 +12363,34 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 + jsdom@24.1.3: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + form-data: 4.0.6 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.24 + parse5: 7.3.0 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.21.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@3.1.0: {} json-parse-better-errors@1.0.2: {} @@ -11887,6 +12423,8 @@ snapshots: kind-of@6.0.3: {} + kleur@3.0.3: {} + kleur@4.1.5: {} langium@4.2.1: @@ -11990,12 +12528,21 @@ snapshots: lodash@4.17.23: {} + lodash@4.18.1: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + longest-streak@3.1.0: {} loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 + lru-cache@10.4.3: {} + lru-cache@11.2.7: {} lru-cache@5.1.1: @@ -12429,12 +12976,20 @@ snapshots: transitivePeerDependencies: - supports-color + mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mime-types@3.0.2: dependencies: mime-db: 1.54.0 + mimic-fn@2.1.0: {} + miniflare@4.20260617.1: dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -12459,6 +13014,10 @@ snapshots: dependencies: brace-expansion: 2.0.3 + minimatch@9.0.9: + dependencies: + brace-expansion: 2.0.3 + minimist@1.2.8: {} minipass@7.1.3: {} @@ -12547,6 +13106,8 @@ snapshots: dependencies: boolbase: 1.0.0 + nwsapi@2.2.24: {} + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -12570,6 +13131,10 @@ snapshots: dependencies: wrappy: 1.0.2 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + open@7.4.2: dependencies: is-docker: 2.2.1 @@ -12580,6 +13145,18 @@ snapshots: ws: 8.21.0 zod: 4.3.6 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -12686,6 +13263,8 @@ snapshots: package-manager-detector@1.6.0: {} + pako@0.2.9: {} + pako@1.0.11: {} parse-entities@4.0.2: @@ -12724,6 +13303,8 @@ snapshots: partial-json@0.1.7: {} + path-browserify@1.0.1: {} + path-data-parser@0.1.0: {} path-exists@4.0.0: {} @@ -12817,6 +13398,8 @@ snapshots: preact@10.29.0: {} + prettier@2.8.8: {} + prettier@3.8.1: {} pretty-ms@9.3.0: @@ -12832,6 +13415,11 @@ snapshots: is-promise: 2.2.2 lie: 3.3.0 + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -12847,12 +13435,20 @@ snapshots: proxy-from-env@1.1.0: {} + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + pure-rand@6.1.0: {} qs@6.15.0: dependencies: side-channel: 1.1.0 + querystringify@2.2.0: {} + range-parser@1.2.1: {} raw-body@3.0.2: @@ -12953,6 +13549,12 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} readdirp@5.0.0: {} @@ -13045,6 +13647,8 @@ snapshots: transitivePeerDependencies: - supports-color + requires-port@1.0.0: {} + resend@6.10.0: dependencies: postal-mime: 2.7.4 @@ -13058,6 +13662,11 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + rimraf@2.6.3: dependencies: glob: 13.0.6 @@ -13137,6 +13746,10 @@ snapshots: transitivePeerDependencies: - supports-color + rrweb-cssom@0.7.1: {} + + rrweb-cssom@0.8.0: {} + rw@1.3.3: {} safe-array-concat@1.1.3: @@ -13162,6 +13775,10 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scheduler@0.27.0: {} search-insights@2.17.3: {} @@ -13303,8 +13920,12 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + solid-js@1.9.12: dependencies: csstype: 3.2.3 @@ -13496,6 +14117,8 @@ snapshots: standardwebhooks: 1.0.0 uuid: 10.0.0 + symbol-tree@3.2.4: {} + tabbable@6.4.0: {} tailwind-merge@3.5.0: {} @@ -13564,6 +14187,8 @@ snapshots: three@0.183.2: {} + tiny-inflate@1.0.3: {} + tinyexec@1.0.4: {} tinyglobby@0.2.15: @@ -13586,8 +14211,19 @@ snapshots: toidentifier@1.0.1: {} + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + tr46@0.0.3: {} + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tree-dump@1.1.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -13614,6 +14250,11 @@ snapshots: ts-dedent@2.2.0: {} + ts-morph@27.0.2: + dependencies: + '@ts-morph/common': 0.28.1 + code-block-writer: 13.0.3 + tslib@2.8.1: {} tsx@4.21.0: @@ -13632,6 +14273,8 @@ snapshots: - react - use-sync-external-store + type-fest@0.20.2: {} + type-fest@4.41.0: {} type-is@2.0.1: @@ -13675,6 +14318,8 @@ snapshots: typescript@6.0.2: {} + typescript@6.0.3: {} + ufo@1.6.3: {} unbox-primitive@1.1.0: @@ -13694,6 +14339,11 @@ snapshots: dependencies: pathe: 2.0.3 + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + unicorn-magic@0.4.0: {} unified@11.0.5: @@ -13731,6 +14381,8 @@ snapshots: universal-user-agent@7.0.3: {} + universalify@0.2.0: {} + unpipe@1.0.0: {} unplugin@3.0.0: @@ -13756,6 +14408,11 @@ snapshots: express: 5.2.1 tailwindcss: 4.2.2 + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.3): dependencies: react: 19.2.3 @@ -13853,6 +14510,14 @@ snapshots: vscode-uri@3.1.0: {} + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} webgl-constants@1.1.1: {} @@ -13861,6 +14526,8 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} + webpack-virtual-modules@0.6.2: {} whatwg-encoding@3.1.1: @@ -13869,6 +14536,11 @@ snapshots: whatwg-mimetype@4.0.0: {} + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -13919,6 +14591,10 @@ snapshots: dependencies: isexe: 2.0.0 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + workerd@1.20260617.1: optionalDependencies: '@cloudflare/workerd-darwin-64': 1.20260617.1 @@ -13959,6 +14635,8 @@ snapshots: ws@8.21.0: {} + xml-name-validator@5.0.0: {} + xmlbuilder2@4.0.3: dependencies: '@oozcitak/dom': 2.0.2 @@ -13966,6 +14644,8 @@ snapshots: '@oozcitak/util': 10.0.0 js-yaml: 3.14.2 + xmlchars@2.2.0: {} + xstate@5.30.0: {} xtend@4.0.2: {} @@ -14017,6 +14697,12 @@ snapshots: dependencies: zod: 4.3.6 + zod-validation-error@3.5.4(zod@3.25.58): + dependencies: + zod: 3.25.58 + + zod@3.25.58: {} + zod@3.25.76: {} zod@4.3.6: {} diff --git a/src/components/FeatureGrid.tsx b/src/components/FeatureGrid.tsx index ff629fb99..8de8b249b 100644 --- a/src/components/FeatureGrid.tsx +++ b/src/components/FeatureGrid.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { CheckCircleIcon } from '~/components/icons/CheckCircleIcon' +import { CheckCircle } from '@phosphor-icons/react' type FeatureGridProps = { title?: string @@ -23,7 +23,7 @@ export function FeatureGrid({ title, items, gridClassName }: FeatureGridProps) { > {items.map((d, i) => ( - {d} + {d} ))} diff --git a/src/components/MegaMenuItem.tsx b/src/components/MegaMenuItem.tsx new file mode 100644 index 000000000..d153cfae7 --- /dev/null +++ b/src/components/MegaMenuItem.tsx @@ -0,0 +1,120 @@ +import * as React from 'react' +import { Link } from '@tanstack/react-router' +import { twMerge } from 'tailwind-merge' +import { ArrowSquareOut } from '@phosphor-icons/react' + +type IconComponent = React.ComponentType<{ className?: string }> + +export interface MegaMenuItemProps { + /** Leading icon, shown in a bordered rounded square. */ + icon?: IconComponent + title: React.ReactNode + description?: React.ReactNode + /** Internal route or external (http/mailto) URL. */ + to: string + hash?: string + badge?: string + onNavigate?: () => void + variant?: 'desktop' | 'mobile' + /** Elevated variant used for standalone / featured rows. */ + compact?: boolean + className?: string +} + +function isExternal(to: string) { + return to.startsWith('http') || to.startsWith('mailto:') +} + +/** + * A single mega-menu row — icon + title + description with rest / hover / + * pressed states. Modeled on the Figma "Mega Menu Item" component: bordered + * icon square, Bricolage-bold title (heading-5), muted body-xs description, and + * a mode-adaptive overlay on hover/press. Used by the site Navbar and shown in + * the design system at /ds/navbar. + */ +export function MegaMenuItem({ + icon: Icon, + title, + description, + to, + hash, + badge, + onNavigate, + variant = 'desktop', + compact, + className, +}: MegaMenuItemProps) { + const external = isExternal(to) + + const rootClassName = twMerge( + // Figma "Mega Menu Item": gap 10px, pl 8 / pr 16 / py 8, radius 12px. + 'group/mmi flex items-center gap-2.5 rounded-xl py-2 pl-2 pr-4 text-left transition-colors', + // States differ only by row background: hover white/4%, pressed white/12% + // (mode-adaptive via text-primary so it also works on light menu panels). + 'hover:bg-text-primary/[0.04] focus:bg-text-primary/[0.04] focus:outline-none active:bg-text-primary/[0.12]', + compact && 'border border-border-subtle bg-background-surface', + variant === 'desktop' && !compact && 'w-[260px]', + variant === 'mobile' && 'py-2.5', + className, + ) + + const content = ( + <> + {Icon ? ( + + + + ) : null} + + + + {title} + + {badge ? ( + + {badge} + + ) : null} + {external && !to.startsWith('mailto:') ? ( + + ) : null} + + {description ? ( + // Plain string (not twMerge) — the DS text-size and text-color + // utilities both start with `text-`, and twMerge would drop the color. + + {description} + + ) : null} + + + ) + + if (external) { + return ( + + {content} + + ) + } + + return ( + + {content} + + ) +} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index ae0f8da08..77ad405e1 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -9,11 +9,11 @@ const LazyNavbarAuthControls = React.lazy(() => })), ) import { NavbarCartButton } from './NavbarCartButton' +import { MegaMenuItem } from './MegaMenuItem' import { Link, useLocation, useMatches } from '@tanstack/react-router' import { BookOpen, Code, - ArrowSquareOut, GridFour, Hammer, Heart, @@ -326,6 +326,12 @@ const NAV_GROUPS = [ description: 'Logos, colors, and brand usage.', icon: PaintBrush, }, + { + label: 'Design System', + to: '/ds', + description: 'Design tokens and components for TanStack surfaces.', + icon: GridFour, + }, ], }, ], @@ -352,10 +358,6 @@ function getLibraryDisplayName(library: LibrarySlim) { return library.name.replace(/^TanStack\s+/, '') } -function isExternalLink(to: string) { - return to.startsWith('http') || to.startsWith('mailto:') -} - function getLibraryDocsTo(library: NavigationLibrary) { return `${library.to}/latest/docs` } @@ -560,8 +562,8 @@ export function Navbar({ children }: { children: React.ReactNode }) { const navbar = (
{NAV_GROUPS.map((group) => ( @@ -604,7 +606,7 @@ export function Navbar({ children }: { children: React.ReactNode }) { ))} -
+
{socialLinks}
@@ -901,7 +903,7 @@ function MegaMenuContent({
- {Icon ? ( - - - - ) : null} - - - - {item.label} - - {item.badge ? ( - - {item.badge} - - ) : null} - {isExternal && !item.to.startsWith('mailto:') ? ( - - ) : null} - - {item.description ? ( - - {item.description} - - ) : null} - - - ) - - if (isExternal) { - return ( - - {content} - - ) - } - return ( - - {content} - + badge={item.badge} + onNavigate={onNavigate} + variant={variant} + compact={compact} + /> ) } diff --git a/src/components/ds/ds-nav.ts b/src/components/ds/ds-nav.ts index edcaf6387..f36c263d2 100644 --- a/src/components/ds/ds-nav.ts +++ b/src/components/ds/ds-nav.ts @@ -47,6 +47,7 @@ export const dsNav: Array = [ { label: 'Collapsible', to: '/ds/collapsible' }, { label: 'Breadcrumbs', to: '/ds/breadcrumbs' }, { label: 'Cards & Surfaces', to: '/ds/cards' }, + { label: 'Navbar', to: '/ds/navbar' }, ], }, ] diff --git a/src/components/icons/CheckCircleIcon.tsx b/src/components/icons/CheckCircleIcon.tsx deleted file mode 100644 index 58ef1372a..000000000 --- a/src/components/icons/CheckCircleIcon.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import * as React from 'react' - -export function CheckCircleIcon({ - className, - width = '1em', - height = '1em', - ...props -}: React.SVGProps) { - return ( - - - - - ) -} diff --git a/src/components/icons/CogsIcon.tsx b/src/components/icons/CogsIcon.tsx deleted file mode 100644 index 5ad4b159f..000000000 --- a/src/components/icons/CogsIcon.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import * as React from 'react' - -export function CogsIcon({ - className, - width = '1em', - height = '1em', - ...props -}: React.SVGProps) { - return ( - - - - ) -} diff --git a/src/libraries/ai.tsx b/src/libraries/ai.tsx index 91ebd538b..f1386f743 100644 --- a/src/libraries/ai.tsx +++ b/src/libraries/ai.tsx @@ -1,7 +1,6 @@ import { Library } from '.' -import { Plug, Lightning } from '@phosphor-icons/react' +import { Plug, Lightning, Gear } from '@phosphor-icons/react' import { twMerge } from 'tailwind-merge' -import { CogsIcon } from '~/components/icons/CogsIcon' import { ai } from './libraries' const textStyles = `text-pink-600 dark:text-pink-500` @@ -37,7 +36,7 @@ export const aiProject = { }, { title: 'Typed Tools & Media', - icon: , + icon: , description: (
Type-safe client/server tools, provider-native tools, structured diff --git a/src/libraries/config.tsx b/src/libraries/config.tsx index 6b1ea17b4..d21a6219c 100644 --- a/src/libraries/config.tsx +++ b/src/libraries/config.tsx @@ -1,6 +1,5 @@ -import { MagicWand, Lightning } from '@phosphor-icons/react' +import { MagicWand, Lightning, Gear } from '@phosphor-icons/react' import { twMerge } from 'tailwind-merge' -import { CogsIcon } from '~/components/icons/CogsIcon' import { config } from './libraries' const textStyles = 'text-black dark:text-gray-100' @@ -45,7 +44,7 @@ export const configProject = { }, { title: 'Effortless Publication', - icon: , + icon: , description: (
Say goodbye to the complexities of code publishing. This package diff --git a/src/libraries/db.tsx b/src/libraries/db.tsx index a3f3531ff..c46acaded 100644 --- a/src/libraries/db.tsx +++ b/src/libraries/db.tsx @@ -1,6 +1,5 @@ -import { Stack, Lightning } from '@phosphor-icons/react' +import { Stack, Lightning, Gear } from '@phosphor-icons/react' import { twMerge } from 'tailwind-merge' -import { CogsIcon } from '~/components/icons/CogsIcon' import { db } from './libraries' const textStyles = `text-orange-600 dark:text-orange-500` @@ -37,7 +36,7 @@ export const dbProject = { }, { title: 'Optimistic mutations', - icon: , + icon: , description: (
Batch and stage instant local changes across collections. Sync diff --git a/src/libraries/devtools.tsx b/src/libraries/devtools.tsx index feb674f8c..ab6c4390a 100644 --- a/src/libraries/devtools.tsx +++ b/src/libraries/devtools.tsx @@ -1,6 +1,5 @@ -import { MagicWand, Lightning } from '@phosphor-icons/react' +import { MagicWand, Lightning, Gear } from '@phosphor-icons/react' import { twMerge } from 'tailwind-merge' -import { CogsIcon } from '~/components/icons/CogsIcon' import { devtools } from './libraries' const textStyles = 'text-black dark:text-gray-100' @@ -42,7 +41,7 @@ export const devtoolsProject = { }, { title: 'Custom Devtools Support', - icon: , + icon: , description: (
Extend the devtools panel with your own custom devtools. The platform diff --git a/src/libraries/form.tsx b/src/libraries/form.tsx index 59f129514..d1a69c962 100644 --- a/src/libraries/form.tsx +++ b/src/libraries/form.tsx @@ -1,6 +1,5 @@ -import { MagicWand, Lightning } from '@phosphor-icons/react' +import { MagicWand, Lightning, Gear } from '@phosphor-icons/react' import { twMerge } from 'tailwind-merge' -import { CogsIcon } from '~/components/icons/CogsIcon' import { form } from './libraries' const textStyles = 'text-yellow-600 dark:text-yellow-300' @@ -71,7 +70,7 @@ export const formProject = { }, { title: 'Granular Reactive Performance', - icon: , + icon: , description: (
When it comes to performance, TanStack Form delivers amazing speed and diff --git a/src/libraries/query.tsx b/src/libraries/query.tsx index 295d61775..9994cdf6f 100644 --- a/src/libraries/query.tsx +++ b/src/libraries/query.tsx @@ -1,6 +1,5 @@ -import { MagicWand, Lightning } from '@phosphor-icons/react' +import { MagicWand, Lightning, Gear } from '@phosphor-icons/react' import { twMerge } from 'tailwind-merge' -import { CogsIcon } from '~/components/icons/CogsIcon' import { query } from './libraries' const textStyles = 'text-red-500 dark:text-red-400' @@ -110,7 +109,7 @@ export const queryProject = { { title: 'Extensible', icon: ( - , + icon: , description: (
TanStack table ships with excellent defaults to get you off the ground diff --git a/src/libraries/virtual.tsx b/src/libraries/virtual.tsx index 2784cb554..c4e49ebb4 100644 --- a/src/libraries/virtual.tsx +++ b/src/libraries/virtual.tsx @@ -1,6 +1,5 @@ -import { PersonSimple, Lightning } from '@phosphor-icons/react' +import { PersonSimple, Lightning, Gear } from '@phosphor-icons/react' import { twMerge } from 'tailwind-merge' -import { CogsIcon } from '~/components/icons/CogsIcon' import { virtual } from './libraries' const textStyles = 'text-violet-700 dark:text-violet-400' @@ -72,7 +71,7 @@ export const virtualProject = { }, { title: 'Maximum Composability', - icon: , + icon: , description: (
With a single function/hook, you'll get limitless virtualization for{' '} diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index e47fdca76..2a2f21982 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -69,6 +69,7 @@ import { Route as DsSpinnerRouteImport } from './routes/ds.spinner' import { Route as DsShadowsRouteImport } from './routes/ds.shadows' import { Route as DsSemanticRouteImport } from './routes/ds.semantic' import { Route as DsPaletteRouteImport } from './routes/ds.palette' +import { Route as DsNavbarRouteImport } from './routes/ds.navbar' import { Route as DsInputsRouteImport } from './routes/ds.inputs' import { Route as DsIconographyRouteImport } from './routes/ds.iconography' import { Route as DsIconMigrationRouteImport } from './routes/ds.icon-migration' @@ -480,6 +481,11 @@ const DsPaletteRoute = DsPaletteRouteImport.update({ path: '/palette', getParentRoute: () => DsRoute, } as any) +const DsNavbarRoute = DsNavbarRouteImport.update({ + id: '/navbar', + path: '/navbar', + getParentRoute: () => DsRoute, +} as any) const DsInputsRoute = DsInputsRouteImport.update({ id: '/inputs', path: '/inputs', @@ -1145,6 +1151,7 @@ export interface FileRoutesByFullPath { '/ds/icon-migration': typeof DsIconMigrationRoute '/ds/iconography': typeof DsIconographyRoute '/ds/inputs': typeof DsInputsRoute + '/ds/navbar': typeof DsNavbarRoute '/ds/palette': typeof DsPaletteRoute '/ds/semantic': typeof DsSemanticRoute '/ds/shadows': typeof DsShadowsRoute @@ -1309,6 +1316,7 @@ export interface FileRoutesByTo { '/ds/icon-migration': typeof DsIconMigrationRoute '/ds/iconography': typeof DsIconographyRoute '/ds/inputs': typeof DsInputsRoute + '/ds/navbar': typeof DsNavbarRoute '/ds/palette': typeof DsPaletteRoute '/ds/semantic': typeof DsSemanticRoute '/ds/shadows': typeof DsShadowsRoute @@ -1480,6 +1488,7 @@ export interface FileRoutesById { '/ds/icon-migration': typeof DsIconMigrationRoute '/ds/iconography': typeof DsIconographyRoute '/ds/inputs': typeof DsInputsRoute + '/ds/navbar': typeof DsNavbarRoute '/ds/palette': typeof DsPaletteRoute '/ds/semantic': typeof DsSemanticRoute '/ds/shadows': typeof DsShadowsRoute @@ -1654,6 +1663,7 @@ export interface FileRouteTypes { | '/ds/icon-migration' | '/ds/iconography' | '/ds/inputs' + | '/ds/navbar' | '/ds/palette' | '/ds/semantic' | '/ds/shadows' @@ -1818,6 +1828,7 @@ export interface FileRouteTypes { | '/ds/icon-migration' | '/ds/iconography' | '/ds/inputs' + | '/ds/navbar' | '/ds/palette' | '/ds/semantic' | '/ds/shadows' @@ -1988,6 +1999,7 @@ export interface FileRouteTypes { | '/ds/icon-migration' | '/ds/iconography' | '/ds/inputs' + | '/ds/navbar' | '/ds/palette' | '/ds/semantic' | '/ds/shadows' @@ -2599,6 +2611,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DsPaletteRouteImport parentRoute: typeof DsRoute } + '/ds/navbar': { + id: '/ds/navbar' + path: '/navbar' + fullPath: '/ds/navbar' + preLoaderRoute: typeof DsNavbarRouteImport + parentRoute: typeof DsRoute + } '/ds/inputs': { id: '/ds/inputs' path: '/inputs' @@ -3618,6 +3637,7 @@ interface DsRouteChildren { DsIconMigrationRoute: typeof DsIconMigrationRoute DsIconographyRoute: typeof DsIconographyRoute DsInputsRoute: typeof DsInputsRoute + DsNavbarRoute: typeof DsNavbarRoute DsPaletteRoute: typeof DsPaletteRoute DsSemanticRoute: typeof DsSemanticRoute DsShadowsRoute: typeof DsShadowsRoute @@ -3639,6 +3659,7 @@ const DsRouteChildren: DsRouteChildren = { DsIconMigrationRoute: DsIconMigrationRoute, DsIconographyRoute: DsIconographyRoute, DsInputsRoute: DsInputsRoute, + DsNavbarRoute: DsNavbarRoute, DsPaletteRoute: DsPaletteRoute, DsSemanticRoute: DsSemanticRoute, DsShadowsRoute: DsShadowsRoute, diff --git a/src/routes/ads.tsx b/src/routes/ads.tsx index e66836bc1..ae5a4fc61 100644 --- a/src/routes/ads.tsx +++ b/src/routes/ads.tsx @@ -8,7 +8,7 @@ import { useToast } from '~/components/ToastProvider' import { useEffect, useState } from 'react' import { setInterestedInHidingAds } from '~/utils/users.functions' import { GithubIcon } from '~/components/icons/GithubIcon' -import { CheckCircleIcon } from '~/components/icons/CheckCircleIcon' +import { CheckCircle } from '@phosphor-icons/react' import { GoogleIcon } from '~/components/icons/GoogleIcon' export const Route = createFileRoute('/ads')({ @@ -258,7 +258,7 @@ function OptInButton() { return (
- +

You're on the waitlist! diff --git a/src/routes/ds.index.tsx b/src/routes/ds.index.tsx index 5bc99fda2..1acf93a3f 100644 --- a/src/routes/ds.index.tsx +++ b/src/routes/ds.index.tsx @@ -15,6 +15,7 @@ import { Square, Tag, TextT, + Browser, } from '@phosphor-icons/react' import type { Icon } from '@phosphor-icons/react' import { seo } from '~/utils/seo' @@ -38,6 +39,7 @@ const SECTION_ICONS: Record = { '/ds/collapsible': CaretUpDown, '/ds/breadcrumbs': MapPinLine, '/ds/cards': Stack, + '/ds/navbar': Browser, } export const Route = createFileRoute('/ds/')({ diff --git a/src/routes/ds.navbar.tsx b/src/routes/ds.navbar.tsx new file mode 100644 index 000000000..60879a4e4 --- /dev/null +++ b/src/routes/ds.navbar.tsx @@ -0,0 +1,371 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' +import { + Moon, + ShoppingCart, + MagnifyingGlass, + List, + Sparkle, + Lifebuoy, + Users, + Path, +} from '@phosphor-icons/react' +import { seo } from '~/utils/seo' +import { DsPage, DsSection } from '~/components/ds/DsKit' +import { GithubIcon } from '~/components/icons/GithubIcon' +import { DiscordIcon } from '~/components/icons/DiscordIcon' +import { MegaMenuItem } from '~/components/MegaMenuItem' + +export const Route = createFileRoute('/ds/navbar')({ + component: NavbarPage, + head: () => ({ + meta: seo({ + title: 'Navbar | TanStack Design System', + description: + 'The global site navigation bar — anatomy, spacing tokens, and responsive behavior. Source: src/components/Navbar.tsx.', + }), + }), +}) + +const PRIMARY_NAV = [ + 'Libraries', + 'Learn', + 'Community', + 'Tools', + 'Merch', + 'Support', +] + +/** + * A static, non-fixed replica of the real site navbar for documentation. + * + * The live `Navbar` (src/components/Navbar.tsx) is a `fixed` layout organism + * that wraps the whole page and depends on router/auth/cart context, so it + * can't be rendered inline. This mirror uses the same production classes and + * the shared `--navbar-height` token so the anatomy stays true to the source. + * + * Responsiveness is driven by CONTAINER queries (`@min-[…]`) rather than the + * viewport, so it reflects the width of its `@container` wrapper — letting the + * preview show mobile / tablet / desktop states at any screen size. The + * breakpoints mirror the real navbar: primary nav appears at 900px, social + * links at 1120px. + */ +function NavbarAnatomy() { + return ( +
+ {/* Brand — the real landscape logo, theme-swapped like the live navbar */} +
+ TanStack + +
+ + {/* Primary navigation — desktop only (≥ 900px) */} + + + {/* Utility cluster */} +
+ {/* Social links — wide only (≥ 1120px) */} + + + + + + + + + AI + + {/* Log In — desktop only (≥ 900px) */} + + Log In + + {/* Hamburger — mobile only (< 900px) */} + +
+
+ ) +} + +const PREVIEW_SIZES = [ + { key: 'auto', label: 'Auto', width: null }, + { key: 'mobile', label: 'Mobile', width: 390 }, + { key: 'ipad', label: 'iPad', width: 1024 }, + { key: 'desktop', label: 'Desktop', width: 1440 }, +] as const + +type PreviewSizeKey = (typeof PREVIEW_SIZES)[number]['key'] + +/** + * The Anatomy preview surface with a device-size toggle. "Auto" fills the + * available width, so the replica responds to the real screen as it resizes; + * Mobile / iPad / Desktop pin the container to a fixed width (scrolling if it + * overflows the frame). All sizing flows through the `@container` wrapper. + */ +function NavbarAnatomyPreview() { + const [size, setSize] = React.useState('auto') + const [available, setAvailable] = React.useState(0) + const trackRef = React.useRef(null) + const active = PREVIEW_SIZES.find((option) => option.key === size)! + const deviceWidth = active.width + + // Measure the frame's inner width so wider device sizes can scale to fit. + React.useEffect(() => { + const el = trackRef.current + if (!el) return + const update = () => setAvailable(el.clientWidth) + update() + const observer = new ResizeObserver(update) + observer.observe(el) + return () => observer.disconnect() + }, []) + + const scale = + deviceWidth && available > 0 && deviceWidth > available + ? available / deviceWidth + : 1 + + return ( +
+
+
+ {PREVIEW_SIZES.map((option) => { + const isActive = size === option.key + return ( + + ) + })} +
+ + {deviceWidth + ? `${deviceWidth}px${scale < 1 ? ` · ${Math.round(scale * 100)}%` : ''}` + : 'Responsive · tracks screen'} + +
+ +
+
+ {deviceWidth ? ( +
+
+ +
+
+ ) : ( +
+ +
+ )} +
+
+
+ ) +} + +function RegionCard({ + index, + title, + children, +}: { + index: number + title: string + children: React.ReactNode +}) { + return ( +
+
+ + {index} + + + {title} + +
+

{children}

+
+ ) +} + +function SpecRow({ label, value }: { label: string; value: React.ReactNode }) { + return ( +
+ {label} + + {value} + +
+ ) +} + +function NavbarPage() { + return ( + + + + + + +
+
+ + + +
+
+
+ + +
+ + Logo mark and wordmark, linking home. Right-clicking opens the brand + context menu (logo assets, Brand Guide). + + + Libraries, Learn, Community, Tools, Merch, and Support — each a + hover/focus mega-menu. Collapses into the mobile menu below 900px. + + + Social links, theme toggle, cart, search, the AI dock, and auth + controls — plus the hamburger trigger on mobile. + +
+
+ + +
+ + + + + + + + + +
+
+ + +
+ + Full primary navigation with mega-menu dropdowns; the hamburger is + hidden. + + + Social links join the utility cluster and region gaps widen for + extra breathing room. + + + Primary nav collapses to a hamburger that opens a full-width + collapsible menu below the bar. + +
+
+ + +
+ + src/components/Navbar.tsx + +

+ Mounted once in __root.tsx as{' '} + + {'{children}'} + + . Menu contents are defined in the{' '} + NAV_GROUPS config at the top + of the file. +

+
+
+
+ ) +} diff --git a/src/routes/ds.spinner.tsx b/src/routes/ds.spinner.tsx index 3e78e2747..63988e118 100644 --- a/src/routes/ds.spinner.tsx +++ b/src/routes/ds.spinner.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/react-router' import { seo } from '~/utils/seo' -import { PalmSpinner, Spinner } from '~/components/ds/ui' +import { Spinner } from '~/components/ds/ui' import { ComponentPreview, DsPage, DsSection } from '~/components/ds/DsKit' export const Route = createFileRoute('/ds/spinner')({ @@ -32,21 +32,6 @@ function SpinnerPage() { - - - - -`} - > - - - - - ) } diff --git a/src/routes/ds.typography.tsx b/src/routes/ds.typography.tsx index 386f2bd4f..ad40c5cec 100644 --- a/src/routes/ds.typography.tsx +++ b/src/routes/ds.typography.tsx @@ -121,12 +121,47 @@ const GROUPS: Array = [ }, ] +const SEMANTIC_HEADINGS: Array<{ cls: string; alias: string }> = [ + { cls: 'h1', alias: '= text-ds-heading-1' }, + { cls: 'h2', alias: '= text-ds-heading-2' }, + { cls: 'h3', alias: '= text-ds-heading-3' }, + { cls: 'h4', alias: '= text-ds-heading-4' }, + { cls: 'h5', alias: '= text-ds-heading-5' }, + { cls: 'h6', alias: '= text-ds-heading-6' }, +] + function TypographyPage() { return ( + +
+ + + +
+
+ {GROUPS.map((group) => (
@@ -155,28 +190,28 @@ function TypographyPage() { ))} -
- - - +
+ {SEMANTIC_HEADINGS.map((h) => ( +
+ + Type-safe by default + + + + .{h.cls} + + + {h.alias} + + +
+ ))}
@@ -195,10 +230,14 @@ function FamilyCard({ note: string }) { return ( -
-
{name}
-
{token}
-
+
+
+ {name} +
+
+ {token} +
+
{note}
diff --git a/src/routes/index.tsx b/src/routes/index.tsx index d83a0b851..93ba26dab 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -2,10 +2,8 @@ import * as React from 'react' import { ClientOnly, Link, createFileRoute } from '@tanstack/react-router' import discordImage from '~/images/discord-logo-white.svg' -import { librariesByGroup, librariesGroupNamesMap, Library } from '~/libraries' import { BrandContextMenu } from '~/components/BrandContextMenu' import { OptimizedImage } from '~/components/OptimizedImage' -import { groupToSlug } from '~/components/stack/stack-categories' import { twMerge } from 'tailwind-merge' import { @@ -161,41 +159,6 @@ function Index() {
-
-

- - Browse the stack - -

-

- Every TanStack library, organized by what it does. -

- -
- {Object.entries(librariesByGroup).map( - ([groupName, groupLibraries]) => ( - - ), - )} -
-
- -
- -
- @@ -533,8 +496,9 @@ function cubicAngle( function WhyTanStackSection() { return (
-
-
+
+ {/* Lead-in header */} +
Product principles @@ -542,14 +506,10 @@ function WhyTanStackSection() {

Why TanStack?

-

+

Our libraries are built around real products and the developers shipping them

- -
    + {/* Four distinct principle sections */} +
      {whyTanStackPrinciples.map((principle, index) => (
    1. -
    2. ))}
    @@ -658,7 +623,7 @@ function FrameworkAdapterGraph({ return (