@servicetitan/anvil2 3.13.1 → 3.13.3
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 +19 -0
- package/dist/{AiMark-DkHvwBwf.js → AiMark-ByzCOJ1h.js} +5 -5
- package/dist/{AiMark-DkHvwBwf.js.map → AiMark-ByzCOJ1h.js.map} +1 -1
- package/dist/AiMark.js +1 -1
- package/dist/{Alert-C7Y5DG99.js → Alert-DtU9dbmz.js} +2 -2
- package/dist/{Alert-C7Y5DG99.js.map → Alert-DtU9dbmz.js.map} +1 -1
- package/dist/Alert.js +1 -1
- package/dist/{AnvilProvider-CgYBk3YP.js → AnvilProvider-DMiXqhL4.js} +3 -3
- package/dist/{AnvilProvider-CgYBk3YP.js.map → AnvilProvider-DMiXqhL4.js.map} +1 -1
- package/dist/AnvilProvider.js +1 -1
- package/dist/{Breadcrumbs-d1lHjb_U.js → Breadcrumbs-CIKIEq9H.js} +2 -2
- package/dist/{Breadcrumbs-d1lHjb_U.js.map → Breadcrumbs-CIKIEq9H.js.map} +1 -1
- package/dist/Breadcrumbs.js +1 -1
- package/dist/{Calendar-Db-cjtFN.js → Calendar-C0xoZZge.js} +2 -2
- package/dist/{Calendar-Db-cjtFN.js.map → Calendar-C0xoZZge.js.map} +1 -1
- package/dist/{Calendar-DCyfWmSV.js → Calendar-DG0mwBfm.js} +2 -2
- package/dist/{Calendar-DCyfWmSV.js.map → Calendar-DG0mwBfm.js.map} +1 -1
- package/dist/Calendar.js +2 -2
- package/dist/{Checkbox-CHVDkrNO.js → Checkbox-BmMJ1cZX.js} +2 -2
- package/dist/{Checkbox-CHVDkrNO.js.map → Checkbox-BmMJ1cZX.js.map} +1 -1
- package/dist/{Checkbox-BP2sw3SJ.js → Checkbox-DDGDVzsz.js} +3 -3
- package/dist/{Checkbox-BP2sw3SJ.js.map → Checkbox-DDGDVzsz.js.map} +1 -1
- package/dist/Checkbox.js +1 -1
- package/dist/{Chip-B3pbD3hQ.js → Chip-DR6fqTHq.js} +2 -2
- package/dist/{Chip-B3pbD3hQ.js.map → Chip-DR6fqTHq.js.map} +1 -1
- package/dist/Chip.js +1 -1
- package/dist/Combobox.js +1 -1
- package/dist/{DataTable-Cl_sbvzn.js → DataTable-CNhm17Dh.js} +10 -10
- package/dist/{DataTable-Cl_sbvzn.js.map → DataTable-CNhm17Dh.js.map} +1 -1
- package/dist/{DateFieldRange-DCHAzabV.js → DateFieldRange-CTAVMszB.js} +4 -4
- package/dist/{DateFieldRange-DCHAzabV.js.map → DateFieldRange-CTAVMszB.js.map} +1 -1
- package/dist/DateFieldRange.js +1 -1
- package/dist/{DateFieldSingle-TGaSOGki.js → DateFieldSingle-xpye28Jn.js} +4 -4
- package/dist/{DateFieldSingle-TGaSOGki.js.map → DateFieldSingle-xpye28Jn.js.map} +1 -1
- package/dist/DateFieldSingle.js +1 -1
- package/dist/{DateFieldYearless-eKv8F4KX.js → DateFieldYearless-CqjxABxj.js} +4 -4
- package/dist/{DateFieldYearless-eKv8F4KX.js.map → DateFieldYearless-CqjxABxj.js.map} +1 -1
- package/dist/DateFieldYearless.js +1 -1
- package/dist/{DateFieldYearlessRange-Cl2pWyFn.js → DateFieldYearlessRange-_633hUT2.js} +3 -3
- package/dist/{DateFieldYearlessRange-Cl2pWyFn.js.map → DateFieldYearlessRange-_633hUT2.js.map} +1 -1
- package/dist/DateFieldYearlessRange.js +1 -1
- package/dist/{DaysOfTheWeek-Dbgb0RsL.js → DaysOfTheWeek-BIA6nA6P.js} +3 -3
- package/dist/{DaysOfTheWeek-Dbgb0RsL.js.map → DaysOfTheWeek-BIA6nA6P.js.map} +1 -1
- package/dist/DaysOfTheWeek.js +1 -1
- package/dist/{Dialog-Clg6Kd96.js → Dialog-JLZ-kN1_.js} +4 -4
- package/dist/{Dialog-Clg6Kd96.js.map → Dialog-JLZ-kN1_.js.map} +1 -1
- package/dist/Dialog.js +1 -1
- package/dist/{Drawer-Mnne1lfM.js → Drawer-B-98XNZ_.js} +5 -5
- package/dist/{Drawer-Mnne1lfM.js.map → Drawer-B-98XNZ_.js.map} +1 -1
- package/dist/Drawer.js +1 -1
- package/dist/DrillDown.js +1 -1
- package/dist/{EditCard-NAN7IqhO.js → EditCard-Bj-HPjfg.js} +2 -2
- package/dist/{EditCard-NAN7IqhO.js.map → EditCard-Bj-HPjfg.js.map} +1 -1
- package/dist/EditCard.js +1 -1
- package/dist/{FieldLabel-DpYGFXmG.js → FieldLabel-D45uUkys.js} +3 -3
- package/dist/{FieldLabel-DpYGFXmG.js.map → FieldLabel-D45uUkys.js.map} +1 -1
- package/dist/FieldLabel.js +1 -1
- package/dist/{FilterBar-Dhl_hi_5.js → FilterBar-0CarAaah.js} +6 -6
- package/dist/FilterBar-0CarAaah.js.map +1 -0
- package/dist/FilterBar.js +1 -1
- package/dist/{InputMask-DkT6npDV.js → InputMask-D7xKQiKw.js} +3 -3
- package/dist/{InputMask-DkT6npDV.js.map → InputMask-D7xKQiKw.js.map} +1 -1
- package/dist/InputMask.js +1 -1
- package/dist/{ListView-DeA9TBIT.js → ListView-DW5wEyR6.js} +2 -2
- package/dist/{ListView-DeA9TBIT.js.map → ListView-DW5wEyR6.js.map} +1 -1
- package/dist/ListView.js +1 -1
- package/dist/{Listbox-qjgO_Hoo.js → Listbox-Nwm29Z0z.js} +2 -2
- package/dist/{Listbox-qjgO_Hoo.js.map → Listbox-Nwm29Z0z.js.map} +1 -1
- package/dist/Listbox.js +1 -1
- package/dist/{Menu-CM0EndhK.js → Menu-BjPE_ODh.js} +45 -38
- package/dist/Menu-BjPE_ODh.js.map +1 -0
- package/dist/Menu.css +21 -21
- package/dist/Menu.js +1 -1
- package/dist/Menu.module-CMDgSO9k.js +13 -0
- package/dist/Menu.module-CMDgSO9k.js.map +1 -0
- package/dist/MultiSelectField.js +1 -1
- package/dist/{MultiSelectFieldSync-D_09Osn3.js → MultiSelectFieldSync-KYwyzshU.js} +6 -6
- package/dist/{MultiSelectFieldSync-D_09Osn3.js.map → MultiSelectFieldSync-KYwyzshU.js.map} +1 -1
- package/dist/MultiSelectMenu.js +1 -1
- package/dist/{MultiSelectMenuSync-DkXlWa6p.js → MultiSelectMenuSync-DXnRNK14.js} +4 -4
- package/dist/{MultiSelectMenuSync-DkXlWa6p.js.map → MultiSelectMenuSync-DXnRNK14.js.map} +1 -1
- package/dist/{NumberField-BWRgy-Xq.js → NumberField-B_WHisen.js} +3 -3
- package/dist/{NumberField-BWRgy-Xq.js.map → NumberField-B_WHisen.js.map} +1 -1
- package/dist/NumberField.js +1 -1
- package/dist/{Page-B-Wjr7sP.js → Page-D6U5W_ek.js} +57 -134
- package/dist/Page-D6U5W_ek.js.map +1 -0
- package/dist/Page.css +87 -95
- package/dist/Page.js +1 -1
- package/dist/{Pagination-DRIKAkuE.js → Pagination-8hkJz0QJ.js} +3 -3
- package/dist/{Pagination-DRIKAkuE.js.map → Pagination-8hkJz0QJ.js.map} +1 -1
- package/dist/Pagination.js +1 -1
- package/dist/{Popover-CVroO0T0.js → Popover-BeAE-h5z.js} +4 -4
- package/dist/{Popover-CVroO0T0.js.map → Popover-BeAE-h5z.js.map} +1 -1
- package/dist/Popover.js +1 -1
- package/dist/{ProgressBar-Cc6JQ2EH.js → ProgressBar-DJNobbcj.js} +2 -2
- package/dist/{ProgressBar-Cc6JQ2EH.js.map → ProgressBar-DJNobbcj.js.map} +1 -1
- package/dist/ProgressBar.js +1 -1
- package/dist/{Radio-BWEUnuHt.js → Radio-DO89Gm9G.js} +3 -3
- package/dist/{Radio-BWEUnuHt.js.map → Radio-DO89Gm9G.js.map} +1 -1
- package/dist/{Radio-CxPskh2k.js → Radio-QIdbcbHE.js} +2 -2
- package/dist/{Radio-CxPskh2k.js.map → Radio-QIdbcbHE.js.map} +1 -1
- package/dist/Radio.js +1 -1
- package/dist/{RichTextEditor-B_8D0VD3.js → RichTextEditor-BQNdQfGc.js} +9 -9
- package/dist/{RichTextEditor-B_8D0VD3.js.map → RichTextEditor-BQNdQfGc.js.map} +1 -1
- package/dist/RichTextEditor.js +1 -1
- package/dist/{SavedFiltersButton-vZ38Mty8.js → SavedFiltersButton-CXm73nb9.js} +10 -9
- package/dist/SavedFiltersButton-CXm73nb9.js.map +1 -0
- package/dist/SavedFiltersButton.js +1 -1
- package/dist/{SelectCard-CLQ8X_Xv.js → SelectCard-XRdnzJGg.js} +3 -3
- package/dist/{SelectCard-CLQ8X_Xv.js.map → SelectCard-XRdnzJGg.js.map} +1 -1
- package/dist/SelectCard.js +1 -1
- package/dist/SelectField.js +1 -1
- package/dist/{SelectFieldLabel-LzRCSbOL.js → SelectFieldLabel-DBW3gWNy.js} +2 -2
- package/dist/{SelectFieldLabel-LzRCSbOL.js.map → SelectFieldLabel-DBW3gWNy.js.map} +1 -1
- package/dist/{SelectFieldSync-klbql5_5.js → SelectFieldSync-BRlVLUx1.js} +5 -5
- package/dist/{SelectFieldSync-klbql5_5.js.map → SelectFieldSync-BRlVLUx1.js.map} +1 -1
- package/dist/SelectMenu.js +1 -1
- package/dist/{SelectMenuSync-Bn_ksCG5.js → SelectMenuSync-B5IcJFmI.js} +4 -4
- package/dist/{SelectMenuSync-Bn_ksCG5.js.map → SelectMenuSync-B5IcJFmI.js.map} +1 -1
- package/dist/{SelectOptions-BjwYqKH3.js → SelectOptions-B8_ulYXi.js} +2 -2
- package/dist/{SelectOptions-BjwYqKH3.js.map → SelectOptions-B8_ulYXi.js.map} +1 -1
- package/dist/{SelectTrigger-BO9QQqxo.js → SelectTrigger-BGeAJOiy.js} +2 -2
- package/dist/{SelectTrigger-BO9QQqxo.js.map → SelectTrigger-BGeAJOiy.js.map} +1 -1
- package/dist/SelectTrigger.js +1 -1
- package/dist/{SelectTriggerBase-CeEaDrSV.js → SelectTriggerBase-IsPdL6xK.js} +3 -3
- package/dist/{SelectTriggerBase-CeEaDrSV.js.map → SelectTriggerBase-IsPdL6xK.js.map} +1 -1
- package/dist/{Switch-CZjpzkol.js → Switch-D4LWmhWZ.js} +2 -2
- package/dist/{Switch-CZjpzkol.js.map → Switch-D4LWmhWZ.js.map} +1 -1
- package/dist/Switch.js +1 -1
- package/dist/Table.js +1 -1
- package/dist/{Text-DdNE3hPR.js → Text-BPlp1ja1.js} +2 -2
- package/dist/{Text-DdNE3hPR.js.map → Text-BPlp1ja1.js.map} +1 -1
- package/dist/Text.js +1 -1
- package/dist/{TextField-DQ0i2nlz.js → TextField-DrifGXan.js} +2 -2
- package/dist/{TextField-DQ0i2nlz.js.map → TextField-DrifGXan.js.map} +1 -1
- package/dist/{TextField-DkM8v9DE.js → TextField-oF-dTYbB.js} +3 -3
- package/dist/{TextField-DkM8v9DE.js.map → TextField-oF-dTYbB.js.map} +1 -1
- package/dist/TextField.js +1 -1
- package/dist/{Textarea-Cg5saqcU.js → Textarea-Bq9AK5w9.js} +3 -3
- package/dist/{Textarea-Cg5saqcU.js.map → Textarea-Bq9AK5w9.js.map} +1 -1
- package/dist/Textarea.js +1 -1
- package/dist/{ThemeProvider-D4dbBfHd.js → ThemeProvider-Cx7wqUQh.js} +2 -2
- package/dist/{ThemeProvider-D4dbBfHd.js.map → ThemeProvider-Cx7wqUQh.js.map} +1 -1
- package/dist/ThemeProvider.css +20 -4
- package/dist/ThemeProvider.js +1 -1
- package/dist/ThemeProvider.module-ByAsjx7c.js +8 -0
- package/dist/ThemeProvider.module-ByAsjx7c.js.map +1 -0
- package/dist/{TimeField-DVYSA-Az.js → TimeField-BW9PKqWA.js} +4 -4
- package/dist/{TimeField-DVYSA-Az.js.map → TimeField-BW9PKqWA.js.map} +1 -1
- package/dist/TimeField.js +1 -1
- package/dist/Toast.js +2 -2
- package/dist/{Toaster-D1a3ysMN.js → Toaster-7AYHdH-v.js} +2 -2
- package/dist/{Toaster-D1a3ysMN.js.map → Toaster-7AYHdH-v.js.map} +1 -1
- package/dist/{Toaster-BiPZIPzH.js → Toaster-Bllufg1v.js} +5 -5
- package/dist/{Toaster-BiPZIPzH.js.map → Toaster-Bllufg1v.js.map} +1 -1
- package/dist/{Toolbar-Dw_xAGRP.js → Toolbar-Bapm516g.js} +4 -4
- package/dist/{Toolbar-Dw_xAGRP.js.map → Toolbar-Bapm516g.js.map} +1 -1
- package/dist/{Toolbar-DYu1UIoW.js → Toolbar-D8uWXitV.js} +5 -5
- package/dist/{Toolbar-DYu1UIoW.js.map → Toolbar-D8uWXitV.js.map} +1 -1
- package/dist/Toolbar.js +2 -2
- package/dist/{ToolbarButtonToggle-0A61CKru.js → ToolbarButtonToggle-L-9HgAbf.js} +2 -2
- package/dist/{ToolbarButtonToggle-0A61CKru.js.map → ToolbarButtonToggle-L-9HgAbf.js.map} +1 -1
- package/dist/{Tooltip-hen6P8WV.js → Tooltip-D4sgiNLd.js} +4 -4
- package/dist/{Tooltip-hen6P8WV.js.map → Tooltip-D4sgiNLd.js.map} +1 -1
- package/dist/Tooltip.js +1 -1
- package/dist/TreeSelectField.js +1 -1
- package/dist/{TreeSelectFieldSync-IFAs-lci.js → TreeSelectFieldSync-Bf4GWDGN.js} +5 -5
- package/dist/{TreeSelectFieldSync-IFAs-lci.js.map → TreeSelectFieldSync-Bf4GWDGN.js.map} +1 -1
- package/dist/TreeSelectMenu.js +1 -1
- package/dist/{TreeSelectMenuSync-BATdOysJ.js → TreeSelectMenuSync-CsB30zKZ.js} +3 -3
- package/dist/{TreeSelectMenuSync-BATdOysJ.js.map → TreeSelectMenuSync-CsB30zKZ.js.map} +1 -1
- package/dist/{TypeaheadTextField-BVtaGlCX.js → TypeaheadTextField-ByvfTXI_.js} +4 -4
- package/dist/{TypeaheadTextField-BVtaGlCX.js.map → TypeaheadTextField-ByvfTXI_.js.map} +1 -1
- package/dist/TypeaheadTextField.js +1 -1
- package/dist/{YearlessDateInputWithPicker-Cs2IQ0ma.js → YearlessDateInputWithPicker-BrECzF1z.js} +2 -2
- package/dist/{YearlessDateInputWithPicker-Cs2IQ0ma.js.map → YearlessDateInputWithPicker-BrECzF1z.js.map} +1 -1
- package/dist/beta.js +17 -17
- package/dist/{bulkActionTypes-B683cPWf.js → bulkActionTypes-Cykjdbzi.js} +2 -2
- package/dist/{bulkActionTypes-B683cPWf.js.map → bulkActionTypes-Cykjdbzi.js.map} +1 -1
- package/dist/{filter-state-ClXbmO_I.js → filter-state-BCYYvluK.js} +30 -30
- package/dist/filter-state-BCYYvluK.js.map +1 -0
- package/dist/filter-state.css +27 -14
- package/dist/{floating-ui.react-dom-CyrxPiI-.js → floating-ui.react-dom-BIKT960u.js} +2 -2
- package/dist/{floating-ui.react-dom-CyrxPiI-.js.map → floating-ui.react-dom-BIKT960u.js.map} +1 -1
- package/dist/{index-tWkeAVJW.js → index-BSX9WOFX.js} +2 -2
- package/dist/{index-tWkeAVJW.js.map → index-BSX9WOFX.js.map} +1 -1
- package/dist/index.js +45 -45
- package/dist/{portalScopeClassNames--sU7fdKW.js → portalScopeClassNames-DR6qlli0.js} +2 -2
- package/dist/{portalScopeClassNames--sU7fdKW.js.map → portalScopeClassNames-DR6qlli0.js.map} +1 -1
- package/dist/src/beta/components/FilterBar/FilterDateList.d.ts +4 -2
- package/dist/src/beta/components/FilterBar/index.d.ts +1 -1
- package/dist/src/beta/components/FilterBar/internal/types.d.ts +15 -0
- package/dist/src/beta/components/Page/Page.d.ts +3 -4
- package/dist/src/beta/components/Page/PageContent.d.ts +2 -4
- package/dist/src/beta/components/Page/pageBreakpoint.d.ts +10 -11
- package/dist/src/components/Menu/internal/menuSelectors.d.ts +4 -0
- package/dist/src/components/Menu/types.d.ts +24 -4
- package/dist/src/integration-testing/beta-page-native-scroll.spec.d.ts +1 -0
- package/dist/{stripInlineMarkdown-Dz6vTyS_.js → stripInlineMarkdown-Vq3E88gC.js} +2 -2
- package/dist/{stripInlineMarkdown-Dz6vTyS_.js.map → stripInlineMarkdown-Vq3E88gC.js.map} +1 -1
- package/dist/{syncFilterUtils-BbK2BCsr.js → syncFilterUtils-DITilMLU.js} +3 -3
- package/dist/{syncFilterUtils-BbK2BCsr.js.map → syncFilterUtils-DITilMLU.js.map} +1 -1
- package/dist/token/core/semantic-variables.scss +16 -0
- package/dist/token/core/semantic.d.ts +8 -0
- package/dist/token/core/semantic.js +104 -0
- package/dist/token/core/semantic.scss +8 -0
- package/dist/token.js +112 -0
- package/dist/token.js.map +1 -1
- package/dist/{treeSync-De2jGdy-.js → treeSync-Du7ryXiO.js} +3 -3
- package/dist/{treeSync-De2jGdy-.js.map → treeSync-Du7ryXiO.js.map} +1 -1
- package/dist/{useDrilldown-BDKQkqA_.js → useDrilldown-Cj1GQ-wc.js} +3 -3
- package/dist/{useDrilldown-BDKQkqA_.js.map → useDrilldown-Cj1GQ-wc.js.map} +1 -1
- package/dist/{useInfiniteCombobox-D7saAttF.js → useInfiniteCombobox-NqrF4TiC.js} +4 -4
- package/dist/{useInfiniteCombobox-D7saAttF.js.map → useInfiniteCombobox-NqrF4TiC.js.map} +1 -1
- package/dist/{useInitialFocus-BIvXK1Rp.js → useInitialFocus-BUxEDMEG.js} +2 -2
- package/dist/{useInitialFocus-BIvXK1Rp.js.map → useInitialFocus-BUxEDMEG.js.map} +1 -1
- package/dist/{useInvalidateOnOptionsChange-DcYuWdMC.js → useInvalidateOnOptionsChange-BdWCXlhy.js} +6 -6
- package/dist/{useInvalidateOnOptionsChange-DcYuWdMC.js.map → useInvalidateOnOptionsChange-BdWCXlhy.js.map} +1 -1
- package/dist/{usePopoverTransitionStates-B1opfxxn.js → usePopoverTransitionStates-CDXCdyKa.js} +2 -1
- package/dist/{usePopoverTransitionStates-B1opfxxn.js.map → usePopoverTransitionStates-CDXCdyKa.js.map} +1 -1
- package/package.json +3 -3
- package/dist/FilterBar-Dhl_hi_5.js.map +0 -1
- package/dist/Menu-CM0EndhK.js.map +0 -1
- package/dist/Menu.module-CoyI86tZ.js +0 -13
- package/dist/Menu.module-CoyI86tZ.js.map +0 -1
- package/dist/Page-B-Wjr7sP.js.map +0 -1
- package/dist/SavedFiltersButton-vZ38Mty8.js.map +0 -1
- package/dist/ThemeProvider.module-_7m6Tav-.js +0 -8
- package/dist/ThemeProvider.module-_7m6Tav-.js.map +0 -1
- package/dist/filter-state-ClXbmO_I.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Page-B-Wjr7sP.js","sources":["../src/beta/components/Page/PageSidebarContext.ts","../src/beta/components/Page/PageContext.ts","../src/beta/components/Page/pageBreakpoint.ts","../src/beta/components/Page/PageSidebar.tsx","../src/beta/components/Page/PageSidebarHeader.tsx","../src/beta/components/Page/PageHeader.tsx","../src/beta/components/Page/PageContent.tsx","../src/beta/components/Page/internal/PagePanelContext.tsx","../src/beta/components/Page/PagePanelHeader.tsx","../src/beta/components/Page/PagePanelContent.tsx","../src/beta/components/Page/PagePanelFooter.tsx","../src/beta/components/Page/PagePanel.tsx","../src/beta/components/Page/PageFooter.tsx","../src/beta/components/Page/Page.tsx"],"sourcesContent":["import { createContext } from \"react\";\n\ntype PageSideBarContextProps = {\n collapsed: boolean;\n};\n\nexport const PageSideBarContext = createContext<PageSideBarContextProps | null>(\n null,\n);\n","import { createContext } from \"react\";\n\nexport const PageContext = createContext<PageContextProps>({});\n\nexport type PageContextProps = {\n pageWidth?: number;\n contentWrapper?: HTMLElement | null;\n footerSlot?: HTMLElement | null;\n};\n","import { core } from \"@servicetitan/hammer-token\";\n\n/**\n * The Page's `lg` breakpoint width in px — the boundary between the stacked\n * \"mobile\" layout (sidebar collapses to a popover trigger, panel becomes a\n * dialog, virtual scrollbar hidden) and the desktop layout. Parsed once from the\n * design token; falls back to `0` if the token is unavailable.\n *\n * Single source of truth for every width-driven layout decision in Page\n * (`PageSidebar`, `PagePanel`, `PageContent`) so they can never drift apart.\n */\nexport const PAGE_LG_BREAKPOINT = +(\n core.primitive?.BreakpointLg?.value?.replace(\"px\", \"\") ?? 0\n);\n\n/**\n * Whether the given page width should use the mobile layout (below `lg`).\n * Used by `PageSidebar`/`PagePanel` to swap to their popover/dialog forms.\n */\nexport const isPageMobileWidth = (pageWidth: number | undefined): boolean =>\n (pageWidth ?? 0) < PAGE_LG_BREAKPOINT;\n\n/**\n * Whether the virtual scrollbar should render (desktop, `lg` and above).\n *\n * Gating the sized virtual-scroll spacer on this — rather than rendering it\n * unconditionally — is what prevents the `Page.Content` feedback loop: during\n * SSR/hydration `pageWidth` is `0` and the Page stylesheet has not yet pulled\n * the spacer out of flow, so an always-rendered spacer would round-trip through\n * the `document.scrollHeight` the ResizeObserver measures (\"Maximum update depth\n * exceeded\"). Below `lg` the spacer is never rendered, so it can never feed back.\n */\nexport const showsPageVirtualScroll = (\n pageWidth: number | undefined,\n): boolean => PAGE_LG_BREAKPOINT > 0 && (pageWidth ?? 0) >= PAGE_LG_BREAKPOINT;\n","import { Button, Icon, Flex, Tooltip } from \"../../../components\";\nimport { Popover } from \"../../../internal/components/Popover\";\nimport { usePopoverContext } from \"../../../internal/components/Popover/internal/usePopoverContext\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n type Ref,\n useContext,\n useEffect,\n useRef,\n useState,\n useLayoutEffect,\n} from \"react\";\nimport { useTrackingId, useMergeRefs } from \"../../../hooks\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport SegmentSVG from \"@servicetitan/hammer-icon/mdi/round/segment.svg\";\nimport RespOpen from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_down.svg\";\nimport RespClose from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_up.svg\";\nimport OpenSVG from \"@servicetitan/hammer-icon/mdi/round/chevron_right.svg\";\nimport CloseSVG from \"@servicetitan/hammer-icon/mdi/round/chevron_left.svg\";\nimport { PageSideBarContext } from \"./PageSidebarContext\";\nimport { PageContext, type PageContextProps } from \"./PageContext\";\nimport { isPageMobileWidth } from \"./pageBreakpoint\";\n\nfunction AdaptiveSidebarContent({\n children,\n className,\n innerRef,\n}: {\n children: ReactNode;\n className?: string;\n innerRef?: Ref<HTMLDivElement>;\n}) {\n const { closePopover, openState } = usePopoverContext();\n const containerRef = useRef<HTMLDivElement>(null);\n const mergedRef = useMergeRefs([containerRef, innerRef]);\n\n useEffect(() => {\n if (!openState) return;\n const overflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = overflow;\n };\n }, [openState]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const handleClick = (e: Event) => {\n if (!(e.target instanceof Element)) return;\n if (e.target.closest(\"a\")) closePopover();\n };\n el.addEventListener(\"click\", handleClick);\n return () => el.removeEventListener(\"click\", handleClick);\n }, [closePopover]);\n\n return (\n <Flex direction=\"column\" className={className} ref={mergedRef}>\n {children}\n </Flex>\n );\n}\n\n/**\n * Props for the PageSidebar component\n * @extends ComponentPropsWithoutRef<\"div\">\n */\nexport type PageSidebarProps = ComponentPropsWithoutRef<\"div\"> & {\n /**\n * Key for storing sidebar collapsed state in localStorage\n * @default \"sidebar-collapsed\"\n */\n localStorageKey?: string;\n /**\n * Custom tracking ID for analytics\n */\n [\"data-tracking-id\"]?: string;\n /**\n * Title to display in the adaptive trigger button\n */\n currentPageTitle?: string;\n};\n\n/**\n * PageSidebar component for creating collapsible navigation sidebars.\n *\n * Features:\n * - Collapsible sidebar with localStorage persistence\n * - Responsive design with adaptive popover on mobile\n * - Automatic tracking ID generation for analytics\n * - Keyboard navigation and accessibility support\n * - Toggle button with tooltip\n * - Context provider for sidebar state\n * - Mobile-friendly popover navigation\n *\n * @example\n * <Page.Sidebar currentPageTitle=\"Navigation\">\n * <Page.SidebarHeader>\n * <Text variant=\"headline\" el=\"h2\">Sidebar Title</Text>\n * </Page.SidebarHeader>\n * <SideNav>\n * <SideNavLink pathname=\"/\">Home</SideNavLink>\n * </SideNav>\n * </Page.Sidebar>\n */\nexport const PageSidebar = forwardRef(\n (props: PageSidebarProps, ref: Ref<HTMLDivElement>) => {\n const {\n children,\n className,\n currentPageTitle,\n localStorageKey = \"sidebar-collapsed\",\n ...rest\n } = props;\n\n const data = {\n localStorageKey,\n };\n\n const { pageWidth } = useContext<PageContextProps>(PageContext);\n\n const [isMobile, setIsMobile] = useState<boolean>(() =>\n typeof window !== \"undefined\"\n ? isPageMobileWidth(window.innerWidth)\n : false,\n );\n\n useLayoutEffect(() => {\n if (!pageWidth) return;\n setIsMobile(isPageMobileWidth(pageWidth));\n }, [pageWidth]);\n\n const trackingId = useTrackingId({\n name: \"PageSidebarButton\",\n data,\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const [collapsed, setCollapsed] = useState<boolean>(() => {\n // getting stored value\n const sidebarState = localStorage.getItem(localStorageKey);\n return sidebarState ? JSON.parse(sidebarState) : false;\n });\n const classNames = cx([styles[\"sidebar\"]], className, {\n [styles[\"collapsed\"]]: collapsed,\n });\n const onToggleButtonClick = () => {\n setCollapsed((prev) => {\n localStorage.setItem(localStorageKey, JSON.stringify(!prev));\n return !prev;\n });\n };\n\n if (isMobile) {\n return (\n <Popover fillAvailableHeight matchReferenceWidth noPadding>\n <Popover.Trigger>\n {(props) => {\n return (\n <div className={styles[\"sidebar-adaptive-trigger-container\"]}>\n <Button\n className={styles[\"sidebar-adaptive-trigger\"]}\n icon={SegmentSVG}\n appearance=\"ghost\"\n {...props}\n >\n {!currentPageTitle ? \"Menu\" : currentPageTitle}\n <Icon\n className={styles[\"sidebar-adaptive-trigger-icon\"]}\n justifyContent=\"end\"\n svg={\n props[\"data-state\"] === \"open\" ? RespClose : RespOpen\n }\n />\n </Button>\n </div>\n );\n }}\n </Popover.Trigger>\n <Popover.Content className={styles[\"sidebar-adaptive-container\"]}>\n <AdaptiveSidebarContent\n className={styles[\"sidebar-adaptive\"]}\n innerRef={ref}\n >\n {children}\n </AdaptiveSidebarContent>\n </Popover.Content>\n </Popover>\n );\n }\n\n return (\n <PageSideBarContext.Provider value={{ collapsed }}>\n <div className={classNames} ref={ref} {...rest}>\n <div className={styles[\"sidebar-inner\"]} aria-hidden={collapsed}>\n <div>{children}</div>\n </div>\n <div className={styles[\"toggle-button-wrapper\"]}>\n <Tooltip placement=\"right\">\n <Tooltip.Trigger className={styles[\"toggle-button-tooltip\"]}>\n <Button\n size=\"small\"\n onClick={onToggleButtonClick}\n className={styles[\"toggle-button\"]}\n aria-label={collapsed ? \"Open Sidebar\" : \"Close Sidebar\"}\n data-tracking-id={trackingId}\n icon={collapsed ? OpenSVG : CloseSVG}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>\n {collapsed ? \"Open Sidebar\" : \"Close Sidebar\"}\n </Tooltip.Content>\n </Tooltip>\n </div>\n </div>\n </PageSideBarContext.Provider>\n );\n },\n);\n\nPageSidebar.displayName = \"Page.Sidebar\";\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type Ref,\n useContext,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport { PageSideBarContext } from \"./PageSidebarContext\";\n\n/**\n * Props for the PageSidebarHeader component\n * @extends ComponentPropsWithoutRef<\"div\">\n */\nexport type PageSidebarHeaderProps = ComponentPropsWithoutRef<\"div\">;\n\n/**\n * PageSidebarHeader component for creating header sections within sidebars.\n *\n * Features:\n * - Container for sidebar header content\n * - Automatic visibility handling based on sidebar collapsed state\n * - Supports all standard div props\n * - Context-aware styling\n *\n * @example\n * <Page.SidebarHeader>\n * <Text variant=\"headline\" el=\"h2\" size=\"medium\">\n * Sidebar Title\n * </Text>\n * </Page.SidebarHeader>\n */\nexport const PageSidebarHeader = forwardRef(\n (props: PageSidebarHeaderProps, ref: Ref<HTMLDivElement>) => {\n const { children, className, ...rest } = props;\n const context = useContext(PageSideBarContext);\n const classNames = cx([styles[\"sidebar-header\"]], className);\n\n return (\n <div className={classNames} ref={ref} {...rest}>\n <div\n className={styles[\"header-content\"]}\n aria-hidden={context?.collapsed}\n >\n {children}\n </div>\n </div>\n );\n },\n);\n\nPageSidebarHeader.displayName = \"Page.SidebarHeader\";\n","import {\n type ButtonProps,\n type ButtonLinkProps,\n type BreadcrumbsLinkProps,\n type ChipProps,\n type MenuReturnProps,\n Tooltip,\n ButtonLink,\n Button,\n Flex,\n Menu,\n Breadcrumbs,\n Chip,\n Text,\n TextField,\n} from \"../../../components\";\nimport {\n type ComponentPropsWithoutRef,\n type ReactNode,\n forwardRef,\n type Ref,\n useState,\n useRef,\n useEffect,\n type KeyboardEvent,\n} from \"react\";\nimport Layout, { type LayoutProps } from \"../../../components/Layout\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport LocalSettings from \"@servicetitan/hammer-icon/mdi/round/settings.svg\";\nimport MoreVert from \"@servicetitan/hammer-icon/mdi/round/more_vert.svg\";\nimport Edit from \"@servicetitan/hammer-icon/mdi/round/edit.svg\";\nimport Check from \"@servicetitan/hammer-icon/mdi/round/check.svg\";\nimport Close from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport IconKeyboardArrowDown from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_down.svg\";\n\n/**\n * Props for page header action buttons\n */\ntype PageHeaderActionProps = Omit<ButtonProps, \"appearance\"> & {\n /**\n * Label text for the action button\n */\n label: string;\n};\n\n/**\n * Props for a page header action that opens a menu instead of invoking a single\n * handler. `onClick` is omitted because the whole button opens the menu -- an\n * action carrying both a handler and items would be a split button, which\n * Anvil does not support.\n */\ntype PageHeaderMenuActionProps = Omit<PageHeaderActionProps, \"onClick\"> & {\n /**\n * Actions listed in the menu this button opens\n */\n items: PageHeaderActionProps[];\n};\n\n/**\n * Props for page header actions configuration\n */\ntype PageHeaderActionsProps = {\n /**\n * Primary action button. Pass `items` instead of `onClick` to render a\n * primary button that opens a menu of actions.\n */\n primary?: PageHeaderActionProps | PageHeaderMenuActionProps;\n /**\n * Array of secondary action buttons\n */\n secondary?: PageHeaderActionProps[];\n};\n\n/**\n * Base props for preference actions\n */\ntype BasePreferenceProps = {\n /**\n * Accessible label for the preference action\n */\n \"aria-label\": string;\n};\n\n/**\n * Props for preference button actions\n */\ntype PreferenceButtonProps = Omit<\n ButtonProps,\n \"aria-label\" | \"icon\" | \"appearance\" | \"size\" | \"className\"\n> &\n BasePreferenceProps;\n\n/**\n * Props for preference link actions\n */\ntype PreferenceLinkProps = Omit<\n ButtonLinkProps,\n \"aria-label\" | \"icon\" | \"appearance\" | \"size\" | \"className\"\n> &\n BasePreferenceProps;\n\ntype PageHeaderTitleConfig = {\n text: string;\n onChange?: (title: string) => void | boolean;\n editButtonLabel?: string;\n editFieldLabel?: string;\n confirmButtonLabel?: string;\n cancelButtonLabel?: string;\n};\n\ntype PageHeaderTitle = PageHeaderTitleConfig[\"text\"] | PageHeaderTitleConfig;\n\n/**\n * Props for the PageHeader component\n * @extends ComponentPropsWithoutRef<\"header\">\n */\nexport type PageHeaderProps = Omit<\n ComponentPropsWithoutRef<\"header\">,\n \"title\"\n> & {\n /**\n * Main title of the page\n */\n title: PageHeaderTitle;\n /**\n * Breadcrumb navigation links\n */\n breadcrumbs?: BreadcrumbsLinkProps[];\n /**\n * Status chips to display\n */\n chips?: ChipProps[];\n /**\n * Description text or content below the title\n */\n description?: ReactNode;\n /**\n * Primary and secondary action buttons\n */\n actions?: PageHeaderActionsProps;\n /**\n * Preference action button or link\n */\n preferenceAction?: PreferenceButtonProps | PreferenceLinkProps;\n /**\n * Layout configuration for the header\n */\n layout?: LayoutProps;\n};\n\n/**\n * Maps page header actions onto menu items. `Menu.Item` takes only a leading\n * icon, so a bare svg and the `{ after }` form are unwrapped to it and the\n * `{ before }` form is intentionally dropped. `ButtonProps` is a union, and\n * `Omit<ButtonProps, \"appearance\">` collapses it, which is why `icon` has to be\n * narrowed at runtime here.\n */\nconst renderMenuItems = (actions: PageHeaderActionProps[]) =>\n actions.map((action, index) => {\n const icon =\n typeof action.icon === \"function\"\n ? action.icon\n : action.icon && \"after\" in action.icon\n ? action.icon.after\n : undefined;\n return (\n <Menu.Item\n key={index}\n label={action.label}\n onClick={action.onClick}\n disabled={action.disabled}\n icon={icon}\n className={action.className}\n />\n );\n });\n\n/**\n * Builds the trigger for a menu-opening primary action. `triggerProps` spreads\n * last on purpose: `Menu` supplies the trigger's `onClick`, `onKeyDown`, and\n * ARIA state, and spreading consumer props after them would clobber the menu's\n * own behavior. `icon` sits after `buttonProps` for the same reason in reverse:\n * the chevron is what signals that this button opens a menu, so it wins over a\n * consumer-supplied icon. A menu primary therefore cannot carry a leading icon.\n * `ref` lands last so nothing can displace it: `Menu` dismisses itself by\n * testing event paths against the invoker element, which only works if the ref\n * reaches the button.\n */\nconst renderPrimaryMenuTrigger =\n (primary: PageHeaderMenuActionProps) =>\n ({ ref, ...triggerProps }: MenuReturnProps) => {\n const { items: _items, label, ...buttonProps } = primary;\n return (\n <Button\n appearance=\"primary\"\n {...buttonProps}\n icon={{ after: IconKeyboardArrowDown }}\n {...triggerProps}\n ref={ref}\n >\n {label}\n </Button>\n );\n };\n\n/**\n * PageHeader component for creating page headers with navigation and actions.\n *\n * Features:\n * - Page title with semantic heading\n * - Breadcrumb navigation support\n * - Status chips display\n * - Primary and secondary action buttons\n * - Preference action button/link\n * - Responsive layout with fluid grid\n * - Accessibility support with proper ARIA labels\n * - Flexible layout configuration\n * - Description content support\n *\n * @example\n * <Page.Header\n * title=\"Page Title\"\n * breadcrumbs={[\n * { href: \"/\", children: \"Home\" },\n * { children: \"Current Page\" }\n * ]}\n * chips={[{ label: \"Status\" }]}\n * actions={{\n * primary: { label: \"Save\", onClick: handleSave },\n * secondary: [{ label: \"Cancel\", onClick: handleCancel }]\n * }}\n * />\n */\nexport const PageHeader = forwardRef(\n (props: PageHeaderProps, ref: Ref<HTMLHeadElement>) => {\n const {\n title: titleProp,\n breadcrumbs,\n chips,\n description,\n actions,\n preferenceAction,\n layout,\n className,\n ...rest\n } = props;\n\n const title: PageHeaderTitleConfig =\n typeof titleProp === \"string\" ? { text: titleProp } : titleProp;\n\n const [editing, setEditing] = useState(false);\n const [editingTitle, setEditingTitle] = useState<\n PageHeaderTitleConfig[\"text\"]\n >(title.text);\n const editFieldRef = useRef<HTMLInputElement>(null);\n const editButtonRef = useRef<HTMLButtonElement>(null);\n const firstRenderRef = useRef(true);\n\n useEffect(() => {\n if (firstRenderRef.current) {\n firstRenderRef.current = false;\n return;\n }\n\n if (editing === true && editFieldRef.current) {\n editFieldRef.current.focus();\n }\n\n if (editing === false && editButtonRef.current) {\n editButtonRef.current.focus();\n }\n }, [editing]);\n\n const { fluid, variant } = layout || {};\n\n const preferenceItem =\n preferenceAction &&\n (\"href\" in preferenceAction ? (\n <Tooltip>\n <Tooltip.Trigger>\n <ButtonLink\n appearance=\"ghost\"\n icon={LocalSettings}\n size=\"small\"\n className={styles[\"preference-action\"]}\n {...(preferenceAction as PreferenceLinkProps)}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>{preferenceAction[\"aria-label\"]}</Tooltip.Content>\n </Tooltip>\n ) : (\n <Tooltip>\n <Tooltip.Trigger>\n <Button\n appearance=\"ghost\"\n icon={LocalSettings}\n size=\"small\"\n className={styles[\"preference-action\"]}\n {...(preferenceAction as PreferenceButtonProps)}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>{preferenceAction[\"aria-label\"]}</Tooltip.Content>\n </Tooltip>\n ));\n\n const secondaryActions = actions?.secondary ?? [];\n const primaryAction = actions?.primary;\n\n const collapseSecondary =\n secondaryActions.length >= 3 ||\n (secondaryActions.length >= 2 && !!primaryAction);\n\n const actionItems = actions && (\n <Flex justifyContent=\"flex-end\" className={styles.actions}>\n {collapseSecondary ? (\n <Menu\n trigger={({ ref, ...rest }) => (\n <Tooltip>\n <Tooltip.Trigger>\n <Button\n appearance=\"secondary\"\n icon={MoreVert}\n aria-label=\"More actions\"\n {...rest}\n ref={ref}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>More actions</Tooltip.Content>\n </Tooltip>\n )}\n >\n {renderMenuItems(secondaryActions)}\n </Menu>\n ) : (\n secondaryActions.map((action, index) => (\n <Button key={index} appearance=\"secondary\" {...action}>\n {action.label}\n </Button>\n ))\n )}\n\n {primaryAction &&\n (\"items\" in primaryAction ? (\n <Menu\n label={primaryAction.label}\n trigger={renderPrimaryMenuTrigger(primaryAction)}\n >\n {renderMenuItems(primaryAction.items)}\n </Menu>\n ) : (\n <Button appearance=\"primary\" {...primaryAction}>\n {primaryAction.label}\n </Button>\n ))}\n </Flex>\n );\n\n const headerClassName = cx(styles.content, styles.header, className);\n\n const headerContentClassName = cx(\n styles[\"content-inner\"],\n styles[\"content-header-inner\"],\n );\n\n return (\n <header ref={ref} className={headerClassName} {...rest}>\n <div className={headerContentClassName}>\n <Layout fluid={fluid} variant={variant} className={styles[\"layout\"]}>\n {breadcrumbs && (\n <Layout.Item>\n <Breadcrumbs>\n {breadcrumbs.map((breadcrumb, index) => (\n <Breadcrumbs.Link key={index} {...breadcrumb} />\n ))}\n </Breadcrumbs>\n </Layout.Item>\n )}\n\n <Layout.Item sm={2} md={actionItems || editing ? 6 : 12}>\n <div className={styles[\"title-wrapper\"]}>\n {title.onChange && editing ? (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n if (title.onChange?.(editingTitle) !== false) {\n setEditing(false);\n }\n }}\n style={{ display: \"flex\" }}\n >\n <Flex alignItems=\"center\" grow={1} gap={2}>\n <TextField\n aria-label={title.editFieldLabel ?? \"Page title\"}\n defaultValue={title.text}\n flexGrow={1}\n ref={editFieldRef}\n onChange={(event) =>\n setEditingTitle(event.target.value)\n }\n onKeyDown={(e: KeyboardEvent<HTMLInputElement>) => {\n if (e.code === \"Escape\") {\n setEditing(false);\n setEditingTitle(title.text);\n }\n }}\n />\n\n <Flex alignItems=\"center\" gap={1}>\n <Tooltip>\n <Tooltip.Trigger>\n <Button\n icon={Check}\n aria-label={\n title.confirmButtonLabel ?? \"Update title\"\n }\n size=\"small\"\n appearance=\"primary\"\n onClick={() => {\n if (title.onChange?.(editingTitle) !== false) {\n setEditing(false);\n }\n }}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>\n {title.confirmButtonLabel ?? \"Update title\"}\n </Tooltip.Content>\n </Tooltip>\n\n <Tooltip>\n <Tooltip.Trigger>\n <Button\n icon={Close}\n aria-label={title.cancelButtonLabel ?? \"Cancel\"}\n size=\"small\"\n onClick={() => {\n setEditing(false);\n setEditingTitle(title.text);\n }}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>\n {title.cancelButtonLabel ?? \"Cancel\"}\n </Tooltip.Content>\n </Tooltip>\n </Flex>\n </Flex>\n </form>\n ) : (\n <>\n <Text\n variant=\"headline\"\n size=\"large\"\n el=\"h1\"\n className={styles.title}\n >\n {title.text}\n </Text>\n\n {title.onChange != null ? (\n <>\n {\" \"}\n <Tooltip>\n <Tooltip.Trigger>\n <Button\n icon={Edit}\n aria-label={title.editButtonLabel ?? \"Edit title\"}\n size=\"small\"\n appearance=\"ghost\"\n ref={editButtonRef}\n onClick={() => setEditing(true)}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>\n {title.editButtonLabel ?? \"Edit title\"}\n </Tooltip.Content>\n </Tooltip>\n </>\n ) : null}\n </>\n )}\n\n {preferenceItem}\n </div>\n\n {chips && (\n <Flex className={styles.chips}>\n {chips.map((chip, index) => (\n <Chip key={index} {...chip} />\n ))}\n </Flex>\n )}\n </Layout.Item>\n\n {actions && (\n <Layout.Item sm={2} md={6}>\n {actionItems}\n </Layout.Item>\n )}\n\n {description && (\n <Layout.Item md={12} className={styles.description}>\n {description}\n </Layout.Item>\n )}\n </Layout>\n </div>\n </header>\n );\n },\n);\n\nPageHeader.displayName = \"Page.Header\";\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type Ref,\n useContext,\n useEffect,\n useRef,\n useState,\n type UIEvent,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport { PageContext } from \"./PageContext\";\nimport { showsPageVirtualScroll } from \"./pageBreakpoint\";\nimport { useMergeRefs } from \"../../../hooks\";\n\n/**\n * Props for the PageContent component\n * @extends ComponentPropsWithoutRef<\"section\">\n */\nexport type PageContentProps = ComponentPropsWithoutRef<\"section\">;\n\n/**\n * PageContent component for the main content area of a page.\n *\n * Features:\n * - Renders as a section element inside Page's main landmark\n * - Virtual scrolling support for long content\n * - Automatic scroll synchronization\n * - Responsive design\n * - Portals into Page's content wrapper via context\n * - Scroll position management\n *\n * @example\n * <Page.Content>\n * <Text>Main page content goes here</Text>\n * <Button>Action Button</Button>\n * </Page.Content>\n */\nexport const PageContent = forwardRef(\n (props: PageContentProps, ref: Ref<HTMLElement>) => {\n const { children, className, ...rest } = props;\n const classNames = cx([styles[\"content\"]], className);\n const sectionRef = useRef<HTMLElement>(null);\n const virtualScrollRef = useRef<HTMLDivElement>(null);\n const mergedRef = useMergeRefs([sectionRef, ref]);\n const blocker = useRef(true);\n // Coalesce a burst of ResizeObserver notifications into one frame so the read\n // of document.scrollHeight can never round-trip synchronously into setState\n // (see the \"Maximum update depth exceeded\" feedback loop).\n const rafIdRef = useRef(0);\n const [leftOffset, setLeftOffset] = useState(-9);\n const [contentHeight, setContentHeight] = useState(0);\n\n const { contentWrapper, pageWidth } = useContext(PageContext);\n\n // The virtual scrollbar only exists at lg+ (see Page.module.scss). Gating the\n // sized spacer on the same breakpoint keeps it out of normal flow during\n // SSR/hydration and below lg, where it would otherwise feed back into the\n // document height the observer measures.\n const showVirtualScroll = showsPageVirtualScroll(pageWidth);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (!blocker.current) return;\n function updatePosition() {\n const newValue = window.scrollY;\n\n virtualScrollRef.current?.scrollTo(0, newValue ?? 0);\n }\n window?.addEventListener(\"scroll\", updatePosition, { passive: true });\n\n return () => {\n window?.removeEventListener(\"scroll\", updatePosition);\n };\n }, []);\n\n useEffect(() => {\n const section = sectionRef.current;\n if (!section) return;\n\n const wrapperParent = section.parentElement;\n const isWrapped =\n wrapperParent?.classList.contains(styles[\"content-wrapper\"]) ?? false;\n const heightTarget = isWrapped ? wrapperParent! : section;\n\n const observer = new ResizeObserver(() => {\n if (rafIdRef.current) return;\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = 0;\n if (!sectionRef.current) return;\n\n setLeftOffset(\n sectionRef.current.offsetLeft + sectionRef.current.offsetWidth - 9,\n );\n\n const offset =\n parseFloat(\n getComputedStyle(sectionRef.current).getPropertyValue(\"--offset\"),\n ) || 0;\n const rawHeight = document.documentElement.scrollHeight - offset;\n setContentHeight(\n Number.isFinite(rawHeight) ? Math.max(0, rawHeight) : 0,\n );\n });\n });\n\n observer.observe(section);\n if (isWrapped) observer.observe(heightTarget);\n\n return () => {\n observer.disconnect();\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = 0;\n }\n };\n }, [contentWrapper]);\n\n function scrollBody(e: UIEvent<HTMLElement>) {\n if (typeof window === \"undefined\") return;\n if (blocker.current) return;\n window.scrollTo(0, (e.target as HTMLDivElement).scrollTop);\n }\n\n const section = (\n <section className={classNames} ref={mergedRef} {...rest}>\n <div className={styles[\"content-inner\"]}>{children}</div>\n <div\n className={styles[\"virtual-scroll-container\"]}\n ref={virtualScrollRef}\n style={{\n left: leftOffset,\n }}\n onScrollCapture={scrollBody}\n onMouseEnter={() => {\n blocker.current = false;\n }}\n onMouseLeave={() => {\n blocker.current = true;\n }}\n >\n {showVirtualScroll && (\n <div style={{ width: 1, height: contentHeight }} />\n )}\n </div>\n </section>\n );\n\n if (contentWrapper) {\n return createPortal(section, contentWrapper);\n }\n\n if (contentWrapper === undefined) {\n return section;\n }\n\n return null;\n },\n);\n\nPageContent.displayName = \"PageContent\";\n","import { type RefObject, createContext } from \"react\";\n\n/**\n * Context props for the PagePanel component\n */\nexport type PagePanelContextProps = {\n /**\n * Reference to the panel header element for sticky content positioning.\n */\n headerRef?: RefObject<HTMLElement>;\n};\n\nexport const PagePanelContext = createContext<PagePanelContextProps>({});\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type Ref,\n useContext,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport { PagePanelContext } from \"./internal/PagePanelContext\";\nimport { useMergeRefs } from \"../../../hooks\";\n\n/**\n * Props for the PagePanelHeader component\n * @extends ComponentPropsWithoutRef<\"header\">\n */\nexport type PagePanelHeaderProps = ComponentPropsWithoutRef<\"header\">;\n\n/**\n * Header component for the panel that stays pinned to the top of the panel's scrollable area.\n *\n * Features:\n * - Sticky positioning at the top of the panel's scrollable content\n * - Proper semantic HTML structure\n * - Consistent padding and styling with the design system\n * - Supports all standard header element props\n *\n * @example\n * <Page.Panel.Header>\n * <Text variant=\"headline\" el=\"h3\">Panel Title</Text>\n * </Page.Panel.Header>\n */\nexport const PagePanelHeader = forwardRef(\n (props: PagePanelHeaderProps, ref: Ref<HTMLElement>) => {\n const { className, children, ...rest } = props;\n const { headerRef } = useContext(PagePanelContext);\n const classNames = cx(styles[\"panel-header\"], className);\n\n return (\n <header\n className={classNames}\n data-anv=\"page-panel-header\"\n ref={useMergeRefs([ref, headerRef])}\n {...rest}\n >\n {children}\n </header>\n );\n },\n);\n\nPagePanelHeader.displayName = \"PagePanelHeader\";\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type Ref,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport { PagePanelContext } from \"./internal/PagePanelContext\";\n\n/**\n * Props for the PagePanelContent component\n * @extends ComponentPropsWithoutRef<\"div\">\n */\nexport type PagePanelContentProps = ComponentPropsWithoutRef<\"div\"> & {\n /**\n * When true, the content will stick below the header during scroll, acting as a second header.\n * @default false\n */\n sticky?: boolean;\n};\n\n/**\n * Content container for the panel that holds the main scrollable content area.\n *\n * Features:\n * - Grows to fill the space between the panel's header and footer\n * - Scrolls independently of the header and footer once content overflows\n * - Optional sticky positioning below the header, for a second sticky region (e.g. a filter bar)\n * - Proper semantic HTML structure\n * - Consistent padding and styling with the design system\n * - Supports all standard div element props\n *\n * @example\n * // Basic content\n * <Page.Panel.Content>\n * <Text>Panel content goes here</Text>\n * </Page.Panel.Content>\n *\n * @example\n * // Sticky content (e.g., a search field that remains visible while scrolling)\n * <Page.Panel.Header>Panel Title</Page.Panel.Header>\n * <Page.Panel.Content sticky>\n * <TextField placeholder=\"Filter results...\" />\n * </Page.Panel.Content>\n * <Page.Panel.Content>\n * <Text>Scrollable results</Text>\n * </Page.Panel.Content>\n */\nexport const PagePanelContent = forwardRef(\n (props: PagePanelContentProps, ref: Ref<HTMLDivElement>) => {\n const { className, children, sticky = false, style, ...rest } = props;\n const { headerRef } = useContext(PagePanelContext);\n const [headerHeight, setHeaderHeight] = useState(0);\n\n useEffect(() => {\n const headerElement = headerRef?.current;\n if (!sticky || !headerElement) return;\n\n const updateHeight = () => {\n setHeaderHeight(headerElement.offsetHeight || 0);\n };\n\n updateHeight();\n const resizeObserver = new ResizeObserver(updateHeight);\n resizeObserver.observe(headerElement);\n\n return () => resizeObserver.disconnect();\n }, [sticky, headerRef]);\n\n const contentClassNames = cx(styles[\"panel-content\"], className, {\n [styles[\"sticky\"]]: sticky,\n });\n\n const stickyStyle = sticky ? { top: `${headerHeight}px` } : undefined;\n\n return (\n <div\n className={contentClassNames}\n data-anv=\"page-panel-content\"\n ref={ref}\n style={{ ...stickyStyle, ...style }}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n\nPagePanelContent.displayName = \"PagePanelContent\";\n","import { type ComponentPropsWithoutRef, forwardRef, type Ref } from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\n\n/**\n * Props for the PagePanelFooter component\n * @extends ComponentPropsWithoutRef<\"footer\">\n */\nexport type PagePanelFooterProps = ComponentPropsWithoutRef<\"footer\"> & {\n /**\n * When true, the footer will stick to the bottom of the panel's scrollable area.\n * @default false\n */\n sticky?: boolean;\n};\n\n/**\n * Footer component for the panel that displays action buttons and controls.\n *\n * Features:\n * - Flex layout that right-aligns action buttons and wraps on overflow\n * - Optional sticky positioning at the bottom of the panel\n * - Proper semantic HTML structure\n * - Consistent padding and styling with the design system\n * - Supports all standard footer element props\n *\n * @example\n * <Page.Panel.Footer sticky>\n * <Button appearance=\"primary\" onClick={handleSave}>Save</Button>\n * </Page.Panel.Footer>\n */\nexport const PagePanelFooter = forwardRef(\n (props: PagePanelFooterProps, ref: Ref<HTMLElement>) => {\n const { className, children, sticky = false, ...rest } = props;\n const classNames = cx(styles[\"panel-footer\"], className, {\n [styles[\"sticky\"]]: sticky,\n });\n\n return (\n <footer\n className={classNames}\n data-anv=\"page-panel-footer\"\n ref={ref}\n {...rest}\n >\n {children}\n </footer>\n );\n },\n);\n\nPagePanelFooter.displayName = \"PagePanelFooter\";\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type Ref,\n useContext,\n useEffect,\n useLayoutEffect,\n useState,\n useMemo,\n type CSSProperties,\n useRef,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport Dialog from \"../../../components/Dialog\";\nimport { PageContext, type PageContextProps } from \"./PageContext\";\nimport { isPageMobileWidth } from \"./pageBreakpoint\";\nimport {\n DrillDownContext,\n type DrillDownContextProps,\n} from \"../../../components/DrillDown/internal/DrillDownContext\";\nimport { useDrillDownContextState } from \"../../../components/DrillDown/internal/useDrillDownContextState\";\nimport drillDownStyles from \"../../../components/DrillDown/DrillDown.module.scss\";\nimport { useDrillDownContext } from \"../../../components/DrillDown/internal/useDrillDownContext\";\nimport { PagePanelHeader } from \"./PagePanelHeader\";\nimport { PagePanelContent } from \"./PagePanelContent\";\nimport { PagePanelFooter } from \"./PagePanelFooter\";\nimport { PagePanelContext } from \"./internal/PagePanelContext\";\n\n/**\n * Props for the PagePanel component\n * @extends ComponentPropsWithoutRef<\"div\">\n */\nexport type PagePanelProps = ComponentPropsWithoutRef<\"div\"> & {\n /**\n * Whether the panel is open\n * @default true\n */\n open?: boolean;\n /**\n * Size of the panel\n * @default \"medium\"\n */\n size?: \"small\" | \"medium\" | \"large\";\n /**\n * Whether to remove default padding from the panel\n * @default false\n */\n noPadding?: boolean;\n /**\n * Sets the default DrillDown index when used in an uncontrolled way\n */\n defaultDrillDownIndex?: DrillDownContextProps[\"index\"];\n /**\n * Callback to pass context to useDrillDown hook\n */\n onDrillDownContextChange?: (context: DrillDownContextProps) => void;\n};\n\nconst PagePanelInner = ({\n style,\n open,\n hostedInDialog,\n children,\n}: {\n style?: CSSProperties;\n open?: boolean;\n /**\n * Set when rendered inside the mobile Dialog fallback, which owns its own\n * scrollable region (`.scroller`) and focus trap. Skips the self-managed\n * overflow/tabIndex behavior below so sticky Header/Content/Footer pin to\n * that scroller instead of this unconstrained wrapper, and so the Dialog's\n * focus trap lands on the first real control instead of this container.\n */\n hostedInDialog?: boolean;\n children?: React.ReactNode;\n}) => {\n const { index } = useDrillDownContext();\n\n const classNames = cx([styles[\"panel-inner\"]], {\n [styles[\"drilldown-open\"]]: index !== undefined,\n });\n\n return (\n <div\n className={classNames}\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex */\n tabIndex={\n hostedInDialog\n ? undefined\n : typeof open !== \"undefined\" && open\n ? 0\n : -1\n }\n style={{\n ...style,\n ...(hostedInDialog\n ? {}\n : { overflowY: index === undefined ? \"auto\" : \"hidden\" }),\n }}\n >\n {children}\n </div>\n );\n};\n\n/**\n * PagePanel component for creating slide-out panels or dialogs.\n *\n * Features:\n * - Responsive design with dialog fallback on mobile\n * - Multiple size variants (small, medium, large)\n * - Optional padding control\n * - Persistent or controlled open state\n * - Automatic mobile dialog conversion\n * - Keyboard navigation and accessibility support\n * - Smooth animations and transitions\n * - Compound component structure with Header, Content, and Footer\n * - Sticky header and optional sticky footer around a scrollable content area\n *\n * @example\n * <Page.Panel open={isOpen} size=\"medium\">\n * <Page.Panel.Header>\n * <Text variant=\"headline\" el=\"h3\">Panel Title</Text>\n * </Page.Panel.Header>\n * <Page.Panel.Content>\n * <Text>Panel content goes here</Text>\n * </Page.Panel.Content>\n * <Page.Panel.Footer sticky>\n * <Button appearance=\"primary\" onClick={() => setIsOpen(false)}>Save</Button>\n * </Page.Panel.Footer>\n * </Page.Panel>\n */\nexport const PagePanel = Object.assign(\n forwardRef((props: PagePanelProps, ref: Ref<HTMLDivElement>) => {\n const {\n children,\n open,\n size = \"medium\",\n noPadding,\n style,\n className,\n defaultDrillDownIndex,\n onDrillDownContextChange,\n ...rest\n } = props;\n const [isMobile, setIsMobile] = useState<boolean>(false);\n const headerRef = useRef<HTMLElement>(null);\n\n const classNames = cx(\n [styles.panel, drillDownStyles.panel],\n [styles[size]],\n className,\n {\n [styles[\"open\"]]: typeof open === \"undefined\" ? true : open,\n [styles[\"persistent\"]]: typeof open === \"undefined\",\n [styles[\"noPadding\"]]: noPadding,\n },\n );\n\n const drillDownContextValue = useDrillDownContextState({\n defaultDrillDownIndex,\n });\n\n const drillDownContextProviderValue = useMemo(\n () => ({\n ...drillDownContextValue,\n hostIsInteractive: open !== false,\n }),\n [drillDownContextValue, open],\n );\n\n useLayoutEffect(() => {\n onDrillDownContextChange?.(drillDownContextProviderValue);\n }, [drillDownContextProviderValue]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const { pageWidth } = useContext<PageContextProps>(PageContext);\n const previousOpenRef = useRef(open);\n\n useEffect(() => {\n if (isMobile) {\n previousOpenRef.current = open;\n return;\n }\n\n if (previousOpenRef.current && open === false) {\n drillDownContextValue.onHostClose?.();\n drillDownContextValue.onHostClosed?.();\n }\n\n previousOpenRef.current = open;\n }, [open, isMobile, drillDownContextValue]);\n\n useLayoutEffect(() => {\n if (isMobile || !open || previousOpenRef.current) {\n return;\n }\n\n drillDownContextValue.setHostTrigger?.(\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null,\n );\n }, [open, isMobile, drillDownContextValue]);\n\n useLayoutEffect(() => {\n setIsMobile(isPageMobileWidth(pageWidth));\n }, [pageWidth]);\n\n if (typeof open !== \"undefined\" && isMobile) {\n return (\n <Dialog\n open={open}\n defaultDrillDownIndex={defaultDrillDownIndex}\n onDrillDownContextChange={onDrillDownContextChange}\n >\n <Dialog.Content>\n <PagePanelContext.Provider value={{ headerRef }}>\n <div\n className={classNames}\n aria-hidden={!open}\n aria-disabled={!open}\n ref={ref}\n {...rest}\n >\n <PagePanelInner style={style} open={open} hostedInDialog>\n {children}\n </PagePanelInner>\n </div>\n </PagePanelContext.Provider>\n </Dialog.Content>\n </Dialog>\n );\n }\n return (\n <DrillDownContext.Provider value={drillDownContextProviderValue}>\n <PagePanelContext.Provider value={{ headerRef }}>\n <div\n className={classNames}\n aria-hidden={!open}\n aria-disabled={!open}\n ref={ref}\n {...rest}\n >\n <PagePanelInner style={style} open={open}>\n {children}\n </PagePanelInner>\n </div>\n </PagePanelContext.Provider>\n </DrillDownContext.Provider>\n );\n }),\n {\n /**\n * Header component for the panel that stays pinned to the top of the panel's scrollable area.\n *\n * Features:\n * - Sticky positioning at the top of the panel's scrollable content\n * - Proper semantic HTML structure\n * - Consistent padding and styling with the design system\n * - Supports all standard header element props\n *\n * @example\n * <Page.Panel.Header>\n * <Text variant=\"headline\" el=\"h3\">Panel Title</Text>\n * </Page.Panel.Header>\n */\n Header: PagePanelHeader,\n /**\n * Content container for the panel that holds the main scrollable content area.\n *\n * Features:\n * - Grows to fill the space between the panel's header and footer\n * - Scrolls independently of the header and footer once content overflows\n * - Optional sticky positioning below the header, for a second sticky region (e.g. a filter bar)\n * - Proper semantic HTML structure\n * - Consistent padding and styling with the design system\n * - Supports all standard div element props\n *\n * @example\n * <Page.Panel.Content>\n * <Text>Panel content goes here</Text>\n * </Page.Panel.Content>\n *\n * @example\n * // A second, sticky Content region acting as a sub-header below Page.Panel.Header\n * <Page.Panel.Content sticky>\n * <TextField placeholder=\"Filter results...\" />\n * </Page.Panel.Content>\n * <Page.Panel.Content>\n * <Text>Scrollable results</Text>\n * </Page.Panel.Content>\n */\n Content: PagePanelContent,\n /**\n * Footer component for the panel that displays action buttons and controls.\n *\n * Features:\n * - Flex layout that right-aligns action buttons and wraps on overflow\n * - Optional sticky positioning at the bottom of the panel\n * - Proper semantic HTML structure\n * - Consistent padding and styling with the design system\n * - Supports all standard footer element props\n *\n * @example\n * <Page.Panel.Footer sticky>\n * <Button appearance=\"primary\" onClick={handleSave}>Save</Button>\n * </Page.Panel.Footer>\n */\n Footer: PagePanelFooter,\n },\n);\n\nPagePanel.displayName = \"PagePanel\";\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type Ref,\n useContext,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useLayoutPropsUtil } from \"../../../internal/hooks\";\nimport type { LayoutUtilProps } from \"../../../types\";\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport { PageContext } from \"./PageContext\";\n\n/**\n * Props for the PageFooter component\n * @extends ComponentPropsWithoutRef<\"div\">\n * @extends LayoutUtilProps\n */\nexport type PageFooterProps = ComponentPropsWithoutRef<\"div\"> & LayoutUtilProps;\n\n/**\n * PageFooter component for creating page footers with layout utilities.\n *\n * Features:\n * - Semantic footer element\n * - Layout utility props support\n * - Responsive design\n * - Accessibility support with proper footer landmark\n * - Flexible content positioning\n * - Portals into Page's footer slot via context\n *\n * @example\n * <Page.Footer>\n * <Text>Footer content with layout utilities</Text>\n * </Page.Footer>\n */\nexport const PageFooter = forwardRef(\n (props: PageFooterProps, ref: Ref<HTMLDivElement>) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const { children, className, style, ...rest } = componentProps;\n const { footerSlot } = useContext(PageContext);\n\n const classNames = cx([styles[\"content-footer\"]], className);\n const styleCombined = {\n ...style,\n ...layoutStyles,\n };\n\n const footer = (\n <footer className={classNames} ref={ref} style={styleCombined} {...rest}>\n {children}\n </footer>\n );\n\n if (footerSlot) {\n return createPortal(footer, footerSlot);\n }\n\n if (footerSlot === undefined) {\n return footer;\n }\n\n return null;\n },\n);\nPageFooter.displayName = \"PageFooter\";\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport cx from \"classnames\";\nimport styles from \"./Page.module.scss\";\nimport { PageSidebar } from \"./PageSidebar\";\nimport { PageSidebarHeader } from \"./PageSidebarHeader\";\nimport { PageHeader } from \"./PageHeader\";\nimport { PageContent } from \"./PageContent\";\nimport { PagePanel } from \"./PagePanel\";\nimport { PageFooter } from \"./PageFooter\";\nimport { PageContext } from \"./PageContext\";\nimport { useMergeRefs } from \"../../../hooks\";\n\n//--- Start Page Element ---//\n/**\n * Props for the Page component\n * @extends ComponentPropsWithoutRef<\"div\">\n */\nexport type PageProps = ComponentPropsWithoutRef<\"div\">;\n\n/**\n * Page component for creating full-page layouts with navigation and content areas.\n *\n * Features:\n * - Container for complete page layouts\n * - Supports sidebar navigation with collapsible state\n * - Header with breadcrumbs, chips, and action buttons\n * - Main content area with virtual scrolling\n * - Optional slide-out panels with responsive dialog fallback\n * - Footer with layout utilities\n * - Responsive design with mobile adaptations\n * - Accessibility support with proper landmarks\n * - Automatic tracking ID generation for analytics\n * - Local storage persistence for sidebar state\n *\n * @example\n * <Page>\n * <Page.Sidebar currentPageTitle=\"Navigation\">\n * <Page.SidebarHeader>\n * <Text variant=\"headline\" el=\"h2\">Navigation</Text>\n * </Page.SidebarHeader>\n * <SideNav>\n * <SideNavLink pathname=\"/\">Home</SideNavLink>\n * </SideNav>\n * </Page.Sidebar>\n * <Page.Header\n * title=\"Page Title\"\n * breadcrumbs={[{ href: \"/\", children: \"Home\" }]}\n * actions={{ primary: { label: \"Save\", onClick: handleSave } }}\n * />\n * <Page.Content>\n * <Text>Main content</Text>\n * </Page.Content>\n * <Page.Panel open={isPanelOpen} size=\"medium\">\n * <Page.Panel.Content>\n * <Text>Panel content</Text>\n * </Page.Panel.Content>\n * </Page.Panel>\n * <Page.Footer>\n * <Text>Footer content</Text>\n * </Page.Footer>\n * </Page>\n */\nexport const Page = Object.assign(\n forwardRef<HTMLDivElement, PageProps>(function PageInner(props, ref) {\n const { children, className, ...rest } = props;\n const classNames = cx(styles[\"page\"], className);\n const elRef = useRef<HTMLDivElement>(null);\n const combinedRef = useMergeRefs([elRef, ref]);\n\n const [pageWidth, setPageWidth] = useState<number>(0);\n const [contentWrapper, setContentWrapper] = useState<HTMLElement | null>(\n null,\n );\n const [footerSlot, setFooterSlot] = useState<HTMLElement | null>(null);\n\n // Capture the portal targets with stable callback refs that ignore detach\n // (node === null). React calls a ref with null while it tears down/hides a\n // subtree (the disappearLayoutEffects phase); routing that null straight\n // into setState — as a bare `ref={setContentWrapper}` does — re-renders Page\n // mid-teardown, which detaches the ref again, looping until React throws\n // \"Maximum update depth exceeded\". The <main>/<div> below share Page's\n // lifetime, so they only truly unmount when Page does, making a retained\n // node after a real unmount harmless. Bailing when the node is unchanged\n // also avoids a redundant render if the same element is re-attached.\n const contentWrapperRef = useCallback((node: HTMLElement | null) => {\n setContentWrapper((prev) => (node && node !== prev ? node : prev));\n }, []);\n const footerSlotRef = useCallback((node: HTMLElement | null) => {\n setFooterSlot((prev) => (node && node !== prev ? node : prev));\n }, []);\n\n useLayoutEffect(() => {\n const element = elRef.current;\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setPageWidth(entry.contentRect.width);\n }\n });\n if (element) {\n resizeObserver.observe(element);\n }\n // disconnect() releases every observation, so an explicit unobserve here\n // would be redundant.\n return () => resizeObserver.disconnect();\n }, [elRef]);\n\n const contextValue = useMemo(\n () => ({ pageWidth, contentWrapper, footerSlot }),\n [pageWidth, contentWrapper, footerSlot],\n );\n\n return (\n <PageContext.Provider value={contextValue}>\n <div className={classNames} data-anv=\"Page\" ref={combinedRef} {...rest}>\n <div className={styles[\"container\"]}>\n {children}\n <main\n className={styles[\"content-wrapper\"]}\n ref={contentWrapperRef}\n />\n <div className={styles[\"footer-slot\"]} ref={footerSlotRef} />\n </div>\n </div>\n </PageContext.Provider>\n );\n }),\n {\n /**\n * PageSidebar component for creating collapsible navigation sidebars.\n *\n * Features:\n * - Collapsible sidebar with localStorage persistence\n * - Responsive design with adaptive popover on mobile\n * - Automatic tracking ID generation for analytics\n * - Keyboard navigation and accessibility support\n * - Toggle button with tooltip\n * - Context provider for sidebar state\n * - Mobile-friendly popover navigation\n *\n * @example\n * <Page.Sidebar currentPageTitle=\"Navigation\">\n * <Page.SidebarHeader>\n * <Text variant=\"headline\" el=\"h2\">Sidebar Title</Text>\n * </Page.SidebarHeader>\n * <SideNav>\n * <SideNavLink pathname=\"/\">Home</SideNavLink>\n * </SideNav>\n * </Page.Sidebar>\n */\n Sidebar: PageSidebar,\n /**\n * PageSidebarHeader component for creating header sections within sidebars.\n *\n * Features:\n * - Container for sidebar header content\n * - Automatic visibility handling based on sidebar collapsed state\n * - Supports all standard div props\n * - Context-aware styling\n *\n * @example\n * <Page.SidebarHeader>\n * <Text variant=\"headline\" el=\"h2\" size=\"medium\">\n * Sidebar Title\n * </Text>\n * </Page.SidebarHeader>\n */\n SidebarHeader: PageSidebarHeader,\n /**\n * PageHeader component for creating page headers with navigation and actions.\n *\n * Features:\n * - Page title with semantic heading\n * - Breadcrumb navigation support\n * - Status chips display\n * - Primary and secondary action buttons\n * - Preference action button/link\n * - Responsive layout with fluid grid\n * - Accessibility support with proper ARIA labels\n * - Flexible layout configuration\n * - Description content support\n *\n * @example\n * <Page.Header\n * title=\"Page Title\"\n * breadcrumbs={[\n * { href: \"/\", children: \"Home\" },\n * { children: \"Current Page\" }\n * ]}\n * chips={[{ label: \"Status\" }]}\n * actions={{\n * primary: { label: \"Save\", onClick: handleSave },\n * secondary: [{ label: \"Cancel\", onClick: handleCancel }]\n * }}\n * />\n */\n Header: PageHeader,\n /**\n * PageContent component for the main content area of a page.\n *\n * Features:\n * - Renders as a section element inside Page's main landmark\n * - Virtual scrolling support for long content\n * - Automatic scroll synchronization\n * - Responsive design\n * - Portals into Page's content wrapper via context\n * - Scroll position management\n *\n * @example\n * <Page.Content>\n * <Text>Main page content goes here</Text>\n * <Button>Action Button</Button>\n * </Page.Content>\n */\n Content: PageContent,\n /**\n * PagePanel component for creating slide-out panels or dialogs.\n *\n * Features:\n * - Responsive design with dialog fallback on mobile\n * - Multiple size variants (small, medium, large)\n * - Optional padding control\n * - Persistent or controlled open state\n * - Automatic mobile dialog conversion\n * - Keyboard navigation and accessibility support\n * - Smooth animations and transitions\n * - Compound component structure with Header, Content, and Footer\n * - Sticky header and optional sticky footer around a scrollable content area\n *\n * @example\n * <Page.Panel open={isOpen} size=\"medium\">\n * <Page.Panel.Header>\n * <Text variant=\"headline\" el=\"h3\">Panel Title</Text>\n * </Page.Panel.Header>\n * <Page.Panel.Content>\n * <Text>Panel content</Text>\n * </Page.Panel.Content>\n * <Page.Panel.Footer>\n * <Button onClick={() => setIsOpen(false)}>Close</Button>\n * </Page.Panel.Footer>\n * </Page.Panel>\n */\n Panel: PagePanel,\n /**\n * PageFooter component for creating page footers with layout utilities.\n *\n * Features:\n * - Semantic footer element\n * - Layout utility props support\n * - Responsive design\n * - Accessibility support with proper footer landmark\n * - Flexible content positioning\n *\n * @example\n * <Page.Footer>\n * <Text>Footer content with layout utilities</Text>\n * </Page.Footer>\n */\n Footer: PageFooter,\n },\n);\nPage.displayName = \"Page\";\n"],"names":["core.primitive?.BreakpointLg","props","SegmentSVG","RespClose","RespOpen","OpenSVG","CloseSVG","IconKeyboardArrowDown","LocalSettings","ref","rest","MoreVert","Check","Close","Edit","section"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SavedFiltersButton-vZ38Mty8.js","sources":["../src/beta/components/SavedFiltersButton/parts.ts","../src/beta/components/SavedFiltersButton/internal/AddSavedFilterDrawer.tsx","../src/beta/components/SavedFiltersButton/internal/EditSavedFiltersDrawer.tsx","../src/beta/components/SavedFiltersButton/SavedFiltersButton.tsx"],"sourcesContent":["import { COMMON_PART } from \"../../../internal/constants/anvParts\";\n\n/**\n * `data-anv-part` names for SavedFiltersButton's interactive sub-elements.\n *\n * The trigger is stamped by FilterTriggerButton (`FilterBar` PARTS.trigger) —\n * do not redeclare `trigger` here. Popover / menu / option parts come from\n * shared OptionsPopover / OptionsPanel internals.\n *\n * Scope in-wrapper queries by the consumer's `data-cy` on the trigger.\n * Drawers and their contents render in the top layer — target those parts\n * by attribute directly. Edit-row buttons also carry `data-id={preset.id}`.\n */\nexport const PARTS = {\n // Common roles (shared values)\n input: COMMON_PART.input,\n cancelButton: COMMON_PART.cancelButton,\n applyButton: COMMON_PART.applyButton,\n\n // SavedFiltersButton-specific roles\n /** Popover footer CTA that opens the Save Current Filter drawer. */\n saveCurrentButton: \"save-current-button\",\n /** Popover footer CTA that opens the Edit Saved Filters drawer. */\n manageButton: \"manage-button\",\n /** Save Current Filter drawer shell. */\n addDrawer: \"add-drawer\",\n /** Edit Saved Filters drawer shell. */\n editDrawer: \"edit-drawer\",\n /**\n * Per-preset edit drilldown screen inside the Edit drawer (visible after\n * clicking an edit-row-button).\n */\n drilldown: \"drilldown\",\n /** Per-preset Edit affordance in the Edit drawer list (use with `data-id`). */\n editRowButton: \"edit-row-button\",\n /** Drilldown Delete Filter action. */\n deleteButton: \"delete-button\",\n /** Drilldown Update Filter action. */\n updateButton: \"update-button\",\n /** Edit drawer list-view Close action. */\n closeButton: \"close-button\",\n} as const;\n","import { useEffect, useState } from \"react\";\nimport Button from \"../../../../components/Button\";\nimport Drawer from \"../../../../components/Drawer\";\nimport Flex from \"../../../../components/Flex\";\nimport { TextField } from \"../../../../components/TextField\";\nimport { ANV_PART_ATTR } from \"../../../../internal/constants/anvParts\";\nimport type { Filter } from \"../../FilterBar/internal/types\";\nimport { PARTS } from \"../parts\";\n\ntype AddSavedFilterDrawerProps = {\n open: boolean;\n onClose: () => void;\n /** Snapshot of filters captured when the drawer opened. */\n filtersSnapshot: Filter[];\n onSave: (payload: {\n name: string;\n filters: Filter[];\n }) => void | Promise<void>;\n /**\n * Consumer-supplied name validator. Returning a string blocks Add and is\n * surfaced as the field's error message; `undefined` allows submit.\n */\n validateName?: (name: string) => string | undefined;\n};\n\n/**\n * Drawer rendered when the user clicks \"Save Current Filter\" in the\n * SavedFiltersButton popover. Captures a name and emits `onSave` with the\n * filters snapshot. Supports async `onSave`; while pending the Add button\n * shows a loading spinner and the form is disabled.\n *\n * If `onSave` rejects, the drawer stays open with the current input so the\n * user can retry or cancel. On success the drawer closes.\n */\nexport const AddSavedFilterDrawer = ({\n open,\n onClose,\n filtersSnapshot,\n onSave,\n validateName,\n}: AddSavedFilterDrawerProps) => {\n const [name, setName] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | undefined>(undefined);\n // After a successful save, the consumer will likely add the just-saved\n // name into their `savedFilters` list synchronously. If we keep running\n // `validateName` against the current input we'll flash a \"name already\n // exists\" error (the validator now sees our own freshly-created preset)\n // before the parent unmounts us. This flag suspends validation between\n // `onSave` resolving and the drawer actually closing.\n const [justSubmitted, setJustSubmitted] = useState(false);\n\n // Reset state every time the drawer opens. We don't reset on close so the\n // closing animation can flush without snapping the visible state mid-tween.\n useEffect(() => {\n if (open) {\n setName(\"\");\n setSubmitting(false);\n setSubmitError(undefined);\n setJustSubmitted(false);\n }\n }, [open]);\n\n const trimmed = name.trim();\n const validationError =\n !justSubmitted && validateName ? validateName(trimmed) : undefined;\n const canSubmit = trimmed.length > 0 && !validationError && !submitting;\n\n const handleAdd = async () => {\n if (!canSubmit) return;\n setSubmitting(true);\n setSubmitError(undefined);\n try {\n await onSave({ name: trimmed, filters: filtersSnapshot });\n // Suspend validation; the parent will close us synchronously, but the\n // closing transition keeps us mounted for a beat — long enough to\n // re-render with the consumer's updated savedFilters list, which\n // otherwise would now collide with our input value.\n setJustSubmitted(true);\n onClose();\n } catch (err) {\n setSubmitError(\n err instanceof Error && err.message\n ? err.message\n : \"Failed to save filter.\",\n );\n setSubmitting(false);\n }\n };\n\n const handleCancel = () => {\n if (submitting) return;\n onClose();\n };\n\n return (\n <Drawer\n open={open}\n onClose={handleCancel}\n {...{ [ANV_PART_ATTR]: PARTS.addDrawer }}\n >\n <Drawer.Header>Save Current Filter</Drawer.Header>\n <Drawer.Content>\n <Flex direction=\"column\" gap=\"4\" grow={1}>\n <TextField\n label=\"Filter Name\"\n placeholder=\"Name this filter\"\n value={name}\n onChange={(e) => setName(e?.target.value ?? \"\")}\n disabled={submitting}\n required\n error={submitError ?? validationError}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && canSubmit) {\n e.preventDefault();\n handleAdd();\n }\n }}\n {...{ [ANV_PART_ATTR]: PARTS.input }}\n />\n </Flex>\n </Drawer.Content>\n <Drawer.Footer>\n <Flex justifyContent=\"flex-end\" gap=\"3\" grow={1}>\n <Button\n onClick={handleCancel}\n disabled={submitting}\n {...{ [ANV_PART_ATTR]: PARTS.cancelButton }}\n >\n Cancel\n </Button>\n <Button\n appearance=\"primary\"\n onClick={handleAdd}\n disabled={!canSubmit}\n loading={submitting}\n {...{ [ANV_PART_ATTR]: PARTS.applyButton }}\n >\n Add Saved Filter\n </Button>\n </Flex>\n </Drawer.Footer>\n </Drawer>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport IconEdit from \"@servicetitan/hammer-icon/mdi/round/edit.svg\";\nimport Alert from \"../../../../components/Alert\";\nimport Button from \"../../../../components/Button\";\nimport Divider from \"../../../../components/Divider\";\nimport {\n DndSort,\n type DndSortChangeEvent,\n} from \"../../../../components/DndSort\";\nimport Drawer from \"../../../../components/Drawer\";\nimport { DrillDown, useDrillDown } from \"../../../../components/DrillDown\";\nimport Flex from \"../../../../components/Flex\";\nimport Text from \"../../../../components/Text\";\nimport { TextField } from \"../../../../components/TextField\";\nimport { ANV_PART_ATTR } from \"../../../../internal/constants/anvParts\";\nimport { DateListDialog } from \"../../FilterBar/FilterDateList\";\nimport { getAdapter } from \"../../FilterBar/internal/adapters\";\nimport {\n cloneFiltersWithItemRefs,\n updateSingleFilter,\n} from \"../../FilterBar/internal/utils/filter-state\";\nimport type {\n DateListFilter,\n DateListLibraryOptionId,\n Filter,\n} from \"../../FilterBar/internal/types\";\nimport { PARTS } from \"../parts\";\nimport type { SavedFilter, SavedFiltersAlertText } from \"../types\";\n\n/**\n * Settled outcome of a delete or update operation. Surfaced as an Alert on\n * the list view of the drawer; persists until the drawer closes or another\n * outcome replaces it.\n */\ntype DrawerAlert = {\n status: \"success\" | \"danger\";\n title: string;\n};\n\ntype EditSavedFiltersDrawerProps = {\n open: boolean;\n onClose: () => void;\n savedFilters: SavedFilter[];\n /** Drilldown's \"Update Filter\" action. May return a promise. */\n onUpdate?: (\n id: string,\n update: { name: string; filters: SavedFilter[\"filters\"] },\n ) => void | Promise<void>;\n /** Drilldown's \"Delete Filter\" action. May return a promise. */\n onDelete?: (id: string) => void | Promise<void>;\n /**\n * Optional drag-to-reorder callback. When provided, the list view renders\n * each row as a `DndSort.Card` with a drag handle and emits the new\n * `orderedIds` after a drop. When omitted, the list renders as a static\n * stack with no handles.\n */\n onReorder?: (orderedIds: string[]) => void | Promise<void>;\n /**\n * Optional validator for the name field in the drilldown. The `currentId`\n * is set to the preset being edited so the consumer can permit the row's\n * own name in uniqueness checks.\n */\n validateName?: (name: string, currentId?: string) => string | undefined;\n /** Optional override for the auto-managed alert text. */\n alertText?: SavedFiltersAlertText;\n};\n\nconst DEFAULT_ALERT_TEXT: Required<SavedFiltersAlertText> = {\n saveSuccess: \"Filter saved.\",\n saveError: \"Failed to save filter.\",\n updateSuccess: \"Filter updated.\",\n updateError: \"Failed to update filter.\",\n deleteSuccess: \"Filter deleted.\",\n deleteError: \"Failed to delete filter.\",\n reorderError: \"Failed to reorder filters.\",\n};\n\n/** The per-preset edit screen lives at drilldown index 0. */\nconst EDIT_INDEX = 0;\n\n/**\n * Drawer that lets the user manage existing saved filters. Composed of two\n * views — a list of presets (the Drawer host) and a per-preset edit screen\n * (a `DrillDown` child) that reuses the FilterBar adapter `renderDrawer`\n * machinery to render edit fields. Navigation between the two is driven by\n * `useDrillDown`, which also wires the back-button affordance built into\n * `DrillDown.Header`.\n */\nexport const EditSavedFiltersDrawer = ({\n open,\n onClose,\n savedFilters,\n onUpdate,\n onDelete,\n onReorder,\n validateName,\n alertText,\n}: EditSavedFiltersDrawerProps) => {\n const { setIndex, back, drillDownProps } = useDrillDown();\n\n // Which preset the user clicked Edit on. `null` while on the list view.\n // We track this ourselves because DrillDown only tracks \"which screen is\n // active,\" not \"which preset is being edited.\"\n const [editingId, setEditingId] = useState<string | null>(null);\n\n // Drilldown-local form state. Re-seeded whenever a new preset is opened\n // (i.e. editingId changes); not re-seeded on each parent re-render so the\n // consumer can hot-swap `savedFilters` mid-edit without clobbering edits.\n const [drilldownName, setDrilldownName] = useState(\"\");\n const [drilldownDraft, setDrilldownDraft] = useState<Filter[]>([]);\n const [dateListDialogState, setDateListDialogState] = useState<{\n filterId: string;\n libraryId: DateListLibraryOptionId;\n } | null>(null);\n const [submitting, setSubmitting] = useState<\"update\" | \"delete\" | null>(\n null,\n );\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const seededForRef = useRef<string | null>(null);\n\n // Alerts surface settled outcomes from update / delete / reorder.\n // listAlert appears at the top of the list view (most outcomes return\n // there); drilldownAlert appears at the top of the drilldown content when\n // an Update failed and we need to keep the user's in-progress edits\n // available for retry.\n const [listAlert, setListAlert] = useState<DrawerAlert | null>(null);\n const [drilldownAlert, setDrilldownAlert] = useState<DrawerAlert | null>(\n null,\n );\n\n // Reset everything on drawer close so the next open starts at the list\n // with no stale state.\n useEffect(() => {\n if (!open) {\n setEditingId(null);\n seededForRef.current = null;\n setSubmitError(null);\n setSubmitting(null);\n setListAlert(null);\n setDrilldownAlert(null);\n setIndex(undefined);\n }\n }, [open, setIndex]);\n\n const drilldownTarget = editingId\n ? savedFilters.find((s) => s.id === editingId)\n : undefined;\n\n // Seed the drilldown form when entering edit on a new preset. Not\n // re-seeded when the consumer's savedFilters array updates mid-edit —\n // once a drilldown is open, the user's edits are authoritative until\n // they Update, Delete, or Cancel.\n useEffect(() => {\n if (!editingId || !drilldownTarget) return;\n if (seededForRef.current === editingId) return;\n seededForRef.current = editingId;\n setDrilldownName(drilldownTarget.name);\n setDrilldownDraft(cloneFiltersWithItemRefs(drilldownTarget.filters));\n setSubmitError(null);\n }, [editingId, drilldownTarget]);\n\n const resolvedAlertText = useMemo(\n () => ({ ...DEFAULT_ALERT_TEXT, ...alertText }),\n [alertText],\n );\n\n const handleEdit = useCallback(\n (id: string) => {\n setListAlert(null);\n setEditingId(id);\n setIndex(EDIT_INDEX);\n },\n [setIndex],\n );\n\n // DndSort's drop event carries the new id ordering for the zone; we hand\n // that straight to the consumer so they can re-sort `savedFilters`. The\n // callback may return a promise — a rejection surfaces as a danger alert\n // on the list view (matching the delete-failure pattern) so failures\n // aren't invisible. A thrown `Error` with a message takes precedence over\n // the configured `reorderError` text, mirroring update / delete.\n const handleDrop = useCallback(\n (event: DndSortChangeEvent) => {\n if (!onReorder || !event.valid || !event.zoneSort) return;\n Promise.resolve(onReorder(event.zoneSort.map((id) => String(id)))).catch(\n (err) => {\n console.error(\n \"SavedFiltersButton onReorderSavedFilters failed:\",\n err,\n );\n setListAlert({\n status: \"danger\",\n title:\n err instanceof Error && err.message\n ? err.message\n : resolvedAlertText.reorderError,\n });\n },\n );\n },\n [onReorder, resolvedAlertText],\n );\n\n const sortedIds = useMemo(\n () => savedFilters.map((s) => s.id),\n [savedFilters],\n );\n\n // Pop back to the list. Clears form scratch state so the next drilldown\n // entry seeds fresh, and clears the drilldown's error alert.\n const handleBackToList = useCallback(() => {\n seededForRef.current = null;\n setEditingId(null);\n setSubmitError(null);\n setDrilldownAlert(null);\n back();\n }, [back]);\n\n const handleDraftChange = useCallback((filterId: string, value: unknown) => {\n setDrilldownDraft((prev) => updateSingleFilter(prev, filterId, value));\n }, []);\n\n const requestDateListDialog = useCallback(\n (filterId: string, libraryId: DateListLibraryOptionId) => {\n setDateListDialogState({ filterId, libraryId });\n },\n [],\n );\n\n // Render the per-filter form fields by delegating to each adapter's\n // renderDrawer — the exact same machinery FilterDrawer uses, so any\n // adapter that works there works here too.\n const drilldownForm = useMemo(() => {\n if (!drilldownTarget) return null;\n return drilldownDraft.map((draftFilter) => {\n const originalFilter =\n drilldownTarget.filters.find((f) => f.id === draftFilter.id) ??\n draftFilter;\n return getAdapter(draftFilter).renderDrawer({\n originalFilter,\n draftFilter,\n onDraftChange: handleDraftChange,\n requestDateListDialog,\n });\n });\n }, [\n drilldownDraft,\n drilldownTarget,\n handleDraftChange,\n requestDateListDialog,\n ]);\n\n const trimmedName = drilldownName.trim();\n const validationError =\n validateName && editingId\n ? validateName(trimmedName, editingId)\n : undefined;\n const canSubmit =\n editingId !== null &&\n trimmedName.length > 0 &&\n !validationError &&\n submitting === null;\n\n const handleUpdate = useCallback(async () => {\n if (!editingId || !onUpdate || !canSubmit) return;\n setSubmitting(\"update\");\n setSubmitError(null);\n setDrilldownAlert(null);\n try {\n await onUpdate(editingId, {\n name: trimmedName,\n filters: drilldownDraft,\n });\n // Success: pop back to the list with a success alert.\n seededForRef.current = null;\n setEditingId(null);\n back();\n setSubmitting(null);\n setListAlert({\n status: \"success\",\n title: resolvedAlertText.updateSuccess,\n });\n } catch (err) {\n // Failure: stay in drilldown so the user can adjust and retry. The\n // server error surfaces as a drilldown-level alert above the form.\n setDrilldownAlert({\n status: \"danger\",\n title:\n err instanceof Error && err.message\n ? err.message\n : resolvedAlertText.updateError,\n });\n setSubmitting(null);\n }\n }, [\n editingId,\n onUpdate,\n canSubmit,\n trimmedName,\n drilldownDraft,\n resolvedAlertText,\n back,\n ]);\n\n const handleDelete = useCallback(async () => {\n if (!editingId || !onDelete || submitting !== null) return;\n if (drilldownTarget?.disableDelete) return;\n setSubmitting(\"delete\");\n setSubmitError(null);\n setDrilldownAlert(null);\n try {\n await onDelete(editingId);\n // Success: pop back to the list with a success alert.\n seededForRef.current = null;\n setEditingId(null);\n back();\n setSubmitting(null);\n setListAlert({\n status: \"success\",\n title: resolvedAlertText.deleteSuccess,\n });\n } catch (err) {\n // Failure: pop back to the list with an error alert — the drilldown\n // had nothing to preserve since the user was trying to remove the\n // row entirely.\n seededForRef.current = null;\n setEditingId(null);\n back();\n setSubmitting(null);\n setListAlert({\n status: \"danger\",\n title:\n err instanceof Error && err.message\n ? err.message\n : resolvedAlertText.deleteError,\n });\n }\n }, [\n editingId,\n onDelete,\n submitting,\n drilldownTarget,\n resolvedAlertText,\n back,\n ]);\n\n // dateList dialog target derives from drilldownDraft (so the dialog can\n // pre-seed from whatever's currently in the draft).\n const dateListDialogTarget = dateListDialogState\n ? drilldownDraft.find(\n (f): f is DateListFilter =>\n f.id === dateListDialogState.filterId && f.type === \"dateList\",\n )\n : undefined;\n const dateListDialogSelected = dateListDialogTarget?.selectedOption;\n const dateListDialogInitialValue =\n dateListDialogSelected &&\n dateListDialogSelected.id === dateListDialogState?.libraryId &&\n dateListDialogSelected.value !== null\n ? dateListDialogSelected.value\n : undefined;\n\n const drilldownTitle = drilldownTarget?.name ?? \"Edit Saved Filter\";\n\n return (\n <>\n <Drawer\n open={open}\n onClose={onClose}\n {...drillDownProps}\n {...{ [ANV_PART_ATTR]: PARTS.editDrawer }}\n >\n {/* Host view — the saved-filters list. Visible whenever no\n DrillDown screen is active. */}\n <Drawer.Header>Edit Saved Filters</Drawer.Header>\n <Drawer.Content>\n <Flex direction=\"column\" gap=\"4\" grow={1}>\n {listAlert && (\n <Alert title={listAlert.title} status={listAlert.status} />\n )}\n {savedFilters.length === 0 ? (\n <Text subdued size=\"small\">\n No saved filters to edit.\n </Text>\n ) : onReorder ? (\n <DndSort onDrop={handleDrop}>\n <DndSort.Zone\n sortable\n id=\"saved-filters-zone\"\n label=\"Saved filters\"\n orientation=\"vertical\"\n sortedIds={sortedIds}\n gap=\"2\"\n >\n {savedFilters.map((saved) => (\n <DndSort.Card\n key={saved.id}\n id={saved.id}\n label={saved.name}\n dragOnlyWithHandle\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"2\"\n grow={1}\n >\n <Text>{saved.name}</Text>\n {!saved.disableEdit && (\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={IconEdit}\n aria-label={`Edit ${saved.name}`}\n data-id={saved.id}\n onClick={() => handleEdit(saved.id)}\n {...{ [ANV_PART_ATTR]: PARTS.editRowButton }}\n />\n )}\n </Flex>\n </DndSort.Card>\n ))}\n </DndSort.Zone>\n </DndSort>\n ) : (\n <Flex direction=\"column\" gap=\"2\">\n {savedFilters.map((saved) => (\n <Flex\n key={saved.id}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"2\"\n >\n <Text>{saved.name}</Text>\n {!saved.disableEdit && (\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={IconEdit}\n aria-label={`Edit ${saved.name}`}\n data-id={saved.id}\n onClick={() => handleEdit(saved.id)}\n {...{ [ANV_PART_ATTR]: PARTS.editRowButton }}\n />\n )}\n </Flex>\n ))}\n </Flex>\n )}\n </Flex>\n </Drawer.Content>\n <Drawer.Footer>\n <Flex justifyContent=\"flex-end\" grow={1}>\n <Button\n onClick={onClose}\n {...{ [ANV_PART_ATTR]: PARTS.closeButton }}\n >\n Close\n </Button>\n </Flex>\n </Drawer.Footer>\n\n {/* Per-preset edit screen. `DrillDown.Header` brings its own back\n button (aria-label \"Previous\"); we hook into `back()` via our\n handleBackToList to clear local form scratch state when popping\n back to the list. */}\n <DrillDown\n index={EDIT_INDEX}\n interactive={dateListDialogState === null}\n {...{ [ANV_PART_ATTR]: PARTS.drilldown }}\n >\n <DrillDown.Header>{drilldownTitle}</DrillDown.Header>\n <DrillDown.Content>\n <Flex direction=\"column\" gap=\"4\" grow={1}>\n {drilldownAlert && (\n <Alert\n title={drilldownAlert.title}\n status={drilldownAlert.status}\n />\n )}\n <TextField\n label=\"Filter Name\"\n placeholder=\"Name this filter\"\n value={drilldownName}\n onChange={(e) => setDrilldownName(e?.target.value ?? \"\")}\n disabled={submitting !== null}\n required\n error={submitError ?? validationError}\n {...{ [ANV_PART_ATTR]: PARTS.input }}\n />\n <Divider />\n {drilldownForm}\n </Flex>\n </DrillDown.Content>\n <DrillDown.Footer>\n <Flex\n justifyContent={\n drilldownTarget?.disableDelete ? \"flex-end\" : \"space-between\"\n }\n gap=\"3\"\n grow={1}\n >\n {!drilldownTarget?.disableDelete && (\n <Button\n appearance=\"danger-secondary\"\n onClick={handleDelete}\n loading={submitting === \"delete\"}\n disabled={submitting !== null}\n {...{ [ANV_PART_ATTR]: PARTS.deleteButton }}\n >\n Delete Filter\n </Button>\n )}\n <Flex gap=\"3\">\n <Button\n onClick={handleBackToList}\n disabled={submitting !== null}\n {...{ [ANV_PART_ATTR]: PARTS.cancelButton }}\n >\n Cancel\n </Button>\n <Button\n appearance=\"primary\"\n onClick={handleUpdate}\n disabled={!canSubmit}\n loading={submitting === \"update\"}\n {...{ [ANV_PART_ATTR]: PARTS.updateButton }}\n >\n Update Filter\n </Button>\n </Flex>\n </Flex>\n </DrillDown.Footer>\n </DrillDown>\n </Drawer>\n <DateListDialog\n libraryId={dateListDialogState?.libraryId ?? null}\n parentFilterId={dateListDialogState?.filterId ?? \"\"}\n initialValue={dateListDialogInitialValue}\n mode={dateListDialogTarget?.mode}\n dialogCtaLabel=\"Save\"\n onCommit={(option) => {\n if (dateListDialogState) {\n handleDraftChange(dateListDialogState.filterId, option);\n }\n setDateListDialogState(null);\n }}\n onCancel={() => setDateListDialogState(null)}\n />\n </>\n );\n};\n","import {\n type KeyboardEvent,\n type ReactElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport IconAdd from \"@servicetitan/hammer-icon/mdi/round/add.svg\";\nimport IconEdit from \"@servicetitan/hammer-icon/mdi/round/edit.svg\";\n\nimport Button from \"../../../components/Button\";\nimport { Text } from \"../../../components/Text\";\nimport { Flex } from \"../../../components/Flex\";\nimport { OptionsPopover } from \"../../../internal/components/OptionsPopover/OptionsPopover\";\nimport { OptionsPanel } from \"../../../internal/components/OptionsPanel\";\nimport { ANV_PART_ATTR } from \"../../../internal/constants/anvParts\";\nimport type { SelectItem } from \"../../../internal/types/selectFieldInternalTypes\";\nimport type { CheckState, DataAttributes } from \"../../../types\";\nimport { useMenuInteraction } from \"../../../components/SelectMenu/internal/useMenuInteraction\";\nimport { FilterTriggerButton } from \"../FilterBar/FilterTriggerButton\";\nimport styles from \"./SavedFiltersButton.module.scss\";\nimport { PARTS } from \"./parts\";\nimport type { SavedFiltersButtonProps } from \"./types\";\nimport { AddSavedFilterDrawer } from \"./internal/AddSavedFilterDrawer\";\nimport { EditSavedFiltersDrawer } from \"./internal/EditSavedFiltersDrawer\";\n\n/**\n * `SavedFiltersButton` is an opt-in companion to FilterBar that lets users\n * apply, save, edit, and delete preset filter selections. It is fully\n * stateless: the consumer owns the `savedFilters` array and writes its own\n * persistence (server, localStorage, etc.) by reacting to the callbacks the\n * component fires.\n *\n * Visually it's a single Button trigger that opens a popover listing the\n * presets, with two footer actions:\n *\n * - **Save Current Filter** opens a drawer that snapshots `currentFilters`\n * into a new preset.\n * - **Edit Saved Filters** opens a drawer listing every preset with edit\n * affordances; clicking edit on a row drills into a per-preset form\n * reusing the FilterBar adapter `renderDrawer` machinery.\n *\n * Apply, save, update, and delete are all delivered as consumer callbacks\n * (`onApplySavedFilter`, `onSaveCurrentFilter`, `onUpdateSavedFilter`,\n * `onDeleteSavedFilter`). Promise-returning callbacks are supported with\n * loading state on the relevant submit button and success/error alerts on\n * the parent drawer.\n *\n * @example\n * <SavedFiltersButton\n * savedFilters={presets}\n * currentFilters={filters}\n * onApplySavedFilter={(preset) => setFilters(preset.filters)}\n * onSaveCurrentFilter={async ({ name, filters }) => {\n * await api.savePreset({ name, filters });\n * refetchPresets();\n * }}\n * onUpdateSavedFilter={async (id, update) => api.updatePreset(id, update)}\n * onDeleteSavedFilter={async (id) => api.deletePreset(id)}\n * />\n */\nexport const SavedFiltersButton = (props: SavedFiltersButtonProps) => {\n // Root is a fragment — forward consumer `data-*` onto the trigger (Path B).\n const dataAttributes = Object.fromEntries(\n Object.entries(props).filter(([key]) => key.startsWith(\"data-\")),\n ) as DataAttributes;\n\n const {\n savedFilters,\n currentFilters,\n onApplySavedFilter,\n onSaveCurrentFilter,\n onUpdateSavedFilter,\n onDeleteSavedFilter,\n onReorderSavedFilters,\n validateName,\n alertText,\n activeSavedFilterId,\n label: labelProp,\n emptyState,\n } = props;\n\n const DEFAULT_LABEL = \"Saved Filters\";\n const label = labelProp\n ? labelProp\n : activeSavedFilterId\n ? savedFilters.find((sf) => sf.id === activeSavedFilterId)?.name ||\n DEFAULT_LABEL\n : DEFAULT_LABEL;\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n // Synthesize SelectItems so we can reuse the SelectMenu list machinery\n // (OptionsPanel, useMenuInteraction). Each row is one saved filter; the\n // row's id mirrors the preset id.\n const items = useMemo<SelectItem[]>(\n () =>\n savedFilters.map((saved) => ({\n id: saved.id,\n type: \"option\" as const,\n original: { id: saved.id, label: saved.name },\n })),\n [savedFilters],\n );\n\n // Active-preset state is consumer-owned via `activeSavedFilterId`. When\n // the prop names a preset we mark just that row checked; when it's\n // undefined the list reads as a clean unchecked menu (no row has the\n // single-select check affordance).\n const selectedItemIds = useMemo<Set<string | number>>(\n () => (activeSavedFilterId ? new Set([activeSavedFilterId]) : new Set()),\n [activeSavedFilterId],\n );\n const getCheckedState = useCallback(\n (item: SelectItem): CheckState =>\n item.id === activeSavedFilterId ? \"checked\" : \"unchecked\",\n [activeSavedFilterId],\n );\n\n const handleItemActivate = useCallback(\n (item: SelectItem) => {\n const saved = savedFilters.find((s) => s.id === item.id);\n if (saved) onApplySavedFilter(saved);\n },\n [savedFilters, onApplySavedFilter],\n );\n\n // We use the SelectMenu menu-interaction hook as-is so keyboard and focus\n // behavior matches the platform's other menu surfaces. Popover-vs-dialog\n // adaptation is fixed to \"popover\" here — saved filters always render\n // inline in a popover even on mobile, since the heavy editing UX lives in\n // the drawer flows.\n const [isOpen, setIsOpen] = useState(false);\n const {\n closeMenu,\n highlightedIndex,\n getTriggerProps,\n getMenuProps,\n getItemProps,\n } = useMenuInteraction({\n items,\n sectionsMeta: [],\n onItemActivate: handleItemActivate,\n selectedItemIds,\n displayAs: \"popover\",\n closeOnActivate: true,\n id: \"saved-filters\",\n triggerRef,\n label,\n isOpen,\n setIsOpen,\n });\n\n const handleClickOutside = useCallback(() => {\n closeMenu({ restoreFocus: false });\n }, [closeMenu]);\n\n const triggerProps = getTriggerProps();\n\n const [addOpen, setAddOpen] = useState(false);\n const [editOpen, setEditOpen] = useState(false);\n // Snapshot of `currentFilters` captured at the moment the Save drawer\n // opens, so subsequent edits to the bar don't change what gets saved.\n const [filtersSnapshot, setFiltersSnapshot] = useState<typeof currentFilters>(\n [],\n );\n\n const handleSaveCurrentClick = useCallback(() => {\n setFiltersSnapshot(currentFilters);\n closeMenu({ restoreFocus: false });\n setAddOpen(true);\n }, [closeMenu, currentFilters]);\n\n const handleEditClick = useCallback(() => {\n closeMenu({ restoreFocus: false });\n setEditOpen(true);\n }, [closeMenu]);\n\n // Pressing Enter on a row activates via useMenuInteraction; the popover\n // closes on activation, so footer button focus does not contend with it.\n const handleFooterKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n closeMenu();\n }\n };\n\n const footer: ReactElement = (\n <Flex\n direction=\"column\"\n gap=\"2\"\n className={styles[\"footer\"]}\n onKeyDown={handleFooterKeyDown}\n >\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={{ before: IconAdd }}\n style={{ width: \"100%\" }}\n onClick={handleSaveCurrentClick}\n {...{ [ANV_PART_ATTR]: PARTS.saveCurrentButton }}\n >\n Save Current Filter\n </Button>\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={{ before: IconEdit }}\n style={{ width: \"100%\" }}\n onClick={handleEditClick}\n disabled={savedFilters.length === 0}\n {...{ [ANV_PART_ATTR]: PARTS.manageButton }}\n >\n Edit Saved Filters\n </Button>\n </Flex>\n );\n\n return (\n <>\n {/*\n FilterTriggerButton renders the same ghost/toolbar-sized chrome the\n FilterBar uses for every filter trigger, so the saved-filters entry\n point reads as just another control in the bar. `isSelected` mirrors\n whether the consumer has named an active preset via\n `activeSavedFilterId`.\n */}\n <FilterTriggerButton\n {...triggerProps}\n {...dataAttributes}\n filterId=\"saved-filters\"\n label={label}\n isSelected={!!(activeSavedFilterId ?? false)}\n />\n <OptionsPopover\n id=\"saved-filters-popover\"\n referenceElement={triggerRef}\n open={isOpen}\n onClose={handleClickOutside}\n width={280}\n footer={footer}\n >\n {items.length === 0 ? (\n <Flex\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n className={styles[\"empty-state\"]}\n >\n {typeof emptyState === \"string\" || emptyState == null ? (\n <Text subdued size=\"small\">\n {emptyState ?? \"No saved filters yet.\"}\n </Text>\n ) : (\n emptyState\n )}\n </Flex>\n ) : (\n <OptionsPanel\n isOpen={isOpen}\n items={items}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n getCheckedState={getCheckedState}\n selectionType=\"single\"\n hasMore={false}\n onLoadMore={() => {}}\n loading={false}\n loadingMore={false}\n />\n )}\n </OptionsPopover>\n <AddSavedFilterDrawer\n open={addOpen}\n onClose={() => setAddOpen(false)}\n filtersSnapshot={filtersSnapshot}\n onSave={onSaveCurrentFilter}\n validateName={validateName ? (name) => validateName(name) : undefined}\n />\n <EditSavedFiltersDrawer\n open={editOpen}\n onClose={() => setEditOpen(false)}\n savedFilters={savedFilters}\n onUpdate={onUpdateSavedFilter}\n onDelete={onDeleteSavedFilter}\n onReorder={onReorderSavedFilters}\n validateName={validateName}\n alertText={alertText}\n />\n </>\n );\n};\n\nSavedFiltersButton.displayName = \"SavedFiltersButton\";\n"],"names":["IconEdit","IconAdd"],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import './ThemeProvider.css';const themeStyles = {
|
|
2
|
-
"theme-core": "_theme-core_bn2f2_1",
|
|
3
|
-
"mode-light": "_mode-light_bn2f2_595",
|
|
4
|
-
"mode-dark": "_mode-dark_bn2f2_599"
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
export { themeStyles as t };
|
|
8
|
-
//# sourceMappingURL=ThemeProvider.module-_7m6Tav-.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeProvider.module-_7m6Tav-.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|