diff --git a/.gitignore b/.gitignore index 3dd503d..365cf6c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ # testing /coverage +/playwright-report +/test-results # next.js /.next/ diff --git a/.storybook/main.ts b/.storybook/main.ts index 9eed90c..bc9da6b 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,4 +1,9 @@ import type { StorybookConfig } from '@storybook/nextjs-vite'; +import prismComponents from 'prismjs/components.js'; + +const prismLanguages = Object.keys(prismComponents.languages) + .filter(language => language !== 'meta') + .map(language => `prismjs/components/prism-${language}.min.js`); const config: StorybookConfig = { "stories": [ @@ -15,6 +20,17 @@ const config: StorybookConfig = { "framework": "@storybook/nextjs-vite", "staticDirs": [ "../public" - ] + ], + viteFinal: async config => ({ + ...config, + optimizeDeps: { + ...config.optimizeDeps, + include: [ + ...(config.optimizeDeps?.include ?? []), + "prismjs", + ...prismLanguages, + ], + }, + }), }; -export default config; \ No newline at end of file +export default config; diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 6047e89..2908e61 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -1,7 +1,7 @@ import type { Preview } from '@storybook/nextjs-vite' import '@fontsource/rubik/400.css' import '@fontsource/rubik/500.css' -import '@fontsource/roboto-mono/400.css' +import '../src/components/ui/roboto-mono.css' import '../src/app/globals.css' const preview: Preview = { diff --git a/AGENTS.md b/AGENTS.md index 8bd0e39..643577d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,9 @@ + # This is NOT the Next.js you know -This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices. + +This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean. + diff --git a/README.md b/README.md index 125d404..89fc697 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,104 @@ -# scrapscn +# Scrapscn -Sentry's design system as a [shadcn](https://ui.shadcn.com) registry. +Scrapscn is a local playground for Sentry product interface prototypes. It ports regular Scraps components from the Sentry monolith to React and Tailwind. It also provides shadcn registry items as a release format. -One command to theme any shadcn project with Sentry's purple-tinted neutrals, Blurple accent, and Rubik typography — both light and dark modes. +The canonical source is `static/app/components/core` in `getsentry/sentry`. The current parity baseline is Sentry commit `d91f823d232ddd12a4d2a64554d85fd36df0e278`. -```bash -npx shadcn add https://scrapscn.sentry.dev/r/sentry-base -``` +## Parity inventory + +[`scraps-parity.json`](scraps-parity.json) is the machine-readable inventory for all 48 regular Scraps modules. It records the pinned canonical source files and public exports, mapped local files, registry items, stories, tests, Figma nodes, playground routes, and completion state. + +Run `pnpm parity:validate` to check the inventory. The command fails when: -## What's included +- A regular Scraps module or public export differs from the pinned contract. +- A claimed local file, registry item, or Figma node is invalid. +- The recorded local exports no longer match the implementation. +- A local UI component is neither mapped to a regular Scraps module nor marked as out of scope. +- A module is marked complete without its required machine-checkable artifacts and exports. -- **26+ semantic CSS variables** mapped from Sentry's product design tokens (oklch) -- **Custom tokens** beyond shadcn defaults: `--warning`, `--success`, `--promotion` -- **Chonky buttons**: Sentry's signature raised embossed depth effect with snap easing -- **Debossed inputs**: Pressed-in feel with inset shadows, matching the product UI -- **Semantic Badge & Alert variants**: `info`, `success`, `warning`, `danger`, `promotion`, `muted` — plus feature badges (`alpha`, `beta`, `new`) -- **Chonky Switch**: Debossed track, embossed thumb, crossfading check/close icons -- **Typography**: Dammit Sans (headlines), Rubik (body), Roboto Mono (code) -- **Both modes**: Light and dark are first-class citizens — purple-tinted neutrals, never pure black -- **WCAG AA compliant**: All text/surface pairs pass 4.5:1 contrast +Run `pnpm parity:generate` only when you intentionally refresh the inventory from a local `getsentry/sentry` checkout at the pinned commit. Set `SENTRY_REPO_PATH` if that checkout is not at `../sentry`. -## Development +## Start a prototype + +You need Node.js 24 or later and pnpm. ```bash pnpm install pnpm dev ``` -## Deploy +Open the URL printed by Next.js. The homepage is the playground. It needs no Sentry monolith, account, database, environment variable, or external service. + +The preview fills the viewport. Open the floating setup island at the bottom of the page to change Checkbox props, reorder form rows, switch theme or preview width, and reset the page. The island closes when you press Escape, move focus into the preview, or click outside it. Select **Checkbox settings** to open the direct template route. Select **Share** to copy an absolute URL that restores the current review state. + +## Create a template + +```bash +pnpm template:create issue-review "Issue review" +``` + +The command creates: + +```text +src/templates/issue-review/ + template.json + template.tsx +``` + +Edit `template.tsx`. Do not edit a central template registry. Scrapscn generates the template manifest before `pnpm dev` and `pnpm build:next`. The new template appears at `/templates/issue-review` and in playground navigation. + +Each template uses local mock data. Put state that reviewers must share in URL parameters. + +## Share with Vercel Preview + +Push the prototype branch. Open both the Vercel branch URL and the commit URL. The branch URL follows new commits. The commit URL keeps the reviewed version fixed. If deployment protection is active, create a Vercel Shareable Link for an external reviewer. + +Verify the direct template route, a hard refresh, the Share URL, and toolbar comments before review. Do not use production data or secrets in a template. + +## Figma Dev Mode + +The Checkbox Code Connect file is `src/components/ui/checkbox.figma.ts`. It connects Scrapscn to the canonical Checkbox node `3481:4211` in the Sentry Components Figma library. The connection label is `Scrapscn React`, so it does not replace the monolith connection. + +Run the local syntax check without credentials: + +```bash +pnpm figma:parse +``` + +To inspect all remote property combinations, provide a Figma access token in your shell and run: + +```bash +FIGMA_ACCESS_TOKEN=... pnpm figma:preview +``` + +Never commit the token. Before publication, confirm in Dev Mode that size, checked state, and disabled state produce the expected `@/components/ui/checkbox` import and JSX. -Auto-deploys to [scrapscn.sentry.dev](https://scrapscn.sentry.dev) via Vercel on push to `main`. +For local code to canvas, run the template and use Figma MCP `generate_figma_design`. Its one-time URL includes a `figmacapture` hash that enables the development-only capture script for that visit. Test a Vercel Preview through the separate external-URL capture workflow. Production pages and runtime JavaScript do not load or contain the local capture bootstrap; source maps can retain development source text. The result must contain editable layers. For the return trip, change a connected Checkbox property and its label in the Figma test frame, read that frame through Figma MCP, and update the existing `Checkbox` usage. Do not replace it with raw markup. -## Brand reference +The approved Sentry page-frame Figma node is not yet recorded. The local page frame is a source-grounded structural prototype. Do not call it pixel-approved until Design provides a node URL and accepts the comparison. -This repo consumes Sentry's brand tokens — it doesn't define them. The canonical sources are: +## Checks -- **Product tokens**: [`getsentry/sentry`](https://github.com/getsentry/sentry) → `static/app/utils/theme/scraps/` -- **Brand guidelines**: [live.standards.site/sentry](https://live.standards.site/sentry) +```bash +pnpm test +pnpm lint +pnpm build:next +pnpm build-storybook +pnpm test:playground +pnpm test:templates +pnpm test:figma-capture +pnpm figma:parse +pnpm figma:preview +``` + +`test:playground` starts the production app through `portless`, completes the real browser workflow, and restores the copied URL in a second browser context. `test:templates` validates metadata, discovery, scaffold behavior, imports, and production routes. + +The full end state and exact completion gates are in [docs/scraps-parity-goal.md](docs/scraps-parity-goal.md). The first Checkbox slice does not mean all 48 regular Scraps modules are complete. + +## Registry release format + +Registry installation is not the first parity test. After a module passes the local playground and Figma gates, it can be published as a shadcn item. Existing registry consumers can install the base theme with: + +```bash +npx shadcn add https://scrapscn.sentry.dev/r/sentry-base +``` diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md new file mode 100644 index 0000000..64a89e6 --- /dev/null +++ b/THIRD_PARTY_NOTICES.md @@ -0,0 +1,24 @@ +# Third-party notices + +## Sentry source code + +Copyright 2008-2024 Functional Software, Inc. dba Sentry + +Scrapscn contains copies, modifications, or derivatives of source code from +the `getsentry/sentry` repository. This material is subject to this license: + +Functional Source License, Version 1.1, Apache 2.0 Future License + +The applicable Terms and Conditions are available in the Sentry repository at +the pinned source revision: + +https://github.com/getsentry/sentry/blob/d91f823d232ddd12a4d2a64554d85fd36df0e278/LICENSE.md + +The `code` registry item includes derivative material from these Sentry source +files, among others: + +- `static/app/components/core/code/codeBlock.tsx` +- `static/app/components/core/code/index.tsx` +- `static/app/components/core/code/inlineCode.tsx` +- `static/app/icons/iconCopy.tsx` +- `static/app/utils/prism.tsx` diff --git a/docs/checkbox-slice-evidence.md b/docs/checkbox-slice-evidence.md new file mode 100644 index 0000000..cdf4bb7 --- /dev/null +++ b/docs/checkbox-slice-evidence.md @@ -0,0 +1,67 @@ +# Checkbox vertical slice evidence + +Date: 2026-08-21 + +Status: credential-free local checks and local Figma code-to-canvas pass; authenticated Code Connect preview and publication, Vercel capture, round-trip, page-frame approval, and reviewer gates remain open. + +## Canonical source + +- Sentry commit: `d91f823d232ddd12a4d2a64554d85fd36df0e278` +- Component: `static/app/components/core/checkbox/checkbox.tsx` +- Behavior tests: `static/app/components/core/checkbox/checkbox.spec.tsx` +- Visual cases: `static/app/components/core/checkbox/checkbox.snapshots.tsx` +- Code Connect migration input: `static/app/components/core/checkbox/checkbox.figma.tsx` +- Figma component: `https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B/%F0%9F%90%A6-Components?node-id=3481-4211` + +## Local proof + +- `pnpm test`: 17 story files and 84 tests pass. +- `pnpm lint`: passes. +- `pnpm build:next`: passes with Next.js 16.3.2. +- `pnpm build-storybook`: passes. +- `pnpm test:playground`: 2 production-browser workflows pass. They change Checkbox controls, reorder the stack, use the keyboard, open the template, submit the form, change theme and viewport, copy and restore the Share URL, and verify the physical mobile header and navigation workflow at 390 × 844 px. +- `pnpm test:templates`: 4 scaffold and metadata tests and 1 production-browser route test pass. The generated manifest is valid, the build prerenders `/templates/checkbox-settings`, and a hard refresh restores item order, disabled state, size, label, theme, viewport, and selected values. +- `pnpm figma:parse`: passes with label `Scrapscn React`. +- The Code Connect template uses the exact published Figma values for `size`, `checked`, and `state`. It maps the `Hover`, `Active`, and `Focused` design states to runtime interaction behavior instead of public props. +- Package registry check: Next.js 16.3.2, React 19.2.8, and React DOM 19.2.8 are the current latest versions on 2026-08-21. +- Local browser QA at 1440 × 1000 px and 390 × 844 px found no horizontal overflow, console errors, or broken state restoration after the responsive header fix. The mobile navigation opens, closes with Escape, and returns focus to its trigger. +- The existing development process measured 53.7 ms TTFB, 96 ms LCP and FCP, 0 CLS, 36.9 ms React hydration, and a 378 ms Fast Refresh. Cold development startup was not measured because this Codex process does not have access to the required cmux workspace. + +The Checkbox browser assertions cover exact sizes, radii, light and dark border colors, canonical SVG paths, size-specific stroke widths, focus-ring geometry, disabled and read-only behavior, `aria-disabled`, and inherited interaction color. These source-level and computed-style checks do not replace an approved side-by-side image baseline. + +## Preview proof + +- Git branch: `codex/checkbox-playground-slice` +- Git commit: `5b75cb8d059641c687b9bcc5e449323f340c0a63` +- Vercel branch URL: `https://scrapscn-git-codex-checkbox-playground-slice.sentry.dev` +- Immutable deployment URL for that commit: `https://scrapscn-3j7c2urk2.sentry.dev` +- Deployment ID: `dpl_9UbEtffSCkeo8yEsU2uxtTM8uwWR` +- Vercel build: passes with Next.js 16.3.2 and prerenders the template route. +- Protected route check: authenticated requests to the branch and immutable deployment template URLs return HTTP 200 with the complete review-state query. + +Vercel Authentication protects these URLs. An intended reviewer must still open the branch URL, create or use a Shareable Link when needed, and confirm toolbar comments. + +## Figma smoke-test proof + +- Test file: `https://www.figma.com/design/fbuI9XgwsUA8xEum8WBGw8` +- Editable code-to-canvas capture: `https://www.figma.com/design/fbuI9XgwsUA8xEum8WBGw8?node-id=3-2` +- Semantic settings frame: `https://www.figma.com/design/fbuI9XgwsUA8xEum8WBGw8?node-id=5-171` +- Connected checked Checkbox instance: `https://www.figma.com/design/fbuI9XgwsUA8xEum8WBGw8?node-id=5-178` +- Code-to-canvas captured the direct local template as a 2000 × 1209 editable frame on 2026-08-21. This proves the local capture path, not the separate Vercel Preview capture gate. +- The semantic frame uses three published Sentry Checkbox instances: checked, indeterminate, and disabled unchecked. Their component properties use the canonical `size`, `checked`, and `state` vocabularies. +- Figma MCP design context recognizes the checked instance through the existing monolith connection and returns `` from `@sentry/scraps/checkbox`. + +That last result is a deliberate failing assertion for the Scrapscn gate. The local `Scrapscn React` connection has not been published, so Dev Mode cannot return `@/components/ui/checkbox` yet. Publishing through the generic MCP mapping API is unsafe because it only accepts the shared `React` label and could conflict with the monolith connection. The safe path is the Code Connect CLI with the configured `Scrapscn React` label. + +## Open manual gates + +1. Record the approved Sentry page-frame Figma node URL. The local shell is not pixel-approved without it. +2. Provide `FIGMA_ACCESS_TOKEN` with Code Connect write and file-content read access. `pnpm figma:preview` must return the exact 45-combination Figma schema, validate every generated snippet, and report all 18 enabled or disabled public Checkbox combinations against the local import. +3. Publish the `Scrapscn React` connection with the Code Connect CLI, then inspect it in Dev Mode for every Checkbox combination. +4. Capture the running Vercel Preview template into the recorded test file and compare it with the local capture. +5. Repeat design-to-code after publication and confirm that it returns the local Checkbox import. Then change a mapped property and the surrounding copy in the recorded semantic frame and complete the return trip to the local template. +6. Approve a side-by-side Checkbox image baseline against the monolith or approved Figma component. +7. Confirm reviewer access and comments on the recorded Vercel branch and immutable deployment URLs. +8. Measure cold `pnpm dev` startup and the five-minute and ten-minute usability criteria with a new user. The local hot-reload measurement is recorded above. + +The slice and the 48-module goal remain incomplete until these gates pass. diff --git a/docs/scraps-parity-goal.md b/docs/scraps-parity-goal.md new file mode 100644 index 0000000..25e68e0 --- /dev/null +++ b/docs/scraps-parity-goal.md @@ -0,0 +1,308 @@ +# Scraps parity and designer prototyping goal + +Status: proposed + +Baseline date: 2026-08-21 + +## Goal + +Make Scrapcn the fastest supported place to prototype Sentry product interfaces outside the monolith. + +A designer or engineer can clone Scrapcn, start the local app, open a Sentry page frame, compose a realistic page with regular Scraps components, and move the result between code and Figma Dev Mode without replacing mapped components with approximations. + +## Scope + +The canonical regular Scraps library is `static/app/components/core` in the Sentry monolith, pinned to commit `d91f823d232ddd12a4d2a64554d85fd36df0e278`. It contains 48 component modules after the documentation-only `overview`, `patterns`, and `principles` directories are excluded. + +Marketing components and Scrapcy variants do not count toward this goal. Extra shadcn components can remain, but they do not count toward regular Scraps parity. + +The goal includes: + +- Public component and prop compatibility with regular Scraps. +- Tailwind implementations that match the approved Figma components. +- An installable shadcn registry item for every completed module. +- A reusable Sentry page frame and a local composition playground at `/`. +- A file-based template workflow with direct URLs and Vercel Preview sharing. +- Storybook documentation, behavior tests, visual tests, and accessibility checks. +- Figma Dev Mode component mappings and tested workflows in both directions. + +The goal does not require: + +- Marketing-site components. +- Monolith business logic, routing, data fetching, permissions, or feature flags. +- A lossless conversion between browser DOM and Figma component instances. Code-to-canvas must produce editable design layers and visual fidelity. Code Connect provides component identity for Figma-to-code work. + +## Baseline + +At the original baseline, Scrapcn had: + +- 28 local UI implementation files. +- 17 of the 48 regular Scraps modules represented in some form. +- 31 regular modules with no corresponding implementation. +- 10 installable UI items in `registry.json`. +- 15 Storybook story files and 76 passing tests. +- No reusable page frame, composition playground, or Chat component. +- A marketing landing page at `/` that does not serve the local prototyping workflow and does not match the intended product frame. +- A passing Next production build. +- Next.js `16.3.2`, the stable `latest` release when this baseline was updated, with matching `eslint-config-next`; React and React DOM are `19.2.8`. +- A failing lint command because generated Storybook output is included, plus two source errors and one source warning. +- Ten existing legacy Code Connect mappings in the monolith: Alert, FeatureBadge, Tag, Button, Checkbox, Radio, Slider, Switch, TextArea, and Tooltip. They point to published components in the Sentry “🐦 Components” Figma library and provide initial node URLs and property mappings, but they import the CSS-in-JS implementations and use the legacy React parser format. +- No generated `public/r/*.json` registry artifacts and no registry build command. +- A hosted registry URL that redirects unauthenticated requests to Vercel SSO. The shadcn CLI cannot use this as a public registry transport. + +The current local checkpoint adds the playground, reusable page frame, Checkbox vertical slice, template workflow, and a machine-readable parity inventory. `pnpm parity:validate` reports 0 complete, 17 partial, and 31 missing modules. A partial module has mapped local code but has not passed every exact contract, behavior, visual, registry, and Figma gate. + +An existing file or a similar name is not proof of parity. Current examples include Button, Alert, Slider, TextArea, Badge, Avatar, Input, Link, Select, Tabs, and Tooltip APIs that differ from their canonical Scraps APIs. + +## Definitions + +### Complete component + +A component module is complete only when all of these statements are true: + +1. Every supported public runtime export from the canonical module exists. +2. Public prop names, values, defaults, controlled behavior, and event meaning are compatible. +3. A representative monolith usage compiles after only its import path changes. +4. Every documented visual variant and interaction state has a Storybook example. +5. Ported behavior tests, visual tests, and accessibility checks pass. +6. The module works in the local playground without a monolith dependency or private compatibility shim. +7. Its approved Figma components have Code Connect templates, or the parity manifest records why the module has no Figma component. + +Internal implementation details can differ. Tailwind and Base UI can replace Emotion and React Aria when the public contract, behavior, accessibility, and appearance remain compatible. + +### Figma interoperability + +Figma interoperability contains three distinct workflows: + +- **Design to code:** Figma Dev Mode and the Figma MCP server return Scrapcn component names, imports, and mapped props for connected instances. +- **Code to canvas:** Figma's `generate_figma_design` workflow captures the running prototype as editable Figma design layers. +- **Design iteration back to code:** An agent reads an updated Figma frame and changes the prototype while preserving connected Scrapcn components. + +Code Connect template files are the maintained integration format. New mappings use `.figma.ts` templates instead of the legacy framework parser format. + +The ten monolith mappings are migration inputs, not files to copy unchanged. Scrapcn reuses each verified Figma node URL and property vocabulary, replaces the source import and generated JSX with the compatible Scrapcn interface, uses a distinct Scrapcn connection label, and validates the result before publication. A mapping remains incomplete when the old file has missing property coverage, such as the current Slider mapping with an empty `props` object. + +### Template + +A template is a source-controlled page composition for design review. It has a unique slug, title, description, tags, co-located metadata, and one React implementation. The playground discovers templates without a second manual registration edit and serves each one at `/templates/`. + +Template controls that affect review, including theme, viewport, and documented component state, are serializable in the URL. Opening or refreshing a shared URL restores the same review state. Templates use local mock data and need no database, authentication, environment variable, or monolith service. + +## Required artifacts + +The completed repository contains: + +1. A machine-readable parity manifest for all 48 regular modules. Each entry records canonical source paths and commit, public exports, registry item, stories, tests, Figma nodes, and completion state. +2. Tailwind implementations for all in-scope public exports. +3. One registry item per regular module, plus dependency metadata. +4. A local playground at `/` that replaces the marketing landing page. +5. A reusable `PageFrame` with a sidebar, top bar, page header, breadcrumbs, action area, and composable content region. +6. A component catalog, theme and viewport controls, component controls, and realistic multi-component templates inside the playground. +7. A template scaffold command, automatic template discovery, direct template routes, URL-persisted review state, and a Share action. +8. Component stories and at least one page-frame composition story. +9. Code Connect `.figma.ts` templates and a current `figma.config.json`. +10. Automated playground, template, type, behavior, visual, accessibility, and build checks. +11. A short designer quick-start guide for local prototypes, template creation and sharing, Figma-to-code, and code-to-canvas. + +## End-state acceptance criteria + +The goal passes only when every gate below passes. A checklist or file count alone is not sufficient evidence. + +### Gate 1: inventory and scope + +- The parity manifest contains exactly the 48 regular Scraps modules. +- Every module is `complete`. An owner-approved scope exclusion changes the target and must update this goal before completion. +- Marketing variants and extra shadcn components are labeled separately and do not increase the parity score. +- A test fails when a canonical public export is missing from the manifest or implementation. + +### Gate 2: component contract parity + +- Every non-excluded canonical runtime export is available from the corresponding Scrapcn module. +- Contract fixtures cover prop names, variant values, sizes, defaults, controlled and uncontrolled behavior, callback meaning, refs, and compound-component structure where applicable. +- At least one representative canonical usage per module compiles after only the import path changes. +- A module with a public contract or behavior difference remains incomplete until the difference is removed or this goal is explicitly revised. + +### Gate 3: behavior and visual parity + +- Canonical tests that describe portable component behavior are ported or replaced by equivalent tests. +- Every documented variant, size, disabled state, loading state, error state, focus state, and open state appears in Storybook when it applies. +- Approved light-mode and dark-mode visual baselines have no unreviewed changes. +- Responsive components have approved baselines at their supported narrow and wide widths. +- Animation tests respect reduced motion when the component uses motion. + +### Gate 4: accessibility + +- Storybook accessibility tests report no serious or critical violations. +- Interactive components have keyboard tests for entry, activation, navigation, dismissal, and focus return where those behaviors apply. +- Form components have accessible names, descriptions, errors, disabled states, and form submission behavior. +- Overlay components manage focus, escape, outside interaction, scroll locking, and focus restoration. + +### Gate 5: local playground + +- `/` opens the playground instead of a marketing page. +- The playground has component and template navigation, a canvas, theme controls, desktop and mobile viewport controls, and reset behavior. +- Selecting a component exposes its supported public controls and renders changes immediately. +- Templates render several components together in the same page frame so spacing, overflow, focus, and overlay behavior can be evaluated in context. +- The playground imports the same public component modules that later registry items publish. It has no playground-only component copies. +- An end-to-end browser test starts at `/`, opens a component, changes its controls, opens a page template, changes theme and viewport, copies its Share URL, and completes one keyboard interaction. +- After dependencies are installed, `pnpm dev` is the only command required to open the playground. No local environment configuration or external service is required. +- On the reference development machine, the interactive homepage is available within 15 seconds of starting `pnpm dev`, and a saved template edit appears within two seconds through hot reload. +- In a timed usability check, a new user can start the playground within five minutes of receiving the repository and can create or modify a template within ten minutes without help from a monolith engineer. + +### Gate 6: templates and Vercel Previews + +- One documented scaffold command creates a valid new template and its co-located metadata. The author edits one React implementation file to build the composition. +- A new valid template appears automatically in playground navigation and at `/templates/` without editing a central registry. +- Every template route supports direct navigation and hard refresh in local, Preview, and Production environments. +- The Share action copies the absolute current template URL, including supported review-state parameters. +- Opening the copied URL in a second browser restores the same template, theme, viewport, and documented component state. +- A Git branch or pull request produces a Vercel Preview Deployment. Its branch URL follows the latest branch commit, while its commit URL preserves the reviewed version. +- Intended internal reviewers can open the Preview URL through configured team access. External review uses a Vercel Shareable Link when deployment protection is enabled. +- The Preview requires no production data, secrets, database, or monolith service. +- The Vercel build discovers every template and fails on duplicate slugs, invalid metadata, broken imports, or a template route that cannot render. +- Reviewers can use the Vercel Preview URL and toolbar comments without running Scrapcn locally. + +### Gate 7: page-frame prototyping + +- A designer can reach a working page-frame template from the local playground without opening the Sentry monolith. +- The page frame supports desktop and narrow layouts, light and dark modes, breadcrumbs, title, actions, navigation, and arbitrary page content. +- The page frame contains no monolith data, routing, permissions, or feature-flag dependency. +- A composition story demonstrates at least a form page, a table or list page, an empty state, and an overlay interaction. +- The page-frame templates use the public local component modules and remain valid inputs for later registry packaging. + +### Gate 8: Figma Dev Mode and MCP + +- Every complete visual component is connected to its approved published Figma component through a `.figma.ts` Code Connect template. +- `figma connect parse --exit-on-unreadable-files` passes in CI. +- Code Connect templates map every supported Figma property to the correct code prop or explicitly document why a property is design-only. +- Dev Mode shows the correct Scrapcn import and JSX for representative variants of every connected component. +- A Figma MCP design-to-code smoke test on a frame with connected instances uses Scrapcn imports and does not recreate those components with raw elements. +- Every semantic CSS token used by a complete visual component maps to a published Figma variable or is recorded as code-only with a reason. +- Figma variables used by the smoke frame have a tested mapping to Scrapcn semantic CSS tokens. +- A code-to-canvas smoke test captures the running page-frame prototype into a new or existing Figma file as editable layers. +- After a reviewer changes a mapped component property and copy in Figma, the design-to-code workflow updates the prototype with the correct Scrapcn prop and text while all automated checks remain green. +- Figma URLs and non-secret evidence from the last successful smoke test are recorded in a repeatable test report. Tokens and credentials are never committed. + +### Gate 9: repository health and documentation + +- Tests, lint, type checks, the production build, Storybook build, playground and template end-to-end checks, and Code Connect parsing pass from a clean checkout. +- `next` and `eslint-config-next` match the stable `latest` release reported by the package registry when the goal starts and again before completion. React, React DOM, and their types satisfy the version recommended by that Next.js release. +- The exact Next.js version is pinned in `package.json`, recorded in the evidence, and used by the Vercel Preview build. +- Generated Storybook output is excluded from source linting. +- The README states the canonical source, supported Next and shadcn versions, designer quick start, page-frame workflow, registry installation, and Figma workflow. +- The parity manifest identifies the exact Sentry source commit used for the comparison. + +Registry generation and hosted installation remain release requirements for the finished library. They are not the validation environment for component parity or the first vertical slice. Complete local playground behavior before registry transport work begins. + +## Smallest vertical slice + +The first slice proves the delivery system. It does not attempt broad component coverage. + +### Slice contents + +1. **Checkbox parity:** Port the canonical `Checkbox` and `CheckboxProps` contract. Cover `xs`, `sm`, and `md`; default `sm`; unchecked, checked, and indeterminate values; controlled changes; disabled and read-only behavior; refs; native form submission; labels; focus; and keyboard behavior. +2. **Playground homepage:** Replace the marketing landing page at `/` with a full-viewport preview canvas. A floating, collapsible setup island provides component and template navigation, light and dark controls, desktop and mobile viewport controls, and reset behavior without wrapping the preview in separate playground chrome. +3. **Checkbox workbench:** Add a Checkbox entry with live controls for size, checked value, disabled state, and label. Add, remove, and reorder several Checkbox examples in a stack to prove the composition model without building a general visual editor. +4. **Minimal page frame:** Add a reusable local `PageFrame` with a sidebar, top bar, breadcrumbs, title, action slot, and content slot. It can use semantic HTML and local Tailwind layout until the full Scraps layout module is ported. +5. **Template workflow:** Add the template scaffold command and automatic discovery. Use it to create a `checkbox-settings` template that renders several labeled Checkboxes in a native form and shows the submitted form state. +6. **Shareable review state:** Serve the template at `/templates/checkbox-settings`. Persist its theme, viewport, and documented Checkbox state in the URL. Add a Share action that copies that exact state. +7. **Local browser proof:** Run the local app and test the real `/` workflow: open Checkbox, change its controls, reorder the stack, open the settings template, submit the form, change theme and viewport, copy the URL, and restore the same state in a second browser context using only the copied URL. +8. **Vercel Preview proof:** Push the slice branch, wait for its Vercel Preview, and repeat the share test with both the branch URL and the commit URL. Confirm that an intended reviewer can open and comment on the template without local setup. +9. **Figma component proof:** Create a Code Connect template for the existing canonical Checkbox Figma component at node `3481:4211` in the Sentry Components library. Map size, checked value, and disabled state to the compatible Checkbox API. +10. **Figma full-design proof:** Use the remote Figma MCP code-to-canvas workflow to capture the running Preview template as editable Figma layers. +11. **Round-trip proof:** Use a Figma test frame that contains an instance of the connected Checkbox. Change its size or checked state and the surrounding label copy in Figma, retrieve the frame through MCP, and update the local template. The resulting code must still import and use Checkbox. + +### Slice prerequisites + +- An approved Sentry page-frame Figma selection URL, including the exact desktop frame node, must be recorded before page-frame visual acceptance. If no canonical frame exists, the slice creates a minimal reference frame and gets design approval before continuing. +- The Sentry Components Figma library must be published and accessible to the tester. +- The tester must have a Figma seat and file permissions that support the selected Code Connect and MCP actions. +- The remote Figma MCP server must be connected to a supported client. Codex is supported for code-to-canvas. + +### Slice automated pass criteria + +The slice passes its automated gate when future repository scripts prove all of the following: + +```text +pnpm test +pnpm lint +pnpm build:next +pnpm build-storybook +pnpm test:playground +pnpm test:templates +pnpm figma:parse +pnpm figma:preview +``` + +The new scripts must be deterministic and documented. `test:playground` must exercise the local `/` workflow in a real browser. `test:templates` must validate metadata, unique slugs, discovery, direct routes, URL-state restoration, and production rendering. Agents run the development server through `portless` as required by `AGENTS.md`. `figma:parse` must run Code Connect parsing with unreadable files treated as failures. `figma:preview` must validate all slice templates before publication. + +The Checkbox visual test matrix covers three sizes by three checked values by enabled and disabled states in both light and dark modes. The playground and page-frame smoke tests cover agreed desktop and mobile widths. + +### Slice manual Figma pass criteria + +The slice also requires a short test report that proves: + +1. Dev Mode shows the expected Checkbox import and JSX for unchecked, checked, indeterminate, and disabled instances across the supported sizes. +2. Figma MCP design context for the test frame identifies the connected Checkbox and its selected props. +3. Generated prototype code uses the local public Checkbox module and passes the automated gate. +4. Code-to-canvas creates an editable Figma frame that matches the running Vercel Preview template at the tested viewport. +5. A changed Checkbox property and surrounding label make the return trip to the source template without replacing Checkbox with raw markup. + +### Why this is the minimum useful slice + +Checkbox is the smallest component that still tests types, native forms, controlled state, indeterminate state, keyboard input, focus, accessibility, visual states, and an existing canonical Figma mapping. The playground proves the actual designer entry point. The page frame and settings template prove local composition. Direct URLs and Vercel Preview prove asynchronous sharing. The two Figma checks test semantic design-to-code and editable code-to-canvas separately. Together they exercise every critical boundary before the remaining 47 modules are ported. + +### Go or no-go experiment + +Run the slice in this order: + +1. Make Checkbox contract, behavior, accessibility, and visual tests pass inside Scrapcn. +2. Replace the marketing homepage with the local playground shell and Checkbox workbench. +3. Add the template scaffold, automatic discovery, reusable page frame, and `checkbox-settings` template. +4. Build and run Scrapcn locally, then exercise component controls, stack ordering, native form state, theme, viewport, URL-state restoration, and keyboard behavior in the browser. +5. Open the copied local Share URL in a second browser context and confirm the same review state. +6. Push the branch and repeat the share test on its Vercel branch and commit Preview URLs with another intended reviewer. +7. Parse and preview the Checkbox Code Connect template, publish it under the Scrapcn label, and inspect its variants in Dev Mode. +8. Ask the Figma MCP server to implement a small settings frame that contains the connected Checkbox. Confirm that the result imports Checkbox instead of recreating it. +9. Capture the running Vercel Preview template back to Figma as editable layers. +10. Change the Checkbox state and surrounding label in the connected Figma test frame, apply that change back to the source template, and rerun every automated check. +11. Give the written quick start to a designer or engineer who did not build the slice. Confirm the five-minute startup and ten-minute template-creation criteria without verbal help. + +Proceed to the 48-module goal only when all 11 steps pass. A failure means the slice remains active until the shared pipeline is fixed. Do not work around a playground, template, Vercel Preview, page-frame, Figma, or documentation failure inside later component ports. + +## Evidence format + +Each completed slice or module records: + +- Canonical Sentry commit and source paths. +- Scrapcn implementation and registry paths. +- Passing command output or CI links. +- Measured local startup and template hot-reload times. +- Storybook story and approved visual baseline. +- Template slug, local route, Vercel branch URL, and Vercel commit URL. +- Share-URL restoration result from a second browser context. +- Figma component and test-frame URLs. +- Code Connect parse result. +- Design-to-code and code-to-canvas smoke-test date. +- Approved exceptions, if any. + +## Recommended first goal handoff + +Use this objective for the first implementation goal: + +> Implement the smallest vertical slice in `docs/scraps-parity-goal.md`. Replace the marketing homepage with the fast local playground, complete Checkbox contract parity, add the file-based template workflow, create the reusable Sentry page frame and `checkbox-settings` template, prove share-state restoration on a Vercel Preview, and add the Checkbox Code Connect template. Treat every automated playground, template, Preview, and manual Figma criterion as a completion gate. Record the required evidence. Keep registry transport and the remaining Scraps modules out of scope. + +Before page-frame visual work starts, attach or record the approved Sentry page-frame node URL. If no canonical frame exists, create and approve the minimal reference as the first design deliverable. If the Figma library, permissions, or remote MCP connection are unavailable, implementation can continue through the automated gates, but the goal remains incomplete until the manual Figma gate passes. + +## External references + +- Figma MCP overview: +- Figma MCP tools: +- Code to canvas: +- Code Connect overview: +- Code Connect template files: +- Code Connect CLI: +- Figma file structure guidance: +- Vercel Preview environments: +- Vercel generated branch and commit URLs: +- Vercel Shareable Links: diff --git a/eslint.config.mjs b/eslint.config.mjs index 162f8fc..ccbad59 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -15,6 +15,8 @@ const eslintConfig = defineConfig([ "out/**", "build/**", "next-env.d.ts", + "public/storybook/**", + "storybook-static/**", ]), ...storybook.configs["flat/recommended"] ]); diff --git a/figma.config.json b/figma.config.json new file mode 100644 index 0000000..1a2e8af --- /dev/null +++ b/figma.config.json @@ -0,0 +1,7 @@ +{ + "codeConnect": { + "label": "Scrapscn React", + "language": "jsx", + "include": ["src/**/*.figma.ts"] + } +} diff --git a/package.json b/package.json index c88ca2a..312f348 100644 --- a/package.json +++ b/package.json @@ -3,47 +3,71 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", - "build": "rm -rf public/storybook storybook-static && storybook build -o storybook-static && mv storybook-static public/storybook && next build", - "build:next": "next build", + "dev": "pnpm templates:generate && next dev", + "build": "pnpm templates:generate && rm -rf public/storybook storybook-static && storybook build -o storybook-static && mv storybook-static public/storybook && next build", + "build:next": "pnpm templates:generate && next build", "start": "next start", "lint": "eslint", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", - "test": "vitest run" + "figma:parse": "node --test tests/figma/*.test.mjs && figma connect parse --exit-on-unreadable-files --skip-update-check", + "figma:preview": "node scripts/figma-preview.mjs", + "parity:generate": "node scripts/generate-parity-manifest.mjs", + "parity:validate": "node scripts/validate-parity-manifest.mjs", + "test:parity": "node --test tests/parity/*.test.mjs", + "template:create": "node scripts/create-template.mjs", + "templates:generate": "node scripts/generate-template-manifest.mjs", + "test:playground": "pnpm build:next && node scripts/run-playwright.mjs tests/e2e/playground.spec.ts", + "test:figma-capture": "pnpm build:next && node scripts/test-production-capture.mjs && node scripts/run-playwright.mjs tests/e2e/figma-capture-production.spec.ts && SCRAPSCN_E2E_MODE=development node scripts/run-playwright.mjs tests/e2e/figma-capture.spec.ts", + "test:production-assets": "pnpm build:next && pnpm build-storybook && node --test tests/production/*.test.mjs", + "test:templates": "node --test tests/templates/*.test.mjs && pnpm templates:generate && node scripts/test-templates.mjs && pnpm build:next && node scripts/run-playwright.mjs tests/e2e/templates.spec.ts", + "test": "pnpm test:parity && vitest run" }, "dependencies": { "@base-ui/react": "^1.5.0", - "@fontsource/roboto-mono": "^5.2.9", + "@emotion/is-prop-valid": "^1.4.0", + "@emotion/react": "11.14.0", + "@emotion/serialize": "1.3.3", + "@fontsource-variable/roboto-mono": "5.2.9", "@fontsource/rubik": "^5.2.8", + "@react-aria/interactions": "3.28.1", + "@react-aria/utils": "3.34.1", + "@sentry/react": "10.69.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", + "framer-motion": "12.38.0", "lucide-react": "^1.16.0", - "next": "16.2.6", + "next": "16.3.2", "next-themes": "^0.4.6", - "react": "19.2.4", - "react-dom": "19.2.4", + "prismjs": "1.30.0", + "react": "19.2.8", + "react-dom": "19.2.8", + "react-router-dom": "6.30.3", "shadcn": "^4.8.2", "tailwind-merge": "^3.6.0", "tw-animate-css": "^1.4.0" }, "devDependencies": { "@chromatic-com/storybook": "^5.2.1", + "@figma/code-connect": "2.0.0", "@storybook/addon-a11y": "^10.4.1", "@storybook/addon-docs": "^10.4.1", "@storybook/addon-mcp": "^0.6.0", "@storybook/addon-vitest": "^10.4.1", "@storybook/nextjs-vite": "^10.4.1", "@tailwindcss/postcss": "^4", + "@types/history": "3.2.5", "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", + "@types/prismjs": "1.26.0", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", "@vitest/browser-playwright": "^4.1.7", "@vitest/coverage-v8": "^4.1.7", "eslint": "^9", - "eslint-config-next": "16.2.6", + "eslint-config-next": "16.3.2", "eslint-plugin-storybook": "^10.4.1", + "jsdom": "^24.1.3", "playwright": "^1.60.0", "storybook": "^10.4.1", "tailwindcss": "^4", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..6e5c71b --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from "playwright/test" + +const serviceName = process.env.SCRAPSCN_E2E_NAME +if (!serviceName) throw new Error("Run Playwright through a package test script") +const baseURL = `https://${serviceName}.localhost` +const startScript = process.env.SCRAPSCN_E2E_MODE === "development" ? "dev" : "start" + +export default defineConfig({ + testDir: "./tests/e2e", + fullyParallel: false, + workers: 1, + use: { + baseURL, + ignoreHTTPSErrors: true, + permissions: ["clipboard-read", "clipboard-write"], + trace: "retain-on-failure", + }, + webServer: { + command: `portless ${serviceName} pnpm ${startScript}`, + url: baseURL, + reuseExistingServer: false, + timeout: 30_000, + gracefulShutdown: { signal: "SIGTERM", timeout: 5_000 }, + ignoreHTTPSErrors: true, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee48811..c8f271e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,31 @@ importers: dependencies: '@base-ui/react': specifier: ^1.5.0 - version: 1.5.0(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@fontsource/roboto-mono': - specifier: ^5.2.9 + version: 1.5.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@emotion/is-prop-valid': + specifier: ^1.4.0 + version: 1.4.0 + '@emotion/react': + specifier: 11.14.0 + version: 11.14.0(@types/react@19.2.18)(react@19.2.8) + '@emotion/serialize': + specifier: 1.3.3 + version: 1.3.3 + '@fontsource-variable/roboto-mono': + specifier: 5.2.9 version: 5.2.9 '@fontsource/rubik': specifier: ^5.2.8 version: 5.2.8 + '@react-aria/interactions': + specifier: 3.28.1 + version: 3.28.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@react-aria/utils': + specifier: 3.34.1 + version: 3.34.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@sentry/react': + specifier: 10.69.0 + version: 10.69.0(react@19.2.8) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -28,25 +46,34 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + framer-motion: + specifier: 12.38.0 + version: 12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) lucide-react: specifier: ^1.16.0 - version: 1.16.0(react@19.2.4) + version: 1.16.0(react@19.2.8) next: - specifier: 16.2.6 - version: 16.2.6(@babel/core@7.29.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 16.3.2 + version: 16.3.2(@babel/core@7.29.7)(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) next-themes: specifier: ^0.4.6 - version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + prismjs: + specifier: 1.30.0 + version: 1.30.0 react: - specifier: 19.2.4 - version: 19.2.4 + specifier: 19.2.8 + version: 19.2.8 react-dom: - specifier: 19.2.4 - version: 19.2.4(react@19.2.4) + specifier: 19.2.8 + version: 19.2.8(react@19.2.8) + react-router-dom: + specifier: 6.30.3 + version: 6.30.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) shadcn: specifier: ^4.8.2 - version: 4.8.2(@types/node@20.19.41)(typescript@5.9.3) + version: 4.8.2(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(typescript@5.9.3) tailwind-merge: specifier: ^3.6.0 version: 3.6.0 @@ -56,34 +83,43 @@ importers: devDependencies: '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 5.2.1(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + '@figma/code-connect': + specifier: 2.0.0 + version: 2.0.0 '@storybook/addon-a11y': specifier: ^10.4.1 - version: 10.4.1(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 10.4.1(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) '@storybook/addon-docs': specifier: ^10.4.1 - version: 10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + version: 10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) '@storybook/addon-mcp': specifier: ^0.6.0 - version: 0.6.0(@storybook/addon-vitest@10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.7))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + version: 0.6.0(@storybook/addon-vitest@10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.7))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3) '@storybook/addon-vitest': specifier: ^10.4.1 - version: 10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.7) + version: 10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.7) '@storybook/nextjs-vite': specifier: ^10.4.1 - version: 10.4.1(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(esbuild@0.27.7)(next@16.2.6(@babel/core@7.29.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + version: 10.4.1(@babel/core@7.29.7)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(babel-plugin-macros@3.1.0)(esbuild@0.27.7)(next@16.3.2(@babel/core@7.29.7)(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) '@tailwindcss/postcss': specifier: ^4 version: 4.3.0 + '@types/history': + specifier: 3.2.5 + version: 3.2.5 '@types/node': specifier: ^20 version: 20.19.41 + '@types/prismjs': + specifier: 1.26.0 + version: 1.26.0 '@types/react': - specifier: ^19 - version: 19.2.15 + specifier: ^19.2.18 + version: 19.2.18 '@types/react-dom': - specifier: ^19 - version: 19.2.3(@types/react@19.2.15) + specifier: ^19.2.4 + version: 19.2.4(@types/react@19.2.18) '@vitest/browser-playwright': specifier: ^4.1.7 version: 4.1.7(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(playwright@1.60.0)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.7) @@ -94,17 +130,20 @@ importers: specifier: ^9 version: 9.39.4(jiti@2.7.0) eslint-config-next: - specifier: 16.2.6 - version: 16.2.6(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + specifier: 16.3.2 + version: 16.3.2(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) eslint-plugin-storybook: specifier: ^10.4.1 - version: 10.4.1(eslint@9.39.4(jiti@2.7.0))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + version: 10.4.1(eslint@9.39.4(jiti@2.7.0))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3) + jsdom: + specifier: ^24.1.3 + version: 24.1.3 playwright: specifier: ^1.60.0 version: 1.60.0 storybook: specifier: ^10.4.1 - version: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) tailwindcss: specifier: ^4 version: 4.3.0 @@ -116,7 +155,7 @@ importers: version: 8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0) vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + version: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(jsdom@24.1.3)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) packages: @@ -127,6 +166,9 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -300,6 +342,34 @@ packages: peerDependencies: storybook: ^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0 + '@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'} + '@dotenvx/dotenvx@1.69.1': resolution: {integrity: sha512-kwQB5KcAegxw/+NGUgXAo5ovyOSjlMhoXSSnSEpDhoHJwzMcMO0HE1U0VCYZ7jbAeCMGamed9XdWzOA5ixtTNg==} hasBin: true @@ -319,12 +389,59 @@ packages: '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} @@ -519,6 +636,11 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@figma/code-connect@2.0.0': + resolution: {integrity: sha512-FNpemwBciNCpskBZ8TK0iRa+oZR5H6+NP8XVDawww8Vz1bFoIrPu0y3NvPR0xnjtrOhAu+3DXqZmSR4cb0V+2w==} + engines: {node: '>=18'} + hasBin: true + '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -534,8 +656,8 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@fontsource/roboto-mono@5.2.9': - resolution: {integrity: sha512-iIeSyrRGoM15uIWqXslW1K9UFnUYfnCFNrNoWjXE0huO1L+hM0Jst0KNLuRc7P21xPpGL0bZouzYSX0Em9eyWg==} + '@fontsource-variable/roboto-mono@5.2.9': + resolution: {integrity: sha512-OzFO2AXlSGcXl/NcXS3CGjImb6rczCByPJ1C+Dzp9kkYOrUPyrGTuAtqPcmA/d+nZGX5oyOWKXLk5BrwVLYqkw==} '@fontsource/rubik@5.2.8': resolution: {integrity: sha512-PIc8QR7FqWPcYhbdRiGff56vQlKqg/ytES1YqecSq1GkgxiH4TBshrFvDEOZ9JonUF9m1qQ+qXxJj7wD5zgXEw==} @@ -570,152 +692,161 @@ packages: resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-arm64@0.35.3': + resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-darwin-x64@0.35.3': + resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + '@img/sharp-freebsd-wasm32@0.35.3': + resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.2': + resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + '@img/sharp-libvips-darwin-x64@1.3.2': + resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + '@img/sharp-libvips-linux-arm64@1.3.2': + resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + '@img/sharp-libvips-linux-arm@1.3.2': + resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + '@img/sharp-libvips-linux-ppc64@1.3.2': + resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + '@img/sharp-libvips-linux-riscv64@1.3.2': + resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + '@img/sharp-libvips-linux-s390x@1.3.2': + resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + '@img/sharp-libvips-linux-x64@1.3.2': + resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': + resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + '@img/sharp-libvips-linuxmusl-x64@1.3.2': + resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm64@0.35.3': + resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-arm@0.35.3': + resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==} + engines: {node: '>=20.9.0'} cpu: [arm] os: [linux] libc: [glibc] - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-ppc64@0.35.3': + resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==} + engines: {node: '>=20.9.0'} cpu: [ppc64] os: [linux] libc: [glibc] - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-riscv64@0.35.3': + resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==} + engines: {node: '>=20.9.0'} cpu: [riscv64] os: [linux] libc: [glibc] - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-s390x@0.35.3': + resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==} + engines: {node: '>=20.9.0'} cpu: [s390x] os: [linux] libc: [glibc] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linux-x64@0.35.3': + resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-arm64@0.35.3': + resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [linux] libc: [musl] - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-linuxmusl-x64@0.35.3': + resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [linux] libc: [musl] - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-wasm32@0.35.3': + resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.3': + resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==} + engines: {node: '>=20.9.0'} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-arm64@0.35.3': + resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==} + engines: {node: '>=20.9.0'} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-ia32@0.35.3': + resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==} + engines: {node: ^20.9.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@img/sharp-win32-x64@0.35.3': + resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==} + engines: {node: '>=20.9.0'} cpu: [x64] os: [win32] @@ -754,6 +885,19 @@ packages: '@types/node': optional: true + '@internationalized/date@3.12.3': + resolution: {integrity: sha512-fuLX+3ZKLsxI73y8b01EG/WjHb6gE6weCqlfawPO27kBWGMh9G1yH6Csv1uU7/cac9H2GHmOMt6CjmuQ1aia4Q==} + + '@internationalized/number@3.6.7': + resolution: {integrity: sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==} + + '@internationalized/string@3.2.10': + resolution: {integrity: sha512-PDx6//vHSpRnHfxqMqto11zQvhsaU74O3mKv2F/0eicGZcl9NLjQmGlbHz/LsJh5tLKp4A4L7ZVTzN1/MmMTvA==} + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0': resolution: {integrity: sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==} peerDependencies: @@ -811,60 +955,60 @@ packages: '@next/env@16.0.0': resolution: {integrity: sha512-s5j2iFGp38QsG1LWRQaE2iUY3h1jc014/melHFfLdrsMJPqxqDQwWNwyQTcNoUSGZlCVZuM7t7JDMmSyRilsnA==} - '@next/env@16.2.6': - resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} + '@next/env@16.3.2': + resolution: {integrity: sha512-8k4YoG8cM7LWlkfzGNYCRBbFNlernLiMw4s0btVl+CmmWqn3VpYypA72/5Feb1UWdxe6tHqr5KHP4p4Y4m9luA==} - '@next/eslint-plugin-next@16.2.6': - resolution: {integrity: sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==} + '@next/eslint-plugin-next@16.3.2': + resolution: {integrity: sha512-z+HW1cZgt8QhByw8p2EbxF94AImgsKIYUbtSkA7Zld2T9yrKAlys4jNOcAOCtv6csX2CoA/5qCVyesL5pHmJ0A==} - '@next/swc-darwin-arm64@16.2.6': - resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==} + '@next/swc-darwin-arm64@16.3.2': + resolution: {integrity: sha512-ib5Llm93YCKoKWDh6ZaHq6QWTuOZ2bRkSnUwMmX8dsRIOkBNL1vVlSiUKSfixPL9SSh9pvukzqajk/klkn5vqg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.2.6': - resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==} + '@next/swc-darwin-x64@16.3.2': + resolution: {integrity: sha512-qd98fX2+I5nYJDioW2o7nSjoxM5KvWdeDefM80igia4+C/qSIEhH4MhTE+hO/7qKM7W37/Mq+dOWp8UePSyLHw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.2.6': - resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==} + '@next/swc-linux-arm64-gnu@16.3.2': + resolution: {integrity: sha512-vqsgb6FAOzcrCccsLXiKtAy5t8EzO+uOazuFaSkQxeY0tNONG3vpHYy8pyBafcI5SNFPTeyard6yTr6SzNGo2A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.2.6': - resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} + '@next/swc-linux-arm64-musl@16.3.2': + resolution: {integrity: sha512-xIe1eujfHUB2XcxHGddxJyu6TJRPjC5NpIkQYB/32ESkt5VkQyIAjmLRS38c+s6QY+qjtY/4KarVDzXRuD7lZQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.2.6': - resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} + '@next/swc-linux-x64-gnu@16.3.2': + resolution: {integrity: sha512-Fe0SA2j8X0kmc3aveuHD7UktO3AE2+mH3LguP60vGbz7u0z+MrDXbeb5iZFYAwR7EzzzXJ2Yk966w9mGTFMqfA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.2.6': - resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} + '@next/swc-linux-x64-musl@16.3.2': + resolution: {integrity: sha512-TFBipb+gyesI/2Ve4zVu7kGltBWN/R466G5/1gtt2lECfc22G1pjkTxu68Q9aFcOaXiRGTQfvDbQQFe7mYgxiQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.2.6': - resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} + '@next/swc-win32-arm64-msvc@16.3.2': + resolution: {integrity: sha512-rVtmnNpBYIosDnKD/96dKxFsJnwnn1WRGG/HioSe8XCm2ksSHNrd2R6+hSjvTBxeMNhJ9pYeu/90cWB1nQLuNA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.2.6': - resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==} + '@next/swc-win32-x64-msvc@16.3.2': + resolution: {integrity: sha512-H4Y2o2/JcHu8LtwzD5CXfHhwxwz8gfsx2HXDEw46Mtev5xHnEmB7HNtZtmriw5ReUOjRtcDqo7XSbU01FT9NlA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1346,6 +1490,27 @@ packages: '@types/react': optional: true + '@react-aria/interactions@3.28.1': + resolution: {integrity: sha512-Bqb+HrD5I5MHS2SKBhISYqo2SW8Y2dfzgF/Y1lIJq7xqLxheo9vzxPGEHhz+XzkgGfoqEJx8A6a3C7uiqS3HWA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.34.1': + resolution: {integrity: sha512-H6+rGZL+0f58bBNaUMfctEnT+NogqwAk+nHiB8sR3K+YlQ37GTuCijy2U/pPvQtFMS5mURrjZeBH5JNNXsx14A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.36.1': + resolution: {integrity: sha512-AzsuD9OfxTOZMMvTRhlN3oHBwOmFN7tDh27LzqmHt4+uOgPhJT7ZM7/kVs/8/o0WxayMUIk3hBmCFRHv1FUoag==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@remix-run/router@1.23.2': + resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} + engines: {node: '>=14.0.0'} + '@rolldown/binding-android-arm64@1.0.2': resolution: {integrity: sha512-ZS4D1JPGn/MYQN/SYDWftIE/nVsM8j/AFOYEzAoOE2O3NktQOZru+/vYXGbR/qtdLdIfGCP0lcoJiYVzsEz+iQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1459,6 +1624,40 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sentry/browser-utils@10.69.0': + resolution: {integrity: sha512-e/u1Abj0zRPwR/deGZAP3GOULrsx67/XXnM5Skniqs4uxTsdNtPek1Nef0tpxwaQJYxwh6pWdhswLPPbbPOgBQ==} + engines: {node: '>=18'} + + '@sentry/browser@10.69.0': + resolution: {integrity: sha512-8391tnm96YbR7b8SYfEA/NEIZuyb2r3SZrtAT0bhZtjlujcYWjo7gugQvk8sWLU9cAa/euD00eJoIoJvNfpd7Q==} + engines: {node: '>=18'} + + '@sentry/conventions@0.16.0': + resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} + engines: {node: '>=14'} + + '@sentry/core@10.69.0': + resolution: {integrity: sha512-+uuqVEeiDzYuAKjZLqsROKXvRTbl/QeH0gfGRtpYib1cud4rAFWRIkFmcR7Jb7JGFYwmReyQotiTj/hcDszTZg==} + engines: {node: '>=18'} + + '@sentry/feedback@10.69.0': + resolution: {integrity: sha512-qrGz5Qaw93/IhMjlFN6uIaXeHwgHDaKGa6FkTAP6PonpkvSbGGqan6xfsENxzj9HUVoli1lZ6tMRDnt2qtSPhg==} + engines: {node: '>=18'} + + '@sentry/react@10.69.0': + resolution: {integrity: sha512-f0Il/JMteHjdWPNZQB3rtp1Pcj2Leb3p0KSZuv3rh0EUril9CbWtQVy5zJhoAppi+MWWmgRWa+6BpHbQf+ABQA==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.14.0 || 17.x || 18.x || 19.x + + '@sentry/replay-canvas@10.69.0': + resolution: {integrity: sha512-VF6nXvSninHcc7dC1Zme0RjkC7VgRMCixs6jKaQX5zTNeqTW3dZGSefSOVv+ZteRi3hJvVORq985VjUC9Z/0+A==} + engines: {node: '>=18'} + + '@sentry/replay@10.69.0': + resolution: {integrity: sha512-uRhmNhtFGPOlM0iniVmWKAX3KVXI0le41yYK/iKdPjinT9jA3ZrmykO/Fv1v/KI5znOtwa9D6eHRnDTTMRxFrg==} + engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -1601,8 +1800,8 @@ packages: typescript: optional: true - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} '@tailwindcss/node@4.3.0': resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} @@ -1733,6 +1932,9 @@ packages: '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@ts-morph/common@0.28.1': + resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} @@ -1763,6 +1965,9 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/history@3.2.5': + resolution: {integrity: sha512-TqWYI0mlqS5qhH8MHgJJs0RcgvvZLxkn0bi2qK07liZqP7M9rl1kpJ6TCAUo5Cp4vP5DObIqHcky0MWyyQojVQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1775,13 +1980,19 @@ packages: '@types/node@20.19.41': resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prismjs@1.26.0': + resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==} + + '@types/react-dom@19.2.4': + resolution: {integrity: sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.15': - resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} @@ -2075,6 +2286,9 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -2159,6 +2373,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + 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'} @@ -2171,6 +2388,10 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2178,18 +2399,31 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.32: resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} engines: {node: '>=6.0.0'} hasBin: true + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@2.2.2: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} + boxen@5.1.1: + resolution: {integrity: sha512-JtIQYts08AFAYGF4eSh3pUt3NQkYV/e75pRtQmAVTLNWR/1L7Bsswxlgzgk8nmLEM+gFszsIlA9BgD3XnSqp3g==} + engines: {node: '>=10'} + brace-expansion@1.1.15: resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + brace-expansion@5.0.6: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} @@ -2203,6 +2437,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -2227,6 +2464,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + caniuse-lite@1.0.30001793: resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} @@ -2268,6 +2509,14 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + 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-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -2287,6 +2536,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + 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'} @@ -2307,6 +2560,10 @@ 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'} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -2315,6 +2572,9 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2330,6 +2590,9 @@ packages: resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} engines: {node: '>=18'} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2349,6 +2612,10 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + cosmiconfig@9.0.1: resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} engines: {node: '>=14'} @@ -2370,6 +2637,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==} @@ -2380,6 +2651,10 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + 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'} @@ -2409,6 +2684,9 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -2436,6 +2714,9 @@ packages: resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} + 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'} @@ -2448,6 +2729,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + 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'} @@ -2481,6 +2766,10 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} @@ -2524,6 +2813,10 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -2566,6 +2859,11 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esbuild-wasm@0.27.3: + resolution: {integrity: sha512-AUXuOxZ145/5Az+lIqk6TdJbxKTyDGkXMJpTExmBdbnHR6n6qAFx+F4oG9ORpVYJ9dQYeQAqzv51TO4DFKsbXw==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} @@ -2582,8 +2880,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@16.2.6: - resolution: {integrity: sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==} + eslint-config-next@16.3.2: + resolution: {integrity: sha512-gTABOJmyc6pEgSX1Z1VOjBxkSmo5Hkdj+ePclDf8HLGTsnVWzgtDdrOeQrAnUkf0JNJJhwPuXrsIwmFZRKJLoQ==} peerDependencies: eslint: '>=9.0.0' typescript: '>=3.3.1' @@ -2681,6 +2979,7 @@ packages: eslint@9.39.4: resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -2759,6 +3058,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fuzzy@1.12.0: + resolution: {integrity: sha512-sXxGgHS+ubYpsdLnvOvJ9w5GYYZrtL9mkosG3nfuD446ahvoWEsSKBP7ieGmWIKVLnaxRDgUJkZMdxRgA2Ni+Q==} + fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -2817,6 +3119,9 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2832,6 +3137,14 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -2840,6 +3153,20 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + framer-motion@12.38.0: + resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -2926,6 +3253,12 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} @@ -2952,6 +3285,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.14.0: resolution: {integrity: sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -2983,6 +3319,10 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + headers-polyfill@5.0.1: resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} @@ -2992,10 +3332,17 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hono@4.12.23: resolution: {integrity: sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==} engines: {node: '>=16.9.0'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -3003,6 +3350,10 @@ 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@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -3015,10 +3366,17 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -3131,6 +3489,10 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} @@ -3162,6 +3524,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@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -3201,6 +3566,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@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -3251,6 +3620,10 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -3258,6 +3631,9 @@ packages: jose@6.2.3: resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + js-base64@3.9.3: + resolution: {integrity: sha512-uwYQp+VJ38FVvtim6qNbit6e9uT6dwWQ4Y1+H9TxhW5hcHjpHwoxlR0nMpqUmIFOmu4VqMxwdJA88gIVuZJQ/g==} + js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -3268,6 +3644,15 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 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'} @@ -3416,6 +3801,13 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + 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'} + log-symbols@6.0.0: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} @@ -3427,6 +3819,9 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.1: resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} @@ -3476,10 +3871,18 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + 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'} @@ -3503,6 +3906,10 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + 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==} @@ -3513,6 +3920,12 @@ packages: module-alias@2.3.4: resolution: {integrity: sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==} + motion-dom@12.43.0: + resolution: {integrity: sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag==} + + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -3557,8 +3970,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.2.6: - resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==} + next@16.3.2: + resolution: {integrity: sha512-/ZCaubUy17Lld1SiPWxuPbCk2ihqAxF2QNQaPZeEaEb7t1I58qhsJN187D7AfpapHAqUPXH0f/thtdW9dWgWFg==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -3603,6 +4016,9 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} + 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'} @@ -3669,6 +4085,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + ora@8.2.0: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} @@ -3695,6 +4115,12 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3707,6 +4133,9 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3739,6 +4168,10 @@ packages: path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -3798,6 +4231,11 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -3806,6 +4244,10 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -3817,6 +4259,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3825,6 +4270,9 @@ packages: resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3836,6 +4284,12 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} + react-aria@3.51.0: + resolution: {integrity: sha512-AyWLw0XR38cFPwBu/ErgGaVrc5dupLEKmRlMXTGvFKOtbaGRQ2+yQJkjVhpdHhoRhU4+G+tJDFeHDTS8tK3bfQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-docgen-typescript@2.4.0: resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} peerDependencies: @@ -3850,6 +4304,11 @@ packages: peerDependencies: react: ^19.2.4 + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -3876,6 +4335,24 @@ packages: '@types/react': optional: true + react-router-dom@6.30.3: + resolution: {integrity: sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.30.3: + resolution: {integrity: sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-stately@3.49.0: + resolution: {integrity: sha512-13iNq2KzBrRAzxRc+n53hgROfIistiYY/sPtIhCw1qUB7/kmo+X1xEU2uiS5zcCIrc55AUPwoHqOIIpKWSwB9A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-style-singleton@2.2.3: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} @@ -3890,6 +4367,14 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} @@ -3914,6 +4399,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + reselect@5.2.0: resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} @@ -3934,6 +4422,10 @@ packages: engines: {node: '>= 0.4'} hasBin: true + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -3954,6 +4446,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==} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} @@ -3965,6 +4463,9 @@ packages: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -3976,6 +4477,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==} @@ -3988,6 +4493,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} @@ -4018,9 +4528,14 @@ packages: resolution: {integrity: sha512-pt3KneOg6LGYKNAdoTVf/lpVcf7t2MlV+Ll2Xc3lIIYN3ph4ajrjU+CcG6OVSgO5ubbLZj+9j5oMA9Lqg7o8KA==} hasBin: true - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.35.3: + resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -4067,6 +4582,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -4144,6 +4663,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-object@5.0.0: resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} engines: {node: '>=14.16'} @@ -4193,6 +4715,9 @@ packages: babel-plugin-macros: optional: true + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -4201,6 +4726,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -4215,6 +4743,9 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -4263,10 +4794,18 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + tough-cookie@6.0.1: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -4280,9 +4819,13 @@ packages: ts-morph@26.0.0: resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} + ts-morph@27.0.2: + resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} + deprecated: unmaintained hasBin: true peerDependencies: typescript: ^5.0.0 @@ -4307,6 +4850,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + type-fest@5.6.0: resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} engines: {node: '>=20'} @@ -4343,6 +4890,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 + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -4350,10 +4902,21 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + engines: {node: '>=20.18.1'} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -4384,6 +4947,9 @@ packages: uri-template-matcher@1.1.2: resolution: {integrity: sha512-uZc1h12jdO3m/R77SfTEOuo6VbMhgWznaawKpBjRGSJb7i91x5PgI37NQJtG+Cerxkk0yr1pylBY2qG1kQ+aEQ==} + 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'} @@ -4527,16 +5093,40 @@ packages: jsdom: optional: true + 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-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + 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==} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + 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'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} which-builtin-type@1.2.1: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} @@ -4565,6 +5155,10 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -4596,6 +5190,13 @@ packages: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4603,6 +5204,10 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -4628,12 +5233,21 @@ 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-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} peerDependencies: zod: ^3.25.0 || ^4.0.0 + zod@3.25.58: + resolution: {integrity: sha512-DVLmMQzSZwNYzQoMaM3MQWnxr2eq+AtM9Hx3w1/Yl0pH8sLTSjN4jGP7w6f7uand6Hw44tsnSu1hz1AOA6qI2Q==} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -4646,6 +5260,14 @@ snapshots: '@alloc/quick-lru@5.2.0': {} + '@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.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -4834,45 +5456,65 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@base-ui/react@1.5.0(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@base-ui/react@1.5.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@babel/runtime': 7.29.7 - '@base-ui/utils': 0.2.9(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@base-ui/utils': 0.2.9(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@floating-ui/utils': 0.2.11 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + use-sync-external-store: 1.6.0(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@base-ui/utils@0.2.9(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@base-ui/utils@0.2.9(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@babel/runtime': 7.29.7 '@floating-ui/utils': 0.2.11 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) reselect: 5.2.0 - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.6.0(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 '@bcoe/v8-coverage@1.0.2': {} '@blazediff/core@1.9.1': {} - '@chromatic-com/storybook@5.2.1(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@chromatic-com/storybook@5.2.1(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': dependencies: '@neoconfetti/react': 1.0.0 chromatic: 16.10.0 jsonfile: 6.2.1 - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) strip-ansi: 7.2.0 transitivePeerDependencies: - '@chromatic-com/cypress' - '@chromatic-com/playwright' - '@chromatic-com/vitest' + '@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': {} + '@dotenvx/dotenvx@1.69.1': dependencies: commander: 11.1.0 @@ -4908,6 +5550,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 @@ -4918,6 +5565,74 @@ snapshots: tslib: 2.8.1 optional: true + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.29.7 + '@babel/runtime': 7.29.7 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@19.2.18)(react@19.2.8)': + dependencies: + '@babel/runtime': 7.29.7 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.8) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.2.8 + optionalDependencies: + '@types/react': 19.2.18 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.2.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + '@esbuild/aix-ppc64@0.27.7': optional: true @@ -5042,6 +5757,37 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@figma/code-connect@2.0.0': + 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 + esbuild-wasm: 0.27.3 + fast-fuzzy: 1.12.0 + find-up: 5.0.0 + glob: 11.1.0 + 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.29.0 + zod: 3.25.58 + zod-validation-error: 3.5.4(zod@3.25.58) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -5051,15 +5797,15 @@ snapshots: '@floating-ui/core': 1.7.5 '@floating-ui/utils': 0.2.11 - '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@floating-ui/react-dom@2.1.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@floating-ui/dom': 1.7.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) '@floating-ui/utils@0.2.11': {} - '@fontsource/roboto-mono@5.2.9': {} + '@fontsource-variable/roboto-mono@5.2.9': {} '@fontsource/rubik@5.2.8': {} @@ -5086,98 +5832,108 @@ snapshots: '@img/colour@1.1.0': optional: true - '@img/sharp-darwin-arm64@0.34.5': + '@img/sharp-darwin-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-arm64': 1.3.2 optional: true - '@img/sharp-darwin-x64@0.34.5': + '@img/sharp-darwin-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.3.2 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': + '@img/sharp-freebsd-wasm32@0.35.3': + dependencies: + '@img/sharp-wasm32': 0.35.3 optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': + '@img/sharp-libvips-darwin-arm64@1.3.2': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': + '@img/sharp-libvips-darwin-x64@1.3.2': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': + '@img/sharp-libvips-linux-arm64@1.3.2': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.4': + '@img/sharp-libvips-linux-arm@1.3.2': optional: true - '@img/sharp-libvips-linux-riscv64@1.2.4': + '@img/sharp-libvips-linux-ppc64@1.3.2': optional: true - '@img/sharp-libvips-linux-s390x@1.2.4': + '@img/sharp-libvips-linux-riscv64@1.3.2': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': + '@img/sharp-libvips-linux-s390x@1.3.2': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + '@img/sharp-libvips-linux-x64@1.3.2': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.4': + '@img/sharp-libvips-linuxmusl-arm64@1.3.2': optional: true - '@img/sharp-linux-arm64@0.34.5': + '@img/sharp-libvips-linuxmusl-x64@1.3.2': + optional: true + + '@img/sharp-linux-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.3.2 optional: true - '@img/sharp-linux-arm@0.34.5': + '@img/sharp-linux-arm@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.3.2 optional: true - '@img/sharp-linux-ppc64@0.34.5': + '@img/sharp-linux-ppc64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.3.2 optional: true - '@img/sharp-linux-riscv64@0.34.5': + '@img/sharp-linux-riscv64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.3.2 optional: true - '@img/sharp-linux-s390x@0.34.5': + '@img/sharp-linux-s390x@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.3.2 optional: true - '@img/sharp-linux-x64@0.34.5': + '@img/sharp-linux-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.3.2 optional: true - '@img/sharp-linuxmusl-arm64@0.34.5': + '@img/sharp-linuxmusl-arm64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 optional: true - '@img/sharp-linuxmusl-x64@0.34.5': + '@img/sharp-linuxmusl-x64@0.35.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 optional: true - '@img/sharp-wasm32@0.34.5': + '@img/sharp-wasm32@0.35.3': dependencies: - '@emnapi/runtime': 1.10.0 + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.3': + dependencies: + '@img/sharp-wasm32': 0.35.3 optional: true - '@img/sharp-win32-arm64@0.34.5': + '@img/sharp-win32-arm64@0.35.3': optional: true - '@img/sharp-win32-ia32@0.34.5': + '@img/sharp-win32-ia32@0.35.3': optional: true - '@img/sharp-win32-x64@0.34.5': + '@img/sharp-win32-x64@0.35.3': optional: true '@inquirer/ansi@2.0.6': {} @@ -5207,6 +5963,20 @@ snapshots: optionalDependencies: '@types/node': 20.19.41 + '@internationalized/date@3.12.3': + dependencies: + '@swc/helpers': 0.5.23 + + '@internationalized/number@3.6.7': + dependencies: + '@swc/helpers': 0.5.23 + + '@internationalized/string@3.2.10': + dependencies: + '@swc/helpers': 0.5.23 + + '@isaacs/cliui@9.0.0': {} + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: glob: 13.0.6 @@ -5234,10 +6004,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@mdx-js/react@3.1.1(@types/react@19.2.15)(react@19.2.4)': + '@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.4)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.2.15 + '@types/react': 19.2.18 react: 19.2.4 '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': @@ -5278,6 +6048,13 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.2 + optional: true + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 @@ -5289,34 +6066,37 @@ snapshots: '@next/env@16.0.0': {} - '@next/env@16.2.6': {} + '@next/env@16.3.2': {} - '@next/eslint-plugin-next@16.2.6': + '@next/eslint-plugin-next@16.3.2(eslint@9.39.4(jiti@2.7.0))': dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) fast-glob: 3.3.1 + transitivePeerDependencies: + - eslint - '@next/swc-darwin-arm64@16.2.6': + '@next/swc-darwin-arm64@16.3.2': optional: true - '@next/swc-darwin-x64@16.2.6': + '@next/swc-darwin-x64@16.3.2': optional: true - '@next/swc-linux-arm64-gnu@16.2.6': + '@next/swc-linux-arm64-gnu@16.3.2': optional: true - '@next/swc-linux-arm64-musl@16.2.6': + '@next/swc-linux-arm64-musl@16.3.2': optional: true - '@next/swc-linux-x64-gnu@16.2.6': + '@next/swc-linux-x64-gnu@16.3.2': optional: true - '@next/swc-linux-x64-musl@16.2.6': + '@next/swc-linux-x64-musl@16.3.2': optional: true - '@next/swc-win32-arm64-msvc@16.2.6': + '@next/swc-win32-arm64-msvc@16.3.2': optional: true - '@next/swc-win32-x64-msvc@16.2.6': + '@next/swc-win32-x64-msvc@16.3.2': optional: true '@noble/ciphers@1.3.0': {} @@ -5468,9 +6248,9 @@ snapshots: '@oxc-resolver/binding-openharmony-arm64@11.19.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -5489,162 +6269,184 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.4 + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-context@1.1.2(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.4 + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.15)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.18)(react@19.2.8) aria-hidden: 1.2.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.15)(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.4 + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@radix-ui/react-id@1.1.1(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.4 + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.15)(react@19.2.4) - react: 19.2.4 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.15)(react@19.2.4)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.4 + react: 19.2.8 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 + + '@react-aria/interactions@3.28.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@react-types/shared': 3.36.1(react@19.2.8) + '@swc/helpers': 0.5.23 + react: 19.2.8 + react-aria: 3.51.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react-dom: 19.2.8(react@19.2.8) + + '@react-aria/utils@3.34.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@swc/helpers': 0.5.23 + react: 19.2.8 + react-aria: 3.51.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react-dom: 19.2.8(react@19.2.8) + react-stately: 3.49.0(react@19.2.8) + + '@react-types/shared@3.36.1(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@remix-run/router@1.23.2': {} '@rolldown/binding-android-arm64@1.0.2': optional: true @@ -5707,28 +6509,69 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} + '@sentry/browser-utils@10.69.0': + dependencies: + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.69.0 + + '@sentry/browser@10.69.0': + dependencies: + '@sentry/browser-utils': 10.69.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.69.0 + '@sentry/feedback': 10.69.0 + '@sentry/replay': 10.69.0 + '@sentry/replay-canvas': 10.69.0 + + '@sentry/conventions@0.16.0': {} + + '@sentry/core@10.69.0': + dependencies: + '@sentry/conventions': 0.16.0 + + '@sentry/feedback@10.69.0': + dependencies: + '@sentry/core': 10.69.0 + + '@sentry/react@10.69.0(react@19.2.8)': + dependencies: + '@sentry/browser': 10.69.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.69.0 + react: 19.2.8 + + '@sentry/replay-canvas@10.69.0': + dependencies: + '@sentry/core': 10.69.0 + '@sentry/replay': 10.69.0 + + '@sentry/replay@10.69.0': + dependencies: + '@sentry/browser-utils': 10.69.0 + '@sentry/core': 10.69.0 + '@sindresorhus/merge-streams@4.0.0': {} '@standard-schema/spec@1.1.0': {} - '@storybook/addon-a11y@10.4.1(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/addon-a11y@10.4.1(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': dependencies: '@storybook/global': 5.0.0 axe-core: 4.11.4 - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@storybook/addon-docs@10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': + '@storybook/addon-docs@10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: - '@mdx-js/react': 3.1.1(@types/react@19.2.15)(react@19.2.4) - '@storybook/csf-plugin': 10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + '@mdx-js/react': 3.1.1(@types/react@19.2.18)(react@19.2.4) + '@storybook/csf-plugin': 10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) '@storybook/icons': 2.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/react-dom-shim': 10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@storybook/react-dom-shim': 10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) ts-dedent: 2.2.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 transitivePeerDependencies: - '@types/react-dom' - esbuild @@ -5736,39 +6579,39 @@ snapshots: - vite - webpack - '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.7))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': + '@storybook/addon-mcp@0.6.0(@storybook/addon-vitest@10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.7))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)': dependencies: '@storybook/mcp': 0.7.0(typescript@5.9.3) '@tmcp/adapter-valibot': 0.1.6(tmcp@1.19.4(typescript@5.9.3))(valibot@1.2.0(typescript@5.9.3)) '@tmcp/transport-http': 0.8.6(tmcp@1.19.4(typescript@5.9.3)) picoquery: 2.5.0 - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) tmcp: 1.19.4(typescript@5.9.3) valibot: 1.2.0(typescript@5.9.3) optionalDependencies: - '@storybook/addon-vitest': 10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.7) + '@storybook/addon-vitest': 10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.7) transitivePeerDependencies: - '@tmcp/auth' - typescript - '@storybook/addon-vitest@10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.7)': + '@storybook/addon-vitest@10.4.1(@vitest/browser-playwright@4.1.7)(@vitest/browser@4.1.7)(@vitest/runner@4.1.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.7)': dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@storybook/icons': 2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) optionalDependencies: '@vitest/browser': 4.1.7(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.7) '@vitest/browser-playwright': 4.1.7(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(playwright@1.60.0)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.7) '@vitest/runner': 4.1.7 - vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(jsdom@24.1.3)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) transitivePeerDependencies: - react - react-dom - '@storybook/builder-vite@10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': + '@storybook/builder-vite@10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: - '@storybook/csf-plugin': 10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@storybook/csf-plugin': 10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) ts-dedent: 2.2.0 vite: 8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0) transitivePeerDependencies: @@ -5776,9 +6619,9 @@ snapshots: - rollup - webpack - '@storybook/csf-plugin@10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': + '@storybook/csf-plugin@10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) unplugin: 2.3.11 optionalDependencies: esbuild: 0.27.7 @@ -5791,6 +6634,11 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@storybook/icons@2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + '@storybook/mcp@0.7.0(typescript@5.9.3)': dependencies: '@tmcp/adapter-valibot': 0.1.6(tmcp@1.19.4(typescript@5.9.3))(valibot@1.2.0(typescript@5.9.3)) @@ -5801,21 +6649,21 @@ snapshots: - '@tmcp/auth' - typescript - '@storybook/nextjs-vite@10.4.1(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(esbuild@0.27.7)(next@16.2.6(@babel/core@7.29.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': + '@storybook/nextjs-vite@10.4.1(@babel/core@7.29.7)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(babel-plugin-macros@3.1.0)(esbuild@0.27.7)(next@16.3.2(@babel/core@7.29.7)(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: - '@storybook/builder-vite': 10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) - '@storybook/react': 10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - '@storybook/react-vite': 10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(esbuild@0.27.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) - next: 16.2.6(@babel/core@7.29.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.4) + '@storybook/builder-vite': 10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + '@storybook/react': 10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3) + '@storybook/react-vite': 10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.27.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + next: 16.3.2(@babel/core@7.29.7)(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + styled-jsx: 5.1.6(@babel/core@7.29.7)(babel-plugin-macros@3.1.0)(react@19.2.8) vite: 8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0) - vite-plugin-storybook-nextjs: 3.3.0(next@16.2.6(@babel/core@7.29.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + vite-plugin-storybook-nextjs: 3.3.0(next@16.3.2(@babel/core@7.29.7)(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) typescript: 5.9.3 transitivePeerDependencies: - '@babel/core' @@ -5825,28 +6673,37 @@ snapshots: - supports-color - webpack - '@storybook/react-dom-shim@10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/react-dom-shim@10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': dependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + optionalDependencies: + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) + + '@storybook/react-dom-shim@10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': + dependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@storybook/react-vite@10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(esbuild@0.27.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': + '@storybook/react-vite@10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.27.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) '@rollup/pluginutils': 5.3.0 - '@storybook/builder-vite': 10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) - '@storybook/react': 10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + '@storybook/builder-vite': 10.4.1(esbuild@0.27.7)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + '@storybook/react': 10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3) empathic: 2.0.1 magic-string: 0.30.21 - react: 19.2.4 + react: 19.2.8 react-docgen: 8.0.3 - react-dom: 19.2.4(react@19.2.4) + react-dom: 19.2.8(react@19.2.8) resolve: 1.22.12 - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) tsconfig-paths: 4.2.0 vite: 8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0) transitivePeerDependencies: @@ -5858,23 +6715,23 @@ snapshots: - typescript - webpack - '@storybook/react@10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': + '@storybook/react@10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.4.1(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - react: 19.2.4 + '@storybook/react-dom-shim': 10.4.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + react: 19.2.8 react-docgen: 8.0.3 react-docgen-typescript: 2.4.0(typescript@5.9.3) - react-dom: 19.2.4(react@19.2.4) - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-dom: 19.2.8(react@19.2.8) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 - '@types/react-dom': 19.2.3(@types/react@19.2.15) + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@swc/helpers@0.5.15': + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 @@ -5994,6 +6851,12 @@ snapshots: minimatch: 10.2.5 path-browserify: 1.0.1 + '@ts-morph/common@0.28.1': + dependencies: + minimatch: 10.2.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.16 + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 @@ -6033,6 +6896,8 @@ snapshots: '@types/estree@1.0.9': {} + '@types/history@3.2.5': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -6043,11 +6908,15 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/react-dom@19.2.3(@types/react@19.2.15)': + '@types/parse-json@4.0.2': {} + + '@types/prismjs@1.26.0': {} + + '@types/react-dom@19.2.4(@types/react@19.2.18)': dependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - '@types/react@19.2.15': + '@types/react@19.2.18': dependencies: csstype: 3.2.3 @@ -6129,7 +6998,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.60.0 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.8.1 + semver: 7.8.5 tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 @@ -6232,7 +7101,7 @@ snapshots: '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(jsdom@24.1.3)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) transitivePeerDependencies: - bufferutil - msw @@ -6248,7 +7117,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(jsdom@24.1.3)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) ws: 8.21.0 transitivePeerDependencies: - bufferutil @@ -6268,7 +7137,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) + vitest: 4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(jsdom@24.1.3)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) optionalDependencies: '@vitest/browser': 4.1.7(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.7) @@ -6369,6 +7238,10 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -6476,6 +7349,8 @@ snapshots: async-function@1.0.0: {} + asynckit@0.4.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -6484,12 +7359,26 @@ snapshots: axobject-query@4.1.0: {} + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.29.7 + cosmiconfig: 7.1.0 + resolve: 1.22.12 + balanced-match@1.0.2: {} balanced-match@4.0.4: {} + base64-js@1.5.1: {} + baseline-browser-mapping@2.10.32: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + body-parser@2.2.2: dependencies: bytes: 3.1.2 @@ -6504,11 +7393,26 @@ snapshots: transitivePeerDependencies: - supports-color + 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.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.1.4: + dependencies: + balanced-match: 1.0.2 + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -6525,6 +7429,11 @@ snapshots: node-releases: 2.0.46 update-browserslist-db: 1.2.3(browserslist@4.28.2) + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 @@ -6550,6 +7459,8 @@ snapshots: callsites@3.1.0: {} + camelcase@6.3.0: {} + caniuse-lite@1.0.30001793: {} chai@5.3.3: @@ -6573,12 +7484,18 @@ snapshots: chromatic@16.10.0: dependencies: - semver: 7.8.1 + semver: 7.8.5 class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 + cli-boxes@2.2.1: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -6595,16 +7512,18 @@ snapshots: 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.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + cmdk@1.1.1(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.15)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -6617,10 +7536,16 @@ snapshots: color-name@1.1.4: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@11.1.0: {} commander@14.0.3: {} + compare-versions@6.1.1: {} + concat-map@0.0.1: {} content-disposition@1.1.0: {} @@ -6629,6 +7554,8 @@ snapshots: content-type@2.0.0: {} + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.2.2: {} @@ -6642,6 +7569,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.3 + cosmiconfig@9.0.1(typescript@5.9.3): dependencies: env-paths: 2.2.1 @@ -6661,12 +7596,22 @@ 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: {} damerau-levenshtein@1.0.8: {} data-uri-to-buffer@4.0.1: {} + 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 @@ -6693,7 +7638,11 @@ snapshots: dependencies: ms: 2.1.3 - dedent@1.7.2: {} + decimal.js@10.6.0: {} + + dedent@1.7.2(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 deep-eql@5.0.2: {} @@ -6708,6 +7657,10 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 + defaults@1.0.4: + dependencies: + clone: 1.0.4 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -6722,6 +7675,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + delayed-stream@1.0.0: {} + depd@2.0.0: {} dequal@2.0.3: {} @@ -6744,6 +7699,8 @@ snapshots: dom-accessibility-api@0.6.3: {} + dotenv@16.6.1: {} + dotenv@17.4.2: {} dunder-proto@1.0.1: @@ -6783,6 +7740,8 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@6.0.1: {} + env-paths@2.2.1: {} error-ex@1.3.4: @@ -6813,7 +7772,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -6880,11 +7839,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 es-to-primitive@1.3.0: dependencies: @@ -6892,6 +7851,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild-wasm@0.27.3: {} + esbuild@0.27.7: optionalDependencies: '@esbuild/aix-ppc64': 0.27.7 @@ -6927,9 +7888,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@16.2.6(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): + eslint-config-next@16.3.2(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@next/eslint-plugin-next': 16.2.6 + '@next/eslint-plugin-next': 16.3.2(eslint@9.39.4(jiti@2.7.0)) eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) @@ -7062,11 +8023,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@10.4.1(eslint@9.39.4(jiti@2.7.0))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): + eslint-plugin-storybook@10.4.1(eslint@9.39.4(jiti@2.7.0))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) eslint: 9.39.4(jiti@2.7.0) - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) transitivePeerDependencies: - supports-color - typescript @@ -7228,6 +8189,10 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-fuzzy@1.12.0: + dependencies: + graphemesplit: 2.6.0 + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -7296,6 +8261,8 @@ snapshots: transitivePeerDependencies: - supports-color + find-root@1.1.0: {} + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -7312,12 +8279,35 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + 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 + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 forwarded@0.2.0: {} + framer-motion@12.38.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + motion-dom: 12.43.0 + motion-utils: 12.39.0 + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 1.4.0 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + fresh@2.0.0: {} fs-extra@11.3.5: @@ -7340,7 +8330,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.3 + hasown: 2.0.4 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -7365,7 +8355,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-nonce@1.0.1: {} @@ -7402,6 +8392,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + glob@13.0.6: dependencies: minimatch: 10.2.5 @@ -7423,6 +8422,11 @@ snapshots: graceful-fs@4.2.11: {} + graphemesplit@2.6.0: + dependencies: + js-base64: 3.9.3 + unicode-trie: 2.0.0 + graphql@16.14.0: {} has-bigints@1.1.0: {} @@ -7447,6 +8451,10 @@ snapshots: dependencies: function-bind: 1.1.2 + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + headers-polyfill@5.0.1: dependencies: '@types/set-cookie-parser': 2.4.10 @@ -7458,8 +8466,16 @@ snapshots: dependencies: hermes-estree: 0.25.1 + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + hono@4.12.23: {} + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-escaper@2.0.2: {} http-errors@2.0.1: @@ -7470,6 +8486,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@7.0.6: dependencies: agent-base: 7.1.4 @@ -7481,10 +8504,16 @@ snapshots: human-signals@8.0.1: {} + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -7505,7 +8534,7 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 + hasown: 2.0.4 side-channel: 1.1.0 ip-address@10.2.0: {} @@ -7539,7 +8568,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.8.1 + semver: 7.8.5 is-callable@1.2.7: {} @@ -7586,6 +8615,8 @@ snapshots: dependencies: is-docker: 3.0.0 + is-interactive@1.0.0: {} + is-interactive@2.0.0: {} is-map@2.0.3: {} @@ -7605,6 +8636,8 @@ snapshots: is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} is-regex@1.2.1: @@ -7612,7 +8645,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 is-regexp@3.1.0: {} @@ -7641,6 +8674,8 @@ snapshots: dependencies: which-typed-array: 1.1.21 + is-unicode-supported@0.1.0: {} + is-unicode-supported@1.3.0: {} is-unicode-supported@2.1.0: {} @@ -7688,10 +8723,16 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + jiti@2.7.0: {} jose@6.2.3: {} + js-base64@3.9.3: {} + js-tokens@10.0.0: {} js-tokens@4.0.0: {} @@ -7700,6 +8741,34 @@ snapshots: dependencies: argparse: 2.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-buffer@3.0.1: {} @@ -7811,6 +8880,13 @@ snapshots: lodash.merge@4.6.2: {} + lodash@4.18.1: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + log-symbols@6.0.0: dependencies: chalk: 5.6.2 @@ -7822,15 +8898,17 @@ snapshots: loupe@3.2.1: {} + lru-cache@10.4.3: {} + lru-cache@11.5.1: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@1.16.0(react@19.2.4): + lucide-react@1.16.0(react@19.2.8): dependencies: - react: 19.2.4 + react: 19.2.8 lz-string@1.5.0: {} @@ -7863,8 +8941,14 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 + 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 @@ -7883,12 +8967,22 @@ snapshots: dependencies: brace-expansion: 1.1.15 + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.4 + minimist@1.2.8: {} minipass@7.1.3: {} module-alias@2.3.4: {} + motion-dom@12.43.0: + dependencies: + motion-utils: 12.39.0 + + motion-utils@12.39.0: {} + mrmime@2.0.1: {} ms@2.1.3: {} @@ -7928,33 +9022,34 @@ snapshots: negotiator@1.0.0: {} - next-themes@0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next-themes@0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) - next@16.2.6(@babel/core@7.29.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next@16.3.2(@babel/core@7.29.7)(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - '@next/env': 16.2.6 - '@swc/helpers': 0.5.15 + '@next/env': 16.3.2 + '@swc/helpers': 0.5.23 baseline-browser-mapping: 2.10.32 caniuse-lite: 1.0.30001793 postcss: 8.5.15 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + styled-jsx: 5.1.6(@babel/core@7.29.7)(babel-plugin-macros@3.1.0)(react@19.2.8) optionalDependencies: - '@next/swc-darwin-arm64': 16.2.6 - '@next/swc-darwin-x64': 16.2.6 - '@next/swc-linux-arm64-gnu': 16.2.6 - '@next/swc-linux-arm64-musl': 16.2.6 - '@next/swc-linux-x64-gnu': 16.2.6 - '@next/swc-linux-x64-musl': 16.2.6 - '@next/swc-win32-arm64-msvc': 16.2.6 - '@next/swc-win32-x64-msvc': 16.2.6 - sharp: 0.34.5 + '@next/swc-darwin-arm64': 16.3.2 + '@next/swc-darwin-x64': 16.3.2 + '@next/swc-linux-arm64-gnu': 16.3.2 + '@next/swc-linux-arm64-musl': 16.3.2 + '@next/swc-linux-x64-gnu': 16.3.2 + '@next/swc-linux-x64-musl': 16.3.2 + '@next/swc-win32-arm64-msvc': 16.3.2 + '@next/swc-win32-x64-msvc': 16.3.2 + sharp: 0.35.3(@types/node@20.19.41) transitivePeerDependencies: - '@babel/core' + - '@types/node' - babel-plugin-macros node-domexception@1.0.0: {} @@ -7983,6 +9078,8 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 + nwsapi@2.2.24: {} + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -8070,6 +9167,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + 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 + ora@8.2.0: dependencies: chalk: 5.6.2 @@ -8115,7 +9224,7 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 '@oxc-parser/binding-win32-x64-msvc': 0.127.0 - oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3): optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.19.1 '@oxc-resolver/binding-android-arm64': 11.19.1 @@ -8133,7 +9242,7 @@ snapshots: '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 '@oxc-resolver/binding-linux-x64-musl': 11.19.1 '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3) '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 @@ -8149,6 +9258,10 @@ snapshots: dependencies: p-limit: 3.1.0 + package-json-from-dist@1.0.1: {} + + pako@0.2.9: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -8162,6 +9275,10 @@ snapshots: parse-ms@4.0.0: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} path-browserify@1.0.1: {} @@ -8183,6 +9300,8 @@ snapshots: path-to-regexp@8.4.2: {} + path-type@4.0.0: {} + pathe@2.0.3: {} pathval@2.0.1: {} @@ -8224,6 +9343,8 @@ snapshots: prelude-ls@1.2.1: {} + prettier@2.8.8: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -8234,6 +9355,8 @@ snapshots: dependencies: parse-ms: 4.0.0 + prismjs@1.30.0: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -8250,12 +9373,18 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + psl@1.15.0: + dependencies: + punycode: 2.3.1 + punycode@2.3.1: {} qs@6.15.2: dependencies: side-channel: 1.1.0 + querystringify@2.2.0: {} + queue-microtask@1.2.3: {} range-parser@1.2.1: {} @@ -8267,6 +9396,20 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 + react-aria@3.51.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + '@internationalized/date': 3.12.3 + '@internationalized/number': 3.6.7 + '@internationalized/string': 3.2.10 + '@react-types/shared': 3.36.1(react@19.2.8) + '@swc/helpers': 0.5.23 + aria-hidden: 1.2.6 + clsx: 2.1.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-stately: 3.49.0(react@19.2.8) + use-sync-external-store: 1.6.0(react@19.2.8) + react-docgen-typescript@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -8291,39 +9434,74 @@ snapshots: react: 19.2.4 scheduler: 0.27.0 + react-dom@19.2.8(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + react-is@16.13.1: {} react-is@17.0.2: {} - react-remove-scroll-bar@2.3.8(@types/react@19.2.15)(react@19.2.4): + react-remove-scroll-bar@2.3.8(@types/react@19.2.18)(react@19.2.8): dependencies: - react: 19.2.4 - react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.2.4) + react: 19.2.8 + react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - react-remove-scroll@2.7.2(@types/react@19.2.15)(react@19.2.4): + react-remove-scroll@2.7.2(@types/react@19.2.18)(react@19.2.8): dependencies: - react: 19.2.4 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.15)(react@19.2.4) - react-style-singleton: 2.2.3(@types/react@19.2.15)(react@19.2.4) + react: 19.2.8 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.18)(react@19.2.8) + react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.15)(react@19.2.4) - use-sidecar: 1.1.3(@types/react@19.2.15)(react@19.2.4) + use-callback-ref: 1.3.3(@types/react@19.2.18)(react@19.2.8) + use-sidecar: 1.1.3(@types/react@19.2.18)(react@19.2.8) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 + + react-router-dom@6.30.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + '@remix-run/router': 1.23.2 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-router: 6.30.3(react@19.2.8) - react-style-singleton@2.2.3(@types/react@19.2.15)(react@19.2.4): + react-router@6.30.3(react@19.2.8): + dependencies: + '@remix-run/router': 1.23.2 + react: 19.2.8 + + react-stately@3.49.0(react@19.2.8): + dependencies: + '@internationalized/date': 3.12.3 + '@internationalized/number': 3.6.7 + '@internationalized/string': 3.2.10 + '@react-types/shared': 3.36.1(react@19.2.8) + '@swc/helpers': 0.5.23 + react: 19.2.8 + use-sync-external-store: 1.6.0(react@19.2.8) + + react-style-singleton@2.2.3(@types/react@19.2.18)(react@19.2.8): dependencies: get-nonce: 1.0.1 - react: 19.2.4 + react: 19.2.8 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 react@19.2.4: {} + react@19.2.8: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -8361,6 +9539,8 @@ snapshots: require-from-string@2.0.2: {} + requires-port@1.0.0: {} + reselect@5.2.0: {} resolve-from@4.0.0: {} @@ -8383,6 +9563,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 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -8423,6 +9608,10 @@ snapshots: transitivePeerDependencies: - supports-color + rrweb-cssom@0.7.1: {} + + rrweb-cssom@0.8.0: {} + run-applescript@7.1.0: {} run-parallel@1.2.0: @@ -8437,6 +9626,8 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -8450,12 +9641,18 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scheduler@0.27.0: {} semver@6.3.1: {} semver@7.8.1: {} + semver@7.8.5: {} + send@1.2.1: dependencies: debug: 4.4.3 @@ -8507,7 +9704,7 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@4.8.2(@types/node@20.19.41)(typescript@5.9.3): + shadcn@4.8.2(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(typescript@5.9.3): dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.7 @@ -8519,7 +9716,7 @@ snapshots: browserslist: 4.28.2 commander: 14.0.3 cosmiconfig: 9.0.1(typescript@5.9.3) - dedent: 1.7.2 + dedent: 1.7.2(babel-plugin-macros@3.1.0) deepmerge: 4.3.1 diff: 8.0.4 execa: 9.6.1 @@ -8550,36 +9747,38 @@ snapshots: - supports-color - typescript - sharp@0.34.5: + sharp@0.35.3(@types/node@20.19.41): dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.8.1 + semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@img/sharp-win32-arm64': 0.34.5 - '@img/sharp-win32-ia32': 0.34.5 - '@img/sharp-win32-x64': 0.34.5 + '@img/sharp-darwin-arm64': 0.35.3 + '@img/sharp-darwin-x64': 0.35.3 + '@img/sharp-freebsd-wasm32': 0.35.3 + '@img/sharp-libvips-darwin-arm64': 1.3.2 + '@img/sharp-libvips-darwin-x64': 1.3.2 + '@img/sharp-libvips-linux-arm': 1.3.2 + '@img/sharp-libvips-linux-arm64': 1.3.2 + '@img/sharp-libvips-linux-ppc64': 1.3.2 + '@img/sharp-libvips-linux-riscv64': 1.3.2 + '@img/sharp-libvips-linux-s390x': 1.3.2 + '@img/sharp-libvips-linux-x64': 1.3.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.2 + '@img/sharp-libvips-linuxmusl-x64': 1.3.2 + '@img/sharp-linux-arm': 0.35.3 + '@img/sharp-linux-arm64': 0.35.3 + '@img/sharp-linux-ppc64': 0.35.3 + '@img/sharp-linux-riscv64': 0.35.3 + '@img/sharp-linux-s390x': 0.35.3 + '@img/sharp-linux-x64': 0.35.3 + '@img/sharp-linuxmusl-arm64': 0.35.3 + '@img/sharp-linuxmusl-x64': 0.35.3 + '@img/sharp-webcontainers-wasm32': 0.35.3 + '@img/sharp-win32-arm64': 0.35.3 + '@img/sharp-win32-ia32': 0.35.3 + '@img/sharp-win32-x64': 0.35.3 + '@types/node': 20.19.41 optional: true shebang-command@2.0.0: @@ -8632,6 +9831,8 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.5.7: {} + source-map@0.6.1: {} sqids@0.3.0: {} @@ -8651,10 +9852,10 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@storybook/icons': 2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 @@ -8663,13 +9864,14 @@ snapshots: esbuild: 0.27.7 open: 10.2.0 oxc-parser: 0.127.0 - oxc-resolver: 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + oxc-resolver: 11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3) recast: 0.23.11 semver: 7.8.1 - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.6.0(react@19.2.8) ws: 8.21.0 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 + prettier: 2.8.8 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -8743,6 +9945,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-object@5.0.0: dependencies: get-own-enumerable-keys: 1.0.0 @@ -8771,12 +9977,15 @@ snapshots: strip-json-comments@3.1.1: {} - styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.4): + styled-jsx@5.1.6(@babel/core@7.29.7)(babel-plugin-macros@3.1.0)(react@19.2.8): dependencies: client-only: 0.0.1 - react: 19.2.4 + react: 19.2.8 optionalDependencies: '@babel/core': 7.29.7 + babel-plugin-macros: 3.1.0 + + stylis@4.2.0: {} supports-color@7.2.0: dependencies: @@ -8784,6 +9993,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} + tagged-tag@1.0.0: {} tailwind-merge@3.6.0: {} @@ -8792,6 +10003,8 @@ snapshots: tapable@2.3.3: {} + tiny-inflate@1.0.3: {} + tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -8833,10 +10046,21 @@ snapshots: totalist@3.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 + tough-cookie@6.0.1: dependencies: tldts: 7.4.0 + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -8848,6 +10072,11 @@ snapshots: '@ts-morph/common': 0.27.0 code-block-writer: 13.0.3 + ts-morph@27.0.2: + dependencies: + '@ts-morph/common': 0.28.1 + code-block-writer: 13.0.3 + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -8873,6 +10102,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.20.2: {} + type-fest@5.6.0: dependencies: tagged-tag: 1.0.0 @@ -8929,6 +10160,8 @@ snapshots: typescript@5.9.3: {} + typescript@6.0.3: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -8938,8 +10171,17 @@ snapshots: undici-types@6.21.0: {} + undici@7.29.0: {} + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + unicorn-magic@0.3.0: {} + universalify@0.2.0: {} + universalify@2.0.1: {} unpipe@1.0.0: {} @@ -8992,24 +10234,29 @@ snapshots: uri-template-matcher@1.1.2: {} - use-callback-ref@1.3.3(@types/react@19.2.15)(react@19.2.4): + url-parse@1.5.10: dependencies: - react: 19.2.4 + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-callback-ref@1.3.3(@types/react@19.2.18)(react@19.2.8): + dependencies: + react: 19.2.8 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - use-sidecar@1.1.3(@types/react@19.2.15)(react@19.2.4): + use-sidecar@1.1.3(@types/react@19.2.18)(react@19.2.8): dependencies: detect-node-es: 1.1.0 - react: 19.2.4 + react: 19.2.8 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.18 - use-sync-external-store@1.6.0(react@19.2.4): + use-sync-external-store@1.6.0(react@19.2.8): dependencies: - react: 19.2.4 + react: 19.2.8 util-deprecate@1.0.2: {} @@ -9021,14 +10268,14 @@ snapshots: vary@1.1.2: {} - vite-plugin-storybook-nextjs@3.3.0(next@16.2.6(@babel/core@7.29.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)): + vite-plugin-storybook-nextjs@3.3.0(next@16.3.2(@babel/core@7.29.7)(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)): dependencies: '@next/env': 16.0.0 image-size: 2.0.2 magic-string: 0.30.21 module-alias: 2.3.4 - next: 16.2.6(@babel/core@7.29.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + next: 16.3.2(@babel/core@7.29.7)(@types/node@20.19.41)(babel-plugin-macros@3.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(@testing-library/dom@10.4.1)(@types/react@19.2.18)(prettier@2.8.8)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) ts-dedent: 2.2.0 vite: 8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0) vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) @@ -9060,7 +10307,7 @@ snapshots: fsevents: 2.3.3 jiti: 2.7.0 - vitest@4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)): + vitest@4.1.7(@types/node@20.19.41)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-v8@4.1.7)(jsdom@24.1.3)(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)): dependencies: '@vitest/expect': 4.1.7 '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0)) @@ -9086,13 +10333,35 @@ snapshots: '@types/node': 20.19.41 '@vitest/browser-playwright': 4.1.7(msw@2.14.6(@types/node@20.19.41)(typescript@5.9.3))(playwright@1.60.0)(vite@8.0.14(@types/node@20.19.41)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.7) '@vitest/coverage-v8': 4.1.7(@vitest/browser@4.1.7)(vitest@4.1.7) + jsdom: 24.1.3 transitivePeerDependencies: - msw + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-streams-polyfill@3.3.3: {} + webidl-conversions@7.0.0: {} + webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -9147,6 +10416,10 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -9168,10 +10441,16 @@ snapshots: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@5.0.8: {} yallist@3.1.1: {} + yaml@1.10.3: {} + yargs-parser@21.1.1: {} yargs@17.7.2: @@ -9196,10 +10475,16 @@ snapshots: dependencies: zod: 3.25.76 + zod-validation-error@3.5.4(zod@3.25.58): + dependencies: + zod: 3.25.58 + zod-validation-error@4.0.2(zod@4.4.3): dependencies: zod: 4.4.3 + zod@3.25.58: {} + zod@3.25.76: {} zod@4.4.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 765e9a7..25ec0a9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -8,3 +8,15 @@ allowBuilds: unrs-resolver: true minimumReleaseAgeExclude: - shadcn@4.8.2 + - '@next/env@16.3.2' + - '@next/swc-darwin-arm64@16.3.2' + - '@next/swc-darwin-x64@16.3.2' + - '@next/swc-linux-arm64-gnu@16.3.2' + - '@next/swc-linux-arm64-musl@16.3.2' + - '@next/swc-linux-x64-gnu@16.3.2' + - '@next/swc-linux-x64-musl@16.3.2' + - '@next/swc-win32-arm64-msvc@16.3.2' + - '@next/swc-win32-x64-msvc@16.3.2' + - next@16.3.2 + - '@next/eslint-plugin-next@16.3.2' + - eslint-config-next@16.3.2 diff --git a/registry.json b/registry.json index 34d397d..4ac8e11 100644 --- a/registry.json +++ b/registry.json @@ -13,7 +13,8 @@ "files": [ { "path": "src/app/globals.css", - "type": "registry:file" + "type": "registry:file", + "target": "src/app/globals.css" }, { "path": "src/components/theme-provider.tsx", @@ -38,15 +39,43 @@ "name": "tooltip", "type": "registry:ui", "title": "Tooltip", - "description": "Surfaced tooltip overlay built on Base UI.", - "dependencies": ["@base-ui/react"], + "description": "Regular Scraps collision-aware tooltip with shared delays, overflow detection, and interactive content.", + "dependencies": [ + "@base-ui/react@1.5.0", + "@emotion/react@11.14.0", + "@fontsource/rubik@5.2.8", + "framer-motion@12.38.0" + ], "files": [ + { + "path": "src/components/ui/tooltip.module.css", + "type": "registry:file", + "target": "src/components/ui/tooltip.module.css" + }, { "path": "src/components/ui/tooltip.tsx", "type": "registry:ui" } ] }, + { + "name": "interaction-state-layer", + "type": "registry:ui", + "title": "Interaction State Layer", + "description": "Regular Scraps interaction overlay for hover, press, selected, and expanded states.", + "registryDependencies": ["sentry-base"], + "files": [ + { + "path": "src/components/ui/interaction-state-layer.tsx", + "type": "registry:ui" + }, + { + "path": "src/components/ui/interaction-state-layer.module.css", + "type": "registry:file", + "target": "src/components/ui/interaction-state-layer.module.css" + } + ] + }, { "name": "alert", "type": "registry:ui", @@ -144,13 +173,630 @@ "name": "link", "type": "registry:ui", "title": "Link", - "description": "Styled anchor with accent/muted variants and an external option.", - "dependencies": ["class-variance-authority"], + "description": "Regular Scraps router Link, ExternalLink, and Link behavior context.", + "dependencies": ["@sentry/react@10.69.0", "@types/history@3.2.5", "react-router-dom@6.30.3"], + "cssVars": { + "light": { "scraps-link-disabled": "#878490" }, + "dark": { "scraps-link-disabled": "#958e9f" } + }, "files": [ + { + "path": "src/components/ui/link-behavior-context.tsx", + "type": "registry:ui" + }, { "path": "src/components/ui/link.tsx", "type": "registry:ui" + }, + { + "path": "src/components/ui/tracking-context.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "layout", + "type": "registry:ui", + "title": "Layout", + "description": "Regular Scraps responsive Container, Flex, Grid, Stack, and Surface primitives.", + "dependencies": ["@emotion/is-prop-valid@1.4.0"], + "registryDependencies": [ + "https://scrapscn.sentry.dev/r/sentry-base.json" + ], + "files": [ + { + "path": "src/components/ui/container-query-context.ts", + "type": "registry:ui" + }, + { + "path": "src/components/ui/layout-style-engine.ts", + "type": "registry:ui" + }, + { + "path": "src/components/ui/layout.tsx", + "type": "registry:ui" + }, + { + "path": "src/components/ui/separator.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "separator", + "type": "registry:ui", + "title": "Separator", + "description": "Regular Scraps native horizontal or vertical separator.", + "dependencies": ["@emotion/is-prop-valid"], + "registryDependencies": [ + "https://scrapscn.sentry.dev/r/sentry-base.json" + ], + "files": [ + { + "path": "src/components/ui/container-query-context.ts", + "type": "registry:ui" + }, + { + "path": "src/components/ui/layout-style-engine.ts", + "type": "registry:ui" + }, + { + "path": "src/components/ui/separator.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "quote", + "type": "registry:ui", + "title": "Quote", + "description": "Regular Scraps semantic extended quotation with an optional source attribution and citation.", + "registryDependencies": [ + "https://scrapscn.sentry.dev/r/layout.json", + "https://scrapscn.sentry.dev/r/text.json" + ], + "files": [ + { + "path": "src/components/ui/quote.module.css", + "type": "registry:file", + "target": "src/components/ui/quote.module.css" + }, + { + "path": "src/components/ui/quote.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "empty-state", + "type": "registry:ui", + "title": "Empty State", + "description": "Regular Scraps responsive no-content layout with optional illustration, description, and action.", + "registryDependencies": [ + "https://scrapscn.sentry.dev/r/layout.json", + "https://scrapscn.sentry.dev/r/text.json" + ], + "files": [ + { + "path": "src/components/ui/empty-state.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "loader", + "type": "registry:ui", + "title": "Indeterminate Loader", + "description": "Regular Scraps animated squiggle progress indicator with optional loading messages.", + "dependencies": ["@react-aria/utils@3.34.1", "framer-motion@12.38.0"], + "registryDependencies": ["https://scrapscn.sentry.dev/r/layout.json", "https://scrapscn.sentry.dev/r/text.json"], + "files": [ + {"path": "src/components/ui/loader.module.css", "type": "registry:file", "target": "src/components/ui/loader.module.css"}, + {"path": "src/components/ui/loader.tsx", "type": "registry:ui"} + ] + }, + { + "name": "slide-over-panel", + "type": "registry:ui", + "title": "Slide Over Panel", + "description": "Regular Scraps complementary panel with deferred opening content and responsive placements.", + "dependencies": ["framer-motion@12.38.0"], + "registryDependencies": [], + "cssVars": { + "light": { + "scraps-slide-over-background": "#ffffff", + "scraps-slide-over-content": "#302e36", + "scraps-slide-over-shadow": "0px 4px 0px 2px #10103008, 0px 1px 0px 1px #10103008" + }, + "dark": { + "scraps-slide-over-background": "#393442", + "scraps-slide-over-content": "#e7e5ea", + "scraps-slide-over-shadow": "0px 4px 0px 2px #0000181a, 0px 1px 0px 1px #0000181a" + } + }, + "files": [ + { "path": "src/components/ui/boundary-context.tsx", "type": "registry:file", "target": "src/components/ui/boundary-context.tsx" }, + { "path": "src/components/ui/slide-over-panel.module.css", "type": "registry:file", "target": "src/components/ui/slide-over-panel.module.css" }, + { "path": "src/components/ui/slide-over-panel-environment.tsx", "type": "registry:file", "target": "src/components/ui/slide-over-panel-environment.tsx" }, + { "path": "src/components/ui/slide-over-panel.tsx", "type": "registry:ui" } + ] + }, + { + "name": "drag-handle", + "type": "registry:ui", + "title": "Drag Handle", + "description": "Self-contained regular Scraps keyboard and pointer separator for resizable panes with merge-safe theme tokens.", + "dependencies": [ + "@emotion/is-prop-valid", + "@react-aria/interactions@3.28.1", + "@react-aria/utils@3.34.1" + ], + "registryDependencies": [], + "cssVars": { + "theme": { + "duration-slow": "240ms", + "ease-smooth": "cubic-bezier(0.72, 0, 0.16, 1)" + }, + "light": { + "scraps-theme-border-primary": "#dad9de" + }, + "dark": { + "scraps-theme-border-primary": "#141119" + } + }, + "files": [ + { + "path": "src/components/ui/container-query-context.ts", + "type": "registry:ui" + }, + { + "path": "src/components/ui/drag-handle.module.css", + "type": "registry:file", + "target": "src/components/ui/drag-handle.module.css" + }, + { + "path": "src/components/ui/drag-handle.tsx", + "type": "registry:ui" + }, + { + "path": "src/components/ui/layout-style-engine.ts", + "type": "registry:ui" + }, + { + "path": "src/components/ui/layout.tsx", + "type": "registry:ui" + }, + { + "path": "src/components/ui/separator.tsx", + "type": "registry:ui" + }, + { + "path": "src/components/ui/use-drag-move.tsx", + "type": "registry:ui" + }, + { + "path": "src/components/ui/use-drag-separator.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "slot", + "type": "registry:ui", + "title": "Slot", + "description": "Regular Scraps typed portal slots with outlet fallbacks and logical size and container-query context bridging.", + "dependencies": ["@sentry/react@10.69.0"], + "files": [ + { + "path": "src/components/ui/container-query-context.ts", + "type": "registry:ui" + }, + { + "path": "src/components/ui/size-context.tsx", + "type": "registry:ui" + }, + { + "path": "src/components/ui/slot.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "split-panel", + "type": "registry:ui", + "title": "Split Panel", + "description": "Regular Scraps two-pane layout with a resizable sized pane and keyboard-accessible divider.", + "dependencies": [ + "@emotion/is-prop-valid@1.4.0", + "@react-aria/interactions@3.28.1", + "@react-aria/utils@3.34.1" + ], + "registryDependencies": [], + "cssVars": { + "theme": { + "duration-slow": "240ms", + "ease-smooth": "cubic-bezier(0.72, 0, 0.16, 1)" + }, + "light": { + "scraps-theme-border-primary": "#dad9de" + }, + "dark": { + "scraps-theme-border-primary": "#141119" + } + }, + "files": [ + { "path": "src/components/ui/container-query-context.ts", "type": "registry:ui" }, + { "path": "src/components/ui/drag-handle.module.css", "type": "registry:file", "target": "src/components/ui/drag-handle.module.css" }, + { "path": "src/components/ui/drag-handle.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/layout-style-engine.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/separator.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/split-panel.module.css", "type": "registry:file", "target": "src/components/ui/split-panel.module.css" }, + { "path": "src/components/ui/split-panel.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/use-drag-move.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/use-drag-separator.tsx", "type": "registry:ui" } + ] + }, + { + "name": "table", + "type": "registry:ui", + "title": "Table", + "description": "Regular Scraps CSS-grid table with sortable headers and accessible resizable columns.", + "dependencies": [ + "@base-ui/react@1.5.0", + "@emotion/is-prop-valid@1.4.0", + "@react-aria/interactions@3.28.1", + "@react-aria/utils@3.34.1" + ], + "registryDependencies": [], + "cssVars": { + "theme": { + "duration-slow": "240ms", + "ease-smooth": "cubic-bezier(0.72, 0, 0.16, 1)" + }, + "light": { + "scraps-theme-border-primary": "#dad9de", + "scraps-theme-border-secondary": "#e6e6e9" + }, + "dark": { + "scraps-theme-border-primary": "#141119", + "scraps-theme-border-secondary": "#1b1821" + } + }, + "files": [ + { "path": "src/components/ui/container-query-context.ts", "type": "registry:ui" }, + { "path": "src/components/ui/drag-handle.module.css", "type": "registry:file", "target": "src/components/ui/drag-handle.module.css" }, + { "path": "src/components/ui/drag-handle.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/layout-style-engine.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/separator.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/table.module.css", "type": "registry:file", "target": "src/components/ui/table.module.css" }, + { "path": "src/components/ui/table.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/use-drag-move.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/use-drag-separator.tsx", "type": "registry:ui" } + ] + }, + { + "name": "status-indicator", + "type": "registry:ui", + "title": "Status Indicator", + "description": "Regular Scraps status dot with accessible finite and infinite pulse states.", + "dependencies": ["@emotion/is-prop-valid@1.4.0"], + "registryDependencies": [], + "cssVars": { + "light": { + "scraps-status-accent-dot": "#7553ff", + "scraps-status-accent-pulse": "#0008f012", + "scraps-status-danger-dot": "#ff002b", + "scraps-status-danger-pulse": "#f828081c", + "scraps-status-warning-dot": "#ffce00", + "scraps-status-warning-pulse": "#e0b01030", + "scraps-status-success-dot": "#00f261", + "scraps-status-success-pulse": "#00b8001c", + "scraps-status-promotion-dot": "#fc5cb4", + "scraps-status-promotion-pulse": "#f000901a", + "scraps-status-muted-dot": "#c0bec6", + "scraps-status-muted-pulse": "#0000200f" + }, + "dark": { + "scraps-status-accent-dot": "#7553ff", + "scraps-status-accent-pulse": "#4828b894", + "scraps-status-danger-dot": "#ff002b", + "scraps-status-danger-pulse": "#f8000033", + "scraps-status-warning-dot": "#ffce00", + "scraps-status-warning-pulse": "#e8380029", + "scraps-status-success-dot": "#00f261", + "scraps-status-success-pulse": "#00f8001f", + "scraps-status-promotion-dot": "#ff45a8", + "scraps-status-promotion-pulse": "#f800782e", + "scraps-status-muted-dot": "#898294", + "scraps-status-muted-pulse": "#c0a8f81a" + } + }, + "files": [ + { "path": "src/components/ui/container-query-context.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout-style-engine.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/separator.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/status-indicator.module.css", "type": "registry:file", "target": "src/components/ui/status-indicator.module.css" }, + { "path": "src/components/ui/status-indicator.tsx", "type": "registry:ui" } + ] + }, + { + "name": "reveal-on-hover", + "type": "registry:ui", + "title": "Reveal On Hover", + "description": "Regular Scraps hover and focus action reveal primitive.", + "dependencies": ["@emotion/is-prop-valid@1.4.0"], + "registryDependencies": [], + "cssVars": { + "theme": { + "duration-fast": "120ms", + "duration-moderate": "160ms", + "ease-enter": "cubic-bezier(0.24, 1, 0.32, 1)", + "ease-exit": "cubic-bezier(0.64, 0, 0.8, 0)" + } + }, + "files": [ + { "path": "src/components/ui/container-query-context.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout-style-engine.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/reveal-on-hover.module.css", "type": "registry:file", "target": "src/components/ui/reveal-on-hover.module.css" }, + { "path": "src/components/ui/reveal-on-hover.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/separator.tsx", "type": "registry:ui" } + ] + }, + { + "name": "hotkey", + "type": "registry:ui", + "title": "Hotkey", + "description": "Regular Scraps platform-aware keyboard shortcut display and document listener.", + "dependencies": [ + "@fontsource-variable/roboto-mono@5.2.9", + "@react-aria/utils@3.34.1", + "@sentry/react@10.69.0" + ], + "registryDependencies": [], + "cssVars": { + "light": { + "scraps-hotkey-background-primary": "#ffffff", + "scraps-hotkey-background-secondary": "#f8f8f9", + "scraps-hotkey-border-primary": "#dad9de", + "scraps-hotkey-content-primary": "#302e36", + "scraps-hotkey-content-secondary": "#6a6772" + }, + "dark": { + "scraps-hotkey-background-primary": "#2e2936", + "scraps-hotkey-background-secondary": "#24202b", + "scraps-hotkey-border-primary": "#141119", + "scraps-hotkey-content-primary": "#e7e5ea", + "scraps-hotkey-content-secondary": "#b5b0bd" } + }, + "files": [ + { + "path": "src/components/ui/roboto-mono.css", + "type": "registry:file", + "target": "src/components/ui/roboto-mono.css" + }, + { + "path": "src/components/ui/hotkey.module.css", + "type": "registry:file", + "target": "src/components/ui/hotkey.module.css" + }, + { + "path": "src/components/ui/hotkey.tsx", + "type": "registry:ui" + } + ] + }, + { + "name": "image", + "type": "registry:ui", + "title": "Image", + "description": "Regular Scraps native image with responsive dimensions and radius.", + "dependencies": ["@emotion/is-prop-valid@1.4.0"], + "registryDependencies": [], + "cssVars": { + "light": { + "scraps-theme-border-primary": "#dad9de", + "scraps-theme-border-secondary": "#e6e6e9" + }, + "dark": { + "scraps-theme-border-primary": "#141119", + "scraps-theme-border-secondary": "#1b1821" + } + }, + "files": [ + { "path": "src/components/ui/container-query-context.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout-style-engine.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/separator.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/image.tsx", "type": "registry:ui" } + ] + }, + { + "name": "backdrop", + "type": "registry:ui", + "title": "Backdrop", + "description": "Regular Scraps animated overlay for drawers and modals.", + "dependencies": ["framer-motion@12.38.0"], + "registryDependencies": [], + "cssVars": { + "light": { + "scraps-backdrop-background": "#10082845" + }, + "dark": { + "scraps-backdrop-background": "#10082080" + } + }, + "files": [ + { "path": "src/components/ui/backdrop.tsx", "type": "registry:ui" } + ] + }, + { + "name": "code", + "type": "registry:ui", + "title": "Code", + "description": "Regular Scraps block and inline code with lazy Prism language highlighting.", + "dependencies": [ + "@base-ui/react@1.5.0", + "@emotion/serialize@1.3.3", + "@fontsource-variable/roboto-mono@5.2.9", + "@fontsource/rubik@5.2.8", + "@types/prismjs@1.26.0", + "prismjs@1.30.0" + ], + "registryDependencies": [], + "cssVars": { + "light": { + "scraps-theme-border-primary": "#dad9de", + "scraps-inline-code-content": "#c8007e", + "scraps-inline-code-background": "#f000901a", + "scraps-inline-code-neutral-content": "#302e36", + "scraps-inline-code-neutral-background": "#0000200f", + "scraps-code-accent": "#7553ff", + "scraps-code-button-active": "#0000181a", + "scraps-code-button-hover": "#0000200f", + "scraps-code-focus": "#7553ff", + "scraps-code-focus-mask": "#ffffff", + "scraps-code-tooltip-background": "#ffffff", + "scraps-code-tooltip-arrow-background": "#ffffff", + "scraps-code-tooltip-content": "#302e36", + "prism-base": "#302e36", + "prism-block-background": "#f8f8f9", + "prism-comment": "#6a6772", + "prism-function": "#653de9", + "prism-highlight-accent": "#00002026", + "prism-highlight-background": "#0000200f", + "prism-keyword": "#d50000", + "prism-operator": "#653de9", + "prism-property": "#653de9", + "prism-punctuation": "#302e36", + "prism-selector": "#008900", + "prism-variable": "#302e36" + }, + "dark": { + "scraps-theme-border-primary": "#141119", + "scraps-inline-code-content": "#ea95b9", + "scraps-inline-code-background": "#f800782e", + "scraps-inline-code-neutral-content": "#e7e5ea", + "scraps-inline-code-neutral-background": "#c0a8f81a", + "scraps-code-accent": "#7553ff", + "scraps-code-button-active": "#d0b8f821", + "scraps-code-button-hover": "#c0a8f81a", + "scraps-code-focus": "#7553ff", + "scraps-code-focus-mask": "#2e2936", + "scraps-code-tooltip-background": "#393442", + "scraps-code-tooltip-arrow-background": "#2e2936", + "scraps-code-tooltip-content": "#e7e5ea", + "prism-base": "#e7e5ea", + "prism-block-background": "#24202b", + "prism-comment": "#b5b0bd", + "prism-function": "#aba8f8", + "prism-highlight-accent": "#c0b0f02e", + "prism-highlight-background": "#c0a8f81a", + "prism-keyword": "#f6938c", + "prism-operator": "#aba8f8", + "prism-property": "#aba8f8", + "prism-punctuation": "#e7e5ea", + "prism-selector": "#5ece73", + "prism-variable": "#e7e5ea" + } + }, + "files": [ + { + "path": "THIRD_PARTY_NOTICES.md", + "type": "registry:file", + "target": "src/components/ui/SENTRY_SOURCE_NOTICE.md" + }, + { + "path": "src/components/ui/roboto-mono.css", + "type": "registry:file", + "target": "src/components/ui/roboto-mono.css" + }, + { + "path": "src/components/ui/code.module.css", + "type": "registry:file", + "target": "src/components/ui/code.module.css" + }, + { "path": "src/components/ui/code-block.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/code-messages.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/code.tsx", "type": "registry:ui" }, + { + "path": "src/components/ui/prism-language-loaders.ts", + "type": "registry:ui" + }, + { + "path": "src/components/ui/prism-language-reloaders.d.ts", + "type": "registry:file", + "target": "src/components/ui/prism-language-reloaders.d.ts" + }, + { + "path": "src/components/ui/prism-language-reloaders.js", + "type": "registry:file", + "target": "src/components/ui/prism-language-reloaders.js" + }, + { + "path": "src/components/ui/prism-plugin.d.ts", + "type": "registry:ui" + }, + { "path": "src/components/ui/prism.ts", "type": "registry:ui" } + ] + }, + { + "name": "text", + "type": "registry:ui", + "title": "Text", + "description": "Regular Scraps Text, Heading, and Prose primitives.", + "dependencies": [ + "@emotion/is-prop-valid@1.4.0", + "@fontsource-variable/roboto-mono@5.2.9" + ], + "registryDependencies": [ + "https://scrapscn.sentry.dev/r/code.json" + ], + "cssVars": { + "light": { + "scraps-content-primary": "#302e36", + "scraps-content-secondary": "#6a6772", + "scraps-content-accent": "#653de9", + "scraps-content-promotion": "#c8007e", + "scraps-content-danger": "#d50000", + "scraps-content-warning": "#a45200", + "scraps-content-success": "#008900", + "scraps-hotkey-background-primary": "#ffffff", + "scraps-hotkey-background-secondary": "#f8f8f9", + "scraps-hotkey-border-primary": "#dad9de", + "scraps-hotkey-content-primary": "#302e36", + "scraps-hotkey-content-secondary": "#6a6772" + }, + "dark": { + "scraps-content-primary": "#e7e5ea", + "scraps-content-secondary": "#b5b0bd", + "scraps-content-accent": "#aba8f8", + "scraps-content-promotion": "#ea95b9", + "scraps-content-danger": "#f6938c", + "scraps-content-warning": "#ffce00", + "scraps-content-success": "#5ece73", + "scraps-hotkey-background-primary": "#2e2936", + "scraps-hotkey-background-secondary": "#24202b", + "scraps-hotkey-border-primary": "#141119", + "scraps-hotkey-content-primary": "#e7e5ea", + "scraps-hotkey-content-secondary": "#b5b0bd" + } + }, + "files": [ + { "path": "src/components/ui/roboto-mono.css", "type": "registry:file", "target": "src/components/ui/roboto-mono.css" }, + { "path": "src/components/ui/text.module.css", "type": "registry:file", "target": "src/components/ui/text.module.css" }, + { "path": "src/components/ui/container-query-context.ts", "type": "registry:ui" }, + { "path": "src/components/ui/layout-style-engine.ts", "type": "registry:ui" }, + { "path": "src/components/ui/kbd-styles.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/text-style-engine.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/text.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/heading.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/prose.tsx", "type": "registry:ui" }, + { "path": "src/components/ui/text-index.ts", "type": "registry:ui" } ] } ] diff --git a/scraps-parity.json b/scraps-parity.json new file mode 100644 index 0000000..e0bc027 --- /dev/null +++ b/scraps-parity.json @@ -0,0 +1,2623 @@ +{ + "schemaVersion": 1, + "canonical": { + "repository": "getsentry/sentry", + "commit": "d91f823d232ddd12a4d2a64554d85fd36df0e278", + "root": "static/app/components/core", + "excludedDirectories": [ + "overview", + "patterns", + "principles" + ] + }, + "scope": { + "targetModuleCount": 48, + "outOfScopeLocalComponents": [ + "src/components/ui/boundary-context.tsx", + "src/components/ui/card.tsx", + "src/components/ui/command.tsx", + "src/components/ui/dialog.tsx", + "src/components/ui/dropdown-menu.tsx", + "src/components/ui/label.tsx", + "src/components/ui/link-playground-adapter.tsx", + "src/components/ui/progress.tsx", + "src/components/ui/scroll-area.tsx", + "src/components/ui/sheet.tsx", + "src/components/ui/size-context.tsx", + "src/components/ui/slide-over-panel-environment.tsx" + ] + }, + "modules": [ + { + "name": "alert", + "canonical": { + "indexPath": "static/app/components/core/alert/index.tsx", + "sourcePaths": [ + "static/app/components/core/alert/alert.tsx", + "static/app/components/core/alert/alertLink.tsx", + "static/app/components/core/alert/index.tsx" + ], + "publicExports": { + "runtime": [ + "Alert", + "AlertLink" + ], + "types": [ + "AlertProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/alert.tsx" + ], + "implementedExports": { + "runtime": [ + "Alert", + "AlertDescription", + "AlertLink", + "AlertTitle" + ], + "types": [ + "AlertLinkProps", + "AlertProps" + ] + }, + "registryItems": [ + "alert" + ], + "stories": [ + "src/components/ui/alert.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=6943-13522" + ], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "avatar", + "canonical": { + "indexPath": "static/app/components/core/avatar/index.tsx", + "sourcePaths": [ + "static/app/components/core/avatar/actorAvatar.tsx", + "static/app/components/core/avatar/avatar.tsx", + "static/app/components/core/avatar/avatarList.tsx", + "static/app/components/core/avatar/docIntegrationAvatar.tsx", + "static/app/components/core/avatar/imageAvatar/imageAvatar.tsx", + "static/app/components/core/avatar/index.tsx", + "static/app/components/core/avatar/letterAvatar/letterAvatar.tsx", + "static/app/components/core/avatar/organizationAvatar.tsx", + "static/app/components/core/avatar/projectAvatar.tsx", + "static/app/components/core/avatar/sentryAppAvatar.tsx", + "static/app/components/core/avatar/teamAvatar.tsx", + "static/app/components/core/avatar/useAvatar.ts", + "static/app/components/core/avatar/userAvatar.tsx" + ], + "publicExports": { + "runtime": [ + "ActorAvatar", + "Avatar", + "AvatarList", + "CollapsedAvatars", + "DocIntegrationAvatar", + "ImageAvatar", + "LetterAvatar", + "OrganizationAvatar", + "ProjectAvatar", + "SentryAppAvatar", + "TeamAvatar", + "UserAvatar", + "useAvatar" + ], + "types": [ + "ActorAvatarProps", + "AvatarProps", + "BaseAvatarProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/avatar.tsx" + ], + "implementedExports": { + "runtime": [ + "Avatar", + "AvatarBadge", + "AvatarFallback", + "AvatarGroup", + "AvatarGroupCount", + "AvatarImage" + ], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "avatarButton", + "canonical": { + "indexPath": "static/app/components/core/avatarButton/index.tsx", + "sourcePaths": [ + "static/app/components/core/avatarButton/avatarButton.tsx", + "static/app/components/core/avatarButton/index.tsx" + ], + "publicExports": { + "runtime": [ + "AvatarButton" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local avatar-button implementation is mapped." + } + }, + { + "name": "backdrop", + "canonical": { + "indexPath": "static/app/components/core/backdrop/index.tsx", + "sourcePaths": [ + "static/app/components/core/backdrop/backdrop.tsx", + "static/app/components/core/backdrop/index.tsx", + "static/app/utils/theme/theme.tsx" + ], + "publicExports": { + "runtime": [ + "Backdrop" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/backdrop.tsx" + ], + "implementedExports": { + "runtime": [ + "Backdrop" + ], + "types": [] + }, + "registryItems": [ + "backdrop" + ], + "stories": [ + "src/components/ui/backdrop.stories.tsx" + ], + "tests": [ + "src/components/ui/backdrop.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/backdrop.test.mjs", + "tests/types/backdrop-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=backdrop" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps Backdrop overlay geometry, theme colors, layer values, motion, focused assertions, workbench, and self-contained registry delivery are present. The canonical module has no Figma component." + } + }, + { + "name": "badge", + "canonical": { + "indexPath": "static/app/components/core/badge/index.tsx", + "sourcePaths": [ + "static/app/components/core/badge/alertBadge.tsx", + "static/app/components/core/badge/badge.tsx", + "static/app/components/core/badge/deployBadge.tsx", + "static/app/components/core/badge/featureBadge.tsx", + "static/app/components/core/badge/index.tsx", + "static/app/components/core/badge/projectsBadge.tsx", + "static/app/components/core/badge/tag.tsx" + ], + "publicExports": { + "runtime": [ + "AlertBadge", + "Badge", + "DeployBadge", + "FeatureBadge", + "ProjectsBadge", + "Tag" + ], + "types": [ + "FeatureBadgeProps", + "TagProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/badge.tsx", + "src/components/ui/feature-badge.tsx", + "src/components/ui/tag.tsx" + ], + "implementedExports": { + "runtime": [ + "Badge", + "FeatureBadge", + "Tag", + "badgeVariants", + "tagVariants" + ], + "types": [] + }, + "registryItems": [ + "badge", + "feature-badge", + "tag" + ], + "stories": [ + "src/components/ui/badge.stories.tsx", + "src/components/ui/feature-badge.stories.tsx", + "src/components/ui/tag.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3574-5396", + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3574-5698" + ], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "breadcrumbList", + "canonical": { + "indexPath": "static/app/components/core/breadcrumbList/index.tsx", + "sourcePaths": [ + "static/app/components/core/breadcrumbList/breadcrumbList.tsx", + "static/app/components/core/breadcrumbList/index.tsx" + ], + "publicExports": { + "runtime": [ + "BreadcrumbList" + ], + "types": [ + "BreadcrumbTitleItem" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local breadcrumb-list implementation is mapped." + } + }, + { + "name": "button", + "canonical": { + "indexPath": "static/app/components/core/button/index.tsx", + "sourcePaths": [ + "static/app/components/core/button/button.tsx", + "static/app/components/core/button/buttonBar.tsx", + "static/app/components/core/button/index.tsx", + "static/app/components/core/button/linkButton.tsx", + "static/app/components/core/button/styles.tsx" + ], + "publicExports": { + "runtime": [ + "Button", + "ButtonBar", + "DO_NOT_USE_getButtonStyles", + "LinkButton" + ], + "types": [ + "ButtonBarProps", + "ButtonProps", + "LinkButtonProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/button.tsx" + ], + "implementedExports": { + "runtime": [ + "Button", + "buttonVariants" + ], + "types": [ + "ButtonProps" + ] + }, + "registryItems": [ + "button" + ], + "stories": [ + "src/components/ui/button.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=384-2119" + ], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "chat", + "canonical": { + "indexPath": "static/app/components/core/chat/index.tsx", + "sourcePaths": [ + "static/app/components/core/chat/assistantActions.tsx", + "static/app/components/core/chat/assistantMessage.tsx", + "static/app/components/core/chat/index.tsx", + "static/app/components/core/chat/messageRow.tsx", + "static/app/components/core/chat/spinner.tsx", + "static/app/components/core/chat/thinkingBlock.tsx", + "static/app/components/core/chat/toolCallIndicator.tsx", + "static/app/components/core/chat/userMessage.tsx" + ], + "publicExports": { + "runtime": [ + "AssistantActions", + "AssistantMessage", + "MessageRow", + "Spinner", + "ThinkingBlock", + "ToolCallIndicator", + "UserMessage" + ], + "types": [ + "ToolCallStatus" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local chat implementation is mapped." + } + }, + { + "name": "checkbox", + "canonical": { + "indexPath": "static/app/components/core/checkbox/index.tsx", + "sourcePaths": [ + "static/app/components/core/checkbox/checkbox.tsx", + "static/app/components/core/checkbox/index.tsx" + ], + "publicExports": { + "runtime": [ + "Checkbox" + ], + "types": [ + "CheckboxProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/checkbox.tsx" + ], + "implementedExports": { + "runtime": [ + "Checkbox" + ], + "types": [ + "CheckboxProps" + ] + }, + "registryItems": [], + "stories": [ + "src/components/ui/checkbox.stories.tsx" + ], + "tests": [ + "tests/e2e/playground.spec.ts", + "tests/e2e/templates.spec.ts", + "tests/figma/figma-preview.test.mjs" + ], + "codeConnect": [ + "src/components/ui/checkbox.figma.ts" + ], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3481-4211" + ], + "playgroundPath": "/?component=checkbox" + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "chip", + "canonical": { + "indexPath": "static/app/components/core/chip/index.tsx", + "sourcePaths": [ + "static/app/components/core/chip/chip.tsx", + "static/app/components/core/chip/index.tsx" + ], + "publicExports": { + "runtime": [ + "Chip" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local chip implementation is mapped." + } + }, + { + "name": "code", + "canonical": { + "indexPath": "static/app/components/core/code/index.tsx", + "sourcePaths": [ + "static/app/components/core/button/button.tsx", + "static/app/components/core/button/styles.tsx", + "static/app/components/core/button/types.tsx", + "static/app/components/core/button/useButtonFunctionality.tsx", + "static/app/components/core/code/codeBlock.tsx", + "static/app/components/core/code/index.tsx", + "static/app/components/core/code/inlineCode.tsx", + "static/app/components/core/layout/container.tsx", + "static/app/components/core/layout/index.tsx", + "static/app/components/core/layout/styles.tsx", + "static/app/components/core/tooltip/tooltip.tsx", + "static/app/components/overlay.tsx", + "static/app/components/overlayArrow.tsx", + "static/app/icons/iconCopy.tsx", + "static/app/icons/svgIcon.tsx", + "static/app/icons/useIconDefaults.tsx", + "static/app/locale.tsx", + "static/app/styles/global.tsx", + "static/app/utils/prism.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/scraps/tokens/typography.tsx", + "static/app/utils/theme/theme.tsx", + "static/app/utils/useHoverOverlay.tsx" + ], + "publicExports": { + "runtime": [ + "CodeBlock", + "InlineCode", + "inlineCodeStyles" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/code-block.tsx", + "src/components/ui/code-messages.tsx", + "src/components/ui/code.tsx" + ], + "implementedExports": { + "runtime": [ + "CodeBlock", + "CodeMessagesProvider", + "InlineCode", + "defaultCodeMessages", + "inlineCodeStyles", + "useCodeMessages" + ], + "types": [ + "CodeMessages" + ] + }, + "registryItems": [ + "code" + ], + "stories": [ + "src/components/ui/code.stories.tsx" + ], + "tests": [ + "src/components/ui/code.test.tsx", + "src/components/ui/prism-concurrent.test.ts", + "src/components/ui/prism.test.ts", + "tests/e2e/playground.spec.ts", + "tests/parity/code.test.mjs", + "tests/types/code-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=code" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps CodeBlock, InlineCode, reusable inline style recipe, translatable copy messages, Prism language loading, Sentry source notice, executable Storybook state assertions, workbench, and self-contained registry delivery are present. The canonical module has no Figma component." + } + }, + { + "name": "compactSelect", + "canonical": { + "indexPath": "static/app/components/core/compactSelect/index.tsx", + "sourcePaths": [ + "static/app/components/core/compactSelect/compactSelect.tsx", + "static/app/components/core/compactSelect/composite.tsx", + "static/app/components/core/compactSelect/control.tsx", + "static/app/components/core/compactSelect/highlightText.tsx", + "static/app/components/core/compactSelect/index.tsx", + "static/app/components/core/compactSelect/list.tsx", + "static/app/components/core/compactSelect/listBox/index.tsx", + "static/app/components/core/compactSelect/menuComponents.tsx", + "static/app/components/core/compactSelect/styles.tsx", + "static/app/components/core/compactSelect/types.tsx", + "static/app/components/core/compactSelect/useVirtualizedItems.tsx", + "static/app/components/core/compactSelect/utils.tsx" + ], + "publicExports": { + "runtime": [ + "CompactSelect", + "CompositeSelect", + "ControlContext", + "HighlightText", + "LeadWrap", + "ListBox", + "ListLabel", + "ListSeparator", + "ListWrap", + "MenuComponents", + "SectionGroup", + "SectionHeader", + "SectionSeparator", + "SectionTitle", + "SectionToggle", + "SectionWrap", + "SelectFilterContext", + "SizeLimitMessage", + "TriggerLabel", + "getDisabledOptions", + "getEscapedKey", + "getHiddenOptions", + "getItemsWithKeys", + "itemIsSectionWithKey", + "useVirtualizedItems" + ], + "types": [ + "MultipleSelectProps", + "SearchMatchResult", + "SelectKey", + "SelectOption", + "SelectOptionOrSection", + "SelectOptionOrSectionWithKey", + "SelectOptionWithKey", + "SelectProps", + "SelectSection", + "SelectSectionWithKey", + "SingleSelectProps" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local compact-select implementation is mapped." + } + }, + { + "name": "disclosure", + "canonical": { + "indexPath": "static/app/components/core/disclosure/index.tsx", + "sourcePaths": [ + "static/app/components/core/disclosure/disclosure.tsx", + "static/app/components/core/disclosure/index.tsx" + ], + "publicExports": { + "runtime": [ + "Disclosure" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local disclosure implementation is mapped." + } + }, + { + "name": "dragHandle", + "canonical": { + "indexPath": "static/app/components/core/dragHandle/index.tsx", + "sourcePaths": [ + "static/app/components/core/dragHandle/dragHandle.tsx", + "static/app/components/core/dragHandle/index.tsx", + "static/app/components/core/dragHandle/useDragMove.tsx", + "static/app/components/core/dragHandle/useDragSeparator.tsx" + ], + "publicExports": { + "runtime": [ + "DRAG_HANDLE_SIZE", + "DRAG_SEPARATOR_TARGET_SIZE", + "DragHandle", + "useDragMove", + "useDragSeparator" + ], + "types": [ + "DragHandleVariant" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/drag-handle.tsx", + "src/components/ui/use-drag-move.tsx", + "src/components/ui/use-drag-separator.tsx" + ], + "implementedExports": { + "runtime": [ + "DRAG_HANDLE_SIZE", + "DRAG_SEPARATOR_TARGET_SIZE", + "DragHandle", + "useDragMove", + "useDragSeparator" + ], + "types": [ + "DragHandleVariant" + ] + }, + "registryItems": [ + "drag-handle" + ], + "stories": [ + "src/components/ui/drag-handle.stories.tsx" + ], + "tests": [ + "src/components/ui/drag-handle.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/drag-handle.test.mjs" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=drag-handle" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps drag handle contract, pointer and keyboard behavior, focused assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "drawer", + "canonical": { + "indexPath": "static/app/components/core/drawer/index.tsx", + "sourcePaths": [ + "static/app/components/core/drawer/components.tsx", + "static/app/components/core/drawer/index.tsx" + ], + "publicExports": { + "runtime": [ + "DrawerBody", + "DrawerHeader", + "GlobalDrawer", + "useDrawer", + "useDrawerContentContext" + ], + "types": [ + "DrawerConfig", + "DrawerOptions" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local drawer implementation is mapped." + } + }, + { + "name": "emptyState", + "canonical": { + "indexPath": "static/app/components/core/emptyState/index.tsx", + "sourcePaths": [ + "static/app/components/core/emptyState/emptyState.mdx", + "static/app/components/core/emptyState/emptyState.tsx", + "static/app/components/core/emptyState/index.tsx", + "static/app/components/core/layout/container.tsx", + "static/app/components/core/layout/flex.tsx", + "static/app/components/core/layout/index.tsx", + "static/app/components/core/layout/stack.tsx", + "static/app/components/core/layout/styles.tsx", + "static/app/components/core/text/heading.tsx", + "static/app/components/core/text/index.tsx", + "static/app/components/core/text/styles.tsx", + "static/app/components/core/text/text.tsx", + "static/app/utils/theme/index.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/scraps/tokens/typography.tsx", + "static/app/utils/theme/theme.tsx", + "static/app/utils/theme/types.tsx" + ], + "publicExports": { + "runtime": [ + "EmptyState" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/empty-state.tsx" + ], + "implementedExports": { + "runtime": [ + "EmptyState" + ], + "types": [] + }, + "registryItems": [ + "empty-state" + ], + "stories": [ + "src/components/ui/empty-state.stories.tsx" + ], + "tests": [ + "src/app/evidence/empty-state-server/page.tsx", + "src/components/ui/empty-state.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/empty-state.test.mjs", + "tests/types/empty-state-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=13363-6895" + ], + "playgroundPath": "/?component=empty-state" + }, + "completion": { + "state": "partial", + "complete": false, + "note": "The local EmptyState implementation, workbench, focused tests, and intended registry dependency URLs are present. Figma, Code Connect, and installation from the protected shared registry have not been verified." + } + }, + { + "name": "form", + "canonical": { + "indexPath": "static/app/components/core/form/index.ts", + "sourcePaths": [ + "static/app/components/core/form/FormSearch.tsx", + "static/app/components/core/form/autoSaveContext.tsx", + "static/app/components/core/form/autoSaveForm.tsx", + "static/app/components/core/form/generatedFieldRegistry.ts", + "static/app/components/core/form/index.ts", + "static/app/components/core/form/layout/fieldGroup.tsx", + "static/app/components/core/form/scrapsForm.tsx" + ], + "publicExports": { + "runtime": [ + "AutoSaveContextProvider", + "AutoSaveForm", + "FORM_FIELD_REGISTRY", + "FieldGroup", + "FormSearch", + "defaultFormOptions", + "formOptions", + "setFieldErrors", + "useScrapsForm", + "useStore", + "withFieldGroup", + "withForm" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local form implementation is mapped." + } + }, + { + "name": "hotkey", + "canonical": { + "indexPath": "static/app/components/core/hotkey/index.tsx", + "sourcePaths": [ + "static/app/components/core/hotkey/hotkey.tsx", + "static/app/components/core/hotkey/index.tsx", + "static/app/components/core/hotkey/kbd.tsx", + "static/app/components/core/hotkey/keyMappings.tsx", + "static/app/components/core/hotkey/useHotkeys.tsx", + "static/app/icons/iconArrow.tsx", + "static/app/icons/iconCommand.tsx", + "static/app/icons/iconControl.tsx", + "static/app/icons/iconOption.tsx", + "static/app/icons/iconReturn.tsx", + "static/app/icons/iconShift.tsx", + "static/app/icons/svgIcon.tsx", + "static/app/icons/useIconDefaults.tsx", + "static/app/utils/array/toArray.tsx", + "static/app/utils/string/toTitleCase.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/scraps/tokens/typography.tsx" + ], + "publicExports": { + "runtime": [ + "Hotkey", + "Kbd", + "useHotkeys" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/hotkey.tsx" + ], + "implementedExports": { + "runtime": [ + "Hotkey", + "Kbd", + "useHotkeys" + ], + "types": [] + }, + "registryItems": [ + "hotkey" + ], + "stories": [ + "src/components/ui/hotkey.stories.tsx" + ], + "tests": [ + "src/components/ui/hotkey.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/hotkey.test.mjs", + "tests/types/hotkey-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=hotkey" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps Hotkey, Kbd, and useHotkeys display, platform mapping, layout-aware matching, listener lifecycle, tests, workbench, and self-contained registry delivery are present. The canonical module has no Figma component." + } + }, + { + "name": "image", + "canonical": { + "indexPath": "static/app/components/core/image/index.tsx", + "sourcePaths": [ + "static/app/components/core/image/image.tsx", + "static/app/components/core/image/index.tsx", + "static/app/components/core/layout/styles.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/types.tsx" + ], + "publicExports": { + "runtime": [ + "Image" + ], + "types": [ + "ImageProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/image.tsx" + ], + "implementedExports": { + "runtime": [ + "Image" + ], + "types": [ + "ImageProps" + ] + }, + "registryItems": [ + "image" + ], + "stories": [ + "src/components/ui/image.stories.tsx" + ], + "tests": [ + "src/components/ui/image.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/image.test.mjs", + "tests/types/image-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=image" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps Image native contract, responsive dimensions and radius, focused assertions, workbench, and self-contained registry delivery are present. The canonical module has no Figma component." + } + }, + { + "name": "info", + "canonical": { + "indexPath": "static/app/components/core/info/index.tsx", + "sourcePaths": [ + "static/app/components/core/info/index.tsx", + "static/app/components/core/info/infoText.tsx", + "static/app/components/core/info/infoTip.tsx" + ], + "publicExports": { + "runtime": [ + "DisabledTip", + "InfoText", + "InfoTip" + ], + "types": [ + "InfoTextProps" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local info implementation is mapped." + } + }, + { + "name": "input", + "canonical": { + "indexPath": "static/app/components/core/input/index.tsx", + "sourcePaths": [ + "static/app/components/core/input/index.tsx", + "static/app/components/core/input/input.tsx", + "static/app/components/core/input/inputGroup.tsx", + "static/app/components/core/input/numberDragInput.tsx", + "static/app/components/core/input/numberInput.tsx", + "static/app/components/core/input/useAutosizeInput.tsx" + ], + "publicExports": { + "runtime": [ + "Input", + "InputGroup", + "NumberDragInput", + "NumberInput", + "useAutosizeInput" + ], + "types": [ + "InputProps", + "InputStylesProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/input-group.tsx", + "src/components/ui/input.tsx" + ], + "implementedExports": { + "runtime": [ + "Input", + "InputGroup", + "InputGroupAddon", + "InputGroupButton", + "InputGroupInput", + "InputGroupText", + "InputGroupTextarea" + ], + "types": [] + }, + "registryItems": [], + "stories": [ + "src/components/ui/input.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "interactionStateLayer", + "canonical": { + "indexPath": "static/app/components/core/interactionStateLayer/index.tsx", + "sourcePaths": [ + "static/app/components/core/interactionStateLayer/index.tsx", + "static/app/components/core/interactionStateLayer/interactionStateLayer.tsx" + ], + "publicExports": { + "runtime": [ + "default" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/interaction-state-layer.tsx" + ], + "implementedExports": { + "runtime": [ + "default" + ], + "types": [] + }, + "registryItems": [ + "interaction-state-layer" + ], + "stories": [ + "src/components/ui/interaction-state-layer.stories.tsx" + ], + "tests": [ + "tests/e2e/playground.spec.ts", + "tests/parity/interaction-state-layer.test.mjs" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=checkbox" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact state-layer contract, behavior stories, focused Storybook assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "layout", + "canonical": { + "indexPath": "static/app/components/core/layout/index.tsx", + "sourcePaths": [ + "static/app/components/core/layout/container.tsx", + "static/app/components/core/layout/flex.tsx", + "static/app/components/core/layout/grid.tsx", + "static/app/components/core/layout/index.tsx", + "static/app/components/core/layout/stack.tsx", + "static/app/components/core/layout/styles.tsx", + "static/app/components/core/layout/surface.tsx" + ], + "publicExports": { + "runtime": [ + "Container", + "ContainerQueryProvider", + "Flex", + "Grid", + "Stack", + "Surface", + "getBorder", + "getMargin", + "getRadius", + "getSpacing", + "rc", + "useContainerBreakpoint", + "useHasContainerQuery", + "useResponsivePropValue" + ], + "types": [ + "ContainerProps", + "ContainerPropsWithRenderFunction", + "FlexProps", + "GridProps", + "Responsive", + "ResponsiveKey", + "StackProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/layout.tsx" + ], + "implementedExports": { + "runtime": [ + "Container", + "ContainerQueryProvider", + "Flex", + "Grid", + "Stack", + "Surface", + "getBorder", + "getMargin", + "getRadius", + "getSpacing", + "rc", + "useContainerBreakpoint", + "useHasContainerQuery", + "useResponsivePropValue" + ], + "types": [ + "ContainerProps", + "ContainerPropsWithRenderFunction", + "FlexProps", + "GridProps", + "Responsive", + "ResponsiveKey", + "StackProps" + ] + }, + "registryItems": [ + "layout" + ], + "stories": [ + "src/components/ui/layout.stories.tsx" + ], + "tests": [ + "tests/parity/layout-separator.test.mjs" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=checkbox" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps layout exports, responsive container and viewport cascade, focused assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "link", + "canonical": { + "indexPath": "static/app/components/core/link/index.tsx", + "sourcePaths": [ + "package.json", + "static/app/components/core/button/types.tsx", + "static/app/components/core/link/index.tsx", + "static/app/components/core/link/link.mdx", + "static/app/components/core/link/link.spec.tsx", + "static/app/components/core/link/link.tsx", + "static/app/components/core/link/linkBehaviorContext.tsx", + "static/app/components/core/trackingContext.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/theme.tsx" + ], + "publicExports": { + "runtime": [ + "ExternalLink", + "Link", + "LinkBehaviorContextProvider" + ], + "types": [ + "LinkProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/link-behavior-context.tsx", + "src/components/ui/link.tsx", + "src/components/ui/tracking-context.tsx" + ], + "implementedExports": { + "runtime": [ + "ExternalLink", + "Link", + "LinkBehaviorContextProvider", + "TrackingContextProvider", + "useClickTracking", + "useLinkBehavior" + ], + "types": [ + "AnalyticsProps", + "LinkProps", + "TrackingProps" + ] + }, + "registryItems": [ + "link" + ], + "stories": [ + "src/components/ui/link.stories.tsx" + ], + "tests": [ + "src/components/ui/link.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/link.test.mjs", + "tests/types/link-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=link" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps Link, ExternalLink, behavior-provider, tracking, focus, disabled, router, focused assertions, workbench, and self-contained registry delivery are present. The canonical module has no Figma component." + } + }, + { + "name": "loader", + "canonical": { + "indexPath": "static/app/components/core/loader/index.tsx", + "sourcePaths": [ + "package.json", + "static/app/components/core/layout/container.tsx", + "static/app/components/core/layout/flex.tsx", + "static/app/components/core/layout/index.tsx", + "static/app/components/core/layout/stack.tsx", + "static/app/components/core/layout/styles.tsx", + "static/app/components/core/loader/indeterminateLoader.tsx", + "static/app/components/core/loader/index.tsx", + "static/app/components/core/loader/loader.mdx", + "static/app/components/core/principles/motion/motion.mdx", + "static/app/components/core/separator/index.tsx", + "static/app/components/core/separator/separator.tsx", + "static/app/components/core/text/index.tsx", + "static/app/components/core/text/styles.tsx", + "static/app/components/core/text/text.tsx", + "static/app/utils/theme/index.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/scraps/tokens/typography.tsx", + "static/app/utils/theme/theme.tsx", + "static/app/utils/theme/types.tsx", + "static/less/fonts.less" + ], + "publicExports": { + "runtime": [ + "IndeterminateLoader" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/loader.tsx" + ], + "implementedExports": { + "runtime": [ + "IndeterminateLoader" + ], + "types": [] + }, + "registryItems": [ + "loader" + ], + "stories": [ + "src/components/ui/loader.stories.tsx" + ], + "tests": [ + "src/app/evidence/loader-server/page.tsx", + "src/components/ui/loader.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/e2e/templates.spec.ts", + "tests/parity/loader.test.mjs", + "tests/types/loader-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=loader" + }, + "completion": { + "state": "partial", + "complete": false, + "note": "The local Loader implementation, template-backed workbench, server evidence, focused tests, and local registry item are present. The shared hosted Layout and Text registry dependencies are protected, so public dependency installation is not verified. No canonical Loader Figma node is recorded." + } + }, + { + "name": "markdown", + "canonical": { + "indexPath": "static/app/components/core/markdown/index.tsx", + "sourcePaths": [ + "static/app/components/core/markdown/index.tsx", + "static/app/components/core/markdown/markdown.tsx", + "static/app/components/core/markdown/useStreamingAnimation.ts" + ], + "publicExports": { + "runtime": [ + "Markdown", + "streamingAnimationStyles", + "useTextDecodeAnimation" + ], + "types": [ + "MarkdownProps" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local markdown implementation is mapped." + } + }, + { + "name": "menuListItem", + "canonical": { + "indexPath": "static/app/components/core/menuListItem/index.tsx", + "sourcePaths": [ + "static/app/components/core/menuListItem/index.tsx", + "static/app/components/core/menuListItem/menuListItem.tsx" + ], + "publicExports": { + "runtime": [ + "InnerWrap", + "LeadingItems", + "MenuListItem" + ], + "types": [ + "MenuListItemProps" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local menu-list-item implementation is mapped." + } + }, + { + "name": "modal", + "canonical": { + "indexPath": "static/app/components/core/modal/index.tsx", + "sourcePaths": [ + "static/app/components/core/modal/components.tsx", + "static/app/components/core/modal/index.tsx" + ], + "publicExports": { + "runtime": [ + "GlobalModal", + "ModalBody", + "ModalFooter", + "makeClosableHeader", + "makeCloseButton", + "useModal" + ], + "types": [ + "ModalTypes" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local modal implementation is mapped." + } + }, + { + "name": "pagination", + "canonical": { + "indexPath": "static/app/components/core/pagination/index.tsx", + "sourcePaths": [ + "static/app/components/core/pagination/index.tsx", + "static/app/components/core/pagination/pagination.tsx" + ], + "publicExports": { + "runtime": [ + "Pagination", + "getPaginationCaption" + ], + "types": [ + "CursorHandler" + ] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local pagination implementation is mapped." + } + }, + { + "name": "pictureInPicture", + "canonical": { + "indexPath": "static/app/components/core/pictureInPicture/index.tsx", + "sourcePaths": [ + "static/app/components/core/pictureInPicture/index.tsx", + "static/app/components/core/pictureInPicture/pictureInPicture.tsx", + "static/app/components/core/pictureInPicture/pictureInPicturePortal.tsx" + ], + "publicExports": { + "runtime": [ + "PictureInPicturePortal", + "PictureInPictureProvider", + "usePictureInPicture" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local picture-in-picture implementation is mapped." + } + }, + { + "name": "quote", + "canonical": { + "indexPath": "static/app/components/core/quote/index.tsx", + "sourcePaths": [ + "static/app/components/core/layout/container.tsx", + "static/app/components/core/layout/flex.tsx", + "static/app/components/core/layout/index.tsx", + "static/app/components/core/layout/stack.tsx", + "static/app/components/core/layout/styles.tsx", + "static/app/components/core/quote/index.tsx", + "static/app/components/core/quote/quote.mdx", + "static/app/components/core/quote/quote.tsx", + "static/app/components/core/text/index.tsx", + "static/app/components/core/text/styles.tsx", + "static/app/components/core/text/text.tsx", + "static/app/utils/theme/index.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/scraps/tokens/typography.tsx", + "static/app/utils/theme/theme.tsx", + "static/app/utils/theme/types.tsx" + ], + "publicExports": { + "runtime": [ + "Quote" + ], + "types": [ + "QuoteProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/quote.tsx" + ], + "implementedExports": { + "runtime": [ + "Quote" + ], + "types": [ + "QuoteProps" + ] + }, + "registryItems": [ + "quote" + ], + "stories": [ + "src/components/ui/quote.stories.tsx" + ], + "tests": [ + "src/app/evidence/quote-server/page.tsx", + "src/components/ui/quote.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/quote.test.mjs", + "tests/types/quote-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=quote" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps Quote semantic structure, rail geometry, optional citation source, server-component evidence, focused assertions, workbench, and dependency-based registry delivery are present. The canonical module has no Figma component." + } + }, + { + "name": "radio", + "canonical": { + "indexPath": "static/app/components/core/radio/index.tsx", + "sourcePaths": [ + "static/app/components/core/radio/index.tsx", + "static/app/components/core/radio/radio.tsx" + ], + "publicExports": { + "runtime": [ + "Radio" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/radio-group.tsx" + ], + "implementedExports": { + "runtime": [ + "RadioGroup", + "RadioGroupItem" + ], + "types": [] + }, + "registryItems": [ + "radio-group" + ], + "stories": [ + "src/components/ui/radio-group.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3482-4251" + ], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "revealOnHover", + "canonical": { + "indexPath": "static/app/components/core/revealOnHover/index.tsx", + "sourcePaths": [ + "static/app/components/core/revealOnHover/index.tsx", + "static/app/components/core/revealOnHover/revealOnHover.tsx", + "static/app/utils/theme/theme.tsx" + ], + "publicExports": { + "runtime": [ + "RevealOnHover" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/reveal-on-hover.tsx" + ], + "implementedExports": { + "runtime": [ + "RevealOnHover" + ], + "types": [] + }, + "registryItems": [ + "reveal-on-hover" + ], + "stories": [ + "src/components/ui/reveal-on-hover.stories.tsx" + ], + "tests": [ + "src/components/ui/reveal-on-hover.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/reveal-on-hover.test.mjs", + "tests/types/reveal-on-hover-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=reveal-on-hover" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps RevealOnHover render branches, visibility behavior, focused assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "segmentedControl", + "canonical": { + "indexPath": "static/app/components/core/segmentedControl/index.tsx", + "sourcePaths": [ + "static/app/components/core/segmentedControl/index.tsx", + "static/app/components/core/segmentedControl/segmentedControl.tsx" + ], + "publicExports": { + "runtime": [ + "SegmentedControl" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/segmented-control.tsx" + ], + "implementedExports": { + "runtime": [ + "SegmentedControl", + "SegmentedControlItem" + ], + "types": [] + }, + "registryItems": [ + "segmented-control" + ], + "stories": [ + "src/components/ui/segmented-control.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "select", + "canonical": { + "indexPath": "static/app/components/core/select/index.tsx", + "sourcePaths": [ + "static/app/components/core/select/index.tsx", + "static/app/components/core/select/option.tsx", + "static/app/components/core/select/select.tsx", + "static/app/components/core/select/types.tsx" + ], + "publicExports": { + "runtime": [ + "CheckWrap", + "Select", + "SelectOption" + ], + "types": [ + "ControlProps", + "GeneralSelectValue", + "SelectValue", + "StylesConfig" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/select.tsx" + ], + "implementedExports": { + "runtime": [ + "Select", + "SelectContent", + "SelectGroup", + "SelectItem", + "SelectLabel", + "SelectScrollDownButton", + "SelectScrollUpButton", + "SelectSeparator", + "SelectTrigger", + "SelectValue" + ], + "types": [] + }, + "registryItems": [], + "stories": [ + "src/components/ui/select.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "separator", + "canonical": { + "indexPath": "static/app/components/core/separator/index.tsx", + "sourcePaths": [ + "static/app/components/core/separator/index.tsx", + "static/app/components/core/separator/separator.tsx" + ], + "publicExports": { + "runtime": [ + "Separator" + ], + "types": [ + "SeparatorProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/separator.tsx" + ], + "implementedExports": { + "runtime": [ + "Separator" + ], + "types": [ + "SeparatorProps" + ] + }, + "registryItems": [ + "separator" + ], + "stories": [ + "src/components/ui/separator.stories.tsx" + ], + "tests": [ + "tests/parity/layout-separator.test.mjs" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=checkbox" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps native hr separator contract, focused assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "slideOverPanel", + "canonical": { + "indexPath": "static/app/components/core/slideOverPanel/index.tsx", + "sourcePaths": [ + "static/app/components/core/boundaryContext.tsx", + "static/app/components/core/slideOverPanel/index.tsx", + "static/app/components/core/slideOverPanel/slideOverPanel.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/scraps/tokens/typography.tsx", + "static/app/utils/theme/theme.tsx", + "static/app/utils/theme/types.tsx", + "static/app/views/navigation/constants.tsx", + "static/app/views/navigation/useTopOffset.tsx" + ], + "publicExports": { + "runtime": [ + "SlideOverPanel" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/slide-over-panel.tsx" + ], + "implementedExports": { + "runtime": [ + "SlideOverPanel" + ], + "types": [] + }, + "registryItems": [ + "slide-over-panel" + ], + "stories": [ + "src/components/ui/slide-over-panel.stories.tsx" + ], + "tests": [ + "src/components/ui/slide-over-panel.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/slide-over-panel.test.mjs", + "tests/types/slide-over-panel-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=slide-over-panel" + }, + "completion": { + "state": "partial", + "complete": false, + "note": "The local SlideOverPanel implementation, navigation-offset environment seam, boundary context, deferred-content workbench, focused tests, and self-contained local registry item are present. The hosted registry endpoint is protected, so public installation is not verified. No canonical Figma node is recorded." + } + }, + { + "name": "slider", + "canonical": { + "indexPath": "static/app/components/core/slider/index.tsx", + "sourcePaths": [ + "static/app/components/core/slider/index.tsx", + "static/app/components/core/slider/slider.tsx" + ], + "publicExports": { + "runtime": [ + "Slider" + ], + "types": [ + "SliderProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/slider.tsx" + ], + "implementedExports": { + "runtime": [ + "Slider" + ], + "types": [ + "SliderProps" + ] + }, + "registryItems": [ + "slider" + ], + "stories": [ + "src/components/ui/slider.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3538-6616" + ], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "slot", + "canonical": { + "indexPath": "static/app/components/core/slot/index.tsx", + "sourcePaths": [ + "static/app/components/core/sizeContext.tsx", + "static/app/components/core/slot/index.tsx", + "static/app/components/core/slot/knownContexts.ts", + "static/app/components/core/slot/slot.tsx" + ], + "publicExports": { + "runtime": [ + "slot", + "withSlots" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/slot.tsx" + ], + "implementedExports": { + "runtime": [ + "slot", + "withSlots" + ], + "types": [] + }, + "registryItems": [ + "slot" + ], + "stories": [ + "src/components/ui/slot.stories.tsx" + ], + "tests": [ + "src/components/ui/slot.test.tsx", + "tests/parity/slot.test.mjs" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=checkbox" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps typed portal slot contract, logical size and container-query context bridge, focused assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "splitPanel", + "canonical": { + "indexPath": "static/app/components/core/splitPanel/index.tsx", + "sourcePaths": [ + "static/app/components/core/splitPanel/index.tsx", + "static/app/components/core/splitPanel/splitPanel.tsx", + "static/app/utils/useDimensions.tsx", + "static/app/utils/useResizableDrawer.tsx" + ], + "publicExports": { + "runtime": [ + "SplitPanel" + ], + "types": [ + "SplitPanelHandle" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/split-panel.tsx" + ], + "implementedExports": { + "runtime": [ + "SplitPanel" + ], + "types": [ + "SplitPanelHandle" + ] + }, + "registryItems": [ + "split-panel" + ], + "stories": [ + "src/components/ui/split-panel.stories.tsx" + ], + "tests": [ + "src/components/ui/split-panel.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/split-panel.test.mjs", + "tests/types/split-panel-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=split-panel" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps SplitPanel contract, sizing behavior, focused assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "statusIndicator", + "canonical": { + "indexPath": "static/app/components/core/statusIndicator/index.tsx", + "sourcePaths": [ + "static/app/components/core/statusIndicator/index.tsx", + "static/app/components/core/statusIndicator/statusIndicator.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx" + ], + "publicExports": { + "runtime": [ + "StatusIndicator" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/status-indicator.tsx" + ], + "implementedExports": { + "runtime": [ + "StatusIndicator" + ], + "types": [] + }, + "registryItems": [ + "status-indicator" + ], + "stories": [ + "src/components/ui/status-indicator.stories.tsx" + ], + "tests": [ + "src/components/ui/status-indicator.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/status-indicator.test.mjs", + "tests/types/status-indicator-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=status-indicator" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps StatusIndicator animation, accessibility, focused assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "switch", + "canonical": { + "indexPath": "static/app/components/core/switch/index.tsx", + "sourcePaths": [ + "static/app/components/core/switch/index.tsx", + "static/app/components/core/switch/switch.tsx" + ], + "publicExports": { + "runtime": [ + "Switch" + ], + "types": [ + "SwitchProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/switch.tsx" + ], + "implementedExports": { + "runtime": [ + "Switch" + ], + "types": [] + }, + "registryItems": [], + "stories": [ + "src/components/ui/switch.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3277-4566" + ], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "table", + "canonical": { + "indexPath": "static/app/components/core/table/index.tsx", + "sourcePaths": [ + "static/app/components/core/table/index.tsx", + "static/app/components/core/table/styles.tsx", + "static/app/components/core/table/table.tsx", + "static/app/components/tables/sortableHeaderCell.tsx", + "static/app/components/tables/useColumnResize.tsx", + "static/app/components/tables/useObservedColumnSize.tsx", + "static/app/icons/iconArrow.tsx" + ], + "publicExports": { + "runtime": [ + "COL_WIDTH_MINIMUM", + "COL_WIDTH_UNDEFINED", + "TABLE_HEAD_ROW_HEIGHT", + "Table", + "TableResizer", + "TableStatusCell" + ], + "types": [ + "TableColumnConfig" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/table.tsx" + ], + "implementedExports": { + "runtime": [ + "COL_WIDTH_MINIMUM", + "COL_WIDTH_UNDEFINED", + "TABLE_HEAD_ROW_HEIGHT", + "Table", + "TableResizer", + "TableStatusCell" + ], + "types": [ + "TableColumnConfig" + ] + }, + "registryItems": [ + "table" + ], + "stories": [ + "src/components/ui/table.stories.tsx" + ], + "tests": [ + "src/components/ui/table.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/table.test.mjs", + "tests/types/table-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=table" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Exact regular Scraps Table compound contract, column sizing, resize and sort behavior, focused assertions, and registry publication are present. The canonical module has no Figma component." + } + }, + { + "name": "tabs", + "canonical": { + "indexPath": "static/app/components/core/tabs/index.tsx", + "sourcePaths": [ + "static/app/components/core/tabs/index.tsx", + "static/app/components/core/tabs/item.tsx", + "static/app/components/core/tabs/tabList.tsx", + "static/app/components/core/tabs/tabPanels.tsx", + "static/app/components/core/tabs/tabs.tsx" + ], + "publicExports": { + "runtime": [ + "TabList", + "TabPanels", + "TabStateProvider", + "Tabs" + ], + "types": [ + "TabListItemProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/tabs.tsx" + ], + "implementedExports": { + "runtime": [ + "Tabs", + "TabsContent", + "TabsList", + "TabsTrigger", + "tabsListVariants" + ], + "types": [] + }, + "registryItems": [], + "stories": [ + "src/components/ui/tabs.stories.tsx" + ], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "text", + "canonical": { + "indexPath": "static/app/components/core/text/index.tsx", + "sourcePaths": [ + "static/app/components/core/code/inlineCode.tsx", + "static/app/components/core/hotkey/kbd.tsx", + "static/app/components/core/layout/index.tsx", + "static/app/components/core/layout/styles.tsx", + "static/app/components/core/text/heading.tsx", + "static/app/components/core/text/index.tsx", + "static/app/components/core/text/prose.tsx", + "static/app/components/core/text/styles.tsx", + "static/app/components/core/text/text.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/scraps/tokens/typography.tsx", + "static/app/utils/theme/types.tsx", + "static/less/fonts.less" + ], + "publicExports": { + "runtime": [ + "Heading", + "Prose", + "Text" + ], + "types": [ + "HeadingProps", + "TextProps", + "TextPropsWithRenderFunction" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/heading.tsx", + "src/components/ui/kbd-styles.tsx", + "src/components/ui/prose.tsx", + "src/components/ui/text-style-engine.tsx", + "src/components/ui/text.tsx" + ], + "implementedExports": { + "runtime": [ + "Heading", + "Prose", + "Text", + "combineTextClassNames", + "createTextStyleResource", + "kbdStyles", + "resolveFontSize", + "resolveLineHeight", + "textDeclaration" + ], + "types": [ + "BaseTextProps", + "HeadingProps", + "HeadingSize", + "KbdStyleTheme", + "ProseProps", + "TextPrimitive", + "TextProps", + "TextPropsWithRenderFunction", + "TextSize", + "TextVariant" + ] + }, + "registryItems": [ + "text" + ], + "stories": [ + "src/components/ui/text.stories.tsx" + ], + "tests": [ + "src/components/ui/text.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/text-ssr.test.mjs", + "tests/parity/text.test.mjs", + "tests/types/text-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": "/?component=text" + }, + "completion": { + "state": "complete", + "complete": true, + "note": "Regular Scraps Text, Heading, and Prose contracts, responsive presentation, inline code and keycap prose composition, focused assertions, workbench, and registry delivery are present. The canonical module has no Figma component." + } + }, + { + "name": "textarea", + "canonical": { + "indexPath": "static/app/components/core/textarea/index.tsx", + "sourcePaths": [ + "static/app/components/core/textarea/index.tsx", + "static/app/components/core/textarea/textarea.tsx" + ], + "publicExports": { + "runtime": [ + "TextArea" + ], + "types": [ + "TextAreaProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/textarea.tsx" + ], + "implementedExports": { + "runtime": [ + "Textarea" + ], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3537-20061" + ], + "playgroundPath": null + }, + "completion": { + "state": "partial", + "complete": false, + "note": "A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed." + } + }, + { + "name": "toast", + "canonical": { + "indexPath": "static/app/components/core/toast/index.tsx", + "sourcePaths": [ + "static/app/components/core/toast/index.tsx", + "static/app/components/core/toast/toast.tsx" + ], + "publicExports": { + "runtime": [ + "Toast" + ], + "types": [] + } + }, + "local": { + "implementationPaths": [], + "implementedExports": { + "runtime": [], + "types": [] + }, + "registryItems": [], + "stories": [], + "tests": [], + "codeConnect": [], + "figmaNodes": [], + "playgroundPath": null + }, + "completion": { + "state": "missing", + "complete": false, + "note": "No local toast implementation is mapped." + } + }, + { + "name": "tooltip", + "canonical": { + "indexPath": "static/app/components/core/tooltip/index.tsx", + "sourcePaths": [ + "package.json", + "static/app/components/core/tooltip/index.tsx", + "static/app/components/core/tooltip/tooltip.figma.tsx", + "static/app/components/core/tooltip/tooltip.mdx", + "static/app/components/core/tooltip/tooltip.spec.tsx", + "static/app/components/core/tooltip/tooltip.tsx", + "static/app/components/overlay.tsx", + "static/app/components/overlayArrow.tsx", + "static/app/utils/theme/index.tsx", + "static/app/utils/theme/scraps/theme/base.tsx", + "static/app/utils/theme/scraps/theme/dark.tsx", + "static/app/utils/theme/scraps/theme/light.tsx", + "static/app/utils/theme/scraps/tokens/color.tsx", + "static/app/utils/theme/scraps/tokens/size.tsx", + "static/app/utils/theme/scraps/tokens/typography.tsx", + "static/app/utils/theme/theme.tsx", + "static/app/utils/theme/types.tsx", + "static/app/utils/useHoverOverlay.spec.tsx", + "static/app/utils/useHoverOverlay.timing.spec.tsx", + "static/app/utils/useHoverOverlay.tsx", + "static/app/utils/useStableMergeRef.ts" + ], + "publicExports": { + "runtime": [ + "Tooltip", + "TooltipContext" + ], + "types": [ + "TooltipProps" + ] + } + }, + "local": { + "implementationPaths": [ + "src/components/ui/tooltip.tsx" + ], + "implementedExports": { + "runtime": [ + "Tooltip", + "TooltipContext" + ], + "types": [ + "TooltipProps" + ] + }, + "registryItems": [ + "tooltip" + ], + "stories": [ + "src/components/ui/tooltip.stories.tsx" + ], + "tests": [ + "src/components/ui/tooltip.test.tsx", + "tests/e2e/playground.spec.ts", + "tests/parity/tooltip.test.mjs", + "tests/types/tooltip-types.test.tsx" + ], + "codeConnect": [], + "figmaNodes": [ + "https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=6775-627" + ], + "playgroundPath": "/?component=tooltip" + }, + "completion": { + "state": "partial", + "complete": false, + "note": "The local Tooltip API, positioning, delay group, overflow observation, motion, workbench, focused tests, and self-contained registry item are present. The canonical Figma node and Code Connect mapping have not been verified." + } + } + ] +} diff --git a/scripts/create-template.mjs b/scripts/create-template.mjs new file mode 100644 index 0000000..481777f --- /dev/null +++ b/scripts/create-template.mjs @@ -0,0 +1,34 @@ +import { mkdir, mkdtemp, rename, rm, writeFile } from "node:fs/promises" +import path from "node:path" +import { pathToFileURL } from "node:url" + +import { templatesDirectory } from "./template-files.mjs" + +export async function scaffoldTemplate({ slug, title, templatesRoot = templatesDirectory }) { + if (!slug || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) { + throw new Error("Template slug must use lowercase kebab case") + } + + const resolvedTitle = title || slug.split("-").map((word) => word[0].toUpperCase() + word.slice(1)).join(" ") + const targetDirectory = path.join(templatesRoot, slug) + await mkdir(templatesRoot, { recursive: true }) + const stagingDirectory = await mkdtemp(path.join(templatesRoot, ".template-")) + + try { + await writeFile(path.join(stagingDirectory, "template.json"), `${JSON.stringify({ slug, title: resolvedTitle, description: `${resolvedTitle} design review template.`, tags: [] }, null, 2)}\n`) + const componentName = `Template${resolvedTitle.replace(/[^A-Za-z0-9]/g, "")}Template` + await writeFile(path.join(stagingDirectory, "template.tsx"), `import { SentryPageFrame } from "@/components/playground/sentry-page-frame"\n\nimport type { TemplateProps } from "../types"\n\nexport default function ${componentName}({ templates }: TemplateProps) {\n return (\n \n

