{"_id":"@bryan-cunningham-design/igenie-ui","_rev":"5-b3e7089e96a4443a00c85f32dbb2471c","name":"@bryan-cunningham-design/igenie-ui","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.0":{"name":"@bryan-cunningham-design/igenie-ui","version":"0.0.0","keywords":["react","components","design-system","ui","react-components","tailwindcss"],"license":"UNLICENSED","_id":"@bryan-cunningham-design/igenie-ui@0.0.0","maintainers":[{"name":"jschr","email":"npm@jschr.io"}],"homepage":"https://igenie-www.jschr.workers.dev/","dist":{"shasum":"f557556a291b8450047d7c3e571f5c093118a077","tarball":"https://registry.npmjs.org/@bryan-cunningham-design/igenie-ui/-/igenie-ui-0.0.0.tgz","fileCount":119,"integrity":"sha512-XaE4NtnI1NJuzUVVmuj4c0/4cMI+JOnm4weX/JJIFIo40giC3s47HoE1whHzuAYxY5udPAtLojJfPFy+GE2yvQ==","signatures":[{"sig":"MEUCIQCIa+Oj7ZKogv+rx6OPUJa/BTzKqddRpY0JlIWYCY/ZYAIgdvrTPo2ql8rctmZ/hZnxnDeAYgbNZZPf2fo8pJoPSDA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":316234},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./sonner":{"types":"./dist/components/sonner.d.mts","default":"./dist/components/sonner.mjs"},"./index.css":"./index.css","./package.json":"./package.json","./styles/base.css":"./styles/base.css","./hooks/use-mobile":{"types":"./dist/hooks/use-mobile.d.mts","default":"./dist/hooks/use-mobile.mjs"}},"scripts":{"test":"vitest run","build":"tsdown","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","test:a11y":"vitest run tests/a11y.test.tsx","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"jschr","email":"npm@jschr.io"},"deprecated":"Placeholder published only to enable trusted publishing. Use 0.0.1 or later.","repository":{"url":"git+https://github.com/Bryan-Cunningham-Design/iGenie.git","type":"git","directory":"packages/ui"},"description":"i-Genie React component library — typed, accessible primitives with no copy of their own, themed entirely by CSS custom properties from @bryan-cunningham-design/igenie-tokens.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.15.0","dependencies":{"clsx":"^2.1.1","next-themes":"^0.4.6","lucide-react":"^1.30.0","@base-ui/react":"^1.7.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","class-variance-authority":"^0.7.1","@bryan-cunningham-design/igenie-tokens":"0.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"19.2.8","shadcn":"4.16.2","sonner":"^2.0.8","tsdown":"0.22.14","vitest":"^4.1.10","axe-core":"^4.13.0","react-dom":"19.2.8","typescript":"7.0.2","tailwindcss":"4.3.3","@types/react":"^19","@types/react-dom":"^19","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^19.0.0","sonner":"^2.0.8","react-dom":"^19.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/igenie-ui_0.0.0_1786932857084_0.39423903132407845","host":"s3://npm-registry-packages-npm-production"}},"0.0.1":{"name":"@bryan-cunningham-design/igenie-ui","version":"0.0.1","keywords":["react","components","design-system","ui","react-components","tailwindcss"],"license":"UNLICENSED","_id":"@bryan-cunningham-design/igenie-ui@0.0.1","maintainers":[{"name":"jschr","email":"npm@jschr.io"}],"homepage":"https://igenie-www.jschr.workers.dev/","dist":{"shasum":"efe45febbd52832fc757df55bc35b7c0d64a6df7","tarball":"https://registry.npmjs.org/@bryan-cunningham-design/igenie-ui/-/igenie-ui-0.0.1.tgz","fileCount":119,"integrity":"sha512-d+CAfpJhkcHQaELKyDFU7CWOzLIX8HkLdIK1LDVJwhEIP5FKo1F0G6oO8kzIDk0qS9n2+TfEr6mahbnnjou65Q==","signatures":[{"sig":"MEYCIQCSOCgIc0f6+IuxOFenEXNdJ17vOFE4k/gLMF0bTJUVGgIhALIf7sa035LqmUrtGlIT32hRvvV0xUXhfrHvdwn6qtoT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":316234},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./sonner":{"types":"./dist/components/sonner.d.mts","default":"./dist/components/sonner.mjs"},"./index.css":"./index.css","./package.json":"./package.json","./styles/base.css":"./styles/base.css","./hooks/use-mobile":{"types":"./dist/hooks/use-mobile.d.mts","default":"./dist/hooks/use-mobile.mjs"}},"scripts":{"test":"vitest run","build":"tsdown","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","test:a11y":"vitest run tests/a11y.test.tsx","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:924b1fd8-0814-4425-87e8-47bd1dd76f06"}},"repository":{"url":"git+https://github.com/Bryan-Cunningham-Design/iGenie.git","type":"git","directory":"packages/ui"},"description":"i-Genie React component library — typed, accessible primitives with no copy of their own, themed entirely by CSS custom properties from @bryan-cunningham-design/igenie-tokens.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.15.0","dependencies":{"clsx":"^2.1.1","next-themes":"^0.4.6","lucide-react":"^1.30.0","@base-ui/react":"^1.7.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","class-variance-authority":"^0.7.1","@bryan-cunningham-design/igenie-tokens":"0.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"19.2.8","shadcn":"4.16.2","sonner":"^2.0.8","tsdown":"0.22.14","vitest":"^4.1.10","axe-core":"^4.13.0","react-dom":"19.2.8","typescript":"7.0.2","tailwindcss":"4.3.3","@types/react":"^19","@types/react-dom":"^19","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^19.0.0","sonner":"^2.0.8","react-dom":"^19.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/igenie-ui_0.0.1_1786935462916_0.5067938234345097","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@bryan-cunningham-design/igenie-ui","version":"0.1.0","keywords":["react","components","design-system","ui","react-components","tailwindcss"],"license":"UNLICENSED","_id":"@bryan-cunningham-design/igenie-ui@0.1.0","maintainers":[{"name":"jschr","email":"npm@jschr.io"}],"homepage":"https://igenie-www.jschr.workers.dev/","dist":{"shasum":"d0b26d0f531578c3940814971aa88eec3118abd2","tarball":"https://registry.npmjs.org/@bryan-cunningham-design/igenie-ui/-/igenie-ui-0.1.0.tgz","fileCount":208,"integrity":"sha512-eIz1xVd59zi26Q6C0wbUWzqRc7FWxFAKD5VEeRQeUpBEVfR1lGNgGsYBc6G/IWVYAiFBoTkwVc/7ySTye6C+ow==","signatures":[{"sig":"MEYCIQDFcwgoIokV11XLi13OJdpXcxhcdY37UuNMrb6SVRgiogIhAI88JTJ+Qg1S+FKrJViZkp/nx6GP5z/JkCosMkPUWQIE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":764054},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./sonner":{"types":"./dist/components/sonner.d.mts","default":"./dist/components/sonner.mjs"},"./index.css":"./index.css","./package.json":"./package.json","./standalone.css":"./dist/standalone.css","./styles/base.css":"./styles/base.css","./hooks/use-mobile":{"types":"./dist/hooks/use-mobile.d.mts","default":"./dist/hooks/use-mobile.mjs"}},"scripts":{"test":"vitest run","build":"tsdown && tailwindcss --input config/standalone.entry.css --output dist/standalone.css --minify","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","test:a11y":"vitest run tests/a11y.test.tsx","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:924b1fd8-0814-4425-87e8-47bd1dd76f06"}},"repository":{"url":"git+https://github.com/Bryan-Cunningham-Design/iGenie.git","type":"git","directory":"packages/ui"},"description":"i-Genie React component library — typed, accessible primitives with no copy of their own, themed entirely by CSS custom properties from @bryan-cunningham-design/igenie-tokens.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.15.0","dependencies":{"clsx":"^2.1.1","cmdk":"^1.1.1","date-fns":"^4.4.0","next-themes":"^0.4.6","lucide-react":"^1.30.0","@shadcn/react":"^0.3.0","@base-ui/react":"^1.7.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","react-day-picker":"^10.0.1","class-variance-authority":"^0.7.1","@bryan-cunningham-design/igenie-tokens":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"19.2.8","shadcn":"4.16.2","sonner":"^2.0.8","tsdown":"0.22.14","vitest":"^4.1.10","axe-core":"^4.13.0","react-dom":"19.2.8","typescript":"7.0.2","tailwindcss":"4.3.3","@types/react":"^19","@tailwindcss/cli":"4.3.3","@types/react-dom":"^19","@testing-library/dom":"^10.4.1","@vitejs/plugin-react":"^6.0.5","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^19.0.0","sonner":"^2.0.8","react-dom":"^19.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/igenie-ui_0.1.0_1787100555428_0.6869740147523549","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bryan-cunningham-design/igenie-ui","version":"0.2.0","description":"i-Genie React component library — typed, accessible primitives with no copy of their own, themed entirely by CSS custom properties from @bryan-cunningham-design/igenie-tokens.","keywords":["react","components","design-system","ui","react-components","tailwindcss"],"license":"UNLICENSED","repository":{"type":"git","url":"git+https://github.com/Bryan-Cunningham-Design/iGenie.git","directory":"packages/ui"},"homepage":"https://igenie-www.jschr.workers.dev/","publishConfig":{"access":"public"},"type":"module","sideEffects":["*.css"],"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./sonner":{"types":"./dist/components/sonner.d.mts","default":"./dist/components/sonner.mjs"},"./hooks/use-mobile":{"types":"./dist/hooks/use-mobile.d.mts","default":"./dist/hooks/use-mobile.mjs"},"./index.css":"./index.css","./standalone.css":"./dist/standalone.css","./styles/base.css":"./styles/base.css","./package.json":"./package.json"},"dependencies":{"@base-ui/react":"^1.7.0","@shadcn/react":"^0.3.0","class-variance-authority":"^0.7.1","clsx":"^2.1.1","cmdk":"^1.1.1","date-fns":"^4.4.0","embla-carousel-react":"^8.6.0","input-otp":"^1.5.0","lucide-react":"^1.30.0","next-themes":"^0.4.6","react-day-picker":"^10.0.1","react-resizable-panels":"^4.12.2","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","@bryan-cunningham-design/igenie-tokens":"0.2.0"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","sonner":"^2.0.8"},"peerDependenciesMeta":{"sonner":{"optional":true}},"devDependencies":{"@tailwindcss/cli":"4.3.3","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","@types/react":"^19","@types/react-dom":"^19","@vitejs/plugin-react":"^6.0.5","axe-core":"^4.13.0","jsdom":"^30.0.1","react":"19.2.8","react-dom":"19.2.8","shadcn":"4.16.2","sonner":"^2.0.8","tailwindcss":"4.3.3","tsdown":"0.22.14","typescript":"7.0.2","vitest":"^4.1.10"},"engines":{"node":">=22.13.0"},"scripts":{"build":"tsdown && tailwindcss --input config/standalone.entry.css --output dist/standalone.css --minify","test":"vitest run","test:a11y":"vitest run tests/a11y.test.tsx","typecheck":"tsc --noEmit -p tsconfig.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\""},"_nodeVersion":"24.15.0","_id":"@bryan-cunningham-design/igenie-ui@0.2.0","dist":{"integrity":"sha512-jjFIB3thY6nYfRFM19kldMcBoUfCZrANcOnPxdBT2GbIqrEn/LbHm4+//EgH06PK1hfHdpf1HrzzXd06jHjTgw==","shasum":"b4ef7f3badfdad37684813089094fae5ec497bb8","tarball":"https://registry.npmjs.org/@bryan-cunningham-design/igenie-ui/-/igenie-ui-0.2.0.tgz","fileCount":274,"unpackedSize":994920,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGZ8ooPuqreaFhYeLP1R1DvFp1KdAcyydoeE6+QycuzXAiEAvRmZABVFsgZLfcAThtcIfrstAv+5tOx7RrCBrpsTaME="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:924b1fd8-0814-4425-87e8-47bd1dd76f06"}},"directories":{},"maintainers":[{"name":"jschr","email":"npm@jschr.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/igenie-ui_0.2.0_1787168257630_0.8104613449759903"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-17T02:14:16.967Z","modified":"2026-08-19T19:37:37.971Z","0.0.0":"2026-08-17T02:14:17.234Z","0.0.1":"2026-08-17T02:57:43.079Z","0.1.0":"2026-08-19T00:49:15.629Z","0.2.0":"2026-08-19T19:37:37.802Z"},"license":"UNLICENSED","homepage":"https://igenie-www.jschr.workers.dev/","keywords":["react","components","design-system","ui","react-components","tailwindcss"],"repository":{"type":"git","url":"git+https://github.com/Bryan-Cunningham-Design/iGenie.git","directory":"packages/ui"},"description":"i-Genie React component library — typed, accessible primitives with no copy of their own, themed entirely by CSS custom properties from @bryan-cunningham-design/igenie-tokens.","maintainers":[{"name":"jschr","email":"npm@jschr.io"}],"readme":"# @bryan-cunningham-design/igenie-ui\n\nReact component library for i-Genie: typed, accessible primitives built on\n[Base UI](https://base-ui.com). They carry no colour values and no user-facing\ncopy of their own — every surface, radius and shadow resolves to a token from\n`@bryan-cunningham-design/igenie-tokens`, and every string arrives through\n`children` or a prop. A new locale therefore costs nothing here.\n\nPrimitives only. The blocks are source you copy, not package API — see\n**Looking for the blocks?** below.\n\n## Install\n\n```sh\npnpm add @bryan-cunningham-design/igenie-ui @bryan-cunningham-design/igenie-tokens\n```\n\nOn the public npm registry — no token, no `.npmrc`. See\n[`docs/guides/engineer.md`](../../docs/guides/engineer.md) for the CSS setup that follows.\n\n## CSS setup — two lines\n\nTailwind v4 detects source files relative to wherever `@import \"tailwindcss\"`\nappears, so **your app owns that import**, not this package:\n\n```css\n@import \"tailwindcss\";\n@import \"@bryan-cunningham-design/igenie-ui/index.css\";\n```\n\nThat is the whole setup. `index.css` pulls in the tokens, the base-vega\nvariants, and an `@source \"./dist\"` that points Tailwind at this package's\ncompiled output so our class names survive your build. No `node_modules` paths\nto write, no Tailwind config to extend.\n\nDark mode activates on either `.dark` or `[data-theme=\"dark\"]` on an ancestor.\n\n**No Tailwind in your app?** Take one line instead of two:\n\n```css\n@import \"@bryan-cunningham-design/igenie-ui/standalone.css\";\n```\n\nThat is every component's CSS, compiled when this package was published, for an\napp that resolves it from a CDN and has no `node_modules` to scan. Take one or\nthe other and never both: this one carries Tailwind's preflight, and it cannot\nbe extended with utilities of your own.\n\n## Usage\n\n```tsx\nimport { Button, Card, CardContent } from \"@bryan-cunningham-design/igenie-ui\"\n```\n\nEvery component is a named export from the package root, with **one exception**,\nso a component moving between files inside the library is never a breaking change\nfor you.\n\n### The one exception: `Toaster`\n\n`Toaster` is not on the root. It lives behind its own subpath, and it is the only\ncomponent that needs a package you install yourself:\n\n```sh\npnpm add sonner\n```\n\n```tsx\nimport { Toaster } from \"@bryan-cunningham-design/igenie-ui/sonner\"\n```\n\nThat separation is deliberate rather than tidy-mindedness. `toast()` and\n`<Toaster>` talk to each other through one module-level store, so the library\ncannot ship its own copy of `sonner` without your toasts reaching a different\ntoaster than the one on your page. Putting it on the root instead would make\nyour bundler resolve `sonner` to build a `Button`, and break the build of anyone\nwho declined the install.\n\n`sonner` is marked optional in `peerDependenciesMeta`, so skipping the install is\nsilent and costs nothing until you import that path. Nothing else in the library\nis affected.\n\nThe full account — where to mount it, the three things that break it quietly, and\nwhy `richColors` also wants a `theme` prop — is under **Optional peers** in\n`docs/guides/engineer.md`.\n\n### The other subpaths, none of them a component\n\n- `@bryan-cunningham-design/igenie-ui/hooks/use-mobile` — `useIsMobile()`, a\n  `matchMedia` hook that returns `true` under **768px**. It is what `Sidebar`\n  uses to become a drawer, and it carries no peer.\n- `@bryan-cunningham-design/igenie-ui/index.css` — the stylesheet from the CSS\n  setup above, and `@bryan-cunningham-design/igenie-ui/standalone.css`, its\n  precompiled alternative.\n\n`SidebarProvider` writes its open state to a cookie named **`sidebar_state`**,\nwith the widths `16rem` expanded and `3rem` collapsed-to-icons. Read that cookie\non the server and pass it as `defaultOpen` if you want the sidebar to render in\nthe right state before hydration.\n\n### Looking for the blocks?\n\n`LoginForm`, `FilterPanel` and `StatsDashboard` are **not published**, and no\nlonger resolve from this package. A block is a whole screen — it decides where\nstate lives, what the labels say and how the fields are grouped — and none of\nthat can be reached from outside a subtree you do not render. So they are handed\nover as source instead: open\n[the Blocks gallery](https://igenie-www.jschr.workers.dev/blocks) and\ncopy the file. It imports this package by name, so it compiles unchanged. The\ngallery sits behind a sign-in — the site is private. The way in is your address\nin `.github/access-readers.jsonc`: a one-line pull request if you can see this\nrepository, and otherwise ask whoever gave you access to the package, since\nthey can open it for you.\n\n## Extending it in your own application\n\nYou never need to fork this package to get a variant it does not have. Three\nmoves cover it, all in your application's own stylesheet or source:\n\n- **Redefine a semantic variable** after the two imports, in both modes.\n- **Add your own `@theme` block.** Tailwind v4 merges theme namespaces, so\n  `--color-brand-500` mints `bg-brand-500` for your app and no other.\n- **Compose on an exported `cva` config.** `alertVariants`, `badgeVariants`,\n  `buttonVariants`, `buttonGroupVariants` and `tabsListVariants` are public; a\n  variant layered on one keeps receiving upstream fixes.\n\nEach is worked through on the docs site under **Theming → Extending the system in\nyour own application**.\n\n---\n\n# For maintainers of this library\n\nEverything below is about producing this package, not consuming it. If you\ninstalled it, you are done above.\n\n## `src/components/` is generated — do not edit it\n\n`src/components/*.tsx` and `styles/base.css` are vendored from the shadcn\nregistry by `scripts/vendor-ui.mjs`. Local edits are overwritten on the next\nre-vendor:\n\n```sh\npnpm ui:vendor\n```\n\nThat refetches every vendored component, rewrites their imports to local paths,\nresolves icons against `lucide-react`, refetches the vendored hooks, and\nregenerates `styles/base.css`. It is vendored rather than imported so the\nlibrary does not take a CLI as a runtime dependency. **Review the diff before\ncommitting** — an upstream change to a component's DOM structure is a visual\nchange to every consuming product.\n\nThe component list lives in `scripts/lib/registry.mjs`; add a name there and\nre-run the command to pull it in. To change how a component looks, either move\nthe token it resolves to, or wrap it in a new hand-written file — never patch\nthe vendored source.\n\n## Coverage against the upstream registry\n\n```sh\npnpm parity\n```\n\nDiffs the pinned `@shadcn` registry's component list against this library and\nprints the table as markdown for a pull request description. The inventory has\nexactly one definition — `scripts/lib/registry.mjs` — which is why the table\ncannot drift, and the shipped column is derived from the site registry, so\nnothing reads as implemented until it has a demo.\n\nFour statuses, matching `STATUS` in `scripts/parity.mjs`: **shipped**,\n**deferred** (would add a third-party runtime package not yet taken on),\n**recipe** (a documented composition with nothing to install, left out of the\ndenominator) and **planned**.\n\n**This report is deliberately not published on the docs site.** Coverage is a\nmaintainer's progress bar; on a consumer page it invites the reader to model the\nlibrary as a partial copy of something else.\n\n**Not every file in `src/components/` is generated.** A component whose banner\nsays FORKED has been ejected from the vendor set: `ui:vendor` skips it, upstream\nfixes no longer arrive on their own, and the file is hand-owned from then on.\n`FORKED` in `scripts/lib/registry.mjs` is the list, and it records the shadcn\nversion each fork happened at. Read the banner before you assume an edit will\nsurvive.\n\nHand-written code lives in `src/lib/` and `index.css`, and is safe to edit.\n\n### Seeing what upstream offers\n\n`pnpm parity` reports coverage against the pinned `@shadcn` registry. To look\nfurther — a namespaced or third-party registry the parity table knows nothing\nabout — search the CLI instead:\n\n```sh\npnpm dlx shadcn@4.16.2 search @shadcn -q <term> -t ui --cwd packages/ui\n```\n\nWith no registry argument it searches every registry listed in\n`components.json`. Finding a name there is not an instruction to run `add`: the\nroute in is still `COMPONENTS` in `scripts/lib/registry.mjs` plus\n`pnpm ui:vendor --only <name>`, which resolves the registry's import aliases and\nicon placeholders for you.\n\n### One-off `shadcn add`\n\n`components.json` is kept accurate so the CLI still works for a single item:\n\n```sh\npnpm dlx shadcn@4.16.2 add <name>\n```\n\nIt writes `@/lib/utils`-style imports. Rewrite them to relative paths\n(`../lib/utils`, `./button`) before building — the package ships unbundled, so\nan unresolved alias would reach consumers intact.\n\n**Keep `components.json` free of comments.** Biome parses it as JSONC and will\nnot complain, but the shadcn CLI parses it as strict JSON and dies on the first\n`//` — taking both commands above with it. The aliases in it exist only for\nthese one-offs; nothing in `src/` resolves them.\n\n## Build\n\n```sh\npnpm --filter @bryan-cunningham-design/igenie-ui build\n```\n\n`tsdown` emits per-module ESM plus declarations, unbundled and unminified. That\nis deliberate: bundling would collapse the per-file `\"use client\"` directives\nmost components rely on, and minifying would mangle the class strings Tailwind\nneeds to scan.\n\nTwo settings in `tsconfig.json` exist only to serve the vendored code, and\ncannot be commented inline because Biome parses this package's `tsconfig.json`\nas strict JSON:\n\n- `allowUmdGlobalAccess` — the registry ships `skeleton.tsx` using the `React`\n  UMD global with no import. Accommodating it here means a re-vendor never\n  needs a hand-edit.\n- `baseUrl` / `paths` — resolves the `@/` aliases in `components.json` so a\n  one-off `shadcn add` works. Nothing in `src/` uses them.\n","readmeFilename":""}