themelia-react-ui 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +351 -0
- package/README.md +26 -13
- package/dist/{accordion-CQXVcd7Q.js → accordion-B6a3vVgA.js} +84 -82
- package/dist/accordion-B6a3vVgA.js.map +1 -0
- package/dist/action-menu-TzCoSlwL.js +280 -0
- package/dist/action-menu-TzCoSlwL.js.map +1 -0
- package/dist/{affordance-geometry.generated-CCIXb2A1.js → affordance-geometry.generated-B5iu-Mkr.js} +3 -2
- package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +1 -0
- package/dist/{ai-artifact-2PQ2fItc.js → ai-artifact-BMJdv-6q.js} +379 -376
- package/dist/ai-artifact-BMJdv-6q.js.map +1 -0
- package/dist/{app-shell-BE_j8-AT.js → app-shell-ZK5RWdo6.js} +4 -4
- package/dist/{app-shell-BE_j8-AT.js.map → app-shell-ZK5RWdo6.js.map} +1 -1
- package/dist/attachment-BtfhGm8i.js +245 -0
- package/dist/attachment-BtfhGm8i.js.map +1 -0
- package/dist/{auth-M3vGMgDR.js → auth-CYxKfo69.js} +237 -235
- package/dist/auth-CYxKfo69.js.map +1 -0
- package/dist/{avatar-djdaaQ_s.js → avatar-BBnEJIx8.js} +66 -65
- package/dist/avatar-BBnEJIx8.js.map +1 -0
- package/dist/badge-MrKVNzW9.js +93 -0
- package/dist/badge-MrKVNzW9.js.map +1 -0
- 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/batch-action-bar.js +3 -0
- package/dist/base/buttons.js +2 -3
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +13 -13
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +103 -115
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +3 -3
- 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 +2 -2
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +3 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +17 -17
- package/dist/base/inline-edit.js.map +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +3 -0
- package/dist/base/navigation.js +7 -7
- 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 +171 -170
- 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 +147 -137
- 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 +2 -2
- 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 +2 -2
- package/dist/batch-action-bar-BZGDG-Si.js +104 -0
- package/dist/batch-action-bar-BZGDG-Si.js.map +1 -0
- package/dist/blocks/admin.js +173 -171
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +266 -263
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +440 -438
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +1 -1
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +1945 -1266
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +3 -2
- package/dist/blocks/onboarding.js +50 -49
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +25 -25
- package/dist/blocks/planning.js.map +1 -1
- package/dist/blocks/timelines.js +1 -1
- package/dist/breadcrumbs-D5t7I023.js +129 -0
- package/dist/breadcrumbs-D5t7I023.js.map +1 -0
- package/dist/{button-R9CCoH7A.js → button-QYwiyhD2.js} +15 -14
- package/dist/button-QYwiyhD2.js.map +1 -0
- package/dist/{button-BS3KDg00.js → buttons-SbIcm1HJ.js} +200 -213
- package/dist/buttons-SbIcm1HJ.js.map +1 -0
- package/dist/{cards-QoJ4syG9.js → cards-CiiHpKYd.js} +8 -8
- package/dist/cards-CiiHpKYd.js.map +1 -0
- package/dist/{chart-DwYRKKc-.js → chart-QfrARkXl.js} +5 -5
- package/dist/{chart-DwYRKKc-.js.map → chart-QfrARkXl.js.map} +1 -1
- package/dist/checkbox-DhB6K0bK.js +36 -0
- package/dist/checkbox-DhB6K0bK.js.map +1 -0
- package/dist/choice-inputs-t6w3ATNz.js +766 -0
- package/dist/choice-inputs-t6w3ATNz.js.map +1 -0
- package/dist/code-block-Dgbu-CU3.js +185 -0
- package/dist/code-block-Dgbu-CU3.js.map +1 -0
- package/dist/{collapsible-oMUGM4tr.js → collapsible-D8AEGU1-.js} +4 -4
- package/dist/{collapsible-oMUGM4tr.js.map → collapsible-D8AEGU1-.js.map} +1 -1
- package/dist/{collection-content-Ys-OZOkY.js → collection-content-uK16Grv0.js} +3 -3
- package/dist/{collection-content-Ys-OZOkY.js.map → collection-content-uK16Grv0.js.map} +1 -1
- package/dist/{combobox-6dvVny2q.js → combobox-2Ic8N9bL.js} +74 -68
- package/dist/combobox-2Ic8N9bL.js.map +1 -0
- package/dist/{combobox-CB7039j7.js → combobox-DLl0bfiq.js} +307 -305
- package/dist/combobox-DLl0bfiq.js.map +1 -0
- package/dist/{command-kPMPjIxJ.js → command-kNR20o7x.js} +7 -7
- package/dist/{command-kPMPjIxJ.js.map → command-kNR20o7x.js.map} +1 -1
- package/dist/{comments-You0Bzbr.js → comments-BpDuCUUu.js} +341 -339
- package/dist/comments-BpDuCUUu.js.map +1 -0
- package/dist/components/base/action-menu/action-menu.d.ts +21 -4
- package/dist/components/base/action-menu/action-menu.recipes.d.ts +21 -0
- package/dist/components/base/action-menu/index.d.ts +1 -0
- package/dist/components/base/badge/badge.recipes.d.ts +4 -4
- package/dist/components/base/batch-action-bar/batch-action-bar.d.ts +50 -0
- package/dist/components/base/batch-action-bar/batch-action-bar.strings.d.ts +20 -0
- package/dist/components/base/batch-action-bar/index.d.ts +8 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
- package/dist/components/base/buttons/button.recipes.d.ts +2 -2
- package/dist/components/base/choice-inputs/checkbox.d.ts +2 -2
- package/dist/components/base/choice-inputs/choice-types.d.ts +18 -6
- package/dist/components/base/display/alert-dialog.d.ts +6 -5
- package/dist/components/base/display/dialog.d.ts +4 -8
- package/dist/components/base/display/icon-badge/icon-badge.d.ts +1 -1
- package/dist/components/base/forms/form-sizing.d.ts +15 -12
- package/dist/components/base/metadata-list/index.d.ts +12 -0
- package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.d.ts +28 -25
- package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-value.d.ts +2 -2
- package/dist/components/base/navigation/index.d.ts +1 -1
- package/dist/components/base/navigation/page-header/index.d.ts +1 -0
- package/dist/components/base/navigation/page-header/page-header-commands.d.ts +73 -0
- package/dist/components/base/navigation/page-header/page-header.d.ts +26 -3
- package/dist/components/base/sheet/sheet.d.ts +4 -8
- package/dist/components/base/signature-pad/signature-pad.types.d.ts +5 -1
- package/dist/components/base/signature-pad/signature-pad.utils.d.ts +11 -3
- package/dist/components/base/text-inputs/field-clear-button.d.ts +6 -0
- package/dist/components/base/upload/upload.recipes.d.ts +25 -3
- package/dist/components/base/value-inputs/index.d.ts +5 -5
- package/dist/components/base/value-inputs/tags-input.d.ts +36 -12
- package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
- package/dist/components/blocks/commerce/address-card/types.d.ts +2 -1
- package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +3 -1
- package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
- package/dist/components/blocks/commerce/cart-summary/types.d.ts +6 -1
- package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +3 -1
- package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
- package/dist/components/blocks/commerce/discount-stack/types.d.ts +16 -4
- package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +5 -0
- package/dist/components/blocks/commerce/fulfillment-group/index.d.ts +2 -0
- package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +43 -0
- package/dist/components/blocks/commerce/index.d.ts +13 -5
- package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-header/types.d.ts +4 -2
- package/dist/components/blocks/commerce/invoice-mini/invoice-mini.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-mini/types.d.ts +2 -1
- package/dist/components/blocks/commerce/order-customer/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +5 -0
- package/dist/components/blocks/commerce/order-customer/types.d.ts +48 -0
- package/dist/components/blocks/commerce/order-header/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-header/order-header.d.ts +5 -0
- package/dist/components/blocks/commerce/order-header/types.d.ts +37 -0
- package/dist/components/blocks/commerce/order-line-item/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-line-item/order-line-item.d.ts +5 -0
- package/dist/components/blocks/commerce/order-line-item/types.d.ts +46 -0
- package/dist/components/blocks/commerce/order-summary/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-summary/order-summary.d.ts +5 -0
- package/dist/components/blocks/commerce/order-summary/types.d.ts +42 -0
- package/dist/components/blocks/commerce/order-transactions/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-transactions/order-transactions.d.ts +5 -0
- package/dist/components/blocks/commerce/order-transactions/types.d.ts +46 -0
- package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
- package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +9 -1
- package/dist/components/blocks/commerce/payment-method/types.d.ts +12 -1
- package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
- package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +3 -1
- package/dist/components/blocks/commerce/refund-status/types.d.ts +6 -3
- package/dist/components/blocks/commerce/shared/address-lines.d.ts +21 -0
- package/dist/components/blocks/commerce/shared/line-thumbnail.d.ts +9 -0
- package/dist/components/blocks/commerce/shared/order-status.d.ts +51 -0
- package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
- package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +27 -6
- package/dist/components/blocks/commerce/summary-panel/amount-row.d.ts +2 -0
- package/dist/components/blocks/commerce/summary-panel/index.d.ts +3 -0
- package/dist/components/blocks/commerce/summary-panel/summary-panel.d.ts +2 -0
- package/dist/components/blocks/commerce/summary-panel/types.d.ts +26 -0
- package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
- package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +2 -1
- package/dist/components/blocks/data-display/metadata/index.d.ts +30 -4
- package/dist/components/features/activities/partials/activity-row.d.ts +6 -2
- package/dist/components/features/activities/partials/tone-tokens.d.ts +0 -6
- package/dist/components/features/global-search/partials/global-search-group-heading.d.ts +15 -0
- package/dist/components/features/global-search/partials/tone-palettes.d.ts +0 -5
- package/dist/components/features/kanban/kanban.d.ts +1 -1
- package/dist/components/features/kanban/kanban.strings.d.ts +1 -1
- package/dist/components/features/kanban/kanban.types.d.ts +2 -2
- package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
- package/dist/components/features/media-library/index.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.strings.d.ts +4 -0
- package/dist/components/features/media-library/media-library.types.d.ts +74 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
- package/dist/components/features/mentions/partials/mention-kind-toggles.d.ts +16 -0
- package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
- package/dist/components/features/overlays/dialog.d.ts +1 -1
- package/dist/components/features/overlays/index.d.ts +1 -1
- package/dist/components/features/overlays/overlay-tone-icon.d.ts +3 -3
- package/dist/components/features/overlays/overlays.types.d.ts +20 -0
- package/dist/components/features/products/components/product-contract-overview.d.ts +5 -0
- package/dist/components/features/products/components/product-details-card.d.ts +5 -0
- package/dist/components/features/products/components/product-operations-card.d.ts +5 -0
- package/dist/components/features/products/components/product-option-action-menu.d.ts +5 -0
- package/dist/components/features/products/components/product-options-summary.d.ts +5 -0
- package/dist/components/features/products/components/product-policies-card.d.ts +5 -0
- package/dist/components/features/products/components/product-quote-preview-card.d.ts +5 -0
- package/dist/components/features/products/components/product-readiness-card.d.ts +5 -0
- package/dist/components/features/products/components/product-structure-card.d.ts +5 -0
- package/dist/components/features/products/components/product-variant-action-menu.d.ts +23 -1
- package/dist/components/features/products/products.types.d.ts +9 -2
- package/dist/components/features/resource/index.d.ts +1 -1
- package/dist/components/features/resource/resource.d.ts +1 -1
- package/dist/components/features/resource/resource.types.d.ts +34 -6
- package/dist/components/features/rich-text-editor/index.d.ts +2 -1
- package/dist/components/features/rich-text-editor/partials/image-nodes.d.ts +13 -0
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +66 -0
- package/dist/components/features/rich-text-editor/partials/inline-reference-node.d.ts +19 -0
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.strings.d.ts +14 -0
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +45 -0
- package/dist/components/features/rich-text-editor/use-rich-text-images.d.ts +18 -0
- package/dist/components/features/sync/index.d.ts +26 -3
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +32 -7
- package/dist/components/layout/page/index.d.ts +1 -1
- package/dist/components/layout/page/page.types.d.ts +33 -36
- package/dist/components/layout/page/partials/page-actions.d.ts +1 -0
- package/dist/components/layout/page/partials/page-header.d.ts +1 -1
- package/dist/components/layout/settings/settings.d.ts +16 -2
- package/dist/components/layout/workspace/workspace.types.d.ts +21 -4
- package/dist/components/typography/rich-text/index.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +19 -0
- package/dist/components/typography/rich-text/rich-text.d.ts +16 -0
- package/dist/components/typography/text-link.d.ts +4 -3
- package/dist/components/ui/checkbox.d.ts +4 -3
- package/dist/components/ui/overlay.recipes.d.ts +0 -9
- package/dist/components/ui/switch.d.ts +2 -2
- package/dist/{containers-D_L4mTVb.js → containers-DmWiJa2I.js} +36 -35
- package/dist/containers-DmWiJa2I.js.map +1 -0
- package/dist/{copyable-DDjTeW_j.js → copyable-B3Gwgdqc.js} +6 -6
- package/dist/{copyable-DDjTeW_j.js.map → copyable-B3Gwgdqc.js.map} +1 -1
- package/dist/data-display-DafIvCl5.js +960 -0
- package/dist/data-display-DafIvCl5.js.map +1 -0
- package/dist/{date-uf3z37Nm.js → date-BgK3bTdo.js} +5 -5
- package/dist/{date-uf3z37Nm.js.map → date-BgK3bTdo.js.map} +1 -1
- package/dist/date-picker-CF-DtUpF.js +1529 -0
- package/dist/date-picker-CF-DtUpF.js.map +1 -0
- package/dist/{date-pickers-CnFCb0n2.js → date-pickers-BmzxJl5l.js} +19 -19
- package/dist/{date-pickers-CnFCb0n2.js.map → date-pickers-BmzxJl5l.js.map} +1 -1
- package/dist/{display-DrdvPwF0.js → display-DsQTVzMz.js} +88 -87
- package/dist/display-DsQTVzMz.js.map +1 -0
- package/dist/{dropdown-menu-CURh59jb.js → dropdown-menu-E2qmdC7o.js} +7 -7
- package/dist/{dropdown-menu-CURh59jb.js.map → dropdown-menu-E2qmdC7o.js.map} +1 -1
- package/dist/features/activities.js +414 -501
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +170 -169
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +8 -8
- 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 +139 -138
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +73 -71
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +278 -275
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +307 -310
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +95 -97
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +56 -57
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +918 -825
- 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 +1115 -1122
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +202 -194
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +25 -25
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +77 -69
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +30 -11
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +33 -33
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +397 -396
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-C7nR0UtT.js → feedback-qNuMBtRH.js} +84 -83
- package/dist/feedback-qNuMBtRH.js.map +1 -0
- package/dist/{field-affordance-recipes-CkOCdE2y.js → field-affordance-recipes-qQeIf4lG.js} +8 -6
- package/dist/field-affordance-recipes-qQeIf4lG.js.map +1 -0
- package/dist/field-state-recipes-BVA2CWHo.js +12 -0
- package/dist/field-state-recipes-BVA2CWHo.js.map +1 -0
- package/dist/{filters-Da-gNPsE.js → filters-BkHH53uv.js} +565 -563
- package/dist/filters-BkHH53uv.js.map +1 -0
- package/dist/focus-recipes-B653VaLq.js +12 -0
- package/dist/focus-recipes-B653VaLq.js.map +1 -0
- package/dist/{form-field-VZRULhUK.js → form-field-DUt4UxSV.js} +4 -4
- package/dist/{form-field-VZRULhUK.js.map → form-field-DUt4UxSV.js.map} +1 -1
- package/dist/{form-sizing-uWP4lzVh.js → form-sizing-By94KzXE.js} +19 -15
- package/dist/form-sizing-By94KzXE.js.map +1 -0
- package/dist/{forms-DDeEnXSY.js → forms-Bzha-Y3B.js} +22 -22
- package/dist/{forms-DDeEnXSY.js.map → forms-Bzha-Y3B.js.map} +1 -1
- package/dist/{forms-numeric-D3CO60IF.js → forms-numeric-C0bvjRPZ.js} +265 -264
- package/dist/forms-numeric-C0bvjRPZ.js.map +1 -0
- package/dist/{header-2ycNqGOR.js → header-BOefOKd1.js} +47 -51
- package/dist/header-BOefOKd1.js.map +1 -0
- package/dist/{hooks-DQ5SPwZw.js → hooks-9k_TtmKh.js} +2 -2
- package/dist/{hooks-DQ5SPwZw.js.map → hooks-9k_TtmKh.js.map} +1 -1
- package/dist/{http-CdEIHyQf.js → http-D_6rOnzU.js} +2 -2
- package/dist/{http-CdEIHyQf.js.map → http-D_6rOnzU.js.map} +1 -1
- package/dist/icon-badge-CAuKupo9.js +55 -0
- package/dist/icon-badge-CAuKupo9.js.map +1 -0
- package/dist/index.js +7 -7
- package/dist/input-DWhBBBww.js +262 -0
- package/dist/input-DWhBBBww.js.map +1 -0
- package/dist/{input-BoLm9Hks.js → input-Ddi_LSYv.js} +3 -3
- package/dist/{input-BoLm9Hks.js.map → input-Ddi_LSYv.js.map} +1 -1
- package/dist/interaction-recipes-CHr0dJUs.js +24 -0
- package/dist/interaction-recipes-CHr0dJUs.js.map +1 -0
- package/dist/{item-xzh8Df65.js → item-DEmDiTlD.js} +98 -97
- package/dist/item-DEmDiTlD.js.map +1 -0
- package/dist/layer-recipes-CCpklYME.js +13 -0
- package/dist/layer-recipes-CCpklYME.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 +1 -0
- package/dist/lib/field-affordance-recipes.d.ts +6 -1
- package/dist/lib/field-state-recipes.d.ts +9 -8
- package/dist/lib/focus-recipes.d.ts +24 -0
- package/dist/lib/interaction-recipes.d.ts +35 -0
- package/dist/lib/layer-recipes.d.ts +19 -0
- package/dist/lib/motion-recipes.d.ts +1 -0
- package/dist/lib/overlay-anatomy-recipes.d.ts +1 -0
- package/dist/lib/safe-image-src.d.ts +10 -0
- package/dist/lib/sanitize-html.d.ts +15 -3
- package/dist/lib/surface-recipes.d.ts +47 -7
- package/dist/lib/token-merge.generated.d.ts +9 -6
- package/dist/lib/tone-recipes.d.ts +79 -0
- package/dist/lib/ui-provider/hooks.d.ts +2 -1
- package/dist/lib/ui-provider/index.d.ts +2 -2
- package/dist/lib/ui-provider/types.d.ts +9 -0
- package/dist/lib/utils.js +1 -1
- package/dist/media-gallery-DcTtAaeC.js +203 -0
- package/dist/media-gallery-DcTtAaeC.js.map +1 -0
- package/dist/mentions-D-uyCh01.js +568 -0
- package/dist/mentions-D-uyCh01.js.map +1 -0
- package/dist/{message-YfFmbXNP.js → message-CdHgIWKf.js} +5 -5
- package/dist/{message-YfFmbXNP.js.map → message-CdHgIWKf.js.map} +1 -1
- package/dist/metadata-list-X5rYAKSB.js +394 -0
- package/dist/metadata-list-X5rYAKSB.js.map +1 -0
- package/dist/{motion-recipes-B6jKXEcN.js → motion-recipes-ChBg4HBq.js} +3 -2
- package/dist/{motion-recipes-B6jKXEcN.js.map → motion-recipes-ChBg4HBq.js.map} +1 -1
- package/dist/navigation-D3KwXmaq.js +145 -0
- package/dist/navigation-D3KwXmaq.js.map +1 -0
- package/dist/navigation-HJf5zxlH.js +268 -0
- package/dist/navigation-HJf5zxlH.js.map +1 -0
- package/dist/{navigation-row-recipes-DlU-4QYO.js → navigation-row-recipes-BVowojQw.js} +2 -2
- package/dist/{navigation-row-recipes-DlU-4QYO.js.map → navigation-row-recipes-BVowojQw.js.map} +1 -1
- package/dist/{number-CKRBYmZK.js → number-DMhe-Vsk.js} +5 -5
- package/dist/{number-CKRBYmZK.js.map → number-DMhe-Vsk.js.map} +1 -1
- package/dist/overflow-tab-bar-sQHXLlwQ.js +280 -0
- package/dist/overflow-tab-bar-sQHXLlwQ.js.map +1 -0
- package/dist/overlay.recipes-8GHqmlb4.js +6 -0
- package/dist/overlay.recipes-8GHqmlb4.js.map +1 -0
- package/dist/overlays-I0axtYA6.js +999 -0
- package/dist/overlays-I0axtYA6.js.map +1 -0
- package/dist/page-B5dTH9gE.js +224 -0
- package/dist/page-B5dTH9gE.js.map +1 -0
- package/dist/page-header-commands-DjzFEq3E.js +126 -0
- package/dist/page-header-commands-DjzFEq3E.js.map +1 -0
- package/dist/{pagination-Cm0jqa3I.js → pagination-3bPA_a6K.js} +15 -15
- package/dist/{pagination-Cm0jqa3I.js.map → pagination-3bPA_a6K.js.map} +1 -1
- package/dist/{popover-Dcv_9jxr.js → popover-Di55PyAI.js} +8 -8
- package/dist/popover-Di55PyAI.js.map +1 -0
- package/dist/{popover-menu-DnRFKnHP.js → popover-menu-B71Tn2Qz.js} +6 -6
- package/dist/{popover-menu-DnRFKnHP.js.map → popover-menu-B71Tn2Qz.js.map} +1 -1
- package/dist/{popover.recipes-wmbvL8Ah.js → popover.recipes-Bdyhj2db.js} +2 -2
- package/dist/{popover.recipes-wmbvL8Ah.js.map → popover.recipes-Bdyhj2db.js.map} +1 -1
- package/dist/{primitives-BHrwQXFC.js → primitives-B-CkiEMU.js} +5 -5
- package/dist/{primitives-BHrwQXFC.js.map → primitives-B-CkiEMU.js.map} +1 -1
- package/dist/primitives.js +4 -4
- package/dist/{progress-Br9WTFya.js → progress-rnS8-uAW.js} +9 -9
- package/dist/{progress-Br9WTFya.js.map → progress-rnS8-uAW.js.map} +1 -1
- package/dist/{receipt-CV89q1fs.js → receipt-D0oswZ0p.js} +6 -6
- package/dist/{receipt-CV89q1fs.js.map → receipt-D0oswZ0p.js.map} +1 -1
- package/dist/rich-text-DvGulsNJ.js +78 -0
- package/dist/rich-text-DvGulsNJ.js.map +1 -0
- package/dist/rich-text-editor-sMU_Scqm.js +1204 -0
- package/dist/rich-text-editor-sMU_Scqm.js.map +1 -0
- package/dist/rich-text-editor.recipes-CadiF_Uu.js +88 -0
- package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +1 -0
- package/dist/rich-text-editor.strings-CB59ekH2.js +38 -0
- package/dist/rich-text-editor.strings-CB59ekH2.js.map +1 -0
- package/dist/safe-image-src-C6kQSMBZ.js +17 -0
- package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
- package/dist/sanitize-html-DsQmI48u.js +92 -0
- package/dist/sanitize-html-DsQmI48u.js.map +1 -0
- package/dist/scroll-area-Bt_vXY2b.js +48 -0
- package/dist/scroll-area-Bt_vXY2b.js.map +1 -0
- package/dist/{separator-Do5GWDYi.js → separator-C8DlRGwF.js} +3 -3
- package/dist/{separator-Do5GWDYi.js.map → separator-C8DlRGwF.js.map} +1 -1
- package/dist/{separator-BMEvwnSX.js → separator-CYHnjsAb.js} +2 -2
- package/dist/{separator-BMEvwnSX.js.map → separator-CYHnjsAb.js.map} +1 -1
- package/dist/services/actions/action-adapters.d.ts +18 -0
- package/dist/services/actions/index.d.ts +1 -1
- package/dist/services/actions.js +16 -4
- package/dist/services/actions.js.map +1 -1
- package/dist/settings-CQW3b-Cu.js +170 -0
- package/dist/settings-CQW3b-Cu.js.map +1 -0
- package/dist/sheet-4SEvVYzA.js +210 -0
- package/dist/sheet-4SEvVYzA.js.map +1 -0
- package/dist/{sidebar-Crc9M9JV.js → sidebar-C7WWR29L.js} +180 -179
- package/dist/sidebar-C7WWR29L.js.map +1 -0
- package/dist/{sidebar-Cb8WzOvE.js → sidebar-d7Dg80ln.js} +16 -16
- package/dist/sidebar-d7Dg80ln.js.map +1 -0
- package/dist/{skeleton-DVMXr15h.js → skeleton-Cz890JZF.js} +9 -9
- package/dist/{skeleton-DVMXr15h.js.map → skeleton-Cz890JZF.js.map} +1 -1
- package/dist/smart-card-lFKxn5Hu.js +595 -0
- package/dist/smart-card-lFKxn5Hu.js.map +1 -0
- package/dist/{spinner-CmTAbEp0.js → spinner-fa3h1Aif.js} +7 -7
- package/dist/{spinner-CmTAbEp0.js.map → spinner-fa3h1Aif.js.map} +1 -1
- package/dist/{structure-hzCW-XsV.js → structure-DC2dygdA.js} +2 -2
- package/dist/{structure-hzCW-XsV.js.map → structure-DC2dygdA.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/surface-recipes-BKRVW8Os.js +43 -0
- package/dist/surface-recipes-BKRVW8Os.js.map +1 -0
- package/dist/{table-D6zKeYQX.js → table-CIKyLUsy.js} +59 -58
- package/dist/table-CIKyLUsy.js.map +1 -0
- package/dist/table-CrcLN9Io.js +1458 -0
- package/dist/table-CrcLN9Io.js.map +1 -0
- package/dist/{tabs-Dk8E_knt.js → tabs-DwBJfjxX.js} +58 -57
- package/dist/tabs-DwBJfjxX.js.map +1 -0
- package/dist/{text-inputs-BFpku0Qd.js → text-inputs-aaK9wcDT.js} +74 -79
- package/dist/text-inputs-aaK9wcDT.js.map +1 -0
- package/dist/theme.css +3 -3
- package/dist/{timelines-CxuAFIc2.js → timelines-C_SBwHNP.js} +153 -150
- package/dist/timelines-C_SBwHNP.js.map +1 -0
- package/dist/tone-recipes-CPoExcTE.js +70 -0
- package/dist/tone-recipes-CPoExcTE.js.map +1 -0
- package/dist/tooltip-CsfgrfS7.js +111 -0
- package/dist/tooltip-CsfgrfS7.js.map +1 -0
- package/dist/{tree-BotPlyiD.js → tree-BiKhg8AY.js} +68 -66
- package/dist/tree-BiKhg8AY.js.map +1 -0
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-DTRkE9zL.js +117 -0
- package/dist/typography-DTRkE9zL.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-D2_TeLqw.js → ui-provider-1D_NSYzO.js} +11 -3
- package/dist/ui-provider-1D_NSYzO.js.map +1 -0
- package/dist/ui-provider.js +3 -3
- package/dist/{upload-B0WHW7ak.js → upload-BO8-CLN6.js} +209 -209
- package/dist/upload-BO8-CLN6.js.map +1 -0
- package/dist/{upload-queue-BHZ_wBfd.js → upload-queue-EOC8g1gf.js} +109 -111
- package/dist/upload-queue-EOC8g1gf.js.map +1 -0
- package/dist/upload.recipes-BbxTqrCT.js +61 -0
- package/dist/upload.recipes-BbxTqrCT.js.map +1 -0
- package/dist/{usage-card-U0YBLTNT.js → usage-card-obRaBskq.js} +46 -46
- package/dist/{usage-card-U0YBLTNT.js.map → usage-card-obRaBskq.js.map} +1 -1
- package/dist/{utils-Cospvlj1.js → utils-l5LpDw2z.js} +56 -24
- package/dist/utils-l5LpDw2z.js.map +1 -0
- package/dist/value-inputs-TAYMX111.js +947 -0
- package/dist/value-inputs-TAYMX111.js.map +1 -0
- package/dist/{value-typography-Deb3yQZg.js → value-typography-b8wpz1eX.js} +2 -2
- package/dist/{value-typography-Deb3yQZg.js.map → value-typography-b8wpz1eX.js.map} +1 -1
- package/dist/workspace-DH0v0KcB.js +407 -0
- package/dist/workspace-DH0v0KcB.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +19 -20
- package/docs/consumer-skill/examples/app-layout.tsx +1 -1
- package/docs/consumer-skill/examples/composition.tsx +3 -3
- package/docs/consumer-skill/examples/detail.tsx +59 -12
- package/docs/consumer-skill/examples/edit.tsx +1 -1
- package/docs/consumer-skill/examples/receipt.tsx +2 -2
- package/docs/consumer-skill/examples/scoped-directory.tsx +1 -1
- package/docs/consumer-skill/examples/website.tsx +1 -1
- package/docs/consumer-skill/references/agents-md.md +33 -0
- package/docs/consumer-skill/references/analytics.md +1 -1
- package/docs/consumer-skill/references/composition.md +51 -8
- package/docs/consumer-skill/references/design-contract.md +12 -3
- package/docs/consumer-skill/references/installation.md +11 -1
- package/docs/consumer-skill/references/public-api.json +847 -447
- package/docs/consumer-skill/references/review.md +25 -5
- package/docs/consumer-skill/references/theming.md +8 -4
- package/docs/consumer-skill/references/tokens.json +1 -1
- package/docs/consumer-skill/references/workflows.md +29 -10
- package/docs/consumer-skill/scripts/composition-policy.mjs +41 -11
- package/docs/consumer-skill/scripts/surface-policy.mjs +139 -5
- package/package.json +10 -2
- package/dist/accordion-CQXVcd7Q.js.map +0 -1
- package/dist/action-menu-BTpyPWJ2.js +0 -264
- package/dist/action-menu-BTpyPWJ2.js.map +0 -1
- package/dist/affordance-geometry.generated-CCIXb2A1.js.map +0 -1
- package/dist/ai-artifact-2PQ2fItc.js.map +0 -1
- package/dist/attachment-q69dlt5Y.js +0 -244
- package/dist/attachment-q69dlt5Y.js.map +0 -1
- package/dist/auth-M3vGMgDR.js.map +0 -1
- package/dist/avatar-djdaaQ_s.js.map +0 -1
- package/dist/badge-0tATj-tW.js +0 -92
- package/dist/badge-0tATj-tW.js.map +0 -1
- package/dist/breadcrumbs-BG_FfMK4.js +0 -128
- package/dist/breadcrumbs-BG_FfMK4.js.map +0 -1
- package/dist/button-BS3KDg00.js.map +0 -1
- package/dist/button-R9CCoH7A.js.map +0 -1
- package/dist/buttons-DS0ZIwJ_.js +0 -99
- package/dist/buttons-DS0ZIwJ_.js.map +0 -1
- package/dist/cards-QoJ4syG9.js.map +0 -1
- package/dist/checkbox-B7ygNTYp.js +0 -35
- package/dist/checkbox-B7ygNTYp.js.map +0 -1
- package/dist/choice-inputs-DrJ17tpL.js +0 -752
- package/dist/choice-inputs-DrJ17tpL.js.map +0 -1
- package/dist/code-block-CD0B7M93.js +0 -183
- package/dist/code-block-CD0B7M93.js.map +0 -1
- package/dist/combobox-6dvVny2q.js.map +0 -1
- package/dist/combobox-CB7039j7.js.map +0 -1
- package/dist/comments-You0Bzbr.js.map +0 -1
- package/dist/components/layout/page/partials/page-header-commands.d.ts +0 -13
- package/dist/containers-D_L4mTVb.js.map +0 -1
- package/dist/data-display-3xWQUnMA.js +0 -1335
- package/dist/data-display-3xWQUnMA.js.map +0 -1
- package/dist/date-picker-DrDFj8Lo.js +0 -1527
- package/dist/date-picker-DrDFj8Lo.js.map +0 -1
- package/dist/display-DrdvPwF0.js.map +0 -1
- package/dist/feedback-C7nR0UtT.js.map +0 -1
- package/dist/field-affordance-recipes-CkOCdE2y.js.map +0 -1
- package/dist/field-state-recipes-C-MFBX_8.js +0 -11
- package/dist/field-state-recipes-C-MFBX_8.js.map +0 -1
- package/dist/filters-Da-gNPsE.js.map +0 -1
- package/dist/form-sizing-uWP4lzVh.js.map +0 -1
- package/dist/forms-numeric-D3CO60IF.js.map +0 -1
- package/dist/header-2ycNqGOR.js.map +0 -1
- package/dist/icon-badge-DKlaKXoo.js +0 -53
- package/dist/icon-badge-DKlaKXoo.js.map +0 -1
- package/dist/input-DhQdBnV3.js +0 -255
- package/dist/input-DhQdBnV3.js.map +0 -1
- package/dist/item-xzh8Df65.js.map +0 -1
- package/dist/media-gallery-DQUQ0m3O.js +0 -201
- package/dist/media-gallery-DQUQ0m3O.js.map +0 -1
- package/dist/mentions-DwnO1hh4.js +0 -564
- package/dist/mentions-DwnO1hh4.js.map +0 -1
- package/dist/navigation-Cbp5V8gG.js +0 -264
- package/dist/navigation-Cbp5V8gG.js.map +0 -1
- package/dist/navigation-Cs1npsPm.js +0 -300
- package/dist/navigation-Cs1npsPm.js.map +0 -1
- package/dist/overlay.recipes-CNO2S9V6.js +0 -34
- package/dist/overlay.recipes-CNO2S9V6.js.map +0 -1
- package/dist/overlays-DhZO7N-I.js +0 -994
- package/dist/overlays-DhZO7N-I.js.map +0 -1
- package/dist/page-C6R_8jFt.js +0 -325
- package/dist/page-C6R_8jFt.js.map +0 -1
- package/dist/page-header-hUTzcRZX.js +0 -112
- package/dist/page-header-hUTzcRZX.js.map +0 -1
- package/dist/popover-Dcv_9jxr.js.map +0 -1
- package/dist/rich-text-editor-CF8QYt5p.js +0 -574
- package/dist/rich-text-editor-CF8QYt5p.js.map +0 -1
- package/dist/rich-text-editor.recipes-CnrbmTS1.js +0 -81
- package/dist/rich-text-editor.recipes-CnrbmTS1.js.map +0 -1
- package/dist/rich-text-editor.strings-BpnIQgMl.js +0 -25
- package/dist/rich-text-editor.strings-BpnIQgMl.js.map +0 -1
- package/dist/rich-text-j-FGAeZW.js +0 -32
- package/dist/rich-text-j-FGAeZW.js.map +0 -1
- package/dist/sanitize-html-BG9FGe-j.js +0 -64
- package/dist/sanitize-html-BG9FGe-j.js.map +0 -1
- package/dist/scroll-area-DRdr16Pt.js +0 -47
- package/dist/scroll-area-DRdr16Pt.js.map +0 -1
- package/dist/settings-DHk0L2MF.js +0 -161
- package/dist/settings-DHk0L2MF.js.map +0 -1
- package/dist/sheet-DRFNY1_D.js +0 -207
- package/dist/sheet-DRFNY1_D.js.map +0 -1
- package/dist/sidebar-Cb8WzOvE.js.map +0 -1
- package/dist/sidebar-Crc9M9JV.js.map +0 -1
- package/dist/smart-card-Bek-TwUp.js +0 -599
- package/dist/smart-card-Bek-TwUp.js.map +0 -1
- package/dist/surface-recipes-DOdoBXGm.js +0 -28
- package/dist/surface-recipes-DOdoBXGm.js.map +0 -1
- package/dist/table-D6zKeYQX.js.map +0 -1
- package/dist/table-Dn4XSrSB.js +0 -1444
- package/dist/table-Dn4XSrSB.js.map +0 -1
- package/dist/tabs-Dk8E_knt.js.map +0 -1
- package/dist/text-inputs-BFpku0Qd.js.map +0 -1
- package/dist/timelines-CxuAFIc2.js.map +0 -1
- package/dist/tree-BotPlyiD.js.map +0 -1
- package/dist/typography-CAr3dQhX.js +0 -116
- package/dist/typography-CAr3dQhX.js.map +0 -1
- package/dist/ui-provider-D2_TeLqw.js.map +0 -1
- package/dist/upload-B0WHW7ak.js.map +0 -1
- package/dist/upload-queue-BHZ_wBfd.js.map +0 -1
- package/dist/use-file-drop-target-BX7GnhoQ.js +0 -39
- package/dist/use-file-drop-target-BX7GnhoQ.js.map +0 -1
- package/dist/utils-Cospvlj1.js.map +0 -1
- package/dist/value-inputs-CjfzGMsN.js +0 -854
- package/dist/value-inputs-CjfzGMsN.js.map +0 -1
- package/dist/workspace-YoFjXi6i.js +0 -394
- package/dist/workspace-YoFjXi6i.js.map +0 -1
- /package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.strings.d.ts +0 -0
package/dist/features/kanban.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useStrings as e } from "../lib/strings.js";
|
|
3
|
-
import { t } from "../utils-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
3
|
+
import { t } from "../utils-l5LpDw2z.js";
|
|
4
|
+
import { n } from "../buttons-SbIcm1HJ.js";
|
|
5
|
+
import { s as r } from "../typography-DTRkE9zL.js";
|
|
6
|
+
import { r as i } from "../tone-recipes-CPoExcTE.js";
|
|
7
|
+
import { n as a } from "../action-menu-TzCoSlwL.js";
|
|
8
|
+
import { createContext as o, forwardRef as s, useCallback as c, useContext as l, useEffect as u, useLayoutEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
9
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
10
10
|
import { DndContext as _, DragOverlay as v, KeyboardSensor as y, PointerSensor as b, useDroppable as x, useSensor as S, useSensors as C } from "@dnd-kit/core";
|
|
11
11
|
import { SortableContext as w, useSortable as T, verticalListSortingStrategy as E } from "@dnd-kit/sortable";
|
|
12
12
|
import { CSS as D } from "@dnd-kit/utilities";
|
|
@@ -50,7 +50,7 @@ function k(e, t, n, r, i) {
|
|
|
50
50
|
//#endregion
|
|
51
51
|
//#region src/components/features/kanban/hooks/use-kanban.ts
|
|
52
52
|
function A({ value: e, onValueChange: t, getItemValue: n, onItemMove: r }) {
|
|
53
|
-
let i =
|
|
53
|
+
let i = c((t) => {
|
|
54
54
|
for (let [r, i] of Object.entries(e)) {
|
|
55
55
|
let e = i.findIndex((e) => n(e) === t);
|
|
56
56
|
if (e >= 0) return {
|
|
@@ -59,7 +59,7 @@ function A({ value: e, onValueChange: t, getItemValue: n, onItemMove: r }) {
|
|
|
59
59
|
item: i[e]
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
|
-
}, [e, n]), a =
|
|
62
|
+
}, [e, n]), a = c(({ itemId: n, toColumnId: a, toIndex: o }) => {
|
|
63
63
|
let s = i(n);
|
|
64
64
|
if (!s || !Object.prototype.hasOwnProperty.call(e, a)) return;
|
|
65
65
|
let { columnId: c, index: l, item: u } = s, d = e[a], f = o === void 0 ? d.length : Math.max(0, Math.min(o, d.length));
|
|
@@ -85,22 +85,22 @@ function A({ value: e, onValueChange: t, getItemValue: n, onItemMove: r }) {
|
|
|
85
85
|
t,
|
|
86
86
|
r
|
|
87
87
|
]);
|
|
88
|
-
return
|
|
88
|
+
return f(() => ({
|
|
89
89
|
findItem: i,
|
|
90
90
|
move: a
|
|
91
91
|
}), [i, a]);
|
|
92
92
|
}
|
|
93
93
|
//#endregion
|
|
94
94
|
//#region src/components/features/kanban/kanban-context.tsx
|
|
95
|
-
var j =
|
|
95
|
+
var j = o(null), M = j.Provider;
|
|
96
96
|
function N() {
|
|
97
|
-
let e =
|
|
97
|
+
let e = l(j);
|
|
98
98
|
if (!e) throw Error("Kanban subcomponents must be rendered inside a <Kanban> root.");
|
|
99
99
|
return e;
|
|
100
100
|
}
|
|
101
|
-
var P =
|
|
101
|
+
var P = o(null), F = P.Provider;
|
|
102
102
|
function I() {
|
|
103
|
-
let e =
|
|
103
|
+
let e = l(P);
|
|
104
104
|
if (!e) throw Error("<KanbanItemHandle> / <KanbanItemActions> must be rendered inside a <KanbanItem>.");
|
|
105
105
|
return e;
|
|
106
106
|
}
|
|
@@ -120,32 +120,32 @@ function R(e, t) {
|
|
|
120
120
|
}
|
|
121
121
|
//#endregion
|
|
122
122
|
//#region src/components/features/kanban/kanban.tsx
|
|
123
|
-
function z({ value:
|
|
123
|
+
function z({ value: n, onValueChange: i, getItemValue: a, getItemLabel: o, getColumnLabel: s, onItemMove: l, itemActions: u, onItemClick: v, strings: x, className: w, children: T }) {
|
|
124
124
|
let E = e(L, x), { findItem: D, move: O } = A({
|
|
125
|
-
value:
|
|
125
|
+
value: n,
|
|
126
126
|
onValueChange: i,
|
|
127
127
|
getItemValue: a,
|
|
128
128
|
onItemMove: l
|
|
129
|
-
}), [j, N] =
|
|
130
|
-
|
|
129
|
+
}), [j, N] = m(null), P = p(null), F = p(null);
|
|
130
|
+
d(() => {
|
|
131
131
|
if (j || !F.current) return;
|
|
132
132
|
let e = Array.from(P.current?.querySelectorAll("[data-kanban-item-id]") ?? []).find((e) => e.dataset.kanbanItemId === F.current), t = e?.querySelector("[data-slot=\"kanban-item-handle\"]") ?? e;
|
|
133
133
|
t && (t.focus(), F.current = null);
|
|
134
|
-
}, [j,
|
|
135
|
-
let I =
|
|
136
|
-
|
|
134
|
+
}, [j, n]);
|
|
135
|
+
let I = p(null), z = p(null), [B, V] = m(null), H = p(null), U = f(() => k(n, a, D, H, V), [
|
|
136
|
+
n,
|
|
137
137
|
a,
|
|
138
138
|
D
|
|
139
|
-
]), W = C(S(b, { activationConstraint: { distance: 6 } }), S(y, { coordinateGetter: U })), G =
|
|
139
|
+
]), W = C(S(b, { activationConstraint: { distance: 6 } }), S(y, { coordinateGetter: U })), G = f(() => j ? D(j)?.item ?? null : null, [j, D]), K = c((e) => {
|
|
140
140
|
let t = D(String(e.active.id));
|
|
141
141
|
I.current = t ? {
|
|
142
142
|
columnId: t.columnId,
|
|
143
143
|
index: t.index,
|
|
144
144
|
name: o?.(t.item) ?? String(e.active.id)
|
|
145
145
|
} : null, z.current = null, V(null), H.current = null, F.current = e.activatorEvent instanceof KeyboardEvent ? String(e.active.id) : null, N(String(e.active.id));
|
|
146
|
-
}, [D, o]), q =
|
|
146
|
+
}, [D, o]), q = c((e) => {
|
|
147
147
|
N(null), V(null);
|
|
148
|
-
let { active: t, over:
|
|
148
|
+
let { active: t, over: r } = e, i = H.current;
|
|
149
149
|
if (z.current = i, H.current = null, i) {
|
|
150
150
|
let e = D(String(t.id)), n = e?.columnId === i.columnId && e.index < i.index ? i.index + 1 : i.index;
|
|
151
151
|
O({
|
|
@@ -155,11 +155,11 @@ function z({ value: r, onValueChange: i, getItemValue: a, getItemLabel: o, getCo
|
|
|
155
155
|
});
|
|
156
156
|
return;
|
|
157
157
|
}
|
|
158
|
-
if (!
|
|
158
|
+
if (!r) return;
|
|
159
159
|
t.data.current;
|
|
160
|
-
let a =
|
|
160
|
+
let a = r.data.current, o = String(r.id), s = a?.columnId ?? (Object.prototype.hasOwnProperty.call(n, o) ? o : void 0);
|
|
161
161
|
if (!s) return;
|
|
162
|
-
let c = a?.columnId === void 0 ?
|
|
162
|
+
let c = a?.columnId === void 0 ? n[s].length : a.index;
|
|
163
163
|
O({
|
|
164
164
|
itemId: String(t.id),
|
|
165
165
|
toColumnId: s,
|
|
@@ -167,41 +167,41 @@ function z({ value: r, onValueChange: i, getItemValue: a, getItemLabel: o, getCo
|
|
|
167
167
|
});
|
|
168
168
|
}, [
|
|
169
169
|
O,
|
|
170
|
-
|
|
170
|
+
n,
|
|
171
171
|
D
|
|
172
|
-
]), J =
|
|
173
|
-
value:
|
|
172
|
+
]), J = f(() => ({
|
|
173
|
+
value: n,
|
|
174
174
|
onValueChange: i,
|
|
175
175
|
getItemValue: a,
|
|
176
176
|
activeId: j,
|
|
177
177
|
activeItem: G,
|
|
178
178
|
findItem: D,
|
|
179
|
-
itemActions:
|
|
179
|
+
itemActions: u,
|
|
180
180
|
onItemClick: v
|
|
181
181
|
}), [
|
|
182
|
-
|
|
182
|
+
n,
|
|
183
183
|
i,
|
|
184
184
|
a,
|
|
185
185
|
j,
|
|
186
186
|
G,
|
|
187
187
|
D,
|
|
188
|
-
|
|
188
|
+
u,
|
|
189
189
|
v
|
|
190
190
|
]), Y = (e, t) => {
|
|
191
|
-
let
|
|
191
|
+
let r = D(e), i = I.current, a = t ? D(t) : void 0, c = H.current ?? z.current ?? a ?? (t && n[t] ? {
|
|
192
192
|
columnId: t,
|
|
193
|
-
index:
|
|
194
|
-
} : i), l = (e) => e ?
|
|
193
|
+
index: n[t].length
|
|
194
|
+
} : i), l = (e) => e ? s?.(e) ?? e : "";
|
|
195
195
|
return {
|
|
196
|
-
name: i?.name ?? (
|
|
196
|
+
name: i?.name ?? (r ? o?.(r.item) ?? e : e),
|
|
197
197
|
from: l(i?.columnId),
|
|
198
|
-
to: l(
|
|
199
|
-
position: String((
|
|
198
|
+
to: l(c?.columnId),
|
|
199
|
+
position: String((c?.index ?? 0) + 1)
|
|
200
200
|
};
|
|
201
201
|
};
|
|
202
|
-
return /* @__PURE__ */
|
|
202
|
+
return /* @__PURE__ */ h(M, {
|
|
203
203
|
value: J,
|
|
204
|
-
children: /* @__PURE__ */
|
|
204
|
+
children: /* @__PURE__ */ h(_, {
|
|
205
205
|
sensors: W,
|
|
206
206
|
onDragStart: K,
|
|
207
207
|
onDragEnd: q,
|
|
@@ -225,17 +225,17 @@ function z({ value: r, onValueChange: i, getItemValue: a, getItemLabel: o, getCo
|
|
|
225
225
|
return R(E.announceDragCancel, Y(String(e.id)));
|
|
226
226
|
}
|
|
227
227
|
} },
|
|
228
|
-
children: /* @__PURE__ */
|
|
228
|
+
children: /* @__PURE__ */ g("div", {
|
|
229
229
|
ref: P,
|
|
230
230
|
role: "application",
|
|
231
231
|
"aria-label": E.boardAria,
|
|
232
232
|
className: t("kanban--component", "w-full", w),
|
|
233
|
-
children: [T, /* @__PURE__ */
|
|
233
|
+
children: [T, /* @__PURE__ */ h("div", {
|
|
234
234
|
className: "kanban--keyboard-announcement sr-only",
|
|
235
235
|
role: "status",
|
|
236
236
|
"aria-live": "assertive",
|
|
237
237
|
"aria-atomic": "true",
|
|
238
|
-
children: /* @__PURE__ */
|
|
238
|
+
children: /* @__PURE__ */ h(r, {
|
|
239
239
|
tag: "span",
|
|
240
240
|
children: j && B ? R(E.announceDragMove, Y(j)) : ""
|
|
241
241
|
})
|
|
@@ -246,7 +246,7 @@ function z({ value: r, onValueChange: i, getItemValue: a, getItemLabel: o, getCo
|
|
|
246
246
|
}
|
|
247
247
|
z.displayName = "Kanban";
|
|
248
248
|
function B({ className: e, style: n, children: r }) {
|
|
249
|
-
return /* @__PURE__ */
|
|
249
|
+
return /* @__PURE__ */ h("div", {
|
|
250
250
|
className: t("grid w-full gap-space-lg", e),
|
|
251
251
|
style: n,
|
|
252
252
|
children: r
|
|
@@ -255,7 +255,7 @@ function B({ className: e, style: n, children: r }) {
|
|
|
255
255
|
B.displayName = "KanbanBoard";
|
|
256
256
|
function V({ value: e, className: n, children: r }) {
|
|
257
257
|
let { setNodeRef: i, isOver: a } = x({ id: e });
|
|
258
|
-
return /* @__PURE__ */
|
|
258
|
+
return /* @__PURE__ */ h("div", {
|
|
259
259
|
ref: i,
|
|
260
260
|
"data-slot": "kanban-column",
|
|
261
261
|
"data-column-id": e,
|
|
@@ -267,10 +267,10 @@ function V({ value: e, className: n, children: r }) {
|
|
|
267
267
|
V.displayName = "KanbanColumn";
|
|
268
268
|
function H({ value: e, className: n, children: r }) {
|
|
269
269
|
let i = N(), a = (i.value[e] ?? []).map((e) => i.getItemValue(e));
|
|
270
|
-
return /* @__PURE__ */
|
|
270
|
+
return /* @__PURE__ */ h(w, {
|
|
271
271
|
items: a,
|
|
272
272
|
strategy: E,
|
|
273
|
-
children: /* @__PURE__ */
|
|
273
|
+
children: /* @__PURE__ */ h("div", {
|
|
274
274
|
"data-slot": "kanban-column-content",
|
|
275
275
|
className: t("flex flex-col gap-space-md", n),
|
|
276
276
|
children: r
|
|
@@ -279,48 +279,48 @@ function H({ value: e, className: n, children: r }) {
|
|
|
279
279
|
}
|
|
280
280
|
H.displayName = "KanbanColumnContent";
|
|
281
281
|
function U({ value: e, className: n, disabled: r = !1, onClick: i, children: a }) {
|
|
282
|
-
let o = N(),
|
|
282
|
+
let o = N(), s = o.findItem(e), { attributes: l, listeners: u, setNodeRef: d, setActivatorNodeRef: p, transform: g, transition: _, isDragging: v } = T({
|
|
283
283
|
id: e,
|
|
284
284
|
disabled: r,
|
|
285
285
|
data: {
|
|
286
|
-
columnId:
|
|
287
|
-
index:
|
|
286
|
+
columnId: s?.columnId,
|
|
287
|
+
index: s?.index
|
|
288
288
|
}
|
|
289
289
|
}), y = {
|
|
290
290
|
transform: D.Transform.toString(g),
|
|
291
291
|
transition: _,
|
|
292
292
|
opacity: v ? .4 : void 0
|
|
293
|
-
}, [b, x] =
|
|
293
|
+
}, [b, x] = m(0), S = b > 0, C = c(() => (x((e) => e + 1), () => x((e) => Math.max(0, e - 1))), []), w = f(() => ({
|
|
294
294
|
listeners: u,
|
|
295
295
|
attributes: l,
|
|
296
|
-
setActivatorNodeRef:
|
|
296
|
+
setActivatorNodeRef: p,
|
|
297
297
|
registerHandle: C,
|
|
298
298
|
itemId: e,
|
|
299
|
-
item:
|
|
299
|
+
item: s?.item ?? null
|
|
300
300
|
}), [
|
|
301
301
|
u,
|
|
302
302
|
l,
|
|
303
|
-
|
|
303
|
+
p,
|
|
304
304
|
C,
|
|
305
305
|
e,
|
|
306
|
-
|
|
307
|
-
]), E = o.onItemClick, O =
|
|
306
|
+
s?.item
|
|
307
|
+
]), E = o.onItemClick, O = c((e) => {
|
|
308
308
|
if (!e.target?.closest("[data-stop-item-click]")) {
|
|
309
309
|
if (i) {
|
|
310
310
|
i();
|
|
311
311
|
return;
|
|
312
312
|
}
|
|
313
|
-
E &&
|
|
313
|
+
E && s?.item !== void 0 && E(s.item);
|
|
314
314
|
}
|
|
315
315
|
}, [
|
|
316
316
|
i,
|
|
317
317
|
E,
|
|
318
|
-
|
|
318
|
+
s?.item
|
|
319
319
|
]), k = !!(i || E);
|
|
320
|
-
return /* @__PURE__ */
|
|
320
|
+
return /* @__PURE__ */ h(F, {
|
|
321
321
|
value: w,
|
|
322
|
-
children: /* @__PURE__ */
|
|
323
|
-
ref:
|
|
322
|
+
children: /* @__PURE__ */ h("div", {
|
|
323
|
+
ref: d,
|
|
324
324
|
style: y,
|
|
325
325
|
"data-slot": "kanban-item",
|
|
326
326
|
"data-kanban-item-id": e,
|
|
@@ -334,13 +334,13 @@ function U({ value: e, className: n, disabled: r = !1, onClick: i, children: a }
|
|
|
334
334
|
});
|
|
335
335
|
}
|
|
336
336
|
U.displayName = "KanbanItem";
|
|
337
|
-
var W =
|
|
338
|
-
let { setActivatorNodeRef: a, listeners: o, attributes:
|
|
339
|
-
|
|
340
|
-
let d =
|
|
337
|
+
var W = s(function({ className: e, children: r }, i) {
|
|
338
|
+
let { setActivatorNodeRef: a, listeners: o, attributes: s, registerHandle: l } = I();
|
|
339
|
+
u(() => l(), [l]);
|
|
340
|
+
let d = c((e) => {
|
|
341
341
|
a(e), typeof i == "function" ? i(e) : i && (i.current = e);
|
|
342
342
|
}, [a, i]);
|
|
343
|
-
return /* @__PURE__ */
|
|
343
|
+
return /* @__PURE__ */ h(n, {
|
|
344
344
|
type: "button",
|
|
345
345
|
tone: "secondary",
|
|
346
346
|
buttonStyle: "ghost",
|
|
@@ -350,71 +350,69 @@ var W = o(function({ className: e, children: n }, i) {
|
|
|
350
350
|
"data-slot": "kanban-item-handle",
|
|
351
351
|
"data-stop-item-click": !0,
|
|
352
352
|
onClick: (e) => e.stopPropagation(),
|
|
353
|
-
className: t("cursor-grab shadow-none
|
|
354
|
-
...
|
|
353
|
+
className: t("cursor-grab shadow-none active:cursor-grabbing", e),
|
|
354
|
+
...s,
|
|
355
355
|
...o,
|
|
356
|
-
children:
|
|
356
|
+
children: r
|
|
357
357
|
});
|
|
358
358
|
});
|
|
359
359
|
W.displayName = "KanbanItemHandle";
|
|
360
|
-
function G({ className:
|
|
361
|
-
let
|
|
362
|
-
let t = typeof e.visible == "function" ? e.visible(
|
|
360
|
+
function G({ className: t, icon: n, ariaLabel: r }) {
|
|
361
|
+
let i = N(), o = I(), s = e(L, void 0), c = o.item, l = i.itemActions, u = f(() => !l || c == null ? [] : (typeof l == "function" ? l(c) : l).flatMap((e) => {
|
|
362
|
+
let t = typeof e.visible == "function" ? e.visible(c) : e.visible ?? !0;
|
|
363
363
|
if (!t) return [];
|
|
364
|
-
let n = typeof e.disabled == "function" ? e.disabled(
|
|
364
|
+
let n = typeof e.disabled == "function" ? e.disabled(c) : e.disabled ?? !1;
|
|
365
365
|
return [{
|
|
366
366
|
...e,
|
|
367
367
|
visible: t,
|
|
368
368
|
disabled: n
|
|
369
369
|
}];
|
|
370
|
-
}), [
|
|
371
|
-
if (
|
|
372
|
-
let
|
|
370
|
+
}), [l, c]);
|
|
371
|
+
if (c === null || u.length === 0) return null;
|
|
372
|
+
let d = u.map((e) => ({
|
|
373
373
|
id: e.id,
|
|
374
374
|
label: e.label,
|
|
375
375
|
icon: e.icon,
|
|
376
376
|
disabled: e.disabled,
|
|
377
377
|
tone: e.tone,
|
|
378
378
|
buttonStyle: e.buttonStyle,
|
|
379
|
-
onClick: () => e.onClick(
|
|
379
|
+
onClick: () => e.onClick(c)
|
|
380
380
|
}));
|
|
381
|
-
return /* @__PURE__ */
|
|
381
|
+
return /* @__PURE__ */ h("span", {
|
|
382
382
|
className: "kanban-item-actions--component inline-flex",
|
|
383
383
|
"data-stop-item-click": !0,
|
|
384
384
|
onClick: (e) => e.stopPropagation(),
|
|
385
385
|
onPointerDown: (e) => e.stopPropagation(),
|
|
386
|
-
children: /* @__PURE__ */
|
|
387
|
-
actions:
|
|
388
|
-
icon:
|
|
389
|
-
srText:
|
|
386
|
+
children: /* @__PURE__ */ h(a, {
|
|
387
|
+
actions: d,
|
|
388
|
+
icon: n ?? void 0,
|
|
389
|
+
srText: r ?? s.itemActionsAria,
|
|
390
390
|
width: "w-44",
|
|
391
391
|
align: "end",
|
|
392
392
|
density: "table",
|
|
393
393
|
buttonProps: {
|
|
394
|
-
|
|
395
|
-
iconOnly: !0,
|
|
396
|
-
className: t("text-muted-foreground/70 hover:bg-muted hover:text-foreground", "transition-colors", n),
|
|
394
|
+
className: t,
|
|
397
395
|
"data-slot": "kanban-item-actions-trigger",
|
|
398
396
|
"data-stop-item-click": !0,
|
|
399
|
-
"aria-label":
|
|
397
|
+
"aria-label": r ?? s.itemActionsAria
|
|
400
398
|
}
|
|
401
399
|
})
|
|
402
400
|
});
|
|
403
401
|
}
|
|
404
402
|
G.displayName = "KanbanItemActions";
|
|
405
|
-
function K({ className: e, render:
|
|
406
|
-
let { activeItem:
|
|
407
|
-
return /* @__PURE__ */
|
|
408
|
-
item:
|
|
409
|
-
columnId: o
|
|
410
|
-
}) : /* @__PURE__ */
|
|
411
|
-
className: t("kanban-overlay--component pointer-events-none rounded-radius border-2 border-dashed
|
|
412
|
-
children: /* @__PURE__ */
|
|
403
|
+
function K({ className: e, render: n }) {
|
|
404
|
+
let { activeItem: a, activeId: o, findItem: s } = N();
|
|
405
|
+
return /* @__PURE__ */ h(v, { children: o ? n ? n({
|
|
406
|
+
item: a,
|
|
407
|
+
columnId: s(o)?.columnId ?? null
|
|
408
|
+
}) : /* @__PURE__ */ h("div", {
|
|
409
|
+
className: t("kanban-overlay--component pointer-events-none rounded-radius border-2 border-dashed p-surface shadow-lg", i.primary.edge, i.primary.wash, e),
|
|
410
|
+
children: /* @__PURE__ */ h(r, {
|
|
413
411
|
tag: "span",
|
|
414
412
|
size: "xs",
|
|
415
413
|
weight: "medium",
|
|
416
|
-
className: "text-primary-accent
|
|
417
|
-
children:
|
|
414
|
+
className: "text-primary-accent",
|
|
415
|
+
children: o
|
|
418
416
|
})
|
|
419
417
|
}) : null });
|
|
420
418
|
}
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"file":"kanban.js","names":["Text","toneRecipes","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","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 { 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';\nimport { toneRecipes } from '../../../lib/tone-recipes';\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 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 ?? undefined}\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\tclassName,\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 p-surface shadow-lg',\n\t\t\t\t\t\t\t\ttoneRecipes.primary.edge,\n\t\t\t\t\t\t\t\ttoneRecipes.primary.wash,\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\">{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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"}
|