Edit src/templates/${slug}/template.tsx to build this composition. {templates.length} templates are available.

\n
\n )\n}\n`) + await rename(stagingDirectory, targetDirectory) + } catch (error) { + await rm(stagingDirectory, { recursive: true, force: true }) + throw error + } +} + +if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { + const slug = process.argv[2] + if (!slug) throw new Error("Usage: pnpm template:create [title]") + await scaffoldTemplate({ slug, title: process.argv.slice(3).join(" ") }) + await import("./generate-template-manifest.mjs") + process.stdout.write(`Created /templates/${slug}.\n`) +} diff --git a/scripts/figma-preview.mjs b/scripts/figma-preview.mjs new file mode 100644 index 0000000..75ddfdb --- /dev/null +++ b/scripts/figma-preview.mjs @@ -0,0 +1,221 @@ +import { spawnSync } from "node:child_process" +import { pathToFileURL } from "node:url" +import ts from "typescript" + +const SIZES = ["xs", "sm", "md"] +const CHECKED_VALUES = ["False", "True", "indeterminate"] +const STATES = ["Default", "Hover", "Active", "disabled", "Focused"] +const REVIEW_STATES = new Set(["Default", "disabled"]) +const CHECKBOX_PROP_NAMES = new Set(["size", "checked", "disabled"]) + +const expectedKeys = SIZES.flatMap((size) => + CHECKED_VALUES.flatMap((checked) => + STATES.map((state) => `${size}|${checked}|${state}`) + ) +) + +function combinationKey(label) { + const entries = label.split(", ").map((part) => { + const separator = part.indexOf("=") + return [part.slice(0, separator), part.slice(separator + 1)] + }) + const propertyNames = entries.map(([name]) => name).sort() + if (propertyNames.join("|") !== "checked|size|state") { + throw new Error(`Figma Checkbox schema contains unexpected properties: ${propertyNames.join(", ")}`) + } + const properties = Object.fromEntries(entries) + return `${properties.size}|${properties.checked}|${properties.state}` +} + +function inspectCheckboxSnippet(snippet) { + const source = ts.createSourceFile("checkbox-preview.tsx", snippet, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX) + if (source.parseDiagnostics.length) { + throw new Error("Figma Checkbox preview contains invalid syntax") + } + let importsLocalCheckbox = false + let importsMonolithCheckbox = false + let checkboxRenderCount = 0 + let checkboxProps = new Map() + let checkboxPropsAreExact = true + let checkboxBindingIsShadowed = false + + function bindsCheckbox(name) { + if (!name) return false + if (ts.isIdentifier(name)) return name.text === "Checkbox" + if (ts.isObjectBindingPattern(name) || ts.isArrayBindingPattern(name)) { + return name.elements.some((element) => ts.isBindingElement(element) && bindsCheckbox(element.name)) + } + return false + } + + for (const statement of source.statements) { + if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) continue + const moduleName = statement.moduleSpecifier.text + if (moduleName === "@sentry/scraps/checkbox") importsMonolithCheckbox = true + if (moduleName !== "@/components/ui/checkbox") continue + + if (statement.importClause?.isTypeOnly) continue + const bindings = statement.importClause?.namedBindings + if (!bindings || !ts.isNamedImports(bindings)) continue + importsLocalCheckbox = bindings.elements.some((element) => { + const importedName = element.propertyName?.text ?? element.name.text + return !element.isTypeOnly && importedName === "Checkbox" && element.name.text === "Checkbox" + }) + } + + function visit(node) { + if ( + (ts.isVariableDeclaration(node) || + ts.isParameter(node) || + ts.isFunctionDeclaration(node) || + ts.isFunctionExpression(node) || + ts.isClassDeclaration(node) || + ts.isClassExpression(node) || + ts.isEnumDeclaration(node) || + ts.isCatchClause(node)) && + bindsCheckbox(ts.isCatchClause(node) ? node.variableDeclaration?.name : node.name) + ) { + checkboxBindingIsShadowed = true + } + if ( + (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) && + ts.isIdentifier(node.tagName) && + node.tagName.text === "Checkbox" + ) { + checkboxRenderCount++ + checkboxProps = new Map() + for (const attribute of node.attributes.properties) { + if (!ts.isJsxAttribute(attribute)) { + checkboxPropsAreExact = false + continue + } + const name = attribute.name.text + if (!CHECKBOX_PROP_NAMES.has(name)) { + checkboxPropsAreExact = false + continue + } + if (checkboxProps.has(name)) { + checkboxPropsAreExact = false + continue + } + if (!attribute.initializer) { + checkboxProps.set(name, true) + continue + } + if (ts.isStringLiteral(attribute.initializer)) { + checkboxProps.set(name, attribute.initializer.text) + continue + } + if (ts.isJsxExpression(attribute.initializer)) { + if (attribute.initializer.expression?.kind === ts.SyntaxKind.TrueKeyword) { + checkboxProps.set(name, true) + continue + } + if (attribute.initializer.expression?.kind === ts.SyntaxKind.FalseKeyword) { + checkboxProps.set(name, false) + continue + } + } + checkboxPropsAreExact = false + } + } + ts.forEachChild(node, visit) + } + visit(source) + + return { + checkboxBindingIsShadowed, + checkboxProps, + checkboxPropsAreExact, + checkboxRenderCount, + importsLocalCheckbox, + importsMonolithCheckbox, + } +} + +export function validateCheckboxPreviews(previews) { + if (!Array.isArray(previews)) throw new Error("Figma preview returned invalid JSON") + + const byKey = new Map() + for (const preview of previews) { + if (!preview.propertyCombinationLabel) { + throw new Error("Figma preview did not return Checkbox property labels") + } + const key = combinationKey(preview.propertyCombinationLabel) + if (byKey.has(key)) throw new Error(`Figma preview returned duplicate combination ${key}`) + byKey.set(key, preview) + } + + const missing = expectedKeys.filter((key) => !byKey.has(key)) + const unexpected = [...byKey.keys()].filter((key) => !expectedKeys.includes(key)) + if (missing.length || unexpected.length) { + throw new Error(`Figma Checkbox schema mismatch. Missing: ${missing.join(", ") || "none"}. Unexpected: ${unexpected.join(", ") || "none"}.`) + } + + const allPreviews = expectedKeys.map((key) => byKey.get(key)) + + for (const preview of allPreviews) { + if (preview.success !== true) { + throw new Error(`Figma Checkbox preview failed for ${preview.propertyCombinationLabel}`) + } + const snippet = inspectCheckboxSnippet(preview.snippet ?? "") + if ( + !snippet.importsLocalCheckbox || + snippet.importsMonolithCheckbox || + snippet.checkboxBindingIsShadowed || + snippet.checkboxRenderCount !== 1 + ) { + throw new Error(`Figma Checkbox preview used the wrong component for ${preview.propertyCombinationLabel}`) + } + + const [size, checked, state] = combinationKey(preview.propertyCombinationLabel).split("|") + const expectedChecked = checked === "True" ? true : checked === "indeterminate" ? "indeterminate" : undefined + const expectedDisabled = state === "disabled" ? true : undefined + const matchesProp = (name, expected) => + expected === undefined ? !snippet.checkboxProps.has(name) : snippet.checkboxProps.get(name) === expected + if ( + !snippet.checkboxPropsAreExact || + !matchesProp("size", size) || + !matchesProp("checked", expectedChecked) || + !matchesProp("disabled", expectedDisabled) + ) { + throw new Error(`Figma Checkbox preview mapped the wrong props for ${preview.propertyCombinationLabel}`) + } + } + + return expectedKeys.filter((key) => REVIEW_STATES.has(key.split("|")[2])).length +} + +function run() { + if (!process.env.FIGMA_ACCESS_TOKEN) { + throw new Error("FIGMA_ACCESS_TOKEN is required for the authenticated Figma preview check") + } + + const result = spawnSync("pnpm", [ + "exec", + "figma", + "connect", + "preview", + "src/components/ui/checkbox.figma.ts", + "--all", + "--max-combinations", + String(expectedKeys.length + 1), + "--output", + "json", + "--exit-on-unreadable-files", + "--skip-update-check", + ], { encoding: "utf8", env: process.env }) + + if (result.status !== 0) { + process.stderr.write(result.stderr) + process.stdout.write(result.stdout) + process.exit(result.status ?? 1) + } + + const jsonStart = result.stdout.indexOf("[") + if (jsonStart < 0) throw new Error("Figma preview did not return JSON results") + const count = validateCheckboxPreviews(JSON.parse(result.stdout.slice(jsonStart))) + process.stdout.write(`Validated all ${count} Figma Checkbox review combinations.\n`) +} + +if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) run() diff --git a/scripts/generate-parity-manifest.mjs b/scripts/generate-parity-manifest.mjs new file mode 100644 index 0000000..b0ab497 --- /dev/null +++ b/scripts/generate-parity-manifest.mjs @@ -0,0 +1,721 @@ +import {access, writeFile} from 'node:fs/promises'; +import path from 'node:path'; +import {execFileSync} from 'node:child_process'; + +import ts from 'typescript'; + +import { + collectParityManifestExports, + collectParityManifestFileExports, +} from './parity-manifest-exports.mjs'; + +const CANONICAL_COMMIT = 'd91f823d232ddd12a4d2a64554d85fd36df0e278'; +const EXCLUDED_DIRECTORIES = ['overview', 'patterns', 'principles']; +const canonicalBehaviorDependencies = { + backdrop: [ + 'static/app/utils/theme/theme.tsx', + ], + code: [ + 'static/app/components/core/button/button.tsx', + 'static/app/components/core/button/styles.tsx', + 'static/app/components/core/button/types.tsx', + 'static/app/components/core/button/useButtonFunctionality.tsx', + 'static/app/components/core/layout/container.tsx', + 'static/app/components/core/layout/index.tsx', + 'static/app/components/core/layout/styles.tsx', + 'static/app/components/core/tooltip/tooltip.tsx', + 'static/app/components/overlay.tsx', + 'static/app/components/overlayArrow.tsx', + 'static/app/icons/iconCopy.tsx', + 'static/app/icons/svgIcon.tsx', + 'static/app/icons/useIconDefaults.tsx', + 'static/app/locale.tsx', + 'static/app/styles/global.tsx', + 'static/app/utils/prism.tsx', + 'static/app/utils/theme/theme.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/scraps/tokens/typography.tsx', + 'static/app/utils/useHoverOverlay.tsx', + ], + emptyState: [ + 'static/app/components/core/emptyState/emptyState.mdx', + 'static/app/components/core/layout/container.tsx', + 'static/app/components/core/layout/flex.tsx', + 'static/app/components/core/layout/index.tsx', + 'static/app/components/core/layout/stack.tsx', + 'static/app/components/core/layout/styles.tsx', + 'static/app/components/core/text/index.tsx', + 'static/app/components/core/text/heading.tsx', + 'static/app/components/core/text/styles.tsx', + 'static/app/components/core/text/text.tsx', + 'static/app/utils/theme/index.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/scraps/tokens/typography.tsx', + 'static/app/utils/theme/theme.tsx', + 'static/app/utils/theme/types.tsx', + ], + loader: [ + 'package.json', + 'static/app/components/core/layout/container.tsx', + 'static/app/components/core/layout/flex.tsx', + 'static/app/components/core/layout/index.tsx', + 'static/app/components/core/layout/stack.tsx', + 'static/app/components/core/layout/styles.tsx', + 'static/app/components/core/loader/loader.mdx', + 'static/app/components/core/principles/motion/motion.mdx', + 'static/app/components/core/separator/index.tsx', + 'static/app/components/core/separator/separator.tsx', + 'static/app/components/core/text/index.tsx', + 'static/app/components/core/text/styles.tsx', + 'static/app/components/core/text/text.tsx', + 'static/app/utils/theme/index.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/scraps/tokens/typography.tsx', + 'static/app/utils/theme/theme.tsx', + 'static/app/utils/theme/types.tsx', + 'static/less/fonts.less', + ], + quote: [ + 'static/app/components/core/layout/container.tsx', + 'static/app/components/core/layout/flex.tsx', + 'static/app/components/core/layout/index.tsx', + 'static/app/components/core/layout/stack.tsx', + 'static/app/components/core/layout/styles.tsx', + 'static/app/components/core/quote/quote.mdx', + 'static/app/components/core/text/index.tsx', + 'static/app/components/core/text/styles.tsx', + 'static/app/components/core/text/text.tsx', + 'static/app/utils/theme/index.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/scraps/tokens/typography.tsx', + 'static/app/utils/theme/theme.tsx', + 'static/app/utils/theme/types.tsx', + ], + text: [ + 'static/less/fonts.less', + 'static/app/components/core/hotkey/kbd.tsx', + 'static/app/components/core/layout/index.tsx', + 'static/app/components/core/layout/styles.tsx', + 'static/app/components/core/code/inlineCode.tsx', + 'static/app/components/core/text/styles.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/scraps/tokens/typography.tsx', + 'static/app/utils/theme/types.tsx', + ], + image: [ + 'static/app/components/core/layout/styles.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/types.tsx', + ], + hotkey: [ + 'static/app/components/core/hotkey/keyMappings.tsx', + 'static/app/icons/iconArrow.tsx', + 'static/app/icons/iconCommand.tsx', + 'static/app/icons/iconControl.tsx', + 'static/app/icons/iconOption.tsx', + 'static/app/icons/iconReturn.tsx', + 'static/app/icons/iconShift.tsx', + 'static/app/icons/svgIcon.tsx', + 'static/app/icons/useIconDefaults.tsx', + 'static/app/utils/array/toArray.tsx', + 'static/app/utils/string/toTitleCase.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/scraps/tokens/typography.tsx', + ], + revealOnHover: [ + 'static/app/utils/theme/theme.tsx', + ], + slot: [ + 'static/app/components/core/sizeContext.tsx', + 'static/app/components/core/slot/knownContexts.ts', + ], + splitPanel: [ + 'static/app/utils/useDimensions.tsx', + 'static/app/utils/useResizableDrawer.tsx', + ], + table: [ + 'static/app/components/tables/sortableHeaderCell.tsx', + 'static/app/components/tables/useColumnResize.tsx', + 'static/app/components/tables/useObservedColumnSize.tsx', + 'static/app/icons/iconArrow.tsx', + ], + statusIndicator: [ + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + ], + slideOverPanel: [ + 'static/app/components/core/boundaryContext.tsx', + 'static/app/utils/theme/theme.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/scraps/tokens/typography.tsx', + 'static/app/utils/theme/types.tsx', + 'static/app/views/navigation/constants.tsx', + 'static/app/views/navigation/useTopOffset.tsx', + ], + tooltip: [ + 'package.json', + 'static/app/components/core/tooltip/tooltip.figma.tsx', + 'static/app/components/core/tooltip/tooltip.mdx', + 'static/app/components/core/tooltip/tooltip.spec.tsx', + 'static/app/components/overlay.tsx', + 'static/app/components/overlayArrow.tsx', + 'static/app/utils/theme/index.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/scraps/tokens/size.tsx', + 'static/app/utils/theme/scraps/tokens/typography.tsx', + 'static/app/utils/theme/theme.tsx', + 'static/app/utils/theme/types.tsx', + 'static/app/utils/useHoverOverlay.spec.tsx', + 'static/app/utils/useHoverOverlay.timing.spec.tsx', + 'static/app/utils/useHoverOverlay.tsx', + 'static/app/utils/useStableMergeRef.ts', + ], + link: [ + 'package.json', + 'static/app/components/core/button/types.tsx', + 'static/app/components/core/link/link.spec.tsx', + 'static/app/components/core/link/link.mdx', + 'static/app/components/core/trackingContext.tsx', + 'static/app/utils/theme/scraps/theme/base.tsx', + 'static/app/utils/theme/scraps/theme/dark.tsx', + 'static/app/utils/theme/scraps/theme/light.tsx', + 'static/app/utils/theme/scraps/tokens/color.tsx', + 'static/app/utils/theme/theme.tsx', + ], +}; +const sentryRepository = path.resolve( + process.env.SENTRY_REPO_PATH ?? '../sentry' +); +const canonicalRoot = 'static/app/components/core'; + +const localModules = { + alert: ['src/components/ui/alert.tsx'], + avatar: ['src/components/ui/avatar.tsx'], + backdrop: ['src/components/ui/backdrop.tsx'], + badge: [ + 'src/components/ui/badge.tsx', + 'src/components/ui/feature-badge.tsx', + 'src/components/ui/tag.tsx', + ], + button: ['src/components/ui/button.tsx'], + checkbox: ['src/components/ui/checkbox.tsx'], + code: [ + 'src/components/ui/code-block.tsx', + 'src/components/ui/code-messages.tsx', + 'src/components/ui/code.tsx', + ], + emptyState: ['src/components/ui/empty-state.tsx'], + loader: ['src/components/ui/loader.tsx'], + slideOverPanel: ['src/components/ui/slide-over-panel.tsx'], + quote: ['src/components/ui/quote.tsx'], + text: [ + 'src/components/ui/text.tsx', + 'src/components/ui/heading.tsx', + 'src/components/ui/kbd-styles.tsx', + 'src/components/ui/prose.tsx', + 'src/components/ui/text-style-engine.tsx', + ], + dragHandle: [ + 'src/components/ui/drag-handle.tsx', + 'src/components/ui/use-drag-move.tsx', + 'src/components/ui/use-drag-separator.tsx', + ], + input: [ + 'src/components/ui/input.tsx', + 'src/components/ui/input-group.tsx', + ], + interactionStateLayer: ['src/components/ui/interaction-state-layer.tsx'], + hotkey: ['src/components/ui/hotkey.tsx'], + image: ['src/components/ui/image.tsx'], + layout: ['src/components/ui/layout.tsx'], + link: [ + 'src/components/ui/link-behavior-context.tsx', + 'src/components/ui/link.tsx', + 'src/components/ui/tracking-context.tsx', + ], + radio: ['src/components/ui/radio-group.tsx'], + revealOnHover: ['src/components/ui/reveal-on-hover.tsx'], + segmentedControl: ['src/components/ui/segmented-control.tsx'], + select: ['src/components/ui/select.tsx'], + separator: ['src/components/ui/separator.tsx'], + slot: ['src/components/ui/slot.tsx'], + splitPanel: ['src/components/ui/split-panel.tsx'], + slider: ['src/components/ui/slider.tsx'], + statusIndicator: ['src/components/ui/status-indicator.tsx'], + switch: ['src/components/ui/switch.tsx'], + table: ['src/components/ui/table.tsx'], + tabs: ['src/components/ui/tabs.tsx'], + textarea: ['src/components/ui/textarea.tsx'], + tooltip: ['src/components/ui/tooltip.tsx'], +}; + +const registryItems = { + alert: ['alert'], + backdrop: ['backdrop'], + badge: ['badge', 'feature-badge', 'tag'], + button: ['button'], + code: ['code'], + emptyState: ['empty-state'], + loader: ['loader'], + slideOverPanel: ['slide-over-panel'], + quote: ['quote'], + text: ['text'], + dragHandle: ['drag-handle'], + interactionStateLayer: ['interaction-state-layer'], + hotkey: ['hotkey'], + image: ['image'], + layout: ['layout'], + separator: ['separator'], + slot: ['slot'], + splitPanel: ['split-panel'], + table: ['table'], + link: ['link'], + radio: ['radio-group'], + revealOnHover: ['reveal-on-hover'], + segmentedControl: ['segmented-control'], + slider: ['slider'], + statusIndicator: ['status-indicator'], + tooltip: ['tooltip'], +}; + +const completionEvidence = { + backdrop: + 'Exact regular Scraps Backdrop overlay geometry, theme colors, layer values, motion, focused assertions, workbench, and self-contained registry delivery are present. The canonical module has no Figma component.', + code: + 'Exact regular Scraps CodeBlock, InlineCode, reusable inline style recipe, translatable copy messages, Prism language loading, Sentry source notice, executable Storybook state assertions, workbench, and self-contained registry delivery are present. The canonical module has no Figma component.', + quote: + 'Exact regular Scraps Quote semantic structure, rail geometry, optional citation source, server-component evidence, focused assertions, workbench, and dependency-based registry delivery are present. The canonical module has no Figma component.', + text: + 'Regular Scraps Text, Heading, and Prose contracts, responsive presentation, inline code and keycap prose composition, focused assertions, workbench, and registry delivery are present. The canonical module has no Figma component.', + interactionStateLayer: + 'Exact state-layer contract, behavior stories, focused Storybook assertions, and registry publication are present. The canonical module has no Figma component.', + hotkey: + 'Exact regular Scraps Hotkey, Kbd, and useHotkeys display, platform mapping, layout-aware matching, listener lifecycle, tests, workbench, and self-contained registry delivery are present. The canonical module has no Figma component.', + image: + 'Exact regular Scraps Image native contract, responsive dimensions and radius, focused assertions, workbench, and self-contained registry delivery are present. The canonical module has no Figma component.', + dragHandle: + 'Exact regular Scraps drag handle contract, pointer and keyboard behavior, focused assertions, and registry publication are present. The canonical module has no Figma component.', + layout: + 'Exact regular Scraps layout exports, responsive container and viewport cascade, focused assertions, and registry publication are present. The canonical module has no Figma component.', + link: + 'Exact regular Scraps Link, ExternalLink, behavior-provider, tracking, focus, disabled, router, focused assertions, workbench, and self-contained registry delivery are present. The canonical module has no Figma component.', + separator: + 'Exact regular Scraps native hr separator contract, focused assertions, and registry publication are present. The canonical module has no Figma component.', + slot: + 'Exact regular Scraps typed portal slot contract, logical size and container-query context bridge, focused assertions, and registry publication are present. The canonical module has no Figma component.', + splitPanel: + 'Exact regular Scraps SplitPanel contract, sizing behavior, focused assertions, and registry publication are present. The canonical module has no Figma component.', + table: + 'Exact regular Scraps Table compound contract, column sizing, resize and sort behavior, focused assertions, and registry publication are present. The canonical module has no Figma component.', + revealOnHover: + 'Exact regular Scraps RevealOnHover render branches, visibility behavior, focused assertions, and registry publication are present. The canonical module has no Figma component.', + statusIndicator: + 'Exact regular Scraps StatusIndicator animation, accessibility, focused assertions, and registry publication are present. The canonical module has no Figma component.', +}; + +const figmaNodes = { + alert: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=6943-13522'], + badge: [ + 'https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3574-5698', + 'https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3574-5396', + ], + button: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=384-2119'], + checkbox: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3481-4211'], + emptyState: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=13363-6895'], + radio: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3482-4251'], + slider: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3538-6616'], + switch: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3277-4566'], + textarea: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=3537-20061'], + tooltip: ['https://www.figma.com/design/eTJz6aPgudMY9E6mzyZU0B?node-id=6775-627'], +}; + +const outOfScopeComponents = [ + 'src/components/ui/boundary-context.tsx', + 'src/components/ui/card.tsx', + 'src/components/ui/command.tsx', + 'src/components/ui/dialog.tsx', + 'src/components/ui/dropdown-menu.tsx', + 'src/components/ui/label.tsx', + 'src/components/ui/link-playground-adapter.tsx', + 'src/components/ui/progress.tsx', + 'src/components/ui/scroll-area.tsx', + 'src/components/ui/sheet.tsx', + 'src/components/ui/size-context.tsx', + 'src/components/ui/slide-over-panel-environment.tsx', +]; + +function readCanonicalFile(repositoryPath) { + return execFileSync( + 'git', + ['show', `${CANONICAL_COMMIT}:${repositoryPath}`], + {cwd: sentryRepository, encoding: 'utf8'} + ); +} + +function canonicalPathExists(repositoryPath) { + try { + execFileSync( + 'git', + ['cat-file', '-e', `${CANONICAL_COMMIT}:${repositoryPath}`], + {cwd: sentryRepository, stdio: 'ignore'} + ); + return true; + } catch { + return false; + } +} + +function resolveCanonicalSource(moduleDirectory, moduleSpecifier) { + const base = path.posix.join(moduleDirectory, moduleSpecifier); + for (const candidate of [ + `${base}.tsx`, + `${base}.ts`, + path.posix.join(base, 'index.tsx'), + path.posix.join(base, 'index.ts'), + ]) { + if (canonicalPathExists(candidate)) { + return candidate; + } + } + throw new Error(`Parity manifest source missing: ${moduleSpecifier}`); +} + +function readCanonicalModule(moduleName) { + const moduleDirectory = path.posix.join(canonicalRoot, moduleName); + const indexFilename = canonicalPathExists(path.posix.join(moduleDirectory, 'index.tsx')) + ? 'index.tsx' + : 'index.ts'; + const indexPath = path.posix.join(moduleDirectory, indexFilename); + const source = readCanonicalFile(indexPath); + const sourceFile = ts.createSourceFile( + indexFilename, + source, + ts.ScriptTarget.Latest, + true, + indexFilename.endsWith('x') ? ts.ScriptKind.TSX : ts.ScriptKind.TS + ); + const sourcePaths = new Set([indexPath]); + + for (const statement of sourceFile.statements) { + if ( + statement.moduleSpecifier && + ts.isStringLiteral(statement.moduleSpecifier) && + statement.moduleSpecifier.text.startsWith('.') + ) { + sourcePaths.add( + resolveCanonicalSource(moduleDirectory, statement.moduleSpecifier.text) + ); + } + } + + return { + indexPath, + sourcePaths: [...sourcePaths, ...(canonicalBehaviorDependencies[moduleName] ?? [])].sort(), + publicExports: collectParityManifestExports(source, indexFilename), + }; +} + +async function existingPaths(paths) { + const result = []; + for (const candidate of paths) { + try { + await access(candidate); + result.push(candidate); + } catch {} + } + return result; +} + +const currentCommit = execFileSync('git', ['rev-parse', 'HEAD'], { + cwd: sentryRepository, + encoding: 'utf8', +}).trim(); +if (currentCommit !== CANONICAL_COMMIT) { + throw new Error( + `Parity manifest baseline mismatch: expected ${CANONICAL_COMMIT}, received ${currentCommit}` + ); +} + +const moduleNames = execFileSync( + 'git', + ['ls-tree', '--name-only', '-d', `${CANONICAL_COMMIT}:${canonicalRoot}`], + {cwd: sentryRepository, encoding: 'utf8'} +) + .trim() + .split('\n') + .filter(name => name && !EXCLUDED_DIRECTORIES.includes(name)) + .sort(); + +const modules = []; +for (const moduleName of moduleNames) { + const implementationPaths = [...(localModules[moduleName] ?? [])].sort(); + const kebabName = moduleName.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`); + const stories = await existingPaths( + implementationPaths.map(implementationPath => + implementationPath.replace(/\.tsx$/, '.stories.tsx') + ) + ); + const tests = + moduleName === 'checkbox' + ? [ + 'tests/e2e/playground.spec.ts', + 'tests/e2e/templates.spec.ts', + 'tests/figma/figma-preview.test.mjs', + ] + : moduleName === 'interactionStateLayer' + ? [ + 'tests/e2e/playground.spec.ts', + 'tests/parity/interaction-state-layer.test.mjs', + ] + : moduleName === 'layout' || moduleName === 'separator' + ? ['tests/parity/layout-separator.test.mjs'] + : moduleName === 'slot' + ? ['src/components/ui/slot.test.tsx', 'tests/parity/slot.test.mjs'] + : moduleName === 'dragHandle' + ? [ + 'src/components/ui/drag-handle.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/drag-handle.test.mjs', + ] + : moduleName === 'splitPanel' + ? [ + 'src/components/ui/split-panel.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/split-panel.test.mjs', + 'tests/types/split-panel-types.test.tsx', + ] + : moduleName === 'table' + ? [ + 'src/components/ui/table.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/table.test.mjs', + 'tests/types/table-types.test.tsx', + ] + : moduleName === 'statusIndicator' + ? [ + 'src/components/ui/status-indicator.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/status-indicator.test.mjs', + 'tests/types/status-indicator-types.test.tsx', + ] + : moduleName === 'revealOnHover' + ? [ + 'src/components/ui/reveal-on-hover.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/reveal-on-hover.test.mjs', + 'tests/types/reveal-on-hover-types.test.tsx', + ] + : moduleName === 'hotkey' + ? [ + 'src/components/ui/hotkey.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/hotkey.test.mjs', + 'tests/types/hotkey-types.test.tsx', + ] + : moduleName === 'image' + ? [ + 'src/components/ui/image.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/image.test.mjs', + 'tests/types/image-types.test.tsx', + ] + : moduleName === 'backdrop' + ? [ + 'src/components/ui/backdrop.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/backdrop.test.mjs', + 'tests/types/backdrop-types.test.tsx', + ] + : moduleName === 'code' + ? [ + 'src/components/ui/code.test.tsx', + 'src/components/ui/prism-concurrent.test.ts', + 'src/components/ui/prism.test.ts', + 'tests/e2e/playground.spec.ts', + 'tests/parity/code.test.mjs', + 'tests/types/code-types.test.tsx', + ] + : moduleName === 'emptyState' + ? [ + 'src/app/evidence/empty-state-server/page.tsx', + 'src/components/ui/empty-state.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/empty-state.test.mjs', + 'tests/types/empty-state-types.test.tsx', + ] + : moduleName === 'loader' + ? [ + 'src/app/evidence/loader-server/page.tsx', + 'src/components/ui/loader.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/e2e/templates.spec.ts', + 'tests/parity/loader.test.mjs', + 'tests/types/loader-types.test.tsx', + ] + : moduleName === 'slideOverPanel' + ? [ + 'src/components/ui/slide-over-panel.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/slide-over-panel.test.mjs', + 'tests/types/slide-over-panel-types.test.tsx', + ] + : moduleName === 'tooltip' + ? [ + 'src/components/ui/tooltip.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/tooltip.test.mjs', + 'tests/types/tooltip-types.test.tsx', + ] + : moduleName === 'link' + ? [ + 'src/components/ui/link.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/link.test.mjs', + 'tests/types/link-types.test.tsx', + ] + : moduleName === 'quote' + ? [ + 'src/app/evidence/quote-server/page.tsx', + 'src/components/ui/quote.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/quote.test.mjs', + 'tests/types/quote-types.test.tsx', + ] + : moduleName === 'text' + ? [ + 'src/components/ui/text.test.tsx', + 'tests/e2e/playground.spec.ts', + 'tests/parity/text-ssr.test.mjs', + 'tests/parity/text.test.mjs', + 'tests/types/text-types.test.tsx', + ] + : []; + const completionNote = completionEvidence[moduleName]; + + modules.push({ + name: moduleName, + canonical: await readCanonicalModule(moduleName), + local: { + implementationPaths, + implementedExports: await collectParityManifestFileExports(implementationPaths), + registryItems: [...(registryItems[moduleName] ?? [])].sort(), + stories, + tests, + codeConnect: + moduleName === 'checkbox' ? ['src/components/ui/checkbox.figma.ts'] : [], + figmaNodes: [...(figmaNodes[moduleName] ?? [])].sort(), + playgroundPath: + moduleName === 'dragHandle' + ? '/?component=drag-handle' + : moduleName === 'splitPanel' + ? '/?component=split-panel' + : moduleName === 'table' + ? '/?component=table' + : moduleName === 'statusIndicator' + ? '/?component=status-indicator' + : moduleName === 'revealOnHover' + ? '/?component=reveal-on-hover' + : moduleName === 'hotkey' + ? '/?component=hotkey' + : moduleName === 'image' + ? '/?component=image' + : moduleName === 'backdrop' + ? '/?component=backdrop' + : moduleName === 'slideOverPanel' + ? '/?component=slide-over-panel' + : moduleName === 'tooltip' + ? '/?component=tooltip' + : moduleName === 'link' + ? '/?component=link' + : moduleName === 'code' + ? '/?component=code' + : moduleName === 'emptyState' + ? '/?component=empty-state' + : moduleName === 'loader' + ? '/?component=loader' + : moduleName === 'quote' + ? '/?component=quote' + : moduleName === 'text' + ? '/?component=text' + : moduleName === 'checkbox' || + moduleName === 'interactionStateLayer' || + moduleName === 'layout' || + moduleName === 'separator' || + moduleName === 'slot' + ? '/?component=checkbox' + : null, + }, + completion: { + state: completionNote + ? 'complete' + : implementationPaths.length > 0 + ? 'partial' + : 'missing', + complete: Boolean(completionNote), + note: completionNote ?? + (moduleName === 'emptyState' + ? 'The local EmptyState implementation, workbench, focused tests, and intended registry dependency URLs are present. Figma, Code Connect, and installation from the protected shared registry have not been verified.' + : moduleName === 'loader' + ? 'The local Loader implementation, template-backed workbench, server evidence, focused tests, and local registry item are present. The shared hosted Layout and Text registry dependencies are protected, so public dependency installation is not verified. No canonical Loader Figma node is recorded.' + : moduleName === 'slideOverPanel' + ? 'The local SlideOverPanel implementation, navigation-offset environment seam, boundary context, deferred-content workbench, focused tests, and self-contained local registry item are present. The hosted registry endpoint is protected, so public installation is not verified. No canonical Figma node is recorded.' + : moduleName === 'tooltip' + ? 'The local Tooltip API, positioning, delay group, overflow observation, motion, workbench, focused tests, and self-contained registry item are present. The canonical Figma node and Code Connect mapping have not been verified.' + : implementationPaths.length > 0 + ? 'A local implementation exists, but exact contract, behavior, visual, registry, and Figma gates have not all passed.' + : `No local ${kebabName} implementation is mapped.`), + }, + }); +} + +const manifest = { + schemaVersion: 1, + canonical: { + repository: 'getsentry/sentry', + commit: CANONICAL_COMMIT, + root: 'static/app/components/core', + excludedDirectories: EXCLUDED_DIRECTORIES, + }, + scope: { + targetModuleCount: 48, + outOfScopeLocalComponents: outOfScopeComponents, + }, + modules, +}; + +const manifestOutput = process.env.PARITY_MANIFEST_OUTPUT ?? 'scraps-parity.json'; +await writeFile(manifestOutput, `${JSON.stringify(manifest, null, 2)}\n`); +process.stdout.write(`Generated ${manifestOutput} with ${modules.length} modules.\n`); diff --git a/scripts/generate-prism-loaders.mjs b/scripts/generate-prism-loaders.mjs new file mode 100644 index 0000000..db1853f --- /dev/null +++ b/scripts/generate-prism-loaders.mjs @@ -0,0 +1,275 @@ +import {readFile, writeFile} from 'node:fs/promises'; +import {createRequire} from 'node:module'; + +import prismComponents from 'prismjs/components.js'; + +const outputPath = new URL( + process.env.PRISM_LOADERS_OUTPUT ?? + '../src/components/ui/prism-language-loaders.ts', + import.meta.url +); +const reloaderOutputPath = new URL( + process.env.PRISM_RELOADERS_OUTPUT ?? + '../src/components/ui/prism-language-reloaders.js', + import.meta.url +); +const reloaderTypesOutputPath = new URL( + process.env.PRISM_RELOADERS_TYPES_OUTPUT ?? + '../src/components/ui/prism-language-reloaders.d.ts', + import.meta.url +); +const prismLicensePath = new URL( + '../node_modules/prismjs/LICENSE', + import.meta.url +); +const languages = Object.entries(prismComponents.languages) + .filter(([language]) => language !== 'meta') + .sort(([a], [b]) => a.localeCompare(b)); + +const require = createRequire(import.meta.url); + +function collectPreloadedLanguageHookIndexes() { + const Prism = require('prismjs/components/prism-core.js'); + const previousPrism = globalThis.Prism; + const hookIndexes = {}; + globalThis.Prism = Prism; + + try { + for (const language of ['markup', 'css', 'clike', 'javascript']) { + const languageHookIndexes = {}; + const addHook = Prism.hooks.add; + Prism.hooks.add = function addOwnedHook(name, callback) { + const indexes = languageHookIndexes[name] ?? []; + indexes.push(Prism.hooks.all[name]?.length ?? 0); + languageHookIndexes[name] = indexes; + return addHook.call(this, name, callback); + }; + try { + require(`prismjs/components/prism-${language}.js`); + } finally { + Prism.hooks.add = addHook; + } + if (Object.keys(languageHookIndexes).length > 0) { + hookIndexes[language] = languageHookIndexes; + } + } + } finally { + if (previousPrism === undefined) delete globalThis.Prism; + else globalThis.Prism = previousPrism; + } + + return hookIndexes; +} + +const preloadedLanguageHookIndexes = collectPreloadedLanguageHookIndexes(); + +function toArray(value) { + if (!value) return []; + return Array.isArray(value) ? value : [value]; +} + +const metadataByLanguage = new Map(languages); +const dependencyCache = new Map(); + +function getDependencies(language, stack = []) { + const cached = dependencyCache.get(language); + if (cached) return cached; + if (stack.includes(language)) { + throw new Error(`Circular Prism dependency: ${[...stack, language].join(' -> ')}`); + } + + const metadata = metadataByLanguage.get(language); + const dependencies = new Set([ + ...toArray(metadata?.require), + ...toArray(metadata?.optional), + ...toArray(metadata?.modify), + ]); + for (const dependency of [...dependencies]) { + for (const transitiveDependency of getDependencies(dependency, [ + ...stack, + language, + ])) { + dependencies.add(transitiveDependency); + } + } + dependencyCache.set(language, dependencies); + return dependencies; +} + +const modifiers = languages.flatMap(([language, metadata]) => + toArray(metadata.modify).length > 0 + ? [[language, toArray(metadata.modify)]] + : [] +); + +const loaders = languages + .map( + ([language]) => + ` ${JSON.stringify(language)}: () => import(${JSON.stringify( + `prismjs/components/prism-${language}.min.js` + )}),` + ) + .join('\n'); +const dependencies = languages + .flatMap(([language, metadata]) => { + const required = toArray(metadata.require); + if (required.length === 0) return []; + return [ + ` ${JSON.stringify(language)}: ${JSON.stringify(required)},`, + ]; + }) + .join('\n'); +const optionalDependencies = languages + .flatMap(([language, metadata]) => { + const optional = toArray(metadata.optional); + if (optional.length === 0) return []; + return [` ${JSON.stringify(language)}: ${JSON.stringify(optional)},`]; + }) + .join('\n'); +const modifications = languages + .flatMap(([language, metadata]) => { + const modified = toArray(metadata.modify); + if (modified.length === 0) return []; + return [` ${JSON.stringify(language)}: ${JSON.stringify(modified)},`]; + }) + .join('\n'); +const reloadableLanguages = languages.filter(([language]) => { + const dependencyTree = [language, ...getDependencies(language)]; + const hasOptionalDependency = dependencyTree.some( + dependency => toArray(metadataByLanguage.get(dependency)?.optional).length > 0 + ); + const affectedLanguages = new Set(dependencyTree); + const canBeModified = modifiers.some(([, modified]) => + modified.some(target => affectedLanguages.has(target)) + ); + return hasOptionalDependency || canBeModified; +}); +const reloaders = reloadableLanguages + .map( + ([language]) => + ` ${JSON.stringify(language)}: () => import("./prism-language-reloaders.js").then(({ reloadPrismLanguage }) => reloadPrismLanguage(${JSON.stringify(language)})),` + ) + .join('\n'); +const aliases = languages + .flatMap(([language, metadata]) => { + if (!metadata.alias) return []; + const values = Array.isArray(metadata.alias) + ? metadata.alias + : [metadata.alias]; + return values.map( + alias => ` ${JSON.stringify(alias)}: ${JSON.stringify(language)},` + ); + }) + .sort() + .join('\n'); + +const source = `export type PrismLanguageLoader = () => Promise; + +export const prismLanguageLoaders: Record = { +${loaders} +}; + +export const prismLanguageDependencies: Record = { +${dependencies} +}; + +export const prismLanguageOptionalDependencies: Record = { +${optionalDependencies} +}; + +export const prismLanguageModifications: Record = { +${modifications} +}; + +export const prismLanguageReloaders: Record = { +${reloaders} +}; + +export const prismLanguageAliases: Record = { +${aliases} +}; + +export const prismPreloadedLanguageHookIndexes: Record> = ${JSON.stringify(preloadedLanguageHookIndexes, null, 2)}; +`; + +const reloaderEntries = await Promise.all( + reloadableLanguages.map(async ([language]) => { + const componentPath = new URL( + `../node_modules/prismjs/components/prism-${language}.min.js`, + import.meta.url + ); + const componentSource = await readFile(componentPath, 'utf8'); + return ` ${JSON.stringify(language)}: () => {\n${componentSource}\n },`; + }) +); +const prismLicense = (await readFile(prismLicensePath, 'utf8')).trim(); +const reloaderSource = `/*! +${prismLicense} +*/ +/* eslint-disable */ +import Prism from "prismjs"; + +const prismLanguageReloaders = { +${reloaderEntries.join('\n')} +}; + +const languageHooksKey = Symbol.for("scrapscn.prism.registered-language-hooks"); +const registeredLanguageHooks = Prism[languageHooksKey] ?? new Map(); +Prism[languageHooksKey] = registeredLanguageHooks; + +function snapshotHooks() { + return new Map( + Object.entries(Prism.hooks.all).map(([name, hooks]) => [name, [...hooks]]) + ); +} + +function restoreHooks(snapshot) { + for (const name of Object.keys(Prism.hooks.all)) { + if (!snapshot.has(name)) delete Prism.hooks.all[name]; + } + for (const [name, hooks] of snapshot) Prism.hooks.all[name] = hooks; +} + +function collectAddedHooks(snapshot) { + const addedHooks = new Map(); + for (const [name, hooks] of Object.entries(Prism.hooks.all)) { + const previousHooks = snapshot.get(name) ?? []; + const added = hooks.filter(hook => !previousHooks.includes(hook)); + if (added.length > 0) addedHooks.set(name, added); + } + return addedHooks; +} + +function removeHooks(hooksToRemove) { + for (const [name, removedHooks] of hooksToRemove) { + const hooks = Prism.hooks.all[name]; + if (!hooks) continue; + Prism.hooks.all[name] = hooks.filter(hook => !removedHooks.includes(hook)); + } +} + +export function reloadPrismLanguage(language) { + const reload = prismLanguageReloaders[language]; + if (!reload) return; + const hookSnapshot = snapshotHooks(); + try { + reload(); + } catch (error) { + restoreHooks(hookSnapshot); + throw error; + } + + const addedHooks = collectAddedHooks(hookSnapshot); + const previousHooks = registeredLanguageHooks.get(language); + if (previousHooks) removeHooks(previousHooks); + registeredLanguageHooks.set(language, addedHooks); +} +`; +const reloaderTypesSource = `export function reloadPrismLanguage(language: string): void; +`; + +await Promise.all([ + writeFile(outputPath, source), + writeFile(reloaderOutputPath, reloaderSource), + writeFile(reloaderTypesOutputPath, reloaderTypesSource), +]); diff --git a/scripts/generate-template-manifest.mjs b/scripts/generate-template-manifest.mjs new file mode 100644 index 0000000..6c0a1f2 --- /dev/null +++ b/scripts/generate-template-manifest.mjs @@ -0,0 +1,15 @@ +import { writeFile } from "node:fs/promises" + +import { readTemplates } from "./template-files.mjs" + +const templates = await readTemplates() +const imports = templates + .map(({ directory }, index) => `import Template${index} from "./${directory}/template"`) + .join("\n") +const entries = templates + .map(({ metadata }, index) => ` { component: Template${index}, metadata: ${JSON.stringify(metadata)} },`) + .join("\n") +const source = `${imports}\n\nimport type { TemplateDefinition } from "./types"\n\nexport const templates = [\n${entries}\n] satisfies TemplateDefinition[]\n` + +await writeFile("src/templates/template-manifest.generated.ts", source) +process.stdout.write(`Generated ${templates.length} template${templates.length === 1 ? "" : "s"}.\n`) diff --git a/scripts/parity-manifest-exports.mjs b/scripts/parity-manifest-exports.mjs new file mode 100644 index 0000000..6e9cd4f --- /dev/null +++ b/scripts/parity-manifest-exports.mjs @@ -0,0 +1,75 @@ +import {readFile} from 'node:fs/promises'; + +import ts from 'typescript'; + +/** Reads the named runtime and type exports that are visible in one TypeScript source file. */ +export function collectParityManifestExports(source, filename) { + const sourceFile = ts.createSourceFile( + filename, + source, + ts.ScriptTarget.Latest, + true, + filename.endsWith('x') ? ts.ScriptKind.TSX : ts.ScriptKind.TS + ); + const runtime = []; + const types = []; + + for (const statement of sourceFile.statements) { + if ( + ts.isExportDeclaration(statement) && + statement.exportClause && + ts.isNamedExports(statement.exportClause) + ) { + for (const element of statement.exportClause.elements) { + const destination = + statement.isTypeOnly || element.isTypeOnly ? types : runtime; + destination.push(element.name.text); + } + continue; + } + + if (!statement.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword)) { + continue; + } + + if ( + (ts.isFunctionDeclaration(statement) || + ts.isClassDeclaration(statement) || + ts.isEnumDeclaration(statement)) && + statement.name + ) { + runtime.push(statement.name.text); + } else if ( + (ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)) && + statement.name + ) { + types.push(statement.name.text); + } else if (ts.isVariableStatement(statement)) { + for (const declaration of statement.declarationList.declarations) { + if (ts.isIdentifier(declaration.name)) runtime.push(declaration.name.text); + } + } + } + + return { + runtime: [...new Set(runtime)].sort(), + types: [...new Set(types)].sort(), + }; +} + +export async function collectParityManifestFileExports(paths) { + const runtime = []; + const types = []; + for (const filePath of paths) { + const exports = collectParityManifestExports( + await readFile(filePath, 'utf8'), + filePath + ); + runtime.push(...exports.runtime); + types.push(...exports.types); + } + return { + runtime: [...new Set(runtime)].sort(), + types: [...new Set(types)].sort(), + }; +} diff --git a/scripts/run-playwright.mjs b/scripts/run-playwright.mjs new file mode 100644 index 0000000..29dc31d --- /dev/null +++ b/scripts/run-playwright.mjs @@ -0,0 +1,14 @@ +import { spawn } from "node:child_process" +import { fileURLToPath } from "node:url" + +const serviceName = `scrapscn-e2e-${process.pid}` +const playwrightCli = fileURLToPath(new URL("../node_modules/playwright/cli.js", import.meta.url)) +const child = spawn(process.execPath, [playwrightCli, "test", ...process.argv.slice(2)], { + env: { ...process.env, SCRAPSCN_E2E_NAME: serviceName }, + stdio: "inherit", +}) + +child.on("exit", (code, signal) => { + if (signal) process.kill(process.pid, signal) + process.exit(code ?? 1) +}) diff --git a/scripts/template-files.mjs b/scripts/template-files.mjs new file mode 100644 index 0000000..29168f1 --- /dev/null +++ b/scripts/template-files.mjs @@ -0,0 +1,41 @@ +import { readdir, readFile } from "node:fs/promises" +import path from "node:path" + +export const templatesDirectory = path.resolve("src/templates") + +const slugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/ + +export async function readTemplates(templatesRoot = templatesDirectory) { + const entries = await readdir(templatesRoot, { withFileTypes: true }) + const templates = [] + + for (const entry of entries) { + if (!entry.isDirectory()) continue + + const metadataPath = path.join(templatesRoot, entry.name, "template.json") + const implementationPath = path.join(templatesRoot, entry.name, "template.tsx") + const metadata = JSON.parse(await readFile(metadataPath, "utf8")) + + const keys = Object.keys(metadata).sort() + const expectedKeys = ["description", "slug", "tags", "title"] + if (keys.join(",") !== expectedKeys.join(",")) { + throw new Error(`Template metadata keys are invalid: ${metadataPath}`) + } + + if (!slugPattern.test(entry.name) || metadata.slug !== entry.name) { + throw new Error(`Template directory and slug must match: ${entry.name}`) + } + if (typeof metadata.title !== "string" || !metadata.title.trim() || typeof metadata.description !== "string" || !metadata.description.trim() || !Array.isArray(metadata.tags) || metadata.tags.some((tag) => typeof tag !== "string" || !tag.trim()) || new Set(metadata.tags).size !== metadata.tags.length) { + throw new Error(`Template metadata is incomplete: ${metadataPath}`) + } + await readFile(implementationPath, "utf8") + templates.push({ directory: entry.name, metadata }) + } + + const slugs = templates.map(({ metadata }) => metadata.slug) + if (new Set(slugs).size !== slugs.length) { + throw new Error("Template slugs must be unique") + } + + return templates.sort((left, right) => left.metadata.title.localeCompare(right.metadata.title)) +} diff --git a/scripts/test-production-capture.mjs b/scripts/test-production-capture.mjs new file mode 100644 index 0000000..84a6e09 --- /dev/null +++ b/scripts/test-production-capture.mjs @@ -0,0 +1,20 @@ +import { readFile, readdir } from "node:fs/promises" +import path from "node:path" + +const roots = [".next/static", ".next/server"] +const prohibited = [ + "figmacapture", + "mcp.figma.com/mcp/html-to-design/capture.js", + "figma-capture-script", +] + +for (const root of roots) { + const files = await readdir(root, { recursive: true }) + for (const file of files.filter((entry) => entry.endsWith(".js"))) { + const contents = await readFile(path.join(root, file), "utf8") + const match = prohibited.find((value) => contents.includes(value)) + if (match) throw new Error(`Production artifact ${path.join(root, file)} contains ${match}`) + } +} + +process.stdout.write("Production runtime JavaScript excludes the Figma capture loader.\n") diff --git a/scripts/test-templates.mjs b/scripts/test-templates.mjs new file mode 100644 index 0000000..c1b508a --- /dev/null +++ b/scripts/test-templates.mjs @@ -0,0 +1,20 @@ +import { access, readFile } from "node:fs/promises" + +import { readTemplates } from "./template-files.mjs" + +const templates = await readTemplates() + +if (templates.length === 0) throw new Error("At least one template is required") +if (!templates.some(({ metadata }) => metadata.slug === "checkbox-settings")) { + throw new Error("The Checkbox settings slice template is missing") +} + +const generatedManifest = await readFile("src/templates/template-manifest.generated.ts", "utf8") +for (const { directory, metadata } of templates) { + await access(`src/templates/${directory}/template.tsx`) + if (!generatedManifest.includes(`./${directory}/template`) || !generatedManifest.includes(`\"slug\":${JSON.stringify(metadata.slug)}`)) { + throw new Error(`Generated template manifest is stale: ${metadata.slug}`) + } +} + +process.stdout.write(`Validated ${templates.length} template${templates.length === 1 ? "" : "s"}.\n`) diff --git a/scripts/validate-parity-manifest.mjs b/scripts/validate-parity-manifest.mjs new file mode 100644 index 0000000..61c3c0d --- /dev/null +++ b/scripts/validate-parity-manifest.mjs @@ -0,0 +1,220 @@ +import {createHash} from 'node:crypto'; +import {access, readFile, readdir} from 'node:fs/promises'; + +import {collectParityManifestFileExports} from './parity-manifest-exports.mjs'; + +const CANONICAL_COMMIT = 'd91f823d232ddd12a4d2a64554d85fd36df0e278'; +const EXPECTED_EXPORT_HASHES = { + alert: '6179f3951744d0fa0770984a1603f6c7a55c4d073ebd5c837c21321581b5e6ca', + avatar: '27f149882c7c278be7b55289a14cdec41f31d39d56af8d64313b2f4ef5d2dff6', + avatarButton: '64e78b90bb37c598d8da6ef602c2190b3e5dd05e11be7a76085c9c7bc32f603a', + backdrop: '2d954ee7c868666c5f0734724404dc505cf34a8c906b1f7cbee7149cb74934af', + badge: 'dcaedffa3de295f2c800a8aaa9c9a1e62a6710d0649a2541a0d6fcbb97e6fa2f', + breadcrumbList: '45441b1f2937588d124ad07f41bdc09a955047ed821cb11718ec51770a690992', + button: '1dbe36bed2a20d1b9cc76bbbb566cb63cde8d1ff531e7055019b7488cd1bed7e', + chat: '7d393781cf645320006b589043c519e8add57759254a00c5c33ad4f2c39dcd55', + checkbox: '2bccf04bfeb143ad1c24475b5f3c9505683867039dc9b7eaa03b232c99ba9fc7', + chip: '8e788598d905b777c01d8949ac176890f04fb64377fbdf58282379200d2a9f6a', + code: '0ea55946b1e42962ae88db719e8eefd85922e45681d5b1bbb94232ee52906f59', + compactSelect: 'e6c7cf7e8302acf6a4c997ac1555c8450bcf0cd4b73e557c5596f1973953de4b', + disclosure: '9041743e6bfc74a42afc157d9f5cc5f72525970d7360d5b310e92bec1a6dd355', + dragHandle: '490ee01654a24b87dee7b48a104436ca513d71e17c85b322f8797fd242eaf472', + drawer: 'd41ac11f0d70917d34ed91dbab6076ddc2d1993e43cf107b38011ff091360dc3', + emptyState: '04dd848a4ff318113d7a4067621b8de34ec0206bf2028ae33091bf93f95444cf', + form: '7ae992af2b921b00df4171c85474d294cb60cbd1496e3fad18e2bc59e9d9b43b', + hotkey: 'a0addbd9db57a1ff63a2d0ded61853a7f84ff97e4c6f263e4c5c79c64abe2cc8', + image: 'ec82fbe4600dcc9739c385f12da4d3ca274b34c162a6f0bdd5661b7e4240ec2c', + info: 'b4fd2354c5e79ed86f18164ce0ea3d7d593f1a35b5d79c1fa856c7a93d0d7b06', + input: '220cb54816ec79cabf9bf8f1507422aa37a64e1bdfad68f95d5610b07b499b3f', + interactionStateLayer: '7c854731be10e88c9b38e22c4f88b2896c6434cf2fc4133c55512bf92777ba20', + layout: 'e0029f9dd8c4259067358d6b25c5332a7b18b66579f34ca577eeab504c127c92', + link: '7ed0c825c0d7ef99c21d8e9777d050d75c8a50d4872825d990c78ea706793130', + loader: 'e9c5bb1e9bd2f64a4b14bdeb34db834aa499e897cf58271882e4e224c57b15b9', + markdown: '5abce650069702e3b6f033f7d19755df548e4832d34b61ed56610fbd4d4c9a0f', + menuListItem: 'fb257b80ec85b69a825f9bdbe545d96beea98cfcf732ed054b836ae70b18ee4f', + modal: '0aab4945b10f6ddc616871091574488325b1be22272758849ef5efc12ae90e78', + pagination: '19e88e545844740e571eb05439fbcf48435986d2e08e42f506ce6285f95a524b', + pictureInPicture: '381fb8129361b80da0c4cb8aee3dff41e42be17f9e465508e02b95b2c800802d', + quote: 'c689ecdb2455e5a62618342d98bdf451805582ce79aaa646b70884ee40ff9311', + radio: '2d81a420a08de0a907b4cbf6ca4397ab5d414d524a16d5c9eb5679c51d9dbab4', + revealOnHover: 'c869444f4e4bcf609d84250e06efc42ba149c9836092344ca8238c5b0af633e7', + segmentedControl: '9aa791fcf0293679e25af62136b787c8ae15aca16dfe988ae92448f0636e37d6', + select: 'a668b49d8ac99f1af4b1cdc6566bd1e4bc96a6ea48aca4308005ab53b5c9fed3', + separator: 'a4d2b99cb8feaf15203adb4fd0be73a84568c276fcf62220d13f4717afa44c31', + slideOverPanel: 'd40c166928be1024aeb22b64fbcc0bdba02b39b8c5aa89aae9692ae482ff404b', + slider: 'dbc97f5e3a6a064bd6bbe7118d094f48132e83315810203ada0eeeec64b3d165', + slot: '784cb004f7cd2a6a3bd396537fb68a6a0b8dcc96c62a86002fccee18c176fe2d', + splitPanel: 'bd39e7a84210bc0585753db6c88f5bd16aebe9dc8589e9175e7620fdc68a7d28', + statusIndicator: '0ac6a0a147a2aa1da6f46e191d38d981cf645c62aa0bd94cfb9aae3ca60e447b', + switch: '52836df3fdf2485d6656bbb2f859303b9dfb1b66ea35c9bc22d2ee103db56526', + table: '3b07413df631a1798dede81031335e72ae34f183f3fa57cbcabde0f4e8f8bd08', + tabs: 'a3e08f017acdfb1c83f0195d1cd714d4b42f10afb533dd2762cf0c88891b89e6', + text: '1353bbe83857791070516d8eb3d49a285e697037af58b02da596992248a45b02', + textarea: '2aeee15d19ba0c9bcc4185ec2353e0aae004d34fa348e3154cc9811db777a109', + toast: 'f46dd66d3b91322ec4f260e3fb3b156885a758bbb665f65d314b47f1e27da7d9', + tooltip: 'b1eefc1536d33990ab83791244fd05c8d9190e3fdb551aeca44be5249e00ac19', +}; + +function parityManifestError(message) { + throw new Error(`Parity manifest invalid: ${message}`); +} + +function assertSortedUnique(values, label) { + if (!Array.isArray(values)) parityManifestError(`${label} must be an array`); + const sorted = [...new Set(values)].sort(); + if (JSON.stringify(values) !== JSON.stringify(sorted)) { + parityManifestError(`${label} must be sorted and contain no duplicates`); + } +} + +function hashPublicExports(publicExports) { + return createHash('sha256').update(JSON.stringify(publicExports)).digest('hex'); +} + +async function assertPathsExist(paths, label) { + for (const filePath of paths) { + try { + await access(filePath); + } catch { + parityManifestError(`${label} points to missing file ${filePath}`); + } + } +} + +const manifestPath = process.env.PARITY_MANIFEST_PATH ?? 'scraps-parity.json'; +const manifest = JSON.parse(await readFile(manifestPath, 'utf8')); +const registry = JSON.parse(await readFile('registry.json', 'utf8')); +const expectedModuleNames = Object.keys(EXPECTED_EXPORT_HASHES).sort(); +const moduleNames = manifest.modules.map(parityModule => parityModule.name); + +if (manifest.schemaVersion !== 1) parityManifestError('schemaVersion must be 1'); +if (manifest.canonical.commit !== CANONICAL_COMMIT) { + parityManifestError(`canonical commit must be ${CANONICAL_COMMIT}`); +} +if (manifest.scope.targetModuleCount !== 48 || manifest.modules.length !== 48) { + parityManifestError('scope must contain exactly 48 regular Scraps modules'); +} +if (JSON.stringify(moduleNames) !== JSON.stringify(expectedModuleNames)) { + parityManifestError('module names must match the pinned regular Scraps inventory'); +} +if ( + JSON.stringify(manifest.canonical.excludedDirectories) !== + JSON.stringify(['overview', 'patterns', 'principles']) +) { + parityManifestError('only the three documentation directories may be excluded'); +} + +const registryByName = new Map(registry.items.map(item => [item.name, item])); +const claimedImplementationPaths = []; +let partialCount = 0; +let completeCount = 0; + +for (const parityModule of manifest.modules) { + const label = `modules.${parityModule.name}`; + const {canonical, local, completion} = parityModule; + assertSortedUnique(canonical.sourcePaths, `${label}.canonical.sourcePaths`); + assertSortedUnique(canonical.publicExports.runtime, `${label}.canonical.publicExports.runtime`); + assertSortedUnique(canonical.publicExports.types, `${label}.canonical.publicExports.types`); + assertSortedUnique(local.implementationPaths, `${label}.local.implementationPaths`); + assertSortedUnique(local.implementedExports.runtime, `${label}.local.implementedExports.runtime`); + assertSortedUnique(local.implementedExports.types, `${label}.local.implementedExports.types`); + assertSortedUnique(local.registryItems, `${label}.local.registryItems`); + assertSortedUnique(local.stories, `${label}.local.stories`); + assertSortedUnique(local.tests, `${label}.local.tests`); + assertSortedUnique(local.codeConnect, `${label}.local.codeConnect`); + assertSortedUnique(local.figmaNodes, `${label}.local.figmaNodes`); + + if (!canonical.sourcePaths.includes(canonical.indexPath)) { + parityManifestError(`${label}.canonical.sourcePaths must include indexPath`); + } + if ( + hashPublicExports(canonical.publicExports) !== + EXPECTED_EXPORT_HASHES[parityModule.name] + ) { + parityManifestError(`${label}.canonical.publicExports differs from the pinned contract`); + } + + const localPaths = [ + ...local.implementationPaths, + ...local.stories, + ...local.tests, + ...local.codeConnect, + ]; + await assertPathsExist(localPaths, label); + claimedImplementationPaths.push(...local.implementationPaths); + + const currentExports = await collectParityManifestFileExports( + local.implementationPaths + ); + if (JSON.stringify(currentExports) !== JSON.stringify(local.implementedExports)) { + parityManifestError(`${label}.local.implementedExports is stale`); + } + + for (const registryItemName of local.registryItems) { + const registryItem = registryByName.get(registryItemName); + if (!registryItem) parityManifestError(`${label} references unknown registry item ${registryItemName}`); + const registryPaths = registryItem.files.map(file => file.path); + if (!registryPaths.some(filePath => local.implementationPaths.includes(filePath))) { + parityManifestError(`${label} registry item ${registryItemName} does not publish a mapped implementation`); + } + } + for (const figmaNode of local.figmaNodes) { + if (!/^https:\/\/www\.figma\.com\/design\/[\w-]+\?node-id=\d+-\d+$/.test(figmaNode)) { + parityManifestError(`${label} has an invalid Figma node URL`); + } + } + + if (completion.state === 'missing') { + if (local.implementationPaths.length > 0 || completion.complete) { + parityManifestError(`${label} cannot be missing with a local implementation`); + } + } else if (completion.state === 'partial') { + partialCount += 1; + if (local.implementationPaths.length === 0 || completion.complete) { + parityManifestError(`${label} cannot be partial without an incomplete implementation`); + } + } else if (completion.state === 'complete') { + completeCount += 1; + const missingRuntimeExport = canonical.publicExports.runtime.find( + exportName => !local.implementedExports.runtime.includes(exportName) + ); + const missingTypeExport = canonical.publicExports.types.find( + exportName => !local.implementedExports.types.includes(exportName) + ); + if ( + !completion.complete || + local.registryItems.length === 0 || + local.stories.length === 0 || + local.tests.length === 0 || + missingRuntimeExport || + missingTypeExport + ) { + parityManifestError(`${label} does not meet the machine-checkable complete contract`); + } + } else { + parityManifestError(`${label}.completion.state is unknown`); + } +} + +assertSortedUnique(manifest.scope.outOfScopeLocalComponents, 'scope.outOfScopeLocalComponents'); +await assertPathsExist(manifest.scope.outOfScopeLocalComponents, 'scope.outOfScopeLocalComponents'); +const localUiFiles = (await readdir('src/components/ui')) + .filter( + filename => + filename.endsWith('.tsx') && + !filename.includes('.stories.') && + !filename.includes('.test.') + ) + .map(filename => `src/components/ui/${filename}`) + .sort(); +const classifiedLocalFiles = [ + ...claimedImplementationPaths, + ...manifest.scope.outOfScopeLocalComponents, +].sort(); +if (JSON.stringify(localUiFiles) !== JSON.stringify(classifiedLocalFiles)) { + parityManifestError('every local UI implementation must be mapped or explicitly out of scope'); +} + +process.stdout.write( + `Validated 48 modules: ${completeCount} complete, ${partialCount} partial, ${48 - partialCount - completeCount} missing.\n` +); diff --git a/src/app/evidence/code-server/page.tsx b/src/app/evidence/code-server/page.tsx new file mode 100644 index 0000000..9fb2257 --- /dev/null +++ b/src/app/evidence/code-server/page.tsx @@ -0,0 +1,24 @@ +import { CodeBlock, InlineCode, inlineCodeStyles } from "@/components/ui/code"; + +const serializedInlineCode = inlineCodeStyles({ + font: { family: { mono: "monospace" } }, + radius: { "2xs": "3px" }, + tokens: { + background: { + transparent: { + neutral: { muted: "transparent" }, + promotion: { muted: "transparent" }, + }, + }, + content: { primary: "black", promotion: "purple" }, + }, +}); + +export default function CodeServerEvidence() { + return ( +
+ {"const server = true;"} + server-safe +
+ ); +} diff --git a/src/app/evidence/empty-state-server/page.tsx b/src/app/evidence/empty-state-server/page.tsx new file mode 100644 index 0000000..ad91689 --- /dev/null +++ b/src/app/evidence/empty-state-server/page.tsx @@ -0,0 +1,5 @@ +import { EmptyState } from "@/components/ui/empty-state"; + +export default function EmptyStateServerEvidencePage() { + return ; +} diff --git a/src/app/evidence/image-server/page.tsx b/src/app/evidence/image-server/page.tsx new file mode 100644 index 0000000..44ece85 --- /dev/null +++ b/src/app/evidence/image-server/page.tsx @@ -0,0 +1,14 @@ +import { Image } from "@/components/ui/image"; + +export default function ImageServerConsumptionPage() { + return ( +
+ Server image +
+ ); +} diff --git a/src/app/evidence/loader-server/page.tsx b/src/app/evidence/loader-server/page.tsx new file mode 100644 index 0000000..a5f9cf9 --- /dev/null +++ b/src/app/evidence/loader-server/page.tsx @@ -0,0 +1,9 @@ +import { IndeterminateLoader } from "@/components/ui/loader"; + +export default function LoaderServerEvidencePage() { + return ( +
+ +
+ ); +} diff --git a/src/app/evidence/quote-server/page.tsx b/src/app/evidence/quote-server/page.tsx new file mode 100644 index 0000000..9aeed4d --- /dev/null +++ b/src/app/evidence/quote-server/page.tsx @@ -0,0 +1,31 @@ +import { Quote } from "@/components/ui/quote"; + +const quoteCases = [ + { id: "absent", source: undefined }, + { id: "empty", source: {} }, + { id: "href-only", source: { href: "https://example.com/href-only" } }, + { id: "author-only", source: { author: "Ada" } }, + { id: "label-only", source: { label: "Notes" } }, + { + id: "full", + source: { author: "Ada", href: "https://example.com/full", label: "Notes" }, + }, +] as const; + +export default function QuoteServerConsumptionPage() { + return ( +
+ {quoteCases.map((quoteCase) => ( +
+ {quoteCase.source === undefined ? ( + Server-rendered regular Scraps quotation. + ) : ( + + Server-rendered regular Scraps quotation. + + )} +
+ ))} +
+ ); +} diff --git a/src/app/evidence/status-indicator-server/page.tsx b/src/app/evidence/status-indicator-server/page.tsx new file mode 100644 index 0000000..30ae4d9 --- /dev/null +++ b/src/app/evidence/status-indicator-server/page.tsx @@ -0,0 +1,9 @@ +import { StatusIndicator } from "@/components/ui/status-indicator"; + +export default function StatusIndicatorServerConsumptionPage() { + return ( +
+ +
+ ); +} diff --git a/src/app/globals.css b/src/app/globals.css index 85d0df9..7cf0d99 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -7,7 +7,7 @@ @theme inline { /* Fonts */ --font-sans: "Rubik", system-ui, sans-serif; - --font-mono: "Roboto Mono", ui-monospace, monospace; + --font-mono: "Roboto Mono Variable", "Roboto Mono", ui-monospace, monospace; --font-heading: "Dammit Sans", var(--font-sans); /* Core semantic colors */ @@ -30,6 +30,10 @@ --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); + --color-checkbox-border: var(--checkbox-border); + --color-checkbox-checked: var(--checkbox-checked); + --color-checkbox-checked-chonk: var(--checkbox-checked-chonk); + --color-checkbox-focus: var(--checkbox-focus); /* Sentry-specific semantic colors */ --color-warning: var(--warning); @@ -148,6 +152,133 @@ --border: oklch(0.926 0.004 286.3); /* #E6E6E9 */ --input: oklch(0.888 0.007 295.4); /* #DAD9DE */ --ring: oklch(0.580 0.241 285.2); /* #7553FF (blurple) */ + --scraps-link-disabled: #878490; + --checkbox-border: #DAD9DE; + --checkbox-checked: #7553FF; + --checkbox-checked-chonk: #5827D6; + --checkbox-focus: #7553FF; + + /* Regular Scraps layout semantic border aliases. */ + --scraps-theme-border-primary: #dad9de; + --scraps-theme-border-secondary: #e6e6e9; + --scraps-theme-border-muted: #e6e6e9; + --scraps-theme-border-accent: #7553ff; + --scraps-theme-border-danger: #ff002b; + --scraps-theme-border-success: #00f261; + --scraps-theme-border-warning: #ffce00; + --scraps-theme-border-promotion: #ff70bc; + --scraps-hotkey-background-primary: #ffffff; + --scraps-hotkey-background-secondary: #f8f8f9; + --scraps-hotkey-border-primary: #dad9de; + --scraps-hotkey-content-primary: #302e36; + --scraps-hotkey-content-secondary: #6a6772; + --scraps-theme-shadow-low: 0px 1px 0px 0px #0000200f; + --scraps-theme-shadow-medium: 0px 2px 0px 1px #10103008, + 0px 1px 0px 0px #10103008; + --scraps-theme-shadow-high: 0px 4px 0px 2px #10103008, + 0px 1px 0px 1px #10103008; + + /* Regular Scraps StatusIndicator semantic tokens. */ + --scraps-status-accent-dot: #7553ff; + --scraps-status-accent-pulse: #0008f012; + --scraps-status-danger-dot: #ff002b; + --scraps-status-danger-pulse: #f828081c; + --scraps-status-warning-dot: #ffce00; + --scraps-status-warning-pulse: #e0b01030; + --scraps-status-success-dot: #00f261; + --scraps-status-success-pulse: #00b8001c; + --scraps-status-promotion-dot: #fc5cb4; + --scraps-status-promotion-pulse: #f000901a; + --scraps-status-muted-dot: #c0bec6; + --scraps-status-muted-pulse: #0000200f; + --scraps-backdrop-background: #10082845; + --scraps-slide-over-background: #ffffff; + --scraps-slide-over-content: #302e36; + --scraps-slide-over-shadow: 0px 4px 0px 2px #10103008, + 0px 1px 0px 1px #10103008; + --scraps-content-primary: #302e36; + --scraps-content-secondary: #6a6772; + --scraps-content-accent: #653de9; + --scraps-content-promotion: #c8007e; + --scraps-content-danger: #d50000; + --scraps-content-warning: #a45200; + --scraps-content-success: #008900; + --scraps-inline-code-content: #c8007e; + --scraps-inline-code-background: #f000901a; + --scraps-inline-code-neutral-content: #302e36; + --scraps-inline-code-neutral-background: #0000200f; + --scraps-code-accent: #7553ff; + --scraps-code-button-active: #0000181a; + --scraps-code-button-hover: #0000200f; + --scraps-code-focus: #7553ff; + --scraps-code-focus-mask: #ffffff; + --scraps-code-tooltip-background: #ffffff; + --scraps-code-tooltip-arrow-background: #ffffff; + --scraps-code-tooltip-content: #302e36; + --prism-base: #302e36; + --prism-block-background: #f8f8f9; + --prism-comment: #6a6772; + --prism-function: #653de9; + --prism-highlight-accent: #00002026; + --prism-highlight-background: #0000200f; + --prism-keyword: #d50000; + --prism-operator: #653de9; + --prism-property: #653de9; + --prism-punctuation: #302e36; + --prism-selector: #008900; + --prism-variable: #302e36; + + /* Canonical Sentry theme aliases accepted by legacy Scraps color props. */ + --scraps-theme-black: #000000; + --scraps-theme-white: #FFFFFF; + --scraps-theme-surface500: #FFFFFF; + --scraps-theme-surface400: #F8F8F9; + --scraps-theme-surface300: #F0F0F2; + --scraps-theme-surface200: #E6E6E9; + --scraps-theme-surface100: #DAD9DE; + --scraps-theme-gray800: #3E3B45; + --scraps-theme-gray700: #4C4954; + --scraps-theme-gray600: #5B5864; + --scraps-theme-gray500: #6A6772; + --scraps-theme-gray400: #787581; + --scraps-theme-gray300: #00002026; + --scraps-theme-gray200: #0000181A; + --scraps-theme-gray100: #0000200F; + --scraps-theme-blue700: #4C0FC0; + --scraps-theme-blue600: #5827D6; + --scraps-theme-blue500: #653DE9; + --scraps-theme-blue400: #7553FF; + --scraps-theme-blue300: #1008F82E; + --scraps-theme-blue200: #1010F81F; + --scraps-theme-blue100: #0008F012; + --scraps-theme-pink700: #9F005F; + --scraps-theme-pink600: #B5006F; + --scraps-theme-pink500: #C8007E; + --scraps-theme-pink400: #D9008D; + --scraps-theme-pink300: #F840A852; + --scraps-theme-pink200: #F8008829; + --scraps-theme-pink100: #F000901A; + --scraps-theme-red700: #AB0000; + --scraps-theme-red600: #C10000; + --scraps-theme-red500: #D50000; + --scraps-theme-red400: #FF002B; + --scraps-theme-red300: #F8483052; + --scraps-theme-red200: #F8301030; + --scraps-theme-red100: #F828081C; + --scraps-theme-yellow700: #813100; + --scraps-theme-yellow600: #934100; + --scraps-theme-yellow500: #A45200; + --scraps-theme-yellow400: #D59600; + --scraps-theme-yellow300: #E8B8308C; + --scraps-theme-yellow200: #E0A8084D; + --scraps-theme-yellow100: #E0B01030; + --scraps-theme-green700: #006700; + --scraps-theme-green600: #007800; + --scraps-theme-green500: #008900; + --scraps-theme-green400: #009800; + --scraps-theme-green300: #00B8104A; + --scraps-theme-green200: #08B81833; + --scraps-theme-green100: #00B8001C; /* Sentry-specific semantic — background-safe vibrant values */ --warning: oklch(0.869 0.178 91.3); /* #FFCE00 */ @@ -238,6 +369,128 @@ --border: oklch(0.383 0.026 303.4); /* #46404F */ --input: oklch(0.432 0.029 301.3); /* #534D5E */ --ring: oklch(0.580 0.241 285.2); /* Blurple */ + --scraps-link-disabled: #958e9f; + --checkbox-border: #141119; + --checkbox-checked: #7553FF; + --checkbox-checked-chonk: #120539; + --checkbox-focus: #7553FF; + + --scraps-theme-border-primary: #141119; + --scraps-theme-border-secondary: #1b1821; + --scraps-theme-border-muted: #1b1821; + --scraps-theme-border-accent: #7553ff; + --scraps-theme-border-danger: #ff002b; + --scraps-theme-border-success: #00f261; + --scraps-theme-border-warning: #ffce00; + --scraps-theme-border-promotion: #ff45a8; + --scraps-hotkey-background-primary: #2e2936; + --scraps-hotkey-background-secondary: #24202b; + --scraps-hotkey-border-primary: #141119; + --scraps-hotkey-content-primary: #e7e5ea; + --scraps-hotkey-content-secondary: #b5b0bd; + --scraps-theme-shadow-low: 0px 1px 0px 0px #10082863; + --scraps-theme-shadow-medium: 0px 2px 0px 1px #0000181a, + 0px 1px 0px 0px #0000181a; + --scraps-theme-shadow-high: 0px 4px 0px 2px #0000181a, + 0px 1px 0px 1px #0000181a; + + --scraps-status-accent-dot: #7553ff; + --scraps-status-accent-pulse: #4828b894; + --scraps-status-danger-dot: #ff002b; + --scraps-status-danger-pulse: #f8000033; + --scraps-status-warning-dot: #ffce00; + --scraps-status-warning-pulse: #e8380029; + --scraps-status-success-dot: #00f261; + --scraps-status-success-pulse: #00f8001f; + --scraps-status-promotion-dot: #ff45a8; + --scraps-status-promotion-pulse: #f800782e; + --scraps-status-muted-dot: #898294; + --scraps-status-muted-pulse: #c0a8f81a; + --scraps-backdrop-background: #10082080; + --scraps-slide-over-background: #393442; + --scraps-slide-over-content: #e7e5ea; + --scraps-slide-over-shadow: 0px 4px 0px 2px #0000181a, + 0px 1px 0px 1px #0000181a; + --scraps-content-primary: #e7e5ea; + --scraps-content-secondary: #b5b0bd; + --scraps-content-accent: #aba8f8; + --scraps-content-promotion: #ea95b9; + --scraps-content-danger: #f6938c; + --scraps-content-warning: #ffce00; + --scraps-content-success: #5ece73; + --scraps-inline-code-content: #ea95b9; + --scraps-inline-code-background: #f800782e; + --scraps-inline-code-neutral-content: #e7e5ea; + --scraps-inline-code-neutral-background: #c0a8f81a; + --scraps-code-accent: #7553ff; + --scraps-code-button-active: #d0b8f821; + --scraps-code-button-hover: #c0a8f81a; + --scraps-code-focus: #7553ff; + --scraps-code-focus-mask: #2e2936; + --scraps-code-tooltip-background: #393442; + --scraps-code-tooltip-arrow-background: #2e2936; + --scraps-code-tooltip-content: #e7e5ea; + --prism-base: #e7e5ea; + --prism-block-background: #24202b; + --prism-comment: #b5b0bd; + --prism-function: #aba8f8; + --prism-highlight-accent: #c0b0f02e; + --prism-highlight-background: #c0a8f81a; + --prism-keyword: #f6938c; + --prism-operator: #aba8f8; + --prism-property: #aba8f8; + --prism-punctuation: #e7e5ea; + --prism-selector: #5ece73; + --prism-variable: #e7e5ea; + + --scraps-theme-surface500: #2E2936; + --scraps-theme-surface400: #24202B; + --scraps-theme-surface300: #1B1821; + --scraps-theme-surface200: #141119; + --scraps-theme-surface100: #0D0A10; + --scraps-theme-gray800: #E7E5EA; + --scraps-theme-gray700: #D5D2DA; + --scraps-theme-gray600: #C4C0CB; + --scraps-theme-gray500: #B5B0BD; + --scraps-theme-gray400: #A49EAE; + --scraps-theme-gray300: #C0B0F02E; + --scraps-theme-gray200: #D0B8F821; + --scraps-theme-gray100: #C0A8F81A; + --scraps-theme-blue700: #CFCEFF; + --scraps-theme-blue600: #BCBAFD; + --scraps-theme-blue500: #ABA8F8; + --scraps-theme-blue400: #9A94F1; + --scraps-theme-blue300: #402898D1; + --scraps-theme-blue200: #4828B894; + --scraps-theme-blue100: #5828F05E; + --scraps-theme-pink700: #F8C3D8; + --scraps-theme-pink600: #F1AAC8; + --scraps-theme-pink500: #EA95B9; + --scraps-theme-pink400: #DF7DA9; + --scraps-theme-pink300: #F000884A; + --scraps-theme-pink200: #F800803B; + --scraps-theme-pink100: #F800782E; + --scraps-theme-red700: #FFC2BC; + --scraps-theme-red600: #FCAAA2; + --scraps-theme-red500: #F6938C; + --scraps-theme-red400: #ED7B74; + --scraps-theme-red300: #F8000052; + --scraps-theme-red200: #F8000042; + --scraps-theme-red100: #F8000033; + --scraps-theme-yellow700: #F3E5BF; + --scraps-theme-yellow600: #E9D290; + --scraps-theme-yellow500: #E0C05E; + --scraps-theme-yellow400: #FFCE00; + --scraps-theme-yellow300: #F8580040; + --scraps-theme-yellow200: #E8480036; + --scraps-theme-yellow100: #E8380029; + --scraps-theme-green700: #CDF1D0; + --scraps-theme-green600: #A8E6AF; + --scraps-theme-green500: #83DA90; + --scraps-theme-green400: #5ECE73; + --scraps-theme-green300: #00F80033; + --scraps-theme-green200: #00F80029; + --scraps-theme-green100: #00F8001F; /* Sentry-specific semantic */ --warning: oklch(0.869 0.178 91.3); /* #FFCE00 */ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 155f17d..8877327 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,9 +1,21 @@ import type { Metadata } from "next"; import { Rubik } from "next/font/google"; import localFont from "next/font/local"; +import Script from "next/script"; import { ThemeProvider } from "@/components/theme-provider"; import "./globals.css"; +const figmaCaptureBootstrap = ` + const parameters = new URLSearchParams(window.location.hash.slice(1)); + const captureSource = "https://mcp.figma.com/mcp/html-to-design/capture.js"; + if (parameters.has("figmacapture") && !document.querySelector(\`script[src="\${captureSource}"]\`)) { + const script = document.createElement("script"); + script.src = captureSource; + script.async = true; + document.head.appendChild(script); + } +`; + const rubik = Rubik({ variable: "--font-rubik", subsets: ["latin"], @@ -17,9 +29,9 @@ const dammitSans = localFont({ }); export const metadata: Metadata = { - title: "Scrapscn — Sentry Design System for shadcn", + title: "Scrapscn Playground", description: - "A shadcn-compatible component registry based on the Sentry design system.", + "A local playground for building with Sentry's regular Scraps components.", }; export default function RootLayout({ @@ -33,7 +45,7 @@ export default function RootLayout({ suppressHydrationWarning className={`${rubik.variable} ${dammitSans.variable} h-full antialiased`} > - + {children} + {process.env.NODE_ENV === "development" ? ( + + ) : null} ); diff --git a/src/app/page.tsx b/src/app/page.tsx index ca0d760..462bc8f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,1491 +1,12 @@ -import { ThemeToggle } from "@/components/theme-toggle"; -import { CopyButton } from "@/components/copy-button"; -import { CodePreview } from "@/components/code-preview"; -import { SentryWordmark, SentryGlyph } from "@/components/sentry-logo"; -import { Button } from "@/components/ui/button"; -import { Checkbox } from "@/components/ui/checkbox"; -import { Badge } from "@/components/ui/badge"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { Input } from "@/components/ui/input"; -import { Link } from "@/components/ui/link"; -import { Tag } from "@/components/ui/tag"; -import { Label } from "@/components/ui/label"; -import { Textarea } from "@/components/ui/textarea"; -import { Separator } from "@/components/ui/separator"; -import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; -import { Avatar, AvatarFallback } from "@/components/ui/avatar"; -import { Switch } from "@/components/ui/switch"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { Progress } from "@/components/ui/progress"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { - AlertCircle, - ArrowUpRight, - Bug, - CheckCircle2, - Clock, - ExternalLink, - GitBranch, - Layers, - Terminal, - TrendingUp, - Users, - Zap, -} from "lucide-react"; +import { Suspense } from "react" -const BRAND_COLORS = [ - { name: "Black", hex: "#181225", ring: "ring-border" }, - { name: "Blurple", hex: "#7553FF", ring: "" }, - { name: "Violet", hex: "#36166B", ring: "" }, - { name: "Hot Pink", hex: "#FF45A8", ring: "" }, - { name: "Orchid", hex: "#A737B4", ring: "" }, - { name: "Yorange", hex: "#FDB81B", ring: "" }, - { name: "Green", hex: "#92DD00", ring: "" }, - { name: "!White", hex: "#F6F6F8", ring: "ring-border" }, - { name: "White", hex: "#FFFFFF", ring: "ring-border" }, -]; +import { Playground } from "@/components/playground/playground" +import { templates } from "@/templates/template-manifest.generated" -const ISSUES = [ - { - id: "FRONT-4KP", - title: "TypeError: Cannot read properties of undefined (reading 'map')", - project: "frontend", - events: "2.8k", - users: 412, - firstSeen: "2h ago", - trend: "up" as const, - }, - { - id: "API-3J2", - title: "ConnectionError: Connection refused to database pool", - project: "api-service", - events: "1.2k", - users: 89, - firstSeen: "45m ago", - trend: "up" as const, - }, - { - id: "FRONT-4KN", - title: "Warning: Each child in a list should have a unique key prop", - project: "frontend", - events: "847", - users: 203, - firstSeen: "3d ago", - trend: "down" as const, - }, - { - id: "WORKER-91", - title: "TimeoutError: Task exceeded maximum execution time (30s)", - project: "task-worker", - events: "234", - users: 18, - firstSeen: "1w ago", - trend: "down" as const, - }, -]; - -export default function Home() { +export default function PlaygroundPage() { return ( -
- {/* Navbar */} -
-
-
- - - - / - - scrapscn - - -
-
- - Storybook - - - GitHub - - -
-
-
- -
- {/* Hero — full gradient in light mode, texture in dark */} -
-
-
-
- - shadcn registry - -

