{"_id":"@baotek/kubo-ui","_rev":"3-32d6ff207b837aae01264f3c2a724a26","name":"@baotek/kubo-ui","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@baotek/kubo-ui","version":"0.1.0","_id":"@baotek/kubo-ui@0.1.0","maintainers":[{"name":"vcoder","email":"doanngocbao@gmail.com"}],"dist":{"shasum":"4f71191f052f054441d49a2604d32df957e7b956","tarball":"https://registry.npmjs.org/@baotek/kubo-ui/-/kubo-ui-0.1.0.tgz","fileCount":420,"integrity":"sha512-4RQrOfyKuy7zeH+NbCctQbxbAV8145I+VL0R81N6FG6jqf6Ldthwkmd01/itIp3QqMrthR8qU4hQxSSLg7uvGg==","signatures":[{"sig":"MEQCIAteC19JrujWJv2LDS2exSk7iMSrgMwqWoqPp3IkLXFGAiB1Nl44d4VEO8QdbFN9Rq59dr0fG/KvIKrqL2UT0JtwhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":587466},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && cp src/index.css dist/index.css","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","build-storybook":"storybook build"},"_npmUser":{"name":"vcoder","email":"doanngocbao@gmail.com"},"repository":{"url":"https://github.com/baotek/kubo.git","type":"git","directory":"packages/ui"},"directories":{},"_nodeVersion":"24.18.0","dependencies":{"clsx":"^2.1.1","lexical":"0.49.0","date-fns":"^4.4.0","radix-ui":"^1.6.7","recharts":"^3.10.1","us-atlas":"3.0.1","world-atlas":"^2.0.2","lucide-react":"^1.27.0","qrcode.react":"^4.2.0","@dnd-kit/core":"^6.3.1","@lexical/code":"0.49.0","@lexical/html":"0.49.0","@lexical/link":"0.49.0","@lexical/list":"0.49.0","@lexical/react":"0.49.0","@lexical/table":"0.49.0","@lexical/utils":"0.49.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","topojson-client":"^3.1.0","react-day-picker":"^10.0.1","@dnd-kit/sortable":"^10.0.0","@lexical/markdown":"0.49.0","@lexical/overflow":"0.49.0","react-simple-maps":"^3.0.0","@dnd-kit/utilities":"^3.2.2","@fullcalendar/core":"^6.1.21","@lexical/rich-text":"0.49.0","@lexical/selection":"0.49.0","@fullcalendar/react":"^6.1.21","@lexical/code-prism":"0.49.0","embla-carousel-react":"^8.6.0","@fullcalendar/daygrid":"^6.1.21","@fullcalendar/timegrid":"^6.1.21","class-variance-authority":"^0.7.1","@fullcalendar/interaction":"^6.1.21"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.10","jsdom":"^24.1.0","react":"^19.2.8","vitest":"^3.2.4","react-dom":"^19.2.8","storybook":"^10.5.5","tsc-alias":"^1.8.10","typescript":"~5.6.2","tailwindcss":"^4.2.2","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-react":"^4.3.3","@storybook/addon-a11y":"^10.5.5","@storybook/addon-docs":"^10.5.5","@storybook/react-vite":"^10.5.5","@testing-library/react":"^16.0.0","@types/topojson-client":"^3.1.5","@types/react-simple-maps":"^3.0.6","@testing-library/jest-dom":"^6.4.5","@testing-library/user-event":"^14.6.1"},"peerDependencies":{"react":"^19.2.8","react-dom":"^19.2.8"},"_npmOperationalInternal":{"tmp":"tmp/kubo-ui_0.1.0_1787989258082_0.9531867700750123","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@baotek/kubo-ui","version":"0.3.0","_id":"@baotek/kubo-ui@0.3.0","maintainers":[{"name":"vcoder","email":"doanngocbao@gmail.com"}],"dist":{"shasum":"e6012a0c29d65531b31215ae74d0d359685c4da4","tarball":"https://registry.npmjs.org/@baotek/kubo-ui/-/kubo-ui-0.3.0.tgz","fileCount":423,"integrity":"sha512-0ecM+a0Clj3Ppl2niEHxscB8LuNvH5To0aJcHL5qe5HzlIizEyBM8lNZf1SV7MXHqN0panNFnzmlLf86yAHZKw==","signatures":[{"sig":"MEUCIFUb9Kyngb3l++yeEhGOpVpDzNODVqlMu1Wo/CkbTpSVAiEA5Anv9SF3FjSwnDyzgBZX++x3H+H0tST2dyg1XG5HfII=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":610260},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && cp src/index.css dist/index.css","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","build-storybook":"storybook build"},"_npmUser":{"name":"vcoder","email":"doanngocbao@gmail.com"},"repository":{"url":"https://github.com/baotek/kubo.git","type":"git","directory":"packages/ui"},"directories":{},"_nodeVersion":"24.18.0","dependencies":{"clsx":"^2.1.1","lexical":"0.49.0","date-fns":"^4.4.0","radix-ui":"^1.6.7","recharts":"^3.10.1","us-atlas":"3.0.1","world-atlas":"^2.0.2","lucide-react":"^1.27.0","qrcode.react":"^4.2.0","@dnd-kit/core":"^6.3.1","@lexical/code":"0.49.0","@lexical/html":"0.49.0","@lexical/link":"0.49.0","@lexical/list":"0.49.0","@lexical/react":"0.49.0","@lexical/table":"0.49.0","@lexical/utils":"0.49.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","topojson-client":"^3.1.0","react-day-picker":"^10.0.1","@dnd-kit/sortable":"^10.0.0","@lexical/markdown":"0.49.0","@lexical/overflow":"0.49.0","react-simple-maps":"^3.0.0","@dnd-kit/utilities":"^3.2.2","@fullcalendar/core":"^6.1.21","@lexical/rich-text":"0.49.0","@lexical/selection":"0.49.0","@fullcalendar/react":"^6.1.21","@lexical/code-prism":"0.49.0","embla-carousel-react":"^8.6.0","@fullcalendar/daygrid":"^6.1.21","@fullcalendar/timegrid":"^6.1.21","class-variance-authority":"^0.7.1","@fullcalendar/interaction":"^6.1.21"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.10","jsdom":"^24.1.0","react":"^19.2.8","vitest":"^3.2.4","react-dom":"^19.2.8","storybook":"^10.5.5","tsc-alias":"^1.8.10","typescript":"~5.6.2","tailwindcss":"^4.2.2","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-react":"^4.3.3","@storybook/addon-a11y":"^10.5.5","@storybook/addon-docs":"^10.5.5","@storybook/react-vite":"^10.5.5","@testing-library/react":"^16.0.0","@types/topojson-client":"^3.1.5","@types/react-simple-maps":"^3.0.6","@testing-library/jest-dom":"^6.4.5","@testing-library/user-event":"^14.6.1"},"peerDependencies":{"react":"^19.2.8","react-dom":"^19.2.8"},"_npmOperationalInternal":{"tmp":"tmp/kubo-ui_0.3.0_1788358515019_0.4095830098618387","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@baotek/kubo-ui","version":"0.4.0","repository":{"type":"git","url":"https://github.com/baotek/kubo.git","directory":"packages/ui"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","publishConfig":{"access":"public"},"peerDependencies":{"react":"^19.2.8","react-dom":"^19.2.8"},"dependencies":{"@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@fullcalendar/core":"^6.1.21","@fullcalendar/daygrid":"^6.1.21","@fullcalendar/interaction":"^6.1.21","@fullcalendar/react":"^6.1.21","@fullcalendar/timegrid":"^6.1.21","@lexical/code":"0.49.0","@lexical/code-prism":"0.49.0","@lexical/html":"0.49.0","@lexical/link":"0.49.0","@lexical/list":"0.49.0","@lexical/markdown":"0.49.0","@lexical/overflow":"0.49.0","@lexical/react":"0.49.0","@lexical/rich-text":"0.49.0","@lexical/selection":"0.49.0","@lexical/table":"0.49.0","@lexical/utils":"0.49.0","@standard-schema/spec":"^1.1.0","class-variance-authority":"^0.7.1","clsx":"^2.1.1","date-fns":"^4.4.0","embla-carousel-react":"^8.6.0","lexical":"0.49.0","lucide-react":"^1.27.0","qrcode.react":"^4.2.0","radix-ui":"^1.6.7","react-day-picker":"^10.0.1","react-simple-maps":"^3.0.0","recharts":"^3.10.1","tailwind-merge":"^3.6.0","topojson-client":"^3.1.0","tw-animate-css":"^1.4.0","us-atlas":"3.0.1","world-atlas":"^2.0.2"},"devDependencies":{"@storybook/addon-a11y":"^10.5.5","@storybook/addon-docs":"^10.5.5","@storybook/react-vite":"^10.5.5","@tailwindcss/vite":"^4.2.2","@testing-library/jest-dom":"^6.4.5","@testing-library/react":"^16.0.0","@testing-library/user-event":"^14.6.1","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","@types/react-simple-maps":"^3.0.6","@types/topojson-client":"^3.1.5","@vitejs/plugin-react":"^4.3.3","jsdom":"^24.1.0","react":"^19.2.8","react-dom":"^19.2.8","storybook":"^10.5.5","tailwindcss":"^4.2.2","tsc-alias":"^1.8.10","typescript":"~5.6.2","vite":"^5.4.10","vitest":"^3.2.4"},"scripts":{"typecheck":"tsc --noEmit","build":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json -f && cp src/index.css dist/index.css","test":"vitest run","test:watch":"vitest","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"_nodeVersion":"24.18.0","_id":"@baotek/kubo-ui@0.4.0","dist":{"integrity":"sha512-XgEiG2Vj4Z+GRYjhVpDacjk28H38E1oGxeveOwvQFKFCJMFwE3A2KtaxNWw50TRn+AZv+O6pc8SHSfy/rwwaAg==","shasum":"afba7e1b35271f2c8bef58be00a1f3883d7093e4","tarball":"https://registry.npmjs.org/@baotek/kubo-ui/-/kubo-ui-0.4.0.tgz","fileCount":594,"unpackedSize":854414,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC/qLhcHlKRWDxoewYnfFBgTEFsCYcCyPiOUfeGZeu0lwIhAKUQ6N0AJzVo+pA7s33w5TA1GPtza3dWCy/3nB756K9r"}]},"_npmUser":{"name":"vcoder","email":"doanngocbao@gmail.com"},"directories":{},"maintainers":[{"name":"vcoder","email":"doanngocbao@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kubo-ui_0.4.0_1788580291595_0.6881055141267554"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-29T07:40:57.046Z","modified":"2026-09-05T03:51:31.899Z","0.1.0":"2026-08-29T07:40:58.235Z","0.3.0":"2026-09-02T14:15:15.172Z","0.4.0":"2026-09-05T03:51:31.737Z"},"repository":{"type":"git","url":"https://github.com/baotek/kubo.git","directory":"packages/ui"},"maintainers":[{"name":"vcoder","email":"doanngocbao@gmail.com"}],"readme":"# @baotek/kubo-ui\n\nComponent library for Kubo back-office apps. Pure React components, Tailwind v4 + radix-ui + shadcn conventions\n(`style: \"new-york\"`), light/dark theme via CSS variables. No dependency on `@baotek/kubo-core`, no router import -\ncomponents that render navigation (`Button`'s `to` prop, `Breadcrumb`, `StatCard`) read a router-agnostic link\ncomponent via context instead, defaulting to a plain `<a href>`.\n\n## Install\n\n```bash\npnpm add @baotek/kubo-ui\n```\n\nImport the stylesheet once, alongside Tailwind, in your app's global CSS:\n\n```css\n@import 'tailwindcss';\n@import '@baotek/kubo-ui/dist/index.css';\n```\n\n## What's in it\n\n- **Primitives** - `Button`, `TextField`, `SelectField`, `MultiSelectField`, `DateField`, `NumberField`,\n  `CheckboxField`, `SearchSelect`, `StatusSelect`, `Badge`, `Avatar`, `Spinner`, `Skeleton`, `ProgressBar`,\n  `DangerLink`, and more.\n- **Composites** - `DataTable`, `FilterBar`, `Pagination`, `Modal`, `SlideOver`, `ConfirmDialog`, `PageActionBar`,\n  `Breadcrumb`, `EmptyState`, `ErrorBanner`, `StatCard`, `SegmentedTabs`, `TabStrip`, `Cascader`, `TreeSelect`,\n  `Transfer`, `RichTextField`, and more.\n- **Theme** - `ThemeProvider`, `useTheme`, `ThemeToggle`, light/dark via CSS variables.\n- **Router integration** - `LinkComponentProvider` + `useLinkComponent`, override once with your app's own `Link`\n  (react-router-dom's `Link` works directly; Next's `Link` needs a small `to`-to-`href` wrapper since its prop\n  name differs).\n\nBrowse every component's stories and props with Storybook - clone the Kubo monorepo and run\n`pnpm --filter @baotek/kubo-ui storybook`.\n\n`NumberField` keeps the controlled value as a raw numeric string and can format it for display:\n\n```tsx\n<NumberField label=\"Budget\" value={amount} onChange={setAmount} format=\"money\" currency=\"USD\" />\n<NumberField label=\"Discount\" value={discount} onChange={setDiscount} format=\"percentage\" min={0} max={100} />\n```\n\nFor a domain-specific format, pass an object with `format` and `parse` functions. `MoneyField` and\n`PercentageField` remain available as compatibility wrappers around these `NumberField` formats.\n\n## Usage\n\n```tsx\nimport { ThemeProvider, LinkComponentProvider, Button } from '@baotek/kubo-ui'\nimport { Link } from 'react-router-dom'\n\nfunction App() {\n  return (\n    <ThemeProvider>\n      <LinkComponentProvider component={Link}>\n        <Button to=\"/orders\">View orders</Button>\n      </LinkComponentProvider>\n    </ThemeProvider>\n  )\n}\n```\n\nPairs with `@baotek/kubo-core` for the headless data/auth layer. Both are scaffolded automatically into new apps by\nKubo's `kubo-init-app` agent skill.\n\nSource: https://github.com/baotek/kubo.git (`packages/ui`).\n","readmeFilename":""}