@servicetitan/anvil2 3.0.8 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/dist/{AiMark-CS6MvraM.js → AiMark-m-sG_BrY.js} +6 -6
- package/dist/{AiMark-CS6MvraM.js.map → AiMark-m-sG_BrY.js.map} +1 -1
- package/dist/AiMark.js +1 -1
- package/dist/{Alert-CNDLoh6b.js → Alert-DYmBt7Yo.js} +4 -4
- package/dist/{Alert-CNDLoh6b.js.map → Alert-DYmBt7Yo.js.map} +1 -1
- package/dist/Alert.js +1 -1
- package/dist/{Announcement-CgTqDU8A.js → Announcement-DXF8slQf.js} +4 -4
- package/dist/{Announcement-CgTqDU8A.js.map → Announcement-DXF8slQf.js.map} +1 -1
- package/dist/Announcement.js +1 -1
- package/dist/{AnvilProvider-BFK29dL5.js → AnvilProvider-Cw_zTBqJ.js} +5 -5
- package/dist/{AnvilProvider-BFK29dL5.js.map → AnvilProvider-Cw_zTBqJ.js.map} +1 -1
- package/dist/AnvilProvider.js +1 -1
- package/dist/{Avatar-Bl-Dxbhf.js → Avatar-CoQcOHWU.js} +2 -2
- package/dist/{Avatar-Bl-Dxbhf.js.map → Avatar-CoQcOHWU.js.map} +1 -1
- package/dist/{Avatar-CdAIJ5VK.js → Avatar-DX96Mxe7.js} +2 -2
- package/dist/{Avatar-CdAIJ5VK.js.map → Avatar-DX96Mxe7.js.map} +1 -1
- package/dist/Avatar.js +2 -2
- package/dist/{Badge-DtUI2AEk.js → Badge-BNrYBFiU.js} +2 -2
- package/dist/{Badge-DtUI2AEk.js.map → Badge-BNrYBFiU.js.map} +1 -1
- package/dist/Badge.js +1 -1
- package/dist/{Breadcrumbs--Xt6l_2L.js → Breadcrumbs-D1X1M_ej.js} +5 -5
- package/dist/{Breadcrumbs--Xt6l_2L.js.map → Breadcrumbs-D1X1M_ej.js.map} +1 -1
- package/dist/Breadcrumbs.js +1 -1
- package/dist/{Button-C_V2xQAs.js → Button-ChQARW0y.js} +3 -3
- package/dist/{Button-C_V2xQAs.js.map → Button-ChQARW0y.js.map} +1 -1
- package/dist/Button.js +1 -1
- package/dist/{ButtonCompound-BQb2gfAl.js → ButtonCompound-_0ddykI_.js} +2 -2
- package/dist/{ButtonCompound-BQb2gfAl.js.map → ButtonCompound-_0ddykI_.js.map} +1 -1
- package/dist/ButtonCompound.js +1 -1
- package/dist/{ButtonLink-UhLks0vM.js → ButtonLink-CWbYzTTz.js} +3 -3
- package/dist/{ButtonLink-UhLks0vM.js.map → ButtonLink-CWbYzTTz.js.map} +1 -1
- package/dist/ButtonLink.js +1 -1
- package/dist/{ButtonToggle-jnDMPSyK.js → ButtonToggle-BVv94C4U.js} +3 -3
- package/dist/{ButtonToggle-jnDMPSyK.js.map → ButtonToggle-BVv94C4U.js.map} +1 -1
- package/dist/ButtonToggle.js +1 -1
- package/dist/{Calendar-5mAxtdNh.js → Calendar-BTen4c8H.js} +2 -2
- package/dist/{Calendar-5mAxtdNh.js.map → Calendar-BTen4c8H.js.map} +1 -1
- package/dist/{Calendar-rITorBvD.js → Calendar-BvHvJOHb.js} +5 -5
- package/dist/{Calendar-rITorBvD.js.map → Calendar-BvHvJOHb.js.map} +1 -1
- package/dist/Calendar.js +2 -2
- package/dist/{Card-fBqg853U.js → Card-Bt0F6RTq.js} +2 -2
- package/dist/{Card-fBqg853U.js.map → Card-Bt0F6RTq.js.map} +1 -1
- package/dist/Card.js +1 -1
- package/dist/{Checkbox-DTzoDcJl.js → Checkbox-BcfY3iwE.js} +5 -5
- package/dist/{Checkbox-DTzoDcJl.js.map → Checkbox-BcfY3iwE.js.map} +1 -1
- package/dist/{Checkbox-BYWhkYoK.js → Checkbox-DqncM7th.js} +2 -2
- package/dist/{Checkbox-BYWhkYoK.js.map → Checkbox-DqncM7th.js.map} +1 -1
- package/dist/Checkbox.js +1 -1
- package/dist/{Chip-CyMNyEPR.js → Chip-B6LaPxtL.js} +5 -5
- package/dist/{Chip-CyMNyEPR.js.map → Chip-B6LaPxtL.js.map} +1 -1
- package/dist/Chip.js +1 -1
- package/dist/Combobox.js +1 -1
- package/dist/{DataTable-Dwhwvm6R.js → DataTable-B_GYRuR1.js} +1330 -506
- package/dist/DataTable-B_GYRuR1.js.map +1 -0
- package/dist/DataTable.css +323 -234
- package/dist/{DateFieldRange-BUug1tUy.js → DateFieldRange-DGjw3kTB.js} +5 -5
- package/dist/{DateFieldRange-BUug1tUy.js.map → DateFieldRange-DGjw3kTB.js.map} +1 -1
- package/dist/DateFieldRange.js +1 -1
- package/dist/{DateFieldSingle-DR7faQGD.js → DateFieldSingle-dB13x4lS.js} +5 -5
- package/dist/{DateFieldSingle-DR7faQGD.js.map → DateFieldSingle-dB13x4lS.js.map} +1 -1
- package/dist/DateFieldSingle.js +1 -1
- package/dist/{DateFieldYearless-7MFcR7L6.js → DateFieldYearless-BJ_1HLfi.js} +5 -5
- package/dist/{DateFieldYearless-7MFcR7L6.js.map → DateFieldYearless-BJ_1HLfi.js.map} +1 -1
- package/dist/DateFieldYearless.js +1 -1
- package/dist/{DateFieldYearlessRange-DGtdyISH.js → DateFieldYearlessRange-BXnvkTXC.js} +5 -5
- package/dist/{DateFieldYearlessRange-DGtdyISH.js.map → DateFieldYearlessRange-BXnvkTXC.js.map} +1 -1
- package/dist/DateFieldYearlessRange.js +1 -1
- package/dist/{DaysOfTheWeek-C7oN9nIe.js → DaysOfTheWeek-C78qSYxI.js} +5 -5
- package/dist/{DaysOfTheWeek-C7oN9nIe.js.map → DaysOfTheWeek-C78qSYxI.js.map} +1 -1
- package/dist/DaysOfTheWeek.js +1 -1
- package/dist/{Details-s2pVu-YL.js → Details-DK6ceYhs.js} +3 -3
- package/dist/{Details-s2pVu-YL.js.map → Details-DK6ceYhs.js.map} +1 -1
- package/dist/Details.js +1 -1
- package/dist/{Dialog-dE9c90iR.js → Dialog-DuGX-ngX.js} +4 -4
- package/dist/{Dialog-dE9c90iR.js.map → Dialog-DuGX-ngX.js.map} +1 -1
- package/dist/Dialog.js +1 -1
- package/dist/{DialogCancelButton-DcidFC38.js → DialogCancelButton-lAq4bhHS.js} +2 -2
- package/dist/{DialogCancelButton-DcidFC38.js.map → DialogCancelButton-lAq4bhHS.js.map} +1 -1
- package/dist/{Divider-CxtTyw8_.js → Divider-C7fp5Xb6.js} +18 -18
- package/dist/{Divider-CxtTyw8_.js.map → Divider-C7fp5Xb6.js.map} +1 -1
- package/dist/Divider.css +21 -24
- package/dist/Divider.js +1 -1
- package/dist/Dnd.js +2 -2
- package/dist/{DndHandleButton-CHTOYRlq.js → DndHandleButton-Cj7pIegT.js} +4 -6
- package/dist/DndHandleButton-Cj7pIegT.js.map +1 -0
- package/dist/DndSort.js +6 -6
- package/dist/{Drawer-Dk0MsaOU.js → Drawer-9_HfTi3J.js} +4 -4
- package/dist/{Drawer-Dk0MsaOU.js.map → Drawer-9_HfTi3J.js.map} +1 -1
- package/dist/Drawer.js +1 -1
- package/dist/DrillDown.js +1 -1
- package/dist/{EditCard-DV2N7zWr.js → EditCard-DeB4rQVo.js} +6 -6
- package/dist/{EditCard-DV2N7zWr.js.map → EditCard-DeB4rQVo.js.map} +1 -1
- package/dist/EditCard.js +1 -1
- package/dist/{FieldLabel-VVn8GR64.js → FieldLabel-CtvpqdG9.js} +4 -4
- package/dist/{FieldLabel-VVn8GR64.js.map → FieldLabel-CtvpqdG9.js.map} +1 -1
- package/dist/FieldLabel.js +1 -1
- package/dist/{FilterBar-CXGsoWw5.js → FilterBar-D0iRUjOy.js} +10 -10
- package/dist/{FilterBar-CXGsoWw5.js.map → FilterBar-D0iRUjOy.js.map} +1 -1
- package/dist/FilterBar.js +1 -1
- package/dist/{Flex-_orhvoxS.js → Flex-Bb3iHExM.js} +2 -2
- package/dist/{Flex-_orhvoxS.js.map → Flex-Bb3iHExM.js.map} +1 -1
- package/dist/Flex.js +1 -1
- package/dist/{Grid-BAN8WD_V.js → Grid-ho1pGJ5L.js} +2 -2
- package/dist/{Grid-BAN8WD_V.js.map → Grid-ho1pGJ5L.js.map} +1 -1
- package/dist/Grid.js +1 -1
- package/dist/{Icon-feeG7gXA.js → Icon-BEwHECSM.js} +2 -2
- package/dist/{Icon-feeG7gXA.js.map → Icon-BEwHECSM.js.map} +1 -1
- package/dist/Icon.js +1 -1
- package/dist/{InputMask-VBHWGZGN.js → InputMask-CZ57VFJA.js} +3 -3
- package/dist/{InputMask-VBHWGZGN.js.map → InputMask-CZ57VFJA.js.map} +1 -1
- package/dist/InputMask.js +1 -1
- package/dist/{InteractiveCard-Pu0j2qJd.js → InteractiveCard-CyUR_VLW.js} +2 -2
- package/dist/{InteractiveCard-Pu0j2qJd.js.map → InteractiveCard-CyUR_VLW.js.map} +1 -1
- package/dist/InteractiveCard.js +1 -1
- package/dist/{Link-D8A_WT94.js → Link-DI4eVVdI.js} +3 -3
- package/dist/{Link-D8A_WT94.js.map → Link-DI4eVVdI.js.map} +1 -1
- package/dist/Link.js +1 -1
- package/dist/{LinkButton-DxYsWiXB.js → LinkButton-C0wps8r1.js} +2 -2
- package/dist/{LinkButton-DxYsWiXB.js.map → LinkButton-C0wps8r1.js.map} +1 -1
- package/dist/LinkButton.js +1 -1
- package/dist/{List-GPS-GqH7.js → List-BvzfZ9TW.js} +2 -2
- package/dist/{List-GPS-GqH7.js.map → List-BvzfZ9TW.js.map} +1 -1
- package/dist/List.js +1 -1
- package/dist/{ListView-BUrfz75g.js → ListView-Ngeqpgna.js} +3 -3
- package/dist/{ListView-BUrfz75g.js.map → ListView-Ngeqpgna.js.map} +1 -1
- package/dist/ListView.js +1 -1
- package/dist/{Listbox-CRY-0BkS.js → Listbox-3ChcLAyg.js} +5 -5
- package/dist/{Listbox-CRY-0BkS.js.map → Listbox-3ChcLAyg.js.map} +1 -1
- package/dist/Listbox.js +1 -1
- package/dist/{LocalizationProvider-CO8fQGqs.js → LocalizationProvider-BPcOU7YX.js} +2 -2
- package/dist/{LocalizationProvider-CO8fQGqs.js.map → LocalizationProvider-BPcOU7YX.js.map} +1 -1
- package/dist/LocalizationProvider.js +1 -1
- package/dist/{Menu-DNJ0YqjA.js → Menu-BUIAooVS.js} +3 -3
- package/dist/{Menu-DNJ0YqjA.js.map → Menu-BUIAooVS.js.map} +1 -1
- package/dist/Menu.js +1 -1
- package/dist/{MenuFooter-CrsZdXvN.js → MenuFooter-Dtckm9vY.js} +2 -2
- package/dist/{MenuFooter-CrsZdXvN.js.map → MenuFooter-Dtckm9vY.js.map} +1 -1
- package/dist/MultiSelectField.js +1 -1
- package/dist/{MultiSelectFieldSync-CIuy3aRD.js → MultiSelectFieldSync-jb57hWBG.js} +9 -9
- package/dist/{MultiSelectFieldSync-CIuy3aRD.js.map → MultiSelectFieldSync-jb57hWBG.js.map} +1 -1
- package/dist/MultiSelectMenu.js +1 -1
- package/dist/{MultiSelectMenuSync-Drz8SEk9.js → MultiSelectMenuSync-D6NI4Z2h.js} +6 -6
- package/dist/{MultiSelectMenuSync-Drz8SEk9.js.map → MultiSelectMenuSync-D6NI4Z2h.js.map} +1 -1
- package/dist/{NumberField-bgYX7JGs.js → NumberField-C_UAdOsK.js} +6 -6
- package/dist/{NumberField-bgYX7JGs.js.map → NumberField-C_UAdOsK.js.map} +1 -1
- package/dist/NumberField.js +1 -1
- package/dist/Overflow.js +2 -2
- package/dist/{Page-BSHydn4p.js → Page--5QCoYX4.js} +89 -89
- package/dist/Page--5QCoYX4.js.map +1 -0
- package/dist/Page.js +1 -1
- package/dist/{Pagination-CAeyJ7Pl.js → Pagination-Dtgyk0Xr.js} +7 -7
- package/dist/{Pagination-CAeyJ7Pl.js.map → Pagination-Dtgyk0Xr.js.map} +1 -1
- package/dist/Pagination.js +1 -1
- package/dist/{Popover-Cq5tirFz.js → Popover-B1_842BG.js} +3 -3
- package/dist/{Popover-Cq5tirFz.js.map → Popover-B1_842BG.js.map} +1 -1
- package/dist/Popover.js +1 -1
- package/dist/{ProgressBar-ByR50ln7.js → ProgressBar-B87CdCEB.js} +5 -5
- package/dist/{ProgressBar-ByR50ln7.js.map → ProgressBar-B87CdCEB.js.map} +1 -1
- package/dist/ProgressBar.js +1 -1
- package/dist/{Radio-WlsZFRzX.js → Radio-CrGhNc6t.js} +5 -5
- package/dist/{Radio-WlsZFRzX.js.map → Radio-CrGhNc6t.js.map} +1 -1
- package/dist/{Radio-CPuctRpl.js → Radio-K8VUbkMe.js} +2 -2
- package/dist/{Radio-CPuctRpl.js.map → Radio-K8VUbkMe.js.map} +1 -1
- package/dist/Radio.js +1 -1
- package/dist/{RichTextEditor-CoPXdaWI.js → RichTextEditor-DiOWlG-j.js} +14 -14
- package/dist/{RichTextEditor-CoPXdaWI.js.map → RichTextEditor-DiOWlG-j.js.map} +1 -1
- package/dist/RichTextEditor.js +1 -1
- package/dist/{SavedFiltersButton-DzJijqHz.js → SavedFiltersButton-BpjGgsnS.js} +12 -12
- package/dist/{SavedFiltersButton-DzJijqHz.js.map → SavedFiltersButton-BpjGgsnS.js.map} +1 -1
- package/dist/SavedFiltersButton.js +1 -1
- package/dist/{SearchField-fXc_vWEr.js → SearchField-CD64ELrq.js} +3 -3
- package/dist/{SearchField-fXc_vWEr.js.map → SearchField-CD64ELrq.js.map} +1 -1
- package/dist/{SearchField-BMHJCVFu.js → SearchField-CWucSMdv.js} +2 -2
- package/dist/{SearchField-BMHJCVFu.js.map → SearchField-CWucSMdv.js.map} +1 -1
- package/dist/SearchField.js +1 -1
- package/dist/{SegmentedControl-PwLdTdrd.js → SegmentedControl-fBjqazBR.js} +3 -3
- package/dist/{SegmentedControl-PwLdTdrd.js.map → SegmentedControl-fBjqazBR.js.map} +1 -1
- package/dist/SegmentedControl.js +1 -1
- package/dist/{SelectCard-DLWLHi_i.js → SelectCard-YwnN2K4B.js} +5 -5
- package/dist/{SelectCard-DLWLHi_i.js.map → SelectCard-YwnN2K4B.js.map} +1 -1
- package/dist/SelectCard.js +1 -1
- package/dist/SelectField.js +1 -1
- package/dist/{SelectFieldLabel-vemffdmu.js → SelectFieldLabel-BopPrWWy.js} +2 -2
- package/dist/{SelectFieldLabel-vemffdmu.js.map → SelectFieldLabel-BopPrWWy.js.map} +1 -1
- package/dist/{SelectFieldSync-DlGiJ-Iy.js → SelectFieldSync-B30iR0EX.js} +7 -7
- package/dist/{SelectFieldSync-DlGiJ-Iy.js.map → SelectFieldSync-B30iR0EX.js.map} +1 -1
- package/dist/SelectMenu.js +1 -1
- package/dist/{SelectMenuSync-CAweNjRL.js → SelectMenuSync-BoxEMqcv.js} +6 -6
- package/dist/{SelectMenuSync-CAweNjRL.js.map → SelectMenuSync-BoxEMqcv.js.map} +1 -1
- package/dist/{SelectOptions-BGCap9fZ.js → SelectOptions-kx_udzjX.js} +2 -2
- package/dist/{SelectOptions-BGCap9fZ.js.map → SelectOptions-kx_udzjX.js.map} +1 -1
- package/dist/{SelectTrigger-BbneVXMz.js → SelectTrigger-BjMduiax.js} +5 -5
- package/dist/{SelectTrigger-BbneVXMz.js.map → SelectTrigger-BjMduiax.js.map} +1 -1
- package/dist/SelectTrigger.js +1 -1
- package/dist/{SelectTriggerBase-BjIOERXr.js → SelectTriggerBase-CL9Zpbxn.js} +5 -5
- package/dist/{SelectTriggerBase-BjIOERXr.js.map → SelectTriggerBase-CL9Zpbxn.js.map} +1 -1
- package/dist/{SideNav-JzIIZSK_.js → SideNav-BFkruKa4.js} +3 -3
- package/dist/{SideNav-JzIIZSK_.js.map → SideNav-BFkruKa4.js.map} +1 -1
- package/dist/SideNav.js +1 -1
- package/dist/Skeleton.js +1 -1
- package/dist/{Stepper-lYywxPU5.js → Stepper-BXgMeUHu.js} +5 -5
- package/dist/{Stepper-lYywxPU5.js.map → Stepper-BXgMeUHu.js.map} +1 -1
- package/dist/Stepper.js +1 -1
- package/dist/{Switch-B6bKmpwN.js → Switch-Crcn7ffO.js} +5 -5
- package/dist/{Switch-B6bKmpwN.js.map → Switch-Crcn7ffO.js.map} +1 -1
- package/dist/Switch.js +1 -1
- package/dist/{Tab-CIY6BO2e.js → Tab-FOIali7o.js} +4 -4
- package/dist/{Tab-CIY6BO2e.js.map → Tab-FOIali7o.js.map} +1 -1
- package/dist/Tab.js +1 -1
- package/dist/Table.js +1 -1
- package/dist/{Text-w2gWn4K6.js → Text-CK1TI4Gz.js} +3 -3
- package/dist/{Text-w2gWn4K6.js.map → Text-CK1TI4Gz.js.map} +1 -1
- package/dist/Text.js +1 -1
- package/dist/{TextField-BQsCh5Nb.js → TextField-CFRhRDXu.js} +2 -2
- package/dist/{TextField-BQsCh5Nb.js.map → TextField-CFRhRDXu.js.map} +1 -1
- package/dist/{TextField-DJ3gEIP6.js → TextField-Dn2pwnKf.js} +4 -4
- package/dist/{TextField-DJ3gEIP6.js.map → TextField-Dn2pwnKf.js.map} +1 -1
- package/dist/TextField.js +1 -1
- package/dist/{Textarea-BK4Vf84K.js → Textarea-DPRvsIhS.js} +4 -4
- package/dist/{Textarea-BK4Vf84K.js.map → Textarea-DPRvsIhS.js.map} +1 -1
- package/dist/Textarea.js +1 -1
- package/dist/{ThemeProvider-BC6wbuLU.js → ThemeProvider-Sd8LK0A9.js} +3 -3
- package/dist/{ThemeProvider-BC6wbuLU.js.map → ThemeProvider-Sd8LK0A9.js.map} +1 -1
- package/dist/ThemeProvider.css +16 -4
- package/dist/ThemeProvider.js +1 -1
- package/dist/ThemeProvider.module-_7m6Tav-.js +8 -0
- package/dist/ThemeProvider.module-_7m6Tav-.js.map +1 -0
- package/dist/{TimeField-B4IW2B_o.js → TimeField-IK0j6q87.js} +6 -6
- package/dist/{TimeField-B4IW2B_o.js.map → TimeField-IK0j6q87.js.map} +1 -1
- package/dist/TimeField.js +1 -1
- package/dist/Toast.js +2 -2
- package/dist/{Toaster-DTF9qnTy.js → Toaster-C1Hjsfo4.js} +2 -2
- package/dist/{Toaster-DTF9qnTy.js.map → Toaster-C1Hjsfo4.js.map} +1 -1
- package/dist/{Toaster-BGY2IzF5.js → Toaster-CFU3OD-A.js} +5 -5
- package/dist/{Toaster-BGY2IzF5.js.map → Toaster-CFU3OD-A.js.map} +1 -1
- package/dist/{Toolbar-DObrJ_S5.js → Toolbar-CTF1WCrJ.js} +9 -9
- package/dist/{Toolbar-DObrJ_S5.js.map → Toolbar-CTF1WCrJ.js.map} +1 -1
- package/dist/{Toolbar-DRJGKk8D.js → Toolbar-Cv8AR7mj.js} +11 -11
- package/dist/{Toolbar-DRJGKk8D.js.map → Toolbar-Cv8AR7mj.js.map} +1 -1
- package/dist/Toolbar.js +2 -2
- package/dist/{ToolbarButtonToggle-BCKgA8FE.js → ToolbarButtonToggle-6agLSzkp.js} +3 -3
- package/dist/{ToolbarButtonToggle-BCKgA8FE.js.map → ToolbarButtonToggle-6agLSzkp.js.map} +1 -1
- package/dist/{Tooltip-DqS6xDUf.js → Tooltip-DYR7-Ova.js} +3 -3
- package/dist/{Tooltip-DqS6xDUf.js.map → Tooltip-DYR7-Ova.js.map} +1 -1
- package/dist/Tooltip.js +1 -1
- package/dist/TreeSelectField.js +1 -1
- package/dist/{TreeSelectFieldSync-Do5ffU0b.js → TreeSelectFieldSync-CqY6lbDJ.js} +8 -8
- package/dist/{TreeSelectFieldSync-Do5ffU0b.js.map → TreeSelectFieldSync-CqY6lbDJ.js.map} +1 -1
- package/dist/TreeSelectMenu.js +1 -1
- package/dist/{TreeSelectMenuSync-s05Ly6lj.js → TreeSelectMenuSync-DGUoVfN-.js} +5 -5
- package/dist/{TreeSelectMenuSync-s05Ly6lj.js.map → TreeSelectMenuSync-DGUoVfN-.js.map} +1 -1
- package/dist/{YearlessDateInputWithPicker-BHfFjCqE.js → YearlessDateInputWithPicker-CPhBofEJ.js} +5 -5
- package/dist/{YearlessDateInputWithPicker-BHfFjCqE.js.map → YearlessDateInputWithPicker-CPhBofEJ.js.map} +1 -1
- package/dist/beta.js +16 -16
- package/dist/drag_indicator-BRHAPLSJ.js +6 -0
- package/dist/drag_indicator-BRHAPLSJ.js.map +1 -0
- package/dist/{filter-state-DyMDjdRS.js → filter-state-HDQUPdOL.js} +25 -25
- package/dist/filter-state-HDQUPdOL.js.map +1 -0
- package/dist/{index-CukEaIHB.js → index-iTige6rD.js} +2 -2
- package/dist/{index-CukEaIHB.js.map → index-iTige6rD.js.map} +1 -1
- package/dist/{index-fSKD4ey4.js → index-vOZvfuE6.js} +2 -2
- package/dist/{index-fSKD4ey4.js.map → index-vOZvfuE6.js.map} +1 -1
- package/dist/index.js +65 -65
- package/dist/{portalScopeClassNames-jlZkdug_.js → portalScopeClassNames-BTyv0FY8.js} +2 -2
- package/dist/{portalScopeClassNames-jlZkdug_.js.map → portalScopeClassNames-BTyv0FY8.js.map} +1 -1
- package/dist/{primitive-DXlHdTFb.js → primitive-BXgYQTTw.js} +61 -1
- package/dist/{primitive-DXlHdTFb.js.map → primitive-BXgYQTTw.js.map} +1 -1
- package/dist/src/beta/components/Table/DataTable/DataTable.d.ts +24 -25
- package/dist/src/beta/components/Table/DataTable/internal/DataTableBody.d.ts +2 -19
- package/dist/src/beta/components/Table/DataTable/internal/DataTableBodyRow.d.ts +12 -13
- package/dist/src/beta/components/Table/DataTable/internal/context/rowClick/DataTableRowClickContext.d.ts +10 -0
- package/dist/src/beta/components/Table/DataTable/internal/context/rowClick/DataTableRowClickProvider.d.ts +19 -0
- package/dist/src/beta/components/Table/DataTable/internal/context/rowClick/useDataTableRowClick.d.ts +1 -0
- package/dist/src/beta/components/Table/DataTable/internal/context/surface/DataTableSurfaceCoordinatorContext.d.ts +13 -0
- package/dist/src/beta/components/Table/DataTable/internal/context/surface/DataTableSurfaceCoordinatorProvider.d.ts +7 -0
- package/dist/src/beta/components/Table/DataTable/internal/context/surface/useDataTableSurfaceCoordinator.d.ts +1 -0
- package/dist/src/beta/components/Table/DataTable/internal/editable-cells/useCustomEditHelpers.d.ts +8 -6
- package/dist/src/beta/components/Table/createColumnHelper.d.ts +4 -2
- package/dist/src/beta/components/Table/formatters/htmlFormatter.d.ts +4 -2
- package/dist/src/beta/components/Table/formatters/htmlToMarkdown.d.ts +5 -2
- package/dist/src/beta/components/Table/formatters/markdownFormatter.d.ts +3 -2
- package/dist/src/beta/components/Table/internal/TruncateChips.d.ts +5 -15
- package/dist/src/beta/components/Table/types.d.ts +47 -30
- package/dist/src/components/Page/Page.d.ts +2 -2
- package/dist/src/components/Page/pageBreakpoint.d.ts +26 -0
- package/dist/src/integration-testing/page-resize-loop.spec.d.ts +1 -0
- package/dist/src/internal/components/Surface/Surface.d.ts +4 -0
- package/dist/src/internal/components/Surface/surfaceGeometry.d.ts +31 -0
- package/dist/{stripInlineMarkdown-C0bVmYgG.js → stripInlineMarkdown-B-pONfu5.js} +2 -2
- package/dist/{stripInlineMarkdown-C0bVmYgG.js.map → stripInlineMarkdown-B-pONfu5.js.map} +1 -1
- package/dist/{syncFilterUtils-DZqeVWTS.js → syncFilterUtils-Cg2yX7al.js} +6 -6
- package/dist/{syncFilterUtils-DZqeVWTS.js.map → syncFilterUtils-Cg2yX7al.js.map} +1 -1
- package/dist/token/core/primitive-variables.scss +12 -0
- package/dist/token/core/primitive.d.ts +12 -0
- package/dist/token/core/primitive.js +48 -0
- package/dist/token/core/primitive.scss +12 -0
- package/dist/token.js +1 -1
- package/dist/{treeSync-Cz3H08cr.js → treeSync-CASYkjhr.js} +4 -4
- package/dist/{treeSync-Cz3H08cr.js.map → treeSync-CASYkjhr.js.map} +1 -1
- package/dist/{useAdaptiveView-CeYKH0Me.js → useAdaptiveView-BDqpk9G2.js} +9 -9
- package/dist/{useAdaptiveView-CeYKH0Me.js.map → useAdaptiveView-BDqpk9G2.js.map} +1 -1
- package/dist/{useBreakpoint-CeaUyHxh.js → useBreakpoint-BBNRlMGZ.js} +2 -2
- package/dist/{useBreakpoint-CeaUyHxh.js.map → useBreakpoint-BBNRlMGZ.js.map} +1 -1
- package/dist/useBreakpoint.js +1 -1
- package/dist/{useDrilldown-BJ2dHHKV.js → useDrilldown-DCXYrcGK.js} +4 -4
- package/dist/{useDrilldown-BJ2dHHKV.js.map → useDrilldown-DCXYrcGK.js.map} +1 -1
- package/dist/{useInfiniteCombobox-C6TDFfds.js → useInfiniteCombobox-D_y_FHCj.js} +9 -9
- package/dist/{useInfiniteCombobox-C6TDFfds.js.map → useInfiniteCombobox-D_y_FHCj.js.map} +1 -1
- package/dist/{useLayoutPropsUtil-CB_zHDbW.js → useLayoutPropsUtil-DjqeAJZ9.js} +3 -3
- package/dist/{useLayoutPropsUtil-CB_zHDbW.js.map → useLayoutPropsUtil-DjqeAJZ9.js.map} +1 -1
- package/dist/{useToggleSelection-Bn7h-gGD.js → useToggleSelection-BSLh569m.js} +2 -2
- package/dist/{useToggleSelection-Bn7h-gGD.js.map → useToggleSelection-BSLh569m.js.map} +1 -1
- package/package.json +3 -3
- package/dist/DataTable-Dwhwvm6R.js.map +0 -1
- package/dist/DndHandleButton-CHTOYRlq.js.map +0 -1
- package/dist/Page-BSHydn4p.js.map +0 -1
- package/dist/ThemeProvider.module-D9pNGYjP.js +0 -8
- package/dist/ThemeProvider.module-D9pNGYjP.js.map +0 -1
- package/dist/filter-state-DyMDjdRS.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"treeSync-Cz3H08cr.js","sources":["../src/beta/components/TreeSelectField/internal/useTreeLoader.ts","../src/beta/components/TreeSelectField/internal/useTreeCascade.ts","../src/beta/components/TreeSelectField/internal/useTreeKeyboard.ts","../src/beta/components/TreeSelectField/internal/useTree.ts","../src/beta/components/TreeSelectField/internal/TreeRow.tsx","../src/beta/components/TreeSelectField/internal/TreePanel.tsx","../src/beta/components/TreeSelectField/internal/VirtualizedTreePanel.tsx","../src/beta/components/TreeSelectField/internal/TreeContent.tsx","../src/beta/components/TreeSelectField/internal/treeUtils.ts","../src/beta/components/TreeSelectField/internal/useTreeLazyCascade.ts","../src/beta/components/TreeSelectField/internal/treeSync.ts"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { TreeSelectFieldNode } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Options for the useTreeLoader hook.\n * @property loadOptions - Async function to load tree nodes. Called with searchValue and optional parentNode.\n * @property cache - Cache configuration. Enabled by default with maxSize of 15.\n * @property initialLoad - Controls when the initial load occurs. \"auto\" and \"immediate\" load on mount, \"open\" loads on first onOpen() call.\n * @property debounceMs - Debounce delay in milliseconds for search calls. Defaults to 200.\n */\nexport type UseTreeLoaderOptions = {\n loadOptions: (\n searchValue: string,\n parentNode?: TreeSelectFieldNode,\n ) => TreeSelectFieldNode[] | Promise<TreeSelectFieldNode[]>;\n cache?: { enabled?: boolean; maxSize?: number };\n initialLoad?: \"auto\" | \"immediate\" | \"open\";\n debounceMs?: number;\n};\n\n/**\n * Return value from the useTreeLoader hook.\n * @property nodes - The currently loaded tree nodes.\n * @property ancestry - Durable childId → parentId map accumulated from lazy\n * children loads; survives tree resets so off-screen selections can be\n * attributed to their ancestors.\n * @property isLoading - Whether a root/search load is in progress.\n * @property isLoadingChildren - Set of node IDs whose children are currently loading.\n * @property loadChildren - Loads children for the given branch node (lazy expansion).\n * @property search - Triggers a search load with the given search value (debounced).\n * @property clearCache - Clears both the search and children caches.\n * @property invalidate - Clears both caches and triggers a fresh load.\n * @property onOpen - Triggers the initial load when initialLoad=\"open\". No-op otherwise or after first open.\n */\nexport type UseTreeLoaderReturn = {\n nodes: TreeSelectFieldNode[];\n ancestry: Map<string | number, string | number>;\n isLoading: boolean;\n isLoadingChildren: Set<string | number>;\n loadChildren: (\n parentNode: TreeSelectFieldNode,\n ) => Promise<TreeSelectFieldNode[]>;\n search: (searchValue: string) => void;\n clearCache: () => void;\n invalidate: () => void;\n onOpen: () => void;\n};\n\n// ---------------------------------------------------------------------------\n// LRU Map helper\n// ---------------------------------------------------------------------------\n\n/**\n * Simple LRU cache backed by a Map.\n * @param maxSize - Maximum number of entries to keep. When exceeded, the oldest entry is evicted.\n * @returns An object with get, set, delete, and clear methods.\n */\nfunction createLruCache<K, V>(maxSize: number) {\n const map = new Map<K, V>();\n\n return {\n get(key: K): V | undefined {\n if (!map.has(key)) return undefined;\n // Refresh LRU order by re-inserting\n const value = map.get(key)!;\n map.delete(key);\n map.set(key, value);\n return value;\n },\n set(key: K, value: V): void {\n if (map.has(key)) {\n map.delete(key);\n } else if (map.size >= maxSize) {\n // Delete the oldest (first) entry\n const firstKey = map.keys().next().value;\n if (firstKey !== undefined) map.delete(firstKey);\n }\n map.set(key, value);\n },\n has(key: K): boolean {\n return map.has(key);\n },\n delete(key: K): void {\n map.delete(key);\n },\n clear(): void {\n map.clear();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tree merge helper\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively merges loaded children into the node tree.\n * Replaces `children: null` on the matching node with the provided children array.\n * @param nodes - The current node tree.\n * @param parentId - The ID of the parent node whose children should be updated.\n * @param children - The loaded children to merge in.\n * @returns A new array with the updated subtree.\n */\nfunction mergeChildren(\n nodes: TreeSelectFieldNode[],\n parentId: string | number,\n children: TreeSelectFieldNode[],\n): TreeSelectFieldNode[] {\n return nodes.map((node) => {\n if (node.id === parentId) {\n return { ...node, children };\n }\n if (node.children && node.children.length > 0) {\n return {\n ...node,\n children: mergeChildren(node.children, parentId, children),\n };\n }\n return node;\n });\n}\n\n// ---------------------------------------------------------------------------\n// useTreeLoader\n// ---------------------------------------------------------------------------\n\n/**\n * Hook that manages async loading and caching for tree data.\n *\n * Features:\n * - Handles root/search loading and lazy branch expansion via a single loadOptions callback\n * - Two separate LRU caches: one for search results, one for lazy-loaded children\n * - Configurable cache size and opt-out support\n * - Debounced search to reduce unnecessary loadOptions calls\n * - initialLoad modes: \"immediate\"/\"auto\" load on mount, \"open\" defers until onOpen() is called\n * - Children are merged into the node tree after loading, updating children: null to the loaded array\n * - invalidate() clears caches and triggers a fresh load of the current view\n *\n * @param options - Configuration options for the tree loader.\n * @returns Current nodes, loading states, and loader control functions.\n */\nexport function useTreeLoader(\n options: UseTreeLoaderOptions,\n): UseTreeLoaderReturn {\n const {\n loadOptions,\n cache: cacheConfig,\n initialLoad = \"auto\",\n debounceMs = 200,\n } = options;\n\n const cacheEnabled = cacheConfig?.enabled !== false;\n const cacheMaxSize = cacheConfig?.maxSize ?? 15;\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const [nodes, setNodes] = useState<TreeSelectFieldNode[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingChildren, setIsLoadingChildren] = useState<\n Set<string | number>\n >(new Set());\n\n // Durable childId → parentId map accumulated from every lazy-children load.\n // Outlives tree resets (search) and collapse, so a selected descendant under\n // a now-unloaded branch can still be attributed to its ancestors. Kept in\n // state (not just a ref) so check-state recomputes when ancestry grows.\n const [ancestry, setAncestry] = useState<\n Map<string | number, string | number>\n >(() => new Map());\n\n const recordAncestry = useCallback(\n (parentId: string | number, children: TreeSelectFieldNode[]) => {\n setAncestry((prev) => {\n let changed = false;\n const next = new Map(prev);\n for (const child of children) {\n if (next.get(child.id) !== parentId) {\n next.set(child.id, parentId);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n },\n [],\n );\n\n // Track whether the initial root load has been performed (for \"open\" mode)\n const hasOpenedRef = useRef(false);\n\n // Track the current search term so invalidate() can reload the right data\n const currentSearchRef = useRef<string>(\"\");\n\n // ---------------------------------------------------------------------------\n // Caches (stable refs — do not re-create on render)\n // ---------------------------------------------------------------------------\n\n const searchCacheRef = useRef(\n createLruCache<string, TreeSelectFieldNode[]>(cacheMaxSize),\n );\n const childrenCacheRef = useRef(\n createLruCache<string | number, TreeSelectFieldNode[]>(cacheMaxSize),\n );\n\n // Keep a stable ref to loadOptions so callbacks don't go stale\n const loadOptionsRef = useRef(loadOptions);\n loadOptionsRef.current = loadOptions;\n\n // ---------------------------------------------------------------------------\n // Core load function (root / search)\n // ---------------------------------------------------------------------------\n\n // Monotonically-incrementing token used to discard stale async results when\n // a newer load has been issued (e.g. user kept typing and a slow earlier\n // request resolves after a faster later one).\n const loadRootSeqRef = useRef(0);\n\n const loadRoot = useCallback(\n async (searchValue: string, bypassCache = false) => {\n currentSearchRef.current = searchValue;\n hasOpenedRef.current = true;\n const seq = ++loadRootSeqRef.current;\n\n const cached =\n !bypassCache && cacheEnabled\n ? searchCacheRef.current.get(searchValue)\n : undefined;\n if (cached !== undefined) {\n setNodes(cached);\n return;\n }\n\n setIsLoading(true);\n try {\n const result = await loadOptionsRef.current(searchValue, undefined);\n // Discard if a newer load has started — its results are authoritative.\n if (seq !== loadRootSeqRef.current) return;\n // When bypassing cache (invalidate), don't repopulate — leave cache\n // empty for next caller.\n if (!bypassCache && cacheEnabled) {\n searchCacheRef.current.set(searchValue, result);\n }\n setNodes(result);\n } finally {\n if (seq === loadRootSeqRef.current) {\n setIsLoading(false);\n }\n }\n },\n [cacheEnabled],\n );\n\n // ---------------------------------------------------------------------------\n // Debounced search\n // ---------------------------------------------------------------------------\n\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const search = useCallback(\n (searchValue: string) => {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n if (debounceMs === 0) {\n void loadRoot(searchValue);\n } else {\n debounceTimerRef.current = setTimeout(() => {\n void loadRoot(searchValue);\n }, debounceMs);\n }\n },\n [loadRoot, debounceMs],\n );\n\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n // ---------------------------------------------------------------------------\n // Load children (lazy expansion)\n // ---------------------------------------------------------------------------\n\n const loadChildren = useCallback(\n async (parentNode: TreeSelectFieldNode): Promise<TreeSelectFieldNode[]> => {\n const parentId = parentNode.id;\n\n if (cacheEnabled) {\n const cached = childrenCacheRef.current.get(parentId);\n if (cached !== undefined) {\n // Merge into tree even if coming from cache (tree may have been reset)\n setNodes((prev) => mergeChildren(prev, parentId, cached));\n recordAncestry(parentId, cached);\n return cached;\n }\n }\n\n setIsLoadingChildren((prev) => {\n const next = new Set(prev);\n next.add(parentId);\n return next;\n });\n\n try {\n const result = await loadOptionsRef.current(\"\", parentNode);\n if (cacheEnabled) {\n childrenCacheRef.current.set(parentId, result);\n }\n setNodes((prev) => mergeChildren(prev, parentId, result));\n recordAncestry(parentId, result);\n return result;\n } finally {\n setIsLoadingChildren((prev) => {\n const next = new Set(prev);\n next.delete(parentId);\n return next;\n });\n }\n },\n [cacheEnabled, recordAncestry],\n );\n\n // ---------------------------------------------------------------------------\n // Cache management\n // ---------------------------------------------------------------------------\n\n const clearCache = useCallback(() => {\n searchCacheRef.current.clear();\n childrenCacheRef.current.clear();\n setAncestry((prev) => (prev.size === 0 ? prev : new Map()));\n }, []);\n\n const invalidate = useCallback(() => {\n searchCacheRef.current.clear();\n childrenCacheRef.current.clear();\n setAncestry((prev) => (prev.size === 0 ? prev : new Map()));\n void loadRoot(currentSearchRef.current, true);\n }, [loadRoot]);\n\n // ---------------------------------------------------------------------------\n // onOpen (for initialLoad=\"open\")\n // ---------------------------------------------------------------------------\n\n const onOpen = useCallback(() => {\n if (hasOpenedRef.current) return;\n hasOpenedRef.current = true;\n void loadRoot(\"\");\n }, [loadRoot]);\n\n // ---------------------------------------------------------------------------\n // Initial load effect\n // ---------------------------------------------------------------------------\n\n useEffect(() => {\n if (initialLoad === \"immediate\" || initialLoad === \"auto\") {\n void loadRoot(\"\");\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ---------------------------------------------------------------------------\n // Return\n // ---------------------------------------------------------------------------\n\n return {\n nodes,\n ancestry,\n isLoading,\n isLoadingChildren,\n loadChildren,\n search,\n clearCache,\n invalidate,\n onOpen,\n };\n}\n","import type {\n TreeSelectFieldNode,\n TreeSelectFieldValue,\n TreeSelectFieldValueConsistsOf,\n} from \"../types\";\nimport type { CheckState } from \"../../../../types\";\n\nexport type { CheckState };\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Flatten the tree into a lookup map keyed by node id.\n * @param nodes - The tree nodes to flatten.\n * @returns A Map from node id to TreeSelectFieldNode.\n */\nfunction buildNodeMap(\n nodes: TreeSelectFieldNode[],\n): Map<string | number, TreeSelectFieldNode> {\n const map = new Map<string | number, TreeSelectFieldNode>();\n const visit = (list: TreeSelectFieldNode[]) => {\n for (const node of list) {\n map.set(node.id, node);\n if (node.children) visit(node.children);\n }\n };\n visit(nodes);\n return map;\n}\n\n/**\n * Build a childId → parentId map from the loaded tree, for resolving a node's\n * ancestor `path` at selection time.\n */\nfunction buildParentMap(\n nodes: TreeSelectFieldNode[],\n): Map<string | number, string | number> {\n const parents = new Map<string | number, string | number>();\n const visit = (list: TreeSelectFieldNode[], parentId?: string | number) => {\n for (const node of list) {\n if (parentId !== undefined) parents.set(node.id, parentId);\n if (node.children) visit(node.children, node.id);\n }\n };\n visit(nodes);\n return parents;\n}\n\n/**\n * Resolve a node's ancestor path (root→parent) from a parent map. Returns\n * undefined when the node is a root (no ancestors) so callers can omit `path`.\n */\nfunction resolvePath(\n nodeId: string | number,\n parents: Map<string | number, string | number>,\n): (string | number)[] | undefined {\n const path: (string | number)[] = [];\n let current = parents.get(nodeId);\n const seen = new Set<string | number>();\n while (current !== undefined && !seen.has(current)) {\n seen.add(current);\n path.unshift(current);\n current = parents.get(current);\n }\n return path.length > 0 ? path : undefined;\n}\n\n/**\n * Returns true if the node is a branch (has a defined children array, even if\n * empty or null — null means unloaded lazy branch).\n * @param node - The node to check.\n * @returns Whether the node is a branch.\n */\nfunction isBranch(node: TreeSelectFieldNode): boolean {\n return node.children !== undefined;\n}\n\n/**\n * Expand branch IDs to include all non-disabled descendant IDs. When the\n * value array uses BRANCH_PRIORITY or ALL, it may contain branch IDs whose\n * children are not explicitly listed. This function ensures every descendant\n * leaf is present so that the bottom-up aggregation in computeCheckStates\n * produces the correct visual states.\n */\nfunction expandBranchIds(\n ids: Set<string | number>,\n nodes: TreeSelectFieldNode[],\n): Set<string | number> {\n const nodeMap = buildNodeMap(nodes);\n const expanded = new Set(ids);\n\n const addDescendants = (node: TreeSelectFieldNode): void => {\n if (node.disabled) return;\n expanded.add(node.id);\n if (node.children) {\n for (const child of node.children) {\n addDescendants(child);\n }\n }\n };\n\n for (const id of ids) {\n const node = nodeMap.get(id);\n if (node && isBranch(node)) {\n addDescendants(node);\n }\n }\n\n return expanded;\n}\n\n// ---------------------------------------------------------------------------\n// computeCheckStates\n// ---------------------------------------------------------------------------\n\n/**\n * Computes the visual check state for every node in the tree.\n *\n * In \"linked\" mode parents reflect the aggregate state of their children:\n * - checked — all non-disabled children are checked\n * - indeterminate — some but not all non-disabled children are checked\n * - unchecked — no children are checked\n *\n * In \"independent\" / \"single\" mode (and for BRANCH_ONLY) each node is checked\n * only when its id appears in the value array; no cascade is applied. A node's\n * own selection lives in `value` regardless of what is loaded, so these modes\n * are unaffected by lazy/filtered loading.\n *\n * ## Under-represented branches (lazy / filtered)\n *\n * In linked mode a branch's aggregate state is derived from its children. But\n * the tree passed in is only ever what is currently *loaded* — during search it\n * is the filtered subset, and lazy branches (`children === null`) or partially\n * loaded branches don't expose their full child set. A branch is\n * \"under-represented\" when its loaded children are known to be fewer than its\n * real children (`children === null`, or `loadedCount < childCount`). For these\n * we infer rather than aggregate:\n * - the branch's own id is checked → `checked`\n * - any *loaded* descendant is checked/indeterminate → `indeterminate`\n * (it can't be fully checked because unknown children exist)\n * - otherwise, if the branch is a known ancestor of an \"orphan\" selection (a\n * checked id that isn't in the currently-loaded tree — e.g. a descendant of a\n * collapsed lazy branch), via `orphanAncestorIds` → `indeterminate`\n * - otherwise → `unchecked`\n *\n * Orphan attribution is *path-scoped*: only branches on the resolved ancestor\n * path of an orphaned selection are marked, so unrelated collapsed siblings stay\n * `unchecked`. The caller resolves those ancestors (from a value's `path` or the\n * loader's ancestry map) and passes them in `orphanAncestorIds`. An orphan whose\n * ancestry is unknown contributes nothing (its branch shows `unchecked` until\n * its parent loads, then self-corrects).\n *\n * One limitation remains: accurate filtered-branch state requires\n * server-/consumer-provided `childCount` — a partially-loaded branch without a\n * `childCount` falls back to aggregating only its visible children.\n *\n * @param nodes - The currently loaded (possibly filtered) tree.\n * @param value - The current value array.\n * @param selectionMode - \"single\", \"independent\", or \"linked\".\n * @param valueConsistsOf - Strategy used when computing check states.\n * @param orphanAncestorIds - Branch ids that lie on the resolved ancestor path\n * of an orphaned selection. Such under-represented branches render\n * `indeterminate`. Defaults to empty (no orphan inference).\n * @returns A Map from node id to CheckState.\n */\nexport function computeCheckStates(\n nodes: TreeSelectFieldNode[],\n value: TreeSelectFieldValue[],\n selectionMode: \"single\" | \"independent\" | \"linked\",\n valueConsistsOf: TreeSelectFieldValueConsistsOf,\n orphanAncestorIds: Set<string | number> = new Set(),\n): Map<string | number, CheckState> {\n const rawIds = new Set(value.map((v) => v.id));\n\n // When the value strategy stores branch IDs (BRANCH_PRIORITY, ALL), expand\n // them to their non-disabled leaf descendants so the bottom-up aggregation\n // in linked mode produces the correct visual states.\n const checkedIdSet =\n selectionMode === \"linked\" &&\n (valueConsistsOf === \"BRANCH_PRIORITY\" || valueConsistsOf === \"ALL\")\n ? expandBranchIds(rawIds, nodes)\n : rawIds;\n const states = new Map<string | number, CheckState>();\n\n /**\n * Compute the check state for a single node, returning it.\n * In \"linked\" mode, branch state is derived from children.\n */\n const computeNode = (node: TreeSelectFieldNode): CheckState => {\n if (\n selectionMode === \"independent\" ||\n selectionMode === \"single\" ||\n valueConsistsOf === \"BRANCH_ONLY\"\n ) {\n const state: CheckState = checkedIdSet.has(node.id)\n ? \"checked\"\n : \"unchecked\";\n states.set(node.id, state);\n // Still recurse so children get their own states computed\n if (node.children) {\n for (const child of node.children) {\n computeNode(child);\n }\n }\n return state;\n }\n\n // linked mode\n const loadedChildren = Array.isArray(node.children) ? node.children : [];\n\n // A branch is under-represented when its loaded children are known to be\n // fewer than its real children: an unloaded lazy branch (children === null)\n // or a partial/filtered load (loadedCount < childCount).\n const isUnloaded = node.children === null;\n const isPartiallyLoaded =\n node.childCount !== undefined && loadedChildren.length < node.childCount;\n const underRepresented = isUnloaded || isPartiallyLoaded;\n\n if (loadedChildren.length === 0 && !underRepresented) {\n // leaf (children === undefined), or empty branch ([]) that we know is\n // genuinely empty — state from own id.\n const state: CheckState = checkedIdSet.has(node.id)\n ? \"checked\"\n : \"unchecked\";\n states.set(node.id, state);\n return state;\n }\n\n // Compute loaded children's states first (bottom-up).\n const childStates = loadedChildren.map(computeNode);\n const hasAnyChecked = childStates.some(\n (s) => s === \"checked\" || s === \"indeterminate\",\n );\n\n if (underRepresented) {\n // We don't know the full child set, so we can't prove \"checked\" from\n // children alone. Infer from the branch's own selection, known loaded\n // descendants, and any orphaned selection.\n let state: CheckState;\n if (checkedIdSet.has(node.id)) {\n state = \"checked\";\n } else if (hasAnyChecked || orphanAncestorIds.has(node.id)) {\n state = \"indeterminate\";\n } else {\n state = \"unchecked\";\n }\n states.set(node.id, state);\n return state;\n }\n\n // Fully-loaded branch — aggregate child states.\n const enabledChildren = loadedChildren.filter((c) => !c.disabled);\n const enabledChildStates = enabledChildren.map(\n (c) => states.get(c.id) ?? \"unchecked\",\n );\n const disabledChildren = loadedChildren.filter((c) => c.disabled);\n const disabledChildStates = disabledChildren.map(\n (c) => states.get(c.id) ?? \"unchecked\",\n );\n\n const allEnabledChecked =\n enabledChildren.length === 0\n ? // No enabled children — only disabled children matter\n disabledChildStates.every((s) => s === \"checked\")\n : enabledChildStates.every((s) => s === \"checked\");\n\n let state: CheckState;\n if (\n allEnabledChecked &&\n (enabledChildren.length > 0 ||\n disabledChildStates.every((s) => s === \"checked\"))\n ) {\n state = \"checked\";\n } else if (hasAnyChecked) {\n state = \"indeterminate\";\n } else {\n state = \"unchecked\";\n }\n\n states.set(node.id, state);\n return state;\n };\n\n for (const node of nodes) {\n computeNode(node);\n }\n\n return states;\n}\n\n// ---------------------------------------------------------------------------\n// computeValue\n// ---------------------------------------------------------------------------\n\n/**\n * Given a set of checked node IDs and a value strategy, returns the value\n * array according to the strategy.\n *\n * - \"ALL\" — every checked node\n * - \"BRANCH_PRIORITY\" — branch replaces its leaves when all non-disabled\n * children are checked; otherwise individual leaves\n * - \"LEAF_PRIORITY\" — leaves only, unless the node is a branch with an empty\n * or null children list (leaf-less branch)\n * - \"LEAF_ONLY\" — strictly leaves; branches are never included\n *\n * @param nodes - The full tree.\n * @param checkedIds - Set of IDs that are checked.\n * @param valueConsistsOf - Strategy to apply.\n * @returns The value array.\n */\nexport function computeValue(\n nodes: TreeSelectFieldNode[],\n checkedIds: Set<string | number>,\n valueConsistsOf: TreeSelectFieldValueConsistsOf,\n): TreeSelectFieldValue[] {\n const result: TreeSelectFieldValue[] = [];\n const included = new Set<string | number>();\n\n /**\n * Determine whether to include a branch in BRANCH_PRIORITY mode.\n * A branch is included when all its non-disabled children are checked.\n */\n const allNonDisabledChildrenChecked = (\n node: TreeSelectFieldNode,\n ): boolean => {\n if (!node.children || node.children.length === 0) return false;\n const nonDisabled = node.children.filter((c) => !c.disabled);\n if (nonDisabled.length === 0) return false;\n return nonDisabled.every((c) => {\n if (!isBranch(c)) return checkedIds.has(c.id);\n // For nested branches, recurse\n return allNonDisabledChildrenChecked(c) || checkedIds.has(c.id);\n });\n };\n\n // `ancestors` is the chain of branch ids from the root down to (but not\n // including) the node, so we can stamp `path` on emitted values. This lets a\n // persisted-then-restored selection resolve its ancestor check states even\n // when those branches aren't loaded yet.\n const toValue = (\n node: TreeSelectFieldNode,\n ancestors: (string | number)[],\n ): TreeSelectFieldValue => ({\n id: node.id,\n label: node.label,\n extra: node.extra,\n ...(ancestors.length > 0 ? { path: [...ancestors] } : {}),\n });\n\n /**\n * Traverse the tree and populate the result array. `ancestors` carries the\n * branch ids from the root down to the node's parent.\n */\n const visit = (\n node: TreeSelectFieldNode,\n ancestors: (string | number)[],\n ): void => {\n if (!checkedIds.has(node.id) && !isBranch(node)) {\n // unchecked leaf — skip\n return;\n }\n const childAncestors = [...ancestors, node.id];\n\n switch (valueConsistsOf) {\n case \"ALL\": {\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n // Always recurse to children\n if (node.children) {\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n break;\n }\n\n case \"BRANCH_ONLY\": {\n if (isBranch(node)) {\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n if (node.children) {\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n }\n break;\n }\n\n case \"LEAF_ONLY\": {\n if (!isBranch(node)) {\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n } else {\n if (node.children) {\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n }\n break;\n }\n\n case \"LEAF_PRIORITY\": {\n if (!isBranch(node)) {\n // Leaf — include only if checked\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n } else if (!node.children || node.children.length === 0) {\n // Empty or null branch — treat as leaf-less branch, include if checked\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n } else {\n // Normal branch — recurse, never include the branch itself\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n break;\n }\n\n case \"BRANCH_PRIORITY\": {\n if (!isBranch(node)) {\n // Leaf — include only if checked\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n } else {\n // Branch — include the branch if all non-disabled children are checked\n if (allNonDisabledChildrenChecked(node)) {\n if (!included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n // Mark all descendants as included so they don't double-add\n if (node.children) {\n for (const child of node.children) {\n markDescendantsIncluded(child);\n }\n }\n }\n } else {\n // Not all children checked — recurse\n if (node.children) {\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n }\n }\n break;\n }\n }\n };\n\n /**\n * Mark all descendants as included (so BRANCH_PRIORITY doesn't double-add\n * children when an ancestor branch was already added).\n */\n const markDescendantsIncluded = (node: TreeSelectFieldNode): void => {\n included.add(node.id);\n if (node.children) {\n for (const child of node.children) {\n markDescendantsIncluded(child);\n }\n }\n };\n\n for (const node of nodes) {\n visit(node, []);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// toggleNodeSelection\n// ---------------------------------------------------------------------------\n\n/**\n * Toggles a node's selection and returns the new value array.\n *\n * In \"single\" mode:\n * - Replaces the entire selection with the clicked node (or empties if already selected).\n *\n * In \"independent\" mode:\n * - Only the clicked node is toggled; no cascade.\n *\n * In \"linked\" mode:\n * - Selecting a branch selects all non-disabled descendants recursively.\n * - Deselecting a branch deselects all non-disabled descendants recursively.\n * - Disabled nodes are never modified.\n *\n * @param nodes - The full tree.\n * @param currentValue - The current value array.\n * @param nodeId - The id of the node to toggle.\n * @param selectionMode - \"single\", \"independent\", or \"linked\".\n * @param valueConsistsOf - Strategy to apply when computing the returned value.\n * @returns The new value array.\n */\nexport function toggleNodeSelection(\n nodes: TreeSelectFieldNode[],\n currentValue: TreeSelectFieldValue[],\n nodeId: string | number,\n selectionMode: \"single\" | \"independent\" | \"linked\",\n valueConsistsOf: TreeSelectFieldValueConsistsOf,\n): TreeSelectFieldValue[] {\n const nodeMap = buildNodeMap(nodes);\n const targetNode = nodeMap.get(nodeId);\n if (!targetNode) return currentValue;\n\n const currentCheckedIds = new Set(currentValue.map((v) => v.id));\n const isCurrentlySelected = currentCheckedIds.has(nodeId);\n\n const parentMap = buildParentMap(nodes);\n\n if (selectionMode === \"single\") {\n if (isCurrentlySelected) return [];\n const path = resolvePath(targetNode.id, parentMap);\n return [\n {\n id: targetNode.id,\n label: targetNode.label,\n extra: targetNode.extra,\n ...(path ? { path } : {}),\n },\n ];\n }\n\n if (selectionMode === \"independent\") {\n const next = new Set(currentCheckedIds);\n if (isCurrentlySelected) {\n next.delete(nodeId);\n } else {\n next.add(nodeId);\n }\n // Rebuild value preserving label/extra from current value or nodeMap\n return buildValueFromIds(next, currentValue, nodeMap, parentMap);\n }\n\n // Linked mode\n // For linked mode we cannot rely solely on whether the nodeId is in the\n // value array because strategies like LEAF_PRIORITY never store branch ids.\n // Instead, derive the effective check state from computeCheckStates.\n const checkStates = computeCheckStates(\n nodes,\n currentValue,\n selectionMode,\n valueConsistsOf,\n );\n const currentCheckState = checkStates.get(nodeId) ?? \"unchecked\";\n const shouldDeselect =\n currentCheckState === \"checked\" || currentCheckState === \"indeterminate\";\n\n // Expand branch IDs to leaf-level so computeValue sees all implicitly\n // selected descendants (e.g. BRANCH_PRIORITY stores \"design\" but\n // computeValue needs \"ux\" + \"visual\" to correctly aggregate).\n const expandedIds =\n valueConsistsOf === \"BRANCH_PRIORITY\" || valueConsistsOf === \"ALL\"\n ? expandBranchIds(currentCheckedIds, nodes)\n : currentCheckedIds;\n const nextCheckedIds = new Set(expandedIds);\n\n if (shouldDeselect) {\n // Deselect node and all non-disabled descendants\n const idsToDeselect = getNonDisabledDescendantIds(targetNode);\n for (const id of idsToDeselect) {\n nextCheckedIds.delete(id);\n }\n } else {\n // Select node and all non-disabled descendants\n const idsToSelect = getNonDisabledDescendantIds(targetNode);\n for (const id of idsToSelect) {\n nextCheckedIds.add(id);\n }\n }\n\n if (valueConsistsOf !== \"BRANCH_ONLY\") {\n bubbleUpCheckedParents(nodes, nextCheckedIds);\n }\n\n const computed = computeValue(nodes, nextCheckedIds, valueConsistsOf);\n\n // `computeValue` only walks the currently-loaded tree, so during search (or\n // with lazy branches) it can't re-emit a previously-selected node that lives\n // outside the filtered/loaded subset. Carry those forward from currentValue\n // so toggling a visible node doesn't silently drop selections elsewhere.\n // Only entries whose nodes aren't present in `nodes` are eligible — anything\n // loaded was already handled (and possibly rolled up) by computeValue.\n const emittedIds = new Set(computed.map((v) => v.id));\n const carriedForward = currentValue.filter(\n (v) =>\n nextCheckedIds.has(v.id) && !emittedIds.has(v.id) && !nodeMap.has(v.id),\n );\n\n return [...computed, ...carriedForward];\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers for toggleNodeSelection\n// ---------------------------------------------------------------------------\n\n/**\n * Walk the tree bottom-up: if all non-disabled children of a branch are in\n * checkedIds, add the branch too. Repeat upward so fully-checked subtrees\n * bubble their parent all the way to the root.\n */\nfunction bubbleUpCheckedParents(\n nodes: TreeSelectFieldNode[],\n checkedIds: Set<string | number>,\n): void {\n const visit = (list: TreeSelectFieldNode[]): void => {\n for (const node of list) {\n if (node.children && node.children.length > 0) {\n visit(node.children);\n const nonDisabled = node.children.filter((c) => !c.disabled);\n if (\n nonDisabled.length > 0 &&\n nonDisabled.every((c) => checkedIds.has(c.id))\n ) {\n if (!node.disabled) checkedIds.add(node.id);\n } else {\n checkedIds.delete(node.id);\n }\n }\n }\n };\n visit(nodes);\n}\n\n/**\n * Collect IDs of the node and all non-disabled descendants recursively.\n * Disabled nodes themselves are excluded; their children may still be included\n * unless they are also disabled.\n * @param node - Root of the subtree.\n * @returns Array of non-disabled IDs in the subtree.\n */\nfunction getNonDisabledDescendantIds(\n node: TreeSelectFieldNode,\n): (string | number)[] {\n if (node.disabled) return [];\n const result: (string | number)[] = [node.id];\n if (node.children) {\n for (const child of node.children) {\n result.push(...getNonDisabledDescendantIds(child));\n }\n }\n return result;\n}\n\n/**\n * Build a TreeSelectFieldValue array from a set of checked IDs.\n * Tries to preserve label/extra from the existing value array, falling back\n * to the node map.\n * @param checkedIds - The set of checked IDs.\n * @param currentValue - The current value array for label/extra lookup.\n * @param nodeMap - The node map for label/extra fallback.\n * @returns The new value array.\n */\nfunction buildValueFromIds(\n checkedIds: Set<string | number>,\n currentValue: TreeSelectFieldValue[],\n nodeMap: Map<string | number, TreeSelectFieldNode>,\n parentMap: Map<string | number, string | number>,\n): TreeSelectFieldValue[] {\n const existingMap = new Map(currentValue.map((v) => [v.id, v]));\n const result: TreeSelectFieldValue[] = [];\n for (const id of checkedIds) {\n const existing = existingMap.get(id);\n if (existing) {\n result.push(existing);\n } else {\n const node = nodeMap.get(id);\n if (node) {\n const path = resolvePath(node.id, parentMap);\n result.push({\n id: node.id,\n label: node.label,\n extra: node.extra,\n ...(path ? { path } : {}),\n });\n }\n }\n }\n return result;\n}\n","import type { KeyboardEvent } from \"react\";\nimport type { VisibleNode } from \"./types\";\n\n/**\n * Options for the keyboard event handler.\n * @property visibleNodes - The current flat list of visible nodes.\n * @property activeIndex - Index into visibleNodes of the currently focused node, or -1.\n * @property setActiveIndex - Setter for the active index.\n * @property isExpanded - Returns whether a node is expanded.\n * @property toggleExpand - Expands or collapses a branch node.\n * @property toggleNode - Toggles selection for a node.\n */\nexport type UseTreeKeyboardOptions = {\n visibleNodes: VisibleNode[];\n activeIndex: number;\n setActiveIndex: (index: number) => void;\n isExpanded: (id: string | number) => boolean;\n toggleExpand: (id: string | number) => void;\n toggleNode: (id: string | number) => void;\n};\n\n/**\n * Handles keyboard navigation for a tree widget rooted on a combobox input.\n *\n * Focus stays on the input at all times; the tree uses aria-activedescendant\n * to convey the focused node. Returns `true` when the key was handled so the\n * caller can decide whether to let the event propagate (e.g. ArrowLeft/Right\n * falling through to cursor movement inside the input).\n *\n * - ArrowDown: move to next visible node\n * - ArrowUp: move to previous visible node\n * - ArrowRight: expand collapsed branch or move to first child; returns false\n * when there is nothing to do so the cursor can move inside the input\n * - ArrowLeft: collapse expanded branch or move to parent; returns false when\n * there is nothing to do so the cursor can move inside the input\n * - Home: move to first visible node\n * - End: move to last visible node\n * - Enter: toggle selection of focused node\n *\n * @param e - The keyboard event.\n * @param options - The current tree state and callbacks.\n * @returns Whether the key was handled by tree navigation.\n */\nexport function handleTreeKeyDown(\n e: KeyboardEvent,\n options: UseTreeKeyboardOptions,\n): boolean {\n const {\n visibleNodes,\n activeIndex,\n setActiveIndex,\n isExpanded,\n toggleExpand,\n toggleNode,\n } = options;\n\n if (visibleNodes.length === 0) return false;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n if (activeIndex === -1) {\n setActiveIndex(0);\n } else {\n setActiveIndex(Math.min(activeIndex + 1, visibleNodes.length - 1));\n }\n return true;\n }\n\n case \"ArrowUp\": {\n e.preventDefault();\n if (activeIndex === -1) {\n setActiveIndex(visibleNodes.length - 1);\n } else {\n setActiveIndex(Math.max(activeIndex - 1, 0));\n }\n return true;\n }\n\n case \"ArrowRight\": {\n if (activeIndex === -1) return false;\n const rightNode = visibleNodes[activeIndex];\n if (!rightNode.isBranch) return false;\n if (!isExpanded(rightNode.node.id)) {\n e.preventDefault();\n toggleExpand(rightNode.node.id);\n return true;\n }\n // Move to first child (next visible node)\n const nextIndex = activeIndex + 1;\n if (nextIndex < visibleNodes.length) {\n e.preventDefault();\n setActiveIndex(nextIndex);\n return true;\n }\n return false;\n }\n\n case \"ArrowLeft\": {\n if (activeIndex === -1) return false;\n const leftNode = visibleNodes[activeIndex];\n if (leftNode.isBranch && isExpanded(leftNode.node.id)) {\n e.preventDefault();\n toggleExpand(leftNode.node.id);\n return true;\n }\n // Move to parent: find closest ancestor in visible nodes\n const currentDepth = leftNode.depth;\n if (currentDepth === 0) return false;\n for (let i = activeIndex - 1; i >= 0; i--) {\n if (visibleNodes[i].depth < currentDepth) {\n e.preventDefault();\n setActiveIndex(i);\n return true;\n }\n }\n return false;\n }\n\n case \"Home\": {\n e.preventDefault();\n setActiveIndex(0);\n return true;\n }\n\n case \"End\": {\n e.preventDefault();\n setActiveIndex(visibleNodes.length - 1);\n return true;\n }\n\n case \"Enter\": {\n if (activeIndex === -1) return false;\n e.preventDefault();\n const activeNode = visibleNodes[activeIndex];\n toggleNode(activeNode.node.id);\n return true;\n }\n\n default:\n return false;\n }\n}\n","import {\n useState,\n useMemo,\n useCallback,\n useRef,\n useEffect,\n type KeyboardEvent,\n} from \"react\";\nimport type {\n TreeSelectFieldNode,\n TreeSelectFieldValue,\n TreeSelectFieldValueConsistsOf,\n} from \"../types\";\nimport type { VisibleNode } from \"./types\";\nimport {\n computeCheckStates,\n toggleNodeSelection,\n type CheckState,\n} from \"./useTreeCascade\";\nimport { handleTreeKeyDown } from \"./useTreeKeyboard\";\n\nconst EMPTY_PLACEHOLDER_PREFIX = \"\\0__tsf_empty__\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Options for the useTree hook.\n * @property nodes - The full tree data.\n * @property value - Controlled selected values.\n * @property onSelectedOptionsChange - Callback when selection changes.\n * @property selectionMode - \"single\", \"independent\", or \"linked\" (default).\n * @property valueConsistsOf - Controls which nodes are selectable and how the value is shaped.\n * @property defaultExpandLevel - Initial expand depth. 0 = collapsed, Infinity = all.\n * @property expandedIds - Controlled set of expanded node IDs.\n * @property onExpandedIdsChange - Callback when expanded IDs change (controlled mode).\n * @property searchValue - Filter string applied to the tree.\n * @property ancestry - childId → parentId map from the loader, used to attribute\n * off-screen (\"orphan\") selections to their ancestor branches.\n * @property loadingChildrenIds - Set of node IDs whose children are currently being fetched.\n */\nexport type UseTreeOptions = {\n nodes: TreeSelectFieldNode[];\n value: TreeSelectFieldValue[];\n onSelectedOptionsChange: (nodes: TreeSelectFieldValue[]) => void;\n selectionMode?: \"single\" | \"independent\" | \"linked\";\n valueConsistsOf?: TreeSelectFieldValueConsistsOf;\n defaultExpandLevel?: number;\n expandedIds?: Set<string | number>;\n onExpandedIdsChange?: (ids: Set<string | number>) => void;\n searchValue?: string;\n ancestry?: Map<string | number, string | number>;\n loadingChildrenIds?: Set<string | number>;\n};\n\n/**\n * ARIA props returned per tree item.\n */\nexport type TreeItemProps = {\n id: string;\n role: \"treeitem\";\n \"aria-level\": number;\n \"aria-setsize\": number;\n \"aria-posinset\": number;\n \"aria-expanded\"?: boolean;\n \"aria-selected\": boolean;\n};\n\n/**\n * ARIA props for the tree container.\n */\nexport type TreeContainerProps = {\n role: \"tree\";\n \"aria-activedescendant\": string | undefined;\n \"aria-multiselectable\": boolean;\n};\n\n/**\n * Return value from the useTree hook.\n * @property visibleNodes - Flat list of currently visible nodes.\n * @property getCheckState - Returns the visual check state for a node ID.\n * @property toggleNode - Toggles selection for the given node ID.\n * @property isExpanded - Returns whether the given node ID is expanded.\n * @property toggleExpand - Expands or collapses the given branch node ID.\n * @property expandAll - Expands all branch nodes.\n * @property collapseAll - Collapses all branch nodes.\n * @property activeDescendantId - The id attribute of the focused treeitem, for aria-activedescendant.\n * @property onKeyDown - Keyboard event handler for the tree container.\n * @property getTreeItemProps - Returns ARIA props for a given node ID.\n * @property treeProps - ARIA props for the tree container element.\n */\nexport type UseTreeReturn = {\n nodes: TreeSelectFieldNode[];\n visibleNodes: VisibleNode[];\n getCheckState: (id: string | number) => CheckState;\n toggleNode: (id: string | number) => void;\n isExpanded: (id: string | number) => boolean;\n toggleExpand: (id: string | number) => void;\n expandAll: () => void;\n collapseAll: () => void;\n activeDescendantId: string | undefined;\n setActiveNodeId: (id: string | number) => void;\n onKeyDown: (e: KeyboardEvent) => void;\n getTreeItemProps: (id: string | number) => TreeItemProps;\n treeProps: TreeContainerProps;\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Collects the IDs of all branch nodes (nodes with a defined children property) recursively.\n * @param nodes - The tree nodes to traverse.\n * @returns Array of branch node IDs.\n */\nfunction collectAllBranchIds(\n nodes: TreeSelectFieldNode[],\n): (string | number)[] {\n const result: (string | number)[] = [];\n const visit = (list: TreeSelectFieldNode[]) => {\n for (const node of list) {\n if (node.children !== undefined) {\n result.push(node.id);\n if (node.children) visit(node.children);\n }\n }\n };\n visit(nodes);\n return result;\n}\n\n/**\n * Builds the initial expanded ID set based on defaultExpandLevel.\n * @param nodes - The full tree.\n * @param defaultExpandLevel - How many levels deep to expand initially.\n * @returns A Set of initially expanded node IDs.\n */\nfunction buildDefaultExpanded(\n nodes: TreeSelectFieldNode[],\n defaultExpandLevel: number,\n): Set<string | number> {\n const result = new Set<string | number>();\n const visit = (list: TreeSelectFieldNode[], depth: number) => {\n if (depth >= defaultExpandLevel) return;\n for (const node of list) {\n if (node.children !== undefined) {\n result.add(node.id);\n if (node.children) visit(node.children, depth + 1);\n }\n }\n };\n visit(nodes, 0);\n return result;\n}\n\n/** Returns true if the node is a branch (has a defined children property). */\nfunction isBranchNode(node: TreeSelectFieldNode): boolean {\n return node.children !== undefined;\n}\n\n/**\n * Checks whether a node or any of its descendants match the search string.\n * @param node - The node to check.\n * @param search - Lower-cased search string.\n * @returns Whether the node or a descendant matches.\n */\nfunction nodeMatchesSearch(node: TreeSelectFieldNode, search: string): boolean {\n const labelMatch = node.label.toLowerCase().includes(search);\n const searchTextMatch = node.searchText\n ? node.searchText.toLowerCase().includes(search)\n : false;\n if (labelMatch || searchTextMatch) return true;\n if (node.children) {\n return node.children.some((child) => nodeMatchesSearch(child, search));\n }\n return false;\n}\n\n/**\n * Flattens the tree into visible nodes respecting expand state, with optional search filtering.\n * When searching (non-flat), auto-expands all branches that contain matches.\n * @param nodes - The tree to flatten.\n * @param expandedIds - Currently expanded node IDs.\n * @param search - Lower-cased search string, or undefined.\n * @param depth - Current depth (used recursively).\n * @returns Flat array of VisibleNode.\n */\nfunction flattenTree(\n nodes: TreeSelectFieldNode[],\n expandedIds: Set<string | number>,\n search: string | undefined,\n depth: number,\n): VisibleNode[] {\n const result: VisibleNode[] = [];\n\n for (const node of nodes) {\n const isBranch = isBranchNode(node);\n\n // If searching, filter: include the node only if it or a descendant matches\n if (search !== undefined) {\n if (!nodeMatchesSearch(node, search)) continue;\n }\n\n const expanded = isBranch\n ? search !== undefined\n ? // During search, auto-expand branches that have matching descendants\n nodeMatchesSearch(node, search)\n : expandedIds.has(node.id)\n : false;\n\n result.push({\n node,\n depth,\n isExpanded: expanded,\n isBranch,\n isLoading: false,\n });\n\n if (isBranch && expanded) {\n if (node.children && node.children.length > 0) {\n result.push(\n ...flattenTree(node.children, expandedIds, search, depth + 1),\n );\n } else if (node.children && node.children.length === 0) {\n result.push({\n node: {\n id: `${EMPTY_PLACEHOLDER_PREFIX}${node.id}`,\n label: \"No items\",\n },\n depth: depth + 1,\n isExpanded: false,\n isBranch: false,\n isLoading: false,\n isEmptyPlaceholder: true,\n });\n }\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// useTree\n// ---------------------------------------------------------------------------\n\n/**\n * Core tree state hook that manages expansion, selection, keyboard navigation,\n * search filtering, and ARIA attributes for a tree widget.\n *\n * Features:\n * - Uncontrolled expansion state by default; fully controlled via expandedIds/onExpandedIdsChange\n * - defaultExpandLevel for initial expansion depth\n * - expandAll / collapseAll helpers\n * - Delegates selection logic to computeCheckStates and toggleNodeSelection from useTreeCascade\n * - valueConsistsOf determines which nodes are selectable\n * - Search filtering that preserves tree structure\n * - Full keyboard navigation (WAI-ARIA tree pattern)\n * - ARIA attribute generation for tree container and tree items\n *\n * @param options - Configuration options for the tree state.\n * @returns Tree state and handlers.\n */\nexport function useTree(options: UseTreeOptions): UseTreeReturn {\n const {\n nodes,\n value,\n onSelectedOptionsChange,\n selectionMode = \"linked\",\n valueConsistsOf = \"LEAF_PRIORITY\",\n defaultExpandLevel = 0,\n expandedIds: controlledExpandedIds,\n onExpandedIdsChange,\n searchValue,\n ancestry,\n loadingChildrenIds,\n } = options;\n\n const isControlled = controlledExpandedIds !== undefined;\n\n // Uncontrolled expanded state — initialized from defaultExpandLevel\n const [uncontrolledExpandedIds, setUncontrolledExpandedIds] = useState<\n Set<string | number>\n >(() => buildDefaultExpanded(nodes, defaultExpandLevel));\n\n // Re-apply defaultExpandLevel when nodes arrive for the first time\n // (loader starts with [] then resolves with data).\n const appliedDefaultExpandRef = useRef(nodes.length > 0);\n useEffect(() => {\n if (!appliedDefaultExpandRef.current && nodes.length > 0 && !isControlled) {\n appliedDefaultExpandRef.current = true;\n setUncontrolledExpandedIds(\n buildDefaultExpanded(nodes, defaultExpandLevel),\n );\n }\n }, [nodes, defaultExpandLevel, isControlled]);\n\n // Active keyboard index (-1 = no focus)\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n\n // The effective expanded IDs (controlled or uncontrolled)\n const expandedIds = isControlled\n ? controlledExpandedIds\n : uncontrolledExpandedIds;\n\n // ---------------------------------------------------------------------------\n // Expand / collapse\n // ---------------------------------------------------------------------------\n\n const isExpanded = useCallback(\n (id: string | number): boolean => expandedIds.has(id),\n [expandedIds],\n );\n\n const setExpandedIds = useCallback(\n (next: Set<string | number>) => {\n if (isControlled) {\n onExpandedIdsChange?.(next);\n } else {\n setUncontrolledExpandedIds(next);\n }\n },\n [isControlled, onExpandedIdsChange],\n );\n\n const toggleExpand = useCallback(\n (id: string | number) => {\n const next = new Set(expandedIds);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n setExpandedIds(next);\n },\n [expandedIds, setExpandedIds],\n );\n\n const expandAll = useCallback(() => {\n const allBranchIds = collectAllBranchIds(nodes);\n setExpandedIds(new Set(allBranchIds));\n }, [nodes, setExpandedIds]);\n\n const collapseAll = useCallback(() => {\n setExpandedIds(new Set());\n }, [setExpandedIds]);\n\n // ---------------------------------------------------------------------------\n // Visible nodes\n // ---------------------------------------------------------------------------\n\n const normalizedSearch = searchValue?.trim().toLowerCase() || undefined;\n\n const visibleNodes = useMemo<VisibleNode[]>(() => {\n const flat = flattenTree(nodes, expandedIds, normalizedSearch, 0);\n\n if (!loadingChildrenIds || loadingChildrenIds.size === 0) return flat;\n\n return flat.map((vn) =>\n loadingChildrenIds.has(vn.node.id) ? { ...vn, isLoading: true } : vn,\n );\n }, [nodes, expandedIds, normalizedSearch, loadingChildrenIds]);\n\n const visibleNodeMap = useMemo(() => {\n const map = new Map<string | number, VisibleNode>();\n for (const vn of visibleNodes) {\n map.set(vn.node.id, vn);\n }\n return map;\n }, [visibleNodes]);\n\n // Build sibling groups from visible nodes for accurate aria-setsize/posinset\n // during search filtering. Groups nodes by their parent in the visible tree.\n const visibleSiblingsMap = useMemo(() => {\n const map = new Map<\n string | number,\n { setSize: number; posInSet: number }\n >();\n\n // Group visible nodes by parent. We track the parent stack as we walk the\n // flat list: when depth increases after an expanded branch, push that branch\n // as the current parent; when depth decreases, pop back up.\n type ParentKey = string | number | \"__root__\";\n const groups = new Map<ParentKey, (string | number)[]>();\n const parentStack: { id: string | number; depth: number }[] = [];\n\n for (const vn of visibleNodes) {\n if (vn.isEmptyPlaceholder) continue;\n\n // Pop stack until we find a parent at a shallower depth\n while (\n parentStack.length > 0 &&\n parentStack[parentStack.length - 1].depth >= vn.depth\n ) {\n parentStack.pop();\n }\n\n const parentKey: ParentKey =\n parentStack.length > 0\n ? parentStack[parentStack.length - 1].id\n : \"__root__\";\n\n let group = groups.get(parentKey);\n if (!group) {\n group = [];\n groups.set(parentKey, group);\n }\n group.push(vn.node.id);\n\n if (vn.isBranch && vn.isExpanded) {\n parentStack.push({ id: vn.node.id, depth: vn.depth });\n }\n }\n\n // Convert groups to setSize/posInSet\n for (const group of groups.values()) {\n for (let i = 0; i < group.length; i++) {\n map.set(group[i], { setSize: group.length, posInSet: i + 1 });\n }\n }\n\n return map;\n }, [visibleNodes]);\n\n // ---------------------------------------------------------------------------\n // Selection\n // ---------------------------------------------------------------------------\n\n // Resolve ancestor branches of \"orphan\" selections — checked ids that aren't\n // in the currently-loaded tree (e.g. a descendant under a collapsed lazy\n // branch). For each, take its ancestors from the value's own `path` when\n // present, else walk the loader's ancestry map. Only these specific branches\n // are forced to indeterminate, so unrelated collapsed siblings stay unchecked.\n const orphanAncestorIds = useMemo(() => {\n const loadedIds = new Set<string | number>();\n const collect = (list: TreeSelectFieldNode[]) => {\n for (const n of list) {\n loadedIds.add(n.id);\n if (n.children) collect(n.children);\n }\n };\n collect(nodes);\n\n const ancestors = new Set<string | number>();\n for (const v of value) {\n if (loadedIds.has(v.id)) continue; // not an orphan — handled by aggregation\n\n if (v.path && v.path.length > 0) {\n for (const ancestorId of v.path) ancestors.add(ancestorId);\n continue;\n }\n\n // Fall back to the loader's childId → parentId map.\n if (ancestry) {\n const seen = new Set<string | number>();\n let parent = ancestry.get(v.id);\n while (parent !== undefined && !seen.has(parent)) {\n seen.add(parent);\n ancestors.add(parent);\n parent = ancestry.get(parent);\n }\n }\n }\n return ancestors;\n }, [nodes, value, ancestry]);\n\n const checkStates = useMemo(\n () =>\n computeCheckStates(\n nodes,\n value,\n selectionMode,\n valueConsistsOf,\n orphanAncestorIds,\n ),\n [nodes, value, selectionMode, valueConsistsOf, orphanAncestorIds],\n );\n\n const getCheckState = useCallback(\n (id: string | number): CheckState => checkStates.get(id) ?? \"unchecked\",\n [checkStates],\n );\n\n const toggleNode = useCallback(\n (id: string | number) => {\n const newValue = toggleNodeSelection(\n nodes,\n value,\n id,\n selectionMode,\n valueConsistsOf,\n );\n onSelectedOptionsChange(newValue);\n },\n [nodes, value, selectionMode, valueConsistsOf, onSelectedOptionsChange],\n );\n\n // ---------------------------------------------------------------------------\n // Keyboard navigation\n // ---------------------------------------------------------------------------\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent): boolean => {\n return handleTreeKeyDown(e, {\n visibleNodes,\n activeIndex,\n setActiveIndex,\n isExpanded,\n toggleExpand,\n toggleNode,\n });\n },\n [visibleNodes, activeIndex, isExpanded, toggleExpand, toggleNode],\n );\n\n // ---------------------------------------------------------------------------\n // ARIA\n // ---------------------------------------------------------------------------\n\n const activeDescendantId =\n activeIndex >= 0 && activeIndex < visibleNodes.length\n ? `treeitem-${visibleNodes[activeIndex].node.id}`\n : undefined;\n\n const setActiveNodeId = useCallback(\n (id: string | number) => {\n const idx = visibleNodes.findIndex((vn) => vn.node.id === id);\n if (idx !== -1) setActiveIndex(idx);\n },\n [visibleNodes],\n );\n\n const getTreeItemProps = useCallback(\n (id: string | number): TreeItemProps => {\n const visibleNode = visibleNodeMap.get(id);\n const depth = visibleNode?.depth ?? 0;\n const isBranch = visibleNode?.isBranch ?? false;\n const expanded = isBranch\n ? (visibleNode?.isExpanded ?? isExpanded(id))\n : undefined;\n\n // Compute setsize and posinset from visible siblings (filtered tree)\n const siblingInfo = visibleSiblingsMap.get(id);\n const setSize = siblingInfo?.setSize ?? 1;\n const posInSet = siblingInfo?.posInSet ?? 1;\n\n const checkState = getCheckState(id);\n const isSelected = checkState === \"checked\";\n\n const props: TreeItemProps = {\n id: `treeitem-${id}`,\n role: \"treeitem\",\n \"aria-level\": depth + 1,\n \"aria-setsize\": setSize,\n \"aria-posinset\": posInSet,\n \"aria-selected\": isSelected,\n };\n\n if (isBranch) {\n props[\"aria-expanded\"] = expanded;\n }\n\n return props;\n },\n [visibleNodeMap, isExpanded, visibleSiblingsMap, getCheckState],\n );\n\n const treeProps = useMemo<TreeContainerProps>(\n () => ({\n role: \"tree\",\n \"aria-activedescendant\": activeDescendantId,\n \"aria-multiselectable\": selectionMode !== \"single\",\n }),\n [activeDescendantId, selectionMode],\n );\n\n return {\n nodes,\n visibleNodes,\n getCheckState,\n toggleNode,\n isExpanded,\n toggleExpand,\n expandAll,\n collapseAll,\n activeDescendantId,\n setActiveNodeId,\n onKeyDown,\n getTreeItemProps,\n treeProps,\n };\n}\n","import cx from \"classnames\";\nimport { Icon } from \"../../../../components/Icon\";\nimport { Spinner } from \"../../../../components/Spinner\";\nimport KeyboardArrowRight from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_right.svg\";\nimport KeyboardArrowDown from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_down.svg\";\nimport type { TreeSelectFieldNode } from \"../types\";\nimport type { VisibleNode } from \"./types\";\nimport styles from \"./TreeRow.module.scss\";\nimport { Text } from \"../../../../components\";\nimport { OptionCheckbox } from \"../../../../internal/components/OptionCheckbox\";\nimport { OptionContentArea } from \"../../../../internal/components/OptionContentArea\";\nimport {\n OptionRow,\n OptionRowSideContent,\n} from \"../../../../internal/components/OptionRow\";\n\nconst INDENT_BASE = 16;\nconst INDENT_PER_DEPTH = 24;\nconst EXPAND_ICON_WIDTH = 32;\n\n/**\n * Props for the TreeRow component.\n * @property {VisibleNode} visible - The visible node data including depth, expand state, and branch info.\n * @property {\"checked\" | \"unchecked\" | \"indeterminate\"} checkState - The checkbox state for this row.\n * @property {Record<string, unknown>} itemProps - ARIA/accessibility props from getTreeItemProps.\n * @property {boolean} [branchesSelectable] - When true, branch nodes can be selected. Defaults to true.\n * @property {boolean} [leavesSelectable] - When true, leaf nodes can be selected. Defaults to true.\n * @property {boolean} [emptyBranchesSelectable] - When true, empty branches (children: []) can be selected. Defaults to true.\n * @property {boolean} [isActive] - When true, applies a highlight background for keyboard focus.\n * @property {(id: string | number) => void} onToggleNode - Callback to toggle selection of the node.\n * @property {(id: string | number) => void} onToggleExpand - Callback to toggle expansion of a branch node.\n * @property {(node: TreeSelectFieldNode) => void} [onLoadChildren] - Callback to trigger lazy loading of children.\n * @property {number} depth - Depth of the node in the tree, used to calculate indentation.\n */\nexport type TreeRowProps = {\n visible: VisibleNode;\n checkState: \"checked\" | \"unchecked\" | \"indeterminate\" | \"loading\";\n itemProps: Record<string, unknown>;\n branchesSelectable?: boolean;\n leavesSelectable?: boolean;\n emptyBranchesSelectable?: boolean;\n readOnly?: boolean;\n isActive?: boolean;\n onToggleNode: (id: string | number) => void;\n onToggleExpand: (id: string | number) => void;\n onHover?: (id: string | number) => void;\n onLoadChildren?: (node: TreeSelectFieldNode) => void;\n depth: number;\n};\n\n/**\n * TreeRow renders a single row in the tree dropdown.\n *\n * Features:\n * - Depth-based indentation via inline paddingInlineStart\n * - Expand/collapse icon using Icon component with keyboard_arrow_right/down icons\n * - Spinning icon animation for lazy-loading branch nodes\n * - Checkbox in multi-select mode, hidden in single-select mode\n * - Rich content support via node.content (title, description, chips, avatar, icon)\n * - Label text with overflow ellipsis\n * - Disabled state with reduced opacity and default cursor\n * - Active (keyboard focus) state with highlight background\n * - Full ARIA semantics via spread itemProps\n *\n * @example\n * <TreeRow\n * visible={visibleNode}\n * checkState={getCheckState(visibleNode.node.id)}\n * itemProps={getTreeItemProps(visibleNode.node.id)}\n * onToggleNode={toggleNode}\n * onToggleExpand={toggleExpand}\n * depth={visibleNode.depth}\n * />\n */\nexport function TreeRow({\n visible,\n checkState,\n itemProps,\n branchesSelectable = true,\n leavesSelectable = true,\n emptyBranchesSelectable = true,\n readOnly = false,\n isActive,\n onToggleNode,\n onToggleExpand,\n onHover,\n onLoadChildren,\n depth,\n}: TreeRowProps) {\n const { node, isExpanded, isBranch, isLoading, isEmptyPlaceholder } = visible;\n\n if (isEmptyPlaceholder) {\n return (\n <OptionRow\n disabled\n className={styles[\"tree-row\"]}\n style={{\n paddingInlineStart:\n INDENT_BASE + depth * INDENT_PER_DEPTH + EXPAND_ICON_WIDTH,\n }}\n >\n <span className={styles[\"label-container\"]}>\n <Text>{node.label}</Text>\n </span>\n </OptionRow>\n );\n }\n\n const isDisabled = node.disabled === true;\n const isEmptyBranch =\n isBranch && Array.isArray(node.children) && node.children.length === 0;\n const isSelectable = (() => {\n if (!isBranch) return leavesSelectable;\n if (!branchesSelectable) return false;\n if (isEmptyBranch && !emptyBranchesSelectable) return false;\n return true;\n })();\n\n const showExpandIcon = isBranch;\n const paddingInlineStart =\n INDENT_BASE +\n depth * INDENT_PER_DEPTH +\n (showExpandIcon ? 0 : EXPAND_ICON_WIDTH);\n const rowDisabled = readOnly || isDisabled || (!isSelectable && !isBranch);\n\n const expandNode = () => {\n onToggleExpand(node.id);\n if (node.children === null) onLoadChildren?.(node);\n };\n\n const handleExpandClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isDisabled) return;\n expandNode();\n };\n\n const handleRowClick = () => {\n if (isDisabled) return;\n if (isBranch) {\n if (isSelectable) {\n onToggleNode(node.id);\n } else {\n expandNode();\n }\n } else if (isSelectable) {\n onToggleNode(node.id);\n }\n };\n\n let expandIconElement: React.ReactNode = null;\n if (showExpandIcon) {\n if (isLoading && checkState !== \"loading\") {\n expandIconElement = <Spinner size=\"small\" aria-hidden=\"true\" />;\n } else if (isExpanded) {\n expandIconElement = (\n <Icon svg={KeyboardArrowDown} size=\"small\" inherit aria-hidden=\"true\" />\n );\n } else {\n expandIconElement = (\n <Icon\n svg={KeyboardArrowRight}\n size=\"small\"\n inherit\n aria-hidden=\"true\"\n />\n );\n }\n }\n\n return (\n <OptionRow\n {...itemProps}\n disabled={rowDisabled}\n style={{ paddingInlineStart }}\n className={cx(styles[\"tree-row\"], {\n [styles[\"active\"]]: isActive,\n })}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => onHover?.(node.id)}\n onClick={handleRowClick}\n aria-disabled={rowDisabled || undefined}\n >\n {showExpandIcon && (\n <span\n className={styles[\"expand-icon\"]}\n onClick={handleExpandClick}\n aria-hidden=\"true\"\n >\n {expandIconElement}\n </span>\n )}\n {isSelectable && (\n <OptionRowSideContent>\n <OptionCheckbox checkState={checkState} />\n </OptionRowSideContent>\n )}\n <OptionContentArea label={node.label} content={node.content} />\n </OptionRow>\n );\n}\n","import { forwardRef } from \"react\";\nimport cx from \"classnames\";\nimport type { TreeSelectFieldNode } from \"../types\";\nimport type { VisibleNode } from \"./types\";\nimport { TreeRow } from \"./TreeRow\";\nimport styles from \"./TreePanel.module.scss\";\n\n/**\n * Props for the TreePanel component.\n * @property {VisibleNode[]} visibleNodes - Flat list of nodes currently visible in the tree.\n * @property {(id: string | number) => \"checked\" | \"unchecked\" | \"indeterminate\" | \"loading\"} getCheckState - Returns the check state for a given node id.\n * @property {(id: string | number) => void} toggleNode - Toggles the selection state of a node.\n * @property {(id: string | number) => void} toggleExpand - Toggles the expanded state of a branch node.\n * @property {(id: string | number) => Record<string, unknown>} getTreeItemProps - Returns ARIA/accessibility props for a tree item.\n * @property {Record<string, unknown>} treeProps - Props to spread onto the tree container element.\n * @property {string | undefined} activeDescendantId - The id of the currently active/focused tree item.\n * @property {boolean} [branchesSelectable] - When true, branch nodes can be selected.\n * @property {boolean} [leavesSelectable] - When true, leaf nodes can be selected.\n * @property {boolean} [emptyBranchesSelectable] - When true, empty branches can be selected.\n * @property {(node: TreeSelectFieldNode) => void} [onLoadChildren] - Callback to trigger lazy loading of children.\n */\nexport type TreePanelProps = {\n visibleNodes: VisibleNode[];\n getCheckState: (\n id: string | number,\n ) => \"checked\" | \"unchecked\" | \"indeterminate\" | \"loading\";\n toggleNode: (id: string | number) => void;\n toggleExpand: (id: string | number) => void;\n getTreeItemProps: (id: string | number) => Record<string, unknown>;\n treeProps: Record<string, unknown>;\n activeDescendantId: string | undefined;\n branchesSelectable?: boolean;\n leavesSelectable?: boolean;\n emptyBranchesSelectable?: boolean;\n readOnly?: boolean;\n onHover?: (id: string | number) => void;\n onLoadChildren?: (node: TreeSelectFieldNode) => void;\n};\n\n/**\n * TreePanel component that renders the tree dropdown content.\n *\n * Features:\n * - Renders a flat list of visible nodes with depth-based indentation\n * - Supports expand/collapse controls for branch nodes\n * - Shows loading indicator for lazily-loaded branches\n * - Checkboxes for multi-select mode (hidden in single-select mode)\n * - Optional breadcrumb display for flattened search results\n * - Optional child count display for branch nodes\n * - Full accessibility support with ARIA tree/treeitem roles\n * - Focusable container via forwardRef\n *\n * @example\n * <TreePanel\n * visibleNodes={visibleNodes}\n * getCheckState={getCheckState}\n * toggleNode={toggleNode}\n * toggleExpand={toggleExpand}\n * getTreeItemProps={getTreeItemProps}\n * treeProps={treeProps}\n * activeDescendantId={activeDescendantId}\n * />\n */\nexport const TreePanel = forwardRef<HTMLDivElement, TreePanelProps>(\n function TreePanelInner(\n {\n visibleNodes,\n getCheckState,\n toggleNode,\n toggleExpand,\n getTreeItemProps,\n treeProps,\n activeDescendantId,\n branchesSelectable,\n leavesSelectable,\n emptyBranchesSelectable,\n readOnly,\n onHover,\n onLoadChildren,\n },\n ref,\n ) {\n return (\n <div\n ref={ref}\n {...treeProps}\n className={cx(styles.panel, treeProps.className)}\n >\n {visibleNodes.map((visible) => (\n <TreeRow\n key={visible.node.id}\n visible={visible}\n checkState={getCheckState(visible.node.id)}\n itemProps={getTreeItemProps(visible.node.id)}\n isActive={activeDescendantId === `treeitem-${visible.node.id}`}\n branchesSelectable={branchesSelectable}\n leavesSelectable={leavesSelectable}\n emptyBranchesSelectable={emptyBranchesSelectable}\n readOnly={readOnly}\n onToggleNode={toggleNode}\n onToggleExpand={toggleExpand}\n onHover={onHover}\n onLoadChildren={onLoadChildren}\n depth={visible.depth}\n />\n ))}\n </div>\n );\n },\n);\n\nTreePanel.displayName = \"TreePanel\";\n","import { forwardRef, useCallback, useRef } from \"react\";\nimport cx from \"classnames\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type { TreeSelectFieldNode } from \"../types\";\nimport type { VisibleNode } from \"./types\";\nimport { TreeRow } from \"./TreeRow\";\nimport styles from \"./TreePanel.module.scss\";\n\nconst EST_PADDING_BLOCK = 16;\nconst EST_LINE_HEIGHT = 18;\nconst EST_CHIP_ROW_HEIGHT = 28;\nconst EST_SIDE_CONTENT_HEIGHT = 40;\nconst EST_BASE_ROW_HEIGHT = EST_PADDING_BLOCK + EST_LINE_HEIGHT;\n\nfunction estimateTreeRowHeight(visible: VisibleNode): number {\n const content = visible.node.content;\n if (!content) return EST_BASE_ROW_HEIGHT;\n\n let contentHeight = EST_LINE_HEIGHT;\n if (content.description) contentHeight += EST_LINE_HEIGHT;\n if (content.chips?.length) contentHeight += EST_CHIP_ROW_HEIGHT;\n if (content.avatar || content.icon)\n contentHeight = Math.max(contentHeight, EST_SIDE_CONTENT_HEIGHT);\n\n return EST_PADDING_BLOCK + contentHeight;\n}\n\n/**\n * Props for the VirtualizedTreePanel component.\n * @property visibleNodes - Flat list of currently visible tree nodes.\n * @property getCheckState - Returns the visual check state for a node ID.\n * @property toggleNode - Toggles selection for the given node ID.\n * @property toggleExpand - Expands or collapses the given branch node ID.\n * @property getTreeItemProps - Returns ARIA props for a given node ID.\n * @property treeProps - ARIA props for the tree container element.\n * @property activeDescendantId - The id attribute of the focused treeitem, for aria-activedescendant.\n * @property branchesSelectable - When true, branch nodes can be selected.\n * @property leavesSelectable - When true, leaf nodes can be selected.\n * @property onLoadChildren - Callback to lazily load children for a node with children===null.\n */\nexport type VirtualizedTreePanelProps = {\n visibleNodes: VisibleNode[];\n getCheckState: (\n id: string | number,\n ) => \"checked\" | \"unchecked\" | \"indeterminate\" | \"loading\";\n toggleNode: (id: string | number) => void;\n toggleExpand: (id: string | number) => void;\n getTreeItemProps: (id: string | number) => Record<string, unknown>;\n treeProps: Record<string, unknown>;\n activeDescendantId: string | undefined;\n branchesSelectable?: boolean;\n leavesSelectable?: boolean;\n emptyBranchesSelectable?: boolean;\n readOnly?: boolean;\n onHover?: (id: string | number) => void;\n onLoadChildren?: (node: TreeSelectFieldNode) => void;\n};\n\n/**\n * VirtualizedTreePanel renders a virtualized tree list using @tanstack/react-virtual,\n * only mounting DOM nodes for visible rows. Intended for large tree datasets.\n *\n * Features:\n * - Only renders visible rows via @tanstack/react-virtual for performance\n * - Same visual output and interaction model as a non-virtualized tree panel\n * - Supports multi-select checkboxes and single-select modes\n * - Expand/collapse branch nodes with optional lazy loading\n * - Keyboard navigation via onKeyDown handler\n * - Full ARIA tree semantics (role, aria-level, aria-expanded, etc.)\n * - Optional child count display on branch nodes\n * - Breadcrumb display for flattened search results\n *\n * @example\n * <VirtualizedTreePanel\n * visibleNodes={visibleNodes}\n * getCheckState={getCheckState}\n * toggleNode={toggleNode}\n * toggleExpand={toggleExpand}\n * getTreeItemProps={getTreeItemProps}\n * treeProps={treeProps}\n * onKeyDown={onKeyDown}\n * activeDescendantId={activeDescendantId}\n * />\n */\nexport const VirtualizedTreePanel = forwardRef<\n HTMLDivElement,\n VirtualizedTreePanelProps\n>(function VirtualizedTreePanelInner(props, ref) {\n const {\n visibleNodes,\n getCheckState,\n toggleNode,\n toggleExpand,\n getTreeItemProps,\n treeProps,\n activeDescendantId,\n branchesSelectable = true,\n leavesSelectable = true,\n emptyBranchesSelectable = true,\n readOnly = false,\n onHover,\n onLoadChildren,\n } = props;\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const estimateSize = useCallback(\n (index: number) => estimateTreeRowHeight(visibleNodes[index]),\n [visibleNodes],\n );\n\n const virtualizer = useVirtualizer({\n count: visibleNodes.length,\n getScrollElement: () => scrollRef.current,\n estimateSize,\n overscan: 5,\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n\n return (\n <div\n ref={(node) => {\n scrollRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n {...treeProps}\n className={cx(styles.panel, treeProps.className)}\n >\n <div\n style={{\n height: virtualizer.getTotalSize(),\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {virtualItems.map((virtualItem) => {\n const visible = visibleNodes[virtualItem.index];\n return (\n <div\n key={visible.node.id}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <TreeRow\n visible={visible}\n checkState={getCheckState(visible.node.id)}\n itemProps={getTreeItemProps(visible.node.id)}\n isActive={activeDescendantId === `treeitem-${visible.node.id}`}\n branchesSelectable={branchesSelectable}\n leavesSelectable={leavesSelectable}\n emptyBranchesSelectable={emptyBranchesSelectable}\n readOnly={readOnly}\n onToggleNode={toggleNode}\n onToggleExpand={toggleExpand}\n onHover={onHover}\n onLoadChildren={onLoadChildren}\n depth={visible.depth}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n});\n","import { forwardRef } from \"react\";\nimport { Spinner } from \"../../../../components/Spinner\";\nimport { Text } from \"../../../../components/Text\";\nimport { TreePanel } from \"./TreePanel\";\nimport { VirtualizedTreePanel } from \"./VirtualizedTreePanel\";\nimport type { TreePanelProps } from \"./TreePanel\";\n\n/**\n * Props for the TreeContent component.\n *\n * @property loading - Whether the tree is currently loading data; renders a spinner while true.\n * @property hasNoVisibleNodes - True when there are no nodes to render (e.g. a search returned no matches); renders an empty-state message.\n * @property virtualize - When true, renders the virtualized panel; otherwise renders the standard panel.\n * @property panelProps - Props forwarded to the underlying TreePanel or VirtualizedTreePanel.\n */\nexport type TreeContentProps = {\n loading: boolean;\n hasNoVisibleNodes: boolean;\n virtualize?: boolean;\n panelProps: TreePanelProps;\n};\n\n/**\n * Renders the body of a tree select popover or dialog: a centered spinner\n * while loading, a \"No match found\" message when there are no visible\n * nodes, or the (optionally virtualized) tree panel.\n *\n * Used by both TreeSelectField and TreeSelectMenu to keep the three\n * states consistent across the field's dialog and popover branches and\n * the menu's render path.\n *\n * Features:\n * - Centered medium Spinner while loading\n * - \"No match found\" empty state (small, subdued text)\n * - Switches between TreePanel and VirtualizedTreePanel via the `virtualize` flag\n * - Forwards a ref to the underlying tree panel for focus management\n */\nexport const TreeContent = forwardRef<HTMLDivElement, TreeContentProps>(\n function TreeContent(\n { loading, hasNoVisibleNodes, virtualize, panelProps },\n ref,\n ) {\n if (loading) {\n return (\n <div\n style={{\n padding: \"var(--a2-spacing-200)\",\n display: \"flex\",\n justifyContent: \"center\",\n }}\n >\n <Spinner size=\"medium\" />\n </div>\n );\n }\n if (hasNoVisibleNodes) {\n return (\n <div\n role=\"presentation\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1rem\",\n textAlign: \"center\",\n }}\n >\n <Text subdued size=\"small\">\n No match found\n </Text>\n </div>\n );\n }\n return virtualize ? (\n <VirtualizedTreePanel ref={ref} {...panelProps} />\n ) : (\n <TreePanel ref={ref} {...panelProps} />\n );\n },\n);\n\nTreeContent.displayName = \"TreeContent\";\n","import type { TreeSelectFieldNode } from \"../types\";\n\n/**\n * Recursively finds the first node in the tree matching the given id.\n *\n * @param nodes - The tree nodes to search.\n * @param id - The id of the node to find.\n * @returns The matching node, or undefined if no node has the given id.\n */\nexport function findNode(\n nodes: TreeSelectFieldNode[],\n id: string | number,\n): TreeSelectFieldNode | undefined {\n for (const node of nodes) {\n if (node.id === id) return node;\n if (node.children) {\n const found = findNode(node.children, id);\n if (found) return found;\n }\n }\n return undefined;\n}\n\n/**\n * Returns true when the given node or any of its descendants still need to\n * be lazy-loaded (i.e. has `children: null`).\n *\n * @param node - The node to inspect.\n * @returns Whether any descendant branch is still unloaded.\n */\nexport function hasUnloadedDescendants(node: TreeSelectFieldNode): boolean {\n if (node.children === null) return true;\n if (!node.children) return false;\n return node.children.some(hasUnloadedDescendants);\n}\n\n/**\n * Returns all descendant branches of the given node whose children have not\n * yet been loaded (i.e. `children: null`). The node itself is not included.\n *\n * @param node - The ancestor node to walk.\n * @returns Every descendant branch that still requires lazy loading.\n */\nexport function findUnloadedDescendants(\n node: TreeSelectFieldNode,\n): TreeSelectFieldNode[] {\n const result: TreeSelectFieldNode[] = [];\n if (!node.children) return result;\n for (const child of node.children) {\n if (child.children === null) {\n result.push(child);\n } else if (child.children) {\n result.push(...findUnloadedDescendants(child));\n }\n }\n return result;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { UseTreeReturn } from \"./useTree\";\nimport type { UseTreeLoaderReturn } from \"./useTreeLoader\";\nimport {\n findNode,\n findUnloadedDescendants,\n hasUnloadedDescendants,\n} from \"./treeUtils\";\n\n/**\n * Options for {@link useTreeLazyCascade}.\n *\n * @property tree - Tree state from useTree, used to read nodes and run toggles.\n * @property loader - Tree loader, used to lazy-load unloaded descendants.\n * @property isSingleSelect - Whether the consumer is in single-select mode; controls auto-close after a successful toggle.\n * @property branchesSelectable - Whether branch nodes can be selected (vs only expanded).\n * @property leavesSelectable - Whether leaf nodes can be selected.\n * @property emptyBranchesSelectable - Whether branches with an empty children array can be selected.\n * @property readOnly - When true, all toggle attempts no-op.\n * @property onCloseAfterSingleSelect - Called after a successful single-select toggle so the consumer can close its menu and restore focus.\n */\nexport type UseTreeLazyCascadeOptions = {\n tree: UseTreeReturn;\n loader: UseTreeLoaderReturn;\n isSingleSelect: boolean;\n branchesSelectable: boolean;\n leavesSelectable: boolean;\n emptyBranchesSelectable: boolean;\n readOnly?: boolean;\n onCloseAfterSingleSelect?: () => void;\n};\n\n/**\n * Return value of {@link useTreeLazyCascade}.\n *\n * @property handleToggleNode - Click/Space handler for a tree row that respects selectability and loads any unloaded descendants before cascading.\n * @property pendingToggleNodeId - The id of the node currently waiting on lazy loads to complete (used to render a loading checkbox), or null.\n * @property reset - Clears any in-flight pending toggle. Call from the consumer's closeMenu so reopening starts clean.\n */\nexport type UseTreeLazyCascadeReturn = {\n handleToggleNode: (nodeId: string | number) => void;\n pendingToggleNodeId: string | number | null;\n reset: () => void;\n};\n\n/**\n * Coordinates \"toggle a tree node, but lazy-load any unloaded descendants\n * first\" — the bit of orchestration that sits between useTree and\n * useTreeLoader and is shared between TreeSelectField and TreeSelectMenu.\n *\n * When the consumer clicks a branch whose subtree isn't fully loaded, the\n * hook records the pending toggle, kicks off loadChildren for every\n * unloaded descendant, and then — once all loads are complete — fires\n * tree.toggleNode so cascade selection can run against the now-complete\n * subtree. While loads are in flight, pendingToggleNodeId points at the\n * originally-clicked node so the consumer can render a loading state on\n * its checkbox.\n *\n * Non-selectable branches expand instead of toggling; non-selectable\n * leaves no-op. Read-only consumers can pass readOnly to short-circuit.\n *\n * @param options - See {@link UseTreeLazyCascadeOptions}.\n * @returns Toggle handler, current pending node id, and a reset function.\n */\nexport function useTreeLazyCascade(\n options: UseTreeLazyCascadeOptions,\n): UseTreeLazyCascadeReturn {\n const {\n tree,\n loader,\n isSingleSelect,\n branchesSelectable,\n leavesSelectable,\n emptyBranchesSelectable,\n readOnly = false,\n onCloseAfterSingleSelect,\n } = options;\n\n const pendingToggleRef = useRef<string | number | null>(null);\n const loadedForToggleRef = useRef(new Set<string | number>());\n const [pendingToggleNodeId, setPendingToggleNodeId] = useState<\n string | number | null\n >(null);\n\n useEffect(() => {\n if (pendingToggleRef.current === null) return;\n const nodeId = pendingToggleRef.current;\n const node = findNode(tree.nodes, nodeId);\n if (!node) return;\n\n // Still waiting for the root node's children\n if (node.children === null) return;\n\n // Still waiting for in-progress loads to complete\n if (loader.isLoadingChildren.size > 0) return;\n\n // Find unloaded descendants we haven't already requested\n const unloaded = findUnloadedDescendants(node).filter(\n (n) => !loadedForToggleRef.current.has(n.id),\n );\n if (unloaded.length > 0) {\n for (const n of unloaded) {\n loadedForToggleRef.current.add(n.id);\n void loader.loadChildren(n);\n }\n return;\n }\n\n // All descendants loaded — fire the toggle\n pendingToggleRef.current = null;\n loadedForToggleRef.current = new Set();\n setPendingToggleNodeId(null);\n tree.toggleNode(nodeId);\n if (isSingleSelect) {\n onCloseAfterSingleSelect?.();\n }\n }, [tree, isSingleSelect, onCloseAfterSingleSelect, loader]);\n\n const handleToggleNode = useCallback(\n (nodeId: string | number) => {\n if (readOnly) return;\n\n const node = findNode(tree.nodes, nodeId);\n if (!node) return;\n\n const isBranch = node.children !== undefined;\n const isEmptyBranch =\n isBranch && Array.isArray(node.children) && node.children.length === 0;\n const isNodeSelectable = isBranch\n ? branchesSelectable && (isEmptyBranch ? emptyBranchesSelectable : true)\n : leavesSelectable;\n\n if (!isNodeSelectable) {\n // Non-selectable branches expand instead; non-selectable leaves no-op\n if (isBranch) {\n tree.toggleExpand(nodeId);\n if (node.children === null) {\n void loader.loadChildren(node);\n }\n }\n return;\n }\n\n if (hasUnloadedDescendants(node)) {\n pendingToggleRef.current = nodeId;\n loadedForToggleRef.current = new Set();\n setPendingToggleNodeId(nodeId);\n if (node.children === null) {\n loadedForToggleRef.current.add(node.id);\n void loader.loadChildren(node);\n } else {\n const unloaded = findUnloadedDescendants(node);\n for (const n of unloaded) {\n loadedForToggleRef.current.add(n.id);\n void loader.loadChildren(n);\n }\n }\n return;\n }\n\n tree.toggleNode(nodeId);\n if (isSingleSelect) {\n onCloseAfterSingleSelect?.();\n }\n },\n [\n tree,\n isSingleSelect,\n onCloseAfterSingleSelect,\n loader,\n readOnly,\n branchesSelectable,\n leavesSelectable,\n emptyBranchesSelectable,\n ],\n );\n\n const reset = useCallback(() => {\n pendingToggleRef.current = null;\n loadedForToggleRef.current = new Set();\n setPendingToggleNodeId(null);\n }, []);\n\n return { handleToggleNode, pendingToggleNodeId, reset };\n}\n","import { matchSorter, MatchSorterOptions } from \"match-sorter\";\nimport type { TreeSelectFieldNode } from \"../types\";\n\n/**\n * Filter function for narrowing tree options against a search value.\n * Receives the full options tree and returns the (possibly pruned) tree to display.\n */\nexport type TreeSyncFilterFn = (\n options: TreeSelectFieldNode[],\n searchValue: string,\n) => TreeSelectFieldNode[];\n\n/**\n * Recursively populates `childCount` (number of immediate children) on every\n * loaded branch that doesn't already declare one, returning a new tree.\n *\n * This is computed from the full static `options` *before* any search filter\n * runs, so the count reflects the real child set rather than the filtered\n * subset. `computeCheckStates` relies on `childCount` to detect that a branch\n * is only partially represented (e.g. during search) and avoid showing a\n * partially-selected branch as fully checked.\n *\n * @param nodes - The tree nodes to process.\n * @returns A new array of nodes with childCount set on branch nodes.\n */\nexport function applyChildCounts(\n nodes: TreeSelectFieldNode[],\n): TreeSelectFieldNode[] {\n return nodes.map((node) => {\n if (!Array.isArray(node.children)) return node;\n\n const children = applyChildCounts(node.children);\n\n return {\n ...node,\n children,\n childCount: node.childCount ?? children.length,\n };\n });\n}\n\n/**\n * Recursively flattens all nodes in a tree for flat matching.\n */\nfunction flattenNodes(nodes: TreeSelectFieldNode[]): TreeSelectFieldNode[] {\n return nodes.flatMap((node) => [\n node,\n ...(node.children ? flattenNodes(node.children) : []),\n ]);\n}\n\n/**\n * Returns a filtered subtree, keeping any node whose subtree contains a match.\n */\nfunction pruneTree(\n nodes: TreeSelectFieldNode[],\n matchedIds: Set<string | number>,\n): TreeSelectFieldNode[] {\n const result: TreeSelectFieldNode[] = [];\n for (const node of nodes) {\n if (matchedIds.has(node.id)) {\n result.push(node);\n } else if (node.children && node.children.length > 0) {\n const filteredChildren = pruneTree(node.children, matchedIds);\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n }\n return result;\n}\n\n/**\n * Default tree-aware filter. Matches on label and searchText, preserving\n * ancestors of matched nodes.\n */\nexport function defaultTreeSyncFilter(\n nodes: TreeSelectFieldNode[],\n searchValue: string,\n): TreeSelectFieldNode[] {\n if (!searchValue) return nodes;\n\n const flat = flattenNodes(nodes);\n const matched = matchSorter(flat, searchValue, {\n keys: [\"label\", \"searchText\"],\n });\n const matchedIds = new Set(matched.map((n) => n.id));\n\n return pruneTree(nodes, matchedIds);\n}\n\n/**\n * Coerces a `TreeSyncFilterFn` or `MatchSorterOptions` into a\n * `TreeSyncFilterFn`. When given options, the resulting filter flattens the\n * tree, runs match-sorter, and prunes the original tree to keep ancestors of\n * matched nodes.\n */\nexport function toTreeSyncFilterFn(\n filter: TreeSyncFilterFn | MatchSorterOptions<TreeSelectFieldNode>,\n): TreeSyncFilterFn {\n if (typeof filter === \"function\") return filter;\n\n return (nodes: TreeSelectFieldNode[], searchValue: string) => {\n if (!searchValue) return nodes;\n const flat = flattenNodes(nodes);\n const matched = matchSorter(flat, searchValue, filter);\n const matchedIds = new Set(matched.map((n) => n.id));\n return pruneTree(nodes, matchedIds);\n };\n}\n"],"names":["state","styles","KeyboardArrowDown","KeyboardArrowRight","TreeContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"treeSync-CASYkjhr.js","sources":["../src/beta/components/TreeSelectField/internal/useTreeLoader.ts","../src/beta/components/TreeSelectField/internal/useTreeCascade.ts","../src/beta/components/TreeSelectField/internal/useTreeKeyboard.ts","../src/beta/components/TreeSelectField/internal/useTree.ts","../src/beta/components/TreeSelectField/internal/TreeRow.tsx","../src/beta/components/TreeSelectField/internal/TreePanel.tsx","../src/beta/components/TreeSelectField/internal/VirtualizedTreePanel.tsx","../src/beta/components/TreeSelectField/internal/TreeContent.tsx","../src/beta/components/TreeSelectField/internal/treeUtils.ts","../src/beta/components/TreeSelectField/internal/useTreeLazyCascade.ts","../src/beta/components/TreeSelectField/internal/treeSync.ts"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { TreeSelectFieldNode } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Options for the useTreeLoader hook.\n * @property loadOptions - Async function to load tree nodes. Called with searchValue and optional parentNode.\n * @property cache - Cache configuration. Enabled by default with maxSize of 15.\n * @property initialLoad - Controls when the initial load occurs. \"auto\" and \"immediate\" load on mount, \"open\" loads on first onOpen() call.\n * @property debounceMs - Debounce delay in milliseconds for search calls. Defaults to 200.\n */\nexport type UseTreeLoaderOptions = {\n loadOptions: (\n searchValue: string,\n parentNode?: TreeSelectFieldNode,\n ) => TreeSelectFieldNode[] | Promise<TreeSelectFieldNode[]>;\n cache?: { enabled?: boolean; maxSize?: number };\n initialLoad?: \"auto\" | \"immediate\" | \"open\";\n debounceMs?: number;\n};\n\n/**\n * Return value from the useTreeLoader hook.\n * @property nodes - The currently loaded tree nodes.\n * @property ancestry - Durable childId → parentId map accumulated from lazy\n * children loads; survives tree resets so off-screen selections can be\n * attributed to their ancestors.\n * @property isLoading - Whether a root/search load is in progress.\n * @property isLoadingChildren - Set of node IDs whose children are currently loading.\n * @property loadChildren - Loads children for the given branch node (lazy expansion).\n * @property search - Triggers a search load with the given search value (debounced).\n * @property clearCache - Clears both the search and children caches.\n * @property invalidate - Clears both caches and triggers a fresh load.\n * @property onOpen - Triggers the initial load when initialLoad=\"open\". No-op otherwise or after first open.\n */\nexport type UseTreeLoaderReturn = {\n nodes: TreeSelectFieldNode[];\n ancestry: Map<string | number, string | number>;\n isLoading: boolean;\n isLoadingChildren: Set<string | number>;\n loadChildren: (\n parentNode: TreeSelectFieldNode,\n ) => Promise<TreeSelectFieldNode[]>;\n search: (searchValue: string) => void;\n clearCache: () => void;\n invalidate: () => void;\n onOpen: () => void;\n};\n\n// ---------------------------------------------------------------------------\n// LRU Map helper\n// ---------------------------------------------------------------------------\n\n/**\n * Simple LRU cache backed by a Map.\n * @param maxSize - Maximum number of entries to keep. When exceeded, the oldest entry is evicted.\n * @returns An object with get, set, delete, and clear methods.\n */\nfunction createLruCache<K, V>(maxSize: number) {\n const map = new Map<K, V>();\n\n return {\n get(key: K): V | undefined {\n if (!map.has(key)) return undefined;\n // Refresh LRU order by re-inserting\n const value = map.get(key)!;\n map.delete(key);\n map.set(key, value);\n return value;\n },\n set(key: K, value: V): void {\n if (map.has(key)) {\n map.delete(key);\n } else if (map.size >= maxSize) {\n // Delete the oldest (first) entry\n const firstKey = map.keys().next().value;\n if (firstKey !== undefined) map.delete(firstKey);\n }\n map.set(key, value);\n },\n has(key: K): boolean {\n return map.has(key);\n },\n delete(key: K): void {\n map.delete(key);\n },\n clear(): void {\n map.clear();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tree merge helper\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively merges loaded children into the node tree.\n * Replaces `children: null` on the matching node with the provided children array.\n * @param nodes - The current node tree.\n * @param parentId - The ID of the parent node whose children should be updated.\n * @param children - The loaded children to merge in.\n * @returns A new array with the updated subtree.\n */\nfunction mergeChildren(\n nodes: TreeSelectFieldNode[],\n parentId: string | number,\n children: TreeSelectFieldNode[],\n): TreeSelectFieldNode[] {\n return nodes.map((node) => {\n if (node.id === parentId) {\n return { ...node, children };\n }\n if (node.children && node.children.length > 0) {\n return {\n ...node,\n children: mergeChildren(node.children, parentId, children),\n };\n }\n return node;\n });\n}\n\n// ---------------------------------------------------------------------------\n// useTreeLoader\n// ---------------------------------------------------------------------------\n\n/**\n * Hook that manages async loading and caching for tree data.\n *\n * Features:\n * - Handles root/search loading and lazy branch expansion via a single loadOptions callback\n * - Two separate LRU caches: one for search results, one for lazy-loaded children\n * - Configurable cache size and opt-out support\n * - Debounced search to reduce unnecessary loadOptions calls\n * - initialLoad modes: \"immediate\"/\"auto\" load on mount, \"open\" defers until onOpen() is called\n * - Children are merged into the node tree after loading, updating children: null to the loaded array\n * - invalidate() clears caches and triggers a fresh load of the current view\n *\n * @param options - Configuration options for the tree loader.\n * @returns Current nodes, loading states, and loader control functions.\n */\nexport function useTreeLoader(\n options: UseTreeLoaderOptions,\n): UseTreeLoaderReturn {\n const {\n loadOptions,\n cache: cacheConfig,\n initialLoad = \"auto\",\n debounceMs = 200,\n } = options;\n\n const cacheEnabled = cacheConfig?.enabled !== false;\n const cacheMaxSize = cacheConfig?.maxSize ?? 15;\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const [nodes, setNodes] = useState<TreeSelectFieldNode[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingChildren, setIsLoadingChildren] = useState<\n Set<string | number>\n >(new Set());\n\n // Durable childId → parentId map accumulated from every lazy-children load.\n // Outlives tree resets (search) and collapse, so a selected descendant under\n // a now-unloaded branch can still be attributed to its ancestors. Kept in\n // state (not just a ref) so check-state recomputes when ancestry grows.\n const [ancestry, setAncestry] = useState<\n Map<string | number, string | number>\n >(() => new Map());\n\n const recordAncestry = useCallback(\n (parentId: string | number, children: TreeSelectFieldNode[]) => {\n setAncestry((prev) => {\n let changed = false;\n const next = new Map(prev);\n for (const child of children) {\n if (next.get(child.id) !== parentId) {\n next.set(child.id, parentId);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n },\n [],\n );\n\n // Track whether the initial root load has been performed (for \"open\" mode)\n const hasOpenedRef = useRef(false);\n\n // Track the current search term so invalidate() can reload the right data\n const currentSearchRef = useRef<string>(\"\");\n\n // ---------------------------------------------------------------------------\n // Caches (stable refs — do not re-create on render)\n // ---------------------------------------------------------------------------\n\n const searchCacheRef = useRef(\n createLruCache<string, TreeSelectFieldNode[]>(cacheMaxSize),\n );\n const childrenCacheRef = useRef(\n createLruCache<string | number, TreeSelectFieldNode[]>(cacheMaxSize),\n );\n\n // Keep a stable ref to loadOptions so callbacks don't go stale\n const loadOptionsRef = useRef(loadOptions);\n loadOptionsRef.current = loadOptions;\n\n // ---------------------------------------------------------------------------\n // Core load function (root / search)\n // ---------------------------------------------------------------------------\n\n // Monotonically-incrementing token used to discard stale async results when\n // a newer load has been issued (e.g. user kept typing and a slow earlier\n // request resolves after a faster later one).\n const loadRootSeqRef = useRef(0);\n\n const loadRoot = useCallback(\n async (searchValue: string, bypassCache = false) => {\n currentSearchRef.current = searchValue;\n hasOpenedRef.current = true;\n const seq = ++loadRootSeqRef.current;\n\n const cached =\n !bypassCache && cacheEnabled\n ? searchCacheRef.current.get(searchValue)\n : undefined;\n if (cached !== undefined) {\n setNodes(cached);\n return;\n }\n\n setIsLoading(true);\n try {\n const result = await loadOptionsRef.current(searchValue, undefined);\n // Discard if a newer load has started — its results are authoritative.\n if (seq !== loadRootSeqRef.current) return;\n // When bypassing cache (invalidate), don't repopulate — leave cache\n // empty for next caller.\n if (!bypassCache && cacheEnabled) {\n searchCacheRef.current.set(searchValue, result);\n }\n setNodes(result);\n } finally {\n if (seq === loadRootSeqRef.current) {\n setIsLoading(false);\n }\n }\n },\n [cacheEnabled],\n );\n\n // ---------------------------------------------------------------------------\n // Debounced search\n // ---------------------------------------------------------------------------\n\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const search = useCallback(\n (searchValue: string) => {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n if (debounceMs === 0) {\n void loadRoot(searchValue);\n } else {\n debounceTimerRef.current = setTimeout(() => {\n void loadRoot(searchValue);\n }, debounceMs);\n }\n },\n [loadRoot, debounceMs],\n );\n\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n // ---------------------------------------------------------------------------\n // Load children (lazy expansion)\n // ---------------------------------------------------------------------------\n\n const loadChildren = useCallback(\n async (parentNode: TreeSelectFieldNode): Promise<TreeSelectFieldNode[]> => {\n const parentId = parentNode.id;\n\n if (cacheEnabled) {\n const cached = childrenCacheRef.current.get(parentId);\n if (cached !== undefined) {\n // Merge into tree even if coming from cache (tree may have been reset)\n setNodes((prev) => mergeChildren(prev, parentId, cached));\n recordAncestry(parentId, cached);\n return cached;\n }\n }\n\n setIsLoadingChildren((prev) => {\n const next = new Set(prev);\n next.add(parentId);\n return next;\n });\n\n try {\n const result = await loadOptionsRef.current(\"\", parentNode);\n if (cacheEnabled) {\n childrenCacheRef.current.set(parentId, result);\n }\n setNodes((prev) => mergeChildren(prev, parentId, result));\n recordAncestry(parentId, result);\n return result;\n } finally {\n setIsLoadingChildren((prev) => {\n const next = new Set(prev);\n next.delete(parentId);\n return next;\n });\n }\n },\n [cacheEnabled, recordAncestry],\n );\n\n // ---------------------------------------------------------------------------\n // Cache management\n // ---------------------------------------------------------------------------\n\n const clearCache = useCallback(() => {\n searchCacheRef.current.clear();\n childrenCacheRef.current.clear();\n setAncestry((prev) => (prev.size === 0 ? prev : new Map()));\n }, []);\n\n const invalidate = useCallback(() => {\n searchCacheRef.current.clear();\n childrenCacheRef.current.clear();\n setAncestry((prev) => (prev.size === 0 ? prev : new Map()));\n void loadRoot(currentSearchRef.current, true);\n }, [loadRoot]);\n\n // ---------------------------------------------------------------------------\n // onOpen (for initialLoad=\"open\")\n // ---------------------------------------------------------------------------\n\n const onOpen = useCallback(() => {\n if (hasOpenedRef.current) return;\n hasOpenedRef.current = true;\n void loadRoot(\"\");\n }, [loadRoot]);\n\n // ---------------------------------------------------------------------------\n // Initial load effect\n // ---------------------------------------------------------------------------\n\n useEffect(() => {\n if (initialLoad === \"immediate\" || initialLoad === \"auto\") {\n void loadRoot(\"\");\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ---------------------------------------------------------------------------\n // Return\n // ---------------------------------------------------------------------------\n\n return {\n nodes,\n ancestry,\n isLoading,\n isLoadingChildren,\n loadChildren,\n search,\n clearCache,\n invalidate,\n onOpen,\n };\n}\n","import type {\n TreeSelectFieldNode,\n TreeSelectFieldValue,\n TreeSelectFieldValueConsistsOf,\n} from \"../types\";\nimport type { CheckState } from \"../../../../types\";\n\nexport type { CheckState };\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Flatten the tree into a lookup map keyed by node id.\n * @param nodes - The tree nodes to flatten.\n * @returns A Map from node id to TreeSelectFieldNode.\n */\nfunction buildNodeMap(\n nodes: TreeSelectFieldNode[],\n): Map<string | number, TreeSelectFieldNode> {\n const map = new Map<string | number, TreeSelectFieldNode>();\n const visit = (list: TreeSelectFieldNode[]) => {\n for (const node of list) {\n map.set(node.id, node);\n if (node.children) visit(node.children);\n }\n };\n visit(nodes);\n return map;\n}\n\n/**\n * Build a childId → parentId map from the loaded tree, for resolving a node's\n * ancestor `path` at selection time.\n */\nfunction buildParentMap(\n nodes: TreeSelectFieldNode[],\n): Map<string | number, string | number> {\n const parents = new Map<string | number, string | number>();\n const visit = (list: TreeSelectFieldNode[], parentId?: string | number) => {\n for (const node of list) {\n if (parentId !== undefined) parents.set(node.id, parentId);\n if (node.children) visit(node.children, node.id);\n }\n };\n visit(nodes);\n return parents;\n}\n\n/**\n * Resolve a node's ancestor path (root→parent) from a parent map. Returns\n * undefined when the node is a root (no ancestors) so callers can omit `path`.\n */\nfunction resolvePath(\n nodeId: string | number,\n parents: Map<string | number, string | number>,\n): (string | number)[] | undefined {\n const path: (string | number)[] = [];\n let current = parents.get(nodeId);\n const seen = new Set<string | number>();\n while (current !== undefined && !seen.has(current)) {\n seen.add(current);\n path.unshift(current);\n current = parents.get(current);\n }\n return path.length > 0 ? path : undefined;\n}\n\n/**\n * Returns true if the node is a branch (has a defined children array, even if\n * empty or null — null means unloaded lazy branch).\n * @param node - The node to check.\n * @returns Whether the node is a branch.\n */\nfunction isBranch(node: TreeSelectFieldNode): boolean {\n return node.children !== undefined;\n}\n\n/**\n * Expand branch IDs to include all non-disabled descendant IDs. When the\n * value array uses BRANCH_PRIORITY or ALL, it may contain branch IDs whose\n * children are not explicitly listed. This function ensures every descendant\n * leaf is present so that the bottom-up aggregation in computeCheckStates\n * produces the correct visual states.\n */\nfunction expandBranchIds(\n ids: Set<string | number>,\n nodes: TreeSelectFieldNode[],\n): Set<string | number> {\n const nodeMap = buildNodeMap(nodes);\n const expanded = new Set(ids);\n\n const addDescendants = (node: TreeSelectFieldNode): void => {\n if (node.disabled) return;\n expanded.add(node.id);\n if (node.children) {\n for (const child of node.children) {\n addDescendants(child);\n }\n }\n };\n\n for (const id of ids) {\n const node = nodeMap.get(id);\n if (node && isBranch(node)) {\n addDescendants(node);\n }\n }\n\n return expanded;\n}\n\n// ---------------------------------------------------------------------------\n// computeCheckStates\n// ---------------------------------------------------------------------------\n\n/**\n * Computes the visual check state for every node in the tree.\n *\n * In \"linked\" mode parents reflect the aggregate state of their children:\n * - checked — all non-disabled children are checked\n * - indeterminate — some but not all non-disabled children are checked\n * - unchecked — no children are checked\n *\n * In \"independent\" / \"single\" mode (and for BRANCH_ONLY) each node is checked\n * only when its id appears in the value array; no cascade is applied. A node's\n * own selection lives in `value` regardless of what is loaded, so these modes\n * are unaffected by lazy/filtered loading.\n *\n * ## Under-represented branches (lazy / filtered)\n *\n * In linked mode a branch's aggregate state is derived from its children. But\n * the tree passed in is only ever what is currently *loaded* — during search it\n * is the filtered subset, and lazy branches (`children === null`) or partially\n * loaded branches don't expose their full child set. A branch is\n * \"under-represented\" when its loaded children are known to be fewer than its\n * real children (`children === null`, or `loadedCount < childCount`). For these\n * we infer rather than aggregate:\n * - the branch's own id is checked → `checked`\n * - any *loaded* descendant is checked/indeterminate → `indeterminate`\n * (it can't be fully checked because unknown children exist)\n * - otherwise, if the branch is a known ancestor of an \"orphan\" selection (a\n * checked id that isn't in the currently-loaded tree — e.g. a descendant of a\n * collapsed lazy branch), via `orphanAncestorIds` → `indeterminate`\n * - otherwise → `unchecked`\n *\n * Orphan attribution is *path-scoped*: only branches on the resolved ancestor\n * path of an orphaned selection are marked, so unrelated collapsed siblings stay\n * `unchecked`. The caller resolves those ancestors (from a value's `path` or the\n * loader's ancestry map) and passes them in `orphanAncestorIds`. An orphan whose\n * ancestry is unknown contributes nothing (its branch shows `unchecked` until\n * its parent loads, then self-corrects).\n *\n * One limitation remains: accurate filtered-branch state requires\n * server-/consumer-provided `childCount` — a partially-loaded branch without a\n * `childCount` falls back to aggregating only its visible children.\n *\n * @param nodes - The currently loaded (possibly filtered) tree.\n * @param value - The current value array.\n * @param selectionMode - \"single\", \"independent\", or \"linked\".\n * @param valueConsistsOf - Strategy used when computing check states.\n * @param orphanAncestorIds - Branch ids that lie on the resolved ancestor path\n * of an orphaned selection. Such under-represented branches render\n * `indeterminate`. Defaults to empty (no orphan inference).\n * @returns A Map from node id to CheckState.\n */\nexport function computeCheckStates(\n nodes: TreeSelectFieldNode[],\n value: TreeSelectFieldValue[],\n selectionMode: \"single\" | \"independent\" | \"linked\",\n valueConsistsOf: TreeSelectFieldValueConsistsOf,\n orphanAncestorIds: Set<string | number> = new Set(),\n): Map<string | number, CheckState> {\n const rawIds = new Set(value.map((v) => v.id));\n\n // When the value strategy stores branch IDs (BRANCH_PRIORITY, ALL), expand\n // them to their non-disabled leaf descendants so the bottom-up aggregation\n // in linked mode produces the correct visual states.\n const checkedIdSet =\n selectionMode === \"linked\" &&\n (valueConsistsOf === \"BRANCH_PRIORITY\" || valueConsistsOf === \"ALL\")\n ? expandBranchIds(rawIds, nodes)\n : rawIds;\n const states = new Map<string | number, CheckState>();\n\n /**\n * Compute the check state for a single node, returning it.\n * In \"linked\" mode, branch state is derived from children.\n */\n const computeNode = (node: TreeSelectFieldNode): CheckState => {\n if (\n selectionMode === \"independent\" ||\n selectionMode === \"single\" ||\n valueConsistsOf === \"BRANCH_ONLY\"\n ) {\n const state: CheckState = checkedIdSet.has(node.id)\n ? \"checked\"\n : \"unchecked\";\n states.set(node.id, state);\n // Still recurse so children get their own states computed\n if (node.children) {\n for (const child of node.children) {\n computeNode(child);\n }\n }\n return state;\n }\n\n // linked mode\n const loadedChildren = Array.isArray(node.children) ? node.children : [];\n\n // A branch is under-represented when its loaded children are known to be\n // fewer than its real children: an unloaded lazy branch (children === null)\n // or a partial/filtered load (loadedCount < childCount).\n const isUnloaded = node.children === null;\n const isPartiallyLoaded =\n node.childCount !== undefined && loadedChildren.length < node.childCount;\n const underRepresented = isUnloaded || isPartiallyLoaded;\n\n if (loadedChildren.length === 0 && !underRepresented) {\n // leaf (children === undefined), or empty branch ([]) that we know is\n // genuinely empty — state from own id.\n const state: CheckState = checkedIdSet.has(node.id)\n ? \"checked\"\n : \"unchecked\";\n states.set(node.id, state);\n return state;\n }\n\n // Compute loaded children's states first (bottom-up).\n const childStates = loadedChildren.map(computeNode);\n const hasAnyChecked = childStates.some(\n (s) => s === \"checked\" || s === \"indeterminate\",\n );\n\n if (underRepresented) {\n // We don't know the full child set, so we can't prove \"checked\" from\n // children alone. Infer from the branch's own selection, known loaded\n // descendants, and any orphaned selection.\n let state: CheckState;\n if (checkedIdSet.has(node.id)) {\n state = \"checked\";\n } else if (hasAnyChecked || orphanAncestorIds.has(node.id)) {\n state = \"indeterminate\";\n } else {\n state = \"unchecked\";\n }\n states.set(node.id, state);\n return state;\n }\n\n // Fully-loaded branch — aggregate child states.\n const enabledChildren = loadedChildren.filter((c) => !c.disabled);\n const enabledChildStates = enabledChildren.map(\n (c) => states.get(c.id) ?? \"unchecked\",\n );\n const disabledChildren = loadedChildren.filter((c) => c.disabled);\n const disabledChildStates = disabledChildren.map(\n (c) => states.get(c.id) ?? \"unchecked\",\n );\n\n const allEnabledChecked =\n enabledChildren.length === 0\n ? // No enabled children — only disabled children matter\n disabledChildStates.every((s) => s === \"checked\")\n : enabledChildStates.every((s) => s === \"checked\");\n\n let state: CheckState;\n if (\n allEnabledChecked &&\n (enabledChildren.length > 0 ||\n disabledChildStates.every((s) => s === \"checked\"))\n ) {\n state = \"checked\";\n } else if (hasAnyChecked) {\n state = \"indeterminate\";\n } else {\n state = \"unchecked\";\n }\n\n states.set(node.id, state);\n return state;\n };\n\n for (const node of nodes) {\n computeNode(node);\n }\n\n return states;\n}\n\n// ---------------------------------------------------------------------------\n// computeValue\n// ---------------------------------------------------------------------------\n\n/**\n * Given a set of checked node IDs and a value strategy, returns the value\n * array according to the strategy.\n *\n * - \"ALL\" — every checked node\n * - \"BRANCH_PRIORITY\" — branch replaces its leaves when all non-disabled\n * children are checked; otherwise individual leaves\n * - \"LEAF_PRIORITY\" — leaves only, unless the node is a branch with an empty\n * or null children list (leaf-less branch)\n * - \"LEAF_ONLY\" — strictly leaves; branches are never included\n *\n * @param nodes - The full tree.\n * @param checkedIds - Set of IDs that are checked.\n * @param valueConsistsOf - Strategy to apply.\n * @returns The value array.\n */\nexport function computeValue(\n nodes: TreeSelectFieldNode[],\n checkedIds: Set<string | number>,\n valueConsistsOf: TreeSelectFieldValueConsistsOf,\n): TreeSelectFieldValue[] {\n const result: TreeSelectFieldValue[] = [];\n const included = new Set<string | number>();\n\n /**\n * Determine whether to include a branch in BRANCH_PRIORITY mode.\n * A branch is included when all its non-disabled children are checked.\n */\n const allNonDisabledChildrenChecked = (\n node: TreeSelectFieldNode,\n ): boolean => {\n if (!node.children || node.children.length === 0) return false;\n const nonDisabled = node.children.filter((c) => !c.disabled);\n if (nonDisabled.length === 0) return false;\n return nonDisabled.every((c) => {\n if (!isBranch(c)) return checkedIds.has(c.id);\n // For nested branches, recurse\n return allNonDisabledChildrenChecked(c) || checkedIds.has(c.id);\n });\n };\n\n // `ancestors` is the chain of branch ids from the root down to (but not\n // including) the node, so we can stamp `path` on emitted values. This lets a\n // persisted-then-restored selection resolve its ancestor check states even\n // when those branches aren't loaded yet.\n const toValue = (\n node: TreeSelectFieldNode,\n ancestors: (string | number)[],\n ): TreeSelectFieldValue => ({\n id: node.id,\n label: node.label,\n extra: node.extra,\n ...(ancestors.length > 0 ? { path: [...ancestors] } : {}),\n });\n\n /**\n * Traverse the tree and populate the result array. `ancestors` carries the\n * branch ids from the root down to the node's parent.\n */\n const visit = (\n node: TreeSelectFieldNode,\n ancestors: (string | number)[],\n ): void => {\n if (!checkedIds.has(node.id) && !isBranch(node)) {\n // unchecked leaf — skip\n return;\n }\n const childAncestors = [...ancestors, node.id];\n\n switch (valueConsistsOf) {\n case \"ALL\": {\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n // Always recurse to children\n if (node.children) {\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n break;\n }\n\n case \"BRANCH_ONLY\": {\n if (isBranch(node)) {\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n if (node.children) {\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n }\n break;\n }\n\n case \"LEAF_ONLY\": {\n if (!isBranch(node)) {\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n } else {\n if (node.children) {\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n }\n break;\n }\n\n case \"LEAF_PRIORITY\": {\n if (!isBranch(node)) {\n // Leaf — include only if checked\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n } else if (!node.children || node.children.length === 0) {\n // Empty or null branch — treat as leaf-less branch, include if checked\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n } else {\n // Normal branch — recurse, never include the branch itself\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n break;\n }\n\n case \"BRANCH_PRIORITY\": {\n if (!isBranch(node)) {\n // Leaf — include only if checked\n if (checkedIds.has(node.id) && !included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n }\n } else {\n // Branch — include the branch if all non-disabled children are checked\n if (allNonDisabledChildrenChecked(node)) {\n if (!included.has(node.id)) {\n included.add(node.id);\n result.push(toValue(node, ancestors));\n // Mark all descendants as included so they don't double-add\n if (node.children) {\n for (const child of node.children) {\n markDescendantsIncluded(child);\n }\n }\n }\n } else {\n // Not all children checked — recurse\n if (node.children) {\n for (const child of node.children) {\n visit(child, childAncestors);\n }\n }\n }\n }\n break;\n }\n }\n };\n\n /**\n * Mark all descendants as included (so BRANCH_PRIORITY doesn't double-add\n * children when an ancestor branch was already added).\n */\n const markDescendantsIncluded = (node: TreeSelectFieldNode): void => {\n included.add(node.id);\n if (node.children) {\n for (const child of node.children) {\n markDescendantsIncluded(child);\n }\n }\n };\n\n for (const node of nodes) {\n visit(node, []);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// toggleNodeSelection\n// ---------------------------------------------------------------------------\n\n/**\n * Toggles a node's selection and returns the new value array.\n *\n * In \"single\" mode:\n * - Replaces the entire selection with the clicked node (or empties if already selected).\n *\n * In \"independent\" mode:\n * - Only the clicked node is toggled; no cascade.\n *\n * In \"linked\" mode:\n * - Selecting a branch selects all non-disabled descendants recursively.\n * - Deselecting a branch deselects all non-disabled descendants recursively.\n * - Disabled nodes are never modified.\n *\n * @param nodes - The full tree.\n * @param currentValue - The current value array.\n * @param nodeId - The id of the node to toggle.\n * @param selectionMode - \"single\", \"independent\", or \"linked\".\n * @param valueConsistsOf - Strategy to apply when computing the returned value.\n * @returns The new value array.\n */\nexport function toggleNodeSelection(\n nodes: TreeSelectFieldNode[],\n currentValue: TreeSelectFieldValue[],\n nodeId: string | number,\n selectionMode: \"single\" | \"independent\" | \"linked\",\n valueConsistsOf: TreeSelectFieldValueConsistsOf,\n): TreeSelectFieldValue[] {\n const nodeMap = buildNodeMap(nodes);\n const targetNode = nodeMap.get(nodeId);\n if (!targetNode) return currentValue;\n\n const currentCheckedIds = new Set(currentValue.map((v) => v.id));\n const isCurrentlySelected = currentCheckedIds.has(nodeId);\n\n const parentMap = buildParentMap(nodes);\n\n if (selectionMode === \"single\") {\n if (isCurrentlySelected) return [];\n const path = resolvePath(targetNode.id, parentMap);\n return [\n {\n id: targetNode.id,\n label: targetNode.label,\n extra: targetNode.extra,\n ...(path ? { path } : {}),\n },\n ];\n }\n\n if (selectionMode === \"independent\") {\n const next = new Set(currentCheckedIds);\n if (isCurrentlySelected) {\n next.delete(nodeId);\n } else {\n next.add(nodeId);\n }\n // Rebuild value preserving label/extra from current value or nodeMap\n return buildValueFromIds(next, currentValue, nodeMap, parentMap);\n }\n\n // Linked mode\n // For linked mode we cannot rely solely on whether the nodeId is in the\n // value array because strategies like LEAF_PRIORITY never store branch ids.\n // Instead, derive the effective check state from computeCheckStates.\n const checkStates = computeCheckStates(\n nodes,\n currentValue,\n selectionMode,\n valueConsistsOf,\n );\n const currentCheckState = checkStates.get(nodeId) ?? \"unchecked\";\n const shouldDeselect =\n currentCheckState === \"checked\" || currentCheckState === \"indeterminate\";\n\n // Expand branch IDs to leaf-level so computeValue sees all implicitly\n // selected descendants (e.g. BRANCH_PRIORITY stores \"design\" but\n // computeValue needs \"ux\" + \"visual\" to correctly aggregate).\n const expandedIds =\n valueConsistsOf === \"BRANCH_PRIORITY\" || valueConsistsOf === \"ALL\"\n ? expandBranchIds(currentCheckedIds, nodes)\n : currentCheckedIds;\n const nextCheckedIds = new Set(expandedIds);\n\n if (shouldDeselect) {\n // Deselect node and all non-disabled descendants\n const idsToDeselect = getNonDisabledDescendantIds(targetNode);\n for (const id of idsToDeselect) {\n nextCheckedIds.delete(id);\n }\n } else {\n // Select node and all non-disabled descendants\n const idsToSelect = getNonDisabledDescendantIds(targetNode);\n for (const id of idsToSelect) {\n nextCheckedIds.add(id);\n }\n }\n\n if (valueConsistsOf !== \"BRANCH_ONLY\") {\n bubbleUpCheckedParents(nodes, nextCheckedIds);\n }\n\n const computed = computeValue(nodes, nextCheckedIds, valueConsistsOf);\n\n // `computeValue` only walks the currently-loaded tree, so during search (or\n // with lazy branches) it can't re-emit a previously-selected node that lives\n // outside the filtered/loaded subset. Carry those forward from currentValue\n // so toggling a visible node doesn't silently drop selections elsewhere.\n // Only entries whose nodes aren't present in `nodes` are eligible — anything\n // loaded was already handled (and possibly rolled up) by computeValue.\n const emittedIds = new Set(computed.map((v) => v.id));\n const carriedForward = currentValue.filter(\n (v) =>\n nextCheckedIds.has(v.id) && !emittedIds.has(v.id) && !nodeMap.has(v.id),\n );\n\n return [...computed, ...carriedForward];\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers for toggleNodeSelection\n// ---------------------------------------------------------------------------\n\n/**\n * Walk the tree bottom-up: if all non-disabled children of a branch are in\n * checkedIds, add the branch too. Repeat upward so fully-checked subtrees\n * bubble their parent all the way to the root.\n */\nfunction bubbleUpCheckedParents(\n nodes: TreeSelectFieldNode[],\n checkedIds: Set<string | number>,\n): void {\n const visit = (list: TreeSelectFieldNode[]): void => {\n for (const node of list) {\n if (node.children && node.children.length > 0) {\n visit(node.children);\n const nonDisabled = node.children.filter((c) => !c.disabled);\n if (\n nonDisabled.length > 0 &&\n nonDisabled.every((c) => checkedIds.has(c.id))\n ) {\n if (!node.disabled) checkedIds.add(node.id);\n } else {\n checkedIds.delete(node.id);\n }\n }\n }\n };\n visit(nodes);\n}\n\n/**\n * Collect IDs of the node and all non-disabled descendants recursively.\n * Disabled nodes themselves are excluded; their children may still be included\n * unless they are also disabled.\n * @param node - Root of the subtree.\n * @returns Array of non-disabled IDs in the subtree.\n */\nfunction getNonDisabledDescendantIds(\n node: TreeSelectFieldNode,\n): (string | number)[] {\n if (node.disabled) return [];\n const result: (string | number)[] = [node.id];\n if (node.children) {\n for (const child of node.children) {\n result.push(...getNonDisabledDescendantIds(child));\n }\n }\n return result;\n}\n\n/**\n * Build a TreeSelectFieldValue array from a set of checked IDs.\n * Tries to preserve label/extra from the existing value array, falling back\n * to the node map.\n * @param checkedIds - The set of checked IDs.\n * @param currentValue - The current value array for label/extra lookup.\n * @param nodeMap - The node map for label/extra fallback.\n * @returns The new value array.\n */\nfunction buildValueFromIds(\n checkedIds: Set<string | number>,\n currentValue: TreeSelectFieldValue[],\n nodeMap: Map<string | number, TreeSelectFieldNode>,\n parentMap: Map<string | number, string | number>,\n): TreeSelectFieldValue[] {\n const existingMap = new Map(currentValue.map((v) => [v.id, v]));\n const result: TreeSelectFieldValue[] = [];\n for (const id of checkedIds) {\n const existing = existingMap.get(id);\n if (existing) {\n result.push(existing);\n } else {\n const node = nodeMap.get(id);\n if (node) {\n const path = resolvePath(node.id, parentMap);\n result.push({\n id: node.id,\n label: node.label,\n extra: node.extra,\n ...(path ? { path } : {}),\n });\n }\n }\n }\n return result;\n}\n","import type { KeyboardEvent } from \"react\";\nimport type { VisibleNode } from \"./types\";\n\n/**\n * Options for the keyboard event handler.\n * @property visibleNodes - The current flat list of visible nodes.\n * @property activeIndex - Index into visibleNodes of the currently focused node, or -1.\n * @property setActiveIndex - Setter for the active index.\n * @property isExpanded - Returns whether a node is expanded.\n * @property toggleExpand - Expands or collapses a branch node.\n * @property toggleNode - Toggles selection for a node.\n */\nexport type UseTreeKeyboardOptions = {\n visibleNodes: VisibleNode[];\n activeIndex: number;\n setActiveIndex: (index: number) => void;\n isExpanded: (id: string | number) => boolean;\n toggleExpand: (id: string | number) => void;\n toggleNode: (id: string | number) => void;\n};\n\n/**\n * Handles keyboard navigation for a tree widget rooted on a combobox input.\n *\n * Focus stays on the input at all times; the tree uses aria-activedescendant\n * to convey the focused node. Returns `true` when the key was handled so the\n * caller can decide whether to let the event propagate (e.g. ArrowLeft/Right\n * falling through to cursor movement inside the input).\n *\n * - ArrowDown: move to next visible node\n * - ArrowUp: move to previous visible node\n * - ArrowRight: expand collapsed branch or move to first child; returns false\n * when there is nothing to do so the cursor can move inside the input\n * - ArrowLeft: collapse expanded branch or move to parent; returns false when\n * there is nothing to do so the cursor can move inside the input\n * - Home: move to first visible node\n * - End: move to last visible node\n * - Enter: toggle selection of focused node\n *\n * @param e - The keyboard event.\n * @param options - The current tree state and callbacks.\n * @returns Whether the key was handled by tree navigation.\n */\nexport function handleTreeKeyDown(\n e: KeyboardEvent,\n options: UseTreeKeyboardOptions,\n): boolean {\n const {\n visibleNodes,\n activeIndex,\n setActiveIndex,\n isExpanded,\n toggleExpand,\n toggleNode,\n } = options;\n\n if (visibleNodes.length === 0) return false;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n if (activeIndex === -1) {\n setActiveIndex(0);\n } else {\n setActiveIndex(Math.min(activeIndex + 1, visibleNodes.length - 1));\n }\n return true;\n }\n\n case \"ArrowUp\": {\n e.preventDefault();\n if (activeIndex === -1) {\n setActiveIndex(visibleNodes.length - 1);\n } else {\n setActiveIndex(Math.max(activeIndex - 1, 0));\n }\n return true;\n }\n\n case \"ArrowRight\": {\n if (activeIndex === -1) return false;\n const rightNode = visibleNodes[activeIndex];\n if (!rightNode.isBranch) return false;\n if (!isExpanded(rightNode.node.id)) {\n e.preventDefault();\n toggleExpand(rightNode.node.id);\n return true;\n }\n // Move to first child (next visible node)\n const nextIndex = activeIndex + 1;\n if (nextIndex < visibleNodes.length) {\n e.preventDefault();\n setActiveIndex(nextIndex);\n return true;\n }\n return false;\n }\n\n case \"ArrowLeft\": {\n if (activeIndex === -1) return false;\n const leftNode = visibleNodes[activeIndex];\n if (leftNode.isBranch && isExpanded(leftNode.node.id)) {\n e.preventDefault();\n toggleExpand(leftNode.node.id);\n return true;\n }\n // Move to parent: find closest ancestor in visible nodes\n const currentDepth = leftNode.depth;\n if (currentDepth === 0) return false;\n for (let i = activeIndex - 1; i >= 0; i--) {\n if (visibleNodes[i].depth < currentDepth) {\n e.preventDefault();\n setActiveIndex(i);\n return true;\n }\n }\n return false;\n }\n\n case \"Home\": {\n e.preventDefault();\n setActiveIndex(0);\n return true;\n }\n\n case \"End\": {\n e.preventDefault();\n setActiveIndex(visibleNodes.length - 1);\n return true;\n }\n\n case \"Enter\": {\n if (activeIndex === -1) return false;\n e.preventDefault();\n const activeNode = visibleNodes[activeIndex];\n toggleNode(activeNode.node.id);\n return true;\n }\n\n default:\n return false;\n }\n}\n","import {\n useState,\n useMemo,\n useCallback,\n useRef,\n useEffect,\n type KeyboardEvent,\n} from \"react\";\nimport type {\n TreeSelectFieldNode,\n TreeSelectFieldValue,\n TreeSelectFieldValueConsistsOf,\n} from \"../types\";\nimport type { VisibleNode } from \"./types\";\nimport {\n computeCheckStates,\n toggleNodeSelection,\n type CheckState,\n} from \"./useTreeCascade\";\nimport { handleTreeKeyDown } from \"./useTreeKeyboard\";\n\nconst EMPTY_PLACEHOLDER_PREFIX = \"\\0__tsf_empty__\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Options for the useTree hook.\n * @property nodes - The full tree data.\n * @property value - Controlled selected values.\n * @property onSelectedOptionsChange - Callback when selection changes.\n * @property selectionMode - \"single\", \"independent\", or \"linked\" (default).\n * @property valueConsistsOf - Controls which nodes are selectable and how the value is shaped.\n * @property defaultExpandLevel - Initial expand depth. 0 = collapsed, Infinity = all.\n * @property expandedIds - Controlled set of expanded node IDs.\n * @property onExpandedIdsChange - Callback when expanded IDs change (controlled mode).\n * @property searchValue - Filter string applied to the tree.\n * @property ancestry - childId → parentId map from the loader, used to attribute\n * off-screen (\"orphan\") selections to their ancestor branches.\n * @property loadingChildrenIds - Set of node IDs whose children are currently being fetched.\n */\nexport type UseTreeOptions = {\n nodes: TreeSelectFieldNode[];\n value: TreeSelectFieldValue[];\n onSelectedOptionsChange: (nodes: TreeSelectFieldValue[]) => void;\n selectionMode?: \"single\" | \"independent\" | \"linked\";\n valueConsistsOf?: TreeSelectFieldValueConsistsOf;\n defaultExpandLevel?: number;\n expandedIds?: Set<string | number>;\n onExpandedIdsChange?: (ids: Set<string | number>) => void;\n searchValue?: string;\n ancestry?: Map<string | number, string | number>;\n loadingChildrenIds?: Set<string | number>;\n};\n\n/**\n * ARIA props returned per tree item.\n */\nexport type TreeItemProps = {\n id: string;\n role: \"treeitem\";\n \"aria-level\": number;\n \"aria-setsize\": number;\n \"aria-posinset\": number;\n \"aria-expanded\"?: boolean;\n \"aria-selected\": boolean;\n};\n\n/**\n * ARIA props for the tree container.\n */\nexport type TreeContainerProps = {\n role: \"tree\";\n \"aria-activedescendant\": string | undefined;\n \"aria-multiselectable\": boolean;\n};\n\n/**\n * Return value from the useTree hook.\n * @property visibleNodes - Flat list of currently visible nodes.\n * @property getCheckState - Returns the visual check state for a node ID.\n * @property toggleNode - Toggles selection for the given node ID.\n * @property isExpanded - Returns whether the given node ID is expanded.\n * @property toggleExpand - Expands or collapses the given branch node ID.\n * @property expandAll - Expands all branch nodes.\n * @property collapseAll - Collapses all branch nodes.\n * @property activeDescendantId - The id attribute of the focused treeitem, for aria-activedescendant.\n * @property onKeyDown - Keyboard event handler for the tree container.\n * @property getTreeItemProps - Returns ARIA props for a given node ID.\n * @property treeProps - ARIA props for the tree container element.\n */\nexport type UseTreeReturn = {\n nodes: TreeSelectFieldNode[];\n visibleNodes: VisibleNode[];\n getCheckState: (id: string | number) => CheckState;\n toggleNode: (id: string | number) => void;\n isExpanded: (id: string | number) => boolean;\n toggleExpand: (id: string | number) => void;\n expandAll: () => void;\n collapseAll: () => void;\n activeDescendantId: string | undefined;\n setActiveNodeId: (id: string | number) => void;\n onKeyDown: (e: KeyboardEvent) => void;\n getTreeItemProps: (id: string | number) => TreeItemProps;\n treeProps: TreeContainerProps;\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Collects the IDs of all branch nodes (nodes with a defined children property) recursively.\n * @param nodes - The tree nodes to traverse.\n * @returns Array of branch node IDs.\n */\nfunction collectAllBranchIds(\n nodes: TreeSelectFieldNode[],\n): (string | number)[] {\n const result: (string | number)[] = [];\n const visit = (list: TreeSelectFieldNode[]) => {\n for (const node of list) {\n if (node.children !== undefined) {\n result.push(node.id);\n if (node.children) visit(node.children);\n }\n }\n };\n visit(nodes);\n return result;\n}\n\n/**\n * Builds the initial expanded ID set based on defaultExpandLevel.\n * @param nodes - The full tree.\n * @param defaultExpandLevel - How many levels deep to expand initially.\n * @returns A Set of initially expanded node IDs.\n */\nfunction buildDefaultExpanded(\n nodes: TreeSelectFieldNode[],\n defaultExpandLevel: number,\n): Set<string | number> {\n const result = new Set<string | number>();\n const visit = (list: TreeSelectFieldNode[], depth: number) => {\n if (depth >= defaultExpandLevel) return;\n for (const node of list) {\n if (node.children !== undefined) {\n result.add(node.id);\n if (node.children) visit(node.children, depth + 1);\n }\n }\n };\n visit(nodes, 0);\n return result;\n}\n\n/** Returns true if the node is a branch (has a defined children property). */\nfunction isBranchNode(node: TreeSelectFieldNode): boolean {\n return node.children !== undefined;\n}\n\n/**\n * Checks whether a node or any of its descendants match the search string.\n * @param node - The node to check.\n * @param search - Lower-cased search string.\n * @returns Whether the node or a descendant matches.\n */\nfunction nodeMatchesSearch(node: TreeSelectFieldNode, search: string): boolean {\n const labelMatch = node.label.toLowerCase().includes(search);\n const searchTextMatch = node.searchText\n ? node.searchText.toLowerCase().includes(search)\n : false;\n if (labelMatch || searchTextMatch) return true;\n if (node.children) {\n return node.children.some((child) => nodeMatchesSearch(child, search));\n }\n return false;\n}\n\n/**\n * Flattens the tree into visible nodes respecting expand state, with optional search filtering.\n * When searching (non-flat), auto-expands all branches that contain matches.\n * @param nodes - The tree to flatten.\n * @param expandedIds - Currently expanded node IDs.\n * @param search - Lower-cased search string, or undefined.\n * @param depth - Current depth (used recursively).\n * @returns Flat array of VisibleNode.\n */\nfunction flattenTree(\n nodes: TreeSelectFieldNode[],\n expandedIds: Set<string | number>,\n search: string | undefined,\n depth: number,\n): VisibleNode[] {\n const result: VisibleNode[] = [];\n\n for (const node of nodes) {\n const isBranch = isBranchNode(node);\n\n // If searching, filter: include the node only if it or a descendant matches\n if (search !== undefined) {\n if (!nodeMatchesSearch(node, search)) continue;\n }\n\n const expanded = isBranch\n ? search !== undefined\n ? // During search, auto-expand branches that have matching descendants\n nodeMatchesSearch(node, search)\n : expandedIds.has(node.id)\n : false;\n\n result.push({\n node,\n depth,\n isExpanded: expanded,\n isBranch,\n isLoading: false,\n });\n\n if (isBranch && expanded) {\n if (node.children && node.children.length > 0) {\n result.push(\n ...flattenTree(node.children, expandedIds, search, depth + 1),\n );\n } else if (node.children && node.children.length === 0) {\n result.push({\n node: {\n id: `${EMPTY_PLACEHOLDER_PREFIX}${node.id}`,\n label: \"No items\",\n },\n depth: depth + 1,\n isExpanded: false,\n isBranch: false,\n isLoading: false,\n isEmptyPlaceholder: true,\n });\n }\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// useTree\n// ---------------------------------------------------------------------------\n\n/**\n * Core tree state hook that manages expansion, selection, keyboard navigation,\n * search filtering, and ARIA attributes for a tree widget.\n *\n * Features:\n * - Uncontrolled expansion state by default; fully controlled via expandedIds/onExpandedIdsChange\n * - defaultExpandLevel for initial expansion depth\n * - expandAll / collapseAll helpers\n * - Delegates selection logic to computeCheckStates and toggleNodeSelection from useTreeCascade\n * - valueConsistsOf determines which nodes are selectable\n * - Search filtering that preserves tree structure\n * - Full keyboard navigation (WAI-ARIA tree pattern)\n * - ARIA attribute generation for tree container and tree items\n *\n * @param options - Configuration options for the tree state.\n * @returns Tree state and handlers.\n */\nexport function useTree(options: UseTreeOptions): UseTreeReturn {\n const {\n nodes,\n value,\n onSelectedOptionsChange,\n selectionMode = \"linked\",\n valueConsistsOf = \"LEAF_PRIORITY\",\n defaultExpandLevel = 0,\n expandedIds: controlledExpandedIds,\n onExpandedIdsChange,\n searchValue,\n ancestry,\n loadingChildrenIds,\n } = options;\n\n const isControlled = controlledExpandedIds !== undefined;\n\n // Uncontrolled expanded state — initialized from defaultExpandLevel\n const [uncontrolledExpandedIds, setUncontrolledExpandedIds] = useState<\n Set<string | number>\n >(() => buildDefaultExpanded(nodes, defaultExpandLevel));\n\n // Re-apply defaultExpandLevel when nodes arrive for the first time\n // (loader starts with [] then resolves with data).\n const appliedDefaultExpandRef = useRef(nodes.length > 0);\n useEffect(() => {\n if (!appliedDefaultExpandRef.current && nodes.length > 0 && !isControlled) {\n appliedDefaultExpandRef.current = true;\n setUncontrolledExpandedIds(\n buildDefaultExpanded(nodes, defaultExpandLevel),\n );\n }\n }, [nodes, defaultExpandLevel, isControlled]);\n\n // Active keyboard index (-1 = no focus)\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n\n // The effective expanded IDs (controlled or uncontrolled)\n const expandedIds = isControlled\n ? controlledExpandedIds\n : uncontrolledExpandedIds;\n\n // ---------------------------------------------------------------------------\n // Expand / collapse\n // ---------------------------------------------------------------------------\n\n const isExpanded = useCallback(\n (id: string | number): boolean => expandedIds.has(id),\n [expandedIds],\n );\n\n const setExpandedIds = useCallback(\n (next: Set<string | number>) => {\n if (isControlled) {\n onExpandedIdsChange?.(next);\n } else {\n setUncontrolledExpandedIds(next);\n }\n },\n [isControlled, onExpandedIdsChange],\n );\n\n const toggleExpand = useCallback(\n (id: string | number) => {\n const next = new Set(expandedIds);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n setExpandedIds(next);\n },\n [expandedIds, setExpandedIds],\n );\n\n const expandAll = useCallback(() => {\n const allBranchIds = collectAllBranchIds(nodes);\n setExpandedIds(new Set(allBranchIds));\n }, [nodes, setExpandedIds]);\n\n const collapseAll = useCallback(() => {\n setExpandedIds(new Set());\n }, [setExpandedIds]);\n\n // ---------------------------------------------------------------------------\n // Visible nodes\n // ---------------------------------------------------------------------------\n\n const normalizedSearch = searchValue?.trim().toLowerCase() || undefined;\n\n const visibleNodes = useMemo<VisibleNode[]>(() => {\n const flat = flattenTree(nodes, expandedIds, normalizedSearch, 0);\n\n if (!loadingChildrenIds || loadingChildrenIds.size === 0) return flat;\n\n return flat.map((vn) =>\n loadingChildrenIds.has(vn.node.id) ? { ...vn, isLoading: true } : vn,\n );\n }, [nodes, expandedIds, normalizedSearch, loadingChildrenIds]);\n\n const visibleNodeMap = useMemo(() => {\n const map = new Map<string | number, VisibleNode>();\n for (const vn of visibleNodes) {\n map.set(vn.node.id, vn);\n }\n return map;\n }, [visibleNodes]);\n\n // Build sibling groups from visible nodes for accurate aria-setsize/posinset\n // during search filtering. Groups nodes by their parent in the visible tree.\n const visibleSiblingsMap = useMemo(() => {\n const map = new Map<\n string | number,\n { setSize: number; posInSet: number }\n >();\n\n // Group visible nodes by parent. We track the parent stack as we walk the\n // flat list: when depth increases after an expanded branch, push that branch\n // as the current parent; when depth decreases, pop back up.\n type ParentKey = string | number | \"__root__\";\n const groups = new Map<ParentKey, (string | number)[]>();\n const parentStack: { id: string | number; depth: number }[] = [];\n\n for (const vn of visibleNodes) {\n if (vn.isEmptyPlaceholder) continue;\n\n // Pop stack until we find a parent at a shallower depth\n while (\n parentStack.length > 0 &&\n parentStack[parentStack.length - 1].depth >= vn.depth\n ) {\n parentStack.pop();\n }\n\n const parentKey: ParentKey =\n parentStack.length > 0\n ? parentStack[parentStack.length - 1].id\n : \"__root__\";\n\n let group = groups.get(parentKey);\n if (!group) {\n group = [];\n groups.set(parentKey, group);\n }\n group.push(vn.node.id);\n\n if (vn.isBranch && vn.isExpanded) {\n parentStack.push({ id: vn.node.id, depth: vn.depth });\n }\n }\n\n // Convert groups to setSize/posInSet\n for (const group of groups.values()) {\n for (let i = 0; i < group.length; i++) {\n map.set(group[i], { setSize: group.length, posInSet: i + 1 });\n }\n }\n\n return map;\n }, [visibleNodes]);\n\n // ---------------------------------------------------------------------------\n // Selection\n // ---------------------------------------------------------------------------\n\n // Resolve ancestor branches of \"orphan\" selections — checked ids that aren't\n // in the currently-loaded tree (e.g. a descendant under a collapsed lazy\n // branch). For each, take its ancestors from the value's own `path` when\n // present, else walk the loader's ancestry map. Only these specific branches\n // are forced to indeterminate, so unrelated collapsed siblings stay unchecked.\n const orphanAncestorIds = useMemo(() => {\n const loadedIds = new Set<string | number>();\n const collect = (list: TreeSelectFieldNode[]) => {\n for (const n of list) {\n loadedIds.add(n.id);\n if (n.children) collect(n.children);\n }\n };\n collect(nodes);\n\n const ancestors = new Set<string | number>();\n for (const v of value) {\n if (loadedIds.has(v.id)) continue; // not an orphan — handled by aggregation\n\n if (v.path && v.path.length > 0) {\n for (const ancestorId of v.path) ancestors.add(ancestorId);\n continue;\n }\n\n // Fall back to the loader's childId → parentId map.\n if (ancestry) {\n const seen = new Set<string | number>();\n let parent = ancestry.get(v.id);\n while (parent !== undefined && !seen.has(parent)) {\n seen.add(parent);\n ancestors.add(parent);\n parent = ancestry.get(parent);\n }\n }\n }\n return ancestors;\n }, [nodes, value, ancestry]);\n\n const checkStates = useMemo(\n () =>\n computeCheckStates(\n nodes,\n value,\n selectionMode,\n valueConsistsOf,\n orphanAncestorIds,\n ),\n [nodes, value, selectionMode, valueConsistsOf, orphanAncestorIds],\n );\n\n const getCheckState = useCallback(\n (id: string | number): CheckState => checkStates.get(id) ?? \"unchecked\",\n [checkStates],\n );\n\n const toggleNode = useCallback(\n (id: string | number) => {\n const newValue = toggleNodeSelection(\n nodes,\n value,\n id,\n selectionMode,\n valueConsistsOf,\n );\n onSelectedOptionsChange(newValue);\n },\n [nodes, value, selectionMode, valueConsistsOf, onSelectedOptionsChange],\n );\n\n // ---------------------------------------------------------------------------\n // Keyboard navigation\n // ---------------------------------------------------------------------------\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent): boolean => {\n return handleTreeKeyDown(e, {\n visibleNodes,\n activeIndex,\n setActiveIndex,\n isExpanded,\n toggleExpand,\n toggleNode,\n });\n },\n [visibleNodes, activeIndex, isExpanded, toggleExpand, toggleNode],\n );\n\n // ---------------------------------------------------------------------------\n // ARIA\n // ---------------------------------------------------------------------------\n\n const activeDescendantId =\n activeIndex >= 0 && activeIndex < visibleNodes.length\n ? `treeitem-${visibleNodes[activeIndex].node.id}`\n : undefined;\n\n const setActiveNodeId = useCallback(\n (id: string | number) => {\n const idx = visibleNodes.findIndex((vn) => vn.node.id === id);\n if (idx !== -1) setActiveIndex(idx);\n },\n [visibleNodes],\n );\n\n const getTreeItemProps = useCallback(\n (id: string | number): TreeItemProps => {\n const visibleNode = visibleNodeMap.get(id);\n const depth = visibleNode?.depth ?? 0;\n const isBranch = visibleNode?.isBranch ?? false;\n const expanded = isBranch\n ? (visibleNode?.isExpanded ?? isExpanded(id))\n : undefined;\n\n // Compute setsize and posinset from visible siblings (filtered tree)\n const siblingInfo = visibleSiblingsMap.get(id);\n const setSize = siblingInfo?.setSize ?? 1;\n const posInSet = siblingInfo?.posInSet ?? 1;\n\n const checkState = getCheckState(id);\n const isSelected = checkState === \"checked\";\n\n const props: TreeItemProps = {\n id: `treeitem-${id}`,\n role: \"treeitem\",\n \"aria-level\": depth + 1,\n \"aria-setsize\": setSize,\n \"aria-posinset\": posInSet,\n \"aria-selected\": isSelected,\n };\n\n if (isBranch) {\n props[\"aria-expanded\"] = expanded;\n }\n\n return props;\n },\n [visibleNodeMap, isExpanded, visibleSiblingsMap, getCheckState],\n );\n\n const treeProps = useMemo<TreeContainerProps>(\n () => ({\n role: \"tree\",\n \"aria-activedescendant\": activeDescendantId,\n \"aria-multiselectable\": selectionMode !== \"single\",\n }),\n [activeDescendantId, selectionMode],\n );\n\n return {\n nodes,\n visibleNodes,\n getCheckState,\n toggleNode,\n isExpanded,\n toggleExpand,\n expandAll,\n collapseAll,\n activeDescendantId,\n setActiveNodeId,\n onKeyDown,\n getTreeItemProps,\n treeProps,\n };\n}\n","import cx from \"classnames\";\nimport { Icon } from \"../../../../components/Icon\";\nimport { Spinner } from \"../../../../components/Spinner\";\nimport KeyboardArrowRight from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_right.svg\";\nimport KeyboardArrowDown from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_down.svg\";\nimport type { TreeSelectFieldNode } from \"../types\";\nimport type { VisibleNode } from \"./types\";\nimport styles from \"./TreeRow.module.scss\";\nimport { Text } from \"../../../../components\";\nimport { OptionCheckbox } from \"../../../../internal/components/OptionCheckbox\";\nimport { OptionContentArea } from \"../../../../internal/components/OptionContentArea\";\nimport {\n OptionRow,\n OptionRowSideContent,\n} from \"../../../../internal/components/OptionRow\";\n\nconst INDENT_BASE = 16;\nconst INDENT_PER_DEPTH = 24;\nconst EXPAND_ICON_WIDTH = 32;\n\n/**\n * Props for the TreeRow component.\n * @property {VisibleNode} visible - The visible node data including depth, expand state, and branch info.\n * @property {\"checked\" | \"unchecked\" | \"indeterminate\"} checkState - The checkbox state for this row.\n * @property {Record<string, unknown>} itemProps - ARIA/accessibility props from getTreeItemProps.\n * @property {boolean} [branchesSelectable] - When true, branch nodes can be selected. Defaults to true.\n * @property {boolean} [leavesSelectable] - When true, leaf nodes can be selected. Defaults to true.\n * @property {boolean} [emptyBranchesSelectable] - When true, empty branches (children: []) can be selected. Defaults to true.\n * @property {boolean} [isActive] - When true, applies a highlight background for keyboard focus.\n * @property {(id: string | number) => void} onToggleNode - Callback to toggle selection of the node.\n * @property {(id: string | number) => void} onToggleExpand - Callback to toggle expansion of a branch node.\n * @property {(node: TreeSelectFieldNode) => void} [onLoadChildren] - Callback to trigger lazy loading of children.\n * @property {number} depth - Depth of the node in the tree, used to calculate indentation.\n */\nexport type TreeRowProps = {\n visible: VisibleNode;\n checkState: \"checked\" | \"unchecked\" | \"indeterminate\" | \"loading\";\n itemProps: Record<string, unknown>;\n branchesSelectable?: boolean;\n leavesSelectable?: boolean;\n emptyBranchesSelectable?: boolean;\n readOnly?: boolean;\n isActive?: boolean;\n onToggleNode: (id: string | number) => void;\n onToggleExpand: (id: string | number) => void;\n onHover?: (id: string | number) => void;\n onLoadChildren?: (node: TreeSelectFieldNode) => void;\n depth: number;\n};\n\n/**\n * TreeRow renders a single row in the tree dropdown.\n *\n * Features:\n * - Depth-based indentation via inline paddingInlineStart\n * - Expand/collapse icon using Icon component with keyboard_arrow_right/down icons\n * - Spinning icon animation for lazy-loading branch nodes\n * - Checkbox in multi-select mode, hidden in single-select mode\n * - Rich content support via node.content (title, description, chips, avatar, icon)\n * - Label text with overflow ellipsis\n * - Disabled state with reduced opacity and default cursor\n * - Active (keyboard focus) state with highlight background\n * - Full ARIA semantics via spread itemProps\n *\n * @example\n * <TreeRow\n * visible={visibleNode}\n * checkState={getCheckState(visibleNode.node.id)}\n * itemProps={getTreeItemProps(visibleNode.node.id)}\n * onToggleNode={toggleNode}\n * onToggleExpand={toggleExpand}\n * depth={visibleNode.depth}\n * />\n */\nexport function TreeRow({\n visible,\n checkState,\n itemProps,\n branchesSelectable = true,\n leavesSelectable = true,\n emptyBranchesSelectable = true,\n readOnly = false,\n isActive,\n onToggleNode,\n onToggleExpand,\n onHover,\n onLoadChildren,\n depth,\n}: TreeRowProps) {\n const { node, isExpanded, isBranch, isLoading, isEmptyPlaceholder } = visible;\n\n if (isEmptyPlaceholder) {\n return (\n <OptionRow\n disabled\n className={styles[\"tree-row\"]}\n style={{\n paddingInlineStart:\n INDENT_BASE + depth * INDENT_PER_DEPTH + EXPAND_ICON_WIDTH,\n }}\n >\n <span className={styles[\"label-container\"]}>\n <Text>{node.label}</Text>\n </span>\n </OptionRow>\n );\n }\n\n const isDisabled = node.disabled === true;\n const isEmptyBranch =\n isBranch && Array.isArray(node.children) && node.children.length === 0;\n const isSelectable = (() => {\n if (!isBranch) return leavesSelectable;\n if (!branchesSelectable) return false;\n if (isEmptyBranch && !emptyBranchesSelectable) return false;\n return true;\n })();\n\n const showExpandIcon = isBranch;\n const paddingInlineStart =\n INDENT_BASE +\n depth * INDENT_PER_DEPTH +\n (showExpandIcon ? 0 : EXPAND_ICON_WIDTH);\n const rowDisabled = readOnly || isDisabled || (!isSelectable && !isBranch);\n\n const expandNode = () => {\n onToggleExpand(node.id);\n if (node.children === null) onLoadChildren?.(node);\n };\n\n const handleExpandClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isDisabled) return;\n expandNode();\n };\n\n const handleRowClick = () => {\n if (isDisabled) return;\n if (isBranch) {\n if (isSelectable) {\n onToggleNode(node.id);\n } else {\n expandNode();\n }\n } else if (isSelectable) {\n onToggleNode(node.id);\n }\n };\n\n let expandIconElement: React.ReactNode = null;\n if (showExpandIcon) {\n if (isLoading && checkState !== \"loading\") {\n expandIconElement = <Spinner size=\"small\" aria-hidden=\"true\" />;\n } else if (isExpanded) {\n expandIconElement = (\n <Icon svg={KeyboardArrowDown} size=\"small\" inherit aria-hidden=\"true\" />\n );\n } else {\n expandIconElement = (\n <Icon\n svg={KeyboardArrowRight}\n size=\"small\"\n inherit\n aria-hidden=\"true\"\n />\n );\n }\n }\n\n return (\n <OptionRow\n {...itemProps}\n disabled={rowDisabled}\n style={{ paddingInlineStart }}\n className={cx(styles[\"tree-row\"], {\n [styles[\"active\"]]: isActive,\n })}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => onHover?.(node.id)}\n onClick={handleRowClick}\n aria-disabled={rowDisabled || undefined}\n >\n {showExpandIcon && (\n <span\n className={styles[\"expand-icon\"]}\n onClick={handleExpandClick}\n aria-hidden=\"true\"\n >\n {expandIconElement}\n </span>\n )}\n {isSelectable && (\n <OptionRowSideContent>\n <OptionCheckbox checkState={checkState} />\n </OptionRowSideContent>\n )}\n <OptionContentArea label={node.label} content={node.content} />\n </OptionRow>\n );\n}\n","import { forwardRef } from \"react\";\nimport cx from \"classnames\";\nimport type { TreeSelectFieldNode } from \"../types\";\nimport type { VisibleNode } from \"./types\";\nimport { TreeRow } from \"./TreeRow\";\nimport styles from \"./TreePanel.module.scss\";\n\n/**\n * Props for the TreePanel component.\n * @property {VisibleNode[]} visibleNodes - Flat list of nodes currently visible in the tree.\n * @property {(id: string | number) => \"checked\" | \"unchecked\" | \"indeterminate\" | \"loading\"} getCheckState - Returns the check state for a given node id.\n * @property {(id: string | number) => void} toggleNode - Toggles the selection state of a node.\n * @property {(id: string | number) => void} toggleExpand - Toggles the expanded state of a branch node.\n * @property {(id: string | number) => Record<string, unknown>} getTreeItemProps - Returns ARIA/accessibility props for a tree item.\n * @property {Record<string, unknown>} treeProps - Props to spread onto the tree container element.\n * @property {string | undefined} activeDescendantId - The id of the currently active/focused tree item.\n * @property {boolean} [branchesSelectable] - When true, branch nodes can be selected.\n * @property {boolean} [leavesSelectable] - When true, leaf nodes can be selected.\n * @property {boolean} [emptyBranchesSelectable] - When true, empty branches can be selected.\n * @property {(node: TreeSelectFieldNode) => void} [onLoadChildren] - Callback to trigger lazy loading of children.\n */\nexport type TreePanelProps = {\n visibleNodes: VisibleNode[];\n getCheckState: (\n id: string | number,\n ) => \"checked\" | \"unchecked\" | \"indeterminate\" | \"loading\";\n toggleNode: (id: string | number) => void;\n toggleExpand: (id: string | number) => void;\n getTreeItemProps: (id: string | number) => Record<string, unknown>;\n treeProps: Record<string, unknown>;\n activeDescendantId: string | undefined;\n branchesSelectable?: boolean;\n leavesSelectable?: boolean;\n emptyBranchesSelectable?: boolean;\n readOnly?: boolean;\n onHover?: (id: string | number) => void;\n onLoadChildren?: (node: TreeSelectFieldNode) => void;\n};\n\n/**\n * TreePanel component that renders the tree dropdown content.\n *\n * Features:\n * - Renders a flat list of visible nodes with depth-based indentation\n * - Supports expand/collapse controls for branch nodes\n * - Shows loading indicator for lazily-loaded branches\n * - Checkboxes for multi-select mode (hidden in single-select mode)\n * - Optional breadcrumb display for flattened search results\n * - Optional child count display for branch nodes\n * - Full accessibility support with ARIA tree/treeitem roles\n * - Focusable container via forwardRef\n *\n * @example\n * <TreePanel\n * visibleNodes={visibleNodes}\n * getCheckState={getCheckState}\n * toggleNode={toggleNode}\n * toggleExpand={toggleExpand}\n * getTreeItemProps={getTreeItemProps}\n * treeProps={treeProps}\n * activeDescendantId={activeDescendantId}\n * />\n */\nexport const TreePanel = forwardRef<HTMLDivElement, TreePanelProps>(\n function TreePanelInner(\n {\n visibleNodes,\n getCheckState,\n toggleNode,\n toggleExpand,\n getTreeItemProps,\n treeProps,\n activeDescendantId,\n branchesSelectable,\n leavesSelectable,\n emptyBranchesSelectable,\n readOnly,\n onHover,\n onLoadChildren,\n },\n ref,\n ) {\n return (\n <div\n ref={ref}\n {...treeProps}\n className={cx(styles.panel, treeProps.className)}\n >\n {visibleNodes.map((visible) => (\n <TreeRow\n key={visible.node.id}\n visible={visible}\n checkState={getCheckState(visible.node.id)}\n itemProps={getTreeItemProps(visible.node.id)}\n isActive={activeDescendantId === `treeitem-${visible.node.id}`}\n branchesSelectable={branchesSelectable}\n leavesSelectable={leavesSelectable}\n emptyBranchesSelectable={emptyBranchesSelectable}\n readOnly={readOnly}\n onToggleNode={toggleNode}\n onToggleExpand={toggleExpand}\n onHover={onHover}\n onLoadChildren={onLoadChildren}\n depth={visible.depth}\n />\n ))}\n </div>\n );\n },\n);\n\nTreePanel.displayName = \"TreePanel\";\n","import { forwardRef, useCallback, useRef } from \"react\";\nimport cx from \"classnames\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type { TreeSelectFieldNode } from \"../types\";\nimport type { VisibleNode } from \"./types\";\nimport { TreeRow } from \"./TreeRow\";\nimport styles from \"./TreePanel.module.scss\";\n\nconst EST_PADDING_BLOCK = 16;\nconst EST_LINE_HEIGHT = 18;\nconst EST_CHIP_ROW_HEIGHT = 28;\nconst EST_SIDE_CONTENT_HEIGHT = 40;\nconst EST_BASE_ROW_HEIGHT = EST_PADDING_BLOCK + EST_LINE_HEIGHT;\n\nfunction estimateTreeRowHeight(visible: VisibleNode): number {\n const content = visible.node.content;\n if (!content) return EST_BASE_ROW_HEIGHT;\n\n let contentHeight = EST_LINE_HEIGHT;\n if (content.description) contentHeight += EST_LINE_HEIGHT;\n if (content.chips?.length) contentHeight += EST_CHIP_ROW_HEIGHT;\n if (content.avatar || content.icon)\n contentHeight = Math.max(contentHeight, EST_SIDE_CONTENT_HEIGHT);\n\n return EST_PADDING_BLOCK + contentHeight;\n}\n\n/**\n * Props for the VirtualizedTreePanel component.\n * @property visibleNodes - Flat list of currently visible tree nodes.\n * @property getCheckState - Returns the visual check state for a node ID.\n * @property toggleNode - Toggles selection for the given node ID.\n * @property toggleExpand - Expands or collapses the given branch node ID.\n * @property getTreeItemProps - Returns ARIA props for a given node ID.\n * @property treeProps - ARIA props for the tree container element.\n * @property activeDescendantId - The id attribute of the focused treeitem, for aria-activedescendant.\n * @property branchesSelectable - When true, branch nodes can be selected.\n * @property leavesSelectable - When true, leaf nodes can be selected.\n * @property onLoadChildren - Callback to lazily load children for a node with children===null.\n */\nexport type VirtualizedTreePanelProps = {\n visibleNodes: VisibleNode[];\n getCheckState: (\n id: string | number,\n ) => \"checked\" | \"unchecked\" | \"indeterminate\" | \"loading\";\n toggleNode: (id: string | number) => void;\n toggleExpand: (id: string | number) => void;\n getTreeItemProps: (id: string | number) => Record<string, unknown>;\n treeProps: Record<string, unknown>;\n activeDescendantId: string | undefined;\n branchesSelectable?: boolean;\n leavesSelectable?: boolean;\n emptyBranchesSelectable?: boolean;\n readOnly?: boolean;\n onHover?: (id: string | number) => void;\n onLoadChildren?: (node: TreeSelectFieldNode) => void;\n};\n\n/**\n * VirtualizedTreePanel renders a virtualized tree list using @tanstack/react-virtual,\n * only mounting DOM nodes for visible rows. Intended for large tree datasets.\n *\n * Features:\n * - Only renders visible rows via @tanstack/react-virtual for performance\n * - Same visual output and interaction model as a non-virtualized tree panel\n * - Supports multi-select checkboxes and single-select modes\n * - Expand/collapse branch nodes with optional lazy loading\n * - Keyboard navigation via onKeyDown handler\n * - Full ARIA tree semantics (role, aria-level, aria-expanded, etc.)\n * - Optional child count display on branch nodes\n * - Breadcrumb display for flattened search results\n *\n * @example\n * <VirtualizedTreePanel\n * visibleNodes={visibleNodes}\n * getCheckState={getCheckState}\n * toggleNode={toggleNode}\n * toggleExpand={toggleExpand}\n * getTreeItemProps={getTreeItemProps}\n * treeProps={treeProps}\n * onKeyDown={onKeyDown}\n * activeDescendantId={activeDescendantId}\n * />\n */\nexport const VirtualizedTreePanel = forwardRef<\n HTMLDivElement,\n VirtualizedTreePanelProps\n>(function VirtualizedTreePanelInner(props, ref) {\n const {\n visibleNodes,\n getCheckState,\n toggleNode,\n toggleExpand,\n getTreeItemProps,\n treeProps,\n activeDescendantId,\n branchesSelectable = true,\n leavesSelectable = true,\n emptyBranchesSelectable = true,\n readOnly = false,\n onHover,\n onLoadChildren,\n } = props;\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const estimateSize = useCallback(\n (index: number) => estimateTreeRowHeight(visibleNodes[index]),\n [visibleNodes],\n );\n\n const virtualizer = useVirtualizer({\n count: visibleNodes.length,\n getScrollElement: () => scrollRef.current,\n estimateSize,\n overscan: 5,\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n\n return (\n <div\n ref={(node) => {\n scrollRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n {...treeProps}\n className={cx(styles.panel, treeProps.className)}\n >\n <div\n style={{\n height: virtualizer.getTotalSize(),\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {virtualItems.map((virtualItem) => {\n const visible = visibleNodes[virtualItem.index];\n return (\n <div\n key={visible.node.id}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <TreeRow\n visible={visible}\n checkState={getCheckState(visible.node.id)}\n itemProps={getTreeItemProps(visible.node.id)}\n isActive={activeDescendantId === `treeitem-${visible.node.id}`}\n branchesSelectable={branchesSelectable}\n leavesSelectable={leavesSelectable}\n emptyBranchesSelectable={emptyBranchesSelectable}\n readOnly={readOnly}\n onToggleNode={toggleNode}\n onToggleExpand={toggleExpand}\n onHover={onHover}\n onLoadChildren={onLoadChildren}\n depth={visible.depth}\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n});\n","import { forwardRef } from \"react\";\nimport { Spinner } from \"../../../../components/Spinner\";\nimport { Text } from \"../../../../components/Text\";\nimport { TreePanel } from \"./TreePanel\";\nimport { VirtualizedTreePanel } from \"./VirtualizedTreePanel\";\nimport type { TreePanelProps } from \"./TreePanel\";\n\n/**\n * Props for the TreeContent component.\n *\n * @property loading - Whether the tree is currently loading data; renders a spinner while true.\n * @property hasNoVisibleNodes - True when there are no nodes to render (e.g. a search returned no matches); renders an empty-state message.\n * @property virtualize - When true, renders the virtualized panel; otherwise renders the standard panel.\n * @property panelProps - Props forwarded to the underlying TreePanel or VirtualizedTreePanel.\n */\nexport type TreeContentProps = {\n loading: boolean;\n hasNoVisibleNodes: boolean;\n virtualize?: boolean;\n panelProps: TreePanelProps;\n};\n\n/**\n * Renders the body of a tree select popover or dialog: a centered spinner\n * while loading, a \"No match found\" message when there are no visible\n * nodes, or the (optionally virtualized) tree panel.\n *\n * Used by both TreeSelectField and TreeSelectMenu to keep the three\n * states consistent across the field's dialog and popover branches and\n * the menu's render path.\n *\n * Features:\n * - Centered medium Spinner while loading\n * - \"No match found\" empty state (small, subdued text)\n * - Switches between TreePanel and VirtualizedTreePanel via the `virtualize` flag\n * - Forwards a ref to the underlying tree panel for focus management\n */\nexport const TreeContent = forwardRef<HTMLDivElement, TreeContentProps>(\n function TreeContent(\n { loading, hasNoVisibleNodes, virtualize, panelProps },\n ref,\n ) {\n if (loading) {\n return (\n <div\n style={{\n padding: \"var(--a2-spacing-200)\",\n display: \"flex\",\n justifyContent: \"center\",\n }}\n >\n <Spinner size=\"medium\" />\n </div>\n );\n }\n if (hasNoVisibleNodes) {\n return (\n <div\n role=\"presentation\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1rem\",\n textAlign: \"center\",\n }}\n >\n <Text subdued size=\"small\">\n No match found\n </Text>\n </div>\n );\n }\n return virtualize ? (\n <VirtualizedTreePanel ref={ref} {...panelProps} />\n ) : (\n <TreePanel ref={ref} {...panelProps} />\n );\n },\n);\n\nTreeContent.displayName = \"TreeContent\";\n","import type { TreeSelectFieldNode } from \"../types\";\n\n/**\n * Recursively finds the first node in the tree matching the given id.\n *\n * @param nodes - The tree nodes to search.\n * @param id - The id of the node to find.\n * @returns The matching node, or undefined if no node has the given id.\n */\nexport function findNode(\n nodes: TreeSelectFieldNode[],\n id: string | number,\n): TreeSelectFieldNode | undefined {\n for (const node of nodes) {\n if (node.id === id) return node;\n if (node.children) {\n const found = findNode(node.children, id);\n if (found) return found;\n }\n }\n return undefined;\n}\n\n/**\n * Returns true when the given node or any of its descendants still need to\n * be lazy-loaded (i.e. has `children: null`).\n *\n * @param node - The node to inspect.\n * @returns Whether any descendant branch is still unloaded.\n */\nexport function hasUnloadedDescendants(node: TreeSelectFieldNode): boolean {\n if (node.children === null) return true;\n if (!node.children) return false;\n return node.children.some(hasUnloadedDescendants);\n}\n\n/**\n * Returns all descendant branches of the given node whose children have not\n * yet been loaded (i.e. `children: null`). The node itself is not included.\n *\n * @param node - The ancestor node to walk.\n * @returns Every descendant branch that still requires lazy loading.\n */\nexport function findUnloadedDescendants(\n node: TreeSelectFieldNode,\n): TreeSelectFieldNode[] {\n const result: TreeSelectFieldNode[] = [];\n if (!node.children) return result;\n for (const child of node.children) {\n if (child.children === null) {\n result.push(child);\n } else if (child.children) {\n result.push(...findUnloadedDescendants(child));\n }\n }\n return result;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { UseTreeReturn } from \"./useTree\";\nimport type { UseTreeLoaderReturn } from \"./useTreeLoader\";\nimport {\n findNode,\n findUnloadedDescendants,\n hasUnloadedDescendants,\n} from \"./treeUtils\";\n\n/**\n * Options for {@link useTreeLazyCascade}.\n *\n * @property tree - Tree state from useTree, used to read nodes and run toggles.\n * @property loader - Tree loader, used to lazy-load unloaded descendants.\n * @property isSingleSelect - Whether the consumer is in single-select mode; controls auto-close after a successful toggle.\n * @property branchesSelectable - Whether branch nodes can be selected (vs only expanded).\n * @property leavesSelectable - Whether leaf nodes can be selected.\n * @property emptyBranchesSelectable - Whether branches with an empty children array can be selected.\n * @property readOnly - When true, all toggle attempts no-op.\n * @property onCloseAfterSingleSelect - Called after a successful single-select toggle so the consumer can close its menu and restore focus.\n */\nexport type UseTreeLazyCascadeOptions = {\n tree: UseTreeReturn;\n loader: UseTreeLoaderReturn;\n isSingleSelect: boolean;\n branchesSelectable: boolean;\n leavesSelectable: boolean;\n emptyBranchesSelectable: boolean;\n readOnly?: boolean;\n onCloseAfterSingleSelect?: () => void;\n};\n\n/**\n * Return value of {@link useTreeLazyCascade}.\n *\n * @property handleToggleNode - Click/Space handler for a tree row that respects selectability and loads any unloaded descendants before cascading.\n * @property pendingToggleNodeId - The id of the node currently waiting on lazy loads to complete (used to render a loading checkbox), or null.\n * @property reset - Clears any in-flight pending toggle. Call from the consumer's closeMenu so reopening starts clean.\n */\nexport type UseTreeLazyCascadeReturn = {\n handleToggleNode: (nodeId: string | number) => void;\n pendingToggleNodeId: string | number | null;\n reset: () => void;\n};\n\n/**\n * Coordinates \"toggle a tree node, but lazy-load any unloaded descendants\n * first\" — the bit of orchestration that sits between useTree and\n * useTreeLoader and is shared between TreeSelectField and TreeSelectMenu.\n *\n * When the consumer clicks a branch whose subtree isn't fully loaded, the\n * hook records the pending toggle, kicks off loadChildren for every\n * unloaded descendant, and then — once all loads are complete — fires\n * tree.toggleNode so cascade selection can run against the now-complete\n * subtree. While loads are in flight, pendingToggleNodeId points at the\n * originally-clicked node so the consumer can render a loading state on\n * its checkbox.\n *\n * Non-selectable branches expand instead of toggling; non-selectable\n * leaves no-op. Read-only consumers can pass readOnly to short-circuit.\n *\n * @param options - See {@link UseTreeLazyCascadeOptions}.\n * @returns Toggle handler, current pending node id, and a reset function.\n */\nexport function useTreeLazyCascade(\n options: UseTreeLazyCascadeOptions,\n): UseTreeLazyCascadeReturn {\n const {\n tree,\n loader,\n isSingleSelect,\n branchesSelectable,\n leavesSelectable,\n emptyBranchesSelectable,\n readOnly = false,\n onCloseAfterSingleSelect,\n } = options;\n\n const pendingToggleRef = useRef<string | number | null>(null);\n const loadedForToggleRef = useRef(new Set<string | number>());\n const [pendingToggleNodeId, setPendingToggleNodeId] = useState<\n string | number | null\n >(null);\n\n useEffect(() => {\n if (pendingToggleRef.current === null) return;\n const nodeId = pendingToggleRef.current;\n const node = findNode(tree.nodes, nodeId);\n if (!node) return;\n\n // Still waiting for the root node's children\n if (node.children === null) return;\n\n // Still waiting for in-progress loads to complete\n if (loader.isLoadingChildren.size > 0) return;\n\n // Find unloaded descendants we haven't already requested\n const unloaded = findUnloadedDescendants(node).filter(\n (n) => !loadedForToggleRef.current.has(n.id),\n );\n if (unloaded.length > 0) {\n for (const n of unloaded) {\n loadedForToggleRef.current.add(n.id);\n void loader.loadChildren(n);\n }\n return;\n }\n\n // All descendants loaded — fire the toggle\n pendingToggleRef.current = null;\n loadedForToggleRef.current = new Set();\n setPendingToggleNodeId(null);\n tree.toggleNode(nodeId);\n if (isSingleSelect) {\n onCloseAfterSingleSelect?.();\n }\n }, [tree, isSingleSelect, onCloseAfterSingleSelect, loader]);\n\n const handleToggleNode = useCallback(\n (nodeId: string | number) => {\n if (readOnly) return;\n\n const node = findNode(tree.nodes, nodeId);\n if (!node) return;\n\n const isBranch = node.children !== undefined;\n const isEmptyBranch =\n isBranch && Array.isArray(node.children) && node.children.length === 0;\n const isNodeSelectable = isBranch\n ? branchesSelectable && (isEmptyBranch ? emptyBranchesSelectable : true)\n : leavesSelectable;\n\n if (!isNodeSelectable) {\n // Non-selectable branches expand instead; non-selectable leaves no-op\n if (isBranch) {\n tree.toggleExpand(nodeId);\n if (node.children === null) {\n void loader.loadChildren(node);\n }\n }\n return;\n }\n\n if (hasUnloadedDescendants(node)) {\n pendingToggleRef.current = nodeId;\n loadedForToggleRef.current = new Set();\n setPendingToggleNodeId(nodeId);\n if (node.children === null) {\n loadedForToggleRef.current.add(node.id);\n void loader.loadChildren(node);\n } else {\n const unloaded = findUnloadedDescendants(node);\n for (const n of unloaded) {\n loadedForToggleRef.current.add(n.id);\n void loader.loadChildren(n);\n }\n }\n return;\n }\n\n tree.toggleNode(nodeId);\n if (isSingleSelect) {\n onCloseAfterSingleSelect?.();\n }\n },\n [\n tree,\n isSingleSelect,\n onCloseAfterSingleSelect,\n loader,\n readOnly,\n branchesSelectable,\n leavesSelectable,\n emptyBranchesSelectable,\n ],\n );\n\n const reset = useCallback(() => {\n pendingToggleRef.current = null;\n loadedForToggleRef.current = new Set();\n setPendingToggleNodeId(null);\n }, []);\n\n return { handleToggleNode, pendingToggleNodeId, reset };\n}\n","import { matchSorter, MatchSorterOptions } from \"match-sorter\";\nimport type { TreeSelectFieldNode } from \"../types\";\n\n/**\n * Filter function for narrowing tree options against a search value.\n * Receives the full options tree and returns the (possibly pruned) tree to display.\n */\nexport type TreeSyncFilterFn = (\n options: TreeSelectFieldNode[],\n searchValue: string,\n) => TreeSelectFieldNode[];\n\n/**\n * Recursively populates `childCount` (number of immediate children) on every\n * loaded branch that doesn't already declare one, returning a new tree.\n *\n * This is computed from the full static `options` *before* any search filter\n * runs, so the count reflects the real child set rather than the filtered\n * subset. `computeCheckStates` relies on `childCount` to detect that a branch\n * is only partially represented (e.g. during search) and avoid showing a\n * partially-selected branch as fully checked.\n *\n * @param nodes - The tree nodes to process.\n * @returns A new array of nodes with childCount set on branch nodes.\n */\nexport function applyChildCounts(\n nodes: TreeSelectFieldNode[],\n): TreeSelectFieldNode[] {\n return nodes.map((node) => {\n if (!Array.isArray(node.children)) return node;\n\n const children = applyChildCounts(node.children);\n\n return {\n ...node,\n children,\n childCount: node.childCount ?? children.length,\n };\n });\n}\n\n/**\n * Recursively flattens all nodes in a tree for flat matching.\n */\nfunction flattenNodes(nodes: TreeSelectFieldNode[]): TreeSelectFieldNode[] {\n return nodes.flatMap((node) => [\n node,\n ...(node.children ? flattenNodes(node.children) : []),\n ]);\n}\n\n/**\n * Returns a filtered subtree, keeping any node whose subtree contains a match.\n */\nfunction pruneTree(\n nodes: TreeSelectFieldNode[],\n matchedIds: Set<string | number>,\n): TreeSelectFieldNode[] {\n const result: TreeSelectFieldNode[] = [];\n for (const node of nodes) {\n if (matchedIds.has(node.id)) {\n result.push(node);\n } else if (node.children && node.children.length > 0) {\n const filteredChildren = pruneTree(node.children, matchedIds);\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n }\n return result;\n}\n\n/**\n * Default tree-aware filter. Matches on label and searchText, preserving\n * ancestors of matched nodes.\n */\nexport function defaultTreeSyncFilter(\n nodes: TreeSelectFieldNode[],\n searchValue: string,\n): TreeSelectFieldNode[] {\n if (!searchValue) return nodes;\n\n const flat = flattenNodes(nodes);\n const matched = matchSorter(flat, searchValue, {\n keys: [\"label\", \"searchText\"],\n });\n const matchedIds = new Set(matched.map((n) => n.id));\n\n return pruneTree(nodes, matchedIds);\n}\n\n/**\n * Coerces a `TreeSyncFilterFn` or `MatchSorterOptions` into a\n * `TreeSyncFilterFn`. When given options, the resulting filter flattens the\n * tree, runs match-sorter, and prunes the original tree to keep ancestors of\n * matched nodes.\n */\nexport function toTreeSyncFilterFn(\n filter: TreeSyncFilterFn | MatchSorterOptions<TreeSelectFieldNode>,\n): TreeSyncFilterFn {\n if (typeof filter === \"function\") return filter;\n\n return (nodes: TreeSelectFieldNode[], searchValue: string) => {\n if (!searchValue) return nodes;\n const flat = flattenNodes(nodes);\n const matched = matchSorter(flat, searchValue, filter);\n const matchedIds = new Set(matched.map((n) => n.id));\n return pruneTree(nodes, matchedIds);\n };\n}\n"],"names":["state","styles","KeyboardArrowDown","KeyboardArrowRight","TreeContent"],"mappings":"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"}
|