- Sentry's design system, built for shadcn -

-

- Drop in Sentry's purple-tinted neutrals, Blurple accent, - and Rubik typography. One install gives you the complete theme - for both light and dark modes. -

-
-
- - npx shadcn add https://scrapscn.sentry.dev/r - -
-
-
-
-
- -
- {/* Stat cards */} -
-
-
-

- What you get -

-

- Everything maps to standard shadcn tokens. Your components - just work. -

-
-
- -
- - - - Semantic tokens - - 26 - - -

- Light + dark mode CSS variables, including Sentry-specific - warning, success, and promotion -

-
-
- - - - Components - - 13+ - - -

- All standard shadcn components, pre-themed with - Sentry's color system -

-
-
- - - - Fonts - - 3 - - -

- Dammit Sans (headlines), Rubik (body), Roboto Mono (code) -

-
-
- - - - Setup time - - <1m - - -

- One CLI command. Theme swaps in, components just work. -

-
-
-
-
- - - - {/* Theme preview — both modes side by side */} -
-
-

- Both modes, one theme -

-

- Purple-tinted neutrals in both directions. Dark mode - isn't an afterthought — it's where Sentry - lives. -

-
- -
- {/* Light preview */} -
-
- - Light mode - -
-
- - -
- ConnectionError in api-service -
-
- Connection refused to database pool — 1.2k events, 89 - users affected -
-
- Fatal - api-service -
-
-
-
- - -
-
- - {/* Dark preview */} -
-
- - Dark mode - -
-
- - -
- ConnectionError in api-service -
-
- Connection refused to database pool — 1.2k events, 89 - users affected -
-
- Fatal - api-service -
-
-
-
- - -
-
-
-
- - - - {/* Component showcase — real Sentry-like UI */} -
-
-

