kuzenbo 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -49
- package/dist/{accordion-trigger-TjAe8JHy.js → accordion-trigger-CBNEjvdN.js} +5 -5
- package/dist/{alert-dialog-trigger-BV0BsaVU.d.ts → alert-dialog-trigger-CdIeDiEN.d.ts} +9 -3
- package/dist/{autocomplete-value-DNJ3sAIH.js → autocomplete-value-pfdgBCRQ.js} +1 -1
- package/dist/{collapsible-trigger-aZF7_mPR.d.ts → collapsible-trigger-CsOUVawu.d.ts} +1 -0
- package/dist/{collapsible-trigger-DcQWODN-.js → collapsible-trigger-pasJA2DN.js} +2 -1
- package/dist/{command-shortcut-DoWM7Mnm.js → command-shortcut-CZBOAIwj.js} +2 -2
- package/dist/{context-menu-trigger-Du2vcTco.d.ts → context-menu-trigger-B0XlwMGL.d.ts} +1 -1
- package/dist/{context-menu-trigger-CYBhdcpg.js → context-menu-trigger-Clvpgkux.js} +1 -1
- package/dist/{dropdown-menu-trigger-IKeAoU_a.js → dropdown-menu-trigger-9lTHiBXO.js} +2 -2
- package/dist/{dropdown-menu-trigger-CFdruqOk.d.ts → dropdown-menu-trigger-Cu7FRDWi.d.ts} +1 -1
- package/dist/{emoji-picker-skin-tone-selector-Cmv-1vDO.js → emoji-picker-skin-tone-selector-DLVbr1DP.js} +1 -1
- package/dist/{form-field-title-CNrq8v88.js → form-field-title-yHlRTY8k.js} +1 -1
- package/dist/index.d.ts +50 -49
- package/dist/index.js +58 -56
- package/dist/{input-otp-slot-DWbXhUmU.js → input-otp-slot-D-d0Oaso.js} +2 -2
- package/dist/{menubar-trigger-aKMWAxdz.js → menubar-trigger-C_1qtxcN.js} +2 -2
- package/dist/{menubar-trigger-BLg3XdRv.d.ts → menubar-trigger-FK9_4CNA.d.ts} +1 -1
- package/dist/{pill-status-rg-3AMSI.d.ts → pill-status-BP91omTJ.d.ts} +1 -1
- package/dist/{pill-status-CD9XXuE7.js → pill-status-olkjgs--.js} +1 -1
- package/dist/{radio-group-item-CQjCazjw.js → radio-group-item--7jaItG4.js} +2 -2
- package/dist/{select-value-BUnWentK.js → select-value-CmrmAU0D.js} +2 -2
- package/dist/{sidebar-trigger-BCjVuIqi.js → sidebar-trigger-PYMxJoPc.js} +19 -3
- package/dist/styles.css +150 -80
- package/dist/{tabs-trigger-BGo2XGvh.d.ts → tabs-trigger-b-DAMY-c.d.ts} +9 -3
- package/dist/tabs-trigger-sHl26DET.js +47 -0
- package/dist/{toggle-group-item-Bz_ohmnY.d.ts → toggle-group-item-DhP3zDbB.d.ts} +2 -2
- package/dist/ui/accordion.d.ts +1 -1
- package/dist/ui/accordion.js +2 -2
- package/dist/ui/affix.js +1 -1
- package/dist/ui/alert-dialog.d.ts +45 -45
- package/dist/ui/alert-dialog.js +1 -1
- package/dist/ui/alert.d.ts +1 -4
- package/dist/ui/alert.js +1 -6
- package/dist/ui/announcement.d.ts +1 -1
- package/dist/ui/announcement.js +1 -1
- package/dist/ui/autocomplete.d.ts +1 -1
- package/dist/ui/autocomplete.js +1 -1
- package/dist/ui/avatar.d.ts +1 -1
- package/dist/ui/avatar.js +1 -1
- package/dist/ui/badge.d.ts +2 -5
- package/dist/ui/badge.js +1 -2
- package/dist/ui/breadcrumb.d.ts +1 -1
- package/dist/ui/breadcrumb.js +1 -1
- package/dist/ui/button-group.d.ts +45 -45
- package/dist/ui/button-group.js +1 -1
- package/dist/ui/button.d.ts +5 -5
- package/dist/ui/button.js +2 -2
- package/dist/ui/calendar.d.ts +1 -1
- package/dist/ui/calendar.js +1 -1
- package/dist/ui/card.d.ts +1 -1
- package/dist/ui/card.js +1 -1
- package/dist/ui/carousel.d.ts +45 -45
- package/dist/ui/carousel.js +1 -1
- package/dist/ui/chart.d.ts +1 -1
- package/dist/ui/chart.js +1 -1
- package/dist/ui/checkbox.js +1 -1
- package/dist/ui/collapsible.d.ts +3 -1
- package/dist/ui/collapsible.js +4 -2
- package/dist/ui/combobox.d.ts +1 -1
- package/dist/ui/combobox.js +1 -1
- package/dist/ui/command.d.ts +45 -45
- package/dist/ui/command.js +1 -1
- package/dist/ui/context-menu.d.ts +2 -2
- package/dist/ui/context-menu.js +1 -1
- package/dist/ui/dialog.d.ts +1 -1
- package/dist/ui/dialog.js +1 -1
- package/dist/ui/drawer.d.ts +1 -1
- package/dist/ui/drawer.js +1 -1
- package/dist/ui/dropdown-menu.d.ts +2 -2
- package/dist/ui/dropdown-menu.js +1 -1
- package/dist/ui/dropzone.d.ts +1 -1
- package/dist/ui/dropzone.js +6 -6
- package/dist/ui/emoji-picker.d.ts +1 -1
- package/dist/ui/emoji-picker.js +1 -1
- package/dist/ui/empty.d.ts +1 -1
- package/dist/ui/empty.js +1 -1
- package/dist/ui/form-field.d.ts +47 -47
- package/dist/ui/form-field.js +2 -2
- package/dist/ui/hover-card.d.ts +1 -1
- package/dist/ui/hover-card.js +1 -1
- package/dist/ui/input-group.d.ts +45 -45
- package/dist/ui/input-group.js +2 -2
- package/dist/ui/input-otp.d.ts +1 -1
- package/dist/ui/input-otp.js +1 -1
- package/dist/ui/input.js +1 -1
- package/dist/ui/item.d.ts +45 -45
- package/dist/ui/item.js +1 -1
- package/dist/ui/kbd.d.ts +1 -1
- package/dist/ui/kbd.js +1 -1
- package/dist/ui/marquee.d.ts +1 -1
- package/dist/ui/marquee.js +1 -1
- package/dist/ui/menubar.d.ts +4 -4
- package/dist/ui/menubar.js +1 -1
- package/dist/ui/meter.d.ts +1 -1
- package/dist/ui/meter.js +1 -1
- package/dist/ui/navigation-menu.d.ts +1 -1
- package/dist/ui/navigation-menu.js +1 -1
- package/dist/ui/number-field.d.ts +1 -1
- package/dist/ui/number-field.js +1 -1
- package/dist/ui/pagination.d.ts +1 -1
- package/dist/ui/pagination.js +1 -1
- package/dist/ui/pill.d.ts +2 -2
- package/dist/ui/pill.js +1 -1
- package/dist/ui/popover.d.ts +1 -1
- package/dist/ui/popover.js +1 -1
- package/dist/ui/portal.js +1 -1
- package/dist/ui/progress.d.ts +1 -1
- package/dist/ui/progress.js +1 -1
- package/dist/ui/radio-group.d.ts +1 -1
- package/dist/ui/radio-group.js +1 -1
- package/dist/ui/rating.d.ts +1 -1
- package/dist/ui/rating.js +1 -1
- package/dist/ui/resizable.d.ts +1 -1
- package/dist/ui/resizable.js +1 -1
- package/dist/ui/scroll-area.d.ts +1 -1
- package/dist/ui/scroll-area.js +1 -1
- package/dist/ui/select.d.ts +1 -1
- package/dist/ui/select.js +1 -1
- package/dist/ui/sheet.d.ts +1 -1
- package/dist/ui/sheet.js +1 -1
- package/dist/ui/sidebar.d.ts +45 -45
- package/dist/ui/sidebar.js +2 -2
- package/dist/ui/slider.js +5 -5
- package/dist/ui/switch.js +1 -1
- package/dist/ui/table.d.ts +1 -1
- package/dist/ui/table.js +2 -2
- package/dist/ui/tabs.d.ts +8 -4
- package/dist/ui/tabs.js +4 -3
- package/dist/ui/textarea.js +1 -1
- package/dist/ui/theme-icon.d.ts +0 -3
- package/dist/ui/theme-icon.js +0 -1
- package/dist/ui/timeline.d.ts +1 -1
- package/dist/ui/timeline.js +1 -1
- package/dist/ui/toast.d.ts +1 -1
- package/dist/ui/toast.js +1 -1
- package/dist/ui/toggle-group.d.ts +1 -1
- package/dist/ui/toggle-group.js +1 -1
- package/dist/ui/toggle.d.ts +2 -2
- package/dist/ui/toggle.js +1 -1
- package/dist/ui/toolbar.d.ts +1 -1
- package/dist/ui/toolbar.js +1 -1
- package/dist/ui/tooltip.d.ts +1 -1
- package/dist/ui/tooltip.js +1 -1
- package/dist/ui/video-player.d.ts +1 -1
- package/dist/ui/video-player.js +2 -2
- package/dist/{use-combobox-anchor-2KUf_cBk.js → use-combobox-anchor-DAlFIblJ.js} +3 -3
- package/dist/{hooks/use-isomorphic-effect.js → use-isomorphic-effect-B526mIPj.js} +2 -2
- package/package.json +4 -2
- package/dist/hooks/use-isomorphic-effect.d.ts +0 -7
- package/dist/hooks/use-mobile.d.ts +0 -4
- package/dist/hooks/use-mobile.js +0 -20
- package/dist/tabs-trigger-B2mBxFgq.js +0 -38
- package/dist/ui/surface.d.ts +0 -41
- package/dist/ui/surface.js +0 -31
- /package/dist/{accordion-trigger-D5XnBMS6.d.ts → accordion-trigger-DS7GoZJ-.d.ts} +0 -0
- /package/dist/{alert-dialog-trigger-D5BRoizR.js → alert-dialog-trigger-B_z1oiLz.js} +0 -0
- /package/dist/{alert-title-CISzcj0X.js → alert-title-ExZs5keC.js} +0 -0
- /package/dist/{alert-title-CVC9G-Xf.d.ts → alert-title-jPZO4E_r.d.ts} +0 -0
- /package/dist/{announcement-title-CIwzt9Wl.js → announcement-title-CdtgA20P.js} +0 -0
- /package/dist/{announcement-title-CCZuGB1O.d.ts → announcement-title-MSxuhOYI.d.ts} +0 -0
- /package/dist/{autocomplete-value-BhyszIrf.d.ts → autocomplete-value-CW6y5RIv.d.ts} +0 -0
- /package/dist/{avatar-image-Bw3G-Bl6.js → avatar-image-rGQgzpqU.js} +0 -0
- /package/dist/{avatar-image-BKgKyzVw.d.ts → avatar-image-tEBxzRcz.d.ts} +0 -0
- /package/dist/{breadcrumb-separator-Do-19Uow.js → breadcrumb-separator-Cc2MRMYk.js} +0 -0
- /package/dist/{breadcrumb-separator-D66-B1DA.d.ts → breadcrumb-separator-R0bh7fr6.d.ts} +0 -0
- /package/dist/{button-group-text-D98w78rH.js → button-group-text-DIHHR4l-.js} +0 -0
- /package/dist/{calendar-week-number-in2gpvA_.d.ts → calendar-week-number-07NlKKIU.d.ts} +0 -0
- /package/dist/{calendar-week-number-6AXvZ4Ij.js → calendar-week-number-BbsMLOhj.js} +0 -0
- /package/dist/{card-title-CbRPAh3M.js → card-title-DEFkzWpx.js} +0 -0
- /package/dist/{card-title-DSDluDoy.d.ts → card-title-yHNJLfRi.d.ts} +0 -0
- /package/dist/{carousel-previous-B_jysGv_.js → carousel-previous-Ylv4k7cM.js} +0 -0
- /package/dist/{chart-tooltip-content-h5oLtil-.js → chart-tooltip-content-BSoCk6re.js} +0 -0
- /package/dist/{dialog-trigger-CR23tYql.js → dialog-trigger-BIi6VdZI.js} +0 -0
- /package/dist/{dialog-trigger-xeE4e96-.d.ts → dialog-trigger-DWnrccK7.d.ts} +0 -0
- /package/dist/{drawer-trigger-7jI4Zmqs.js → drawer-trigger-CwbUpPuj.js} +0 -0
- /package/dist/{drawer-trigger-H_Wv5R00.d.ts → drawer-trigger-DdwAuUs0.d.ts} +0 -0
- /package/dist/{dropzone-context-BRX1K7nw.d.ts → dropzone-context-DIufAjWO.d.ts} +0 -0
- /package/dist/{dropzone-status-CW-3AXuh.js → dropzone-status-C5e5GRFB.js} +0 -0
- /package/dist/{emoji-picker-skin-tone-selector-yMYxt4oJ.d.ts → emoji-picker-skin-tone-selector-DD9k5QI_.d.ts} +0 -0
- /package/dist/{empty-title-CH3DhcfT.d.ts → empty-title-Bhh7we1b.d.ts} +0 -0
- /package/dist/{empty-title-CHNBH7WJ.js → empty-title-CdxBavig.js} +0 -0
- /package/dist/{hover-card-trigger-BqVoZ7h4.d.ts → hover-card-trigger-CBf6WcGs.d.ts} +0 -0
- /package/dist/{hover-card-trigger-B9jf3FEB.js → hover-card-trigger-DR0u6BZ4.js} +0 -0
- /package/dist/{input-group-textarea-voYOV11-.js → input-group-textarea-CCjRXkX4.js} +0 -0
- /package/dist/{input-otp-slot-eVdOjx8C.d.ts → input-otp-slot-BErXw9FH.d.ts} +0 -0
- /package/dist/{item-title-BYrYJZpa.js → item-title-CvHI3e3Y.js} +0 -0
- /package/dist/{kbd-group-D3yVrb2D.d.ts → kbd-group-7wV7bL2M.d.ts} +0 -0
- /package/dist/{kbd-group-CT-Xtgug.js → kbd-group-BxWg4ZhD.js} +0 -0
- /package/dist/{marquee-item-DD6JuLJ4.d.ts → marquee-item-D86cCq7E.d.ts} +0 -0
- /package/dist/{marquee-item-BGJ5NSiz.js → marquee-item-vuWoN3sq.js} +0 -0
- /package/dist/{meter-value-BmxUICOA.js → meter-value-Cb1H7ZbK.js} +0 -0
- /package/dist/{meter-value-DYkZLCtx.d.ts → meter-value-Sz9JPruo.d.ts} +0 -0
- /package/dist/{navigation-menu-trigger-Bf60DnIz.d.ts → navigation-menu-trigger-Di9rylbK.d.ts} +0 -0
- /package/dist/{navigation-menu-trigger-D80wiliM.js → navigation-menu-trigger-ePhRqBwZ.js} +0 -0
- /package/dist/{number-field-scrub-area-CXSyafBE.js → number-field-scrub-area-D2OohDcd.js} +0 -0
- /package/dist/{optional-portal-C7TpYnOc.js → optional-portal-Cmd6AV6i.js} +0 -0
- /package/dist/{pagination-previous-DPZrRgiD.js → pagination-previous-B-xa1qOU.js} +0 -0
- /package/dist/{pagination-previous-qJeZZTou.d.ts → pagination-previous-rlt_81Ro.d.ts} +0 -0
- /package/dist/{popover-trigger-C8dP_u7N.js → popover-trigger-CXpYfNF4.js} +0 -0
- /package/dist/{popover-trigger-B9PVErig.d.ts → popover-trigger-xSElKHdp.d.ts} +0 -0
- /package/dist/{progress-value-CFlgP0nv.d.ts → progress-value-6IvMRIci.d.ts} +0 -0
- /package/dist/{progress-value-CfCodKnX.js → progress-value-pNWZcqjC.js} +0 -0
- /package/dist/{radio-group-item-09fw05Va.d.ts → radio-group-item-BXo3VTzo.d.ts} +0 -0
- /package/dist/{rating-star-6ov3lbpn.d.ts → rating-star-HYykkq_A.d.ts} +0 -0
- /package/dist/{rating-star-BuLQfAnZ.js → rating-star-soj6BRIW.js} +0 -0
- /package/dist/{resizable-panel-BO97wcPj.js → resizable-panel-BK2nPr3X.js} +0 -0
- /package/dist/{resizable-panel-B4lAr8Vb.d.ts → resizable-panel-BLxf8KOK.d.ts} +0 -0
- /package/dist/{scroll-bar-BQzpb5hF.js → scroll-bar-CA3VyQeL.js} +0 -0
- /package/dist/{scroll-bar-vYvxEOph.d.ts → scroll-bar-DUu-cvF7.d.ts} +0 -0
- /package/dist/{select-value-DG31IHy3.d.ts → select-value-E-XXrxBv.d.ts} +0 -0
- /package/dist/{sheet-trigger-CLgKANrf.d.ts → sheet-trigger-C9ZnbeoR.d.ts} +0 -0
- /package/dist/{sheet-trigger-CUU7xwUn.js → sheet-trigger-DzJvkW0h.js} +0 -0
- /package/dist/{table-row-D63xalkM.js → table-row-BppZkNj-.js} +0 -0
- /package/dist/{table-row-BxhKJPfE.d.ts → table-row-DUGd6u8L.d.ts} +0 -0
- /package/dist/{timeline-title-BH8JxX2n.js → timeline-title-BVQDAVnN.js} +0 -0
- /package/dist/{toggle-group-item-aggwtgam.js → toggle-group-item-T9jgQjvQ.js} +0 -0
- /package/dist/{toolbar-separator-7CgKz2aX.d.ts → toolbar-separator-BvbYC4B-.d.ts} +0 -0
- /package/dist/{toolbar-separator-Bre5OtBI.js → toolbar-separator-ByfKxpoR.js} +0 -0
- /package/dist/{tooltip-trigger-CrAGfaqr.d.ts → tooltip-trigger--TzAy0uR.d.ts} +0 -0
- /package/dist/{tooltip-trigger-Z-aPDRog.js → tooltip-trigger-CewKT_FO.js} +0 -0
- /package/dist/{use-chart-BRpzPrMJ.d.ts → use-chart-D5HxjvG6.d.ts} +0 -0
- /package/dist/{use-combobox-anchor-ByuqnpKH.d.ts → use-combobox-anchor-izP5cymG.d.ts} +0 -0
- /package/dist/{use-number-field-Dzl9JLNK.d.ts → use-number-field-CtnA7PEy.d.ts} +0 -0
- /package/dist/{use-timeline-BRlmxoQ7.d.ts → use-timeline-BmLR_3cf.d.ts} +0 -0
- /package/dist/{use-toast-DjRKuQG6.js → use-toast-DZNyqQvY.js} +0 -0
- /package/dist/{use-toast-BGG4leSx.d.ts → use-toast-DmR_3Py8.d.ts} +0 -0
- /package/dist/{video-player-volume-range-D971L6mz.d.ts → video-player-volume-range-BPis3M5T.d.ts} +0 -0
- /package/dist/{video-player-volume-range-V7x0b1-r.js → video-player-volume-range-DWNwNMKD.js} +0 -0
package/README.md
CHANGED
|
@@ -8,35 +8,14 @@ Combines the best design patterns from [shadcn/ui](https://ui.shadcn.com/), [Her
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install kuzenbo
|
|
11
|
+
# or
|
|
12
|
+
pnpm add kuzenbo
|
|
13
|
+
# or
|
|
14
|
+
yarn add kuzenbo
|
|
15
|
+
# or
|
|
16
|
+
bun add kuzenbo
|
|
11
17
|
```
|
|
12
18
|
|
|
13
|
-
### Peer Dependencies
|
|
14
|
-
|
|
15
|
-
React is required:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npm install react react-dom
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Some components require additional peer dependencies. Install only what you need:
|
|
22
|
-
|
|
23
|
-
| Component | Required packages |
|
|
24
|
-
| ----------- | ------------------------------------- |
|
|
25
|
-
| Calendar | `react-day-picker` |
|
|
26
|
-
| Carousel | `embla-carousel embla-carousel-react` |
|
|
27
|
-
| Chart | `recharts` |
|
|
28
|
-
| Command | `cmdk` |
|
|
29
|
-
| CountryFlag | `country-flag-icons` |
|
|
30
|
-
| Drawer | `vaul` |
|
|
31
|
-
| Dropzone | `react-dropzone` |
|
|
32
|
-
| EmojiPicker | `frimousse` |
|
|
33
|
-
| InputOTP | `input-otp` |
|
|
34
|
-
| Marquee | `react-fast-marquee` |
|
|
35
|
-
| QRCode | `qrcode culori` |
|
|
36
|
-
| Resizable | `react-resizable-panels` |
|
|
37
|
-
| Textarea | `react-textarea-autosize` |
|
|
38
|
-
| VideoPlayer | `media-chrome` |
|
|
39
|
-
|
|
40
19
|
## Tailwind CSS v4 Setup
|
|
41
20
|
|
|
42
21
|
Kuzenbo requires Tailwind CSS v4. Add the following to your main CSS file:
|
|
@@ -47,10 +26,20 @@ Kuzenbo requires Tailwind CSS v4. Add the following to your main CSS file:
|
|
|
47
26
|
@source "../node_modules/kuzenbo/dist";
|
|
48
27
|
```
|
|
49
28
|
|
|
50
|
-
|
|
51
|
-
|
|
29
|
+
**Two directives, different resolution:**
|
|
30
|
+
|
|
31
|
+
- **`@import "kuzenbo/styles.css"`** — Uses a package specifier. Your bundler (Vite, webpack, etc.) resolves it from `node_modules`, so no path adjustment needed. This pulls in theme tokens (colors, radius) and default light/dark mode values.
|
|
32
|
+
- **`@source "../node_modules/kuzenbo/dist"`** — Uses a filesystem path. Tailwind's content scanner does not resolve package names; it expects a path relative to the CSS file. This tells Tailwind where to scan for utility classes.
|
|
33
|
+
|
|
34
|
+
**Path adjustment:** The `@source` path is relative to your main CSS file. Examples:
|
|
52
35
|
|
|
53
|
-
|
|
36
|
+
| CSS file location | `@source` path |
|
|
37
|
+
| ------------------ | --------------------------------- |
|
|
38
|
+
| `src/app.css` | `../node_modules/kuzenbo/dist` |
|
|
39
|
+
| `app/globals.css` | `../node_modules/kuzenbo/dist` |
|
|
40
|
+
| `styles/index.css` | `../../node_modules/kuzenbo/dist` |
|
|
41
|
+
|
|
42
|
+
With **pnpm**, you may need the explicit dist path (e.g. `../node_modules/kuzenbo/dist`) rather than just `../node_modules/kuzenbo` due to symlinks.
|
|
54
43
|
|
|
55
44
|
### Customizing the theme
|
|
56
45
|
|
|
@@ -79,6 +68,81 @@ export default function App() {
|
|
|
79
68
|
}
|
|
80
69
|
```
|
|
81
70
|
|
|
71
|
+
### CSP Provider
|
|
72
|
+
|
|
73
|
+
Re-exported from Base UI — [docs](https://base-ui.com/react/utils/csp-provider). For apps enforcing strict Content Security Policy, wrap your app with `CSPProvider`:
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
import { CSPProvider, Button } from "kuzenbo";
|
|
77
|
+
|
|
78
|
+
function App({ nonce }: { nonce?: string }) {
|
|
79
|
+
return (
|
|
80
|
+
<CSPProvider nonce={nonce}>
|
|
81
|
+
<Button>Click me</Button>
|
|
82
|
+
</CSPProvider>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Or use `disableStyleElements` to avoid inline `<style>` tags (rely on external CSS instead).
|
|
88
|
+
|
|
89
|
+
### Direction Provider
|
|
90
|
+
|
|
91
|
+
Re-exported from Base UI — [docs](https://base-ui.com/react/utils/direction-provider). For RTL support, wrap your app with `DirectionProvider` (also set `dir="rtl"` on a parent):
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
import { DirectionProvider, Slider } from "kuzenbo";
|
|
95
|
+
|
|
96
|
+
export default function RTLExample() {
|
|
97
|
+
return (
|
|
98
|
+
<div dir="rtl">
|
|
99
|
+
<DirectionProvider direction="rtl">
|
|
100
|
+
<Slider defaultValue={25} />
|
|
101
|
+
</DirectionProvider>
|
|
102
|
+
</div>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### mergeProps
|
|
108
|
+
|
|
109
|
+
Re-exported from Base UI — [docs](https://base-ui.com/react/utils/merge-props). Merges multiple prop objects (e.g. internal + user props). Rightmost wins for most keys; `className` is concatenated; event handlers run in order (rightmost first):
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
import { mergeProps } from "kuzenbo";
|
|
113
|
+
|
|
114
|
+
// In a render callback or custom component
|
|
115
|
+
<button
|
|
116
|
+
{...mergeProps<"button">(
|
|
117
|
+
{ className: "base", onClick: handlerA },
|
|
118
|
+
{ className: "override", onClick: handlerB }
|
|
119
|
+
)}
|
|
120
|
+
/>;
|
|
121
|
+
// Result: className="override base", both onClick handlers run (handlerB first)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Call `event.preventBaseUIHandler()` in handlers to skip Base UI's internal logic.
|
|
125
|
+
|
|
126
|
+
### useRender
|
|
127
|
+
|
|
128
|
+
Re-exported from Base UI — [docs](https://base-ui.com/react/utils/use-render). Hook for building custom components with a `render` prop (alternative to `asChild`):
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
import { useRender, mergeProps } from "kuzenbo";
|
|
132
|
+
|
|
133
|
+
function Text({ render, ...props }) {
|
|
134
|
+
return useRender({
|
|
135
|
+
defaultTagName: "p",
|
|
136
|
+
render,
|
|
137
|
+
props: mergeProps<"p">({ className: "text-base" }, props),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Usage
|
|
142
|
+
<Text>Default paragraph</Text>
|
|
143
|
+
<Text render={<strong />}>Rendered as strong</Text>
|
|
144
|
+
```
|
|
145
|
+
|
|
82
146
|
### Compound component (dot notation)
|
|
83
147
|
|
|
84
148
|
```tsx
|
|
@@ -102,25 +166,11 @@ export default function App() {
|
|
|
102
166
|
}
|
|
103
167
|
```
|
|
104
168
|
|
|
105
|
-
### Component with optional peer dep
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
npm install react-day-picker
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
```tsx
|
|
112
|
-
import { Calendar } from "kuzenbo";
|
|
113
|
-
|
|
114
|
-
export default function App() {
|
|
115
|
-
return <Calendar mode="single" />;
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
169
|
## Components
|
|
120
170
|
|
|
121
171
|
### Layout
|
|
122
172
|
|
|
123
|
-
Accordion, AspectRatio, Card, Collapsible, Empty, Resizable, ScrollArea, Separator, Spacer
|
|
173
|
+
Accordion, AspectRatio, Card, Collapsible, Empty, Resizable, ScrollArea, Separator, Spacer
|
|
124
174
|
|
|
125
175
|
### Forms
|
|
126
176
|
|
|
@@ -146,13 +196,28 @@ Avatar, Badge, Calendar, Carousel, Chart, CountryFlag, EmojiPicker, GoogleLogo,
|
|
|
146
196
|
|
|
147
197
|
Affix, Button, ButtonGroup, Command, Toggle, ToggleGroup
|
|
148
198
|
|
|
149
|
-
###
|
|
199
|
+
### Utilities
|
|
150
200
|
|
|
151
|
-
|
|
201
|
+
Item, Portal, CSPProvider, DirectionProvider, mergeProps, useRender
|
|
152
202
|
|
|
153
|
-
|
|
203
|
+
_CSPProvider, DirectionProvider, mergeProps, and useRender are re-exports from [@base-ui/react](https://base-ui.com/) — [CSP Provider](https://base-ui.com/react/utils/csp-provider) · [Direction Provider](https://base-ui.com/react/utils/direction-provider) · [mergeProps](https://base-ui.com/react/utils/merge-props) · [useRender](https://base-ui.com/react/utils/use-render)._
|
|
204
|
+
|
|
205
|
+
## AI Skill (skills.sh)
|
|
206
|
+
|
|
207
|
+
This repository includes a reusable agent skill at [`SKILL.md`](./SKILL.md)
|
|
208
|
+
for integrating and theming Kuzenbo in application codebases.
|
|
154
209
|
|
|
155
|
-
|
|
210
|
+
Install it with the Skills CLI:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
npx skills add https://github.com/DobroslavRadosavljevic/kuzenbo --skill using-kuzenbo-in-apps
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
You can also install by repository shorthand:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
npx skills add DobroslavRadosavljevic/kuzenbo
|
|
220
|
+
```
|
|
156
221
|
|
|
157
222
|
## Development
|
|
158
223
|
|
|
@@ -6,11 +6,11 @@ import { HugeiconsIcon } from "@hugeicons/react";
|
|
|
6
6
|
|
|
7
7
|
//#region src/components/accordion/accordion-content.tsx
|
|
8
8
|
const AccordionContent = ({ className, children, ...props }) => /* @__PURE__ */ jsx(Accordion.Panel, {
|
|
9
|
-
className: "overflow-hidden text-sm data-
|
|
9
|
+
className: cn("h-[var(--accordion-panel-height)] overflow-hidden text-sm transition-[height] ease-out data-[ending-style]:h-0 data-[starting-style]:h-0", className),
|
|
10
10
|
"data-slot": "accordion-content",
|
|
11
11
|
...props,
|
|
12
12
|
children: /* @__PURE__ */ jsx("div", {
|
|
13
|
-
className:
|
|
13
|
+
className: "min-w-0 pb-4 pt-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
|
|
14
14
|
children
|
|
15
15
|
})
|
|
16
16
|
});
|
|
@@ -18,7 +18,7 @@ const AccordionContent = ({ className, children, ...props }) => /* @__PURE__ */
|
|
|
18
18
|
//#endregion
|
|
19
19
|
//#region src/components/accordion/accordion-item.tsx
|
|
20
20
|
const AccordionItem = ({ className, ...props }) => /* @__PURE__ */ jsx(Accordion.Item, {
|
|
21
|
-
className: cn("
|
|
21
|
+
className: cn("border-b border-border [&:last-child]:border-b-0", className),
|
|
22
22
|
"data-slot": "accordion-item",
|
|
23
23
|
...props
|
|
24
24
|
});
|
|
@@ -34,13 +34,13 @@ const AccordionTrigger = ({ className, children, ...props }) => /* @__PURE__ */
|
|
|
34
34
|
children: [
|
|
35
35
|
children,
|
|
36
36
|
/* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
37
|
-
className: "pointer-events-none shrink-0 group-
|
|
37
|
+
className: "pointer-events-none shrink-0 group-data-[panel-open]/accordion-trigger:hidden",
|
|
38
38
|
"data-slot": "accordion-trigger-icon",
|
|
39
39
|
icon: ArrowDown01Icon,
|
|
40
40
|
strokeWidth: 2
|
|
41
41
|
}),
|
|
42
42
|
/* @__PURE__ */ jsx(HugeiconsIcon, {
|
|
43
|
-
className: "pointer-events-none hidden shrink-0 group-
|
|
43
|
+
className: "pointer-events-none hidden shrink-0 group-data-[panel-open]/accordion-trigger:inline",
|
|
44
44
|
"data-slot": "accordion-trigger-icon",
|
|
45
45
|
icon: ArrowUp01Icon,
|
|
46
46
|
strokeWidth: 2
|
|
@@ -4,13 +4,13 @@ import { Dialog } from "./ui/dialog.js";
|
|
|
4
4
|
import { Label } from "./ui/label.js";
|
|
5
5
|
import { Input } from "./ui/input.js";
|
|
6
6
|
import { Textarea } from "./ui/textarea.js";
|
|
7
|
-
import { r as TooltipContent } from "./tooltip-trigger
|
|
7
|
+
import { r as TooltipContent } from "./tooltip-trigger--TzAy0uR.js";
|
|
8
8
|
import * as tailwind_variants0 from "tailwind-variants";
|
|
9
9
|
import { VariantProps } from "tailwind-variants";
|
|
10
10
|
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
11
11
|
import { useRender } from "@base-ui/react/use-render";
|
|
12
12
|
import * as react from "react";
|
|
13
|
-
import { ComponentProps, ReactNode } from "react";
|
|
13
|
+
import { ComponentProps, ReactNode, useEffect } from "react";
|
|
14
14
|
import { AlertDialog } from "@base-ui/react/alert-dialog";
|
|
15
15
|
import useEmblaCarousel, { UseEmblaCarouselType } from "embla-carousel-react";
|
|
16
16
|
import { Command } from "cmdk";
|
|
@@ -565,6 +565,12 @@ interface SidebarContextProps {
|
|
|
565
565
|
}
|
|
566
566
|
declare const useSidebar: () => SidebarContextProps;
|
|
567
567
|
//#endregion
|
|
568
|
+
//#region src/hooks/use-isomorphic-effect/use-isomorphic-effect.d.ts
|
|
569
|
+
declare const useIsomorphicEffect: typeof useEffect;
|
|
570
|
+
//#endregion
|
|
571
|
+
//#region src/hooks/use-mobile/use-mobile.d.ts
|
|
572
|
+
declare const useIsMobile: () => boolean;
|
|
573
|
+
//#endregion
|
|
568
574
|
//#region src/components/alert-dialog/alert-dialog-action.d.ts
|
|
569
575
|
declare const AlertDialogAction: ({
|
|
570
576
|
className,
|
|
@@ -635,4 +641,4 @@ declare const AlertDialogTrigger: ({
|
|
|
635
641
|
...props
|
|
636
642
|
}: AlertDialog.Trigger.Props) => react_jsx_runtime0.JSX.Element;
|
|
637
643
|
//#endregion
|
|
638
|
-
export {
|
|
644
|
+
export { FormFieldSeparator as $, SidebarHeader as A, ItemHeader as B, SidebarMenuItem as C, SidebarMenu as D, SidebarMenuAction as E, SidebarFooter as F, ItemActions as G, ItemFooter as H, SidebarContent as I, InputGroupInput as J, InputGroupTextarea as K, ItemTitle as L, SidebarGroupContent as M, SidebarGroupAction as N, SidebarInset as O, SidebarGroup as P, FormFieldSet as Q, ItemSeparator as R, SidebarMenuSkeleton as S, ButtonGroupSeparator as St, SidebarMenuBadge as T, ItemDescription as U, ItemGroup as V, ItemContent as W, InputGroupAddon as X, InputGroupButton as Y, FormFieldTitle as Z, SidebarRail as _, CarouselPrevious as _t, AlertDialogMedia as a, FormFieldContent as at, SidebarMenuSubButton as b, CarouselContent as bt, AlertDialogDescription as c, CommandList as ct, AlertDialogAction as d, CommandGroup as dt, FormFieldLegend as et, useIsMobile as f, CommandEmpty as ft, SidebarSeparator as g, useCarousel as gt, SidebarTrigger as h, CarouselProps as ht, AlertDialogOverlay as i, FormFieldDescription as it, SidebarGroupLabel as j, SidebarInput as k, AlertDialogContent as l, CommandItem as lt, useSidebar as m, CarouselApi as mt, AlertDialogTitle as n, FormFieldGroup as nt, AlertDialogHeader as o, CommandShortcut as ot, useIsomorphicEffect as p, CommandDialog as pt, InputGroupText as q, AlertDialogPortal as r, FormFieldError as rt, AlertDialogFooter as s, CommandSeparator as st, AlertDialogTrigger as t, FormFieldLabel as tt, AlertDialogCancel as u, CommandInput as ut, SidebarProvider as v, CarouselNext as vt, SidebarMenuButton as w, SidebarMenuSub as x, ButtonGroupText as xt, SidebarMenuSubItem as y, CarouselItem as yt, ItemMedia as z };
|
|
@@ -77,7 +77,7 @@ const AutocompleteIcon = (props) => /* @__PURE__ */ jsx(Autocomplete.Icon, {
|
|
|
77
77
|
//#endregion
|
|
78
78
|
//#region src/components/autocomplete/autocomplete-input.tsx
|
|
79
79
|
const AutocompleteInput = ({ className, ...props }) => /* @__PURE__ */ jsx(Autocomplete.Input, {
|
|
80
|
-
className: cn("flex h-9 w-full min-w-0 rounded-md border bg-input px-3 py-1 text-base shadow-xs outline-none transition-[color,box-shadow,border-color] selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 group-hover:border-ring/70 md:text-sm", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-
|
|
80
|
+
className: cn("flex h-9 w-full min-w-0 rounded-md border bg-input px-3 py-1 text-base shadow-xs outline-none transition-[color,box-shadow,border-color] selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 group-hover:border-ring/70 md:text-sm", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-danger aria-invalid:ring-danger/50", className),
|
|
81
81
|
"data-slot": "autocomplete-input",
|
|
82
82
|
...props
|
|
83
83
|
});
|
|
@@ -3,7 +3,8 @@ import { jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { Collapsible } from "@base-ui/react/collapsible";
|
|
4
4
|
|
|
5
5
|
//#region src/components/collapsible/collapsible-content.tsx
|
|
6
|
-
const CollapsibleContent = ({ ...props }) => /* @__PURE__ */ jsx(Collapsible.Panel, {
|
|
6
|
+
const CollapsibleContent = ({ className, ...props }) => /* @__PURE__ */ jsx(Collapsible.Panel, {
|
|
7
|
+
className: cn("flex h-(--collapsible-panel-height) flex-col justify-end overflow-hidden transition-all ease-out duration-150", "[&[hidden]:not([hidden='until-found'])]:hidden", "data-ending-style:h-0 data-starting-style:h-0", className),
|
|
7
8
|
"data-slot": "collapsible-content",
|
|
8
9
|
...props
|
|
9
10
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as InputGroupAddon } from "./input-group-textarea-
|
|
1
|
+
import { a as InputGroupAddon } from "./input-group-textarea-CCjRXkX4.js";
|
|
2
2
|
import { InputGroup } from "./ui/input-group.js";
|
|
3
|
-
import { a as DialogDescription, n as DialogTitle, o as DialogContent, r as DialogHeader } from "./dialog-trigger-
|
|
3
|
+
import { a as DialogDescription, n as DialogTitle, o as DialogContent, r as DialogHeader } from "./dialog-trigger-BIi6VdZI.js";
|
|
4
4
|
import { Dialog } from "./ui/dialog.js";
|
|
5
5
|
import { cn } from "tailwind-variants";
|
|
6
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -33,7 +33,7 @@ declare const ContextMenuItem: ({
|
|
|
33
33
|
...props
|
|
34
34
|
}: ContextMenu.Item.Props & {
|
|
35
35
|
inset?: boolean;
|
|
36
|
-
variant?: "default" | "
|
|
36
|
+
variant?: "default" | "danger";
|
|
37
37
|
}) => react_jsx_runtime0.JSX.Element;
|
|
38
38
|
//#endregion
|
|
39
39
|
//#region src/components/context-menu/context-menu-label.d.ts
|
|
@@ -44,7 +44,7 @@ const ContextMenuGroup = ({ ...props }) => /* @__PURE__ */ jsx(ContextMenu.Group
|
|
|
44
44
|
//#endregion
|
|
45
45
|
//#region src/components/context-menu/context-menu-item.tsx
|
|
46
46
|
const ContextMenuItem = ({ className, inset, variant = "default", ...props }) => /* @__PURE__ */ jsx(ContextMenu.Item, {
|
|
47
|
-
className: cn("group/context-menu-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:cursor-not-allowed data-[inset]:pl-8 data-[variant=
|
|
47
|
+
className: cn("group/context-menu-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:cursor-not-allowed data-[inset]:pl-8 data-[variant=danger]:text-danger data-disabled:opacity-50 data-[variant=danger]:focus:bg-danger/10 data-[variant=danger]:focus:text-danger dark:data-[variant=danger]:focus:bg-danger/20 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 focus:*:[svg]:text-accent-foreground data-[variant=danger]:*:[svg]:text-danger", className),
|
|
48
48
|
"data-inset": inset,
|
|
49
49
|
"data-slot": "context-menu-item",
|
|
50
50
|
"data-variant": variant,
|
|
@@ -45,7 +45,7 @@ const DropdownMenuGroup = ({ ...props }) => /* @__PURE__ */ jsx(Menu.Group, {
|
|
|
45
45
|
//#endregion
|
|
46
46
|
//#region src/components/dropdown-menu/dropdown-menu-item.tsx
|
|
47
47
|
const DropdownMenuItem = ({ className, inset, variant = "default", ...props }) => /* @__PURE__ */ jsx(Menu.Item, {
|
|
48
|
-
className: cn("group/dropdown-menu-item relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=
|
|
48
|
+
className: cn("group/dropdown-menu-item relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=danger]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:cursor-not-allowed data-[inset]:pl-8 data-[variant=danger]:text-danger data-disabled:opacity-50 data-[variant=danger]:focus:bg-danger/10 data-[variant=danger]:focus:text-danger dark:data-[variant=danger]:focus:bg-danger/20 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 data-[variant=danger]:*:[svg]:text-danger", className),
|
|
49
49
|
"data-inset": inset,
|
|
50
50
|
"data-slot": "dropdown-menu-item",
|
|
51
51
|
"data-variant": variant,
|
|
@@ -129,7 +129,7 @@ const DropdownMenuSubContent = ({ align = "start", alignOffset = -3, side = "rig
|
|
|
129
129
|
//#endregion
|
|
130
130
|
//#region src/components/dropdown-menu/dropdown-menu-sub-trigger.tsx
|
|
131
131
|
const DropdownMenuSubTrigger = ({ className, inset, children, ...props }) => /* @__PURE__ */ jsxs(Menu.SubmenuTrigger, {
|
|
132
|
-
className: cn("flex cursor-pointer select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=
|
|
132
|
+
className: cn("flex cursor-pointer select-none items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground not-data-[variant=danger]:focus:**:text-accent-foreground data-disabled:cursor-not-allowed data-open:bg-accent data-[inset]:pl-8 data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className),
|
|
133
133
|
"data-inset": inset,
|
|
134
134
|
"data-slot": "dropdown-menu-sub-trigger",
|
|
135
135
|
...props,
|
|
@@ -33,7 +33,7 @@ declare const DropdownMenuItem: ({
|
|
|
33
33
|
...props
|
|
34
34
|
}: Menu.Item.Props & {
|
|
35
35
|
inset?: boolean;
|
|
36
|
-
variant?: "default" | "
|
|
36
|
+
variant?: "default" | "danger";
|
|
37
37
|
}) => react_jsx_runtime0.JSX.Element;
|
|
38
38
|
//#endregion
|
|
39
39
|
//#region src/components/dropdown-menu/dropdown-menu-label.d.ts
|
|
@@ -93,7 +93,7 @@ const EmojiPickerSearch = ({ className, wrapperClassName, ...props }) => /* @__P
|
|
|
93
93
|
className: cn("p-2", wrapperClassName),
|
|
94
94
|
"data-slot": "emoji-picker-search-wrapper",
|
|
95
95
|
children: /* @__PURE__ */ jsx(EmojiPicker.Search, {
|
|
96
|
-
className: cn("z-50 flex h-9 w-full min-w-0 rounded-md border bg-input px-3 py-1 text-base shadow-xs outline-none transition-[color,box-shadow,border-color] selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground hover:border-ring/70 disabled:pointer-events-none disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-
|
|
96
|
+
className: cn("z-50 flex h-9 w-full min-w-0 rounded-md border bg-input px-3 py-1 text-base shadow-xs outline-none transition-[color,box-shadow,border-color] selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground hover:border-ring/70 disabled:pointer-events-none disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-danger aria-invalid:ring-danger/50", className),
|
|
97
97
|
...props
|
|
98
98
|
})
|
|
99
99
|
});
|
|
@@ -34,7 +34,7 @@ const FormFieldError = ({ className, children, errors, ...props }) => {
|
|
|
34
34
|
}, [children, errors]);
|
|
35
35
|
if (!content) return null;
|
|
36
36
|
return /* @__PURE__ */ jsx("div", {
|
|
37
|
-
className: cn("font-normal text-
|
|
37
|
+
className: cn("font-normal text-danger text-sm", className),
|
|
38
38
|
"data-slot": "field-error",
|
|
39
39
|
role: "alert",
|
|
40
40
|
...props,
|