themelia-react-ui 1.0.0 → 1.0.2
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 +190 -1
- package/README.md +92 -13
- package/dist/{accordion-BRWh3BM1.js → accordion-BRTcsp8J.js} +8 -8
- package/dist/accordion-BRTcsp8J.js.map +1 -0
- package/dist/{action-menu-Cx3SdfbN.js → action-menu-Drxw_vJk.js} +36 -36
- package/dist/action-menu-Drxw_vJk.js.map +1 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js +63 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js.map +1 -0
- package/dist/{ai-artifact-DkOArd3-.js → ai-artifact-DLVdK0Py.js} +151 -155
- package/dist/ai-artifact-DLVdK0Py.js.map +1 -0
- package/dist/{app-shell-BH_bGcE2.js → app-shell-C_fKpljx.js} +11 -10
- package/dist/app-shell-C_fKpljx.js.map +1 -0
- package/dist/{attachment-DsLgNHXt.js → attachment-DbjUWsP0.js} +12 -12
- package/dist/{attachment-DsLgNHXt.js.map → attachment-DbjUWsP0.js.map} +1 -1
- package/dist/auth-CAQcasMV.js +723 -0
- package/dist/auth-CAQcasMV.js.map +1 -0
- package/dist/{avatar-CsnWaYmt.js → avatar-Bu2HhitA.js} +76 -71
- package/dist/avatar-Bu2HhitA.js.map +1 -0
- package/dist/{badge-BZXZT9wd.js → badge-CzId1Wlm.js} +4 -4
- package/dist/{badge-BZXZT9wd.js.map → badge-CzId1Wlm.js.map} +1 -1
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/buttons.js +3 -2
- package/dist/base/cards.js +3 -3
- package/dist/base/carousel.js +25 -27
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +150 -148
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +3 -2
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +3 -3
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +4 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +233 -0
- package/dist/base/inline-edit.js.map +1 -0
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/navigation.js +6 -6
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +1 -1
- package/dist/base/repeaters.js +33 -33
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +1 -1
- package/dist/base/signature-pad.js +83 -81
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +1 -1
- package/dist/base/structure.js +1 -1
- package/dist/base/table.js +1 -1
- package/dist/base/text-inputs.js +2 -2
- package/dist/base/toaster.js +6 -6
- package/dist/base/toaster.js.map +1 -1
- package/dist/base/tree.js +1 -1
- package/dist/base/upload-queue.js +1 -1
- package/dist/base/upload.js +3 -3
- package/dist/base/value-inputs.js +1 -1
- package/dist/blocks/admin.js +134 -134
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +120 -117
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +3 -0
- package/dist/blocks/analytics.js +530 -491
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +2 -2
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +395 -383
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +1 -1
- package/dist/blocks/onboarding.js +6 -6
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +311 -0
- package/dist/blocks/planning.js.map +1 -0
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BuYz5SDU.js} +9 -8
- package/dist/breadcrumbs-BuYz5SDU.js.map +1 -0
- package/dist/button-BZDasD04.js +651 -0
- package/dist/button-BZDasD04.js.map +1 -0
- package/dist/{button-BS6l5JUw.js → button-BZyfTvwm.js} +3 -3
- package/dist/button-BZyfTvwm.js.map +1 -0
- package/dist/buttons-D_6KJvEE.js +99 -0
- package/dist/buttons-D_6KJvEE.js.map +1 -0
- package/dist/{cards-BMB0laLG.js → cards-qGSErLw_.js} +12 -12
- package/dist/{cards-BMB0laLG.js.map → cards-qGSErLw_.js.map} +1 -1
- package/dist/chart-Bsc5BICK.js +150 -0
- package/dist/chart-Bsc5BICK.js.map +1 -0
- package/dist/checkbox-BQNDjUCh.js +34 -0
- package/dist/checkbox-BQNDjUCh.js.map +1 -0
- package/dist/choice-inputs-Mk3iWbhr.js +725 -0
- package/dist/choice-inputs-Mk3iWbhr.js.map +1 -0
- package/dist/{code-block-DIlqzoiD.js → code-block-DzHKRybS.js} +23 -23
- package/dist/code-block-DzHKRybS.js.map +1 -0
- package/dist/{collapsible-DsnktFNv.js → collapsible-ClvC7Bj3.js} +3 -3
- package/dist/{collapsible-DsnktFNv.js.map → collapsible-ClvC7Bj3.js.map} +1 -1
- package/dist/{collection-content-C4fthJV_.js → collection-content-D6S8cv_n.js} +3 -3
- package/dist/{collection-content-C4fthJV_.js.map → collection-content-D6S8cv_n.js.map} +1 -1
- package/dist/{combobox-HDftpzxt.js → combobox-BFnbJJp3.js} +18 -18
- package/dist/combobox-BFnbJJp3.js.map +1 -0
- package/dist/{combobox-CHD750do.js → combobox-hozNwUcc.js} +313 -316
- package/dist/combobox-hozNwUcc.js.map +1 -0
- package/dist/{command-D0kWBZfd.js → command-BnmSchli.js} +9 -9
- package/dist/command-BnmSchli.js.map +1 -0
- package/dist/comments-u5L0OGip.js +1156 -0
- package/dist/comments-u5L0OGip.js.map +1 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
- package/dist/components/base/buttons/button.recipes.d.ts +10 -19
- package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
- package/dist/components/base/cards/card.recipes.d.ts +13 -5
- package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
- package/dist/components/base/cards/smart-card.types.d.ts +3 -1
- package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
- package/dist/components/base/date-pickers/datepicker.types.d.ts +3 -0
- package/dist/components/base/forms/form-field.d.ts +1 -0
- package/dist/components/base/forms/form-sizing.d.ts +3 -3
- package/dist/components/base/inline-edit/index.d.ts +2 -0
- package/dist/components/base/inline-edit/inline-edit.d.ts +81 -0
- package/dist/components/base/inline-edit/inline-edit.recipes.d.ts +6 -0
- package/dist/components/base/navigation/tabs.d.ts +3 -5
- package/dist/components/base/popover/popover.recipes.d.ts +3 -3
- package/dist/components/base/structure/structure.recipes.d.ts +6 -0
- package/dist/components/base/table/index.d.ts +1 -1
- package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
- package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
- package/dist/components/blocks/analytics/index.d.ts +1 -0
- package/dist/components/blocks/analytics/types.d.ts +1 -1
- package/dist/components/blocks/analytics/usage-card/index.d.ts +3 -0
- package/dist/components/blocks/analytics/usage-card/types.d.ts +52 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.d.ts +6 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.data.d.ts +19 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +22 -0
- package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
- package/dist/components/blocks/planning/index.d.ts +3 -0
- package/dist/components/blocks/planning/task-card.d.ts +3 -0
- package/dist/components/blocks/planning/task-card.strings.d.ts +15 -0
- package/dist/components/blocks/planning/task-card.types.d.ts +66 -0
- package/dist/components/features/combobox/components/error-message.d.ts +1 -1
- package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
- package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
- package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.types.d.ts +9 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
- package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
- package/dist/components/features/overlays/overlays.types.d.ts +5 -4
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +1 -1
- package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
- package/dist/components/layout/auth/auth.types.d.ts +1 -0
- package/dist/components/layout/page/page.d.ts +0 -1
- package/dist/components/layout/page/page.types.d.ts +9 -3
- package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
- package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
- package/dist/components/typography/heading.d.ts +5 -2
- package/dist/components/typography/index.d.ts +1 -1
- package/dist/components/typography/text.styles.d.ts +10 -0
- package/dist/components/ui/popover.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- package/dist/components/ui/table.d.ts +2 -1
- package/dist/container.recipes-D9t8MHR3.js +27 -0
- package/dist/container.recipes-D9t8MHR3.js.map +1 -0
- package/dist/{containers-CPNyNo1_.js → containers-DqB-bSYE.js} +34 -56
- package/dist/containers-DqB-bSYE.js.map +1 -0
- package/dist/control-group-recipes-DBXmfh2E.js +21 -0
- package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
- package/dist/{copyable-B7SBXJMr.js → copyable-BTSByfmq.js} +6 -6
- package/dist/{copyable-B7SBXJMr.js.map → copyable-BTSByfmq.js.map} +1 -1
- package/dist/{data-display-b3d1TfL4.js → data-display-Bihs9Ven.js} +542 -329
- package/dist/data-display-Bihs9Ven.js.map +1 -0
- package/dist/{date-BFNMnrS5.js → date-DOKhJPu7.js} +4 -4
- package/dist/{date-BFNMnrS5.js.map → date-DOKhJPu7.js.map} +1 -1
- package/dist/{date-picker-DI6kPNof.js → date-picker-DzP5HQq7.js} +492 -472
- package/dist/date-picker-DzP5HQq7.js.map +1 -0
- package/dist/date-pickers-BpgGz7S-.js +196 -0
- package/dist/date-pickers-BpgGz7S-.js.map +1 -0
- package/dist/{display-ByI5tkqy.js → display-CS6Hbk18.js} +8 -8
- package/dist/{display-ByI5tkqy.js.map → display-CS6Hbk18.js.map} +1 -1
- package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-D-boNgGO.js} +7 -7
- package/dist/{dropdown-menu-BlnyHr-9.js.map → dropdown-menu-D-boNgGO.js.map} +1 -1
- package/dist/features/activities.js +152 -141
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +182 -179
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +9 -9
- package/dist/features/async-preview.js.map +1 -1
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +25 -23
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +103 -104
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +375 -373
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +222 -224
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +29 -29
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +59 -58
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +856 -855
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1210 -1209
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +133 -132
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +29 -31
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +13 -13
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +82 -82
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +4 -4
- package/dist/features/sync.js.map +1 -1
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +456 -450
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-CJkUAapr.js +233 -0
- package/dist/feedback-CJkUAapr.js.map +1 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js +25 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js.map +1 -0
- package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-DQQpiLWC.js} +3 -3
- package/dist/field-state-recipes-DQQpiLWC.js.map +1 -0
- package/dist/{filters-qtrcv1hf.js → filters-D6FF8L6s.js} +715 -720
- package/dist/filters-D6FF8L6s.js.map +1 -0
- package/dist/{form-field-C6W-y2hR.js → form-field-CZwrkP7m.js} +17 -9
- package/dist/form-field-CZwrkP7m.js.map +1 -0
- package/dist/{form-sizing-39NohSqn.js → form-sizing-QP8aIRaW.js} +10 -6
- package/dist/form-sizing-QP8aIRaW.js.map +1 -0
- package/dist/{forms-BF-HSbff.js → forms-B5NCbkSC.js} +35 -35
- package/dist/{forms-BF-HSbff.js.map → forms-B5NCbkSC.js.map} +1 -1
- package/dist/forms-numeric-Crrm80Lm.js +867 -0
- package/dist/forms-numeric-Crrm80Lm.js.map +1 -0
- package/dist/{header-B8ex54cY.js → header-kxruN3RM.js} +53 -49
- package/dist/header-kxruN3RM.js.map +1 -0
- package/dist/{hooks-D6UBVzf2.js → hooks-BrlnCwQd.js} +2 -2
- package/dist/{hooks-D6UBVzf2.js.map → hooks-BrlnCwQd.js.map} +1 -1
- package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
- package/dist/http-CdEIHyQf.js.map +1 -0
- package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-Btc6pQrp.js} +4 -4
- package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-Btc6pQrp.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/input-SX9V0AL3.js +255 -0
- package/dist/input-SX9V0AL3.js.map +1 -0
- package/dist/input-vxcaNCYC.js +20 -0
- package/dist/input-vxcaNCYC.js.map +1 -0
- package/dist/{item-pJ0GsOiJ.js → item-DE4YnuJx.js} +18 -17
- package/dist/item-DE4YnuJx.js.map +1 -0
- package/dist/layout/app-shell.js +1 -1
- package/dist/layout/auth.js +1 -1
- package/dist/layout/containers.js +1 -1
- package/dist/layout/header.js +1 -1
- package/dist/layout/hooks.js +1 -1
- package/dist/layout/navigation.js +1 -1
- package/dist/layout/page.js +1 -1
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +2 -2
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +10 -10
- package/dist/lib/affordance-geometry.generated.d.ts +44 -4
- package/dist/lib/control-group-recipes.d.ts +22 -0
- package/dist/lib/field-affordance-recipes.d.ts +35 -2
- package/dist/lib/field-state-recipes.d.ts +2 -2
- package/dist/lib/navigation-row-recipes.d.ts +3 -2
- package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
- package/dist/lib/surface-recipes.d.ts +5 -2
- package/dist/lib/token-merge.generated.d.ts +144 -2
- package/dist/lib/ui-provider/types.d.ts +4 -2
- package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
- package/dist/lib/utils.js +1 -1
- package/dist/{media-gallery-Ca4YmvBi.js → media-gallery-DLp3HAz0.js} +75 -74
- package/dist/media-gallery-DLp3HAz0.js.map +1 -0
- package/dist/{mentions-CRio8mTm.js → mentions-Cl0Kt_Pd.js} +52 -50
- package/dist/{mentions-CRio8mTm.js.map → mentions-Cl0Kt_Pd.js.map} +1 -1
- package/dist/message-SZUNB1eX.js +127 -0
- package/dist/message-SZUNB1eX.js.map +1 -0
- package/dist/{navigation-BTrEb5u4.js → navigation-DnQSNMT0.js} +64 -55
- package/dist/navigation-DnQSNMT0.js.map +1 -0
- package/dist/{navigation-DqEITuD2.js → navigation-DyytsLRB.js} +37 -37
- package/dist/navigation-DyytsLRB.js.map +1 -0
- package/dist/{navigation-row-recipes-BFpvGPGE.js → navigation-row-recipes-DQEXQcqY.js} +3 -3
- package/dist/navigation-row-recipes-DQEXQcqY.js.map +1 -0
- package/dist/{number-BNT_BIzJ.js → number-DasMFWEG.js} +4 -4
- package/dist/{number-BNT_BIzJ.js.map → number-DasMFWEG.js.map} +1 -1
- package/dist/overlays-DUbs1KEi.js +1011 -0
- package/dist/overlays-DUbs1KEi.js.map +1 -0
- package/dist/{page-BMBGjJY8.js → page-hGmT4nWK.js} +75 -64
- package/dist/page-hGmT4nWK.js.map +1 -0
- package/dist/{page-header-BH41wCyY.js → page-header-D8nERkn5.js} +9 -9
- package/dist/page-header-D8nERkn5.js.map +1 -0
- package/dist/{pagination-C29vvt3I.js → pagination-NLGqRirf.js} +20 -20
- package/dist/pagination-NLGqRirf.js.map +1 -0
- package/dist/{popover-TInGXsjg.js → popover-CghIYdQf.js} +23 -22
- package/dist/popover-CghIYdQf.js.map +1 -0
- package/dist/{popover-menu-BzqXqE72.js → popover-menu-B4PoWhRl.js} +6 -6
- package/dist/{popover-menu-BzqXqE72.js.map → popover-menu-B4PoWhRl.js.map} +1 -1
- package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-QlD4JenO.js} +5 -5
- package/dist/popover.recipes-QlD4JenO.js.map +1 -0
- package/dist/{primitives-DKPOGVpj.js → primitives-C7ff0QaI.js} +120 -113
- package/dist/primitives-C7ff0QaI.js.map +1 -0
- package/dist/primitives.js +3 -3
- package/dist/progress-BroqrAyV.js +169 -0
- package/dist/progress-BroqrAyV.js.map +1 -0
- package/dist/{receipt-DYWTQGEc.js → receipt-BuJynLgf.js} +8 -8
- package/dist/{receipt-DYWTQGEc.js.map → receipt-BuJynLgf.js.map} +1 -1
- package/dist/{rich-text-B7sBAdDG.js → rich-text-DlxDOtf4.js} +4 -4
- package/dist/{rich-text-B7sBAdDG.js.map → rich-text-DlxDOtf4.js.map} +1 -1
- package/dist/rich-text-editor-BKyG7rWz.js +574 -0
- package/dist/rich-text-editor-BKyG7rWz.js.map +1 -0
- package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-B72Nfuze.js} +35 -26
- package/dist/rich-text-editor.recipes-B72Nfuze.js.map +1 -0
- package/dist/{scroll-area-BheMQ270.js → scroll-area-D-pIhEKl.js} +3 -3
- package/dist/scroll-area-D-pIhEKl.js.map +1 -0
- package/dist/{separator-Gk_WXH-l.js → separator-BNIgG3au.js} +3 -3
- package/dist/{separator-Gk_WXH-l.js.map → separator-BNIgG3au.js.map} +1 -1
- package/dist/{separator-DO0EbCEm.js → separator-BhtFyo4x.js} +2 -2
- package/dist/{separator-DO0EbCEm.js.map → separator-BhtFyo4x.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{settings-D9f_wdIC.js → settings-DOTOzeZ2.js} +10 -9
- package/dist/{settings-D9f_wdIC.js.map → settings-DOTOzeZ2.js.map} +1 -1
- package/dist/{sheet-vOUloJ4O.js → sheet-BFhrNehm.js} +11 -11
- package/dist/sheet-BFhrNehm.js.map +1 -0
- package/dist/{sidebar-CNBKFDRW.js → sidebar-CyR4XKwR.js} +219 -200
- package/dist/sidebar-CyR4XKwR.js.map +1 -0
- package/dist/{sidebar-C3UKkbC5.js → sidebar-SvGJ0Zwi.js} +63 -58
- package/dist/sidebar-SvGJ0Zwi.js.map +1 -0
- package/dist/{skeleton-BvRhK8y-.js → skeleton-3F0uhYn3.js} +4 -4
- package/dist/{skeleton-BvRhK8y-.js.map → skeleton-3F0uhYn3.js.map} +1 -1
- package/dist/{smart-card-B5FcKODh.js → smart-card-DjGVV2xr.js} +206 -199
- package/dist/smart-card-DjGVV2xr.js.map +1 -0
- package/dist/{spinner-JtlFJ7Nc.js → spinner-Cpf7oRkF.js} +5 -5
- package/dist/{spinner-JtlFJ7Nc.js.map → spinner-Cpf7oRkF.js.map} +1 -1
- package/dist/{structure-BvW4vG4H.js → structure-CRdqVawd.js} +14 -14
- package/dist/{structure-BvW4vG4H.js.map → structure-CRdqVawd.js.map} +1 -1
- package/dist/{structure.recipes-DjqnBpwz.js → structure.recipes-Bqhf9oIh.js} +2 -2
- package/dist/structure.recipes-Bqhf9oIh.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-CQfRr-VL.js → surface-recipes-Dd__PD-w.js} +4 -3
- package/dist/surface-recipes-Dd__PD-w.js.map +1 -0
- package/dist/{table-DnlAJ-xR.js → table-CLtJTxoR.js} +17 -16
- package/dist/table-CLtJTxoR.js.map +1 -0
- package/dist/table-CcRDZiLP.js +1444 -0
- package/dist/table-CcRDZiLP.js.map +1 -0
- package/dist/tabs-BNgu7g0u.js +188 -0
- package/dist/tabs-BNgu7g0u.js.map +1 -0
- package/dist/text-inputs-DsR56TR-.js +330 -0
- package/dist/text-inputs-DsR56TR-.js.map +1 -0
- package/dist/{text.styles-BwB7vAF2.js → text.styles-Q4sGAIgA.js} +18 -10
- package/dist/text.styles-Q4sGAIgA.js.map +1 -0
- package/dist/theme.css +77 -115
- package/dist/{timelines-CnZ2S_Gr.js → timelines-D1pkt3se.js} +84 -78
- package/dist/timelines-D1pkt3se.js.map +1 -0
- package/dist/{tree-COD9BGdU.js → tree-BtmYyMZV.js} +8 -8
- package/dist/{tree-COD9BGdU.js.map → tree-BtmYyMZV.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-BxQgiZyw.js +96 -0
- package/dist/typography-BxQgiZyw.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-CftIB6TY.js → ui-provider-DRPn3qNl.js} +3 -2
- package/dist/ui-provider-DRPn3qNl.js.map +1 -0
- package/dist/ui-provider.js +1 -1
- package/dist/{upload-DIzw1dx1.js → upload-CDbYw1WN.js} +326 -323
- package/dist/upload-CDbYw1WN.js.map +1 -0
- package/dist/{upload-queue-xRJ3qDmd.js → upload-queue-CNd_hH_a.js} +25 -25
- package/dist/upload-queue-CNd_hH_a.js.map +1 -0
- package/dist/usage-card-VyJLUwRr.js +457 -0
- package/dist/usage-card-VyJLUwRr.js.map +1 -0
- package/dist/utils-BvH9PSmq.js +4275 -0
- package/dist/utils-BvH9PSmq.js.map +1 -0
- package/dist/value-inputs-D0KCrfVC.js +840 -0
- package/dist/value-inputs-D0KCrfVC.js.map +1 -0
- package/dist/{workspace-Cbqz4FzN.js → workspace-CcR8r-Nt.js} +115 -122
- package/dist/workspace-CcR8r-Nt.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +112 -18
- package/docs/consumer-skill/examples/analytics.tsx +34 -0
- package/docs/consumer-skill/examples/app-layout.tsx +42 -12
- package/docs/consumer-skill/examples/detail.tsx +24 -9
- package/docs/consumer-skill/examples/manifest.json +27 -1
- package/docs/consumer-skill/examples/planning-usage-edit.tsx +29 -0
- package/docs/consumer-skill/examples/scoped-directory.tsx +77 -0
- package/docs/consumer-skill/examples/website.tsx +56 -0
- package/docs/consumer-skill/references/analytics.md +70 -0
- package/docs/consumer-skill/references/composition.md +219 -2
- package/docs/consumer-skill/references/design-contract.md +37 -10
- package/docs/consumer-skill/references/discovery.md +93 -5
- package/docs/consumer-skill/references/installation.md +20 -3
- package/docs/consumer-skill/references/integration.md +26 -0
- package/docs/consumer-skill/references/public-api.json +2416 -388
- package/docs/consumer-skill/references/review.md +126 -0
- package/docs/consumer-skill/references/theming.md +52 -7
- package/docs/consumer-skill/references/tokens.json +177 -9
- package/docs/consumer-skill/references/workflows.md +129 -1
- package/docs/consumer-skill/scripts/check-composition.mjs +31 -0
- package/docs/consumer-skill/scripts/composition-policy.mjs +317 -0
- package/docs/consumer-skill/scripts/discovery.mjs +65 -8
- package/docs/consumer-skill/scripts/surface-policy.mjs +66 -0
- package/package.json +30 -6
- package/dist/accordion-BRWh3BM1.js.map +0 -1
- package/dist/action-menu-Cx3SdfbN.js.map +0 -1
- package/dist/affordance-geometry.generated-DXl-Zb3Z.js +0 -23
- package/dist/affordance-geometry.generated-DXl-Zb3Z.js.map +0 -1
- package/dist/ai-artifact-DkOArd3-.js.map +0 -1
- package/dist/app-shell-BH_bGcE2.js.map +0 -1
- package/dist/auth-BDB1V_2q.js +0 -704
- package/dist/auth-BDB1V_2q.js.map +0 -1
- package/dist/avatar-CsnWaYmt.js.map +0 -1
- package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
- package/dist/button-BS6l5JUw.js.map +0 -1
- package/dist/buttons-Co6GavvM.js +0 -674
- package/dist/buttons-Co6GavvM.js.map +0 -1
- package/dist/chart-DVfcwQu6.js +0 -149
- package/dist/chart-DVfcwQu6.js.map +0 -1
- package/dist/choice-inputs-CavA-SGV.js +0 -644
- package/dist/choice-inputs-CavA-SGV.js.map +0 -1
- package/dist/code-block-DIlqzoiD.js.map +0 -1
- package/dist/combobox-CHD750do.js.map +0 -1
- package/dist/combobox-HDftpzxt.js.map +0 -1
- package/dist/command-D0kWBZfd.js.map +0 -1
- package/dist/comments-CvYeglMS.js +0 -1132
- package/dist/comments-CvYeglMS.js.map +0 -1
- package/dist/containers-CPNyNo1_.js.map +0 -1
- package/dist/data-display-b3d1TfL4.js.map +0 -1
- package/dist/date-picker-DI6kPNof.js.map +0 -1
- package/dist/date-pickers-ByP6Cv2z.js +0 -224
- package/dist/date-pickers-ByP6Cv2z.js.map +0 -1
- package/dist/feedback-a9j9J-9A.js +0 -391
- package/dist/feedback-a9j9J-9A.js.map +0 -1
- package/dist/field-affordance-recipes-CHdUtn2Z.js +0 -17
- package/dist/field-affordance-recipes-CHdUtn2Z.js.map +0 -1
- package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
- package/dist/filters-qtrcv1hf.js.map +0 -1
- package/dist/form-field-C6W-y2hR.js.map +0 -1
- package/dist/form-sizing-39NohSqn.js.map +0 -1
- package/dist/forms-numeric-Y15Bg5Nr.js +0 -867
- package/dist/forms-numeric-Y15Bg5Nr.js.map +0 -1
- package/dist/header-B8ex54cY.js.map +0 -1
- package/dist/http-CLTVJc5I.js.map +0 -1
- package/dist/input-DMorJiTI.js +0 -202
- package/dist/input-DMorJiTI.js.map +0 -1
- package/dist/input-ci9fIgFH.js +0 -20
- package/dist/input-ci9fIgFH.js.map +0 -1
- package/dist/item-pJ0GsOiJ.js.map +0 -1
- package/dist/media-gallery-Ca4YmvBi.js.map +0 -1
- package/dist/message-B5-6LeYl.js +0 -108
- package/dist/message-B5-6LeYl.js.map +0 -1
- package/dist/navigation-BTrEb5u4.js.map +0 -1
- package/dist/navigation-DqEITuD2.js.map +0 -1
- package/dist/navigation-row-recipes-BFpvGPGE.js.map +0 -1
- package/dist/overlays-DBqV0J_V.js +0 -982
- package/dist/overlays-DBqV0J_V.js.map +0 -1
- package/dist/page-BMBGjJY8.js.map +0 -1
- package/dist/page-header-BH41wCyY.js.map +0 -1
- package/dist/pagination-C29vvt3I.js.map +0 -1
- package/dist/popover-TInGXsjg.js.map +0 -1
- package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
- package/dist/primitives-DKPOGVpj.js.map +0 -1
- package/dist/rich-text-editor-BZSJchAF.js +0 -575
- package/dist/rich-text-editor-BZSJchAF.js.map +0 -1
- package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
- package/dist/scroll-area-BheMQ270.js.map +0 -1
- package/dist/select-B2mb-qN2.js +0 -108
- package/dist/select-B2mb-qN2.js.map +0 -1
- package/dist/sheet-vOUloJ4O.js.map +0 -1
- package/dist/sidebar-C3UKkbC5.js.map +0 -1
- package/dist/sidebar-CNBKFDRW.js.map +0 -1
- package/dist/smart-card-B5FcKODh.js.map +0 -1
- package/dist/structure.recipes-DjqnBpwz.js.map +0 -1
- package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
- package/dist/table-DnlAJ-xR.js.map +0 -1
- package/dist/table-ghtAQ-JJ.js +0 -1424
- package/dist/table-ghtAQ-JJ.js.map +0 -1
- package/dist/tabs-DY09eoZg.js +0 -187
- package/dist/tabs-DY09eoZg.js.map +0 -1
- package/dist/text-inputs-BhOcedTo.js +0 -331
- package/dist/text-inputs-BhOcedTo.js.map +0 -1
- package/dist/text.styles-BwB7vAF2.js.map +0 -1
- package/dist/timelines-CnZ2S_Gr.js.map +0 -1
- package/dist/typography-Cv8MT-82.js +0 -96
- package/dist/typography-Cv8MT-82.js.map +0 -1
- package/dist/ui-provider-CftIB6TY.js.map +0 -1
- package/dist/upload-DIzw1dx1.js.map +0 -1
- package/dist/upload-queue-xRJ3qDmd.js.map +0 -1
- package/dist/utils-C2EKeIw3.js +0 -72
- package/dist/utils-C2EKeIw3.js.map +0 -1
- package/dist/value-inputs-Co1fu-xv.js +0 -824
- package/dist/value-inputs-Co1fu-xv.js.map +0 -1
- package/dist/workspace-Cbqz4FzN.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban.js","names":["Text","ActionMenu","getKanbanKeyboardPosition","ids","columns","columnIndex","position","key","nextId","createKanbanKeyboardCoordinates","event","active","context","destination","findItem","next","value","onPositionChange","item","id","getItemValue","rect","activeRect","currentCoordinates","useKanban","useCallback","columnId","items","index","move","found","itemId","toColumnId","fromColumnId","fromIndex","targetItems","resolvedToIndex","toIndex","sourceCopy","targetCopy","landingIndex","onValueChange","onItemMove","useMemo","KanbanContext","createContext","KanbanContextProvider","useKanbanContext","ctx","useContext","KanbanItemContext","KanbanItemContextProvider","useKanbanItemContext","defaultKanbanStrings","interpolateKanbanString","params","acc","template","Kanban","stringsProp","strings","useStrings","activeId","setActiveId","useState","boardRef","useRef","keyboardFocusId","node","handle","dragOrigin","completedDestination","keyboardPosition","setKeyboardPosition","keyboardDestination","keyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","activeItem","handleDragStart","getItemLabel","handleDragEnd","source","over","overData","overId","targetColumnId","ctxValue","itemActions","onItemClick","announcementParams","origin","columnName","getColumnLabel","DndContext","cn","className","children","KanbanBoard","KanbanColumn","useDroppable","setNodeRef","isOver","KanbanColumnContent","SortableContext","verticalListSortingStrategy","KanbanItem","useSortable","style","CSS","transform","isDragging","handleCount","setHandleCount","hasHandle","registerHandle","count","itemCtx","listeners","attributes","setActivatorNodeRef","rootClick","handleClick","onClick","isClickable","KanbanItemHandle","forwardRef","setMergedRef","forwardedRef","Button","KanbanItemActions","rawActions","actions","visible","action","disabled","menuActions","icon","MoreHorizontal","ariaLabel","KanbanOverlay","DragOverlay","render"],"sources":["../../src/components/features/kanban/kanban-keyboard.ts","../../src/components/features/kanban/hooks/use-kanban.ts","../../src/components/features/kanban/kanban-context.tsx","../../src/components/features/kanban/kanban.strings.ts","../../src/components/features/kanban/kanban.tsx"],"sourcesContent":["import type { KeyboardCoordinateGetter } from '@dnd-kit/core';\n\nexport interface KanbanKeyboardPosition { columnId: string; index: number }\n\n/** Resolve arrow movement from board order, including columns with no cards. */\nexport function getKanbanKeyboardPosition(\n\tcolumns: Record<string, unknown[]>,\n\tposition: KanbanKeyboardPosition,\n\tkey: string,\n): KanbanKeyboardPosition {\n\tconst ids = Object.keys(columns);\n\tconst columnIndex = ids.indexOf(position.columnId);\n\tif (key === 'ArrowLeft' || key === 'ArrowRight') {\n\t\tconst nextId = ids[columnIndex + (key === 'ArrowRight' ? 1 : -1)];\n\t\treturn nextId ? { columnId: nextId, index: Math.min(position.index, columns[nextId].length) } : position;\n\t}\n\tif (key === 'ArrowUp' || key === 'ArrowDown') {\n\t\treturn { columnId: position.columnId, index: Math.max(0, Math.min(columns[position.columnId].length - 1, position.index + (key === 'ArrowDown' ? 1 : -1))) };\n\t}\n\treturn position;\n}\n\nexport function createKanbanKeyboardCoordinates(\n\tvalue: Record<string, unknown[]>,\n\tgetItemValue: (item: unknown) => string,\n\tfindItem: (id: string) => KanbanKeyboardPosition | undefined,\n\tdestination: { current: KanbanKeyboardPosition | null },\n\tonPositionChange?: (position: KanbanKeyboardPosition) => void,\n): KeyboardCoordinateGetter {\n\treturn (event, { currentCoordinates, context }) => {\n\t\tif (!['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code)) return undefined;\n\t\tconst active = context.active;\n\t\tif (!active) return undefined;\n\t\tconst position = destination.current ?? findItem(String(active.id));\n\t\tif (!position) return undefined;\n\t\tevent.preventDefault();\n\t\tconst next = getKanbanKeyboardPosition(value, position, event.code);\n\t\tdestination.current = next;\n\t\tonPositionChange?.(next);\n\t\tconst item = value[next.columnId][next.index];\n\t\tconst id = item === undefined ? next.columnId : getItemValue(item);\n\t\tconst rect = context.droppableRects.get(id);\n\t\tconst activeRect = context.collisionRect;\n\t\tif (!rect || !activeRect) return currentCoordinates;\n\t\treturn {\n\t\t\tx: currentCoordinates.x + rect.left - activeRect.left,\n\t\t\ty: currentCoordinates.y + rect.top - activeRect.top,\n\t\t};\n\t};\n}\n","import { useCallback, useMemo } from 'react';\n\nimport type { KanbanItemMoveEvent, KanbanValue } from '../kanban.types';\n\n/**\n * Headless hook — exposes the same state machine `<Kanban>` uses\n * internally so consumers can build a fully custom UI against it.\n *\n * const { findItem, move } = useKanban({ value, onValueChange,\n * getItemValue });\n * move({ itemId: 'card-1', toColumnId: 'shipped', toIndex: 0 });\n */\nexport interface UseKanbanOptions<T> {\n\tvalue: KanbanValue<T>;\n\tonValueChange: (next: KanbanValue<T>) => void;\n\tgetItemValue: (item: T) => string;\n\tonItemMove?: (event: KanbanItemMoveEvent<T>) => void;\n}\n\nexport interface UseKanbanResult<T> {\n\tfindItem: (id: string) => { columnId: string; index: number; item: T } | undefined;\n\t/**\n\t * Move an item between columns / within the same column. Idempotent:\n\t * a no-op move is safe.\n\t */\n\tmove: (input: { itemId: string; toColumnId: string; toIndex?: number }) => void;\n}\n\nexport function useKanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tonItemMove,\n}: UseKanbanOptions<T>): UseKanbanResult<T> {\n\tconst findItem = useCallback(\n\t\t(id: string) => {\n\t\t\tfor (const [columnId, items] of Object.entries(value)) {\n\t\t\t\tconst index = items.findIndex((item) => getItemValue(item) === id);\n\t\t\t\tif (index >= 0) return { columnId, index, item: items[index] };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t[value, getItemValue],\n\t);\n\n\tconst move = useCallback(\n\t\t({ itemId, toColumnId, toIndex }: { itemId: string; toColumnId: string; toIndex?: number }) => {\n\t\t\tconst found = findItem(itemId);\n\t\t\tif (!found) return;\n\t\t\tif (!Object.prototype.hasOwnProperty.call(value, toColumnId)) return;\n\n\t\t\tconst { columnId: fromColumnId, index: fromIndex, item } = found;\n\n\t\t\t// Same column, same slot — nothing to do.\n\t\t\tconst targetItems = value[toColumnId];\n\t\t\tconst resolvedToIndex =\n\t\t\t\ttoIndex === undefined\n\t\t\t\t\t? targetItems.length\n\t\t\t\t\t: Math.max(0, Math.min(toIndex, targetItems.length));\n\n\t\t\tif (fromColumnId === toColumnId && fromIndex === resolvedToIndex) return;\n\n\t\t\tconst next: KanbanValue<T> = { ...value };\n\t\t\tconst sourceCopy = [...next[fromColumnId]];\n\t\t\tsourceCopy.splice(fromIndex, 1);\n\t\t\tnext[fromColumnId] = sourceCopy;\n\n\t\t\tconst targetCopy = [...(fromColumnId === toColumnId ? sourceCopy : next[toColumnId])];\n\t\t\t// When moving within the same column to a later index, the splice\n\t\t\t// above shifted everything left — re-resolve the destination.\n\t\t\tlet landingIndex = resolvedToIndex;\n\t\t\tif (fromColumnId === toColumnId && fromIndex < resolvedToIndex) {\n\t\t\t\tlandingIndex = Math.max(0, resolvedToIndex - 1);\n\t\t\t}\n\t\t\ttargetCopy.splice(landingIndex, 0, item);\n\t\t\tnext[toColumnId] = targetCopy;\n\n\t\t\tonValueChange(next);\n\t\t\tonItemMove?.({\n\t\t\t\titem,\n\t\t\t\titemId,\n\t\t\t\tfrom: { columnId: fromColumnId, index: fromIndex },\n\t\t\t\tto: { columnId: toColumnId, index: landingIndex },\n\t\t\t});\n\t\t},\n\t\t[value, findItem, onValueChange, onItemMove],\n\t);\n\n\treturn useMemo(() => ({ findItem, move }), [findItem, move]);\n}\n","import { createContext, useContext } from 'react';\n\nimport type { KanbanContextShape } from './kanban.types';\n\n/**\n * Internal context for the Kanban — the parts use this to read\n * shared state (current value, getItemValue, active drag id).\n */\nconst KanbanContext = createContext<KanbanContextShape | null>(null);\n\nexport const KanbanContextProvider = KanbanContext.Provider;\n\nexport function useKanbanContext<T = unknown>(): KanbanContextShape<T> {\n\tconst ctx = useContext(KanbanContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'Kanban subcomponents must be rendered inside a <Kanban> root.',\n\t\t);\n\t}\n\treturn ctx as unknown as KanbanContextShape<T>;\n}\n\n/**\n * Internal context exposed by `<KanbanItem>` so the optional\n * `<KanbanItemHandle>` knows which listeners + accessibility props to\n * wire to the dedicated drag handle. Also carries the resolved\n * domain item so `<KanbanItemActions>` (and any other item-aware\n * subcomponent) can render per-item content without prop drilling.\n *\n * The dnd-kit shapes are widened to `unknown` so consumers can spread\n * them onto any HTMLElement.\n */\nexport interface KanbanItemContextShape<T = unknown> {\n\tlisteners: unknown;\n\tattributes: unknown;\n\tsetActivatorNodeRef: (node: HTMLElement | null) => void;\n\tregisterHandle: () => () => void;\n\t/** Stable id (the value returned by `getItemValue`). */\n\titemId: string;\n\t/** The domain item itself — null if it can't be resolved. */\n\titem: T | null;\n}\n\nconst KanbanItemContext = createContext<KanbanItemContextShape | null>(null);\n\nexport const KanbanItemContextProvider = KanbanItemContext.Provider;\n\nexport function useKanbanItemContext<T = unknown>(): KanbanItemContextShape<T> {\n\tconst ctx = useContext(KanbanItemContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'<KanbanItemHandle> / <KanbanItemActions> must be rendered inside a <KanbanItem>.',\n\t\t);\n\t}\n\treturn ctx as KanbanItemContextShape<T>;\n}\n","/**\n * Strings for the Kanban — drag-and-drop screen-reader announcements\n * + accessibility labels. The library never renders user-visible copy\n * that the consumer hasn't already supplied via column headers / item\n * children, so the strings here are exclusively for assistive tech.\n */\nexport interface KanbanStrings {\n\t/** Read by screen readers when a drag begins. `{name}` = item label (or ID). */\n\tannounceDragStart: string;\n\t/** Read when an item moves over a column. `{from}` / `{to}` are column labels; `{position}` is one-based. */\n\tannounceDragMove: string;\n\t/** Read when an item is dropped into a column. */\n\tannounceDragEnd: string;\n\t/** Read when the user cancels a drag with Escape. */\n\tannounceDragCancel: string;\n\t/** Aria label on the drag handle. */\n\tdragHandleAria: string;\n\t/** Aria label on the board landmark. */\n\tboardAria: string;\n\t/** Aria label on the per-item actions trigger (`⋮`). */\n\titemActionsAria: string;\n}\n\nexport const defaultKanbanStrings: KanbanStrings = {\n\tannounceDragStart: 'Picked up item {name}.',\n\tannounceDragMove: 'Moving {name} from {from} to {to}, position {position}.',\n\tannounceDragEnd: 'Dropped {name} into {to}, position {position}.',\n\tannounceDragCancel: 'Cancelled drag of {name}.',\n\tdragHandleAria: 'Drag handle',\n\tboardAria: 'Kanban board',\n\titemActionsAria: 'Item actions',\n};\n\nexport function interpolateKanbanString(\n\ttemplate: string,\n\tparams: Record<string, string>,\n): string {\n\treturn Object.entries(params).reduce(\n\t\t(acc, [key, value]) => acc.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value),\n\t\ttemplate,\n\t);\n}\n","/**\n * Kanban — drag-and-drop board with multi-column item sorting and\n * cross-column moves. Headless behavior comes from `@dnd-kit/core` +\n * `@dnd-kit/sortable`; the library wires it into a callback-driven,\n * generic-T API:\n *\n * <Kanban\n * value={columns}\n * onValueChange={setColumns}\n * getItemValue={(c) => c.id}\n * onItemMove={(e) => api.persistMove(e)}\n * >\n * <KanbanBoard className=\"grid grid-cols-3 gap-3\">\n * {Object.entries(columns).map(([colId, items]) => (\n * <KanbanColumn key={colId} value={colId}>\n * <header>{COLUMNS[colId].title}</header>\n * <KanbanColumnContent value={colId}>\n * {items.map((card) => (\n * <KanbanItem key={card.id} value={card.id}>\n * …card body…\n * </KanbanItem>\n * ))}\n * </KanbanColumnContent>\n * </KanbanColumn>\n * ))}\n * </KanbanBoard>\n * <KanbanOverlay />\n * </Kanban>\n *\n * The library never reaches into a router, never persists state — your\n * `onValueChange` is the source of truth. Use `onItemMove` for\n * analytics / optimistic-update plumbing.\n */\nimport {\n\tDndContext,\n\tDragOverlay,\n\tPointerSensor,\n\tKeyboardSensor,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors,\n\ttype DragEndEvent,\n\ttype DragStartEvent,\n} from '@dnd-kit/core';\nimport {\n\tSortableContext,\n\tuseSortable,\n\tverticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { MoreHorizontal } from 'lucide-react';\nimport { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type MouseEvent } from 'react';\n\nimport { Button } from '../../base/buttons';\nimport { ActionMenu, type ActionMenuAction } from '../../base/action-menu';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { createKanbanKeyboardCoordinates, type KanbanKeyboardPosition } from './kanban-keyboard';\nimport { useKanban } from './hooks/use-kanban';\nimport {\n\tKanbanContextProvider,\n\tKanbanItemContextProvider,\n\tuseKanbanContext,\n\tuseKanbanItemContext,\n} from './kanban-context';\nimport { defaultKanbanStrings, interpolateKanbanString } from './kanban.strings';\nimport type {\n\tKanbanBoardProps,\n\tKanbanColumnContentProps,\n\tKanbanColumnProps,\n\tKanbanItemAction,\n\tKanbanItemActionsConfig,\n\tKanbanItemActionsProps,\n\tKanbanItemHandleProps,\n\tKanbanItemProps,\n\tKanbanOverlayProps,\n\tKanbanProps,\n} from './kanban.types';\n\nexport function Kanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tgetItemLabel,\n\tgetColumnLabel,\n\tonItemMove,\n\titemActions,\n\tonItemClick,\n\tstrings: stringsProp,\n\tclassName,\n\tchildren,\n}: KanbanProps<T>) {\n\tconst strings = useStrings(defaultKanbanStrings, stringsProp);\n\tconst { findItem, move } = useKanban({\n\t\tvalue,\n\t\tonValueChange,\n\t\tgetItemValue,\n\t\tonItemMove,\n\t});\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst boardRef = useRef<HTMLDivElement | null>(null);\n\tconst keyboardFocusId = useRef<string | null>(null);\n\tuseLayoutEffect(() => {\n\t\tif (activeId || !keyboardFocusId.current) return;\n\t\tconst item = Array.from(boardRef.current?.querySelectorAll<HTMLElement>('[data-kanban-item-id]') ?? []).find(node => node.dataset.kanbanItemId === keyboardFocusId.current);\n\t\tconst handle = item?.querySelector<HTMLElement>('[data-slot=\"kanban-item-handle\"]') ?? item;\n\t\tif (handle) { handle.focus(); keyboardFocusId.current = null; }\n\t}, [activeId, value]);\n\tconst dragOrigin = useRef<{ columnId: string; index: number; name: string } | null>(null);\n\tconst completedDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst [keyboardPosition, setKeyboardPosition] = useState<KanbanKeyboardPosition | null>(null);\n\tconst keyboardDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst keyboardCoordinates = useMemo(() => createKanbanKeyboardCoordinates(\n\t\tvalue, getItemValue as (item: unknown) => string, findItem, keyboardDestination, setKeyboardPosition,\n\t), [value, getItemValue, findItem]);\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n\t\tuseSensor(KeyboardSensor, { coordinateGetter: keyboardCoordinates }),\n\t);\n\n\tconst activeItem = useMemo(\n\t\t() => (activeId ? findItem(activeId)?.item ?? null : null),\n\t\t[activeId, findItem],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(event: DragStartEvent) => {\n\t\t\tconst item = findItem(String(event.active.id));\n\t\t\tdragOrigin.current = item ? { columnId: item.columnId, index: item.index, name: getItemLabel?.(item.item) ?? String(event.active.id) } : null;\n\t\t\tcompletedDestination.current = null;\n\t\t\tsetKeyboardPosition(null);\n\t\t\tkeyboardDestination.current = null;\n\t\t\tkeyboardFocusId.current = event.activatorEvent instanceof KeyboardEvent ? String(event.active.id) : null;\n\t\t\tsetActiveId(String(event.active.id));\n\t\t},\n\t\t[findItem, getItemLabel],\n\t);\n\n\tconst handleDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tsetActiveId(null);\n\t\t\tsetKeyboardPosition(null);\n\t\t\tconst { active, over } = event;\n\t\t\tconst destination = keyboardDestination.current;\n\t\t\tcompletedDestination.current = destination;\n\t\t\tkeyboardDestination.current = null;\n\t\t\tif (destination) {\n\t\t\t\tconst source = findItem(String(active.id));\n\t\t\t\tconst toIndex = source?.columnId === destination.columnId && source.index < destination.index ? destination.index + 1 : destination.index;\n\t\t\t\tmove({ itemId: String(active.id), toColumnId: destination.columnId, toIndex });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!over) return;\n\t\t\tconst activeData = active.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overData = over.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overId = String(over.id);\n\n\t\t\t// Dropping on a column container (not a sortable item) → append.\n\t\t\tconst targetColumnId =\n\t\t\t\toverData?.columnId ?? (Object.prototype.hasOwnProperty.call(value, overId) ? overId : undefined);\n\t\t\tif (!targetColumnId) return;\n\n\t\t\tconst toIndex =\n\t\t\t\toverData?.columnId !== undefined ? overData.index : value[targetColumnId].length;\n\n\t\t\tmove({\n\t\t\t\titemId: String(active.id),\n\t\t\t\ttoColumnId: targetColumnId,\n\t\t\t\ttoIndex,\n\t\t\t});\n\t\t\tvoid activeData;\n\t\t},\n\t\t[move, value, findItem],\n\t);\n\n\tconst ctxValue = useMemo(\n\t\t() => ({\n\t\t\tvalue: value as Record<string, unknown[]>,\n\t\t\tonValueChange: onValueChange as (next: Record<string, unknown[]>) => void,\n\t\t\tgetItemValue: getItemValue as (item: unknown) => string,\n\t\t\tactiveId,\n\t\t\tactiveItem: activeItem as unknown,\n\t\t\tfindItem: findItem as (id: string) => { columnId: string; index: number; item: unknown } | undefined,\n\t\t\titemActions: itemActions as KanbanItemActionsConfig<unknown> | undefined,\n\t\t\tonItemClick: onItemClick as ((item: unknown) => void) | undefined,\n\t\t}),\n\t\t[value, onValueChange, getItemValue, activeId, activeItem, findItem, itemActions, onItemClick],\n\t);\n\n\tconst announcementParams = (itemId: string, overId?: string) => {\n\t\tconst item = findItem(itemId);\n\t\tconst origin = dragOrigin.current;\n\t\tconst over = overId ? findItem(overId) : undefined;\n\t\tconst position = keyboardDestination.current ?? completedDestination.current ?? over ?? (overId && value[overId] ? { columnId: overId, index: value[overId].length } : origin);\n\t\tconst columnName = (id?: string) => id ? getColumnLabel?.(id) ?? id : '';\n\t\treturn {\n\t\t\tname: origin?.name ?? (item ? getItemLabel?.(item.item) ?? itemId : itemId),\n\t\t\tfrom: columnName(origin?.columnId),\n\t\t\tto: columnName(position?.columnId),\n\t\t\tposition: String((position?.index ?? 0) + 1),\n\t\t};\n\t};\n\treturn (\n\t\t<KanbanContextProvider value={ctxValue}>\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\tonDragCancel={() => { keyboardDestination.current = null; setKeyboardPosition(null); setActiveId(null); }}\n\t\t\t\taccessibility={{\n\t\t\t\t\tannouncements: {\n\t\t\t\t\t\tonDragStart({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragStart, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragMove({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragOver({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragEnd({ active, over }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragEnd, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragCancel({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragCancel, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tref={boardRef}\n\t\t\t\t\trole=\"application\"\n\t\t\t\t\taria-label={strings.boardAria}\n\t\t\t\t\tclassName={cn('kanban--component', 'w-full', className)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t<div className=\"kanban--keyboard-announcement sr-only\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">\n\t\t\t\t\t\t<Text tag=\"span\">{activeId && keyboardPosition ? interpolateKanbanString(strings.announceDragMove, announcementParams(activeId)) : ''}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DndContext>\n\t\t</KanbanContextProvider>\n\t);\n}\n\nKanban.displayName = 'Kanban';\n\nexport function KanbanBoard({ className, style, children }: KanbanBoardProps) {\n\treturn (\n\t\t<div className={cn('grid w-full gap-space-lg', className)} style={style}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanBoard.displayName = 'KanbanBoard';\n\nexport function KanbanColumn({ value, className, children }: KanbanColumnProps) {\n\tconst { setNodeRef, isOver } = useDroppable({ id: value });\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tdata-slot=\"kanban-column\"\n\t\t\tdata-column-id={value}\n\t\t\tdata-over={isOver ? 'true' : undefined}\n\t\t\tclassName={cn('flex min-w-0 flex-col', className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanColumn.displayName = 'KanbanColumn';\n\nexport function KanbanColumnContent({\n\tvalue,\n\tclassName,\n\tchildren,\n}: KanbanColumnContentProps) {\n\tconst ctx = useKanbanContext();\n\tconst items = ctx.value[value] ?? [];\n\tconst ids = items.map((item) => ctx.getItemValue(item));\n\treturn (\n\t\t<SortableContext items={ids} strategy={verticalListSortingStrategy}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"kanban-column-content\"\n\t\t\t\tclassName={cn('flex flex-col gap-space-md', className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</SortableContext>\n\t);\n}\n\nKanbanColumnContent.displayName = 'KanbanColumnContent';\n\nexport function KanbanItem({\n\tvalue,\n\tclassName,\n\tdisabled = false,\n\tonClick,\n\tchildren,\n}: KanbanItemProps) {\n\tconst ctx = useKanbanContext();\n\tconst found = ctx.findItem(value);\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\tsetActivatorNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t} = useSortable({\n\t\tid: value,\n\t\tdisabled,\n\t\tdata: { columnId: found?.columnId, index: found?.index },\n\t});\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : undefined,\n\t};\n\tconst [handleCount, setHandleCount] = useState(0);\n\tconst hasHandle = handleCount > 0;\n\tconst registerHandle = useCallback(() => {\n\t\tsetHandleCount((count) => count + 1);\n\t\treturn () => setHandleCount((count) => Math.max(0, count - 1));\n\t}, []);\n\n\tconst itemCtx = useMemo(\n\t\t() => ({\n\t\t\tlisteners,\n\t\t\tattributes,\n\t\t\tsetActivatorNodeRef,\n\t\t\tregisterHandle,\n\t\t\titemId: value,\n\t\t\titem: found?.item ?? null,\n\t\t}),\n\t\t[listeners, attributes, setActivatorNodeRef, registerHandle, value, found?.item],\n\t);\n\n\tconst rootClick = ctx.onItemClick;\n\tconst handleClick = useCallback(\n\t\t(event: MouseEvent<HTMLDivElement>) => {\n\t\t\t// `<KanbanItemHandle>` and `<KanbanItemActions>` mark themselves\n\t\t\t// with `data-stop-item-click` so a click on the drag handle or\n\t\t\t// the actions menu doesn't bubble up as a card click.\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (target?.closest('[data-stop-item-click]')) return;\n\t\t\tif (onClick) {\n\t\t\t\tonClick();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rootClick && found?.item !== undefined) {\n\t\t\t\trootClick(found.item);\n\t\t\t}\n\t\t},\n\t\t[onClick, rootClick, found?.item],\n\t);\n\n\tconst isClickable = Boolean(onClick || rootClick);\n\n\t// When no <KanbanItemHandle> is used, the whole row is the activator.\n\t// We attach listeners + attributes here as the default — KanbanItemHandle\n\t// can then override by wiring them to a more specific element.\n\treturn (\n\t\t<KanbanItemContextProvider value={itemCtx}>\n\t\t\t<div\n\t\t\t\tref={setNodeRef}\n\t\t\t\tstyle={style}\n\t\t\t\tdata-slot=\"kanban-item\"\n\t\t\t\tdata-kanban-item-id={value}\n\t\t\t\tdata-dragging={isDragging ? 'true' : undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'touch-none select-none',\n\t\t\t\t\tisClickable && 'cursor-pointer',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={isClickable ? handleClick : undefined}\n\t\t\t\t{...(!hasHandle ? attributes : {})}\n\t\t\t\t{...(!hasHandle ? listeners : {})}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</KanbanItemContextProvider>\n\t);\n}\n\nKanbanItem.displayName = 'KanbanItem';\n\nexport const KanbanItemHandle = forwardRef<HTMLButtonElement, KanbanItemHandleProps>(function KanbanItemHandle({ className, children }, forwardedRef) {\n\tconst { setActivatorNodeRef, listeners, attributes, registerHandle } = useKanbanItemContext();\n\tuseEffect(() => registerHandle(), [registerHandle]);\n\t// Merge dnd-kit's activator ref with the consumer's forwarded ref so a\n\t// `<Tooltip><KanbanItemHandle ref={…}/></Tooltip>` wiring still gets a\n\t// real ref to the button element.\n\tconst setMergedRef = useCallback(\n\t\t(node: HTMLButtonElement | null) => {\n\t\t\tsetActivatorNodeRef(node);\n\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\tforwardedRef(node);\n\t\t\t} else if (forwardedRef) {\n\t\t\t\tforwardedRef.current = node;\n\t\t\t}\n\t\t},\n\t\t[setActivatorNodeRef, forwardedRef],\n\t);\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\" iconOnly\n\t\t\tref={setMergedRef}\n\t\t\tdata-slot=\"kanban-item-handle\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tclassName={cn(\n\t\t\t\t'cursor-grab rounded-radius-sm shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50 active:cursor-grabbing',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...(attributes as Record<string, unknown>)}\n\t\t\t{...(listeners as Record<string, unknown>)}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n});\n\nKanbanItemHandle.displayName = 'KanbanItemHandle';\n\n/**\n * Per-item actions menu (`⋮` trigger → popover with the actions\n * registered at the `<Kanban itemActions>` root). Place inside any\n * `<KanbanItem>` — typically in the card's top-right corner.\n *\n * The trigger marks itself with `data-stop-item-click` so opening the\n * menu doesn't fire the parent `onItemClick` callback.\n */\nexport function KanbanItemActions<T = unknown>({\n\tclassName,\n\ticon,\n\tariaLabel,\n}: KanbanItemActionsProps) {\n\tconst ctx = useKanbanContext<T>();\n\tconst itemCtx = useKanbanItemContext<T>();\n\tconst strings = useStrings(defaultKanbanStrings, undefined);\n\n\tconst item = itemCtx.item;\n\tconst rawActions = ctx.itemActions;\n\tconst actions = useMemo<ReadonlyArray<\n\t\tOmit<KanbanItemAction<T>, 'visible' | 'disabled'> & {\n\t\t\tvisible: boolean;\n\t\t\tdisabled: boolean;\n\t\t}\n\t>>(() => {\n\t\tif (!rawActions || item === null || item === undefined) return [];\n\t\tconst list = typeof rawActions === 'function' ? rawActions(item) : rawActions;\n\t\treturn list.flatMap((action) => {\n\t\t\tconst visible = typeof action.visible === 'function'\n\t\t\t\t? action.visible(item)\n\t\t\t\t: action.visible ?? true;\n\t\t\tif (!visible) return [];\n\t\t\tconst disabled = typeof action.disabled === 'function'\n\t\t\t\t? action.disabled(item)\n\t\t\t\t: action.disabled ?? false;\n\t\t\treturn [{ ...action, visible, disabled }];\n\t\t});\n\t}, [rawActions, item]);\n\n\tif (item === null || actions.length === 0) return null;\n\n\tconst menuActions: ActionMenuAction[] = actions.map((action) => ({\n\t\tid: action.id,\n\t\tlabel: action.label,\n\t\ticon: action.icon,\n\t\tdisabled: action.disabled,\n\t\ttone: action.tone,\n\t\tbuttonStyle: action.buttonStyle,\n\t\tonClick: () => action.onClick(item),\n\t}));\n\n\treturn (\n\t\t<span\n\t\t\tclassName=\"kanban-item-actions--component inline-flex\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tonPointerDown={(event) => event.stopPropagation()}\n\t\t>\n\t\t\t<ActionMenu\n\t\t\t\tactions={menuActions}\n\t\t\t\ticon={icon ?? MoreHorizontal}\n\t\t\t\tsrText={ariaLabel ?? strings.itemActionsAria}\n\t\t\t\twidth=\"w-44\"\n\t\t\t\talign=\"end\"\n\t\t\t\tdensity=\"table\"\n\t\t\t\tbuttonProps={{\n\t\t\t\t\tsize: 'sm',\n\t\t\t\t\ticonOnly: true,\n\t\t\t\t\tclassName: cn(\n\t\t\t\t\t\t'size-action-xs rounded-radius-md p-0',\n\t\t\t\t\t\t'text-muted-foreground/70 hover:bg-muted hover:text-foreground',\n\t\t\t\t\t\t'transition-colors',\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t),\n\t\t\t\t\t'data-slot': 'kanban-item-actions-trigger',\n\t\t\t\t\t'data-stop-item-click': true,\n\t\t\t\t\t'aria-label': ariaLabel ?? strings.itemActionsAria,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nKanbanItemActions.displayName = 'KanbanItemActions';\n\nexport function KanbanOverlay<T = unknown>({ className, render }: KanbanOverlayProps<T>) {\n\tconst { activeItem, activeId, findItem } = useKanbanContext<T>();\n\treturn (\n\t\t<DragOverlay>\n\t\t\t{activeId\n\t\t\t\t? render\n\t\t\t\t\t? render({\n\t\t\t\t\t\t\titem: activeItem,\n\t\t\t\t\t\t\tcolumnId: findItem(activeId)?.columnId ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'pointer-events-none rounded-radius-md border-2 border-dashed border-primary/40 bg-primary/5 p-3 shadow-lg',\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-primary-accent/80\">{activeId}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t: null}\n\t\t</DragOverlay>\n\t);\n}\n\nKanbanOverlay.displayName = 'KanbanOverlay';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kanban.js","names":["Text","Button","ActionMenu","getKanbanKeyboardPosition","ids","columns","columnIndex","position","key","nextId","createKanbanKeyboardCoordinates","event","active","context","destination","findItem","next","value","onPositionChange","item","id","getItemValue","rect","activeRect","currentCoordinates","useKanban","useCallback","columnId","items","index","move","found","itemId","toColumnId","fromColumnId","fromIndex","targetItems","resolvedToIndex","toIndex","sourceCopy","targetCopy","landingIndex","onValueChange","onItemMove","useMemo","KanbanContext","createContext","KanbanContextProvider","useKanbanContext","ctx","useContext","KanbanItemContext","KanbanItemContextProvider","useKanbanItemContext","defaultKanbanStrings","interpolateKanbanString","params","acc","template","Kanban","stringsProp","strings","useStrings","activeId","setActiveId","useState","boardRef","useRef","keyboardFocusId","node","handle","dragOrigin","completedDestination","keyboardPosition","setKeyboardPosition","keyboardDestination","keyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","activeItem","handleDragStart","getItemLabel","handleDragEnd","source","over","overData","overId","targetColumnId","ctxValue","itemActions","onItemClick","announcementParams","origin","columnName","getColumnLabel","DndContext","cn","className","children","KanbanBoard","KanbanColumn","useDroppable","setNodeRef","isOver","KanbanColumnContent","SortableContext","verticalListSortingStrategy","KanbanItem","useSortable","style","CSS","transform","isDragging","handleCount","setHandleCount","hasHandle","registerHandle","count","itemCtx","listeners","attributes","setActivatorNodeRef","rootClick","handleClick","onClick","isClickable","KanbanItemHandle","forwardRef","setMergedRef","forwardedRef","KanbanItemActions","rawActions","actions","visible","action","disabled","menuActions","icon","MoreHorizontal","ariaLabel","KanbanOverlay","DragOverlay","render"],"sources":["../../src/components/features/kanban/kanban-keyboard.ts","../../src/components/features/kanban/hooks/use-kanban.ts","../../src/components/features/kanban/kanban-context.tsx","../../src/components/features/kanban/kanban.strings.ts","../../src/components/features/kanban/kanban.tsx"],"sourcesContent":["import type { KeyboardCoordinateGetter } from '@dnd-kit/core';\n\nexport interface KanbanKeyboardPosition { columnId: string; index: number }\n\n/** Resolve arrow movement from board order, including columns with no cards. */\nexport function getKanbanKeyboardPosition(\n\tcolumns: Record<string, unknown[]>,\n\tposition: KanbanKeyboardPosition,\n\tkey: string,\n): KanbanKeyboardPosition {\n\tconst ids = Object.keys(columns);\n\tconst columnIndex = ids.indexOf(position.columnId);\n\tif (key === 'ArrowLeft' || key === 'ArrowRight') {\n\t\tconst nextId = ids[columnIndex + (key === 'ArrowRight' ? 1 : -1)];\n\t\treturn nextId ? { columnId: nextId, index: Math.min(position.index, columns[nextId].length) } : position;\n\t}\n\tif (key === 'ArrowUp' || key === 'ArrowDown') {\n\t\treturn { columnId: position.columnId, index: Math.max(0, Math.min(columns[position.columnId].length - 1, position.index + (key === 'ArrowDown' ? 1 : -1))) };\n\t}\n\treturn position;\n}\n\nexport function createKanbanKeyboardCoordinates(\n\tvalue: Record<string, unknown[]>,\n\tgetItemValue: (item: unknown) => string,\n\tfindItem: (id: string) => KanbanKeyboardPosition | undefined,\n\tdestination: { current: KanbanKeyboardPosition | null },\n\tonPositionChange?: (position: KanbanKeyboardPosition) => void,\n): KeyboardCoordinateGetter {\n\treturn (event, { currentCoordinates, context }) => {\n\t\tif (!['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code)) return undefined;\n\t\tconst active = context.active;\n\t\tif (!active) return undefined;\n\t\tconst position = destination.current ?? findItem(String(active.id));\n\t\tif (!position) return undefined;\n\t\tevent.preventDefault();\n\t\tconst next = getKanbanKeyboardPosition(value, position, event.code);\n\t\tdestination.current = next;\n\t\tonPositionChange?.(next);\n\t\tconst item = value[next.columnId][next.index];\n\t\tconst id = item === undefined ? next.columnId : getItemValue(item);\n\t\tconst rect = context.droppableRects.get(id);\n\t\tconst activeRect = context.collisionRect;\n\t\tif (!rect || !activeRect) return currentCoordinates;\n\t\treturn {\n\t\t\tx: currentCoordinates.x + rect.left - activeRect.left,\n\t\t\ty: currentCoordinates.y + rect.top - activeRect.top,\n\t\t};\n\t};\n}\n","import { useCallback, useMemo } from 'react';\n\nimport type { KanbanItemMoveEvent, KanbanValue } from '../kanban.types';\n\n/**\n * Headless hook — exposes the same state machine `<Kanban>` uses\n * internally so consumers can build a fully custom UI against it.\n *\n * const { findItem, move } = useKanban({ value, onValueChange,\n * getItemValue });\n * move({ itemId: 'card-1', toColumnId: 'shipped', toIndex: 0 });\n */\nexport interface UseKanbanOptions<T> {\n\tvalue: KanbanValue<T>;\n\tonValueChange: (next: KanbanValue<T>) => void;\n\tgetItemValue: (item: T) => string;\n\tonItemMove?: (event: KanbanItemMoveEvent<T>) => void;\n}\n\nexport interface UseKanbanResult<T> {\n\tfindItem: (id: string) => { columnId: string; index: number; item: T } | undefined;\n\t/**\n\t * Move an item between columns / within the same column. Idempotent:\n\t * a no-op move is safe.\n\t */\n\tmove: (input: { itemId: string; toColumnId: string; toIndex?: number }) => void;\n}\n\nexport function useKanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tonItemMove,\n}: UseKanbanOptions<T>): UseKanbanResult<T> {\n\tconst findItem = useCallback(\n\t\t(id: string) => {\n\t\t\tfor (const [columnId, items] of Object.entries(value)) {\n\t\t\t\tconst index = items.findIndex((item) => getItemValue(item) === id);\n\t\t\t\tif (index >= 0) return { columnId, index, item: items[index] };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t[value, getItemValue],\n\t);\n\n\tconst move = useCallback(\n\t\t({ itemId, toColumnId, toIndex }: { itemId: string; toColumnId: string; toIndex?: number }) => {\n\t\t\tconst found = findItem(itemId);\n\t\t\tif (!found) return;\n\t\t\tif (!Object.prototype.hasOwnProperty.call(value, toColumnId)) return;\n\n\t\t\tconst { columnId: fromColumnId, index: fromIndex, item } = found;\n\n\t\t\t// Same column, same slot — nothing to do.\n\t\t\tconst targetItems = value[toColumnId];\n\t\t\tconst resolvedToIndex =\n\t\t\t\ttoIndex === undefined\n\t\t\t\t\t? targetItems.length\n\t\t\t\t\t: Math.max(0, Math.min(toIndex, targetItems.length));\n\n\t\t\tif (fromColumnId === toColumnId && fromIndex === resolvedToIndex) return;\n\n\t\t\tconst next: KanbanValue<T> = { ...value };\n\t\t\tconst sourceCopy = [...next[fromColumnId]];\n\t\t\tsourceCopy.splice(fromIndex, 1);\n\t\t\tnext[fromColumnId] = sourceCopy;\n\n\t\t\tconst targetCopy = [...(fromColumnId === toColumnId ? sourceCopy : next[toColumnId])];\n\t\t\t// When moving within the same column to a later index, the splice\n\t\t\t// above shifted everything left — re-resolve the destination.\n\t\t\tlet landingIndex = resolvedToIndex;\n\t\t\tif (fromColumnId === toColumnId && fromIndex < resolvedToIndex) {\n\t\t\t\tlandingIndex = Math.max(0, resolvedToIndex - 1);\n\t\t\t}\n\t\t\ttargetCopy.splice(landingIndex, 0, item);\n\t\t\tnext[toColumnId] = targetCopy;\n\n\t\t\tonValueChange(next);\n\t\t\tonItemMove?.({\n\t\t\t\titem,\n\t\t\t\titemId,\n\t\t\t\tfrom: { columnId: fromColumnId, index: fromIndex },\n\t\t\t\tto: { columnId: toColumnId, index: landingIndex },\n\t\t\t});\n\t\t},\n\t\t[value, findItem, onValueChange, onItemMove],\n\t);\n\n\treturn useMemo(() => ({ findItem, move }), [findItem, move]);\n}\n","import { createContext, useContext } from 'react';\n\nimport type { KanbanContextShape } from './kanban.types';\n\n/**\n * Internal context for the Kanban — the parts use this to read\n * shared state (current value, getItemValue, active drag id).\n */\nconst KanbanContext = createContext<KanbanContextShape | null>(null);\n\nexport const KanbanContextProvider = KanbanContext.Provider;\n\nexport function useKanbanContext<T = unknown>(): KanbanContextShape<T> {\n\tconst ctx = useContext(KanbanContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'Kanban subcomponents must be rendered inside a <Kanban> root.',\n\t\t);\n\t}\n\treturn ctx as unknown as KanbanContextShape<T>;\n}\n\n/**\n * Internal context exposed by `<KanbanItem>` so the optional\n * `<KanbanItemHandle>` knows which listeners + accessibility props to\n * wire to the dedicated drag handle. Also carries the resolved\n * domain item so `<KanbanItemActions>` (and any other item-aware\n * subcomponent) can render per-item content without prop drilling.\n *\n * The dnd-kit shapes are widened to `unknown` so consumers can spread\n * them onto any HTMLElement.\n */\nexport interface KanbanItemContextShape<T = unknown> {\n\tlisteners: unknown;\n\tattributes: unknown;\n\tsetActivatorNodeRef: (node: HTMLElement | null) => void;\n\tregisterHandle: () => () => void;\n\t/** Stable id (the value returned by `getItemValue`). */\n\titemId: string;\n\t/** The domain item itself — null if it can't be resolved. */\n\titem: T | null;\n}\n\nconst KanbanItemContext = createContext<KanbanItemContextShape | null>(null);\n\nexport const KanbanItemContextProvider = KanbanItemContext.Provider;\n\nexport function useKanbanItemContext<T = unknown>(): KanbanItemContextShape<T> {\n\tconst ctx = useContext(KanbanItemContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'<KanbanItemHandle> / <KanbanItemActions> must be rendered inside a <KanbanItem>.',\n\t\t);\n\t}\n\treturn ctx as KanbanItemContextShape<T>;\n}\n","/**\n * Strings for the Kanban — drag-and-drop screen-reader announcements\n * + accessibility labels. The library never renders user-visible copy\n * that the consumer hasn't already supplied via column headers / item\n * children, so the strings here are exclusively for assistive tech.\n */\nexport interface KanbanStrings {\n\t/** Read by screen readers when a drag begins. `{name}` = item label (or ID). */\n\tannounceDragStart: string;\n\t/** Read when an item moves over a column. `{from}` / `{to}` are column labels; `{position}` is one-based. */\n\tannounceDragMove: string;\n\t/** Read when an item is dropped into a column. */\n\tannounceDragEnd: string;\n\t/** Read when the user cancels a drag with Escape. */\n\tannounceDragCancel: string;\n\t/** Aria label on the drag handle. */\n\tdragHandleAria: string;\n\t/** Aria label on the board landmark. */\n\tboardAria: string;\n\t/** Aria label on the per-item actions trigger (`⋮`). */\n\titemActionsAria: string;\n}\n\nexport const defaultKanbanStrings: KanbanStrings = {\n\tannounceDragStart: 'Picked up item {name}.',\n\tannounceDragMove: 'Moving {name} from {from} to {to}, position {position}.',\n\tannounceDragEnd: 'Dropped {name} into {to}, position {position}.',\n\tannounceDragCancel: 'Cancelled drag of {name}.',\n\tdragHandleAria: 'Drag handle',\n\tboardAria: 'Kanban board',\n\titemActionsAria: 'Item actions',\n};\n\nexport function interpolateKanbanString(\n\ttemplate: string,\n\tparams: Record<string, string>,\n): string {\n\treturn Object.entries(params).reduce(\n\t\t(acc, [key, value]) => acc.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value),\n\t\ttemplate,\n\t);\n}\n","/**\n * Kanban — drag-and-drop board with multi-column item sorting and\n * cross-column moves. Headless behavior comes from `@dnd-kit/core` +\n * `@dnd-kit/sortable`; the library wires it into a callback-driven,\n * generic-T API:\n *\n * <Kanban\n * value={columns}\n * onValueChange={setColumns}\n * getItemValue={(c) => c.id}\n * onItemMove={(e) => api.persistMove(e)}\n * >\n * <KanbanBoard className=\"grid grid-cols-3 gap-3\">\n * {Object.entries(columns).map(([colId, items]) => (\n * <KanbanColumn key={colId} value={colId}>\n * <header>{COLUMNS[colId].title}</header>\n * <KanbanColumnContent value={colId}>\n * {items.map((card) => (\n * <KanbanItem key={card.id} value={card.id}>\n * …card body…\n * </KanbanItem>\n * ))}\n * </KanbanColumnContent>\n * </KanbanColumn>\n * ))}\n * </KanbanBoard>\n * <KanbanOverlay />\n * </Kanban>\n *\n * The library never reaches into a router, never persists state — your\n * `onValueChange` is the source of truth. Use `onItemMove` for\n * analytics / optimistic-update plumbing.\n */\nimport {\n\tDndContext,\n\tDragOverlay,\n\tPointerSensor,\n\tKeyboardSensor,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors,\n\ttype DragEndEvent,\n\ttype DragStartEvent,\n} from '@dnd-kit/core';\nimport {\n\tSortableContext,\n\tuseSortable,\n\tverticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { MoreHorizontal } from 'lucide-react';\nimport { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type MouseEvent } from 'react';\n\nimport { Button } from '../../base/buttons';\nimport { ActionMenu, type ActionMenuAction } from '../../base/action-menu';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { createKanbanKeyboardCoordinates, type KanbanKeyboardPosition } from './kanban-keyboard';\nimport { useKanban } from './hooks/use-kanban';\nimport {\n\tKanbanContextProvider,\n\tKanbanItemContextProvider,\n\tuseKanbanContext,\n\tuseKanbanItemContext,\n} from './kanban-context';\nimport { defaultKanbanStrings, interpolateKanbanString } from './kanban.strings';\nimport type {\n\tKanbanBoardProps,\n\tKanbanColumnContentProps,\n\tKanbanColumnProps,\n\tKanbanItemAction,\n\tKanbanItemActionsConfig,\n\tKanbanItemActionsProps,\n\tKanbanItemHandleProps,\n\tKanbanItemProps,\n\tKanbanOverlayProps,\n\tKanbanProps,\n} from './kanban.types';\n\nexport function Kanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tgetItemLabel,\n\tgetColumnLabel,\n\tonItemMove,\n\titemActions,\n\tonItemClick,\n\tstrings: stringsProp,\n\tclassName,\n\tchildren,\n}: KanbanProps<T>) {\n\tconst strings = useStrings(defaultKanbanStrings, stringsProp);\n\tconst { findItem, move } = useKanban({\n\t\tvalue,\n\t\tonValueChange,\n\t\tgetItemValue,\n\t\tonItemMove,\n\t});\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst boardRef = useRef<HTMLDivElement | null>(null);\n\tconst keyboardFocusId = useRef<string | null>(null);\n\tuseLayoutEffect(() => {\n\t\tif (activeId || !keyboardFocusId.current) return;\n\t\tconst item = Array.from(boardRef.current?.querySelectorAll<HTMLElement>('[data-kanban-item-id]') ?? []).find(node => node.dataset.kanbanItemId === keyboardFocusId.current);\n\t\tconst handle = item?.querySelector<HTMLElement>('[data-slot=\"kanban-item-handle\"]') ?? item;\n\t\tif (handle) { handle.focus(); keyboardFocusId.current = null; }\n\t}, [activeId, value]);\n\tconst dragOrigin = useRef<{ columnId: string; index: number; name: string } | null>(null);\n\tconst completedDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst [keyboardPosition, setKeyboardPosition] = useState<KanbanKeyboardPosition | null>(null);\n\tconst keyboardDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst keyboardCoordinates = useMemo(() => createKanbanKeyboardCoordinates(\n\t\tvalue, getItemValue as (item: unknown) => string, findItem, keyboardDestination, setKeyboardPosition,\n\t), [value, getItemValue, findItem]);\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n\t\tuseSensor(KeyboardSensor, { coordinateGetter: keyboardCoordinates }),\n\t);\n\n\tconst activeItem = useMemo(\n\t\t() => (activeId ? findItem(activeId)?.item ?? null : null),\n\t\t[activeId, findItem],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(event: DragStartEvent) => {\n\t\t\tconst item = findItem(String(event.active.id));\n\t\t\tdragOrigin.current = item ? { columnId: item.columnId, index: item.index, name: getItemLabel?.(item.item) ?? String(event.active.id) } : null;\n\t\t\tcompletedDestination.current = null;\n\t\t\tsetKeyboardPosition(null);\n\t\t\tkeyboardDestination.current = null;\n\t\t\tkeyboardFocusId.current = event.activatorEvent instanceof KeyboardEvent ? String(event.active.id) : null;\n\t\t\tsetActiveId(String(event.active.id));\n\t\t},\n\t\t[findItem, getItemLabel],\n\t);\n\n\tconst handleDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tsetActiveId(null);\n\t\t\tsetKeyboardPosition(null);\n\t\t\tconst { active, over } = event;\n\t\t\tconst destination = keyboardDestination.current;\n\t\t\tcompletedDestination.current = destination;\n\t\t\tkeyboardDestination.current = null;\n\t\t\tif (destination) {\n\t\t\t\tconst source = findItem(String(active.id));\n\t\t\t\tconst toIndex = source?.columnId === destination.columnId && source.index < destination.index ? destination.index + 1 : destination.index;\n\t\t\t\tmove({ itemId: String(active.id), toColumnId: destination.columnId, toIndex });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!over) return;\n\t\t\tconst activeData = active.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overData = over.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overId = String(over.id);\n\n\t\t\t// Dropping on a column container (not a sortable item) → append.\n\t\t\tconst targetColumnId =\n\t\t\t\toverData?.columnId ?? (Object.prototype.hasOwnProperty.call(value, overId) ? overId : undefined);\n\t\t\tif (!targetColumnId) return;\n\n\t\t\tconst toIndex =\n\t\t\t\toverData?.columnId !== undefined ? overData.index : value[targetColumnId].length;\n\n\t\t\tmove({\n\t\t\t\titemId: String(active.id),\n\t\t\t\ttoColumnId: targetColumnId,\n\t\t\t\ttoIndex,\n\t\t\t});\n\t\t\tvoid activeData;\n\t\t},\n\t\t[move, value, findItem],\n\t);\n\n\tconst ctxValue = useMemo(\n\t\t() => ({\n\t\t\tvalue: value as Record<string, unknown[]>,\n\t\t\tonValueChange: onValueChange as (next: Record<string, unknown[]>) => void,\n\t\t\tgetItemValue: getItemValue as (item: unknown) => string,\n\t\t\tactiveId,\n\t\t\tactiveItem: activeItem as unknown,\n\t\t\tfindItem: findItem as (id: string) => { columnId: string; index: number; item: unknown } | undefined,\n\t\t\titemActions: itemActions as KanbanItemActionsConfig<unknown> | undefined,\n\t\t\tonItemClick: onItemClick as ((item: unknown) => void) | undefined,\n\t\t}),\n\t\t[value, onValueChange, getItemValue, activeId, activeItem, findItem, itemActions, onItemClick],\n\t);\n\n\tconst announcementParams = (itemId: string, overId?: string) => {\n\t\tconst item = findItem(itemId);\n\t\tconst origin = dragOrigin.current;\n\t\tconst over = overId ? findItem(overId) : undefined;\n\t\tconst position = keyboardDestination.current ?? completedDestination.current ?? over ?? (overId && value[overId] ? { columnId: overId, index: value[overId].length } : origin);\n\t\tconst columnName = (id?: string) => id ? getColumnLabel?.(id) ?? id : '';\n\t\treturn {\n\t\t\tname: origin?.name ?? (item ? getItemLabel?.(item.item) ?? itemId : itemId),\n\t\t\tfrom: columnName(origin?.columnId),\n\t\t\tto: columnName(position?.columnId),\n\t\t\tposition: String((position?.index ?? 0) + 1),\n\t\t};\n\t};\n\treturn (\n\t\t<KanbanContextProvider value={ctxValue}>\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\tonDragCancel={() => { keyboardDestination.current = null; setKeyboardPosition(null); setActiveId(null); }}\n\t\t\t\taccessibility={{\n\t\t\t\t\tannouncements: {\n\t\t\t\t\t\tonDragStart({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragStart, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragMove({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragOver({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragEnd({ active, over }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragEnd, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragCancel({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragCancel, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tref={boardRef}\n\t\t\t\t\trole=\"application\"\n\t\t\t\t\taria-label={strings.boardAria}\n\t\t\t\t\tclassName={cn('kanban--component', 'w-full', className)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t<div className=\"kanban--keyboard-announcement sr-only\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">\n\t\t\t\t\t\t<Text tag=\"span\">{activeId && keyboardPosition ? interpolateKanbanString(strings.announceDragMove, announcementParams(activeId)) : ''}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DndContext>\n\t\t</KanbanContextProvider>\n\t);\n}\n\nKanban.displayName = 'Kanban';\n\nexport function KanbanBoard({ className, style, children }: KanbanBoardProps) {\n\treturn (\n\t\t<div className={cn('grid w-full gap-space-lg', className)} style={style}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanBoard.displayName = 'KanbanBoard';\n\nexport function KanbanColumn({ value, className, children }: KanbanColumnProps) {\n\tconst { setNodeRef, isOver } = useDroppable({ id: value });\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tdata-slot=\"kanban-column\"\n\t\t\tdata-column-id={value}\n\t\t\tdata-over={isOver ? 'true' : undefined}\n\t\t\tclassName={cn('flex min-w-0 flex-col', className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanColumn.displayName = 'KanbanColumn';\n\nexport function KanbanColumnContent({\n\tvalue,\n\tclassName,\n\tchildren,\n}: KanbanColumnContentProps) {\n\tconst ctx = useKanbanContext();\n\tconst items = ctx.value[value] ?? [];\n\tconst ids = items.map((item) => ctx.getItemValue(item));\n\treturn (\n\t\t<SortableContext items={ids} strategy={verticalListSortingStrategy}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"kanban-column-content\"\n\t\t\t\tclassName={cn('flex flex-col gap-space-md', className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</SortableContext>\n\t);\n}\n\nKanbanColumnContent.displayName = 'KanbanColumnContent';\n\nexport function KanbanItem({\n\tvalue,\n\tclassName,\n\tdisabled = false,\n\tonClick,\n\tchildren,\n}: KanbanItemProps) {\n\tconst ctx = useKanbanContext();\n\tconst found = ctx.findItem(value);\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\tsetActivatorNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t} = useSortable({\n\t\tid: value,\n\t\tdisabled,\n\t\tdata: { columnId: found?.columnId, index: found?.index },\n\t});\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : undefined,\n\t};\n\tconst [handleCount, setHandleCount] = useState(0);\n\tconst hasHandle = handleCount > 0;\n\tconst registerHandle = useCallback(() => {\n\t\tsetHandleCount((count) => count + 1);\n\t\treturn () => setHandleCount((count) => Math.max(0, count - 1));\n\t}, []);\n\n\tconst itemCtx = useMemo(\n\t\t() => ({\n\t\t\tlisteners,\n\t\t\tattributes,\n\t\t\tsetActivatorNodeRef,\n\t\t\tregisterHandle,\n\t\t\titemId: value,\n\t\t\titem: found?.item ?? null,\n\t\t}),\n\t\t[listeners, attributes, setActivatorNodeRef, registerHandle, value, found?.item],\n\t);\n\n\tconst rootClick = ctx.onItemClick;\n\tconst handleClick = useCallback(\n\t\t(event: MouseEvent<HTMLDivElement>) => {\n\t\t\t// `<KanbanItemHandle>` and `<KanbanItemActions>` mark themselves\n\t\t\t// with `data-stop-item-click` so a click on the drag handle or\n\t\t\t// the actions menu doesn't bubble up as a card click.\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (target?.closest('[data-stop-item-click]')) return;\n\t\t\tif (onClick) {\n\t\t\t\tonClick();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rootClick && found?.item !== undefined) {\n\t\t\t\trootClick(found.item);\n\t\t\t}\n\t\t},\n\t\t[onClick, rootClick, found?.item],\n\t);\n\n\tconst isClickable = Boolean(onClick || rootClick);\n\n\t// When no <KanbanItemHandle> is used, the whole row is the activator.\n\t// We attach listeners + attributes here as the default — KanbanItemHandle\n\t// can then override by wiring them to a more specific element.\n\treturn (\n\t\t<KanbanItemContextProvider value={itemCtx}>\n\t\t\t<div\n\t\t\t\tref={setNodeRef}\n\t\t\t\tstyle={style}\n\t\t\t\tdata-slot=\"kanban-item\"\n\t\t\t\tdata-kanban-item-id={value}\n\t\t\t\tdata-dragging={isDragging ? 'true' : undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'touch-none select-none',\n\t\t\t\t\tisClickable && 'cursor-pointer',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={isClickable ? handleClick : undefined}\n\t\t\t\t{...(!hasHandle ? attributes : {})}\n\t\t\t\t{...(!hasHandle ? listeners : {})}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</KanbanItemContextProvider>\n\t);\n}\n\nKanbanItem.displayName = 'KanbanItem';\n\nexport const KanbanItemHandle = forwardRef<HTMLButtonElement, KanbanItemHandleProps>(function KanbanItemHandle({ className, children }, forwardedRef) {\n\tconst { setActivatorNodeRef, listeners, attributes, registerHandle } = useKanbanItemContext();\n\tuseEffect(() => registerHandle(), [registerHandle]);\n\t// Merge dnd-kit's activator ref with the consumer's forwarded ref so a\n\t// `<Tooltip><KanbanItemHandle ref={…}/></Tooltip>` wiring still gets a\n\t// real ref to the button element.\n\tconst setMergedRef = useCallback(\n\t\t(node: HTMLButtonElement | null) => {\n\t\t\tsetActivatorNodeRef(node);\n\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\tforwardedRef(node);\n\t\t\t} else if (forwardedRef) {\n\t\t\t\tforwardedRef.current = node;\n\t\t\t}\n\t\t},\n\t\t[setActivatorNodeRef, forwardedRef],\n\t);\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\" iconOnly\n\t\t\tref={setMergedRef}\n\t\t\tdata-slot=\"kanban-item-handle\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tclassName={cn(\n\t\t\t\t'cursor-grab shadow-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring active:cursor-grabbing',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...(attributes as Record<string, unknown>)}\n\t\t\t{...(listeners as Record<string, unknown>)}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n});\n\nKanbanItemHandle.displayName = 'KanbanItemHandle';\n\n/**\n * Per-item actions menu (`⋮` trigger → popover with the actions\n * registered at the `<Kanban itemActions>` root). Place inside any\n * `<KanbanItem>` — typically in the card's top-right corner.\n *\n * The trigger marks itself with `data-stop-item-click` so opening the\n * menu doesn't fire the parent `onItemClick` callback.\n */\nexport function KanbanItemActions<T = unknown>({\n\tclassName,\n\ticon,\n\tariaLabel,\n}: KanbanItemActionsProps) {\n\tconst ctx = useKanbanContext<T>();\n\tconst itemCtx = useKanbanItemContext<T>();\n\tconst strings = useStrings(defaultKanbanStrings, undefined);\n\n\tconst item = itemCtx.item;\n\tconst rawActions = ctx.itemActions;\n\tconst actions = useMemo<ReadonlyArray<\n\t\tOmit<KanbanItemAction<T>, 'visible' | 'disabled'> & {\n\t\t\tvisible: boolean;\n\t\t\tdisabled: boolean;\n\t\t}\n\t>>(() => {\n\t\tif (!rawActions || item === null || item === undefined) return [];\n\t\tconst list = typeof rawActions === 'function' ? rawActions(item) : rawActions;\n\t\treturn list.flatMap((action) => {\n\t\t\tconst visible = typeof action.visible === 'function'\n\t\t\t\t? action.visible(item)\n\t\t\t\t: action.visible ?? true;\n\t\t\tif (!visible) return [];\n\t\t\tconst disabled = typeof action.disabled === 'function'\n\t\t\t\t? action.disabled(item)\n\t\t\t\t: action.disabled ?? false;\n\t\t\treturn [{ ...action, visible, disabled }];\n\t\t});\n\t}, [rawActions, item]);\n\n\tif (item === null || actions.length === 0) return null;\n\n\tconst menuActions: ActionMenuAction[] = actions.map((action) => ({\n\t\tid: action.id,\n\t\tlabel: action.label,\n\t\ticon: action.icon,\n\t\tdisabled: action.disabled,\n\t\ttone: action.tone,\n\t\tbuttonStyle: action.buttonStyle,\n\t\tonClick: () => action.onClick(item),\n\t}));\n\n\treturn (\n\t\t<span\n\t\t\tclassName=\"kanban-item-actions--component inline-flex\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tonPointerDown={(event) => event.stopPropagation()}\n\t\t>\n\t\t\t<ActionMenu\n\t\t\t\tactions={menuActions}\n\t\t\t\ticon={icon ?? MoreHorizontal}\n\t\t\t\tsrText={ariaLabel ?? strings.itemActionsAria}\n\t\t\t\twidth=\"w-44\"\n\t\t\t\talign=\"end\"\n\t\t\t\tdensity=\"table\"\n\t\t\t\tbuttonProps={{\n\t\t\t\t\tsize: 'sm',\n\t\t\t\t\ticonOnly: true,\n\t\t\t\t\tclassName: cn(\n\n\t\t\t\t\t\t'text-muted-foreground/70 hover:bg-muted hover:text-foreground',\n\t\t\t\t\t\t'transition-colors',\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t),\n\t\t\t\t\t'data-slot': 'kanban-item-actions-trigger',\n\t\t\t\t\t'data-stop-item-click': true,\n\t\t\t\t\t'aria-label': ariaLabel ?? strings.itemActionsAria,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nKanbanItemActions.displayName = 'KanbanItemActions';\n\nexport function KanbanOverlay<T = unknown>({ className, render }: KanbanOverlayProps<T>) {\n\tconst { activeItem, activeId, findItem } = useKanbanContext<T>();\n\treturn (\n\t\t<DragOverlay>\n\t\t\t{activeId\n\t\t\t\t? render\n\t\t\t\t\t? render({\n\t\t\t\t\t\t\titem: activeItem,\n\t\t\t\t\t\t\tcolumnId: findItem(activeId)?.columnId ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'kanban-overlay--component pointer-events-none rounded-radius border-2 border-dashed border-primary/40 bg-primary/5 p-surface shadow-lg',\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-primary-accent/80\">{activeId}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t: null}\n\t\t</DragOverlay>\n\t);\n}\n\nKanbanOverlay.displayName = 'KanbanOverlay';\n"],"mappings":"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"}
|
package/dist/features/map.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useStrings as e } from "../lib/strings.js";
|
|
3
|
-
import { t } from "../utils-
|
|
4
|
-
import { n
|
|
5
|
-
import { a as
|
|
6
|
-
import {
|
|
7
|
-
import { a as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
3
|
+
import { t } from "../utils-BvH9PSmq.js";
|
|
4
|
+
import { n } from "../buttons-D_6KJvEE.js";
|
|
5
|
+
import { a as r } from "../typography-BxQgiZyw.js";
|
|
6
|
+
import { t as i } from "../button-BZDasD04.js";
|
|
7
|
+
import { d as a, g as o, i as s, l as c, n as l, o as u, r as d, t as f, u as p } from "../dropdown-menu-D-boNgGO.js";
|
|
8
|
+
import { a as m, n as h, o as g, r as _, t as v } from "../command-BnmSchli.js";
|
|
9
|
+
import { c as y, o as b, t as x } from "../popover-CghIYdQf.js";
|
|
10
|
+
import { a as S, c as C, o as ee } from "../text-inputs-DsR56TR-.js";
|
|
10
11
|
import { t as w } from "../use-debounce-DZ_1ZBPa.js";
|
|
11
12
|
import * as T from "react";
|
|
12
13
|
import { Suspense as te, createContext as E, lazy as D, useCallback as O, useContext as k, useEffect as A, useRef as j, useState as M, useSyncExternalStore as N } from "react";
|
|
@@ -99,12 +100,12 @@ function ve({ debounceMs: e, query: t, lang: n, limit: r, bbox: i, lat: a, lon:
|
|
|
99
100
|
function ye(e, t) {
|
|
100
101
|
return e.replace(/\{\{\s*(\w+)\s*\}\}/g, (e, n) => t[n] ?? e);
|
|
101
102
|
}
|
|
102
|
-
function be({ debounceMs:
|
|
103
|
+
function be({ debounceMs: n = 300, lang: a, limit: o = 5, bbox: s, lat: c, lon: l, zoom: u, locationBiasScale: d, className: f, value: p, defaultValue: w = "", onValueChange: te, onPlaceSelect: E, onResultsChange: D, searchPlaces: O, onSearchError: k, strings: A, onFocus: j, ...M }) {
|
|
103
104
|
let N = e(he, A), [ne, I] = T.useState(w), [re, ae] = T.useState(""), [oe, R] = T.useState(!1), [z, B] = T.useState(-1), se = T.useId(), ce = T.useRef(null), le = T.useRef(null), de = T.useRef(/* @__PURE__ */ new Map()), fe = p !== void 0, pe = fe ? p : ne, { results: V, isLoading: H, error: U, hasSearched: _e, retry: be } = ve({
|
|
104
105
|
query: re,
|
|
105
106
|
searchPlaces: O,
|
|
106
107
|
onSearchError: k,
|
|
107
|
-
debounceMs:
|
|
108
|
+
debounceMs: n,
|
|
108
109
|
lang: a,
|
|
109
110
|
limit: o,
|
|
110
111
|
bbox: s,
|
|
@@ -191,7 +192,7 @@ function be({ debounceMs: r = 300, lang: a, limit: o = 5, bbox: s, lat: c, lon:
|
|
|
191
192
|
children: [/* @__PURE__ */ P(ie, {
|
|
192
193
|
className: "animate-spin",
|
|
193
194
|
"aria-hidden": "true"
|
|
194
|
-
}), /* @__PURE__ */ P(
|
|
195
|
+
}), /* @__PURE__ */ P(r, {
|
|
195
196
|
tag: "span",
|
|
196
197
|
size: "inherit",
|
|
197
198
|
className: "sr-only",
|
|
@@ -213,14 +214,14 @@ function be({ debounceMs: r = 300, lang: a, limit: o = 5, bbox: s, lat: c, lon:
|
|
|
213
214
|
label: N.searchPlaceholder,
|
|
214
215
|
className: "max-h-72",
|
|
215
216
|
children: [
|
|
216
|
-
!!U && /* @__PURE__ */ F(h, { children: [/* @__PURE__ */ P(
|
|
217
|
+
!!U && /* @__PURE__ */ F(h, { children: [/* @__PURE__ */ P(r, {
|
|
217
218
|
tag: "span",
|
|
218
219
|
size: "xs",
|
|
219
220
|
type: "secondary",
|
|
220
221
|
align: "center",
|
|
221
222
|
className: "block",
|
|
222
223
|
children: ye(N.error, { message: U.message })
|
|
223
|
-
}), /* @__PURE__ */ P(
|
|
224
|
+
}), /* @__PURE__ */ P(i, {
|
|
224
225
|
buttonStyle: "ghost",
|
|
225
226
|
size: "sm",
|
|
226
227
|
onClick: () => {
|
|
@@ -228,7 +229,7 @@ function be({ debounceMs: r = 300, lang: a, limit: o = 5, bbox: s, lat: c, lon:
|
|
|
228
229
|
},
|
|
229
230
|
children: N.retry ?? he.retry
|
|
230
231
|
})] }),
|
|
231
|
-
!!W && /* @__PURE__ */ P(h, { children: /* @__PURE__ */ P(
|
|
232
|
+
!!W && /* @__PURE__ */ P(h, { children: /* @__PURE__ */ P(r, {
|
|
232
233
|
tag: "span",
|
|
233
234
|
size: "xs",
|
|
234
235
|
type: "secondary",
|
|
@@ -246,11 +247,11 @@ function be({ debounceMs: r = 300, lang: a, limit: o = 5, bbox: s, lat: c, lon:
|
|
|
246
247
|
onSelect: () => q(e),
|
|
247
248
|
children: [/* @__PURE__ */ P(L, {}), /* @__PURE__ */ F("div", {
|
|
248
249
|
className: "flex flex-col items-start text-start",
|
|
249
|
-
children: [/* @__PURE__ */ P(
|
|
250
|
+
children: [/* @__PURE__ */ P(r, {
|
|
250
251
|
tag: "span",
|
|
251
252
|
weight: "medium",
|
|
252
253
|
children: e.properties.name || e.properties.street || N.unknownPlace
|
|
253
|
-
}), /* @__PURE__ */ P(
|
|
254
|
+
}), /* @__PURE__ */ P(r, {
|
|
254
255
|
tag: "span",
|
|
255
256
|
size: "xs",
|
|
256
257
|
type: "secondary",
|
|
@@ -384,7 +385,7 @@ function Ve({ zoom: n = 15, maxZoom: r = 18, className: i, children: a, strings:
|
|
|
384
385
|
maxZoom: r,
|
|
385
386
|
attributionControl: !1,
|
|
386
387
|
zoomControl: !1,
|
|
387
|
-
className: t("map--component", "z-50 size-full min-h-0 flex-1 rounded-radius
|
|
388
|
+
className: t("map--component", "z-50 size-full min-h-0 flex-1 rounded-radius", i),
|
|
388
389
|
...c,
|
|
389
390
|
children: /* @__PURE__ */ P(K.Provider, {
|
|
390
391
|
value: l,
|
|
@@ -478,7 +479,7 @@ function qe({ defaultTileLayer: e, defaultLayerGroups: t = [], ...n }) {
|
|
|
478
479
|
...n
|
|
479
480
|
});
|
|
480
481
|
}
|
|
481
|
-
function Je({ tileLayersLabel: e, layerGroupsLabel:
|
|
482
|
+
function Je({ tileLayersLabel: e, layerGroupsLabel: n, position: r = "top-1 right-1", className: m, ...h }) {
|
|
482
483
|
let g = q(), _ = Ue();
|
|
483
484
|
if (!_) throw Error("MapLayersControl must be used within MapLayers");
|
|
484
485
|
let { tileLayers: v, selectedTileLayer: y, setSelectedTileLayer: b, layerGroups: x, activeLayerGroups: S, setActiveLayerGroups: C } = _;
|
|
@@ -487,7 +488,7 @@ function Je({ tileLayersLabel: e, layerGroupsLabel: r, position: i = "top-1 righ
|
|
|
487
488
|
C(t ? [...S, e] : S.filter((t) => t !== e));
|
|
488
489
|
}
|
|
489
490
|
let w = v.length > 1, T = x.length > 0;
|
|
490
|
-
return !w && !T ? null : /* @__PURE__ */ F(f, { children: [/* @__PURE__ */ P(o, { render: (e) => /* @__PURE__ */ P(
|
|
491
|
+
return !w && !T ? null : /* @__PURE__ */ F(f, { children: [/* @__PURE__ */ P(o, { render: (e) => /* @__PURE__ */ P(i, {
|
|
491
492
|
...e,
|
|
492
493
|
type: "button",
|
|
493
494
|
tone: "secondary",
|
|
@@ -495,7 +496,7 @@ function Je({ tileLayersLabel: e, layerGroupsLabel: r, position: i = "top-1 righ
|
|
|
495
496
|
iconOnly: !0,
|
|
496
497
|
"aria-label": g.selectLayers,
|
|
497
498
|
title: g.selectLayers,
|
|
498
|
-
className: t("border-border absolute z-1000 border",
|
|
499
|
+
className: t("border-border absolute z-1000 border", r, m, e.className),
|
|
499
500
|
...h,
|
|
500
501
|
children: /* @__PURE__ */ P(re, {})
|
|
501
502
|
}) }), /* @__PURE__ */ F(d, {
|
|
@@ -511,7 +512,7 @@ function Je({ tileLayersLabel: e, layerGroupsLabel: r, position: i = "top-1 righ
|
|
|
511
512
|
}, e.name))]
|
|
512
513
|
}) }),
|
|
513
514
|
!!w && !!T && /* @__PURE__ */ P(a, {}),
|
|
514
|
-
!!T && /* @__PURE__ */ F(s, { children: [/* @__PURE__ */ P(u, { children:
|
|
515
|
+
!!T && /* @__PURE__ */ F(s, { children: [/* @__PURE__ */ P(u, { children: n ?? g.layers }), x.map((e) => /* @__PURE__ */ P(l, {
|
|
515
516
|
checked: S.includes(e.name),
|
|
516
517
|
disabled: e.disabled,
|
|
517
518
|
onCheckedChange: (t) => ee(e.name, t),
|
|
@@ -588,7 +589,7 @@ function tt({ className: e, ...n }) {
|
|
|
588
589
|
}
|
|
589
590
|
function nt({ className: e, ...n }) {
|
|
590
591
|
return /* @__PURE__ */ P(De, {
|
|
591
|
-
className: t("map-popup--component border-border bg-popover text-popover-foreground animate-in fade-out-0 fade-in-0 zoom-out-95 zoom-in-95 slide-in-from-bottom-2 z-50 w-72 rounded-radius
|
|
592
|
+
className: t("map-popup--component border-border bg-popover text-popover-foreground animate-in fade-out-0 fade-in-0 zoom-out-95 zoom-in-95 slide-in-from-bottom-2 z-50 w-72 rounded-radius border p-surface font-sans shadow-md outline-hidden", e),
|
|
592
593
|
...n
|
|
593
594
|
});
|
|
594
595
|
}
|
|
@@ -614,17 +615,17 @@ function rt({ className: e, children: n, side: r = "top", sideOffset: i = 15, ..
|
|
|
614
615
|
children: [n, /* @__PURE__ */ P("div", { className: t("bg-foreground fill-foreground absolute z-50 size-2.5 rotate-45 rounded-[2px]", o[r]) })]
|
|
615
616
|
});
|
|
616
617
|
}
|
|
617
|
-
function it({ position: e = "top-1 left-1", className:
|
|
618
|
+
function it({ position: e = "top-1 left-1", className: r, ...a }) {
|
|
618
619
|
let o = Y(), s = q(), [c, l] = M(o.getZoom());
|
|
619
620
|
return ze({ zoomend: () => {
|
|
620
621
|
l(o.getZoom());
|
|
621
622
|
} }), /* @__PURE__ */ P(Q, {
|
|
622
|
-
className: t(e,
|
|
623
|
-
children: /* @__PURE__ */ F(
|
|
623
|
+
className: t(e, r),
|
|
624
|
+
children: /* @__PURE__ */ F(n, {
|
|
624
625
|
orientation: "vertical",
|
|
625
626
|
"aria-label": s.zoomControls,
|
|
626
627
|
...a,
|
|
627
|
-
children: [/* @__PURE__ */ P(
|
|
628
|
+
children: [/* @__PURE__ */ P(i, {
|
|
628
629
|
type: "button",
|
|
629
630
|
size: "sm",
|
|
630
631
|
iconOnly: !0,
|
|
@@ -635,7 +636,7 @@ function it({ position: e = "top-1 left-1", className: i, ...a }) {
|
|
|
635
636
|
disabled: c >= o.getMaxZoom(),
|
|
636
637
|
onClick: () => o.zoomIn(),
|
|
637
638
|
children: /* @__PURE__ */ P(le, {})
|
|
638
|
-
}), /* @__PURE__ */ P(
|
|
639
|
+
}), /* @__PURE__ */ P(i, {
|
|
639
640
|
type: "button",
|
|
640
641
|
size: "sm",
|
|
641
642
|
iconOnly: !0,
|
|
@@ -650,7 +651,7 @@ function it({ position: e = "top-1 left-1", className: i, ...a }) {
|
|
|
650
651
|
})
|
|
651
652
|
});
|
|
652
653
|
}
|
|
653
|
-
function at({ position: e = "top-1 right-1", className:
|
|
654
|
+
function at({ position: e = "top-1 right-1", className: n, ...r }) {
|
|
654
655
|
let a = Y(), o = q(), [s, c] = M(!1), { L: l } = $();
|
|
655
656
|
return A(() => {
|
|
656
657
|
if (!l) return;
|
|
@@ -663,8 +664,8 @@ function at({ position: e = "top-1 right-1", className: r, ...i }) {
|
|
|
663
664
|
e.remove(), a.off("enterFullscreen", n), a.off("exitFullscreen", r);
|
|
664
665
|
};
|
|
665
666
|
}, [l, a]), /* @__PURE__ */ P(Q, {
|
|
666
|
-
className: t(e,
|
|
667
|
-
children: /* @__PURE__ */ P(
|
|
667
|
+
className: t(e, n),
|
|
668
|
+
children: /* @__PURE__ */ P(i, {
|
|
668
669
|
type: "button",
|
|
669
670
|
size: "sm",
|
|
670
671
|
iconOnly: !0,
|
|
@@ -673,7 +674,7 @@ function at({ position: e = "top-1 right-1", className: r, ...i }) {
|
|
|
673
674
|
"aria-label": s ? o.exitFullscreen : o.enterFullscreen,
|
|
674
675
|
title: s ? o.exitFullscreen : o.enterFullscreen,
|
|
675
676
|
className: "border-border border",
|
|
676
|
-
...
|
|
677
|
+
...r,
|
|
677
678
|
children: P(s ? R : oe, {})
|
|
678
679
|
})
|
|
679
680
|
});
|
|
@@ -684,21 +685,21 @@ function ot() {
|
|
|
684
685
|
children: [/* @__PURE__ */ P("div", { className: "bg-primary absolute inline-flex size-full animate-ping rounded-full opacity-75" }), /* @__PURE__ */ P("div", { className: "bg-primary relative inline-flex size-icon-sm rounded-full" })]
|
|
685
686
|
});
|
|
686
687
|
}
|
|
687
|
-
function st({ watch: e = !1, onLocationFound:
|
|
688
|
+
function st({ watch: e = !1, onLocationFound: n, onLocationError: r, position: a = "right-1 bottom-1", className: o, ...s }) {
|
|
688
689
|
let c = Y(), l = q(), [u, d] = xt(200), [f, p] = M(null), m = f !== null, h = O(() => {
|
|
689
690
|
d(!0), c.locate({
|
|
690
691
|
setView: !0,
|
|
691
692
|
maxZoom: c.getMaxZoom(),
|
|
692
693
|
watch: e
|
|
693
694
|
}), c.on("locationfound", (e) => {
|
|
694
|
-
p(e.latlng), d(!1),
|
|
695
|
+
p(e.latlng), d(!1), n?.(e);
|
|
695
696
|
}), c.on("locationerror", (e) => {
|
|
696
|
-
p(null), d(!1),
|
|
697
|
+
p(null), d(!1), r?.(e);
|
|
697
698
|
});
|
|
698
699
|
}, [
|
|
699
700
|
c,
|
|
700
|
-
i,
|
|
701
701
|
r,
|
|
702
|
+
n,
|
|
702
703
|
d,
|
|
703
704
|
e
|
|
704
705
|
]), g = O(() => {
|
|
@@ -710,7 +711,7 @@ function st({ watch: e = !1, onLocationFound: r, onLocationError: i, position: a
|
|
|
710
711
|
}) : null;
|
|
711
712
|
return A(() => () => g(), [g]), /* @__PURE__ */ F(Q, {
|
|
712
713
|
className: t(a, o),
|
|
713
|
-
children: [/* @__PURE__ */ P(
|
|
714
|
+
children: [/* @__PURE__ */ P(i, {
|
|
714
715
|
type: "button",
|
|
715
716
|
size: "sm",
|
|
716
717
|
iconOnly: !0,
|
|
@@ -735,7 +736,7 @@ var lt = E(null);
|
|
|
735
736
|
function X() {
|
|
736
737
|
return k(lt);
|
|
737
738
|
}
|
|
738
|
-
function ut({ onLayersChange: e, position:
|
|
739
|
+
function ut({ onLayersChange: e, position: r = "bottom-1 left-1", className: i, ...a }) {
|
|
739
740
|
let { L: o, LeafletDraw: s } = $(), c = Y(), l = j(null), u = j(null), d = j(null), [f, p] = M(null), [m, h] = M(0), g = O(() => {
|
|
740
741
|
l.current && h(l.current.getLayers().length);
|
|
741
742
|
}, []), _ = O((t) => {
|
|
@@ -765,15 +766,15 @@ function ut({ onLayersChange: e, position: n = "bottom-1 left-1", className: i,
|
|
|
765
766
|
layersCount: m
|
|
766
767
|
},
|
|
767
768
|
children: [/* @__PURE__ */ P(Fe, { ref: l }), /* @__PURE__ */ P(Q, {
|
|
768
|
-
className: t(
|
|
769
|
-
children: /* @__PURE__ */ P(
|
|
769
|
+
className: t(r, i),
|
|
770
|
+
children: /* @__PURE__ */ P(n, {
|
|
770
771
|
orientation: "vertical",
|
|
771
772
|
...a
|
|
772
773
|
})
|
|
773
774
|
})]
|
|
774
775
|
});
|
|
775
776
|
}
|
|
776
|
-
function Z({ drawMode: e, createDrawTool:
|
|
777
|
+
function Z({ drawMode: e, createDrawTool: n, className: r, children: a, ...o }) {
|
|
777
778
|
let s = X();
|
|
778
779
|
if (!s) throw Error("MapDrawShapeButton must be used within MapDrawControl");
|
|
779
780
|
let { L: c } = $(), l = q(), u = Y(), d = j(null), { activeMode: f, setActiveMode: p } = s, m = f === e, h = {
|
|
@@ -788,7 +789,7 @@ function Z({ drawMode: e, createDrawTool: r, className: i, children: a, ...o })
|
|
|
788
789
|
d.current?.disable(), d.current = null;
|
|
789
790
|
return;
|
|
790
791
|
}
|
|
791
|
-
let e =
|
|
792
|
+
let e = n(c, u);
|
|
792
793
|
return e.enable(), d.current = e, () => {
|
|
793
794
|
e.disable(), d.current = null;
|
|
794
795
|
};
|
|
@@ -796,18 +797,18 @@ function Z({ drawMode: e, createDrawTool: r, className: i, children: a, ...o })
|
|
|
796
797
|
c,
|
|
797
798
|
u,
|
|
798
799
|
m,
|
|
799
|
-
|
|
800
|
+
n
|
|
800
801
|
]);
|
|
801
802
|
function g() {
|
|
802
803
|
p(m ? null : e);
|
|
803
804
|
}
|
|
804
|
-
return /* @__PURE__ */ P(
|
|
805
|
+
return /* @__PURE__ */ P(i, {
|
|
805
806
|
type: "button",
|
|
806
807
|
size: "sm",
|
|
807
808
|
iconOnly: !0,
|
|
808
809
|
"aria-label": h,
|
|
809
810
|
title: h,
|
|
810
|
-
className: t("border-border border",
|
|
811
|
+
className: t("border-border border", r),
|
|
811
812
|
tone: m ? "primary" : "secondary",
|
|
812
813
|
disabled: f === "edit" || f === "delete",
|
|
813
814
|
onClick: g,
|
|
@@ -900,31 +901,31 @@ function ht({ drawError: e = { color: "var(--color-destructive)" }, shapeOptions
|
|
|
900
901
|
children: /* @__PURE__ */ P(ce, {})
|
|
901
902
|
});
|
|
902
903
|
}
|
|
903
|
-
function gt({ drawAction: e, createDrawTool:
|
|
904
|
+
function gt({ drawAction: e, createDrawTool: n, controlRef: r, className: a, children: o, ...s }) {
|
|
904
905
|
let c = X();
|
|
905
906
|
if (!c) throw Error("MapDrawActionButton must be used within MapDrawControl");
|
|
906
907
|
let { L: l } = $(), u = q(), d = Y(), { featureGroup: f, activeMode: p, setActiveMode: m, layersCount: h } = c, g = p === e, _ = h > 0, v = e === "edit" ? u.editShapes : u.removeShapes;
|
|
907
908
|
A(() => {
|
|
908
909
|
if (!l || !f || !g) {
|
|
909
|
-
|
|
910
|
+
r.current?.disable?.(), r.current = null;
|
|
910
911
|
return;
|
|
911
912
|
}
|
|
912
|
-
let e =
|
|
913
|
-
return e.enable?.(),
|
|
914
|
-
e.disable?.(),
|
|
913
|
+
let e = n(l, d, f);
|
|
914
|
+
return e.enable?.(), r.current = e, () => {
|
|
915
|
+
e.disable?.(), r.current = null;
|
|
915
916
|
};
|
|
916
917
|
}, [
|
|
917
918
|
l,
|
|
918
919
|
d,
|
|
919
920
|
g,
|
|
920
921
|
f,
|
|
921
|
-
|
|
922
|
-
|
|
922
|
+
n,
|
|
923
|
+
r
|
|
923
924
|
]);
|
|
924
925
|
function y() {
|
|
925
|
-
|
|
926
|
+
r.current?.save(), m(g ? null : e);
|
|
926
927
|
}
|
|
927
|
-
return /* @__PURE__ */ P(
|
|
928
|
+
return /* @__PURE__ */ P(i, {
|
|
928
929
|
type: "button",
|
|
929
930
|
size: "sm",
|
|
930
931
|
iconOnly: !0,
|
|
@@ -985,14 +986,14 @@ function vt() {
|
|
|
985
986
|
children: /* @__PURE__ */ P(fe, {})
|
|
986
987
|
});
|
|
987
988
|
}
|
|
988
|
-
function yt({ className: e, ...
|
|
989
|
-
let
|
|
990
|
-
if (!
|
|
991
|
-
let a = q(), { activeMode: o, setActiveMode: s, editControlRef: c, deleteControlRef: l, layersCount: u } =
|
|
989
|
+
function yt({ className: e, ...n }) {
|
|
990
|
+
let r = X();
|
|
991
|
+
if (!r) throw Error("MapDrawUndo must be used within MapDrawControl");
|
|
992
|
+
let a = q(), { activeMode: o, setActiveMode: s, editControlRef: c, deleteControlRef: l, layersCount: u } = r, d = o === "edit", f = o === "delete", p = (d || f) && u > 0, m = f ? a.undoRemove : a.undoEdit;
|
|
992
993
|
function h() {
|
|
993
994
|
d ? c.current?.revertLayers() : f && l.current?.revertLayers(), s(null);
|
|
994
995
|
}
|
|
995
|
-
return /* @__PURE__ */ P(
|
|
996
|
+
return /* @__PURE__ */ P(i, {
|
|
996
997
|
type: "button",
|
|
997
998
|
size: "sm",
|
|
998
999
|
iconOnly: !0,
|
|
@@ -1002,7 +1003,7 @@ function yt({ className: e, ...r }) {
|
|
|
1002
1003
|
onClick: h,
|
|
1003
1004
|
disabled: !p,
|
|
1004
1005
|
className: t("border-border border", e),
|
|
1005
|
-
...
|
|
1006
|
+
...n,
|
|
1006
1007
|
children: /* @__PURE__ */ P(pe, {})
|
|
1007
1008
|
});
|
|
1008
1009
|
}
|