@servicetitan/anvil2 3.10.0 → 3.11.0
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 +35 -0
- package/dist/{AiMark-2_O4tKv_.js → AiMark-BqRDRySA.js} +3 -3
- package/dist/{AiMark-2_O4tKv_.js.map → AiMark-BqRDRySA.js.map} +1 -1
- package/dist/AiMark.js +1 -1
- package/dist/{Alert-DtM7NDN9.js → Alert-CWwBGGP3.js} +2 -2
- package/dist/{Alert-DtM7NDN9.js.map → Alert-CWwBGGP3.js.map} +1 -1
- package/dist/Alert.js +1 -1
- package/dist/{AnvilProvider-b3gvW6Md.js → AnvilProvider-Deh-Vgep.js} +2 -2
- package/dist/{AnvilProvider-b3gvW6Md.js.map → AnvilProvider-Deh-Vgep.js.map} +1 -1
- package/dist/AnvilProvider.js +1 -1
- package/dist/{Avatar-DX96Mxe7.js → Avatar-ioIwH1KT.js} +2 -2
- package/dist/{Avatar-DX96Mxe7.js.map → Avatar-ioIwH1KT.js.map} +1 -1
- package/dist/{Avatar-CoQcOHWU.js → Avatar-lLiNUrxq.js} +11 -11
- package/dist/{Avatar-CoQcOHWU.js.map → Avatar-lLiNUrxq.js.map} +1 -1
- package/dist/Avatar.css +14 -13
- package/dist/Avatar.js +2 -2
- package/dist/{Breadcrumbs-Bmqmw5F5.js → Breadcrumbs-FZO4lrPG.js} +7 -15
- package/dist/{Breadcrumbs-Bmqmw5F5.js.map → Breadcrumbs-FZO4lrPG.js.map} +1 -1
- package/dist/Breadcrumbs.css +5 -3
- package/dist/Breadcrumbs.js +1 -1
- package/dist/Button-Dwh_Nd4l.js.map +1 -1
- package/dist/{Calendar-CUgFbnKj.js → Calendar-CdCKAwuu.js} +2 -2
- package/dist/{Calendar-CUgFbnKj.js.map → Calendar-CdCKAwuu.js.map} +1 -1
- package/dist/{Calendar-D_fqe0-J.js → Calendar-D-e2O90P.js} +2 -2
- package/dist/{Calendar-D_fqe0-J.js.map → Calendar-D-e2O90P.js.map} +1 -1
- package/dist/Calendar.js +2 -2
- package/dist/{Checkbox-DoxWcbfv.js → Checkbox-B3bw3xS2.js} +3 -3
- package/dist/{Checkbox-DoxWcbfv.js.map → Checkbox-B3bw3xS2.js.map} +1 -1
- package/dist/{Checkbox-4wRmrann.js → Checkbox-f7XfiGAL.js} +2 -2
- package/dist/{Checkbox-4wRmrann.js.map → Checkbox-f7XfiGAL.js.map} +1 -1
- package/dist/Checkbox.js +1 -1
- package/dist/{Chip-D6Q0J0Xe.js → Chip-ZXGLaddL.js} +3 -3
- package/dist/{Chip-D6Q0J0Xe.js.map → Chip-ZXGLaddL.js.map} +1 -1
- package/dist/Chip.js +1 -1
- package/dist/Combobox.js +1 -1
- package/dist/{DataTable-D-SKKt5w.js → DataTable-BH0A9Sgs.js} +8 -8
- package/dist/{DataTable-D-SKKt5w.js.map → DataTable-BH0A9Sgs.js.map} +1 -1
- package/dist/{DateFieldRange-DUFfyknZ.js → DateFieldRange-Clz3-KS2.js} +4 -4
- package/dist/{DateFieldRange-DUFfyknZ.js.map → DateFieldRange-Clz3-KS2.js.map} +1 -1
- package/dist/DateFieldRange.js +1 -1
- package/dist/{DateFieldSingle-BZjlO0hX.js → DateFieldSingle-C3v2ykj7.js} +4 -4
- package/dist/{DateFieldSingle-BZjlO0hX.js.map → DateFieldSingle-C3v2ykj7.js.map} +1 -1
- package/dist/DateFieldSingle.js +1 -1
- package/dist/{DateFieldYearless-TcKb9jE2.js → DateFieldYearless-CmwuxrLX.js} +4 -4
- package/dist/{DateFieldYearless-TcKb9jE2.js.map → DateFieldYearless-CmwuxrLX.js.map} +1 -1
- package/dist/DateFieldYearless.js +1 -1
- package/dist/{DateFieldYearlessRange-D9XtRNWi.js → DateFieldYearlessRange-jjjP4bZ2.js} +3 -3
- package/dist/{DateFieldYearlessRange-D9XtRNWi.js.map → DateFieldYearlessRange-jjjP4bZ2.js.map} +1 -1
- package/dist/DateFieldYearlessRange.js +1 -1
- package/dist/{DaysOfTheWeek--FBi44iw.js → DaysOfTheWeek-YynjbZa9.js} +3 -3
- package/dist/{DaysOfTheWeek--FBi44iw.js.map → DaysOfTheWeek-YynjbZa9.js.map} +1 -1
- package/dist/DaysOfTheWeek.js +1 -1
- package/dist/{Dialog-Clh3jaX8.js → Dialog-BekbulnQ.js} +5 -5
- package/dist/{Dialog-Clh3jaX8.js.map → Dialog-BekbulnQ.js.map} +1 -1
- package/dist/Dialog.js +1 -1
- package/dist/DndSort.js.map +1 -1
- package/dist/{Drawer-h2Mut1lB.js → Drawer-Cd3KFWSB.js} +5 -5
- package/dist/{Drawer-h2Mut1lB.js.map → Drawer-Cd3KFWSB.js.map} +1 -1
- package/dist/Drawer.js +1 -1
- package/dist/DrillDown.css +36 -34
- package/dist/DrillDown.js +1 -1
- package/dist/DrillDown.module-1VBKDZRA.js +27 -0
- package/dist/{DrillDown.module-D1Bf9_yP.js.map → DrillDown.module-1VBKDZRA.js.map} +1 -1
- package/dist/{EditCard-QohYSylF.js → EditCard-DF2As9n2.js} +2 -2
- package/dist/{EditCard-QohYSylF.js.map → EditCard-DF2As9n2.js.map} +1 -1
- package/dist/EditCard.js +1 -1
- package/dist/{FieldLabel-SzH61hCb.js → FieldLabel-C-XG9Dvv.js} +3 -3
- package/dist/{FieldLabel-SzH61hCb.js.map → FieldLabel-C-XG9Dvv.js.map} +1 -1
- package/dist/FieldLabel.js +1 -1
- package/dist/{FilterBar-luqnJzAK.js → FilterBar-xLBpABXu.js} +5 -5
- package/dist/{FilterBar-luqnJzAK.js.map → FilterBar-xLBpABXu.js.map} +1 -1
- package/dist/FilterBar.js +1 -1
- package/dist/{InputMask-CQONHcTq.js → InputMask-ronTKYSD.js} +3 -3
- package/dist/{InputMask-CQONHcTq.js.map → InputMask-ronTKYSD.js.map} +1 -1
- package/dist/InputMask.js +1 -1
- package/dist/{ListView-BgGEwal3.js → ListView-7Zzupb12.js} +2 -2
- package/dist/{ListView-BgGEwal3.js.map → ListView-7Zzupb12.js.map} +1 -1
- package/dist/ListView.js +1 -1
- package/dist/{Listbox-Cw_2W62S.js → Listbox-pFRaZRqy.js} +2 -2
- package/dist/{Listbox-Cw_2W62S.js.map → Listbox-pFRaZRqy.js.map} +1 -1
- package/dist/Listbox.js +1 -1
- package/dist/MultiSelectField.js +1 -1
- package/dist/{MultiSelectFieldSync-HhFKGtQM.js → MultiSelectFieldSync-BwMqc4QP.js} +184 -164
- package/dist/MultiSelectFieldSync-BwMqc4QP.js.map +1 -0
- package/dist/MultiSelectFieldSync.css +80 -69
- package/dist/MultiSelectMenu.js +1 -1
- package/dist/{MultiSelectMenuSync-C3Y7jnJQ.js → MultiSelectMenuSync-CraTnzEH.js} +4 -4
- package/dist/MultiSelectMenuSync-CraTnzEH.js.map +1 -0
- package/dist/{NumberField-B1761jkf.js → NumberField-DbX29dqE.js} +3 -3
- package/dist/{NumberField-B1761jkf.js.map → NumberField-DbX29dqE.js.map} +1 -1
- package/dist/NumberField.js +1 -1
- package/dist/{Page-Pk0-Sxf_.js → Page-DQZPAebS.js} +11 -11
- package/dist/{Page-Pk0-Sxf_.js.map → Page-DQZPAebS.js.map} +1 -1
- package/dist/Page.js +1 -1
- package/dist/{Pagination-Bx_u6Uea.js → Pagination-DfQNks5S.js} +2 -2
- package/dist/{Pagination-Bx_u6Uea.js.map → Pagination-DfQNks5S.js.map} +1 -1
- package/dist/Pagination.js +1 -1
- package/dist/{Popover-CjsE5FG0.js → Popover-BgqqGh5y.js} +2 -2
- package/dist/{Popover-CjsE5FG0.js.map → Popover-BgqqGh5y.js.map} +1 -1
- package/dist/Popover.js +1 -1
- package/dist/{ProgressBar-Coh2nTJ1.js → ProgressBar-BKEDAa-f.js} +2 -2
- package/dist/{ProgressBar-Coh2nTJ1.js.map → ProgressBar-BKEDAa-f.js.map} +1 -1
- package/dist/ProgressBar.js +1 -1
- package/dist/{Radio-J4Iv3wbJ.js → Radio-D6YiAttx.js} +3 -3
- package/dist/{Radio-J4Iv3wbJ.js.map → Radio-D6YiAttx.js.map} +1 -1
- package/dist/{Radio-BxSL1PoP.js → Radio-DJhh0wxb.js} +2 -2
- package/dist/{Radio-BxSL1PoP.js.map → Radio-DJhh0wxb.js.map} +1 -1
- package/dist/Radio.js +1 -1
- package/dist/{RichTextEditor-CTIGe6xA.js → RichTextEditor-BXPBSBUb.js} +8 -8
- package/dist/{RichTextEditor-CTIGe6xA.js.map → RichTextEditor-BXPBSBUb.js.map} +1 -1
- package/dist/RichTextEditor.js +1 -1
- package/dist/{SavedFiltersButton-CpnoAIrw.js → SavedFiltersButton-CIrXkFKk.js} +9 -9
- package/dist/{SavedFiltersButton-CpnoAIrw.js.map → SavedFiltersButton-CIrXkFKk.js.map} +1 -1
- package/dist/SavedFiltersButton.js +1 -1
- package/dist/{SelectCard-BTfhPyHH.js → SelectCard-M6FsTBA4.js} +3 -3
- package/dist/{SelectCard-BTfhPyHH.js.map → SelectCard-M6FsTBA4.js.map} +1 -1
- package/dist/SelectCard.js +1 -1
- package/dist/SelectField.js +1 -1
- package/dist/{SelectFieldLabel-CjY6zFJA.js → SelectFieldLabel-CgtazsA_.js} +2 -2
- package/dist/{SelectFieldLabel-CjY6zFJA.js.map → SelectFieldLabel-CgtazsA_.js.map} +1 -1
- package/dist/{SelectFieldSync-Dyug8Fgk.js → SelectFieldSync-3RX9nnSN.js} +147 -141
- package/dist/SelectFieldSync-3RX9nnSN.js.map +1 -0
- package/dist/SelectMenu.js +1 -1
- package/dist/{SelectMenuSync-BkC0FD5P.js → SelectMenuSync-BS7u10Oq.js} +4 -4
- package/dist/{SelectMenuSync-BkC0FD5P.js.map → SelectMenuSync-BS7u10Oq.js.map} +1 -1
- package/dist/{SelectOptions-B3Vmtb_k.js → SelectOptions-CVkf5lLa.js} +2 -2
- package/dist/{SelectOptions-B3Vmtb_k.js.map → SelectOptions-CVkf5lLa.js.map} +1 -1
- package/dist/{SelectTrigger-Do1puyA_.js → SelectTrigger-1dUFQ1dW.js} +3 -3
- package/dist/{SelectTrigger-Do1puyA_.js.map → SelectTrigger-1dUFQ1dW.js.map} +1 -1
- package/dist/SelectTrigger.js +1 -1
- package/dist/{SelectTriggerBase-rxHXMSb4.js → SelectTriggerBase-D_Os9knB.js} +8 -5
- package/dist/SelectTriggerBase-D_Os9knB.js.map +1 -0
- package/dist/SelectTriggerBase.css +49 -47
- package/dist/SelectTriggerBase.module-mYOfdBGA.js +40 -0
- package/dist/SelectTriggerBase.module-mYOfdBGA.js.map +1 -0
- package/dist/{SideNav-DZRXOYHs.js → SideNav-BLXgM918.js} +2 -2
- package/dist/{SideNav-DZRXOYHs.js.map → SideNav-BLXgM918.js.map} +1 -1
- package/dist/SideNav.js +1 -1
- package/dist/{Stepper-BX_gDWLE.js → Stepper-z1y9AfaJ.js} +10 -10
- package/dist/{Stepper-BX_gDWLE.js.map → Stepper-z1y9AfaJ.js.map} +1 -1
- package/dist/Stepper.css +23 -23
- package/dist/Stepper.js +1 -1
- package/dist/{Switch-BpjBYm-U.js → Switch-DnhE6CHy.js} +2 -2
- package/dist/{Switch-BpjBYm-U.js.map → Switch-DnhE6CHy.js.map} +1 -1
- package/dist/Switch.js +1 -1
- package/dist/Tab-Bqfvg8Ce.js.map +1 -1
- package/dist/Table.js +1 -1
- package/dist/{Text-CIoD_RK4.js → Text-BT1MnQrn.js} +6 -4
- package/dist/Text-BT1MnQrn.js.map +1 -0
- package/dist/Text.css +18 -16
- package/dist/Text.js +1 -1
- package/dist/Text.module-D9ksuiBV.js +24 -0
- package/dist/Text.module-D9ksuiBV.js.map +1 -0
- package/dist/{TextField-CzzvLI5_.js → TextField-1RXT8l7y.js} +3 -3
- package/dist/{TextField-CzzvLI5_.js.map → TextField-1RXT8l7y.js.map} +1 -1
- package/dist/{TextField-D3sRS5q1.js → TextField-ClFi79P0.js} +2 -2
- package/dist/{TextField-D3sRS5q1.js.map → TextField-ClFi79P0.js.map} +1 -1
- package/dist/TextField.js +1 -1
- package/dist/{Textarea-B3C7AkPj.js → Textarea-CuR8d8LC.js} +3 -3
- package/dist/{Textarea-B3C7AkPj.js.map → Textarea-CuR8d8LC.js.map} +1 -1
- package/dist/Textarea.js +1 -1
- package/dist/{ThemeProvider-Sd8LK0A9.js → ThemeProvider-BlEOL-sk.js} +4 -4
- package/dist/ThemeProvider-BlEOL-sk.js.map +1 -0
- package/dist/ThemeProvider.js +1 -1
- package/dist/{TimeField-L9B_X6-H.js → TimeField-CAPMDE4E.js} +4 -4
- package/dist/{TimeField-L9B_X6-H.js.map → TimeField-CAPMDE4E.js.map} +1 -1
- package/dist/TimeField.js +1 -1
- package/dist/Toast.js +2 -2
- package/dist/{Toaster-CAI7tX8q.js → Toaster-Ci4s1BZB.js} +3 -3
- package/dist/{Toaster-CAI7tX8q.js.map → Toaster-Ci4s1BZB.js.map} +1 -1
- package/dist/{Toaster-DZxf0N9g.js → Toaster-tJvMxWQq.js} +2 -2
- package/dist/{Toaster-DZxf0N9g.js.map → Toaster-tJvMxWQq.js.map} +1 -1
- package/dist/{Toolbar-BOgHhw7K.js → Toolbar-B2kSQ2dc.js} +5 -5
- package/dist/{Toolbar-BOgHhw7K.js.map → Toolbar-B2kSQ2dc.js.map} +1 -1
- package/dist/{Toolbar-DDWUuQm_.js → Toolbar-BnXIEZcV.js} +4 -4
- package/dist/{Toolbar-DDWUuQm_.js.map → Toolbar-BnXIEZcV.js.map} +1 -1
- package/dist/Toolbar.js +2 -2
- package/dist/{ToolbarButtonToggle-BbtKfezH.js → ToolbarButtonToggle-C_Dq_qyS.js} +2 -2
- package/dist/{ToolbarButtonToggle-BbtKfezH.js.map → ToolbarButtonToggle-C_Dq_qyS.js.map} +1 -1
- package/dist/{Tooltip-BC8lnFhe.js → Tooltip-CzrJgl98.js} +2 -2
- package/dist/{Tooltip-BC8lnFhe.js.map → Tooltip-CzrJgl98.js.map} +1 -1
- package/dist/Tooltip.js +1 -1
- package/dist/TreeSelectField.js +1 -1
- package/dist/{TreeSelectFieldSync-Cd87uR6b.js → TreeSelectFieldSync-hA3wCFMS.js} +96 -88
- package/dist/TreeSelectFieldSync-hA3wCFMS.js.map +1 -0
- package/dist/TreeSelectFieldSync.css +44 -36
- package/dist/TreeSelectMenu.js +1 -1
- package/dist/{TreeSelectMenuSync-88q0ydo5.js → TreeSelectMenuSync-CV92JUPb.js} +3 -3
- package/dist/{TreeSelectMenuSync-88q0ydo5.js.map → TreeSelectMenuSync-CV92JUPb.js.map} +1 -1
- package/dist/{TypeaheadTextField-9Nkkd4c4.js → TypeaheadTextField-C1Mxy1l6.js} +3 -3
- package/dist/{TypeaheadTextField-9Nkkd4c4.js.map → TypeaheadTextField-C1Mxy1l6.js.map} +1 -1
- package/dist/TypeaheadTextField.js +1 -1
- package/dist/{YearlessDateInputWithPicker-BquY4bCd.js → YearlessDateInputWithPicker-Dq_UMQEP.js} +2 -2
- package/dist/{YearlessDateInputWithPicker-BquY4bCd.js.map → YearlessDateInputWithPicker-Dq_UMQEP.js.map} +1 -1
- package/dist/assets/css-utils/a2-font.css +21 -21
- package/dist/assets/css-utils/a2-utils.css +21 -21
- package/dist/assets/css-utils/font.css +21 -21
- package/dist/assets/css-utils/utils.css +21 -21
- package/dist/beta.js +16 -16
- package/dist/beta.js.map +1 -1
- package/dist/{bulkActionTypes-CWcUhKFS.js → bulkActionTypes-CdorQGKt.js} +2 -2
- package/dist/bulkActionTypes-CdorQGKt.js.map +1 -0
- package/dist/downshift.esm-xtSnQp44.js.map +1 -1
- package/dist/{filter-state-BQOX7_rO.js → filter-state-CsRd-cja.js} +19 -19
- package/dist/{filter-state-BQOX7_rO.js.map → filter-state-CsRd-cja.js.map} +1 -1
- package/dist/floating-ui.react-dom-CyrxPiI-.js.map +1 -1
- package/dist/index-DXeGMe23.js.map +1 -1
- package/dist/{index-DjirBR0l.js → index-DkEGGc6F.js} +2 -2
- package/dist/{index-DjirBR0l.js.map → index-DkEGGc6F.js.map} +1 -1
- package/dist/index.esm-C2ZhC_8d.js.map +1 -1
- package/dist/index.js +47 -47
- package/dist/proxy-DEehATlA.js.map +1 -1
- package/dist/src/beta/components/Table/DataTable/internal/DataTablePagination.d.ts +1 -1
- package/dist/src/beta/components/deprecatedReexports/MultiSelectField.d.ts +4 -3
- package/dist/src/beta/components/deprecatedReexports/SelectField.d.ts +4 -3
- package/dist/src/components/MultiSelectField/MultiSelectField.d.ts +4 -1
- package/dist/src/components/MultiSelectField/MultiSelectFieldSync.d.ts +4 -4
- package/dist/src/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +1 -1
- package/dist/src/components/MultiSelectField/internal/MultiSelectFieldInput.d.ts +5 -5
- package/dist/src/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +1 -1
- package/dist/src/components/MultiSelectField/internal/MultiSelectFieldTrigger.d.ts +5 -5
- package/dist/src/components/MultiSelectField/internal/types.d.ts +7 -7
- package/dist/src/components/MultiSelectField/internal/useComboMultiple.d.ts +9 -9
- package/dist/src/components/MultiSelectField/internal/useSelectModeMultiple.d.ts +9 -9
- package/dist/src/components/MultiSelectField/stories/MultiSelectField.stories.data.d.ts +173 -6
- package/dist/src/components/MultiSelectField/types.d.ts +34 -34
- package/dist/src/components/MultiSelectMenu/MultiSelectMenuSync.d.ts +3 -3
- package/dist/src/components/MultiSelectMenu/types.d.ts +19 -19
- package/dist/src/components/SelectField/SelectField.d.ts +4 -1
- package/dist/src/components/SelectField/SelectFieldSync.d.ts +4 -4
- package/dist/src/components/SelectField/internal/SelectFieldComboboxMode.d.ts +1 -1
- package/dist/src/components/SelectField/internal/SelectFieldSelectMode.d.ts +1 -1
- package/dist/src/components/SelectField/internal/useCombo.d.ts +8 -8
- package/dist/src/components/SelectField/internal/useSelectMode.d.ts +8 -8
- package/dist/src/components/SelectField/stories/SelectField.stories.data.d.ts +171 -5
- package/dist/src/components/SelectField/types.d.ts +32 -32
- package/dist/src/components/Text/Text.d.ts +7 -0
- package/dist/src/components/Text/types.d.ts +10 -0
- package/dist/src/internal/functions/buildSelectItems.d.ts +7 -7
- package/dist/src/internal/functions/syncFilterUtils.d.ts +4 -4
- package/dist/src/internal/hooks/useGroupedOptions.d.ts +8 -8
- package/dist/src/internal/hooks/usePinnedOptions.d.ts +5 -5
- package/dist/src/internal/hooks/useProcessedOptions.d.ts +7 -7
- package/dist/src/internal/hooks/useSelectFieldLoading/useSelectFieldLoading.d.ts +8 -8
- package/dist/src/internal/hooks/useSelectOrchestration.d.ts +2 -2
- package/dist/src/internal/hooks/useToggleSelection.d.ts +8 -8
- package/dist/src/internal/types/bulkActionTypes.d.ts +12 -12
- package/dist/src/internal/types/selectFieldInternalTypes.d.ts +8 -8
- package/dist/src/themes/carto.d.ts +113 -0
- package/dist/src/themes/index.d.ts +1 -0
- package/dist/{stripInlineMarkdown-BfNNOWPk.js → stripInlineMarkdown-BVD5dm2G.js} +2 -2
- package/dist/{stripInlineMarkdown-BfNNOWPk.js.map → stripInlineMarkdown-BVD5dm2G.js.map} +1 -1
- package/dist/{syncFilterUtils-YB6gRuuR.js → syncFilterUtils-BJSyhkTT.js} +4 -6
- package/dist/syncFilterUtils-BJSyhkTT.js.map +1 -0
- package/dist/themes.d.ts +1 -0
- package/dist/themes.js +37 -0
- package/dist/themes.js.map +1 -0
- package/dist/token/core/css-utils/a2-font.css +21 -21
- package/dist/token/core/css-utils/a2-utils.css +21 -21
- package/dist/token/core/css-utils/font.css +21 -21
- package/dist/token/core/css-utils/utils.css +21 -21
- package/dist/{treeSync-DOen59wP.js → treeSync-CDHaWosp.js} +3 -3
- package/dist/{treeSync-DOen59wP.js.map → treeSync-CDHaWosp.js.map} +1 -1
- package/dist/use-reduced-motion-CqjZZ5QB.js.map +1 -1
- package/dist/{useAdaptiveView-DmhhcX-B.js → useAdaptiveView-BVvKVT5q.js} +5 -5
- package/dist/{useAdaptiveView-DmhhcX-B.js.map → useAdaptiveView-BVvKVT5q.js.map} +1 -1
- package/dist/useChipLayout-BBe6Tzyl.js +90 -0
- package/dist/useChipLayout-BBe6Tzyl.js.map +1 -0
- package/dist/{useDrillDownContext-iUvoTget.js → useDrillDownContext-D5_NjqY4.js} +2 -2
- package/dist/{useDrillDownContext-iUvoTget.js.map → useDrillDownContext-D5_NjqY4.js.map} +1 -1
- package/dist/{useDrilldown-UAm0-l1l.js → useDrilldown-CXFqySME.js} +39 -20
- package/dist/{useDrilldown-UAm0-l1l.js.map → useDrilldown-CXFqySME.js.map} +1 -1
- package/dist/{useInfiniteCombobox-V94SoOiU.js → useInfiniteCombobox-lT_gZZjN.js} +5 -5
- package/dist/{useInfiniteCombobox-V94SoOiU.js.map → useInfiniteCombobox-lT_gZZjN.js.map} +1 -1
- package/dist/{useInitialFocus-BUxEDMEG.js → useInitialFocus-BIvXK1Rp.js} +2 -2
- package/dist/{useInitialFocus-BUxEDMEG.js.map → useInitialFocus-BIvXK1Rp.js.map} +1 -1
- package/dist/{usePopoverTransitionStates-CDXCdyKa.js → usePopoverTransitionStates-B1opfxxn.js} +1 -2
- package/dist/{usePopoverTransitionStates-CDXCdyKa.js.map → usePopoverTransitionStates-B1opfxxn.js.map} +1 -1
- package/dist/useSize.js.map +1 -1
- package/package.json +8 -4
- package/dist/DrillDown.module-D1Bf9_yP.js +0 -27
- package/dist/MultiSelectFieldSync-HhFKGtQM.js.map +0 -1
- package/dist/MultiSelectMenuSync-C3Y7jnJQ.js.map +0 -1
- package/dist/SelectFieldSync-Dyug8Fgk.js.map +0 -1
- package/dist/SelectTriggerBase-rxHXMSb4.js.map +0 -1
- package/dist/SelectTriggerBase.module-Brmw1nYG.js +0 -39
- package/dist/SelectTriggerBase.module-Brmw1nYG.js.map +0 -1
- package/dist/Text-CIoD_RK4.js.map +0 -1
- package/dist/Text.module-BcVew1AQ.js +0 -23
- package/dist/Text.module-BcVew1AQ.js.map +0 -1
- package/dist/ThemeProvider-Sd8LK0A9.js.map +0 -1
- package/dist/TreeSelectFieldSync-Cd87uR6b.js.map +0 -1
- package/dist/bulkActionTypes-CWcUhKFS.js.map +0 -1
- package/dist/syncFilterUtils-YB6gRuuR.js.map +0 -1
- package/dist/useChipLayout-BWZfKDgd.js +0 -51
- package/dist/useChipLayout-BWZfKDgd.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-reduced-motion-CqjZZ5QB.js","sources":["../../../node_modules/.pnpm/framer-motion@12.23.12_@emotion+is-prop-valid@1.4.0_react-dom@18.
|
|
1
|
+
{"version":3,"file":"use-reduced-motion-CqjZZ5QB.js","sources":["../../../node_modules/.pnpm/framer-motion@12.23.12_@emotion+is-prop-valid@1.4.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.mjs"],"sourcesContent":["import { warnOnce } from 'motion-utils';\nimport { useState } from 'react';\nimport { initPrefersReducedMotion } from './index.mjs';\nimport { hasReducedMotionListener, prefersReducedMotion } from './state.mjs';\n\n/**\n * A hook that returns `true` if we should be using reduced motion based on the current device's Reduced Motion setting.\n *\n * This can be used to implement changes to your UI based on Reduced Motion. For instance, replacing motion-sickness inducing\n * `x`/`y` animations with `opacity`, disabling the autoplay of background videos, or turning off parallax motion.\n *\n * It will actively respond to changes and re-render your components with the latest setting.\n *\n * ```jsx\n * export function Sidebar({ isOpen }) {\n * const shouldReduceMotion = useReducedMotion()\n * const closedX = shouldReduceMotion ? 0 : \"-100%\"\n *\n * return (\n * <motion.div animate={{\n * opacity: isOpen ? 1 : 0,\n * x: isOpen ? 0 : closedX\n * }} />\n * )\n * }\n * ```\n *\n * @return boolean\n *\n * @public\n */\nfunction useReducedMotion() {\n /**\n * Lazy initialisation of prefersReducedMotion\n */\n !hasReducedMotionListener.current && initPrefersReducedMotion();\n const [shouldReduceMotion] = useState(prefersReducedMotion.current);\n if (process.env.NODE_ENV !== \"production\") {\n warnOnce(shouldReduceMotion !== true, \"You have Reduced Motion enabled on your device. Animations may not appear as expected.\", \"reduced-motion-disabled\");\n }\n /**\n * TODO See if people miss automatically updating shouldReduceMotion setting\n */\n return shouldReduceMotion;\n}\n\nexport { useReducedMotion };\n"],"names":[],"mappings":";;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,GAAG;AAC5B;AACA;AACA;AACA,IAAI,CAAC,wBAAwB,CAAC,OAAO,IAAI,wBAAwB,EAAE;AACnE,IAAI,MAAM,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC;AACvE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE;AAC/C,QAAQ,QAAQ,CAAC,kBAAkB,KAAK,IAAI,EAAE,wFAAwF,EAAE,yBAAyB,CAAC;AAClK,IAAI;AACJ;AACA;AACA;AACA,IAAI,OAAO,kBAAkB;AAC7B;;;;","x_google_ignoreList":[0]}
|
|
@@ -5,9 +5,9 @@ import { S as Spinner } from './Spinner-B7tTWcP6.js';
|
|
|
5
5
|
import { a as SvgCheckBoxOutlineBlank, S as SvgCheckBox } from './check_box-0U1tbEAd.js';
|
|
6
6
|
import { S as SvgIndeterminateCheckBox } from './indeterminate_check_box-jjLG4UY6.js';
|
|
7
7
|
import { F as Flex } from './Flex-CRF7gj0_.js';
|
|
8
|
-
import { T as Text } from './Text-
|
|
9
|
-
import { A as Avatar } from './Avatar-
|
|
10
|
-
import { C as Chip } from './Chip-
|
|
8
|
+
import { T as Text } from './Text-BT1MnQrn.js';
|
|
9
|
+
import { A as Avatar } from './Avatar-ioIwH1KT.js';
|
|
10
|
+
import { C as Chip } from './Chip-ZXGLaddL.js';
|
|
11
11
|
import { forwardRef, useRef, useCallback, useEffect, useState } from 'react';
|
|
12
12
|
import { a as useOnClickOutside } from './useOnClickOutside-Zw5vzxSq.js';
|
|
13
13
|
import { p as portalScopeClassNames } from './portalScopeClassNames-BTyv0FY8.js';
|
|
@@ -15,7 +15,7 @@ import { c as computePosition, o as offset, h as autoPlacement, a as size, b as
|
|
|
15
15
|
import { D as DialogCancelButton } from './DialogCancelButton-DBL0aKTK.js';
|
|
16
16
|
import { S as SvgClose } from './close-DZj38AEh.js';
|
|
17
17
|
import { D as DialogContext } from './DialogContext-DBgtApl9.js';
|
|
18
|
-
import { t as tabbable } from './usePopoverTransitionStates-
|
|
18
|
+
import { t as tabbable } from './usePopoverTransitionStates-B1opfxxn.js';
|
|
19
19
|
import { u as useDialogScrollLock } from './useDialogScrollLock-BW-aVboo.js';
|
|
20
20
|
import { u as useBreakpoint } from './useBreakpoint-BBNRlMGZ.js';
|
|
21
21
|
|
|
@@ -385,4 +385,4 @@ function useAdaptiveView() {
|
|
|
385
385
|
}
|
|
386
386
|
|
|
387
387
|
export { OptionsDialog as O, OptionsPopover as a, OptionRow as b, OptionRowSideContent as c, OptionCheckbox as d, OptionContentArea as e, useAdaptiveView as u };
|
|
388
|
-
//# sourceMappingURL=useAdaptiveView-
|
|
388
|
+
//# sourceMappingURL=useAdaptiveView-BVvKVT5q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdaptiveView-DmhhcX-B.js","sources":["../src/internal/components/OptionCheckbox.tsx","../src/internal/components/OptionRow.tsx","../src/internal/components/OptionContentArea.tsx","../src/internal/components/OptionsPopover/OptionsPopover.tsx","../src/internal/components/OptionsDialog/OptionsDialog.tsx","../src/beta/hooks/useAdaptiveView/useAdaptiveView.tsx"],"sourcesContent":["import cx from \"classnames\";\nimport { Icon } from \"../../components/Icon\";\nimport { Spinner } from \"../../components/Spinner\";\nimport CheckboxOutline from \"@servicetitan/hammer-icon/mdi/round/check_box_outline_blank.svg\";\nimport CheckboxChecked from \"@servicetitan/hammer-icon/mdi/round/check_box.svg\";\nimport CheckboxIndeterminate from \"@servicetitan/hammer-icon/mdi/round/indeterminate_check_box.svg\";\nimport type { CheckState } from \"../../types\";\nimport styles from \"./OptionCheckbox.module.scss\";\n\nexport type OptionCheckboxProps = {\n checkState: CheckState;\n className?: string;\n};\n\nconst iconMap = {\n checked: CheckboxChecked,\n unchecked: CheckboxOutline,\n indeterminate: CheckboxIndeterminate,\n} as const;\n\nexport function OptionCheckbox({ checkState, className }: OptionCheckboxProps) {\n if (checkState === \"loading\") {\n return (\n <span className={cx(styles[\"loading\"], className)}>\n <Spinner size=\"small\" aria-hidden=\"true\" />\n </span>\n );\n }\n\n return (\n <Icon\n aria-hidden=\"true\"\n size=\"large\"\n svg={iconMap[checkState]}\n className={cx(styles[\"checkbox\"], styles[checkState], className)}\n />\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./OptionRow.module.scss\";\n\nexport type OptionRowProps = ComponentPropsWithoutRef<\"div\"> & {\n disabled?: boolean;\n};\n\nexport const OptionRow = forwardRef<HTMLDivElement, OptionRowProps>(\n function OptionRow({ disabled, children, className, ...rest }, ref) {\n const optionRowClass = cx(\n styles[\"option-row\"],\n { [styles[\"disabled\"]]: disabled },\n className,\n );\n return (\n <div ref={ref} {...rest} className={optionRowClass}>\n {children}\n </div>\n );\n },\n);\n\nexport const OptionRowSideContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<\"div\"> & { children: ReactNode }\n>(function OptionRowSideContent({ children, className, ...rest }, ref) {\n const sideContentClass = cx(styles[\"side-content\"], className);\n return (\n <div ref={ref} {...rest} className={sideContentClass}>\n {children}\n </div>\n );\n});\n","import type { ReactNode } from \"react\";\nimport { Flex } from \"../../components/Flex\";\nimport { Text } from \"../../components/Text\";\nimport { Avatar } from \"../../components/Avatar\";\nimport { Chip } from \"../../components/Chip\";\nimport { Icon } from \"../../components/Icon\";\nimport type { OptionContent } from \"../types/optionContent\";\nimport { OptionRowSideContent } from \"./OptionRow\";\nimport styles from \"./OptionContentArea.module.scss\";\n\nexport type OptionContentAreaProps = {\n label: string;\n content?: OptionContent;\n children?: ReactNode;\n};\n\nexport function OptionContentArea({\n label,\n content,\n children,\n}: OptionContentAreaProps) {\n const hasAvatar = !!content?.avatar;\n const hasChips = !!content?.chips?.length;\n const hasIcon = !!content?.icon;\n\n return (\n <>\n {hasAvatar && (\n <OptionRowSideContent aria-hidden=\"true\">\n <Avatar size=\"medium\" {...content!.avatar!} />\n </OptionRowSideContent>\n )}\n <Flex grow={1} shrink={1} direction=\"column\" justifyContent=\"center\">\n <Text size=\"small\" className={styles[\"title\"]}>\n {content?.title ?? label}\n </Text>\n {content?.description && (\n <Text size=\"small\" className={styles[\"description\"]}>\n {content.description}\n </Text>\n )}\n {hasChips && (\n <Flex\n wrap=\"wrap\"\n gap=\"1\"\n className={styles[\"chips-row\"]}\n role=\"group\"\n aria-label=\"Tags\"\n >\n {content!.chips!.map((chip, i) => (\n <Chip key={`${chip.label}-${i}`} size=\"small\" {...chip} />\n ))}\n </Flex>\n )}\n {children}\n </Flex>\n {hasIcon && (\n <OptionRowSideContent>\n <Icon\n size=\"large\"\n svg={content!.icon!.svg}\n color={content!.icon!.color}\n aria-hidden={content!.icon!.label ? undefined : \"true\"}\n aria-label={content!.icon!.label}\n />\n </OptionRowSideContent>\n )}\n </>\n );\n}\n","import {\n type ReactNode,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\n\nimport {\n autoPlacement,\n autoUpdate,\n computePosition,\n offset,\n size,\n} from \"@floating-ui/react\";\n\nimport cx from \"classnames\";\n\nimport { useOnClickOutside } from \"../../hooks/useOnClickOutside/useOnClickOutside\";\nimport { portalScopeClassNames } from \"../../functions/portalScopeClassNames\";\n\nimport styles from \"./OptionsPopover.module.scss\";\n\nexport type OptionsPopoverProps = {\n id: string;\n children: ReactNode;\n referenceElement: RefObject<HTMLElement>;\n open: boolean;\n /**\n * Fired when the popover should close (click-outside, focus-out, or\n * Escape). On Escape, the popover restores focus to `referenceElement`\n * before invoking this callback; for other paths focus has already moved\n * elsewhere intentionally.\n */\n onClose: () => void;\n /** Controls the popover width strategy.\n * - `\"reference\"` — match the reference element's width\n * - `number` — fixed width in px\n * - `string` — any CSS width value (e.g. `\"20rem\"`)\n * - `undefined` (default) — intrinsic sizing (`max-content`)\n */\n width?: \"reference\" | number | string;\n /**\n * Optional content rendered as a full-bleed footer region inside the popover\n * shell, separated from the body by a top border. The popover suppresses its\n * own bottom padding so the footer can hug the popover's lower edge.\n */\n footer?: ReactNode;\n};\n\nfunction resolveWidth(\n width: OptionsPopoverProps[\"width\"],\n referenceWidth: number,\n): string | undefined {\n if (width === \"reference\") return `${referenceWidth}px`;\n if (typeof width === \"number\") return `${width}px`;\n if (typeof width === \"string\") return width;\n return undefined;\n}\n\nexport const OptionsPopover = (props: OptionsPopoverProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { id, children, referenceElement, open, onClose, width, footer } =\n props;\n\n // A single click-outside on a focusable element fires both the\n // useOnClickOutside (pointerup) path and the focusout path below. Dedupe\n // so onClose runs at most once per user action.\n const lastCloseRef = useRef(0);\n const safeClose = useCallback(() => {\n const now = Date.now();\n if (now - lastCloseRef.current < 50) return;\n lastCloseRef.current = now;\n onClose();\n }, [onClose]);\n\n useOnClickOutside({\n targets: [ref.current ?? undefined, referenceElement.current ?? undefined],\n onClickOutside: safeClose,\n disable: !open,\n });\n\n useEffect(() => {\n if (open) {\n ref.current?.showPopover();\n } else {\n ref.current?.hidePopover();\n }\n }, [open]);\n\n // Close when focus leaves the popover (and isn't moving to the trigger\n // element, which has its own click/focus handling). This is the keyboard\n // counterpart to useOnClickOutside.\n useEffect(() => {\n if (!open) return;\n const popoverEl = ref.current;\n if (!popoverEl) return;\n const handleFocusOut = (e: FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (!next) {\n // Focus moved to nothing tracked (e.g. body). Treat as exit.\n safeClose();\n return;\n }\n if (popoverEl.contains(next)) return;\n const trigger = referenceElement.current;\n if (trigger && trigger.contains(next)) return;\n safeClose();\n };\n popoverEl.addEventListener(\"focusout\", handleFocusOut);\n return () => popoverEl.removeEventListener(\"focusout\", handleFocusOut);\n }, [open, safeClose, referenceElement]);\n\n // Close on Escape from anywhere inside the popover (e.g. when focus is on\n // the footer button, where no host hook is listening). Focus is restored to\n // the reference element before onClose fires so consumers don't need to\n // manage trigger focus themselves. If a downstream handler (search input,\n // listbox) already handled Escape and called preventDefault, defer to it.\n useEffect(() => {\n if (!open) return;\n const popoverEl = ref.current;\n if (!popoverEl) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented) return;\n e.preventDefault();\n referenceElement.current?.focus();\n safeClose();\n };\n popoverEl.addEventListener(\"keydown\", handleKeyDown);\n return () => popoverEl.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, safeClose, referenceElement]);\n\n const updatePosition = useCallback(async () => {\n if (!ref.current || !referenceElement.current) return;\n const position = await computePosition(\n referenceElement.current,\n ref.current,\n {\n placement: \"bottom-start\",\n middleware: [\n offset(8),\n autoPlacement({\n allowedPlacements: [\n \"bottom-start\",\n \"bottom-end\",\n \"top-start\",\n \"top-end\",\n ],\n padding: 8,\n }),\n size({\n padding: 8,\n apply({ rects, elements, availableHeight, availableWidth }) {\n const resolved = resolveWidth(width, rects.reference.width);\n Object.assign(elements.floating.style, {\n ...(resolved != null && { width: resolved }),\n maxWidth: `${Math.max(0, availableWidth)}px`,\n maxHeight: `${Math.max(0, availableHeight)}px`,\n });\n },\n }),\n ],\n },\n );\n ref.current.style.left = `${position.x}px`;\n ref.current.style.top = `${position.y}px`;\n }, [ref, referenceElement, width]);\n\n useEffect(() => {\n if (!ref.current || !referenceElement.current || !open) return;\n const cleanup = autoUpdate(\n referenceElement.current,\n ref.current,\n updatePosition,\n );\n return () => {\n cleanup();\n };\n }, [referenceElement, ref, updatePosition, open]);\n\n return (\n <div\n ref={ref}\n id={id}\n className={cx(styles[\"options-popover\"], portalScopeClassNames)}\n popover=\"manual\"\n data-anv=\"popover-content\"\n data-anv-part=\"popover\"\n >\n <div className={styles[\"options-popover-body\"]}>{children}</div>\n {footer ? (\n <div className={styles[\"options-popover-footer\"]}>{footer}</div>\n ) : null}\n </div>\n );\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { Flex, type FocusableElement, Text } from \"../../..\";\nimport { DialogCancelButton } from \"../../../components/Dialog/DialogCancelButton\";\nimport styles from \"./OptionsDialog.module.scss\";\nimport Close from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport { DialogContext } from \"../../../components/Dialog/internal/DialogContext\";\nimport { useDialogScrollLock } from \"../..\";\nimport { tabbable } from \"tabbable\";\n\nexport const OptionsDialog = ({\n id,\n isOpen,\n onClose,\n field,\n children,\n title,\n initialFocusResolver,\n footer,\n}: {\n id: string;\n isOpen: boolean;\n onClose: () => void;\n title: string;\n field?: React.ReactNode;\n children: React.ReactNode;\n initialFocusResolver?: (focusables: FocusableElement[]) => FocusableElement;\n /** Optional content rendered below the dialog body. */\n footer?: React.ReactNode;\n}) => {\n const elRef = useRef<HTMLDialogElement>(null);\n const visualViewportHeightRef = useRef<HTMLDivElement>(null);\n\n useDialogScrollLock({\n open: isOpen,\n id,\n enableScrollChaining: false,\n elementRef: elRef,\n });\n\n const computeFocus = useCallback(\n (focusables: FocusableElement[]) => {\n if (initialFocusResolver) {\n return initialFocusResolver(focusables);\n }\n return (\n focusables.find(\n (focusable) => focusable.dataset.anv !== \"dialog-cancel-button\",\n ) || focusables[0]\n );\n },\n [initialFocusResolver],\n );\n\n useEffect(() => {\n if (isOpen) {\n elRef.current?.showModal();\n if (elRef.current) {\n computeFocus(tabbable(elRef.current)).focus();\n }\n } else {\n elRef.current?.close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Omitting computeFocus because we don't want to show/close the dialog on computeFocus change\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen) {\n const handleResize = () => {\n if (!visualViewportHeightRef.current) return;\n visualViewportHeightRef.current.style.height = `${window.visualViewport?.height ?? 0}px`;\n visualViewportHeightRef.current.style.maxHeight = `${window.visualViewport?.height ?? 0}px`;\n };\n window.visualViewport?.addEventListener(\"resize\", handleResize);\n return () => {\n window.visualViewport?.removeEventListener(\"resize\", handleResize);\n };\n }\n }, [isOpen]);\n\n return (\n <dialog\n ref={elRef}\n id={id}\n data-anv=\"field-dialog\"\n data-anv-part=\"dialog\"\n className={styles[\"field-dialog\"]}\n onKeyDown={(e) => {\n if (e.code === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }}\n >\n <div\n className={styles[\"field-dialog-visual-viewport-height\"]}\n ref={visualViewportHeightRef}\n >\n <Flex direction=\"row\" className={styles[\"header\"]}>\n <Text variant=\"headline\" el=\"h1\">\n {title}\n </Text>\n <span className={styles[\"close-container\"]}>\n <DialogContext.Provider value={{ close: onClose }}>\n <DialogCancelButton\n className={styles[\"close-button\"]}\n size=\"small\"\n appearance=\"ghost\"\n aria-label=\"Close dialog\"\n icon={Close}\n />\n </DialogContext.Provider>\n </span>\n </Flex>\n {field ? (\n <Flex direction=\"column\" className={styles[\"field\"]}>\n {field}\n </Flex>\n ) : null}\n <Flex direction=\"column\" className={styles[\"content\"]}>\n {children}\n </Flex>\n {footer ? <div className={styles[\"footer\"]}>{footer}</div> : null}\n </div>\n </dialog>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { useBreakpoint } from \"../../../hooks\";\n\n/**\n * The type of view to render based on device characteristics.\n */\nexport type AdaptiveView = \"mobile\" | \"desktop\";\n\n/**\n * Return type for the useAdaptiveView hook.\n */\nexport interface UseAdaptiveViewReturn {\n /**\n * The current adaptive view type.\n */\n view: AdaptiveView;\n /**\n * True when the device should use mobile-optimized UI (Dialog).\n */\n isMobile: boolean;\n /**\n * True when the device should use desktop-optimized UI (Popover).\n */\n isDesktop: boolean;\n}\n\n/**\n * Detects whether the primary pointer is coarse (touch) using CSS media query.\n * Returns false during SSR or when matchMedia is unavailable.\n */\nfunction detectCoarsePointer(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return false;\n }\n return window.matchMedia(\"(pointer: coarse)\").matches;\n}\n\n/**\n * Custom hook for detecting whether to use mobile or desktop UI patterns.\n *\n * This hook determines the optimal UI pattern (e.g., Dialog vs Popover) by combining:\n * - Screen size via useBreakpoint (viewport width)\n * - Pointer precision via CSS media query (pointer: coarse)\n *\n * A device is considered \"mobile\" when it has both:\n * - A small screen (below md breakpoint, < 768px)\n * - A coarse pointer (touch-primary input)\n *\n * This approach correctly identifies:\n * - Mobile phones → mobile view (Dialog)\n * - iPads/tablets → desktop view (Popover) due to larger screens\n * - Touch laptops → desktop view (Popover) due to fine pointer primary\n * - Desktop → desktop view (Popover)\n *\n * @returns Object containing view type and boolean flags for mobile/desktop\n *\n * @example\n * const { isMobile } = useAdaptiveView();\n *\n * return isMobile ? (\n * <Dialog>{children}</Dialog>\n * ) : (\n * <Popover>{children}</Popover>\n * );\n */\nexport function useAdaptiveView(): UseAdaptiveViewReturn {\n const breakpoint = useBreakpoint();\n const [hasCoarsePointer, setHasCoarsePointer] = useState(detectCoarsePointer);\n\n useEffect(() => {\n setHasCoarsePointer(detectCoarsePointer());\n\n // Listen for pointer capability changes (e.g., connecting/disconnecting a mouse)\n const mediaQuery = window.matchMedia(\"(pointer: coarse)\");\n const handleChange = (e: MediaQueryListEvent) => {\n setHasCoarsePointer(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const isSmallScreen = !breakpoint?.md;\n const isMobile = isSmallScreen && hasCoarsePointer;\n\n return {\n view: isMobile ? \"mobile\" : \"desktop\",\n isMobile,\n isDesktop: !isMobile,\n };\n}\n"],"names":["CheckboxChecked","CheckboxOutline","CheckboxIndeterminate","styles","OptionRow","OptionRowSideContent","Close"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAdaptiveView-BVvKVT5q.js","sources":["../src/internal/components/OptionCheckbox.tsx","../src/internal/components/OptionRow.tsx","../src/internal/components/OptionContentArea.tsx","../src/internal/components/OptionsPopover/OptionsPopover.tsx","../src/internal/components/OptionsDialog/OptionsDialog.tsx","../src/beta/hooks/useAdaptiveView/useAdaptiveView.tsx"],"sourcesContent":["import cx from \"classnames\";\nimport { Icon } from \"../../components/Icon\";\nimport { Spinner } from \"../../components/Spinner\";\nimport CheckboxOutline from \"@servicetitan/hammer-icon/mdi/round/check_box_outline_blank.svg\";\nimport CheckboxChecked from \"@servicetitan/hammer-icon/mdi/round/check_box.svg\";\nimport CheckboxIndeterminate from \"@servicetitan/hammer-icon/mdi/round/indeterminate_check_box.svg\";\nimport type { CheckState } from \"../../types\";\nimport styles from \"./OptionCheckbox.module.scss\";\n\nexport type OptionCheckboxProps = {\n checkState: CheckState;\n className?: string;\n};\n\nconst iconMap = {\n checked: CheckboxChecked,\n unchecked: CheckboxOutline,\n indeterminate: CheckboxIndeterminate,\n} as const;\n\nexport function OptionCheckbox({ checkState, className }: OptionCheckboxProps) {\n if (checkState === \"loading\") {\n return (\n <span className={cx(styles[\"loading\"], className)}>\n <Spinner size=\"small\" aria-hidden=\"true\" />\n </span>\n );\n }\n\n return (\n <Icon\n aria-hidden=\"true\"\n size=\"large\"\n svg={iconMap[checkState]}\n className={cx(styles[\"checkbox\"], styles[checkState], className)}\n />\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./OptionRow.module.scss\";\n\nexport type OptionRowProps = ComponentPropsWithoutRef<\"div\"> & {\n disabled?: boolean;\n};\n\nexport const OptionRow = forwardRef<HTMLDivElement, OptionRowProps>(\n function OptionRow({ disabled, children, className, ...rest }, ref) {\n const optionRowClass = cx(\n styles[\"option-row\"],\n { [styles[\"disabled\"]]: disabled },\n className,\n );\n return (\n <div ref={ref} {...rest} className={optionRowClass}>\n {children}\n </div>\n );\n },\n);\n\nexport const OptionRowSideContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<\"div\"> & { children: ReactNode }\n>(function OptionRowSideContent({ children, className, ...rest }, ref) {\n const sideContentClass = cx(styles[\"side-content\"], className);\n return (\n <div ref={ref} {...rest} className={sideContentClass}>\n {children}\n </div>\n );\n});\n","import type { ReactNode } from \"react\";\nimport { Flex } from \"../../components/Flex\";\nimport { Text } from \"../../components/Text\";\nimport { Avatar } from \"../../components/Avatar\";\nimport { Chip } from \"../../components/Chip\";\nimport { Icon } from \"../../components/Icon\";\nimport type { OptionContent } from \"../types/optionContent\";\nimport { OptionRowSideContent } from \"./OptionRow\";\nimport styles from \"./OptionContentArea.module.scss\";\n\nexport type OptionContentAreaProps = {\n label: string;\n content?: OptionContent;\n children?: ReactNode;\n};\n\nexport function OptionContentArea({\n label,\n content,\n children,\n}: OptionContentAreaProps) {\n const hasAvatar = !!content?.avatar;\n const hasChips = !!content?.chips?.length;\n const hasIcon = !!content?.icon;\n\n return (\n <>\n {hasAvatar && (\n <OptionRowSideContent aria-hidden=\"true\">\n <Avatar size=\"medium\" {...content!.avatar!} />\n </OptionRowSideContent>\n )}\n <Flex grow={1} shrink={1} direction=\"column\" justifyContent=\"center\">\n <Text size=\"small\" className={styles[\"title\"]}>\n {content?.title ?? label}\n </Text>\n {content?.description && (\n <Text size=\"small\" className={styles[\"description\"]}>\n {content.description}\n </Text>\n )}\n {hasChips && (\n <Flex\n wrap=\"wrap\"\n gap=\"1\"\n className={styles[\"chips-row\"]}\n role=\"group\"\n aria-label=\"Tags\"\n >\n {content!.chips!.map((chip, i) => (\n <Chip key={`${chip.label}-${i}`} size=\"small\" {...chip} />\n ))}\n </Flex>\n )}\n {children}\n </Flex>\n {hasIcon && (\n <OptionRowSideContent>\n <Icon\n size=\"large\"\n svg={content!.icon!.svg}\n color={content!.icon!.color}\n aria-hidden={content!.icon!.label ? undefined : \"true\"}\n aria-label={content!.icon!.label}\n />\n </OptionRowSideContent>\n )}\n </>\n );\n}\n","import {\n type ReactNode,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\n\nimport {\n autoPlacement,\n autoUpdate,\n computePosition,\n offset,\n size,\n} from \"@floating-ui/react\";\n\nimport cx from \"classnames\";\n\nimport { useOnClickOutside } from \"../../hooks/useOnClickOutside/useOnClickOutside\";\nimport { portalScopeClassNames } from \"../../functions/portalScopeClassNames\";\n\nimport styles from \"./OptionsPopover.module.scss\";\n\nexport type OptionsPopoverProps = {\n id: string;\n children: ReactNode;\n referenceElement: RefObject<HTMLElement>;\n open: boolean;\n /**\n * Fired when the popover should close (click-outside, focus-out, or\n * Escape). On Escape, the popover restores focus to `referenceElement`\n * before invoking this callback; for other paths focus has already moved\n * elsewhere intentionally.\n */\n onClose: () => void;\n /** Controls the popover width strategy.\n * - `\"reference\"` — match the reference element's width\n * - `number` — fixed width in px\n * - `string` — any CSS width value (e.g. `\"20rem\"`)\n * - `undefined` (default) — intrinsic sizing (`max-content`)\n */\n width?: \"reference\" | number | string;\n /**\n * Optional content rendered as a full-bleed footer region inside the popover\n * shell, separated from the body by a top border. The popover suppresses its\n * own bottom padding so the footer can hug the popover's lower edge.\n */\n footer?: ReactNode;\n};\n\nfunction resolveWidth(\n width: OptionsPopoverProps[\"width\"],\n referenceWidth: number,\n): string | undefined {\n if (width === \"reference\") return `${referenceWidth}px`;\n if (typeof width === \"number\") return `${width}px`;\n if (typeof width === \"string\") return width;\n return undefined;\n}\n\nexport const OptionsPopover = (props: OptionsPopoverProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { id, children, referenceElement, open, onClose, width, footer } =\n props;\n\n // A single click-outside on a focusable element fires both the\n // useOnClickOutside (pointerup) path and the focusout path below. Dedupe\n // so onClose runs at most once per user action.\n const lastCloseRef = useRef(0);\n const safeClose = useCallback(() => {\n const now = Date.now();\n if (now - lastCloseRef.current < 50) return;\n lastCloseRef.current = now;\n onClose();\n }, [onClose]);\n\n useOnClickOutside({\n targets: [ref.current ?? undefined, referenceElement.current ?? undefined],\n onClickOutside: safeClose,\n disable: !open,\n });\n\n useEffect(() => {\n if (open) {\n ref.current?.showPopover();\n } else {\n ref.current?.hidePopover();\n }\n }, [open]);\n\n // Close when focus leaves the popover (and isn't moving to the trigger\n // element, which has its own click/focus handling). This is the keyboard\n // counterpart to useOnClickOutside.\n useEffect(() => {\n if (!open) return;\n const popoverEl = ref.current;\n if (!popoverEl) return;\n const handleFocusOut = (e: FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (!next) {\n // Focus moved to nothing tracked (e.g. body). Treat as exit.\n safeClose();\n return;\n }\n if (popoverEl.contains(next)) return;\n const trigger = referenceElement.current;\n if (trigger && trigger.contains(next)) return;\n safeClose();\n };\n popoverEl.addEventListener(\"focusout\", handleFocusOut);\n return () => popoverEl.removeEventListener(\"focusout\", handleFocusOut);\n }, [open, safeClose, referenceElement]);\n\n // Close on Escape from anywhere inside the popover (e.g. when focus is on\n // the footer button, where no host hook is listening). Focus is restored to\n // the reference element before onClose fires so consumers don't need to\n // manage trigger focus themselves. If a downstream handler (search input,\n // listbox) already handled Escape and called preventDefault, defer to it.\n useEffect(() => {\n if (!open) return;\n const popoverEl = ref.current;\n if (!popoverEl) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented) return;\n e.preventDefault();\n referenceElement.current?.focus();\n safeClose();\n };\n popoverEl.addEventListener(\"keydown\", handleKeyDown);\n return () => popoverEl.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, safeClose, referenceElement]);\n\n const updatePosition = useCallback(async () => {\n if (!ref.current || !referenceElement.current) return;\n const position = await computePosition(\n referenceElement.current,\n ref.current,\n {\n placement: \"bottom-start\",\n middleware: [\n offset(8),\n autoPlacement({\n allowedPlacements: [\n \"bottom-start\",\n \"bottom-end\",\n \"top-start\",\n \"top-end\",\n ],\n padding: 8,\n }),\n size({\n padding: 8,\n apply({ rects, elements, availableHeight, availableWidth }) {\n const resolved = resolveWidth(width, rects.reference.width);\n Object.assign(elements.floating.style, {\n ...(resolved != null && { width: resolved }),\n maxWidth: `${Math.max(0, availableWidth)}px`,\n maxHeight: `${Math.max(0, availableHeight)}px`,\n });\n },\n }),\n ],\n },\n );\n ref.current.style.left = `${position.x}px`;\n ref.current.style.top = `${position.y}px`;\n }, [ref, referenceElement, width]);\n\n useEffect(() => {\n if (!ref.current || !referenceElement.current || !open) return;\n const cleanup = autoUpdate(\n referenceElement.current,\n ref.current,\n updatePosition,\n );\n return () => {\n cleanup();\n };\n }, [referenceElement, ref, updatePosition, open]);\n\n return (\n <div\n ref={ref}\n id={id}\n className={cx(styles[\"options-popover\"], portalScopeClassNames)}\n popover=\"manual\"\n data-anv=\"popover-content\"\n data-anv-part=\"popover\"\n >\n <div className={styles[\"options-popover-body\"]}>{children}</div>\n {footer ? (\n <div className={styles[\"options-popover-footer\"]}>{footer}</div>\n ) : null}\n </div>\n );\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { Flex, type FocusableElement, Text } from \"../../..\";\nimport { DialogCancelButton } from \"../../../components/Dialog/DialogCancelButton\";\nimport styles from \"./OptionsDialog.module.scss\";\nimport Close from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport { DialogContext } from \"../../../components/Dialog/internal/DialogContext\";\nimport { useDialogScrollLock } from \"../..\";\nimport { tabbable } from \"tabbable\";\n\nexport const OptionsDialog = ({\n id,\n isOpen,\n onClose,\n field,\n children,\n title,\n initialFocusResolver,\n footer,\n}: {\n id: string;\n isOpen: boolean;\n onClose: () => void;\n title: string;\n field?: React.ReactNode;\n children: React.ReactNode;\n initialFocusResolver?: (focusables: FocusableElement[]) => FocusableElement;\n /** Optional content rendered below the dialog body. */\n footer?: React.ReactNode;\n}) => {\n const elRef = useRef<HTMLDialogElement>(null);\n const visualViewportHeightRef = useRef<HTMLDivElement>(null);\n\n useDialogScrollLock({\n open: isOpen,\n id,\n enableScrollChaining: false,\n elementRef: elRef,\n });\n\n const computeFocus = useCallback(\n (focusables: FocusableElement[]) => {\n if (initialFocusResolver) {\n return initialFocusResolver(focusables);\n }\n return (\n focusables.find(\n (focusable) => focusable.dataset.anv !== \"dialog-cancel-button\",\n ) || focusables[0]\n );\n },\n [initialFocusResolver],\n );\n\n useEffect(() => {\n if (isOpen) {\n elRef.current?.showModal();\n if (elRef.current) {\n computeFocus(tabbable(elRef.current)).focus();\n }\n } else {\n elRef.current?.close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Omitting computeFocus because we don't want to show/close the dialog on computeFocus change\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen) {\n const handleResize = () => {\n if (!visualViewportHeightRef.current) return;\n visualViewportHeightRef.current.style.height = `${window.visualViewport?.height ?? 0}px`;\n visualViewportHeightRef.current.style.maxHeight = `${window.visualViewport?.height ?? 0}px`;\n };\n window.visualViewport?.addEventListener(\"resize\", handleResize);\n return () => {\n window.visualViewport?.removeEventListener(\"resize\", handleResize);\n };\n }\n }, [isOpen]);\n\n return (\n <dialog\n ref={elRef}\n id={id}\n data-anv=\"field-dialog\"\n data-anv-part=\"dialog\"\n className={styles[\"field-dialog\"]}\n onKeyDown={(e) => {\n if (e.code === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }}\n >\n <div\n className={styles[\"field-dialog-visual-viewport-height\"]}\n ref={visualViewportHeightRef}\n >\n <Flex direction=\"row\" className={styles[\"header\"]}>\n <Text variant=\"headline\" el=\"h1\">\n {title}\n </Text>\n <span className={styles[\"close-container\"]}>\n <DialogContext.Provider value={{ close: onClose }}>\n <DialogCancelButton\n className={styles[\"close-button\"]}\n size=\"small\"\n appearance=\"ghost\"\n aria-label=\"Close dialog\"\n icon={Close}\n />\n </DialogContext.Provider>\n </span>\n </Flex>\n {field ? (\n <Flex direction=\"column\" className={styles[\"field\"]}>\n {field}\n </Flex>\n ) : null}\n <Flex direction=\"column\" className={styles[\"content\"]}>\n {children}\n </Flex>\n {footer ? <div className={styles[\"footer\"]}>{footer}</div> : null}\n </div>\n </dialog>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { useBreakpoint } from \"../../../hooks\";\n\n/**\n * The type of view to render based on device characteristics.\n */\nexport type AdaptiveView = \"mobile\" | \"desktop\";\n\n/**\n * Return type for the useAdaptiveView hook.\n */\nexport interface UseAdaptiveViewReturn {\n /**\n * The current adaptive view type.\n */\n view: AdaptiveView;\n /**\n * True when the device should use mobile-optimized UI (Dialog).\n */\n isMobile: boolean;\n /**\n * True when the device should use desktop-optimized UI (Popover).\n */\n isDesktop: boolean;\n}\n\n/**\n * Detects whether the primary pointer is coarse (touch) using CSS media query.\n * Returns false during SSR or when matchMedia is unavailable.\n */\nfunction detectCoarsePointer(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return false;\n }\n return window.matchMedia(\"(pointer: coarse)\").matches;\n}\n\n/**\n * Custom hook for detecting whether to use mobile or desktop UI patterns.\n *\n * This hook determines the optimal UI pattern (e.g., Dialog vs Popover) by combining:\n * - Screen size via useBreakpoint (viewport width)\n * - Pointer precision via CSS media query (pointer: coarse)\n *\n * A device is considered \"mobile\" when it has both:\n * - A small screen (below md breakpoint, < 768px)\n * - A coarse pointer (touch-primary input)\n *\n * This approach correctly identifies:\n * - Mobile phones → mobile view (Dialog)\n * - iPads/tablets → desktop view (Popover) due to larger screens\n * - Touch laptops → desktop view (Popover) due to fine pointer primary\n * - Desktop → desktop view (Popover)\n *\n * @returns Object containing view type and boolean flags for mobile/desktop\n *\n * @example\n * const { isMobile } = useAdaptiveView();\n *\n * return isMobile ? (\n * <Dialog>{children}</Dialog>\n * ) : (\n * <Popover>{children}</Popover>\n * );\n */\nexport function useAdaptiveView(): UseAdaptiveViewReturn {\n const breakpoint = useBreakpoint();\n const [hasCoarsePointer, setHasCoarsePointer] = useState(detectCoarsePointer);\n\n useEffect(() => {\n setHasCoarsePointer(detectCoarsePointer());\n\n // Listen for pointer capability changes (e.g., connecting/disconnecting a mouse)\n const mediaQuery = window.matchMedia(\"(pointer: coarse)\");\n const handleChange = (e: MediaQueryListEvent) => {\n setHasCoarsePointer(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const isSmallScreen = !breakpoint?.md;\n const isMobile = isSmallScreen && hasCoarsePointer;\n\n return {\n view: isMobile ? \"mobile\" : \"desktop\",\n isMobile,\n isDesktop: !isMobile,\n };\n}\n"],"names":["CheckboxChecked","CheckboxOutline","CheckboxIndeterminate","styles","OptionRow","OptionRowSideContent","Close"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,MAAM,OAAA,GAAU;AAAA,EACd,OAAA,EAASA,WAAA;AAAA,EACT,SAAA,EAAWC,uBAAA;AAAA,EACX,aAAA,EAAeC;AACjB,CAAA;AAEO,SAAS,cAAA,CAAe,EAAE,UAAA,EAAY,SAAA,EAAU,EAAwB;AAC7E,EAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,IAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAGC,SAAO,SAAS,CAAA,EAAG,SAAS,CAAA,EAC9C,8BAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,OAAA,EAAQ,aAAA,EAAY,QAAO,CAAA,EAC3C,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,IAAA,EAAK,OAAA;AAAA,MACL,GAAA,EAAK,QAAQ,UAAU,CAAA;AAAA,MACvB,SAAA,EAAW,GAAGA,QAAA,CAAO,UAAU,GAAGA,QAAA,CAAO,UAAU,GAAG,SAAS;AAAA;AAAA,GACjE;AAEJ;;;;;;;;;ACzBO,MAAM,SAAA,GAAY,UAAA;AAAA,EACvB,SAASC,WAAU,EAAE,QAAA,EAAU,UAAU,SAAA,EAAW,GAAG,IAAA,EAAK,EAAG,GAAA,EAAK;AAClE,IAAA,MAAM,cAAA,GAAiB,EAAA;AAAA,MACrBD,SAAO,YAAY,CAAA;AAAA,MACnB,EAAE,CAACA,QAAA,CAAO,UAAU,CAAC,GAAG,QAAA,EAAS;AAAA,MACjC;AAAA,KACF;AACA,IAAA,2BACG,KAAA,EAAA,EAAI,GAAA,EAAW,GAAG,IAAA,EAAM,SAAA,EAAW,gBACjC,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;AAEO,MAAM,oBAAA,GAAuB,UAAA,CAGlC,SAASE,qBAAAA,CAAqB,EAAE,UAAU,SAAA,EAAW,GAAG,IAAA,EAAK,EAAG,GAAA,EAAK;AACrE,EAAA,MAAM,gBAAA,GAAmB,EAAA,CAAGF,QAAA,CAAO,cAAc,GAAG,SAAS,CAAA;AAC7D,EAAA,2BACG,KAAA,EAAA,EAAI,GAAA,EAAW,GAAG,IAAA,EAAM,SAAA,EAAW,kBACjC,QAAA,EACH,CAAA;AAEJ,CAAC;;;;;;;;;;ACrBM,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,OAAA,EAAS,MAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,OAAA,EAAS,KAAA,EAAO,MAAA;AACnC,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,OAAA,EAAS,IAAA;AAE3B,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,SAAA,oBACC,GAAA,CAAC,oBAAA,EAAA,EAAqB,aAAA,EAAY,MAAA,EAChC,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAU,GAAG,OAAA,CAAS,MAAA,EAAS,CAAA,EAC9C,CAAA;AAAA,oBAEF,IAAA,CAAC,QAAK,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAG,SAAA,EAAU,QAAA,EAAS,cAAA,EAAe,QAAA,EAC1D,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAK,OAAA,EAAQ,SAAA,EAAWA,SAAO,OAAO,CAAA,EACzC,QAAA,EAAA,OAAA,EAAS,KAAA,IAAS,KAAA,EACrB,CAAA;AAAA,MACC,OAAA,EAAS,WAAA,oBACR,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAWA,QAAA,CAAO,aAAa,CAAA,EAC/C,QAAA,EAAA,OAAA,CAAQ,WAAA,EACX,CAAA;AAAA,MAED,QAAA,oBACC,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,GAAA,EAAI,GAAA;AAAA,UACJ,SAAA,EAAWA,SAAO,WAAW,CAAA;AAAA,UAC7B,IAAA,EAAK,OAAA;AAAA,UACL,YAAA,EAAW,MAAA;AAAA,UAEV,kBAAS,KAAA,CAAO,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,yBACzB,IAAA,EAAA,EAAgC,IAAA,EAAK,OAAA,EAAS,GAAG,QAAvC,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,CAAC,EAA2B,CACzD;AAAA;AAAA,OACH;AAAA,MAED;AAAA,KAAA,EACH,CAAA;AAAA,IACC,OAAA,wBACE,oBAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,GAAA,EAAK,QAAS,IAAA,CAAM,GAAA;AAAA,QACpB,KAAA,EAAO,QAAS,IAAA,CAAM,KAAA;AAAA,QACtB,aAAA,EAAa,OAAA,CAAS,IAAA,CAAM,KAAA,GAAQ,MAAA,GAAY,MAAA;AAAA,QAChD,YAAA,EAAY,QAAS,IAAA,CAAM;AAAA;AAAA,KAC7B,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;;;;;ACnBA,SAAS,YAAA,CACP,OACA,cAAA,EACoB;AACpB,EAAA,IAAI,KAAA,KAAU,WAAA,EAAa,OAAO,CAAA,EAAG,cAAc,CAAA,EAAA,CAAA;AACnD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAC9C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,OAAO,MAAA;AACT;AAEO,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA+B;AAC5D,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,EAAE,IAAI,QAAA,EAAU,gBAAA,EAAkB,MAAM,OAAA,EAAS,KAAA,EAAO,QAAO,GACnE,KAAA;AAKF,EAAA,MAAM,YAAA,GAAe,OAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,YAAA,CAAa,OAAA,GAAU,EAAA,EAAI;AACrC,IAAA,YAAA,CAAa,OAAA,GAAU,GAAA;AACvB,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,iBAAA,CAAkB;AAAA,IAChB,SAAS,CAAC,GAAA,CAAI,WAAW,MAAA,EAAW,gBAAA,CAAiB,WAAW,MAAS,CAAA;AAAA,IACzE,cAAA,EAAgB,SAAA;AAAA,IAChB,SAAS,CAAC;AAAA,GACX,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,GAAA,CAAI,SAAS,WAAA,EAAY;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,SAAS,WAAA,EAAY;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAKT,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,YAAY,GAAA,CAAI,OAAA;AACtB,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAkB;AACxC,MAAA,MAAM,OAAO,CAAA,CAAE,aAAA;AACf,MAAA,IAAI,CAAC,IAAA,EAAM;AAET,QAAA,SAAA,EAAU;AACV,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAC9B,MAAA,MAAM,UAAU,gBAAA,CAAiB,OAAA;AACjC,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AACvC,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA;AACA,IAAA,SAAA,CAAU,gBAAA,CAAiB,YAAY,cAAc,CAAA;AACrD,IAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,UAAA,EAAY,cAAc,CAAA;AAAA,EACvE,CAAA,EAAG,CAAC,IAAA,EAAM,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAOtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,YAAY,GAAA,CAAI,OAAA;AACtB,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,gBAAA,EAAkB;AAC9C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,gBAAA,CAAiB,SAAS,KAAA,EAAM;AAChC,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA;AACA,IAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,aAAa,CAAA;AACnD,IAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACrE,CAAA,EAAG,CAAC,IAAA,EAAM,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAEtC,EAAA,MAAM,cAAA,GAAiB,YAAY,YAAY;AAC7C,IAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAW,CAAC,iBAAiB,OAAA,EAAS;AAC/C,IAAA,MAAM,WAAW,MAAM,eAAA;AAAA,MACrB,gBAAA,CAAiB,OAAA;AAAA,MACjB,GAAA,CAAI,OAAA;AAAA,MACJ;AAAA,QACE,SAAA,EAAW,cAAA;AAAA,QACX,UAAA,EAAY;AAAA,UACV,OAAO,CAAC,CAAA;AAAA,UACR,aAAA,CAAc;AAAA,YACZ,iBAAA,EAAmB;AAAA,cACjB,cAAA;AAAA,cACA,YAAA;AAAA,cACA,WAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,UACD,IAAA,CAAK;AAAA,YACH,OAAA,EAAS,CAAA;AAAA,YACT,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,eAAA,EAAiB,gBAAe,EAAG;AAC1D,cAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,UAAU,KAAK,CAAA;AAC1D,cAAA,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,KAAA,EAAO;AAAA,gBACrC,GAAI,QAAA,IAAY,IAAA,IAAQ,EAAE,OAAO,QAAA,EAAS;AAAA,gBAC1C,UAAU,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,CAAC,CAAA,EAAA,CAAA;AAAA,gBACxC,WAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAe,CAAC,CAAA,EAAA;AAAA,eAC3C,CAAA;AAAA,YACH;AAAA,WACD;AAAA;AACH;AACF,KACF;AACA,IAAA,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,SAAS,CAAC,CAAA,EAAA,CAAA;AACtC,IAAA,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,GAAA,EAAK,gBAAA,EAAkB,KAAK,CAAC,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAW,CAAC,gBAAA,CAAiB,OAAA,IAAW,CAAC,IAAA,EAAM;AACxD,IAAA,MAAM,OAAA,GAAU,UAAA;AAAA,MACd,gBAAA,CAAiB,OAAA;AAAA,MACjB,GAAA,CAAI,OAAA;AAAA,MACJ;AAAA,KACF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,EACF,GAAG,CAAC,gBAAA,EAAkB,GAAA,EAAK,cAAA,EAAgB,IAAI,CAAC,CAAA;AAEhD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,EAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAGA,QAAA,CAAO,iBAAiB,GAAG,qBAAqB,CAAA;AAAA,MAC9D,OAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAS,iBAAA;AAAA,MACT,eAAA,EAAc,SAAA;AAAA,MAEd,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWA,QAAA,CAAO,sBAAsB,GAAI,QAAA,EAAS,CAAA;AAAA,QACzD,MAAA,uBACE,KAAA,EAAA,EAAI,SAAA,EAAWA,SAAO,wBAAwB,CAAA,EAAI,kBAAO,CAAA,GACxD;AAAA;AAAA;AAAA,GACN;AAEJ;;;;;;;;;;;;;;;AC1LO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,EAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,KAUM;AACJ,EAAA,MAAM,KAAA,GAAQ,OAA0B,IAAI,CAAA;AAC5C,EAAA,MAAM,uBAAA,GAA0B,OAAuB,IAAI,CAAA;AAE3D,EAAA,mBAAA,CAAoB;AAAA,IAClB,IAAA,EAAM,MAAA;AAAA,IACN,EAAA;AAAA,IACA,oBAAA,EAAsB,KAAA;AAAA,IACtB,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,UAAA,KAAmC;AAClC,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,OAAO,qBAAqB,UAAU,CAAA;AAAA,MACxC;AACA,MAAA,OACE,UAAA,CAAW,IAAA;AAAA,QACT,CAAC,SAAA,KAAc,SAAA,CAAU,OAAA,CAAQ,GAAA,KAAQ;AAAA,OAC3C,IAAK,WAAW,CAAC,CAAA;AAAA,IAErB,CAAA;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,CAAM,SAAS,SAAA,EAAU;AACzB,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,YAAA,CAAa,QAAA,CAAS,KAAA,CAAM,OAAO,CAAC,EAAE,KAAA,EAAM;AAAA,MAC9C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAS,KAAA,EAAM;AAAA,IACvB;AAAA,EAEF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,eAAe,MAAM;AACzB,QAAA,IAAI,CAAC,wBAAwB,OAAA,EAAS;AACtC,QAAA,uBAAA,CAAwB,QAAQ,KAAA,CAAM,MAAA,GAAS,GAAG,MAAA,CAAO,cAAA,EAAgB,UAAU,CAAC,CAAA,EAAA,CAAA;AACpF,QAAA,uBAAA,CAAwB,QAAQ,KAAA,CAAM,SAAA,GAAY,GAAG,MAAA,CAAO,cAAA,EAAgB,UAAU,CAAC,CAAA,EAAA,CAAA;AAAA,MACzF,CAAA;AACA,MAAA,MAAA,CAAO,cAAA,EAAgB,gBAAA,CAAiB,QAAA,EAAU,YAAY,CAAA;AAC9D,MAAA,OAAO,MAAM;AACX,QAAA,MAAA,CAAO,cAAA,EAAgB,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,MACnE,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,KAAA;AAAA,MACL,EAAA;AAAA,MACA,UAAA,EAAS,cAAA;AAAA,MACT,eAAA,EAAc,QAAA;AAAA,MACd,SAAA,EAAW,OAAO,cAAc,CAAA;AAAA,MAChC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAAA,MAEA,QAAA,kBAAA,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,OAAO,qCAAqC,CAAA;AAAA,UACvD,GAAA,EAAK,uBAAA;AAAA,UAEL,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,QAAK,SAAA,EAAU,KAAA,EAAM,SAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,EAC9C,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,UAAA,EAAW,EAAA,EAAG,MACzB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,8BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,iBAAiB,CAAA,EACvC,QAAA,kBAAA,GAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,KAAA,EAAO,EAAE,KAAA,EAAO,SAAQ,EAC9C,QAAA,kBAAA,GAAA;AAAA,gBAAC,kBAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,OAAO,cAAc,CAAA;AAAA,kBAChC,IAAA,EAAK,OAAA;AAAA,kBACL,UAAA,EAAW,OAAA;AAAA,kBACX,YAAA,EAAW,cAAA;AAAA,kBACX,IAAA,EAAMG;AAAA;AAAA,iBAEV,CAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,YACC,KAAA,mBACC,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,WAAW,MAAA,CAAO,OAAO,CAAA,EAC/C,QAAA,EAAA,KAAA,EACH,CAAA,GACE,IAAA;AAAA,4BACJ,GAAA,CAAC,QAAK,SAAA,EAAU,QAAA,EAAS,WAAW,MAAA,CAAO,SAAS,GACjD,QAAA,EACH,CAAA;AAAA,YACC,MAAA,uBAAU,KAAA,EAAA,EAAI,SAAA,EAAW,OAAO,QAAQ,CAAA,EAAI,kBAAO,CAAA,GAAS;AAAA;AAAA;AAAA;AAC/D;AAAA,GACF;AAEJ;;AC/FA,SAAS,mBAAA,GAA+B;AACtC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,UAAA,EAAY;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,mBAAmB,CAAA,CAAE,OAAA;AAChD;AA8BO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,mBAAmB,CAAA;AAE5E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,qBAAqB,CAAA;AAGzC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,mBAAmB,CAAA;AACxD,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2B;AAC/C,MAAA,mBAAA,CAAoB,EAAE,OAAO,CAAA;AAAA,IAC/B,CAAA;AAEA,IAAA,UAAA,CAAW,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAClD,IAAA,OAAO,MAAM,UAAA,CAAW,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EACpE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,CAAC,UAAA,EAAY,EAAA;AACnC,EAAA,MAAM,WAAW,aAAA,IAAiB,gBAAA;AAElC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAW,QAAA,GAAW,SAAA;AAAA,IAC5B,QAAA;AAAA,IACA,WAAW,CAAC;AAAA,GACd;AACF;;;;"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { useRef, useState, useLayoutEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const hasMultipleRows = (container) => {
|
|
4
|
+
const children = Array.from(container.children);
|
|
5
|
+
if (children.length <= 1) return false;
|
|
6
|
+
const firstTop = children[0].getBoundingClientRect().top;
|
|
7
|
+
return children.some(
|
|
8
|
+
(child) => child.getBoundingClientRect().top !== firstTop
|
|
9
|
+
);
|
|
10
|
+
};
|
|
11
|
+
function useChipLayout({
|
|
12
|
+
selectedOptionsLength,
|
|
13
|
+
singleRow,
|
|
14
|
+
maxChips
|
|
15
|
+
}) {
|
|
16
|
+
const rowsRef = useRef(null);
|
|
17
|
+
const [visibleCount, setVisibleCount] = useState(null);
|
|
18
|
+
const [remeasureToken, setRemeasureToken] = useState(0);
|
|
19
|
+
const growExhaustedRef = useRef(false);
|
|
20
|
+
const lastWidthRef = useRef(null);
|
|
21
|
+
const prevSelectedLengthRef = useRef(selectedOptionsLength);
|
|
22
|
+
useLayoutEffect(() => {
|
|
23
|
+
if (prevSelectedLengthRef.current !== selectedOptionsLength) {
|
|
24
|
+
prevSelectedLengthRef.current = selectedOptionsLength;
|
|
25
|
+
growExhaustedRef.current = false;
|
|
26
|
+
setVisibleCount(null);
|
|
27
|
+
}
|
|
28
|
+
}, [selectedOptionsLength]);
|
|
29
|
+
useLayoutEffect(() => {
|
|
30
|
+
if (!singleRow) {
|
|
31
|
+
lastWidthRef.current = null;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const container = rowsRef.current;
|
|
35
|
+
if (!container) return;
|
|
36
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
37
|
+
const observer = new ResizeObserver((entries) => {
|
|
38
|
+
const width = entries[0]?.contentRect.width;
|
|
39
|
+
if (width === void 0) return;
|
|
40
|
+
if (lastWidthRef.current === width) return;
|
|
41
|
+
lastWidthRef.current = width;
|
|
42
|
+
growExhaustedRef.current = false;
|
|
43
|
+
setRemeasureToken((token) => token + 1);
|
|
44
|
+
});
|
|
45
|
+
lastWidthRef.current = container.getBoundingClientRect().width;
|
|
46
|
+
observer.observe(container);
|
|
47
|
+
return () => {
|
|
48
|
+
observer.disconnect();
|
|
49
|
+
};
|
|
50
|
+
}, [singleRow]);
|
|
51
|
+
useLayoutEffect(() => {
|
|
52
|
+
if (!singleRow || !rowsRef.current) {
|
|
53
|
+
setVisibleCount(null);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const maxAllowed2 = maxChips ?? 10;
|
|
57
|
+
const container = rowsRef.current;
|
|
58
|
+
if (visibleCount === null) {
|
|
59
|
+
if (hasMultipleRows(container)) {
|
|
60
|
+
const firstRowTop = container.children[0]?.getBoundingClientRect().top;
|
|
61
|
+
const firstRowCount = Array.from(container.children).filter(
|
|
62
|
+
(c) => c.getBoundingClientRect().top === firstRowTop
|
|
63
|
+
).length;
|
|
64
|
+
setVisibleCount(Math.max(firstRowCount - 1, 0));
|
|
65
|
+
}
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (hasMultipleRows(container) && visibleCount > 0) {
|
|
69
|
+
growExhaustedRef.current = true;
|
|
70
|
+
setVisibleCount(visibleCount - 1);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!growExhaustedRef.current && !hasMultipleRows(container) && visibleCount < selectedOptionsLength && visibleCount < maxAllowed2) {
|
|
74
|
+
setVisibleCount(visibleCount + 1);
|
|
75
|
+
}
|
|
76
|
+
}, [
|
|
77
|
+
singleRow,
|
|
78
|
+
selectedOptionsLength,
|
|
79
|
+
visibleCount,
|
|
80
|
+
remeasureToken,
|
|
81
|
+
maxChips
|
|
82
|
+
]);
|
|
83
|
+
const maxAllowed = maxChips ?? 10;
|
|
84
|
+
const displayCount = singleRow && visibleCount !== null ? Math.min(visibleCount, maxAllowed) : Math.min(selectedOptionsLength, maxAllowed);
|
|
85
|
+
const hiddenCount = selectedOptionsLength - displayCount;
|
|
86
|
+
return { rowsRef, displayCount, hiddenCount };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { useChipLayout as u };
|
|
90
|
+
//# sourceMappingURL=useChipLayout-BBe6Tzyl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChipLayout-BBe6Tzyl.js","sources":["../src/components/MultiSelectField/internal/useChipLayout.ts"],"sourcesContent":["import { useState, useLayoutEffect, useRef, type RefObject } from \"react\";\n\nconst hasMultipleRows = (container: HTMLElement) => {\n const children = Array.from(container.children);\n if (children.length <= 1) return false;\n const firstTop = children[0].getBoundingClientRect().top;\n return children.some(\n (child) => child.getBoundingClientRect().top !== firstTop,\n );\n};\n\ntype UseChipLayoutOptions = {\n selectedOptionsLength: number;\n singleRow?: boolean;\n maxChips?: number;\n};\n\n/**\n * Manages chip layout calculations shared between MultiSelectFieldInput and\n * MultiSelectFieldTrigger. Handles single-row overflow detection, visible chip\n * count, and the \"+N\" hidden chip indicator.\n * @param options - Configuration for chip layout behaviour\n * @returns rowsRef to attach to the chip container, plus computed display/hidden counts\n */\nexport function useChipLayout({\n selectedOptionsLength,\n singleRow,\n maxChips,\n}: UseChipLayoutOptions): {\n rowsRef: RefObject<HTMLDivElement>;\n displayCount: number;\n hiddenCount: number;\n} {\n const rowsRef = useRef<HTMLDivElement>(null);\n const [visibleCount, setVisibleCount] = useState<number | null>(null);\n // Bumped on container width changes so layout recalculates without resetting\n // to \"show all chips\" (that reset is what put the input on a second row).\n const [remeasureToken, setRemeasureToken] = useState(0);\n // After a failed grow attempt, stop trying to add chips until the next resize\n // or selection change (avoids +1/-1 oscillation).\n const growExhaustedRef = useRef(false);\n const lastWidthRef = useRef<number | null>(null);\n\n const prevSelectedLengthRef = useRef(selectedOptionsLength);\n useLayoutEffect(() => {\n if (prevSelectedLengthRef.current !== selectedOptionsLength) {\n prevSelectedLengthRef.current = selectedOptionsLength;\n growExhaustedRef.current = false;\n setVisibleCount(null);\n }\n }, [selectedOptionsLength]);\n\n // Remeasure when the rows container width changes so singleRow stays one\n // row on shrink and restores chips on grow (without a selection change).\n useLayoutEffect(() => {\n if (!singleRow) {\n lastWidthRef.current = null;\n return;\n }\n\n const container = rowsRef.current;\n if (!container) return;\n\n if (typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width === undefined) return;\n if (lastWidthRef.current === width) return;\n lastWidthRef.current = width;\n // Allow grow attempts again; shrink/grow from the current count instead of\n // flashing every chip (which wraps the input before React can paint).\n growExhaustedRef.current = false;\n setRemeasureToken((token) => token + 1);\n });\n\n lastWidthRef.current = container.getBoundingClientRect().width;\n observer.observe(container);\n\n return () => {\n observer.disconnect();\n };\n }, [singleRow]);\n\n useLayoutEffect(() => {\n if (!singleRow || !rowsRef.current) {\n setVisibleCount(null);\n return;\n }\n\n const maxAllowed = maxChips ?? 10;\n const container = rowsRef.current;\n\n if (visibleCount === null) {\n if (hasMultipleRows(container)) {\n const firstRowTop = container.children[0]?.getBoundingClientRect().top;\n const firstRowCount = Array.from(container.children).filter(\n (c) => c.getBoundingClientRect().top === firstRowTop,\n ).length;\n setVisibleCount(Math.max(firstRowCount - 1, 0));\n }\n return;\n }\n\n // Too many chips for the current width — remove one and re-check.\n if (hasMultipleRows(container) && visibleCount > 0) {\n growExhaustedRef.current = true;\n setVisibleCount(visibleCount - 1);\n return;\n }\n\n // Room to show another chip after a widen — try one more, then back off if\n // it wraps (growExhaustedRef prevents oscillation).\n if (\n !growExhaustedRef.current &&\n !hasMultipleRows(container) &&\n visibleCount < selectedOptionsLength &&\n visibleCount < maxAllowed\n ) {\n setVisibleCount(visibleCount + 1);\n }\n }, [\n singleRow,\n selectedOptionsLength,\n visibleCount,\n remeasureToken,\n maxChips,\n ]);\n\n const maxAllowed = maxChips ?? 10;\n const displayCount =\n singleRow && visibleCount !== null\n ? Math.min(visibleCount, maxAllowed)\n : Math.min(selectedOptionsLength, maxAllowed);\n const hiddenCount = selectedOptionsLength - displayCount;\n\n return { rowsRef, displayCount, hiddenCount };\n}\n"],"names":["maxAllowed"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useContext } from 'react';
|
|
2
|
-
import { D as DrillDownContext } from './DrillDown.module-
|
|
2
|
+
import { D as DrillDownContext } from './DrillDown.module-1VBKDZRA.js';
|
|
3
3
|
|
|
4
4
|
function useDrillDownContext() {
|
|
5
5
|
const context = useContext(DrillDownContext);
|
|
@@ -12,4 +12,4 @@ function useDrillDownContext() {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export { useDrillDownContext as u };
|
|
15
|
-
//# sourceMappingURL=useDrillDownContext-
|
|
15
|
+
//# sourceMappingURL=useDrillDownContext-D5_NjqY4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDrillDownContext-
|
|
1
|
+
{"version":3,"file":"useDrillDownContext-D5_NjqY4.js","sources":["../src/components/DrillDown/internal/useDrillDownContext.ts"],"sourcesContent":["import { useContext } from \"react\";\nimport { DrillDownContext } from \"./DrillDownContext\";\n\nexport function useDrillDownContext() {\n const context = useContext(DrillDownContext);\n if (!context) {\n throw new Error(\n \"useDrillDownContext must be used within a DrillDownContextProvider\",\n );\n }\n return context;\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,mBAAA,GAAsB;AACpC,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;;"}
|
|
@@ -2,12 +2,12 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import React__default, { forwardRef, useRef, useEffect, useCallback } from 'react';
|
|
4
4
|
import { a as getAugmentedNamespace, c as cx } from './index-De1g9FRV.js';
|
|
5
|
-
import { d as drillDownStyles } from './DrillDown.module-
|
|
6
|
-
import { t as tabbable, f as focusable, i as isTabbable, g as getTabIndex, b as isFocusable, c as index_esm } from './usePopoverTransitionStates-
|
|
7
|
-
import { u as useDrillDownContext } from './useDrillDownContext-
|
|
5
|
+
import { d as drillDownStyles } from './DrillDown.module-1VBKDZRA.js';
|
|
6
|
+
import { t as tabbable, f as focusable, i as isTabbable, g as getTabIndex, b as isFocusable, c as index_esm } from './usePopoverTransitionStates-B1opfxxn.js';
|
|
7
|
+
import { u as useDrillDownContext } from './useDrillDownContext-D5_NjqY4.js';
|
|
8
8
|
import { F as Flex } from './Flex-CRF7gj0_.js';
|
|
9
9
|
import { B as Button } from './Button-Dwh_Nd4l.js';
|
|
10
|
-
import { T as Text } from './Text-
|
|
10
|
+
import { T as Text } from './Text-BT1MnQrn.js';
|
|
11
11
|
import { S as SvgClose } from './close-DZj38AEh.js';
|
|
12
12
|
import { c as childrenToString } from './childrenToString-Bz9MqbHb.js';
|
|
13
13
|
import { useTrackingId } from './useTrackingId.js';
|
|
@@ -1698,8 +1698,17 @@ const DrillDownHeader = forwardRef(
|
|
|
1698
1698
|
DrillDownHeader.displayName = "DrillDownHeader";
|
|
1699
1699
|
|
|
1700
1700
|
const DrillDownContent = forwardRef((props, ref) => {
|
|
1701
|
-
const { className, ...rest } = props;
|
|
1702
|
-
return /* @__PURE__ */ jsx(
|
|
1701
|
+
const { className, children, ...rest } = props;
|
|
1702
|
+
return /* @__PURE__ */ jsx(
|
|
1703
|
+
"div",
|
|
1704
|
+
{
|
|
1705
|
+
className: cx(drillDownStyles["content"], className),
|
|
1706
|
+
"data-anv": "drilldown-content",
|
|
1707
|
+
ref,
|
|
1708
|
+
...rest,
|
|
1709
|
+
children
|
|
1710
|
+
}
|
|
1711
|
+
);
|
|
1703
1712
|
});
|
|
1704
1713
|
DrillDownContent.displayName = "DrillDownContent";
|
|
1705
1714
|
|
|
@@ -1833,25 +1842,35 @@ const DrillDown = Object.assign(
|
|
|
1833
1842
|
setOnClose?.(onClose, indexProp);
|
|
1834
1843
|
}
|
|
1835
1844
|
}, [setOnClose, onClose, indexProp]);
|
|
1836
|
-
return isActiveScreen ? /* @__PURE__ */ jsx(
|
|
1837
|
-
|
|
1845
|
+
return isActiveScreen ? /* @__PURE__ */ jsx(
|
|
1846
|
+
"div",
|
|
1838
1847
|
{
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
},
|
|
1848
|
+
className: cx(drillDownStyles["drilldown"], className),
|
|
1849
|
+
"data-anv": "drilldown",
|
|
1850
|
+
ref,
|
|
1851
|
+
...rest,
|
|
1844
1852
|
children: /* @__PURE__ */ jsx(
|
|
1845
|
-
|
|
1853
|
+
focusTrapReactExports.FocusTrap,
|
|
1846
1854
|
{
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1855
|
+
active: hostIsInteractive && interactive,
|
|
1856
|
+
focusTrapOptions: {
|
|
1857
|
+
returnFocusOnDeactivate: false,
|
|
1858
|
+
fallbackFocus: () => sectionRef.current ?? document.body
|
|
1859
|
+
},
|
|
1860
|
+
children: /* @__PURE__ */ jsx(
|
|
1861
|
+
"section",
|
|
1862
|
+
{
|
|
1863
|
+
className: drillDownStyles["container"],
|
|
1864
|
+
"data-anv": "drilldown-container",
|
|
1865
|
+
ref: sectionRef,
|
|
1866
|
+
tabIndex: -1,
|
|
1867
|
+
children
|
|
1868
|
+
}
|
|
1869
|
+
)
|
|
1851
1870
|
}
|
|
1852
1871
|
)
|
|
1853
1872
|
}
|
|
1854
|
-
)
|
|
1873
|
+
) : null;
|
|
1855
1874
|
}
|
|
1856
1875
|
),
|
|
1857
1876
|
{
|
|
@@ -1892,4 +1911,4 @@ function useDrillDown() {
|
|
|
1892
1911
|
}
|
|
1893
1912
|
|
|
1894
1913
|
export { DrillDown as D, DrillDownHeader as a, DrillDownContent as b, DrillDownFooter as c, DrillDownNextButton as d, DrillDownPrevButton as e, useDrillDown as u };
|
|
1895
|
-
//# sourceMappingURL=useDrilldown-
|
|
1914
|
+
//# sourceMappingURL=useDrilldown-CXFqySME.js.map
|