refactor: remove svelte runtime
This commit is contained in:
parent
76fe468df5
commit
72d56cb3c9
46 changed files with 40 additions and 2301 deletions
|
|
@ -21,6 +21,7 @@ ENV DASHBOARD_MIGRATIONS_DIR=/app/drizzle
|
||||||
COPY package.json bun.lock ./
|
COPY package.json bun.lock ./
|
||||||
RUN bun install --frozen-lockfile --production
|
RUN bun install --frozen-lockfile --production
|
||||||
COPY --from=build /app/build ./build
|
COPY --from=build /app/build ./build
|
||||||
|
COPY --from=build /app/dist ./dist
|
||||||
COPY --from=build /app/drizzle ./drizzle
|
COPY --from=build /app/drizzle ./drizzle
|
||||||
|
|
||||||
RUN mkdir -p /data
|
RUN mkdir -p /data
|
||||||
|
|
|
||||||
19
README.md
19
README.md
|
|
@ -1,6 +1,6 @@
|
||||||
# Dimension Lab Website
|
# Dimension Lab Website
|
||||||
|
|
||||||
Standalone SvelteKit runtime for the Dimension Lab system overview dashboard.
|
Standalone React runtime for the Dimension Lab system overview dashboard.
|
||||||
|
|
||||||
This project is not a Homepage customization and does not depend on Homepage
|
This project is not a Homepage customization and does not depend on Homepage
|
||||||
runtime, frontend code, or configuration. The dashboard will be model-driven:
|
runtime, frontend code, or configuration. The dashboard will be model-driven:
|
||||||
|
|
@ -19,7 +19,7 @@ This MVP uses Drizzle with Bun SQLite for local file-backed persistence.
|
||||||
## Scripts
|
## Scripts
|
||||||
|
|
||||||
- `bun run dev`: start the local development server.
|
- `bun run dev`: start the local development server.
|
||||||
- `bun run check`: run Svelte and TypeScript checks.
|
- `bun run check`: run TypeScript checks.
|
||||||
- `bun run test`: run Vitest.
|
- `bun run test`: run Vitest.
|
||||||
- `bun run test:unit`: run Vitest explicitly as the unit test stage.
|
- `bun run test:unit`: run Vitest explicitly as the unit test stage.
|
||||||
- `bun run test:e2e`: build and run Playwright browser smoke and QA checks.
|
- `bun run test:e2e`: build and run Playwright browser smoke and QA checks.
|
||||||
|
|
@ -63,9 +63,10 @@ can replace them without changing presentation components.
|
||||||
|
|
||||||
## Runtime Shape
|
## Runtime Shape
|
||||||
|
|
||||||
The SvelteKit build uses the Node adapter, and the current persistence runtime
|
The browser app is built with Vite and React. Production uses a small Bun HTTP
|
||||||
is Bun because the MVP SQLite driver is `bun:sqlite`. Later issues add the
|
server at `build/index.js` to serve the Vite `dist/` assets and JSON API routes.
|
||||||
seed data expansion and rendering pipeline.
|
The current persistence runtime is Bun because the MVP SQLite driver is
|
||||||
|
`bun:sqlite`.
|
||||||
|
|
||||||
## Storybook
|
## Storybook
|
||||||
|
|
||||||
|
|
@ -87,7 +88,7 @@ Run the CI-ready release gate with:
|
||||||
bun run test:qa
|
bun run test:qa
|
||||||
```
|
```
|
||||||
|
|
||||||
The gate runs Svelte/TypeScript checks, Vitest coverage for model,
|
The gate runs TypeScript checks, Vitest coverage for model,
|
||||||
persistence, renderer, datasource mocks, and presentation boundaries, the
|
persistence, renderer, datasource mocks, and presentation boundaries, the
|
||||||
production build, the static Storybook build, and Playwright desktop/mobile
|
production build, the static Storybook build, and Playwright desktop/mobile
|
||||||
smoke checks against the built adapter output. Playwright also performs
|
smoke checks against the built adapter output. Playwright also performs
|
||||||
|
|
@ -104,8 +105,8 @@ belong in validated model data, not reusable components.
|
||||||
|
|
||||||
## Deployment Notes
|
## Deployment Notes
|
||||||
|
|
||||||
The production build uses the SvelteKit Node adapter, but the current SQLite
|
The production build emits Vite client assets under `dist/` and a Bun server
|
||||||
driver depends on Bun. A minimal deployment flow is:
|
entry at `build/index.js`. A minimal deployment flow is:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
bun install --frozen-lockfile
|
bun install --frozen-lockfile
|
||||||
|
|
@ -119,7 +120,7 @@ the checked-in `drizzle/` directory so startup migrations can run.
|
||||||
|
|
||||||
### Internal Container
|
### Internal Container
|
||||||
|
|
||||||
The checked-in `Containerfile` builds the SvelteKit adapter output into a Bun
|
The checked-in `Containerfile` builds the React client and Bun server into a
|
||||||
runtime image. For the Dimension Lab internal host, run it behind Caddy on a
|
runtime image. For the Dimension Lab internal host, run it behind Caddy on a
|
||||||
loopback port and mount persistent state at `/data`:
|
loopback port and mount persistent state at `/data`:
|
||||||
|
|
||||||
|
|
|
||||||
106
bun.lock
106
bun.lock
|
|
@ -7,7 +7,6 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource-variable/geist": "^5.2.9",
|
"@fontsource-variable/geist": "^5.2.9",
|
||||||
"@iconify/react": "^6.0.2",
|
"@iconify/react": "^6.0.2",
|
||||||
"@iconify/svelte": "^5.2.2",
|
|
||||||
"@sinclair/typebox": "^0.34.49",
|
"@sinclair/typebox": "^0.34.49",
|
||||||
"ajv": "^8.20.0",
|
"ajv": "^8.20.0",
|
||||||
"ajv-formats": "^3.0.1",
|
"ajv-formats": "^3.0.1",
|
||||||
|
|
@ -26,13 +25,8 @@
|
||||||
"@axe-core/playwright": "^4.11.3",
|
"@axe-core/playwright": "^4.11.3",
|
||||||
"@playwright/test": "^1.61.0",
|
"@playwright/test": "^1.61.0",
|
||||||
"@storybook/addon-a11y": "^10.4.6",
|
"@storybook/addon-a11y": "^10.4.6",
|
||||||
"@storybook/addon-svelte-csf": "^5.1.2",
|
|
||||||
"@storybook/addon-vitest": "^10.4.6",
|
"@storybook/addon-vitest": "^10.4.6",
|
||||||
"@storybook/react-vite": "^10.4.6",
|
"@storybook/react-vite": "^10.4.6",
|
||||||
"@storybook/sveltekit": "^10.4.6",
|
|
||||||
"@sveltejs/adapter-node": "^5.5.4",
|
|
||||||
"@sveltejs/kit": "^2.65.2",
|
|
||||||
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
|
||||||
"@tailwindcss/vite": "^4.3.1",
|
"@tailwindcss/vite": "^4.3.1",
|
||||||
"@types/bun": "^1.3.14",
|
"@types/bun": "^1.3.14",
|
||||||
"@types/node": "^25.9.3",
|
"@types/node": "^25.9.3",
|
||||||
|
|
@ -43,8 +37,6 @@
|
||||||
"msw": "^2.14.6",
|
"msw": "^2.14.6",
|
||||||
"shadcn": "^4.11.0",
|
"shadcn": "^4.11.0",
|
||||||
"storybook": "^10.4.6",
|
"storybook": "^10.4.6",
|
||||||
"svelte": "^5.56.3",
|
|
||||||
"svelte-check": "^4.6.0",
|
|
||||||
"tailwindcss": "^4.3.1",
|
"tailwindcss": "^4.3.1",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^6.0.3",
|
||||||
"vite": "^8.0.16",
|
"vite": "^8.0.16",
|
||||||
|
|
@ -197,8 +189,6 @@
|
||||||
|
|
||||||
"@iconify/react": ["@iconify/react@6.0.2", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "react": ">=16" } }, "sha512-SMmC2sactfpJD427WJEDN6PMyznTFMhByK9yLW0gOTtnjzzbsi/Ke/XqsumsavFPwNiXs8jSiYeZTmLCLwO+Fg=="],
|
"@iconify/react": ["@iconify/react@6.0.2", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "react": ">=16" } }, "sha512-SMmC2sactfpJD427WJEDN6PMyznTFMhByK9yLW0gOTtnjzzbsi/Ke/XqsumsavFPwNiXs8jSiYeZTmLCLwO+Fg=="],
|
||||||
|
|
||||||
"@iconify/svelte": ["@iconify/svelte@5.2.2", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "svelte": ">5.0.0" } }, "sha512-XMXxD3nzH7yB68C3K4sNwzrJ1TBscODR0ZqCeNf0KGuEMCTSuCo0jHNDZ0o0iRXTylO41NSz/DWam/4atLG1yw=="],
|
|
||||||
|
|
||||||
"@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
|
"@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
|
||||||
|
|
||||||
"@inquirer/ansi": ["@inquirer/ansi@2.0.7", "", {}, "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q=="],
|
"@inquirer/ansi": ["@inquirer/ansi@2.0.7", "", {}, "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q=="],
|
||||||
|
|
@ -329,8 +319,6 @@
|
||||||
|
|
||||||
"@playwright/test": ["@playwright/test@1.61.0", "", { "dependencies": { "playwright": "1.61.0" }, "bin": { "playwright": "cli.js" } }, "sha512-cKA5B6lpFEMyMGjxF54QihfYpB4FkEGH+qZhtArDEG+wezQAJY8Pq6C7T1SjWz+FFzt3TbyoXBQYk/0292TdJA=="],
|
"@playwright/test": ["@playwright/test@1.61.0", "", { "dependencies": { "playwright": "1.61.0" }, "bin": { "playwright": "cli.js" } }, "sha512-cKA5B6lpFEMyMGjxF54QihfYpB4FkEGH+qZhtArDEG+wezQAJY8Pq6C7T1SjWz+FFzt3TbyoXBQYk/0292TdJA=="],
|
||||||
|
|
||||||
"@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
|
|
||||||
|
|
||||||
"@radix-ui/number": ["@radix-ui/number@1.1.2", "", {}, "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig=="],
|
"@radix-ui/number": ["@radix-ui/number@1.1.2", "", {}, "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig=="],
|
||||||
|
|
||||||
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.4", "", {}, "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ=="],
|
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.4", "", {}, "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ=="],
|
||||||
|
|
@ -483,12 +471,6 @@
|
||||||
|
|
||||||
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
|
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
|
||||||
|
|
||||||
"@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@29.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg=="],
|
|
||||||
|
|
||||||
"@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="],
|
|
||||||
|
|
||||||
"@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg=="],
|
|
||||||
|
|
||||||
"@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="],
|
"@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="],
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.0", "", { "os": "android", "cpu": "arm" }, "sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ=="],
|
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.0", "", { "os": "android", "cpu": "arm" }, "sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ=="],
|
||||||
|
|
@ -551,14 +533,10 @@
|
||||||
|
|
||||||
"@storybook/addon-a11y": ["@storybook/addon-a11y@10.4.6", "", { "dependencies": { "@storybook/global": "^5.0.0", "axe-core": "^4.2.0" }, "peerDependencies": { "storybook": "^10.4.6" } }, "sha512-XCJy+f0DFOiCgUU9knRDlLDxVFI+AAQ3/wE/NF85zB9iDPPS2DwkSN+mas3zDgHt66zhN8Cq3/UiyCDUweV9Zw=="],
|
"@storybook/addon-a11y": ["@storybook/addon-a11y@10.4.6", "", { "dependencies": { "@storybook/global": "^5.0.0", "axe-core": "^4.2.0" }, "peerDependencies": { "storybook": "^10.4.6" } }, "sha512-XCJy+f0DFOiCgUU9knRDlLDxVFI+AAQ3/wE/NF85zB9iDPPS2DwkSN+mas3zDgHt66zhN8Cq3/UiyCDUweV9Zw=="],
|
||||||
|
|
||||||
"@storybook/addon-svelte-csf": ["@storybook/addon-svelte-csf@5.1.2", "", { "dependencies": { "@storybook/csf": "^0.1.13", "dedent": "^1.5.3", "es-toolkit": "^1.26.1", "esrap": "^1.2.2", "magic-string": "^0.30.12", "svelte-ast-print": "^0.4.0", "zimmerframe": "^1.1.2" }, "peerDependencies": { "@storybook/svelte": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0", "@sveltejs/vite-plugin-svelte": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "storybook": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0", "svelte": "^5.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-NpImknEb48J7yr/ArTYpvhDSvGUrgm5Nuybu9PCicjSKTACsXX7cln2R19572ORtns399RTE+t20BBOKxSPm2g=="],
|
|
||||||
|
|
||||||
"@storybook/addon-vitest": ["@storybook/addon-vitest@10.4.6", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2" }, "peerDependencies": { "@vitest/browser": "^3.0.0 || ^4.0.0", "@vitest/browser-playwright": "^4.0.0", "@vitest/runner": "^3.0.0 || ^4.0.0", "storybook": "^10.4.6", "vitest": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@vitest/browser", "@vitest/browser-playwright", "@vitest/runner", "vitest"] }, "sha512-VvskHge0GZy86LG6kcY5Ww34z8rDV8JBxqSdUpcJVsWfIvyX6MfAbqI76LlereSyBIJGZJZsqaLwRXsQoVY+0Q=="],
|
"@storybook/addon-vitest": ["@storybook/addon-vitest@10.4.6", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2" }, "peerDependencies": { "@vitest/browser": "^3.0.0 || ^4.0.0", "@vitest/browser-playwright": "^4.0.0", "@vitest/runner": "^3.0.0 || ^4.0.0", "storybook": "^10.4.6", "vitest": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@vitest/browser", "@vitest/browser-playwright", "@vitest/runner", "vitest"] }, "sha512-VvskHge0GZy86LG6kcY5Ww34z8rDV8JBxqSdUpcJVsWfIvyX6MfAbqI76LlereSyBIJGZJZsqaLwRXsQoVY+0Q=="],
|
||||||
|
|
||||||
"@storybook/builder-vite": ["@storybook/builder-vite@10.4.6", "", { "dependencies": { "@storybook/csf-plugin": "10.4.6", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^10.4.6", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-BHBtD81HiXUiDQz/CaFynLtWmm7AFUQn8VnXuHipZ8KlnUANopa4yqdVuy/Gwz8ub254uFI5NMZsW/KlgWNgNg=="],
|
"@storybook/builder-vite": ["@storybook/builder-vite@10.4.6", "", { "dependencies": { "@storybook/csf-plugin": "10.4.6", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^10.4.6", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-BHBtD81HiXUiDQz/CaFynLtWmm7AFUQn8VnXuHipZ8KlnUANopa4yqdVuy/Gwz8ub254uFI5NMZsW/KlgWNgNg=="],
|
||||||
|
|
||||||
"@storybook/csf": ["@storybook/csf@0.1.13", "", { "dependencies": { "type-fest": "^2.19.0" } }, "sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q=="],
|
|
||||||
|
|
||||||
"@storybook/csf-plugin": ["@storybook/csf-plugin@10.4.6", "", { "dependencies": { "unplugin": "^2.3.5" }, "peerDependencies": { "esbuild": "*", "rollup": "*", "storybook": "^10.4.6", "vite": "*", "webpack": "*" }, "optionalPeers": ["esbuild", "rollup", "vite", "webpack"] }, "sha512-NILLxDqpA/JR/AazGWpsz+4fadJwRU4uhHephGtYpVOWnQA/DkJfKT6zpcJVq8+QA8A2zKMLX3GVKsXIrxjuDA=="],
|
"@storybook/csf-plugin": ["@storybook/csf-plugin@10.4.6", "", { "dependencies": { "unplugin": "^2.3.5" }, "peerDependencies": { "esbuild": "*", "rollup": "*", "storybook": "^10.4.6", "vite": "*", "webpack": "*" }, "optionalPeers": ["esbuild", "rollup", "vite", "webpack"] }, "sha512-NILLxDqpA/JR/AazGWpsz+4fadJwRU4uhHephGtYpVOWnQA/DkJfKT6zpcJVq8+QA8A2zKMLX3GVKsXIrxjuDA=="],
|
||||||
|
|
||||||
"@storybook/global": ["@storybook/global@5.0.0", "", {}, "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ=="],
|
"@storybook/global": ["@storybook/global@5.0.0", "", {}, "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ=="],
|
||||||
|
|
@ -571,22 +549,6 @@
|
||||||
|
|
||||||
"@storybook/react-vite": ["@storybook/react-vite@10.4.6", "", { "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", "@rollup/pluginutils": "^5.0.2", "@storybook/builder-vite": "10.4.6", "@storybook/react": "10.4.6", "empathic": "^2.0.0", "magic-string": "^0.30.0", "react-docgen": "^8.0.0", "resolve": "^1.22.8", "tsconfig-paths": "^4.2.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.4.6", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-0arEQtybqGYXHbXpTot+Wv9YtG+V5Vp43QayXavPKQ20M8mpEzhyCPKd0EhqMGSC1Z1UEt0hm365WUBhI9LfKA=="],
|
"@storybook/react-vite": ["@storybook/react-vite@10.4.6", "", { "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", "@rollup/pluginutils": "^5.0.2", "@storybook/builder-vite": "10.4.6", "@storybook/react": "10.4.6", "empathic": "^2.0.0", "magic-string": "^0.30.0", "react-docgen": "^8.0.0", "resolve": "^1.22.8", "tsconfig-paths": "^4.2.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.4.6", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-0arEQtybqGYXHbXpTot+Wv9YtG+V5Vp43QayXavPKQ20M8mpEzhyCPKd0EhqMGSC1Z1UEt0hm365WUBhI9LfKA=="],
|
||||||
|
|
||||||
"@storybook/svelte": ["@storybook/svelte@10.4.6", "", { "dependencies": { "ts-dedent": "^2.0.0", "type-fest": "^5.6.0" }, "peerDependencies": { "storybook": "^10.4.6", "svelte": "^5.0.0" } }, "sha512-U73tDy/2vgY83Zjjy7Q5Lz0ElpZZjGQHZHZd1rrD0gv1+Zas/7aTnRjRqIUrBNqHBx1S8VA5Tzp5YI0FkM1IOw=="],
|
|
||||||
|
|
||||||
"@storybook/svelte-vite": ["@storybook/svelte-vite@10.4.6", "", { "dependencies": { "@storybook/builder-vite": "10.4.6", "@storybook/svelte": "10.4.6", "magic-string": "^0.30.0", "svelte2tsx": "^0.7.44", "typescript": "^4.9.4 || ^5.0.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "storybook": "^10.4.6", "svelte": "^5.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-zyFg12tksWb0gLK29ucyZO5oNh4veu4biMeJgAEPEALjHw8HysP7mTA4547JYprk3JzORpwSqQ7Y9TPPB0ZwFA=="],
|
|
||||||
|
|
||||||
"@storybook/sveltekit": ["@storybook/sveltekit@10.4.6", "", { "dependencies": { "@storybook/builder-vite": "10.4.6", "@storybook/svelte": "10.4.6", "@storybook/svelte-vite": "10.4.6" }, "peerDependencies": { "storybook": "^10.4.6", "svelte": "^5.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-DAbNFUr3B/XiUUUZak2TcjxCxB7eRCCgt4P0MSm9LdFTyePBdU13jybuArUfHqp6lgwqNgbFIjv1nazPjHq51g=="],
|
|
||||||
|
|
||||||
"@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.10", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-4WfKk68eTih+MiJD4fSbxN7E8kVBmTMPWHUPYjvl2N0rMs53YLTT8/YjKU5Dtnz5LqDjl7LEw4U7lXR2W3J5WA=="],
|
|
||||||
|
|
||||||
"@sveltejs/adapter-node": ["@sveltejs/adapter-node@5.5.4", "", { "dependencies": { "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.0", "rollup": "^4.59.0" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" } }, "sha512-45X92CXW+2J8ZUzPv3eLlKWEzINKiiGeFWTjyER4ZN4sGgNoaoeSkCY/QYNxHpPXy71QPsctwccBo9jJs0ySPQ=="],
|
|
||||||
|
|
||||||
"@sveltejs/kit": ["@sveltejs/kit@2.65.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.9", "@types/cookie": "^0.6.0", "acorn": "^8.16.0", "cookie": "^0.6.0", "devalue": "^5.8.1", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-ZIkyEmxT1gcq50Opn1ZIIx6vc/yt2zNN0rF5hS6op95gqHtNw8QMKDhjJI+RyjMcbvECRw+FzEeAoBe/MOz9AA=="],
|
|
||||||
|
|
||||||
"@sveltejs/load-config": ["@sveltejs/load-config@0.1.1", "", {}, "sha512-BXXm+VOH/9X4N7Dd1iZ2MqA1h7M+9i2noI8QYuLDY8QcN2WHYn7D/VK/+IJNfcAmRw7ACNJ538UT9GXIhnBTiA=="],
|
|
||||||
|
|
||||||
"@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@7.1.2", "", { "dependencies": { "deepmerge": "^4.3.1", "magic-string": "^0.30.21", "obug": "^2.1.0", "vitefu": "^1.1.2" }, "peerDependencies": { "svelte": "^5.46.4", "vite": "^8.0.0-beta.7 || ^8.0.0" } }, "sha512-DrUBA2UXRfDmUX/ZTiEopd3X40yavsJF1FX2RygcuIScHL7o5YX1fMvoYnDhjeJQC4weCOklirpNWlcb2NiSeA=="],
|
|
||||||
|
|
||||||
"@tailwindcss/node": ["@tailwindcss/node@4.3.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.1" } }, "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A=="],
|
"@tailwindcss/node": ["@tailwindcss/node@4.3.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.1" } }, "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.1", "@tailwindcss/oxide-darwin-arm64": "4.3.1", "@tailwindcss/oxide-darwin-x64": "4.3.1", "@tailwindcss/oxide-freebsd-x64": "4.3.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", "@tailwindcss/oxide-linux-x64-musl": "4.3.1", "@tailwindcss/oxide-wasm32-wasi": "4.3.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" } }, "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA=="],
|
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.1", "@tailwindcss/oxide-darwin-arm64": "4.3.1", "@tailwindcss/oxide-darwin-x64": "4.3.1", "@tailwindcss/oxide-freebsd-x64": "4.3.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", "@tailwindcss/oxide-linux-x64-musl": "4.3.1", "@tailwindcss/oxide-wasm32-wasi": "4.3.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" } }, "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA=="],
|
||||||
|
|
@ -641,8 +603,6 @@
|
||||||
|
|
||||||
"@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
|
"@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
|
||||||
|
|
||||||
"@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="],
|
|
||||||
|
|
||||||
"@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
|
"@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
|
||||||
|
|
||||||
"@types/doctrine": ["@types/doctrine@0.0.9", "", {}, "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA=="],
|
"@types/doctrine": ["@types/doctrine@0.0.9", "", {}, "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA=="],
|
||||||
|
|
@ -661,8 +621,6 @@
|
||||||
|
|
||||||
"@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
|
"@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
|
||||||
|
|
||||||
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
|
|
||||||
|
|
||||||
"@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="],
|
"@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="],
|
||||||
|
|
||||||
"@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.2", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.0" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg=="],
|
"@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.2", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.0" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg=="],
|
||||||
|
|
@ -713,8 +671,6 @@
|
||||||
|
|
||||||
"axe-core": ["axe-core@4.11.4", "", {}, "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA=="],
|
"axe-core": ["axe-core@4.11.4", "", {}, "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA=="],
|
||||||
|
|
||||||
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
|
|
||||||
|
|
||||||
"balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
"balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||||
|
|
||||||
"baseline-browser-mapping": ["baseline-browser-mapping@2.10.38", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw=="],
|
"baseline-browser-mapping": ["baseline-browser-mapping@2.10.38", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw=="],
|
||||||
|
|
@ -749,8 +705,6 @@
|
||||||
|
|
||||||
"check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="],
|
"check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="],
|
||||||
|
|
||||||
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
|
|
||||||
|
|
||||||
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
|
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
|
||||||
|
|
||||||
"cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
|
"cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
|
||||||
|
|
@ -771,8 +725,6 @@
|
||||||
|
|
||||||
"commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
|
"commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
|
||||||
|
|
||||||
"commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="],
|
|
||||||
|
|
||||||
"conf": ["conf@10.2.0", "", { "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", "atomically": "^1.7.0", "debounce-fn": "^4.0.0", "dot-prop": "^6.0.1", "env-paths": "^2.2.1", "json-schema-typed": "^7.0.3", "onetime": "^5.1.2", "pkg-up": "^3.1.0", "semver": "^7.3.5" } }, "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg=="],
|
"conf": ["conf@10.2.0", "", { "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", "atomically": "^1.7.0", "debounce-fn": "^4.0.0", "dot-prop": "^6.0.1", "env-paths": "^2.2.1", "json-schema-typed": "^7.0.3", "onetime": "^5.1.2", "pkg-up": "^3.1.0", "semver": "^7.3.5" } }, "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg=="],
|
||||||
|
|
||||||
"content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="],
|
"content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="],
|
||||||
|
|
@ -781,7 +733,7 @@
|
||||||
|
|
||||||
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
|
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
|
||||||
|
|
||||||
"cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="],
|
"cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
|
||||||
|
|
||||||
"cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
|
"cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
|
||||||
|
|
||||||
|
|
@ -805,8 +757,6 @@
|
||||||
|
|
||||||
"dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="],
|
"dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="],
|
||||||
|
|
||||||
"dedent-js": ["dedent-js@1.0.1", "", {}, "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ=="],
|
|
||||||
|
|
||||||
"deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
|
"deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
|
||||||
|
|
||||||
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
|
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
|
||||||
|
|
@ -825,8 +775,6 @@
|
||||||
|
|
||||||
"detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
|
"detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
|
||||||
|
|
||||||
"devalue": ["devalue@5.8.1", "", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="],
|
|
||||||
|
|
||||||
"diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
|
"diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
|
||||||
|
|
||||||
"doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
|
"doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
|
||||||
|
|
@ -871,20 +819,14 @@
|
||||||
|
|
||||||
"es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="],
|
"es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="],
|
||||||
|
|
||||||
"es-toolkit": ["es-toolkit@1.47.1", "", {}, "sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q=="],
|
|
||||||
|
|
||||||
"esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
|
"esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
|
||||||
|
|
||||||
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||||
|
|
||||||
"escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
|
"escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
|
||||||
|
|
||||||
"esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
|
|
||||||
|
|
||||||
"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
|
"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
|
||||||
|
|
||||||
"esrap": ["esrap@1.4.9", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-3OMlcd0a03UGuZpPeUC1HxR3nA23l+HEyCiZw3b3FumJIN9KphoGzDJKMXI1S72jVS1dsenDyQC0kJlO1U9E1g=="],
|
|
||||||
|
|
||||||
"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
|
"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
|
||||||
|
|
||||||
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
|
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
|
||||||
|
|
@ -1017,8 +959,6 @@
|
||||||
|
|
||||||
"is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
|
"is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
|
||||||
|
|
||||||
"is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="],
|
|
||||||
|
|
||||||
"is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="],
|
"is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="],
|
||||||
|
|
||||||
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
||||||
|
|
@ -1029,8 +969,6 @@
|
||||||
|
|
||||||
"is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
|
"is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
|
||||||
|
|
||||||
"is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
|
|
||||||
|
|
||||||
"is-regexp": ["is-regexp@3.1.0", "", {}, "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA=="],
|
"is-regexp": ["is-regexp@3.1.0", "", {}, "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA=="],
|
||||||
|
|
||||||
"is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
|
"is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
|
||||||
|
|
@ -1089,8 +1027,6 @@
|
||||||
|
|
||||||
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
|
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
|
||||||
|
|
||||||
"locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],
|
|
||||||
|
|
||||||
"locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="],
|
"locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="],
|
||||||
|
|
||||||
"log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="],
|
"log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="],
|
||||||
|
|
@ -1133,10 +1069,6 @@
|
||||||
|
|
||||||
"minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
|
"minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
|
||||||
|
|
||||||
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
|
|
||||||
|
|
||||||
"mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
|
|
||||||
|
|
||||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
"msw": ["msw@2.14.6", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.11", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg=="],
|
"msw": ["msw@2.14.6", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.11", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg=="],
|
||||||
|
|
@ -1261,8 +1193,6 @@
|
||||||
|
|
||||||
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
|
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
|
||||||
|
|
||||||
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
|
|
||||||
|
|
||||||
"recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
|
"recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
|
||||||
|
|
||||||
"redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="],
|
"redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="],
|
||||||
|
|
@ -1293,14 +1223,10 @@
|
||||||
|
|
||||||
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
|
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
|
||||||
|
|
||||||
"sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="],
|
|
||||||
|
|
||||||
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
||||||
|
|
||||||
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
|
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
|
||||||
|
|
||||||
"scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="],
|
|
||||||
|
|
||||||
"semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="],
|
"semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="],
|
||||||
|
|
||||||
"send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
|
"send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
|
||||||
|
|
@ -1329,8 +1255,6 @@
|
||||||
|
|
||||||
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
||||||
|
|
||||||
"sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="],
|
|
||||||
|
|
||||||
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
|
"sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
|
||||||
|
|
||||||
"source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
|
"source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
|
||||||
|
|
@ -1365,14 +1289,6 @@
|
||||||
|
|
||||||
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
||||||
|
|
||||||
"svelte": ["svelte@5.56.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.10", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.8.1", "esm-env": "^1.2.1", "esrap": "^2.2.11", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-w7JvrM5IFl5cmfbY0TLik9o7mjRUJmRMhOR51tBPu708Gr/MjbGs7VnJnr/B0CaXeI4vtnOh7RKxDr0cwhMdDA=="],
|
|
||||||
|
|
||||||
"svelte-ast-print": ["svelte-ast-print@0.4.2", "", { "dependencies": { "esrap": "1.2.2", "zimmerframe": "1.1.2" }, "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-hRHHufbJoArFmDYQKCpCvc0xUuIEfwYksvyLYEQyH+1xb5LD5sM/IthfooCdXZQtOIqXz6xm7NmaqdfwG4kh6w=="],
|
|
||||||
|
|
||||||
"svelte-check": ["svelte-check@4.6.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "@sveltejs/load-config": "0.1.1", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-KhVnDFDSid57mmZtHz8gfW8AAGylOZ0vPnOIzVmAL+urzwK8sBYXRss953gD8T0OdgAQ11mdWhE6uadmtOz8TQ=="],
|
|
||||||
|
|
||||||
"svelte2tsx": ["svelte2tsx@0.7.56", "", { "dependencies": { "dedent-js": "^1.0.1", "scule": "^1.3.0" }, "peerDependencies": { "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", "typescript": "^4.9.4 || ^5.0.0 || ^6.0.0" } }, "sha512-NTvqqL+goYlW8gWNajk81L07+uu7jw5V2m1Az5MZbYm3GEydcHXh+uTrLHM9SuGuaqCtF90vlMXkOVBotfH94g=="],
|
|
||||||
|
|
||||||
"systeminformation": ["systeminformation@5.31.7", "", { "os": "!aix", "bin": { "systeminformation": "lib/cli.js" } }, "sha512-/8NC53e5nP9nmhn42/ncdOkyJnOoue/Vy+tJOyUGd1Yv66G069wK4rrziwhrqDETgk78CudTQupw5z19S5uoZw=="],
|
"systeminformation": ["systeminformation@5.31.7", "", { "os": "!aix", "bin": { "systeminformation": "lib/cli.js" } }, "sha512-/8NC53e5nP9nmhn42/ncdOkyJnOoue/Vy+tJOyUGd1Yv66G069wK4rrziwhrqDETgk78CudTQupw5z19S5uoZw=="],
|
||||||
|
|
||||||
"tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
|
"tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
|
||||||
|
|
@ -1403,8 +1319,6 @@
|
||||||
|
|
||||||
"toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
|
"toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
|
||||||
|
|
||||||
"totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="],
|
|
||||||
|
|
||||||
"tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="],
|
"tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="],
|
||||||
|
|
||||||
"ts-dedent": ["ts-dedent@2.3.0", "", {}, "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg=="],
|
"ts-dedent": ["ts-dedent@2.3.0", "", {}, "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg=="],
|
||||||
|
|
@ -1457,8 +1371,6 @@
|
||||||
|
|
||||||
"vite": ["vite@8.0.16", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "1.0.3", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw=="],
|
"vite": ["vite@8.0.16", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "1.0.3", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw=="],
|
||||||
|
|
||||||
"vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
|
|
||||||
|
|
||||||
"vitest": ["vitest@4.1.9", "", { "dependencies": { "@vitest/expect": "4.1.9", "@vitest/mocker": "4.1.9", "@vitest/pretty-format": "4.1.9", "@vitest/runner": "4.1.9", "@vitest/snapshot": "4.1.9", "@vitest/spy": "4.1.9", "@vitest/utils": "4.1.9", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.9", "@vitest/browser-preview": "4.1.9", "@vitest/browser-webdriverio": "4.1.9", "@vitest/coverage-istanbul": "4.1.9", "@vitest/coverage-v8": "4.1.9", "@vitest/ui": "4.1.9", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ=="],
|
"vitest": ["vitest@4.1.9", "", { "dependencies": { "@vitest/expect": "4.1.9", "@vitest/mocker": "4.1.9", "@vitest/pretty-format": "4.1.9", "@vitest/runner": "4.1.9", "@vitest/snapshot": "4.1.9", "@vitest/spy": "4.1.9", "@vitest/utils": "4.1.9", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.9", "@vitest/browser-preview": "4.1.9", "@vitest/browser-webdriverio": "4.1.9", "@vitest/coverage-istanbul": "4.1.9", "@vitest/coverage-v8": "4.1.9", "@vitest/ui": "4.1.9", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ=="],
|
||||||
|
|
||||||
"web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
|
"web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
|
||||||
|
|
@ -1489,8 +1401,6 @@
|
||||||
|
|
||||||
"yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
|
"yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
|
||||||
|
|
||||||
"zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="],
|
|
||||||
|
|
||||||
"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
|
"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
|
||||||
|
|
||||||
"zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="],
|
"zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="],
|
||||||
|
|
@ -1519,14 +1429,8 @@
|
||||||
|
|
||||||
"@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
|
"@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
|
||||||
|
|
||||||
"@rollup/plugin-commonjs/is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="],
|
|
||||||
|
|
||||||
"@storybook/addon-a11y/axe-core": ["axe-core@4.12.1", "", {}, "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA=="],
|
"@storybook/addon-a11y/axe-core": ["axe-core@4.12.1", "", {}, "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA=="],
|
||||||
|
|
||||||
"@storybook/csf/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="],
|
|
||||||
|
|
||||||
"@storybook/svelte-vite/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q=="],
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="],
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="],
|
||||||
|
|
@ -1573,8 +1477,6 @@
|
||||||
|
|
||||||
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
||||||
|
|
||||||
"msw/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
|
|
||||||
|
|
||||||
"npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
|
"npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
|
||||||
|
|
||||||
"onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
|
"onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
|
||||||
|
|
@ -1605,12 +1507,6 @@
|
||||||
|
|
||||||
"string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
"string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
"svelte/esrap": ["esrap@2.2.11", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-gPdx+I+BjYEinNMQaBXFjbaJVyoPMU4ZODg5mE+M4DqVG9VusAVHHjcBX+zqyITlI0DIARwDMMzZwAWj36dRoQ=="],
|
|
||||||
|
|
||||||
"svelte-ast-print/esrap": ["esrap@1.2.2", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1" } }, "sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw=="],
|
|
||||||
|
|
||||||
"svelte-ast-print/zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="],
|
|
||||||
|
|
||||||
"tsx/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="],
|
"tsx/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="],
|
||||||
|
|
||||||
"type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
|
"type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource-variable/geist": "^5.2.9",
|
"@fontsource-variable/geist": "^5.2.9",
|
||||||
"@iconify/react": "^6.0.2",
|
"@iconify/react": "^6.0.2",
|
||||||
"@iconify/svelte": "^5.2.2",
|
|
||||||
"@sinclair/typebox": "^0.34.49",
|
"@sinclair/typebox": "^0.34.49",
|
||||||
"ajv": "^8.20.0",
|
"ajv": "^8.20.0",
|
||||||
"ajv-formats": "^3.0.1",
|
"ajv-formats": "^3.0.1",
|
||||||
|
|
@ -39,13 +38,8 @@
|
||||||
"@axe-core/playwright": "^4.11.3",
|
"@axe-core/playwright": "^4.11.3",
|
||||||
"@playwright/test": "^1.61.0",
|
"@playwright/test": "^1.61.0",
|
||||||
"@storybook/addon-a11y": "^10.4.6",
|
"@storybook/addon-a11y": "^10.4.6",
|
||||||
"@storybook/addon-svelte-csf": "^5.1.2",
|
|
||||||
"@storybook/addon-vitest": "^10.4.6",
|
"@storybook/addon-vitest": "^10.4.6",
|
||||||
"@storybook/react-vite": "^10.4.6",
|
"@storybook/react-vite": "^10.4.6",
|
||||||
"@storybook/sveltekit": "^10.4.6",
|
|
||||||
"@sveltejs/adapter-node": "^5.5.4",
|
|
||||||
"@sveltejs/kit": "^2.65.2",
|
|
||||||
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
|
||||||
"@tailwindcss/vite": "^4.3.1",
|
"@tailwindcss/vite": "^4.3.1",
|
||||||
"@types/bun": "^1.3.14",
|
"@types/bun": "^1.3.14",
|
||||||
"@types/node": "^25.9.3",
|
"@types/node": "^25.9.3",
|
||||||
|
|
@ -56,8 +50,6 @@
|
||||||
"msw": "^2.14.6",
|
"msw": "^2.14.6",
|
||||||
"shadcn": "^4.11.0",
|
"shadcn": "^4.11.0",
|
||||||
"storybook": "^10.4.6",
|
"storybook": "^10.4.6",
|
||||||
"svelte": "^5.56.3",
|
|
||||||
"svelte-check": "^4.6.0",
|
|
||||||
"tailwindcss": "^4.3.1",
|
"tailwindcss": "^4.3.1",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^6.0.3",
|
||||||
"vite": "^8.0.16",
|
"vite": "^8.0.16",
|
||||||
|
|
|
||||||
11
src/app.html
11
src/app.html
|
|
@ -1,11 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
%sveltekit.head%
|
|
||||||
</head>
|
|
||||||
<body data-sveltekit-preload-data="hover">
|
|
||||||
<div style="display: contents">%sveltekit.body%</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { readdirSync, readFileSync, statSync } from "node:fs";
|
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import { describe, expect, test } from "vitest";
|
import { describe, expect, test } from "vitest";
|
||||||
|
|
||||||
|
|
@ -30,14 +30,22 @@ describe("presentation content boundary", () => {
|
||||||
|
|
||||||
expect(forbiddenTerms.filter((term) => source.includes(term))).toEqual([]);
|
expect(forbiddenTerms.filter((term) => source.includes(term))).toEqual([]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("does not keep legacy presentation component files in the React runtime", () => {
|
||||||
|
const legacyExtension = [".sve", "lte"].join("");
|
||||||
|
|
||||||
|
expect(findFiles(join(process.cwd(), "src"), legacyExtension)).toEqual([]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function readPresentationSource(path: string): string {
|
function readPresentationSource(path: string): string {
|
||||||
|
if (!existsSync(path)) return "";
|
||||||
|
|
||||||
const stats = statSync(path);
|
const stats = statSync(path);
|
||||||
if (stats.isFile()) {
|
if (stats.isFile()) {
|
||||||
if (path.endsWith(".test.ts")) return "";
|
if (path.endsWith(".test.ts")) return "";
|
||||||
if (path.includes(`${join("src", "lib", "ui", "stories")}${"/"}`)) return "";
|
if (path.includes(`${join("src", "lib", "ui", "stories")}${"/"}`)) return "";
|
||||||
if (!/\.(svelte|svelte\.js|ts|js|mjs|css|json)$/.test(path)) return "";
|
if (!/\.(tsx|ts|js|mjs|css|json)$/.test(path)) return "";
|
||||||
return readFileSync(path, "utf8");
|
return readFileSync(path, "utf8");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -45,3 +53,10 @@ function readPresentationSource(path: string): string {
|
||||||
.map((entry) => readPresentationSource(join(path, entry)))
|
.map((entry) => readPresentationSource(join(path, entry)))
|
||||||
.join("\n");
|
.join("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function findFiles(path: string, extension: string): string[] {
|
||||||
|
const stats = statSync(path);
|
||||||
|
if (stats.isFile()) return path.endsWith(extension) ? [path] : [];
|
||||||
|
|
||||||
|
return readdirSync(path).flatMap((entry) => findFiles(join(path, entry), extension));
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiSeverity } from "../types";
|
|
||||||
import StatusBadge from "./StatusBadge.svelte";
|
|
||||||
|
|
||||||
let {
|
|
||||||
label,
|
|
||||||
severity = "neutral",
|
|
||||||
}: {
|
|
||||||
label: string;
|
|
||||||
severity?: UiSeverity;
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<StatusBadge {label} {severity} />
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { HTMLButtonAttributes } from "svelte/elements";
|
|
||||||
import IconGlyph from "./IconGlyph.svelte";
|
|
||||||
|
|
||||||
type ButtonProps = Omit<HTMLButtonAttributes, "type"> & {
|
|
||||||
label: string;
|
|
||||||
variant?: "primary" | "secondary" | "danger" | "ghost";
|
|
||||||
size?: "default" | "compact";
|
|
||||||
icon?: string;
|
|
||||||
loading?: boolean;
|
|
||||||
type?: "button" | "submit" | "reset";
|
|
||||||
};
|
|
||||||
|
|
||||||
let {
|
|
||||||
label,
|
|
||||||
variant = "primary",
|
|
||||||
size = "default",
|
|
||||||
icon,
|
|
||||||
disabled = false,
|
|
||||||
loading = false,
|
|
||||||
type = "button",
|
|
||||||
class: className = "",
|
|
||||||
...buttonProps
|
|
||||||
}: ButtonProps = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<button
|
|
||||||
{...buttonProps}
|
|
||||||
class={className ? `ui-button ${className}` : "ui-button"}
|
|
||||||
data-variant={variant}
|
|
||||||
data-size={size}
|
|
||||||
data-loading={loading}
|
|
||||||
{disabled}
|
|
||||||
{type}
|
|
||||||
>
|
|
||||||
{#if icon}
|
|
||||||
<IconGlyph name={icon} size="sm" />
|
|
||||||
{/if}
|
|
||||||
<span>{loading ? "Loading" : label}</span>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.ui-button {
|
|
||||||
display: inline-grid;
|
|
||||||
grid-auto-flow: column;
|
|
||||||
gap: var(--ui-space-2);
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
min-height: 2.5rem;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: var(--ui-color-accent);
|
|
||||||
color: var(--ui-color-canvas);
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: 0.76rem;
|
|
||||||
font-weight: 850;
|
|
||||||
letter-spacing: 0;
|
|
||||||
padding: 0 var(--ui-space-4);
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ui-button[data-size="compact"] {
|
|
||||||
min-height: 2rem;
|
|
||||||
padding-inline: var(--ui-space-3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ui-button[data-variant="secondary"] {
|
|
||||||
background: var(--ui-color-surface-raised);
|
|
||||||
color: var(--ui-color-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ui-button[data-variant="danger"] {
|
|
||||||
background: var(--ui-color-danger);
|
|
||||||
color: var(--ui-color-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ui-button[data-variant="ghost"] {
|
|
||||||
background: transparent;
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
}
|
|
||||||
|
|
||||||
.ui-button:disabled {
|
|
||||||
cursor: not-allowed;
|
|
||||||
opacity: 0.48;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
let {
|
|
||||||
density = "regular",
|
|
||||||
size = "md",
|
|
||||||
tone = "neutral",
|
|
||||||
}: {
|
|
||||||
density?: "regular" | "tight";
|
|
||||||
size?: "sm" | "md" | "lg";
|
|
||||||
tone?: "neutral" | "accent" | "danger";
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="corner-bracket-frame"
|
|
||||||
data-density={density}
|
|
||||||
data-size={size}
|
|
||||||
data-tone={tone}
|
|
||||||
aria-hidden="true"
|
|
||||||
>
|
|
||||||
<span data-corner="top-left"></span>
|
|
||||||
<span data-corner="top-right"></span>
|
|
||||||
<span data-corner="bottom-left"></span>
|
|
||||||
<span data-corner="bottom-right"></span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.corner-bracket-frame {
|
|
||||||
--corner-color: var(--ui-color-line-strong);
|
|
||||||
--corner-offset: 0.5rem;
|
|
||||||
--corner-size: 1.45rem;
|
|
||||||
position: relative;
|
|
||||||
min-height: 5rem;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
background:
|
|
||||||
linear-gradient(90deg, color-mix(in srgb, var(--corner-color), transparent 78%) 1px, transparent 1px),
|
|
||||||
linear-gradient(color-mix(in srgb, var(--corner-color), transparent 84%) 1px, transparent 1px),
|
|
||||||
rgba(2, 3, 2, 0.64);
|
|
||||||
background-size: 2rem 2rem, 2rem 2rem, auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
position: absolute;
|
|
||||||
width: var(--corner-size);
|
|
||||||
height: var(--corner-size);
|
|
||||||
border-color: var(--corner-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-corner="top-left"] {
|
|
||||||
top: var(--corner-offset);
|
|
||||||
left: var(--corner-offset);
|
|
||||||
border-top: 1px solid;
|
|
||||||
border-left: 1px solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-corner="top-right"] {
|
|
||||||
top: var(--corner-offset);
|
|
||||||
right: var(--corner-offset);
|
|
||||||
border-top: 1px solid;
|
|
||||||
border-right: 1px solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-corner="bottom-left"] {
|
|
||||||
bottom: var(--corner-offset);
|
|
||||||
left: var(--corner-offset);
|
|
||||||
border-bottom: 1px solid;
|
|
||||||
border-left: 1px solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-corner="bottom-right"] {
|
|
||||||
right: var(--corner-offset);
|
|
||||||
bottom: var(--corner-offset);
|
|
||||||
border-right: 1px solid;
|
|
||||||
border-bottom: 1px solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.corner-bracket-frame[data-density="tight"] {
|
|
||||||
--corner-offset: 0.28rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.corner-bracket-frame[data-size="sm"] {
|
|
||||||
--corner-size: 0.95rem;
|
|
||||||
min-height: 3rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.corner-bracket-frame[data-size="lg"] {
|
|
||||||
--corner-size: 2.25rem;
|
|
||||||
min-height: 8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.corner-bracket-frame[data-tone="accent"] {
|
|
||||||
--corner-color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.corner-bracket-frame[data-tone="danger"] {
|
|
||||||
--corner-color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,154 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiDashboardPreview } from "../types";
|
|
||||||
import ModuleCard from "./ModuleCard.svelte";
|
|
||||||
import ServicePanel from "./ServicePanel.svelte";
|
|
||||||
import StatusStrip from "./StatusStrip.svelte";
|
|
||||||
import TelemetryGrid from "./TelemetryGrid.svelte";
|
|
||||||
|
|
||||||
const generatedTitleId = $props.id();
|
|
||||||
|
|
||||||
let {
|
|
||||||
dashboard,
|
|
||||||
titleId = `${generatedTitleId}-title`,
|
|
||||||
}: {
|
|
||||||
dashboard: UiDashboardPreview;
|
|
||||||
titleId?: string;
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<main class="dashboard-frame" aria-labelledby={titleId}>
|
|
||||||
<header class="dashboard-frame__header">
|
|
||||||
<div>
|
|
||||||
{#if dashboard.eyebrow}
|
|
||||||
<p>{dashboard.eyebrow}</p>
|
|
||||||
{/if}
|
|
||||||
<h1 id={titleId}>{dashboard.title}</h1>
|
|
||||||
{#if dashboard.subtitle}
|
|
||||||
<span>{dashboard.subtitle}</span>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{#if dashboard.modules.length}
|
|
||||||
<div class="dashboard-frame__modules">
|
|
||||||
{#each dashboard.modules as module (module.id)}
|
|
||||||
<ModuleCard {module} />
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<TelemetryGrid cards={dashboard.telemetry} />
|
|
||||||
|
|
||||||
<section class="dashboard-frame__panels" aria-label="Service groups">
|
|
||||||
{#each dashboard.serviceGroups as group (group.id)}
|
|
||||||
<ServicePanel {group} />
|
|
||||||
{/each}
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<StatusStrip id={dashboard.statusStripId} items={dashboard.statusItems} />
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.dashboard-frame {
|
|
||||||
display: grid;
|
|
||||||
box-sizing: border-box;
|
|
||||||
height: 100vh;
|
|
||||||
min-height: 100vh;
|
|
||||||
gap: 0.36rem;
|
|
||||||
grid-template-rows: auto auto minmax(0, 1fr) auto;
|
|
||||||
overflow: hidden;
|
|
||||||
padding: clamp(0.42rem, 0.65vw, 0.62rem);
|
|
||||||
background:
|
|
||||||
linear-gradient(90deg, transparent 0 49%, rgba(255, 255, 255, 0.08) 50%, transparent 51%),
|
|
||||||
rgba(0, 0, 0, 0.18);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__header {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: minmax(30rem, 1fr) minmax(30rem, 0.9fr);
|
|
||||||
gap: 0.5rem;
|
|
||||||
align-items: start;
|
|
||||||
border-bottom: var(--ui-border);
|
|
||||||
min-height: 5.35rem;
|
|
||||||
padding-bottom: 0.34rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__header p,
|
|
||||||
.dashboard-frame__header span,
|
|
||||||
h1 {
|
|
||||||
margin: 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__header p,
|
|
||||||
.dashboard-frame__header span {
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.78rem;
|
|
||||||
font-weight: 800;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
max-width: 100%;
|
|
||||||
overflow-wrap: anywhere;
|
|
||||||
font-family: var(--ui-font-display);
|
|
||||||
font-size: clamp(2.2rem, 3.3vw, 2.95rem);
|
|
||||||
font-weight: 850;
|
|
||||||
letter-spacing: 0;
|
|
||||||
line-height: 0.8;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__modules {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: minmax(15rem, 0.66fr) minmax(17rem, 1fr);
|
|
||||||
justify-content: end;
|
|
||||||
gap: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__panels {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
||||||
align-content: start;
|
|
||||||
gap: 0.36rem;
|
|
||||||
min-height: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__panels :global(.service-panel[data-layout="grid"]) {
|
|
||||||
grid-column: 1 / -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__panels
|
|
||||||
:global(.service-panel[data-layout="grid"] .panel__body) {
|
|
||||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 780px) {
|
|
||||||
.dashboard-frame {
|
|
||||||
height: auto;
|
|
||||||
min-height: 100vh;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__header {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__modules {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
white-space: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__panels {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-frame__panels
|
|
||||||
:global(.service-panel[data-layout="grid"] .panel__body) {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiModuleBlock } from "../types";
|
|
||||||
import ModuleCard from "./ModuleCard.svelte";
|
|
||||||
|
|
||||||
let {
|
|
||||||
title,
|
|
||||||
subtitle,
|
|
||||||
eyebrow,
|
|
||||||
module,
|
|
||||||
}: {
|
|
||||||
title: string;
|
|
||||||
subtitle?: string;
|
|
||||||
eyebrow?: string;
|
|
||||||
module?: UiModuleBlock;
|
|
||||||
} = $props();
|
|
||||||
|
|
||||||
const titleId = $props.id();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<header class="dashboard-header" aria-labelledby={titleId}>
|
|
||||||
<div>
|
|
||||||
{#if eyebrow}
|
|
||||||
<p>{eyebrow}</p>
|
|
||||||
{/if}
|
|
||||||
<h1 id={titleId}>{title}</h1>
|
|
||||||
{#if subtitle}
|
|
||||||
<span>{subtitle}</span>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{#if module}
|
|
||||||
<ModuleCard {module} />
|
|
||||||
{/if}
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.dashboard-header {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: minmax(0, 1fr) auto;
|
|
||||||
gap: var(--ui-space-4);
|
|
||||||
align-items: start;
|
|
||||||
border-bottom: var(--ui-border);
|
|
||||||
padding: var(--ui-space-3);
|
|
||||||
}
|
|
||||||
|
|
||||||
p,
|
|
||||||
span,
|
|
||||||
h1 {
|
|
||||||
margin: 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
p,
|
|
||||||
span {
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.78rem;
|
|
||||||
font-weight: 800;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
overflow-wrap: anywhere;
|
|
||||||
font-family: var(--ui-font-display);
|
|
||||||
font-size: clamp(2.45rem, 5vw, 4.2rem);
|
|
||||||
line-height: 0.85;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 780px) {
|
|
||||||
.dashboard-header {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
let {
|
|
||||||
density = "regular",
|
|
||||||
direction = "forward",
|
|
||||||
size = "md",
|
|
||||||
tone = "accent",
|
|
||||||
}: {
|
|
||||||
density?: "open" | "regular" | "tight";
|
|
||||||
direction?: "forward" | "backward";
|
|
||||||
size?: "sm" | "md" | "lg";
|
|
||||||
tone?: "neutral" | "accent" | "warning" | "danger";
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="diagonal-stripe-field"
|
|
||||||
data-density={density}
|
|
||||||
data-direction={direction}
|
|
||||||
data-size={size}
|
|
||||||
data-tone={tone}
|
|
||||||
aria-hidden="true"
|
|
||||||
></div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.diagonal-stripe-field {
|
|
||||||
--stripe-angle: 135deg;
|
|
||||||
--stripe-color: var(--ui-color-line-strong);
|
|
||||||
--stripe-gap: 1.1rem;
|
|
||||||
--stripe-width: 0.18rem;
|
|
||||||
display: block;
|
|
||||||
min-height: 3rem;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background:
|
|
||||||
repeating-linear-gradient(
|
|
||||||
var(--stripe-angle),
|
|
||||||
transparent 0 var(--stripe-gap),
|
|
||||||
color-mix(in srgb, var(--stripe-color), transparent 26%) var(--stripe-gap)
|
|
||||||
calc(var(--stripe-gap) + var(--stripe-width))
|
|
||||||
),
|
|
||||||
linear-gradient(90deg, rgba(255, 255, 255, 0.05), transparent 42%),
|
|
||||||
rgba(2, 3, 2, 0.82);
|
|
||||||
}
|
|
||||||
|
|
||||||
.diagonal-stripe-field[data-direction="backward"] {
|
|
||||||
--stripe-angle: 45deg;
|
|
||||||
}
|
|
||||||
|
|
||||||
.diagonal-stripe-field[data-density="open"] {
|
|
||||||
--stripe-gap: 1.65rem;
|
|
||||||
--stripe-width: 0.16rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.diagonal-stripe-field[data-density="tight"] {
|
|
||||||
--stripe-gap: 0.72rem;
|
|
||||||
--stripe-width: 0.14rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.diagonal-stripe-field[data-size="sm"] {
|
|
||||||
min-height: 1.75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.diagonal-stripe-field[data-size="lg"] {
|
|
||||||
min-height: 5.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.diagonal-stripe-field[data-tone="accent"] {
|
|
||||||
--stripe-color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.diagonal-stripe-field[data-tone="warning"] {
|
|
||||||
--stripe-color: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
.diagonal-stripe-field[data-tone="danger"] {
|
|
||||||
--stripe-color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiStatusItem } from "../types";
|
|
||||||
|
|
||||||
let { item }: { item: UiStatusItem } = $props();
|
|
||||||
|
|
||||||
let target = $derived(item.link?.external ? "_blank" : undefined);
|
|
||||||
let rel = $derived(item.link?.external ? "noreferrer" : undefined);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{#snippet cellContent()}
|
|
||||||
<span>{item.label}</span>
|
|
||||||
<strong>{item.value}</strong>
|
|
||||||
{/snippet}
|
|
||||||
|
|
||||||
{#if item.link}
|
|
||||||
<a
|
|
||||||
class="footer-cell"
|
|
||||||
data-severity={item.severity || "neutral"}
|
|
||||||
data-model-id={item.id}
|
|
||||||
href={item.link.href}
|
|
||||||
target={target}
|
|
||||||
rel={rel}
|
|
||||||
aria-label={item.link.label}
|
|
||||||
>
|
|
||||||
{@render cellContent()}
|
|
||||||
</a>
|
|
||||||
{:else}
|
|
||||||
<div class="footer-cell" data-severity={item.severity || "neutral"} data-model-id={item.id}>
|
|
||||||
{@render cellContent()}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.footer-cell {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: auto minmax(0, 1fr);
|
|
||||||
min-height: 1.9rem;
|
|
||||||
align-items: center;
|
|
||||||
background: rgba(2, 3, 2, 0.92);
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
span,
|
|
||||||
strong {
|
|
||||||
min-width: 0;
|
|
||||||
padding: 0.34rem 0.52rem;
|
|
||||||
overflow-wrap: anywhere;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
height: 100%;
|
|
||||||
border-right: var(--ui-border);
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.52rem;
|
|
||||||
font-weight: 800;
|
|
||||||
}
|
|
||||||
|
|
||||||
strong {
|
|
||||||
color: var(--ui-color-text);
|
|
||||||
font-size: 0.58rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-cell[data-severity="ok"] strong {
|
|
||||||
background: var(--ui-color-accent);
|
|
||||||
color: #060706;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-cell[data-severity="warning"] strong {
|
|
||||||
color: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-cell[data-severity="danger"] strong {
|
|
||||||
color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-cell[data-severity="stale"] strong,
|
|
||||||
.footer-cell[data-severity="unavailable"] strong {
|
|
||||||
color: var(--ui-color-stale);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-cell[data-severity="loading"] strong {
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-cell:where(a):hover strong {
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiStatusItem } from "../types";
|
|
||||||
import FooterCell from "./FooterCell.svelte";
|
|
||||||
|
|
||||||
let { item }: { item: UiStatusItem } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<FooterCell {item} />
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { Snippet } from "svelte";
|
|
||||||
|
|
||||||
let {
|
|
||||||
children,
|
|
||||||
density = "dense",
|
|
||||||
}: {
|
|
||||||
children?: Snippet;
|
|
||||||
density?: "compact" | "dense";
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<section class="grid-frame" data-density={density}>
|
|
||||||
{@render children?.()}
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.grid-frame {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
|
|
||||||
gap: var(--ui-space-3);
|
|
||||||
padding: var(--ui-space-3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-frame[data-density="compact"] {
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr));
|
|
||||||
gap: var(--ui-space-2);
|
|
||||||
padding: var(--ui-space-2);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { HTMLButtonAttributes } from "svelte/elements";
|
|
||||||
import IconGlyph from "./IconGlyph.svelte";
|
|
||||||
|
|
||||||
type IconButtonProps = Omit<HTMLButtonAttributes, "type"> & {
|
|
||||||
icon: string;
|
|
||||||
label: string;
|
|
||||||
active?: boolean;
|
|
||||||
type?: "button" | "submit" | "reset";
|
|
||||||
};
|
|
||||||
|
|
||||||
let {
|
|
||||||
icon,
|
|
||||||
label,
|
|
||||||
active = false,
|
|
||||||
disabled = false,
|
|
||||||
type = "button",
|
|
||||||
class: className = "",
|
|
||||||
...buttonProps
|
|
||||||
}: IconButtonProps = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<button
|
|
||||||
{...buttonProps}
|
|
||||||
class={className ? `icon-button ${className}` : "icon-button"}
|
|
||||||
aria-label={label}
|
|
||||||
data-active={active}
|
|
||||||
{disabled}
|
|
||||||
{type}
|
|
||||||
>
|
|
||||||
<IconGlyph name={icon} size="sm" />
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.icon-button {
|
|
||||||
display: inline-grid;
|
|
||||||
width: 2.5rem;
|
|
||||||
height: 2.5rem;
|
|
||||||
place-items: center;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: rgba(2, 3, 2, 0.92);
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button[data-active="true"],
|
|
||||||
.icon-button:hover {
|
|
||||||
border-color: var(--ui-color-accent);
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button:disabled {
|
|
||||||
cursor: not-allowed;
|
|
||||||
opacity: 0.45;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import Icon from "@iconify/svelte";
|
|
||||||
|
|
||||||
let {
|
|
||||||
name,
|
|
||||||
label,
|
|
||||||
size = "md",
|
|
||||||
}: {
|
|
||||||
name?: string;
|
|
||||||
label?: string;
|
|
||||||
size?: "sm" | "md" | "lg";
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<span
|
|
||||||
class="icon-glyph"
|
|
||||||
data-size={size}
|
|
||||||
data-icon-name={name}
|
|
||||||
aria-label={label}
|
|
||||||
aria-hidden={label ? undefined : "true"}
|
|
||||||
>
|
|
||||||
{#if name}
|
|
||||||
<Icon icon={name} />
|
|
||||||
{/if}
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.icon-glyph {
|
|
||||||
display: inline-grid;
|
|
||||||
width: 1.55rem;
|
|
||||||
height: 1.55rem;
|
|
||||||
place-items: center;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: #050605;
|
|
||||||
color: currentColor;
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-glyph :global(svg) {
|
|
||||||
width: 0.95rem;
|
|
||||||
height: 0.95rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-glyph[data-size="sm"] {
|
|
||||||
width: 1.1rem;
|
|
||||||
height: 1.1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-glyph[data-size="lg"] {
|
|
||||||
width: 2.35rem;
|
|
||||||
height: 2.35rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import { onDestroy, onMount } from "svelte";
|
|
||||||
import "uplot/dist/uPlot.min.css";
|
|
||||||
import type { UiSeverity } from "../types";
|
|
||||||
|
|
||||||
let {
|
|
||||||
values = [],
|
|
||||||
severity = "neutral",
|
|
||||||
label = "Telemetry trend",
|
|
||||||
}: {
|
|
||||||
values?: number[];
|
|
||||||
severity?: UiSeverity;
|
|
||||||
label?: string;
|
|
||||||
} = $props();
|
|
||||||
|
|
||||||
let chartElement: HTMLDivElement;
|
|
||||||
let chart: ChartInstance | null = null;
|
|
||||||
let resizeObserver: ResizeObserver | null = null;
|
|
||||||
|
|
||||||
onMount(async () => {
|
|
||||||
const module = await import("uplot");
|
|
||||||
chart = new module.default(chartOptions(chartElement, severity), chartData(values), chartElement);
|
|
||||||
resizeObserver = new ResizeObserver(() => {
|
|
||||||
chart?.setSize(chartSize(chartElement));
|
|
||||||
});
|
|
||||||
resizeObserver.observe(chartElement);
|
|
||||||
});
|
|
||||||
|
|
||||||
$effect(() => {
|
|
||||||
chart?.setData(chartData(values));
|
|
||||||
chart?.setSize(chartSize(chartElement));
|
|
||||||
});
|
|
||||||
|
|
||||||
onDestroy(() => {
|
|
||||||
resizeObserver?.disconnect();
|
|
||||||
chart?.destroy();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="line-chart"
|
|
||||||
data-chart-library="uplot"
|
|
||||||
data-severity={severity}
|
|
||||||
role="img"
|
|
||||||
aria-label={label}
|
|
||||||
>
|
|
||||||
<div class="line-chart__canvas" bind:this={chartElement} aria-hidden="true"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.line-chart {
|
|
||||||
position: relative;
|
|
||||||
min-width: 0;
|
|
||||||
height: 1rem;
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-chart[data-severity="warning"] {
|
|
||||||
color: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-chart[data-severity="danger"] {
|
|
||||||
color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-chart[data-severity="stale"],
|
|
||||||
.line-chart[data-severity="unavailable"] {
|
|
||||||
color: var(--ui-color-stale);
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-chart__canvas {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-chart__canvas :global(.uplot) {
|
|
||||||
width: 100% !important;
|
|
||||||
height: 100% !important;
|
|
||||||
background: transparent;
|
|
||||||
font-family: var(--ui-font-mono);
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-chart__canvas :global(.u-over),
|
|
||||||
.line-chart__canvas :global(.u-under) {
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script lang="ts" module>
|
|
||||||
type ChartInstance = {
|
|
||||||
destroy(): void;
|
|
||||||
setData(data: import("uplot").AlignedData): void;
|
|
||||||
setSize(size: { width: number; height: number }): void;
|
|
||||||
};
|
|
||||||
|
|
||||||
function chartData(values: number[]): import("uplot").AlignedData {
|
|
||||||
const normalized = values.length ? values : [0, 0];
|
|
||||||
return [
|
|
||||||
normalized.map((_, index) => index),
|
|
||||||
normalized.map((value) => Math.max(0, Number(value) || 0)),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
function chartOptions(
|
|
||||||
element: HTMLElement,
|
|
||||||
severity: import("../types").UiSeverity,
|
|
||||||
): import("uplot").Options {
|
|
||||||
return {
|
|
||||||
...chartSize(element),
|
|
||||||
cursor: { show: false },
|
|
||||||
legend: { show: false },
|
|
||||||
padding: [2, 0, 2, 0],
|
|
||||||
scales: {
|
|
||||||
x: { time: false },
|
|
||||||
y: { auto: true },
|
|
||||||
},
|
|
||||||
axes: [
|
|
||||||
{ show: false },
|
|
||||||
{ show: false },
|
|
||||||
],
|
|
||||||
series: [
|
|
||||||
{},
|
|
||||||
{
|
|
||||||
stroke: chartStroke(element, severity),
|
|
||||||
width: 2,
|
|
||||||
points: { show: false },
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function chartSize(element?: HTMLElement): { width: number; height: number } {
|
|
||||||
return {
|
|
||||||
width: Math.max(80, Math.round(element?.clientWidth || 120)),
|
|
||||||
height: Math.max(20, Math.round(element?.clientHeight || 24)),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function chartStroke(element: HTMLElement, severity: import("../types").UiSeverity): string {
|
|
||||||
const styles = window.getComputedStyle(element.closest(".line-chart") || element);
|
|
||||||
const currentColor = styles.color;
|
|
||||||
if (currentColor) return currentColor;
|
|
||||||
if (severity === "danger") return "#ff1744";
|
|
||||||
if (severity === "warning") return "#ffb020";
|
|
||||||
return "#d7ff00";
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,104 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiModuleBlock } from "../types";
|
|
||||||
import IconGlyph from "./IconGlyph.svelte";
|
|
||||||
|
|
||||||
const generatedId = $props.id();
|
|
||||||
|
|
||||||
let { module }: { module: UiModuleBlock } = $props();
|
|
||||||
|
|
||||||
let titleId = $derived(`${generatedId}-title`);
|
|
||||||
let ariaLabel = $derived(module.title ? undefined : module.label || module.id);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<aside
|
|
||||||
class="module-card"
|
|
||||||
data-severity={module.severity || "neutral"}
|
|
||||||
data-model-id={module.id}
|
|
||||||
aria-labelledby={module.title ? titleId : undefined}
|
|
||||||
aria-label={ariaLabel}
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
{#if module.title}
|
|
||||||
<h2 id={titleId}>{module.title}</h2>
|
|
||||||
{/if}
|
|
||||||
{#if module.value}
|
|
||||||
<strong>{module.value}</strong>
|
|
||||||
{/if}
|
|
||||||
{#if module.detail || module.label}
|
|
||||||
<p>{module.detail || module.label}</p>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{#if module.icon}
|
|
||||||
<IconGlyph name={module.icon} size="lg" />
|
|
||||||
{/if}
|
|
||||||
</aside>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.module-card {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: minmax(0, 1fr) auto;
|
|
||||||
gap: 0.5rem;
|
|
||||||
align-items: start;
|
|
||||||
min-width: 0;
|
|
||||||
min-height: 4.15rem;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: rgba(6, 8, 7, 0.82);
|
|
||||||
padding: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2,
|
|
||||||
p {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.56rem;
|
|
||||||
line-height: 1;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
strong {
|
|
||||||
display: block;
|
|
||||||
margin-top: 0.15rem;
|
|
||||||
font-family: var(--ui-font-display);
|
|
||||||
font-size: clamp(1.25rem, 1.75vw, 1.72rem);
|
|
||||||
line-height: 0.82;
|
|
||||||
overflow-wrap: anywhere;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-top: 0.2rem;
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.49rem;
|
|
||||||
line-height: 1.05;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
text-transform: uppercase;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.module-card[data-severity="ok"] :global(.icon-glyph) {
|
|
||||||
background: var(--ui-color-accent);
|
|
||||||
color: #050605;
|
|
||||||
}
|
|
||||||
|
|
||||||
.module-card[data-severity="warning"] {
|
|
||||||
border-color: color-mix(in srgb, var(--ui-color-warning), transparent 42%);
|
|
||||||
color: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
.module-card[data-severity="danger"] {
|
|
||||||
border-color: color-mix(in srgb, var(--ui-color-danger), transparent 32%);
|
|
||||||
color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
.module-card[data-severity="stale"],
|
|
||||||
.module-card[data-severity="unavailable"] {
|
|
||||||
color: var(--ui-color-stale);
|
|
||||||
}
|
|
||||||
|
|
||||||
.module-card[data-severity="loading"] {
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { Snippet } from "svelte";
|
|
||||||
|
|
||||||
let {
|
|
||||||
title,
|
|
||||||
density = "dense",
|
|
||||||
children,
|
|
||||||
}: {
|
|
||||||
title?: string;
|
|
||||||
density?: "compact" | "dense";
|
|
||||||
children?: Snippet;
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<section class="panel" data-density={density}>
|
|
||||||
{#if title}
|
|
||||||
<header class="panel__header">
|
|
||||||
<h2>{title}</h2>
|
|
||||||
</header>
|
|
||||||
{/if}
|
|
||||||
<div class="panel__body">
|
|
||||||
{@render children?.()}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.panel {
|
|
||||||
position: relative;
|
|
||||||
min-width: 0;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: rgba(3, 4, 3, 0.86);
|
|
||||||
box-shadow: var(--ui-shadow-hard);
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel::before,
|
|
||||||
.panel::after {
|
|
||||||
position: absolute;
|
|
||||||
width: 0.55rem;
|
|
||||||
height: 0.55rem;
|
|
||||||
border-color: var(--ui-color-line-strong);
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel::before {
|
|
||||||
top: 0.2rem;
|
|
||||||
right: 0.2rem;
|
|
||||||
border-top: 1px solid;
|
|
||||||
border-right: 1px solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel::after {
|
|
||||||
right: 0.2rem;
|
|
||||||
bottom: 0.2rem;
|
|
||||||
border-right: 1px solid;
|
|
||||||
border-bottom: 1px solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel__header {
|
|
||||||
padding: 0.42rem 0.55rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
margin: 0;
|
|
||||||
font-family: var(--ui-font-display);
|
|
||||||
font-size: clamp(1.25rem, 1.8vw, 1.75rem);
|
|
||||||
font-weight: 800;
|
|
||||||
letter-spacing: 0;
|
|
||||||
line-height: 0.92;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel__body {
|
|
||||||
display: grid;
|
|
||||||
gap: 0.25rem;
|
|
||||||
padding: 0.42rem 0.55rem 0.55rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel[data-density="compact"] .panel__body {
|
|
||||||
padding: var(--ui-space-2);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import { clampPercent } from "../format";
|
|
||||||
import type { UiSeverity } from "../types";
|
|
||||||
|
|
||||||
let {
|
|
||||||
value,
|
|
||||||
severity = "neutral",
|
|
||||||
label = "Progress",
|
|
||||||
}: {
|
|
||||||
value?: number;
|
|
||||||
severity?: UiSeverity;
|
|
||||||
label?: string;
|
|
||||||
} = $props();
|
|
||||||
|
|
||||||
let progress = $derived(value === undefined ? null : clampPercent(value));
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="progress-meter"
|
|
||||||
data-severity={severity}
|
|
||||||
role="meter"
|
|
||||||
aria-label={label}
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
aria-valuenow={progress ?? undefined}
|
|
||||||
data-empty={progress === null}
|
|
||||||
>
|
|
||||||
{#if progress !== null}
|
|
||||||
<span style={`--meter-progress: ${progress}%`}></span>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.progress-meter {
|
|
||||||
height: 0.4rem;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: #030403;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-meter span {
|
|
||||||
display: block;
|
|
||||||
width: var(--meter-progress);
|
|
||||||
height: 100%;
|
|
||||||
background: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-meter[data-severity="warning"] span {
|
|
||||||
background: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-meter[data-severity="danger"] span {
|
|
||||||
background: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-meter[data-empty="true"] {
|
|
||||||
opacity: 0.46;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
let {
|
|
||||||
intensity = "medium",
|
|
||||||
size = "md",
|
|
||||||
tone = "neutral",
|
|
||||||
}: {
|
|
||||||
intensity?: "soft" | "medium" | "hard";
|
|
||||||
size?: "sm" | "md" | "lg";
|
|
||||||
tone?: "neutral" | "accent" | "warning";
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="scanline-field"
|
|
||||||
data-intensity={intensity}
|
|
||||||
data-size={size}
|
|
||||||
data-tone={tone}
|
|
||||||
aria-hidden="true"
|
|
||||||
></div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.scanline-field {
|
|
||||||
--scan-color: rgba(243, 244, 237, 0.12);
|
|
||||||
--scan-gap: 0.48rem;
|
|
||||||
--scan-weight: 1px;
|
|
||||||
display: block;
|
|
||||||
min-height: 4rem;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background:
|
|
||||||
radial-gradient(circle at 18% 24%, color-mix(in srgb, var(--scan-color), transparent 35%) 0 1px, transparent 2px),
|
|
||||||
radial-gradient(circle at 76% 62%, color-mix(in srgb, var(--scan-color), transparent 44%) 0 1px, transparent 2px),
|
|
||||||
repeating-linear-gradient(
|
|
||||||
180deg,
|
|
||||||
transparent 0 calc(var(--scan-gap) - var(--scan-weight)),
|
|
||||||
var(--scan-color) calc(var(--scan-gap) - var(--scan-weight)) var(--scan-gap)
|
|
||||||
),
|
|
||||||
rgba(6, 7, 6, 0.78);
|
|
||||||
background-size: 3.1rem 3.1rem, 4.7rem 4.7rem, auto, auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scanline-field[data-intensity="soft"] {
|
|
||||||
--scan-color: rgba(243, 244, 237, 0.07);
|
|
||||||
--scan-gap: 0.62rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scanline-field[data-intensity="hard"] {
|
|
||||||
--scan-color: rgba(215, 255, 0, 0.2);
|
|
||||||
--scan-gap: 0.36rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scanline-field[data-size="sm"] {
|
|
||||||
min-height: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scanline-field[data-size="lg"] {
|
|
||||||
min-height: 6.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scanline-field[data-tone="accent"] {
|
|
||||||
--scan-color: rgba(215, 255, 0, 0.16);
|
|
||||||
}
|
|
||||||
|
|
||||||
.scanline-field[data-tone="warning"] {
|
|
||||||
--scan-color: rgba(255, 176, 32, 0.16);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
let {
|
|
||||||
orientation = "horizontal",
|
|
||||||
dense = false,
|
|
||||||
}: {
|
|
||||||
orientation?: "horizontal" | "vertical";
|
|
||||||
dense?: boolean;
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="separator"
|
|
||||||
data-orientation={orientation}
|
|
||||||
data-dense={dense}
|
|
||||||
role="separator"
|
|
||||||
aria-orientation={orientation}
|
|
||||||
></div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.separator {
|
|
||||||
background: var(--ui-color-line);
|
|
||||||
}
|
|
||||||
|
|
||||||
.separator[data-orientation="horizontal"] {
|
|
||||||
width: 100%;
|
|
||||||
height: 1px;
|
|
||||||
margin-block: var(--ui-space-3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.separator[data-orientation="vertical"] {
|
|
||||||
width: 1px;
|
|
||||||
min-height: 3rem;
|
|
||||||
align-self: stretch;
|
|
||||||
}
|
|
||||||
|
|
||||||
.separator[data-dense="true"] {
|
|
||||||
margin-block: var(--ui-space-1);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiServiceGroup } from "../types";
|
|
||||||
import ServicePanel from "./ServicePanel.svelte";
|
|
||||||
|
|
||||||
let { group }: { group: UiServiceGroup } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<ServicePanel {group} />
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiServiceGroup } from "../types";
|
|
||||||
import Panel from "./Panel.svelte";
|
|
||||||
import ServiceRow from "./ServiceRow.svelte";
|
|
||||||
import StatusStrip from "./StatusStrip.svelte";
|
|
||||||
|
|
||||||
let { group }: { group: UiServiceGroup } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div class="service-panel" data-layout={group.layout || "list"} data-model-id={group.id}>
|
|
||||||
<Panel title={group.title}>
|
|
||||||
{#if group.summary?.length}
|
|
||||||
<StatusStrip id={`${group.id}:summary`} items={group.summary} compact />
|
|
||||||
{/if}
|
|
||||||
{#each group.services as service (service.id)}
|
|
||||||
<ServiceRow {service} />
|
|
||||||
{/each}
|
|
||||||
</Panel>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.service-panel :global(.panel__body) {
|
|
||||||
gap: 0;
|
|
||||||
padding-block: 0.24rem 0.42rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-panel :global(.status-strip) {
|
|
||||||
margin-bottom: 0.16rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,115 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiServiceRow } from "../types";
|
|
||||||
import IconGlyph from "./IconGlyph.svelte";
|
|
||||||
import StatusBadge from "./StatusBadge.svelte";
|
|
||||||
|
|
||||||
let { service }: { service: UiServiceRow } = $props();
|
|
||||||
|
|
||||||
let target = $derived(service.link?.external ? "_blank" : undefined);
|
|
||||||
let rel = $derived(service.link?.external ? "noreferrer" : undefined);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{#snippet rowContent()}
|
|
||||||
<IconGlyph name={service.icon} />
|
|
||||||
<div class="service-row__main">
|
|
||||||
<h3>{service.label}</h3>
|
|
||||||
<p>{service.description}</p>
|
|
||||||
</div>
|
|
||||||
{#if service.detail}
|
|
||||||
<StatusBadge label={service.detail} severity={service.severity} />
|
|
||||||
{/if}
|
|
||||||
{/snippet}
|
|
||||||
|
|
||||||
{#if service.link}
|
|
||||||
<a
|
|
||||||
class="service-row"
|
|
||||||
data-severity={service.severity}
|
|
||||||
data-model-id={service.id}
|
|
||||||
href={service.link.href}
|
|
||||||
target={target}
|
|
||||||
rel={rel}
|
|
||||||
aria-label={service.link.label}
|
|
||||||
>
|
|
||||||
{@render rowContent()}
|
|
||||||
</a>
|
|
||||||
{:else}
|
|
||||||
<article class="service-row" data-severity={service.severity} data-model-id={service.id}>
|
|
||||||
{@render rowContent()}
|
|
||||||
</article>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.service-row {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
||||||
gap: 0.24rem;
|
|
||||||
align-items: center;
|
|
||||||
min-height: 2.02rem;
|
|
||||||
border: 0;
|
|
||||||
border-bottom: var(--ui-border);
|
|
||||||
background: transparent;
|
|
||||||
color: inherit;
|
|
||||||
padding: 0.14rem 0;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-row[data-severity="warning"] {
|
|
||||||
border-bottom-color: color-mix(in srgb, var(--ui-color-warning), transparent 54%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-row[data-severity="danger"],
|
|
||||||
.service-row[data-severity="unavailable"] {
|
|
||||||
border-bottom-color: color-mix(in srgb, var(--ui-color-danger), transparent 50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-row[data-severity="loading"] {
|
|
||||||
border-bottom-color: color-mix(in srgb, var(--ui-color-accent), transparent 56%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-row:where(a):hover {
|
|
||||||
border-bottom-color: var(--ui-color-accent);
|
|
||||||
background: rgba(244, 244, 244, 0.035);
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-row__main {
|
|
||||||
min-width: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3,
|
|
||||||
p {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
overflow: hidden;
|
|
||||||
font-size: 0.72rem;
|
|
||||||
font-weight: 850;
|
|
||||||
letter-spacing: 0;
|
|
||||||
line-height: 1.05;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
text-transform: uppercase;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-top: 0.12rem;
|
|
||||||
overflow: hidden;
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.56rem;
|
|
||||||
line-height: 1.08;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
text-transform: uppercase;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 580px) {
|
|
||||||
.service-row {
|
|
||||||
grid-template-columns: auto minmax(0, 1fr);
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-row :global(.status-badge) {
|
|
||||||
grid-column: 2;
|
|
||||||
justify-self: start;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,112 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
let {
|
|
||||||
density = "regular",
|
|
||||||
orientation = "horizontal",
|
|
||||||
tone = "accent",
|
|
||||||
}: {
|
|
||||||
density?: "regular" | "tight";
|
|
||||||
orientation?: "horizontal" | "vertical";
|
|
||||||
tone?: "neutral" | "accent" | "warning";
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="signal-trace"
|
|
||||||
data-density={density}
|
|
||||||
data-orientation={orientation}
|
|
||||||
data-tone={tone}
|
|
||||||
aria-hidden="true"
|
|
||||||
>
|
|
||||||
<span class="signal-trace__rail"></span>
|
|
||||||
<span class="signal-trace__node" data-node="start"></span>
|
|
||||||
<span class="signal-trace__node" data-node="middle"></span>
|
|
||||||
<span class="signal-trace__node" data-node="end"></span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.signal-trace {
|
|
||||||
--trace-color: var(--ui-color-accent);
|
|
||||||
--trace-track: min(100%, 20rem);
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
min-height: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace__rail {
|
|
||||||
position: absolute;
|
|
||||||
inset: 50% 0 auto;
|
|
||||||
height: 1px;
|
|
||||||
background:
|
|
||||||
linear-gradient(90deg, transparent, var(--trace-color) 18%, var(--trace-color) 82%, transparent),
|
|
||||||
linear-gradient(90deg, transparent 0 35%, rgba(255, 255, 255, 0.42) 35% 38%, transparent 38%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace__node {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
width: 0.55rem;
|
|
||||||
height: 0.55rem;
|
|
||||||
border: 1px solid var(--trace-color);
|
|
||||||
background: var(--ui-color-canvas);
|
|
||||||
transform: translate(-50%, -50%) rotate(45deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace__node[data-node="start"] {
|
|
||||||
left: 18%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace__node[data-node="middle"] {
|
|
||||||
left: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace__node[data-node="end"] {
|
|
||||||
left: 82%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-density="tight"] {
|
|
||||||
min-height: 0.95rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-density="tight"] .signal-trace__node {
|
|
||||||
width: 0.38rem;
|
|
||||||
height: 0.38rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-orientation="vertical"] {
|
|
||||||
width: 1.5rem;
|
|
||||||
min-height: 12rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-orientation="vertical"] .signal-trace__rail {
|
|
||||||
inset: 0 auto 0 50%;
|
|
||||||
width: 1px;
|
|
||||||
height: auto;
|
|
||||||
background:
|
|
||||||
linear-gradient(180deg, transparent, var(--trace-color) 18%, var(--trace-color) 82%, transparent),
|
|
||||||
linear-gradient(180deg, transparent 0 35%, rgba(255, 255, 255, 0.42) 35% 38%, transparent 38%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-orientation="vertical"] .signal-trace__node[data-node="start"] {
|
|
||||||
top: 18%;
|
|
||||||
left: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-orientation="vertical"] .signal-trace__node[data-node="middle"] {
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-orientation="vertical"] .signal-trace__node[data-node="end"] {
|
|
||||||
top: 82%;
|
|
||||||
left: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-tone="neutral"] {
|
|
||||||
--trace-color: var(--ui-color-line-strong);
|
|
||||||
}
|
|
||||||
|
|
||||||
.signal-trace[data-tone="warning"] {
|
|
||||||
--trace-color: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiSeverity } from "../types";
|
|
||||||
|
|
||||||
let {
|
|
||||||
values = [],
|
|
||||||
severity = "neutral",
|
|
||||||
}: {
|
|
||||||
values?: number[];
|
|
||||||
severity?: UiSeverity;
|
|
||||||
} = $props();
|
|
||||||
|
|
||||||
let points = $derived(toPoints(values));
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<svg class="sparkline" data-severity={severity} viewBox="0 0 100 24" aria-hidden="true">
|
|
||||||
{#if points}
|
|
||||||
<polyline {points} />
|
|
||||||
{/if}
|
|
||||||
</svg>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.sparkline {
|
|
||||||
width: 100%;
|
|
||||||
height: 1.5rem;
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.sparkline[data-severity="warning"] {
|
|
||||||
color: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
.sparkline[data-severity="danger"] {
|
|
||||||
color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
polyline {
|
|
||||||
fill: none;
|
|
||||||
stroke: currentColor;
|
|
||||||
stroke-linecap: square;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script lang="ts" module>
|
|
||||||
function toPoints(values: number[]): string {
|
|
||||||
if (values.length === 0) return "";
|
|
||||||
const max = Math.max(...values, 1);
|
|
||||||
const step = values.length > 1 ? 100 / (values.length - 1) : 100;
|
|
||||||
return values
|
|
||||||
.map((value, index) => {
|
|
||||||
const x = index * step;
|
|
||||||
const y = 24 - (Math.max(0, value) / max) * 22;
|
|
||||||
return `${x.toFixed(2)},${y.toFixed(2)}`;
|
|
||||||
})
|
|
||||||
.join(" ");
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiSeverity } from "../types";
|
|
||||||
|
|
||||||
let {
|
|
||||||
label,
|
|
||||||
severity = "neutral",
|
|
||||||
}: {
|
|
||||||
label: string;
|
|
||||||
severity?: UiSeverity;
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<span class="status-badge" data-severity={severity}>{label}</span>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.status-badge {
|
|
||||||
display: inline-grid;
|
|
||||||
min-height: 1.12rem;
|
|
||||||
align-items: center;
|
|
||||||
border: var(--ui-border);
|
|
||||||
padding: 0 0.3rem;
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.55rem;
|
|
||||||
font-weight: 800;
|
|
||||||
letter-spacing: 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-badge[data-severity="ok"] {
|
|
||||||
border-color: color-mix(in srgb, var(--ui-color-ok), transparent 42%);
|
|
||||||
color: var(--ui-color-ok);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-badge[data-severity="warning"] {
|
|
||||||
border-color: color-mix(in srgb, var(--ui-color-warning), transparent 35%);
|
|
||||||
color: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-badge[data-severity="danger"] {
|
|
||||||
border-color: color-mix(in srgb, var(--ui-color-danger), transparent 30%);
|
|
||||||
color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-badge[data-severity="stale"],
|
|
||||||
.status-badge[data-severity="unavailable"] {
|
|
||||||
color: var(--ui-color-stale);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-badge[data-severity="loading"] {
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiStatusItem } from "../types";
|
|
||||||
import FooterCell from "./FooterCell.svelte";
|
|
||||||
|
|
||||||
let {
|
|
||||||
id,
|
|
||||||
items,
|
|
||||||
compact = false,
|
|
||||||
}: {
|
|
||||||
id?: string;
|
|
||||||
items: UiStatusItem[];
|
|
||||||
compact?: boolean;
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<section class="status-strip" data-compact={compact} data-model-id={id}>
|
|
||||||
{#each items as item (item.id)}
|
|
||||||
<FooterCell {item} />
|
|
||||||
{/each}
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.status-strip {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
|
|
||||||
gap: 1px;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: var(--ui-color-line);
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-strip[data-compact="true"] {
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(6rem, 1fr));
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiSeverity } from "../types";
|
|
||||||
import IconGlyph from "./IconGlyph.svelte";
|
|
||||||
|
|
||||||
let {
|
|
||||||
title,
|
|
||||||
detail,
|
|
||||||
icon = "mdi:information-outline",
|
|
||||||
severity = "neutral",
|
|
||||||
}: {
|
|
||||||
title: string;
|
|
||||||
detail?: string;
|
|
||||||
icon?: string;
|
|
||||||
severity?: UiSeverity;
|
|
||||||
} = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<section class="system-state" data-severity={severity}>
|
|
||||||
<IconGlyph name={icon} size="lg" />
|
|
||||||
<div>
|
|
||||||
<h2>{title}</h2>
|
|
||||||
{#if detail}
|
|
||||||
<p>{detail}</p>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.system-state {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: auto minmax(0, 1fr);
|
|
||||||
gap: var(--ui-space-3);
|
|
||||||
align-items: center;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: rgba(6, 8, 7, 0.82);
|
|
||||||
padding: var(--ui-space-4);
|
|
||||||
}
|
|
||||||
|
|
||||||
.system-state[data-severity="warning"] {
|
|
||||||
color: var(--ui-color-warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
.system-state[data-severity="danger"],
|
|
||||||
.system-state[data-severity="unavailable"] {
|
|
||||||
color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
.system-state[data-severity="loading"] {
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
h2,
|
|
||||||
p {
|
|
||||||
margin: 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-top: var(--ui-space-1);
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.72rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,140 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import { formatMetricValue } from "../format";
|
|
||||||
import type { UiTelemetryCard } from "../types";
|
|
||||||
import IconGlyph from "./IconGlyph.svelte";
|
|
||||||
import LineChart from "./LineChart.svelte";
|
|
||||||
|
|
||||||
let { card }: { card: UiTelemetryCard } = $props();
|
|
||||||
|
|
||||||
let progress = $derived(resolveProgress(card));
|
|
||||||
let value = $derived(formatMetricValue(card.value));
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<article class="telemetry-card" data-severity={card.severity} data-model-id={card.id}>
|
|
||||||
<header>
|
|
||||||
{#if card.icon}
|
|
||||||
<IconGlyph name={card.icon} size="sm" />
|
|
||||||
{/if}
|
|
||||||
<h3>{card.label}</h3>
|
|
||||||
</header>
|
|
||||||
<strong>{value}</strong>
|
|
||||||
{#if progress !== null}
|
|
||||||
<div class="telemetry-card__bar" aria-hidden="true">
|
|
||||||
<span style={`--metric-progress: ${progress}%`}></span>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
{#if card.sparkline?.length}
|
|
||||||
<LineChart values={card.sparkline} severity={card.severity} label={`${card.label} trend`} />
|
|
||||||
{/if}
|
|
||||||
{#if card.detail || card.description}
|
|
||||||
<p>{card.detail || card.description}</p>
|
|
||||||
{/if}
|
|
||||||
</article>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.telemetry-card {
|
|
||||||
display: grid;
|
|
||||||
min-height: 5.15rem;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: linear-gradient(180deg, rgba(13, 15, 14, 0.82), rgba(2, 3, 2, 0.92));
|
|
||||||
padding: 0.45rem 0.55rem 0.42rem;
|
|
||||||
color: var(--ui-color-text);
|
|
||||||
gap: 0.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.telemetry-card[data-severity="warning"] {
|
|
||||||
border-color: color-mix(in srgb, var(--ui-color-warning), transparent 42%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.telemetry-card[data-severity="danger"] {
|
|
||||||
border-color: color-mix(in srgb, var(--ui-color-danger), transparent 22%);
|
|
||||||
color: var(--ui-color-danger);
|
|
||||||
}
|
|
||||||
|
|
||||||
.telemetry-card[data-severity="stale"],
|
|
||||||
.telemetry-card[data-severity="unavailable"] {
|
|
||||||
color: var(--ui-color-stale);
|
|
||||||
}
|
|
||||||
|
|
||||||
.telemetry-card[data-severity="loading"] {
|
|
||||||
color: var(--ui-color-accent);
|
|
||||||
}
|
|
||||||
|
|
||||||
.telemetry-card[data-severity="loading"] .telemetry-card__bar span {
|
|
||||||
min-width: 1.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
header {
|
|
||||||
display: flex;
|
|
||||||
min-width: 0;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.35rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
header :global(.icon-glyph) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3,
|
|
||||||
p {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
overflow-wrap: anywhere;
|
|
||||||
color: inherit;
|
|
||||||
font-size: 0.58rem;
|
|
||||||
font-weight: 800;
|
|
||||||
letter-spacing: 0;
|
|
||||||
line-height: 1.02;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
strong {
|
|
||||||
font-family: var(--ui-font-display);
|
|
||||||
font-size: clamp(1.55rem, 2.45vw, 2.22rem);
|
|
||||||
font-weight: 800;
|
|
||||||
letter-spacing: 0;
|
|
||||||
line-height: 0.76;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
overflow: hidden;
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.49rem;
|
|
||||||
line-height: 1.05;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
text-transform: uppercase;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.telemetry-card__bar {
|
|
||||||
height: 0.25rem;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: #030403;
|
|
||||||
}
|
|
||||||
|
|
||||||
.telemetry-card__bar span {
|
|
||||||
display: block;
|
|
||||||
width: var(--metric-progress);
|
|
||||||
height: 100%;
|
|
||||||
background: currentColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script lang="ts" module>
|
|
||||||
import { clampPercent } from "../format";
|
|
||||||
|
|
||||||
function resolveProgress(card: {
|
|
||||||
progress?: number;
|
|
||||||
value: { kind: string; value: number | string };
|
|
||||||
}): number | null {
|
|
||||||
if (typeof card.progress === "number") return clampPercent(card.progress);
|
|
||||||
if (card.value.kind !== "percent") return null;
|
|
||||||
|
|
||||||
const progress = Number(card.value.value);
|
|
||||||
return Number.isFinite(progress) ? clampPercent(progress) : null;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiTelemetryCard } from "../types";
|
|
||||||
import TelemetryCard from "./TelemetryCard.svelte";
|
|
||||||
|
|
||||||
let { cards }: { cards: UiTelemetryCard[] } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<section class="telemetry-grid" aria-label="Telemetry">
|
|
||||||
{#each cards as card (card.id)}
|
|
||||||
<TelemetryCard {card} />
|
|
||||||
{/each}
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.telemetry-grid {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(8, minmax(0, 1fr));
|
|
||||||
gap: 1px;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: var(--ui-color-line);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 1100px) {
|
|
||||||
.telemetry-grid {
|
|
||||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 700px) {
|
|
||||||
.telemetry-grid {
|
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiTelemetryCard } from "../types";
|
|
||||||
import TelemetryGrid from "./TelemetryGrid.svelte";
|
|
||||||
|
|
||||||
let { cards }: { cards: UiTelemetryCard[] } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<TelemetryGrid {cards} />
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type { UiModuleBlock } from "../types";
|
|
||||||
import ModuleCard from "./ModuleCard.svelte";
|
|
||||||
|
|
||||||
let { module }: { module: UiModuleBlock } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<ModuleCard {module} />
|
|
||||||
|
|
@ -121,11 +121,12 @@ describe("Storybook inventory", () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
test("does not keep Svelte stories in the React Storybook inventory", () => {
|
test("does not keep legacy stories in the React Storybook inventory", () => {
|
||||||
const svelteStories = readdirSync(storiesDir).filter((filename) =>
|
const legacyStoryExtension = [".stories", ".sve", "lte"].join("");
|
||||||
filename.endsWith(".stories.svelte"),
|
const legacyStories = readdirSync(storiesDir).filter((filename) =>
|
||||||
|
filename.endsWith(legacyStoryExtension),
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(svelteStories).toEqual([]);
|
expect(legacyStories).toEqual([]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import "../app.css";
|
|
||||||
|
|
||||||
let { children } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{@render children()}
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
import { loadDashboardRuntime } from "$lib/server/dashboard";
|
|
||||||
import { resolveDashboardDatasources } from "$lib/server/datasources";
|
|
||||||
|
|
||||||
export async function load() {
|
|
||||||
const dashboard = loadDashboardRuntime(undefined, {
|
|
||||||
refreshSeedDocument: true,
|
|
||||||
seedIfEmpty: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (dashboard.state !== "ready") {
|
|
||||||
return { dashboard };
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.env.DISABLE_LIVE_DATASOURCES === "1") {
|
|
||||||
return { dashboard };
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
dashboard: {
|
|
||||||
...dashboard,
|
|
||||||
document: await resolveDashboardDatasources(dashboard.document),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,124 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import { browser } from "$app/environment";
|
|
||||||
import { invalidateAll } from "$app/navigation";
|
|
||||||
import {
|
|
||||||
DashboardFrame,
|
|
||||||
SystemState,
|
|
||||||
dashboardDocumentToUiDashboard,
|
|
||||||
} from "$lib/ui";
|
|
||||||
import { onDestroy } from "svelte";
|
|
||||||
import type { PageData } from "./$types";
|
|
||||||
|
|
||||||
let { data }: { data: PageData } = $props();
|
|
||||||
|
|
||||||
let dashboard = $derived(
|
|
||||||
data.dashboard.state === "ready"
|
|
||||||
? dashboardDocumentToUiDashboard(data.dashboard.document)
|
|
||||||
: null,
|
|
||||||
);
|
|
||||||
let stateTitle = $derived(
|
|
||||||
data.dashboard.state === "ready" ? "" : data.dashboard.title,
|
|
||||||
);
|
|
||||||
let stateSubtitle = $derived(
|
|
||||||
data.dashboard.state === "ready" ? "" : data.dashboard.subtitle,
|
|
||||||
);
|
|
||||||
let stateMessage = $derived(
|
|
||||||
data.dashboard.state === "ready" ? "" : data.dashboard.message,
|
|
||||||
);
|
|
||||||
let stateErrors = $derived(
|
|
||||||
data.dashboard.state === "invalid" ? data.dashboard.errors : [],
|
|
||||||
);
|
|
||||||
let pageTitle = $derived(dashboard?.title || stateTitle);
|
|
||||||
let pageDescription = $derived(
|
|
||||||
dashboard?.subtitle || stateSubtitle || stateMessage,
|
|
||||||
);
|
|
||||||
let refreshTimer: number | undefined;
|
|
||||||
|
|
||||||
$effect(() => {
|
|
||||||
if (!browser) return;
|
|
||||||
|
|
||||||
if (refreshTimer) {
|
|
||||||
window.clearInterval(refreshTimer);
|
|
||||||
refreshTimer = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
const refreshIntervalSeconds =
|
|
||||||
data.dashboard.state === "ready"
|
|
||||||
? data.dashboard.document.metadata.refreshIntervalSeconds
|
|
||||||
: undefined;
|
|
||||||
if (!refreshIntervalSeconds) return;
|
|
||||||
|
|
||||||
refreshTimer = window.setInterval(() => {
|
|
||||||
void invalidateAll();
|
|
||||||
}, refreshIntervalSeconds * 1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
onDestroy(() => {
|
|
||||||
if (refreshTimer) window.clearInterval(refreshTimer);
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<svelte:head>
|
|
||||||
<title>{pageTitle}</title>
|
|
||||||
<meta name="description" content={pageDescription} />
|
|
||||||
</svelte:head>
|
|
||||||
|
|
||||||
{#if dashboard}
|
|
||||||
<DashboardFrame {dashboard} />
|
|
||||||
{:else}
|
|
||||||
<main class="state-shell" data-dashboard-state={data.dashboard.state}>
|
|
||||||
<SystemState
|
|
||||||
title={stateTitle}
|
|
||||||
detail={`${stateSubtitle}: ${stateMessage}`}
|
|
||||||
severity={stateSeverity(data.dashboard.state)}
|
|
||||||
icon={stateIcon(data.dashboard.state)}
|
|
||||||
/>
|
|
||||||
{#if stateErrors.length}
|
|
||||||
<ul aria-label="Validation errors">
|
|
||||||
{#each stateErrors as error}
|
|
||||||
<li>{error}</li>
|
|
||||||
{/each}
|
|
||||||
</ul>
|
|
||||||
{/if}
|
|
||||||
</main>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.state-shell {
|
|
||||||
display: grid;
|
|
||||||
min-height: 100vh;
|
|
||||||
align-content: center;
|
|
||||||
gap: var(--ui-space-3);
|
|
||||||
padding: var(--ui-space-4);
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
display: grid;
|
|
||||||
max-width: 56rem;
|
|
||||||
gap: var(--ui-space-2);
|
|
||||||
margin: 0;
|
|
||||||
border: var(--ui-border);
|
|
||||||
background: rgba(6, 8, 7, 0.82);
|
|
||||||
color: var(--ui-color-muted);
|
|
||||||
font-size: 0.76rem;
|
|
||||||
list-style-position: inside;
|
|
||||||
padding: var(--ui-space-3);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script lang="ts" module>
|
|
||||||
import type { DashboardRuntimeState } from "$lib/server/dashboard";
|
|
||||||
import type { UiSeverity } from "$lib/ui";
|
|
||||||
|
|
||||||
function stateSeverity(state: DashboardRuntimeState["state"]): UiSeverity {
|
|
||||||
if (state === "invalid") return "danger";
|
|
||||||
if (state === "loading") return "loading";
|
|
||||||
return "stale";
|
|
||||||
}
|
|
||||||
|
|
||||||
function stateIcon(state: DashboardRuntimeState["state"]): string {
|
|
||||||
if (state === "invalid") return "mdi:file-alert-outline";
|
|
||||||
if (state === "loading") return "mdi:progress-clock";
|
|
||||||
return "mdi:tray";
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
import { handleAgentDashboardRequest } from "$lib/server/agent-config";
|
|
||||||
import type { RequestHandler } from "./$types";
|
|
||||||
|
|
||||||
export const POST: RequestHandler = ({ request }) => handleAgentDashboardRequest(request);
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
import { render } from "svelte/server";
|
|
||||||
import { describe, expect, test } from "vitest";
|
|
||||||
import { genericDashboardFixture } from "$lib/model/fixtures/generic";
|
|
||||||
import Page from "./+page.svelte";
|
|
||||||
|
|
||||||
describe("home page model renderer", () => {
|
|
||||||
test("renders the active dashboard model from the server load", () => {
|
|
||||||
const { body } = render(Page, {
|
|
||||||
props: {
|
|
||||||
data: {
|
|
||||||
dashboard: {
|
|
||||||
state: "ready",
|
|
||||||
document: genericDashboardFixture,
|
|
||||||
schemaVersion: "dashboard.v1",
|
|
||||||
currentRevisionId: "revision-1234567890",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(body).toContain("Operations Console");
|
|
||||||
expect(body).toContain("Service Uptime");
|
|
||||||
expect(body).toContain("Identity");
|
|
||||||
expect(body).toContain("data-model-id=\"service-uptime\"");
|
|
||||||
expect(body).not.toContain("primary");
|
|
||||||
expect(body).not.toContain("secondary");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("renders invalid model state without crashing", () => {
|
|
||||||
const { body } = render(Page, {
|
|
||||||
props: {
|
|
||||||
data: {
|
|
||||||
dashboard: {
|
|
||||||
state: "invalid",
|
|
||||||
title: "Invalid Dashboard",
|
|
||||||
subtitle: "Validation failed",
|
|
||||||
message: "Dashboard document is invalid.",
|
|
||||||
errors: ["/metadata/title is required"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(body).toContain("Invalid Dashboard");
|
|
||||||
expect(body).toContain("Validation failed");
|
|
||||||
expect(body).toContain("Dashboard document is invalid.");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("renders empty and loading model states without crashing", () => {
|
|
||||||
const empty = render(Page, {
|
|
||||||
props: {
|
|
||||||
data: {
|
|
||||||
dashboard: {
|
|
||||||
state: "empty",
|
|
||||||
title: "No Dashboard Model",
|
|
||||||
subtitle: "No active document",
|
|
||||||
message: "No validated dashboard document is active yet.",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const loading = render(Page, {
|
|
||||||
props: {
|
|
||||||
data: {
|
|
||||||
dashboard: {
|
|
||||||
state: "loading",
|
|
||||||
title: "Loading Dashboard",
|
|
||||||
subtitle: "Fetching active model",
|
|
||||||
message: "Waiting for the active dashboard document.",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(empty.body).toContain("No Dashboard Model");
|
|
||||||
expect(empty.body).toContain("No active document");
|
|
||||||
expect(loading.body).toContain("Loading Dashboard");
|
|
||||||
expect(loading.body).toContain("Fetching active model");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
6
src/svelte-shim.d.ts
vendored
6
src/svelte-shim.d.ts
vendored
|
|
@ -1,6 +0,0 @@
|
||||||
declare module "*.svelte" {
|
|
||||||
const component: any;
|
|
||||||
export default component;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module "*.css" {}
|
|
||||||
3
src/vite-env.d.ts
vendored
Normal file
3
src/vite-env.d.ts
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
declare module "*.css" {}
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
import adapter from "@sveltejs/adapter-node";
|
|
||||||
import { vitePreprocess } from "@sveltejs/vite-plugin-svelte";
|
|
||||||
|
|
||||||
/** @type {import("@sveltejs/kit").Config} */
|
|
||||||
const config = {
|
|
||||||
preprocess: vitePreprocess(),
|
|
||||||
kit: {
|
|
||||||
adapter: adapter(),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default config;
|
|
||||||
|
|
@ -30,9 +30,6 @@
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"build",
|
"build",
|
||||||
"node_modules",
|
"node_modules",
|
||||||
".storybook",
|
".storybook"
|
||||||
".svelte-kit",
|
|
||||||
"src/routes/**",
|
|
||||||
"src/lib/ui/stories/*.svelte"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,16 @@
|
||||||
import { fileURLToPath } from "node:url";
|
import { fileURLToPath } from "node:url";
|
||||||
import tailwindcss from "@tailwindcss/vite";
|
import tailwindcss from "@tailwindcss/vite";
|
||||||
import react from "@vitejs/plugin-react";
|
import react from "@vitejs/plugin-react";
|
||||||
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
||||||
import { defineConfig, configDefaults } from "vitest/config";
|
import { defineConfig, configDefaults } from "vitest/config";
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [react(), tailwindcss(), svelte()],
|
plugins: [react(), tailwindcss()],
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
$lib: fileURLToPath(new URL("./src/lib", import.meta.url)),
|
$lib: fileURLToPath(new URL("./src/lib", import.meta.url)),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
test: {
|
test: {
|
||||||
exclude: [...configDefaults.exclude, "tests/e2e/**", "src/routes/**"],
|
exclude: [...configDefaults.exclude, "tests/e2e/**"],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue