themelia-react-ui 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +190 -1
- package/README.md +92 -13
- package/dist/{accordion-BRWh3BM1.js → accordion-BRTcsp8J.js} +8 -8
- package/dist/accordion-BRTcsp8J.js.map +1 -0
- package/dist/{action-menu-Cx3SdfbN.js → action-menu-Drxw_vJk.js} +36 -36
- package/dist/action-menu-Drxw_vJk.js.map +1 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js +63 -0
- package/dist/affordance-geometry.generated-CL84ZN9A.js.map +1 -0
- package/dist/{ai-artifact-DkOArd3-.js → ai-artifact-DLVdK0Py.js} +151 -155
- package/dist/ai-artifact-DLVdK0Py.js.map +1 -0
- package/dist/{app-shell-BH_bGcE2.js → app-shell-C_fKpljx.js} +11 -10
- package/dist/app-shell-C_fKpljx.js.map +1 -0
- package/dist/{attachment-DsLgNHXt.js → attachment-DbjUWsP0.js} +12 -12
- package/dist/{attachment-DsLgNHXt.js.map → attachment-DbjUWsP0.js.map} +1 -1
- package/dist/auth-CAQcasMV.js +723 -0
- package/dist/auth-CAQcasMV.js.map +1 -0
- package/dist/{avatar-CsnWaYmt.js → avatar-Bu2HhitA.js} +76 -71
- package/dist/avatar-Bu2HhitA.js.map +1 -0
- package/dist/{badge-BZXZT9wd.js → badge-CzId1Wlm.js} +4 -4
- package/dist/{badge-BZXZT9wd.js.map → badge-CzId1Wlm.js.map} +1 -1
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/buttons.js +3 -2
- package/dist/base/cards.js +3 -3
- package/dist/base/carousel.js +25 -27
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +150 -148
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +3 -2
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +3 -3
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +4 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +233 -0
- package/dist/base/inline-edit.js.map +1 -0
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/navigation.js +6 -6
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +1 -1
- package/dist/base/repeaters.js +33 -33
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +1 -1
- package/dist/base/signature-pad.js +83 -81
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +1 -1
- package/dist/base/structure.js +1 -1
- package/dist/base/table.js +1 -1
- package/dist/base/text-inputs.js +2 -2
- package/dist/base/toaster.js +6 -6
- package/dist/base/toaster.js.map +1 -1
- package/dist/base/tree.js +1 -1
- package/dist/base/upload-queue.js +1 -1
- package/dist/base/upload.js +3 -3
- package/dist/base/value-inputs.js +1 -1
- package/dist/blocks/admin.js +134 -134
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +120 -117
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +3 -0
- package/dist/blocks/analytics.js +530 -491
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +2 -2
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +395 -383
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +1 -1
- package/dist/blocks/onboarding.js +6 -6
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +311 -0
- package/dist/blocks/planning.js.map +1 -0
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-DdQ_I5ra.js → breadcrumbs-BuYz5SDU.js} +9 -8
- package/dist/breadcrumbs-BuYz5SDU.js.map +1 -0
- package/dist/button-BZDasD04.js +651 -0
- package/dist/button-BZDasD04.js.map +1 -0
- package/dist/{button-BS6l5JUw.js → button-BZyfTvwm.js} +3 -3
- package/dist/button-BZyfTvwm.js.map +1 -0
- package/dist/buttons-D_6KJvEE.js +99 -0
- package/dist/buttons-D_6KJvEE.js.map +1 -0
- package/dist/{cards-BMB0laLG.js → cards-qGSErLw_.js} +12 -12
- package/dist/{cards-BMB0laLG.js.map → cards-qGSErLw_.js.map} +1 -1
- package/dist/chart-Bsc5BICK.js +150 -0
- package/dist/chart-Bsc5BICK.js.map +1 -0
- package/dist/checkbox-BQNDjUCh.js +34 -0
- package/dist/checkbox-BQNDjUCh.js.map +1 -0
- package/dist/choice-inputs-Mk3iWbhr.js +725 -0
- package/dist/choice-inputs-Mk3iWbhr.js.map +1 -0
- package/dist/{code-block-DIlqzoiD.js → code-block-DzHKRybS.js} +23 -23
- package/dist/code-block-DzHKRybS.js.map +1 -0
- package/dist/{collapsible-DsnktFNv.js → collapsible-ClvC7Bj3.js} +3 -3
- package/dist/{collapsible-DsnktFNv.js.map → collapsible-ClvC7Bj3.js.map} +1 -1
- package/dist/{collection-content-C4fthJV_.js → collection-content-D6S8cv_n.js} +3 -3
- package/dist/{collection-content-C4fthJV_.js.map → collection-content-D6S8cv_n.js.map} +1 -1
- package/dist/{combobox-HDftpzxt.js → combobox-BFnbJJp3.js} +18 -18
- package/dist/combobox-BFnbJJp3.js.map +1 -0
- package/dist/{combobox-CHD750do.js → combobox-hozNwUcc.js} +313 -316
- package/dist/combobox-hozNwUcc.js.map +1 -0
- package/dist/{command-D0kWBZfd.js → command-BnmSchli.js} +9 -9
- package/dist/command-BnmSchli.js.map +1 -0
- package/dist/comments-u5L0OGip.js +1156 -0
- package/dist/comments-u5L0OGip.js.map +1 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
- package/dist/components/base/buttons/button.recipes.d.ts +10 -19
- package/dist/components/base/buttons/use-pending-button-focus.d.ts +3 -0
- package/dist/components/base/cards/card.recipes.d.ts +13 -5
- package/dist/components/base/cards/partials/card-primitives.d.ts +9 -4
- package/dist/components/base/cards/smart-card.types.d.ts +3 -1
- package/dist/components/base/date-pickers/date-picker.recipes.d.ts +5 -18
- package/dist/components/base/date-pickers/datepicker.types.d.ts +3 -0
- package/dist/components/base/forms/form-field.d.ts +1 -0
- package/dist/components/base/forms/form-sizing.d.ts +3 -3
- package/dist/components/base/inline-edit/index.d.ts +2 -0
- package/dist/components/base/inline-edit/inline-edit.d.ts +81 -0
- package/dist/components/base/inline-edit/inline-edit.recipes.d.ts +6 -0
- package/dist/components/base/navigation/tabs.d.ts +3 -5
- package/dist/components/base/popover/popover.recipes.d.ts +3 -3
- package/dist/components/base/structure/structure.recipes.d.ts +6 -0
- package/dist/components/base/table/index.d.ts +1 -1
- package/dist/components/base/text-inputs/clear-native-field.d.ts +2 -0
- package/dist/components/base/text-inputs/input-trailing-action.d.ts +3 -0
- package/dist/components/blocks/analytics/index.d.ts +1 -0
- package/dist/components/blocks/analytics/types.d.ts +1 -1
- package/dist/components/blocks/analytics/usage-card/index.d.ts +3 -0
- package/dist/components/blocks/analytics/usage-card/types.d.ts +52 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.d.ts +6 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.data.d.ts +19 -0
- package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +22 -0
- package/dist/components/blocks/collaboration/message/message.recipes.d.ts +12 -0
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/document-stack.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/inbox-clean.d.ts +1 -4
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/index.d.ts +3 -3
- package/dist/components/blocks/data-display/empty-state/partials/illustrations/stacked-cards.d.ts +1 -6
- package/dist/components/blocks/planning/index.d.ts +3 -0
- package/dist/components/blocks/planning/task-card.d.ts +3 -0
- package/dist/components/blocks/planning/task-card.strings.d.ts +15 -0
- package/dist/components/blocks/planning/task-card.types.d.ts +66 -0
- package/dist/components/features/combobox/components/error-message.d.ts +1 -1
- package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -0
- package/dist/components/features/filters/facets/search-facet.d.ts +0 -12
- package/dist/components/features/filters/facets/tags-facet.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.types.d.ts +9 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
- package/dist/components/features/overlays/hooks/use-pending-overlay-focus.d.ts +2 -0
- package/dist/components/features/overlays/overlays.types.d.ts +5 -4
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +2 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +1 -1
- package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +3 -1
- package/dist/components/layout/auth/auth.types.d.ts +1 -0
- package/dist/components/layout/page/page.d.ts +0 -1
- package/dist/components/layout/page/page.types.d.ts +9 -3
- package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -1
- package/dist/components/layout/sidebar/sidebar.types.d.ts +4 -0
- package/dist/components/layout/workspace/workspace.types.d.ts +3 -0
- package/dist/components/typography/heading.d.ts +5 -2
- package/dist/components/typography/index.d.ts +1 -1
- package/dist/components/typography/text.styles.d.ts +10 -0
- package/dist/components/ui/popover.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- package/dist/components/ui/table.d.ts +2 -1
- package/dist/container.recipes-D9t8MHR3.js +27 -0
- package/dist/container.recipes-D9t8MHR3.js.map +1 -0
- package/dist/{containers-CPNyNo1_.js → containers-DqB-bSYE.js} +34 -56
- package/dist/containers-DqB-bSYE.js.map +1 -0
- package/dist/control-group-recipes-DBXmfh2E.js +21 -0
- package/dist/control-group-recipes-DBXmfh2E.js.map +1 -0
- package/dist/{copyable-B7SBXJMr.js → copyable-BTSByfmq.js} +6 -6
- package/dist/{copyable-B7SBXJMr.js.map → copyable-BTSByfmq.js.map} +1 -1
- package/dist/{data-display-b3d1TfL4.js → data-display-Bihs9Ven.js} +542 -329
- package/dist/data-display-Bihs9Ven.js.map +1 -0
- package/dist/{date-BFNMnrS5.js → date-DOKhJPu7.js} +4 -4
- package/dist/{date-BFNMnrS5.js.map → date-DOKhJPu7.js.map} +1 -1
- package/dist/{date-picker-DI6kPNof.js → date-picker-DzP5HQq7.js} +492 -472
- package/dist/date-picker-DzP5HQq7.js.map +1 -0
- package/dist/date-pickers-BpgGz7S-.js +196 -0
- package/dist/date-pickers-BpgGz7S-.js.map +1 -0
- package/dist/{display-ByI5tkqy.js → display-CS6Hbk18.js} +8 -8
- package/dist/{display-ByI5tkqy.js.map → display-CS6Hbk18.js.map} +1 -1
- package/dist/{dropdown-menu-BlnyHr-9.js → dropdown-menu-D-boNgGO.js} +7 -7
- package/dist/{dropdown-menu-BlnyHr-9.js.map → dropdown-menu-D-boNgGO.js.map} +1 -1
- package/dist/features/activities.js +152 -141
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +182 -179
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +9 -9
- package/dist/features/async-preview.js.map +1 -1
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +25 -23
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +103 -104
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +375 -373
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +222 -224
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +29 -29
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +59 -58
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +856 -855
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1210 -1209
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +133 -132
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +29 -31
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +13 -13
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +82 -82
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +4 -4
- package/dist/features/sync.js.map +1 -1
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +456 -450
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-CJkUAapr.js +233 -0
- package/dist/feedback-CJkUAapr.js.map +1 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js +25 -0
- package/dist/field-affordance-recipes-uKY4MsZ_.js.map +1 -0
- package/dist/{field-state-recipes-CBTRt9Bt.js → field-state-recipes-DQQpiLWC.js} +3 -3
- package/dist/field-state-recipes-DQQpiLWC.js.map +1 -0
- package/dist/{filters-qtrcv1hf.js → filters-D6FF8L6s.js} +715 -720
- package/dist/filters-D6FF8L6s.js.map +1 -0
- package/dist/{form-field-C6W-y2hR.js → form-field-CZwrkP7m.js} +17 -9
- package/dist/form-field-CZwrkP7m.js.map +1 -0
- package/dist/{form-sizing-39NohSqn.js → form-sizing-QP8aIRaW.js} +10 -6
- package/dist/form-sizing-QP8aIRaW.js.map +1 -0
- package/dist/{forms-BF-HSbff.js → forms-B5NCbkSC.js} +35 -35
- package/dist/{forms-BF-HSbff.js.map → forms-B5NCbkSC.js.map} +1 -1
- package/dist/forms-numeric-Crrm80Lm.js +867 -0
- package/dist/forms-numeric-Crrm80Lm.js.map +1 -0
- package/dist/{header-B8ex54cY.js → header-kxruN3RM.js} +53 -49
- package/dist/header-kxruN3RM.js.map +1 -0
- package/dist/{hooks-D6UBVzf2.js → hooks-BrlnCwQd.js} +2 -2
- package/dist/{hooks-D6UBVzf2.js.map → hooks-BrlnCwQd.js.map} +1 -1
- package/dist/{http-CLTVJc5I.js → http-CdEIHyQf.js} +2 -2
- package/dist/http-CdEIHyQf.js.map +1 -0
- package/dist/{icon-badge-Dv0RYQwj.js → icon-badge-Btc6pQrp.js} +4 -4
- package/dist/{icon-badge-Dv0RYQwj.js.map → icon-badge-Btc6pQrp.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/input-SX9V0AL3.js +255 -0
- package/dist/input-SX9V0AL3.js.map +1 -0
- package/dist/input-vxcaNCYC.js +20 -0
- package/dist/input-vxcaNCYC.js.map +1 -0
- package/dist/{item-pJ0GsOiJ.js → item-DE4YnuJx.js} +18 -17
- package/dist/item-DE4YnuJx.js.map +1 -0
- package/dist/layout/app-shell.js +1 -1
- package/dist/layout/auth.js +1 -1
- package/dist/layout/containers.js +1 -1
- package/dist/layout/header.js +1 -1
- package/dist/layout/hooks.js +1 -1
- package/dist/layout/navigation.js +1 -1
- package/dist/layout/page.js +1 -1
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +2 -2
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +10 -10
- package/dist/lib/affordance-geometry.generated.d.ts +44 -4
- package/dist/lib/control-group-recipes.d.ts +22 -0
- package/dist/lib/field-affordance-recipes.d.ts +35 -2
- package/dist/lib/field-state-recipes.d.ts +2 -2
- package/dist/lib/navigation-row-recipes.d.ts +3 -2
- package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
- package/dist/lib/surface-recipes.d.ts +5 -2
- package/dist/lib/token-merge.generated.d.ts +144 -2
- package/dist/lib/ui-provider/types.d.ts +4 -2
- package/dist/lib/use-prefers-reduced-motion.d.ts +2 -0
- package/dist/lib/utils.js +1 -1
- package/dist/{media-gallery-Ca4YmvBi.js → media-gallery-DLp3HAz0.js} +75 -74
- package/dist/media-gallery-DLp3HAz0.js.map +1 -0
- package/dist/{mentions-CRio8mTm.js → mentions-Cl0Kt_Pd.js} +52 -50
- package/dist/{mentions-CRio8mTm.js.map → mentions-Cl0Kt_Pd.js.map} +1 -1
- package/dist/message-SZUNB1eX.js +127 -0
- package/dist/message-SZUNB1eX.js.map +1 -0
- package/dist/{navigation-BTrEb5u4.js → navigation-DnQSNMT0.js} +64 -55
- package/dist/navigation-DnQSNMT0.js.map +1 -0
- package/dist/{navigation-DqEITuD2.js → navigation-DyytsLRB.js} +37 -37
- package/dist/navigation-DyytsLRB.js.map +1 -0
- package/dist/{navigation-row-recipes-BFpvGPGE.js → navigation-row-recipes-DQEXQcqY.js} +3 -3
- package/dist/navigation-row-recipes-DQEXQcqY.js.map +1 -0
- package/dist/{number-BNT_BIzJ.js → number-DasMFWEG.js} +4 -4
- package/dist/{number-BNT_BIzJ.js.map → number-DasMFWEG.js.map} +1 -1
- package/dist/overlays-DUbs1KEi.js +1011 -0
- package/dist/overlays-DUbs1KEi.js.map +1 -0
- package/dist/{page-BMBGjJY8.js → page-hGmT4nWK.js} +75 -64
- package/dist/page-hGmT4nWK.js.map +1 -0
- package/dist/{page-header-BH41wCyY.js → page-header-D8nERkn5.js} +9 -9
- package/dist/page-header-D8nERkn5.js.map +1 -0
- package/dist/{pagination-C29vvt3I.js → pagination-NLGqRirf.js} +20 -20
- package/dist/pagination-NLGqRirf.js.map +1 -0
- package/dist/{popover-TInGXsjg.js → popover-CghIYdQf.js} +23 -22
- package/dist/popover-CghIYdQf.js.map +1 -0
- package/dist/{popover-menu-BzqXqE72.js → popover-menu-B4PoWhRl.js} +6 -6
- package/dist/{popover-menu-BzqXqE72.js.map → popover-menu-B4PoWhRl.js.map} +1 -1
- package/dist/{popover.recipes-zgBhMlUu.js → popover.recipes-QlD4JenO.js} +5 -5
- package/dist/popover.recipes-QlD4JenO.js.map +1 -0
- package/dist/{primitives-DKPOGVpj.js → primitives-C7ff0QaI.js} +120 -113
- package/dist/primitives-C7ff0QaI.js.map +1 -0
- package/dist/primitives.js +3 -3
- package/dist/progress-BroqrAyV.js +169 -0
- package/dist/progress-BroqrAyV.js.map +1 -0
- package/dist/{receipt-DYWTQGEc.js → receipt-BuJynLgf.js} +8 -8
- package/dist/{receipt-DYWTQGEc.js.map → receipt-BuJynLgf.js.map} +1 -1
- package/dist/{rich-text-B7sBAdDG.js → rich-text-DlxDOtf4.js} +4 -4
- package/dist/{rich-text-B7sBAdDG.js.map → rich-text-DlxDOtf4.js.map} +1 -1
- package/dist/rich-text-editor-BKyG7rWz.js +574 -0
- package/dist/rich-text-editor-BKyG7rWz.js.map +1 -0
- package/dist/{rich-text-editor.recipes-DxvOE0Lp.js → rich-text-editor.recipes-B72Nfuze.js} +35 -26
- package/dist/rich-text-editor.recipes-B72Nfuze.js.map +1 -0
- package/dist/{scroll-area-BheMQ270.js → scroll-area-D-pIhEKl.js} +3 -3
- package/dist/scroll-area-D-pIhEKl.js.map +1 -0
- package/dist/{separator-Gk_WXH-l.js → separator-BNIgG3au.js} +3 -3
- package/dist/{separator-Gk_WXH-l.js.map → separator-BNIgG3au.js.map} +1 -1
- package/dist/{separator-DO0EbCEm.js → separator-BhtFyo4x.js} +2 -2
- package/dist/{separator-DO0EbCEm.js.map → separator-BhtFyo4x.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{settings-D9f_wdIC.js → settings-DOTOzeZ2.js} +10 -9
- package/dist/{settings-D9f_wdIC.js.map → settings-DOTOzeZ2.js.map} +1 -1
- package/dist/{sheet-vOUloJ4O.js → sheet-BFhrNehm.js} +11 -11
- package/dist/sheet-BFhrNehm.js.map +1 -0
- package/dist/{sidebar-CNBKFDRW.js → sidebar-CyR4XKwR.js} +219 -200
- package/dist/sidebar-CyR4XKwR.js.map +1 -0
- package/dist/{sidebar-C3UKkbC5.js → sidebar-SvGJ0Zwi.js} +63 -58
- package/dist/sidebar-SvGJ0Zwi.js.map +1 -0
- package/dist/{skeleton-BvRhK8y-.js → skeleton-3F0uhYn3.js} +4 -4
- package/dist/{skeleton-BvRhK8y-.js.map → skeleton-3F0uhYn3.js.map} +1 -1
- package/dist/{smart-card-B5FcKODh.js → smart-card-DjGVV2xr.js} +206 -199
- package/dist/smart-card-DjGVV2xr.js.map +1 -0
- package/dist/{spinner-JtlFJ7Nc.js → spinner-Cpf7oRkF.js} +5 -5
- package/dist/{spinner-JtlFJ7Nc.js.map → spinner-Cpf7oRkF.js.map} +1 -1
- package/dist/{structure-BvW4vG4H.js → structure-CRdqVawd.js} +14 -14
- package/dist/{structure-BvW4vG4H.js.map → structure-CRdqVawd.js.map} +1 -1
- package/dist/{structure.recipes-DjqnBpwz.js → structure.recipes-Bqhf9oIh.js} +2 -2
- package/dist/structure.recipes-Bqhf9oIh.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-CQfRr-VL.js → surface-recipes-Dd__PD-w.js} +4 -3
- package/dist/surface-recipes-Dd__PD-w.js.map +1 -0
- package/dist/{table-DnlAJ-xR.js → table-CLtJTxoR.js} +17 -16
- package/dist/table-CLtJTxoR.js.map +1 -0
- package/dist/table-CcRDZiLP.js +1444 -0
- package/dist/table-CcRDZiLP.js.map +1 -0
- package/dist/tabs-BNgu7g0u.js +188 -0
- package/dist/tabs-BNgu7g0u.js.map +1 -0
- package/dist/text-inputs-DsR56TR-.js +330 -0
- package/dist/text-inputs-DsR56TR-.js.map +1 -0
- package/dist/{text.styles-BwB7vAF2.js → text.styles-Q4sGAIgA.js} +18 -10
- package/dist/text.styles-Q4sGAIgA.js.map +1 -0
- package/dist/theme.css +77 -115
- package/dist/{timelines-CnZ2S_Gr.js → timelines-D1pkt3se.js} +84 -78
- package/dist/timelines-D1pkt3se.js.map +1 -0
- package/dist/{tree-COD9BGdU.js → tree-BtmYyMZV.js} +8 -8
- package/dist/{tree-COD9BGdU.js.map → tree-BtmYyMZV.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-BxQgiZyw.js +96 -0
- package/dist/typography-BxQgiZyw.js.map +1 -0
- package/dist/typography.js +1 -1
- package/dist/{ui-provider-CftIB6TY.js → ui-provider-DRPn3qNl.js} +3 -2
- package/dist/ui-provider-DRPn3qNl.js.map +1 -0
- package/dist/ui-provider.js +1 -1
- package/dist/{upload-DIzw1dx1.js → upload-CDbYw1WN.js} +326 -323
- package/dist/upload-CDbYw1WN.js.map +1 -0
- package/dist/{upload-queue-xRJ3qDmd.js → upload-queue-CNd_hH_a.js} +25 -25
- package/dist/upload-queue-CNd_hH_a.js.map +1 -0
- package/dist/usage-card-VyJLUwRr.js +457 -0
- package/dist/usage-card-VyJLUwRr.js.map +1 -0
- package/dist/utils-BvH9PSmq.js +4275 -0
- package/dist/utils-BvH9PSmq.js.map +1 -0
- package/dist/value-inputs-D0KCrfVC.js +840 -0
- package/dist/value-inputs-D0KCrfVC.js.map +1 -0
- package/dist/{workspace-Cbqz4FzN.js → workspace-CcR8r-Nt.js} +115 -122
- package/dist/workspace-CcR8r-Nt.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +112 -18
- package/docs/consumer-skill/examples/analytics.tsx +34 -0
- package/docs/consumer-skill/examples/app-layout.tsx +42 -12
- package/docs/consumer-skill/examples/detail.tsx +24 -9
- package/docs/consumer-skill/examples/manifest.json +27 -1
- package/docs/consumer-skill/examples/planning-usage-edit.tsx +29 -0
- package/docs/consumer-skill/examples/scoped-directory.tsx +77 -0
- package/docs/consumer-skill/examples/website.tsx +56 -0
- package/docs/consumer-skill/references/analytics.md +70 -0
- package/docs/consumer-skill/references/composition.md +219 -2
- package/docs/consumer-skill/references/design-contract.md +37 -10
- package/docs/consumer-skill/references/discovery.md +93 -5
- package/docs/consumer-skill/references/installation.md +20 -3
- package/docs/consumer-skill/references/integration.md +26 -0
- package/docs/consumer-skill/references/public-api.json +2416 -388
- package/docs/consumer-skill/references/review.md +126 -0
- package/docs/consumer-skill/references/theming.md +52 -7
- package/docs/consumer-skill/references/tokens.json +177 -9
- package/docs/consumer-skill/references/workflows.md +129 -1
- package/docs/consumer-skill/scripts/check-composition.mjs +31 -0
- package/docs/consumer-skill/scripts/composition-policy.mjs +317 -0
- package/docs/consumer-skill/scripts/discovery.mjs +65 -8
- package/docs/consumer-skill/scripts/surface-policy.mjs +66 -0
- package/package.json +30 -6
- package/dist/accordion-BRWh3BM1.js.map +0 -1
- package/dist/action-menu-Cx3SdfbN.js.map +0 -1
- package/dist/affordance-geometry.generated-DXl-Zb3Z.js +0 -23
- package/dist/affordance-geometry.generated-DXl-Zb3Z.js.map +0 -1
- package/dist/ai-artifact-DkOArd3-.js.map +0 -1
- package/dist/app-shell-BH_bGcE2.js.map +0 -1
- package/dist/auth-BDB1V_2q.js +0 -704
- package/dist/auth-BDB1V_2q.js.map +0 -1
- package/dist/avatar-CsnWaYmt.js.map +0 -1
- package/dist/breadcrumbs-DdQ_I5ra.js.map +0 -1
- package/dist/button-BS6l5JUw.js.map +0 -1
- package/dist/buttons-Co6GavvM.js +0 -674
- package/dist/buttons-Co6GavvM.js.map +0 -1
- package/dist/chart-DVfcwQu6.js +0 -149
- package/dist/chart-DVfcwQu6.js.map +0 -1
- package/dist/choice-inputs-CavA-SGV.js +0 -644
- package/dist/choice-inputs-CavA-SGV.js.map +0 -1
- package/dist/code-block-DIlqzoiD.js.map +0 -1
- package/dist/combobox-CHD750do.js.map +0 -1
- package/dist/combobox-HDftpzxt.js.map +0 -1
- package/dist/command-D0kWBZfd.js.map +0 -1
- package/dist/comments-CvYeglMS.js +0 -1132
- package/dist/comments-CvYeglMS.js.map +0 -1
- package/dist/containers-CPNyNo1_.js.map +0 -1
- package/dist/data-display-b3d1TfL4.js.map +0 -1
- package/dist/date-picker-DI6kPNof.js.map +0 -1
- package/dist/date-pickers-ByP6Cv2z.js +0 -224
- package/dist/date-pickers-ByP6Cv2z.js.map +0 -1
- package/dist/feedback-a9j9J-9A.js +0 -391
- package/dist/feedback-a9j9J-9A.js.map +0 -1
- package/dist/field-affordance-recipes-CHdUtn2Z.js +0 -17
- package/dist/field-affordance-recipes-CHdUtn2Z.js.map +0 -1
- package/dist/field-state-recipes-CBTRt9Bt.js.map +0 -1
- package/dist/filters-qtrcv1hf.js.map +0 -1
- package/dist/form-field-C6W-y2hR.js.map +0 -1
- package/dist/form-sizing-39NohSqn.js.map +0 -1
- package/dist/forms-numeric-Y15Bg5Nr.js +0 -867
- package/dist/forms-numeric-Y15Bg5Nr.js.map +0 -1
- package/dist/header-B8ex54cY.js.map +0 -1
- package/dist/http-CLTVJc5I.js.map +0 -1
- package/dist/input-DMorJiTI.js +0 -202
- package/dist/input-DMorJiTI.js.map +0 -1
- package/dist/input-ci9fIgFH.js +0 -20
- package/dist/input-ci9fIgFH.js.map +0 -1
- package/dist/item-pJ0GsOiJ.js.map +0 -1
- package/dist/media-gallery-Ca4YmvBi.js.map +0 -1
- package/dist/message-B5-6LeYl.js +0 -108
- package/dist/message-B5-6LeYl.js.map +0 -1
- package/dist/navigation-BTrEb5u4.js.map +0 -1
- package/dist/navigation-DqEITuD2.js.map +0 -1
- package/dist/navigation-row-recipes-BFpvGPGE.js.map +0 -1
- package/dist/overlays-DBqV0J_V.js +0 -982
- package/dist/overlays-DBqV0J_V.js.map +0 -1
- package/dist/page-BMBGjJY8.js.map +0 -1
- package/dist/page-header-BH41wCyY.js.map +0 -1
- package/dist/pagination-C29vvt3I.js.map +0 -1
- package/dist/popover-TInGXsjg.js.map +0 -1
- package/dist/popover.recipes-zgBhMlUu.js.map +0 -1
- package/dist/primitives-DKPOGVpj.js.map +0 -1
- package/dist/rich-text-editor-BZSJchAF.js +0 -575
- package/dist/rich-text-editor-BZSJchAF.js.map +0 -1
- package/dist/rich-text-editor.recipes-DxvOE0Lp.js.map +0 -1
- package/dist/scroll-area-BheMQ270.js.map +0 -1
- package/dist/select-B2mb-qN2.js +0 -108
- package/dist/select-B2mb-qN2.js.map +0 -1
- package/dist/sheet-vOUloJ4O.js.map +0 -1
- package/dist/sidebar-C3UKkbC5.js.map +0 -1
- package/dist/sidebar-CNBKFDRW.js.map +0 -1
- package/dist/smart-card-B5FcKODh.js.map +0 -1
- package/dist/structure.recipes-DjqnBpwz.js.map +0 -1
- package/dist/surface-recipes-CQfRr-VL.js.map +0 -1
- package/dist/table-DnlAJ-xR.js.map +0 -1
- package/dist/table-ghtAQ-JJ.js +0 -1424
- package/dist/table-ghtAQ-JJ.js.map +0 -1
- package/dist/tabs-DY09eoZg.js +0 -187
- package/dist/tabs-DY09eoZg.js.map +0 -1
- package/dist/text-inputs-BhOcedTo.js +0 -331
- package/dist/text-inputs-BhOcedTo.js.map +0 -1
- package/dist/text.styles-BwB7vAF2.js.map +0 -1
- package/dist/timelines-CnZ2S_Gr.js.map +0 -1
- package/dist/typography-Cv8MT-82.js +0 -96
- package/dist/typography-Cv8MT-82.js.map +0 -1
- package/dist/ui-provider-CftIB6TY.js.map +0 -1
- package/dist/upload-DIzw1dx1.js.map +0 -1
- package/dist/upload-queue-xRJ3qDmd.js.map +0 -1
- package/dist/utils-C2EKeIw3.js +0 -72
- package/dist/utils-C2EKeIw3.js.map +0 -1
- package/dist/value-inputs-Co1fu-xv.js +0 -824
- package/dist/value-inputs-Co1fu-xv.js.map +0 -1
- package/dist/workspace-Cbqz4FzN.js.map +0 -1
package/dist/input-DMorJiTI.js
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { s as e } from "./ui-provider-CftIB6TY.js";
|
|
3
|
-
import { useStrings as t } from "./lib/strings.js";
|
|
4
|
-
import { t as n } from "./utils-C2EKeIw3.js";
|
|
5
|
-
import { a as r } from "./typography-Cv8MT-82.js";
|
|
6
|
-
import { t as i } from "./field-state-recipes-CBTRt9Bt.js";
|
|
7
|
-
import { t as a } from "./field-affordance-recipes-CHdUtn2Z.js";
|
|
8
|
-
import { t as o } from "./editable-text-recipe-Bkm6wKHp.js";
|
|
9
|
-
import { i as s, l as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h } from "./form-sizing-39NohSqn.js";
|
|
10
|
-
import * as g from "react";
|
|
11
|
-
import { memo as _, useCallback as v, useId as y, useMemo as b, useRef as x, useState as S } from "react";
|
|
12
|
-
import { jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
13
|
-
import { CircleXIcon as ee, Loader2Icon as te } from "lucide-react";
|
|
14
|
-
//#region src/components/base/text-inputs/hooks/use-form-field-state.ts
|
|
15
|
-
function T({ controlledValue: e, defaultValue: t, maxLength: n, showCharacterCount: r, providedId: i, idPrefix: a = "field", hasOnChange: o }) {
|
|
16
|
-
let s = y(), c = i || `${a}${s}`, [l, u] = S(t || ""), d = e !== void 0, f = (d ? e : l) ?? "", p = !(!o || d || t), m = f.length, h = n !== void 0, g = r !== !1 && !!(r || h), _ = f !== "", x = v((e) => h && e.length > n, [h, n]), C = v((e) => !x(e) && (d || u(e), !0), [d, x]), w = v(() => {
|
|
17
|
-
d || u("");
|
|
18
|
-
}, [d]);
|
|
19
|
-
return b(() => ({
|
|
20
|
-
id: c,
|
|
21
|
-
value: f,
|
|
22
|
-
isControlled: d,
|
|
23
|
-
isReactHookForm: p,
|
|
24
|
-
characterCount: m,
|
|
25
|
-
hasCharacterLimit: h,
|
|
26
|
-
showCount: g,
|
|
27
|
-
hasValue: _,
|
|
28
|
-
updateValue: C,
|
|
29
|
-
clearValue: w,
|
|
30
|
-
wouldExceedLimit: x
|
|
31
|
-
}), [
|
|
32
|
-
c,
|
|
33
|
-
f,
|
|
34
|
-
d,
|
|
35
|
-
p,
|
|
36
|
-
m,
|
|
37
|
-
h,
|
|
38
|
-
g,
|
|
39
|
-
_,
|
|
40
|
-
C,
|
|
41
|
-
w,
|
|
42
|
-
x
|
|
43
|
-
]);
|
|
44
|
-
}
|
|
45
|
-
//#endregion
|
|
46
|
-
//#region src/components/base/text-inputs/input.tsx
|
|
47
|
-
var E = { clear: "Clear input" }, D = (e, t, n) => {
|
|
48
|
-
let r = e || "";
|
|
49
|
-
return t && r && (r = t + r), n && r && (r += n), r;
|
|
50
|
-
};
|
|
51
|
-
function O({ className: g, type: _ = "text", startIcon: y, endIcon: S, startAddon: O, endAddon: k, maxLength: A, showCharacterCount: ne, clearable: j, onClear: M, loading: N = !1, returnValueWithAddons: P, invalid: re, size: ie, onChange: F, value: ae, defaultValue: oe, id: se, strings: ce, ...I }, L) {
|
|
52
|
-
let R = x(null), le = t(E, ce), { defaultScale: z } = e(), B = d(ie, z), V = v((e) => {
|
|
53
|
-
typeof L == "function" ? L(e) : L && (L.current = e), R.current = e;
|
|
54
|
-
}, [L]), { id: H, value: U, isReactHookForm: ue, characterCount: de, hasCharacterLimit: fe, showCount: W, hasValue: G, updateValue: K, clearValue: q, wouldExceedLimit: J } = T({
|
|
55
|
-
controlledValue: ae,
|
|
56
|
-
defaultValue: oe,
|
|
57
|
-
maxLength: A,
|
|
58
|
-
showCharacterCount: ne,
|
|
59
|
-
providedId: se,
|
|
60
|
-
idPrefix: "input",
|
|
61
|
-
hasOnChange: F !== void 0
|
|
62
|
-
}), Y = !!j, X = N, Z = !!S, pe = !!k, Q = _ === "file", $ = !!re, me = b(() => {
|
|
63
|
-
let e = B === "sm" ? "ps-control-sm" : "ps-control", t = B === "sm" ? "pe-control-sm" : "pe-control";
|
|
64
|
-
return y && (e = p[B]), O && (e = m[B]), S && (t = s[B]), k && (t = f[B]), X && (t = s[B]), Y && G && !X && (t = a.clearPadding[B]), W && (t = l[B]), `${e} ${t}`;
|
|
65
|
-
}, [
|
|
66
|
-
y,
|
|
67
|
-
O,
|
|
68
|
-
S,
|
|
69
|
-
k,
|
|
70
|
-
Y,
|
|
71
|
-
G,
|
|
72
|
-
X,
|
|
73
|
-
W,
|
|
74
|
-
B
|
|
75
|
-
]), he = v((e) => {
|
|
76
|
-
let t = e.target.value;
|
|
77
|
-
if (!J(t) && (K(t), F)) {
|
|
78
|
-
if (P) {
|
|
79
|
-
let n = D(t, O, k);
|
|
80
|
-
F({
|
|
81
|
-
...e,
|
|
82
|
-
target: {
|
|
83
|
-
...e.target,
|
|
84
|
-
value: n
|
|
85
|
-
},
|
|
86
|
-
currentTarget: {
|
|
87
|
-
...e.currentTarget,
|
|
88
|
-
value: n
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
} else F(e);
|
|
92
|
-
}
|
|
93
|
-
}, [
|
|
94
|
-
F,
|
|
95
|
-
P,
|
|
96
|
-
O,
|
|
97
|
-
k,
|
|
98
|
-
K,
|
|
99
|
-
J
|
|
100
|
-
]), ge = v(() => {
|
|
101
|
-
let e = P ? D("", O, k) : "", t = {
|
|
102
|
-
target: { value: e },
|
|
103
|
-
currentTarget: { value: e }
|
|
104
|
-
};
|
|
105
|
-
q(), F?.(t), M?.(), R.current?.focus();
|
|
106
|
-
}, [
|
|
107
|
-
P,
|
|
108
|
-
O,
|
|
109
|
-
k,
|
|
110
|
-
q,
|
|
111
|
-
F,
|
|
112
|
-
M
|
|
113
|
-
]), _e = Y && G && !W && !X, ve = X && !W, ye = Z && !Y && !W && !X, be = pe && !Y && !W && !X;
|
|
114
|
-
return /* @__PURE__ */ w("div", {
|
|
115
|
-
className: n("input--component", "relative h-fit w-full min-w-0"),
|
|
116
|
-
children: [
|
|
117
|
-
/* @__PURE__ */ C("input", {
|
|
118
|
-
ref: V,
|
|
119
|
-
id: H,
|
|
120
|
-
type: _,
|
|
121
|
-
...!ue && { value: U },
|
|
122
|
-
onChange: he,
|
|
123
|
-
maxLength: A,
|
|
124
|
-
"aria-invalid": $ || void 0,
|
|
125
|
-
disabled: I.disabled || N,
|
|
126
|
-
className: n("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground", "border-input box-border flex w-full min-w-0 rounded-radius border", "transition-[color,box-shadow] outline-none", "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", h[B], o[B], c[B], "file:inline-flex file:h-control-file file:border file:bg-transparent file:px-control file:font-medium", "file:text-pxs", Q ? "cursor-pointer bg-background text-foreground file:cursor-pointer file:rounded-radius-md file:border-input file:bg-background file:text-foreground" : "bg-transparent", i.focus, i.invalid, Q ? "read-only:bg-background" : "read-only:bg-muted", me, g),
|
|
127
|
-
...I
|
|
128
|
-
}),
|
|
129
|
-
!!y && /* @__PURE__ */ C("div", {
|
|
130
|
-
className: n("pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center", B === "sm" ? "ps-control-sm" : "ps-control", I.disabled && "opacity-50", $ ? "text-destructive" : "text-muted-foreground/80"),
|
|
131
|
-
children: /* @__PURE__ */ C(y, {
|
|
132
|
-
className: u[B],
|
|
133
|
-
"aria-hidden": "true"
|
|
134
|
-
})
|
|
135
|
-
}),
|
|
136
|
-
!!O && /* @__PURE__ */ C("span", {
|
|
137
|
-
className: n("pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center", B === "sm" ? "ps-control-sm" : "ps-control", I.disabled && "opacity-50"),
|
|
138
|
-
children: /* @__PURE__ */ C(r, {
|
|
139
|
-
tag: "span",
|
|
140
|
-
size: B === "sm" ? "pxs" : "sm",
|
|
141
|
-
type: $ ? "error" : "secondary",
|
|
142
|
-
lineHeight: "tight",
|
|
143
|
-
className: "input--start-addon",
|
|
144
|
-
children: O
|
|
145
|
-
})
|
|
146
|
-
}),
|
|
147
|
-
!!ye && !!S && /* @__PURE__ */ C("div", {
|
|
148
|
-
className: n("pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center", B === "sm" ? "pe-control-sm" : "pe-control", I.disabled && "opacity-50", $ ? "text-destructive" : "text-muted-foreground/80"),
|
|
149
|
-
children: /* @__PURE__ */ C(S, {
|
|
150
|
-
className: u[B],
|
|
151
|
-
"aria-hidden": "true"
|
|
152
|
-
})
|
|
153
|
-
}),
|
|
154
|
-
!!be && /* @__PURE__ */ C("span", {
|
|
155
|
-
className: n("pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center", B === "sm" ? "pe-control-sm" : "pe-control", I.disabled && "opacity-50"),
|
|
156
|
-
children: /* @__PURE__ */ C(r, {
|
|
157
|
-
tag: "span",
|
|
158
|
-
size: B === "sm" ? "pxs" : "sm",
|
|
159
|
-
type: $ ? "error" : "secondary",
|
|
160
|
-
lineHeight: "tight",
|
|
161
|
-
className: "input--end-addon",
|
|
162
|
-
children: k
|
|
163
|
-
})
|
|
164
|
-
}),
|
|
165
|
-
!!W && /* @__PURE__ */ C("div", {
|
|
166
|
-
className: n("pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center tabular-nums", B === "sm" ? "pe-control-sm text-pxs" : "pe-control text-sm", I.disabled && "opacity-50", $ ? "text-destructive" : "text-muted-foreground"),
|
|
167
|
-
"aria-live": "polite",
|
|
168
|
-
role: "status",
|
|
169
|
-
children: /* @__PURE__ */ w(r, {
|
|
170
|
-
tag: "span",
|
|
171
|
-
size: B === "sm" ? "xxs" : "xs",
|
|
172
|
-
type: $ ? "error" : "secondary",
|
|
173
|
-
children: [de, fe ? `/${A}` : ""]
|
|
174
|
-
})
|
|
175
|
-
}),
|
|
176
|
-
!!ve && /* @__PURE__ */ C("div", {
|
|
177
|
-
className: n("pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center", B === "sm" ? "pe-control-sm" : "pe-control", $ ? "text-destructive" : "text-muted-foreground/80"),
|
|
178
|
-
children: /* @__PURE__ */ C(te, {
|
|
179
|
-
className: n(u[B], "animate-spin"),
|
|
180
|
-
"aria-hidden": "true"
|
|
181
|
-
})
|
|
182
|
-
}),
|
|
183
|
-
!!_e && /* @__PURE__ */ C("button", {
|
|
184
|
-
type: "button",
|
|
185
|
-
className: n(a.target, a.focus, a.clear, a.centered, a.clearEnd[B]),
|
|
186
|
-
"aria-label": le.clear,
|
|
187
|
-
onClick: ge,
|
|
188
|
-
disabled: I.disabled || N,
|
|
189
|
-
children: /* @__PURE__ */ C(ee, {
|
|
190
|
-
className: a.icon,
|
|
191
|
-
"aria-hidden": "true"
|
|
192
|
-
})
|
|
193
|
-
})
|
|
194
|
-
]
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
var k = _(g.forwardRef(O));
|
|
198
|
-
k.displayName = "Input";
|
|
199
|
-
//#endregion
|
|
200
|
-
export { E as n, T as r, k as t };
|
|
201
|
-
|
|
202
|
-
//# sourceMappingURL=input-DMorJiTI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input-DMorJiTI.js","names":["React","useDensityConfig","cn","Text","fieldStateRecipes","fieldAffordanceRecipes","editableTextSizeClasses","formControlEndIconOffsetClasses","formControlPaddingClasses","formControlCountOffsetClasses","formControlIconClasses","resolveFormControlSize","formControlEndAddonOffsetClasses","formControlIconOffsetClasses","formControlAddonOffsetClasses","formControlSizeClasses","React$1","useFormFieldState","reactId","useId","id","providedId","idPrefix","internalValue","setInternalValue","useState","defaultValue","isControlled","controlledValue","value","isReactHookForm","characterCount","hasCharacterLimit","maxLength","showCount","showCharacterCount","hasValue","wouldExceedLimit","useCallback","newValue","updateValue","clearValue","useMemo","defaultInputStrings","getValueWithAddons","result","startAddon","endAddon","InputImpl","StartIcon","EndIcon","sizeProp","stringsProp","props","inputRef","useRef","strings","useStrings","size","defaultScale","setRefs","forwardedRef","node","inputValue","onChange","isClearable","clearable","isShowingLoading","loading","hasEndIcon","hasEndAddon","isFileInput","type","hasError","invalid","inputPaddingClasses","paddingStart","paddingEnd","handleInputChange","returnValueWithAddons","valueWithAddons","handleClear","clearValueWithAddons","syntheticEvent","onClear","showClearButton","showLoadingSpinner","showEndIcon","showEndAddon","className","Loader2Icon","CircleXIcon","Input","memo"],"sources":["../src/components/base/text-inputs/hooks/use-form-field-state.ts","../src/components/base/text-inputs/input.tsx"],"sourcesContent":["import { useState, useCallback, useMemo, useId } from 'react';\n\nexport interface UseFormFieldStateOptions {\n\t/** Controlled value from parent */\n\tcontrolledValue?: string;\n\t/** Default value for uncontrolled mode */\n\tdefaultValue?: string;\n\t/** Maximum character length */\n\tmaxLength?: number;\n\t/** Whether to show character count */\n\tshowCharacterCount?: boolean;\n\t/** Provided ID or auto-generate */\n\tprovidedId?: string;\n\t/** Prefix for auto-generated ID */\n\tidPrefix?: string;\n\t/** Whether onChange is provided (for react-hook-form detection) */\n\thasOnChange?: boolean;\n}\n\nexport interface UseFormFieldStateReturn {\n\t/** Generated or provided ID */\n\tid: string;\n\t/** Current value (controlled or internal) */\n\tvalue: string;\n\t/** Whether component is in controlled mode */\n\tisControlled: boolean;\n\t/** Whether using react-hook-form (has onChange but no controlled value) */\n\tisReactHookForm: boolean;\n\t/** Current character count */\n\tcharacterCount: number;\n\t/** Whether a character limit is set */\n\thasCharacterLimit: boolean;\n\t/** Whether to show character count UI */\n\tshowCount: boolean;\n\t/** Whether the field has a value */\n\thasValue: boolean;\n\t/** Update value - returns false if blocked by character limit */\n\tupdateValue: (newValue: string) => boolean;\n\t/** Clear the value */\n\tclearValue: () => void;\n\t/** Check if a new value would exceed the character limit */\n\twouldExceedLimit: (newValue: string) => boolean;\n}\n\n/**\n * Shared hook for managing form field state including:\n * - Controlled vs uncontrolled value handling\n * - Character counting and limits\n * - React Hook Form compatibility detection\n * - ID generation\n */\nexport function useFormFieldState({\n\tcontrolledValue,\n\tdefaultValue,\n\tmaxLength,\n\tshowCharacterCount,\n\tprovidedId,\n\tidPrefix = 'field',\n\thasOnChange,\n}: UseFormFieldStateOptions): UseFormFieldStateReturn {\n\t// Generate stable ID using React 18's useId (SSR-safe)\n\tconst reactId = useId();\n\tconst id = providedId || `${idPrefix}${reactId}`;\n\n\t// Internal state for uncontrolled mode\n\tconst [internalValue, setInternalValue] = useState(defaultValue || '');\n\n\t// Determine control mode\n\tconst isControlled = controlledValue !== undefined;\n\n\t// Normalize value (handle null from backend)\n\tconst rawValue = isControlled ? controlledValue : internalValue;\n\tconst value = rawValue ?? '';\n\n\t// React Hook Form detection: has onChange but no controlled value or defaultValue\n\tconst isReactHookForm = Boolean(hasOnChange && !isControlled && !defaultValue);\n\n\t// Character counting\n\tconst characterCount = value.length;\n\tconst hasCharacterLimit = maxLength !== undefined;\n\tconst showCount = showCharacterCount === false ? false : Boolean(showCharacterCount || hasCharacterLimit);\n\tconst hasValue = value !== '';\n\n\t// Check if value would exceed limit\n\tconst wouldExceedLimit = useCallback(\n\t\t(newValue: string) => {\n\t\t\treturn hasCharacterLimit && newValue.length > maxLength;\n\t\t},\n\t\t[hasCharacterLimit, maxLength]\n\t);\n\n\t// Update value (respects character limit, updates internal state if uncontrolled)\n\tconst updateValue = useCallback(\n\t\t(newValue: string): boolean => {\n\t\t\tif (wouldExceedLimit(newValue)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalValue(newValue);\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\t[isControlled, wouldExceedLimit]\n\t);\n\n\t// Clear value\n\tconst clearValue = useCallback(() => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalValue('');\n\t\t}\n\t}, [isControlled]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tid,\n\t\t\tvalue,\n\t\t\tisControlled,\n\t\t\tisReactHookForm,\n\t\t\tcharacterCount,\n\t\t\thasCharacterLimit,\n\t\t\tshowCount,\n\t\t\thasValue,\n\t\t\tupdateValue,\n\t\t\tclearValue,\n\t\t\twouldExceedLimit,\n\t\t}),\n\t\t[\n\t\t\tid,\n\t\t\tvalue,\n\t\t\tisControlled,\n\t\t\tisReactHookForm,\n\t\t\tcharacterCount,\n\t\t\thasCharacterLimit,\n\t\t\tshowCount,\n\t\t\thasValue,\n\t\t\tupdateValue,\n\t\t\tclearValue,\n\t\t\twouldExceedLimit,\n\t\t]\n\t);\n}\n","import { fieldStateRecipes } from '../../../lib/field-state-recipes';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { editableTextSizeClasses } from '../../../lib/editable-text-recipe';\nimport { CircleXIcon, Loader2Icon, type LucideIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { useRef, useCallback, useMemo, memo } from 'react';\nimport { Text } from '../../typography';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport {\n\t\tformControlAddonOffsetClasses,\n\t\tformControlCountOffsetClasses,\n\t\tformControlEndAddonOffsetClasses,\n\t\tformControlEndIconOffsetClasses,\n\t\tformControlIconClasses,\n\t\tformControlIconOffsetClasses,\n\t\tformControlPaddingClasses,\n\t\tformControlSizeClasses,\n\t\tresolveFormControlSize,\n} from '../forms/form-sizing';\nimport { useFormFieldState } from './hooks';\n\nexport interface InputStrings {\n\t/** Accessible label for the clear action. */\n\t\tclear: string;\n}\n\nexport const defaultInputStrings: InputStrings = {\n\t\tclear: 'Clear input',\n};\n\n/**\n * Helper function to get value with prefix/suffix\n */\nconst getValueWithAddons = (value: string, startAddon?: string, endAddon?: string): string => {\n\t\tlet result = value || '';\n\t\tif (startAddon && result) result = startAddon + result;\n\t\tif (endAddon && result) result = result + endAddon;\n\t\treturn result;\n};\n\nexport interface InputProps extends Omit<React.ComponentProps<'input'>, 'onChange' | 'size'> {\n\t/** Decorative or semantic icon rendered before the value. */\n\t\tstartIcon?: LucideIcon;\n\t/** Decorative or semantic icon rendered after the value. */\n\t\tendIcon?: LucideIcon;\n\n\t/** Visual text prefix rendered inside the input frame. */\n\t\tstartAddon?: string;\n\t/** Visual text suffix rendered inside the input frame. */\n\t\tendAddon?: string;\n\n\t/** Maximum accepted character count. */\n\t\tmaxLength?: number;\n\t/** Shows the current and maximum character count. */\n\t\tshowCharacterCount?: boolean;\n\n\t/** Shows an inline clear action when the input has a value. */\n\t\tclearable?: boolean;\n\t/** Called after the inline clear action resets the value. */\n\t\tonClear?: () => void;\n\n\t/** Replaces the trailing affordance with a loading indicator. */\n\t\tloading?: boolean;\n\n\t/** Includes visual add-on text in the value exposed by `onChange`. */\n\t\treturnValueWithAddons?: boolean;\n\n\t/** Applies invalid control styling. Validation copy remains owned by FormField. */\n\t\tinvalid?: boolean;\n\n\t/** Control-height preset. Falls back to `UIProvider.density.defaultScale`. */\n\t\tsize?: FormControlSize;\n\n\t/** Native-style value callback for the controlled raw string. */\n\t\tonChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n\t/** Controlled raw string value. */\n\t\tvalue?: string;\n\t/** Initial raw string value for uncontrolled usage. */\n\t\tdefaultValue?: string;\n\n\t/** Accessible copy overrides for input-owned actions. */\n\t\tstrings?: StringsProp<InputStrings>;\n}\n\nfunction InputImpl(\n\t{\n\t\tclassName,\n\t\ttype = 'text',\n\t\tstartIcon: StartIcon,\n\t\tendIcon: EndIcon,\n\t\tstartAddon,\n\t\tendAddon,\n\t\tmaxLength,\n\t\tshowCharacterCount,\n\t\tclearable,\n\t\tonClear,\n\t\tloading = false,\n\t\treturnValueWithAddons,\n\t\tinvalid,\n\t\tsize: sizeProp,\n\t\tonChange,\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tid: providedId,\n\t\tstrings: stringsProp,\n\t\t...props\n\t}: InputProps,\n\tforwardedRef: React.ForwardedRef<HTMLInputElement>,\n) {\n\t\tconst inputRef = useRef<HTMLInputElement>(null);\n\t\tconst strings = useStrings(defaultInputStrings, stringsProp);\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\n\t\t// Memoize ref callback to avoid recreation on every render\n\t\tconst setRefs = useCallback(\n\t\t\t\t(node: HTMLInputElement | null) => {\n\t\t\t\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinputRef.current = node;\n\t\t\t\t},\n\t\t\t\t[forwardedRef]\n\t\t);\n\n\t\t// Use shared form field state hook\n\t\tconst {\n\t\t\t\tid,\n\t\t\t\tvalue: inputValue,\n\t\t\t\tisReactHookForm,\n\t\t\t\tcharacterCount,\n\t\t\t\thasCharacterLimit,\n\t\t\t\tshowCount,\n\t\t\t\thasValue,\n\t\t\t\tupdateValue,\n\t\t\t\tclearValue,\n\t\t\t\twouldExceedLimit,\n\t\t} = useFormFieldState({\n\t\t\t\tcontrolledValue,\n\t\t\t\tdefaultValue,\n\t\t\t\tmaxLength,\n\t\t\t\tshowCharacterCount,\n\t\t\t\tprovidedId,\n\t\t\t\tidPrefix: 'input',\n\t\t\t\thasOnChange: onChange !== undefined,\n\t\t});\n\n\t\t// Derive display states (simple booleans, no need for useMemo)\n\t\tconst isClearable = !!clearable;\n\t\tconst isShowingLoading = loading;\n\t\tconst hasEndIcon = !!EndIcon;\n\t\tconst hasEndAddon = !!endAddon;\n\t\tconst isFileInput = type === 'file';\n\t\tconst hasError = !!invalid;\n\n\t\t// Memoize padding classes based on add-ons and icons\n\t\t// Addon padding sized so the value sits adjacent to the addon — `ps-3`\n\t\t// baseline + a measured space for addon text. Wider addons can override\n\t\t// via `className` (`ps-16` etc.) at the call site.\n\t\tconst inputPaddingClasses = useMemo(() => {\n\t\t\t\tlet paddingStart = size === 'sm' ? 'ps-control-sm' : 'ps-control';\n\t\t\t\tlet paddingEnd = size === 'sm' ? 'pe-control-sm' : 'pe-control';\n\n\t\t\t\tif (StartIcon) paddingStart = formControlIconOffsetClasses[size];\n\t\t\t\tif (startAddon) paddingStart = formControlAddonOffsetClasses[size];\n\n\t\t\t\tif (EndIcon) paddingEnd = formControlEndIconOffsetClasses[size];\n\t\t\t\tif (endAddon) paddingEnd = formControlEndAddonOffsetClasses[size];\n\t\t\t\tif (isShowingLoading) paddingEnd = formControlEndIconOffsetClasses[size];\n\t\t\t\tif (isClearable && hasValue && !isShowingLoading) paddingEnd = fieldAffordanceRecipes.clearPadding[size];\n\t\t\t\tif (showCount) paddingEnd = formControlCountOffsetClasses[size];\n\n\t\t\t\treturn `${paddingStart} ${paddingEnd}`;\n\t\t}, [StartIcon, startAddon, EndIcon, endAddon, isClearable, hasValue, isShowingLoading, showCount, size]);\n\n\t\tconst handleInputChange = useCallback(\n\t\t\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tconst newValue = e.target.value;\n\n\t\t\t\t\t\t// Check character limit\n\t\t\t\t\t\tif (wouldExceedLimit(newValue)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update internal state if uncontrolled\n\t\t\t\t\t\tupdateValue(newValue);\n\n\t\t\t\t\t\t// Call external onChange with modified event if addons are requested\n\t\t\t\t\t\tif (onChange) {\n\t\t\t\t\t\t\t\tif (returnValueWithAddons) {\n\t\t\t\t\t\t\t\t\t\tconst valueWithAddons = getValueWithAddons(newValue, startAddon, endAddon);\n\t\t\t\t\t\t\t\t\t\tconst modifiedEvent = {\n\t\t\t\t\t\t\t\t\t\t\t\t...e,\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: { ...e.target, value: valueWithAddons },\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentTarget: { ...e.currentTarget, value: valueWithAddons },\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\tonChange(modifiedEvent as React.ChangeEvent<HTMLInputElement>);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tonChange(e);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[onChange, returnValueWithAddons, startAddon, endAddon, updateValue, wouldExceedLimit]\n\t\t);\n\n\t\tconst handleClear = useCallback(() => {\n\t\t\t\tconst clearValueWithAddons = returnValueWithAddons\n\t\t\t\t\t\t? getValueWithAddons('', startAddon, endAddon)\n\t\t\t\t\t\t: '';\n\t\t\t\tconst syntheticEvent = {\n\t\t\t\t\t\ttarget: { value: clearValueWithAddons },\n\t\t\t\t\t\tcurrentTarget: { value: clearValueWithAddons },\n\t\t\t\t} as React.ChangeEvent<HTMLInputElement>;\n\n\t\t\t\t// Clear internal state\n\t\t\t\tclearValue();\n\n\t\t\t\t// Notify parent\n\t\t\t\tonChange?.(syntheticEvent);\n\n\t\t\t\t// Execute optional onClear callback\n\t\t\t\tonClear?.();\n\n\t\t\t\t// Focus the input after clearing\n\t\t\t\tinputRef.current?.focus();\n\t\t}, [returnValueWithAddons, startAddon, endAddon, clearValue, onChange, onClear]);\n\n\t\t// Determine what to show in the end position (priority order)\n\t\tconst showClearButton = isClearable && hasValue && !showCount && !isShowingLoading;\n\t\tconst showLoadingSpinner = isShowingLoading && !showCount;\n\t\tconst showEndIcon = hasEndIcon && !isClearable && !showCount && !isShowingLoading;\n\t\tconst showEndAddon = hasEndAddon && !isClearable && !showCount && !isShowingLoading;\n\n\t\treturn (\n\t\t\t\t<div className={cn('input--component', 'relative h-fit w-full min-w-0')}>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tref={setRefs}\n\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\ttype={type}\n\t\t\t\t\t\t\t\t{...(!isReactHookForm && { value: inputValue })}\n\t\t\t\t\t\t\t\tonChange={handleInputChange}\n\t\t\t\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\t\t\t\taria-invalid={hasError || undefined}\n\t\t\t\t\t\t\t\tdisabled={props.disabled || loading}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t// Base styles\n\t\t\t\t\t\t\t\t\t\t'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground',\n\t\t\t\t\t\t\t\t\t\t'border-input box-border flex w-full min-w-0 rounded-radius border',\n\t\t\t\t\t\t\t\t\t\t'transition-[color,box-shadow] outline-none',\n\t\t\t\t\t\t\t\t\t\t'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\t\t\t\t\t\tformControlSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\tformControlPaddingClasses[size],\n\t\t\t\t\t\t\t\t\t\t// File input styles\n\t\t\t\t\t\t\t\t\t\t'file:inline-flex file:h-control-file file:border file:bg-transparent file:px-control file:font-medium',\n\t\t\t\t\t\t\t\t\t\t'file:text-pxs',\n\t\t\t\t\t\t\t\t\t\tisFileInput\n\t\t\t\t\t\t\t\t\t\t\t\t? 'cursor-pointer bg-background text-foreground file:cursor-pointer file:rounded-radius-md file:border-input file:bg-background file:text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'bg-transparent',\n\t\t\t\t\t\t\t\t\t\t// Focus styles\n\t\t\t\t\t\t\t\t\t\tfieldStateRecipes.focus,\n\t\t\t\t\t\t\t\t\t\t// Validation belongs to the frame, not the editable value\n\t\t\t\t\t\t\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\t\t\t\t\t\t\t// Read-only styles\n\t\t\t\t\t\t\t\t\t\tisFileInput\n\t\t\t\t\t\t\t\t\t\t\t\t? 'read-only:bg-background'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'read-only:bg-muted',\n\t\t\t\t\t\t\t\t\t\t// Dynamic padding\n\t\t\t\t\t\t\t\t\t\tinputPaddingClasses,\n\t\t\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{/* Start Icon */}\n\t\t\t\t\t\t{!!StartIcon && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\t\t\tsize === 'sm' ? 'ps-control-sm' : 'ps-control',\n\t\t\t\t\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\thasError ? 'text-destructive' : 'text-muted-foreground/80'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<StartIcon className={formControlIconClasses[size]} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Start Add-on */}\n\t\t\t\t\t\t{!!startAddon && (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\t\t\tsize === 'sm' ? 'ps-control-sm' : 'ps-control',\n\t\t\t\t\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t<Text\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\tsize={size === 'sm' ? 'pxs' : 'sm'}\n\t\t\t\t\t\ttype={hasError ? 'error' : 'secondary'}\n\t\t\t\t\t\tlineHeight=\"tight\"\n\t\t\t\t\t\tclassName=\"input--start-addon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{startAddon}\n\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* End Icon */}\n\t\t\t\t\t\t{!!showEndIcon && !!EndIcon && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\t\t\tsize === 'sm' ? 'pe-control-sm' : 'pe-control',\n\t\t\t\t\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\thasError ? 'text-destructive' : 'text-muted-foreground/80'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<EndIcon className={formControlIconClasses[size]} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* End Add-on */}\n\t\t\t\t\t\t{!!showEndAddon && (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\t\t\tsize === 'sm' ? 'pe-control-sm' : 'pe-control',\n\t\t\t\t\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t<Text\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\tsize={size === 'sm' ? 'pxs' : 'sm'}\n\t\t\t\t\t\ttype={hasError ? 'error' : 'secondary'}\n\t\t\t\t\t\tlineHeight=\"tight\"\n\t\t\t\t\t\tclassName=\"input--end-addon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{endAddon}\n\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Character Count */}\n\t\t\t\t\t\t{!!showCount && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center tabular-nums',\n\t\t\t\t\t\t\t\t\t\t\t\tsize === 'sm' ? 'pe-control-sm text-pxs' : 'pe-control text-sm',\n\t\t\t\t\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\thasError ? 'text-destructive' : 'text-muted-foreground'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size={size === 'sm' ? 'xxs' : 'xs'} type={hasError ? 'error' : 'secondary'}>\n\t\t\t\t\t\t\t\t\t\t\t\t{characterCount}\n\t\t\t\t\t\t\t\t\t\t\t\t{hasCharacterLimit ? `/${maxLength}` : ''}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Loading Spinner */}\n\t\t\t\t\t\t{!!showLoadingSpinner && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\t\t\tsize === 'sm' ? 'pe-control-sm' : 'pe-control',\n\t\t\t\t\t\t\t\t\t\t\t\thasError ? 'text-destructive' : 'text-muted-foreground/80'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Loader2Icon className={cn(formControlIconClasses[size], 'animate-spin')} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Clear Button */}\n\t\t\t\t\t\t{!!showClearButton && (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear, fieldAffordanceRecipes.centered, fieldAffordanceRecipes.clearEnd[size])}\n\t\t\t\t\t\t\t\t\t\taria-label={strings.clear}\n\t\t\t\t\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\t\t\t\t\tdisabled={props.disabled || loading}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CircleXIcon className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t);\n}\n\n// forwardRef + memo (needed for callers that require refs, e.g. segmented inputs)\nconst Input = memo(React.forwardRef<HTMLInputElement, InputProps>(InputImpl));\nInput.displayName = 'Input';\n\nexport { Input };\n"],"mappings":"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"}
|
package/dist/input-ci9fIgFH.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { t as e } from "./utils-C2EKeIw3.js";
|
|
3
|
-
import { t } from "./field-state-recipes-CBTRt9Bt.js";
|
|
4
|
-
import { t as n } from "./editable-text-recipe-Bkm6wKHp.js";
|
|
5
|
-
import "react";
|
|
6
|
-
import { jsx as r } from "react/jsx-runtime";
|
|
7
|
-
import { Input as i } from "@base-ui/react/input";
|
|
8
|
-
//#region src/components/ui/input.tsx
|
|
9
|
-
function a({ className: a, type: o, ...s }) {
|
|
10
|
-
return /* @__PURE__ */ r(i, {
|
|
11
|
-
type: o,
|
|
12
|
-
"data-slot": "input",
|
|
13
|
-
className: e("border-input h-control rounded-radius border bg-transparent px-control py-space-xs shadow-none transition-[color,box-shadow] file:h-control-file file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", n.md, t.focus, t.invalid, a),
|
|
14
|
-
...s
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
//#endregion
|
|
18
|
-
export { a as t };
|
|
19
|
-
|
|
20
|
-
//# sourceMappingURL=input-ci9fIgFH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input-ci9fIgFH.js","names":["Input","InputPrimitive","cn","editableTextSizeClasses","Input$1","props","Input","fieldStateRecipes","className"],"sources":["../src/components/ui/input.tsx"],"sourcesContent":["import { fieldStateRecipes } from '../../lib/field-state-recipes';\nimport { editableTextSizeClasses } from '../../lib/editable-text-recipe';\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"border-input h-control rounded-radius border bg-transparent px-control py-space-xs shadow-none transition-[color,box-shadow] file:h-control-file file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n editableTextSizeClasses.md,\n fieldStateRecipes.focus,\n fieldStateRecipes.invalid,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n"],"mappings":";;;;;;;;AAOA,SAASA,EAAM,EAAE,cAAW,SAAM,GAAGK,KAAwC;CAC3E,OACE,kBAACJ,GAAD;EACQ;EACN,aAAU;EACV,WAAWC,EACT,qYACAC,EAAwB,IACxBI,EAAkB,OAClBA,EAAkB,SAClBC,CACF;EACA,GAAIH;CACL,CAAA;AAEL"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"item-pJ0GsOiJ.js","names":["ItemGroup","ItemSeparator","Item","ItemMedia","ItemContent","ItemTitle","ItemDescription","ItemActions","ItemHeader","ItemFooter","_Fragment","BaseItem","BaseItemGroup","BaseItemSeparator","BaseItemMedia","BaseItemContent","BaseItemActions","BaseItemHeader","BaseItemFooter","BaseItemTitle","BaseItemDescription","resolveComponentScale","useItemConfig","useDensityConfig","cn","Separator","ICON_DESCENDANT_SIZE_CLASSNAMES","rowBlockPaddingClasses","Fragment$1","ItemGroup$1","props","className","ItemSeparator$1","itemVariants","cva","Item$1","useRender","mergeProps","itemMediaVariants","ItemMedia$1","variant","ItemContent$1","ItemTitle$1","ItemDescription$1","ItemActions$1","ItemHeader$1","ItemFooter$1","Item","forwardRef","convenienceMode","itemProps","resolvedSize","size","defaultScale","primitiveSize","resolvedVariant","defaultVariant","textSizeClass","paddingClass","padding","resolvedChildren","media","ItemMedia","mediaVariant","ItemContent","ItemTitle","titleBold","title","description","ItemDescription","descriptionClamp","trailing","actions","ItemActions","children","density","ItemGroup","ItemSeparator","baseVariant","iconClass","textGap","ItemHeader","ItemFooter","isSimpleText","Text","bold","CLAMP_CLASS","clamp"],"sources":["../src/components/ui/item.tsx","../src/components/base/item/item.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Separator } from \"./separator\"\n\nfunction ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(\n \"group/item-group flex w-full flex-col gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(\"my-space-md\", className)}\n {...props}\n />\n )\n}\n\nconst itemVariants = cva(\n \"group/item flex w-full flex-wrap items-center rounded-2xl border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted\",\n {\n variants: {\n variant: {\n default: \"border-transparent\",\n outline: \"border-border\",\n muted: \"border-transparent bg-muted/50\",\n },\n size: {\n default: \"gap-3.5 px-4 py-3.5\",\n sm: \"gap-3.5 px-3.5 py-3\",\n xs: \"gap-2.5 px-3 py-2.5 in-data-[slot=dropdown-menu-content]:p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Item({\n className,\n variant = \"default\",\n size = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"div\"> & VariantProps<typeof itemVariants>) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n {\n className: cn(itemVariants({ variant, size, className })),\n },\n props\n ),\n render,\n state: {\n slot: \"item\",\n variant,\n size,\n },\n })\n}\n\nconst itemMediaVariants = cva(\n \"flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"[&_svg:not([class*='size-'])]:size-4\",\n image:\n \"size-10 overflow-hidden rounded-xl group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 group-data-[size=xs]/item:rounded-lg [&_img]:size-full [&_img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction ItemMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof itemMediaVariants>) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(itemMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction ItemContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(\n \"flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0.5 [&+[data-slot=item-content]]:flex-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(\n \"line-clamp-1 flex w-fit items-center gap-space-md text-sm leading-snug font-medium underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(\n \"line-clamp-2 text-left text-sm font-normal text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-actions\"\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction ItemHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(\n \"flex basis-full items-center justify-between gap-space-md\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ItemFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(\n \"flex basis-full items-center justify-between gap-space-md\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemActions,\n ItemGroup,\n ItemSeparator,\n ItemTitle,\n ItemDescription,\n ItemHeader,\n ItemFooter,\n}\n","/**\n * Item — base wrapper around the shadcn `Item` primitive.\n *\n * Why this wrapper exists (rules 1, 8, 12, 17):\n * - Resolves `size` and `variant` against `<UIProvider>` (`useItemConfig()`),\n * so consumers set library-wide density once.\n * - Routes `ItemTitle` / `ItemDescription` text through our `<Text>` typography\n * so a title is always `weight=\"semibold\"` and secondary copy follows the\n * shared control/display tokens — no rogue `<div className=\"text-sm font-medium\">`\n * blobs at call sites.\n * - Re-exports every compound part untouched, so `<Item>` keeps working as a\n * drop-in replacement for hand-rolled \"icon-left + text-stack + actions\" rows.\n *\n * Layer rule: import from `@/components/base/item`, never from `@/components/ui/item`.\n */\nimport { forwardRef, type ComponentRef } from 'react';\n\nimport {\n\tItem as BaseItem,\n\tItemActions as BaseItemActions,\n\tItemContent as BaseItemContent,\n\tItemDescription as BaseItemDescription,\n\tItemFooter as BaseItemFooter,\n\tItemGroup as BaseItemGroup,\n\tItemHeader as BaseItemHeader,\n\tItemMedia as BaseItemMedia,\n\tItemSeparator as BaseItemSeparator,\n\tItemTitle as BaseItemTitle,\n} from '../../ui/item';\nimport { ICON_DESCENDANT_SIZE_CLASSNAMES } from '../display/icon-size';\nimport { Text } from '../../typography';\nimport { useDensityConfig, useItemConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\nimport { rowBlockPaddingClasses } from '../../../lib/row-recipes';\n\nimport type {\n\tItemActionsProps,\n\tItemContentProps,\n\tItemDescriptionProps,\n\tItemFooterProps,\n\tItemGroupProps,\n\tItemHeaderProps,\n\tItemMediaProps,\n\tItemProps,\n\tItemTitleProps,\n} from './item.types';\n\nconst Item = forwardRef<ComponentRef<typeof BaseItem>, ItemProps>(function Item(\n\titemProps,\n\tref,\n) {\n\tconst convenienceMode = 'title' in itemProps;\n\tconst {\n\t\tsize,\n\t\tdensity = 'default',\n\t\tvariant,\n\t\tpadding = 'none',\n\t\ttextGap = 'dense',\n\t\trender,\n\t\tclassName,\n\t\tchildren,\n\t\tmedia,\n\t\tmediaVariant,\n\t\ttitle,\n\t\tdescription,\n\t\ttrailing,\n\t\tactions,\n\t\ttitleBold,\n\t\tdescriptionClamp,\n\t\t...props\n\t} = itemProps;\n\tconst { defaultVariant = 'default' } = useItemConfig();\n\tconst { defaultScale } = useDensityConfig();\n\tconst resolvedSize = resolveComponentScale(size, defaultScale);\n\tconst primitiveSize = resolvedSize === 'sm' ? 'xs' : 'sm';\n\tconst resolvedVariant = variant ?? defaultVariant;\n\tconst textSizeClass = resolvedSize === 'sm' ? 'text-pxs' : resolvedSize === 'lg' ? 'text-base' : 'text-sm';\n\tconst paddingClass = padding === 'default' ? 'px-row-x' : 'px-0';\n\tconst resolvedChildren = convenienceMode ? (\n\t\t<>\n\t\t\t{media != null ? <ItemMedia variant={mediaVariant}>{media}</ItemMedia> : null}\n\t\t\t<ItemContent textGap={textGap} className=\"basis-48\">\n\t\t\t\t<ItemTitle bold={titleBold}>{title}</ItemTitle>\n\t\t\t\t{description != null ? (\n\t\t\t\t\t<ItemDescription clamp={descriptionClamp}>{description}</ItemDescription>\n\t\t\t\t) : null}\n\t\t\t</ItemContent>\n\t\t\t{trailing != null || actions != null ? (\n\t\t\t\t<ItemActions>\n\t\t\t\t\t{trailing}\n\t\t\t\t\t{actions}\n\t\t\t\t</ItemActions>\n\t\t\t) : null}\n\t\t</>\n\t) : children;\n\treturn (\n\t\t<BaseItem\n\t\t\tref={ref}\n\t\t\tsize={primitiveSize}\n\t\t\tvariant={resolvedVariant}\n\t\t\trender={render}\n\t\t\tclassName={cn(\n\t\t\t\t'item--component gap-space-lg rounded-radius',\n\t\t\t\trowBlockPaddingClasses[density],\n\t\t\t\tpaddingClass,\n\t\t\t\ttextSizeClass,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{resolvedChildren}\n\t\t</BaseItem>\n\t);\n});\nItem.displayName = 'Item';\n\nconst ItemGroup = forwardRef<ComponentRef<typeof BaseItemGroup>, ItemGroupProps>(function ItemGroup(\n\t{ className, role, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseItemGroup\n\t\t\tref={ref}\n\t\t\trole={role}\n\t\t\t// Flatten the primitive's size-aware gaps (sm→gap-2.5, xs→gap-2) to a\n\t\t\t// single tight gap-1.5; call sites can still override via className.\n\t\t\tclassName={cn('item-group--component gap-space-sm has-data-[size=sm]:gap-space-sm has-data-[size=xs]:gap-space-sm', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nItemGroup.displayName = 'ItemGroup';\n\nconst ItemSeparator = forwardRef<\n\tComponentRef<typeof BaseItemSeparator>,\n\tParameters<typeof BaseItemSeparator>[0]\n>(function ItemSeparator({ className, ...props }, ref) {\n\treturn <BaseItemSeparator ref={ref} className={cn('item--separator', className)} {...props} />;\n});\nItemSeparator.displayName = 'ItemSeparator';\n\nconst ItemMedia = forwardRef<ComponentRef<typeof BaseItemMedia>, ItemMediaProps>(function ItemMedia(\n\t{ variant = 'default', className, ...props },\n\tref,\n) {\n\tconst baseVariant = variant === 'image' || variant === 'avatar' ? 'image' : 'default';\n\tconst iconClass =\n\t\tvariant === 'icon'\n\t\t\t? cn(\n\t\t\t\t\tICON_DESCENDANT_SIZE_CLASSNAMES.md,\n\t\t\t\t\t\"group-data-[size=xs]/item:[&_svg:not([class*='size-'])]:size-icon-sm\",\n\t\t\t\t)\n\t\t\t: undefined;\n\tconst avatarClass =\n\t\tvariant === 'avatar'\n\t\t\t? 'rounded-full group-data-[size=sm]/item:rounded-full group-data-[size=xs]/item:rounded-full'\n\t\t\t: undefined;\n\treturn (\n\t\t<BaseItemMedia\n\t\t\tref={ref}\n\t\t\tvariant={baseVariant}\n\t\t\tclassName={cn(\n\t\t\t\t'item--media',\n\t\t\t\t'group-has-data-[slot=item-description]/item:translate-y-0',\n\t\t\t\ticonClass,\n\t\t\t\tavatarClass,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nItemMedia.displayName = 'ItemMedia';\n\nconst ItemContent = forwardRef<ComponentRef<typeof BaseItemContent>, ItemContentProps>(function ItemContent(\n\t{ className, textGap = 'dense', ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseItemContent\n\t\t\tref={ref}\n\t\t\tclassName={cn('item--content min-w-0', textGap === 'dense' ? 'gap-dense group-data-[size=xs]/item:gap-dense' : 'gap-normal group-data-[size=xs]/item:gap-normal', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nItemContent.displayName = 'ItemContent';\n\nconst ItemActions = forwardRef<ComponentRef<typeof BaseItemActions>, ItemActionsProps>(function ItemActions(\n\t{ className, ...props },\n\tref,\n) {\n\treturn <BaseItemActions ref={ref} className={cn('item--actions max-w-full flex-wrap shrink-0 gap-space-xs', className)} {...props} />;\n});\nItemActions.displayName = 'ItemActions';\n\nconst ItemHeader = forwardRef<ComponentRef<typeof BaseItemHeader>, ItemHeaderProps>(function ItemHeader(\n\t{ className, ...props },\n\tref,\n) {\n\treturn <BaseItemHeader ref={ref} className={cn('item--header', className)} {...props} />;\n});\nItemHeader.displayName = 'ItemHeader';\n\nconst ItemFooter = forwardRef<ComponentRef<typeof BaseItemFooter>, ItemFooterProps>(function ItemFooter(\n\t{ className, ...props },\n\tref,\n) {\n\treturn <BaseItemFooter ref={ref} className={cn('item--footer', className)} {...props} />;\n});\nItemFooter.displayName = 'ItemFooter';\n\nconst ItemTitle = forwardRef<ComponentRef<typeof BaseItemTitle>, ItemTitleProps>(function ItemTitle(\n\t{ bold = true, className, children, ...props },\n\tref,\n) {\n\tconst isSimpleText = typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint';\n\treturn (\n\t\t<BaseItemTitle\n\t\t\tref={ref}\n\t\t\tclassName={cn('item--title min-w-0 max-w-full overflow-hidden m-0 text-inherit [&>p]:m-0 [&>p]:text-left', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isSimpleText ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight={bold ? 'semibold' : 'regular'} lineHeight=\"tight\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : children}\n\t\t</BaseItemTitle>\n\t);\n});\nItemTitle.displayName = 'ItemTitle';\n\nconst CLAMP_CLASS: Record<NonNullable<ItemDescriptionProps['clamp']>, string> = {\n\t1: 'line-clamp-1',\n\t2: 'line-clamp-2',\n\t3: 'line-clamp-3',\n\t4: 'line-clamp-4',\n\tnone: 'line-clamp-none',\n};\n\nconst ItemDescription = forwardRef<ComponentRef<typeof BaseItemDescription>, ItemDescriptionProps>(\n\tfunction ItemDescription({ clamp = 2, className, children, ...props }, ref) {\n\t\tconst isSimpleText = typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint';\n\t\treturn (\n\t\t\t<BaseItemDescription\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'item--description',\n\t\t\t\t\t'mt-0',\n\t\t\t\t\t!isSimpleText && 'text-xs text-muted-foreground leading-tight',\n\t\t\t\t\tCLAMP_CLASS[clamp],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{isSimpleText ? (\n\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" lineHeight=\"tight\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Text>\n\t\t\t\t) : children}\n\t\t\t</BaseItemDescription>\n\t\t);\n\t},\n);\nItemDescription.displayName = 'ItemDescription';\n\nexport {\n\tItem,\n\tItemGroup,\n\tItemSeparator,\n\tItemMedia,\n\tItemContent,\n\tItemTitle,\n\tItemDescription,\n\tItemActions,\n\tItemHeader,\n\tItemFooter,\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-gallery-Ca4YmvBi.js","names":["Text","Stack","Badge","useFileDropTarget","defaultMediaGalleryStrings","counter","makeId","SortableTile","useSortable","item","style","CSS","transform","setNodeRef","cn","isDragging","disabled","tileClassName","setActivatorNodeRef","attributes","listeners","isFirst","strings","onRemove","X","MediaGallery","forwardRef","stringsProp","useStrings","inputId","useId","inputRef","useRef","items","setItems","useState","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","itemsRef","useEffect","value","prev","index","remaining","next","file","it","commit","useCallback","onValueChange","addFiles","rules","accept","rule","accepted","incoming","limit","maxFiles","additions","remove","target","id","onPickerChange","list","onDragEnd","event","over","active","from","to","moved","announce","template","overId","announcements","tileIds","useMemo","isFull","className","DndContext","SortableContext","rectSortingStrategy","Grid","i","dropTargetProps","invalid","ImagePlus"],"sources":["../src/components/base/media-gallery/media-gallery.tsx"],"sourcesContent":["/**\n * MediaGallery — multi-image upload + sortable thumbnail grid. Drop a batch\n * of images onto the dashed top tile or click to open the picker; tiles\n * appear inline and can be reordered via drag (`@dnd-kit/sortable`). The\n * first tile is implicitly the \"cover\" and is marked with a small chip;\n * each tile has a hover-revealed remove button.\n *\n * Use for product galleries, mood boards, or any collection where the order\n * matters and the consumer needs the final `File[]` (and the order of those\n * files) on submit.\n *\n * Strings overridable for i18n.\n */\nimport { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { ChangeEvent } from 'react';\nimport {\n\tDndContext,\n\ttype DragEndEvent,\n\ttype Announcements,\n\tPointerSensor,\n\tKeyboardSensor,\n\tuseSensor,\n\tuseSensors,\n} from '@dnd-kit/core';\nimport {\n\tSortableContext,\n\trectSortingStrategy,\n\tsortableKeyboardCoordinates,\n\tuseSortable,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { ImagePlus, X } from 'lucide-react';\nimport { Badge } from '../badge';\nimport { Text } from '../../typography';\nimport { Grid, Stack } from '../structure';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { useFileDropTarget } from '../upload/use-file-drop-target';\n\nexport interface MediaGalleryStrings {\n\taddInstruction: string;\n\thelper: string;\n\tdragOver: string;\n\tcover: string;\n\tremoveAria: string;\n\tmaxReached: string;\n\t/** Sort announcements; {name} is the filename and {position} is its one-based position. */\n\tpickedUp?: string;\n\tmovedTo?: string;\n\tdropped?: string;\n\tcancelled?: string;\n}\n\nexport const defaultMediaGalleryStrings = {\n\taddInstruction: 'Drop or click to add images',\n\thelper: '',\n\tdragOver: 'Release to select',\n\tcover: 'Cover',\n\tremoveAria: 'Remove image',\n\tmaxReached: 'You have reached the maximum number of images.',\n\tpickedUp: 'Picked up {name}.',\n\tmovedTo: '{name} moved to position {position}.',\n\tdropped: 'Dropped {name}.',\n\tcancelled: 'Sorting cancelled for {name}.',\n} satisfies MediaGalleryStrings;\n\nexport interface MediaGalleryProps {\n\t/** Selected files. Controlled. */\n\tvalue?: File[];\n\tonValueChange?: (files: File[]) => void;\n\t/** Accepted MIME types or extensions. */\n\taccept?: string;\n\t/** Caps how many files may be added. */\n\tmaxFiles?: number;\n\t/** Disables the control and blocks drops. */\n\tdisabled?: boolean;\n\t/** Applies the invalid styling. */\n\tinvalid?: boolean;\n\tclassName?: string;\n\t/** Merged onto each media tile. */\n\ttileClassName?: string;\n\t/** Overrides the upload, remove, and empty copy. */\n\tstrings?: StringsProp<MediaGalleryStrings>;\n}\n\ninterface InternalItem {\n\tid: string;\n\tfile: File;\n\tpreviewUrl: string;\n}\n\nlet counter = 0;\nconst makeId = () => `media-${Date.now().toString(36)}-${(counter++).toString(36)}`;\n\nfunction SortableTile({\n\titem,\n\tisFirst,\n\tdisabled,\n\tonRemove,\n\tstrings,\n\ttileClassName,\n}: {\n\titem: InternalItem;\n\tisFirst: boolean;\n\t/** Disables the control and blocks drops. */\n\tdisabled: boolean;\n\tonRemove: () => void;\n\t/** Overrides the upload, remove, and empty copy. */\n\tstrings: MediaGalleryStrings;\n\t/** Merged onto each media tile. */\n\ttileClassName?: string;\n}) {\n\tconst { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } =\n\t\tuseSortable({ id: item.id, disabled });\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t} as React.CSSProperties;\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\tclassName={cn(\n\t\t\t\t'media-gallery--item',\n\t\t\t\t'group relative aspect-square overflow-hidden rounded-radius border border-border/60 bg-muted/30',\n\t\t\t\tisDragging && 'z-10 shadow-lg ring-2 ring-primary/40',\n\t\t\t\tdisabled && 'opacity-50',\n\t\t\t\ttileClassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div\n\t\t\t\tref={setActivatorNodeRef}\n\t\t\t\taria-label={item.file.name}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'absolute inset-0 cursor-grab outline-none active:cursor-grabbing focus-visible:ring-2 focus-visible:ring-ring/50',\n\t\t\t\t\tdisabled && 'pointer-events-none',\n\t\t\t\t)}\n\t\t\t\t{...attributes}\n\t\t\t\t{...listeners}\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\tsrc={item.previewUrl}\n\t\t\t\t\talt={item.file.name}\n\t\t\t\t\tclassName=\"absolute inset-0 size-full object-cover\"\n\t\t\t\t\tdraggable={false}\n\t\t\t\t/>\n\t\t\t\t{isFirst && (\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tclassName=\"media-gallery--cover absolute left-space-sm top-space-sm bg-card/90 shadow ring-1 ring-border\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{strings.cover}\n\t\t\t\t\t</Badge>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label={`${strings.removeAria}: ${item.file.name}`}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonPointerDown={(e) => e.stopPropagation()}\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tonRemove();\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'absolute right-1.5 top-1.5 z-10 inline-flex size-control-clear items-center justify-center rounded-full bg-card text-foreground shadow ring-1 ring-border',\n\t\t\t\t\t'opacity-100 transition-opacity sm:opacity-0 sm:group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<X className=\"size-icon-md\" />\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nexport const MediaGallery = forwardRef<HTMLDivElement, MediaGalleryProps>(function MediaGallery({\n\tvalue,\n\tonValueChange,\n\taccept = '.png,.jpg,.jpeg,.gif,.webp',\n\tmaxFiles,\n\tdisabled = false,\n\tinvalid = false,\n\tclassName,\n\ttileClassName,\n\tstrings: stringsProp,\n}: MediaGalleryProps, ref) {\n\tconst strings = useStrings(defaultMediaGalleryStrings, stringsProp);\n\tconst inputId = useId();\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [items, setItems] = useState<InternalItem[]>([]);\n\n\tconst sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 6 } }), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }));\n\n\t// Track the live preview-URL set in a ref so the unmount cleanup sees the\n\t// latest values without depending on render-time `items`. Without this,\n\t// the cleanup closes over the initial empty array and any object URLs\n\t// created during the lifetime of the component leak (the browser will\n\t// still hold them until the document unloads).\n\tconst itemsRef = useRef<InternalItem[]>([]);\n\titemsRef.current = items;\n\n\t// Reconcile by file identity so order changes preserve sortable ids and URLs.\n\tuseEffect(() => {\n\t\tif (!value) return;\n\t\tconst prev = itemsRef.current;\n\t\tif (prev.length === value.length && prev.every((item, index) => item.file === value[index])) return;\n\t\tconst remaining = [...prev];\n\t\tconst next = value.map((file) => {\n\t\t\tconst index = remaining.findIndex((item) => item.file === file);\n\t\t\tif (index >= 0) return remaining.splice(index, 1)[0];\n\t\t\treturn { id: makeId(), file, previewUrl: URL.createObjectURL(file) };\n\t\t});\n\t\tremaining.forEach((item) => URL.revokeObjectURL(item.previewUrl));\n\t\titemsRef.current = next;\n\t\tsetItems(next);\n\t}, [value]);\n\n\t// Cleanup on unmount — revoke whatever previews were live at the time.\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\titemsRef.current.forEach((it) => URL.revokeObjectURL(it.previewUrl));\n\t\t\titemsRef.current = [];\n\t\t};\n\t}, []);\n\n\tconst commit = useCallback((next: InternalItem[]) => {\n\t\titemsRef.current = next;\n\t\tsetItems(next);\n\t\tonValueChange?.(next.map((item) => item.file));\n\t}, [onValueChange]);\n\n\tconst addFiles = useCallback((incoming: File[]) => {\n\t\tif (disabled) return;\n\t\tconst prev = itemsRef.current;\n\t\tconst rules = accept.split(',').map((rule) => rule.trim().toLowerCase()).filter(Boolean);\n\t\tconst accepted = incoming.filter((file) => rules.length === 0 || rules.some((rule) => {\n\t\t\tif (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n\t\t\tif (rule.endsWith('/*')) return file.type.toLowerCase().startsWith(rule.slice(0, -1));\n\t\t\treturn file.type.toLowerCase() === rule;\n\t\t}));\n\t\tconst limit = maxFiles !== undefined && Number.isFinite(maxFiles) ? Math.max(0, Math.floor(maxFiles) - prev.length) : accepted.length;\n\t\tconst additions = accepted.slice(0, limit).map((file) => ({ id: makeId(), file, previewUrl: URL.createObjectURL(file) }));\n\t\tif (additions.length > 0) commit([...prev, ...additions]);\n\t}, [accept, commit, disabled, maxFiles]);\n\n\tconst remove = useCallback((id: string) => {\n\t\tif (disabled) return;\n\t\tconst prev = itemsRef.current;\n\t\tconst target = prev.find((item) => item.id === id);\n\t\tif (!target) return;\n\t\tURL.revokeObjectURL(target.previewUrl);\n\t\tcommit(prev.filter((item) => item.id !== id));\n\t}, [commit, disabled]);\n\n\tconst onPickerChange = useCallback(\n\t\t(e: ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst list = e.target.files;\n\t\t\tif (!list || list.length === 0) return;\n\t\t\taddFiles(Array.from(list));\n\t\t\tif (inputRef.current) inputRef.current.value = '';\n\t\t},\n\t\t[addFiles],\n\t);\n\n\tconst { isDragging, dropTargetProps } = useFileDropTarget({ disabled, onFiles: addFiles });\n\tconst onDragEnd = useCallback((event: DragEndEvent) => {\n\t\tif (disabled) return;\n\t\tconst { active, over } = event;\n\t\tif (!over || active.id === over.id) return;\n\t\tconst prev = itemsRef.current;\n\t\tconst from = prev.findIndex((item) => item.id === active.id);\n\t\tconst to = prev.findIndex((item) => item.id === over.id);\n\t\tif (from < 0 || to < 0) return;\n\t\tconst next = [...prev];\n\t\tconst [moved] = next.splice(from, 1);\n\t\tnext.splice(to, 0, moved);\n\t\tcommit(next);\n\t}, [commit, disabled]);\n\n\tconst announce = (template: string, id: string | number, overId?: string | number) => template\n\t\t.replace('{name}', items.find(item => item.id === id)?.file.name ?? strings.removeAria)\n\t\t.replace('{position}', String(items.findIndex(item => item.id === (overId ?? id)) + 1));\n\tconst announcements: Announcements = {\n\t\tonDragStart: ({ active }) => announce(strings.pickedUp ?? defaultMediaGalleryStrings.pickedUp, active.id),\n\t\tonDragOver: ({ active, over }) => over ? announce(strings.movedTo ?? defaultMediaGalleryStrings.movedTo, active.id, over.id) : undefined,\n\t\tonDragEnd: ({ active }) => announce(strings.dropped ?? defaultMediaGalleryStrings.dropped, active.id),\n\t\tonDragCancel: ({ active }) => announce(strings.cancelled ?? defaultMediaGalleryStrings.cancelled, active.id),\n\t};\n\tconst tileIds = useMemo(() => items.map((it) => it.id), [items]);\n\tconst isFull = maxFiles !== undefined && items.length >= maxFiles;\n\n\treturn (\n\t\t<Stack ref={ref} gap=\"lg\" className={cn('media-gallery--component', className)}>\n\t\t\t<DndContext sensors={sensors} onDragEnd={onDragEnd} accessibility={{ announcements }}>\n\t\t\t\t<SortableContext items={tileIds} strategy={rectSortingStrategy}>\n\t\t\t\t\t<Grid columns={{ base: 2, sm: 3, md: 4 }} gap=\"md\">\n\t\t\t\t\t\t{items.map((item, i) => (\n\t\t\t\t\t\t\t<SortableTile\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\tisFirst={i === 0}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tonRemove={() => remove(item.id)}\n\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t\ttileClassName={tileClassName}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t{!isFull && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t{...dropTargetProps}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'relative flex aspect-square items-center justify-center rounded-radius border border-dashed text-center outline-none transition-colors',\n\t\t\t\t\t\t\t\t\t'hover:border-primary-accent hover:bg-primary/5 hover:text-primary-accent focus-within:ring-2 focus-within:ring-ring/50',\n\t\t\t\t\t\t\t\t\tinvalid ? 'border-destructive' : 'border-muted-foreground/40',\n\t\t\t\t\t\t\t\t\tdisabled && 'cursor-not-allowed opacity-50',\n\t\t\t\t\t\t\t\t\t!disabled && isDragging && 'border-primary-accent bg-primary/10 text-primary-accent',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tid={inputId}\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-0 z-10 size-full cursor-pointer opacity-0 disabled:cursor-not-allowed\"\n\t\t\t\t\t\t\t\t\taria-label={strings.addInstruction}\n\t\t\t\t\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\t\t\t\t\taccept={accept}\n\t\t\t\t\t\t\t\t\tmultiple\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonChange={onPickerChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<Stack align=\"center\" gap=\"sm\" className=\"px-space-sm\">\n\t\t\t\t\t\t\t\t\t<ImagePlus className=\"size-icon-lg text-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t<Text weight=\"medium\" align=\"center\">\n\t\t\t\t\t\t\t\t\t\t{isDragging ? strings.dragOver : strings.addInstruction}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Grid>\n\t\t\t\t</SortableContext>\n\t\t\t</DndContext>\n\n\t\t\t{!!isFull && (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{strings.maxReached}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{!isFull && !!strings.helper && (\n\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{strings.helper}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nMediaGallery.displayName = 'MediaGallery';\n"],"mappings":"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"}
|
package/dist/message-B5-6LeYl.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useStrings as e } from "./lib/strings.js";
|
|
3
|
-
import { t } from "./utils-C2EKeIw3.js";
|
|
4
|
-
import { a as n } from "./typography-Cv8MT-82.js";
|
|
5
|
-
import { t as r } from "./structure-BvW4vG4H.js";
|
|
6
|
-
import { n as i } from "./surface-recipes-CQfRr-VL.js";
|
|
7
|
-
import { forwardRef as a } from "react";
|
|
8
|
-
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
9
|
-
//#region src/components/blocks/collaboration/message/message.types.ts
|
|
10
|
-
var c = {
|
|
11
|
-
typing: "Typing…",
|
|
12
|
-
loading: "Loading message…"
|
|
13
|
-
}, l = a(function({ className: e, ...n }, i) {
|
|
14
|
-
return /* @__PURE__ */ o(r, {
|
|
15
|
-
...n,
|
|
16
|
-
ref: i,
|
|
17
|
-
gap: "dense",
|
|
18
|
-
className: t("message--content min-w-0 max-w-full flex-1", e)
|
|
19
|
-
});
|
|
20
|
-
}), u = a(function({ className: e, ...n }, i) {
|
|
21
|
-
return /* @__PURE__ */ o(r, {
|
|
22
|
-
...n,
|
|
23
|
-
ref: i,
|
|
24
|
-
direction: "horizontal",
|
|
25
|
-
align: "baseline",
|
|
26
|
-
gap: "sm",
|
|
27
|
-
wrap: !0,
|
|
28
|
-
className: t("message--header", e)
|
|
29
|
-
});
|
|
30
|
-
}), d = a(function({ className: e, ...n }, i) {
|
|
31
|
-
return /* @__PURE__ */ o(r, {
|
|
32
|
-
...n,
|
|
33
|
-
ref: i,
|
|
34
|
-
direction: "horizontal",
|
|
35
|
-
align: "center",
|
|
36
|
-
gap: "xs",
|
|
37
|
-
wrap: !0,
|
|
38
|
-
className: t("message--actions", e)
|
|
39
|
-
});
|
|
40
|
-
}), f = a(function({ tone: e = "muted", className: r, children: a, ...s }, c) {
|
|
41
|
-
let l = typeof a == "string" || typeof a == "number" || typeof a == "bigint";
|
|
42
|
-
return /* @__PURE__ */ o("div", {
|
|
43
|
-
...s,
|
|
44
|
-
ref: c,
|
|
45
|
-
"data-tone": e,
|
|
46
|
-
className: t("message--bubble min-w-0 max-w-full rounded-radius px-row-x py-row-y break-words", e === "primary" ? "bg-primary text-primary-foreground" : e === "muted" ? "bg-muted text-muted-foreground" : e === "surface" ? t("bg-card text-card-foreground", i.frame.shell) : "text-foreground", r),
|
|
47
|
-
children: l ? /* @__PURE__ */ o(n, {
|
|
48
|
-
className: "text-inherit whitespace-pre-wrap",
|
|
49
|
-
lineHeight: "relaxed",
|
|
50
|
-
children: a
|
|
51
|
-
}) : a
|
|
52
|
-
});
|
|
53
|
-
}), p = a(function({ children: e, className: r, ...i }, a) {
|
|
54
|
-
return /* @__PURE__ */ o("span", {
|
|
55
|
-
...i,
|
|
56
|
-
ref: a,
|
|
57
|
-
role: "status",
|
|
58
|
-
className: t("message--status", r),
|
|
59
|
-
children: /* @__PURE__ */ o(n, {
|
|
60
|
-
tag: "span",
|
|
61
|
-
size: "xs",
|
|
62
|
-
type: "secondary",
|
|
63
|
-
children: e
|
|
64
|
-
})
|
|
65
|
-
});
|
|
66
|
-
}), m = a(function({ align: i = "start", tone: a = "muted", avatar: m, author: h, timestamp: g, dateTime: _, actions: v, status: y, loading: b = !1, typing: x = !1, strings: S, children: C, className: w, ...T }, E) {
|
|
67
|
-
let D = e(c, S);
|
|
68
|
-
return /* @__PURE__ */ s(r, {
|
|
69
|
-
...T,
|
|
70
|
-
ref: E,
|
|
71
|
-
direction: "horizontal",
|
|
72
|
-
align: "start",
|
|
73
|
-
gap: "md",
|
|
74
|
-
"data-align": i,
|
|
75
|
-
"aria-busy": b || x || void 0,
|
|
76
|
-
className: t("message--component w-full min-w-0", i === "end" && "flex-row-reverse", w),
|
|
77
|
-
children: [m, /* @__PURE__ */ s(l, {
|
|
78
|
-
className: i === "end" ? "items-end" : void 0,
|
|
79
|
-
children: [
|
|
80
|
-
(h !== void 0 || g !== void 0) && /* @__PURE__ */ s(u, { children: [h !== void 0 && /* @__PURE__ */ o(n, {
|
|
81
|
-
tag: "span",
|
|
82
|
-
weight: "medium",
|
|
83
|
-
children: h
|
|
84
|
-
}), g !== void 0 && /* @__PURE__ */ o("time", {
|
|
85
|
-
dateTime: _,
|
|
86
|
-
children: /* @__PURE__ */ o(n, {
|
|
87
|
-
tag: "span",
|
|
88
|
-
size: "xs",
|
|
89
|
-
type: "secondary",
|
|
90
|
-
className: "tabular-nums",
|
|
91
|
-
children: g
|
|
92
|
-
})
|
|
93
|
-
})] }),
|
|
94
|
-
/* @__PURE__ */ o(f, {
|
|
95
|
-
tone: a,
|
|
96
|
-
children: C
|
|
97
|
-
}),
|
|
98
|
-
(x || b || y !== void 0) && /* @__PURE__ */ o(p, { children: x ? D.typing : b ? D.loading : y }),
|
|
99
|
-
v !== void 0 && /* @__PURE__ */ o(d, { children: v })
|
|
100
|
-
]
|
|
101
|
-
})]
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
m.displayName = "Message";
|
|
105
|
-
//#endregion
|
|
106
|
-
export { u as a, l as i, d as n, p as o, f as r, c as s, m as t };
|
|
107
|
-
|
|
108
|
-
//# sourceMappingURL=message-B5-6LeYl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-B5-6LeYl.js","names":["Text","Stack","surfaceDividerRecipes","defaultMessageStrings","MessageContent","forwardRef","props","cn","className","MessageHeader","MessageActions","MessageBubble","scalar","children","tone","MessageStatus","Message","stringsProp","strings","useStrings","align","loading","typing","avatar","author","timestamp","status","actions"],"sources":["../src/components/blocks/collaboration/message/message.types.ts","../src/components/blocks/collaboration/message/message.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport type { StringsProp } from '../../../../lib/strings';\nexport interface MessageStrings { typing: string; loading: string }\nexport const defaultMessageStrings: MessageStrings = { typing: 'Typing…', loading: 'Loading message…' };\nexport interface MessageProps extends ComponentPropsWithoutRef<'div'> {\n /** Message direction, independent of author or service role. */\n align?: 'start' | 'end';\n /** Bubble treatment. @default muted */\n tone?: 'muted' | 'primary' | 'plain' | 'surface';\n avatar?: ReactNode;\n author?: ReactNode;\n /** Caller-formatted time; datetime supplies machine-readable time when available. */\n timestamp?: ReactNode;\n dateTime?: string;\n actions?: ReactNode;\n status?: ReactNode;\n loading?: boolean;\n typing?: boolean;\n strings?: StringsProp<MessageStrings>;\n}\nexport interface MessagePartProps extends ComponentPropsWithoutRef<'div'> {}\nexport interface MessageBubbleProps extends MessagePartProps { tone?: 'muted' | 'primary' | 'plain' | 'surface' }\nexport interface MessageStatusProps extends ComponentPropsWithoutRef<'span'> {}\n","import { forwardRef } from 'react';\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { surfaceDividerRecipes } from '../../../../lib/surface-recipes';\nimport { cn } from '../../../../lib/utils';\nimport { useStrings } from '../../../../lib/strings';\nimport { defaultMessageStrings, type MessageProps, type MessagePartProps, type MessageBubbleProps, type MessageStatusProps } from './message.types';\nexport const MessageContent = forwardRef<HTMLDivElement, MessagePartProps>(function MessageContent({ className, ...props }, ref) { return <Stack {...props} ref={ref} gap=\"dense\" className={cn('message--content min-w-0 max-w-full flex-1', className)} />; });\nexport const MessageHeader = forwardRef<HTMLDivElement, MessagePartProps>(function MessageHeader({ className, ...props }, ref) { return <Stack {...props} ref={ref} direction=\"horizontal\" align=\"baseline\" gap=\"sm\" wrap className={cn('message--header', className)} />; });\nexport const MessageActions = forwardRef<HTMLDivElement, MessagePartProps>(function MessageActions({ className, ...props }, ref) { return <Stack {...props} ref={ref} direction=\"horizontal\" align=\"center\" gap=\"xs\" wrap className={cn('message--actions', className)} />; });\nexport const MessageBubble = forwardRef<HTMLDivElement, MessageBubbleProps>(function MessageBubble({ tone = 'muted', className, children, ...props }, ref) {\n const scalar = typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint';\n return <div {...props} ref={ref} data-tone={tone} className={cn('message--bubble min-w-0 max-w-full rounded-radius px-row-x py-row-y break-words', tone === 'primary' ? 'bg-primary text-primary-foreground' : tone === 'muted' ? 'bg-muted text-muted-foreground' : tone === 'surface' ? cn('bg-card text-card-foreground', surfaceDividerRecipes.frame.shell) : 'text-foreground', className)}>{scalar ? <Text className=\"text-inherit whitespace-pre-wrap\" lineHeight=\"relaxed\">{children}</Text> : children}</div>;\n});\nexport const MessageStatus = forwardRef<HTMLSpanElement, MessageStatusProps>(function MessageStatus({ children, className, ...props }, ref) { return <span {...props} ref={ref} role=\"status\" className={cn('message--status', className)}><Text tag=\"span\" size=\"xs\" type=\"secondary\">{children}</Text></span>; });\n/** Callback-free transcript presentation. Consumers own rich text, requests and delivery state. */\nexport const Message = forwardRef<HTMLDivElement, MessageProps>(function Message({ align = 'start', tone = 'muted', avatar, author, timestamp, dateTime, actions, status, loading = false, typing = false, strings: stringsProp, children, className, ...props }, ref) {\n const strings = useStrings(defaultMessageStrings, stringsProp);\n return <Stack {...props} ref={ref} direction=\"horizontal\" align=\"start\" gap=\"md\" data-align={align} aria-busy={loading || typing || undefined} className={cn('message--component w-full min-w-0', align === 'end' && 'flex-row-reverse', className)}>\n {avatar}\n <MessageContent className={align === 'end' ? 'items-end' : undefined}>\n {(author !== undefined || timestamp !== undefined) && <MessageHeader>\n {author !== undefined && <Text tag=\"span\" weight=\"medium\">{author}</Text>}\n {timestamp !== undefined && <time dateTime={dateTime}><Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"tabular-nums\">{timestamp}</Text></time>}\n </MessageHeader>}\n <MessageBubble tone={tone}>{children}</MessageBubble>\n {(typing || loading || status !== undefined) && <MessageStatus>{typing ? strings.typing : loading ? strings.loading : status}</MessageStatus>}\n {actions !== undefined && <MessageActions>{actions}</MessageActions>}\n </MessageContent>\n </Stack>;\n});\nMessage.displayName = 'Message';\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-BTrEb5u4.js","names":["_Fragment","Text","Stack","ActionMenu","Badge","TabScrollViewport","Fragment$1","LanguageSwitcher","handleSelect","useCallback","isActive","onSelect","value","locales","variant","cn","Globe","label","onRenderLabel","locale","Fragment","index","Button","defaultNavigationTabsStrings","normalizePath","hashRouteIndex","rawUrl","origin","NavigationTabs","forwardRef","stringsProp","strings","useStrings","activePath","currentPath","prominent","list","items","item","Icon","scrollable","className","scrollStrings","defaultOverflowTabBarStrings","TAB_BUTTON_BASE","isSimpleText","OverflowTabBar","rootProps","containerRef","useRef","measureRef","visibleCount","setVisibleCount","useState","container","measure","compute","containerWidth","buttons","used","count","btn","w","observer","orderedItems","useMemo","activeIdx","i","next","lastVisibleIdx","visibleItems","overflowItems","onValueChange","renderTab","tabClasses","activeTabClassName","tabClassName","inner","options","MoreHorizontal"],"sources":["../src/components/base/navigation/language-switcher.tsx","../src/components/base/navigation/navigation-tabs.tsx","../src/components/base/navigation/overflow-tab-bar.tsx"],"sourcesContent":["/**\n * LanguageSwitcher — locale picker with two layouts: `buttons` (chunky\n * primary buttons) and `inline` (small text links separated by dots, prefixed\n * with a globe icon). Defaults to `buttons`.\n *\n * The library never navigates on its own. The consumer wires routing /\n * locale switching by passing `onSelect` (e.g. a Tanstack Router\n * `navigate(...)` or Inertia `router.visit(...)`). When `onSelect` is\n * absent the click is a no-op.\n */\nimport { Globe } from 'lucide-react';\nimport { Fragment, useCallback } from 'react';\n\nimport { Button } from '../buttons';\nimport { Text } from '../../typography';\nimport { Stack } from '../structure';\nimport { cn } from '../../../lib/utils';\nimport type { LocaleOption } from '../../../types/locale.types';\n\nexport interface LanguageSwitcherProps {\n\tlocales: LocaleOption[];\n\tonRenderLabel?: (options: LocaleOption) => string;\n\t/** Semantic tone. */\n\tvariant?: 'buttons' | 'inline';\n\tonSelect?: (value: string) => void;\n}\n\nexport function LanguageSwitcher({\n\tlocales,\n\tonRenderLabel,\n\tvariant = 'buttons',\n\tonSelect,\n}: LanguageSwitcherProps) {\n\tconst handleSelect = useCallback((value: string, isActive: boolean) => {\n\t\tif (isActive) {\n\t\t\treturn;\n\t\t}\n\n\t\tonSelect?.(value);\n\t}, [onSelect]);\n\n\tif (locales.length === 0) {\n\t\treturn null;\n\t}\n\n\tif (variant === 'inline') {\n\t\treturn (\n\t\t\t<div className={cn('language-switcher--component', 'flex items-center justify-center gap-2.5')}>\n\t\t\t\t<Globe className=\"size-icon text-muted-foreground/70\" aria-hidden=\"true\" />\n\t\t\t\t<div className=\"flex items-center justify-center gap-2.5\">\n\t\t\t\t\t{locales.map((locale, index) => {\n\t\t\t\t\t\tconst label = onRenderLabel\n\t\t\t\t\t\t\t? onRenderLabel(locale)\n\t\t\t\t\t\t\t: locale.nativeLabel;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Fragment key={locale.value}>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\thandleSelect(locale.value, locale.active)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'text-pxs transition-colors',\n\t\t\t\t\t\t\t\t\t\tlocale.active\n\t\t\t\t\t\t\t\t\t\t\t? 'text-primary-accent font-medium'\n\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:text-foreground',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"pxs\" weight={locale.active ? 'medium' : 'regular'} className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{index < locales.length - 1 && (\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"size-1 rounded-full bg-border\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Stack direction=\"horizontal\" align=\"center\" justify=\"center\" wrap gap=\"md\">\n\t\t\t{locales.map((locale) => {\n\t\t\t\tconst label = onRenderLabel ? onRenderLabel(locale) : locale.nativeLabel;\n\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={locale.value}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle={locale.active ? 'solid' : 'ghost'}\n\t\t\t\t\t\tonClick={() => handleSelect(locale.value, locale.active)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'min-w-18 justify-center transition-colors',\n\t\t\t\t\t\t\tlocale.active ? 'font-semibold text-primary-accent' : 'text-muted-foreground',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Stack>\n\t);\n}\n\nLanguageSwitcher.displayName = 'LanguageSwitcher';\n","/**\n * NavigationTabs — canonical route-tab navigation.\n *\n * The default compact treatment works for ordinary application navigation;\n * `variant=\"prominent\"` provides the stronger filled treatment without\n * introducing a second component or item vocabulary.\n */\nimport { forwardRef, type ReactNode } from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nimport { Badge } from '../badge';\nimport { Button } from '../buttons';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { TabScrollViewport, type TabsScrollStrings } from './tab-scroll-viewport';\n\nexport interface NavigationTabItem {\n\ttitle: string;\n\thref: string;\n\ticon?: LucideIcon | string;\n\tbadge?: ReactNode;\n\tactive?: boolean;\n\tdisabled?: boolean;\n}\n\nexport interface NavigationTabsStrings {\n\ttabsAria: string;\n}\n\nexport const defaultNavigationTabsStrings: NavigationTabsStrings = {\n\ttabsAria: 'Tab navigation',\n};\n\nexport type NavigationTabsVariant = 'default' | 'prominent';\n\nexport interface NavigationTabsProps {\n\t/** Tabs to render, in order. */\n\titems: readonly NavigationTabItem[];\n\t/** Path of the active route, used to mark the current tab. */\n\tcurrentPath?: string;\n\t/** Visual treatment of the tab row. */\n\tvariant?: NavigationTabsVariant;\n\t/** Show previous/next controls when route tabs overflow. Defaults to true. */\n\tscrollable?: boolean;\n\t/** Accessible labels for the previous/next scroll controls. */\n\tscrollStrings?: StringsProp<TabsScrollStrings>;\n\t/** Overrides the tab row's own copy. */\n\tstrings?: StringsProp<NavigationTabsStrings>;\n\tclassName?: string;\n}\n\nfunction normalizePath(rawUrl: string): string {\n\tconst hashRouteIndex = rawUrl.indexOf('#/');\n\tif (hashRouteIndex >= 0) {\n\t\treturn rawUrl.slice(hashRouteIndex).split('?')[0]?.replace(/\\/+$/, '') || '#/';\n\t}\n\n\ttry {\n\t\tconst origin = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n\t\tconst parsed = new URL(rawUrl, origin);\n\t\treturn parsed.pathname.replace(/\\/+$/, '') || '/';\n\t} catch {\n\t\treturn rawUrl.split('?')[0]?.replace(/\\/+$/, '') || '/';\n\t}\n}\n\nexport const NavigationTabs = forwardRef<HTMLDivElement, NavigationTabsProps>(function NavigationTabs({\n\titems,\n\tcurrentPath,\n\tvariant = 'default',\n\tscrollable = true,\n\tscrollStrings,\n\tstrings: stringsProp,\n\tclassName,\n}: NavigationTabsProps, ref) {\n\tconst strings = useStrings(defaultNavigationTabsStrings, stringsProp);\n\tconst activePath = normalizePath(\n\t\tcurrentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/'),\n\t);\n\tconst prominent = variant === 'prominent';\n\n\tconst list = <Stack\n\t\t\t\trender={<nav aria-label={strings.tabsAria} />}\n\t\t\t\tdirection=\"horizontal\"\n\t\t\t\tgap=\"2xs\"\n\t\t\t\twrap={false}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'navigation-tabs--list w-max rounded-radius bg-muted p-space-2xs',\n\t\t\t\t\tprominent && 'rounded-radius bg-muted/60',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{items.map((item) => {\n\t\t\t\t\tconst isActive = item.active ?? activePath === normalizePath(item.href);\n\t\t\t\t\tconst Icon = typeof item.icon === 'string' ? undefined : item.icon;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tkey={item.href}\n\t\t\t\t\t\t\thref={item.href}\n\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\ttone={isActive && prominent ? 'primary' : 'secondary'}\n\t\t\t\t\t\t\tbuttonStyle={isActive ? 'solid' : 'ghost'}\n\t\t\t\t\t\t\ticon={Icon}\n\t\t\t\t\t\t\taria-current={isActive ? 'page' : undefined}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'navigation-tabs--item shrink-0',\n\t\t\t\t\t\t\t\t'rounded-radius',\n\t\t\t\t\t\t\t\t!prominent && isActive && 'bg-background text-foreground shadow-sm hover:bg-background/90',\n\t\t\t\t\t\t\t\t!prominent && !isActive && 'text-muted-foreground hover:bg-background/50 hover:text-foreground',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{typeof item.icon === 'string' && (\n\t\t\t\t\t\t\t\t<span className=\"navigation-tabs--icon text-inherit\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t{item.icon}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\tlineHeight=\"none\"\n\t\t\t\t\t\t\t\tclassName=\"navigation-tabs--title text-inherit\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.title}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t{item.badge !== undefined && item.badge !== null && (\n\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\tclassName=\"navigation-tabs--badge\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{item.badge}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Stack>;\n\treturn <div ref={ref} className={cn('navigation-tabs--component', 'w-full min-w-0', !scrollable && 'overflow-x-auto', className)}>\n\t\t{scrollable ? <TabScrollViewport strings={scrollStrings}>{list}</TabScrollViewport> : list}\n\t</div>;\n});\n\nNavigationTabs.displayName = 'NavigationTabs';\n","/**\n * OverflowTabBar — horizontal tab strip that gracefully degrades on narrow\n * containers. Tabs that would overflow are moved into a trailing \"More\"\n * dropdown so the strip never wraps. Uses a ResizeObserver to recompute on\n * container resize; the active tab is always kept visible by being moved\n * out of the overflow set when needed.\n *\n * Use `NavigationTabs` instead when a fixed route set cannot overflow.\n */\nimport { MoreHorizontal, type LucideIcon } from 'lucide-react';\nimport { forwardRef, useEffect, useLayoutEffect, useMemo, useRef, useState, type ComponentPropsWithoutRef, type ReactNode } from 'react';\n\nimport { ActionMenu } from '../action-menu';\nimport { Badge } from '../badge';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nexport interface OverflowTabBarStrings {\n\tmore: string;\n\tnavigationLabel: string;\n}\n\nexport const defaultOverflowTabBarStrings: OverflowTabBarStrings = {\n\tmore: 'More',\n\tnavigationLabel: 'Tab navigation',\n};\n\nexport interface OverflowTabItem {\n\t/** Stable identity for this entry. */\n\tid: string;\n\t/** Display label. */\n\tlabel: ReactNode;\n\t/** Destination for the entry, when it navigates. */\n\thref?: string;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n\t/** Chip rendered beside the label. */\n\tbadge?: ReactNode;\n\tonClick?: () => void;\n}\n\nexport interface OverflowTabBarProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children'> {\n\t/** Entries to render, in order. */\n\titems: OverflowTabItem[];\n\t/** Currently active tab id. */\n\tvalue?: string;\n\t/** Fired with the id of the newly active tab. */\n\tonValueChange?: (id: string) => void;\n\ttabClassName?: string;\n\tactiveTabClassName?: string;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<OverflowTabBarStrings>;\n}\n\nconst TAB_BUTTON_BASE =\n\t'inline-flex h-action shrink-0 items-center gap-space-sm rounded-radius-md px-control text-pxs font-medium whitespace-nowrap transition-colors ' +\n\t'hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40';\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\nexport const OverflowTabBar = forwardRef<HTMLDivElement, OverflowTabBarProps>(function OverflowTabBar({\n\titems,\n\tvalue,\n\tonValueChange,\n\tclassName,\n\ttabClassName,\n\tactiveTabClassName,\n\tstrings: stringsProp,\n\t...rootProps\n}, ref) {\n\tconst strings = useStrings(defaultOverflowTabBarStrings, stringsProp);\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst measureRef = useRef<HTMLDivElement | null>(null);\n\tconst [visibleCount, setVisibleCount] = useState(items.length);\n\n\t// Recompute how many tabs fit when container or items change.\n\tuseLayoutEffect(() => {\n\t\tif (!containerRef.current || !measureRef.current) return;\n\t\tconst container = containerRef.current;\n\t\tconst measure = measureRef.current;\n\n\t\tconst compute = () => {\n\t\t\tconst containerWidth = container.clientWidth;\n\t\t\tif (containerWidth === 0) {\n\t\t\t\tsetVisibleCount(items.length);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst moreReserve = 72; // approximate \"More\" trigger width\n\t\t\tconst buttons = Array.from(measure.querySelectorAll<HTMLElement>('[data-tab-id]'));\n\t\t\tlet used = 0;\n\t\t\tlet count = 0;\n\t\t\tfor (const btn of buttons) {\n\t\t\t\tconst w = btn.offsetWidth + 4; // gap allowance\n\t\t\t\tif (used + w + moreReserve <= containerWidth) {\n\t\t\t\t\tused += w;\n\t\t\t\t\tcount += 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetVisibleCount(count === buttons.length ? count : Math.max(1, count));\n\t\t};\n\n\t\tcompute();\n\t\tif (typeof ResizeObserver === 'undefined') {\n\t\t\treturn;\n\t\t}\n\t\tconst observer = new ResizeObserver(compute);\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, [items]);\n\n\t// Ensure active tab is always visible; if it falls into the overflow set,\n\t// pull it forward by reducing the visible count to where it lives.\n\tconst orderedItems = useMemo(() => {\n\t\tif (!value) return items;\n\t\tconst activeIdx = items.findIndex((i) => i.id === value);\n\t\tif (activeIdx < 0 || activeIdx < visibleCount) return items;\n\t\t// Move active item into the visible window (swap with last visible).\n\t\tconst next = [...items];\n\t\tconst lastVisibleIdx = Math.max(0, visibleCount - 1);\n\t\t[next[activeIdx], next[lastVisibleIdx]] = [next[lastVisibleIdx], next[activeIdx]];\n\t\treturn next;\n\t}, [items, value, visibleCount]);\n\n\tconst visibleItems = orderedItems.slice(0, visibleCount);\n\tconst overflowItems = orderedItems.slice(visibleCount);\n\n\tconst handleSelect = (item: OverflowTabItem) => {\n\t\tonValueChange?.(item.id);\n\t\titem.onClick?.();\n\t};\n\n\tconst renderTab = (item: OverflowTabItem, isActive: boolean, options?: { measure?: boolean }) => {\n\t\tconst Icon = item.icon;\n\t\tconst tabClasses = cn(\n\t\t\tTAB_BUTTON_BASE,\n\t\t\tisActive\n\t\t\t\t? cn('bg-card text-foreground shadow-sm', activeTabClassName)\n\t\t\t\t: 'text-muted-foreground hover:bg-muted/60',\n\t\t\ttabClassName,\n\t\t);\n\t\tconst inner = (\n\t\t\t<>\n\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm\" />}\n\t\t\t\t{isSimpleText(item.label) ? (\n\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</Text>\n\t\t\t\t) : item.label}\n\t\t\t\t{!!item.badge && (\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'ml-space-sm',\n\t\t\t\t\t\t\tisActive ? 'bg-primary/10 text-primary-accent' : 'bg-muted-foreground/10 text-muted-foreground',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{item.badge}\n\t\t\t\t\t</Badge>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t\tif (options?.measure) {\n\t\t\treturn (\n\t\t\t\t<span\n\t\t\t\t\tkey={item.id}\n\t\t\t\t\tdata-tab-id={item.id}\n\t\t\t\t\tclassName={cn('overflow-tab-bar--measure', tabClasses)}\n\t\t\t\t>\n\t\t\t\t\t{inner}\n\t\t\t\t</span>\n\t\t\t);\n\t\t}\n\t\tif (item.href) {\n\t\t\treturn (\n\t\t\t\t<a\n\t\t\t\t\tkey={item.id}\n\t\t\t\t\thref={item.href}\n\t\t\t\t\tdata-tab-id={item.id}\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-selected={isActive}\n\t\t\t\t\ttabIndex={isActive || !value ? 0 : -1}\n\t\t\t\t\tonClick={() => handleSelect(item)}\n\t\t\t\t\tclassName={cn('overflow-tab-bar--tab', tabClasses)}\n\t\t\t\t>\n\t\t\t\t\t{inner}\n\t\t\t\t</a>\n\t\t\t);\n\t\t}\n\t\treturn (\n\t\t\t<button\n\t\t\t\tkey={item.id}\n\t\t\t\ttype=\"button\"\n\t\t\t\tdata-tab-id={item.id}\n\t\t\t\trole=\"tab\"\n\t\t\t\taria-selected={isActive}\n\t\t\t\ttabIndex={isActive || !value ? 0 : -1}\n\t\t\t\tonClick={() => handleSelect(item)}\n\t\t\t\tclassName={cn('overflow-tab-bar--tab', tabClasses)}\n\t\t\t>\n\t\t\t\t{inner}\n\t\t\t</button>\n\t\t);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn('overflow-tab-bar--component relative w-full min-w-0 max-w-full', className)}\n\t\t\t{...rootProps}\n\t\t>\n\t\t\t{/* Hidden measure row: always renders all tabs at native width so\n\t\t\t we can measure how many fit. Visually hidden but laid out. */}\n\t\t\t<div\n\t\t\t\tref={measureRef}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName=\"pointer-events-none fixed left-0 top-0 z-[-1] flex h-0 w-0 items-center gap-space-xs overflow-hidden opacity-0\"\n\t\t\t>\n\t\t\t\t{items.map((i) => renderTab(i, false, { measure: true }))}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"overflow-tab-bar--viewport relative flex w-full min-w-0 max-w-full items-center gap-space-xs overflow-hidden rounded-radius bg-muted/40 p-space-xs\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\trole=\"tablist\"\n\t\t\t\t\taria-label={strings.navigationLabel}\n\t\t\t\t\taria-orientation=\"horizontal\"\n\t\t\t\t\tclassName=\"overflow-tab-bar--tablist flex min-w-0 flex-1 items-center gap-space-xs overflow-hidden\"\n\t\t\t\t>\n\t\t\t\t\t{visibleItems.map((item) => renderTab(item, item.id === value))}\n\t\t\t\t</div>\n\t\t\t\t{overflowItems.length > 0 && (\n\t\t\t\t\t<ActionMenu\n\t\t\t\t\t\tactions={overflowItems.map((item) => ({\n\t\t\t\t\t\t\tid: item.id,\n\t\t\t\t\t\t\tlabel: item.label,\n\t\t\t\t\t\t\ticon: item.icon,\n\t\t\t\t\t\t\tonClick: () => handleSelect(item),\n\t\t\t\t\t\t\t// Only the selected tint here; `density=\"table\"` carries the\n\t\t\t\t\t\t\t// compact type and inset, so the row stays on the token scale.\n\t\t\t\t\t\t\tclassName: cn(item.id === value && 'bg-primary/5 text-primary-accent'),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\talign=\"end\"\n\t\t\t\t\t\tdensity=\"table\"\n\t\t\t\t\t\tcontentClassName=\"min-w-40\"\n\t\t\t\t\t\twidth=\"w-auto\"\n\t\t\t\t\t\tcloseOnSelect\n\t\t\t\t\t\tpreserveOrder\n\t\t\t\t\t\trenderTrigger={\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\taria-label={strings.more}\n\t\t\t\t\t\t\t\tclassName={cn(TAB_BUTTON_BASE, 'text-muted-foreground hover:bg-muted/60')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<MoreHorizontal className=\"size-icon-sm\" />\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t{strings.more}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nOverflowTabBar.displayName = 'OverflowTabBar';\n\n// useEffect is referenced indirectly through useLayoutEffect above; keep the\n// import so SSR builds that fall back to useEffect still compile cleanly.\nvoid useEffect;\n"],"mappings":"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"}
|