themelia-react-ui 2.0.1 → 2.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 +307 -131
- package/README.md +28 -8
- package/THIRD_PARTY_NOTICES.md +13 -0
- package/dist/{accordion-B6a3vVgA.js → accordion-Cjb6sx0G.js} +14 -13
- package/dist/accordion-Cjb6sx0G.js.map +1 -0
- package/dist/action-menu-CllU52Mm.js +280 -0
- package/dist/action-menu-CllU52Mm.js.map +1 -0
- package/dist/affordance-geometry.generated-tF36bREk.js +140 -0
- package/dist/affordance-geometry.generated-tF36bREk.js.map +1 -0
- package/dist/ai-artifact-DvTwDVyL.js +1148 -0
- package/dist/ai-artifact-DvTwDVyL.js.map +1 -0
- package/dist/{app-shell-ZK5RWdo6.js → app-shell-C4FhvCqF.js} +5 -5
- package/dist/{app-shell-ZK5RWdo6.js.map → app-shell-C4FhvCqF.js.map} +1 -1
- package/dist/attachment-BxDfL2mw.js +246 -0
- package/dist/attachment-BxDfL2mw.js.map +1 -0
- package/dist/{auth-CYxKfo69.js → auth-ax2BqjrI.js} +58 -54
- package/dist/auth-ax2BqjrI.js.map +1 -0
- package/dist/{avatar-BBnEJIx8.js → avatar-DAPlDvhJ.js} +7 -7
- package/dist/avatar-DAPlDvhJ.js.map +1 -0
- package/dist/{badge-MrKVNzW9.js → badge-HpFqoqSY.js} +40 -40
- package/dist/badge-HpFqoqSY.js.map +1 -0
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/batch-action-bar.js +1 -1
- package/dist/base/buttons.js +1 -1
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +40 -36
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +92 -92
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +2 -2
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +2 -2
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +2 -2
- package/dist/base/display.js +6 -6
- package/dist/base/feedback.js +3 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +14 -14
- package/dist/base/inline-edit.js.map +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +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 +171 -176
- 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 +6 -6
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +79 -2
- package/dist/base/spinner.js.map +1 -0
- 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 +46 -45
- 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/{batch-action-bar-BZGDG-Si.js → batch-action-bar-DnUJ21NQ.js} +6 -5
- package/dist/batch-action-bar-DnUJ21NQ.js.map +1 -0
- package/dist/blocks/admin.js +42 -42
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +260 -240
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +620 -585
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +1 -1
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +1152 -1109
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +2 -2
- package/dist/blocks/onboarding.js +48 -39
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +13 -12
- package/dist/blocks/planning.js.map +1 -1
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-D5t7I023.js → breadcrumbs-C-oqs1sQ.js} +5 -5
- package/dist/breadcrumbs-C-oqs1sQ.js.map +1 -0
- package/dist/{button-QYwiyhD2.js → button-DVzspB_G.js} +2 -2
- package/dist/{button-QYwiyhD2.js.map → button-DVzspB_G.js.map} +1 -1
- package/dist/{buttons-SbIcm1HJ.js → buttons-DPZekJFu.js} +20 -15
- package/dist/buttons-DPZekJFu.js.map +1 -0
- package/dist/cards-BaBZR-AU.js +68 -0
- package/dist/cards-BaBZR-AU.js.map +1 -0
- package/dist/{chart-QfrARkXl.js → chart-ZOYyK2xG.js} +58 -55
- package/dist/chart-ZOYyK2xG.js.map +1 -0
- package/dist/{checkbox-DhB6K0bK.js → checkbox-AWIhNhmo.js} +2 -2
- package/dist/{checkbox-DhB6K0bK.js.map → checkbox-AWIhNhmo.js.map} +1 -1
- package/dist/{choice-inputs-t6w3ATNz.js → choice-inputs-CNHvARCJ.js} +49 -45
- package/dist/choice-inputs-CNHvARCJ.js.map +1 -0
- package/dist/{code-block-Dgbu-CU3.js → code-block-DeneBJR_.js} +8 -8
- package/dist/code-block-DeneBJR_.js.map +1 -0
- package/dist/{collapsible-D8AEGU1-.js → collapsible-C-_l4hpy.js} +3 -3
- package/dist/{collapsible-D8AEGU1-.js.map → collapsible-C-_l4hpy.js.map} +1 -1
- package/dist/{collection-content-uK16Grv0.js → collection-content-By56pLog.js} +3 -3
- package/dist/{collection-content-uK16Grv0.js.map → collection-content-By56pLog.js.map} +1 -1
- package/dist/combobox-C0EQW6dr.js +875 -0
- package/dist/combobox-C0EQW6dr.js.map +1 -0
- package/dist/combobox-xCQ2RMNE.js +309 -0
- package/dist/combobox-xCQ2RMNE.js.map +1 -0
- package/dist/{command-kNR20o7x.js → command-C25VMRII.js} +7 -7
- package/dist/{command-kNR20o7x.js.map → command-C25VMRII.js.map} +1 -1
- package/dist/{comments-BpDuCUUu.js → comments-BYYlTA8E.js} +114 -105
- package/dist/comments-BYYlTA8E.js.map +1 -0
- package/dist/components/base/badge/badge.recipes.d.ts +1 -1
- package/dist/components/base/buttons/loader-button.d.ts +2 -1
- package/dist/components/base/cards/card.recipes.d.ts +2 -3
- package/dist/components/base/cards/partials/smart-card-skeleton.d.ts +3 -13
- package/dist/components/base/cards/smart-card.types.d.ts +11 -4
- package/dist/components/base/chart/chart.d.ts +2 -5
- package/dist/components/base/combobox/combobox.strings.d.ts +7 -0
- package/dist/components/base/combobox/index.d.ts +30 -4
- package/dist/components/base/forms/form-sizing.d.ts +11 -3
- package/dist/components/base/navigation/pagination.d.ts +5 -2
- package/dist/components/base/popover/popover.recipes.d.ts +15 -1
- package/dist/components/base/table/index.d.ts +9 -2
- package/dist/components/base/text-inputs/input-group.d.ts +2 -2
- package/dist/components/blocks/ai/ai-shimmer/ai-shimmer.d.ts +1 -1
- package/dist/components/blocks/ai/ai-shimmer/types.d.ts +3 -0
- package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +3 -1
- package/dist/components/blocks/data-display/inline-stat/inline-stat.d.ts +16 -8
- package/dist/components/features/activities/partials/activity-marker.d.ts +6 -3
- package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +5 -0
- package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +220 -0
- package/dist/components/features/appointment-calendar/appointment-calendar.utils.d.ts +41 -0
- package/dist/components/features/appointment-calendar/index.d.ts +3 -0
- package/dist/components/features/appointment-calendar/partials/appointment-agenda.d.ts +32 -0
- package/dist/components/features/appointment-calendar/partials/appointment-month.d.ts +13 -0
- package/dist/components/features/combobox/combobox.strings.d.ts +15 -1
- package/dist/components/features/combobox/types.d.ts +4 -0
- package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
- package/dist/components/features/rich-text-editor/index.d.ts +1 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +6 -0
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +9 -1
- package/dist/components/features/table/table-header.d.ts +1 -1
- package/dist/components/features/table/table.strings.d.ts +55 -1
- package/dist/components/features/table/table.types.d.ts +17 -4
- package/dist/components/features/theme-tweaker/theme-tweaker.types.d.ts +5 -0
- package/dist/components/primitives/number.d.ts +4 -2
- package/dist/components/primitives/value.d.ts +3 -1
- package/dist/components/typography/text-link.d.ts +4 -0
- package/dist/components/ui/combobox.d.ts +6 -2
- package/dist/components/ui/item.d.ts +8 -8
- package/dist/components/ui/tabs.d.ts +1 -1
- package/dist/{containers-DmWiJa2I.js → containers-Mu1LMGV1.js} +2 -2
- package/dist/{containers-DmWiJa2I.js.map → containers-Mu1LMGV1.js.map} +1 -1
- package/dist/{copyable-B3Gwgdqc.js → copyable-ClBuk_UK.js} +4 -4
- package/dist/{copyable-B3Gwgdqc.js.map → copyable-ClBuk_UK.js.map} +1 -1
- package/dist/{data-display-DafIvCl5.js → data-display-DT_khPl_.js} +98 -87
- package/dist/data-display-DT_khPl_.js.map +1 -0
- package/dist/{date-BgK3bTdo.js → date-DCrsDTZc.js} +5 -5
- package/dist/{date-BgK3bTdo.js.map → date-DCrsDTZc.js.map} +1 -1
- package/dist/{date-picker-CF-DtUpF.js → date-picker-ay0Pha_a.js} +594 -593
- package/dist/date-picker-ay0Pha_a.js.map +1 -0
- package/dist/date-pickers-Ccw8DL2b.js +175 -0
- package/dist/date-pickers-Ccw8DL2b.js.map +1 -0
- package/dist/{display-DsQTVzMz.js → display-hAc1HjpI.js} +49 -49
- package/dist/display-hAc1HjpI.js.map +1 -0
- package/dist/dropdown-menu-Cl4X7L5S.js +193 -0
- package/dist/dropdown-menu-Cl4X7L5S.js.map +1 -0
- package/dist/editable-text-recipe-Cn61kEcv.js +10 -0
- package/dist/editable-text-recipe-Cn61kEcv.js.map +1 -0
- package/dist/features/activities.js +398 -375
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +188 -179
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +683 -0
- package/dist/features/appointment-calendar.js.map +1 -0
- package/dist/features/async-preview.js +109 -107
- 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 +137 -137
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer.js +255 -255
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +254 -248
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +35 -32
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +118 -117
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +233 -231
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +789 -775
- 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 +922 -902
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +28 -24
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +18 -15
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +12 -12
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +15 -13
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +11 -5
- package/dist/features/sync.js.map +1 -1
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +493 -489
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-BYIhtitP.js +239 -0
- package/dist/feedback-BYIhtitP.js.map +1 -0
- package/dist/{field-affordance-recipes-qQeIf4lG.js → field-affordance-recipes-DZhnIL_Y.js} +11 -18
- package/dist/field-affordance-recipes-DZhnIL_Y.js.map +1 -0
- package/dist/{filters-BkHH53uv.js → filters-BGfvjP4d.js} +589 -580
- package/dist/filters-BGfvjP4d.js.map +1 -0
- package/dist/{form-field-DUt4UxSV.js → form-field-CwH9y77i.js} +6 -5
- package/dist/form-field-CwH9y77i.js.map +1 -0
- package/dist/{form-sizing-By94KzXE.js → form-sizing-BdP_Mf5p.js} +39 -44
- package/dist/form-sizing-BdP_Mf5p.js.map +1 -0
- package/dist/{forms-Bzha-Y3B.js → forms-B9G_xwzi.js} +8 -8
- package/dist/{forms-Bzha-Y3B.js.map → forms-B9G_xwzi.js.map} +1 -1
- package/dist/{forms-numeric-C0bvjRPZ.js → forms-numeric-B_jraJaQ.js} +309 -309
- package/dist/forms-numeric-B_jraJaQ.js.map +1 -0
- package/dist/{header-BOefOKd1.js → header-CGXuhcRm.js} +160 -153
- package/dist/header-CGXuhcRm.js.map +1 -0
- package/dist/{hooks-9k_TtmKh.js → hooks-Dkz0K2WT.js} +2 -2
- package/dist/{hooks-9k_TtmKh.js.map → hooks-Dkz0K2WT.js.map} +1 -1
- package/dist/{icon-badge-CAuKupo9.js → icon-badge-DYKIwvOV.js} +4 -4
- package/dist/{icon-badge-CAuKupo9.js.map → icon-badge-DYKIwvOV.js.map} +1 -1
- package/dist/index.js +3 -3
- package/dist/input-CZw8iU99.js +21 -0
- package/dist/input-CZw8iU99.js.map +1 -0
- package/dist/input-DQdEd0YD.js +263 -0
- package/dist/input-DQdEd0YD.js.map +1 -0
- package/dist/{interaction-recipes-CHr0dJUs.js → interaction-recipes-XR9ZpVYL.js} +2 -1
- package/dist/interaction-recipes-XR9ZpVYL.js.map +1 -0
- package/dist/item-K5_ghvze.js +275 -0
- package/dist/item-K5_ghvze.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 +71 -0
- package/dist/lib/editable-text-recipe.d.ts +4 -4
- package/dist/lib/field-affordance-recipes.d.ts +2 -2
- package/dist/lib/interaction-recipes.d.ts +5 -0
- package/dist/lib/theme-mode-css.d.ts +7 -0
- package/dist/lib/tone-recipes.d.ts +8 -0
- package/dist/lib/ui-provider/types.d.ts +2 -2
- package/dist/lib/utils.js +1 -1
- package/dist/{media-gallery-DcTtAaeC.js → media-gallery-3zIVLMWH.js} +8 -8
- package/dist/media-gallery-3zIVLMWH.js.map +1 -0
- package/dist/{mentions-D-uyCh01.js → mentions-utuUvH1K.js} +144 -142
- package/dist/mentions-utuUvH1K.js.map +1 -0
- package/dist/{message-CdHgIWKf.js → message-DZ_ruyUV.js} +6 -5
- package/dist/message-DZ_ruyUV.js.map +1 -0
- package/dist/{metadata-list-X5rYAKSB.js → metadata-list-8N16ZMW_.js} +130 -119
- package/dist/metadata-list-8N16ZMW_.js.map +1 -0
- package/dist/{navigation-D3KwXmaq.js → navigation-Bnotn4AQ.js} +19 -19
- package/dist/navigation-Bnotn4AQ.js.map +1 -0
- package/dist/{navigation-HJf5zxlH.js → navigation-BzhHI3lo.js} +36 -35
- package/dist/navigation-BzhHI3lo.js.map +1 -0
- package/dist/{navigation-row-recipes-BVowojQw.js → navigation-row-recipes-BFLCk_Aq.js} +2 -2
- package/dist/{navigation-row-recipes-BVowojQw.js.map → navigation-row-recipes-BFLCk_Aq.js.map} +1 -1
- package/dist/{number-DMhe-Vsk.js → number-DbV1Dija.js} +36 -34
- package/dist/{number-DMhe-Vsk.js.map → number-DbV1Dija.js.map} +1 -1
- package/dist/{overflow-tab-bar-sQHXLlwQ.js → overflow-tab-bar-CWY7Nogn.js} +105 -103
- package/dist/overflow-tab-bar-CWY7Nogn.js.map +1 -0
- package/dist/{overlays-I0axtYA6.js → overlays-DNWmZrJ4.js} +14 -12
- package/dist/overlays-DNWmZrJ4.js.map +1 -0
- package/dist/{page-B5dTH9gE.js → page-Bgl1F560.js} +8 -8
- package/dist/{page-B5dTH9gE.js.map → page-Bgl1F560.js.map} +1 -1
- package/dist/{page-header-commands-DjzFEq3E.js → page-header-commands-DOb6WsfD.js} +5 -5
- package/dist/{page-header-commands-DjzFEq3E.js.map → page-header-commands-DOb6WsfD.js.map} +1 -1
- package/dist/pagination-BL25hu2s.js +158 -0
- package/dist/pagination-BL25hu2s.js.map +1 -0
- package/dist/{popover-Di55PyAI.js → popover-7_m66eYW.js} +8 -7
- package/dist/{popover-Di55PyAI.js.map → popover-7_m66eYW.js.map} +1 -1
- package/dist/popover-menu-B9WWygpa.js +100 -0
- package/dist/popover-menu-B9WWygpa.js.map +1 -0
- package/dist/{popover.recipes-Bdyhj2db.js → popover.recipes-D3j8R8Yp.js} +17 -10
- package/dist/popover.recipes-D3j8R8Yp.js.map +1 -0
- package/dist/{primitives-B-CkiEMU.js → primitives-BFK08r9M.js} +45 -44
- package/dist/primitives-BFK08r9M.js.map +1 -0
- package/dist/primitives.js +4 -4
- package/dist/{progress-rnS8-uAW.js → progress-B1VnCT0K.js} +5 -5
- package/dist/{progress-rnS8-uAW.js.map → progress-B1VnCT0K.js.map} +1 -1
- package/dist/{receipt-D0oswZ0p.js → receipt-BVSOH3Xo.js} +9 -6
- package/dist/{receipt-D0oswZ0p.js.map → receipt-BVSOH3Xo.js.map} +1 -1
- package/dist/{rich-text-DvGulsNJ.js → rich-text-GOUyKQ-s.js} +3 -3
- package/dist/{rich-text-DvGulsNJ.js.map → rich-text-GOUyKQ-s.js.map} +1 -1
- package/dist/{rich-text-editor-sMU_Scqm.js → rich-text-editor-cRLC-eBK.js} +418 -426
- package/dist/rich-text-editor-cRLC-eBK.js.map +1 -0
- package/dist/rich-text-editor-toolbar-DfXg0-VC.js +94 -0
- package/dist/rich-text-editor-toolbar-DfXg0-VC.js.map +1 -0
- package/dist/{scroll-area-Bt_vXY2b.js → scroll-area-DcI-M1UT.js} +2 -2
- package/dist/{scroll-area-Bt_vXY2b.js.map → scroll-area-DcI-M1UT.js.map} +1 -1
- package/dist/{separator-C8DlRGwF.js → separator-BDV-Y648.js} +3 -3
- package/dist/{separator-C8DlRGwF.js.map → separator-BDV-Y648.js.map} +1 -1
- package/dist/{separator-CYHnjsAb.js → separator-Bom7NsGO.js} +2 -2
- package/dist/{separator-CYHnjsAb.js.map → separator-Bom7NsGO.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{settings-CQW3b-Cu.js → settings-ybnjVwbd.js} +20 -19
- package/dist/settings-ybnjVwbd.js.map +1 -0
- package/dist/{sheet-4SEvVYzA.js → sheet-CGpB3omz.js} +8 -7
- package/dist/{sheet-4SEvVYzA.js.map → sheet-CGpB3omz.js.map} +1 -1
- package/dist/{sidebar-d7Dg80ln.js → sidebar-A0ElHINE.js} +14 -13
- package/dist/{sidebar-d7Dg80ln.js.map → sidebar-A0ElHINE.js.map} +1 -1
- package/dist/{sidebar-C7WWR29L.js → sidebar-CPx_7YBa.js} +183 -182
- package/dist/sidebar-CPx_7YBa.js.map +1 -0
- package/dist/{skeleton-Cz890JZF.js → skeleton-Byjnt7qr.js} +3 -3
- package/dist/{skeleton-Cz890JZF.js.map → skeleton-Byjnt7qr.js.map} +1 -1
- package/dist/smart-card-DiC5aac3.js +604 -0
- package/dist/smart-card-DiC5aac3.js.map +1 -0
- package/dist/{structure-DC2dygdA.js → structure-BmisBK-3.js} +2 -2
- package/dist/{structure-DC2dygdA.js.map → structure-BmisBK-3.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/table-BweFy_P9.js +1530 -0
- package/dist/table-BweFy_P9.js.map +1 -0
- package/dist/{table-CIKyLUsy.js → table-DsfzoUia.js} +75 -63
- package/dist/table-DsfzoUia.js.map +1 -0
- package/dist/{tabs-DwBJfjxX.js → tabs-CDocW5D1.js} +14 -13
- package/dist/tabs-CDocW5D1.js.map +1 -0
- package/dist/text-inputs-f9Ia-aCi.js +353 -0
- package/dist/text-inputs-f9Ia-aCi.js.map +1 -0
- package/dist/theme-mode-css-BB-_RYab.js +14 -0
- package/dist/theme-mode-css-BB-_RYab.js.map +1 -0
- package/dist/theme-scope-BJ6eE2xt.js +50 -0
- package/dist/theme-scope-BJ6eE2xt.js.map +1 -0
- package/dist/theme.css +285 -228
- package/dist/themes/green.css +16 -12
- package/dist/timelines-CwM_9IhD.js +457 -0
- package/dist/timelines-CwM_9IhD.js.map +1 -0
- package/dist/{tone-recipes-CPoExcTE.js → tone-recipes-BPsRAvhu.js} +5 -2
- package/dist/tone-recipes-BPsRAvhu.js.map +1 -0
- package/dist/{tooltip-CsfgrfS7.js → tooltip-yiRJUFjp.js} +4 -4
- package/dist/{tooltip-CsfgrfS7.js.map → tooltip-yiRJUFjp.js.map} +1 -1
- package/dist/{tree-BiKhg8AY.js → tree-WnKQzwbq.js} +9 -9
- package/dist/{tree-BiKhg8AY.js.map → tree-WnKQzwbq.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/{typography-DTRkE9zL.js → typography-UTnveOEy.js} +6 -6
- package/dist/typography-UTnveOEy.js.map +1 -0
- package/dist/typography.js +2 -2
- package/dist/{ui-provider-1D_NSYzO.js → ui-provider-C_U0Xma4.js} +3 -3
- package/dist/ui-provider-C_U0Xma4.js.map +1 -0
- package/dist/ui-provider.js +2 -2
- package/dist/{upload-BO8-CLN6.js → upload-CXyxmQBP.js} +13 -12
- package/dist/upload-CXyxmQBP.js.map +1 -0
- package/dist/{upload-queue-EOC8g1gf.js → upload-queue-Boscubn9.js} +11 -9
- package/dist/upload-queue-Boscubn9.js.map +1 -0
- package/dist/{usage-card-obRaBskq.js → usage-card-BhO5eqkX.js} +53 -37
- package/dist/usage-card-BhO5eqkX.js.map +1 -0
- package/dist/{utils-l5LpDw2z.js → utils-BRhFDwuU.js} +59 -44
- package/dist/utils-BRhFDwuU.js.map +1 -0
- package/dist/{value-inputs-TAYMX111.js → value-inputs-DXPDjvBU.js} +268 -252
- package/dist/value-inputs-DXPDjvBU.js.map +1 -0
- package/dist/{value-typography-b8wpz1eX.js → value-typography-BP8OG6h5.js} +2 -2
- package/dist/{value-typography-b8wpz1eX.js.map → value-typography-BP8OG6h5.js.map} +1 -1
- package/dist/{workspace-DH0v0KcB.js → workspace-Cdrg7k9f.js} +34 -33
- package/dist/workspace-Cdrg7k9f.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +2 -2
- package/docs/consumer-skill/references/agents-md.md +1 -1
- package/docs/consumer-skill/references/composition.md +8 -6
- package/docs/consumer-skill/references/integration.md +4 -3
- package/docs/consumer-skill/references/public-api.json +105 -2
- package/docs/consumer-skill/references/review.md +7 -0
- package/docs/consumer-skill/references/theming.md +71 -6
- package/docs/consumer-skill/references/tokens.json +1 -1
- package/docs/consumer-skill/references/workflows.md +25 -0
- package/docs/consumer-skill/scripts/composition-policy.mjs +3 -2
- package/docs/consumer-skill/scripts/surface-policy.mjs +11 -0
- package/package.json +8 -4
- package/dist/accordion-B6a3vVgA.js.map +0 -1
- package/dist/action-menu-TzCoSlwL.js +0 -280
- package/dist/action-menu-TzCoSlwL.js.map +0 -1
- package/dist/affordance-geometry.generated-B5iu-Mkr.js +0 -69
- package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +0 -1
- package/dist/ai-artifact-BMJdv-6q.js +0 -1115
- package/dist/ai-artifact-BMJdv-6q.js.map +0 -1
- package/dist/attachment-BtfhGm8i.js +0 -245
- package/dist/attachment-BtfhGm8i.js.map +0 -1
- package/dist/auth-CYxKfo69.js.map +0 -1
- package/dist/avatar-BBnEJIx8.js.map +0 -1
- package/dist/badge-MrKVNzW9.js.map +0 -1
- package/dist/batch-action-bar-BZGDG-Si.js.map +0 -1
- package/dist/breadcrumbs-D5t7I023.js.map +0 -1
- package/dist/buttons-SbIcm1HJ.js.map +0 -1
- package/dist/cards-CiiHpKYd.js +0 -66
- package/dist/cards-CiiHpKYd.js.map +0 -1
- package/dist/chart-QfrARkXl.js.map +0 -1
- package/dist/choice-inputs-t6w3ATNz.js.map +0 -1
- package/dist/code-block-Dgbu-CU3.js.map +0 -1
- package/dist/combobox-2Ic8N9bL.js +0 -278
- package/dist/combobox-2Ic8N9bL.js.map +0 -1
- package/dist/combobox-DLl0bfiq.js +0 -867
- package/dist/combobox-DLl0bfiq.js.map +0 -1
- package/dist/comments-BpDuCUUu.js.map +0 -1
- package/dist/data-display-DafIvCl5.js.map +0 -1
- package/dist/date-picker-CF-DtUpF.js.map +0 -1
- package/dist/date-pickers-BmzxJl5l.js +0 -174
- package/dist/date-pickers-BmzxJl5l.js.map +0 -1
- package/dist/display-DsQTVzMz.js.map +0 -1
- package/dist/dropdown-menu-E2qmdC7o.js +0 -193
- package/dist/dropdown-menu-E2qmdC7o.js.map +0 -1
- package/dist/editable-text-recipe-Bkm6wKHp.js +0 -10
- package/dist/editable-text-recipe-Bkm6wKHp.js.map +0 -1
- package/dist/feedback-qNuMBtRH.js +0 -233
- package/dist/feedback-qNuMBtRH.js.map +0 -1
- package/dist/field-affordance-recipes-qQeIf4lG.js.map +0 -1
- package/dist/filters-BkHH53uv.js.map +0 -1
- package/dist/form-field-DUt4UxSV.js.map +0 -1
- package/dist/form-sizing-By94KzXE.js.map +0 -1
- package/dist/forms-numeric-C0bvjRPZ.js.map +0 -1
- package/dist/header-BOefOKd1.js.map +0 -1
- package/dist/input-DWhBBBww.js +0 -262
- package/dist/input-DWhBBBww.js.map +0 -1
- package/dist/input-Ddi_LSYv.js +0 -20
- package/dist/input-Ddi_LSYv.js.map +0 -1
- package/dist/interaction-recipes-CHr0dJUs.js.map +0 -1
- package/dist/item-DEmDiTlD.js +0 -265
- package/dist/item-DEmDiTlD.js.map +0 -1
- package/dist/media-gallery-DcTtAaeC.js.map +0 -1
- package/dist/mentions-D-uyCh01.js.map +0 -1
- package/dist/message-CdHgIWKf.js.map +0 -1
- package/dist/metadata-list-X5rYAKSB.js.map +0 -1
- package/dist/navigation-D3KwXmaq.js.map +0 -1
- package/dist/navigation-HJf5zxlH.js.map +0 -1
- package/dist/overflow-tab-bar-sQHXLlwQ.js.map +0 -1
- package/dist/overlays-I0axtYA6.js.map +0 -1
- package/dist/pagination-3bPA_a6K.js +0 -149
- package/dist/pagination-3bPA_a6K.js.map +0 -1
- package/dist/popover-menu-B71Tn2Qz.js +0 -99
- package/dist/popover-menu-B71Tn2Qz.js.map +0 -1
- package/dist/popover.recipes-Bdyhj2db.js.map +0 -1
- package/dist/primitives-B-CkiEMU.js.map +0 -1
- package/dist/rich-text-editor-sMU_Scqm.js.map +0 -1
- package/dist/rich-text-editor.recipes-CadiF_Uu.js +0 -88
- package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +0 -1
- package/dist/settings-CQW3b-Cu.js.map +0 -1
- package/dist/sidebar-C7WWR29L.js.map +0 -1
- package/dist/smart-card-lFKxn5Hu.js +0 -595
- package/dist/smart-card-lFKxn5Hu.js.map +0 -1
- package/dist/spinner-fa3h1Aif.js +0 -80
- package/dist/spinner-fa3h1Aif.js.map +0 -1
- package/dist/table-CIKyLUsy.js.map +0 -1
- package/dist/table-CrcLN9Io.js +0 -1458
- package/dist/table-CrcLN9Io.js.map +0 -1
- package/dist/tabs-DwBJfjxX.js.map +0 -1
- package/dist/text-inputs-aaK9wcDT.js +0 -326
- package/dist/text-inputs-aaK9wcDT.js.map +0 -1
- package/dist/theme-scope-kStaAer0.js +0 -39
- package/dist/theme-scope-kStaAer0.js.map +0 -1
- package/dist/timelines-C_SBwHNP.js +0 -442
- package/dist/timelines-C_SBwHNP.js.map +0 -1
- package/dist/tone-recipes-CPoExcTE.js.map +0 -1
- package/dist/typography-DTRkE9zL.js.map +0 -1
- package/dist/ui-provider-1D_NSYzO.js.map +0 -1
- package/dist/upload-BO8-CLN6.js.map +0 -1
- package/dist/upload-queue-EOC8g1gf.js.map +0 -1
- package/dist/usage-card-obRaBskq.js.map +0 -1
- package/dist/utils-l5LpDw2z.js.map +0 -1
- package/dist/value-inputs-TAYMX111.js.map +0 -1
- package/dist/workspace-DH0v0KcB.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-CGXuhcRm.js","names":["React","_Fragment","React","_Fragment","Text","DisplayLabel","Stack","dotRecipes","popoverWidthRecipes","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuContent","DropdownMenuLinkItem","DropdownMenu","ActionMenu","formatInitials","AvatarFallback","Avatar","AvatarImage","Badge","Separator","PopoverTrigger","Popover","PopoverContent","Breadcrumbs","SidebarTrigger","useLayoutLinkRenderer","useCommandShortcut","React$1","Fragment$1","HeaderBreadcrumbs","resolvedRenderLink","items","out","homeBreadcrumb","breadcrumbs","showCrumbs","cn","className","showSidebarTrigger","triggerSlot","Header","forwardRef","props","contentClassName","slots","showBreadcrumbs","breadcrumbsClassName","leftClassName","centerClassName","rightClassName","defaultHeaderNotificationsStrings","defaultHeaderSearchStrings","defaultHeaderUserMenuStrings","detectMac","ua","HeaderSearch","stringsProp","strings","useStrings","detectedMac","setDetectedMac","useState","shortcutModifier","isMetaShortcut","enableShortcut","onOpen","shortcutTitle","shortcut","shortcutSlot","Button","Search","iconClassName","HeaderGlobalSearchTrigger","onOpenChange","HeaderToolButton","Icon","label","active","badge","HeaderToolPopover","open","triggerClassName","HeaderUserMenu","initials","user","actions","onProfile","User","onSettings","Settings","onLogout","LogOut","trigger","renderTrigger","showEmail","ChevronsUpDown","contentClasses","customContent","NOTIFICATION_TONE_CLASSNAMES","HeaderNotifications","badgeText","unreadCount","Bell","onMarkAllRead","notifications","NotificationRow","onNotificationClick","notification","onViewAll","viewAllHref","renderNotification","content","onClick","renderLink"],"sources":["../src/components/layout/header/partials/header-breadcrumbs.tsx","../src/components/layout/header/header.tsx","../src/components/layout/header/header.types.ts","../src/components/layout/header/partials/header-search.tsx","../src/components/layout/header/partials/header-global-search-trigger.tsx","../src/components/layout/header/partials/header-tool-button.tsx","../src/components/layout/header/partials/header-tool-popover.tsx","../src/components/layout/header/partials/header-user-menu.tsx","../src/components/layout/header/partials/header-notifications.tsx"],"sourcesContent":["/** HeaderBreadcrumbs — breadcrumbs trail with optional sidebar trigger. */\nimport * as React from 'react';\n\nimport { Separator } from '../../../base/display/separator';\nimport { Breadcrumbs } from '../../../base/navigation/breadcrumbs';\nimport { SidebarTrigger } from '../../../base/sidebar';\nimport { cn } from '../../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../../hooks';\nimport type { BreadcrumbItem } from '../../layout.types';\nimport type { HeaderBreadcrumbsProps } from '../header.types';\n\nexport function HeaderBreadcrumbs({\n\tbreadcrumbs = [],\n\thomeBreadcrumb = null,\n\tshowSidebarTrigger = true,\n\ttriggerSlot,\n\trenderLink,\n\tclassName,\n}: HeaderBreadcrumbsProps) {\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst items = React.useMemo<BreadcrumbItem[]>(() => {\n\t\tconst out: BreadcrumbItem[] = [];\n\t\tif (homeBreadcrumb) out.push(homeBreadcrumb);\n\t\tout.push(...breadcrumbs);\n\t\treturn out;\n\t}, [homeBreadcrumb, breadcrumbs]);\n\n\tconst showCrumbs = items.length > 0;\n\n\treturn (\n\t\t<div className={cn('relative flex min-h-action min-w-0 items-center gap-space-lg', className)}>\n\t\t\t{!!showSidebarTrigger && (\n\t\t\t\t<div className=\"relative flex min-h-action shrink-0 items-center justify-center\">\n\t\t\t\t\t{triggerSlot ?? <SidebarTrigger className=\"size-action-xs [&_svg]:size-icon\" />}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!!showCrumbs && (\n\t\t\t\t<>\n\t\t\t\t\t{!!showSidebarTrigger && <Separator orientation=\"vertical\" className=\"h-icon shrink-0\" />}\n\t\t\t\t\t<div className=\"flex min-w-0 flex-1 items-center overflow-hidden\">\n\t\t\t\t\t\t<Breadcrumbs\n\t\t\t\t\t\t\tbreadcrumbs={items}\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'min-w-0 overflow-hidden',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-list]]:flex-nowrap [&_[data-slot=breadcrumb-list]]:overflow-hidden [&_[data-slot=breadcrumb-list]]:break-normal',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-item]]:min-w-0 [&_[data-slot=breadcrumb-item]]:shrink',\n\t\t\t\t\t\t\t\t'[&_[data-slot=breadcrumb-link]]:truncate [&_[data-slot=breadcrumb-page]]:truncate',\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/** Header — sticky top bar with breadcrumbs and slot-driven content regions. */\nimport { forwardRef } from 'react';\n\nimport { Stack } from '../../base/structure';\nimport { cn } from '../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../hooks';\nimport { HeaderBreadcrumbs } from './partials/header-breadcrumbs';\nimport type { HeaderProps } from './header.types';\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(function Header({\n\tshowBreadcrumbs = true,\n\tbreadcrumbs = [],\n\thomeBreadcrumb = null,\n\tshowSidebarTrigger = true,\n\tslots,\n\trenderLink,\n\tclassName,\n\tcontentClassName,\n\tleftClassName,\n\tcenterClassName,\n\trightClassName,\n\tbreadcrumbsClassName,\n\t...props\n}, ref) {\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\n\treturn (\n\t\t<header\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'header--component @container/app-header sticky top-0 z-40 flex min-w-0 min-h-shell-header items-center border-b border-border bg-background px-surface py-space-sm transition-[width,height] ease-linear',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" gap=\"xl\" align=\"center\" wrap className={cn('min-w-0 min-h-action flex-1', contentClassName)}>\n\t\t\t\t{!!slots?.brand && (\n\t\t\t\t\t<div className=\"hidden min-w-0 shrink-0 items-center @2xl/app-header:flex\">\n\t\t\t\t\t\t{slots.brand}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!showBreadcrumbs && (\n\t\t\t\t\t<div className=\"min-w-0 flex-1 basis-32\">\n\t\t\t\t\t\t{slots?.breadcrumbs ?? (\n\t\t\t\t\t\t<HeaderBreadcrumbs\n\t\t\t\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\t\t\t\thomeBreadcrumb={homeBreadcrumb}\n\t\t\t\t\t\t\tshowSidebarTrigger={showSidebarTrigger}\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\tclassName={breadcrumbsClassName}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.left && (\n\t\t\t\t\t<div className={cn('flex min-w-0 items-center', leftClassName)}>\n\t\t\t\t\t\t{slots.left}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.center && (\n\t\t\t\t\t/* Search narrows within its region before navigation or account controls lose space. */\n\t\t\t\t\t<div className={cn('hidden min-w-0 flex-1 basis-64 items-center justify-center @3xl/app-header:flex [&>*]:min-w-0 [&>*]:max-w-full', centerClassName)}>\n\t\t\t\t\t\t{slots.center}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{!!slots?.right && (\n\t\t\t\t\t<div className={cn('ms-auto flex min-w-0 max-w-full flex-wrap items-center justify-end gap-space-md [&>*]:max-w-full', rightClassName)}>\n\t\t\t\t\t\t{slots.right}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</header>\n\t);\n});\n\nHeader.displayName = 'Header';\n","/**\n * Header layout and partial types.\n *\n * This layer is intentionally framework-neutral: links and route state enter\n * through `renderLink`, and app-specific content enters through slots.\n */\nimport type { ComponentType, HTMLAttributes, ReactNode } from 'react';\n\nimport type { StringsProp } from '../../../lib/strings';\nimport type { SemanticTone } from '../../../lib/component-vocabulary';\n\nimport type {\n\tBreadcrumbItem,\n\tLayoutNavigationAdapter,\n\tLayoutUser,\n} from '../layout.types';\n\nexport interface HeaderBreadcrumbsProps extends LayoutNavigationAdapter {\n\t/** Trail entries, root first. */\n\tbreadcrumbs?: BreadcrumbItem[];\n\t/** Root entry prepended to the trail. */\n\thomeBreadcrumb?: BreadcrumbItem | null;\n\t/** Renders the sidebar collapse control. */\n\tshowSidebarTrigger?: boolean;\n\ttriggerSlot?: ReactNode;\n\tclassName?: string;\n}\n\nexport type NotificationTone = Extract<\n\tSemanticTone,\n\t'info' | 'success' | 'warning' | 'destructive'\n>;\n\nexport interface HeaderNotification {\n\tid: string | number;\n\t/** Surface title. */\n\ttitle: ReactNode;\n\t/** Supporting copy under the title. */\n\tdescription?: ReactNode;\n\ttime?: ReactNode;\n\tread?: boolean;\n\ttone?: NotificationTone;\n\t/** Destination for the entry, when it navigates. */\n\thref?: string;\n}\n\nexport interface HeaderNotificationsStrings {\n\ttriggerLabel: string;\n\theading: string;\n\tmarkAllRead: string;\n\tempty: string;\n\tviewAll: string;\n}\n\nexport const defaultHeaderNotificationsStrings: HeaderNotificationsStrings = {\n\ttriggerLabel: 'Notifications',\n\theading: 'Notifications',\n\tmarkAllRead: 'Mark all as read',\n\tempty: 'No new notifications',\n\tviewAll: 'View all notifications',\n};\n\nexport interface HeaderNotificationsProps extends LayoutNavigationAdapter {\n\t/** Notifications to list, newest first. */\n\tnotifications?: HeaderNotification[];\n\t/** Unread total shown on the trigger. */\n\tunreadCount?: number;\n\tonNotificationClick?: (notification: HeaderNotification) => void;\n\tonMarkAllRead?: () => void;\n\tonViewAll?: () => void;\n\t/** Destination for the view-all link. */\n\tviewAllHref?: string;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderNotificationsStrings>;\n\tclassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Replaces the default notification row. */\n\trenderNotification?: (notification: HeaderNotification) => ReactNode;\n}\n\nexport interface HeaderSearchStrings {\n\tplaceholder: string;\n\tshortcutMac: string;\n\tshortcutPc: string;\n}\n\nexport const defaultHeaderSearchStrings: HeaderSearchStrings = {\n\tplaceholder: 'Search...',\n\tshortcutMac: '⌘K',\n\tshortcutPc: 'Ctrl+K',\n};\n\nexport interface HeaderSearchProps {\n\tonOpen?: () => void;\n\t/** Modifier shown in the shortcut hint. Auto-detected when omitted. */\n\tshortcutModifier?: 'meta' | 'control';\n\t/** Binds the keyboard shortcut that opens search. */\n\tenableShortcut?: boolean;\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderSearchStrings>;\n\tclassName?: string;\n\t/** Merged onto the icon. */\n\ticonClassName?: string;\n\t/** Replaces the shortcut hint shown in the trigger. */\n\tshortcutSlot?: ReactNode;\n}\n\nexport interface HeaderGlobalSearchTriggerProps extends HeaderSearchProps {\n\t/** Whether the surface is showing. Controlled. */\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\nexport interface HeaderToolButtonProps {\n\t/** Display label. */\n\tlabel: string;\n\t/** Leading glyph. */\n\ticon: ComponentType<{ className?: string }>;\n\t/** Marks the control as currently engaged. */\n\tactive?: boolean;\n\t/** Disables the control. */\n\tdisabled?: boolean;\n\t/** Chip rendered beside the label. */\n\tbadge?: ReactNode;\n\tonClick?: () => void;\n\tclassName?: string;\n\t/** Merged onto the icon. */\n\ticonClassName?: string;\n}\n\nexport interface HeaderToolPopoverProps {\n\t/** Display label. */\n\tlabel: string;\n\t/** Leading glyph. */\n\ticon: ComponentType<{ className?: string }>;\n\t/** Whether the surface is showing. Controlled. */\n\topen?: boolean;\n\t/** Whether the surface starts open, for uncontrolled use. */\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\t/** Marks the control as currently engaged. */\n\tactive?: boolean;\n\t/** Disables the control. */\n\tdisabled?: boolean;\n\t/** Chip rendered beside the label. */\n\tbadge?: ReactNode;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\tsideOffset?: number;\n\tclassName?: string;\n\t/** Merged onto the trigger. */\n\ttriggerClassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\tchildren?: ReactNode;\n}\n\nexport interface HeaderUserMenuProps {\n\t/** The signed-in user shown in the menu. */\n\tuser: LayoutUser;\n\t/** Shows the signed-in email under the name. */\n\tshowEmail?: boolean;\n\t/** Extra content appended inside the menu. */\n\tcustomContent?: ReactNode;\n\tonProfile?: () => void;\n\tonSettings?: () => void;\n\tonLogout?: () => void;\n\t/** Alignment of the shell's content. */\n\talign?: 'start' | 'center' | 'end';\n\t/** Which side of the trigger the surface opens on. */\n\tside?: 'top' | 'right' | 'bottom' | 'left';\n\t/** Overrides this surface's own copy. */\n\tstrings?: StringsProp<HeaderUserMenuStrings>;\n\t/** Merged onto the trigger. */\n\ttriggerClassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Replaces the default trigger element. */\n\trenderTrigger?: (user: LayoutUser) => ReactNode;\n}\n\nexport interface HeaderUserMenuStrings {\n\tprofile: string;\n\tsettings: string;\n\tlogout: string;\n}\n\nexport const defaultHeaderUserMenuStrings: HeaderUserMenuStrings = {\n\tprofile: 'Profile',\n\tsettings: 'Settings',\n\tlogout: 'Log out',\n};\n\nexport interface HeaderSlots {\n\t/** Leading brand/logo region before breadcrumbs. */\n\tbrand?: ReactNode;\n\t/** Replaces the breadcrumb/sidebar-trigger region. */\n\tbreadcrumbs?: ReactNode;\n\t/** Leading content after breadcrumbs. */\n\tleft?: ReactNode;\n\t/** Center content, usually search or a scope switcher. */\n\tcenter?: ReactNode;\n\t/** Trailing content, usually notifications/user menu/actions. */\n\tright?: ReactNode;\n}\n\nexport interface HeaderProps extends LayoutNavigationAdapter, HTMLAttributes<HTMLElement> {\n\t/** Renders the breadcrumb trail. */\n\tshowBreadcrumbs?: boolean;\n\t/** Trail entries, root first. */\n\tbreadcrumbs?: BreadcrumbItem[];\n\t/** Root entry prepended to the trail. */\n\thomeBreadcrumb?: BreadcrumbItem | null;\n\t/** Renders the sidebar collapse control. */\n\tshowSidebarTrigger?: boolean;\n\t/** Replaces individual regions of the shell. */\n\tslots?: HeaderSlots;\n\tclassName?: string;\n\t/** Merged onto the content region. */\n\tcontentClassName?: string;\n\t/** Merged onto the leading region. */\n\tleftClassName?: string;\n\t/** Merged onto the centre region. */\n\tcenterClassName?: string;\n\trightClassName?: string;\n\tbreadcrumbsClassName?: string;\n}\n","/** HeaderSearch — framework-neutral search trigger with optional Cmd/Ctrl+K. */\nimport { useEffect, useState } from 'react';\nimport { Search } from 'lucide-react';\n\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\nimport { kbdRecipe } from '../../../../lib/surface-recipes';\n\nimport { useCommandShortcut } from '../../hooks';\nimport {\n\tdefaultHeaderSearchStrings,\n\ttype HeaderSearchProps,\n} from '../header.types';\n\nfunction detectMac(): boolean {\n\tif (typeof navigator === 'undefined') return false;\n\tconst ua = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData;\n\tif (ua?.platform) return ua.platform === 'macOS';\n\treturn /Mac|iPhone|iPad/.test(navigator.platform);\n}\n\nexport function HeaderSearch({\n\tonOpen,\n\tshortcutModifier,\n\tenableShortcut = true,\n\tstrings: stringsProp,\n\tclassName,\n\ticonClassName,\n\tshortcutSlot,\n}: HeaderSearchProps) {\n\tconst strings = useStrings(defaultHeaderSearchStrings, stringsProp);\n\tconst [detectedMac, setDetectedMac] = useState(false);\n\tuseEffect(() => {\n\t\tif (shortcutModifier === undefined) setDetectedMac(detectMac());\n\t}, [shortcutModifier]);\n\tconst resolvedModifier = shortcutModifier ?? (detectedMac ? 'meta' : 'control');\n\tconst isMetaShortcut = resolvedModifier === 'meta';\n\tuseCommandShortcut({ key: 'k', enabled: enableShortcut, onTrigger: onOpen });\n\n\tconst shortcutTitle = isMetaShortcut ? strings.shortcutMac : strings.shortcutPc;\n\tconst shortcut = shortcutSlot ?? (\n\t\t// The shared key cap; it appears once the trigger is wide enough to show it.\n\t\t<kbd className={cn('header-search--shortcut', kbdRecipe, 'hidden lg:inline-flex')}>\n\t\t\t{isMetaShortcut ? strings.shortcutMac : strings.shortcutPc}\n\t\t</kbd>\n\t);\n\n\treturn (\n\t\t<Button\n\t\t\tdata-component=\"header-search\"\n\t\t\tdata-slot=\"header-search-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-label={strings.placeholder}\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"outline\"\n\t\t\tsize=\"sm\"\n\t\t\tonClick={onOpen}\n\t\t\tclassName={cn(\n\t\t\t\t'header-search--component header-search--trigger h-action-sm w-full min-w-0 justify-start gap-space-md rounded-inner px-control-sm text-foreground shadow-none transition-[background-color,border-color,color,box-shadow]',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\ttitle={shortcutTitle}\n\t\t>\n\t\t\t<Search data-slot=\"header-search-icon\" className={cn('header-search--icon size-icon shrink-0 text-muted-foreground', iconClassName)} aria-hidden=\"true\" />\n\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" data-slot=\"header-search-placeholder\" className=\"header-search--placeholder min-w-0 flex-1 truncate text-left\">\n\t\t\t\t{strings.placeholder}\n\t\t\t</Text>\n\t\t\t{shortcut}\n\t\t</Button>\n\t);\n}\n","/** HeaderGlobalSearchTrigger — header search trigger with controlled open callback. */\nimport { HeaderSearch } from './header-search';\nimport type { HeaderGlobalSearchTriggerProps } from '../header.types';\n\nexport function HeaderGlobalSearchTrigger({\n\tonOpen,\n\tonOpenChange,\n\t...props\n}: HeaderGlobalSearchTriggerProps) {\n\treturn (\n\t\t<HeaderSearch\n\t\t\t{...props}\n\t\t\tonOpen={() => {\n\t\t\t\tonOpen?.();\n\t\t\t\tonOpenChange?.(true);\n\t\t\t}}\n\t\t/>\n\t);\n}\n","/** HeaderToolButton — icon control for dense app headers. */\nimport * as React from 'react';\n\nimport { Button } from '../../../base/buttons';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { HeaderToolButtonProps } from '../header.types';\n\nexport const HeaderToolButton = React.forwardRef<\n\tHTMLButtonElement,\n\tHeaderToolButtonProps\n>((\n\t{\n\t\tlabel,\n\t\ticon: Icon,\n\t\tactive = false,\n\t\tdisabled = false,\n\t\tbadge,\n\t\tonClick,\n\t\tclassName,\n\t\ticonClassName,\n\t},\n\tref,\n) => (\n\t<Button\n\t\tref={ref}\n\t\tdata-component=\"header-tool-button\"\n\t\tdata-slot=\"header-tool-button\"\n\t\ttype=\"button\"\n\t\ttone=\"secondary\"\n\t\tbuttonStyle=\"ghost\"\n\t\tsize=\"sm\" iconOnly\n\t\taria-label={label}\n\t\taria-pressed={active || undefined}\n\t\ttitle={label}\n\t\tdisabled={disabled}\n\t\tonClick={onClick}\n\t\tclassName={cn(\n\t\t\t'header-tool-button--component header-tool-button--trigger relative size-action-sm rounded-inner text-foreground transition-[background-color,color,box-shadow] hover:bg-accent hover:text-accent-foreground',\n\t\t\tactive && 'bg-accent text-accent-foreground',\n\t\t\tclassName,\n\t\t)}\n\t>\n\t\t<Icon\n\t\t\tdata-slot=\"header-tool-icon\"\n\t\t\tclassName={cn('header-tool-button--icon size-icon', iconClassName)}\n\t\t\taria-hidden=\"true\"\n\t\t/>\n\t\t{!!badge && (\n\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" lineHeight=\"none\" data-slot=\"header-tool-badge\" className=\"header-tool-button--badge absolute right-space-xs top-space-xs flex min-h-space-lg min-w-space-lg items-center justify-center rounded-full bg-destructive px-space-2xs text-destructive-foreground\">\n\t\t\t\t{badge}\n\t\t\t</Text>\n\t\t)}\n\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{label}</Text>\n\t</Button>\n));\n\nHeaderToolButton.displayName = 'HeaderToolButton';\n","/** HeaderToolPopover — controlled header icon trigger plus popover content. */\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from '../../../base/popover';\nimport { cn } from '../../../../lib/utils';\n\nimport type { HeaderToolPopoverProps } from '../header.types';\nimport { HeaderToolButton } from './header-tool-button';\nimport { popoverWidthRecipes } from '../../../base/popover/popover.recipes';\n\nexport function HeaderToolPopover({\n\tlabel,\n\ticon,\n\topen,\n\tdefaultOpen,\n\tonOpenChange,\n\tactive,\n\tdisabled,\n\tbadge,\n\talign = 'end',\n\tside = 'bottom',\n\tsideOffset = 8,\n\tclassName,\n\ttriggerClassName,\n\tcontentClassName,\n\tchildren,\n}: HeaderToolPopoverProps) {\n\treturn (\n\t\t<Popover\n\t\t\topen={open}\n\t\t\tdefaultOpen={defaultOpen}\n\t\t\tonOpenChange={onOpenChange}\n\t\t>\n\t\t\t<PopoverTrigger asChild>\n\t\t\t\t<HeaderToolButton\n\t\t\t\t\tlabel={label}\n\t\t\t\t\ticon={icon}\n\t\t\t\t\tactive={active ?? open}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tbadge={badge}\n\t\t\t\t\tclassName={triggerClassName}\n\t\t\t\t/>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tdata-component=\"header-tool-popover\"\n\t\t\t\tdata-slot=\"header-tool-popover-content\"\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'header-tool-popover--component',\n\t\t\t\t\tpopoverWidthRecipes.lg,\n\t\t\t\t\tclassName,\n\t\t\t\t\tcontentClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","/** HeaderUserMenu — avatar/name trigger with consumer-wired menu callbacks. */\nimport type { ReactElement } from 'react';\n\nimport { ChevronsUpDown, LogOut, Settings, User } from 'lucide-react';\n\nimport { ActionMenu, type ActionMenuAction } from '../../../base/action-menu';\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Button } from '../../../base/buttons';\nimport { formatInitials } from '../../../primitives/initials-format';\nimport { Text } from '../../../typography';\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuTrigger,\n} from '../../../base/navigation/dropdown-menu';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport {\n\tdefaultHeaderUserMenuStrings,\n\ttype HeaderUserMenuProps,\n} from '../header.types';\n\nexport function HeaderUserMenu({\n\tuser,\n\tshowEmail = true,\n\tcustomContent,\n\tonProfile,\n\tonSettings,\n\tonLogout,\n\talign = 'end',\n\tside = 'bottom',\n\tstrings: stringsProp,\n\ttriggerClassName,\n\tcontentClassName,\n\trenderTrigger,\n}: HeaderUserMenuProps) {\n\tconst strings = useStrings(defaultHeaderUserMenuStrings, stringsProp);\n\tconst initials = formatInitials(user.name, { strategy: 'first-words' });\n\n\t// Profile and settings sit together; sign-out is held apart by a rule with\n\t// no caption, which is what `group: true` is for.\n\tconst actions: ActionMenuAction[] = [\n\t\t...(onProfile ? [{ id: 'profile', label: strings.profile, icon: User, onClick: onProfile }] : []),\n\t\t...(onSettings ? [{ id: 'settings', label: strings.settings, icon: Settings, onClick: onSettings }] : []),\n\t\t...(onLogout\n\t\t\t? [{\n\t\t\t\tid: 'logout',\n\t\t\t\tlabel: strings.logout,\n\t\t\t\ticon: LogOut,\n\t\t\t\tonClick: onLogout,\n\t\t\t\t...(onProfile || onSettings ? { group: true as const } : null),\n\t\t\t}]\n\t\t\t: []),\n\t];\n\n\tconst trigger = renderTrigger?.(user) ?? (\n\t\t<Button\n\t\t\tdata-component=\"header-user-menu\"\n\t\t\tdata-slot=\"header-user-menu-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-label={user.name}\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"lg\"\n\t\t\tclassName={cn(\n\t\t\t\t'header-user-menu--component header-user-menu--trigger group min-w-0 max-w-56 justify-start gap-space-md text-foreground shadow-none hover:bg-accent hover:text-accent-foreground data-[state=open]:bg-accent max-sm:size-action-lg max-sm:justify-center max-sm:p-0 max-sm:[&_.header-user-menu--identity]:hidden max-sm:[&_.header-user-menu--chevron]:hidden',\n\t\t\t\ttriggerClassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Avatar data-slot=\"header-user-avatar\" className=\"header-user-menu--avatar size-avatar-sm overflow-hidden rounded-full ring-1 ring-border\">\n\t\t\t\t{!!user.avatar && <AvatarImage src={user.avatar} alt={user.name} />}\n\t\t\t\t<AvatarFallback className=\"rounded-full bg-muted text-xs font-semibold text-muted-foreground\">\n\t\t\t\t\t{initials}\n\t\t\t\t</AvatarFallback>\n\t\t\t</Avatar>\n\t\t\t<div data-slot=\"header-user-identity\" className=\"header-user-menu--identity grid min-w-0 flex-1 gap-dense text-start leading-none\">\n\t\t\t\t<Text type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">{user.name}</Text>\n\t\t\t\t{!!showEmail && !!user.email && (\n\t\t\t\t\t<Text size=\"xs\" type=\"secondary\" lineHeight=\"tight\" className=\"truncate\">{user.email}</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<ChevronsUpDown className=\"header-user-menu--chevron size-icon-sm shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n\t\t</Button>\n\t);\n\n\tconst contentClasses = cn(\n\t\t'header-user-menu--content w-(--anchor-width) min-w-56 rounded-radius',\n\t\tcontentClassName,\n\t);\n\n\t// `customContent` replaces the menu body wholesale, which is a plain\n\t// dropdown rather than a list of commands — ActionMenu is deliberately not\n\t// that, so this path stays on the primitive it actually needs.\n\tif (customContent) {\n\t\treturn (\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger render={trigger as ReactElement} />\n\t\t\t\t<DropdownMenuContent\n\t\t\t\t\tdata-component=\"header-user-menu-content\"\n\t\t\t\t\tdata-slot=\"header-user-menu-content\"\n\t\t\t\t\tclassName={contentClasses}\n\t\t\t\t\talign={align}\n\t\t\t\t\tside={side}\n\t\t\t\t>\n\t\t\t\t\t{customContent}\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ActionMenu\n\t\t\tactions={actions}\n\t\t\talign={align}\n\t\t\tside={side}\n\t\t\tcontentClassName={contentClasses}\n\t\t\twidth=\"w-auto\"\n\t\t\tcloseOnSelect\n\t\t\trenderTrigger={trigger as ReactElement}\n\t\t/>\n\t);\n}\n","/** HeaderNotifications — bell dropdown for consumer-supplied notifications. */\nimport type { ReactElement } from 'react';\n\nimport { Bell } from 'lucide-react';\n\nimport { Badge } from '../../../base/badge';\nimport { Button } from '../../../base/buttons';\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Text } from '../../../typography';\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuLinkItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuTrigger,\n} from '../../../base/navigation/dropdown-menu';\nimport { useStrings } from '../../../../lib/strings';\nimport { cn } from '../../../../lib/utils';\n\nimport { useLayoutLinkRenderer } from '../../hooks';\nimport {\n\tdefaultHeaderNotificationsStrings,\n\ttype HeaderNotification,\n\ttype HeaderNotificationsProps,\n\ttype NotificationTone,\n} from '../header.types';\nimport { popoverWidthRecipes } from '../../../base/popover/popover.recipes';\nimport { dotRecipes } from '../../../../lib/tone-recipes';\n\nconst NOTIFICATION_TONE_CLASSNAMES: Record<NotificationTone, string> = {\n\tinfo: 'bg-info',\n\tsuccess: 'bg-success',\n\twarning: 'bg-warning',\n\tdestructive: 'bg-destructive',\n};\n\nexport function HeaderNotifications({\n\tnotifications = [],\n\tunreadCount = 0,\n\tonNotificationClick,\n\tonMarkAllRead,\n\tonViewAll,\n\tviewAllHref,\n\trenderLink,\n\talign = 'end',\n\tside = 'bottom',\n\tstrings: stringsProp,\n\tclassName,\n\tcontentClassName,\n\trenderNotification,\n}: HeaderNotificationsProps) {\n\tconst strings = useStrings(defaultHeaderNotificationsStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst badgeText = unreadCount > 99 ? '99+' : String(unreadCount);\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-component=\"header-notifications\"\n\t\t\t\t\t\tdata-slot=\"header-notifications-trigger\"\n\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\taria-label={strings.triggerLabel}\n\t\t\t\t\t\tclassName={cn('header-notifications--component header-notifications--trigger relative', className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Bell className=\"size-icon\" aria-hidden=\"true\" />\n\t\t\t\t\t\t{unreadCount > 0 && (\n\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\ttone=\"destructive\"\n\t\t\t\t\t\t\t\tclassName=\"absolute -right-1 -top-1 flex h-4.5 min-w-4.5 items-center justify-center px-space-xs py-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{badgeText}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenuContent\n\t\t\t\tdata-component=\"header-notifications-content\"\n\t\t\t\tdata-slot=\"header-notifications-content\"\n\t\t\t\tclassName={cn('header-notifications--content', popoverWidthRecipes.lg, contentClassName)}\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t>\n\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t<DropdownMenuLabel aria-hidden={false} className=\"header-notifications--label flex items-center justify-between gap-space-lg text-inherit\">\n\t\t\t\t\t\t<DisplayLabel className=\"text-inherit\">{strings.heading}</DisplayLabel>\n\t\t\t\t\t\t{unreadCount > 0 && !!onMarkAllRead && (\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\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonClick={onMarkAllRead}\n\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{strings.markAllRead}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</DropdownMenuLabel>\n\t\t\t\t\t<DropdownMenuSeparator />\n\n\t\t\t\t\t{notifications.length === 0 ? (\n\t\t\t\t\t\t<div className=\"header-notifications--empty p-surface text-center\">\n\t\t\t\t\t\t\t<Text type=\"secondary\">{strings.empty}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Stack gap=\"xs\" className=\"header-notifications--list\">\n\t\t\t\t\t\t\t{notifications.map((notification) => (\n\t\t\t\t\t\t\t\t<NotificationRow\n\t\t\t\t\t\t\t\t\tkey={notification.id}\n\t\t\t\t\t\t\t\t\tnotification={notification}\n\t\t\t\t\t\t\t\t\tonClick={onNotificationClick}\n\t\t\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t\t\t\trenderNotification={renderNotification}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t</DropdownMenuGroup>\n\n\t\t\t\t{!!(onViewAll || viewAllHref) && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<DropdownMenuSeparator />\n\t\t\t\t\t\t{viewAllHref ? (\n\t\t\t\t\t\t\t<DropdownMenuLinkItem\n\t\t\t\t\t\t\t\thref={viewAllHref}\n\t\t\t\t\t\t\t\trender={(props) =>\n\t\t\t\t\t\t\t\t\tresolvedRenderLink({\n\t\t\t\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\t\t\t\thref: viewAllHref,\n\t\t\t\t\t\t\t\t\t\tchildren: props.children,\n\t\t\t\t\t\t\t\t\t}) as ReactElement\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{strings.viewAll}\n\t\t\t\t\t\t\t</DropdownMenuLinkItem>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<DropdownMenuItem onClick={onViewAll}>{strings.viewAll}</DropdownMenuItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\nfunction NotificationRow({\n\tnotification,\n\tonClick,\n\trenderLink,\n\trenderNotification,\n}: {\n\tnotification: HeaderNotification;\n\tonClick?: (n: HeaderNotification) => void;\n\trenderLink: NonNullable<HeaderNotificationsProps['renderLink']>;\n\t/** Replaces the default notification row. */\n\trenderNotification?: HeaderNotificationsProps['renderNotification'];\n}) {\n\tif (renderNotification) return renderNotification(notification);\n\n\tconst content = (\n\t\t<Stack direction=\"horizontal\" align=\"start\" wrap={false} gap=\"sm\" className=\"header-notifications--item-content\">\n\t\t\t{!!notification.tone && (\n\t\t\t\t<span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tdata-tone={notification.tone}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'header-notifications--tone mt-space-sm',\n\t\t\t\t\t\t\t\t\tdotRecipes.marker,\n\t\t\t\t\t\tNOTIFICATION_TONE_CLASSNAMES[notification.tone],\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<Stack gap=\"dense\" className=\"min-w-0\">\n\t\t\t\t<Text type=\"inherit\" weight=\"medium\">{notification.title}</Text>\n\t\t\t\t{!!notification.description && <Text size=\"xs\" type=\"secondary\">{notification.description}</Text>}\n\t\t\t\t{!!notification.time && <Text size=\"xs\" type=\"secondary\">{notification.time}</Text>}\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n\n\tconst className = cn(\n\t\t'header-notifications--item items-start',\n\t\t!notification.read && 'bg-muted text-muted-foreground',\n\t);\n\n\tif (notification.href) {\n\t\treturn (\n\t\t\t<DropdownMenuLinkItem\n\t\t\t\thref={notification.href}\n\t\t\t\tclassName={className}\n\t\t\t\tonClick={() => onClick?.(notification)}\n\t\t\t\trender={(props) =>\n\t\t\t\t\trenderLink({\n\t\t\t\t\t\t...props,\n\t\t\t\t\t\thref: notification.href,\n\t\t\t\t\t\tchildren: props.children,\n\t\t\t\t\t}) as ReactElement\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{content}\n\t\t\t</DropdownMenuLinkItem>\n\t\t);\n\t}\n\n\treturn (\n\t\t<DropdownMenuItem onClick={() => onClick?.(notification)} className={className}>\n\t\t\t{content}\n\t\t</DropdownMenuItem>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { p as e } from "./sidebar-
|
|
2
|
+
import { p as e } from "./sidebar-CPx_7YBa.js";
|
|
3
3
|
import { n as t } from "./layout.types-Cn7aUzJp.js";
|
|
4
4
|
import { useCallback as n, useEffect as r, useMemo as i } from "react";
|
|
5
5
|
import { jsx as a } from "react/jsx-runtime";
|
|
@@ -85,4 +85,4 @@ function g({ key: e, enabled: t = !0, onTrigger: n, preventDefault: i = !0 }) {
|
|
|
85
85
|
//#endregion
|
|
86
86
|
export { u as a, m as c, o as d, d as i, f as l, h as n, l as o, p as r, c as s, g as t, s as u };
|
|
87
87
|
|
|
88
|
-
//# sourceMappingURL=hooks-
|
|
88
|
+
//# sourceMappingURL=hooks-Dkz0K2WT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-
|
|
1
|
+
{"version":3,"file":"hooks-Dkz0K2WT.js","names":["IconComponent","SidebarMenuBadge","resolveLayoutLinkRenderer","useLayoutLinkRenderer","useMemo","renderLink","toPath","href","isPathMatch","currentPath","currentUrl","path","getNavLabel","item","getNavKey","label","fallbackIndex","NavBadge","value","resolveNavBadge","handle","liveBadges","itemBadge","DynamicIcon","props","icon","IconComponent","iconMap","size","renderSidebarLink","useActivePath","useCallback","useCommandShortcut","enabled","onTrigger","handler","event","key","preventDefault"],"sources":["../src/components/layout/hooks/use-layout-link.tsx","../src/components/layout/sidebar/sidebar.utils.tsx","../src/components/layout/hooks/use-active-path.ts","../src/components/layout/hooks/use-command-shortcut.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport {\n\tresolveLayoutLinkRenderer,\n\ttype LayoutLinkRenderer,\n\ttype LayoutNavigationAdapter,\n} from '../layout.types';\n\nexport function useLayoutLinkRenderer({\n\trenderLink,\n}: LayoutNavigationAdapter = {}): LayoutLinkRenderer {\n\treturn useMemo(\n\t\t() => resolveLayoutLinkRenderer({ renderLink }),\n\t\t[renderLink],\n\t);\n}\n"," \n/** Sidebar utilities — pure path helpers, labels, icon rendering, badge pill. */\nimport * as React from 'react';\n\nimport { SidebarMenuBadge } from '../../base/sidebar';\n\nimport type { LayoutIconSource, LayoutLinkRenderer } from '../layout.types';\nimport type { SidebarNavItem } from './sidebar.types';\nimport type { ComponentScale } from '../../../lib/component-vocabulary';\n\nexport function toPath(href: string): string {\n\tif (href.startsWith('#/')) {\n\t\treturn href.slice(1).split('?')[0]?.split('#')[0] || '/';\n\t}\n\n\ttry {\n\t\treturn new URL(href, 'http://local.invalid').pathname;\n\t} catch {\n\t\treturn href;\n\t}\n}\n\nexport function isPathMatch(currentUrl: string, path: string): boolean {\n\tconst currentPath = toPath(currentUrl);\n\treturn currentPath === path || currentPath.startsWith(path + '/') || currentPath.startsWith(path + '?');\n}\n\nexport function getNavLabel(item: Pick<SidebarNavItem, 'label'>): React.ReactNode {\n\treturn item.label;\n}\n\nexport function getNavKey(item: SidebarNavItem, fallbackIndex?: number): React.Key {\n\tconst label = getNavLabel(item);\n\treturn item.handle ?? item.href ?? (typeof label === 'string' || typeof label === 'number' ? label : `nav-${fallbackIndex ?? 0}`);\n}\n\nexport function NavBadge({\n\tvalue,\n\tsize = 'md',\n}: {\n\t/** Current value. Controlled. */\n\tvalue: string | number;\n\t/** Size preset. */\n\tsize?: ComponentScale;\n}) {\n\treturn (\n\t\t<SidebarMenuBadge inline size={size}>\n\t\t\t{value}\n\t\t</SidebarMenuBadge>\n\t);\n}\n\nexport function resolveNavBadge(\n\thandle: string | undefined,\n\titemBadge: string | number | undefined,\n\tliveBadges: Record<string, string | number> | undefined,\n): string | number | undefined {\n\tif (handle && liveBadges && liveBadges[handle] != null) {\n\t\treturn liveBadges[handle];\n\t}\n\treturn itemBadge;\n}\n\nexport interface DynamicIconProps extends React.SVGProps<SVGSVGElement> {\n\t/** Leading glyph. */\n\ticon: LayoutIconSource;\n\t/** Resolves an item's icon name to a component, keeping navigation data serialisable. */\n\ticonMap?: Record<string, React.ComponentType<{ className?: string }>>;\n\t/** Size preset. */\n\tsize?: number;\n\tclassName?: string;\n}\n\nexport function DynamicIcon({\n\ticon,\n\ticonMap = {},\n\tsize = 20,\n\tclassName = 'size-icon',\n\t...props\n}: DynamicIconProps) {\n\tif (!icon) return null;\n\n\tif (typeof icon === 'string') {\n\t\tconst IconComponent = iconMap[icon];\n\t\treturn IconComponent ? <IconComponent className={className} /> : null;\n\t}\n\n\tif (\n\t\ttypeof icon === 'function'\n\t\t|| (typeof icon === 'object' && icon !== null && '$$typeof' in icon)\n\t) {\n\t\tconst IconComponent = icon as React.ElementType<React.SVGProps<SVGSVGElement>>;\n\t\treturn <IconComponent className={className} width={size} height={size} {...props} />;\n\t}\n\n\treturn null;\n}\n\nexport function renderSidebarLink(\n\trenderLink: LayoutLinkRenderer,\n\titem: SidebarNavItem,\n\tchildren: React.ReactNode,\n\tclassName?: string,\n\tactive?: boolean,\n) {\n\treturn renderLink({\n\t\thref: item.href,\n\t\tchildren,\n\t\tclassName,\n\t\tactive,\n\t\tdisabled: item.disabled || !item.href,\n\t\texternal: item.external,\n\t});\n}\n","import { useCallback } from 'react';\n\nimport { isPathMatch, toPath } from '../sidebar/sidebar.utils';\n\nexport function useActivePath(currentUrl = '/') {\n\treturn useCallback(\n\t\t(href?: string) => !!href && isPathMatch(currentUrl, toPath(href)),\n\t\t[currentUrl],\n\t);\n}\n","import { useEffect } from 'react';\n\nexport interface UseCommandShortcutOptions {\n\tkey: string;\n\tenabled?: boolean;\n\tonTrigger?: () => void;\n\tpreventDefault?: boolean;\n}\n\nexport function useCommandShortcut({\n\tkey,\n\tenabled = true,\n\tonTrigger,\n\tpreventDefault = true,\n}: UseCommandShortcutOptions) {\n\tuseEffect(() => {\n\t\tif (!enabled || !onTrigger || typeof document === 'undefined') return;\n\n\t\tconst handler = (event: KeyboardEvent) => {\n\t\t\tif (!(event.metaKey || event.ctrlKey)) return;\n\t\t\tif (event.key.toLowerCase() !== key.toLowerCase()) return;\n\t\t\tif (preventDefault) event.preventDefault();\n\t\t\tonTrigger();\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handler);\n\t\treturn () => document.removeEventListener('keydown', handler);\n\t}, [enabled, key, onTrigger, preventDefault]);\n}\n"],"mappings":";;;;;;AAQA,SAAgBG,EAAsB,EACrC,kBAC4B,CAAC,GAAuB;CACpD,OAAOC,QACAF,EAA0B,EAAE,cAAW,CAAC,GAC9C,CAACG,CAAU,CACZ;AACD;;;ACLA,SAAgBC,EAAO,GAAsB;CAC5C,IAAIC,EAAK,WAAW,IAAI,GACvB,OAAOA,EAAK,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM;CAGtD,IAAI;EACH,OAAO,IAAI,IAAIA,GAAM,sBAAsB,CAAC,CAAC;CAC9C,QAAQ;EACP,OAAOA;CACR;AACD;AAEA,SAAgBC,EAAY,GAAoB,GAAuB;CACtE,IAAMC,IAAcH,EAAOI,CAAU;CACrC,OAAOD,MAAgBE,KAAQF,EAAY,WAAWE,IAAO,GAAG,KAAKF,EAAY,WAAWE,IAAO,GAAG;AACvG;AAEA,SAAgBC,EAAY,GAAsD;CACjF,OAAOC,EAAK;AACb;AAEA,SAAgBC,EAAU,GAAsB,GAAmC;CAClF,IAAMC,IAAQH,EAAYC,CAAI;CAC9B,OAAOA,EAAK,UAAUA,EAAK,SAAS,OAAOE,KAAU,YAAY,OAAOA,KAAU,WAAWA,IAAQ,OAAOC,KAAiB;AAC9H;AAEA,SAAgBC,EAAS,EACxB,UACA,UAAO,QAML;CACF,OACC,kBAAChB,GAAD;EAAkB,QAAA;EAAa;EAC7B,UAAAiB;CACgB,CAAA;AAEpB;AAEA,SAAgBC,EACf,GACA,GACA,GAC8B;CAI9B,OAHIC,KAAUC,KAAcA,EAAWD,MAAW,OAC1CC,EAAWD,KAEZE;AACR;AAYA,SAAgBC,EAAY,EAC3B,SACA,aAAU,CAAC,GACX,UAAO,IACP,eAAY,aACZ,GAAGC,KACiB;CACpB,IAAI,CAACC,GAAM,OAAO;CAElB,IAAI,OAAOA,KAAS,UAAU;EAC7B,IAAMC,IAAgBC,EAAQF;EAC9B,OAAOC,IAAgB,kBAACA,GAAD,EAA0B,aAAY,CAAA,IAAI;CAClE;CAUA,OAPC,OAAOD,KAAS,cACZ,OAAOA,KAAS,YAAYA,KAAiB,cAAcA,IAGxD,kBAACzB,GAAD;EAA0B;EAAW,OAAO4B;EAAM,QAAQA;EAAM,GAAIJ;CAAQ,CAAA,IAG7E;AACR;AAEA,SAAgBK,EACf,GACA,GACA,GACA,GACA,GACC;CACD,OAAOxB,EAAW;EACjB,MAAMQ,EAAK;EACX;EACA;EACA;EACA,UAAUA,EAAK,YAAY,CAACA,EAAK;EACjC,UAAUA,EAAK;CAChB,CAAC;AACF;;;AC7GA,SAAgBiB,EAAc,IAAa,KAAK;CAC/C,OAAOC,GACL,MAAkB,CAAC,CAACxB,KAAQC,EAAYE,GAAYJ,EAAOC,CAAI,CAAC,GACjE,CAACG,CAAU,CACZ;AACD;;;ACAA,SAAgBsB,EAAmB,EAClC,QACA,aAAU,IACV,cACA,oBAAiB,MACY;CAC7B,QAAgB;EACf,IAAI,CAACC,KAAW,CAACC,KAAa,OAAO,WAAa,KAAa;EAE/D,IAAMC,KAAW,MAAyB;GACzC,CAAMC,EAAM,WAAWA,EAAM,YACzBA,EAAM,IAAI,YAAY,MAAMC,EAAI,YAAY,MAC5CC,KAAgBF,EAAM,eAAe,GACzCF,EAAU;EACX;EAGA,OADA,SAAS,iBAAiB,WAAWC,CAAO,SAC/B,SAAS,oBAAoB,WAAWA,CAAO;CAC7D,GAAG;EAACF;EAASI;EAAKH;EAAWI;CAAc,CAAC;AAC7C"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { s as e, v as t } from "./ui-provider-
|
|
3
|
-
import { t as n } from "./utils-
|
|
2
|
+
import { s as e, v as t } from "./ui-provider-C_U0Xma4.js";
|
|
3
|
+
import { t as n } from "./utils-BRhFDwuU.js";
|
|
4
4
|
import { n as r } from "./icon-size-B6PVwjbC.js";
|
|
5
|
-
import {
|
|
5
|
+
import { i } from "./tone-recipes-BPsRAvhu.js";
|
|
6
6
|
import { createElement as a } from "react";
|
|
7
7
|
import { jsx as o } from "react/jsx-runtime";
|
|
8
8
|
//#region src/components/base/display/icon-badge/icon-badge.tsx
|
|
@@ -52,4 +52,4 @@ u.displayName = "IconBadge";
|
|
|
52
52
|
//#endregion
|
|
53
53
|
export { u as t };
|
|
54
54
|
|
|
55
|
-
//# sourceMappingURL=icon-badge-
|
|
55
|
+
//# sourceMappingURL=icon-badge-DYKIwvOV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-badge-
|
|
1
|
+
{"version":3,"file":"icon-badge-DYKIwvOV.js","names":["useDensityConfig","resolveComponentScale","cn","ICON_DESCENDANT_SIZE_CLASSNAMES","SIZE_MAP","TONE_TINT","toneRecipes","TONE_SOLID","IconBadge","Icon","sizeProp","ariaHidden","ariaLabel","ariaLabelledBy","props","size","defaultScale","sizes","tones","solid","tone","hasAccessibleName","role","shape","bordered","className","createElement","children"],"sources":["../src/components/base/display/icon-badge/icon-badge.tsx"],"sourcesContent":["/**\n * IconBadge — circular or square icon container with a tinted background.\n * Workhorse for \"row leading icon\" and \"feature illustration\" patterns —\n * coupon checks, conversation initials, search-result tones, AI-bot avatars.\n *\n * Tones reuse the shadcn semantic tokens, with the foreground colour picked\n * to read against its tone's shared tint (`toneRecipes`, contrast-tested).\n * For a fully-saturated mark (primary fill, inverse foreground), use\n * `tone=\"primary\"` and pass `solid`.\n *\n * Warning takes `--warning-accent` rather than `--warning-foreground`: the\n * latter is the colour for text on a SOLID warning fill and stays near-black\n * in both themes, so on a 20% tint it vanished in dark (1.87 contrast). Amber\n * is intrinsically light, so — as with `--primary-accent` — the tone needs a\n * separate foreground token that darkens in light and brightens in dark.\n */\nimport type { ComponentProps, ElementType, ReactNode } from 'react';\nimport { createElement } from 'react';\n\nimport { useDensityConfig, type ComponentScale } from '../../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../../lib/ui-provider/scale';\nimport { cn } from '../../../../lib/utils';\nimport type { SemanticTone } from '../../../../lib/component-vocabulary';\nimport { toneRecipes } from '../../../../lib/tone-recipes';\nimport { ICON_DESCENDANT_SIZE_CLASSNAMES } from '../icon-size';\n\nexport type IconBadgeSize = ComponentScale;\nexport type IconBadgeShape = 'circle' | 'square';\nexport type IconBadgeTone = SemanticTone;\n\nexport interface IconBadgeProps extends Omit<ComponentProps<'span'>, 'children'> {\n\t/** Leading glyph. */\n\ticon?: ElementType;\n\tchildren?: ReactNode;\n\t/** Size preset. */\n\tsize?: IconBadgeSize;\n\tshape?: IconBadgeShape;\n\t/** Semantic tone driving the entry's colour. */\n\ttone?: IconBadgeTone;\n\t/** When true, fills the badge with the tone color and inverts the icon. */\n\tsolid?: boolean;\n\t/**\n\t * When true, renders a hairline `border-border/60` around the badge.\n\t * Useful for compact \"secret list\" / \"key list\" rows where the icon\n\t * needs a subtle outline against the surrounding card surface\n\t * (see `blocks/admin/api-key-list`).\n\t */\n\tbordered?: boolean;\n}\n\nconst SIZE_MAP: Record<IconBadgeSize, { box: string; icon: string }> = {\n\tsm: { box: 'size-avatar-sm', icon: 'size-icon-sm' },\n\tmd: { box: 'size-avatar', icon: 'size-icon' },\n\tlg: { box: 'size-avatar-lg', icon: 'size-icon-lg' },\n};\n\nconst TONE_TINT: Record<IconBadgeTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: `${toneRecipes.primary.tint} ${toneRecipes.primary.ink}`,\n\tsecondary: 'bg-foreground/8 text-muted-foreground',\n\tsuccess: `${toneRecipes.success.tint} ${toneRecipes.success.ink}`,\n\twarning: `${toneRecipes.warning.tint} ${toneRecipes.warning.ink}`,\n\tdestructive: `${toneRecipes.destructive.tint} ${toneRecipes.destructive.ink}`,\n\tinfo: `${toneRecipes.info.tint} ${toneRecipes.info.ink}`,\n};\n\nconst TONE_SOLID: Record<IconBadgeTone, string> = {\n\tneutral: 'bg-foreground text-background',\n\tprimary: 'bg-primary text-primary-foreground',\n\tsecondary: 'bg-secondary text-secondary-foreground',\n\tsuccess: 'bg-success text-success-foreground',\n\twarning: 'bg-warning text-warning-foreground',\n\tdestructive: 'bg-destructive text-destructive-foreground',\n\tinfo: 'bg-info text-info-foreground',\n};\n\nexport function IconBadge({\n\ticon: Icon,\n\tchildren,\n\tsize: sizeProp,\n\tshape = 'circle',\n\ttone = 'primary',\n\tsolid = false,\n\tbordered = false,\n\tclassName,\n\trole,\n\t'aria-hidden': ariaHidden,\n\t'aria-label': ariaLabel,\n\t'aria-labelledby': ariaLabelledBy,\n\t...props\n}: IconBadgeProps) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(sizeProp, defaultScale);\n\tconst sizes = SIZE_MAP[size];\n\tconst tones = solid ? TONE_SOLID[tone] : TONE_TINT[tone];\n\tconst hasAccessibleName = Boolean(ariaLabel || ariaLabelledBy);\n\n\treturn (\n\t\t<span\n\t\t\trole={role ?? (hasAccessibleName ? 'img' : undefined)}\n\t\t\taria-hidden={ariaHidden ?? (hasAccessibleName ? undefined : true)}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\tclassName={cn('icon-badge--component', \n\t\t\t\t'box-border inline-flex shrink-0 items-center justify-center',\n\t\t\t\tshape === 'circle' ? 'rounded-full' : 'rounded-radius',\n\t\t\t\tsizes.box,\n\t\t\t\t// A glyph passed as children takes the size's icon role, like `icon`,\n\t\t\t\t// unless it brings its own size class.\n\t\t\t\tICON_DESCENDANT_SIZE_CLASSNAMES[size],\n\t\t\t\ttones,\n\t\t\t\tbordered && 'border border-border/60',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{Icon ? createElement(Icon, { className: sizes.icon }) : children}\n\t\t</span>\n\t);\n}\n\nIconBadge.displayName = 'IconBadge';\n"],"mappings":";;;;;;;;AAkDA,IAAMI,IAAiE;CACtE,IAAI;EAAE,KAAK;EAAkB,MAAM;CAAe;CAClD,IAAI;EAAE,KAAK;EAAe,MAAM;CAAY;CAC5C,IAAI;EAAE,KAAK;EAAkB,MAAM;CAAe;AACnD,GAEMC,IAA2C;CAChD,SAAS;CACT,SAAS,GAAGC,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,WAAW;CACX,SAAS,GAAGA,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,SAAS,GAAGA,EAAY,QAAQ,KAAK,GAAGA,EAAY,QAAQ;CAC5D,aAAa,GAAGA,EAAY,YAAY,KAAK,GAAGA,EAAY,YAAY;CACxE,MAAM,GAAGA,EAAY,KAAK,KAAK,GAAGA,EAAY,KAAK;AACpD,GAEMC,IAA4C;CACjD,SAAS;CACT,SAAS;CACT,WAAW;CACX,SAAS;CACT,SAAS;CACT,aAAa;CACb,MAAM;AACP;AAEA,SAAgBC,EAAU,EACzB,MAAMC,GACN,aACA,MAAMC,GACN,WAAQ,UACR,UAAO,WACP,WAAQ,IACR,cAAW,IACX,cACA,SACA,eAAeC,GACf,cAAcC,GACd,mBAAmBC,GACnB,GAAGC,KACe;CAClB,IAAM,EAAE,oBAAiBd,EAAiB,GACpCe,IAAOd,EAAsBS,GAAUM,CAAY,GACnDC,IAAQb,EAASW,IACjBG,IAAQC,IAAQZ,EAAWa,KAAQf,EAAUe,IAC7CC,IAAoB,GAAQT,KAAaC;CAE/C,OACC,kBAAC,QAAD;EACC,MAAMS,MAASD,IAAoB,QAAQ,KAAA;EAC3C,eAAaV,MAAe,MAAoB,KAAA;EAChD,cAAYC;EACZ,mBAAiBC;EACjB,WAAWX,EAAG,yBACb,+DACAqB,MAAU,WAAW,iBAAiB,kBACtCN,EAAM,KAGNd,EAAgCY,IAChCG,GACAM,KAAY,2BACZC,CACD;EACA,GAAIX;EAEH,UAAAL,IAAOiB,EAAcjB,GAAM,EAAE,WAAWQ,EAAM,KAAK,CAAC,IAAIU;CACpD,CAAA;AAER;AAEA,EAAU,cAAc"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { _ as e, a as t, c as n, d as r, f as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h, v as g, y as _ } from "./ui-provider-
|
|
1
|
+
import { _ as e, a as t, c as n, d as r, f as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h, v as g, y as _ } from "./ui-provider-C_U0Xma4.js";
|
|
2
2
|
import { CARD_SURFACES as v, COMPONENT_SCALES as y, DISCLOSURE_SURFACES as b, SEMANTIC_TONES as x } from "./component-vocabulary.js";
|
|
3
|
-
import { t as S } from "./theme-scope-
|
|
3
|
+
import { t as S } from "./theme-scope-BJ6eE2xt.js";
|
|
4
4
|
import { ACTION_BUTTON_STYLES as C } from "./action-presentation.js";
|
|
5
5
|
import { interpolateString as w, mergeStrings as T, useStrings as E } from "./lib/strings.js";
|
|
6
|
-
import { t as D } from "./utils-
|
|
6
|
+
import { t as D } from "./utils-BRhFDwuU.js";
|
|
7
7
|
export { C as ACTION_BUTTON_STYLES, v as CARD_SURFACES, y as COMPONENT_SCALES, _ as DEFAULT_UI_CONFIG, b as DISCLOSURE_SURFACES, m as DirectionProvider, x as SEMANTIC_TONES, S as ThemeScope, a as UIProvider, D as cn, w as interpolateString, e as isComponentScale, T as mergeStrings, g as resolveComponentScale, l as useBadgeConfig, f as useButtonConfig, o as useCardConfig, t as useCommentsConfig, u as useDatesConfig, p as useDensityConfig, n as useFormattingConfig, s as useItemConfig, h as useMoneyConfig, r as useOverlayConfig, i as useSpinnerConfig, E as useStrings, d as useToastConfig, c as useTypographyConfig };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as e } from "./utils-BRhFDwuU.js";
|
|
3
|
+
import { t } from "./affordance-geometry.generated-tF36bREk.js";
|
|
4
|
+
import { t as n } from "./field-state-recipes-BVA2CWHo.js";
|
|
5
|
+
import { t as r } from "./editable-text-recipe-Cn61kEcv.js";
|
|
6
|
+
import "react";
|
|
7
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
8
|
+
import { Input as a } from "@base-ui/react/input";
|
|
9
|
+
//#region src/components/ui/input.tsx
|
|
10
|
+
function o({ className: o, type: s, ...c }) {
|
|
11
|
+
return /* @__PURE__ */ i(a, {
|
|
12
|
+
type: s,
|
|
13
|
+
"data-slot": "input",
|
|
14
|
+
className: e("box-border font-sans border-input h-control rounded-inner border bg-transparent px-control shadow-none transition-[color,box-shadow] file:box-border file:h-control-file file:py-0 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", t.controlTextMinHeight, t.controlBlockPadding.md, s === "file" && t.rawFileField.minHeight, s === "file" && t.rawFileField.blockPadding.md, t.rawFileField.buttonMinHeight, r.md, n.focus, n.invalid, o),
|
|
15
|
+
...c
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { o as t };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=input-CZw8iU99.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-CZw8iU99.js","names":["Input","InputPrimitive","cn","fieldStateRecipes","editableTextSizeClasses","Input$1","props","Input","affordanceGeometry","type","className"],"sources":["../src/components/ui/input.tsx"],"sourcesContent":["import { fieldStateRecipes } from '../../lib/field-state-recipes';\nimport { editableTextSizeClasses } from '../../lib/editable-text-recipe';\nimport { affordanceGeometry } from '../../lib/affordance-geometry.generated';\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 \"box-border font-sans border-input h-control rounded-inner border bg-transparent px-control shadow-none transition-[color,box-shadow] file:box-border file:h-control-file file:py-0 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 affordanceGeometry.controlTextMinHeight,\n affordanceGeometry.controlBlockPadding.md,\n type === 'file' && affordanceGeometry.rawFileField.minHeight,\n type === 'file' && affordanceGeometry.rawFileField.blockPadding.md,\n affordanceGeometry.rawFileField.buttonMinHeight,\n editableTextSizeClasses.md,\n fieldStateRecipes.focus,\n fieldStateRecipes.invalid,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n"],"mappings":";;;;;;;;;AAQA,SAASA,EAAM,EAAE,cAAW,SAAM,GAAGM,KAAwC;CAC3E,OACE,kBAACL,GAAD;EACQ;EACN,aAAU;EACV,WAAWC,EACT,uaACAM,EAAmB,sBACnBA,EAAmB,oBAAoB,IACvCC,MAAS,UAAUD,EAAmB,aAAa,WACnDC,MAAS,UAAUD,EAAmB,aAAa,aAAa,IAChEA,EAAmB,aAAa,iBAChCJ,EAAwB,IACxBD,EAAkB,OAClBA,EAAkB,SAClBO,CACF;EACA,GAAIJ;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { s as e } from "./ui-provider-C_U0Xma4.js";
|
|
3
|
+
import { useStrings as t } from "./lib/strings.js";
|
|
4
|
+
import { t as n } from "./utils-BRhFDwuU.js";
|
|
5
|
+
import { t as r } from "./affordance-geometry.generated-tF36bREk.js";
|
|
6
|
+
import { c as i } from "./typography-UTnveOEy.js";
|
|
7
|
+
import { n as a, t as o } from "./field-affordance-recipes-DZhnIL_Y.js";
|
|
8
|
+
import { c as s, f as c, i as l, n as u, r as d, s as f, t as p, y as m } from "./form-sizing-BdP_Mf5p.js";
|
|
9
|
+
import * as h from "react";
|
|
10
|
+
import { createContext as g, forwardRef as _, memo as v, useCallback as y, useId as b, useMemo as x, useRef as S, useState as C } from "react";
|
|
11
|
+
import { jsx as w, jsxs as T } from "react/jsx-runtime";
|
|
12
|
+
import { Loader2Icon as ee } from "lucide-react";
|
|
13
|
+
//#region src/components/base/text-inputs/hooks/use-form-field-state.ts
|
|
14
|
+
function te({ controlledValue: e, defaultValue: t, maxLength: n, showCharacterCount: r, providedId: i, idPrefix: a = "field", hasOnChange: o }) {
|
|
15
|
+
let s = b(), c = i || `${a}${s}`, [l, u] = C(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 !== "", v = y((e) => h && e.length > n, [h, n]), S = y((e) => !v(e) && (d || u(e), !0), [d, v]), w = y(() => {
|
|
16
|
+
d || u("");
|
|
17
|
+
}, [d]);
|
|
18
|
+
return x(() => ({
|
|
19
|
+
id: c,
|
|
20
|
+
value: f,
|
|
21
|
+
isControlled: d,
|
|
22
|
+
isReactHookForm: p,
|
|
23
|
+
characterCount: m,
|
|
24
|
+
hasCharacterLimit: h,
|
|
25
|
+
showCount: g,
|
|
26
|
+
hasValue: _,
|
|
27
|
+
updateValue: S,
|
|
28
|
+
clearValue: w,
|
|
29
|
+
wouldExceedLimit: v
|
|
30
|
+
}), [
|
|
31
|
+
c,
|
|
32
|
+
f,
|
|
33
|
+
d,
|
|
34
|
+
p,
|
|
35
|
+
m,
|
|
36
|
+
h,
|
|
37
|
+
g,
|
|
38
|
+
_,
|
|
39
|
+
S,
|
|
40
|
+
w,
|
|
41
|
+
v
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region src/components/base/text-inputs/clear-native-field.ts
|
|
46
|
+
function ne(e) {
|
|
47
|
+
let t = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(e), "value")?.set;
|
|
48
|
+
e.type === "file" ? e.value = "" : t?.call(e, ""), e.dispatchEvent(new Event("change", { bubbles: !0 }));
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/components/base/text-inputs/input-trailing-action.ts
|
|
52
|
+
var re = g(null), E = _(function({ className: e, type: t = "button", ...r }, i) {
|
|
53
|
+
return /* @__PURE__ */ w("button", {
|
|
54
|
+
ref: i,
|
|
55
|
+
type: t,
|
|
56
|
+
className: n(a.target, a.focus, a.clear, e),
|
|
57
|
+
...r,
|
|
58
|
+
children: /* @__PURE__ */ w(o, {
|
|
59
|
+
className: a.icon,
|
|
60
|
+
"aria-hidden": "true"
|
|
61
|
+
})
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
E.displayName = "FieldClearButton";
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/components/base/text-inputs/input.tsx
|
|
67
|
+
var ie = { clear: "Clear input" }, ae = (e, t, n) => {
|
|
68
|
+
let r = e || "";
|
|
69
|
+
return t && r && (r = t + r), n && r && (r += n), r;
|
|
70
|
+
};
|
|
71
|
+
function D({ className: o, type: g = "text", startIcon: _, endIcon: v, startAddon: b, endAddon: C, maxLength: D, showCharacterCount: O, clearable: oe, onClear: k, loading: A = !1, returnValueWithAddons: j, invalid: se, size: ce, onChange: M, value: le, defaultValue: ue, id: de, strings: fe, ...N }, P) {
|
|
72
|
+
let F = S(null), I = h.useContext(re), L = S(null), R = S(null), [z, B] = h.useState(), [V, H] = h.useState(), pe = t(ie, fe), { defaultScale: me } = e(), U = m(ce, me), he = y((e) => {
|
|
73
|
+
typeof P == "function" ? P(e) : P && (P.current = e), F.current = e;
|
|
74
|
+
}, [P]), { id: ge, value: _e, isReactHookForm: ve, characterCount: W, hasCharacterLimit: ye, showCount: G, hasValue: be, updateValue: K, clearValue: xe, wouldExceedLimit: Se } = te({
|
|
75
|
+
controlledValue: le,
|
|
76
|
+
defaultValue: ue,
|
|
77
|
+
maxLength: D,
|
|
78
|
+
showCharacterCount: O,
|
|
79
|
+
providedId: de,
|
|
80
|
+
idPrefix: "input",
|
|
81
|
+
hasOnChange: M !== void 0
|
|
82
|
+
}), Ce = !!oe, q = A, we = !!v, Te = !!C, J = g === "file", Y = !!se, X = Ce && be && !G && !q, Z = q && !G, Q = we && !X && !G && !q, $ = Te && !X && !G && !q;
|
|
83
|
+
h.useLayoutEffect(() => {
|
|
84
|
+
let e = L.current, t = R.current, n = () => {
|
|
85
|
+
if (e) {
|
|
86
|
+
let t = e.getBoundingClientRect().width;
|
|
87
|
+
t > 0 && B(t);
|
|
88
|
+
} else B(void 0);
|
|
89
|
+
if (t) {
|
|
90
|
+
let e = t.getBoundingClientRect().width;
|
|
91
|
+
e > 0 && H(e);
|
|
92
|
+
} else H(void 0);
|
|
93
|
+
};
|
|
94
|
+
if (n(), !e && !t) return;
|
|
95
|
+
let r = typeof ResizeObserver > "u" ? void 0 : new ResizeObserver(n);
|
|
96
|
+
return e && r?.observe(e), t && r?.observe(t), window.addEventListener("resize", n), () => {
|
|
97
|
+
r?.disconnect(), window.removeEventListener("resize", n);
|
|
98
|
+
};
|
|
99
|
+
}, [
|
|
100
|
+
U,
|
|
101
|
+
W,
|
|
102
|
+
D,
|
|
103
|
+
b,
|
|
104
|
+
C,
|
|
105
|
+
Q,
|
|
106
|
+
$,
|
|
107
|
+
X,
|
|
108
|
+
G,
|
|
109
|
+
Z,
|
|
110
|
+
I
|
|
111
|
+
]);
|
|
112
|
+
let Ee = x(() => {
|
|
113
|
+
let e = U === "sm" ? "ps-control-sm" : "ps-control", t = U === "sm" ? "pe-control-sm" : "pe-control";
|
|
114
|
+
return _ && (e = s[U]), b && (e = p[U]), b && V !== void 0 && (e = a.measuredStartPadding[U]), Q && (t = l[U]), $ && (t = d[U]), q && (t = l[U]), X && (t = a.clearPadding[U]), G && (t = u[U]), I && (t = G ? a.pairedCountPadding[U] : X ? a.pairedClearPadding[U] : $ ? a.pairedAddonPadding[U] : Q || Z ? a.pairedIconPadding[U] : a.clearPadding[U]), z !== void 0 && (t = a.measuredPadding[U]), `${e} ${t}`;
|
|
115
|
+
}, [
|
|
116
|
+
_,
|
|
117
|
+
b,
|
|
118
|
+
Q,
|
|
119
|
+
$,
|
|
120
|
+
X,
|
|
121
|
+
Z,
|
|
122
|
+
q,
|
|
123
|
+
G,
|
|
124
|
+
I,
|
|
125
|
+
z,
|
|
126
|
+
V,
|
|
127
|
+
U
|
|
128
|
+
]), De = y((e) => {
|
|
129
|
+
let t = e.target.value;
|
|
130
|
+
if (!Se(t) && (K(t), M)) {
|
|
131
|
+
if (j && t) {
|
|
132
|
+
let n = ae(t, b, C);
|
|
133
|
+
M({
|
|
134
|
+
...e,
|
|
135
|
+
target: {
|
|
136
|
+
...e.target,
|
|
137
|
+
value: n
|
|
138
|
+
},
|
|
139
|
+
currentTarget: {
|
|
140
|
+
...e.currentTarget,
|
|
141
|
+
value: n
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
} else M(e);
|
|
145
|
+
}
|
|
146
|
+
}, [
|
|
147
|
+
M,
|
|
148
|
+
j,
|
|
149
|
+
b,
|
|
150
|
+
C,
|
|
151
|
+
K,
|
|
152
|
+
Se
|
|
153
|
+
]), Oe = y(() => {
|
|
154
|
+
if (N.disabled || N.readOnly || A) return;
|
|
155
|
+
let e = F.current;
|
|
156
|
+
if (e?.type === "color" || e?.type === "range") {
|
|
157
|
+
xe();
|
|
158
|
+
let t = {
|
|
159
|
+
value: "",
|
|
160
|
+
name: e.name,
|
|
161
|
+
id: e.id,
|
|
162
|
+
type: e.type
|
|
163
|
+
};
|
|
164
|
+
M?.({
|
|
165
|
+
target: t,
|
|
166
|
+
currentTarget: t
|
|
167
|
+
});
|
|
168
|
+
} else e && ne(e);
|
|
169
|
+
k?.(), F.current?.focus();
|
|
170
|
+
}, [
|
|
171
|
+
N.disabled,
|
|
172
|
+
N.readOnly,
|
|
173
|
+
A,
|
|
174
|
+
xe,
|
|
175
|
+
M,
|
|
176
|
+
k
|
|
177
|
+
]);
|
|
178
|
+
return /* @__PURE__ */ T("div", {
|
|
179
|
+
className: n("input--component", "relative h-fit w-full min-w-0"),
|
|
180
|
+
style: z === void 0 && V === void 0 ? void 0 : {
|
|
181
|
+
"--field-trailing-width": z === void 0 ? void 0 : `${z}px`,
|
|
182
|
+
"--field-leading-width": V === void 0 ? void 0 : `${V}px`
|
|
183
|
+
},
|
|
184
|
+
children: [
|
|
185
|
+
/* @__PURE__ */ w("input", {
|
|
186
|
+
ref: he,
|
|
187
|
+
id: ge,
|
|
188
|
+
type: g,
|
|
189
|
+
...!ve && { value: _e },
|
|
190
|
+
onChange: De,
|
|
191
|
+
maxLength: D,
|
|
192
|
+
"aria-invalid": Y || void 0,
|
|
193
|
+
className: n("flex w-full min-w-0", c(U), "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground", "file:box-border file:inline-flex file:h-control-file file:border file:bg-transparent file:px-control file:py-0 file:font-medium", "file:text-pxs", J && r.fileField.minHeight, J && r.fileField.blockPadding[U], r.fileField.buttonMinHeight, J ? "cursor-pointer bg-background text-foreground file:cursor-pointer file:rounded-inner file:border-input file:bg-background file:text-foreground" : "bg-transparent", J ? "read-only:bg-background" : "[&:read-only:not(:disabled)]:bg-muted", Ee, o),
|
|
194
|
+
...N,
|
|
195
|
+
disabled: N.disabled || A
|
|
196
|
+
}),
|
|
197
|
+
!!_ && /* @__PURE__ */ w("div", {
|
|
198
|
+
className: n("pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center", U === "sm" ? "ps-control-sm" : "ps-control", N.disabled && "opacity-50", Y ? "text-destructive" : "text-muted-foreground"),
|
|
199
|
+
children: /* @__PURE__ */ w(_, {
|
|
200
|
+
className: f[U],
|
|
201
|
+
"aria-hidden": "true"
|
|
202
|
+
})
|
|
203
|
+
}),
|
|
204
|
+
!!b && /* @__PURE__ */ w("span", {
|
|
205
|
+
className: n("pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center", U === "sm" ? "ps-control-sm" : "ps-control", N.disabled && "opacity-50"),
|
|
206
|
+
children: /* @__PURE__ */ w(i, {
|
|
207
|
+
ref: R,
|
|
208
|
+
tag: "span",
|
|
209
|
+
size: U === "sm" ? "pxs" : "sm",
|
|
210
|
+
type: Y ? "error" : "secondary",
|
|
211
|
+
lineHeight: "tight",
|
|
212
|
+
className: "input--start-addon",
|
|
213
|
+
children: b
|
|
214
|
+
})
|
|
215
|
+
}),
|
|
216
|
+
(Q || $ || G || Z || X || I) && /* @__PURE__ */ T("div", {
|
|
217
|
+
ref: L,
|
|
218
|
+
className: n("input--trailing absolute inset-y-0 flex items-center gap-space-sm whitespace-nowrap", a.clearEnd[U], N.disabled && "opacity-50"),
|
|
219
|
+
children: [
|
|
220
|
+
Q && v && /* @__PURE__ */ w(v, {
|
|
221
|
+
className: n("pointer-events-none", f[U], Y ? "text-destructive" : "text-muted-foreground"),
|
|
222
|
+
"aria-hidden": "true"
|
|
223
|
+
}),
|
|
224
|
+
$ && /* @__PURE__ */ w(i, {
|
|
225
|
+
tag: "span",
|
|
226
|
+
size: U === "sm" ? "pxs" : "sm",
|
|
227
|
+
type: Y ? "error" : "secondary",
|
|
228
|
+
lineHeight: "tight",
|
|
229
|
+
className: "input--end-addon pointer-events-none",
|
|
230
|
+
children: C
|
|
231
|
+
}),
|
|
232
|
+
G && /* @__PURE__ */ w("div", {
|
|
233
|
+
role: "status",
|
|
234
|
+
"aria-live": "polite",
|
|
235
|
+
className: "pointer-events-none tabular-nums",
|
|
236
|
+
children: /* @__PURE__ */ T(i, {
|
|
237
|
+
tag: "span",
|
|
238
|
+
size: U === "sm" ? "xxs" : "xs",
|
|
239
|
+
type: Y ? "error" : "secondary",
|
|
240
|
+
children: [W, ye ? `/${D}` : ""]
|
|
241
|
+
})
|
|
242
|
+
}),
|
|
243
|
+
Z && /* @__PURE__ */ w(ee, {
|
|
244
|
+
className: n(f[U], "pointer-events-none animate-spin", Y ? "text-destructive" : "text-muted-foreground"),
|
|
245
|
+
"aria-hidden": "true"
|
|
246
|
+
}),
|
|
247
|
+
X && /* @__PURE__ */ w(E, {
|
|
248
|
+
"aria-label": pe.clear,
|
|
249
|
+
onClick: Oe,
|
|
250
|
+
disabled: N.disabled || N.readOnly || A
|
|
251
|
+
}),
|
|
252
|
+
I
|
|
253
|
+
]
|
|
254
|
+
})
|
|
255
|
+
]
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
var O = v(h.forwardRef(D));
|
|
259
|
+
O.displayName = "Input";
|
|
260
|
+
//#endregion
|
|
261
|
+
export { ne as a, re as i, ie as n, te as o, E as r, O as t };
|
|
262
|
+
|
|
263
|
+
//# sourceMappingURL=input-DQdEd0YD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-DQdEd0YD.js","names":["React","useDensityConfig","cn","affordanceGeometry","Text","fieldAffordanceRecipes","FieldClearGlyph","formControlIconOffsetClasses","formFieldFrameClasses","formControlEndIconOffsetClasses","formControlCountOffsetClasses","formControlEndAddonOffsetClasses","formControlIconClasses","formControlAddonOffsetClasses","resolveFormControlSize","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","clearNativeField","setValue","field","InputTrailingActionContext","createContext","FieldClearButton","forwardRef","props","className","defaultInputStrings","getValueWithAddons","result","startAddon","endAddon","InputImpl","StartIcon","EndIcon","sizeProp","stringsProp","inputRef","useRef","trailingAction","trailingRef","leadingRef","trailingWidth","setTrailingWidth","leadingWidth","setLeadingWidth","strings","useStrings","size","defaultScale","setRefs","forwardedRef","node","inputValue","onChange","isClearable","clearable","isShowingLoading","loading","hasEndIcon","hasEndAddon","isFileInput","type","hasError","invalid","showClearButton","showLoadingSpinner","showEndIcon","showEndAddon","track","leading","measure","width","observer","inputPaddingClasses","paddingStart","paddingEnd","handleInputChange","returnValueWithAddons","valueWithAddons","handleClear","nativeField","target","onClear","Loader2Icon","Input","memo"],"sources":["../src/components/base/text-inputs/hooks/use-form-field-state.ts","../src/components/base/text-inputs/clear-native-field.ts","../src/components/base/text-inputs/input-trailing-action.ts","../src/components/base/text-inputs/field-clear-button.tsx","../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","/** Route inline clearing through the field's existing native change handler. */\nexport function clearNativeField(field: HTMLInputElement | HTMLTextAreaElement) {\n\t// Bypass React's value tracker so it observes the change and restores any\n\t// controlled value that the consumer declines or replaces synchronously.\n\tconst setValue = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(field), 'value')?.set;\n\tif (field.type === 'file') field.value = '';\n\telse setValue?.call(field, '');\n\tfield.dispatchEvent(new Event('change', { bubbles: true }));\n}\n","import { createContext, type ReactNode } from 'react';\n\n/** Private composition seam: the Input owner lays out PasswordInput's action. */\nexport const InputTrailingActionContext = createContext<ReactNode>(null);\n","import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { FieldClearGlyph, fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { cn } from '../../../lib/utils';\n\n/**\n * The inline clear action shared by Input, Textarea and Cascader: a native button\n * drawing the shared clear target, focus edge and glyph. Its owner places it and\n * supplies the accessible name, handler and disabled state.\n */\nexport const FieldClearButton = forwardRef<HTMLButtonElement, ComponentPropsWithoutRef<'button'>>(function FieldClearButton(\n\t{ className, type = 'button', ...props },\n\tref,\n) {\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype={type}\n\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear, className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<FieldClearGlyph className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t</button>\n\t);\n});\nFieldClearButton.displayName = 'FieldClearButton';\n","import { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { affordanceGeometry } from '../../../lib/affordance-geometry.generated';\nimport { 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\tformFieldFrameClasses,\n\t\tresolveFormControlSize,\n} from '../forms/form-sizing';\nimport { useFormFieldState } from './hooks';\nimport { clearNativeField } from './clear-native-field';\nimport { InputTrailingActionContext } from './input-trailing-action';\nimport { FieldClearButton } from './field-clear-button';\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 trailingAction = React.useContext(InputTrailingActionContext);\n\t\tconst trailingRef = useRef<HTMLDivElement>(null);\n\t\tconst leadingRef = useRef<HTMLElement>(null);\n\t\tconst [trailingWidth, setTrailingWidth] = React.useState<number>();\n\t\tconst [leadingWidth, setLeadingWidth] = React.useState<number>();\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\t\tconst showClearButton = isClearable && hasValue && !showCount && !isShowingLoading;\n\t\tconst showLoadingSpinner = isShowingLoading && !showCount;\n\t\tconst showEndIcon = hasEndIcon && !showClearButton && !showCount && !isShowingLoading;\n\t\tconst showEndAddon = hasEndAddon && !showClearButton && !showCount && !isShowingLoading;\n\n\t\tReact.useLayoutEffect(() => {\n\t\t\tconst track = trailingRef.current;\n\t\t\tconst leading = leadingRef.current;\n\t\t\tconst measure = () => {\n\t\t\t\t// Hidden/SSR surfaces retain the generated fallback until measurable.\n\t\t\t\tif (track) {\n\t\t\t\t\tconst width = track.getBoundingClientRect().width;\n\t\t\t\t\tif (width > 0) setTrailingWidth(width);\n\t\t\t\t} else setTrailingWidth(undefined);\n\t\t\t\tif (leading) {\n\t\t\t\t\tconst width = leading.getBoundingClientRect().width;\n\t\t\t\t\tif (width > 0) setLeadingWidth(width);\n\t\t\t\t} else setLeadingWidth(undefined);\n\t\t\t};\n\t\t\tmeasure();\n\t\t\tif (!track && !leading) return;\n\t\t\tconst observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(measure);\n\t\t\tif (track) observer?.observe(track);\n\t\t\tif (leading) observer?.observe(leading);\n\t\t\twindow.addEventListener('resize', measure);\n\t\t\treturn () => { observer?.disconnect(); window.removeEventListener('resize', measure); };\n\t\t}, [size, characterCount, maxLength, startAddon, endAddon, showEndIcon, showEndAddon, showClearButton, showCount, showLoadingSpinner, trailingAction]);\n\n\t\t// Generated fallbacks cover SSR; measured text keeps translated add-ons\n\t\t// clear of the editable value. Consumer padding classes remain last.\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\t\t\t\tif (startAddon && leadingWidth !== undefined) paddingStart = fieldAffordanceRecipes.measuredStartPadding[size];\n\n\t\t\t\tif (showEndIcon) paddingEnd = formControlEndIconOffsetClasses[size];\n\t\t\t\tif (showEndAddon) paddingEnd = formControlEndAddonOffsetClasses[size];\n\t\t\t\tif (isShowingLoading) paddingEnd = formControlEndIconOffsetClasses[size];\n\t\t\t\tif (showClearButton) paddingEnd = fieldAffordanceRecipes.clearPadding[size];\n\t\t\t\tif (showCount) paddingEnd = formControlCountOffsetClasses[size];\n\t\t\t\tif (trailingAction) {\n\t\t\t\t\tpaddingEnd = showCount ? fieldAffordanceRecipes.pairedCountPadding[size]\n\t\t\t\t\t\t: showClearButton ? fieldAffordanceRecipes.pairedClearPadding[size]\n\t\t\t\t\t\t: showEndAddon ? fieldAffordanceRecipes.pairedAddonPadding[size]\n\t\t\t\t\t\t: showEndIcon || showLoadingSpinner ? fieldAffordanceRecipes.pairedIconPadding[size]\n\t\t\t\t\t\t: fieldAffordanceRecipes.clearPadding[size];\n\t\t\t\t}\n\n\t\t\t\tif (trailingWidth !== undefined) paddingEnd = fieldAffordanceRecipes.measuredPadding[size];\n\n\t\t\t\treturn `${paddingStart} ${paddingEnd}`;\n\t\t}, [StartIcon, startAddon, showEndIcon, showEndAddon, showClearButton, showLoadingSpinner, isShowingLoading, showCount, trailingAction, trailingWidth, leadingWidth, 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 && newValue) {\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\tif (props.disabled || props.readOnly || loading) return;\n\n\t\t\t\tconst nativeField = inputRef.current;\n\t\t\t\tif (nativeField?.type === 'color' || nativeField?.type === 'range') {\n\t\t\t\t\t\t// These native types cannot represent ''. Retain the existing empty\n\t\t\t\t\t\t// proposal while the browser owns the rendered value's sanitization.\n\t\t\t\t\t\tclearValue();\n\t\t\t\t\t\tconst target = { value: '', name: nativeField.name, id: nativeField.id, type: nativeField.type };\n\t\t\t\t\t\tonChange?.({ target, currentTarget: target } as React.ChangeEvent<HTMLInputElement>);\n\t\t\t\t} else if (nativeField) {\n\t\t\t\t\t\tclearNativeField(nativeField);\n\t\t\t\t}\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}, [props.disabled, props.readOnly, loading, clearValue, onChange, onClear]);\n\n\n\n\t\treturn (\n\t\t\t\t<div className={cn('input--component', 'relative h-fit w-full min-w-0')} style={trailingWidth === undefined && leadingWidth === undefined ? undefined : {\n\t\t\t\t\t'--field-trailing-width': trailingWidth === undefined ? undefined : `${trailingWidth}px`,\n\t\t\t\t\t'--field-leading-width': leadingWidth === undefined ? undefined : `${leadingWidth}px`,\n\t\t\t\t} as React.CSSProperties}>\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\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t// The shared field frame, which input-shaped triggers draw too\n\t\t\t\t\t\t\t\t\t\t'flex w-full min-w-0',\n\t\t\t\t\t\t\t\t\t\tformFieldFrameClasses(size),\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// File input styles\n\t\t\t\t\t\t\t\t\t\t'file:box-border file:inline-flex file:h-control-file file:border file:bg-transparent file:px-control file:py-0 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 && affordanceGeometry.fileField.minHeight,\n\t\t\t\t\t\t\t\t\t\tisFileInput && affordanceGeometry.fileField.blockPadding[size],\n\t\t\t\t\t\t\t\t\t\taffordanceGeometry.fileField.buttonMinHeight,\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-inner 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// Read-only fill. A disabled input also matches :read-only, and\n\t\t\t\t\t\t\t\t\t\t// disabled fields dim on a transparent fill like every trigger.\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:not(:disabled)]: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\t\tdisabled={props.disabled || loading}\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'\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\tref={leadingRef}\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{(showEndIcon || showEndAddon || showCount || showLoadingSpinner || showClearButton || trailingAction) && (\n\t\t\t\t\t\t\t<div ref={trailingRef} className={cn('input--trailing absolute inset-y-0 flex items-center gap-space-sm whitespace-nowrap', fieldAffordanceRecipes.clearEnd[size],\n\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50')}>\n\t\t\t\t\t\t\t\t{showEndIcon && EndIcon && <EndIcon className={cn('pointer-events-none', formControlIconClasses[size], hasError ? 'text-destructive' : 'text-muted-foreground')} aria-hidden=\"true\" />}\n\t\t\t\t\t\t\t\t{showEndAddon && <Text tag=\"span\" size={size === 'sm' ? 'pxs' : 'sm'} type={hasError ? 'error' : 'secondary'} lineHeight=\"tight\" className=\"input--end-addon pointer-events-none\">{endAddon}</Text>}\n\t\t\t\t\t\t\t\t{showCount && <div role=\"status\" aria-live=\"polite\" className=\"pointer-events-none tabular-nums\">\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size={size === 'sm' ? 'xxs' : 'xs'} type={hasError ? 'error' : 'secondary'}>{characterCount}{hasCharacterLimit ? `/${maxLength}` : ''}</Text>\n\t\t\t\t\t\t\t\t</div>}\n\t\t\t\t\t\t\t\t{showLoadingSpinner && <Loader2Icon className={cn(formControlIconClasses[size], 'pointer-events-none animate-spin', hasError ? 'text-destructive' : 'text-muted-foreground')} aria-hidden=\"true\" />}\n\t\t\t\t\t\t\t\t{showClearButton && <FieldClearButton aria-label={strings.clear} onClick={handleClear} disabled={props.disabled || props.readOnly || loading} />}\n\t\t\t\t\t\t\t\t{trailingAction}\n\t\t\t\t\t\t\t</div>\n\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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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { i as e } from "./surface-recipes-BKRVW8Os.js";
|
|
2
2
|
//#region src/lib/interaction-recipes.ts
|
|
3
3
|
var t = {
|
|
4
|
+
nativeButtonReset: "box-border m-0 border-0 bg-transparent p-0 font-sans",
|
|
4
5
|
rowHover: "hover:bg-accent hover:text-accent-foreground",
|
|
5
6
|
rowSelected: "bg-accent text-accent-foreground",
|
|
6
7
|
rowCurrent: "bg-accent text-accent-foreground font-medium",
|
|
@@ -21,4 +22,4 @@ var t = {
|
|
|
21
22
|
//#endregion
|
|
22
23
|
export { t };
|
|
23
24
|
|
|
24
|
-
//# sourceMappingURL=interaction-recipes-
|
|
25
|
+
//# sourceMappingURL=interaction-recipes-XR9ZpVYL.js.map
|