{"_id":"@amsterdamdatalabs/enact-design-system","_rev":"9-7c9a0897546ff9832dc3c2ee274cf601","name":"@amsterdamdatalabs/enact-design-system","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.1.1","_id":"@amsterdamdatalabs/enact-design-system@0.1.1","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"dist":{"shasum":"0b6695d90a92ccedf62d2bb3933ed2d3b01ecc7b","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.1.1.tgz","fileCount":41,"integrity":"sha512-6t1eG8zG2iC/uw0Vyxd/atSBWoVgAUQmxoOgapRTxn6xFawR9Hcviwok3eC6RcdZ3pAzoFBTkTt8JLREfRqzxg==","signatures":[{"sig":"MEUCIQC9jtX2YzomIXYsMPq408lGJakOogszIsTnBkCHXG3NzwIgeThPnYVEpt/DtPYjqSldMa0k3IfIm6yxxJ1W3/mX3vU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64493},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/design-system.css","./tokens.css":"./dist/tokens.css"},"gitHead":"7f8e2198ea041e6913b0a70a7f4b9aa90953bf32","scripts":{"dev":"vite","fix":"biome check --write src docs scripts","docs":"vite --config docs/vite.config.ts","lint":"biome check src docs scripts","test":"bun test","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","check":"bun run typecheck && bun run lint && bun run test","format":"biome format --write src docs scripts","typecheck":"tsc --noEmit","test:visual":"playwright test","prepublishOnly":"bun run build","test:visual:update":"playwright test --update-snapshots"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","react":"^19.1.0","axe-core":"^4.12.1","happy-dom":"^20.10.6","react-dom":"^19.1.0","ultracite":"^7.8.3","@types/bun":"^1.3.14","typescript":"^5.8.3","@types/node":"^22.10.0","@types/react":"^19.1.6","@biomejs/biome":"^2.5.0","@playwright/test":"^1.61.0","@types/react-dom":"^19.1.5","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.5.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1","@happy-dom/global-registrator":"^20.10.6"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/enact-design-system_0.1.1_1782088237519_0.06653335739173194","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.1.2","_id":"@amsterdamdatalabs/enact-design-system@0.1.2","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"dist":{"shasum":"63f0fe9159c58da4d1c0643befb14723194dcbcb","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.1.2.tgz","fileCount":41,"integrity":"sha512-DBgP143GB4MSdD3L8i2VLQxwOwqLiDkXhqOwLo8G+NbkdJADuiVBNhlfDoaeBKmO3TS/o9/OsooEB2cGHAZXbw==","signatures":[{"sig":"MEYCIQCUHkX9pt/Ivfaq42uUIPfrPf1h5Q6fe7fdtjJf5MHyLgIhAOrE6RFGIFB6IxjUw2W8si0byfbCXK6vSKLpnQA/b/3O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64493},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/design-system.css","./tokens.css":"./dist/tokens.css"},"gitHead":"ecebf41c28fa7d1b49324014586ca03266be6671","scripts":{"dev":"vite","fix":"biome check --write src docs scripts","docs":"vite --config docs/vite.config.ts","lint":"biome check src docs scripts","test":"bun test","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","check":"bun run typecheck && bun run lint && bun run test","format":"biome format --write src docs scripts","typecheck":"tsc --noEmit","test:visual":"playwright test","prepublishOnly":"bun run build","test:visual:update":"playwright test --update-snapshots"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","react":"^19.1.0","axe-core":"^4.12.1","happy-dom":"^20.10.6","react-dom":"^19.1.0","ultracite":"^7.8.3","@types/bun":"^1.3.14","typescript":"^5.8.3","@types/node":"^22.10.0","@types/react":"^19.1.6","@biomejs/biome":"^2.5.0","@playwright/test":"^1.61.0","@types/react-dom":"^19.1.5","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.5.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1","@happy-dom/global-registrator":"^20.10.6"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/enact-design-system_0.1.2_1782088648847_0.20556720527400296","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.1.7","_id":"@amsterdamdatalabs/enact-design-system@0.1.7","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"dist":{"shasum":"76d972ea0adc1bc3f7009e47a6a5d2af05131143","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.1.7.tgz","fileCount":58,"integrity":"sha512-GypHm1U6K/QbwXYKNCH2c10Y2MkvPirVnkiNcBhuKY6gqePtOUDLopYExBHlMtkwvxU3LmEQa/+bJsnKt8cBiQ==","signatures":[{"sig":"MEUCIGRSyf8KmpSWFzMJn3LwLLlBN/fGs0SokS1d+xJ7ztb5AiEAqmUWP2uoSnOemp3m0Rs6EZfxovbR7vwKuWLK/FzEKzE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92277},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/design-system.css","./tokens.css":"./dist/tokens.css"},"gitHead":"3999dd67b366686fe01e34757626169ce58c859d","scripts":{"dev":"vite","fix":"biome check --write src docs scripts","docs":"vite --config docs/vite.config.ts","lint":"biome check src docs scripts","test":"bun test","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","check":"bun run typecheck && bun run lint && bun run test","format":"biome format --write src docs scripts","typecheck":"tsc --noEmit","test:visual":"playwright test","prepublishOnly":"bun run build","test:visual:update":"playwright test --update-snapshots"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","react":"^19.1.0","axe-core":"^4.12.1","happy-dom":"^20.10.6","react-dom":"^19.1.0","ultracite":"^7.8.3","@types/bun":"^1.3.14","typescript":"^5.8.3","@types/node":"^22.10.0","@types/react":"^19.1.6","@biomejs/biome":"^2.5.0","@playwright/test":"^1.61.0","@types/react-dom":"^19.1.5","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.5.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1","@happy-dom/global-registrator":"^20.10.6"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/enact-design-system_0.1.7_1782094777340_0.8906565118476975","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.1.10","_id":"@amsterdamdatalabs/enact-design-system@0.1.10","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"dist":{"shasum":"39d9b778ae054ff2643b0e2c5eb9ab17038c87fd","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.1.10.tgz","fileCount":61,"integrity":"sha512-+WO+i4YkxCOHqR7+zIbDUoAUgjYsVpgNskJLBPgJ4LE/B9lP+nM+sNFrvgN/FpTnkSS3CFcI+0Du0SpU0sthZw==","signatures":[{"sig":"MEUCIQDKb+YJ4026jdOxdaTkRWREWMDpJeo9+nFYWXc29ArfEAIgSdSkOav4LILFiCazoJzNfxA2g0ZYyqfHTcdsWeGdzA0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105424},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/design-system.css","./tokens.css":"./dist/tokens.css"},"gitHead":"c3620ef73a0f1c0c7bfcba7b1d95d757f832b907","scripts":{"dev":"vite","fix":"biome check --write src docs scripts","docs":"vite --config docs/vite.config.ts","lint":"biome check src docs scripts","test":"bun test","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","check":"bun run typecheck && bun run lint && bun run test","format":"biome format --write src docs scripts","typecheck":"tsc --noEmit","test:visual":"playwright test","prepublishOnly":"bun run build","test:visual:update":"playwright test --update-snapshots"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","react":"^19.1.0","axe-core":"^4.12.1","happy-dom":"^20.10.6","react-dom":"^19.1.0","ultracite":"^7.8.3","@types/bun":"^1.3.14","typescript":"^5.8.3","@types/node":"^22.10.0","@types/react":"^19.1.6","@biomejs/biome":"^2.5.0","@playwright/test":"^1.61.0","@types/react-dom":"^19.1.5","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.5.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1","@happy-dom/global-registrator":"^20.10.6"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/enact-design-system_0.1.10_1782123463727_0.9109452160390894","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.1.12","_id":"@amsterdamdatalabs/enact-design-system@0.1.12","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"dist":{"shasum":"b7490f516e1396c7f6e1f39f7b063c492b1db2b9","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.1.12.tgz","fileCount":81,"integrity":"sha512-u4r3BLB3LRXXKK29mlMtbZwLwkoL1GtTPjUwWWzmYZhV507ZroNaiEaJKe1MNst6eO1DUuHpROT8ocRGvHSrWA==","signatures":[{"sig":"MEUCIQCCKSekSanJvqHLucWjV15AzNHYKgTR5wcCUw2alDMrOQIgTrCBWABpEAMGtRUrMGX4OdP6W3gh5AhyRkbgPUNZJDI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152695},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/design-system.css","./tokens.css":"./dist/tokens.css"},"gitHead":"b6daf08ec1148cfc453238ea772ad9ba4d6e5211","scripts":{"dev":"vite","fix":"biome check --write src docs scripts","docs":"vite --config docs/vite.config.ts","lint":"biome check src docs scripts","test":"bun test","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","check":"bun run typecheck && bun run lint && bun run test:coverage","format":"biome format --write src docs scripts","typecheck":"tsc --noEmit","test:visual":"playwright test","test:coverage":"bun test --coverage","prepublishOnly":"bun run build","test:visual:update":"playwright test --update-snapshots"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","react":"^19.1.0","axe-core":"^4.12.1","happy-dom":"^20.10.6","react-dom":"^19.1.0","ultracite":"^7.8.3","@types/bun":"^1.3.14","typescript":"^5.8.3","@types/node":"^22.10.0","@types/react":"^19.1.6","@biomejs/biome":"^2.5.0","@playwright/test":"^1.61.0","@types/react-dom":"^19.1.5","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.5.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1","@happy-dom/global-registrator":"^20.10.6"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/enact-design-system_0.1.12_1782139842204_0.4871687524565729","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.1.19","_id":"@amsterdamdatalabs/enact-design-system@0.1.19","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"dist":{"shasum":"41fe147934653f593ba64af11ae1b3f8f99d6f3d","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.1.19.tgz","fileCount":980,"integrity":"sha512-0dC5Fk50xoPclgRfUWU/1WTrBJUVVwCo7Og5xqt6Zwp5hoWcJf0QctiXE9FSfU6Gyz5THyBJeFTJuF+Q0+sFiQ==","signatures":[{"sig":"MEUCIQCIZF1pmrjddEB5d0b1PTaA9QZ/LGX13kbjL9vlUT3rEAIgU7U96PVQ4Tt5VUgsHF2ummZsMxGdM0BVr/ozSJSATHs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4485086},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/enact-design-system.css","./tokens.css":"./dist/tokens.css"},"gitHead":"6af3b4cd46abad240eead7f4ad0f974ae933dce5","scripts":{"dev":"vite","fix":"biome check --write src scripts studio","lint":"biome check src scripts studio","test":"bun test","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","check":"bun run typecheck && bun run themes:verify && bun run check:governance && bun run check:studio-css && bun run lint && bun test","format":"biome format --write src scripts studio","studio":"node scripts/studio-dev.mjs","typecheck":"tsc --noEmit","studio:5182":"node scripts/studio-dev.mjs","test:parity":"playwright test --config test/playwright-red-green-tests/playwright.config.ts","test:visual":"playwright test","themes:sync":"node scripts/sync-theme-presets.mjs","test:coverage":"bun test --coverage","themes:parity":"bun scripts/verify-theme-parity.mjs","themes:verify":"bun scripts/verify-theme-token-completeness.mjs && bun scripts/verify-theme-reference-presets.mjs && bun scripts/verify-enact-owned-theming.mjs && bun run themes:donor-compare","audit:showcase":"bun scripts/audit-showcase-drift.mjs","prepublishOnly":"bun run build","themes:generate":"node scripts/generate-theme-css.mjs","check:governance":"bash scripts/check-showcase-governance.sh && bash scripts/check-showcase-composability.sh","check:studio-css":"bash scripts/check-studio-css-boundary.sh","test:parity:update":"playwright test --config test/playwright-red-green-tests/playwright.config.ts --update-snapshots=all","test:visual:update":"playwright test --update-snapshots","themes:live-compare":"bun scripts/compare-live-theme.mjs","themes:donor-compare":"bun scripts/compare-donor-themes.mjs","test:parity:reference":"bun test/playwright-red-green-tests/scripts/run-reference-diff.mjs","check:typography-governance":"bash scripts/check-typography-governance.sh"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.3","dependencies":{"clsx":"^2.0.0","copy-to-clipboard":"^3.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"^14.0.0","vite":"^6.3.5","pngjs":"^7.0.0","react":"^19.1.0","axe-core":"^4.12.1","recharts":"^3.9.2","happy-dom":"^20.10.6","react-dom":"^19.1.0","ultracite":"^7.8.3","@types/bun":"^1.3.14","pixelmatch":"^5.3.0","typescript":"^5.8.3","@types/node":"^22.10.0","@types/react":"^19.1.6","@dnd-kit/core":"^6.3.1","@biomejs/biome":"^2.5.0","@playwright/test":"^1.61.0","@types/react-dom":"^19.1.5","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-tabs":"^1.0.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.5.2","@tanstack/react-table":"^8.0.0","@testing-library/react":"^16.3.2","@radix-ui/react-popover":"^1.0.0","@radix-ui/react-tooltip":"^1.0.0","@radix-ui/react-separator":"^1.0.0","@testing-library/jest-dom":"^6.9.1","@happy-dom/global-registrator":"^20.10.6"},"peerDependencies":{"next":">=14.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-tabs":"^1.0.0","@tanstack/react-table":"^8.0.0","@radix-ui/react-popover":"^1.0.0","@radix-ui/react-tooltip":"^1.0.0","@radix-ui/react-separator":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/enact-design-system_0.1.19_1784020179429_0.2841615966374491","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.1.24","_id":"@amsterdamdatalabs/enact-design-system@0.1.24","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"dist":{"shasum":"6dd586e6b2fe3742d65492245f54dbff6309d603","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.1.24.tgz","fileCount":979,"integrity":"sha512-6wZb4pzj1yw4lgUvnYzZHj6RY8YOlrmG8z2GSKnITcQE4/hhNiTivM3YXPucmf2KxtnO8F4b8mbUhwfjw6m2LQ==","signatures":[{"sig":"MEUCIEG0JmFXBkn20RvIyLbVvI6kyTKFvc2C9VhMbGiPQeIUAiEAmlBtU3spc16Z2vjmTvObISYQ+lx978yTk0U14SwNI9o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4541459},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/enact-design-system.css","./tokens.css":"./dist/tokens.css"},"gitHead":"1731e859d0b6aeff6586762ab48310a759a7203b","scripts":{"dev":"vite","fix":"biome check --write src scripts studio","lint":"biome check src scripts studio","test":"bun test","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","check":"bun run typecheck && bun run themes:verify && bun run check:governance && bun run check:studio-css && bun run lint && bun run test:coverage","format":"biome format --write src scripts studio","studio":"node scripts/studio-dev.mjs","typecheck":"tsc --noEmit","studio:5182":"node scripts/studio-dev.mjs","test:parity":"playwright test --config test/playwright-red-green-tests/playwright.config.ts","test:visual":"playwright test","themes:sync":"node scripts/sync-theme-presets.mjs","test:coverage":"bun test --coverage","themes:verify":"bun scripts/verify-theme-token-completeness.mjs && bun scripts/verify-theme-reference-presets.mjs && bun scripts/verify-theme-parity.mjs && bun scripts/verify-generated-theme-css.mjs && bun scripts/verify-enact-owned-theming.mjs","audit:showcase":"bun scripts/audit-showcase-drift.mjs","prepublishOnly":"bun run build","themes:generate":"node scripts/generate-theme-css.mjs","check:governance":"bash scripts/check-showcase-governance.sh && bash scripts/check-showcase-composability.sh && bash scripts/check-data-slot-governance.sh && bun run check:interaction-states","check:studio-css":"bash scripts/check-studio-css-boundary.sh","design-gate:loop":"bash scripts/design-gate-loop-tick.sh --loop","check:design-gate":"bun run design-gate:batch-verify && bun run test:parity -- test/playwright-red-green-tests/specs/studio-preview-chrome.spec.ts && bun run test:interaction-grammar","design-gate:triage":"bun test/playwright-red-green-tests/scripts/design-gate-failure-triage.ts","test:parity:update":"playwright test --config test/playwright-red-green-tests/playwright.config.ts --update-snapshots=all","test:parity:visual":"PARITY_INCLUDE_VISUAL=1 playwright test --config test/playwright-red-green-tests/playwright.config.ts test/playwright-red-green-tests/specs/full-theme-visual-matrix.spec.ts","test:visual:update":"playwright test --update-snapshots","design-gate:loop-tick":"bash scripts/design-gate-loop-tick.sh","design-gate:drift-gifs":"bun test/playwright-red-green-tests/scripts/design-gate-drift-gifs.ts","check:interaction-states":"bun scripts/interaction-state-consistency.mjs","design-gate:batch-verify":"bun test/playwright-red-green-tests/scripts/design-gate-batch-verify.ts","test:interaction-grammar":"playwright test --config test/playwright-red-green-tests/playwright.config.ts test/playwright-red-green-tests/specs/five-theme-interaction-grammar.spec.ts","design-gate:coverage-audit":"bun test/playwright-red-green-tests/scripts/design-gate-coverage-audit.ts","check:typography-governance":"bash scripts/check-typography-governance.sh","design-gate:capture-baselines":"bun test/playwright-red-green-tests/scripts/capture-computed-style-baselines.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.3","dependencies":{"clsx":"^2.0.0","copy-to-clipboard":"^3.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"^14.0.0","vite":"^6.3.5","pngjs":"^7.0.0","react":"^19.1.0","gifenc":"^1.0.3","axe-core":"^4.12.1","recharts":"^3.9.2","happy-dom":"^20.10.6","react-dom":"^19.1.0","ultracite":"^7.8.3","@types/bun":"^1.3.14","pixelmatch":"^5.3.0","typescript":"^5.8.3","@types/node":"^22.10.0","@types/pngjs":"^6.0.5","@types/react":"^19.1.6","@dnd-kit/core":"^6.3.1","@biomejs/biome":"^2.5.0","@playwright/test":"^1.61.0","@types/react-dom":"^19.1.5","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-tabs":"^1.0.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.5.2","@tanstack/react-table":"^8.0.0","@testing-library/react":"^16.3.2","@radix-ui/react-popover":"^1.0.0","@radix-ui/react-tooltip":"^1.0.0","@radix-ui/react-separator":"^1.0.0","@testing-library/jest-dom":"^6.9.1","@happy-dom/global-registrator":"^20.10.6"},"peerDependencies":{"next":">=14.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-tabs":"^1.0.0","@tanstack/react-table":"^8.0.0","@radix-ui/react-popover":"^1.0.0","@radix-ui/react-tooltip":"^1.0.0","@radix-ui/react-separator":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/enact-design-system_0.1.24_1784497009535_0.2596848459273462","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.1.28","_id":"@amsterdamdatalabs/enact-design-system@0.1.28","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"dist":{"shasum":"65a9070b4e8e3c90b0135cccae529ca7a4ed5970","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.1.28.tgz","fileCount":980,"integrity":"sha512-RsmV12AAXTDt7RR1kHpf24PsOBF55YxUV6Amf5GlxXydSW5dG5Jh+Yjeo0dxhFQ6TU0Jr45two5ggImZ+R+MxA==","signatures":[{"sig":"MEQCIFRVkD2xIIZhMiKfda82KW7OJTwvTt12gcU/9/JLspNtAiAn+08A7AAoaeHtznQDTif2FMrIHgeykxrDpA7b8jZnNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4564999},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/enact-design-system.css","./tokens.css":"./dist/tokens.css"},"gitHead":"63fd2dc1c41cc232d3b8f5e793fee073637f7a05","scripts":{"dev":"vite","fix":"biome check --write src scripts studio","lint":"biome check src scripts studio","test":"bun test","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","check":"bun run typecheck && bun run themes:verify && bun run check:governance && bun run check:studio-css && bun run lint && bun run test:coverage","format":"biome format --write src scripts studio","studio":"node scripts/studio-dev.mjs","typecheck":"tsc --noEmit","studio:5182":"node scripts/studio-dev.mjs","test:parity":"playwright test --config test/playwright-red-green-tests/playwright.config.ts","test:visual":"playwright test","themes:sync":"node scripts/sync-theme-presets.mjs","test:coverage":"bun test --coverage","themes:verify":"bun scripts/verify-theme-token-completeness.mjs && bun scripts/verify-theme-reference-presets.mjs && bun scripts/verify-theme-parity.mjs && bun scripts/verify-generated-theme-css.mjs && bun scripts/verify-enact-owned-theming.mjs","audit:showcase":"bun scripts/audit-showcase-drift.mjs","prepublishOnly":"bun run build","themes:generate":"node scripts/generate-theme-css.mjs","check:governance":"bash scripts/check-showcase-governance.sh && bash scripts/check-showcase-composability.sh && bash scripts/check-data-slot-governance.sh && bun run check:interaction-states","check:studio-css":"bash scripts/check-studio-css-boundary.sh","design-gate:loop":"bash scripts/design-gate-loop-tick.sh --loop","check:design-gate":"bun run design-gate:batch-verify && bun run test:parity -- test/playwright-red-green-tests/specs/studio-preview-chrome.spec.ts && bun run test:interaction-grammar","design-gate:triage":"bun test/playwright-red-green-tests/scripts/design-gate-failure-triage.ts","test:parity:update":"playwright test --config test/playwright-red-green-tests/playwright.config.ts --update-snapshots=all","test:parity:visual":"PARITY_INCLUDE_VISUAL=1 playwright test --config test/playwright-red-green-tests/playwright.config.ts test/playwright-red-green-tests/specs/full-theme-visual-matrix.spec.ts","test:visual:update":"playwright test --update-snapshots","design-gate:loop-tick":"bash scripts/design-gate-loop-tick.sh","design-gate:drift-gifs":"bun test/playwright-red-green-tests/scripts/design-gate-drift-gifs.ts","check:interaction-states":"bun scripts/interaction-state-consistency.mjs","design-gate:batch-verify":"bun test/playwright-red-green-tests/scripts/design-gate-batch-verify.ts","test:interaction-grammar":"playwright test --config test/playwright-red-green-tests/playwright.config.ts test/playwright-red-green-tests/specs/five-theme-interaction-grammar.spec.ts","design-gate:coverage-audit":"bun test/playwright-red-green-tests/scripts/design-gate-coverage-audit.ts","check:typography-governance":"bash scripts/check-typography-governance.sh","design-gate:capture-baselines":"bun test/playwright-red-green-tests/scripts/capture-computed-style-baselines.ts"},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"_npmVersion":"10.9.8","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.3","dependencies":{"clsx":"^2.0.0","copy-to-clipboard":"^3.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"^14.0.0","vite":"^6.3.5","pngjs":"^7.0.0","react":"^19.1.0","gifenc":"^1.0.3","axe-core":"^4.12.1","recharts":"^3.9.2","happy-dom":"^20.10.6","react-dom":"^19.1.0","ultracite":"^7.8.3","@types/bun":"^1.3.14","pixelmatch":"^5.3.0","typescript":"^5.8.3","@types/node":"^22.10.0","@types/pngjs":"^6.0.5","@types/react":"^19.1.6","@dnd-kit/core":"^6.3.1","@biomejs/biome":"^2.5.0","@playwright/test":"^1.61.0","@types/react-dom":"^19.1.5","@dnd-kit/sortable":"^10.0.0","@dnd-kit/modifiers":"^8.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-tabs":"^1.0.0","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^4.5.2","@tanstack/react-table":"^8.0.0","@testing-library/react":"^16.3.2","@radix-ui/react-popover":"^1.0.0","@radix-ui/react-tooltip":"^1.0.0","@radix-ui/react-separator":"^1.0.0","@testing-library/jest-dom":"^6.9.1","@happy-dom/global-registrator":"^20.10.6"},"peerDependencies":{"next":">=14.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-tabs":"^1.0.0","@tanstack/react-table":"^8.0.0","@radix-ui/react-popover":"^1.0.0","@radix-ui/react-tooltip":"^1.0.0","@radix-ui/react-separator":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/enact-design-system_0.1.28_1784595226606_0.08233131897641122","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@amsterdamdatalabs/enact-design-system","version":"0.2.0","description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","type":"module","publishConfig":{"access":"public"},"sideEffects":["*.css"],"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./tokens.css":"./dist/tokens.css","./styles.css":"./dist/enact-design-system.css"},"scripts":{"dev":"node scripts/studio-dev.mjs","build":"vite build && tsc -p tsconfig.build.json && bun scripts/build-tokens.mjs","themes:verify":"bun scripts/verify-theme-token-completeness.mjs && bun scripts/verify-theme-reference-presets.mjs && bun scripts/verify-theme-parity.mjs && bun scripts/verify-generated-theme-css.mjs && bun scripts/verify-enact-owned-theming.mjs","themes:generate":"node scripts/generate-theme-css.mjs","themes:sync":"node scripts/sync-theme-presets.mjs","prepublishOnly":"bun run build","typecheck":"tsc --noEmit","lint":"biome check src scripts studio","format":"biome format --write src scripts studio","fix":"biome check --write src scripts studio","check":"bun run typecheck && bun run themes:verify && bun run check:governance && bun run check:studio-css && bun run lint && bun run test:coverage","check:design-gate":"bun run design-gate:batch-verify && bun run test:parity -- test/playwright-red-green-tests/specs/studio-preview-chrome.spec.ts && bun run test:interaction-grammar","check:governance":"bash scripts/check-showcase-governance.sh && bash scripts/check-showcase-composability.sh && bash scripts/check-data-slot-governance.sh && bun run check:interaction-states","check:interaction-states":"bun scripts/interaction-state-consistency.mjs","check:typography-governance":"bash scripts/check-typography-governance.sh","audit:showcase":"bun scripts/audit-showcase-drift.mjs","check:studio-css":"bash scripts/check-studio-css-boundary.sh","test":"bun test","test:coverage":"bun test --coverage","test:visual":"playwright test","test:visual:update":"playwright test --update-snapshots","test:parity":"playwright test --config test/playwright-red-green-tests/playwright.config.ts","test:interaction-grammar":"playwright test --config test/playwright-red-green-tests/playwright.config.ts test/playwright-red-green-tests/specs/five-theme-interaction-grammar.spec.ts","test:parity:visual":"PARITY_INCLUDE_VISUAL=1 playwright test --config test/playwright-red-green-tests/playwright.config.ts test/playwright-red-green-tests/specs/full-theme-visual-matrix.spec.ts","test:parity:update":"playwright test --config test/playwright-red-green-tests/playwright.config.ts --update-snapshots=all","design-gate:capture-baselines":"bun test/playwright-red-green-tests/scripts/capture-computed-style-baselines.ts","design-gate:batch-verify":"bun test/playwright-red-green-tests/scripts/design-gate-batch-verify.ts","design-gate:loop-tick":"bash scripts/design-gate-loop-tick.sh","design-gate:loop":"bash scripts/design-gate-loop-tick.sh --loop","design-gate:triage":"bun test/playwright-red-green-tests/scripts/design-gate-failure-triage.ts","design-gate:coverage-audit":"bun test/playwright-red-green-tests/scripts/design-gate-coverage-audit.ts","design-gate:drift-gifs":"bun test/playwright-red-green-tests/scripts/design-gate-drift-gifs.ts","studio":"node scripts/studio-dev.mjs","studio:5180":"node scripts/studio-dev.mjs"},"peerDependencies":{"@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-popover":"^1.0.0","@radix-ui/react-separator":"^1.0.0","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-tabs":"^1.0.0","@radix-ui/react-tooltip":"^1.0.0","@tanstack/react-table":"^8.0.0","next":">=14.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"devDependencies":{"@biomejs/biome":"^2.5.0","@dnd-kit/core":"^6.3.1","@dnd-kit/modifiers":"^8.0.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@happy-dom/global-registrator":"^20.10.6","@playwright/test":"^1.61.0","@radix-ui/react-popover":"^1.0.0","@radix-ui/react-separator":"^1.0.0","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-tabs":"^1.0.0","@radix-ui/react-tooltip":"^1.0.0","@tanstack/react-table":"^8.0.0","@testing-library/dom":"^10.4.1","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@types/bun":"^1.3.14","@types/node":"^22.10.0","@types/pngjs":"^6.0.5","@types/react":"^19.1.6","@types/react-dom":"^19.1.5","@vitejs/plugin-react":"^4.5.2","axe-core":"^4.12.1","gifenc":"^1.0.3","happy-dom":"^20.10.6","next":"^14.0.0","pixelmatch":"^5.3.0","pngjs":"^7.0.0","react":"^19.1.0","react-dom":"^19.1.0","recharts":"^3.9.2","typescript":"^5.8.3","ultracite":"^7.8.3","vite":"^6.3.5"},"dependencies":{"clsx":"^2.0.0","copy-to-clipboard":"^3.3.3"},"_id":"@amsterdamdatalabs/enact-design-system@0.2.0","gitHead":"983d61ec0049166c31f47d0bba582aa4767bd9ee","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-OUVd0lMibHB2Y4SICt5TiOpT+3kxhZWR1MepaAx/uQOcZPBhqCNf8j38XrjhbT76HxIdeOHlKunHQJwB3I43kw==","shasum":"57ee19d8b6ec24e825c97bbc3a3b48c866d68b7c","tarball":"https://registry.npmjs.org/@amsterdamdatalabs/enact-design-system/-/enact-design-system-0.2.0.tgz","fileCount":973,"unpackedSize":4303148,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCZbTEO5bcjevwHD4vC1MRzglVkRh74N65sLVyJVodL7AIgIta9hYJLYRq9r9bPB+3S6TA918hOnO6g2DEJgrb7oL0="}]},"_npmUser":{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"},"directories":{},"maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/enact-design-system_0.2.0_1785028008030_0.9830712827117327"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-22T00:30:37.385Z","modified":"2026-07-26T01:06:48.451Z","0.1.1":"2026-06-22T00:30:37.690Z","0.1.2":"2026-06-22T00:37:29.000Z","0.1.7":"2026-06-22T02:19:37.477Z","0.1.10":"2026-06-22T10:17:43.850Z","0.1.12":"2026-06-22T14:50:42.345Z","0.1.19":"2026-07-14T09:09:39.593Z","0.1.24":"2026-07-19T21:36:49.737Z","0.1.28":"2026-07-21T00:53:46.787Z","0.2.0":"2026-07-26T01:06:48.293Z"},"description":"Enact design system — authored React + CSS-Modules components and 3-tier design tokens. Single source of truth; no local CSS/Tailwind overrides.","maintainers":[{"name":"tarun.rana","email":"tarun.rana@amsterdamdatalabs.com"}],"readme":"# @amsterdamdatalabs/enact-design-system\n\nThe single source of truth for Enact product UI: React components + a 3-tier\ndesign-token system. Change a token or a component once, and every product that\nconsumes the package updates everywhere. **Product code uses only the public\ncomponents and semantic tokens — never raw colors, pixels, fonts, or component\ninternals.**\n\nPorted from the proven Amsterdam Data Labs (ADL) system in `net-revenue-demo`.\n\n## Stack\n\n- **Bun** for install/scripts, **React 19** + **TypeScript**, styled with **CSS Modules**.\n- Tokens are plain **CSS custom properties** (primitive `--adl-*` → semantic → dark mode).\n- Built with **Vite** (library mode, ESM) + `tsc` for declarations.\n\n## Install & develop\n\n```bash\nbun install\nbun run dev                 # theme workbench + component catalog at localhost:5180/?p=components\nbun run typecheck           # tsc --noEmit (also enforces prop/variant contracts)\nbun run lint                # Biome + Ultracite + GritQL adherence (see below)\nbun run format              # Biome formatter (write)\nbun run test                # bun test — render/behavior + contract + styling guards\nbun run test:visual         # Playwright visual regression (light + dark)\nbun run test:visual:update  # refresh visual baselines after an intended change\nbun run check               # typecheck + lint + test (the pre-merge gate)\nbun run build               # dist/: ESM + .d.ts + design-system.css + tokens.css\n```\n\n## Local development against a consumer app\n\n`dev-install-and-run.sh` builds the library and installs the **real publishable\ntarball** (`bun pm pack`) into a consumer app — so it resolves exactly like a\nregistry install (built `dist/` + the `exports` map), not a source symlink. This\nmirrors what apps get from npm, for rapid local iteration.\n\n```bash\nbash dev-install-and-run.sh --target ../net-revenue-demo   # build → test → pack → install into the app\nbash dev-install-and-run.sh pack                           # just build + produce the tarball\nbash dev-install-and-run.sh link                           # global `bun link`; then `bun link <pkg>` in the app\nbash dev-install-and-run.sh doctor                         # list exactly what the published tarball contains\nbash dev-install-and-run.sh --dry-run --target ../app      # print the plan without running it\n```\n\nUse `--skip-build` to re-pack without reinstalling deps, and `--docs` to launch\nthe showcase afterwards.\n\n## Usage in a product app\n\nImport styles first, then components — all from the single public entry point:\n\n```tsx\nimport \"@amsterdamdatalabs/enact-design-system/tokens.css\";   // design tokens (incl. dark mode)\nimport \"@amsterdamdatalabs/enact-design-system/styles.css\";   // component styles\nimport { Button, Card, Stat } from \"@amsterdamdatalabs/enact-design-system\";\n\nexport function Example() {\n  return (\n    <Card variant=\"raised\">\n      <Stat label=\"Net revenue\" value=\"$1.24M\" delta=\"12.4%\" deltaDirection=\"up\" />\n      <Button variant=\"primary\">View report</Button>\n    </Card>\n  );\n}\n```\n\nDark mode: set `data-theme=\"dark\"` on `<html>` (or any subtree root).\n\n## ThemeProvider and useTheme\n\nWrap your application root with `ThemeProvider` to enable theme switching.\n`useTheme` surfaces the current theme and a setter anywhere in the tree.\n\n```tsx\nimport {\n  ThemeProvider,\n  useTheme,\n} from \"@amsterdamdatalabs/enact-design-system\";\n\n// 1. Wrap the app root\nexport function App() {\n  return (\n    <ThemeProvider defaultTheme=\"system\">\n      <Shell />\n    </ThemeProvider>\n  );\n}\n\n// 2. Read and change the theme from any descendant\nfunction ThemeToggle() {\n  const { theme, resolvedTheme, setTheme } = useTheme();\n\n  return (\n    <button\n      type=\"button\"\n      onClick={() => setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\")}\n    >\n      Switch to {resolvedTheme === \"dark\" ? \"light\" : \"dark\"} mode\n    </button>\n  );\n}\n```\n\n`ThemeProvider` persists the user's choice to `localStorage` under the key\n`\"enact-theme\"` (configurable via the `storageKey` prop).  The resolved theme\n(`\"light\"` or `\"dark\"`) is derived from the user's explicit choice or from\n`window.matchMedia(\"(prefers-color-scheme: dark)\")` when the theme is `\"system\"`.\n\n### Preventing theme flash on first paint\n\nWithout extra work the page renders in the default (light) state for one frame\nwhile React hydrates — producing a visible flash when the user prefers dark.\nInline `themeInitScript` in `<head>` **before** your app bundle to apply the\ncorrect `data-theme` attribute at browser-parse time, before any paint:\n\n```tsx\nimport {\n  themeInitScript,\n} from \"@amsterdamdatalabs/enact-design-system\";\n\n// In your HTML template, _document.tsx, or root layout:\nexport function Document() {\n  return (\n    <html lang=\"en\">\n      <head>\n        {/* Must come before the app bundle — runs at parse time, before paint. */}\n        <script dangerouslySetInnerHTML={{ __html: themeInitScript }} />\n        {/* ...other head tags, then the app bundle */}\n      </head>\n      <body>...</body>\n    </html>\n  );\n}\n```\n\nIf your app uses a non-default storage key, use `getThemeInitScript` to\nproduce a matching script:\n\n```tsx\nimport {\n  getThemeInitScript,\n} from \"@amsterdamdatalabs/enact-design-system\";\n\nconst script = getThemeInitScript(\"my-app-theme\");\n\n// Pass the same key to ThemeProvider:\n// <ThemeProvider storageKey=\"my-app-theme\">...</ThemeProvider>\n```\n\nThe script is a self-contained IIFE:\n- reads `localStorage[storageKey]`\n- `\"dark\"` → sets `data-theme=\"dark\"` on `<html>`\n- `\"light\"` → ensures `data-theme` is absent\n- `\"system\"` or missing → falls back to `window.matchMedia(\"(prefers-color-scheme: dark)\")`\n- wrapped in `try/catch` so storage or matchMedia failures are inert\n\nKeying is identical to `ThemeProvider` so there is no conflict on hydration.\n\n## Layout primitives\n\nFive composable, token-based layout components handle spacing, alignment, and\ngrid structure.  All accept standard HTML `div` attributes in addition to the\nprops below.\n\n```tsx\nimport {\n  Box,\n  Container,\n  Grid,\n  Inline,\n  Stack,\n} from \"@amsterdamdatalabs/enact-design-system\";\n\n// Box — single block with optional padding, surface tint, and radius\n<Box padding=\"4\" surface=\"raised\" radius=\"md\">\n  content\n</Box>\n\n// Stack — vertical flex container\n<Stack gap=\"4\" align=\"center\">\n  <div>Item A</div>\n  <div>Item B</div>\n</Stack>\n\n// Inline — horizontal flex container\n<Inline gap=\"2\">\n  <Button variant=\"primary\">Save</Button>\n  <Button variant=\"ghost\">Cancel</Button>\n</Inline>\n\n// Grid — CSS grid with a named column count\n<Grid columns={3} gap=\"6\">\n  <Card>One</Card>\n  <Card>Two</Card>\n  <Card>Three</Card>\n</Grid>\n\n// Container — centred, max-width wrapper\n<Container width=\"narrow\">\n  <Stack gap=\"4\">...</Stack>\n</Container>\n```\n\n## Typography\n\n`Heading` and `Text` map directly to the system's type scale.\n\n```tsx\nimport {\n  Heading,\n  Text,\n} from \"@amsterdamdatalabs/enact-design-system\";\n\n// Heading — semantic element + visual size, decoupled for accessibility\n<Heading level={1} size=\"xl\">Page title</Heading>\n<Heading level={2} size=\"md\">Section title</Heading>\n```\n\n**Accessibility note — `level` vs `size`:**\n`level` controls the rendered HTML tag (`h1`–`h6`) and therefore the document\noutline used by screen readers.  `size` is a purely visual override — you can\nrender an `h2` that looks like an `h4` (or vice versa) without affecting\nsemantics.  Always set `level` to match the document hierarchy; use `size` only\nto meet visual design requirements.\n\n```tsx\n// Text — inline/block body copy\n<Text size=\"sm\" tone=\"secondary\">Last updated 3 days ago</Text>\n<Text size=\"md\" tone=\"primary\">Main body copy</Text>\n```\n\nAvailable sizes for both: `\"xs\"` `\"sm\"` `\"md\"` `\"lg\"` `\"xl\"` `\"2xl\"`.\nAvailable tones: `\"primary\"` `\"secondary\"` `\"muted\"` `\"inverse\"` `\"link\"`.\n\n## Components (17)\n\n| Group | Components |\n|---|---|\n| core | `Button` `IconButton` `Badge` `Avatar` `Card` `Stat` `Tag` |\n| feedback | `Alert` `Progress` `Tooltip` |\n| forms | `Input` `Select` `Checkbox` `Switch` `Field` |\n| navigation | `Tabs` `Breadcrumb` |\n\n## Tooling\n\n**Biome + Ultracite** is the linter/formatter (`bun run lint` / `format`), with\nstrict accessibility, correctness, and style rules. Ultracite's a11y rules are\nenforced — decorative SVGs are hidden, roles/labels are required, etc.\n\n## Enforcement — \"no local overrides\"\n\nFour mechanisms, each independently verified to *fire*:\n\n| Rule | Enforced by |\n|---|---|\n| no raw hex colors in TS/JS | **GritQL plugin** `.grit/no-raw-hex.grit` |\n| no raw `px` in TS/JS | **GritQL plugin** `.grit/no-raw-px.grit` |\n| only system fonts (Space Grotesk / Manrope / IBM Plex Mono) | **GritQL plugin** `.grit/no-offsystem-font.grit` |\n| valid component props + enum values (`variant=\"huge\"` fails) | **TypeScript** (`bun run typecheck`) |\n| no deep imports into internals | the package `exports` map (physical — deep paths aren't exported) |\n\nBiome lacks ESLint's `no-restricted-syntax`, so the raw-value rules are authored as\nGritQL plugins (`engine biome(1.0)`, matching `JsStringLiteralExpression`). Biome\n**errors on a broken plugin**, so the enforcement can't silently rot. The library\nlints itself, and the showcase doubles as a live adherence example.\n\n## Testing — drift protection\n\n| Layer | What it catches | Run |\n|---|---|---|\n| **A. Render + behavior** | a component breaks; controlled/uncontrolled state; ARIA roles | `bun test` |\n| **B. Contract snapshots** | a token or variant renamed/removed | `bun test` |\n| **C. Styling guard** | raw hex in component CSS; a `var(--…)` that references an undefined token | `bun test` |\n| **D. Visual regression** | contrast/visual drift in light **or** dark, every section | `bun run test:visual` |\n\nAfter an *intended* visual change, refresh baselines with `bun run test:visual:update`.\n\n## Layout\n\n```\nsrc/\n  tokens/        CSS custom properties (ported): colors typography spacing effects fonts base + index.css\n  components/    core/ feedback/ forms/ navigation/ — each: Name.tsx + Name.module.css + index.ts\n  index.ts       the ONLY public entry point\nstudio/          Theme workbench + Components tab (bun run studio)\n.grit/           GritQL adherence plugins (raw hex/px/font bans)\ntest/            bun test (A/B/C) + visual/ Playwright specs (D)\nbiome.jsonc      Biome + Ultracite config (extends + GritQL plugins)\n```\n\n## Notes\n\n- Components were re-authored from the ADL bundle's source (the bundle's behavior is\n  the reference). Visual values map 1:1 to the same semantic tokens.\n- Prop contracts are TypeScript types: components extend the native HTML attribute\n  types, so standard attributes (`id`, `aria-*`, form attrs) are allowed by design —\n  required for accessible label association (`Field htmlFor` → input `id`).\n- Distribution model (npm publish vs. monorepo workspace) is intentionally deferred;\n  the build artifact supports either.\n","readmeFilename":"README.md"}