{"_id":"@eduardoalvarez/arrecife","_rev":"19-77bba162f0f20ac5a027185c87356ee6","name":"@eduardoalvarez/arrecife","dist-tags":{"latest":"0.12.5"},"versions":{"0.1.0":{"name":"@eduardoalvarez/arrecife","version":"0.1.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.1.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://github.com/Proskynete/arrecife#readme","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"6ad19ad18074647c5137fb9e703d3d3c1abac4a4","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.1.0.tgz","fileCount":44,"integrity":"sha512-PaThtBxFI1wCi+8LKOFioodqxipwFh3jeTPZWfG/+HwzK1AlYAzxDDNsgKoVhVu391xwgb/OZta3DnkPQYiG6w==","signatures":[{"sig":"MEUCIDdsuHAl4IV3G6WwrzL+J7MUrVD+PfDaG0npkoY2jvFfAiEAwHougMxRVU3dp1IzTQeF9haGVLE8jqj4bXRVfU90fhg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1356081},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"022fdffde63d3a9b0567a49aee40dd43f6942639","scripts":{"lint":"eslint .","test":"pnpm test:oscuro && pnpm test:claro","build":"pnpm check:tokens && tsup && pnpm build:tokens","storybook":"pnpm build:tokens && storybook dev -p 6006","typecheck":"tsc --noEmit","test:claro":"STORYBOOK_THEME=claro vitest run --project storybook","test:watch":"vitest --project storybook","test:oscuro":"vitest run --project storybook","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build"},"_npmUser":{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"Librería de componentes de la identidad visual de Eduardo Álvarez","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^7.2.0","react":"^19.2.0","eslint":"^9.39.0","vitest":"^4.1.11","globals":"^17.11.0","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^9.39.0","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","@types/react-dom":"^19.2.0","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.1.0_1787818652102_0.5960379681270658","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@eduardoalvarez/arrecife","version":"0.1.1","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.1.1","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://github.com/Proskynete/arrecife#readme","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"a6f50b1de6d17dd69e1918aa5af6806b55ec0a3e","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.1.1.tgz","fileCount":44,"integrity":"sha512-A9xBntSAcEbcoPlS59cR7rKLsn52XCzgRWtkNBO5FR7Ji2ZG+tN32DFiTw6MwApt8u5Nvb/s+d0FZkXEqMkMNg==","signatures":[{"sig":"MEUCIHrwjtpL7SBWmyOjdGMOHUU7F4xgxrkRy0jYDFDB0prWAiEAq81doP+aKOUicWR5KWbbghiupXd4amOQKx+k2hPPa48=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1358079},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"72f16ee0eaf768f5f00ac22467c3f0190f1389ed","scripts":{"lint":"eslint .","test":"pnpm test:oscuro && pnpm test:claro","build":"pnpm check:tokens && tsup && pnpm build:tokens","storybook":"pnpm build:tokens && storybook dev -p 6006","typecheck":"tsc --noEmit","test:claro":"STORYBOOK_THEME=claro vitest run --project storybook","test:watch":"vitest --project storybook","test:oscuro":"vitest run --project storybook","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build"},"_npmUser":{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"Librería de componentes de la identidad visual de Eduardo Álvarez","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^7.2.0","react":"^19.2.0","eslint":"^9.39.0","vitest":"^4.1.11","globals":"^17.11.0","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^9.39.0","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","@types/react-dom":"^19.2.0","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.1.1_1787819479133_0.9084707589513248","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@eduardoalvarez/arrecife","version":"0.2.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.2.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://github.com/Proskynete/arrecife#readme","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"b27f3322c91d513bdb0feac850f060c576e32d16","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.2.0.tgz","fileCount":45,"integrity":"sha512-Y1iFC0v+oxYF1hHqCQPvvUG57McPGozBBswWyhaEp86K9y7gHp5xQyIQI2F9uLkddCJjQyZMEe0H6Y77ng3cmg==","signatures":[{"sig":"MEUCIQD7ZGDftVa750y4DkHCkDcRoDsFB7NLtHLtkFjuLqezbgIgduHcax7jTDAUhNzvgfmzuX/oUEGkMWtVQ9j++NPYIcU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1414676},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"1442217a0fdf266da55dbf10de368d991afb0eb2","scripts":{"lint":"eslint .","test":"pnpm test:oscuro && pnpm test:claro","build":"pnpm check:tokens && tsup && pnpm build:tokens && pnpm build:llms","storybook":"pnpm build:tokens && storybook dev -p 6006","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:llms":"node scripts/build-llms.mjs --check","test:claro":"STORYBOOK_THEME=claro vitest run --project storybook","test:watch":"vitest --project storybook","test:oscuro":"vitest run --project storybook","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"Librería de componentes de la identidad visual de Eduardo Álvarez","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.2.0_1787823576644_0.9790403489576498","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@eduardoalvarez/arrecife","version":"0.3.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.3.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://github.com/Proskynete/arrecife#readme","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"c285f1041cf35141d707107e424b54baf98c069a","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.3.0.tgz","fileCount":45,"integrity":"sha512-dX1iL9UsxCoVis4dmGWOmEZXcsspSPK9RLDmmAwhC+7bit2EIvKAcCaLoFmNM/zaj+WR3YSzk12MtKb0rrcnFg==","signatures":[{"sig":"MEYCIQDPfAE6N8dcPkHQ09BFYhXzPcy1V/qc+19akExQhhax/wIhANPabLNX1cWDPcL2gSB2jg3S+EMLyMB+OfBeIw22NXhG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1423159},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"08923a38574da999b72a90d0d0fbee16e28205d8","scripts":{"lint":"eslint .","test":"pnpm test:unidad && pnpm test:oscuro && pnpm test:claro","build":"pnpm check:tokens && pnpm check:namespace && tsup && pnpm build:tokens && pnpm build:llms","storybook":"pnpm build:tokens && storybook dev -p 6006","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:llms":"node scripts/build-llms.mjs --check","test:claro":"STORYBOOK_THEME=claro vitest run --project storybook","test:watch":"vitest --project storybook","test:oscuro":"vitest run --project storybook","test:unidad":"vitest run --project unidad","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"Librería de componentes de la identidad visual de Eduardo Álvarez","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.3.0_1788140851398_0.9761985998545981","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@eduardoalvarez/arrecife","version":"0.4.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.4.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://github.com/Proskynete/arrecife#readme","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"7d205107d081ceebea58b1ca751a1fa2d8a170f7","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.4.0.tgz","fileCount":64,"integrity":"sha512-8ASxU01ILN9NpbhC3Pmqec9otPMIxduJIpgB6g81529bArpn+vgjFm2PahnMFPTDCaxv2XepWdTDUVFkAKKuKw==","signatures":[{"sig":"MEUCIEPbyWZ2UXCUKaYJPKJMIESY+OdE4YnDZWRpYduW+EsMAiEAqgbOZf7cYaIcPRPe7CnwF7dRzItDQ2jfBn8Z80cpD4s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1580499},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./tema":{"types":"./dist/tema/index.d.ts","import":"./dist/tema/index.js","require":"./dist/tema/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"f281beed0580b713fc99fc10356ff0fc3442077f","scripts":{"lint":"eslint .","test":"pnpm test:unidad && pnpm test:oscuro && pnpm test:claro","build":"pnpm check:tokens && pnpm check:namespace && tsup && pnpm build:tokens && pnpm build:llms","storybook":"pnpm build:tokens && storybook dev -p 6006","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:llms":"node scripts/build-llms.mjs --check","test:claro":"STORYBOOK_THEME=claro vitest run --project storybook","test:watch":"vitest --project storybook","test:oscuro":"vitest run --project storybook","test:unidad":"vitest run --project unidad","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"Librería de componentes de la identidad visual de Eduardo Álvarez","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.4.0_1788183322884_0.2843933828589076","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@eduardoalvarez/arrecife","version":"0.5.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.5.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://github.com/Proskynete/arrecife#readme","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"1941ad54baedcc38531c1f343f1e0de00ad7266a","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.5.0.tgz","fileCount":64,"integrity":"sha512-xEfy/RaSMOJM1BCBoTvsu+uDDnVYNWJ+tigkAzn9RxY4Zwy/bJVesPWjBMOSNg/G9CX95B6/sNxiR0GEvWm8vg==","signatures":[{"sig":"MEUCIQD20MK35of32dK97HW9oip9EblbNfqci9J84biNJdAjfAIgX/O5rx8h/5oubePdoIkSzxyEiVDfrbU3AQNH7BeoBgw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1625873},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./tema":{"types":"./dist/tema/index.d.ts","import":"./dist/tema/index.js","require":"./dist/tema/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"9be94f50c13376ab5cedf251022c7af1727cfc15","scripts":{"lint":"eslint .","test":"pnpm test:unidad && pnpm test:oscuro && pnpm test:claro","build":"pnpm check:tokens && pnpm check:namespace && tsup && pnpm build:tokens && pnpm build:llms","storybook":"pnpm build:tokens && storybook dev -p 6006","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:llms":"node scripts/build-llms.mjs --check","test:claro":"STORYBOOK_THEME=claro vitest run --project storybook","test:watch":"vitest --project storybook","test:oscuro":"vitest run --project storybook","test:unidad":"vitest run --project unidad","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"Librería de componentes de la identidad visual de Eduardo Álvarez","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.5.0_1788211929855_0.9754837631766073","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@eduardoalvarez/arrecife","version":"0.5.1","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.5.1","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://github.com/Proskynete/arrecife#readme","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"8bd689a2e96ba025c6097963addccdfd76c286c7","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.5.1.tgz","fileCount":64,"integrity":"sha512-u6+9sqsDjFAeYagPQcR8Xj3+5p8upTL9vzfReik8XvBm72omA1bIU1D9mGMl8UOpx+TcSbgaWQz5mJ7NW09CAA==","signatures":[{"sig":"MEQCIFiCZ48oRZOCkKVUkTHBSlYEcV8QuBK3djIgaDtA752IAiB/ucD75iJWP6NJSvBLtJLM3JcQKQAtGygKRuV5Jnnnmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1626956},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./tema":{"types":"./dist/tema/index.d.ts","import":"./dist/tema/index.js","require":"./dist/tema/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"21900996483c993d390bde1ba7a8acff3273c791","scripts":{"lint":"eslint .","test":"pnpm test:unidad && pnpm test:oscuro && pnpm test:claro","build":"pnpm check:tokens && pnpm check:namespace && tsup && pnpm build:tokens && pnpm build:llms","storybook":"pnpm build:tokens && storybook dev -p 6006","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:llms":"node scripts/build-llms.mjs --check","test:claro":"STORYBOOK_THEME=claro vitest run --project storybook","test:watch":"vitest --project storybook","test:oscuro":"vitest run --project storybook","test:unidad":"vitest run --project unidad","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"Librería de componentes de la identidad visual de Eduardo Álvarez","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.5.1_1788226303655_0.8695160692334645","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@eduardoalvarez/arrecife","version":"0.6.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.6.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"8573a08cc08763c0f513bd0c9474563111ee3e72","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.6.0.tgz","fileCount":70,"integrity":"sha512-WNmaiD34COOCa75HIk0GiUTFG8tI4WTnyLBuvrBXr4yUi0T+nQEX3YaaHNMjnZPWsRh1Iudv7NMkKAidvx1srg==","signatures":[{"sig":"MEYCIQDkSHmlnjr2u6j7M5jIZxpDrmeyfciaLVSAS7SdN0w90gIhAOqUcOE67qEzEIbXbKxYtQezr+QlL7CXlKI+281ndmFE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1699637},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"30fa6af56f95e29f2c1a510c591a8a1a60f79e51","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:llms","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.19.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.6.0_1788381668189_0.7241274021774462","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@eduardoalvarez/arrecife","version":"0.7.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.7.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"3dbfe3446d61fa161223cadc1cd844e33fca4733","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.7.0.tgz","fileCount":82,"integrity":"sha512-RjF1bT24UiS3TAeCGaxqHvxRJw0Z+qSSzSU0YfQP233etODT/OJ7lk8OeEJUXAUKPqOMtrz6tAvvKm1VLan+LQ==","signatures":[{"sig":"MEQCIFvEo4dsVqh91r7Yzhs1jpgp4SxxWa64Yv2nV7oMaGCCAiBvHaXeqpci+ZKfP1WUMizlB4ccHd8E9t22q4r4cNtFVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDHG+F8cmuV687DBMZVkjvsWFFKCn16j54MFclYk16mpgIhALYOAsAmD5IPCnpu03b5bEqkEo/u8kOuCuEVSHc4E0IF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1799925},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./social":{"types":"./dist/social/index.d.ts","import":"./dist/social/index.js","require":"./dist/social/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"37e5952d4e32122b5401cd59fe3fe8e1bc47eb86","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true},"@phosphor-icons/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.7.0_1788532855009_0.334209566659587","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@eduardoalvarez/arrecife","version":"0.8.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.8.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"b52de2eb882562485bf37d89136d4976d6029332","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.8.0.tgz","fileCount":87,"integrity":"sha512-vscgJwMdAikU8/3SWe8RcLRbjmvIuFWZwbDTmtDWbPLFWcDoYZ5XH/4qBX+AV5nan5ENUehOpKg9jtpW+6Io/w==","signatures":[{"sig":"MEYCIQCVAVA5YBztGpjM3KRcyC+Cc9elluEi1a9OtQ6iP2+qCwIhAMA2n+xQVjR38DV1eNjjKtOG0K4Zp7Fh8nN6dGHt6eOv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIC5WZKCwwbiogQ0TuZhoDfbq+KM/O5yBzvZQUJNyIracAiBzEnKnvg2W77TNNZdRzn2hEJ6fqMnHfco0Lh/+NFrx7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1874697},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./social":{"types":"./dist/social/index.d.ts","import":"./dist/social/index.js","require":"./dist/social/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./social/data":{"types":"./dist/social/data.d.ts","import":"./dist/social/data.js","require":"./dist/social/data.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"bb3b4dea9063db4c9890498a9e5fec0267ee77fa","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true},"@phosphor-icons/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.8.0_1788721564610_0.6778462582708629","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@eduardoalvarez/arrecife","version":"0.9.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.9.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"af656db4269c01ba6ac531ba2e4dd4a22a3337b2","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.9.0.tgz","fileCount":87,"integrity":"sha512-sqA5w3bW7jeQc2z216OT2pNvi0jiqv2AzOTP5QXSgadKfMukZYZTKsN1e21Kkb1D4hucS0EqwaN+QxCc6LXewQ==","signatures":[{"sig":"MEYCIQCyGJ1kzbwunmceH07+/yeywbHwtxx1dDUEnJXFNqnOnQIhANtIWkrcMC9T520PvbAqxn+ufy4q1pDPGBN/jNOtoHIE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDhLXHGTLOP9rfHffiBPe50iV8fQHx4TH6F7FYj9t7zKQIhAMTKOZEIypfagbYFQEt/AEg0V9FCtxHUjjUv2lgzxjVr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1881891},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./social":{"types":"./dist/social/index.d.ts","import":"./dist/social/index.js","require":"./dist/social/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./social/data":{"types":"./dist/social/data.d.ts","import":"./dist/social/data.js","require":"./dist/social/data.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"9e593d6b601e01dd77143d063260d6be4ed9adb5","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.9.0","vitest":"^4.1.11","globals":"^17.11.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.5.10","@eslint/js":"^10.0.1","playwright":"^1.62.1","typescript":"^5.3.0","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^4.1.11","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.48.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.5.10","@storybook/addon-docs":"^10.5.10","@storybook/react-vite":"^10.5.10","@storybook/addon-themes":"^10.5.10","@storybook/addon-vitest":"^10.5.10","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^4.1.11","storybook-addon-pseudo-states":"^10.5.10"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true},"@phosphor-icons/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.9.0_1788835842156_0.6923971607472903","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@eduardoalvarez/arrecife","version":"0.10.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.10.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"277238ca1306374cd30dda5dd3cc69c64dcbab15","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.10.0.tgz","fileCount":75,"integrity":"sha512-9kqhi/ZsL/3z9fZHp8c+8Yow6CY8B+cgyqrAKrZszydL5GOasgN/i8lIIkFlBA1r39OqidaTFhu/6bfBX7iKFg==","signatures":[{"sig":"MEYCIQC8NVjvvaG4II/c6TRII3Mz4ftoFGfBytRbQrkwzNSuywIhAO/E0EB6UzEQ6lnalJX7KeehXyji4/I74HqUNGZCiUdM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDNmbEJDHVCZwbkWah03kgoxJMvQmVf8ZxiUTVTHdCGbAiEAjNCDNAPbk1p6yAhDgIJAanBvXe06ZCCKS+dN/A+ElLo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1832188},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"9677bc86f13d3ae4998b769eca362e5b5acd3169","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.10.0","vitest":"^5.0.0","globals":"^17.12.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.6.0","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^6.0.3","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^5.0.0","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.7","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.69.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.6.0","@storybook/addon-docs":"^10.6.0","@storybook/react-vite":"^10.6.0","@storybook/addon-themes":"^10.6.0","@storybook/addon-vitest":"^10.6.0","eslint-plugin-storybook":"10.6.0","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^5.0.0","storybook-addon-pseudo-states":"^10.6.0"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.10.0_1788949902648_0.4846005232434094","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@eduardoalvarez/arrecife","version":"0.11.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.11.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"aa0c4f4bf85db58a0d7819f2f35b2a721157dfbf","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.11.0.tgz","fileCount":75,"integrity":"sha512-hcSlmsdCn+mhckqK2jUrqUcWq8Civu7dRl9P7WTipCaSE2OjU95v8yaZ/bIRLHFO1FXqShkZAwedh3Gm8rswPg==","signatures":[{"sig":"MEUCIQChCktRAac8EPqJpgw5Nmkvw3s5aH/kCB+SYdAiCHHmPQIgU7nJQZVd0aZSzET0iLYYwaJihcaAt+FvIp7BwChrWrQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCMe1A8jnP00AFN/nbKXpXiO3kMMJ4GYE69WKeytyAeeQIhAOq1RvnYxGsooHlZc5wkuLphibObPVIOmhg3ortsabuj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1853833},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"662ec08f2b4579fd38f8ed174f5851ac2e001a0a","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.10.0","vitest":"^5.0.0","globals":"^17.12.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.6.0","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^6.0.3","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^5.0.0","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.7","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.69.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.6.0","@storybook/addon-docs":"^10.6.0","@storybook/react-vite":"^10.6.0","@storybook/addon-themes":"^10.6.0","@storybook/addon-vitest":"^10.6.0","eslint-plugin-storybook":"10.6.0","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^5.0.0","storybook-addon-pseudo-states":"^10.6.0"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.11.0_1789093037469_0.761299682193247","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@eduardoalvarez/arrecife","version":"0.12.0","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.12.0","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"724d5e8a266bc28475068bb2f8722aeaa61c627f","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.12.0.tgz","fileCount":75,"integrity":"sha512-O6qb7Rngg3XVTf+o3mdgOOz/GpAeCeH12x0falIKBC0Hp2EJuvpaet9+IQYobMIR8K/BOvNeTFilQkLQ6w36Qg==","signatures":[{"sig":"MEQCIB8MB784i2+i2ZdB+vLuxQJk+z4WsPBBvPctjB34Ed8WAiBC7EOe0a5qPxeSPNKDtRqbBhZOhNKTGeUEYNPx7utDuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD+iO/nHUdzoYiD1WFH+TLhLIAQBRBzSfwWid7FPGrQEQIhAKA7Pu/hZwTMywJf0o3Yyqhh6rJRm7D3gOTIMMkyMLaO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1866621},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"109be3bede8c1164d710097b3b6aac5b2cab6d15","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.10.0","vitest":"^5.0.0","globals":"^17.12.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.6.0","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^6.0.3","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^5.0.0","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.7","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.69.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.6.0","@storybook/addon-docs":"^10.6.0","@storybook/react-vite":"^10.6.0","@storybook/addon-themes":"^10.6.0","@storybook/addon-vitest":"^10.6.0","eslint-plugin-storybook":"10.6.0","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^5.0.0","storybook-addon-pseudo-states":"^10.6.0"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.12.0_1789246186663_0.6646027277624915","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"@eduardoalvarez/arrecife","version":"0.12.1","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.12.1","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"e4b4b8c1e7a08dbedf74d5b3f5215dcbe2b31b46","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.12.1.tgz","fileCount":75,"integrity":"sha512-6Qb3FNHX+FLbiJBoI0Me20gM85q8E6vwwv8gj6aVyxHds++bUh+BYXkQLyM8MZ7MuzT+HSeLPfWn23kDj6MAEA==","signatures":[{"sig":"MEUCIH8rN5ssLKf/W+F3T29UnQXzrhMbsvHrK4jalEA5PzJ6AiEA/D6lv82O0FJcKbo9EUy7rt3WjjNqC0Ic58bj5kZa8do=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICAb/ipnDRn/JUG+NI3Oz0TTchYvi1tU+IIhEjSllhORAiAa321yd1pWt9tXcMDsaA6c3jMqhm2SqHJztW03R4KU1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.12.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1867101},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"c204d78cbf4524e5664f4dfd1a4cfec7b04c83ac","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.0.2","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.20.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.10.0","vitest":"^5.0.0","globals":"^17.12.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.6.0","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^6.0.3","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^5.0.0","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.7","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.69.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.6.0","@storybook/addon-docs":"^10.6.0","@storybook/react-vite":"^10.6.0","@storybook/addon-themes":"^10.6.0","@storybook/addon-vitest":"^10.6.0","eslint-plugin-storybook":"10.6.0","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^5.0.0","storybook-addon-pseudo-states":"^10.6.0"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.12.1_1789618089957_0.46706052219055505","host":"s3://npm-registry-packages-npm-production"}},"0.12.2":{"name":"@eduardoalvarez/arrecife","version":"0.12.2","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.12.2","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"261fda9ae0d80395224552812c172ad85c962244","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.12.2.tgz","fileCount":75,"integrity":"sha512-8vK18Ni3Hc7ukTx4Bh10FfeQMORrADDpJcu2w4QqFcH1sA3x5NrWUEWvm2h/Bi6uWsjnEGtfdsV+U3XGOF5+Zg==","signatures":[{"sig":"MEYCIQDzFvEEVWeo6ykfEoFre0llU8TgNT5CdX+hXEZdh6oNAwIhAIKV8iKbK2ABvTy1LpRrWDwftfJMtugAMa4W5esC7UgS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBg5fUtd5YUHAcDyj4ahnw/PzQNv1pfCIaEJ+d9F82hhAiAmW+96+c2Y+BnNkHmdLmFamxekfGIrvqL1gL3/WXmmBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.12.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1867455},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"9a751d0a9562a2faf954d5f773194ffa9bab2544","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.1.0","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.21.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.10.0","vitest":"^5.0.0","globals":"^17.12.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.6.0","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^6.0.3","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^5.0.0","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.7","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.69.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.6.0","@storybook/addon-docs":"^10.6.0","@storybook/react-vite":"^10.6.0","@storybook/addon-themes":"^10.6.0","@storybook/addon-vitest":"^10.6.0","eslint-plugin-storybook":"10.6.0","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^5.0.0","storybook-addon-pseudo-states":"^10.6.0"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.12.2_1790187061554_0.18046951303204106","host":"s3://npm-registry-packages-npm-production"}},"0.12.3":{"name":"@eduardoalvarez/arrecife","version":"0.12.3","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.12.3","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"e63576836ef932c39aaab8ec6932cefb983f8fda","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.12.3.tgz","fileCount":75,"integrity":"sha512-Hun44yi5OHWyXOTclZSXX0Q4bTCBulSPhrUGYRX4ZP12aSs90484HO9P2NTcxUqqNAKwJdTSmXVEZLAsq/5Gtw==","signatures":[{"sig":"MEQCIHs9ezzktLrKz767xs2ehiUzR6IaXr6LHTkf0Tqjqt9rAiAxhHaZ8OZF6J6GOwzvPUji/L95saFJ4a+wZnO/s0YFaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDYISXQ8dgdXJsyCZTILSIqt3554a/zWez1WhAKTEAs3gIgfqomTIPOTVJqXLFvXf4I4QxAwUQufqV7sx8AF2yiPPY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.12.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1878261},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"b455afd12ac6b2d5641f0c1a85e8d62da729f04f","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.1.0","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.21.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.10.0","vitest":"^5.0.0","globals":"^17.12.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.6.0","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^6.0.3","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^5.0.0","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.7","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.69.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.6.0","@storybook/addon-docs":"^10.6.0","@storybook/react-vite":"^10.6.0","@storybook/addon-themes":"^10.6.0","@storybook/addon-vitest":"^10.6.0","eslint-plugin-storybook":"10.6.0","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^5.0.0","storybook-addon-pseudo-states":"^10.6.0"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.12.3_1790225022144_0.08889993137492813","host":"s3://npm-registry-packages-npm-production"}},"0.12.4":{"name":"@eduardoalvarez/arrecife","version":"0.12.4","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","_id":"@eduardoalvarez/arrecife@0.12.4","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"homepage":"https://arrecife.eduardoalvarez.dev","bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"bin":{"arrecife":"dist/doctor.mjs"},"dist":{"shasum":"2de0e66a5a26e83a340910976dd93d23fd21bf16","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.12.4.tgz","fileCount":75,"integrity":"sha512-6HnF2MOtZaaCpk34vKLYte/JQV+zLoEGEGVNsD2H9F84IAsvb3ZHfo61XfirzewHxfLsAgV0gT8B5eD73hEigA==","signatures":[{"sig":"MEQCIDF+8VHNv2QJAMbrL0PgRij11WZeyslnq5m98enVnParAiAv007FOjP5GiVdIQbctduK9U3YvRrHPSvbnQGsepMgmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCxJAZYvQG8t6KyYwcWrNKnk9BdodZvlaXfJBZgAspKyQIhALy5noQDbqq+QCA+EwLAu1w8vQ36QipzEjBoSpMUpwDq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.12.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1880190},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"21dfdf6f3512737c9757a64781b9d536ea56be39","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4180d490-b53d-4bf4-890d-dbf4a5693698"}},"repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.1.0","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.21.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.6.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.2.2","react":"^19.2.0","eslint":"^10.10.0","vitest":"^5.0.0","globals":"^17.12.0","recharts":"^3.10.1","react-dom":"^19.2.0","storybook":"^10.6.0","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^6.0.3","tailwindcss":"^4.3.3","@types/react":"^19.2.0","@vitest/browser":"^5.0.0","react-hook-form":"^7.87.0","@types/react-dom":"^19.2.7","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.69.0","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.6.0","@storybook/addon-docs":"^10.6.0","@storybook/react-vite":"^10.6.0","@storybook/addon-themes":"^10.6.0","@storybook/addon-vitest":"^10.6.0","eslint-plugin-storybook":"10.6.0","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^5.0.0","storybook-addon-pseudo-states":"^10.6.0"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/arrecife_0.12.4_1790256723275_0.14497098435435962","host":"s3://npm-registry-packages-npm-production"}},"0.12.5":{"_id":"@eduardoalvarez/arrecife@0.12.5","bin":{"arrecife":"dist/doctor.mjs"},"bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"dist":{"shasum":"85727d36fc4e8d832b92d181524408cbaa3722ac","tarball":"https://registry.npmjs.org/@eduardoalvarez/arrecife/-/arrecife-0.12.5.tgz","fileCount":75,"integrity":"sha512-Dq2j43lSANeBHWPlsCqP7hw90IDVc8UW4gDKGRsl1nn+/PFzvn34x+D/vJpC73C90UZfIVuecRCEcExGRLC+HQ==","signatures":[{"sig":"MEYCIQCrneDEgB9D49KE4RRIXb6gCyynFg5uBsM2qNOhchtiiAIhAMZukhYrReEzIhk36rqpICeQ2GQesvaVrNgci3vD8Ypr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC/MKkCNokF3zXDLauTzT61YNLSKmtDuq1lVVam2+QUaQIgFt5qBbP2y1UdBbyhZZdTMrWRypOLEZg6rEUItMtb/pQ="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eduardoalvarez%2farrecife@0.12.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1880525},"main":"./dist/index.cjs","name":"@eduardoalvarez/arrecife","type":"module","types":"./dist/index.d.ts","author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"module":"./dist/index.js","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./og":{"types":"./dist/og/index.d.ts","import":"./dist/og/index.js","require":"./dist/og/index.cjs"},"./form":{"types":"./dist/form/index.d.ts","import":"./dist/form/index.js","require":"./dist/form/index.cjs"},"./brand":{"types":"./dist/brand/index.d.ts","import":"./dist/brand/index.js","require":"./dist/brand/index.cjs"},"./chart":{"types":"./dist/chart/index.d.ts","import":"./dist/chart/index.js","require":"./dist/chart/index.cjs"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.js","require":"./dist/icons/index.cjs"},"./shiki":{"types":"./dist/shiki/index.d.ts","import":"./dist/shiki/index.js","require":"./dist/shiki/index.cjs"},"./theme":{"types":"./dist/theme/index.d.ts","import":"./dist/theme/index.js","require":"./dist/theme/index.cjs"},"./tokens":{"types":"./dist/tokens/index.d.ts","import":"./dist/tokens/index.js","require":"./dist/tokens/index.cjs"},"./assets/*":"./assets/*","./llms.txt":"./llms.txt","./variants":{"types":"./dist/variants/index.d.ts","import":"./dist/variants/index.js","require":"./dist/variants/index.cjs"},"./package.json":"./package.json","./tokens/theme.css":"./dist/tokens/theme.css"},"gitHead":"ceb56e730bb5a24576b320ebe0470e160f72ab92","license":"MIT","scripts":{"lint":"eslint .","test":"pnpm test:unit && pnpm test:dark && pnpm test:light","build":"pnpm check:tokens && pnpm check:namespace && tsup && node scripts/add-use-client.mjs && pnpm build:tokens && pnpm build:doctor && pnpm build:llms","doctor":"node scripts/doctor.mjs","storybook":"pnpm build:tokens && storybook dev -p 6006","test:dark":"vitest run --project storybook","test:unit":"vitest run --project unit","typecheck":"tsc --noEmit","build:llms":"node scripts/build-llms.mjs","check:copy":"node scripts/check-copy-language.mjs","check:llms":"node scripts/build-llms.mjs --check","test:light":"STORYBOOK_THEME=light vitest run --project storybook","test:watch":"vitest --project storybook","build:doctor":"node scripts/build-doctor.mjs","build:tokens":"node scripts/build-tokens.mjs","check:tokens":"node scripts/check-tokens-purity.mjs","check:exports":"node scripts/check-package-exports.mjs","check:release":"node scripts/check-release-config.mjs","prepublishOnly":"pnpm build","build-storybook":"pnpm build:tokens && storybook build","check:decisions":"node scripts/check-decisions.mjs","check:namespace":"node scripts/check-tokens-namespace.mjs"},"version":"0.12.5","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"4180d490-b53d-4bf4-890d-dbf4a5693698"}},"homepage":"https://arrecife.eduardoalvarez.dev","repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"_npmVersion":"12.1.0","description":"The component library of Eduardo Álvarez’s visual identity","directories":{},"maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"sideEffects":["**/*.css"],"_nodeVersion":"24.21.0","dependencies":{"clsx":"^2.1.1","date-fns":"^4.4.0","tailwind-merge":"^3.7.0","react-day-picker":"^10.0.1","@radix-ui/react-slot":"^1.3.3","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-label":"^2.1.15","@radix-ui/react-toast":"^1.2.23","@radix-ui/react-avatar":"^1.2.6","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-select":"^2.3.7","@radix-ui/react-switch":"^1.3.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-tooltip":"^1.2.16","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-progress":"^1.1.16","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-separator":"^1.1.15","@radix-ui/react-radio-group":"^1.4.7","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-dropdown-menu":"^2.1.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsup":"^8.5.1","vite":"^8.3.1","react":"^19.3.0","eslint":"^10.11.0","vitest":"^5.0.2","globals":"^17.12.0","recharts":"^3.10.1","react-dom":"^19.3.0","storybook":"^10.6.0","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^6.0.3","tailwindcss":"^4.3.3","@types/react":"^19.3.0","@vitest/browser":"^5.0.2","react-hook-form":"^7.89.0","@types/react-dom":"^19.2.7","@tailwindcss/vite":"^4.3.3","typescript-eslint":"^8.70.1","@phosphor-icons/react":"^2.1.10","@storybook/addon-a11y":"^10.6.0","@storybook/addon-docs":"^10.6.0","@storybook/react-vite":"^10.6.0","@storybook/addon-themes":"^10.6.0","@storybook/addon-vitest":"^10.6.0","eslint-plugin-storybook":"10.6.0","eslint-plugin-react-hooks":"^7.0.0","@vitest/browser-playwright":"^5.0.2","storybook-addon-pseudo-states":"^10.6.0"},"peerDependencies":{"react":"^19.0.0","recharts":"^3.0.0","react-dom":"^19.0.0","react-hook-form":"^7.0.0","@phosphor-icons/react":"^2.1.0"},"peerDependenciesMeta":{"recharts":{"optional":true},"react-hook-form":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/arrecife_0.12.5_1790712775916_0.9704684982761205"}}},"time":{"created":"2026-08-27T08:17:31.875Z","modified":"2026-09-29T20:12:56.399Z","0.1.0":"2026-08-27T08:17:32.362Z","0.1.1":"2026-08-27T08:31:19.316Z","0.2.0":"2026-08-27T09:39:36.808Z","0.3.0":"2026-08-31T01:47:31.581Z","0.4.0":"2026-08-31T13:35:23.029Z","0.5.0":"2026-08-31T21:32:10.046Z","0.5.1":"2026-09-01T01:31:43.802Z","0.6.0":"2026-09-02T20:41:08.368Z","0.7.0":"2026-09-04T14:40:55.123Z","0.8.0":"2026-09-06T19:06:04.746Z","0.9.0":"2026-09-08T02:50:42.316Z","0.10.0":"2026-09-09T10:31:42.790Z","0.11.0":"2026-09-11T02:17:17.588Z","0.12.0":"2026-09-12T20:49:46.769Z","0.12.1":"2026-09-17T04:08:10.113Z","0.12.2":"2026-09-23T18:11:01.693Z","0.12.3":"2026-09-24T04:43:42.271Z","0.12.4":"2026-09-24T13:32:03.392Z","0.12.5":"2026-09-29T20:12:56.019Z"},"bugs":{"url":"https://github.com/Proskynete/arrecife/issues"},"author":{"name":"Eduardo Esteban Álvarez Castañeda","email":"soy@eduardoalvarez.dev"},"license":"MIT","homepage":"https://arrecife.eduardoalvarez.dev","repository":{"url":"git+https://github.com/Proskynete/arrecife.git","type":"git"},"description":"The component library of Eduardo Álvarez’s visual identity","maintainers":[{"name":"eduardoalvarez","email":"soy@eduardoalvarez.dev"}],"readme":"# Arrecife\n\nThe component library of Eduardo Álvarez's visual identity.\n`@eduardoalvarez/arrecife` · React 19 · TypeScript · shadcn/ui · Storybook · tsup.\n\nPublished Storybook: [arrecife.eduardoalvarez.dev](https://arrecife.eduardoalvarez.dev).\n\n## The identity documents\n\n`docs/architecture/design-system.md` and `docs/architecture/brand-manual.md` are the extraction of the two\nClaude Design canvases, kept in the repo so they can be grepped and versioned.\nThe canvas is still the source; this is the consultable copy.\n\nThey are here for a concrete reason: the highlighting palette lived hand-written\nin a project with a `#E05252` that this README has declared wrong for months, and\nnobody saw it because the document was not greppable from the code.\n\n`docs/decisions/` is the other half: the points where the code and the document\ndo not say the same thing, each with its resolution and its reason. One file per\ndecision, named for its number — `045-signature-halo.md` — so a «§ 45» written\nin a comment, a commit or a PR resolves by sorting the folder, and no reference\nhas to carry a version.\n\n## The two documents for agents\n\n`AGENTS.md` is for an agent working **in this repo**: how a component is created,\nwhich rules it cannot break and where each one is verified. `CLAUDE.md` is a\nsymlink to that file, so Claude, Codex and Cursor all read the same text.\n\n`llms.txt` is for an agent working in one of the **five projects that consume**\nthe library. That agent never sees this repo: it sees\n`node_modules/@eduardoalvarez/arrecife/`, which is why `llms.txt` travels in the\ntarball and is declared in `exports`.\n\nThe component and prop inventory in `llms.txt` is not written by hand:\n`scripts/build-llms.mjs` extracts it from the TypeScript compiler, and\n`pnpm check:llms` fails in CI if somebody changes a prop and does not regenerate\nit. The prose lives in `docs/llms.template.md`. It is the same decision as the\ntokens: one source, a generated output, and a check that stops them disagreeing.\n\n## The constraint that outranks everything else\n\n`src/tokens/` imports nothing: not React, not components, not third-party CSS. It\nis the only subpackage the five projects can all consume, including an OG\ngenerator running on Satori and an Astro site that mounts no React. The moment a\ntoken depends on a component, the library has stopped being portable.\n\nIt is not documentation: `pnpm check:tokens` verifies it on every build and\nESLint says so in the editor.\n\n## Tailwind output\n\nOne source, `src/tokens/tokens.ts`. One generated output,\n`dist/tokens/theme.css`, with `@theme` for Tailwind v4. It is generated by\n`scripts/build-tokens.mjs`; it is not edited by hand and it is regenerated on\nevery build.\n\nThe block is `@theme static`, so **every token reaches `:root` whether or not a\nclass asks for it** — you can read any of them with `var(--color-…)` from your\nown JavaScript or an inline style and it will be there. That is one word and it\nis a bug fix: Tailwind v4 emits a theme variable only when some generated\nutility uses one, and the four `--color-series-*` are read by `seriesColor()`\nthrough `var()` and requested by no class anywhere, so they were being dropped\nas unused and the charts drew black on a dark page with nothing erroring. It\ncosts +234 B gzipped for a project using the system's whole vocabulary, and the\nceiling is the token set. See `docs/decisions/` § 61.\n\nPhase 0 decision: **v4 only**. The portfolio (`eduardoalvarez.dev`) migrates from\nTailwind v3 to v4 before consuming Arrecife. If that migration slips, publishing\nthe v3 preset again is one more emitter in `build-tokens.mjs` reading the same\n`tokens` object: the source does not change.\n\n### Consuming it\n\n```css\n@import \"tailwindcss\";\n@import \"@eduardoalvarez/arrecife/tokens/theme.css\";\n```\n\nDark mode is primary and it is the default. A project in light mode declares\n`data-theme=\"light\"` on `<html>`; a dark one declares nothing.\n\n**If you are also going to use components, one line is missing, and without it\nnothing fails.** Tailwind does not scan `node_modules`, so it purges every class\nthe components emit: `border-hairline`, `rounded-pill` and `p-step-lg` resolve to\nnothing. There is no console error, no build warning, no undefined class — the\ncard simply comes out with a `currentColor` border and the pill comes out square.\n\n```css\n@import \"tailwindcss\";\n@import \"@eduardoalvarez/arrecife/tokens/theme.css\";\n\n/* Without this, the components mount with none of the system's styles. */\n@source \"../node_modules/@eduardoalvarez/arrecife/dist\";\n```\n\nThe path is relative to the CSS file the directive lives in, so in a project with\nthe sheet in `src/styles/` it goes up two levels and not one. The blog's E2E\ntests caught it, not the build, and until 0.3.0 this was only written in\n`llms.txt` — the file an agent reads and a person does not.\n\n### `npx arrecife` — the two things that fail without saying so\n\n```\nnpx arrecife\n```\n\nIt reads your stylesheets and checks the two failures that produce no error, both\nof which cost real hours in the migration:\n\n**The missing `@source`**, above. It also works out the path for you, counted\nfrom the sheet and not from the project root, which is the part that gets written\nwrong.\n\n**A token of yours redefining one of ours.** A project coming from shadcn brings\n`@theme inline { --color-accent: var(--accent); }`, and the two are not the same\ncolour: shadcn's `--accent` is the hover **surface**, `#17303E`, and this\nlibrary's is the brand turquoise, `#35D6C0`. The result was **88 classes inside\nthe library's own components** painting grey — 28 `text-accent`, 26 focus rings,\n15 `bg-accent`, 12 `border-accent`. Buttons, focus rings and badges came out the\ncolour of a surface and it looked as though the migration had done nothing. (The\ntwenty-six are one `focus-ring` utility now, which changes the count and not the\nfailure: it reads `var(--color-accent)` like everything else here.)\n\n```\narrecife · 2 thing(s) that fail without saying so:\n\n  src/styles/globals.css\n    imports @eduardoalvarez/arrecife/tokens/theme.css and has no @source.\n    Every class the components emit is being purged — silently. Add:\n\n      @source \"../../node_modules/@eduardoalvarez/arrecife/dist\";\n\n  src/styles/globals.css\n    redefines --color-accent, which @eduardoalvarez/arrecife owns.\n      yours:    var(--accent)   ← points at another property, so it wins silently\n      arrecife: #35D6C0\n```\n\nFive names collide with shadcn's — `background`, `border`, `warm`, `warm-hover`\nand `accent`. Four are harmless because both sides happen to agree on the value,\nso the command reports the value on each side and only fails on the ones that\ndiffer. A collision that agrees is worth knowing about and is not worth failing\nover.\n\n> **Coming from 0.9.0.** Two breaks and they are the same one twice: the library\n> stopped drawing icons of its own. `@phosphor-icons/react` becomes a REQUIRED\n> peer dependency — even if your project draws no icons, the `Alert` and the\n> `Select` you import do — and `./social` and `./social/data` are removed.\n> Phosphor has all ten marks and `tsc` points at every call site; the mapping\n> table is in the runbook.\n>\n> Everything else is additive and asks nothing of you: the footer centres itself\n> on a phone, `Nav` and `TabsList` scroll instead of pushing the page sideways,\n> `Pagination` wraps, `Toast` carries a real colour again, `Alert`'s four mono\n> characters become Phosphor marks, and `ThemeToggle` toggles without\n> `onThemeChange` — which was a genuine bug.\n>\n> Run `npx arrecife` first, then read\n> [`docs/runbooks/migration-0.10.md`](docs/runbooks/migration-0.10.md).\n\n> **Coming from 0.7.0.** Four breaks, and three of them are things the library\n> takes back OUT because nothing in the four projects drew them: the `caret`\n> utility, the footer's row of loose text links, and `SidebarNav`.\n>\n> Only one fails at compile time — `Footer` no longer takes `children` — and that\n> is the one to look at first. The other three fail silently or not at all: the\n> `Table` wrapper you no longer need gives you two borders, and a hand-written\n> `motion-safe:caret` just stops animating.\n>\n> Everything else is additive: `Footer variant=\"full\"` with columns, three chart\n> shapes, `./social/data` for a project that mounts no React, and a `Website`\n> glyph. Both `./social` subpaths were removed again in 0.10.0.\n>\n> Run `npx arrecife` first, then read\n> [`docs/runbooks/migration-0.8.md`](docs/runbooks/migration-0.8.md).\n\n> **Coming from 0.6.0.** One break, and it is a find and replace the type checker\n> points at: `Stat`'s `tone=\"alerta\"` is `tone=\"alert\"`.\n>\n> Everything else is additive, and most of it lets a project delete something it\n> was maintaining by hand: `./social` and `./icons` are two new subpaths,\n> `EmptyState` has a shape with no face, `Stat` covers the KPI cards, and\n> `npx arrecife` catches two failures that produce no error at all.\n>\n> Run `npx arrecife` first, then read\n> [`docs/runbooks/migration-0.7.md`](docs/runbooks/migration-0.7.md).\n\n> **Coming from 0.5.x.** Two unrelated things landed in 0.6.0, and they ship\n> together because in `0.x` a breaking change bumps the minor.\n>\n> The whole public API moved to English: `./tema` is now `./theme`, `scriptTema`\n> is `themeScript`, `Red` is `SocialLink`, the `degradado-hero` utility is\n> `gradient-hero`, and `Hero`'s `variant=\"cabecera\"` is `variant=\"header\"`.\n>\n> And three things break on the API side: `themeScript` is a function, the root\n> ships `\"use client\"`, and `TalkCardProps` is a union. All three break loudly —\n> the type checker catches every one at the call site.\n>\n> Both halves, in order, with the full rename table and what each project can now\n> **delete**: [`docs/runbooks/migration-0.6.md`](docs/runbooks/migration-0.6.md).\n\n> **Coming from 0.4.0 or earlier.** `Toast`, `ToastProvider`, `ToastViewport`,\n> `ToastTitle` and `ToastDescription` stopped being public API in 0.5.0: you use\n> `Toaster` and `toast()`. `ToastAction` stays. The migration, with the reasoning\n> and the examples, is in [`docs/runbooks/migration-0.5.md`](docs/runbooks/migration-0.5.md).\n\n> **Coming from 0.2.0 or earlier.** The five spacing steps were renamed: `p-md`\n> is now `p-step-md`, `gap-sm` is `gap-step-sm`. It is a breaking change, and if\n> your project uses `max-w-sm`, `max-w-md` or `max-w-lg`, those were also worth\n> 12, 16 and 26px with nothing saying so. The reasoning, the migration pattern\n> and what to check afterwards are in\n> [`docs/runbooks/migration-0.3.md`](docs/runbooks/migration-0.3.md).\n\nThe font families are declared by name. Each project loads Bricolage Grotesque,\nGeist and JetBrains Mono however it prefers: the library does not dictate how.\n\n**The names have to match EXACTLY**, and this has already bitten twice. The\ntokens declare the families like this:\n\n| Token | `font-family` it declares | Utility |\n| --- | --- | --- |\n| `fonts.display` | `\"Bricolage Grotesque\"` | `font-display` |\n| `fonts.sans` | `\"Geist\"` | `font-sans` |\n| `fonts.mono` | `\"JetBrains Mono\"` | `font-mono` |\n\nA project registering its `@font-face` as `\"Bricolage Grotesque Variable\"` or\n`\"Geist Variable\"` — the name several font packages publish them under — is\n**not** loading what the tokens ask for: the display and the mono fall back to\nthe system font, silently and with no console warning. It is exactly what\nhappened in two of the five projects.\n\nThe `@font-face`'s `family` is an alias the project chooses, so the fix is to\ndeclare it with the name the token asks for:\n\n```css\n@font-face {\n  font-family: \"Bricolage Grotesque\"; /* NOT \"Bricolage Grotesque Variable\" */\n  src: url(\"/fonts/bricolage-grotesque.woff2\") format(\"woff2-variations\");\n  font-weight: 200 800;\n  font-display: swap;\n}\n```\n\n#### In Next, with `next/font`\n\nIt is the same failure through another door, and it bites both Next projects.\n`next/font` registers each family under a GENERATED name — `__Geist_a1b2c3` — and\nexposes it as a custom property; the literal `\"Geist\"` the tokens declare exists\nin no `@font-face` on the page.\n\nImporting `theme.css` overwrites `--font-sans` with that literal, and all three\nfamilies fall back to the system font. Silently: there is no 404, because the\nfont did load — under another name.\n\nThe fix is to reassert all three AFTER the import, pointing at the variables\n`next/font` generates:\n\n```ts\n// app/fonts.ts\nimport { Geist, Bricolage_Grotesque, JetBrains_Mono } from 'next/font/google';\n\nexport const sans = Geist({ subsets: ['latin'], variable: '--project-sans' });\nexport const display = Bricolage_Grotesque({ subsets: ['latin'], variable: '--project-display' });\nexport const mono = JetBrains_Mono({ subsets: ['latin'], variable: '--project-mono' });\n```\n\n```css\n@import \"tailwindcss\";\n@import \"@eduardoalvarez/arrecife/tokens/theme.css\";\n@source \"../node_modules/@eduardoalvarez/arrecife/dist\";\n\n/* After the import, or the literal that is not loaded wins. */\n@theme {\n  --font-sans: var(--project-sans), ui-sans-serif, system-ui, sans-serif;\n  --font-display: var(--project-display), ui-sans-serif, system-ui, sans-serif;\n  --font-mono: var(--project-mono), ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n```\n\nThe variables are called `--project-*` and not `--font-*` on purpose:\n`--font-sans` is the name Tailwind uses for ITS token, and handing it to\n`next/font` leaves the two layers fighting over the same property.\n\nEach family's `variable` goes on the `<html>` class, as Next asks:\n`className={`${sans.variable} ${display.variable} ${mono.variable}`}`.\n\n### Token-to-utility map\n\n| Token | Custom property | Utility |\n| --- | --- | --- |\n| `colors[mode].surfaceRaised` | `--color-surface-raised` | `bg-surface-raised` |\n| `brand.hull` | `--color-brand-hull` | `bg-brand-hull` |\n| `typeScale.h1` | `--text-h1` | `text-h1` (brings line-height, weight and tracking) |\n| `fonts.display` | `--font-display` | `font-display` |\n| `radius.card` | `--radius-card` | `rounded-card` |\n| `spacing.stepLg` | `--spacing-step-lg` | `p-step-lg`, `gap-step-lg`, `mb-step-lg` |\n| `spacing.section` | `--spacing-section` | `py-section`, `mb-section` |\n| `control.md` | `--spacing-control-md` | `px-control-md` (button padding) |\n| `control.icon` | `--spacing-control-icon` | `size-control-icon` (42×42 icon button) |\n| `gradient[mode].hero` | `--gradient-hero` | `gradient-hero` (a utility, follows the mode) |\n| `size.nav` | `--spacing-nav` | `h-nav` |\n| `size.content` / `size.wide` | `--container-content` / `--container-wide` | `max-w-content` / `max-w-wide` |\n| `limits.measure` | `--container-measure` | `max-w-measure` |\n| `shadow.standard` | `--shadow-standard` | `shadow-standard` |\n| `motion` | `--duration-standard`, `--ease-standard` | `duration-standard`, `ease-standard` |\n\nThe `light:` variant is available for the inverted light-mode cases.\n\nThe object can also be consumed in JS, with no CSS and no React — it is what the\nOG templates use:\n\n```ts\nimport { tokens } from '@eduardoalvarez/arrecife/tokens';\n```\n\nThe highlighting theme lives in another subpath for the same reason — it is\nconsumed from `astro.config.mjs`, not from a component:\n\n```ts\nimport { arrecife } from '@eduardoalvarez/arrecife/shiki';\n\nexport default defineConfig({\n  markdown: { syntaxHighlight: 'shiki', shikiConfig: { theme: arrecife } },\n});\n```\n\n**The library does not ship Shiki.** The projects already highlight at build time\nwith their own tooling; what they were missing was not a highlighter, it was the\ntheme. `CodeBlock` still receives the code already highlighted, which is what it\nis written for.\n\nThe OG templates are published in their own subpath for the same reason: a\ngenerator runs in a worker or in a build script and must not drag in React or a\nsingle component.\n\n```ts\nimport satori from 'satori';\nimport { articleTemplate, OG } from '@eduardoalvarez/arrecife/og';\n\nconst svg = await satori(articleTemplate({ title, date, readingMinutes }), {\n  width: OG.width,   // 1200\n  height: OG.height, // 630\n  fonts: [...],\n});\n```\n\nThey are pure functions returning the tree Satori paints, built only from tokens.\n`dist/og/index.js` mentions React on no line, and that is checkable with a grep.\n\n## How it is used from a project\n\n```tsx\nimport { Text, Button, Badge, cn } from '@eduardoalvarez/arrecife';\nimport type { TextProps } from '@eduardoalvarez/arrecife';\n\n<Text variant=\"eyebrow\" tone=\"muted\">charlas</Text>\n<Text as=\"h2\" variant=\"h1\">Entender antes de construir</Text>\n<Text variant=\"body\">Clamps itself to 68ch.</Text>\n<Text variant=\"ui\" measure={false}>No clamp, for a narrow cell.</Text>\n```\n\nEvery component publishes its documentation page in Storybook with the props\ntable generated from the types. `Text`'s:\n\n| prop | type | default |\n| --- | --- | --- |\n| `variant` | `display · stat · h1 · h2 · h3 · body · lead · ui · label · tag · meta · chip · eyebrow` | `body` |\n| `tone` | `primary · secondary · muted · accent · warm · success · warning · error` | `primary` |\n| `as` | `h1 · h2 · h3 · h4 · p · span · strong · em · figcaption · caption · legend · dt · dd · li` | per `variant` |\n| `measure` | `boolean` — clamps to 68ch | `true` on `body` |\n| `asChild` | `boolean` — renders the child, to wrap a link | `false` |\n\nVerified by packing the library with `pnpm pack` and installing it in a separate\nproject: the types resolve from `dist/`, `./tokens` loads without dragging React\nin and `./tokens/theme.css` resolves by subpath.\n\n### The social icons are yours too, and they come from Phosphor\n\nUntil 0.10.0 this section documented a catalogue of ten hand-drawn marks at\n`./social`, published a second time as shapes at `./social/data` for a consumer\nthat mounts no React. Both are gone.\n\n```tsx\n// ❌ removed in 0.10.0\nimport { GitHub, LinkedIn } from '@eduardoalvarez/arrecife/social';\nimport { social } from '@eduardoalvarez/arrecife';\n\n// ✅\nimport { GithubLogo, LinkedinLogo } from '@phosphor-icons/react';\nimport { Icon } from '@eduardoalvarez/arrecife/icons';\n\n<Icon as={GithubLogo} tone=\"current\" />\n```\n\n| Removed | Phosphor | `tone` |\n| --- | --- | --- |\n| `GitHub` | `GithubLogo` | `current` |\n| `LinkedIn` | `LinkedinLogo` | `current` |\n| `X` | `XLogo` | `current` |\n| `Instagram` | `InstagramLogo` | `current` |\n| `Discord` | `DiscordLogo` | `current` |\n| `YouTube` | `YoutubeLogo` | `current` |\n| `Rss` | `Rss` | `action` |\n| `Email` | `Envelope` | `action` |\n| `Newsletter` | `BellSimple` | `action` |\n| `Website` | `Globe` | `action` |\n\n**The `tone` column is the old drawing rule, not a new one.** Six are brands and\nwent SOLID, which is `tone=\"current\"` — Phosphor's `fill`. Four were functional\nand used the document's 1.6 stroke, which is the default `action`. Nothing about\nhow the row looks changed; what changed is who draws it.\n\n**Why they went, when the whole point of `./social/data` was that `links` had\npasted four `<path>`s by hand.** Because `links` left first. Its `Footer.astro`\nnow draws Phosphor through `astro-icon` and its own docstring lists the divergence:\n«every icon on the page — the six in the cards and the four here — is then one set\nat one weight». `eduardoalvarez.dev` did the same in `site-footer.tsx`. Two\nconsumers walking away from a subpath built for them is the library being out of\nstep, not the consumers. See `docs/decisions/` § 51.\n\n**In a Next Server Component, take the glyph from `@phosphor-icons/react/ssr`.**\n`./icons` carries no `\"use client\"` on purpose, so an icon renders on the server\nand ships no client JS. Phosphor's default build reads `IconContext` through\n`useContext` and a hook in a Server Component throws; the `/ssr` entry is the same\nicons without that read, and `Icon` works with either.\n\n**There are no internal glyphs left to not export.** `lib/glyphs.tsx` held\n`Close`, `ChevronDown`, `Copy`, `Sun` and fifteen others, and the rule was that\npublishing them would turn it into the icon library the system decided not to\nhave. The file is deleted: the primitives draw from Phosphor like everything else.\nA component that needs an icon still takes it as a prop — `Stat` receives `icon`,\n`Footer` receives each social link's `icon` — and the project passes\n`<Icon as={…} />`.\n\n### The icons are yours, the way they are drawn is not\n\nThat last sentence used to end there, and «its own what, drawn how» had no\nanswer. The admin panel imports 89 distinct icons in 229 places — 77 of them\ndomain icons for a course admin, which no design system was going to ship — and\ndrew them at `size-4` twenty-six times, plus `size-3.5`, `size-3`, `size-6` and\n`size-7`, with no rule behind any of them.\n\n```tsx\nimport { GraduationCap } from '@phosphor-icons/react';\nimport { Icon } from '@eduardoalvarez/arrecife/icons';\n\n<Icon as={GraduationCap} />\n```\n\n1em, so the icon takes the size of the text it sits in and nobody picks a number.\nWeight `regular` by default, and **that is the whole reason the set is\nPhosphor**: it bakes the weight into the path instead of exposing a\n`strokeWidth`, and its regular lands on the one stroke the identity document\nnames. Measured on the `Minus` path itself, whose regular form is a bar of radius\n8 on a 256 grid:\n\n| | Line | As a fraction of the rendered size |\n| --- | --- | --- |\n| phosphor `regular` | 16 on a 256 grid | **0.0625em** |\n| the document | 1.6 on a 24 grid | **0.0667em** |\n| `lib/glyphs.tsx`, until 0.10.0 | 1.75 on a 16 grid | 0.109em |\n\nSix per cent apart, which is no pixel on any screen. Nothing had to be derived and\nno number had to be invented. The `Icons/Icon` → `regular IS the document's\nstroke` story shows the bars so the claim can be checked instead of believed.\n\n**The third row is history now, and it is left in because it is the argument.**\n`glyphs.tsx` drew at 0.109em — three quarters heavier than both — and 0.7.0\nmeasured it, said so and left it alone, because aligning it restyles every\nprimitive in the library. 0.10.0 is that change: the file is gone and there is\none line in the system. See `docs/decisions/` § 51.\n\n**The weight is an axis with three values, and `tone` is how you name them.**\n`weight` is not a prop: Phosphor ships six and this system reads three, because\n`thin`, `bold` and `duotone` have no role behind them here.\n\n| `tone` | Weight | What it is |\n| --- | --- | --- |\n| `action` · the default | `regular` | An icon that is a control or names one |\n| `current` | `fill` | The one of a set you are on — the item carrying `aria-current` |\n| `quiet` | `light` | Furniture: a marker in a metadata row, not a control and not a state |\n\n`current` is the value that earns the axis, and the argument is not taste.\nAn active sidebar item already says so in biolume, and **colour on its own is the\none channel WCAG 1.4.1 says may not carry meaning** — the fill is the second\nchannel, and it is the one that survives a forced-colours mode where the biolume\ndoes not. `quiet` is the opposite problem: in a metadata row the icon is not the\npoint of the line, and at `regular` it draws as heavy as the date beside it.\n`docs/decisions/` § 35 has the rest.\n\n`@phosphor-icons/react` is an **optional** peer dependency on its own subpath, by\nthe same rule as `./form` and `./chart`: two of the five projects use no icons and\ninstall nothing.\n\n**An icon is not illustration.** Tiburoncín — the faces, the poses, the fin — is\nthe mascot, it comes from `./brand`, and the manual doses it by surface: a face\nonly in an empty state, a confirmation, an error, course progress or a\ncelebration. An icon is functional vocabulary and goes wherever a control needs a\nlabel it cannot spell. Adopting a set changed nothing about the first, and\nneither stands in for the other in either direction.\n\n**In Next, import from `@phosphor-icons/react/ssr` inside a Server Component.**\nPhosphor's default build reads `IconContext` through `useContext`, and a hook in a\nServer Component throws — and it ships no `\"use client\"` to stop you, so the\nfailure arrives at render. The `/ssr` entry is the same icons without the context\nread, and `Icon` works with either.\n\n### `\"use client\"` is in the published `dist`\n\nThe root, `./brand`, `./form` and `./chart` carry the directive. They render\nReact, and their Radix primitives call `createContext` at module scope: without\nit, a Next project with the App Router cannot import the library at all — it\nfails at build time with `TypeError: (0 , r.createContext) is not a function`.\nIt blocked `cursos` for a whole version, and the workaround there was a\n`\"use client\"` in every one of that project's own adapters, including a `Badge`\nthat is a `<span>` with no interaction. It cost 272 KB of client chunk.\n\nThe five portable subpaths do NOT carry it — `./tokens`, `./theme`,\n`./variants`, `./og` and `./shiki` — and that is the half that matters more.\nMarking them client would be a lie with a cost: a Server Component importing\n`buttonVariants`, a function that returns a string, would pull a client boundary\nin with it.\n\n`./icons` is the third case, and it is why the check stopped looking only at the\nportable ones. It renders React — it is one `<svg>` — so it can never be\nportable, and it holds no state, so it must not be a client entry either. Listed\nin neither set, nothing would have noticed it being marked client by mistake, and\nthat mistake undoes the only reason the subpath exists: an icon in a Server\nComponent with no client boundary opened for it.\n\nIt is stamped by `scripts/add-use-client.mjs` after tsup, and not by tsup's\n`banner`. That was tried first: esbuild writes the directive and the bundling\npass strips it back out with a `Module level directives cause errors when\nbundled` warning. The build stayed green and the published package was broken for\nNext — the worst way to fail, because the failure surfaces in somebody else's\nproject. `check:exports` now verifies it in both directions: present on the four\nclient entries, absent from every other subpath.\n\nIt is inert outside Next. In Astro and in plain Vite it is a string literal at\nthe top of a module; Rollup may warn and nothing else happens. One `dist` serves\nthe Next projects and the Astro ones, which is the constraint that decided the\nshape.\n\n### `./variants` — the class vocabulary without React\n\n```ts\nimport { buttonVariants, badgeVariants, CARD_SURFACE }\n  from '@eduardoalvarez/arrecife/variants';\n```\n\n`buttonVariants`, `badgeVariants` and `categoryBadgeVariants` are not\ncomponents: they are functions that return a string of classes. They touch\nneither React nor the DOM. They used to live inside the components, so importing\none dragged the whole library along, and that had a cost measured in two of the\nfive projects.\n\nIn `cursos` it forced a `\"use client\"` on an adapter whose entire content was one\ncall to CVA. In `links`, which depends on no React at all, it was not even an\noption: that project copied the class vocabulary by hand into `LinkRow.astro` and\n`Footer.astro`, and the copy had already drifted once: the hero gradient sat at\n`55%` and `#e9eeea` against the token's `60%` and, at the time, `#EFE9DE`, and\nnothing compared them. That light stop is `#FFFFFF` now — § 9 measured it — which\nis the same lesson seen from the other end. A copied value goes stale the moment\nthe original moves, and only the original is ever right.\n\nThe rule for what belongs in the subpath: if it returns classes, it goes there;\nif it returns markup, it stays in the component. `Button` renders a `<button>`,\nso it stays at the root; `buttonVariants` returns a string, so it is in\n`./variants`. The root re-exports all of it, so an existing\n`import { buttonVariants } from '@eduardoalvarez/arrecife'` keeps working — what\nthe subpath buys is not the name, it is not paying for React to get it.\n\n### The two subpaths that ask for a dependency\n\n`./form` and `./chart` do not hang off the root, and that is deliberate. Each\nasks for an **optional** peer dependency — `react-hook-form` and `recharts` — and\nhanging them off the main index would force all five projects to install them so\ntheir bundler could resolve an import four of them never execute.\n\nIt is the same decision as `./og` and `./shiki`, seen from the other side: there\nReact is kept out of the way of whoever does not mount it; here Recharts is kept\nout of the way of whoever does not draw.\n\n```tsx\nimport { Form, FormField, FormItem, FormLabel, FormControl, FormMessage }\n  from '@eduardoalvarez/arrecife/form';\n\nimport { ChartContainer, ChartTooltip, ChartTooltipContent, seriesColor }\n  from '@eduardoalvarez/arrecife/chart';\n\n// And the three chart types, which are what a project actually reaches for.\nimport { AreaChart, BarChart, LineChart } from '@eduardoalvarez/arrecife/chart';\n```\n\n`AreaChart`, `BarChart` and `LineChart` take `data`, `series` and `xKey` and draw\nthe whole thing. **They are not Recharts' components of the same name**, and the\ncollision is deliberate: what they replace is not an import, it is sixty lines of\ncomposition — a `linearGradient` with a hardcoded id, a `CartesianGrid\nvertical={false}`, two axes with the line and the tick off, a `type=\"natural\"`\nand a `strokeWidth` — which `cursos` wrote four times, once per chart. None of\nthat is a decision the project made. See `docs/decisions/` § 43.\n\nA chart of a quantity with a ceiling passes it: `valueMax={100}` on a percentage.\nWithout it the value axis ends at the largest datum, and a horizontal ranking —\nwhose value axis is hidden — draws a course watched to 40 % as a full bar. See\n`docs/decisions/` § 58.\n\n`seriesColor(i)` returns `var(--color-series-N)` and not a hexadecimal, so the\npalette follows the mode instead of freezing to whichever one was live when the\nchart mounted. **Do not add a fallback to it**: the variable is always in\n`:root`, because the token block is `@theme static` for exactly this reason. On a\nversion before that fix the `var()` resolved to nothing and the bars came out\nblack — see `docs/decisions/` § 61.\n\n`check:exports` verifies that the five portable ones — `./tokens`, `./theme`,\n`./variants`, `./og` and `./shiki` — bring no React into the published `dist/`,\n**by following the relative imports**. Without that the check was worthless: with `treeshake`\non, each portable entry ends up as two lines re-exporting from a\n`chunk-XXXX.js`, and a grep over those two lines finds no React even when the\nchunk imports it.\n\n## Scripts\n\n| | |\n| --- | --- |\n| `pnpm build` | verifies token purity, compiles with tsup and generates `theme.css` |\n| `pnpm typecheck` | `tsc --noEmit` |\n| `pnpm lint` | ESLint, including the ban on literal hexes outside `tokens.ts` |\n| `pnpm check:tokens` | fails if `src/tokens/` imports anything from outside |\n| `pnpm test` | compiles Tailwind and runs axe over the 248 stories, in both modes |\n| `pnpm check:exports` | verifies that `dist/` holds what `exports` promises |\n| `pnpm check:release` | validates `release-please-config.json` against the official schema |\n| `pnpm storybook` | generates the tokens and serves Storybook on 6006 |\n\n## Contrast as a test, not as a panel\n\n`pnpm test` mounts every story in a real Chromium and runs axe over it with\n`a11y: { test: 'error' }`. It runs twice, once per mode: a color only fails in\none of the two, so passing in dark proves nothing about light.\n\nIt is demonstrably not decorative: putting light `textMuted` back to its previous\nvalue takes down eight stories with «insufficient color contrast of 4.24».\n\nThere is exactly one disabled rule, in two specific stories and with the reason\nwritten beside it: `aria-hidden-focus` on open `Select`/`DropdownMenu`. Radix\nmarks everything outside the portal `aria-hidden` and leaves the trigger inside\nit still focusable; focus is trapped by its `FocusScope`, so it cannot be tabbed\nto. It is a known disagreement between axe and Radix.\n\n## Contrast corrections\n\nThe identity document measured everything against `background`. But\n`surfaceRaised` is the worst case in **both** modes: in light it is darker than\nthe page background, in dark it is lighter. It is where menus and active tabs\nlive.\n\n| token | before | now | reason |\n| --- | --- | --- | --- |\n| `light.textMuted` | `#6B7480` | `#626A75` | 4.24 did not reach AA over paper |\n| `light.warning` | `#9A6A12` | `#8D6111` | 4.23 did not reach AA over paper |\n| `dark.error` | `#E05252` | `#E15757` | 4.35 over `surface`, which is where a form error goes |\n\nAll three keep their exact hue and saturation: only lightness moves, by one to\nfour points. Light `accent` and `warm` are untouched.\n\nNew token: `hairlineHover` — `#2C4D5D` in dark (rule 6's value) and `#D3C8B2` in\nlight, derived by matching the perceptual step (ΔL\\* 10.5) rather than the\ncontrast ratio, which overshoots near white.\n\n`textMuted` never goes over `surfaceRaised`: in dark it gives 4.07. Menus use\n`textSecondary`, which gives 6.96.\n\n**And no gradient ends there either**, which is the same rule applied to a\nsurface that moves. The light `hero` and `section` blocks used to sweep from the\npage down onto `surfaceRaised`, where light `accent` reads **4.21** and `warm`\n**4.19** — both under 4.5, and both of them fine at 4.55 and 4.53 on the page\nthey started from. That makes a token's contrast a function of **where in the\npanel the text happens to sit**, which no token can guarantee and the suite\ncannot see: axe does not evaluate text over a gradient, so both modes passed it.\n`Hero` puts an `accent` eyebrow directly on that gradient.\n\nThe light blocks now sweep between `background` and `surface` and never touch\n`surfaceRaised`, so the darkest point of either one is the page itself — a token\nthat passes on the page passes at every point of the sweep. `docs/decisions/` § 9 has the measurements, including the two other things the first composition\ngot wrong.\n\n### The third correction: a semantic color is not a text color over its own tint\n\nIt came up while implementing the document's alert recipe — background at 8 % of\nthe semantic color — and the suite took it down in light mode, across five\nstories.\n\nThe light semantics are calibrated to pass **just** over paper. Tinting the\nbackground with them sinks them below AA:\n\n| tone | over paper | over its own 8 % tint | `textPrimary` over the tint |\n| --- | --- | --- | --- |\n| `accent` | 4.55 | **4.12** | 14.82 |\n| `warm` | 4.54 | **4.11** | 14.85 |\n| `success` | 5.80 | 5.17 | 14.63 |\n| `warning` | 4.88 | **4.40** | 14.78 |\n| `error` | 4.87 | **4.35** | 14.64 |\n\nNo alpha fixes it: the problem is putting the color on top of itself. The\nresolution does not touch the palette — the tint is a **surface**, so the text on\ntop of it is a text token. The semantic color stays where it is not text: the\nborder and the glyph.\n\nThe 8 %, incidentally, holds up as well as or better over paper than over abyss\n(1.106 vs. 1.149 in accent). The suspicion that light mode needed a second table\nran the other way round: the system's weak point is `error` over abyss, 1.067.\n\n## Publishing a version\n\n**There are no manual steps.** The tag, the CHANGELOG and the version bump are\ndone by release-please from the conventional commits that already get written —\nand that `lint-pr-title` already forces to be written correctly.\n\nThe whole cycle lives in `.github/workflows/release.yml`:\n\n1. You merge a PR to `main` with a title like `feat(badge): …`.\n2. release-please opens — or updates — a PR called `chore: release X.Y.Z` with\n   the bump in `package.json` and the new `CHANGELOG.md` entry. That PR stays\n   open and accumulates with every merge, so you can group several changes into\n   one version.\n3. When you merge it, it cuts the tag, creates the release and triggers the\n   publish.\n4. Before uploading anything, the workflow checks that the tag and `package.json`\n   match, and runs lint, types, build, the `exports` verification and the full\n   suite in both modes.\n5. With the package already on npm, it builds Storybook and deploys it to\n   [arrecife.eduardoalvarez.dev](https://arrecife.eduardoalvarez.dev).\n\n`feat:` bumps the minor and `fix:` the patch. While the version is `0.x`, a\nbreaking change bumps the **minor** and not the major: that is what the `0.`\nmeans — that the API can still move without spending 1.0. It is in\n`release-please-config.json`, and `initial-version` with the first release's\n`0.1.0` is there too.\n\nWhen the API stabilises, it goes up to `1.0.0` by hand once, and from then on a\n`BREAKING CHANGE:` bumps the major like in any other package.\n\n### How release-please decides what to cut\n\nTwo pieces of information, and they come from different places. Knowing this\navoids the one failure that leaves the release stuck:\n\n| Datum | Where it comes from |\n| --- | --- |\n| The **version** | From the PR **title** — `chore(main): release 0.2.0` |\n| The **component** | From the **branch name** — `release-please--branches--main--components--arrecife` |\n\nThe component is derived from `package.json` and **cannot be pinned by\nconfiguration**: there is no `component` key in the\n[official schema](https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json).\n`include-component-in-tag: false` is what makes the tag `v0.2.0` and not\n`arrecife-v0.2.0`.\n\nIf the title or the branch are edited by hand and stop matching, release-please\ndoes not create the release and every run ends in `There are untagged, merged\nrelease PRs outstanding - aborting`. There is no way out of that through\nconfiguration: the tag and the release have to be cut by hand and the PR\nrelabelled `autorelease: tagged`.\n\n`pnpm check:release` validates the configuration against that schema on every CI\nrun. It exists because release-please **silently ignores** keys it does not know:\nan invented option raises no error, shows in no log and does nothing.\n\n### Trusted publishing\n\nThe workflow publishes with **OIDC**: GitHub issues a token proving «this build\ncame out of this repo and this workflow», and npm exchanges it for permission to\npublish. There is no long-lived secret to steal, or to rotate. It also generates\n**provenance**, which signs the package with a verifiable link to that exact\ncommit.\n\nIt is configured once, on npmjs.com → the package → *Settings* → *Trusted\npublisher*:\n\n| Field | Value |\n| --- | --- |\n| Publisher | GitHub Actions |\n| Organization or user | `Proskynete` |\n| Repository | `arrecife` |\n| Workflow filename | `release.yml` |\n| Environment | `npm` |\n\nThat *Workflow filename* is the reason the release and the publish live in a\nsingle file rather than in a reusable workflow: npm matches the token against a\nname, and with `workflow_call` there are two candidates.\n\n**The chicken and the egg.** You cannot configure a trusted publisher on a\npackage that does not exist yet, so the first version needs a token:\n\n1. Create the `npm` environment in the repo settings with the `NPM_TOKEN` secret\n   (an *automation* token).\n2. Bump the version and publish for the first time. The workflow says in the log\n   that it is using a token.\n3. Configure trusted publishing with the table above.\n4. **Delete the `NPM_TOKEN` secret.** The step that uses it skips itself when it\n   is absent, and OIDC takes over without touching a line of the workflow.\n\nTo test without spending a version: *Actions → Release y publicación → Run\nworkflow* with the dry run enabled. It does everything but publish, needs no\ntoken, and the run summary lists which files would travel and how big the tarball\nis.\n\nThe dry run **does deploy Storybook**, to a Vercel preview and not to the public\ndomain. That is deliberate: a dry run that skips a job cannot tell you whether\nthat job works, and the deploy was the only step in the workflow that could not\nbe tested without spending a version.\n\nOne detail of the dry run that is confusing the first time: `npm publish\n--dry-run` queries the registry, and `package.json` points at an **already\npublished** version except in the window between release-please bumping the\nnumber and the workflow publishing. So the dry run runs into `cannot publish over\nthe previously published versions` over the one thing that cannot be right in a\ndry run. That specific message is forgiven with a notice; any other failure still\nfails.\n\n### Storybook is deployed with the version\n\nThe published Storybook is the library's documentation: every story is both the\nexample and the test that verifies it. It lives at\n[arrecife.eduardoalvarez.dev](https://arrecife.eduardoalvarez.dev) and it is\nuploaded by `release.yml`'s `deploy` job, **after** npm has published.\n\nThat order is not an implementation detail. The site and the package have to tell\nthe same version: a Storybook ahead of npm shows components nobody can install\nyet, and that is exactly the failure this repo exists because of — one source of\ntruth drifting from another.\n\nHence the decision that surprises people: **the Vercel project is not connected\nto GitHub.** With the Git integration, Vercel builds on its own on every push to\n`main` and there is no way to ask it to wait for the tag. The only thing that\ndeploys is the workflow, and it uploads Storybook **already built**: with the\nBuild Output API and `--prebuilt`, Vercel executes nothing, it serves what is in\n`.vercel/output/static`. That way it is built by the same Node and the same\nlockfile that just verified the library.\n\nIt is configured once, with `vercel link` in a local clone to create the project\nand get the two ids out of `.vercel/project.json`. **Careful with one extra\nstep:** `vercel link` connects the GitHub repository to the project on its own\nand without asking, which is exactly what you do not want. It is undone with\n`vercel git disconnect`, and it is worth checking before calling the project\nconfigured.\n\n| Where | Name | What it is |\n| --- | --- | --- |\n| *Secrets* | `VERCEL_TOKEN` | A Vercel account token |\n| *Variables* | `VERCEL_ORG_ID` | The `orgId` from `.vercel/project.json` |\n| *Variables* | `VERCEL_PROJECT_ID` | The `projectId` from `.vercel/project.json` |\n\nThe two ids go in as **variables** and not as secrets on purpose: they are not\nsecret — they come out of any clone that runs `vercel link` — and as variables\nthey are readable in the log when something does not add up.\n\nThe team's deployment protection is `all_except_custom_domains`: each deploy's\nunique URL asks for a team session and returns a 302 to the login, and the public\none is the custom domain. It is not a misconfiguration, it is Vercel's default\nand it is the one we want.\n\n**If they are missing, the job warns and does not break.** By the time it runs,\nnpm has published and the tag has been cut: a red there would read as «the\nrelease failed», which is the opposite of what happened. The warning stays in the\nrun summary.\n\n## Status\n\n- **Phase 1** · scaffolding, tokens and Storybook with the theme switch. Done.\n- **Phase 2** · `brand/`. Done, with the PNGs that already existed.\n- **Phase 3** · the 18 primitives on shadcn/Radix, plus `Text` and eight more\n  added after measuring real usage across the five projects. Done.\n- **Phase 4** · `AudioPlayer`, migrated. Done.\n- **Phase 5** · done. `ArticleCard`, `AuthorCard`, `TalkCard`, `CourseCard`,\n  `LinkRow`, `CodeBlock`, `Blockquote`, `PageHeader`, `EmptyState`, `Breadcrumb`,\n  `Nav`, `TableOfContents`, `Stat`, `Footer`, `Hero`, `NewsletterForm`, `og/` and\n  `shiki/`.\n\n  `SidebarNav` was on that list and came off it in 0.8.0. It met the rule below\n  on the identity half and never on the consumer half: the two admin projects it\n  was built for each wrote their own and never imported it. See\n  `docs/decisions/` § 48.\n\n  The criterion for deciding what gets in is still the same: **it encodes an\n  identity rule, it has two or more consumers, and it drags in no project\n  infrastructure.**\n\n### `Hero` and `NewsletterForm` came back in\n\nThey were off the list with a written argument, and the argument was revisited.\n\n**`Hero`.** It had been ruled out because «the portfolio's hero and the courses\none are the same skeleton as a section header, and `PageHeader` covers them with\na scale prop». That holds for the text and only for the text. The document's hero\nalso has a gradient, a panel radius, text clamped to 62 % of the width and the\npose bleeding off the bottom-right corner — none of which fits in a `PageHeader`\nscale prop, and all of which are identity rules that get reimplemented five times\nif they do not live here. They are two different pieces: `PageHeader` is still\nthe section header and goes inside `<main>`; `Hero` is the cover and there is one\nper site.\n\n**`NewsletterForm`.** It had been ruled out because «half its code is a `POST` to\nan endpoint that only lives there: that is infrastructure». Correct, and that is\nwhy the `POST` is not here. The component is presentational: it takes `state` and\nemits `onSubmitEmail`, and the project makes the call with its own provider. What\nIS identity are the four states and, above all, that the notice goes **below**\nthe form instead of replacing it — replacing it is what breaks the real case of\nsomebody who subscribes with the wrong email.\n\n`Nav`, `Footer`, `Breadcrumb` and `Hero` are page composition and can be argued\nabout as library pieces. They get in anyway: the CLI aesthetic — the bar's\n`./section`, the path's `~ / artículos / slug`, the footer's `$ cd ~/…` signature\n— is the first thing that drifts when five projects each write it on their own.\n\n### Phase 3 decisions\n\n- **It shipped no icon set, and by 0.10.0 that position had been abandoned from\n  both ends.** Phase 3 said the eight glyphs the primitives need are inline in\n  `src/lib/glyphs.tsx` and not exported; 0.7.0 added `@phosphor-icons/react` as an\n  optional peer on `./icons` so the set a project chooses is drawn at the system's\n  weight; and 0.10.0 deleted `glyphs.tsx` and `./social` and made Phosphor\n  required, because a library drawing in three hands cannot say which one is\n  right. See «The social icons are yours too» above and `docs/decisions/`\n  § 51. What survives verbatim is the part that was always the real rule: the\n  icons are the project's, the LINE is the system's. The rest of this bullet is\n  the 0.7.0 argument, kept because it is what the reversal was measured against:\n  optional and on a subpath was the point, since the two projects that use no\n  icons install nothing.\n- **No entrance animations.** Modals, menus, tooltips and toasts appear where\n  they will stay. The `Switch` knob changes position without sliding. The\n  system's only transition is `transition-standard`, which can only animate color\n  and border because that is how the utility is written.\n- **One exception, documented:** the `Button loading` spinner spins. A loading\n  button with no movement is indistinguishable from a disabled one; it is\n  feedback about progress, not about state, and it is wrapped in `motion-safe`.\n- **`Progress` requires `label`.** A bar with no accessible name does not say\n  what the progress is about, and no other part of the component can deduce it.\n- **Zero literal hexes**, `Button` included. Rule 2 comes out as\n  `light:bg-brand-hull`, because the hull was already a token.\n- **Explicit `cursor-pointer`** on everything you press. Tailwind v4 removed\n  `cursor: pointer` for `button` from the preflight, so a button without the\n  class keeps the system arrow. It is carried by `Button`, `Checkbox`,\n  `RadioGroupItem`, `Switch`, `TabsTrigger`, `Select`'s trigger, the close\n  buttons of `Dialog`/`Sheet`/`Toast`, `PaginationLink`, the shell of the\n  clickable cards and the links in `Nav`, `Footer` and `Breadcrumb` — which\n  render an `<a>` with no `href` when a router's `Link` is plugged into them.\n\n  Two deliberate exceptions. `Label` points at a control but is not the control.\n  And the **menu items** of `Select` and `DropdownMenu` stay on `cursor-default`:\n  a native menu does not show the pointing hand, and the row highlight already\n  says the row responds.\n- **`Table`'s scroll region is a focus stop.** A region you can pan with a mouse\n  has to be reachable with a keyboard — WCAG 2.1.1 — and a table of text holds\n  nothing focusable to land on, so the columns past the right edge were simply\n  unreadable without one. It had been true since the container started scrolling\n  and no story was ever narrow enough to say so; the first one with more columns\n  than width failed axe on `scrollable-region-focusable` immediately. It is\n  unconditional, because whether a table overflows depends on the viewport and\n  the only alternative is a ResizeObserver on every table in the system. See\n  `docs/decisions/` § 39.\n\n### The syntax palette\n\nStraight from the document: «keywords sand, strings biolume, comments plankton,\nidentifiers foam», over hull. Four colors on purpose — functions, variables and\ntypes all land on foam, because the system communicates with color and border and\nnot with chromatic noise. Numbers and booleans ride with strings: the document\ndoes not assign them, and grouping them under «they are literals» is more\ncoherent than introducing a fifth color.\n\nMeasured over `brand.hull` #0B1524, all AA:\n\n| role | token | contrast |\n| --- | --- | --- |\n| identifier | `textPrimary` | 16.42:1 |\n| literal | `accent` | 10.05:1 |\n| keyword | `warm` | 9.05:1 |\n| comment | `textMuted` | 5.43:1 |\n| invalid | `error` | 4.97:1 |\n\n`brand.body` (#3E7CB1) is not in it: the system restricts it to fill and here it\nmeasures 4.2:1.\n\nIt used to live hand-written in\n`eduardoalvarez.dev/src/settings/shiki-reef.ts`, and a `#E05252` had been left\ninside it — precisely the hex this README says is wrong. It is the textbook case\nfor why the palette cannot live inside a project: the theme is generated from\n`tokens.syntax` and the red comes out corrected on its own.\n\n### Nestable themes\n\n`theme.css` emits one block per mode, not just the light one. That way a subtree\ncan declare the opposite mode to the page and everything inside honours it.\n\n`CodeBlock` uses it: `brand.hull` is «the background of code blocks», so a block\nis dark in light mode too — and there `textPrimary` is nearly black. The block's\nroot declares `data-theme=\"dark\"` and the ink resolves itself. It is the system's\nonly island of inverted theme, and it is deliberate.\n\n### The cards and rule 6\n\n`ArticleCard`, `TalkCard`, `CourseCard` and `LinkRow` share an internal shell\nthat is not published, so rule 6 lives in exactly one place: the hover changes\nthe border from `hairline` to `hairlineHover` and tints the title with accent.\nNothing else.\n\n`LinkRow` comes from `links/src/components/Card.astro`, which scaled the card to\n102 %, lifted the title by a pixel and rotated and enlarged the icon — four\nmovements the system does not allow.\n\nNo card depends on a router: by default they render an `<a href>`, and `asChild`\nlets Next's or Astro's `Link` be plugged in.\n\n### `AudioPlayer` — what changed on migration\n\nThe logic was not rewritten. The three modes, the floating player, the ±15s\nskips, the 1 → 1.25 → 1.5 → 1.75 → 2 speed cycle and the volume with mute are the\nportfolio's. What changed:\n\n**Two dependencies a package cannot have.** The portfolio's `Icon` became\n`src/lib/glyphs.tsx` with identical paths — and since 0.10.0 those eight paths are\ngone too, replaced by `Play`, `Pause`, `SpeakerHigh`, `SpeakerSlash`,\n`CircleNotch`, `ArrowsClockwise` and the two seek arrows from Phosphor.\n`trackEvent` became the `onFirstPlay` prop, which still fires exactly once per\nload.\n\n**One API change.** `compact`/`banner` as two booleans became\n`mode=\"full\" | \"compact\" | \"banner\"`, which is the vocabulary the three modes were\nalready described with. The portfolio's call sites need touching in Phase 6.\n\n**Three animations the system does not allow.** The waveform no longer animates\n`scaleY` — the bars still tell playback from pause by opacity. The floating\nplayer appears and disappears instead of sliding. The progress bar no longer\ninterpolates its width, which also made it lag behind the audio. The loading\nspinner's spin stays, with the same justification as in `Button`.\n\n**An inherited contrast failure.** The speed button put `textMuted` over\n`surfaceRaised`: 4.07:1 in dark. It moved to `textSecondary`. The original still\ncarries that failure.\n\n**A latent bug.** The player's pieces live at module level, not inside the\ncomponent. Declared inside, they change identity on every render and React\nremounts them: with `timeupdate` firing four times a second, dragging the bar\nlost pointer capture.\n\n### The brand\n\nTiburoncín's thirteen pieces were scattered across the five projects,\nbyte-for-byte identical. They were consolidated into `assets/brand/` and are\npublished in the package; they are served at `/brand`, the same path everyone\nalready uses from their `public/`, so `basePath`'s default works with nothing to\nconfigure.\n\n```tsx\nimport { Logo, Mascot, MascotFace, faceList } from '@eduardoalvarez/arrecife/brand';\n```\n\n| | |\n| --- | --- |\n| fins | `fin.png` (two blues) and `fin-foam.png` (foam silhouette) |\n| faces | annoyed · confused · hearts · laughing · shades · waiting · wink |\n| poses | desk · laptop-coffee · peek · surf |\n\nThe names are a type: a face that does not exist will not compile, and\nautocomplete offers the ones that do. Adding one means dropping the PNG in and\nadding a line to the catalog.\n\n**Rule 1 as API.** `background=\"dark\"` uses the single-ink silhouette and\n`background=\"light\"` the two-blue one. It is not a note in a guide: it is a prop.\nPixel analysis confirms it — 94 % of `fin-foam.png` is `#EDF4F3`, which is the\nfoam token.\n\nOn a site that switches theme, `background=\"auto\"` renders both and the `light:`\nvariant shows the one that reads, so no call site has to know which theme is on.\nA background that does not follow the theme — a dark panel on a light page —\nstill names itself: `auto` reads the page, not the panel. See\n`docs/decisions/` § 60.\n\n**Rule 5 as API.** The wordmark comes from `naming.wordmark` and always reads\n«Eduardo Álvarez». There is no prop that changes that text, and Tiburoncín never\nappears written inside the logo.\n\n**Rule 4 as API.** The faces only go in empty states, confirmations, errors,\ncourse progress and celebration. The rule lives in which components accept a\nface, not in the documentation.\n\nThe format is an implementation detail: when the SVGs arrive, the files get\nreplaced and not a line of code changes.\n\n### The eight added afterwards\n\nThey were not on the original list. They got in by measuring how many of the five\nprojects use each one, with the same criterion that took `Hero` and\n`NewsletterSection` out.\n\n| | files using it | why |\n| --- | --- | --- |\n| `Card` | 34, across 4 projects | It is the only definition of what a card surface is. All four cards with a domain reuse its classes. |\n| `Label` | 21, across 2 | There were seven form controls and no label. |\n| `Avatar` | 19, across 3 | One for everything: there is no separate `brand/Avatar`, because a profile photo is this with a different `src`. |\n| `Sheet` | 6, across 3 | It is `Dialog` with a side variant. |\n| `Separator` | 8, across 2 | `hairline` was a token with no component. |\n| `Popover` | 5, across 3 | The base of any dropdown selector. |\n| `DateField` | — | The native control, dependency-free, for picking a date in a form. |\n| `Calendar` | 6, across 3 | A navigable month calendar, for the content planner. `fullWidth` stretches it to the container's width. |\n\nThere is no `DatePicker`: it is `Popover` plus `Calendar` and it is five lines. A\nthird component that only glues together two that already exist is API surface to\nmaintain for nothing.\n\n`Popover` requires `aria-label` or `aria-labelledby` in the type. Radix puts\n`role=\"dialog\"` on the content, and a dialog with no accessible name says nothing\nto a screen reader: now it cannot be forgotten because it does not compile.\n\n### The signature's mark: the halo, and the caret it removed\n\nThe CLI signature ends in a 2px bar that stays solid and **radiates** — a\n`box-shadow` ring grows out to 5px and fades, 1.5s `ease-in-out`, behind\n`motion-safe`. It is the fifth declared motion exception and it lands on the\none criterion the other four share, next to the button spinner: a prompt that\nradiates says the terminal is live, which is what a still mark cannot say.\n\n**It replaced a blink this library had invented.** The signature used to end in a\nhalf-em block blinking at `step-end`, argued from first principles: a prompt\nwhose caret does not blink is a terminal that has hung. Every sentence of that\nargument is true, and it was answering a question the identity had already\nanswered — `cursos` and `eduardoalvarez.dev` both shipped `@keyframes cursor-ping`,\nthe same effect under the same name, written before this library had a `Footer`.\nThe blog's copy is still in its `base.css` with nothing rendering it, because\nadopting the component replaced its mark. That is the drift this library exists\nto remove, arriving through the library.\n\n**`caret` is gone, not merely unused.** It arrived in 0.6.0 and it is removed\nhere. A published utility is normally not withdrawn the day its one consumer\nchanges its mind, but it never had a consumer to change its mind: no project ever\nwrote the class, and the argument that justified it was reasoned rather than\nread. Leaving it published leaves the invention in the package under a label that\nmakes it look like a feature.\n\n**The halo is not that utility with a setting**, which is why it arrives under\nits own name. The caret's whole case rested on `step-end`: a real caret is on or\noff, and easing it turns a terminal into a pulsing dot. Folding a halo into that\nname would make the argument contradict itself.\n\n**And the rule gets its shape back.** The caret was the only member of the\n«legibility» criterion that was invented to admit it, so the five exceptions —\nthe button spinner, the `Sheet` panel, the `Skeleton` shimmer, the `Accordion`\nheight and this halo — are again all one thing: feedback about progress or about\nspatial continuity. A sixth lands on that or it does not exist.\n\nThe bar is 2px and not a block because a halo needs something thin to radiate\nfrom, the colour is `var(--color-accent)` so it follows the mode, and\n`motion-safe` is the one thing not copied from `cursos` — whose span animates\nregardless of the setting. See `docs/decisions/` § 45, and § 23 for the entry\nit reverses.\n\n### The second motion exception\n\n`Sheet` slides. It is the second and last exception to «no displacement»,\napproved knowingly: a panel entering from an edge, held still, would be an\noff-centre modal. It lasts `--duration-standard` with `--ease-standard` — the\nsame time and the same curve as any color change — so it introduces no new\ntiming, and it sits behind `motion-safe`.\n\n`Calendar` does **not** animate the month change: react-day-picker's `animate`\nstays on its default, which is off.\n\n### The danger variant, and where it does not go\n\n`Button` has `destructive` and `destructiveOutline` since 0.6.0. For four\nversions it had neither, on an argument that is still half right: inside an\n`AlertDialog` the confirm button is **not** red, because a title explains what is\nabout to happen, focus starts on cancel and clicking outside does not close it.\nThe context does the work and a red button on top of it is shouting.\n\nWhat broke the argument is the table row. `cursos` has eight destructive buttons\nin row actions and toolbars, next to «Editar» and «Duplicar», with nothing around\nthem doing that work — and rendered as `secondary`, «Eliminar curso» looked\nexactly like «Cancelar».\n\nThe palette is not `error`, and the reason is the role. `error` is a text color:\nit reads against a dark surface, so it sits mid-red. `danger` is a fill: what\nreads is the ink on top of it, so it goes lighter. Same split as `accent` and\n`accentOn`. In light mode both land on `#C0392B`, because over paper a red dark\nenough to carry white ink is also the red that reads as text.\n\n| | dark | light |\n| --- | --- | --- |\n| ink over fill | 6.53 | 5.11 |\n| ink over hover | 7.92 | 6.61 |\n| fill over background | 6.71 | 4.87 |\n| fill over surfaceRaised | 4.91 | **4.50** |\n\nThat last cell is exactly on the AA line, which is where every light semantic in\nthis palette sits. It matters because it is the outline variant's border and\ntext, and `surfaceRaised` is where a toolbar lives.\n\n`destructiveOutline` fills on hover, and that is a declared exception to\n«secondary is never filled» — a destructive that looks identical to a secondary\nuntil you read it is the problem the variant exists to fix. See\n`docs/decisions/` § 21.\n\n### `icon-sm`, for the one admin app\n\n42×42 is the right measure for a control you hit with a thumb, and four of the\nfive projects are reading sites where that fits. `cursos` is the odd one out:\nthree actions per table row, and at 42 the row grows with them.\n\n`size=\"icon-sm\"` is 32×32, and it is 32 and not the 28 that project actually had:\n32 is `sm`'s height, so a dense icon button lines up with a small text button and\na toolbar mixing the two stays on one baseline. It does not replace `icon` — a\npage's primary action stays at 42. See `docs/decisions/` § 22.\n\n### The theme script, and the mode a site already decided\n\n```astro\n<script is:inline set:html={themeScript({ base: 'dark' })} />\n```\n\nUntil 0.6.0 `themeScript` was a fixed string and resolved stored choice →\n`prefers-color-scheme` → dark. That is the right default for a library, and it\nwas wrong for all five of these projects: they are dark BY DECISION, and\n`eduardoalvarez.dev`'s own script said so out loud — «dark is the brand's PRIMARY\nmode, so it's the default and doesn't follow the OS setting». With the OS in\ncharge, a reader whose machine is in light mode saw the blog in light.\n\nThere was no way to say otherwise, so those projects kept their own\n`public/theme.js` and the library published the hard part for nobody. Migrating\njust the button did not help either: `ThemeToggle` persists under\n`arrecife-theme` and their script read `theme`, so the two would have gone out of\nstep.\n\n`base` stops the OS from being consulted at all. A stored choice still wins over\nit — it sets what happens when nobody has chosen yet, not what happens instead of\nchoosing, so the toggle keeps working.\n\n### `Text` — the scale as API\n\n`Text` was not on the original list and was added later, because without it the\nscale only existed as loose classes and nothing stopped anyone putting\n`text-display` on a paragraph. Three of the system's rules live inside the\ncomponent:\n\n| rule | how it is applied |\n| --- | --- |\n| display for headlines only, never body | the family is bound to the scale; no `font` prop exists |\n| weight and tracking belong to the scale | they come from the `--text-*` token and are not exposed |\n| maximum body measure 68ch | `body` applies it on its own; `measure={false}` removes it |\n\n`as` and `variant` are independent on purpose: a second-level heading that has to\nlook smaller is `<Text as=\"h2\" variant=\"h3\">`, not an `h3` that lies about the\npage hierarchy.\n","readmeFilename":"README.md"}