- Components in action -

-

- These look like Sentry because they use Sentry's tokens. - Not custom CSS — just the theme doing its job. -

-
- - - - Dashboard - Buttons & badges - Forms - Alerts - - - {/* Dashboard */} - - {/* Metric row */} -
- - - Unresolved issues - - - -
- 1,284 -
-

- - +12% - {" "} - from last week -

-
-
- - - Crash-free sessions - - - -
- 99.2% -
-

- +0.3%{" "} - since last release -

-
-
- - - Events (24h) - - - -
- 4.2M -
-

- Across 12 projects -

-
-
-
- - {/* Issues table */} - - -
- Issues - - Unresolved errors across all projects - -
-
- -
-
- - - - - Issue - - Project - - Events - - Users - - Seen - - - - {ISSUES.map((issue) => ( - - -
-
-
-
- {issue.title} -
-
- {issue.id} -
-
-
- - - - {issue.project} - - - - {issue.events} - - - {issue.users} - - - {issue.firstSeen} - - - ))} - -
-
-
- - {/* Release health */} -
- - - - Release health - - - v3.14.2 · deployed 2h ago - - - -
-
- - Crash free - - 99.2% -
- -
-
-
- Adopted - 87% -
- -
-
-
- - Sessions - - 24.1k -
- -
-
-
- - - - - Performance - - Last 24 hours - - - {[ - { - route: "/api/issues", - p50: "45ms", - p95: "320ms", - tpm: "12.4k", - }, - { - route: "/api/events", - p50: "23ms", - p95: "180ms", - tpm: "8.2k", - }, - { - route: "/api/users/me", - p50: "12ms", - p95: "95ms", - tpm: "3.1k", - }, - { - route: "/api/projects", - p50: "67ms", - p95: "450ms", - tpm: "1.8k", - }, - ].map((tx) => ( -
- - {tx.route} - -
- {tx.p50} - {tx.p95} - {tx.tpm} -
-
- ))} -
- -
- p50 - p95 - tpm -
-
-
-
-
-
- - {/* Buttons & Badges */} - -
-
-

- Chonky buttons -

- - Sentry signature - -
-

- The default Button has Sentry's raised - “embossed” depth effect. Hover to lift, - click to press. Uses the snap easing curve at 160ms. -

-
- Resolve issue - - - - - -`} - > -
- - - - - - - -
-
- - Ignored -Unresolved -Fatal -Warning -Resolved -Promoted - -{/* Feature badges */} -Alpha -Beta -New`} - > -
-
- Ignored - Unresolved - Fatal - Warning - Resolved - Promoted -
-
- Alpha - Beta - New -
-
-
- - - Spike detected - - TypeError reported 2,847 times in the last hour. - - - - - Quota warning - - You've used 87% of your monthly error quota. - -`} - > -
- - Spike detected - - TypeError reported 2,847 times in the last hour — 4x - above baseline. - - - - Quota warning - - You've used 87% of your monthly error quota. - - -
-
- -
-

- Avatars -

-
- - - SD - - - - - JM - - - - - AK - - - - - BV - - -
-
-
- - {/* Forms */} - - - - - Project settings - - - Configure your Sentry project - - - -
-
- - -
-
- - -
-
-
- - -
-
- -