{"_id":"@ecoma-io/loom","_rev":"12-2efea03533ddfddecf2907777130da5d","name":"@ecoma-io/loom","dist-tags":{"latest":"0.8.3"},"versions":{"0.1.0":{"name":"@ecoma-io/loom","version":"0.1.0","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","ecoma"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.1.0","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"ea738f033566847c9cb61f56915ed85bc9ef2dff","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.1.0.tgz","fileCount":259,"integrity":"sha512-bLkximk5RBx27HlolFldaaPleXhTi9cOI/D1UeJVBWdVdv7AmWfM1kV2MEs9poRcLdhOG2dWP5TdWQiVxfUEHg==","signatures":[{"sig":"MEUCIFAy2RtxfeRhVKcsmuT6jBOvlCTtxafln6KCVp9r8o1mAiEApYC+eQu3nJNBxDJDHg7kbrH7CoUbLCYdy8OrfrexDNg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":818234},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/a11y.d.ts","default":"./dist/a11y.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"96d49f1d1f2d5b353127367dc28002b5222e33e1","scripts":{"e2e":"playwright test","lint":"eslint . --max-warnings 0 && node tools/check-component-artifacts.ts","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","typecheck":"vue-tsc --noEmit","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","docs:preview":"vitepress preview docs","format:check":"prettier --check ."},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.16.0","description":"Design system & components for the Ecoma ecosystem.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.18.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.1","@lucide/vue":"^1.28.0","tailwind-merge":"^3.6.0","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"vue":"^3.5.40","gsap":"^3.15.0","vite":"^8.2.0","jsdom":"^30.0.1","eslint":"^10.8.0","vitest":"^4.1.10","globals":"^17.9.0","vue-tsc":"^3.3.9","lefthook":"^2.1.10","prettier":"^3.9.6","wrangler":"^4.118.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@types/node":"^26.1.2","tailwindcss":"^4.3.3","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.1","@vue/test-utils":"^2.4.11","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.66.0","vue-eslint-parser":"^10.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^4.1.10","@axe-core/playwright":"^4.12.1","@vitest/eslint-plugin":"^1.6.26","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.0","eslint-plugin-vuejs-accessibility":"^2.5.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.1.0_1786026818565_0.7890994799795497","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ecoma-io/loom","version":"0.1.1","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","ecoma"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.1.1","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"260ed21b417d578560a7255cb423349c894d71dc","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.1.1.tgz","fileCount":259,"integrity":"sha512-z9n8ckN324bFZZdY1DE9S57DpJLdy/xkAvVdgkrvRyg6SL1Yya6h1KQqGTywOK951t+VAEmRaTZucvfUtUaBVg==","signatures":[{"sig":"MEUCIQDU1OdY47guMRrNIP8dlTpDh2I8LDvpS+jI8UTkGPHvBwIgUnjVeD9N+t/JuZmSBxKcB8sQC0XN5LgJfDZD3KRr1xg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":818234},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/a11y.d.ts","default":"./dist/a11y.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"31f2b93808da2677b250e4c29f52dbff11da9a99","scripts":{"e2e":"playwright test","lint":"eslint . --max-warnings 0 && node tools/check-component-artifacts.ts","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","typecheck":"vue-tsc --noEmit","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","docs:preview":"vitepress preview docs","format:check":"prettier --check ."},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Design system & components for the Ecoma ecosystem.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.1","@lucide/vue":"^1.28.0","tailwind-merge":"^3.6.0","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"vue":"^3.5.40","gsap":"^3.15.0","vite":"^8.2.0","jsdom":"^30.0.1","eslint":"^10.8.0","vitest":"^4.1.10","globals":"^17.9.0","vue-tsc":"^3.3.9","lefthook":"^2.1.10","prettier":"^3.9.6","wrangler":"^4.118.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@types/node":"^26.1.2","tailwindcss":"^4.3.3","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.1","@vue/test-utils":"^2.4.11","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.66.0","vue-eslint-parser":"^10.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^4.1.10","@axe-core/playwright":"^4.12.1","@vitest/eslint-plugin":"^1.6.26","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.0","eslint-plugin-vuejs-accessibility":"^2.5.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.1.1_1786097481348_0.34592145680065856","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ecoma-io/loom","version":"0.2.0","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.2.0","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"e8c6b3c962b70b68091bfd37e93d494c029d7e35","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.2.0.tgz","fileCount":602,"integrity":"sha512-kK8SXAoa+L5i3i2NjVs+DTZSnvQBdQJHjuCoiJOjS/IXvGXIJz02XtMTQFw+cTqxl0SNfGJli9IqNHArFgFopA==","signatures":[{"sig":"MEUCIQDC4c2IorbGqI5CT4gdBo24FAtGH4lN8G8HNx+EKNqSQgIgdz3yH53hFsm0shswoNVJvu2fyuwHwOL6lOFfpkrCghI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3465322},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/lib/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"e2a7c02f1511ba359cb8aaa461de1f1a12cfb86b","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","typecheck":"vue-tsc --noEmit","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","docs:preview":"vitepress preview docs","format:check":"prettier --check .","docs:check-route":"node tools/stage-docs.ts --check"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Opinionated UI system and composition library for cross-platform web applications.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.1","@lucide/vue":"^1.28.0","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.3","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"vue":"^3.5.40","gsap":"^3.15.0","vite":"^8.2.0","jsdom":"^30.0.1","eslint":"^10.8.0","vitest":"^4.1.10","globals":"^17.9.0","vue-tsc":"^3.3.9","lefthook":"^2.1.10","prettier":"^3.9.6","wrangler":"^4.118.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@types/node":"^26.1.2","tailwindcss":"^4.3.3","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.1","@vue/test-utils":"^2.4.11","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.66.0","vue-eslint-parser":"^10.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^4.1.10","@axe-core/playwright":"^4.12.1","@vitest/eslint-plugin":"^1.6.26","@vue/typescript-plugin":"3.3.9","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.0","eslint-plugin-vuejs-accessibility":"^2.5.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.2.0_1786686968084_0.19591995645891158","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@ecoma-io/loom","version":"0.3.0","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.3.0","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"b588e0b90bb0e478a4c39bb9d7b31992385145dc","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.3.0.tgz","fileCount":868,"integrity":"sha512-5kTLVZuWVuUCTVLcBKZGz4C+fXKPhb0QE0mPhkpxtdfRdvGjT355B0gNhM8qmhe0OFpvm28s62tAzQbant7Sxw==","signatures":[{"sig":"MEQCICxN4o2t30u4ouVLZOGpD6n4Suv63n9XU43jtQ2Mw7YjAiBAzGYxLmo7rdhNAZZS8IGYZZ2QoBOuoCS3vC/jEmbdMg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3456261},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"default":"./dist/styles/theme.css"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"9d955bfbaf23b03a2f3c7db3c265f8ce44b2157b","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","docs:preview":"vitepress preview docs","format:check":"prettier --check .","docs:check-route":"node tools/stage-docs.ts --check"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Opinionated UI system and composition library for cross-platform web applications.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.1","@lucide/vue":"^1.28.0","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.3","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"vue":"^3.5.40","gsap":"^3.15.0","vite":"^8.2.0","jsdom":"^30.0.1","eslint":"^10.8.0","vitest":"^4.1.10","globals":"^17.9.0","vue-tsc":"^3.3.9","lefthook":"^2.1.10","prettier":"^3.9.6","wrangler":"^4.118.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@types/node":"^26.1.2","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.4.6","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.1","@vue/test-utils":"^2.4.11","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.66.0","vue-eslint-parser":"^10.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^4.1.10","@axe-core/playwright":"^4.12.1","@vitest/eslint-plugin":"^1.6.26","@vue/typescript-plugin":"3.3.9","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.0","eslint-plugin-vuejs-accessibility":"^2.5.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.3.0_1787120726336_0.3247702681135154","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@ecoma-io/loom","version":"0.4.0","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.4.0","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"091f9e8ea1423308e5f8fbef8ce9670be7e3c3a1","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.4.0.tgz","fileCount":901,"integrity":"sha512-kDDFWP9zgpWvK6qOfZ792aLSJi42imlWESKGzLhsM/wx2ZWl2HnFQGudvmNJ+9dlenEwfd4MtX8C2sYg2rxwNw==","signatures":[{"sig":"MEYCIQDpT6uWD7bi5xkLA5MpI9TABBMwsAPYADb/nT13H7LhUgIhAKzkI/Ry9A+w0X0Qh3WFh6Q5cU106djKWk96OXEGUpu/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3682061},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/packages/loom/src/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/packages/loom/src/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/packages/loom/src/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"7bf5f5dbd2d5b299658ef6267ebab7c5b49ea6b2","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts && pnpm lattice:check && pnpm check-skills","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json && node --experimental-strip-types tools/rewrite-declarations.ts","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/typecheck.tsbuildinfo","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","sync-skills":"node --experimental-strip-types tools/sync-skills.ts","check-skills":"node --experimental-strip-types tools/check-skills.ts","docs:preview":"vitepress preview docs","format:check":"prettier --check .","lattice:check":"lattice check","docs:check-route":"node tools/stage-docs.ts --check","lattice:mutations":"node --experimental-strip-types tools/check-lattice-mutations.ts"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.17.0","description":"Opinionated UI system and composition library for cross-platform web applications.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.1","@lucide/vue":"^1.28.0","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.3","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"vue":"^3.5.40","gsap":"^3.15.0","vite":"^8.2.0","jsdom":"^30.0.1","eslint":"^10.8.0","vitest":"^4.1.10","globals":"^17.9.0","vue-tsc":"^3.3.9","lefthook":"^2.1.10","prettier":"^3.9.6","wrangler":"^4.118.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@types/node":"^26.1.2","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.4.6","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.1","@vue/test-utils":"^2.4.11","@playwright/test":"^1.62.1","@ecoma-io/lattice":"0.11.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.66.0","vue-eslint-parser":"^10.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^4.1.10","@axe-core/playwright":"^4.12.1","@vitest/eslint-plugin":"^1.6.26","@vue/typescript-plugin":"3.3.9","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.0","eslint-plugin-vuejs-accessibility":"^2.5.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.4.0_1787538659837_0.3404169963392145","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@ecoma-io/loom","version":"0.5.0","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.5.0","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"6a96af5f3e711d76e327022ed818d3f2300f35ab","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.5.0.tgz","fileCount":1026,"integrity":"sha512-MOqO7COgzXadnVsPlgPTaYFdbPvi6p+K9w746tPY38EMRwNmNnR9qxEQDszbQK3LO8Kbfz4EsSAe9RMZl69D4Q==","signatures":[{"sig":"MEQCIEzQ62yckfgBT7TI1KWQBXXgvv3AFsF7FMYlrRJ0avqjAiAi3Ha/73qdSq8LS4mZmQIuqrFegZdWl6dbrlaFfb1ADg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGb5gBtTvvpjx2M3YZYSHvRX9i2sXxEAC8GEfJu3HP6NAiEA7mgo8MXigye+CZ9RolDE8s3VajWCy+1ycE9vVW4yR4g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4254023},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/packages/loom/src/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/packages/loom/src/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/packages/loom/src/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"08ae01238150a238e574995f60d6d4b768a2c04e","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node tools/check-template-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts && pnpm archkeep:check && pnpm check-skills","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json && node --experimental-strip-types tools/rewrite-declarations.ts","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/typecheck.tsbuildinfo","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","sync-skills":"node --experimental-strip-types tools/sync-skills.ts","check-skills":"node --experimental-strip-types tools/check-skills.ts","docs:preview":"vitepress preview docs","format:check":"prettier --check .","archkeep:check":"archkeep check","docs:check-route":"node tools/stage-docs.ts --check","archkeep:mutations":"node --experimental-strip-types tools/check-archkeep-mutations.ts"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.19.0","description":"Opinionated UI system and composition library for cross-platform web applications.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.4","@lucide/vue":"^1.40.0","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.4","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vue":"^3.5.42","gsap":"^3.15.0","vite":"^8.2.2","jsdom":"^30.0.1","eslint":"^10.9.1","vitest":"^5.0.0","globals":"^17.12.0","vue-tsc":"^3.3.11","axe-core":"~4.13.0","lefthook":"^2.1.12","prettier":"^3.9.6","wrangler":"^4.129.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@types/node":"^26.4.1","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.5.4","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.2","@vue/test-utils":"^2.5.0","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.69.0","vue-eslint-parser":"^10.4.1","@ecoma-io/archkeep":"0.24.0","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","@axe-core/playwright":"^4.13.0","@vitest/eslint-plugin":"^1.6.27","@vue/typescript-plugin":"3.3.11","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.2","eslint-plugin-vuejs-accessibility":"^2.6.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.5.0_1788642776419_0.8401611351444389","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@ecoma-io/loom","version":"0.6.0","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.6.0","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"f5b1e192805754bfb87f3344e4c3e5faadc85966","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.6.0.tgz","fileCount":1018,"integrity":"sha512-5Foqj+P7EEaj3guzMSfkVIw1IXlrjYw4slFhfM/k78xlAUbl+9lU8lF0/W4gVwt6avkuYmlMY5/YQ2ytXoigRQ==","signatures":[{"sig":"MEUCIEAaYsQ94pyXv1af1nwuKCxKtP+tDLoN+lpCJtKA7yhlAiEAhJGL78RbIDkhtpFTRLUG+Q2BTP2wPgqbJOU7p4QaMQ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIASvA/uzYTfXfmjc9lX1bhhM/IpoFJHQjj8ADaLLoq37AiAeLkZnN1CWtlLvQnQ7yIwfFopW/pJfXP2FXOX9RH+n4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4190024},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/packages/loom/src/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/packages/loom/src/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/packages/loom/src/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"00e2039006235340487412dd0fc4baf989bbb921","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node --experimental-strip-types tools/check-pattern-records.ts && node --experimental-strip-types tools/check-layout-obligations.ts && node --experimental-strip-types tools/check-a11y-evidence.ts && node --experimental-strip-types tools/check-responsive-evidence.ts && node --experimental-strip-types tools/check-composition-conformance.ts && node --experimental-strip-types tools/check-token-allowlist.ts && node --experimental-strip-types tools/check-interaction-evidence.ts && node tools/check-manifest-privacy.ts && node tools/check-template-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts && node --experimental-strip-types tools/check-api-parity.ts && node --experimental-strip-types tools/check-doc-claims.ts && pnpm archkeep:check && pnpm check-skills","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json && node --experimental-strip-types tools/rewrite-declarations.ts","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/typecheck.tsbuildinfo","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","escape-rate":"node --experimental-strip-types tools/measure-escape-rate.ts","sync-skills":"node --experimental-strip-types tools/sync-skills.ts","check-skills":"node --experimental-strip-types tools/check-skills.ts","docs:preview":"vitepress preview docs","format:check":"prettier --check .","archkeep:check":"archkeep check","docs:check-route":"node tools/stage-docs.ts --check","archkeep:mutations":"node --experimental-strip-types tools/check-archkeep-mutations.ts"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.19.0","description":"An Application Interface System for Vue — accessible components, design tokens and responsive layouts. Cross-platform is a design constraint, not the product category.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.4","@lucide/vue":"^1.40.0","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.4","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vue":"^3.5.42","gsap":"^3.15.0","vite":"^8.2.2","jsdom":"^30.0.1","eslint":"^10.9.1","vitest":"^5.0.0","globals":"^17.12.0","vue-tsc":"^3.3.11","axe-core":"~4.13.0","lefthook":"^2.1.12","prettier":"^3.9.6","wrangler":"^4.129.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@types/node":"^26.4.1","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.5.4","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.2","@vue/test-utils":"^2.5.0","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.69.0","vue-eslint-parser":"^10.4.1","@ecoma-io/archkeep":"0.28.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","@axe-core/playwright":"^4.13.0","@vitest/eslint-plugin":"^1.6.27","@vue/typescript-plugin":"3.3.11","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.2","eslint-plugin-vuejs-accessibility":"^2.6.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.6.0_1789148092645_0.8640657916749788","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@ecoma-io/loom","version":"0.7.0","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.7.0","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"e3bd9dd0fbcd088eba847c28099c845bae67dcf8","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.7.0.tgz","fileCount":1060,"integrity":"sha512-We1MIv8tzIRtV2cop7u3IcCgxaDJA4eD3IM/2PywT+b6Qq/eT9H5o3JwoC4oS8LgLhQj/c53Fyi43/1EutVQTg==","signatures":[{"sig":"MEUCIQCl49eQBNhy6NTid8LQwroWwkAf6iSrWFxf8QYBU8xVNwIgA/9moc5sTrojZg7De1UYFl5rwbTyhXU1HnHLd9vHcvU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCeRstxOCRGaZ4cs09d/77+z2mNiHr9N5hlKlo09F7NBQIgSEnRQKMqQ8i8FVCwUKw7FcHm02zUVXWHznbJBo7x2Kc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4316513},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/packages/loom/src/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/packages/loom/src/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/packages/loom/src/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"01d6998f26963a4991569a28d1b3ffb3024208a4","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node --experimental-strip-types tools/check-pattern-records.ts && node --experimental-strip-types tools/check-layout-obligations.ts && node --experimental-strip-types tools/check-a11y-evidence.ts && node --experimental-strip-types tools/check-responsive-evidence.ts && node --experimental-strip-types tools/check-composition-conformance.ts && node --experimental-strip-types tools/check-token-allowlist.ts && node --experimental-strip-types tools/check-interaction-evidence.ts && node tools/check-manifest-privacy.ts && node tools/check-template-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts && node --experimental-strip-types tools/check-api-parity.ts && node --experimental-strip-types tools/check-doc-claims.ts && pnpm archkeep:check && pnpm check-skills","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json && node --experimental-strip-types tools/rewrite-declarations.ts","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/typecheck.tsbuildinfo","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","escape-rate":"node --experimental-strip-types tools/measure-escape-rate.ts","sync-skills":"node --experimental-strip-types tools/sync-skills.ts","check-skills":"node --experimental-strip-types tools/check-skills.ts","docs:preview":"vitepress preview docs","format:check":"prettier --check .","archkeep:check":"archkeep check","docs:check-route":"node tools/stage-docs.ts --check","archkeep:mutations":"node --experimental-strip-types tools/check-archkeep-mutations.ts"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.19.0","description":"An Application Interface System for Vue — accessible components, design tokens and responsive layouts. Cross-platform is a design constraint, not the product category.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.4","@lucide/vue":"^1.40.0","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.4","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vue":"^3.5.42","gsap":"^3.15.0","vite":"^8.2.2","jsdom":"^30.0.1","eslint":"^10.9.1","vitest":"^5.0.0","globals":"^17.12.0","vue-tsc":"^3.3.11","axe-core":"~4.13.0","lefthook":"^2.1.12","prettier":"^3.9.6","wrangler":"^4.129.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@types/node":"^26.4.1","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.5.4","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.2","@vue/test-utils":"^2.5.0","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.69.0","vue-eslint-parser":"^10.4.1","@ecoma-io/archkeep":"0.28.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","@axe-core/playwright":"^4.13.0","@vitest/eslint-plugin":"^1.6.27","@vue/typescript-plugin":"3.3.11","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.2","eslint-plugin-vuejs-accessibility":"^2.6.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.7.0_1789849173464_0.4819341913363029","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@ecoma-io/loom","version":"0.8.0","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.8.0","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"c5fa98a580c84e57a4cc487b418e0af5035f3ff9","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.8.0.tgz","fileCount":1069,"integrity":"sha512-yYmIyWM11VFGHnkgBwEg1HYwWiY9AC1IdsHwunavu7HmBEz/VcetFm3tqYTaJRWNlzSC3KF85trIvUd9cOtW/w==","signatures":[{"sig":"MEUCIQDM0VepuU7f5FkPtZrxMeePy1VXXrx1Ui2+Rjy6lT6gdAIgbED1mcWHqsnTkbTwhf8p/REhkZcQmxDylRR83t378JI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBE/ZmZmCvw9Q9MTIe0wGBfbKfeZ32gxrEY18X9JZDiQAiEA4wBOymHTWMbIPGyYCEm0YfqXuXOz+qPVaM87kInG14g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4357676},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/packages/loom/src/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/packages/loom/src/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/packages/loom/src/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"3ba53d666ba64838f0e7ab2316da914fe6d0371c","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node --experimental-strip-types tools/check-pattern-records.ts && node --experimental-strip-types tools/check-layout-obligations.ts && node --experimental-strip-types tools/check-a11y-evidence.ts && node --experimental-strip-types tools/check-responsive-evidence.ts && node --experimental-strip-types tools/check-composition-conformance.ts && node --experimental-strip-types tools/check-token-allowlist.ts && node --experimental-strip-types tools/check-interaction-evidence.ts && node tools/check-manifest-privacy.ts && node --experimental-strip-types tools/check-icon-dependency.ts && node tools/check-template-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts && node --experimental-strip-types tools/check-api-parity.ts && node --experimental-strip-types tools/check-doc-claims.ts && pnpm archkeep:check && pnpm check-skills","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json && node --experimental-strip-types tools/rewrite-declarations.ts","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/typecheck.tsbuildinfo","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","escape-rate":"node --experimental-strip-types tools/measure-escape-rate.ts","sync-skills":"node --experimental-strip-types tools/sync-skills.ts","check-skills":"node --experimental-strip-types tools/check-skills.ts","docs:preview":"vitepress preview docs","format:check":"prettier --check .","archkeep:check":"archkeep check","docs:check-route":"node tools/stage-docs.ts --check","archkeep:mutations":"node --experimental-strip-types tools/check-archkeep-mutations.ts"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.19.0","description":"An Application Interface System for Vue — accessible components, design tokens and responsive layouts. Cross-platform is a design constraint, not the product category.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.4","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.4","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vue":"^3.5.42","gsap":"^3.15.0","vite":"^8.2.2","jsdom":"^30.0.1","eslint":"^10.9.1","vitest":"^5.0.0","globals":"^17.12.0","vue-tsc":"^3.3.11","axe-core":"~4.13.0","lefthook":"^2.1.12","prettier":"^3.9.6","wrangler":"^4.129.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@lucide/vue":"^1.40.0","@types/node":"^26.4.1","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.5.4","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.2","@vue/test-utils":"^2.5.0","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.69.0","vue-eslint-parser":"^10.4.1","@ecoma-io/archkeep":"0.28.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","@axe-core/playwright":"^4.13.0","@vitest/eslint-plugin":"^1.6.27","@vue/typescript-plugin":"3.3.11","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.2","eslint-plugin-vuejs-accessibility":"^2.6.0"},"peerDependencies":{"vue":"^3.5.0","@lucide/vue":"^1.40.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.8.0_1789858748952_0.024365131427045217","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@ecoma-io/loom","version":"0.8.1","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.8.1","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"d7c860a8576f1d5931a2ffa3d8f6e0abe018180e","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.8.1.tgz","fileCount":1068,"integrity":"sha512-inMDR1UsG+Gt2wMwlT9AASHGImxkuyfHDljfNWWpaEdE9PDAGPZD53/qWIh3Ke54A5HfSxETLiabx0vjb9F7Zg==","signatures":[{"sig":"MEUCIFQh8ieZ2UbYJmkDMje5VTy5oj9R+Z+bMM1v/ZOgjBrQAiEAkz1ZvMory2vV5pLBabFl808i62ftZwK6ILTN5xhJ1gw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD3LX10XR/YYoLvWJS7ocTd2OxJD1u+yEYGrPPRy/TwigIhAOpFNvTNzTzccF1xVIIPjUA6/hgJJmQShB2n5aj+Vy8j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4410321},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/packages/loom/src/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/packages/loom/src/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/packages/loom/src/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"6e2edc8aab393c8af1d45d2972908374080ffd7c","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node --experimental-strip-types tools/check-pattern-records.ts && node --experimental-strip-types tools/check-layout-obligations.ts && node --experimental-strip-types tools/check-a11y-evidence.ts && node --experimental-strip-types tools/check-responsive-evidence.ts && node --experimental-strip-types tools/check-composition-conformance.ts && node --experimental-strip-types tools/check-token-allowlist.ts && node --experimental-strip-types tools/check-interaction-evidence.ts && node --experimental-strip-types tools/check-exception-registers.ts && node tools/check-manifest-privacy.ts && node --experimental-strip-types tools/check-icon-dependency.ts && node tools/check-template-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts && node --experimental-strip-types tools/check-api-parity.ts && node --experimental-strip-types tools/check-doc-claims.ts && pnpm archkeep:check && pnpm check-skills","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json && node --experimental-strip-types tools/rewrite-declarations.ts","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/typecheck.tsbuildinfo","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","escape-rate":"node --experimental-strip-types tools/measure-escape-rate.ts","sync-skills":"node --experimental-strip-types tools/sync-skills.ts","check-skills":"node --experimental-strip-types tools/check-skills.ts","docs:preview":"vitepress preview docs","format:check":"prettier --check .","archkeep:check":"archkeep check","docs:check-route":"node tools/stage-docs.ts --check","archkeep:mutations":"node --experimental-strip-types tools/check-archkeep-mutations.ts"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.19.0","description":"An Application Interface System for Vue — accessible components, design tokens and responsive layouts. Cross-platform is a design constraint, not the product category.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.4","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.4","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vue":"^3.5.42","gsap":"^3.15.0","vite":"^8.2.2","jsdom":"^30.0.1","eslint":"^10.9.1","vitest":"^5.0.0","globals":"^17.12.0","vue-tsc":"^3.3.11","axe-core":"~4.13.0","lefthook":"^2.1.12","prettier":"^3.9.6","wrangler":"^4.129.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@lucide/vue":"^1.40.0","@types/node":"^26.4.1","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.5.4","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.2","@vue/test-utils":"^2.5.0","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.69.0","vue-eslint-parser":"^10.4.1","@ecoma-io/archkeep":"0.28.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","@axe-core/playwright":"^4.13.0","@vitest/eslint-plugin":"^1.6.27","@vue/typescript-plugin":"3.3.11","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.2","eslint-plugin-vuejs-accessibility":"^2.6.0"},"peerDependencies":{"vue":"^3.5.0","@lucide/vue":"^1.40.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.8.1_1790012869331_0.16444679801412487","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@ecoma-io/loom","version":"0.8.2","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","_id":"@ecoma-io/loom@0.8.2","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"homepage":"https://github.com/ecoma-io/loom#readme","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"4ec09d19577fda7dc07772bf1de27f693b9fc8fe","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.8.2.tgz","fileCount":1068,"integrity":"sha512-sWQoaUtegxX9VIqXjO2OwMwsxsZ4Rh9htxzuKfhhKnJl6gQk8jPfPFde6WJOVxjPeB+SgaDlLZr3cZKvktpa3g==","signatures":[{"sig":"MEUCIAMCtvqUoOpPBH+SOZ1zdycSCFsxaiFHJMrw8/VElHmRAiEAlfdBuURpzbDYr93SUJ012Ei6hK3OXQxWmJ9NNOkpL+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCgivRfiDO6Z4GXaw3spb0iopwU3k0SpX/u9rv32VOYzAIgZx50GoN2KT2xChqSQmfFbflIhCXup0hdxcbwUCJ+dto=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4410321},"type":"module","engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/packages/loom/src/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/packages/loom/src/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/packages/loom/src/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"a85c7c520e08523159e726e00ecff579464410f2","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node --experimental-strip-types tools/check-pattern-records.ts && node --experimental-strip-types tools/check-layout-obligations.ts && node --experimental-strip-types tools/check-a11y-evidence.ts && node --experimental-strip-types tools/check-responsive-evidence.ts && node --experimental-strip-types tools/check-composition-conformance.ts && node --experimental-strip-types tools/check-token-allowlist.ts && node --experimental-strip-types tools/check-interaction-evidence.ts && node --experimental-strip-types tools/check-exception-registers.ts && node tools/check-manifest-privacy.ts && node --experimental-strip-types tools/check-icon-dependency.ts && node tools/check-template-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts && node --experimental-strip-types tools/check-api-parity.ts && node --experimental-strip-types tools/check-doc-claims.ts && pnpm archkeep:check && pnpm check-skills","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json && node --experimental-strip-types tools/rewrite-declarations.ts","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/typecheck.tsbuildinfo","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","escape-rate":"node --experimental-strip-types tools/measure-escape-rate.ts","sync-skills":"node --experimental-strip-types tools/sync-skills.ts","check-skills":"node --experimental-strip-types tools/check-skills.ts","docs:preview":"vitepress preview docs","format:check":"prettier --check .","archkeep:check":"archkeep check","docs:check-route":"node tools/stage-docs.ts --check","archkeep:mutations":"node --experimental-strip-types tools/check-archkeep-mutations.ts"},"_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.19.0","description":"An Application Interface System for Vue — accessible components, design tokens and responsive layouts. Cross-platform is a design constraint, not the product category.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.4","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.4","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vue":"^3.5.42","gsap":"^3.15.0","vite":"^8.2.2","jsdom":"^30.0.1","eslint":"^10.9.1","vitest":"^5.0.0","globals":"^17.12.0","vue-tsc":"^3.3.11","axe-core":"~4.13.0","lefthook":"^2.1.12","prettier":"^3.9.6","wrangler":"^4.129.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@lucide/vue":"^1.40.0","@types/node":"^26.4.1","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.5.4","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.2","@vue/test-utils":"^2.5.0","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.69.0","vue-eslint-parser":"^10.4.1","@ecoma-io/archkeep":"0.28.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","@axe-core/playwright":"^4.13.0","@vitest/eslint-plugin":"^1.6.27","@vue/typescript-plugin":"3.3.11","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.2","eslint-plugin-vuejs-accessibility":"^2.6.0"},"peerDependencies":{"vue":"^3.5.0","@lucide/vue":"^1.40.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_0.8.2_1790029423395_0.03410841570599232","host":"s3://npm-registry-packages-npm-production"}},"0.8.3":{"_id":"@ecoma-io/loom@0.8.3","bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"dist":{"shasum":"4bc47417ac882f68d430e0186ca2d22a125a96db","tarball":"https://registry.npmjs.org/@ecoma-io/loom/-/loom-0.8.3.tgz","fileCount":1068,"integrity":"sha512-efb1BVMJgk8X2nfkC3tCLg7eJr+fOg6zqPHfXGMn+THHhVGmAgDAxto8zHrD2Tz21T7bLXxxEkRv3OiZQawPQg==","signatures":[{"sig":"MEQCIAR/3eBkvv6BSFBuIBOCQUOrYFI9NYUZlOHoAFgRxrP7AiBFlkgXL675p2L36yPGbFxdyshH0BR9UOvNJSMQb3c+JQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIH7rQqkWsuce3jAt5MJEXImwCyIkh41w0cjGQ6NSc3SqAiBiBDp/X3eh9yv5wfdwZrrmQ4tJbR4oLympHG0W78iZZw=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ecoma-io%2floom@0.8.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4410321},"name":"@ecoma-io/loom","type":"module","author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"engines":{"node":">=24","pnpm":">=11"},"exports":{".":{"types":"./dist/packages/loom/src/index.d.ts","default":"./dist/index.js"},"./a11y":{"types":"./dist/packages/loom/src/a11y.d.ts","default":"./dist/a11y.js"},"./theme":{"types":"./dist/packages/loom/src/theme.d.ts","default":"./dist/theme.js"},"./package.json":"./package.json","./styles/fonts.css":"./dist/styles/fonts.css","./styles/theme.css":"./dist/styles/theme.css","./styles/global.css":"./dist/styles/global.css"},"gitHead":"c9d12a867bf13e63eef1fa2ba84ef6c61b99adec","license":"Apache-2.0","scripts":{"e2e":"playwright test","lint":"eslint . --cache --cache-strategy content --cache-location node_modules/.cache/eslint --max-warnings 0 && node tools/check-component-artifacts.ts && node --experimental-strip-types tools/check-pattern-records.ts && node --experimental-strip-types tools/check-layout-obligations.ts && node --experimental-strip-types tools/check-a11y-evidence.ts && node --experimental-strip-types tools/check-responsive-evidence.ts && node --experimental-strip-types tools/check-composition-conformance.ts && node --experimental-strip-types tools/check-token-allowlist.ts && node --experimental-strip-types tools/check-interaction-evidence.ts && node --experimental-strip-types tools/check-exception-registers.ts && node tools/check-manifest-privacy.ts && node --experimental-strip-types tools/check-icon-dependency.ts && node tools/check-template-artifacts.ts && node --experimental-strip-types tools/check-architecture.ts && node --experimental-strip-types tools/check-api-parity.ts && node --experimental-strip-types tools/check-doc-claims.ts && pnpm archkeep:check && pnpm check-skills","moon":"MOON_CONCURRENCY=${MOON_CONCURRENCY:-4} exec moon","test":"vitest run","build":"vite build && vue-tsc -p tsconfig.build.json && node --experimental-strip-types tools/rewrite-declarations.ts","format":"prettier --write .","prepare":"lefthook install","docs:dev":"vitepress dev docs","e2e:full":"PW_PROFILE=full playwright test","test:full":"vitest run","typecheck":"vue-tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/typecheck.tsbuildinfo","docs:build":"vitepress build docs","docs:stage":"node tools/stage-docs.ts","test:watch":"vitest","escape-rate":"node --experimental-strip-types tools/measure-escape-rate.ts","sync-skills":"node --experimental-strip-types tools/sync-skills.ts","check-skills":"node --experimental-strip-types tools/check-skills.ts","docs:preview":"vitepress preview docs","format:check":"prettier --check .","archkeep:check":"archkeep check","docs:check-route":"node tools/stage-docs.ts --check","archkeep:mutations":"node --experimental-strip-types tools/check-archkeep-mutations.ts"},"version":"0.8.3","_npmUser":{"name":"johnmvn","email":"john.itvn@gmail.com"},"homepage":"https://github.com/ecoma-io/loom#readme","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"_npmVersion":"11.19.0","description":"An Application Interface System for Vue — accessible components, design tokens and responsive layouts. Cross-platform is a design constraint, not the product category.","directories":{},"maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","reka-ui":"^2.10.4","tailwind-merge":"^3.6.0","@internationalized/date":"^3.12.4","class-variance-authority":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vue":"^3.5.42","gsap":"^3.15.0","vite":"^8.2.2","jsdom":"^30.0.1","eslint":"^10.9.1","vitest":"^5.0.0","globals":"^17.12.0","vue-tsc":"^3.3.11","axe-core":"~4.13.0","lefthook":"^2.1.12","prettier":"^3.9.6","wrangler":"^4.129.0","vitepress":"^1.6.4","@eslint/js":"^10.0.1","fast-check":"^4.9.0","typescript":"^5.9.3","@lucide/vue":"^1.40.0","@types/node":"^26.4.1","tailwindcss":"^4.3.3","@moonrepo/cli":"^2.5.4","vue-docgen-api":"^4.79.2","@commitlint/cli":"^21.2.2","@vue/test-utils":"^2.5.0","@playwright/test":"^1.62.1","@tailwindcss/vite":"^4.3.3","eslint-plugin-vue":"^10.10.0","typescript-eslint":"^8.69.0","vue-eslint-parser":"^10.4.1","@ecoma-io/archkeep":"0.28.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","@axe-core/playwright":"^4.13.0","@vitest/eslint-plugin":"^1.6.27","@vue/typescript-plugin":"3.3.11","eslint-config-prettier":"^10.1.8","eslint-plugin-playwright":"^2.11.0","@commitlint/config-conventional":"^21.2.2","eslint-plugin-vuejs-accessibility":"^2.6.0"},"peerDependencies":{"vue":"^3.5.0","@lucide/vue":"^1.40.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loom_0.8.3_1790102473308_0.9715040611010726"}}},"time":{"created":"2026-08-06T14:33:38.446Z","modified":"2026-09-22T18:41:13.848Z","0.1.0":"2026-08-06T14:33:38.757Z","0.1.1":"2026-08-07T10:11:21.496Z","0.2.0":"2026-08-14T05:56:08.307Z","0.3.0":"2026-08-19T06:25:26.505Z","0.4.0":"2026-08-24T02:30:59.995Z","0.5.0":"2026-09-05T21:12:56.577Z","0.6.0":"2026-09-11T17:34:52.801Z","0.7.0":"2026-09-19T20:19:33.589Z","0.8.0":"2026-09-19T22:59:09.091Z","0.8.1":"2026-09-21T17:47:49.484Z","0.8.2":"2026-09-21T22:23:43.503Z","0.8.3":"2026-09-22T18:41:13.451Z"},"bugs":{"url":"https://github.com/ecoma-io/loom/issues"},"author":{"url":"John Martin","name":"Mai Ngọc Hóa","email":"john.itvn@gmail.com"},"license":"Apache-2.0","homepage":"https://github.com/ecoma-io/loom#readme","keywords":["design-system","component-library","ui-components","ui-kit","design-tokens","vue","vue3","tailwindcss","accessibility","a11y","wcag","theming","dark-mode","cross-platform","desktop","responsive","composition"],"repository":{"url":"git+https://github.com/ecoma-io/loom.git","type":"git"},"description":"An Application Interface System for Vue — accessible components, design tokens and responsive layouts. Cross-platform is a design constraint, not the product category.","maintainers":[{"name":"johnmvn","email":"john.itvn@gmail.com"}],"readme":"<!-- The README's structure is ten sections, in this order: what Loom is, install,\n     your first component, tokens and theming, the accessibility bar, evidence\n     tiers, templates, module boundaries, governance and contributing,\n     compatibility and requirements. A section exists because a consumer must\n     learn that thing to use Loom — prose that answers none of the ten questions\n     does not earn a section, however fond of it we are. The checklist, with the\n     referent each section must cite, lives in the governing issue\n     (ecoma-io/loom#338). -->\n<!-- harmonise:skip-start -->\n<p align=\"center\">\n  <a href=\"https://github.com/ecoma-io/loom/actions/workflows/ci.yml\"><img src=\"https://github.com/ecoma-io/loom/actions/workflows/ci.yml/badge.svg\" alt=\"CI\" /></a>\n  <a href=\"https://github.com/ecoma-io/loom/actions/workflows/analysis.yml\"><img src=\"https://img.shields.io/badge/analysis-semgrep-purple.svg\" alt=\"Analysis\" /></a>\n  <a href=\"https://scorecard.dev/viewer/?uri=github.com/ecoma-io/loom\"><img src=\"https://api.scorecard.dev/projects/github.com/ecoma-io/loom/badge\" alt=\"OpenSSF Scorecard\" /></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-Apache--2.0-blue.svg\" alt=\"License: Apache 2.0\" /></a>\n  <img src=\"https://img.shields.io/badge/node-%3E%3D24-brightgreen.svg\" alt=\"Node >= 24\" />\n  <img src=\"https://img.shields.io/badge/pnpm-11-f69220.svg\" alt=\"pnpm 11\" />\n  <img src=\"https://img.shields.io/badge/TypeScript-strict-3178c6.svg\" alt=\"TypeScript strict\" />\n  <a href=\"CONTRIBUTING.md\"><img src=\"https://img.shields.io/badge/PRs-welcome-7C3AED.svg\" alt=\"Pull requests welcome\" /></a>\n</p>\n<!-- harmonise:skip-end -->\n\n<!-- harmonise:skip-start -->\n\n<a href=\"README.md\">English</a> | <a href=\"README.vi.md\">Tiếng Việt</a> | <a href=\"README.zh.md\">中文</a> | <a href=\"README.ja.md\">日本語</a> | <a href=\"README.es.md\">Español</a> | <a href=\"README.hi.md\">हिन्दी</a> | <a href=\"README.ar.md\">العربية</a> | <a href=\"README.pt.md\">Português</a> | <a href=\"README.bn.md\">বাংলা</a> | <a href=\"README.ru.md\">Русский</a> | <a href=\"README.fr.md\">Français</a>\n\n<!-- harmonise:skip-end -->\n\n<p align=\"center\">\n  <img src=\".github/assets/banner.png\" alt=\"Loom — an Application Interface System for Vue\" width=\"100%\" />\n</p>\n\n<h1 align=\"center\">Loom</h1>\n\n<p align=\"center\">\n  <strong>An Application Interface System for Vue.</strong><br />\n  An open-source, accessibility-first component library and design-token system —\n  Vue&nbsp;3, TypeScript and Tailwind&nbsp;CSS.<br />\n  <em>Build the interface once. Never re-decide what a button is.</em>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://ecoma.io/docs/contribute/design-system/\"><strong>Documentation&nbsp;→</strong></a>\n</p>\n\n---\n\n## What Loom is\n\nA design system is not a folder of components. It is a decision, made once, that\nevery screen inherits — how far apart two things sit, how a dialog gives focus\nback, what \"destructive\" looks like at 3am on a low-contrast monitor. Hand that\ndecision to each product and it is not made once. It is made again, slightly\ndifferently, every sprint, by whoever is closest to the deadline.\n\n**Loom is where that decision lives.** One vocabulary of design tokens, one set\nof accessible UI primitives, one motion language — consumed by every surface,\nowned by none of them.\n\n**Loom owns interface decisions, not application decisions.** What it standardises\nis the reusable layer — visual language, accessibility, interaction semantics,\nresponsive behaviour, composition, patterns, templates. What requires knowing\nwhat your product _is_ belongs to your product. That split is the one rule that\ndecides most questions about what belongs here.\n\n|                              |                                                                                                                                                                               |\n| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Design tokens**            | Colour, spacing, radius, elevation, typography and motion — one source that light mode and dark mode both read from, so a rebrand is an edit rather than an audit.            |\n| **UI primitives**            | The generic controls every product needs and no product should own: buttons, inputs, selects, dialogs, menus, toasts, tooltips, skeletons, switches, progress.                |\n| **Composition primitives**   | Layout building blocks — Stack, Grid, Split, Center, Sidebar — that express spatial intent and adapt to viewport without the host writing breakpoint queries.                 |\n| **Patterns**                 | Compositions worth standardising once — empty states, page headers, title bars, sidebar navigation — assembled from primitives, never from scratch.                           |\n| **Showcase**                 | Demonstrations, in this documentation site, of what the parts produce when they compose — for discovery and teaching. A showcase is read; it is not a starting point to copy. |\n| **Templates**                | Copyable prebuilt pages — Starter, Analytics, Workspace settings — to take into an application and build on. One page each; routing, auth and backend stay with the consumer. |\n| **Accessibility, built in**  | Keyboard paths, focus restoration, accessible names and reduced-motion behaviour ship inside the component. WCAG is the acceptance bar, not a checklist run afterwards.       |\n| **Theming that survives**    | Every visual decision is a token reference, so white-labelling a tenant is configuration rather than a fork.                                                                  |\n| **Typed and tree-shakeable** | Ships ES modules with TypeScript types. Consumers bundle what they import and nothing more.                                                                                   |\n\nIt is for teams building Vue applications who want the interface layer decided:\ndesign-system maintainers who want the token model, the artifact conventions and\nthe accessibility bar readable in the open, and anyone tired of re-deciding what\na button is — ship the defaults, override the tokens that don't fit, leave the\nrest alone. Loom originated within the [Ecoma](https://ecoma.io) ecosystem and is\ndeveloped as an independent open-source UI system.\n\n## Install\n\nLoom ships as one npm package — the components, the theme composable and the\nstylesheet entry behind a single install:\n\n```bash\npnpm add @ecoma-io/loom\n```\n\nOne import is the whole styling surface a normal host needs — tokens, the\nself-hosted fonts, base element styling and the motion library ride along:\n\n```css\n@import \"@ecoma-io/loom/styles/global.css\";\n```\n\nIt needs Vue 3.5 or newer as a peer and Tailwind CSS 4 in your build; the\n[compatibility table](#compatibility-and-requirements) has the full list. The\n[documentation site](https://ecoma.io/docs/contribute/design-system/) walks an\nempty Vue application to a rendered, themed component.\n\n## Your first component\n\n```vue\n<script setup lang=\"ts\">\nimport { Button } from \"@ecoma-io/loom\";\n</script>\n\n<template>\n  <Button variant=\"primary\" @click=\"save\">Save</Button>\n</template>\n```\n\nEverything importable lives behind the one package: [packages/loom/src/index.ts](packages/loom/src/index.ts)\nis the complete export list, and says so in its own docblock. The generic controls\nsit beside composition primitives that adapt to viewport and container — a\nsidebar collapses at the right width, a master-detail panel stacks on mobile,\nand on an ultrawide monitor content is bounded at readable widths, the extra\nviewport going to intentional whitespace rather than stretching.\n\nA `class` you pass merges with the component's own instead of replacing it —\n`cn` ships from the same package and is Tailwind-aware, so your `px-4` resolves\nagainst the component's `px-6` rather than both shipping and stylesheet order\ndeciding the winner.\n\nEach component's page on the documentation site carries an API table generated\nfrom the component's own `defineProps`, so the documented surface cannot drift\nfrom the shipped one.\n\n## Tokens and theming\n\nEvery visual decision is a token reference, and the tokens have one home:\n[packages/theme-core/src/theme.css](packages/theme-core/src/theme.css) is the\nsource of truth. Light mode and dark mode both derive from that one set — dark\nis not a second theme anyone maintains, which is why the two cannot drift apart.\nA `useTheme` composable switches between light, dark and system preference.\n\nBecause a token is a CSS custom property rather than a Tailwind class, the token\nlayer is framework-neutral and usable anywhere; the components that consume it\nare Vue. Rebranding is editing tokens; white-labelling a tenant is configuration,\nnot a fork.\n\n## The accessibility bar\n\nAccessibility ships inside the component, not as a follow-up: keyboard operation\nwith visible focus, focus restored to the trigger when an overlay closes,\naccessible names, no state conveyed by colour alone, and a\n`prefers-reduced-motion` path through the motion library.\n\nThe bar is defined, not aspirational. `WCAG_TAGS` in\n[packages/core/src/a11y-scope.ts](packages/core/src/a11y-scope.ts) is the closed\nrule set the library holds itself to — the axe rules mapping to a WCAG Level A\nor AA success criterion — and the browser gate that enforces it carries no\nexcludes. Every component also declares an `a11y.json` claim beside its source,\nheld by a gate against the role → requirement matrix in\n[packages/core/src/a11y-contract.ts](packages/core/src/a11y-contract.ts), so a\nrequirement nothing answers yet is recorded as a named exception rather than\nsilently missing. An accessibility bug is a bug, and it is filed and fixed as one.\n\n## Evidence tiers\n\nThe claims above are pinned at three runtimes — the same three the\naccessibility contract names (`browserless`, `harness`, `sweep`):\n\n- **browserless** — the jsdom sweep mounts every demo and holds it to its\n  component's accessibility claim, no browser required.\n- **harness** — a Vite dev server mounts one demo at a time, so a component's\n  browser specs run in seconds without paying for a site build.\n- **sweep** — the site-wide suite over the built documentation site: axe,\n  contrast, target size, keyboard, focus-not-obscured, motion, responsive.\n\nBeside them, unit and integration tests live next to each component's source and\nthe browser tier lives apart; [CONTRIBUTING.md](CONTRIBUTING.md) holds the\ncontract for all of it. The documentation is held to the same honesty: token\ntables are generated from `theme.css` and API tables from the components\nthemselves — generated, never transcribed, so a page cannot quietly disagree\nwith the code it describes.\n\n## Templates\n\nAn Official Template is a copyable prebuilt **page** — a starting point composed\nfrom Loom components and patterns, taken into an application and built on:\nStarter, Analytics, Workspace settings. Where a pattern is a component you\ncompose with and the showcase is a demonstration you read, a template is a page\nyou start from. Routing, auth and backend stay with the consumer.\n\nTemplates consume the public `@ecoma-io/loom` package exactly as an external\nconsumer would — no internal imports, nothing the published package does not\nhave — because if a template cannot build against the published surface, that is\na defect in the surface. [docs/templates/contract.md](docs/templates/contract.md)\nstates the artifact kind's law, and the template suite holds every template to\nsmoke, axe in light and dark, keyboard and responsive gates.\n\n## Module boundaries\n\nLoom is layered, and the direction is one way: core → labels → primitives →\ncomposition → patterns → layouts → facade. The facade — the `@ecoma-io/loom`\npackage you install — is the only import surface: its exports map offers the\ncomponents, the `./a11y` and `./theme` entries, and the stylesheet files, and\nnothing inside the monorepo is public API.\n\nThe boundary is enforced twice, by two readers that see different things:\n[tools/check-architecture.ts](tools/check-architecture.ts) matches the import\nspecifier text, and [archkeep](https://github.com/ecoma-io/archkeep) resolves\neach specifier through the TypeScript config and judges the resolved target\nagainst [module-boundaries.config.mjs](module-boundaries.config.mjs). The\n[architecture contract](docs/architecture/contract.md) records which invariant\neach reader owns.\n\n## Governance and contributing\n\nWhat Loom takes is decided by the one rule: Loom holds what is **generic** — an\naffordance more than one product reaches for the same way. Everything else about\nworking here is the contract, and the contract is\n[CONTRIBUTING.md](CONTRIBUTING.md): the commit format, the test tiers, the\nSemgrep rules, the accessibility bar, and how a pull request lands.\n\nTo work on Loom itself:\n\n```bash\ngit clone https://github.com/ecoma-io/loom.git\ncd loom\npnpm install\n```\n\n`pnpm install` also installs the Git hooks, so formatting, linting and commit\nmessage checks run before anything reaches a branch. The component surface is\nlanding in the open, one artifact at a time — follow along or ask for something\nspecific in [the issues](https://github.com/ecoma-io/loom/issues).\n\nEveryone taking part is held to the [Code of Conduct](CODE_OF_CONDUCT.md).\nSecurity issues go through [SECURITY.md](SECURITY.md) — never a public issue.\n\nLoom is [Apache-2.0](LICENSE) — an explicit patent grant, which for a component\nlibrary that ends up embedded in commercial products is the difference between\n\"probably fine\" and \"written down\" — with no runtime dependency on any Ecoma\nplatform, so consuming it as an ordinary npm package includes consuming it\noutside Ecoma. Use it, ship it, fork it, sell what you build with it.\n\n## Compatibility and requirements\n\n| Requirement  | Version                                        |\n| ------------ | ---------------------------------------------- |\n| Node         | ≥ 24 (`engines` in `package.json`)             |\n| pnpm         | 11 — pinned, so Corepack fetches the right one |\n| Vue          | ≥ 3.5, as a peer dependency                    |\n| Tailwind CSS | 4, in your build (`@tailwindcss/vite`)         |\n\nTypes ship strict, and the package ships ES modules that tree-shake: consumers\nbundle what they import and nothing more.\n\nCross-platform is a design constraint, not the product category. Loom's\ninterface decisions are made so they can survive a change of rendering target —\na browser tab, an installed PWA, an Electron or Tauri desktop shell, a mobile\nwebview — and the platform-specific parts stay at the boundary, passed in by the\nhost rather than sniffed at runtime: window chrome, safe-area insets, PWA\noverlays. Loom today is a Vue-facing interface system, not a cross-platform\nframework.\n\n---\n\n<p align=\"center\">\n  <img src=\".github/assets/logo.png\" alt=\"\" width=\"56\" /><br />\n  <sub>\n    An <a href=\"https://ecoma.io\">Ecoma</a> open-source project ·\n    <a href=\"https://ecoma.io/docs/contribute/design-system/\">Documentation</a> ·\n    <a href=\"https://github.com/ecoma-io\">Organisation</a> ·\n    <a href=\"CONTRIBUTING.md\">Contribute</a>\n  </sub>\n</p>\n","readmeFilename":"README.md"}