{"_id":"@antjanus/cottage-ui","_rev":"2-d6908b444067ff94c8ea9b05324e49c5","name":"@antjanus/cottage-ui","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@antjanus/cottage-ui","version":"1.0.0","author":{"name":"Antonin Januska"},"license":"MIT","_id":"@antjanus/cottage-ui@1.0.0","maintainers":[{"name":"antjanus","email":"antonin@antjanus.com"}],"homepage":"https://github.com/antjanus/cottage-ui#readme","bugs":{"url":"https://github.com/antjanus/cottage-ui/issues"},"dist":{"shasum":"f8ac6855da7d557ffdb764908cc3c1cee4837799","tarball":"https://registry.npmjs.org/@antjanus/cottage-ui/-/cottage-ui-1.0.0.tgz","fileCount":7,"integrity":"sha512-b6+5kqsQrpjIIQ57zewpEed1HV0w0JliagNBiBhvHcin7/Kr9eeXBdsIWKoYK8JT9zMiCrfX+Esvsv5PlY95Wg==","signatures":[{"sig":"MEUCIQDTQ7g1bUn7BxkR/XQDIeVB9Bm6EJj4xR/x81Jxjlg3uwIgBP6Y1FK3IFI8oP7Aa89ARImKZTVLsVhr07Tyay6jTo4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54505},"main":"./dist/cottage-ui.umd.cjs","type":"module","style":"./dist/cottage-ui.css","types":"./dist/cottage-ui.d.ts","module":"./dist/cottage-ui.js","exports":{".":{"types":"./dist/cottage-ui.d.ts","import":"./dist/cottage-ui.js","require":"./dist/cottage-ui.umd.cjs"},"./dist/cottage-ui.css":"./dist/cottage-ui.css"},"gitHead":"dfdfc4bed4b181167e4f90823789cd3de59cde50","scripts":{"dev":"vite","lint":"eslint . --max-warnings 0","test":"vitest","build":"tsc && vite build","prepare":"husky","preview":"vite preview","coverage":"vitest run --coverage","prebuild":"rm -rf dist","storybook":"storybook dev -p 6006","prepublishOnly":"npm run build","build-storybook":"storybook build"},"_npmUser":{"name":"antjanus","email":"antonin@antjanus.com"},"repository":{"url":"git+https://github.com/antjanus/cottage-ui.git","type":"git"},"_npmVersion":"11.15.0","description":"React component library with cottage-style UI primitives for consistent, accessible interfaces.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","husky":"^9.1.7","jsdom":"^28.0.0","react":"^19.2.4","eslint":"^9.39.2","vitest":"^4.0.18","globals":"^17.3.0","postcss":"^8.5.6","react-dom":"^19.2.4","storybook":"^10.2.8","typescript":"^5.9.3","tailwindcss":"^4.1.18","@types/react":"^19.2.14","autoprefixer":"^10.4.24","@commitlint/cli":"^19.8.1","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^19.2.3","semantic-release":"^24.2.9","typescript-eslint":"^8.55.0","@vitest/coverage-v8":"^4.0.18","vite-tsconfig-paths":"^6.1.1","@tailwindcss/postcss":"^4.1.18","@vitejs/plugin-react":"^5.1.4","@semantic-release/git":"^10.0.1","@storybook/addon-docs":"^10.2.8","@storybook/react-vite":"^10.2.8","@storybook/addon-links":"^10.2.8","@testing-library/react":"^16.3.2","eslint-plugin-storybook":"^10.2.8","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@semantic-release/changelog":"^6.0.3","@storybook/addon-onboarding":"^10.2.8","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.5.0","@commitlint/config-conventional":"^19.8.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cottage-ui_1.0.0_1782242089995_0.21299118956351992","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@antjanus/cottage-ui","version":"2.0.0","description":"React component library with cottage-style UI primitives for consistent, accessible interfaces.","type":"module","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/antjanus/cottage-ui.git"},"homepage":"https://github.com/antjanus/cottage-ui#readme","bugs":{"url":"https://github.com/antjanus/cottage-ui/issues"},"license":"MIT","author":{"name":"Antonin Januska"},"main":"./dist/cottage-ui.umd.cjs","module":"./dist/cottage-ui.js","types":"./dist/cottage-ui.d.ts","style":"./dist/cottage-ui.css","exports":{".":{"types":"./dist/cottage-ui.d.ts","import":"./dist/cottage-ui.js","require":"./dist/cottage-ui.umd.cjs"},"./dist/cottage-ui.css":"./dist/cottage-ui.css"},"sideEffects":["*.css"],"scripts":{"dev":"vite","prebuild":"rm -rf dist","build":"tsc && vite build","lint":"eslint . --max-warnings 0","preview":"vite preview","prepublishOnly":"npm run build","storybook":"storybook dev -p 6006","build-storybook":"storybook build","test":"vitest","coverage":"vitest run --coverage","prepare":"husky"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"devDependencies":{"@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@vitest/coverage-v8":"^4.0.18","vite-tsconfig-paths":"^6.1.1","react":"^19.2.4","react-dom":"^19.2.4","@commitlint/cli":"^19.8.1","@commitlint/config-conventional":"^19.8.1","@semantic-release/changelog":"^6.0.3","@semantic-release/git":"^10.0.1","@storybook/addon-docs":"^10.2.8","@storybook/addon-links":"^10.2.8","@storybook/addon-onboarding":"^10.2.8","@storybook/react":"^10.2.8","@storybook/react-vite":"^10.2.8","@tailwindcss/postcss":"^4.1.18","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.4","autoprefixer":"^10.4.24","eslint":"^9.39.2","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0","eslint-plugin-storybook":"^10.2.8","globals":"^17.3.0","husky":"^9.1.7","jsdom":"^28.0.0","postcss":"^8.5.6","semantic-release":"^24.2.9","storybook":"^10.2.8","tailwindcss":"^4.1.18","typescript":"^5.9.3","typescript-eslint":"^8.55.0","vite":"^7.3.1","vite-plugin-dts":"^4.5.4","vitest":"^4.0.18"},"gitHead":"cf18224348aa9ca26481a19428ea9de6b5e33a7a","_id":"@antjanus/cottage-ui@2.0.0","_nodeVersion":"24.11.1","_npmVersion":"11.15.0","dist":{"integrity":"sha512-9JJGc07L8nvy3EU3rT4ZbstcwQxSdbTcSQdokgo6ncBWSl1NlqgB6XrM6fQqHrONFS+mnGGAW4xQ3Ek/lUYtqQ==","shasum":"39389b475e483792751a50b1b57c56b8549ee22b","tarball":"https://registry.npmjs.org/@antjanus/cottage-ui/-/cottage-ui-2.0.0.tgz","fileCount":7,"unpackedSize":62668,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG678/JBs/EMjP55tnRuVgxsFhJOp3JDRvLvFAWs6mLoAiEA/FFuaRbw04CpicGo584ywjkdd8rMxnpnmoe6jv2W2eM="}]},"_npmUser":{"name":"antjanus","email":"antonin@antjanus.com"},"directories":{},"maintainers":[{"name":"antjanus","email":"antonin@antjanus.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cottage-ui_2.0.0_1782500609178_0.6208401293821282"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-23T19:14:49.819Z","modified":"2026-06-26T19:03:29.411Z","1.0.0":"2026-06-23T19:14:50.139Z","2.0.0":"2026-06-26T19:03:29.314Z"},"bugs":{"url":"https://github.com/antjanus/cottage-ui/issues"},"author":{"name":"Antonin Januska"},"license":"MIT","homepage":"https://github.com/antjanus/cottage-ui#readme","repository":{"type":"git","url":"git+https://github.com/antjanus/cottage-ui.git"},"description":"React component library with cottage-style UI primitives for consistent, accessible interfaces.","maintainers":[{"name":"antjanus","email":"antonin@antjanus.com"}],"readme":"# Cottage UI\n\nA React component library built with TypeScript, TailwindCSS, and Vite. Created as part of the [Build A React UI Library series](https://www.youtube.com/playlist?list=PLcfAVClOb1BiA6oIfHQ6Am3lpWzOmMO6J).\n\n## Demo\n\n![Cottage UI Components](docs/demo.png)\n\n## Features\n\n- TypeScript-first component library\n- TailwindCSS utility styling\n- ESM + UMD bundles\n- Vitest + React Testing Library coverage\n- Storybook docs with `@storybook/react-vite`\n- Bundled type declarations\n\n## Installation\n\n```bash\nnpm install @antjanus/cottage-ui\n```\n\n## Usage\n\n```tsx\nimport { Button, BUTTON_VARIANTS, BUTTON_SIZES } from '@antjanus/cottage-ui'\nimport '@antjanus/cottage-ui/dist/cottage-ui.css'\n\nfunction App() {\n\treturn (\n\t\t<Button\n\t\t\tvariant={BUTTON_VARIANTS.PRIMARY}\n\t\t\tsize={BUTTON_SIZES.LARGE}\n\t\t\tonClick={() => console.log('Clicked!')}\n\t\t>\n\t\t\tClick me\n\t\t</Button>\n\t)\n}\n```\n\n## Theming\n\nCottage UI ships four themes — **cottage** (the signature AJ palette: warm clay,\namber, pine & teal), **graphite**, **evergreen**, and **bloom** — each with a light\nand dark mode. Components are styled by semantic role, so switching theme recolors\nthe whole library.\n\nSet `data-theme` (and optionally `data-mode=\"dark\"`) on any ancestor element:\n\n```html\n<html data-theme=\"cottage\">              <!-- light, default theme -->\n<html data-theme=\"graphite\" data-mode=\"dark\">\n```\n\nWith no attributes set, the default is **cottage / light**. Switch at runtime by\nupdating the attributes:\n\n```ts\ndocument.documentElement.dataset.theme = 'evergreen'\ndocument.documentElement.dataset.mode = 'dark'\n```\n\nStatus `-strong`-on-`-soft` pairs (badges, alerts) are WCAG AA verified in both modes.\nThe local demo (`npm run dev`) includes a theme/mode switcher and a palette showcase.\n\n## Development\n\nThis repo uses npm.\n\n```bash\nnpm install\nnpm run dev\nnpm run storybook\nnpm run lint\nnpm run test -- --run\nnpm run build\n```\n\n## Project Layout\n\n```\ncottage-ui/\n├── lib/                  # Published library source\n├── src/                  # Local demo app\n├── .storybook/           # Storybook config\n└── dist/                 # Build outputs\n```\n\n## Contributing\n\n1. Add or update code in `lib/`\n2. Add/adjust tests and stories\n3. Export new APIs in `lib/main.ts`\n4. Run lint, tests, and build before opening a PR\n\n## Documentation\n\n- [AGENTS.md](AGENTS.md) - Agent and component architecture conventions\n- [CLAUDE.md](CLAUDE.md) - AI coding-agent guidance\n- [CREATE_COMPONENT_PROMPT.md](CREATE_COMPONENT_PROMPT.md) - Step-by-step component creation workflow\n- [lib/README.md](lib/README.md) - Library directory-specific guidance\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n\n## Contributing\n\nSee [CONTRIBUTING guidelines](CLAUDE.md#component-structure): add code in `lib/`, add tests and stories, export from `lib/main.ts`, then run lint/test/build before opening a PR.\n","readmeFilename":"README.md"}