@cloudraker/reki 2.6.1 → 2.7.1
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/CHANGELOG.md +20 -0
- package/README.md +1 -1
- package/ai/component-registry.json +1271 -41
- package/ai/component-registry.md +1310 -34
- package/ai/schemas.ts +226 -2
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.d.ts +554 -5
- package/dist/ai/schemas.d.ts.map +1 -1
- package/dist/ai/schemas.js +1699 -1405
- package/dist/ai/schemas.js.map +1 -1
- package/dist/chunks/{SankeyChart-jwwpwps4npqzbrvn.js → SankeyChart-gogf860o4u387kjn.js} +2 -2
- package/dist/chunks/{SankeyChart-jwwpwps4npqzbrvn.js.map → SankeyChart-gogf860o4u387kjn.js.map} +1 -1
- package/dist/chunks/actor-display-izds1bhw0yswurqm.js +35 -0
- package/dist/chunks/actor-display-izds1bhw0yswurqm.js.map +1 -0
- package/dist/chunks/address-input-g1la0xqrpg8ic6ak.js +80 -0
- package/dist/chunks/address-input-g1la0xqrpg8ic6ak.js.map +1 -0
- package/dist/chunks/array-display-lu1259ap3qrl847e.js +12 -0
- package/dist/chunks/array-display-lu1259ap3qrl847e.js.map +1 -0
- package/dist/chunks/{autocomplete-f4vetako14h2aqsw.js → autocomplete-htuy5t9ag29qhuwa.js} +4 -4
- package/dist/chunks/{autocomplete-f4vetako14h2aqsw.js.map → autocomplete-htuy5t9ag29qhuwa.js.map} +1 -1
- package/dist/chunks/avatar-g40cun6cn17fcxd4.js +57 -0
- package/dist/chunks/avatar-g40cun6cn17fcxd4.js.map +1 -0
- package/dist/chunks/avatar-group-fpcaziey1yu7226v.js +23 -0
- package/dist/chunks/avatar-group-fpcaziey1yu7226v.js.map +1 -0
- package/dist/chunks/{breadcrumbs-d6149hyct4puz3x4.js → breadcrumbs-mq1utzm0q4u2r5v5.js} +2 -2
- package/dist/chunks/{breadcrumbs-d6149hyct4puz3x4.js.map → breadcrumbs-mq1utzm0q4u2r5v5.js.map} +1 -1
- package/dist/chunks/{button-nc5p1h28cwes0tjw.js → button-fvlz1rzc3s1hpyxs.js} +14 -14
- package/dist/chunks/button-fvlz1rzc3s1hpyxs.js.map +1 -0
- package/dist/chunks/{checkbox-g2661n3eodgoispq.js → checkbox-h3kfhlron3b6sfhv.js} +3 -3
- package/dist/chunks/{checkbox-g2661n3eodgoispq.js.map → checkbox-h3kfhlron3b6sfhv.js.map} +1 -1
- package/dist/chunks/chip-iu7movvthovdurgb.js +69 -0
- package/dist/chunks/chip-iu7movvthovdurgb.js.map +1 -0
- package/dist/chunks/circular-progress-bar-ofg0ps2axad1wsr6.js +60 -0
- package/dist/chunks/circular-progress-bar-ofg0ps2axad1wsr6.js.map +1 -0
- package/dist/chunks/{clipboard-text-g3659lejx2d7i93e.js → clipboard-text-ogue8iq06n1z7q7v.js} +4 -4
- package/dist/chunks/{clipboard-text-g3659lejx2d7i93e.js.map → clipboard-text-ogue8iq06n1z7q7v.js.map} +1 -1
- package/dist/chunks/{collapsible-ndvmgo29s5iqfcor.js → collapsible-ivqat099ene9z3bv.js} +2 -2
- package/dist/chunks/{collapsible-ndvmgo29s5iqfcor.js.map → collapsible-ivqat099ene9z3bv.js.map} +1 -1
- package/dist/chunks/color-sample-h7hspma3rb91go3z.js +32 -0
- package/dist/chunks/color-sample-h7hspma3rb91go3z.js.map +1 -0
- package/dist/chunks/{combobox-i38w67netm8ukw4f.js → combobox-iytvpzp5poljxgek.js} +4 -4
- package/dist/chunks/{combobox-i38w67netm8ukw4f.js.map → combobox-iytvpzp5poljxgek.js.map} +1 -1
- package/dist/chunks/{command-palette-fe5cjfdgsg3t17vq.js → command-palette-k6vrx8ely8rmf4a5.js} +4 -4
- package/dist/chunks/command-palette-k6vrx8ely8rmf4a5.js.map +1 -0
- package/dist/chunks/data-grid-i7kfgm7zr5tj0e0a.js +3110 -0
- package/dist/chunks/data-grid-i7kfgm7zr5tj0e0a.js.map +1 -0
- package/dist/chunks/{dialog-m4go8xof25fospqo.js → dialog-ggx34i6k4eulfvgk.js} +3 -3
- package/dist/chunks/{dialog-m4go8xof25fospqo.js.map → dialog-ggx34i6k4eulfvgk.js.map} +1 -1
- package/dist/chunks/double-text-input-k0i5xnfq6khv01wu.js +39 -0
- package/dist/chunks/double-text-input-k0i5xnfq6khv01wu.js.map +1 -0
- package/dist/chunks/{dropdown-j5uht8mn4z7xc9fc.js → dropdown-bt1lfs2jli0khnex.js} +2 -2
- package/dist/chunks/{dropdown-j5uht8mn4z7xc9fc.js.map → dropdown-bt1lfs2jli0khnex.js.map} +1 -1
- package/dist/chunks/emails-display-nsbqzscr0f9bqimg.js +12 -0
- package/dist/chunks/emails-display-nsbqzscr0f9bqimg.js.map +1 -0
- package/dist/chunks/{empty-kazxr0248zjemw6n.js → empty-dxy8jti5bsxxh905.js} +2 -2
- package/dist/chunks/{empty-kazxr0248zjemw6n.js.map → empty-dxy8jti5bsxxh905.js.map} +1 -1
- package/dist/chunks/expandable-list-bjceh467ocazog53.js +26 -0
- package/dist/chunks/expandable-list-bjceh467ocazog53.js.map +1 -0
- package/dist/chunks/{field-fe5m8z3vbpvtctbe.js → field-b0aywboxuss4rpu7.js} +3 -3
- package/dist/chunks/{field-fe5m8z3vbpvtctbe.js.map → field-b0aywboxuss4rpu7.js.map} +1 -1
- package/dist/chunks/{input-area-ciw85g3fno06t4tw.js → input-area-cuijpofpark5w5qq.js} +4 -4
- package/dist/chunks/{input-area-ciw85g3fno06t4tw.js.map → input-area-cuijpofpark5w5qq.js.map} +1 -1
- package/dist/chunks/{input-i5nefqk213n4z7pr.js → input-eno4q26x68rx3i8q.js} +3 -3
- package/dist/chunks/{input-i5nefqk213n4z7pr.js.map → input-eno4q26x68rx3i8q.js.map} +1 -1
- package/dist/chunks/{input-group-mo7tq7jr19hmgor5.js → input-group-dl9htnza7kq4om4c.js} +5 -5
- package/dist/chunks/{input-group-mo7tq7jr19hmgor5.js.map → input-group-dl9htnza7kq4om4c.js.map} +1 -1
- package/dist/chunks/json-display-fy0t2khc4itn130p.js +31 -0
- package/dist/chunks/json-display-fy0t2khc4itn130p.js.map +1 -0
- package/dist/chunks/{label-fcho4757rbdess0c.js → label-ld57mr4ocdxsf06p.js} +3 -3
- package/dist/chunks/{label-fcho4757rbdess0c.js.map → label-ld57mr4ocdxsf06p.js.map} +1 -1
- package/dist/chunks/{layer-card-kzu48dhzxm3e9p4u.js → layer-card-iuquuc1w3116umfw.js} +2 -2
- package/dist/chunks/{layer-card-kzu48dhzxm3e9p4u.js.map → layer-card-iuquuc1w3116umfw.js.map} +1 -1
- package/dist/chunks/{link-j2gu5dr3nr4i4yf0.js → link-8pn6y27h3m3ud8fl.js} +2 -2
- package/dist/chunks/{link-j2gu5dr3nr4i4yf0.js.map → link-8pn6y27h3m3ud8fl.js.map} +1 -1
- package/dist/chunks/link-chip-cz5v6lw9icmcndzl.js +58 -0
- package/dist/chunks/link-chip-cz5v6lw9icmcndzl.js.map +1 -0
- package/dist/chunks/links-display-dfaehepz86s2wxx1.js +20 -0
- package/dist/chunks/links-display-dfaehepz86s2wxx1.js.map +1 -0
- package/dist/chunks/menu-item-kyqq7o2krghxbpw5.js +178 -0
- package/dist/chunks/menu-item-kyqq7o2krghxbpw5.js.map +1 -0
- package/dist/chunks/{menubar-ir5gbjmsizsddz7g.js → menubar-56kqktsa5a28xyzj.js} +2 -2
- package/dist/chunks/{menubar-ir5gbjmsizsddz7g.js.map → menubar-56kqktsa5a28xyzj.js.map} +1 -1
- package/dist/chunks/{meter-o5yd7ctjf80vvyjx.js → meter-b5rnmibceu4z8i6a.js} +2 -2
- package/dist/chunks/{meter-o5yd7ctjf80vvyjx.js.map → meter-b5rnmibceu4z8i6a.js.map} +1 -1
- package/dist/chunks/notification-counter-hiq85elmcydnhzoo.js +30 -0
- package/dist/chunks/notification-counter-hiq85elmcydnhzoo.js.map +1 -0
- package/dist/chunks/overflowing-text-mm8bkx7voc6h8ra4.js +49 -0
- package/dist/chunks/overflowing-text-mm8bkx7voc6h8ra4.js.map +1 -0
- package/dist/chunks/{pagination-bryw6rohfr7mm3km.js → pagination-iczb9ooenevbxslx.js} +3 -3
- package/dist/chunks/{pagination-bryw6rohfr7mm3km.js.map → pagination-iczb9ooenevbxslx.js.map} +1 -1
- package/dist/chunks/phones-display-cdsrl07dv6obf4eg.js +19 -0
- package/dist/chunks/phones-display-cdsrl07dv6obf4eg.js.map +1 -0
- package/dist/chunks/pill-pfpvgbcnqhtyksz5.js +22 -0
- package/dist/chunks/pill-pfpvgbcnqhtyksz5.js.map +1 -0
- package/dist/chunks/{popover-elxcmvv7mu7m7uk4.js → popover-ldqdlpv6sqvkjume.js} +2 -2
- package/dist/chunks/{popover-elxcmvv7mu7m7uk4.js.map → popover-ldqdlpv6sqvkjume.js.map} +1 -1
- package/dist/chunks/{radio-newyq331uk4lltr6.js → radio-lyeniil3x20cyb8z.js} +2 -2
- package/dist/chunks/{radio-newyq331uk4lltr6.js.map → radio-lyeniil3x20cyb8z.js.map} +1 -1
- package/dist/chunks/rating-yyd4t8e62ast4obo.js +48 -0
- package/dist/chunks/rating-yyd4t8e62ast4obo.js.map +1 -0
- package/dist/chunks/record-board-iapx3cw5rusehrta.js +3395 -0
- package/dist/chunks/record-board-iapx3cw5rusehrta.js.map +1 -0
- package/dist/chunks/{select-h5480mbro0ypxu0b.js → select-hmoccee4zagd34tq.js} +6 -6
- package/dist/chunks/{select-h5480mbro0ypxu0b.js.map → select-hmoccee4zagd34tq.js.map} +1 -1
- package/dist/chunks/{sensitive-input-lqugq6uvx0lkpu0u.js → sensitive-input-nkfx72rduc7aijaf.js} +4 -4
- package/dist/chunks/{sensitive-input-lqugq6uvx0lkpu0u.js.map → sensitive-input-nkfx72rduc7aijaf.js.map} +1 -1
- package/dist/chunks/{sidebar-noz668nhdu2gso12.js → sidebar-gwfibai76tw069d4.js} +34 -33
- package/dist/chunks/sidebar-gwfibai76tw069d4.js.map +1 -0
- package/dist/chunks/status-ot0itdwxloqgahi0.js +29 -0
- package/dist/chunks/status-ot0itdwxloqgahi0.js.map +1 -0
- package/dist/chunks/{surface-cyxme7mlr49l33f8.js → surface-fqmma34ju0agh5pe.js} +2 -2
- package/dist/chunks/{surface-cyxme7mlr49l33f8.js.map → surface-fqmma34ju0agh5pe.js.map} +1 -1
- package/dist/chunks/{switch-bigo96fyjlh7ivbi.js → switch-nhtmn65n5s7gg6vb.js} +3 -3
- package/dist/chunks/{switch-bigo96fyjlh7ivbi.js.map → switch-nhtmn65n5s7gg6vb.js.map} +1 -1
- package/dist/chunks/{table-mwcmwp6a80zvyrxw.js → table-cjj894o3niouq4tg.js} +2 -2
- package/dist/chunks/{table-mwcmwp6a80zvyrxw.js.map → table-cjj894o3niouq4tg.js.map} +1 -1
- package/dist/chunks/{tabs-e4pcjkw94kpe35x0.js → tabs-klj6wapad6fpd9at.js} +14 -16
- package/dist/chunks/tabs-klj6wapad6fpd9at.js.map +1 -0
- package/dist/chunks/tag-h5kwf5eh7dyyvc2c.js +58 -0
- package/dist/chunks/tag-h5kwf5eh7dyyvc2c.js.map +1 -0
- package/dist/chunks/timeline-lqurr2lcxkayomk2.js +109 -0
- package/dist/chunks/timeline-lqurr2lcxkayomk2.js.map +1 -0
- package/dist/chunks/{toast-ivr4097bstjcjotf.js → toast-j47dl441zpxa1yw3.js} +3 -3
- package/dist/chunks/{toast-ivr4097bstjcjotf.js.map → toast-j47dl441zpxa1yw3.js.map} +1 -1
- package/dist/chunks/{tooltip-ncaia8n1lavkyw8n.js → tooltip-bkgxuz77xzg5fooc.js} +2 -2
- package/dist/chunks/{tooltip-ncaia8n1lavkyw8n.js.map → tooltip-bkgxuz77xzg5fooc.js.map} +1 -1
- package/dist/chunks/{vendor-base-ui-bgl9g5nkvqy3tn36.js → vendor-base-ui-djdjrfuoxlb1lubi.js} +2358 -2358
- package/dist/chunks/{vendor-base-ui-bgl9g5nkvqy3tn36.js.map → vendor-base-ui-djdjrfuoxlb1lubi.js.map} +1 -1
- package/dist/code.js +1 -1
- package/dist/components/actor-display.js +6 -0
- package/dist/components/actor-display.js.map +1 -0
- package/dist/components/address-input.js +6 -0
- package/dist/components/address-input.js.map +1 -0
- package/dist/components/array-display.js +6 -0
- package/dist/components/array-display.js.map +1 -0
- package/dist/components/autocomplete.js +1 -1
- package/dist/components/avatar-group.js +6 -0
- package/dist/components/avatar-group.js.map +1 -0
- package/dist/components/avatar.js +6 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/breadcrumbs.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/chart.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/chip.js +8 -0
- package/dist/components/chip.js.map +1 -0
- package/dist/components/circular-progress-bar.js +6 -0
- package/dist/components/circular-progress-bar.js.map +1 -0
- package/dist/components/clipboard-text.js +1 -1
- package/dist/components/collapsible.js +1 -1
- package/dist/components/color-sample.js +6 -0
- package/dist/components/color-sample.js.map +1 -0
- package/dist/components/combobox.js +1 -1
- package/dist/components/command-palette.js +1 -1
- package/dist/components/data-grid.js +8 -0
- package/dist/components/data-grid.js.map +1 -0
- package/dist/components/dialog.js +1 -1
- package/dist/components/double-text-input.js +6 -0
- package/dist/components/double-text-input.js.map +1 -0
- package/dist/components/dropdown.js +1 -1
- package/dist/components/emails-display.js +6 -0
- package/dist/components/emails-display.js.map +1 -0
- package/dist/components/empty.js +1 -1
- package/dist/components/expandable-list.js +6 -0
- package/dist/components/expandable-list.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/input-group.js +1 -1
- package/dist/components/input.js +3 -3
- package/dist/components/json-display.js +6 -0
- package/dist/components/json-display.js.map +1 -0
- package/dist/components/label.js +1 -1
- package/dist/components/layer-card.js +1 -1
- package/dist/components/link-chip.js +6 -0
- package/dist/components/link-chip.js.map +1 -0
- package/dist/components/link.js +1 -1
- package/dist/components/links-display.js +6 -0
- package/dist/components/links-display.js.map +1 -0
- package/dist/components/menu-item.js +11 -0
- package/dist/components/menu-item.js.map +1 -0
- package/dist/components/menubar.js +1 -1
- package/dist/components/meter.js +1 -1
- package/dist/components/notification-counter.js +6 -0
- package/dist/components/notification-counter.js.map +1 -0
- package/dist/components/overflowing-text.js +6 -0
- package/dist/components/overflowing-text.js.map +1 -0
- package/dist/components/pagination.js +1 -1
- package/dist/components/phones-display.js +6 -0
- package/dist/components/phones-display.js.map +1 -0
- package/dist/components/pill.js +6 -0
- package/dist/components/pill.js.map +1 -0
- package/dist/components/popover.js +1 -1
- package/dist/components/radio.js +1 -1
- package/dist/components/rating.js +6 -0
- package/dist/components/rating.js.map +1 -0
- package/dist/components/record-board.js +8 -0
- package/dist/components/record-board.js.map +1 -0
- package/dist/components/select.js +1 -1
- package/dist/components/sensitive-input.js +1 -1
- package/dist/components/sidebar.js +1 -1
- package/dist/components/status.js +6 -0
- package/dist/components/status.js.map +1 -0
- package/dist/components/surface.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/tag.js +10 -0
- package/dist/components/tag.js.map +1 -0
- package/dist/components/timeline.js +8 -0
- package/dist/components/timeline.js.map +1 -0
- package/dist/components/toast.js +2 -2
- package/dist/components/tooltip.js +1 -1
- package/dist/index.js +380 -251
- package/dist/index.js.map +1 -1
- package/dist/primitives/accordion.js +1 -1
- package/dist/primitives/alert-dialog.js +1 -1
- package/dist/primitives/autocomplete.js +1 -1
- package/dist/primitives/avatar.js +1 -1
- package/dist/primitives/button.js +1 -1
- package/dist/primitives/checkbox-group.js +1 -1
- package/dist/primitives/checkbox.js +1 -1
- package/dist/primitives/collapsible.js +1 -1
- package/dist/primitives/combobox.js +1 -1
- package/dist/primitives/context-menu.js +1 -1
- package/dist/primitives/csp-provider.js +1 -1
- package/dist/primitives/dialog.js +1 -1
- package/dist/primitives/direction-provider.js +1 -1
- package/dist/primitives/drawer.js +1 -1
- package/dist/primitives/field.js +1 -1
- package/dist/primitives/fieldset.js +1 -1
- package/dist/primitives/form.js +1 -1
- package/dist/primitives/input.js +1 -1
- package/dist/primitives/menu.js +1 -1
- package/dist/primitives/menubar.js +1 -1
- package/dist/primitives/meter.js +1 -1
- package/dist/primitives/navigation-menu.js +1 -1
- package/dist/primitives/number-field.js +1 -1
- package/dist/primitives/otp-field.js +1 -1
- package/dist/primitives/popover.js +1 -1
- package/dist/primitives/preview-card.js +1 -1
- package/dist/primitives/progress.js +1 -1
- package/dist/primitives/radio-group.js +1 -1
- package/dist/primitives/radio.js +1 -1
- package/dist/primitives/scroll-area.js +1 -1
- package/dist/primitives/select.js +1 -1
- package/dist/primitives/separator.js +1 -1
- package/dist/primitives/slider.js +1 -1
- package/dist/primitives/switch.js +1 -1
- package/dist/primitives/tabs.js +1 -1
- package/dist/primitives/toast.js +1 -1
- package/dist/primitives/toggle-group.js +1 -1
- package/dist/primitives/toggle.js +1 -1
- package/dist/primitives/toolbar.js +1 -1
- package/dist/primitives/tooltip.js +1 -1
- package/dist/primitives.js +1 -1
- package/dist/scripts/theme-generator/config.d.ts.map +1 -1
- package/dist/scripts/theme-generator/config.js +229 -5
- package/dist/scripts/theme-generator/config.js.map +1 -1
- package/dist/src/components/actor-display/actor-display.d.ts +33 -0
- package/dist/src/components/actor-display/actor-display.d.ts.map +1 -0
- package/dist/src/components/actor-display/index.d.ts +2 -0
- package/dist/src/components/actor-display/index.d.ts.map +1 -0
- package/dist/src/components/address-input/address-input.d.ts +42 -0
- package/dist/src/components/address-input/address-input.d.ts.map +1 -0
- package/dist/src/components/address-input/index.d.ts +2 -0
- package/dist/src/components/address-input/index.d.ts.map +1 -0
- package/dist/src/components/array-display/array-display.d.ts +30 -0
- package/dist/src/components/array-display/array-display.d.ts.map +1 -0
- package/dist/src/components/array-display/index.d.ts +2 -0
- package/dist/src/components/array-display/index.d.ts.map +1 -0
- package/dist/src/components/avatar/avatar.d.ts +80 -0
- package/dist/src/components/avatar/avatar.d.ts.map +1 -0
- package/dist/src/components/avatar/index.d.ts +2 -0
- package/dist/src/components/avatar/index.d.ts.map +1 -0
- package/dist/src/components/avatar-group/avatar-group.d.ts +35 -0
- package/dist/src/components/avatar-group/avatar-group.d.ts.map +1 -0
- package/dist/src/components/avatar-group/index.d.ts +2 -0
- package/dist/src/components/avatar-group/index.d.ts.map +1 -0
- package/dist/src/components/button/button.d.ts +4 -4
- package/dist/src/components/chip/chip.d.ts +78 -0
- package/dist/src/components/chip/chip.d.ts.map +1 -0
- package/dist/src/components/chip/index.d.ts +2 -0
- package/dist/src/components/chip/index.d.ts.map +1 -0
- package/dist/src/components/circular-progress-bar/circular-progress-bar.d.ts +35 -0
- package/dist/src/components/circular-progress-bar/circular-progress-bar.d.ts.map +1 -0
- package/dist/src/components/circular-progress-bar/index.d.ts +2 -0
- package/dist/src/components/circular-progress-bar/index.d.ts.map +1 -0
- package/dist/src/components/color-sample/color-sample.d.ts +56 -0
- package/dist/src/components/color-sample/color-sample.d.ts.map +1 -0
- package/dist/src/components/color-sample/index.d.ts +2 -0
- package/dist/src/components/color-sample/index.d.ts.map +1 -0
- package/dist/src/components/data-grid/data-grid.d.ts +25 -0
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -0
- package/dist/src/components/data-grid/index.d.ts +3 -0
- package/dist/src/components/data-grid/index.d.ts.map +1 -0
- package/dist/src/components/data-grid/types.d.ts +103 -0
- package/dist/src/components/data-grid/types.d.ts.map +1 -0
- package/dist/src/components/data-grid/use-data-grid-edit.d.ts +34 -0
- package/dist/src/components/data-grid/use-data-grid-edit.d.ts.map +1 -0
- package/dist/src/components/double-text-input/double-text-input.d.ts +47 -0
- package/dist/src/components/double-text-input/double-text-input.d.ts.map +1 -0
- package/dist/src/components/double-text-input/index.d.ts +2 -0
- package/dist/src/components/double-text-input/index.d.ts.map +1 -0
- package/dist/src/components/emails-display/emails-display.d.ts +30 -0
- package/dist/src/components/emails-display/emails-display.d.ts.map +1 -0
- package/dist/src/components/emails-display/index.d.ts +2 -0
- package/dist/src/components/emails-display/index.d.ts.map +1 -0
- package/dist/src/components/expandable-list/expandable-list.d.ts +41 -0
- package/dist/src/components/expandable-list/expandable-list.d.ts.map +1 -0
- package/dist/src/components/expandable-list/index.d.ts +2 -0
- package/dist/src/components/expandable-list/index.d.ts.map +1 -0
- package/dist/src/components/json-display/index.d.ts +2 -0
- package/dist/src/components/json-display/index.d.ts.map +1 -0
- package/dist/src/components/json-display/json-display.d.ts +29 -0
- package/dist/src/components/json-display/json-display.d.ts.map +1 -0
- package/dist/src/components/link-chip/index.d.ts +2 -0
- package/dist/src/components/link-chip/index.d.ts.map +1 -0
- package/dist/src/components/link-chip/link-chip.d.ts +50 -0
- package/dist/src/components/link-chip/link-chip.d.ts.map +1 -0
- package/dist/src/components/links-display/index.d.ts +2 -0
- package/dist/src/components/links-display/index.d.ts.map +1 -0
- package/dist/src/components/links-display/links-display.d.ts +37 -0
- package/dist/src/components/links-display/links-display.d.ts.map +1 -0
- package/dist/src/components/menu-item/index.d.ts +2 -0
- package/dist/src/components/menu-item/index.d.ts.map +1 -0
- package/dist/src/components/menu-item/menu-item.d.ts +104 -0
- package/dist/src/components/menu-item/menu-item.d.ts.map +1 -0
- package/dist/src/components/notification-counter/index.d.ts +2 -0
- package/dist/src/components/notification-counter/index.d.ts.map +1 -0
- package/dist/src/components/notification-counter/notification-counter.d.ts +51 -0
- package/dist/src/components/notification-counter/notification-counter.d.ts.map +1 -0
- package/dist/src/components/overflowing-text/index.d.ts +2 -0
- package/dist/src/components/overflowing-text/index.d.ts.map +1 -0
- package/dist/src/components/overflowing-text/overflowing-text.d.ts +48 -0
- package/dist/src/components/overflowing-text/overflowing-text.d.ts.map +1 -0
- package/dist/src/components/phones-display/index.d.ts +2 -0
- package/dist/src/components/phones-display/index.d.ts.map +1 -0
- package/dist/src/components/phones-display/phones-display.d.ts +31 -0
- package/dist/src/components/phones-display/phones-display.d.ts.map +1 -0
- package/dist/src/components/pill/index.d.ts +2 -0
- package/dist/src/components/pill/index.d.ts.map +1 -0
- package/dist/src/components/pill/pill.d.ts +31 -0
- package/dist/src/components/pill/pill.d.ts.map +1 -0
- package/dist/src/components/rating/index.d.ts +2 -0
- package/dist/src/components/rating/index.d.ts.map +1 -0
- package/dist/src/components/rating/rating.d.ts +37 -0
- package/dist/src/components/rating/rating.d.ts.map +1 -0
- package/dist/src/components/record-board/index.d.ts +2 -0
- package/dist/src/components/record-board/index.d.ts.map +1 -0
- package/dist/src/components/record-board/record-board.d.ts +75 -0
- package/dist/src/components/record-board/record-board.d.ts.map +1 -0
- package/dist/src/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/src/components/status/index.d.ts +2 -0
- package/dist/src/components/status/index.d.ts.map +1 -0
- package/dist/src/components/status/status.d.ts +52 -0
- package/dist/src/components/status/status.d.ts.map +1 -0
- package/dist/src/components/tabs/tabs.d.ts.map +1 -1
- package/dist/src/components/tag/index.d.ts +2 -0
- package/dist/src/components/tag/index.d.ts.map +1 -0
- package/dist/src/components/tag/tag.d.ts +153 -0
- package/dist/src/components/tag/tag.d.ts.map +1 -0
- package/dist/src/components/timeline/index.d.ts +2 -0
- package/dist/src/components/timeline/index.d.ts.map +1 -0
- package/dist/src/components/timeline/timeline.d.ts +155 -0
- package/dist/src/components/timeline/timeline.d.ts.map +1 -0
- package/dist/src/index.d.ts +26 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/utils/use-is-dark-mode.d.ts +18 -0
- package/dist/src/utils/use-is-dark-mode.d.ts.map +1 -0
- package/dist/styles/reki-standalone.css +1 -1
- package/dist/styles/reki.css +19 -0
- package/dist/styles/theme-fedramp.css +6 -0
- package/dist/styles/theme-reki.css +164 -10
- package/package.json +118 -4
- package/scripts/component-registry/index.ts +6 -11
- package/scripts/extract-demo-examples.ts +323 -0
- package/scripts/generate-stories.ts +205 -0
- package/scripts/theme-generator/config.ts +230 -5
- package/dist/chunks/button-nc5p1h28cwes0tjw.js.map +0 -1
- package/dist/chunks/command-palette-fe5cjfdgsg3t17vq.js.map +0 -1
- package/dist/chunks/sidebar-noz668nhdu2gso12.js.map +0 -1
- package/dist/chunks/tabs-e4pcjkw94kpe35x0.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-input-g1la0xqrpg8ic6ak.js","sources":["../../src/components/address-input/address-input.tsx"],"sourcesContent":["import { Input } from \"../input\";\nimport { cn } from \"../../utils/cn\";\n\n/** Variant standard export (reki convention). */\nexport const REKI_ADDRESS_INPUT_VARIANTS = {} as const;\n\nexport const REKI_ADDRESS_INPUT_DEFAULT_VARIANTS = {} as const;\n\n/** The structured address value managed by {@link AddressInput}. */\nexport interface AddressValue {\n addressStreet1?: string;\n addressStreet2?: string;\n addressCity?: string;\n addressState?: string;\n addressPostcode?: string;\n addressCountry?: string;\n}\n\n/**\n * AddressInput component props.\n *\n * @example\n * ```tsx\n * <AddressInput value={address} onChange={setAddress} />\n * ```\n */\nexport interface AddressInputProps {\n /** Current address value. */\n value: AddressValue;\n /** Called with the full address whenever any field changes. */\n onChange?: (value: AddressValue) => void;\n /** Disables all fields. */\n disabled?: boolean;\n /** Additional CSS classes merged via `cn()`. Use reki semantic tokens only. */\n className?: string;\n}\n\n/**\n * A structured address editor (street, city, state, postcode, country) for the\n * `address` field type. Presentational only — geocoding / autocomplete, if\n * needed, is layered on by the host app.\n *\n * @example\n * ```tsx\n * <AddressInput value={record.address} onChange={setAddress} />\n * ```\n */\nexport function AddressInput({\n value,\n onChange,\n disabled,\n className,\n}: AddressInputProps) {\n const update = (patch: Partial<AddressValue>) =>\n onChange?.({ ...value, ...patch });\n\n return (\n <div className={cn(\"flex w-80 flex-col gap-1.5\", className)}>\n <Input\n aria-label=\"Address line 1\"\n placeholder=\"Address line 1\"\n value={value.addressStreet1 ?? \"\"}\n disabled={disabled}\n onValueChange={(addressStreet1) => update({ addressStreet1 })}\n />\n <Input\n aria-label=\"Address line 2\"\n placeholder=\"Address line 2\"\n value={value.addressStreet2 ?? \"\"}\n disabled={disabled}\n onValueChange={(addressStreet2) => update({ addressStreet2 })}\n />\n <div className=\"grid grid-cols-2 gap-1.5\">\n <Input\n aria-label=\"City\"\n placeholder=\"City\"\n value={value.addressCity ?? \"\"}\n disabled={disabled}\n onValueChange={(addressCity) => update({ addressCity })}\n />\n <Input\n aria-label=\"State\"\n placeholder=\"State\"\n value={value.addressState ?? \"\"}\n disabled={disabled}\n onValueChange={(addressState) => update({ addressState })}\n />\n <Input\n aria-label=\"Post code\"\n placeholder=\"Post code\"\n value={value.addressPostcode ?? \"\"}\n disabled={disabled}\n onValueChange={(addressPostcode) => update({ addressPostcode })}\n />\n <Input\n aria-label=\"Country\"\n placeholder=\"Country\"\n value={value.addressCountry ?? \"\"}\n disabled={disabled}\n onValueChange={(addressCountry) => update({ addressCountry })}\n />\n </div>\n </div>\n );\n}\n"],"names":["AddressInput","value","onChange","disabled","className","update","patch","cn","jsx","Input","addressStreet1","addressStreet2","jsxs","addressCity","addressState","addressPostcode","addressCountry"],"mappings":";;;;AA+CO,SAASA,EAAa;AAAA,EAC3B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AACF,GAAsB;AACpB,QAAMC,IAAS,CAACC,MACdJ,IAAW,EAAE,GAAGD,GAAO,GAAGK,GAAO;AAEnC,2BACG,OAAA,EAAI,WAAWC,EAAG,8BAA8BH,CAAS,GACxD,UAAA;AAAA,IAAA,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,cAAW;AAAA,QACX,aAAY;AAAA,QACZ,OAAOR,EAAM,kBAAkB;AAAA,QAC/B,UAAAE;AAAA,QACA,eAAe,CAACO,MAAmBL,EAAO,EAAE,gBAAAK,GAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,IAE9D,gBAAAF;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,cAAW;AAAA,QACX,aAAY;AAAA,QACZ,OAAOR,EAAM,kBAAkB;AAAA,QAC/B,UAAAE;AAAA,QACA,eAAe,CAACQ,MAAmBN,EAAO,EAAE,gBAAAM,GAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,IAE9D,gBAAAC,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,MAAA,gBAAAJ;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,aAAY;AAAA,UACZ,OAAOR,EAAM,eAAe;AAAA,UAC5B,UAAAE;AAAA,UACA,eAAe,CAACU,MAAgBR,EAAO,EAAE,aAAAQ,GAAa;AAAA,QAAA;AAAA,MAAA;AAAA,MAExD,gBAAAL;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,aAAY;AAAA,UACZ,OAAOR,EAAM,gBAAgB;AAAA,UAC7B,UAAAE;AAAA,UACA,eAAe,CAACW,MAAiBT,EAAO,EAAE,cAAAS,GAAc;AAAA,QAAA;AAAA,MAAA;AAAA,MAE1D,gBAAAN;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,aAAY;AAAA,UACZ,OAAOR,EAAM,mBAAmB;AAAA,UAChC,UAAAE;AAAA,UACA,eAAe,CAACY,MAAoBV,EAAO,EAAE,iBAAAU,GAAiB;AAAA,QAAA;AAAA,MAAA;AAAA,MAEhE,gBAAAP;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,aAAY;AAAA,UACZ,OAAOR,EAAM,kBAAkB;AAAA,UAC/B,UAAAE;AAAA,UACA,eAAe,CAACa,MAAmBX,EAAO,EAAE,gBAAAW,GAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,IAC9D,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
import { C as o } from "./chip-iu7movvthovdurgb.js";
|
|
4
|
+
import { E as e } from "./expandable-list-bjceh467ocazog53.js";
|
|
5
|
+
import { c as l } from "./cn-ct4n7r74mh8y0f48.js";
|
|
6
|
+
function h({ values: r, max: a = 1, className: n }) {
|
|
7
|
+
return r.length === 0 ? null : /* @__PURE__ */ t(e, { max: a, className: l(n), children: r.map((i, m) => /* @__PURE__ */ t(o, { label: i, variant: "highlighted" }, `${i}-${m}`)) });
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
h as A
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=array-display-lu1259ap3qrl847e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-display-lu1259ap3qrl847e.js","sources":["../../src/components/array-display/array-display.tsx"],"sourcesContent":["import { Chip } from \"../chip\";\nimport { ExpandableList } from \"../expandable-list\";\nimport { cn } from \"../../utils/cn\";\n\n/** Variant standard export (reki convention). */\nexport const REKI_ARRAY_DISPLAY_VARIANTS = {} as const;\n\nexport const REKI_ARRAY_DISPLAY_DEFAULT_VARIANTS = {} as const;\n\n/**\n * ArrayDisplay component props.\n *\n * @example\n * ```tsx\n * <ArrayDisplay values={[\"alpha\", \"beta\", \"gamma\"]} />\n * ```\n */\nexport interface ArrayDisplayProps {\n /** String values to render as chips. */\n values: string[];\n /** Items shown inline before collapsing into a `+N` chip. @default 1 */\n max?: number;\n /** Additional CSS classes merged via `cn()`. Use reki semantic tokens only. */\n className?: string;\n}\n\n/**\n * Renders an array field's values as a collapsible list of chips. Pre-normalize\n * the field value to a `string[]` in your field-cell layer.\n *\n * @example\n * ```tsx\n * <ArrayDisplay values={record.tags} max={2} />\n * ```\n */\nexport function ArrayDisplay({ values, max = 1, className }: ArrayDisplayProps) {\n if (values.length === 0) {\n return null;\n }\n\n return (\n <ExpandableList max={max} className={cn(className)}>\n {values.map((value, index) => (\n <Chip key={`${value}-${index}`} label={value} variant=\"highlighted\" />\n ))}\n </ExpandableList>\n );\n}\n"],"names":["ArrayDisplay","values","max","className","jsx","ExpandableList","cn","value","index","Chip"],"mappings":";;;;;AAmCO,SAASA,EAAa,EAAE,QAAAC,GAAQ,KAAAC,IAAM,GAAG,WAAAC,KAAgC;AAC9E,SAAIF,EAAO,WAAW,IACb,OAIP,gBAAAG,EAACC,GAAA,EAAe,KAAAH,GAAU,WAAWI,EAAGH,CAAS,GAC9C,UAAAF,EAAO,IAAI,CAACM,GAAOC,wBACjBC,GAAA,EAA+B,OAAOF,GAAO,SAAQ,cAAA,GAA3C,GAAGA,CAAK,IAAIC,CAAK,EAAwC,CACrE,EAAA,CACH;AAEJ;"}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import { jsx as o, jsxs as C } from "react/jsx-runtime";
|
|
3
3
|
import { CheckIcon as y } from "@phosphor-icons/react";
|
|
4
4
|
import { useContext as I, createContext as E } from "react";
|
|
5
|
-
import { R as p, i as v } from "./input-
|
|
5
|
+
import { R as p, i as v } from "./input-eno4q26x68rx3i8q.js";
|
|
6
6
|
import { c as r } from "./cn-ct4n7r74mh8y0f48.js";
|
|
7
7
|
import { r as R } from "./resolve-variant-t8jcltsizeg29ege.js";
|
|
8
|
-
import { F as k } from "./field-
|
|
9
|
-
import { by as T, aa as w, af as z, bx as G, ac as L, S as P, ad as _, ae as S, bw as V, an as F, ao as O, ap as U, ag as j } from "./vendor-base-ui-
|
|
8
|
+
import { F as k } from "./field-b0aywboxuss4rpu7.js";
|
|
9
|
+
import { by as T, aa as w, af as z, bx as G, ac as L, S as P, ad as _, ae as S, bw as V, an as F, ao as O, ap as U, ag as j } from "./vendor-base-ui-djdjrfuoxlb1lubi.js";
|
|
10
10
|
const u = E({
|
|
11
11
|
hasError: !1
|
|
12
12
|
}), W = {
|
|
@@ -190,4 +190,4 @@ export {
|
|
|
190
190
|
W as a,
|
|
191
191
|
X as b
|
|
192
192
|
};
|
|
193
|
-
//# sourceMappingURL=autocomplete-
|
|
193
|
+
//# sourceMappingURL=autocomplete-htuy5t9ag29qhuwa.js.map
|
package/dist/chunks/{autocomplete-f4vetako14h2aqsw.js.map → autocomplete-htuy5t9ag29qhuwa.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete-f4vetako14h2aqsw.js","sources":["../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["import { Autocomplete as AutocompleteBase } from \"@base-ui/react/autocomplete\";\nimport { CheckIcon } from \"@phosphor-icons/react\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { inputVariants, REKI_INPUT_VARIANTS } from \"../input/input\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\n\nconst AutocompleteContext = createContext<{ hasError: boolean }>({\n hasError: false,\n});\n\n/** Autocomplete variant definitions. */\nexport const REKI_AUTOCOMPLETE_VARIANTS = {\n size: REKI_INPUT_VARIANTS.size,\n} as const;\n\nexport const REKI_AUTOCOMPLETE_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\n// Derived types from REKI_AUTOCOMPLETE_VARIANTS\nexport type RekiAutocompleteSize = keyof typeof REKI_AUTOCOMPLETE_VARIANTS.size;\n\nexport interface RekiAutocompleteVariantsProps {\n /**\n * Size of the autocomplete input. Matches Input component sizes.\n * - `\"xs\"` — Extra small for compact UIs (h-5 / 20px)\n * - `\"sm\"` — Small for secondary fields (h-6.5 / 26px)\n * - `\"base\"` — Default size (h-9 / 36px)\n * - `\"lg\"` — Large for prominent fields (h-10 / 40px)\n * @default \"base\"\n */\n size?: RekiAutocompleteSize;\n}\n\nexport function autocompleteVariants({\n size = REKI_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n}: RekiAutocompleteVariantsProps = {}) {\n return cn(\n resolveVariant(\n REKI_INPUT_VARIANTS.size,\n size,\n REKI_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n ).classes,\n );\n}\n\n/**\n * Autocomplete component props.\n *\n * Autocomplete provides a free-form text input with optional suggestions in a\n * filterable dropdown. Unlike Combobox, the input value is not constrained to\n * the suggestion list items.\n *\n * @example\n * ```tsx\n * <Autocomplete label=\"Country\" items={countries}>\n * <Autocomplete.InputGroup />\n * <Autocomplete.Content>\n * <Autocomplete.List>\n * {(item) => <Autocomplete.Item value={item}>{item}</Autocomplete.Item>}\n * </Autocomplete.List>\n * </Autocomplete.Content>\n * </Autocomplete>\n * ```\n */\nexport interface AutocompleteProps {\n /** Array of items to display in the dropdown */\n items: unknown[];\n /** The controlled input value */\n value?: string | number | string[];\n /** The uncontrolled default input value */\n defaultValue?: string | number | string[];\n /** Callback when the input value changes */\n onValueChange?: AutocompleteBase.Root.Props<unknown>[\"onValueChange\"];\n /** Whether the popup is open (controlled) */\n open?: boolean;\n /** Callback when the popup opens or closes */\n onOpenChange?: AutocompleteBase.Root.Props<unknown>[\"onOpenChange\"];\n /** Autocomplete content (input group, popup content) */\n children: ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Label content (enables Field wrapper) */\n label?: ReactNode;\n /** Whether the field is required */\n required?: boolean;\n /** Tooltip content to display next to the label */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the field */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nfunction Root<ItemValue>({\n label,\n required,\n labelTooltip,\n description,\n error,\n children,\n ...props\n}: AutocompleteBase.Root.Props<ItemValue> & {\n label?: ReactNode;\n required?: boolean;\n labelTooltip?: ReactNode;\n description?: ReactNode;\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}) {\n const rootProps = props as Omit<\n AutocompleteBase.Root.Props<ItemValue>,\n \"items\"\n > & {\n items?: readonly ItemValue[];\n };\n const control = (\n <AutocompleteContext.Provider value={{ hasError: Boolean(error) }}>\n <AutocompleteBase.Root {...rootProps}>{children}</AutocompleteBase.Root>\n </AutocompleteContext.Provider>\n );\n\n if (label) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {control}\n </Field>\n );\n }\n\n return control;\n}\n\nfunction InputGroup({\n className,\n size = REKI_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n placeholder,\n}: {\n className?: string;\n size?: RekiAutocompleteSize;\n placeholder?: string;\n}) {\n const { hasError } = useContext(AutocompleteContext);\n return (\n <AutocompleteBase.Input\n className={cn(\n inputVariants({\n size,\n variant: hasError ? \"error\" : \"default\",\n focusIndicator: true,\n }),\n \"w-full\",\n className,\n )}\n placeholder={placeholder}\n />\n );\n}\n\nfunction Content({\n children,\n className,\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n side,\n}: {\n children?: ReactNode;\n className?: string;\n align?: AutocompleteBase.Positioner.Props[\"align\"];\n alignOffset?: AutocompleteBase.Positioner.Props[\"alignOffset\"];\n side?: AutocompleteBase.Positioner.Props[\"side\"];\n sideOffset?: AutocompleteBase.Positioner.Props[\"sideOffset\"];\n}) {\n return (\n <AutocompleteBase.Portal>\n <AutocompleteBase.Positioner\n className=\"outline-none\"\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n side={side}\n >\n <AutocompleteBase.Popup\n className={(state: AutocompleteBase.Popup.State) =>\n cn(\n \"flex flex-col\",\n \"max-h-[min(var(--available-height),24rem)] max-w-(--available-width) min-w-(--anchor-width) py-1.5\",\n \"bg-reki-control text-reki-default\",\n \"rounded-lg shadow-lg ring ring-reki-line\",\n state.empty && \"hidden\",\n className,\n )\n }\n >\n {children}\n </AutocompleteBase.Popup>\n </AutocompleteBase.Positioner>\n </AutocompleteBase.Portal>\n );\n}\n\nfunction List({\n className,\n ...props\n}: AutocompleteBase.List.Props & { className?: string }) {\n return (\n <AutocompleteBase.List\n {...props}\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain scroll-pt-2 scroll-pb-2\",\n className,\n )}\n />\n );\n}\n\nfunction Item({ children, ...props }: AutocompleteBase.Item.Props) {\n return (\n <AutocompleteBase.Item\n data-reki-component=\"Autocomplete\"\n data-reki-part=\"item\"\n {...props}\n className=\"group mx-1.5 grid cursor-pointer grid-cols-[1fr_16px] gap-2 rounded px-2 py-1.5 text-base data-highlighted:bg-reki-overlay data-selected:font-medium\"\n >\n <div className=\"col-start-1\">{children}</div>\n <span className=\"col-start-2 hidden items-center group-data-selected:flex\">\n <CheckIcon size={14} />\n </span>\n </AutocompleteBase.Item>\n );\n}\n\nfunction GroupLabel(props: AutocompleteBase.GroupLabel.Props) {\n return (\n <AutocompleteBase.GroupLabel\n {...props}\n className={cn(\n \"mx-1.5 px-2 py-1.5 text-sm text-reki-strong\",\n props.className,\n )}\n />\n );\n}\n\nfunction Group(props: AutocompleteBase.Group.Props) {\n return (\n <AutocompleteBase.Group\n {...props}\n className=\"border-t border-reki-line mt-2 pt-2 first:border-t-0 first:mt-0 first:pt-0\"\n />\n );\n}\n\nfunction Separator(props: AutocompleteBase.Separator.Props) {\n return (\n <AutocompleteBase.Separator\n {...props}\n className={cn(\"mx-0 my-1 h-px bg-reki-line\", props.className)}\n />\n );\n}\n\nRoot.displayName = \"Autocomplete.Root\";\nInputGroup.displayName = \"Autocomplete.InputGroup\";\nContent.displayName = \"Autocomplete.Content\";\nItem.displayName = \"Autocomplete.Item\";\nGroupLabel.displayName = \"Autocomplete.GroupLabel\";\nGroup.displayName = \"Autocomplete.Group\";\nSeparator.displayName = \"Autocomplete.Separator\";\n\n/**\n * Autocomplete — free-form text input with an optional filtered suggestion list.\n *\n * Unlike Combobox, the input value is not restricted to items in the list.\n * Use Combobox when the selected value must come from the list.\n *\n * Compound component: `Autocomplete` (Root), `.InputGroup`, `.Content`, `.Item`,\n * `.GroupLabel`, `.Group`, `.Separator`, `.List`, `.Collection`.\n *\n * `InputGroup` renders the text input with Input component styling.\n * Pass a `size` prop to `InputGroup` to match the Input component sizes.\n *\n * @example\n * ```tsx\n * <Autocomplete items={fruits} label=\"Fruit\">\n * <Autocomplete.InputGroup size=\"base\" />\n * <Autocomplete.Content>\n * <Autocomplete.List>\n * {(item) => <Autocomplete.Item value={item}>{item}</Autocomplete.Item>}\n * </Autocomplete.List>\n * </Autocomplete.Content>\n * </Autocomplete>\n * ```\n *\n * @see https://base-ui.com/react/components/autocomplete\n */\nexport const Autocomplete = Object.assign(Root, {\n // Styled compound sub-components\n InputGroup,\n Content,\n Item,\n GroupLabel,\n Group,\n Separator,\n List,\n\n // Pass-through Base UI sub-components\n Empty: AutocompleteBase.Empty,\n Collection: AutocompleteBase.Collection,\n\n // Filtering\n useFilter: AutocompleteBase.useFilter,\n});\n"],"names":["AutocompleteContext","createContext","REKI_AUTOCOMPLETE_VARIANTS","REKI_INPUT_VARIANTS","REKI_AUTOCOMPLETE_DEFAULT_VARIANTS","autocompleteVariants","size","cn","resolveVariant","Root","label","required","labelTooltip","description","error","children","props","rootProps","control","jsx","AutocompleteBase.Root","Field","InputGroup","className","placeholder","hasError","useContext","AutocompleteBase.Input","inputVariants","Content","align","sideOffset","alignOffset","side","AutocompleteBase.Portal","AutocompleteBase.Positioner","AutocompleteBase.Popup","state","List","AutocompleteBase.List","Item","jsxs","AutocompleteBase.Item","CheckIcon","GroupLabel","AutocompleteBase.GroupLabel","Group","AutocompleteBase.Group","Separator","AutocompleteBase.Separator","Autocomplete","AutocompleteBase.Empty","AutocompleteBase.Collection","AutocompleteBase.useFilter"],"mappings":";;;;;;;;;AAQA,MAAMA,IAAsBC,EAAqC;AAAA,EAC/D,UAAU;AACZ,CAAC,GAGYC,IAA6B;AAAA,EACxC,MAAMC,EAAoB;AAC5B,GAEaC,IAAqC;AAAA,EAChD,MAAM;AACR;AAiBO,SAASC,EAAqB;AAAA,EACnC,MAAAC,IAAOF,EAAmC;AAC5C,IAAmC,IAAI;AACrC,SAAOG;AAAA,IACLC;AAAA,MACEL,EAAoB;AAAA,MACpBG;AAAA,MACAF,EAAmC;AAAA,IAAA,EACnC;AAAA,EAAA;AAEN;AAkDA,SAASK,EAAgB;AAAA,EACvB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAMG;AACD,QAAMC,IAAYD,GAMZE,IACJ,gBAAAC,EAACnB,EAAoB,UAApB,EAA6B,OAAO,EAAE,UAAU,EAAQc,KACvD,4BAACM,GAAA,EAAuB,GAAGH,GAAY,UAAAF,GAAS,GAClD;AAGF,SAAIL,IAEA,gBAAAS;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,OAAAX;AAAA,MACA,UAAAC;AAAA,MACA,cAAAC;AAAA,MACA,aAAAC;AAAA,MACA,OACEC,IACI,OAAOA,KAAU,WACf,EAAE,SAASA,GAAO,OAAO,GAAA,IACzBA,IACF;AAAA,MAGL,UAAAI;AAAA,IAAA;AAAA,EAAA,IAKAA;AACT;AAEA,SAASI,EAAW;AAAA,EAClB,WAAAC;AAAA,EACA,MAAAjB,IAAOF,EAAmC;AAAA,EAC1C,aAAAoB;AACF,GAIG;AACD,QAAM,EAAE,UAAAC,EAAA,IAAaC,EAAW1B,CAAmB;AACnD,SACE,gBAAAmB;AAAA,IAACQ;AAAAA,IAAA;AAAA,MACC,WAAWpB;AAAA,QACTqB,EAAc;AAAA,UACZ,MAAAtB;AAAA,UACA,SAASmB,IAAW,UAAU;AAAA,UAC9B,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD;AAAA,QACAF;AAAA,MAAA;AAAA,MAEF,aAAAC;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAASK,EAAQ;AAAA,EACf,UAAAd;AAAA,EACA,WAAAQ;AAAA,EACA,OAAAO,IAAQ;AAAA,EACR,YAAAC,IAAa;AAAA,EACb,aAAAC;AAAA,EACA,MAAAC;AACF,GAOG;AACD,SACE,gBAAAd,EAACe,GAAA,EACC,UAAA,gBAAAf;AAAA,IAACgB;AAAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAAL;AAAA,MACA,YAAAC;AAAA,MACA,aAAAC;AAAA,MACA,MAAAC;AAAA,MAEA,UAAA,gBAAAd;AAAA,QAACiB;AAAAA,QAAA;AAAA,UACC,WAAW,CAACC,MACV9B;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA8B,EAAM,SAAS;AAAA,YACfd;AAAA,UAAA;AAAA,UAIH,UAAAR;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAASuB,EAAK;AAAA,EACZ,WAAAf;AAAA,EACA,GAAGP;AACL,GAAyD;AACvD,SACE,gBAAAG;AAAA,IAACoB;AAAAA,IAAA;AAAA,MACE,GAAGvB;AAAA,MACJ,WAAWT;AAAA,QACT;AAAA,QACAgB;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;AAEA,SAASiB,EAAK,EAAE,UAAAzB,GAAU,GAAGC,KAAsC;AACjE,SACE,gBAAAyB;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,uBAAoB;AAAA,MACpB,kBAAe;AAAA,MACd,GAAG1B;AAAA,MACJ,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,gBAAAG,EAAC,OAAA,EAAI,WAAU,eAAe,UAAAJ,EAAA,CAAS;AAAA,QACvC,gBAAAI,EAAC,UAAK,WAAU,4DACd,4BAACwB,GAAA,EAAU,MAAM,IAAI,EAAA,CACvB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAASC,EAAW5B,GAA0C;AAC5D,SACE,gBAAAG;AAAA,IAAC0B;AAAAA,IAAA;AAAA,MACE,GAAG7B;AAAA,MACJ,WAAWT;AAAA,QACT;AAAA,QACAS,EAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA;AAGN;AAEA,SAAS8B,EAAM9B,GAAqC;AAClD,SACE,gBAAAG;AAAA,IAAC4B;AAAAA,IAAA;AAAA,MACE,GAAG/B;AAAA,MACJ,WAAU;AAAA,IAAA;AAAA,EAAA;AAGhB;AAEA,SAASgC,EAAUhC,GAAyC;AAC1D,SACE,gBAAAG;AAAA,IAAC8B;AAAAA,IAAA;AAAA,MACE,GAAGjC;AAAA,MACJ,WAAWT,EAAG,+BAA+BS,EAAM,SAAS;AAAA,IAAA;AAAA,EAAA;AAGlE;AAEAP,EAAK,cAAc;AACnBa,EAAW,cAAc;AACzBO,EAAQ,cAAc;AACtBW,EAAK,cAAc;AACnBI,EAAW,cAAc;AACzBE,EAAM,cAAc;AACpBE,EAAU,cAAc;AA4BjB,MAAME,IAAe,OAAO,OAAOzC,GAAM;AAAA;AAAA,EAE9C,YAAAa;AAAA,EACA,SAAAO;AAAA,EACA,MAAAW;AAAA,EACA,YAAAI;AAAA,EACA,OAAAE;AAAA,EACA,WAAAE;AAAA,EACA,MAAAV;AAAA;AAAA,EAGA,OAAOa;AAAAA,EACP,YAAYC;AAAAA;AAAAA,EAGZ,WAAWC;AACb,CAAC;"}
|
|
1
|
+
{"version":3,"file":"autocomplete-htuy5t9ag29qhuwa.js","sources":["../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["import { Autocomplete as AutocompleteBase } from \"@base-ui/react/autocomplete\";\nimport { CheckIcon } from \"@phosphor-icons/react\";\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { inputVariants, REKI_INPUT_VARIANTS } from \"../input/input\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\n\nconst AutocompleteContext = createContext<{ hasError: boolean }>({\n hasError: false,\n});\n\n/** Autocomplete variant definitions. */\nexport const REKI_AUTOCOMPLETE_VARIANTS = {\n size: REKI_INPUT_VARIANTS.size,\n} as const;\n\nexport const REKI_AUTOCOMPLETE_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\n// Derived types from REKI_AUTOCOMPLETE_VARIANTS\nexport type RekiAutocompleteSize = keyof typeof REKI_AUTOCOMPLETE_VARIANTS.size;\n\nexport interface RekiAutocompleteVariantsProps {\n /**\n * Size of the autocomplete input. Matches Input component sizes.\n * - `\"xs\"` — Extra small for compact UIs (h-5 / 20px)\n * - `\"sm\"` — Small for secondary fields (h-6.5 / 26px)\n * - `\"base\"` — Default size (h-9 / 36px)\n * - `\"lg\"` — Large for prominent fields (h-10 / 40px)\n * @default \"base\"\n */\n size?: RekiAutocompleteSize;\n}\n\nexport function autocompleteVariants({\n size = REKI_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n}: RekiAutocompleteVariantsProps = {}) {\n return cn(\n resolveVariant(\n REKI_INPUT_VARIANTS.size,\n size,\n REKI_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n ).classes,\n );\n}\n\n/**\n * Autocomplete component props.\n *\n * Autocomplete provides a free-form text input with optional suggestions in a\n * filterable dropdown. Unlike Combobox, the input value is not constrained to\n * the suggestion list items.\n *\n * @example\n * ```tsx\n * <Autocomplete label=\"Country\" items={countries}>\n * <Autocomplete.InputGroup />\n * <Autocomplete.Content>\n * <Autocomplete.List>\n * {(item) => <Autocomplete.Item value={item}>{item}</Autocomplete.Item>}\n * </Autocomplete.List>\n * </Autocomplete.Content>\n * </Autocomplete>\n * ```\n */\nexport interface AutocompleteProps {\n /** Array of items to display in the dropdown */\n items: unknown[];\n /** The controlled input value */\n value?: string | number | string[];\n /** The uncontrolled default input value */\n defaultValue?: string | number | string[];\n /** Callback when the input value changes */\n onValueChange?: AutocompleteBase.Root.Props<unknown>[\"onValueChange\"];\n /** Whether the popup is open (controlled) */\n open?: boolean;\n /** Callback when the popup opens or closes */\n onOpenChange?: AutocompleteBase.Root.Props<unknown>[\"onOpenChange\"];\n /** Autocomplete content (input group, popup content) */\n children: ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Label content (enables Field wrapper) */\n label?: ReactNode;\n /** Whether the field is required */\n required?: boolean;\n /** Tooltip content to display next to the label */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the field */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nfunction Root<ItemValue>({\n label,\n required,\n labelTooltip,\n description,\n error,\n children,\n ...props\n}: AutocompleteBase.Root.Props<ItemValue> & {\n label?: ReactNode;\n required?: boolean;\n labelTooltip?: ReactNode;\n description?: ReactNode;\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}) {\n const rootProps = props as Omit<\n AutocompleteBase.Root.Props<ItemValue>,\n \"items\"\n > & {\n items?: readonly ItemValue[];\n };\n const control = (\n <AutocompleteContext.Provider value={{ hasError: Boolean(error) }}>\n <AutocompleteBase.Root {...rootProps}>{children}</AutocompleteBase.Root>\n </AutocompleteContext.Provider>\n );\n\n if (label) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {control}\n </Field>\n );\n }\n\n return control;\n}\n\nfunction InputGroup({\n className,\n size = REKI_AUTOCOMPLETE_DEFAULT_VARIANTS.size,\n placeholder,\n}: {\n className?: string;\n size?: RekiAutocompleteSize;\n placeholder?: string;\n}) {\n const { hasError } = useContext(AutocompleteContext);\n return (\n <AutocompleteBase.Input\n className={cn(\n inputVariants({\n size,\n variant: hasError ? \"error\" : \"default\",\n focusIndicator: true,\n }),\n \"w-full\",\n className,\n )}\n placeholder={placeholder}\n />\n );\n}\n\nfunction Content({\n children,\n className,\n align = \"start\",\n sideOffset = 4,\n alignOffset,\n side,\n}: {\n children?: ReactNode;\n className?: string;\n align?: AutocompleteBase.Positioner.Props[\"align\"];\n alignOffset?: AutocompleteBase.Positioner.Props[\"alignOffset\"];\n side?: AutocompleteBase.Positioner.Props[\"side\"];\n sideOffset?: AutocompleteBase.Positioner.Props[\"sideOffset\"];\n}) {\n return (\n <AutocompleteBase.Portal>\n <AutocompleteBase.Positioner\n className=\"outline-none\"\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n side={side}\n >\n <AutocompleteBase.Popup\n className={(state: AutocompleteBase.Popup.State) =>\n cn(\n \"flex flex-col\",\n \"max-h-[min(var(--available-height),24rem)] max-w-(--available-width) min-w-(--anchor-width) py-1.5\",\n \"bg-reki-control text-reki-default\",\n \"rounded-lg shadow-lg ring ring-reki-line\",\n state.empty && \"hidden\",\n className,\n )\n }\n >\n {children}\n </AutocompleteBase.Popup>\n </AutocompleteBase.Positioner>\n </AutocompleteBase.Portal>\n );\n}\n\nfunction List({\n className,\n ...props\n}: AutocompleteBase.List.Props & { className?: string }) {\n return (\n <AutocompleteBase.List\n {...props}\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain scroll-pt-2 scroll-pb-2\",\n className,\n )}\n />\n );\n}\n\nfunction Item({ children, ...props }: AutocompleteBase.Item.Props) {\n return (\n <AutocompleteBase.Item\n data-reki-component=\"Autocomplete\"\n data-reki-part=\"item\"\n {...props}\n className=\"group mx-1.5 grid cursor-pointer grid-cols-[1fr_16px] gap-2 rounded px-2 py-1.5 text-base data-highlighted:bg-reki-overlay data-selected:font-medium\"\n >\n <div className=\"col-start-1\">{children}</div>\n <span className=\"col-start-2 hidden items-center group-data-selected:flex\">\n <CheckIcon size={14} />\n </span>\n </AutocompleteBase.Item>\n );\n}\n\nfunction GroupLabel(props: AutocompleteBase.GroupLabel.Props) {\n return (\n <AutocompleteBase.GroupLabel\n {...props}\n className={cn(\n \"mx-1.5 px-2 py-1.5 text-sm text-reki-strong\",\n props.className,\n )}\n />\n );\n}\n\nfunction Group(props: AutocompleteBase.Group.Props) {\n return (\n <AutocompleteBase.Group\n {...props}\n className=\"border-t border-reki-line mt-2 pt-2 first:border-t-0 first:mt-0 first:pt-0\"\n />\n );\n}\n\nfunction Separator(props: AutocompleteBase.Separator.Props) {\n return (\n <AutocompleteBase.Separator\n {...props}\n className={cn(\"mx-0 my-1 h-px bg-reki-line\", props.className)}\n />\n );\n}\n\nRoot.displayName = \"Autocomplete.Root\";\nInputGroup.displayName = \"Autocomplete.InputGroup\";\nContent.displayName = \"Autocomplete.Content\";\nItem.displayName = \"Autocomplete.Item\";\nGroupLabel.displayName = \"Autocomplete.GroupLabel\";\nGroup.displayName = \"Autocomplete.Group\";\nSeparator.displayName = \"Autocomplete.Separator\";\n\n/**\n * Autocomplete — free-form text input with an optional filtered suggestion list.\n *\n * Unlike Combobox, the input value is not restricted to items in the list.\n * Use Combobox when the selected value must come from the list.\n *\n * Compound component: `Autocomplete` (Root), `.InputGroup`, `.Content`, `.Item`,\n * `.GroupLabel`, `.Group`, `.Separator`, `.List`, `.Collection`.\n *\n * `InputGroup` renders the text input with Input component styling.\n * Pass a `size` prop to `InputGroup` to match the Input component sizes.\n *\n * @example\n * ```tsx\n * <Autocomplete items={fruits} label=\"Fruit\">\n * <Autocomplete.InputGroup size=\"base\" />\n * <Autocomplete.Content>\n * <Autocomplete.List>\n * {(item) => <Autocomplete.Item value={item}>{item}</Autocomplete.Item>}\n * </Autocomplete.List>\n * </Autocomplete.Content>\n * </Autocomplete>\n * ```\n *\n * @see https://base-ui.com/react/components/autocomplete\n */\nexport const Autocomplete = Object.assign(Root, {\n // Styled compound sub-components\n InputGroup,\n Content,\n Item,\n GroupLabel,\n Group,\n Separator,\n List,\n\n // Pass-through Base UI sub-components\n Empty: AutocompleteBase.Empty,\n Collection: AutocompleteBase.Collection,\n\n // Filtering\n useFilter: AutocompleteBase.useFilter,\n});\n"],"names":["AutocompleteContext","createContext","REKI_AUTOCOMPLETE_VARIANTS","REKI_INPUT_VARIANTS","REKI_AUTOCOMPLETE_DEFAULT_VARIANTS","autocompleteVariants","size","cn","resolveVariant","Root","label","required","labelTooltip","description","error","children","props","rootProps","control","jsx","AutocompleteBase.Root","Field","InputGroup","className","placeholder","hasError","useContext","AutocompleteBase.Input","inputVariants","Content","align","sideOffset","alignOffset","side","AutocompleteBase.Portal","AutocompleteBase.Positioner","AutocompleteBase.Popup","state","List","AutocompleteBase.List","Item","jsxs","AutocompleteBase.Item","CheckIcon","GroupLabel","AutocompleteBase.GroupLabel","Group","AutocompleteBase.Group","Separator","AutocompleteBase.Separator","Autocomplete","AutocompleteBase.Empty","AutocompleteBase.Collection","AutocompleteBase.useFilter"],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as t, jsx as a } from "react/jsx-runtime";
|
|
3
|
+
import { T as o } from "./text-oxsrbmjmfq99ue85.js";
|
|
4
|
+
import { c } from "./cn-ct4n7r74mh8y0f48.js";
|
|
5
|
+
const m = {
|
|
6
|
+
xs: "size-5",
|
|
7
|
+
sm: "size-6",
|
|
8
|
+
base: "size-8",
|
|
9
|
+
lg: "size-10",
|
|
10
|
+
xl: "size-12"
|
|
11
|
+
}, d = {
|
|
12
|
+
xs: "xs",
|
|
13
|
+
sm: "xs",
|
|
14
|
+
base: "sm",
|
|
15
|
+
lg: "base",
|
|
16
|
+
xl: "lg"
|
|
17
|
+
}, u = {
|
|
18
|
+
circle: "rounded-full",
|
|
19
|
+
square: "rounded-md"
|
|
20
|
+
};
|
|
21
|
+
function x({
|
|
22
|
+
src: e = null,
|
|
23
|
+
initials: s,
|
|
24
|
+
alt: i = "",
|
|
25
|
+
size: l = "base",
|
|
26
|
+
shape: r = "circle",
|
|
27
|
+
className: n
|
|
28
|
+
}) {
|
|
29
|
+
return /* @__PURE__ */ t(
|
|
30
|
+
"span",
|
|
31
|
+
{
|
|
32
|
+
"data-slot": "avatar",
|
|
33
|
+
className: c(
|
|
34
|
+
"relative inline-flex shrink-0 items-center justify-center overflow-hidden bg-reki-fill align-middle",
|
|
35
|
+
m[l],
|
|
36
|
+
u[r],
|
|
37
|
+
n
|
|
38
|
+
),
|
|
39
|
+
children: [
|
|
40
|
+
!e && s ? /* @__PURE__ */ a(o, { variant: "secondary", size: d[l], children: s }) : null,
|
|
41
|
+
e ? /* @__PURE__ */ a(
|
|
42
|
+
"img",
|
|
43
|
+
{
|
|
44
|
+
src: e,
|
|
45
|
+
alt: i,
|
|
46
|
+
className: "absolute inset-0 size-full object-cover object-center"
|
|
47
|
+
}
|
|
48
|
+
) : null
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
x.displayName = "Avatar";
|
|
54
|
+
export {
|
|
55
|
+
x as A
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=avatar-g40cun6cn17fcxd4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-g40cun6cn17fcxd4.js","sources":["../../src/components/avatar/avatar.tsx"],"sourcesContent":["import { Text } from \"../text\";\nimport { cn } from \"../../utils/cn\";\n\n/** Variant standard export (reki convention). */\nexport const REKI_AVATAR_VARIANTS = {\n size: {\n xs: { classes: \"size-5\", description: \"Extra small\" },\n sm: { classes: \"size-6\", description: \"Small\" },\n base: { classes: \"size-8\", description: \"Default\" },\n lg: { classes: \"size-10\", description: \"Large\" },\n xl: { classes: \"size-12\", description: \"Extra large\" },\n },\n shape: {\n circle: { classes: \"rounded-full\", description: \"Round avatar\" },\n square: { classes: \"rounded-md\", description: \"Rounded square avatar\" },\n },\n} as const;\n\nexport const REKI_AVATAR_DEFAULT_VARIANTS = {\n size: \"base\",\n shape: \"circle\",\n} as const;\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"base\" | \"lg\" | \"xl\";\nexport type AvatarShape = \"circle\" | \"square\";\n\n/**\n * Avatar component props.\n *\n * @example\n * ```tsx\n * <Avatar initials=\"JD\" />\n * <Avatar src=\"/u/jane.png\" alt=\"Jane Doe\" />\n * ```\n */\nexport interface AvatarProps {\n /** Image URL. When present, the image replaces the initials fallback. */\n src?: string | null;\n /** Up to ~2 characters shown when there is no image. */\n initials?: string;\n /** Accessible name / image alt text. */\n alt?: string;\n /** Glyph scale. @default \"base\" */\n size?: AvatarSize;\n /** Round (default) or rounded-square. @default \"circle\" */\n shape?: AvatarShape;\n /** Additional CSS classes merged via `cn()`. Use reki semantic tokens only. */\n className?: string;\n}\n\n/** Pure-layout sizing on the wrapper (no color utilities). */\nconst SIZE_BOX: Record<AvatarSize, string> = {\n xs: \"size-5\",\n sm: \"size-6\",\n base: \"size-8\",\n lg: \"size-10\",\n xl: \"size-12\",\n};\n\n/** Initials text scale, mapped to reki `Text` size props. */\nconst SIZE_TEXT: Record<AvatarSize, \"xs\" | \"sm\" | \"base\" | \"lg\"> = {\n xs: \"xs\",\n sm: \"xs\",\n base: \"sm\",\n lg: \"base\",\n xl: \"lg\",\n};\n\nconst SHAPE_RADIUS: Record<AvatarShape, string> = {\n circle: \"rounded-full\",\n square: \"rounded-md\",\n};\n\n/**\n * Image-or-initials glyph for a user or entity. Falls back to initials on a\n * neutral fill when no image is provided. Use for assignees, participants, and\n * record owners.\n *\n * @example\n * ```tsx\n * <Avatar initials=\"JD\" size=\"sm\" />\n * <Avatar src={member.avatarUrl} alt={member.name} />\n * ```\n */\nexport function Avatar({\n src = null,\n initials,\n alt = \"\",\n size = \"base\",\n shape = \"circle\",\n className,\n}: AvatarProps) {\n return (\n <span\n data-slot=\"avatar\"\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center overflow-hidden bg-reki-fill align-middle\",\n SIZE_BOX[size],\n SHAPE_RADIUS[shape],\n className,\n )}\n >\n {!src && initials ? (\n <Text variant=\"secondary\" size={SIZE_TEXT[size]}>\n {initials}\n </Text>\n ) : null}\n {src ? (\n <img\n src={src}\n alt={alt}\n className=\"absolute inset-0 size-full object-cover object-center\"\n />\n ) : null}\n </span>\n );\n}\n\nAvatar.displayName = \"Avatar\";\n"],"names":["SIZE_BOX","SIZE_TEXT","SHAPE_RADIUS","Avatar","src","initials","alt","size","shape","className","jsxs","cn","jsx","Text"],"mappings":";;;;AAmDA,MAAMA,IAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AACN,GAGMC,IAA6D;AAAA,EACjE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,QAAQ;AACV;AAaO,SAASC,EAAO;AAAA,EACrB,KAAAC,IAAM;AAAA,EACN,UAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,WAAAC;AACF,GAAgB;AACd,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACAX,EAASO,CAAI;AAAA,QACbL,EAAaM,CAAK;AAAA,QAClBC;AAAA,MAAA;AAAA,MAGD,UAAA;AAAA,QAAA,CAACL,KAAOC,IACP,gBAAAO,EAACC,GAAA,EAAK,SAAQ,aAAY,MAAMZ,EAAUM,CAAI,GAC3C,UAAAF,EAAA,CACH,IACE;AAAA,QACHD,IACC,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAAR;AAAA,YACA,KAAAE;AAAA,YACA,WAAU;AAAA,UAAA;AAAA,QAAA,IAEV;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;AAEAH,EAAO,cAAc;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as m, jsx as n } from "react/jsx-runtime";
|
|
3
|
+
import { c as o } from "./cn-ct4n7r74mh8y0f48.js";
|
|
4
|
+
function d({ avatars: e, max: r = 4, className: s }) {
|
|
5
|
+
if (e.length === 0)
|
|
6
|
+
return null;
|
|
7
|
+
const l = e.slice(0, r), i = e.length - l.length;
|
|
8
|
+
return /* @__PURE__ */ m("div", { className: o("flex items-center", s), children: [
|
|
9
|
+
l.map((t, c) => /* @__PURE__ */ n(
|
|
10
|
+
"div",
|
|
11
|
+
{
|
|
12
|
+
className: "-ml-1.5 rounded-full ring-2 ring-reki-base first:ml-0",
|
|
13
|
+
children: t
|
|
14
|
+
},
|
|
15
|
+
c
|
|
16
|
+
)),
|
|
17
|
+
i > 0 ? /* @__PURE__ */ n("span", { className: "-ml-1.5 inline-flex size-6 items-center justify-center rounded-full bg-reki-fill text-[0.625rem] font-semibold text-reki-subtle ring-2 ring-reki-base", children: `+${i}` }) : null
|
|
18
|
+
] });
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
d as A
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=avatar-group-fpcaziey1yu7226v.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-group-fpcaziey1yu7226v.js","sources":["../../src/components/avatar-group/avatar-group.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Variant standard export (reki convention). */\nexport const REKI_AVATAR_GROUP_VARIANTS = {} as const;\n\nexport const REKI_AVATAR_GROUP_DEFAULT_VARIANTS = {} as const;\n\n/**\n * AvatarGroup component props.\n *\n * @example\n * ```tsx\n * <AvatarGroup avatars={members.map((m) => <Avatar key={m.id} src={m.url} />)} />\n * ```\n */\nexport interface AvatarGroupProps {\n /** Avatar nodes to stack (typically reki `Avatar` elements). */\n avatars: ReactNode[];\n /** Maximum avatars shown before collapsing into a `+N` counter. @default 4 */\n max?: number;\n /** Additional CSS classes merged via `cn()`. Use reki semantic tokens only. */\n className?: string;\n}\n\n/**\n * Overlapping stack of avatars for assignees / participants. Shows up to `max`\n * avatars and a `+N` counter for the remainder.\n *\n * @example\n * ```tsx\n * <AvatarGroup\n * avatars={members.map((m) => (\n * <Avatar key={m.id} src={m.avatarUrl} initials={m.initials} size=\"sm\" />\n * ))}\n * />\n * ```\n */\nexport function AvatarGroup({ avatars, max = 4, className }: AvatarGroupProps) {\n if (avatars.length === 0) {\n return null;\n }\n\n const visible = avatars.slice(0, max);\n const overflow = avatars.length - visible.length;\n\n return (\n <div className={cn(\"flex items-center\", className)}>\n {visible.map((avatar, index) => (\n <div\n key={index}\n className=\"-ml-1.5 rounded-full ring-2 ring-reki-base first:ml-0\"\n >\n {avatar}\n </div>\n ))}\n {overflow > 0 ? (\n <span className=\"-ml-1.5 inline-flex size-6 items-center justify-center rounded-full bg-reki-fill text-[0.625rem] font-semibold text-reki-subtle ring-2 ring-reki-base\">\n {`+${overflow}`}\n </span>\n ) : null}\n </div>\n );\n}\n"],"names":["AvatarGroup","avatars","max","className","visible","overflow","cn","avatar","index","jsx"],"mappings":";;;AAsCO,SAASA,EAAY,EAAE,SAAAC,GAAS,KAAAC,IAAM,GAAG,WAAAC,KAA+B;AAC7E,MAAIF,EAAQ,WAAW;AACrB,WAAO;AAGT,QAAMG,IAAUH,EAAQ,MAAM,GAAGC,CAAG,GAC9BG,IAAWJ,EAAQ,SAASG,EAAQ;AAE1C,2BACG,OAAA,EAAI,WAAWE,EAAG,qBAAqBH,CAAS,GAC9C,UAAA;AAAA,IAAAC,EAAQ,IAAI,CAACG,GAAQC,MACpB,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAET,UAAAF;AAAA,MAAA;AAAA,MAHIC;AAAA,IAAA,CAKR;AAAA,IACAH,IAAW,IACV,gBAAAI,EAAC,QAAA,EAAK,WAAU,yJACb,UAAA,IAAIJ,CAAQ,GAAA,CACf,IACE;AAAA,EAAA,GACN;AAEJ;"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsxs as l, jsx as r } from "react/jsx-runtime";
|
|
3
3
|
import { Children as k, cloneElement as d, isValidElement as x, useState as C, useEffect as g } from "react";
|
|
4
4
|
import { CheckIcon as w, CopyIcon as N } from "@phosphor-icons/react";
|
|
5
|
-
import { B as y } from "./button-
|
|
5
|
+
import { B as y } from "./button-fvlz1rzc3s1hpyxs.js";
|
|
6
6
|
import { S as v } from "./skeleton-line-epxenksfesr2fkcv.js";
|
|
7
7
|
import { u as I } from "./link-provider-bgljdgs4hs438h0u.js";
|
|
8
8
|
import { c as f } from "./cn-ct4n7r74mh8y0f48.js";
|
|
@@ -166,4 +166,4 @@ export {
|
|
|
166
166
|
E as a,
|
|
167
167
|
L as b
|
|
168
168
|
};
|
|
169
|
-
//# sourceMappingURL=breadcrumbs-
|
|
169
|
+
//# sourceMappingURL=breadcrumbs-mq1utzm0q4u2r5v5.js.map
|
package/dist/chunks/{breadcrumbs-d6149hyct4puz3x4.js.map → breadcrumbs-mq1utzm0q4u2r5v5.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumbs-d6149hyct4puz3x4.js","sources":["../../src/components/breadcrumbs/breadcrumbs.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n useEffect,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { CheckIcon, CopyIcon } from \"@phosphor-icons/react\";\nimport { Button } from \"../../components/button\";\nimport { SkeletonLine } from \"../../components/loader/skeleton-line\";\nimport { useLinkComponent } from \"../../utils/link-provider\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\n\n/** Breadcrumbs size variant definitions. */\nexport const REKI_BREADCRUMBS_VARIANTS = {\n size: {\n sm: {\n classes: \"text-sm h-10 gap-0.5\",\n description: \"Compact breadcrumbs for dense UIs\",\n },\n base: {\n classes: \"text-base h-12 gap-1\",\n description: \"Default breadcrumbs size\",\n },\n },\n} as const;\n\nexport const REKI_BREADCRUMBS_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\nexport type RekiBreadcrumbsSize = keyof typeof REKI_BREADCRUMBS_VARIANTS.size;\n\nexport interface RekiBreadcrumbsVariantsProps {\n /**\n * Size of the breadcrumbs.\n * - `\"sm\"` — Compact breadcrumbs for dense UIs\n * - `\"base\"` — Default breadcrumbs size\n * @default \"base\"\n */\n size?: RekiBreadcrumbsSize;\n}\n\nexport function breadcrumbsVariants({\n size = REKI_BREADCRUMBS_DEFAULT_VARIANTS.size,\n}: RekiBreadcrumbsVariantsProps = {}) {\n return cn(\n \"group mr-4 flex min-w-0 grow items-center overflow-hidden whitespace-nowrap\",\n resolveVariant(REKI_BREADCRUMBS_VARIANTS.size, size, REKI_BREADCRUMBS_DEFAULT_VARIANTS.size).classes,\n );\n}\n\nexport interface BreadcrumbsItemProps {\n href: string;\n icon?: React.ReactNode;\n}\n\nconst Link = ({\n href,\n icon,\n children,\n}: PropsWithChildren<BreadcrumbsItemProps>) => {\n const LinkComponent = useLinkComponent();\n\n return (\n <LinkComponent\n data-reki-component=\"Breadcrumbs\"\n data-reki-part=\"link\"\n to={href}\n className=\"flex min-w-0 max-w-full items-center gap-1 text-reki-subtle no-underline\"\n >\n {!!icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <span className=\"truncate\">{children}</span>\n </LinkComponent>\n );\n};\n\ninterface BreadcrumbsCurrentProps {\n loading?: boolean;\n icon?: React.ReactNode;\n}\n\nfunction Current({\n children,\n icon,\n loading,\n}: PropsWithChildren<BreadcrumbsCurrentProps>) {\n if (loading) {\n return (\n <div className=\"flex w-[125px] min-w-0 items-center gap-1\">\n {icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <SkeletonLine />\n </div>\n );\n }\n\n return (\n <div\n className=\"flex min-w-0 max-w-full items-center gap-1 font-medium\"\n aria-current=\"page\"\n >\n {icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <span className=\"truncate\">{children}</span>\n </div>\n );\n}\n\nfunction Separator() {\n return (\n <span\n className=\"flex shrink-0 items-center text-reki-inactive\"\n aria-hidden=\"true\"\n >\n <svg width=\"24\" height=\"24\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M10.75 8.75L14.25 12L10.75 15.25\"\n />\n </svg>\n </span>\n );\n}\n\nfunction MobileEllipsis() {\n return (\n <span className=\"flex shrink-0 items-center text-reki-subtle\" aria-hidden>\n ...\n </span>\n );\n}\n\nfunction Clipboard({ text }: { text: string }) {\n const [isCopied, setIsCopied] = useState(false);\n\n useEffect(() => {\n if (!isCopied) return;\n\n const timeoutId = setTimeout(() => setIsCopied(false), 2000);\n return () => clearTimeout(timeoutId);\n }, [isCopied]);\n\n const handleCopyDeeplink = async () => {\n if (!text) return;\n\n try {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n } catch (err) {\n console.error(\"Failed to copy deeplink:\", err);\n }\n };\n\n return (\n <Button\n variant=\"ghost\"\n shape=\"square\"\n size=\"sm\"\n className=\"opacity-0 transition-[opacity] group-hover:opacity-100\"\n onClick={handleCopyDeeplink}\n title=\"Click to copy\"\n aria-label=\"Copy\"\n >\n {isCopied ? (\n <CheckIcon weight=\"bold\" className=\"text-reki-success\" />\n ) : (\n <CopyIcon weight=\"regular\" />\n )}\n </Button>\n );\n}\n\n/**\n * Breadcrumbs component props.\n *\n * @example\n * ```tsx\n * <Breadcrumbs>\n * <Breadcrumbs.Link href=\"/\">Home</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Link href=\"/docs\">Docs</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Current>Current Page</Breadcrumbs.Current>\n * </Breadcrumbs>\n * ```\n */\nexport interface BreadcrumbsProps\n extends PropsWithChildren,\n RekiBreadcrumbsVariantsProps {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n}\n\n/**\n * Navigation breadcrumb trail showing the current page's location in a hierarchy.\n * Compound component with `Breadcrumbs.Link`, `Breadcrumbs.Current`, `Breadcrumbs.Separator`, and `Breadcrumbs.Clipboard`.\n *\n * @example\n * ```tsx\n * <Breadcrumbs>\n * <Breadcrumbs.Link href=\"/\">Home</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Current>Dashboard</Breadcrumbs.Current>\n * </Breadcrumbs>\n * ```\n */\nexport function Breadcrumb({\n children,\n size = \"base\",\n className,\n}: BreadcrumbsProps) {\n const childArray = Children.toArray(children);\n const mobileChildren = getMobileBreadcrumbChildren(childArray);\n\n return (\n <nav\n className={cn(breadcrumbsVariants({ size }), className)}\n aria-label=\"breadcrumb\"\n >\n <div className=\"contents sm:hidden\">{mobileChildren}</div>\n <div className=\"hidden sm:contents\">{childArray}</div>\n </nav>\n );\n}\n\nfunction isComponentElement(\n child: ReactNode,\n component: unknown,\n): child is ReactElement {\n return isValidElement(child) && child.type === component;\n}\n\nfunction getMobileBreadcrumbChildren(children: ReactNode[]): ReactNode[] {\n const breadcrumbItems = children.filter(\n (child) =>\n isComponentElement(child, Link) || isComponentElement(child, Current),\n ) as ReactElement[];\n\n if (breadcrumbItems.length <= 2) {\n return children;\n }\n\n const [parentItem, currentItem] = breadcrumbItems.slice(-2);\n const trailingItems: ReactNode[] = [\n <MobileEllipsis key=\"reki-breadcrumb-mobile-ellipsis\" />,\n <Separator key=\"reki-breadcrumb-mobile-separator-leading\" />,\n cloneElement(parentItem, { key: \"reki-breadcrumb-mobile-parent\" }),\n <Separator key=\"reki-breadcrumb-mobile-separator-trailing\" />,\n cloneElement(currentItem, { key: \"reki-breadcrumb-mobile-current\" }),\n ];\n\n const extras = children.filter(\n (child) =>\n !isComponentElement(child, Link) &&\n !isComponentElement(child, Current) &&\n !isComponentElement(child, Separator),\n );\n\n return [...trailingItems, ...extras];\n}\n\nBreadcrumb.Link = Link;\nBreadcrumb.Current = Current;\nBreadcrumb.Separator = Separator;\nBreadcrumb.Clipboard = Clipboard;\n"],"names":["REKI_BREADCRUMBS_VARIANTS","REKI_BREADCRUMBS_DEFAULT_VARIANTS","breadcrumbsVariants","size","cn","resolveVariant","Link","href","icon","children","LinkComponent","useLinkComponent","jsxs","jsx","Current","loading","SkeletonLine","Separator","MobileEllipsis","Clipboard","text","isCopied","setIsCopied","useState","useEffect","timeoutId","Button","err","CheckIcon","CopyIcon","Breadcrumb","className","childArray","Children","mobileChildren","getMobileBreadcrumbChildren","isComponentElement","child","component","isValidElement","breadcrumbItems","parentItem","currentItem","trailingItems","cloneElement","extras"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"breadcrumbs-mq1utzm0q4u2r5v5.js","sources":["../../src/components/breadcrumbs/breadcrumbs.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n useEffect,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { CheckIcon, CopyIcon } from \"@phosphor-icons/react\";\nimport { Button } from \"../../components/button\";\nimport { SkeletonLine } from \"../../components/loader/skeleton-line\";\nimport { useLinkComponent } from \"../../utils/link-provider\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\n\n/** Breadcrumbs size variant definitions. */\nexport const REKI_BREADCRUMBS_VARIANTS = {\n size: {\n sm: {\n classes: \"text-sm h-10 gap-0.5\",\n description: \"Compact breadcrumbs for dense UIs\",\n },\n base: {\n classes: \"text-base h-12 gap-1\",\n description: \"Default breadcrumbs size\",\n },\n },\n} as const;\n\nexport const REKI_BREADCRUMBS_DEFAULT_VARIANTS = {\n size: \"base\",\n} as const;\n\nexport type RekiBreadcrumbsSize = keyof typeof REKI_BREADCRUMBS_VARIANTS.size;\n\nexport interface RekiBreadcrumbsVariantsProps {\n /**\n * Size of the breadcrumbs.\n * - `\"sm\"` — Compact breadcrumbs for dense UIs\n * - `\"base\"` — Default breadcrumbs size\n * @default \"base\"\n */\n size?: RekiBreadcrumbsSize;\n}\n\nexport function breadcrumbsVariants({\n size = REKI_BREADCRUMBS_DEFAULT_VARIANTS.size,\n}: RekiBreadcrumbsVariantsProps = {}) {\n return cn(\n \"group mr-4 flex min-w-0 grow items-center overflow-hidden whitespace-nowrap\",\n resolveVariant(REKI_BREADCRUMBS_VARIANTS.size, size, REKI_BREADCRUMBS_DEFAULT_VARIANTS.size).classes,\n );\n}\n\nexport interface BreadcrumbsItemProps {\n href: string;\n icon?: React.ReactNode;\n}\n\nconst Link = ({\n href,\n icon,\n children,\n}: PropsWithChildren<BreadcrumbsItemProps>) => {\n const LinkComponent = useLinkComponent();\n\n return (\n <LinkComponent\n data-reki-component=\"Breadcrumbs\"\n data-reki-part=\"link\"\n to={href}\n className=\"flex min-w-0 max-w-full items-center gap-1 text-reki-subtle no-underline\"\n >\n {!!icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <span className=\"truncate\">{children}</span>\n </LinkComponent>\n );\n};\n\ninterface BreadcrumbsCurrentProps {\n loading?: boolean;\n icon?: React.ReactNode;\n}\n\nfunction Current({\n children,\n icon,\n loading,\n}: PropsWithChildren<BreadcrumbsCurrentProps>) {\n if (loading) {\n return (\n <div className=\"flex w-[125px] min-w-0 items-center gap-1\">\n {icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <SkeletonLine />\n </div>\n );\n }\n\n return (\n <div\n className=\"flex min-w-0 max-w-full items-center gap-1 font-medium\"\n aria-current=\"page\"\n >\n {icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n <span className=\"truncate\">{children}</span>\n </div>\n );\n}\n\nfunction Separator() {\n return (\n <span\n className=\"flex shrink-0 items-center text-reki-inactive\"\n aria-hidden=\"true\"\n >\n <svg width=\"24\" height=\"24\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M10.75 8.75L14.25 12L10.75 15.25\"\n />\n </svg>\n </span>\n );\n}\n\nfunction MobileEllipsis() {\n return (\n <span className=\"flex shrink-0 items-center text-reki-subtle\" aria-hidden>\n ...\n </span>\n );\n}\n\nfunction Clipboard({ text }: { text: string }) {\n const [isCopied, setIsCopied] = useState(false);\n\n useEffect(() => {\n if (!isCopied) return;\n\n const timeoutId = setTimeout(() => setIsCopied(false), 2000);\n return () => clearTimeout(timeoutId);\n }, [isCopied]);\n\n const handleCopyDeeplink = async () => {\n if (!text) return;\n\n try {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n } catch (err) {\n console.error(\"Failed to copy deeplink:\", err);\n }\n };\n\n return (\n <Button\n variant=\"ghost\"\n shape=\"square\"\n size=\"sm\"\n className=\"opacity-0 transition-[opacity] group-hover:opacity-100\"\n onClick={handleCopyDeeplink}\n title=\"Click to copy\"\n aria-label=\"Copy\"\n >\n {isCopied ? (\n <CheckIcon weight=\"bold\" className=\"text-reki-success\" />\n ) : (\n <CopyIcon weight=\"regular\" />\n )}\n </Button>\n );\n}\n\n/**\n * Breadcrumbs component props.\n *\n * @example\n * ```tsx\n * <Breadcrumbs>\n * <Breadcrumbs.Link href=\"/\">Home</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Link href=\"/docs\">Docs</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Current>Current Page</Breadcrumbs.Current>\n * </Breadcrumbs>\n * ```\n */\nexport interface BreadcrumbsProps\n extends PropsWithChildren,\n RekiBreadcrumbsVariantsProps {\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n}\n\n/**\n * Navigation breadcrumb trail showing the current page's location in a hierarchy.\n * Compound component with `Breadcrumbs.Link`, `Breadcrumbs.Current`, `Breadcrumbs.Separator`, and `Breadcrumbs.Clipboard`.\n *\n * @example\n * ```tsx\n * <Breadcrumbs>\n * <Breadcrumbs.Link href=\"/\">Home</Breadcrumbs.Link>\n * <Breadcrumbs.Separator />\n * <Breadcrumbs.Current>Dashboard</Breadcrumbs.Current>\n * </Breadcrumbs>\n * ```\n */\nexport function Breadcrumb({\n children,\n size = \"base\",\n className,\n}: BreadcrumbsProps) {\n const childArray = Children.toArray(children);\n const mobileChildren = getMobileBreadcrumbChildren(childArray);\n\n return (\n <nav\n className={cn(breadcrumbsVariants({ size }), className)}\n aria-label=\"breadcrumb\"\n >\n <div className=\"contents sm:hidden\">{mobileChildren}</div>\n <div className=\"hidden sm:contents\">{childArray}</div>\n </nav>\n );\n}\n\nfunction isComponentElement(\n child: ReactNode,\n component: unknown,\n): child is ReactElement {\n return isValidElement(child) && child.type === component;\n}\n\nfunction getMobileBreadcrumbChildren(children: ReactNode[]): ReactNode[] {\n const breadcrumbItems = children.filter(\n (child) =>\n isComponentElement(child, Link) || isComponentElement(child, Current),\n ) as ReactElement[];\n\n if (breadcrumbItems.length <= 2) {\n return children;\n }\n\n const [parentItem, currentItem] = breadcrumbItems.slice(-2);\n const trailingItems: ReactNode[] = [\n <MobileEllipsis key=\"reki-breadcrumb-mobile-ellipsis\" />,\n <Separator key=\"reki-breadcrumb-mobile-separator-leading\" />,\n cloneElement(parentItem, { key: \"reki-breadcrumb-mobile-parent\" }),\n <Separator key=\"reki-breadcrumb-mobile-separator-trailing\" />,\n cloneElement(currentItem, { key: \"reki-breadcrumb-mobile-current\" }),\n ];\n\n const extras = children.filter(\n (child) =>\n !isComponentElement(child, Link) &&\n !isComponentElement(child, Current) &&\n !isComponentElement(child, Separator),\n );\n\n return [...trailingItems, ...extras];\n}\n\nBreadcrumb.Link = Link;\nBreadcrumb.Current = Current;\nBreadcrumb.Separator = Separator;\nBreadcrumb.Clipboard = Clipboard;\n"],"names":["REKI_BREADCRUMBS_VARIANTS","REKI_BREADCRUMBS_DEFAULT_VARIANTS","breadcrumbsVariants","size","cn","resolveVariant","Link","href","icon","children","LinkComponent","useLinkComponent","jsxs","jsx","Current","loading","SkeletonLine","Separator","MobileEllipsis","Clipboard","text","isCopied","setIsCopied","useState","useEffect","timeoutId","Button","err","CheckIcon","CopyIcon","Breadcrumb","className","childArray","Children","mobileChildren","getMobileBreadcrumbChildren","isComponentElement","child","component","isValidElement","breadcrumbItems","parentItem","currentItem","trailingItems","cloneElement","extras"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { jsx as i, jsxs as x, Fragment as w } from "react/jsx-runtime";
|
|
|
3
3
|
import y from "react";
|
|
4
4
|
import { ArrowsClockwise as A } from "@phosphor-icons/react";
|
|
5
5
|
import { L as E } from "./loader-cxzp72mn53lzbv9c.js";
|
|
6
|
-
import { T as C } from "./tooltip-
|
|
6
|
+
import { T as C } from "./tooltip-bkgxuz77xzg5fooc.js";
|
|
7
7
|
import { c as p } from "./cn-ct4n7r74mh8y0f48.js";
|
|
8
8
|
import { r as u } from "./resolve-variant-t8jcltsizeg29ege.js";
|
|
9
9
|
import { u as D } from "./link-provider-bgljdgs4hs438h0u.js";
|
|
@@ -24,19 +24,19 @@ const b = {
|
|
|
24
24
|
},
|
|
25
25
|
size: {
|
|
26
26
|
xs: {
|
|
27
|
-
classes: "h-5 gap-1 rounded-
|
|
27
|
+
classes: "h-5 gap-1 rounded-full px-1.5 text-xs",
|
|
28
28
|
description: "Extra small button for compact UIs"
|
|
29
29
|
},
|
|
30
30
|
sm: {
|
|
31
|
-
classes: "h-6.5 gap-1 rounded-
|
|
31
|
+
classes: "h-6.5 gap-1 rounded-full px-2 text-xs",
|
|
32
32
|
description: "Small button for secondary actions"
|
|
33
33
|
},
|
|
34
34
|
base: {
|
|
35
|
-
classes: "h-9 gap-1.5 rounded-
|
|
35
|
+
classes: "h-9 gap-1.5 rounded-full px-3 text-base",
|
|
36
36
|
description: "Default button size"
|
|
37
37
|
},
|
|
38
38
|
lg: {
|
|
39
|
-
classes: "h-10 gap-2 rounded-
|
|
39
|
+
classes: "h-10 gap-2 rounded-full px-4 text-base",
|
|
40
40
|
description: "Large button for primary CTAs"
|
|
41
41
|
}
|
|
42
42
|
},
|
|
@@ -155,12 +155,12 @@ const B = (e) => e ? y.isValidElement(e) ? e : /* @__PURE__ */ i(e, {}) : null,
|
|
|
155
155
|
icon: g,
|
|
156
156
|
style: a,
|
|
157
157
|
title: l,
|
|
158
|
-
...
|
|
159
|
-
},
|
|
160
|
-
const { type: d, ...k } =
|
|
158
|
+
...f
|
|
159
|
+
}, h) => {
|
|
160
|
+
const { type: d, ...k } = f, v = T(n), _ = r ? /* @__PURE__ */ i(E, { size: c === "lg" ? 16 : 14 }) : B(g), z = /* @__PURE__ */ i(
|
|
161
161
|
"button",
|
|
162
162
|
{
|
|
163
|
-
ref:
|
|
163
|
+
ref: h,
|
|
164
164
|
"data-reki-component": "Button",
|
|
165
165
|
className: p(
|
|
166
166
|
N({ variant: n, size: c, shape: m }),
|
|
@@ -205,12 +205,12 @@ const P = ({
|
|
|
205
205
|
style: a,
|
|
206
206
|
// linksExternal = false,
|
|
207
207
|
...l
|
|
208
|
-
},
|
|
209
|
-
const
|
|
208
|
+
}, f) => {
|
|
209
|
+
const h = D(), d = T(n), k = s ? { target: "_blank", rel: "noopener noreferrer" } : {};
|
|
210
210
|
return /* @__PURE__ */ i(
|
|
211
|
-
|
|
211
|
+
h,
|
|
212
212
|
{
|
|
213
|
-
ref:
|
|
213
|
+
ref: f,
|
|
214
214
|
"data-reki-component": "LinkButton",
|
|
215
215
|
className: p(
|
|
216
216
|
N({ variant: n, size: c, shape: m }),
|
|
@@ -234,4 +234,4 @@ export {
|
|
|
234
234
|
P as R,
|
|
235
235
|
N as b
|
|
236
236
|
};
|
|
237
|
-
//# sourceMappingURL=button-
|
|
237
|
+
//# sourceMappingURL=button-fvlz1rzc3s1hpyxs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-fvlz1rzc3s1hpyxs.js","sources":["../../src/components/button/button.tsx"],"sourcesContent":["import React from \"react\";\nimport { ArrowsClockwise, type Icon } from \"@phosphor-icons/react\";\nimport { Loader } from \"../loader/loader\";\nimport { Tooltip } from \"../tooltip/tooltip\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { useLinkComponent } from \"../../utils/link-provider\";\n\n/** Button variant definitions mapping shape, size, and variant names to their Tailwind classes. */\nexport const REKI_BUTTON_VARIANTS = {\n shape: {\n base: {\n classes: \"\",\n description: \"Default rectangular button shape\",\n },\n square: {\n classes: \"items-center justify-center p-0\",\n description: \"Square button for icon-only actions\",\n },\n circle: {\n classes: \"items-center justify-center p-0 rounded-full\",\n description: \"Circular button for icon-only actions\",\n },\n },\n size: {\n xs: {\n classes: \"h-5 gap-1 rounded-full px-1.5 text-xs\",\n description: \"Extra small button for compact UIs\",\n },\n sm: {\n classes: \"h-6.5 gap-1 rounded-full px-2 text-xs\",\n description: \"Small button for secondary actions\",\n },\n base: {\n classes: \"h-9 gap-1.5 rounded-full px-3 text-base\",\n description: \"Default button size\",\n },\n lg: {\n classes: \"h-10 gap-2 rounded-full px-4 text-base\",\n description: \"Large button for primary CTAs\",\n },\n },\n compactSize: {\n xs: { classes: \"size-3.5\" },\n sm: { classes: \"size-6.5\" },\n base: { classes: \"size-9\" },\n lg: { classes: \"size-10\" },\n },\n variant: {\n primary: {\n classes:\n \"relative overflow-hidden bg-(--reki-button-emphasis-bg) !text-white ring ring-(--reki-button-emphasis-ring) disabled:opacity-50\",\n description: \"High-emphasis button for primary actions\",\n },\n secondary: {\n classes:\n \"bg-reki-base !text-reki-default ring not-disabled:hover:bg-reki-tint disabled:bg-reki-base/50 disabled:!text-reki-default/70 ring-reki-line data-[state=open]:bg-reki-base\",\n description: \"Default button style for most actions\",\n },\n ghost: {\n classes: \"text-reki-default hover:bg-reki-tint shadow-none bg-inherit\",\n description: \"Minimal button with no background\",\n },\n destructive: {\n classes:\n \"relative overflow-hidden bg-(--reki-button-emphasis-bg) !text-white ring ring-(--reki-button-emphasis-ring) disabled:opacity-50\",\n description: \"Danger button for destructive actions like delete\",\n },\n \"secondary-destructive\": {\n classes:\n \"bg-reki-base !text-reki-danger ring not-disabled:hover:!text-reki-danger not-disabled:hover:ring-reki-danger/30 disabled:bg-reki-base/50 disabled:!text-reki-danger/70 ring-reki-line data-[state=open]:bg-reki-base\",\n description:\n \"Secondary button with destructive text for less prominent dangerous actions\",\n },\n outline: {\n classes:\n \"bg-transparent text-reki-default ring ring-reki-line transition-colors not-disabled:hover:text-reki-strong not-disabled:hover:ring-reki-focus/25\",\n description: \"Bordered button with transparent background\",\n },\n },\n} as const;\n\nexport const REKI_BUTTON_DEFAULT_VARIANTS = {\n shape: \"base\",\n size: \"base\",\n variant: \"secondary\",\n} as const;\n\n// Derived types from REKI_BUTTON_VARIANTS\nexport type RekiButtonShape = keyof typeof REKI_BUTTON_VARIANTS.shape;\nexport type RekiButtonSize = keyof typeof REKI_BUTTON_VARIANTS.size;\nexport type RekiButtonVariant = keyof typeof REKI_BUTTON_VARIANTS.variant;\n\nexport interface RekiButtonVariantsProps {\n /**\n * Button shape.\n * - `\"base\"` — Default rectangular button\n * - `\"square\"` — Square button for icon-only actions\n * - `\"circle\"` — Circular button for icon-only actions\n * @default \"base\"\n */\n shape?: RekiButtonShape;\n /**\n * Button size.\n * - `\"xs\"` — Extra small for compact UIs\n * - `\"sm\"` — Small for secondary actions\n * - `\"base\"` — Default size\n * - `\"lg\"` — Large for primary CTAs\n * @default \"base\"\n */\n size?: RekiButtonSize;\n /**\n * Visual style of the button.\n * - `\"primary\"` — High-emphasis, brand-colored for primary actions\n * - `\"secondary\"` — Default style with border for most actions\n * - `\"ghost\"` — Minimal, no background for tertiary actions\n * - `\"destructive\"` — Danger button for destructive actions\n * - `\"secondary-destructive\"` — Secondary style with destructive text\n * - `\"outline\"` — Bordered with transparent background\n * @default \"secondary\"\n */\n variant?: RekiButtonVariant;\n}\n\nexport function buttonVariants({\n variant = REKI_BUTTON_DEFAULT_VARIANTS.variant,\n size = REKI_BUTTON_DEFAULT_VARIANTS.size,\n shape = REKI_BUTTON_DEFAULT_VARIANTS.shape,\n}: RekiButtonVariantsProps = {}) {\n const isCompactShape = shape === \"square\" || shape === \"circle\";\n\n return cn(\n // Base styles\n \"group flex w-max shrink-0 items-center font-medium select-none\",\n \"border-0 shadow-xs\",\n \"focus:outline-none focus:ring-reki-focus/50 focus-visible:ring-2 focus-visible:ring-reki-brand\",\n \"cursor-pointer\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:text-reki-subtle\",\n resolveVariant(\n REKI_BUTTON_VARIANTS.size,\n size,\n REKI_BUTTON_DEFAULT_VARIANTS.size,\n ).classes,\n resolveVariant(\n REKI_BUTTON_VARIANTS.shape,\n shape,\n REKI_BUTTON_DEFAULT_VARIANTS.shape,\n ).classes,\n isCompactShape &&\n resolveVariant(\n REKI_BUTTON_VARIANTS.compactSize,\n size,\n REKI_BUTTON_DEFAULT_VARIANTS.size,\n ).classes,\n resolveVariant(\n REKI_BUTTON_VARIANTS.variant,\n variant,\n REKI_BUTTON_DEFAULT_VARIANTS.variant,\n ).classes,\n );\n}\n\n// Normalize icon prop to support both React elements and component types\nconst renderIconNode = (IconComponent?: Icon | React.ReactNode) => {\n if (!IconComponent) return null;\n if (React.isValidElement(IconComponent)) return IconComponent;\n const Comp = IconComponent as React.ComponentType<Record<string, unknown>>;\n return <Comp />;\n};\n\nconst getEmphasisToken = (variant: RekiButtonVariant) => {\n if (variant === \"primary\") return \"var(--color-reki-brand)\";\n if (variant === \"destructive\") return \"var(--color-reki-danger)\";\n return undefined;\n};\n\nconst getEmphasisStyle = (variant: RekiButtonVariant) => {\n const token = getEmphasisToken(variant);\n if (!token) return undefined;\n\n return {\n \"--reki-button-emphasis-ring\": `color-mix(in oklch, ${token}, black 10%)`,\n \"--reki-button-emphasis-bg\": `color-mix(in oklch, ${token}, white 30%)`,\n \"--reki-button-emphasis-gradient-start\": `color-mix(in oklch, ${token}, white 15%)`,\n \"--reki-button-emphasis-gradient-end\": token,\n } satisfies React.CSSProperties & Record<`--${string}`, string>;\n};\n\nconst renderButtonContent = (\n variant: RekiButtonVariant,\n iconNode: React.ReactNode,\n children: React.ReactNode,\n) => {\n const childNode =\n children != null ? <span className=\"contents\">{children}</span> : null;\n\n if (!getEmphasisToken(variant)) {\n return (\n <>\n {iconNode}\n {childNode}\n </>\n );\n }\n\n return (\n <>\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-0 rounded-[inherit] bg-linear-to-b from-(--reki-button-emphasis-gradient-start) to-(--reki-button-emphasis-gradient-end) translate-y-px group-hover:from-(--reki-button-emphasis-bg)\"\n />\n <span className=\"relative flex items-center gap-1.5\">\n {iconNode}\n {childNode}\n </span>\n </>\n );\n};\n\n/**\n * Button component props.\n *\n * Uses a discriminated union on `shape` so that icon-only buttons\n * (`shape=\"square\"` or `shape=\"circle\"`) require an `aria-label`.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\">Save</Button>\n * <Button variant=\"secondary\" shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n * <Button variant=\"destructive\" loading>Deleting...</Button>\n * ```\n */\ntype ButtonBaseProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Content rendered inside the button. */\n children?: React.ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Icon from `@phosphor-icons/react` or a React element. Rendered before children. */\n icon?: Icon | React.ReactNode;\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean;\n /** When set, wraps the button in a Tooltip with this content. */\n title?: React.ReactNode;\n};\n\ntype ButtonWithTextProps = ButtonBaseProps & {\n shape?: \"base\";\n size?: RekiButtonSize;\n variant?: RekiButtonVariant;\n};\n\ntype IconOnlyButtonProps = ButtonBaseProps & {\n shape: \"square\" | \"circle\";\n size?: RekiButtonSize;\n variant?: RekiButtonVariant;\n /** Required for icon-only buttons to provide accessible label for screen readers */\n \"aria-label\": string;\n};\n\nexport type ButtonProps = ButtonWithTextProps | IconOnlyButtonProps;\n\n/**\n * LinkButton component props — renders an anchor styled as a button.\n *\n * @example\n * ```tsx\n * <LinkButton href=\"/docs\" variant=\"ghost\" icon={BookIcon}>Docs</LinkButton>\n * <LinkButton href=\"https://example.com\" external>Visit Site</LinkButton>\n * ```\n */\nexport type LinkButtonProps = React.AnchorHTMLAttributes<HTMLAnchorElement> &\n RekiButtonVariantsProps & {\n /** Content rendered inside the link button. */\n children?: React.ReactNode;\n /** Additional CSS classes merged via `cn()`. */\n className?: string;\n /** Icon from `@phosphor-icons/react` or a React element. Rendered before children. */\n icon?: Icon | React.ReactNode;\n /** When `true`, opens in a new tab with `rel=\"noopener noreferrer\"`. */\n external?: boolean;\n linksExternal?: boolean;\n };\n\n/**\n * Primary action trigger. Supports multiple variants, sizes, shapes, icons, and loading state.\n *\n * @example\n * ```tsx\n * <Button variant=\"primary\">Save</Button>\n * <Button variant=\"secondary\" icon={PlusIcon}>Create Worker</Button>\n * ```\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n disabled,\n loading,\n shape = \"base\",\n size = \"base\",\n variant = \"secondary\",\n icon: IconComponent,\n style,\n title,\n ...props\n },\n ref,\n ) => {\n const { type, ...restProps } = props;\n const emphasisStyle = getEmphasisStyle(variant);\n const iconNode = loading ? (\n <Loader size={size === \"lg\" ? 16 : 14} />\n ) : (\n renderIconNode(IconComponent)\n );\n\n const button = (\n <button\n ref={ref}\n data-reki-component=\"Button\"\n className={cn(\n buttonVariants({ variant, size, shape }),\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n disabled={loading || disabled}\n style={emphasisStyle ? { ...emphasisStyle, ...style } : style}\n type={type ?? \"button\"}\n {...restProps}\n >\n {renderButtonContent(variant, iconNode, children)}\n </button>\n );\n\n if (title) {\n return <Tooltip content={title} render={button} />;\n }\n\n return button;\n },\n);\n\nButton.displayName = \"Button\";\n\n/**\n * Square button with a rotating arrows icon, used to trigger data refresh actions.\n *\n * @example\n * ```tsx\n * <RefreshButton loading={isRefreshing} onClick={refresh} />\n * ```\n */\nexport const RefreshButton = ({\n \"aria-label\": ariaLabel = \"Refresh\",\n loading,\n ...props\n}: ButtonProps) => (\n <Button shape=\"square\" aria-label={ariaLabel} {...props}>\n <ArrowsClockwise\n className={cn({\n \"animate-refresh\": loading,\n \"size-4.5\": props.size === \"base\" || !props.size,\n \"size-4\": props.size === \"sm\",\n \"size-5\": props.size === \"lg\",\n })}\n />\n </Button>\n);\n\n/**\n * Anchor element styled as a button. Integrates with `LinkProvider` for framework routing.\n *\n * @example\n * ```tsx\n * <LinkButton href=\"/settings\" variant=\"ghost\">Settings</LinkButton>\n * ```\n */\nexport const LinkButton = React.forwardRef<HTMLAnchorElement, LinkButtonProps>(\n (\n {\n children,\n className,\n external,\n href,\n shape = \"base\",\n size = \"base\",\n variant = \"ghost\",\n icon: IconComponent,\n style,\n // linksExternal = false,\n ...props\n },\n ref,\n ) => {\n const LinkComponent = useLinkComponent();\n const emphasisStyle = getEmphasisStyle(variant);\n const externalProps = external\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : {};\n\n return (\n <LinkComponent\n ref={ref}\n data-reki-component=\"LinkButton\"\n className={cn(\n buttonVariants({ variant, size, shape }),\n \"flex items-center no-underline!\",\n className,\n )}\n href={href}\n style={emphasisStyle ? { ...emphasisStyle, ...style } : style}\n to={typeof href === \"string\" ? href : undefined}\n {...externalProps}\n {...props}\n >\n {renderButtonContent(variant, renderIconNode(IconComponent), children)}\n </LinkComponent>\n );\n },\n);\n\nLinkButton.displayName = \"LinkButton\";\n"],"names":["REKI_BUTTON_VARIANTS","REKI_BUTTON_DEFAULT_VARIANTS","buttonVariants","variant","size","shape","isCompactShape","cn","resolveVariant","renderIconNode","IconComponent","React","getEmphasisToken","getEmphasisStyle","token","renderButtonContent","iconNode","children","childNode","jsx","jsxs","Fragment","Button","className","disabled","loading","style","title","props","ref","type","restProps","emphasisStyle","Loader","button","Tooltip","RefreshButton","ariaLabel","ArrowsClockwise","LinkButton","external","href","LinkComponent","useLinkComponent","externalProps"],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { jsx as e, jsxs as x } from "react/jsx-runtime";
|
|
|
3
3
|
import { forwardRef as g, useContext as E, createContext as B } from "react";
|
|
4
4
|
import { MinusIcon as C, CheckIcon as v } from "@phosphor-icons/react";
|
|
5
5
|
import { c as o } from "./cn-ct4n7r74mh8y0f48.js";
|
|
6
|
-
import { L as F } from "./label-
|
|
7
|
-
import { L as N, N as y, O, P as _, Q as w, C as G, U as z } from "./vendor-base-ui-
|
|
6
|
+
import { L as F } from "./label-ld57mr4ocdxsf06p.js";
|
|
7
|
+
import { L as N, N as y, O, P as _, Q as w, C as G, U as z } from "./vendor-base-ui-djdjrfuoxlb1lubi.js";
|
|
8
8
|
const U = {
|
|
9
9
|
variant: {
|
|
10
10
|
default: {
|
|
@@ -213,4 +213,4 @@ export {
|
|
|
213
213
|
X as R,
|
|
214
214
|
U as a
|
|
215
215
|
};
|
|
216
|
-
//# sourceMappingURL=checkbox-
|
|
216
|
+
//# sourceMappingURL=checkbox-h3kfhlron3b6sfhv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox-g2661n3eodgoispq.js","sources":["../../src/components/checkbox/checkbox.tsx"],"sourcesContent":["import { forwardRef, createContext, useContext, type ReactNode } from \"react\";\nimport { CheckIcon, MinusIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { Label } from \"../label\";\nimport { Fieldset } from \"@base-ui/react/fieldset\";\nimport { Field as FieldBase } from \"@base-ui/react/field\";\nimport { CheckboxGroup as BaseCheckboxGroup } from \"@base-ui/react/checkbox-group\";\nimport { Checkbox as BaseCheckbox } from \"@base-ui/react/checkbox\";\n\n/** Event details passed to onCheckedChange callback. Re-exported from Base UI. */\nexport type CheckboxChangeEventDetails = Parameters<\n NonNullable<BaseCheckbox.Root.Props[\"onCheckedChange\"]>\n>[1];\n\n/** Checkbox variant definitions mapping variant names to their Tailwind classes. */\nexport const REKI_CHECKBOX_VARIANTS = {\n variant: {\n default: {\n classes:\n \"[&:focus-within>span]:ring-reki-focus [&:hover>span]:ring-reki-hairline\",\n description: \"Default checkbox appearance\",\n },\n error: {\n classes: \"[&>span]:ring-reki-danger\",\n description: \"Error state for validation failures\",\n },\n },\n} as const;\n\nexport const REKI_CHECKBOX_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n// Derived types from REKI_CHECKBOX_VARIANTS\nexport type RekiCheckboxVariant = keyof typeof REKI_CHECKBOX_VARIANTS.variant;\n\nexport interface RekiCheckboxVariantsProps {\n /**\n * Visual variant.\n * - `\"default\"` — Standard checkbox appearance\n * - `\"error\"` — Error state for validation failures\n * @default \"default\"\n */\n variant?: RekiCheckboxVariant;\n}\n\nexport function checkboxVariants({\n variant = REKI_CHECKBOX_DEFAULT_VARIANTS.variant,\n}: RekiCheckboxVariantsProps = {}) {\n return cn(resolveVariant(REKI_CHECKBOX_VARIANTS.variant, variant, REKI_CHECKBOX_DEFAULT_VARIANTS.variant).classes);\n}\n\n// Legacy type alias for backwards compatibility\nexport type CheckboxVariant = RekiCheckboxVariant;\n\n// Context for passing controlFirst from Group to Items\nconst CheckboxGroupContext = createContext<{ controlFirst: boolean }>({\n controlFirst: true,\n});\n\n/**\n * Single checkbox component props with accessibility guidance.\n *\n * **Accessible Name Required:** Checkbox should have one of:\n * 1. `label` prop (recommended) - built-in Field wrapper with horizontal layout\n * 2. `aria-label` - for checkboxes without visible label\n * 3. `aria-labelledby` - for custom label association\n *\n * **Note:** When used inside Checkbox.Group or Dropdown, label is optional (parent provides context).\n *\n * Missing accessible names will trigger console warnings in development (unless inside a group).\n *\n * @example\n * // Recommended: Built-in Field wrapper with label\n * <Checkbox label=\"Accept terms and conditions\" />\n *\n * @example\n * // Control-first layout (checkbox before label)\n * <Checkbox label=\"Remember me\" controlFirst={true} />\n *\n * @example\n * // Label-first layout (label before checkbox)\n * <Checkbox label=\"Enable notifications\" controlFirst={false} />\n *\n * @example\n * // Error variant (visual only, no error text for single checkboxes)\n * <Checkbox label=\"Required field\" variant=\"error\" />\n *\n * @example\n * // Without visible label (aria-label required)\n * <Checkbox aria-label=\"Select all items\" />\n *\n * @example\n * // Custom label association\n * <label id=\"terms-label\">I accept the terms</label>\n * <Checkbox aria-labelledby=\"terms-label\" />\n *\n * @example\n * // Inside Checkbox.Group (label optional)\n * <Checkbox.Group legend=\"Preferences\">\n * <Checkbox.Item value=\"email\" label=\"Email notifications\" />\n * <Checkbox.Item value=\"sms\" label=\"SMS notifications\" />\n * </Checkbox.Group>\n */\nexport type CheckboxProps = {\n /** Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text) */\n variant?: CheckboxVariant;\n /** Label content for the checkbox (enables built-in Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** When true (default), checkbox appears before label. When false, label appears before checkbox. */\n controlFirst?: boolean;\n /** Whether the checkbox is checked (controlled) */\n checked?: boolean;\n /** Whether the checkbox is in indeterminate state */\n indeterminate?: boolean;\n /** Whether the checkbox is disabled */\n disabled?: boolean;\n /** Callback when the checked state changes */\n onCheckedChange?: BaseCheckbox.Root.Props[\"onCheckedChange\"];\n /** Name for form submission */\n name?: string;\n /** Whether the field is required */\n required?: boolean;\n /** Additional class name */\n className?: string;\n /** Accessible label when no visible label is provided */\n \"aria-label\"?: string;\n /** ID of element that labels this checkbox */\n \"aria-labelledby\"?: string;\n};\n\n/**\n * Checkbox group component props (with built-in Fieldset and CheckboxGroup)\n *\n * Usage:\n * ```tsx\n * <Checkbox.Group\n * legend=\"Choose preferences\"\n * defaultValue={['email']}\n * error=\"You must select at least one option\"\n * >\n * <Checkbox.Item label=\"Email notifications\" value=\"email\" />\n * <Checkbox.Item label=\"SMS notifications\" value=\"sms\" />\n * </Checkbox.Group>\n * ```\n */\n/**\n * Props for Checkbox.Legend — a composable sub-component for labeling a Checkbox.Group.\n *\n * Place as a direct child of `<Checkbox.Group>` to provide a styled, accessible legend.\n * Accepts `className` for full styling control (e.g. `className=\"sr-only\"` to visually hide).\n *\n * @example\n * ```tsx\n * <Checkbox.Group>\n * <Checkbox.Legend className=\"sr-only\">Preferences</Checkbox.Legend>\n * <Checkbox.Item label=\"Email\" value=\"email\" />\n * </Checkbox.Group>\n * ```\n */\nexport interface CheckboxLegendProps {\n /** Legend content */\n children: ReactNode;\n /** Additional CSS classes (e.g. \"sr-only\" to visually hide the legend) */\n className?: string;\n}\n\nexport interface CheckboxGroupProps {\n /**\n * Legend text for the group.\n * For more control over legend styling, omit this prop and use `<Checkbox.Legend>` as a child instead.\n */\n legend?: string;\n /** Child Checkbox.Item components (and optionally a Checkbox.Legend) */\n children: ReactNode;\n /** Error message for the group (only appears in groups, not single checkboxes) */\n error?: string;\n /** Helper text for the group */\n description?: ReactNode;\n /** Values of checkboxes that should be initially checked (uncontrolled) */\n defaultValue?: string[];\n /** Values of checkboxes that should be checked (controlled) */\n value?: string[];\n /** Event handler called when checkbox values change */\n onValueChange?: (value: string[]) => void;\n /** All possible checkbox values (required for parent checkbox pattern) */\n allValues?: string[];\n /** Whether all checkboxes in the group are disabled */\n disabled?: boolean;\n /** When true (default), checkbox appears before label. When false, label appears before checkbox. */\n controlFirst?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Individual checkbox item within a group\n */\nexport type CheckboxItemProps = {\n /** Visual variant: \"default\" or \"error\" for validation failures */\n variant?: CheckboxVariant;\n /** Label text displayed next to checkbox */\n label: string;\n /** Value of the checkbox (required when used in Checkbox.Group) */\n value?: string;\n /** Additional CSS classes for the label wrapper */\n className?: string;\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n /** Callback when the checked state changes */\n onCheckedChange?: BaseCheckbox.Root.Props[\"onCheckedChange\"];\n name?: string;\n};\n\n// Single checkbox with built-in Field\nconst CheckboxBase = forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n className,\n checked,\n indeterminate,\n disabled,\n variant = \"default\",\n label,\n labelTooltip,\n controlFirst = true,\n onCheckedChange,\n required,\n name,\n ...props\n },\n ref,\n ) => {\n // A11y enforcement: warn in dev if no accessible name provided\n if (process.env.NODE_ENV !== \"production\") {\n const hasLabel = Boolean(label);\n const hasAriaLabel = Boolean(props[\"aria-label\"]);\n const hasAriaLabelledBy = Boolean(props[\"aria-labelledby\"]);\n\n if (!hasLabel && !hasAriaLabel && !hasAriaLabelledBy) {\n console.warn(\n \"[Reki Checkbox]: Checkbox must have an accessible name. Provide either:\\n\" +\n \" - label prop: <Checkbox label='Accept terms' />\\n\" +\n \" - aria-label: <Checkbox aria-label='Select item' />\\n\" +\n \" - aria-labelledby for custom label association\\n\" +\n \" Note: When used inside Checkbox.Group, label is optional\",\n );\n }\n }\n\n const checkboxControl = (\n <BaseCheckbox.Root\n ref={ref}\n data-reki-component=\"Checkbox\"\n name={name}\n checked={checked}\n indeterminate={indeterminate}\n disabled={disabled}\n onCheckedChange={onCheckedChange}\n className={cn(\n \"relative flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-0 bg-reki-base ring focus:outline-none after:absolute after:-inset-x-3 after:-inset-y-2\",\n label && \"mt-0.5\",\n variant === \"error\" ? \"ring-reki-danger\" : \"ring-reki-hairline\",\n !disabled &&\n \"hover:ring-reki-hairline focus:ring-reki-focus focus:ring-2 focus-visible:ring-2 focus-visible:ring-reki-brand\",\n \"data-[checked]:bg-reki-contrast data-[checked]:ring-reki-contrast data-[indeterminate]:bg-reki-contrast data-[indeterminate]:ring-reki-contrast\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n {...props}\n >\n <BaseCheckbox.Indicator\n keepMounted\n className=\"flex items-center justify-center text-reki-inverse data-[unchecked]:invisible\"\n render={(renderProps, state) => (\n <span {...renderProps}>\n {state.indeterminate ? (\n <MinusIcon weight=\"bold\" size={12} />\n ) : (\n <CheckIcon weight=\"bold\" size={12} />\n )}\n </span>\n )}\n />\n </BaseCheckbox.Root>\n );\n\n // If no label provided, return bare checkbox (for use in other components like Dropdown)\n if (!label) {\n return checkboxControl;\n }\n\n // Use Field.Root + Field.Label enclosing pattern for proper a11y association\n // See: https://base-ui.com/react/components/field\n return (\n <FieldBase.Root className=\"inline-flex\">\n <FieldBase.Label\n className={cn(\n \"!m-0 !min-h-0 !text-base inline-flex items-start gap-2\",\n controlFirst ? \"flex-row\" : \"flex-row-reverse justify-end\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n {checkboxControl}\n <Label\n showOptional={required === false}\n tooltip={labelTooltip}\n asContent\n >\n {label}\n </Label>\n </FieldBase.Label>\n </FieldBase.Root>\n );\n },\n);\n\nCheckboxBase.displayName = \"Checkbox\";\n\n// Checkbox.Item for use within Checkbox.Group\nconst CheckboxItem = forwardRef<HTMLButtonElement, CheckboxItemProps>(\n (\n {\n className,\n checked,\n indeterminate,\n disabled,\n variant = \"default\",\n label,\n value,\n onCheckedChange,\n name,\n },\n ref,\n ) => {\n const { controlFirst } = useContext(CheckboxGroupContext);\n\n return (\n <label\n data-reki-component=\"Checkbox\"\n data-reki-part=\"item-label\"\n className={cn(\n \"m-0 relative inline-flex items-start gap-2\",\n // Control first (default): checkbox before label\n // Label first: label before checkbox using flex-row-reverse\n !controlFirst && \"flex-row-reverse justify-end\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n className,\n )}\n >\n <BaseCheckbox.Root\n ref={ref}\n data-reki-component=\"Checkbox\"\n data-reki-part=\"item\"\n value={value}\n name={name}\n checked={checked}\n indeterminate={indeterminate}\n disabled={disabled}\n onCheckedChange={onCheckedChange}\n className={cn(\n \"peer relative mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-0 bg-reki-base ring after:absolute after:-inset-x-3 after:-inset-y-2\",\n variant === \"error\" ? \"ring-reki-danger\" : \"ring-reki-hairline\",\n !disabled &&\n \"group-hover:ring-reki-hairline hover:ring-reki-hairline focus:ring-reki-focus focus:ring-2 focus-visible:ring-2 focus-visible:ring-reki-brand\",\n \"data-[checked]:bg-reki-contrast data-[checked]:ring-reki-contrast data-[indeterminate]:bg-reki-contrast data-[indeterminate]:ring-reki-contrast\",\n )}\n >\n <BaseCheckbox.Indicator\n keepMounted\n className=\"flex items-center justify-center text-reki-inverse data-[unchecked]:invisible\"\n render={(renderProps, state) => (\n <span {...renderProps}>\n {state.indeterminate ? (\n <MinusIcon weight=\"bold\" size={12} />\n ) : (\n <CheckIcon weight=\"bold\" size={12} />\n )}\n </span>\n )}\n />\n </BaseCheckbox.Root>\n <span className=\"text-base text-reki-default\">{label}</span>\n </label>\n );\n },\n);\n\nCheckboxItem.displayName = \"Checkbox.Item\";\n\n// Checkbox.Legend — composable legend sub-component for Checkbox.Group\nfunction CheckboxLegend({ children, className }: CheckboxLegendProps) {\n return (\n <Fieldset.Legend\n className={cn(\"text-base font-medium text-reki-default\", className)}\n >\n {children}\n </Fieldset.Legend>\n );\n}\n\nCheckboxLegend.displayName = \"Checkbox.Legend\";\n\n// Checkbox.Group with built-in Fieldset and CheckboxGroup\nfunction CheckboxGroup({\n legend,\n children,\n error,\n description,\n defaultValue,\n value,\n onValueChange,\n allValues,\n disabled,\n controlFirst = true,\n className,\n}: CheckboxGroupProps) {\n return (\n <CheckboxGroupContext.Provider value={{ controlFirst }}>\n <BaseCheckboxGroup\n defaultValue={defaultValue}\n value={value}\n onValueChange={onValueChange}\n allValues={allValues}\n disabled={disabled}\n >\n <Fieldset.Root className={cn(\"flex flex-col gap-4\", className)}>\n {legend && (\n <Fieldset.Legend className=\"text-base font-medium text-reki-default\">\n {legend}\n </Fieldset.Legend>\n )}\n <div className=\"flex flex-col gap-2\">{children}</div>\n {error && <p className=\"text-sm text-reki-danger\">{error}</p>}\n {description && (\n <p className=\"text-sm text-reki-subtle\">{description}</p>\n )}\n </Fieldset.Root>\n </BaseCheckboxGroup>\n </CheckboxGroupContext.Provider>\n );\n}\n\n// Compound component\nexport const Checkbox = Object.assign(CheckboxBase, {\n Item: CheckboxItem,\n Group: CheckboxGroup,\n Legend: CheckboxLegend,\n});\n\nCheckbox.displayName = \"Checkbox\";\n"],"names":["REKI_CHECKBOX_VARIANTS","REKI_CHECKBOX_DEFAULT_VARIANTS","CheckboxGroupContext","createContext","CheckboxBase","forwardRef","className","checked","indeterminate","disabled","variant","label","labelTooltip","controlFirst","onCheckedChange","required","name","props","ref","hasLabel","hasAriaLabel","hasAriaLabelledBy","checkboxControl","jsx","BaseCheckbox.Root","cn","BaseCheckbox.Indicator","renderProps","state","MinusIcon","CheckIcon","FieldBase.Root","jsxs","FieldBase.Label","Label","CheckboxItem","value","useContext","CheckboxLegend","children","Fieldset.Legend","CheckboxGroup","legend","error","description","defaultValue","onValueChange","allValues","BaseCheckboxGroup","Fieldset.Root","Checkbox"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"checkbox-h3kfhlron3b6sfhv.js","sources":["../../src/components/checkbox/checkbox.tsx"],"sourcesContent":["import { forwardRef, createContext, useContext, type ReactNode } from \"react\";\nimport { CheckIcon, MinusIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"../../utils/cn\";\nimport { resolveVariant } from \"../../utils/resolve-variant\";\nimport { Label } from \"../label\";\nimport { Fieldset } from \"@base-ui/react/fieldset\";\nimport { Field as FieldBase } from \"@base-ui/react/field\";\nimport { CheckboxGroup as BaseCheckboxGroup } from \"@base-ui/react/checkbox-group\";\nimport { Checkbox as BaseCheckbox } from \"@base-ui/react/checkbox\";\n\n/** Event details passed to onCheckedChange callback. Re-exported from Base UI. */\nexport type CheckboxChangeEventDetails = Parameters<\n NonNullable<BaseCheckbox.Root.Props[\"onCheckedChange\"]>\n>[1];\n\n/** Checkbox variant definitions mapping variant names to their Tailwind classes. */\nexport const REKI_CHECKBOX_VARIANTS = {\n variant: {\n default: {\n classes:\n \"[&:focus-within>span]:ring-reki-focus [&:hover>span]:ring-reki-hairline\",\n description: \"Default checkbox appearance\",\n },\n error: {\n classes: \"[&>span]:ring-reki-danger\",\n description: \"Error state for validation failures\",\n },\n },\n} as const;\n\nexport const REKI_CHECKBOX_DEFAULT_VARIANTS = {\n variant: \"default\",\n} as const;\n\n// Derived types from REKI_CHECKBOX_VARIANTS\nexport type RekiCheckboxVariant = keyof typeof REKI_CHECKBOX_VARIANTS.variant;\n\nexport interface RekiCheckboxVariantsProps {\n /**\n * Visual variant.\n * - `\"default\"` — Standard checkbox appearance\n * - `\"error\"` — Error state for validation failures\n * @default \"default\"\n */\n variant?: RekiCheckboxVariant;\n}\n\nexport function checkboxVariants({\n variant = REKI_CHECKBOX_DEFAULT_VARIANTS.variant,\n}: RekiCheckboxVariantsProps = {}) {\n return cn(resolveVariant(REKI_CHECKBOX_VARIANTS.variant, variant, REKI_CHECKBOX_DEFAULT_VARIANTS.variant).classes);\n}\n\n// Legacy type alias for backwards compatibility\nexport type CheckboxVariant = RekiCheckboxVariant;\n\n// Context for passing controlFirst from Group to Items\nconst CheckboxGroupContext = createContext<{ controlFirst: boolean }>({\n controlFirst: true,\n});\n\n/**\n * Single checkbox component props with accessibility guidance.\n *\n * **Accessible Name Required:** Checkbox should have one of:\n * 1. `label` prop (recommended) - built-in Field wrapper with horizontal layout\n * 2. `aria-label` - for checkboxes without visible label\n * 3. `aria-labelledby` - for custom label association\n *\n * **Note:** When used inside Checkbox.Group or Dropdown, label is optional (parent provides context).\n *\n * Missing accessible names will trigger console warnings in development (unless inside a group).\n *\n * @example\n * // Recommended: Built-in Field wrapper with label\n * <Checkbox label=\"Accept terms and conditions\" />\n *\n * @example\n * // Control-first layout (checkbox before label)\n * <Checkbox label=\"Remember me\" controlFirst={true} />\n *\n * @example\n * // Label-first layout (label before checkbox)\n * <Checkbox label=\"Enable notifications\" controlFirst={false} />\n *\n * @example\n * // Error variant (visual only, no error text for single checkboxes)\n * <Checkbox label=\"Required field\" variant=\"error\" />\n *\n * @example\n * // Without visible label (aria-label required)\n * <Checkbox aria-label=\"Select all items\" />\n *\n * @example\n * // Custom label association\n * <label id=\"terms-label\">I accept the terms</label>\n * <Checkbox aria-labelledby=\"terms-label\" />\n *\n * @example\n * // Inside Checkbox.Group (label optional)\n * <Checkbox.Group legend=\"Preferences\">\n * <Checkbox.Item value=\"email\" label=\"Email notifications\" />\n * <Checkbox.Item value=\"sms\" label=\"SMS notifications\" />\n * </Checkbox.Group>\n */\nexport type CheckboxProps = {\n /** Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text) */\n variant?: CheckboxVariant;\n /** Label content for the checkbox (enables built-in Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** When true (default), checkbox appears before label. When false, label appears before checkbox. */\n controlFirst?: boolean;\n /** Whether the checkbox is checked (controlled) */\n checked?: boolean;\n /** Whether the checkbox is in indeterminate state */\n indeterminate?: boolean;\n /** Whether the checkbox is disabled */\n disabled?: boolean;\n /** Callback when the checked state changes */\n onCheckedChange?: BaseCheckbox.Root.Props[\"onCheckedChange\"];\n /** Name for form submission */\n name?: string;\n /** Whether the field is required */\n required?: boolean;\n /** Additional class name */\n className?: string;\n /** Accessible label when no visible label is provided */\n \"aria-label\"?: string;\n /** ID of element that labels this checkbox */\n \"aria-labelledby\"?: string;\n};\n\n/**\n * Checkbox group component props (with built-in Fieldset and CheckboxGroup)\n *\n * Usage:\n * ```tsx\n * <Checkbox.Group\n * legend=\"Choose preferences\"\n * defaultValue={['email']}\n * error=\"You must select at least one option\"\n * >\n * <Checkbox.Item label=\"Email notifications\" value=\"email\" />\n * <Checkbox.Item label=\"SMS notifications\" value=\"sms\" />\n * </Checkbox.Group>\n * ```\n */\n/**\n * Props for Checkbox.Legend — a composable sub-component for labeling a Checkbox.Group.\n *\n * Place as a direct child of `<Checkbox.Group>` to provide a styled, accessible legend.\n * Accepts `className` for full styling control (e.g. `className=\"sr-only\"` to visually hide).\n *\n * @example\n * ```tsx\n * <Checkbox.Group>\n * <Checkbox.Legend className=\"sr-only\">Preferences</Checkbox.Legend>\n * <Checkbox.Item label=\"Email\" value=\"email\" />\n * </Checkbox.Group>\n * ```\n */\nexport interface CheckboxLegendProps {\n /** Legend content */\n children: ReactNode;\n /** Additional CSS classes (e.g. \"sr-only\" to visually hide the legend) */\n className?: string;\n}\n\nexport interface CheckboxGroupProps {\n /**\n * Legend text for the group.\n * For more control over legend styling, omit this prop and use `<Checkbox.Legend>` as a child instead.\n */\n legend?: string;\n /** Child Checkbox.Item components (and optionally a Checkbox.Legend) */\n children: ReactNode;\n /** Error message for the group (only appears in groups, not single checkboxes) */\n error?: string;\n /** Helper text for the group */\n description?: ReactNode;\n /** Values of checkboxes that should be initially checked (uncontrolled) */\n defaultValue?: string[];\n /** Values of checkboxes that should be checked (controlled) */\n value?: string[];\n /** Event handler called when checkbox values change */\n onValueChange?: (value: string[]) => void;\n /** All possible checkbox values (required for parent checkbox pattern) */\n allValues?: string[];\n /** Whether all checkboxes in the group are disabled */\n disabled?: boolean;\n /** When true (default), checkbox appears before label. When false, label appears before checkbox. */\n controlFirst?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Individual checkbox item within a group\n */\nexport type CheckboxItemProps = {\n /** Visual variant: \"default\" or \"error\" for validation failures */\n variant?: CheckboxVariant;\n /** Label text displayed next to checkbox */\n label: string;\n /** Value of the checkbox (required when used in Checkbox.Group) */\n value?: string;\n /** Additional CSS classes for the label wrapper */\n className?: string;\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n /** Callback when the checked state changes */\n onCheckedChange?: BaseCheckbox.Root.Props[\"onCheckedChange\"];\n name?: string;\n};\n\n// Single checkbox with built-in Field\nconst CheckboxBase = forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n className,\n checked,\n indeterminate,\n disabled,\n variant = \"default\",\n label,\n labelTooltip,\n controlFirst = true,\n onCheckedChange,\n required,\n name,\n ...props\n },\n ref,\n ) => {\n // A11y enforcement: warn in dev if no accessible name provided\n if (process.env.NODE_ENV !== \"production\") {\n const hasLabel = Boolean(label);\n const hasAriaLabel = Boolean(props[\"aria-label\"]);\n const hasAriaLabelledBy = Boolean(props[\"aria-labelledby\"]);\n\n if (!hasLabel && !hasAriaLabel && !hasAriaLabelledBy) {\n console.warn(\n \"[Reki Checkbox]: Checkbox must have an accessible name. Provide either:\\n\" +\n \" - label prop: <Checkbox label='Accept terms' />\\n\" +\n \" - aria-label: <Checkbox aria-label='Select item' />\\n\" +\n \" - aria-labelledby for custom label association\\n\" +\n \" Note: When used inside Checkbox.Group, label is optional\",\n );\n }\n }\n\n const checkboxControl = (\n <BaseCheckbox.Root\n ref={ref}\n data-reki-component=\"Checkbox\"\n name={name}\n checked={checked}\n indeterminate={indeterminate}\n disabled={disabled}\n onCheckedChange={onCheckedChange}\n className={cn(\n \"relative flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-0 bg-reki-base ring focus:outline-none after:absolute after:-inset-x-3 after:-inset-y-2\",\n label && \"mt-0.5\",\n variant === \"error\" ? \"ring-reki-danger\" : \"ring-reki-hairline\",\n !disabled &&\n \"hover:ring-reki-hairline focus:ring-reki-focus focus:ring-2 focus-visible:ring-2 focus-visible:ring-reki-brand\",\n \"data-[checked]:bg-reki-contrast data-[checked]:ring-reki-contrast data-[indeterminate]:bg-reki-contrast data-[indeterminate]:ring-reki-contrast\",\n disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n {...props}\n >\n <BaseCheckbox.Indicator\n keepMounted\n className=\"flex items-center justify-center text-reki-inverse data-[unchecked]:invisible\"\n render={(renderProps, state) => (\n <span {...renderProps}>\n {state.indeterminate ? (\n <MinusIcon weight=\"bold\" size={12} />\n ) : (\n <CheckIcon weight=\"bold\" size={12} />\n )}\n </span>\n )}\n />\n </BaseCheckbox.Root>\n );\n\n // If no label provided, return bare checkbox (for use in other components like Dropdown)\n if (!label) {\n return checkboxControl;\n }\n\n // Use Field.Root + Field.Label enclosing pattern for proper a11y association\n // See: https://base-ui.com/react/components/field\n return (\n <FieldBase.Root className=\"inline-flex\">\n <FieldBase.Label\n className={cn(\n \"!m-0 !min-h-0 !text-base inline-flex items-start gap-2\",\n controlFirst ? \"flex-row\" : \"flex-row-reverse justify-end\",\n disabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n {checkboxControl}\n <Label\n showOptional={required === false}\n tooltip={labelTooltip}\n asContent\n >\n {label}\n </Label>\n </FieldBase.Label>\n </FieldBase.Root>\n );\n },\n);\n\nCheckboxBase.displayName = \"Checkbox\";\n\n// Checkbox.Item for use within Checkbox.Group\nconst CheckboxItem = forwardRef<HTMLButtonElement, CheckboxItemProps>(\n (\n {\n className,\n checked,\n indeterminate,\n disabled,\n variant = \"default\",\n label,\n value,\n onCheckedChange,\n name,\n },\n ref,\n ) => {\n const { controlFirst } = useContext(CheckboxGroupContext);\n\n return (\n <label\n data-reki-component=\"Checkbox\"\n data-reki-part=\"item-label\"\n className={cn(\n \"m-0 relative inline-flex items-start gap-2\",\n // Control first (default): checkbox before label\n // Label first: label before checkbox using flex-row-reverse\n !controlFirst && \"flex-row-reverse justify-end\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n className,\n )}\n >\n <BaseCheckbox.Root\n ref={ref}\n data-reki-component=\"Checkbox\"\n data-reki-part=\"item\"\n value={value}\n name={name}\n checked={checked}\n indeterminate={indeterminate}\n disabled={disabled}\n onCheckedChange={onCheckedChange}\n className={cn(\n \"peer relative mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border-0 bg-reki-base ring after:absolute after:-inset-x-3 after:-inset-y-2\",\n variant === \"error\" ? \"ring-reki-danger\" : \"ring-reki-hairline\",\n !disabled &&\n \"group-hover:ring-reki-hairline hover:ring-reki-hairline focus:ring-reki-focus focus:ring-2 focus-visible:ring-2 focus-visible:ring-reki-brand\",\n \"data-[checked]:bg-reki-contrast data-[checked]:ring-reki-contrast data-[indeterminate]:bg-reki-contrast data-[indeterminate]:ring-reki-contrast\",\n )}\n >\n <BaseCheckbox.Indicator\n keepMounted\n className=\"flex items-center justify-center text-reki-inverse data-[unchecked]:invisible\"\n render={(renderProps, state) => (\n <span {...renderProps}>\n {state.indeterminate ? (\n <MinusIcon weight=\"bold\" size={12} />\n ) : (\n <CheckIcon weight=\"bold\" size={12} />\n )}\n </span>\n )}\n />\n </BaseCheckbox.Root>\n <span className=\"text-base text-reki-default\">{label}</span>\n </label>\n );\n },\n);\n\nCheckboxItem.displayName = \"Checkbox.Item\";\n\n// Checkbox.Legend — composable legend sub-component for Checkbox.Group\nfunction CheckboxLegend({ children, className }: CheckboxLegendProps) {\n return (\n <Fieldset.Legend\n className={cn(\"text-base font-medium text-reki-default\", className)}\n >\n {children}\n </Fieldset.Legend>\n );\n}\n\nCheckboxLegend.displayName = \"Checkbox.Legend\";\n\n// Checkbox.Group with built-in Fieldset and CheckboxGroup\nfunction CheckboxGroup({\n legend,\n children,\n error,\n description,\n defaultValue,\n value,\n onValueChange,\n allValues,\n disabled,\n controlFirst = true,\n className,\n}: CheckboxGroupProps) {\n return (\n <CheckboxGroupContext.Provider value={{ controlFirst }}>\n <BaseCheckboxGroup\n defaultValue={defaultValue}\n value={value}\n onValueChange={onValueChange}\n allValues={allValues}\n disabled={disabled}\n >\n <Fieldset.Root className={cn(\"flex flex-col gap-4\", className)}>\n {legend && (\n <Fieldset.Legend className=\"text-base font-medium text-reki-default\">\n {legend}\n </Fieldset.Legend>\n )}\n <div className=\"flex flex-col gap-2\">{children}</div>\n {error && <p className=\"text-sm text-reki-danger\">{error}</p>}\n {description && (\n <p className=\"text-sm text-reki-subtle\">{description}</p>\n )}\n </Fieldset.Root>\n </BaseCheckboxGroup>\n </CheckboxGroupContext.Provider>\n );\n}\n\n// Compound component\nexport const Checkbox = Object.assign(CheckboxBase, {\n Item: CheckboxItem,\n Group: CheckboxGroup,\n Legend: CheckboxLegend,\n});\n\nCheckbox.displayName = \"Checkbox\";\n"],"names":["REKI_CHECKBOX_VARIANTS","REKI_CHECKBOX_DEFAULT_VARIANTS","CheckboxGroupContext","createContext","CheckboxBase","forwardRef","className","checked","indeterminate","disabled","variant","label","labelTooltip","controlFirst","onCheckedChange","required","name","props","ref","hasLabel","hasAriaLabel","hasAriaLabelledBy","checkboxControl","jsx","BaseCheckbox.Root","cn","BaseCheckbox.Indicator","renderProps","state","MinusIcon","CheckIcon","FieldBase.Root","jsxs","FieldBase.Label","Label","CheckboxItem","value","useContext","CheckboxLegend","children","Fieldset.Legend","CheckboxGroup","legend","error","description","defaultValue","onValueChange","allValues","BaseCheckboxGroup","Fieldset.Root","Checkbox"],"mappings":";;;;;;;AAgBO,MAAMA,IAAyB;AAAA,EACpC,SAAS;AAAA,IACP,SAAS;AAAA,MACP,SACE;AAAA,MACF,aAAa;AAAA,IAAA;AAAA,IAEf,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAAiC;AAAA,EAC5C,SAAS;AACX,GAyBMC,IAAuBC,EAAyC;AAAA,EACpE,cAAc;AAChB,CAAC,GAgKKC,IAAeC;AAAA,EACnB,CACE;AAAA,IACE,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,eAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,OAAAC;AAAA,IACA,cAAAC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,iBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AAEH,QAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,YAAMC,IAAW,EAAQR,GACnBS,IAAe,EAAQH,EAAM,YAAY,GACzCI,IAAoB,EAAQJ,EAAM,iBAAiB;AAEzD,MAAI,CAACE,KAAY,CAACC,KAAgB,CAACC,KACjC,QAAQ;AAAA,QACN;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,IAON;AAEA,UAAMC,IACJ,gBAAAC;AAAA,MAACC;AAAAA,MAAA;AAAA,QACC,KAAAN;AAAA,QACA,uBAAoB;AAAA,QACpB,MAAAF;AAAA,QACA,SAAAT;AAAA,QACA,eAAAC;AAAA,QACA,UAAAC;AAAA,QACA,iBAAAK;AAAA,QACA,WAAWW;AAAA,UACT;AAAA,UACAd,KAAS;AAAA,UACTD,MAAY,UAAU,qBAAqB;AAAA,UAC3C,CAACD,KACC;AAAA,UACF;AAAA,UACAA,KAAY;AAAA,UACZH;AAAA,QAAA;AAAA,QAED,GAAGW;AAAA,QAEJ,UAAA,gBAAAM;AAAA,UAACG;AAAAA,UAAA;AAAA,YACC,aAAW;AAAA,YACX,WAAU;AAAA,YACV,QAAQ,CAACC,GAAaC,wBACnB,QAAA,EAAM,GAAGD,GACP,UAAAC,EAAM,gBACL,gBAAAL,EAACM,KAAU,QAAO,QAAO,MAAM,GAAA,CAAI,IAEnC,gBAAAN,EAACO,KAAU,QAAO,QAAO,MAAM,GAAA,CAAI,EAAA,CAEvC;AAAA,UAAA;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAKJ,WAAKnB,IAOH,gBAAAY,EAACQ,GAAA,EAAe,WAAU,eACxB,UAAA,gBAAAC;AAAA,MAACC;AAAAA,MAAA;AAAA,QACC,WAAWR;AAAA,UACT;AAAA,UACAZ,IAAe,aAAa;AAAA,UAC5BJ,IAAW,uBAAuB;AAAA,QAAA;AAAA,QAGnC,UAAA;AAAA,UAAAa;AAAA,UACD,gBAAAC;AAAA,YAACW;AAAA,YAAA;AAAA,cACC,cAAcnB,MAAa;AAAA,cAC3B,SAASH;AAAA,cACT,WAAS;AAAA,cAER,UAAAD;AAAA,YAAA;AAAA,UAAA;AAAA,QACH;AAAA,MAAA;AAAA,IAAA,GAEJ,IAvBOW;AAAA,EAyBX;AACF;AAEAlB,EAAa,cAAc;AAG3B,MAAM+B,IAAe9B;AAAA,EACnB,CACE;AAAA,IACE,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,eAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,OAAAC;AAAA,IACA,OAAAyB;AAAA,IACA,iBAAAtB;AAAA,IACA,MAAAE;AAAA,EAAA,GAEFE,MACG;AACH,UAAM,EAAE,cAAAL,EAAA,IAAiBwB,EAAWnC,CAAoB;AAExD,WACE,gBAAA8B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,uBAAoB;AAAA,QACpB,kBAAe;AAAA,QACf,WAAWP;AAAA,UACT;AAAA;AAAA;AAAA,UAGA,CAACZ,KAAgB;AAAA,UACjBJ,IAAW,kCAAkC;AAAA,UAC7CH;AAAA,QAAA;AAAA,QAGF,UAAA;AAAA,UAAA,gBAAAiB;AAAA,YAACC;AAAAA,YAAA;AAAA,cACC,KAAAN;AAAA,cACA,uBAAoB;AAAA,cACpB,kBAAe;AAAA,cACf,OAAAkB;AAAA,cACA,MAAApB;AAAA,cACA,SAAAT;AAAA,cACA,eAAAC;AAAA,cACA,UAAAC;AAAA,cACA,iBAAAK;AAAA,cACA,WAAWW;AAAA,gBACT;AAAA,gBACAf,MAAY,UAAU,qBAAqB;AAAA,gBAC3C,CAACD,KACC;AAAA,gBACF;AAAA,cAAA;AAAA,cAGF,UAAA,gBAAAc;AAAA,gBAACG;AAAAA,gBAAA;AAAA,kBACC,aAAW;AAAA,kBACX,WAAU;AAAA,kBACV,QAAQ,CAACC,GAAaC,wBACnB,QAAA,EAAM,GAAGD,GACP,UAAAC,EAAM,gBACL,gBAAAL,EAACM,KAAU,QAAO,QAAO,MAAM,GAAA,CAAI,IAEnC,gBAAAN,EAACO,KAAU,QAAO,QAAO,MAAM,GAAA,CAAI,EAAA,CAEvC;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAAA,UAEF,gBAAAP,EAAC,QAAA,EAAK,WAAU,+BAA+B,UAAAZ,EAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3D;AACF;AAEAwB,EAAa,cAAc;AAG3B,SAASG,EAAe,EAAE,UAAAC,GAAU,WAAAjC,KAAkC;AACpE,SACE,gBAAAiB;AAAA,IAACiB;AAAAA,IAAA;AAAA,MACC,WAAWf,EAAG,2CAA2CnB,CAAS;AAAA,MAEjE,UAAAiC;AAAA,IAAA;AAAA,EAAA;AAGP;AAEAD,EAAe,cAAc;AAG7B,SAASG,EAAc;AAAA,EACrB,QAAAC;AAAA,EACA,UAAAH;AAAA,EACA,OAAAI;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,OAAAT;AAAA,EACA,eAAAU;AAAA,EACA,WAAAC;AAAA,EACA,UAAAtC;AAAA,EACA,cAAAI,IAAe;AAAA,EACf,WAAAP;AACF,GAAuB;AACrB,2BACGJ,EAAqB,UAArB,EAA8B,OAAO,EAAE,cAAAW,KACtC,UAAA,gBAAAU;AAAA,IAACyB;AAAAA,IAAA;AAAA,MACC,cAAAH;AAAA,MACA,OAAAT;AAAA,MACA,eAAAU;AAAA,MACA,WAAAC;AAAA,MACA,UAAAtC;AAAA,MAEA,UAAA,gBAAAuB,EAACiB,GAAA,EAAc,WAAWxB,EAAG,uBAAuBnB,CAAS,GAC1D,UAAA;AAAA,QAAAoC,uBACEF,GAAA,EAAgB,WAAU,2CACxB,UAAAE,GACH;AAAA,QAEF,gBAAAnB,EAAC,OAAA,EAAI,WAAU,uBAAuB,UAAAgB,EAAA,CAAS;AAAA,QAC9CI,KAAS,gBAAApB,EAAC,KAAA,EAAE,WAAU,4BAA4B,UAAAoB,GAAM;AAAA,QACxDC,KACC,gBAAArB,EAAC,KAAA,EAAE,WAAU,4BAA4B,UAAAqB,EAAA,CAAY;AAAA,MAAA,EAAA,CAEzD;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AAGO,MAAMM,IAAW,OAAO,OAAO9C,GAAc;AAAA,EAClD,MAAM+B;AAAA,EACN,OAAOM;AAAA,EACP,QAAQH;AACV,CAAC;AAEDY,EAAS,cAAc;"}
|