@servicetitan/anvil2 1.48.1 → 1.49.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.
Files changed (249) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/{Alert-Cz_w_cw0.js → Alert-aGBkujwE.js} +4 -4
  3. package/dist/{Alert-Cz_w_cw0.js.map → Alert-aGBkujwE.js.map} +1 -1
  4. package/dist/Alert.js +1 -1
  5. package/dist/{Announcement-C1xSJkl0.js → Announcement-BPwFNhYe.js} +4 -4
  6. package/dist/{Announcement-C1xSJkl0.js.map → Announcement-BPwFNhYe.js.map} +1 -1
  7. package/dist/Announcement.js +1 -1
  8. package/dist/{AnvilProvider-DDo8ZcIA.js → AnvilProvider-DBYMPYAO.js} +3 -3
  9. package/dist/{AnvilProvider-DDo8ZcIA.js.map → AnvilProvider-DBYMPYAO.js.map} +1 -1
  10. package/dist/AnvilProvider.js +1 -1
  11. package/dist/{Avatar-VQrimv28.js → Avatar-DeEV-v-b.js} +2 -2
  12. package/dist/{Avatar-VQrimv28.js.map → Avatar-DeEV-v-b.js.map} +1 -1
  13. package/dist/{Avatar-Bbwk2MCy.js → Avatar-gtxslf5v.js} +2 -2
  14. package/dist/{Avatar-Bbwk2MCy.js.map → Avatar-gtxslf5v.js.map} +1 -1
  15. package/dist/Avatar.js +2 -2
  16. package/dist/{Badge-DOnID5l5.js → Badge-DY5xJkqi.js} +2 -2
  17. package/dist/{Badge-DOnID5l5.js.map → Badge-DY5xJkqi.js.map} +1 -1
  18. package/dist/Badge.js +1 -1
  19. package/dist/{Breadcrumbs-DKqd8VRz.js → Breadcrumbs-DjR-2OEH.js} +5 -5
  20. package/dist/{Breadcrumbs-DKqd8VRz.js.map → Breadcrumbs-DjR-2OEH.js.map} +1 -1
  21. package/dist/Breadcrumbs.js +1 -1
  22. package/dist/{Button-DzcOa6iJ.js → Button-92_FKAyV.js} +3 -3
  23. package/dist/{Button-DzcOa6iJ.js.map → Button-92_FKAyV.js.map} +1 -1
  24. package/dist/Button.js +1 -1
  25. package/dist/{ButtonCompound-Dvr3Fres.js → ButtonCompound-COdSELhh.js} +2 -2
  26. package/dist/{ButtonCompound-Dvr3Fres.js.map → ButtonCompound-COdSELhh.js.map} +1 -1
  27. package/dist/ButtonCompound.js +1 -1
  28. package/dist/{ButtonLink-DGIRpyK6.js → ButtonLink-C0zR7Wnb.js} +3 -3
  29. package/dist/{ButtonLink-DGIRpyK6.js.map → ButtonLink-C0zR7Wnb.js.map} +1 -1
  30. package/dist/ButtonLink.js +1 -1
  31. package/dist/{ButtonToggle-Dv6VAm4W.js → ButtonToggle--sKvhBoA.js} +3 -3
  32. package/dist/{ButtonToggle-Dv6VAm4W.js.map → ButtonToggle--sKvhBoA.js.map} +1 -1
  33. package/dist/ButtonToggle.js +1 -1
  34. package/dist/{Calendar-8bP4LsQV.js → Calendar-1MhJ03iy.js} +2 -2
  35. package/dist/{Calendar-8bP4LsQV.js.map → Calendar-1MhJ03iy.js.map} +1 -1
  36. package/dist/{Calendar-NDOcurOz.js → Calendar-B7ypKGUn.js} +5 -5
  37. package/dist/{Calendar-NDOcurOz.js.map → Calendar-B7ypKGUn.js.map} +1 -1
  38. package/dist/Calendar.js +2 -2
  39. package/dist/{Card-Cyoz-LaD.js → Card-Ch3sMUo5.js} +2 -2
  40. package/dist/{Card-Cyoz-LaD.js.map → Card-Ch3sMUo5.js.map} +1 -1
  41. package/dist/Card.js +1 -1
  42. package/dist/{Checkbox-Bsa1FgoI.js → Checkbox-Bhjj-jM4.js} +5 -5
  43. package/dist/{Checkbox-Bsa1FgoI.js.map → Checkbox-Bhjj-jM4.js.map} +1 -1
  44. package/dist/{Checkbox-BJnt8TFk.js → Checkbox-C5Qjq_tU.js} +2 -2
  45. package/dist/{Checkbox-BJnt8TFk.js.map → Checkbox-C5Qjq_tU.js.map} +1 -1
  46. package/dist/Checkbox.js +2 -2
  47. package/dist/{Chip-BGa1Inb8.js → Chip-X2EwdZ97.js} +4 -4
  48. package/dist/{Chip-BGa1Inb8.js.map → Chip-X2EwdZ97.js.map} +1 -1
  49. package/dist/Chip.js +1 -1
  50. package/dist/{Combobox-BfqKpX1v.js → Combobox-C4COM7BZ.js} +13 -13
  51. package/dist/{Combobox-BfqKpX1v.js.map → Combobox-C4COM7BZ.js.map} +1 -1
  52. package/dist/Combobox.js +1 -1
  53. package/dist/{DataTable-xUON92DR.js → DataTable-BkNCMaVu.js} +93 -89
  54. package/dist/DataTable-BkNCMaVu.js.map +1 -0
  55. package/dist/{DateField-Cm0FIG3Y.js → DateField-C5rA3USK.js} +6 -6
  56. package/dist/{DateField-Cm0FIG3Y.js.map → DateField-C5rA3USK.js.map} +1 -1
  57. package/dist/DateField.js +1 -1
  58. package/dist/{DateFieldRange-CGGqW_cg.js → DateFieldRange-BLfEH-oC.js} +7 -7
  59. package/dist/{DateFieldRange-CGGqW_cg.js.map → DateFieldRange-BLfEH-oC.js.map} +1 -1
  60. package/dist/DateFieldRange.js +1 -1
  61. package/dist/{DateFieldSingle-BYWuJ3IL.js → DateFieldSingle-7Cx_FMtb.js} +7 -7
  62. package/dist/{DateFieldSingle-BYWuJ3IL.js.map → DateFieldSingle-7Cx_FMtb.js.map} +1 -1
  63. package/dist/DateFieldSingle.js +1 -1
  64. package/dist/DateFieldYearless-D2uo-uqE.js +132 -0
  65. package/dist/DateFieldYearless-D2uo-uqE.js.map +1 -0
  66. package/dist/DateFieldYearless.js +1 -1
  67. package/dist/DateFieldYearlessRange-BivGidsU.js +178 -0
  68. package/dist/DateFieldYearlessRange-BivGidsU.js.map +1 -0
  69. package/dist/DateFieldYearlessRange.css +36 -0
  70. package/dist/DateFieldYearlessRange.d.ts +2 -0
  71. package/dist/DateFieldYearlessRange.js +2 -0
  72. package/dist/DateFieldYearlessRange.js.map +1 -0
  73. package/dist/{DaysOfTheWeek-BIi9dyJP.js → DaysOfTheWeek-Dn6zHxpt.js} +6 -6
  74. package/dist/{DaysOfTheWeek-BIi9dyJP.js.map → DaysOfTheWeek-Dn6zHxpt.js.map} +1 -1
  75. package/dist/DaysOfTheWeek.js +1 -1
  76. package/dist/{Details-Bg7QzlOm.js → Details-CkaKTRvc.js} +3 -3
  77. package/dist/{Details-Bg7QzlOm.js.map → Details-CkaKTRvc.js.map} +1 -1
  78. package/dist/Details.js +1 -1
  79. package/dist/{Dialog-fJClGTI6.js → Dialog-CxH4Vnbb.js} +4 -4
  80. package/dist/{Dialog-fJClGTI6.js.map → Dialog-CxH4Vnbb.js.map} +1 -1
  81. package/dist/Dialog.js +1 -1
  82. package/dist/{Divider-DYZFKug1.js → Divider-Olv8yWXD.js} +2 -2
  83. package/dist/{Divider-DYZFKug1.js.map → Divider-Olv8yWXD.js.map} +1 -1
  84. package/dist/Divider.js +1 -1
  85. package/dist/Dnd.js +1 -1
  86. package/dist/DndSort.js +5 -5
  87. package/dist/{Drawer-DyHDRTR-.js → Drawer-BLfDJU-e.js} +4 -4
  88. package/dist/{Drawer-DyHDRTR-.js.map → Drawer-BLfDJU-e.js.map} +1 -1
  89. package/dist/Drawer.js +1 -1
  90. package/dist/{EditCard-LdyduHqX.js → EditCard-Ds1UXJIS.js} +6 -6
  91. package/dist/{EditCard-LdyduHqX.js.map → EditCard-Ds1UXJIS.js.map} +1 -1
  92. package/dist/EditCard.js +1 -1
  93. package/dist/{FieldLabel-DIlzcPIQ.js → FieldLabel-CHMCV9wX.js} +38 -19
  94. package/dist/FieldLabel-CHMCV9wX.js.map +1 -0
  95. package/dist/FieldLabel.css +22 -7
  96. package/dist/FieldLabel.js +1 -1
  97. package/dist/{FieldMessage-BbARBii0.js → FieldMessage-DWONT3dr.js} +2 -2
  98. package/dist/{FieldMessage-BbARBii0.js.map → FieldMessage-DWONT3dr.js.map} +1 -1
  99. package/dist/FieldMessage.js +1 -1
  100. package/dist/{Flex-GLF5XRJg.js → Flex-CjPHUTeq.js} +2 -2
  101. package/dist/{Flex-GLF5XRJg.js.map → Flex-CjPHUTeq.js.map} +1 -1
  102. package/dist/Flex.js +1 -1
  103. package/dist/{Grid-BpAt2zA7.js → Grid-DW2cAuHi.js} +2 -2
  104. package/dist/{Grid-BpAt2zA7.js.map → Grid-DW2cAuHi.js.map} +1 -1
  105. package/dist/Grid.js +1 -1
  106. package/dist/{Helper-DHoKHqxV.js → Helper-DjWotFtO.js} +2 -2
  107. package/dist/{Helper-DHoKHqxV.js.map → Helper-DjWotFtO.js.map} +1 -1
  108. package/dist/{Icon-TcJbUdTz.js → Icon-BSuTVNaa.js} +2 -2
  109. package/dist/{Icon-TcJbUdTz.js.map → Icon-BSuTVNaa.js.map} +1 -1
  110. package/dist/Icon.js +1 -1
  111. package/dist/{InputMask-B6oJlChY.js → InputMask-fS5nqXdI.js} +2 -2
  112. package/dist/{InputMask-B6oJlChY.js.map → InputMask-fS5nqXdI.js.map} +1 -1
  113. package/dist/InputMask.js +1 -1
  114. package/dist/{Link-Br_AJ7Af.js → Link-DuYh7Xl2.js} +3 -3
  115. package/dist/{Link-Br_AJ7Af.js.map → Link-DuYh7Xl2.js.map} +1 -1
  116. package/dist/Link.js +1 -1
  117. package/dist/{LinkButton-CwiVzaro.js → LinkButton-pIUNATNE.js} +2 -2
  118. package/dist/{LinkButton-CwiVzaro.js.map → LinkButton-pIUNATNE.js.map} +1 -1
  119. package/dist/LinkButton.js +1 -1
  120. package/dist/{ListView-fBFSagWO.js → ListView-CZ5T8bR1.js} +3 -3
  121. package/dist/{ListView-fBFSagWO.js.map → ListView-CZ5T8bR1.js.map} +1 -1
  122. package/dist/ListView.js +1 -1
  123. package/dist/{Listbox-gtZ2Ao_I.js → Listbox-C-n4IVVj.js} +5 -5
  124. package/dist/{Listbox-gtZ2Ao_I.js.map → Listbox-C-n4IVVj.js.map} +1 -1
  125. package/dist/Listbox.js +1 -1
  126. package/dist/{LocalizationProvider-Cqattc3O.js → LocalizationProvider-u6xdKCBi.js} +2 -2
  127. package/dist/{LocalizationProvider-Cqattc3O.js.map → LocalizationProvider-u6xdKCBi.js.map} +1 -1
  128. package/dist/LocalizationProvider.js +1 -1
  129. package/dist/{Menu-CBbUK_sX.js → Menu-DUAfSImY.js} +4 -4
  130. package/dist/{Menu-CBbUK_sX.js.map → Menu-DUAfSImY.js.map} +1 -1
  131. package/dist/Menu.js +1 -1
  132. package/dist/{NumberField-CNskrtsN.js → NumberField-C62E56_v.js} +7 -7
  133. package/dist/{NumberField-CNskrtsN.js.map → NumberField-C62E56_v.js.map} +1 -1
  134. package/dist/NumberField.js +1 -1
  135. package/dist/Overflow.js +2 -3
  136. package/dist/Overflow.js.map +1 -1
  137. package/dist/{Page-4VdFrCjy.js → Page-CGZQ-nsg.js} +15 -15
  138. package/dist/Page-CGZQ-nsg.js.map +1 -0
  139. package/dist/Page.js +1 -1
  140. package/dist/{Pagination-CQjNN1yN.js → Pagination-BHEEnNas.js} +6 -6
  141. package/dist/{Pagination-CQjNN1yN.js.map → Pagination-BHEEnNas.js.map} +1 -1
  142. package/dist/Pagination.js +1 -1
  143. package/dist/{Popover--c9PXAVi.js → Popover-CIPg_ZgX.js} +5 -4
  144. package/dist/Popover-CIPg_ZgX.js.map +1 -0
  145. package/dist/Popover.js +1 -1
  146. package/dist/{ProgressBar-CXMuhBQV.js → ProgressBar-CUpF9fFW.js} +6 -6
  147. package/dist/{ProgressBar-CXMuhBQV.js.map → ProgressBar-CUpF9fFW.js.map} +1 -1
  148. package/dist/ProgressBar.js +1 -1
  149. package/dist/{Radio-CTYs8JpI.js → Radio-CyCFna1X.js} +2 -2
  150. package/dist/{Radio-CTYs8JpI.js.map → Radio-CyCFna1X.js.map} +1 -1
  151. package/dist/Radio.js +2 -2
  152. package/dist/{RadioGroup-BVGnsTuG.js → RadioGroup-DRS2EjVH.js} +5 -5
  153. package/dist/{RadioGroup-BVGnsTuG.js.map → RadioGroup-DRS2EjVH.js.map} +1 -1
  154. package/dist/{SearchField-DLqva3o3.js → SearchField-DrgNbG3I.js} +3 -3
  155. package/dist/{SearchField-DLqva3o3.js.map → SearchField-DrgNbG3I.js.map} +1 -1
  156. package/dist/SearchField.js +1 -1
  157. package/dist/{SegmentedControl-1OzOQmCp.js → SegmentedControl-C-QOwO7q.js} +2 -2
  158. package/dist/{SegmentedControl-1OzOQmCp.js.map → SegmentedControl-C-QOwO7q.js.map} +1 -1
  159. package/dist/SegmentedControl.js +1 -1
  160. package/dist/{SelectCard-Dw7zW0UN.js → SelectCard-lBcnP5j5.js} +4 -4
  161. package/dist/{SelectCard-Dw7zW0UN.js.map → SelectCard-lBcnP5j5.js.map} +1 -1
  162. package/dist/SelectCard.js +1 -1
  163. package/dist/{SelectTrigger-BQNqyG3M.js → SelectTrigger-qvoGCkb1.js} +5 -5
  164. package/dist/{SelectTrigger-BQNqyG3M.js.map → SelectTrigger-qvoGCkb1.js.map} +1 -1
  165. package/dist/SelectTrigger.js +1 -1
  166. package/dist/{SelectTriggerBase-B-fxog4U.js → SelectTriggerBase-C4gebtca.js} +6 -6
  167. package/dist/{SelectTriggerBase-B-fxog4U.js.map → SelectTriggerBase-C4gebtca.js.map} +1 -1
  168. package/dist/{SideNav-COiPAIph.js → SideNav-B1sH17Uc.js} +3 -3
  169. package/dist/{SideNav-COiPAIph.js.map → SideNav-B1sH17Uc.js.map} +1 -1
  170. package/dist/SideNav.js +1 -1
  171. package/dist/Skeleton.js +1 -1
  172. package/dist/{Stepper-xcgOQzru.js → Stepper-B0U_YrbZ.js} +4 -4
  173. package/dist/{Stepper-xcgOQzru.js.map → Stepper-B0U_YrbZ.js.map} +1 -1
  174. package/dist/Stepper.js +1 -1
  175. package/dist/{Switch-mhyHJeex.js → Switch-DjL2CsQi.js} +5 -5
  176. package/dist/{Switch-mhyHJeex.js.map → Switch-DjL2CsQi.js.map} +1 -1
  177. package/dist/Switch.js +1 -1
  178. package/dist/{Tab-BISlFW_i.js → Tab-6UavokJJ.js} +3 -3
  179. package/dist/{Tab-BISlFW_i.js.map → Tab-6UavokJJ.js.map} +1 -1
  180. package/dist/Tab.js +1 -1
  181. package/dist/Table.js +1 -1
  182. package/dist/{Text-CDzLZl1O.js → Text-kPA-VzsB.js} +2 -2
  183. package/dist/{Text-CDzLZl1O.js.map → Text-kPA-VzsB.js.map} +1 -1
  184. package/dist/Text.js +1 -1
  185. package/dist/{TextField-CUrYEZR4.js → TextField-DOSwy_gm.js} +2 -2
  186. package/dist/{TextField-CUrYEZR4.js.map → TextField-DOSwy_gm.js.map} +1 -1
  187. package/dist/{TextField-DPTJjF8V.js → TextField-DcyjojNg.js} +4 -4
  188. package/dist/{TextField-DPTJjF8V.js.map → TextField-DcyjojNg.js.map} +1 -1
  189. package/dist/TextField.js +1 -1
  190. package/dist/{Textarea-f0jAKcvn.js → Textarea-DacevzmW.js} +4 -4
  191. package/dist/{Textarea-f0jAKcvn.js.map → Textarea-DacevzmW.js.map} +1 -1
  192. package/dist/Textarea.js +1 -1
  193. package/dist/{ThemeProvider-CUiXHn4p.js → ThemeProvider-Bmsz__5N.js} +2 -2
  194. package/dist/{ThemeProvider-CUiXHn4p.js.map → ThemeProvider-Bmsz__5N.js.map} +1 -1
  195. package/dist/ThemeProvider.js +1 -1
  196. package/dist/{TimeField-CGSwrpl0.js → TimeField-C4s8fjDG.js} +7 -7
  197. package/dist/{TimeField-CGSwrpl0.js.map → TimeField-C4s8fjDG.js.map} +1 -1
  198. package/dist/TimeField.js +1 -1
  199. package/dist/Toast.js +2 -2
  200. package/dist/{Toaster-C6iB4h0P.js → Toaster-BxbR-XcR.js} +2 -2
  201. package/dist/{Toaster-C6iB4h0P.js.map → Toaster-BxbR-XcR.js.map} +1 -1
  202. package/dist/{Toaster-D72xHdfH.js → Toaster-Dg7M4W4U.js} +4 -4
  203. package/dist/{Toaster-D72xHdfH.js.map → Toaster-Dg7M4W4U.js.map} +1 -1
  204. package/dist/{Toolbar-CcJa_YpH.js → Toolbar-BvFwcXOk.js} +20 -20
  205. package/dist/{Toolbar-CcJa_YpH.js.map → Toolbar-BvFwcXOk.js.map} +1 -1
  206. package/dist/Toolbar.js +1 -1
  207. package/dist/{Tooltip-BOfdwyTv.js → Tooltip-CZsoFe6C.js} +2 -2
  208. package/dist/{Tooltip-BOfdwyTv.js.map → Tooltip-CZsoFe6C.js.map} +1 -1
  209. package/dist/Tooltip.js +1 -1
  210. package/dist/YearlessDateInputWithPicker-MHLlAdrH.js +949 -0
  211. package/dist/YearlessDateInputWithPicker-MHLlAdrH.js.map +1 -0
  212. package/dist/YearlessDateInputWithPicker.css +199 -0
  213. package/dist/beta/components/Table/DataTable/DataTable.d.ts +4 -4
  214. package/dist/beta/components/Table/DataTable/internal/useAsyncData.d.ts +5 -0
  215. package/dist/beta.js +4 -4
  216. package/dist/components/DateFieldYearless/DateFieldYearless.d.ts +57 -3
  217. package/dist/components/DateFieldYearless/internal/PickerList.d.ts +61 -0
  218. package/dist/components/DateFieldYearless/internal/PickerListOption.d.ts +61 -0
  219. package/dist/components/DateFieldYearless/internal/YearlessDateInput.d.ts +51 -0
  220. package/dist/components/DateFieldYearless/internal/YearlessDateInputWithPicker.d.ts +134 -0
  221. package/dist/components/DateFieldYearless/internal/YearlessDateSelectionPopover.d.ts +27 -0
  222. package/dist/components/DateFieldYearless/internal/maskito/yearlessDatePlaceholderMask.d.ts +3 -1
  223. package/dist/components/DateFieldYearless/internal/maskito/yearlessDateSegmentsStepping.d.ts +12 -0
  224. package/dist/components/DateFieldYearless/internal/utils.d.ts +50 -1
  225. package/dist/components/DateFieldYearlessRange/DateFieldYearlessRange.d.ts +59 -0
  226. package/dist/components/DateFieldYearlessRange/index.d.ts +1 -0
  227. package/dist/components/FieldLabel/FieldLabel.d.ts +9 -48
  228. package/dist/components/FieldLabel/internal/FieldLabelMoreInfoIcon.d.ts +3 -1
  229. package/dist/components/Popover/Popover.d.ts +1 -0
  230. package/dist/components/Popover/PopoverContent.d.ts +8 -0
  231. package/dist/components/index.d.ts +1 -0
  232. package/dist/{index-CUVkL0hr.js → index-B25zeBIC.js} +3 -3
  233. package/dist/{index-CUVkL0hr.js.map → index-B25zeBIC.js.map} +1 -1
  234. package/dist/{index.esm-BwMVvxTV.js → index.esm-C2ZhC_8d.js} +2 -2
  235. package/dist/{index.esm-BwMVvxTV.js.map → index.esm-C2ZhC_8d.js.map} +1 -1
  236. package/dist/index.js +68 -67
  237. package/dist/index.js.map +1 -1
  238. package/dist/{useLayoutPropsUtil-C7FVYB8F.js → useLayoutPropsUtil-BlIWftBb.js} +2 -2
  239. package/dist/{useLayoutPropsUtil-C7FVYB8F.js.map → useLayoutPropsUtil-BlIWftBb.js.map} +1 -1
  240. package/dist/{utils-CyPyKUVh.js → utils-B8bmyfFR.js} +2 -2
  241. package/dist/{utils-CyPyKUVh.js.map → utils-B8bmyfFR.js.map} +1 -1
  242. package/package.json +2 -1
  243. package/dist/DataTable-xUON92DR.js.map +0 -1
  244. package/dist/DateFieldYearless-BXRgNWzy.js +0 -266
  245. package/dist/DateFieldYearless-BXRgNWzy.js.map +0 -1
  246. package/dist/FieldLabel-DIlzcPIQ.js.map +0 -1
  247. package/dist/Page-4VdFrCjy.js.map +0 -1
  248. package/dist/Popover--c9PXAVi.js.map +0 -1
  249. package/dist/components/DateFieldYearless/internal/MaskedYearlessDateInput.d.ts +0 -35
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar-CcJa_YpH.js","sources":["../src/internal/hooks/useContainerQuery/useContainerQuery.ts","../src/beta/components/Toolbar/internal/ToolbarItemOverflowContext.tsx","../src/beta/components/Toolbar/internal/ToolbarOverflowContext.tsx","../src/beta/components/Toolbar/internal/utils/accessibility.ts","../src/beta/components/Toolbar/internal/ToolbarItemWrapper.tsx","../src/beta/components/Toolbar/ToolbarButton.tsx","../src/beta/components/Toolbar/ToolbarButtonToggle.tsx","../src/beta/components/Toolbar/ToolbarButtonLink.tsx","../src/beta/components/Toolbar/ToolbarSelect.tsx","../src/beta/components/Toolbar/internal/ToolbarOverflowMenu.tsx","../src/beta/components/Toolbar/Filters/internal/FilterGroupContext.tsx","../src/beta/components/Toolbar/Filters/FilterItemWrapper.tsx","../src/beta/components/Toolbar/Filters/internal/utils/filter-state.ts","../src/beta/components/Toolbar/Filters/FilterToggleButton.tsx","../src/beta/components/Toolbar/Filters/FilterSelect.tsx","../src/beta/components/Toolbar/Filters/FilterDateSingle.tsx","../src/beta/components/Toolbar/Filters/FilterDateRange.tsx","../src/beta/components/Toolbar/Filters/FilterButton.tsx","../src/beta/components/Toolbar/ToolbarControlGroup.tsx","../../hammer-icon/mdi/round/tune.svg","../src/beta/components/Toolbar/Filters/FilterDrawer.tsx","../src/beta/components/Toolbar/Filters/FilterGroup.tsx","../src/beta/components/Toolbar/ToolbarSearchField.tsx","../src/beta/components/Toolbar/Toolbar.tsx"],"sourcesContent":["import { useEffect, useState, RefObject } from \"react\";\nimport { core } from \"@servicetitan/hammer-token\";\n\n/**\n * Return type for the useContainerQuery hook\n */\nexport type ContainerQueryReturnProps = {\n /**\n * The breakpoint name\n */\n name: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\";\n /**\n * Minimum width for this breakpoint\n */\n min: number | undefined;\n /**\n * Maximum width for this breakpoint\n */\n max: number | undefined;\n /**\n * Current container width\n */\n containerWidth: number;\n /**\n * Current container height\n */\n containerHeight: number;\n};\n\n/**\n * Determines if the current container width matches a specific breakpoint\n * @param containerWidth - The container width\n * @param name - The breakpoint name\n * @param min - Minimum width for this breakpoint\n * @param max - Maximum width for this breakpoint\n * @returns Breakpoint information if matched, undefined otherwise\n */\nfunction containerBreakpoint(\n containerWidth: number,\n name: ContainerQueryReturnProps[\"name\"],\n min?: number,\n max?: number,\n): ContainerQueryReturnProps | undefined {\n if (\n (min == null || containerWidth >= min) &&\n (max == null || containerWidth < max)\n ) {\n return {\n name,\n min,\n max,\n containerWidth,\n containerHeight: 0, // Will be updated with actual height\n } as const;\n }\n return undefined;\n}\n\n/**\n * Determines the current breakpoint based on container width and hammer-token breakpoint values.\n *\n * Features:\n * - Validates that all required hammer-token breakpoint values are available\n * - Uses cascade logic to determine the appropriate breakpoint\n * - Returns the first matching breakpoint in order of preference\n * - Handles edge cases where breakpoint values are missing\n * - Uses container dimensions for accurate measurements\n * - Supports all standard breakpoints (xs, sm, md, lg, xl, xxl)\n *\n * @param containerWidth - The width of the container element\n * @param containerHeight - The height of the container element\n * @returns Current breakpoint information or undefined if breakpoint values are unavailable\n */\nconst getContainerBreakpoint = (\n containerWidth: number,\n containerHeight: number,\n) => {\n if (!core.primitive?.BreakpointSm) return;\n if (!core.primitive?.BreakpointMd) return;\n if (!core.primitive?.BreakpointLg) return;\n if (!core.primitive?.BreakpointXl) return;\n if (!core.primitive?.BreakpointXxl) return;\n\n const sm = parseInt(core.primitive?.BreakpointSm.value);\n const md = parseInt(core.primitive?.BreakpointMd.value);\n const lg = parseInt(core.primitive?.BreakpointLg.value);\n const xl = parseInt(core.primitive?.BreakpointXl.value);\n const xxl = parseInt(core.primitive?.BreakpointXxl.value);\n\n const result =\n containerBreakpoint(containerWidth, \"xs\", undefined, sm) ??\n containerBreakpoint(containerWidth, \"sm\", sm, md) ??\n containerBreakpoint(containerWidth, \"md\", md, lg) ??\n containerBreakpoint(containerWidth, \"lg\", lg, xl) ??\n containerBreakpoint(containerWidth, \"xl\", xl, xxl) ??\n containerBreakpoint(containerWidth, \"xxl\", xxl, undefined);\n\n return result ? { ...result, containerHeight } : undefined;\n};\n\n/**\n * Custom hook for detecting current breakpoint based on container dimensions.\n *\n * Features:\n * - Detects current breakpoint based on container width instead of viewport width\n * - Supports all standard breakpoints (xs, sm, md, lg, xl, xxl)\n * - Provides container dimensions information\n * - Uses hammer-token breakpoint values for consistency\n * - Listens for container resize events using ResizeObserver\n * - Supports optional disable functionality\n * - Uses container element dimensions for accurate measurements\n *\n * @param containerRef - React ref to the container element to observe\n * @param props - Optional configuration object\n * @param props.disable - Whether to disable the hook\n * @returns Current breakpoint information or undefined if disabled\n */\nexport const useContainerQuery = (\n containerRef: RefObject<HTMLElement>,\n props?: { disable?: boolean },\n) => {\n const [size, setSize] = useState<ContainerQueryReturnProps | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (props?.disable || !containerRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n const breakpoint = getContainerBreakpoint(width, height);\n setSize(breakpoint);\n }\n });\n\n resizeObserver.observe(containerRef.current);\n\n // Set initial size\n const rect = containerRef.current.getBoundingClientRect();\n setSize(getContainerBreakpoint(rect.width, rect.height));\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [containerRef, props?.disable]);\n\n if (props?.disable) return undefined;\n return size;\n};\n","import { createContext, useContext } from \"react\";\n\n/**\n * Context for denoting if the current item is rendered in the overflow menu\n */\ntype OverflowItemContextType = {\n /**\n * Whether the current item is rendered inside the overflow menu\n */\n isInOverflowMenu: boolean;\n};\n\n/**\n * Context for managing overflow menu state\n */\nexport const OverflowItemContext = createContext<OverflowItemContextType>({\n isInOverflowMenu: false,\n});\n\n/**\n * Hook for accessing overflow menu context\n * @returns OverflowItemContextType - The overflow menu context\n */\nexport const useOverFlowItemContext = () => useContext(OverflowItemContext);\n","import { createContext, RefObject } from \"react\";\nimport { ToolbarItemProps, ToolbarOverflowTypes } from \"../types\";\n\n/**\n * Context for sharing toolbar state with child components for overflow handling\n */\nexport type ToolbarOverFlowContextProps = {\n /**\n * Array of toolbar items that should appear in the overflow menu\n */\n overflowItems: ToolbarItemProps[];\n /**\n * Function to add an item to the overflow menu\n */\n addItem: (element: ToolbarItemProps) => void;\n /**\n * Function to remove an item from the overflow menu\n */\n removeItem: (element: ToolbarItemProps) => void;\n /**\n * Reference to the toolbar container element\n */\n toolbarRef: RefObject<HTMLDivElement>;\n /**\n * Array of item IDs in their original order\n */\n orderedIds?: string[];\n /**\n * Overflow behavior type (wrap or collapse)\n */\n overflow: ToolbarOverflowTypes;\n};\n\n/**\n * Context for managing toolbar overflow state and operations\n */\nexport const ToolbarOverflowContext =\n createContext<ToolbarOverFlowContextProps>({\n overflowItems: [],\n addItem: () => {\n return;\n },\n removeItem: () => {\n return;\n },\n toolbarRef: { current: null },\n orderedIds: [],\n overflow: \"wrap\",\n });\n","import { KeyboardEvent } from \"react\";\nimport { getKeyboardFocusableElements } from \"../../../../../internal/functions\";\n\n/**\n * Gets all visible focusable elements for a specific toolbar instance.\n * Filters out hidden items and includes the overflow trigger if present.\n */\nexport function getToolbarElements(toolbarElement: HTMLElement) {\n const toolbarContent = toolbarElement.querySelector<HTMLElement>(\n '[data-anv=\"toolbar-content\"]',\n );\n\n const mainItems = getKeyboardFocusableElements(toolbarContent).filter(\n (item) => {\n // Only include visible items that are explicitly marked as toolbar items\n const isHidden = !item.closest('[aria-hidden=\"true\"]');\n const isInDrawer = !item.closest('[data-anv=\"filter-group-drawer\"]');\n const isInPopover = !item.closest('[data-anv=\"popover-content\"]');\n return isHidden && isInDrawer && isInPopover;\n },\n );\n\n const overflowTrigger = toolbarElement.querySelector<HTMLElement>(\n '[data-anv=\"toolbar-overflow-trigger\"]',\n );\n\n return overflowTrigger ? [...mainItems, overflowTrigger] : mainItems;\n}\n\n/**\n * Updates tabindex values for all items in a toolbar.\n * Sets tabindex=\"0\" for the active item and tabindex=\"-1\" for all others.\n */\nexport function updateToolbarItemsTabIndex(\n toolbarElement: HTMLElement,\n activeItem?: Element | number,\n) {\n if (!toolbarElement) return;\n\n // Get all toolbar items\n const items = getToolbarElements(toolbarElement);\n if (!items.length) return;\n\n // Determine the active index - default to the first item\n let activeIndex = 0;\n\n if (typeof activeItem === \"number\") {\n // If activeItem is a number, use it directly\n activeIndex = Math.max(0, Math.min(activeItem, items.length - 1));\n } else if (activeItem instanceof Element) {\n // If activeItem is an element, find its index\n const foundIndex = items.indexOf(activeItem);\n if (foundIndex !== -1) {\n activeIndex = foundIndex;\n }\n }\n\n // Update tabindex values\n items.forEach((item, index) => {\n item.setAttribute(\"tabindex\", index === activeIndex ? \"0\" : \"-1\");\n });\n\n return items[activeIndex];\n}\n\n/**\n * Handles keyboard navigation within the toolbar component following ARIA practices.\n *\n * Navigation behavior:\n * - Left/Right arrows move focus in horizontal toolbars\n * - Up/Down arrows move focus in vertical toolbars\n * - Home/End move to first/last items\n * - Navigation wraps around at the ends\n * - Only visible items are included in navigation\n */\nexport function handleToolbarKeyDown(\n event: KeyboardEvent<HTMLElement>,\n toolbarElement: HTMLElement,\n) {\n if (!toolbarElement || event.altKey || event.ctrlKey || event.metaKey) return;\n\n const items = getToolbarElements(toolbarElement);\n if (!items.length) return;\n\n const activeElement = event.target as HTMLElement;\n if (!toolbarElement.contains(activeElement)) return;\n\n const activeItem = items.find(\n (item) =>\n item === activeElement ||\n Array.from(item.children).some((child) => child === activeElement),\n );\n\n const activeIndex = activeItem ? items.indexOf(activeItem) : -1;\n if (activeIndex === -1) return;\n\n let nextIndex = activeIndex;\n const isVertical =\n toolbarElement.getAttribute(\"aria-orientation\") === \"vertical\";\n\n switch (event.key) {\n case \"ArrowLeft\":\n case \"ArrowUp\":\n event.preventDefault();\n if (\n (isVertical && event.key === \"ArrowUp\") ||\n (!isVertical && event.key === \"ArrowLeft\")\n ) {\n nextIndex = activeIndex <= 0 ? items.length - 1 : activeIndex - 1;\n }\n break;\n\n case \"ArrowRight\":\n case \"ArrowDown\":\n event.preventDefault();\n if (\n (isVertical && event.key === \"ArrowDown\") ||\n (!isVertical && event.key === \"ArrowRight\")\n ) {\n nextIndex = activeIndex >= items.length - 1 ? 0 : activeIndex + 1;\n }\n break;\n\n case \"Home\":\n event.preventDefault();\n nextIndex = 0;\n break;\n\n case \"End\":\n event.preventDefault();\n nextIndex = items.length - 1;\n break;\n\n default:\n return;\n }\n\n updateToolbarItemsTabIndex(toolbarElement, nextIndex);\n (items[nextIndex] as HTMLElement)?.focus();\n}\n\n/**\n * Handles keyboard navigation within overflow menu using arrow keys\n */\nexport const handleMenuKeyboardNavigation = (\n event: KeyboardEvent<HTMLUListElement>,\n) => {\n const menuItems = Array.from(\n event.currentTarget.querySelectorAll('[role=\"menuitem\"]'),\n ).map((menuItem) => {\n // Get first focusable element or fallback to menuitem itself\n return getKeyboardFocusableElements(menuItem as HTMLElement)[0] || menuItem;\n });\n\n if (!menuItems.length) return;\n\n const currentIndex = menuItems.indexOf(document.activeElement as HTMLElement);\n if (currentIndex === -1) return;\n\n let nextIndex = currentIndex;\n const isModifierKey = event.altKey || event.ctrlKey || event.metaKey;\n\n if (isModifierKey) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n event.preventDefault();\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n nextIndex =\n (currentIndex + direction + menuItems.length) % menuItems.length;\n break;\n }\n case \"Home\":\n event.preventDefault();\n nextIndex = 0;\n break;\n case \"End\":\n event.preventDefault();\n nextIndex = menuItems.length - 1;\n break;\n default:\n return;\n }\n\n (menuItems[nextIndex] as HTMLElement)?.focus();\n};\n","import { useContext, useEffect, useId, useRef, useCallback } from \"react\";\nimport { ToolbarItemProps } from \"../types\";\nimport { ToolbarOverflowContext } from \"./ToolbarOverflowContext\";\nimport { useIntersectionObserver } from \"../../../../internal/hooks\";\nimport { updateToolbarItemsTabIndex } from \"./utils/accessibility\";\n\nimport cx from \"classnames\";\nimport styles from \"../Toolbar.module.scss\";\n\n/**\n * Props for the ToolbarItemWrapper component\n */\nexport type ToolbarItemWrapperProps = {\n /**\n * Toolbar item configuration without ID (ID is generated internally)\n */\n item: Omit<ToolbarItemProps, \"id\">;\n /**\n * The toolbar item component to wrap\n */\n children: React.ReactNode;\n /** Optional override for the intersection observer root element */\n observerRoot?: Element | null;\n /** Optional override for visibility change handling */\n onVisibilityChange?: (isVisible: boolean) => void;\n /** Optional margin offset for the intersection observer root */\n rootMargin?: string;\n /** Optional class name to apply to the wrapper element */\n className?: string;\n};\n\n/**\n * ToolbarItemWrapper manages item visibility and focus behavior within a toolbar.\n *\n * Features:\n * - Intersection observation for overflow detection\n * - Automatic overflow menu integration in collapse mode\n * - Focus management and keyboard navigation\n * - ARIA compliance for accessibility\n * - Visibility state management\n * - Proper tab index handling\n * - Context integration with toolbar state\n *\n * @example\n * <ToolbarItemWrapper item={{ itemType: \"button\", itemProps: buttonProps }}>\n * <ToolbarButton {...buttonProps} />\n * </ToolbarItemWrapper>\n */\nexport const ToolbarItemWrapper = ({\n item,\n children,\n observerRoot,\n onVisibilityChange,\n rootMargin,\n className,\n}: ToolbarItemWrapperProps) => {\n const { addItem, removeItem, toolbarRef, overflow } = useContext(\n ToolbarOverflowContext,\n );\n const itemId = useId();\n const elementRef = useRef<HTMLDivElement | null>(null);\n const isCollapseMode = overflow === \"collapse\";\n const prevIntersectingRef = useRef<boolean>(true); // Start as visible\n\n /**\n * Handles visibility changes from intersection observer in collapse mode\n * In collapse mode:\n * - When item becomes visible, removes it from overflow menu\n * - When item becomes hidden, adds it to overflow menu\n */\n const handleVisibilityChange = useCallback(\n (isVisible: boolean) => {\n if (!isCollapseMode || prevIntersectingRef.current === isVisible) return;\n\n if (onVisibilityChange) {\n onVisibilityChange(isVisible);\n } else if (item) {\n const itemWithId = { ...item, id: itemId };\n if (isVisible) {\n removeItem(itemWithId);\n } else {\n addItem(itemWithId);\n }\n }\n prevIntersectingRef.current = isVisible;\n },\n [isCollapseMode, onVisibilityChange, item, itemId, addItem, removeItem],\n );\n\n const { isIntersecting, ref } = useIntersectionObserver({\n root: isCollapseMode ? (observerRoot ?? toolbarRef.current) : null,\n threshold: 1,\n initialIsIntersecting: true, // Start as visible\n onChange: handleVisibilityChange,\n rootMargin,\n });\n\n const setRefCallback = useCallback(\n (node: HTMLDivElement | null) => {\n elementRef.current = node;\n // Only set up intersection observer in collapse mode\n if (isCollapseMode) {\n ref(node);\n }\n },\n [ref, isCollapseMode],\n );\n\n /**\n * Manages focus behavior between toolbar items using accessibility utils\n * - Uses updateToolbarItemsTabIndex to manage focus state\n * - Ensures proper keyboard navigation support\n * - Maintains ARIA compliance for focus management\n */\n const handleFocusOrClick = useCallback(() => {\n if (!toolbarRef.current || !elementRef.current) return;\n\n const currentElement = elementRef.current.querySelector(\"button, a, input\");\n if (!currentElement) return;\n\n updateToolbarItemsTabIndex(toolbarRef.current, currentElement);\n }, [toolbarRef]);\n\n // Set up focus management\n useEffect(() => {\n const interactiveEl = elementRef.current?.querySelector(\"button, a, input\");\n if (!interactiveEl) return;\n\n interactiveEl.addEventListener(\"focus\", handleFocusOrClick);\n interactiveEl.addEventListener(\"click\", handleFocusOrClick);\n\n return () => {\n interactiveEl.removeEventListener(\"focus\", handleFocusOrClick);\n interactiveEl.removeEventListener(\"click\", handleFocusOrClick);\n };\n }, [handleFocusOrClick]);\n\n const toolbarItemClassName = cx(styles[\"toolbar-item\"], className);\n const isHidden = isCollapseMode && !isIntersecting;\n\n return (\n <div\n ref={setRefCallback}\n className={toolbarItemClassName}\n style={{ visibility: isHidden ? \"hidden\" : \"visible\" }}\n aria-hidden={isHidden}\n {...{ inert: isHidden ? \"\" : undefined }}\n data-id={itemId}\n data-anv=\"toolbar-item\"\n >\n {children}\n </div>\n );\n};\n","import { forwardRef } from \"react\";\nimport Button, { ButtonProps } from \"../../../components/Button\";\nimport { ToolbarItemAppearance, WithAriaLabelEnforcement } from \"./types\";\nimport { DataTrackingId } from \"../../../types\";\nimport { useOverFlowItemContext } from \"./internal/ToolbarItemOverflowContext\";\nimport Tooltip from \"../../../components/Tooltip\";\nimport { ToolbarItemWrapper } from \"./internal/ToolbarItemWrapper\";\nimport { useTrackingId } from \"../../../hooks\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Base props for the ToolbarButton component\n * @extends Omit<ButtonProps, \"appearance\" | \"aria-label\" | \"children\">\n */\ntype ToolbarButtonBaseProps = Omit<\n ButtonProps,\n \"appearance\" | \"aria-label\" | \"children\"\n> & {\n /**\n * Visual appearance of the button\n * @default ghost\n */\n appearance?: ToolbarItemAppearance;\n};\n\n/**\n * Props for the ToolbarButton component\n * @extends WithAriaLabelEnforcement<ToolbarButtonBaseProps>\n */\nexport type ToolbarButtonProps =\n WithAriaLabelEnforcement<ToolbarButtonBaseProps> & DataTrackingId;\n\n/**\n * ToolbarButton component for standard clickable actions within a toolbar.\n *\n * Features:\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Automatic tooltip for icon-only buttons\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n *\n * @example\n * <ToolbarButton icon={BoldIcon} aria-label=\"Bold text\" />\n *\n * @example\n * <ToolbarButton appearance=\"primary\">\n * Save\n * </ToolbarButton>\n */\nexport const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n (props, _ref) => {\n const { appearance = \"ghost\", className, children, ...rest } = props;\n\n // Checks if this component is rendered inside the overflow menu and fallbacks when the context is unavailable\n const { isInOverflowMenu = false } = useOverFlowItemContext?.() || {};\n\n const trackingId = useTrackingId({\n name: \"ToolbarButton\",\n data: {\n disabled: props.disabled,\n \"aria-label\": props[\"aria-label\"],\n children: props.children,\n },\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const buttonClassNames = cx(className, styles[\"toolbar-button-item\"]);\n\n const item = children ? (\n <Button\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n data-anv=\"toolbar-button\"\n className={buttonClassNames}\n {...rest}\n >\n {children}\n </Button>\n ) : (\n <Tooltip>\n <Tooltip.Trigger>\n <Button\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n data-anv=\"toolbar-button\"\n className={buttonClassNames}\n {...rest}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>{rest[\"aria-label\"]}</Tooltip.Content>\n </Tooltip>\n );\n\n if (isInOverflowMenu) {\n return item;\n }\n\n return (\n <ToolbarItemWrapper item={{ itemProps: props, itemType: \"button\" }}>\n {item}\n </ToolbarItemWrapper>\n );\n },\n);\n\nToolbarButton.displayName = \"ToolbarButton\";\n","import { forwardRef } from \"react\";\nimport ButtonToggle, {\n ButtonToggleProps,\n} from \"../../../components/ButtonToggle\";\nimport { WithAriaLabelEnforcement } from \"./types\";\nimport { DataTrackingId } from \"../../../types\";\nimport { useOverFlowItemContext } from \"./internal/ToolbarItemOverflowContext\";\nimport Tooltip from \"../../../components/Tooltip\";\nimport { ToolbarItemWrapper } from \"./internal/ToolbarItemWrapper\";\nimport { useTrackingId } from \"../../../hooks\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Base props for the ToolbarButtonToggle component\n * @extends Omit<ButtonToggleProps, \"aria-label\" | \"children\">\n */\ntype ToolbarButtonToggleBaseProps = Omit<\n ButtonToggleProps,\n \"aria-label\" | \"children\"\n> & {\n /**\n * Is this toolbar control a filter?\n */\n isFilter?: boolean;\n};\n\n/**\n * Props for the ToolbarButtonToggle component\n * @extends WithAriaLabelEnforcement<ToolbarButtonToggleBaseProps>\n */\nexport type ToolbarButtonToggleProps =\n WithAriaLabelEnforcement<ToolbarButtonToggleBaseProps> & DataTrackingId;\n\n/**\n * ToolbarButtonToggle component for toggleable actions within a toolbar.\n *\n * Features:\n * - Toggle state management (on/off)\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Automatic tooltip for icon-only toggles\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Visual feedback for toggle state\n * - Proper ARIA attributes for toggle semantics\n *\n * @example\n * <ToolbarButtonToggle icon={BoldIcon} aria-label=\"Bold\" checked={isBold} />\n *\n * @example\n * <ToolbarButtonToggle checked={isItalic}>\n * Italic\n * </ToolbarButtonToggle>\n */\nexport const ToolbarButtonToggle = forwardRef<\n HTMLButtonElement,\n ToolbarButtonToggleProps\n>((props, _ref) => {\n const { className, children, isFilter, ...rest } = props;\n\n // Checks if this component is rendered inside the overflow menu and fallbacks when the context is unavailable\n const { isInOverflowMenu = false } = useOverFlowItemContext?.() || {};\n\n const trackingId = useTrackingId({\n name: \"ToolbarButtonToggle\",\n data: {\n checked: props.checked,\n disabled: props.disabled,\n \"aria-label\": props[\"aria-label\"],\n children: props.children,\n },\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const buttonToggleClassNames = cx(\n className,\n styles[\"toolbar-button-item\"],\n styles[\"toolbar-button-toggle-item\"],\n );\n\n const item = children ? (\n <ButtonToggle\n data-tracking-id={trackingId}\n size=\"small\"\n data-anv=\"toolbar-button-toggle\"\n className={buttonToggleClassNames}\n {...rest}\n >\n {children}\n </ButtonToggle>\n ) : (\n <Tooltip>\n <Tooltip.Trigger>\n <ButtonToggle\n data-tracking-id={trackingId}\n size=\"small\"\n data-anv=\"toolbar-button-toggle\"\n className={buttonToggleClassNames}\n {...rest}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>{rest[\"aria-label\"]}</Tooltip.Content>\n </Tooltip>\n );\n\n if (isInOverflowMenu || isFilter) {\n return item;\n }\n\n return (\n <ToolbarItemWrapper item={{ itemProps: props, itemType: \"buttonToggle\" }}>\n {item}\n </ToolbarItemWrapper>\n );\n});\n\nToolbarButtonToggle.displayName = \"ToolbarButtonToggle\";\n","import { forwardRef } from \"react\";\nimport ButtonLink, { ButtonLinkProps } from \"../../../components/ButtonLink\";\nimport { ToolbarItemAppearance, WithAriaLabelEnforcement } from \"./types\";\nimport { DataTrackingId } from \"../../../types\";\nimport { useOverFlowItemContext } from \"./internal/ToolbarItemOverflowContext\";\nimport Tooltip from \"../../../components/Tooltip\";\nimport { ToolbarItemWrapper } from \"./internal/ToolbarItemWrapper\";\nimport { useTrackingId } from \"../../../hooks\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Base props for the ToolbarButtonLink component\n * @extends Omit<ButtonLinkProps, \"appearance\" | \"aria-label\" | \"children\">\n */\ntype ToolbarButtonLinkBaseProps = Omit<\n ButtonLinkProps,\n \"appearance\" | \"aria-label\" | \"children\"\n> & {\n /**\n * Visual appearance of the button link\n * @default ghost\n */\n appearance?: ToolbarItemAppearance;\n};\n\n/**\n * Props for the ToolbarButtonLink component\n * @extends WithAriaLabelEnforcement<ToolbarButtonLinkBaseProps>\n */\nexport type ToolbarButtonLinkProps =\n WithAriaLabelEnforcement<ToolbarButtonLinkBaseProps> & DataTrackingId;\n\n/**\n * ToolbarButtonLink component for link actions within a toolbar.\n *\n * Features:\n * - Link functionality with href support\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Automatic tooltip for icon-only links\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Proper anchor element semantics\n *\n * @example\n * <ToolbarButtonLink href=\"/help\">\n * Help\n * </ToolbarButtonLink>\n *\n * @example\n * <ToolbarButtonLink icon={ExternalLinkIcon} href=\"/docs\" aria-label=\"Documentation\" />\n */\nexport const ToolbarButtonLink = forwardRef<\n HTMLAnchorElement,\n ToolbarButtonLinkProps\n>((props, _ref) => {\n const { appearance = \"ghost\", className, children, ...rest } = props;\n\n // Checks if this component is rendered inside the overflow menu and fallbacks when the context is unavailable\n const { isInOverflowMenu = false } = useOverFlowItemContext?.() || {};\n\n const trackingId = useTrackingId({\n name: \"ToolbarButtonLink\",\n data: {\n href: props.href,\n disabled: props.disabled,\n \"aria-label\": props[\"aria-label\"],\n children: props.children,\n target: props.target,\n },\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const buttonLinkClassNames = cx(className, styles[\"toolbar-button-item\"]);\n\n const item = children ? (\n <ButtonLink\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n data-anv=\"toolbar-button-link\"\n className={buttonLinkClassNames}\n {...rest}\n >\n {children}\n </ButtonLink>\n ) : (\n <Tooltip>\n <Tooltip.Trigger>\n <ButtonLink\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n data-anv=\"toolbar-button-link\"\n className={buttonLinkClassNames}\n {...rest}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>{rest[\"aria-label\"]}</Tooltip.Content>\n </Tooltip>\n );\n\n if (isInOverflowMenu) {\n return item;\n }\n\n return (\n <ToolbarItemWrapper item={{ itemProps: props, itemType: \"buttonLink\" }}>\n {item}\n </ToolbarItemWrapper>\n );\n});\n\nToolbarButtonLink.displayName = \"ToolbarButtonLink\";\n","import { forwardRef, useEffect, useId, useRef, useState } from \"react\";\nimport ArrowDropDown from \"@servicetitan/hammer-icon/mdi/round/arrow_drop_down.svg\";\nimport Listbox, { ListboxItemType } from \"../../../components/Listbox\";\nimport Popover from \"../../../components/Popover\";\nimport { ToolbarItemAppearance } from \"./types\";\nimport { DataTrackingId } from \"../../../types\";\nimport { useOverFlowItemContext } from \"./internal/ToolbarItemOverflowContext\";\nimport { ToolbarItemWrapper } from \"./internal/ToolbarItemWrapper\";\nimport { useTrackingId } from \"../../../hooks\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Type for items in the ToolbarSelect dropdown\n * @extends ItemType<T & { id: string }>\n */\ntype ToolbarSelectItem<T = Record<string, unknown>> = ListboxItemType<\n T & {\n id: string;\n }\n>;\n\n/**\n * Props for the ToolbarSelect component\n * @extends Omit<React.ComponentPropsWithoutRef<typeof Popover.Button>, \"appearance\" | \"onChange\">\n */\nexport type ToolbarSelectProps<T = Record<string, unknown>> = Omit<\n React.ComponentPropsWithoutRef<typeof Popover.Button>,\n \"appearance\" | \"onChange\"\n> & {\n /**\n * Visual appearance of the select button\n * @default ghost\n */\n appearance?: ToolbarItemAppearance;\n /**\n * Callback function when selection changes\n */\n onChange?: (optionId: string) => void;\n /**\n * Currently selected item ID (controlled mode)\n */\n selected?: string;\n /**\n * Array of selectable items\n */\n items: ToolbarSelectItem<T>[];\n /**\n * Accessible label for the select component\n */\n accessibleLabel: string;\n} & DataTrackingId;\n\n/**\n * ToolbarSelect component provides a dropdown selector within a toolbar.\n *\n * Features:\n * - Dropdown menu with selectable options\n * - Controlled and uncontrolled usage patterns\n * - Automatic overflow menu integration\n * - Accessibility support with proper ARIA labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Dropdown arrow icon indicator\n * - Listbox integration for keyboard navigation\n *\n * @example\n * <ToolbarSelect\n * items={fontOptions}\n * selected=\"arial\"\n * accessibleLabel=\"Font family\"\n * onChange={(id) => setFont(id)}\n * />\n *\n * @example\n * <ToolbarSelect\n * appearance=\"primary\"\n * items={colorOptions}\n * accessibleLabel=\"Text color\"\n * />\n */\nexport const ToolbarSelect = forwardRef<HTMLButtonElement, ToolbarSelectProps>(\n (props, _ref) => {\n const {\n appearance = \"ghost\",\n onChange,\n selected: selectedItemId,\n accessibleLabel,\n className,\n items,\n ...rest\n } = props;\n const selectId = useId();\n const popoverContentRef = useRef<HTMLDivElement>(null);\n\n // Popover open/close state - like TimeField does\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n\n // Internal state for uncontrolled mode\n const defaultId = items.length > 0 ? items[0].id : \"\";\n const [internalSelectedId, setInternalSelectedId] = useState(defaultId);\n\n // Use controlled value if provided, otherwise use internal state\n const selectedId = selectedItemId ?? internalSelectedId;\n\n // Find the selected item by ID (or default to first item using defaultId)\n const selectedItem =\n items.find((item) => item.id === selectedId) ||\n items.find((item) => item.id === defaultId);\n\n // Update internal selection when items change and current selection is no longer valid\n useEffect(() => {\n if (\n !selectedItemId &&\n items.length > 0 &&\n !items.some((item) => item.id === internalSelectedId)\n ) {\n setInternalSelectedId(items[0].id);\n }\n }, [items, selectedItemId, internalSelectedId]);\n\n // Return focus to trigger button when popover closes\n const prevIsPopoverOpen = useRef(isPopoverOpen);\n useEffect(() => {\n // Only restore focus if popover was open and is now closed\n if (prevIsPopoverOpen.current && !isPopoverOpen) {\n setTimeout(() => {\n const triggerButton = document.getElementById(selectId);\n if (triggerButton) {\n triggerButton.focus();\n }\n });\n }\n prevIsPopoverOpen.current = isPopoverOpen;\n }, [isPopoverOpen, selectId]);\n\n // Handle selection change\n const handleSelectionChange = (\n selected: ToolbarSelectItem<Record<string, unknown>> | undefined,\n ) => {\n if (selected?.id) {\n if (selectedItemId === undefined) {\n setInternalSelectedId(selected.id);\n }\n\n onChange?.(selected.id);\n\n // Close the popover after selection\n setIsPopoverOpen(false);\n }\n };\n\n // Handle keyboard navigation on the button\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.code === \"ArrowDown\" && isPopoverOpen) {\n // Focus the listbox container and let it handle the first option focus\n const listboxContainer = popoverContentRef.current?.querySelector(\n '[role=\"listbox\"]',\n ) as HTMLElement;\n if (listboxContainer) {\n listboxContainer.focus();\n }\n event.stopPropagation();\n event.preventDefault();\n }\n };\n\n // Checks if this component is rendered inside the overflow menu and fallbacks when the context is unavailable\n const { isInOverflowMenu = false } = useOverFlowItemContext?.() || {};\n\n const trackingId = useTrackingId({\n name: \"ToolbarSelect\",\n data: {\n selected: props.selected,\n disabled: props.disabled,\n \"aria-label\": props[\"aria-label\"],\n items: props.items,\n },\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const buttonClassNames = cx(className, styles[\"toolbar-button-item\"]);\n\n const item = (\n <Popover\n noPadding\n open={isPopoverOpen}\n onClickOutside={() => {\n setIsPopoverOpen(false);\n }}\n onClose={() => {\n setIsPopoverOpen(false);\n }}\n >\n <Popover.Button\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n icon={{ after: ArrowDropDown }}\n className={buttonClassNames}\n id={selectId}\n data-anv=\"toolbar-select\"\n onClick={() => {\n setIsPopoverOpen(!isPopoverOpen);\n }}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {selectedItem?.label}\n </Popover.Button>\n <Popover.Content\n ref={popoverContentRef}\n className={styles[\"toolbar-select-content\"]}\n aria-label={`${accessibleLabel} options`}\n >\n <Listbox\n selected={selectedItem}\n onSelectionChange={handleSelectionChange}\n items={items}\n aria-labelledby={selectId}\n disableAutoSelectOnFocus={true}\n >\n {({ items }) =>\n items.map((item) => (\n <Listbox.Option key={item.label} item={item}>\n {item.label}\n </Listbox.Option>\n ))\n }\n </Listbox>\n </Popover.Content>\n </Popover>\n );\n\n if (isInOverflowMenu) {\n return item;\n }\n\n return (\n <ToolbarItemWrapper item={{ itemProps: props, itemType: \"select\" }}>\n {item}\n </ToolbarItemWrapper>\n );\n },\n);\n\nToolbarSelect.displayName = \"ToolbarSelect\";\n","import { ReactElement, useContext, useId, useMemo } from \"react\";\nimport MoreHoriz from \"@servicetitan/hammer-icon/mdi/round/more_horiz.svg\";\nimport MoreVert from \"@servicetitan/hammer-icon/mdi/round//more_vert.svg\";\nimport { ToolbarItemProps } from \"../types\";\nimport { ToolbarButton, ToolbarButtonProps } from \"../ToolbarButton\";\nimport {\n ToolbarButtonToggle,\n ToolbarButtonToggleProps,\n} from \"../ToolbarButtonToggle\";\nimport {\n ToolbarButtonLink,\n ToolbarButtonLinkProps,\n} from \"../ToolbarButtonLink\";\nimport { ToolbarSelect, ToolbarSelectProps } from \"../ToolbarSelect\";\nimport { ToolbarOverflowContext } from \"./ToolbarOverflowContext\";\nimport Popover from \"../../../../components/Popover\";\nimport Icon from \"../../../../components/Icon\";\nimport { OverflowItemContext } from \"./ToolbarItemOverflowContext\";\nimport { handleMenuKeyboardNavigation } from \"./utils/accessibility\";\n\nimport cx from \"classnames\";\nimport styles from \"../Toolbar.module.scss\";\n\n/**\n * Component to render appropriate toolbar items in the overflow menu\n * @param itemType - Type of toolbar item to render\n * @param itemProps - Props for the toolbar item\n * @returns ReactElement - The rendered toolbar item\n */\nconst OverflowItem = ({ itemType, itemProps }: ToolbarItemProps) => {\n // Based on the item type, use the corresponding toolbar component\n switch (itemType) {\n case \"button\":\n return <ToolbarButton {...(itemProps as ToolbarButtonProps)} />;\n\n case \"buttonToggle\":\n return (\n <ToolbarButtonToggle {...(itemProps as ToolbarButtonToggleProps)} />\n );\n\n case \"buttonLink\":\n return <ToolbarButtonLink {...(itemProps as ToolbarButtonLinkProps)} />;\n\n case \"select\":\n return <ToolbarSelect {...(itemProps as ToolbarSelectProps)} />;\n\n default:\n return null;\n }\n};\n\n/**\n * Props for the ToolbarOverflowMenu component\n */\nexport type ToolbarOverflowMenuProps = {\n /**\n * Additional items to display in the overflow menu\n */\n additionalItems?: ReactElement[];\n /**\n * Direction of the parent toolbar\n * @default horizontal\n */\n direction?: \"vertical\" | \"horizontal\";\n};\n\n/**\n * ToolbarOverflowMenu component displays toolbar items that don't fit in the main toolbar.\n *\n * Features:\n * - Automatic rendering when items overflow in collapse mode\n * - Maintains consistent item ordering with the main toolbar\n * - Preserves item state between toolbar and overflow menu\n * - Provides accessible navigation with keyboard and screen readers\n * - Adapts to both horizontal and vertical toolbar layouts\n * - Context-aware rendering for child components\n * - Proper ARIA menu semantics\n * - Keyboard navigation support\n */\nexport const ToolbarOverflowMenu = ({\n additionalItems,\n direction,\n}: ToolbarOverflowMenuProps) => {\n // Gives us the array of items that need to appear\n const { overflowItems, orderedIds } = useContext(ToolbarOverflowContext);\n const menuTriggerId = useId();\n\n // Sort overflow items to match their original order in the toolbar\n const orderedItems = useMemo(() => {\n const allElements = orderedIds?.map((id) => {\n return overflowItems.find((item) => item.id === id);\n });\n\n return allElements?.filter((item) => item !== undefined) || [];\n }, [orderedIds, overflowItems]);\n\n const popoverButtonClassNames = cx(\n styles[\"toolbar-button-item\"],\n styles[\"toolbar-overflow-trigger\"],\n );\n\n const overflowIcon = direction === \"horizontal\" ? MoreHoriz : MoreVert;\n\n return (\n <Popover noPadding>\n <Popover.Button\n size=\"small\"\n appearance=\"ghost\"\n id={menuTriggerId}\n className={popoverButtonClassNames}\n data-anv=\"toolbar-overflow-trigger\"\n aria-label=\"Additional toolbar options\"\n >\n <Icon svg={overflowIcon} size=\"small\" />\n </Popover.Button>\n <Popover.Content>\n <OverflowItemContext.Provider value={{ isInOverflowMenu: true }}>\n <ul\n role=\"menu\"\n className={styles[\"toolbar-overflow-content\"]}\n data-anv=\"toolbar-overflow-menu\"\n aria-labelledby={menuTriggerId}\n onKeyDown={handleMenuKeyboardNavigation}\n >\n {orderedItems.map((item) => {\n const { itemType, itemProps, id } = item;\n return (\n <li\n key={`${itemType}-${id}`}\n role=\"menuitem\"\n data-anv=\"toolbar-overflow-item\"\n >\n <OverflowItem\n itemType={itemType}\n itemProps={itemProps}\n id={id}\n />\n </li>\n );\n })}\n\n {additionalItems?.map((item, index) => (\n <li\n key={`additional-item-${index}`}\n role=\"menuitem\"\n data-anv=\"toolbar-overflow-item\"\n >\n {item}\n </li>\n ))}\n </ul>\n </OverflowItemContext.Provider>\n </Popover.Content>\n </Popover>\n );\n};\n","import { createContext, RefObject } from \"react\";\nimport { FilterGroupProps } from \"../FilterGroup\";\nimport { Filter, FilterValue } from \"./types\";\n\n/**\n * Context for sharing filter state and operations between FilterGroup and its children\n *\n * @extends FilterGroupProps\n */\ntype FilterGroupContextProps = FilterGroupProps & {\n /** Reference to the filter group DOM element\n * @default { current: null }\n */\n filterGroupRef: RefObject<HTMLDivElement>;\n /** Current filters array\n * @default []\n */\n filters: Filter[];\n /** Function to update a single filter and submit if needed\n * @default () => {}\n */\n updateFilter: (filterId: string, value: FilterValue, submit: boolean) => void;\n /** Array of filters that are currently hidden due to overflow\n * @default []\n */\n hiddenFilters: Filter[];\n /** Function to mark a filter as hidden\n * @default () => {}\n */\n addHiddenFilter: (filter: Filter) => void;\n /** Function to mark a filter as visible\n * @default () => {}\n */\n removeHiddenFilter: (filter: Filter) => void;\n};\n\n/**\n * Context provider for filter-related operations\n * Used to share filter state between FilterGroup and FilterDrawer\n */\nexport const FilterGroupContext = createContext<FilterGroupContextProps>({\n filterGroupRef: { current: null },\n filters: [],\n updateFilter: () => {},\n controlledFiltering: false,\n hiddenFilters: [],\n addHiddenFilter: () => {},\n removeHiddenFilter: () => {},\n});\n","import { useContext } from \"react\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { Filter } from \"./internal/types\";\nimport {\n ToolbarItemWrapper,\n ToolbarItemWrapperProps,\n} from \"../internal/ToolbarItemWrapper\";\nimport { ToolbarButtonProps } from \"../ToolbarButton\";\n\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterItemWrapper component\n */\ntype FilterItemWrapperProps = {\n /**\n * Optional filter object. If provided, visibility changes will be tracked in FilterGroupContext.\n * If not provided, only basic visibility tracking will be used.\n */\n filter?: Filter;\n /** The content to render inside the wrapper */\n children: React.ReactNode;\n};\n\n/**\n * FilterItemWrapper extends ToolbarItemWrapper to handle filter-specific visibility.\n * Uses FilterGroupContext to track hidden filters instead of overflow menu.\n * Built into FilterButton and other filter components for consistent overflow handling.\n *\n * Features:\n * - Wraps filter controls for consistent overflow and visibility handling\n * - Integrates with FilterGroupContext to track hidden filters\n */\nexport const FilterItemWrapper = ({\n filter,\n children,\n}: FilterItemWrapperProps) => {\n const { addHiddenFilter, removeHiddenFilter, filterGroupRef } =\n useContext(FilterGroupContext);\n\n const props: ToolbarItemWrapperProps = {\n item: {\n itemType: \"button\",\n itemProps: {\n children: null,\n \"aria-hidden\": true,\n } as ToolbarButtonProps,\n },\n children,\n className: styles[\"filter-item\"],\n observerRoot: filterGroupRef.current,\n onVisibilityChange: (isVisible: boolean) => {\n // Only track in FilterGroupContext if a filter is provided\n if (filter) {\n if (isVisible) {\n removeHiddenFilter?.(filter);\n } else {\n addHiddenFilter?.(filter);\n }\n }\n },\n rootMargin: \"0px -80px 0px 0px\",\n };\n\n return <ToolbarItemWrapper {...props} />;\n};\n","import { Filter, FilterValue } from \"../types\";\n\n/**\n * Returns an array of filters that are currently active (i.e., have a value set).\n *\n * @param {Filter[]} filters - Array of filter objects to check\n * @returns {Filter[]} Array of active filters\n */\nexport const getActiveFilters = (filters: Filter[]): Filter[] => {\n return filters.filter((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return filter.checked;\n case \"custom\":\n return filter.value !== undefined;\n case \"singleSelect\":\n return filter.selectedItem !== undefined;\n case \"multiSelect\":\n return filter.selectedItems && filter.selectedItems.length > 0;\n case \"date\":\n case \"dateRange\":\n return filter.value !== null && filter.value !== undefined;\n default:\n return false;\n }\n });\n};\n\n/**\n * Checks if any filters in the array have active values\n *\n * @param {Filter[]} filters - Array of filter objects to check\n * @returns {boolean} True if any filter has an active value\n */\nexport const checkActiveFilters = (filters: Filter[]): boolean => {\n return getActiveFilters(filters).length > 0;\n};\n\n/**\n * Resets all filters to their default state\n *\n * @param {Filter[]} filters - Array of filter objects to reset\n * @returns {Filter[]} New array with reset filters\n */\nexport const resetFilters = (filters: Filter[]): Filter[] => {\n return filters.map((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return {\n ...filter,\n checked: false,\n };\n case \"custom\":\n return {\n ...filter,\n value: undefined,\n };\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: undefined,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: [],\n };\n case \"date\":\n case \"dateRange\":\n return {\n ...filter,\n value: null,\n };\n default:\n return filter;\n }\n });\n};\n\n/**\n * Updates a single filter in an array of filters\n *\n * @param {Filter[]} filters - Array of filter objects\n * @param {string} filterId - ID of the filter to update\n * @param {FilterValue} value - New value for the filter\n * @returns {Filter[]} New array with updated filter\n */\nexport const updateSingleFilter = (\n filters: Filter[],\n filterId: string,\n value: FilterValue,\n): Filter[] => {\n return filters.map((filter) => {\n if (filter.id !== filterId) return filter;\n\n switch (filter.type) {\n case \"boolean\":\n return {\n ...filter,\n checked: value as boolean,\n };\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: value,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: value as unknown[],\n };\n case \"date\":\n return {\n ...filter,\n value: value as string | null,\n };\n case \"dateRange\":\n return {\n ...filter,\n value: value as {\n startDate: string | null;\n endDate: string | null;\n } | null,\n };\n case \"custom\":\n return {\n ...filter,\n value,\n };\n default:\n return filter;\n }\n });\n};\n\n/**\n * Determines if two filter values are different.\n * For singleSelect, compares by id if both are objects with id.\n *\n * @param {T} a - First value to compare\n * @param {T} b - Second value to compare\n * @returns {boolean} True if the values are different\n */\nexport const hasChangedFilter = <T>(a: T, b: T): boolean => {\n // For singleSelect, compare by id if both are objects with id\n if (\n a &&\n b &&\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n \"id\" in a &&\n \"id\" in b\n ) {\n return a.id !== b.id;\n }\n // Fallback to strict equality\n return a !== b;\n};\n","import {\n ToolbarButtonToggle,\n ToolbarButtonToggleProps,\n} from \"../ToolbarButtonToggle\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport { BooleanFilter } from \"./internal/types\";\n\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterToggleButton component\n *\n * @extends Omit<ToolbarButtonToggleProps, \"checked\">\n */\nexport type FilterToggleButtonProps = Omit<\n ToolbarButtonToggleProps,\n \"checked\"\n> & {\n /** Unique identifier for the filter */\n id: string;\n /** Whether the toggle is checked */\n checked: boolean;\n /** The content to display inside the toggle button */\n children: React.ReactNode;\n};\n\n/**\n * FilterToggleButton wraps ToolbarButtonToggle in a FilterItemWrapper for consistent overflow behavior with other filter types.\n * Built into FilterGroup for boolean filter rendering.\n *\n * Features:\n * - Renders a toggle button for boolean filters\n * - Integrates with FilterGroup and FilterItemWrapper for overflow handling\n * - Supports accessibility and keyboard navigation\n */\nexport const FilterToggleButton = ({\n id,\n checked,\n children,\n ...props\n}: FilterToggleButtonProps) => {\n // Construct a BooleanFilter object from the props\n const filter: BooleanFilter = {\n id,\n type: \"boolean\",\n checked,\n label: typeof children === \"string\" ? children : id,\n };\n\n return (\n <FilterItemWrapper filter={filter}>\n <ToolbarButtonToggle\n checked={checked}\n isFilter\n {...props}\n className={styles[\"filter-button-trigger\"]}\n data-anv=\"toolbar-boolean-filter\"\n >\n {children}\n </ToolbarButtonToggle>\n </FilterItemWrapper>\n );\n};\n","import { useMemo } from \"react\";\nimport { MultiSelectFilter, SingleSelectFilter } from \"./internal/types\";\nimport Listbox from \"../../../../components/Listbox\";\nimport ListView from \"../../../../components/ListView\";\nimport { SearchField } from \"../../../../components/SearchField\";\n\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterSelect component\n */\ninterface FilterSelectProps<Item extends { id: string; label: string }> {\n /** The filter configuration object */\n filter: SingleSelectFilter<Item> | MultiSelectFilter<Item>;\n /** The current draft value for the filter */\n draftValue: Item | Item[] | undefined;\n /** Callback to update the draft value */\n onDraftChange: (value: Item | Item[] | undefined) => void;\n}\n\n/**\n * FilterSelect component renders a Listbox or ListView for single or multi-select filters.\n * Built into FilterButton and FilterDrawer for filter selection UI.\n *\n * Features:\n * - Renders a Listbox for single select filters\n * - Renders a ListView for multi select filters\n * - Supports search field for filtering options\n */\nexport const FilterSelect = <Item extends { id: string; label: string }>({\n filter,\n draftValue,\n onDraftChange,\n}: FilterSelectProps<Item>) => {\n const isMultiSelect = filter.type === \"multiSelect\";\n\n const singleSelectList = useMemo(\n () => (\n <Listbox\n key={filter.id}\n items={filter.items}\n selected={draftValue as Item | undefined}\n onSelectionChange={(selected: Item | undefined) => {\n onDraftChange(selected);\n }}\n disableAutoSelectOnFocus\n style={{ padding: 0 }}\n >\n {({ items }) =>\n items.map((item) => (\n <Listbox.Option key={item.id} item={item} disabled={item.disabled}>\n {item.label}\n </Listbox.Option>\n ))\n }\n </Listbox>\n ),\n [filter.id, filter.items, draftValue, onDraftChange],\n );\n\n const multiSelectList = useMemo(\n () => (\n <ListView\n key={filter.id}\n items={filter.items}\n selected={Array.isArray(draftValue) ? draftValue : []}\n onSelectionChange={(selectedItems: unknown[]) => {\n const items = selectedItems as Item[];\n onDraftChange(items);\n }}\n style={{ padding: 0 }}\n >\n {({ items }) =>\n items.map((item) => (\n <ListView.Option key={item.id} item={item}>\n {item.label}\n </ListView.Option>\n ))\n }\n </ListView>\n ),\n [filter.id, filter.items, draftValue, onDraftChange],\n );\n\n return (\n <>\n {filter.hasSearch && (\n <SearchField\n size=\"small\"\n className={styles[\"filter-select-search\"]}\n onChange={(e) => {\n filter.onSearch?.(e.target.value);\n }}\n onClear={() => {\n filter.onSearchClear?.();\n }}\n data-anv=\"filter-select-search\"\n />\n )}\n {isMultiSelect ? multiSelectList : singleSelectList}\n </>\n );\n};\n","import { useRef } from \"react\";\nimport { DateFilter } from \"./internal/types\";\nimport Flex from \"../../../../components/Flex\";\nimport {\n MaskedDateInput,\n MaskedDateInputRef,\n} from \"../../../../components/DateFieldSingle/internal/MaskedDateInput\";\nimport { DateFieldSingleChange } from \"../../../../components/DateFieldSingle\";\nimport { useDateFieldSingleConversion } from \"../../../../components/DateFieldSingle/internal/useDateFieldSingleConversion\";\nimport { useDateFieldSingleState } from \"../../../../components/DateFieldSingle/internal/useDateFieldSingleState\";\nimport { DateFieldSingleCalendar } from \"../../../../components/DateFieldSingle/internal/DateFieldSingleCalendar\";\n\n/**\n * Props for the FilterDateSingle component\n */\ninterface FilterDateSingleProps {\n /**\n * The date filter configuration object containing mode and other settings\n */\n filter: DateFilter;\n /**\n * The current draft value for the date filter in ISO 8601 format\n */\n draftValue: string | null;\n /**\n * Callback function to update the draft value when the date changes\n */\n onDraftChange: (value: string | null) => void;\n}\n\n/**\n * FilterDateSingle component for selecting a single date in toolbar filters.\n *\n * Features:\n * - Renders a masked date input field with format validation\n * - Provides calendar popup for date selection\n * - Integrates with toolbar filter state management\n * - Supports controlled and uncontrolled date selection\n * - Maintains draft state for filter changes\n */\nexport const FilterDateSingle = ({\n filter,\n draftValue,\n onDraftChange,\n}: FilterDateSingleProps) => {\n const maskedDateInputRef = useRef<MaskedDateInputRef>(null);\n\n const handleChange = (change: DateFieldSingleChange) => {\n onDraftChange(change.date);\n };\n\n const { value, onChange } = useDateFieldSingleConversion({\n value: draftValue,\n onChange: handleChange,\n });\n\n const { handleInputChange, handleCalendarSelection } =\n useDateFieldSingleState({\n valueProp: value,\n onChange: (change) => onChange({ ...change, isDateValid: true }),\n });\n\n return (\n <Flex gap={4} direction=\"column\">\n <MaskedDateInput\n mode={filter.mode}\n ref={maskedDateInputRef}\n onChange={handleInputChange}\n lastValidDate={value ?? null}\n autoComplete=\"off\"\n />\n\n <DateFieldSingleCalendar\n value={value ?? null}\n onSelection={handleCalendarSelection}\n />\n </Flex>\n );\n};\n","import { useRef } from \"react\";\nimport { DateRangeFilter } from \"./internal/types\";\nimport {\n MaskedDateRangeInput,\n MaskedDateRangeInputRef,\n} from \"../../../../components/DateFieldRange/internal/MaskedDateRangeInput\";\nimport { DateFieldRangeChange } from \"../../../../components/DateFieldRange\";\nimport { useDateFieldRangeConversion } from \"../../../../components/DateFieldRange/internal/useDateFieldRangeConversion\";\nimport { useDateFieldRangeState } from \"../../../../components/DateFieldRange/internal/useDateFieldRangeState\";\nimport Flex from \"../../../../components/Flex\";\nimport { DateFieldRangeCalendar } from \"../../../../components/DateFieldRange/internal/DateFieldRangeCalendar\";\n\n/**\n * Props for the FilterDateRange component\n */\ninterface FilterDateRangeProps {\n /**\n * The date range filter configuration object containing mode and other settings\n */\n filter: DateRangeFilter;\n /**\n * The current draft value for the date range filter with start and end dates in ISO 8601 format\n */\n draftValue: { startDate: string | null; endDate: string | null } | null;\n /**\n * Callback function to update the draft value when the date range changes\n */\n onDraftChange: (\n value: { startDate: string | null; endDate: string | null } | null,\n ) => void;\n}\n\n/**\n * FilterDateRange component for selecting a date range in toolbar filters.\n *\n * Features:\n * - Renders a masked date range input field with format validation\n * - Provides calendar popup for date range selection\n * - Integrates with toolbar filter state management\n * - Supports controlled and uncontrolled date range selection\n * - Maintains draft state for filter changes\n * - Handles start and end date selection independently\n */\nexport const FilterDateRange = ({\n filter,\n draftValue,\n onDraftChange,\n}: FilterDateRangeProps) => {\n const maskedDateRangeInputRef = useRef<MaskedDateRangeInputRef>(null);\n\n const handleChange = (change: DateFieldRangeChange) => {\n // Only call onDraftChange when we have a complete date range (both start and end)\n // or when clearing the range (both null)\n const hasCompleteRange = change.startDate && change.endDate;\n const isClearingRange = !change.startDate && !change.endDate;\n\n if (hasCompleteRange || isClearingRange) {\n onDraftChange({\n startDate: change.startDate,\n endDate: change.endDate,\n });\n }\n };\n\n const { value, onChange } = useDateFieldRangeConversion({\n value: draftValue,\n onChange: handleChange,\n });\n\n const { handleInputChange, handleCalendarSelection } = useDateFieldRangeState(\n {\n valueProp: value,\n onChange: (change) => {\n // Only call handleChange if input is valid and we have a complete range, or if clearing\n const hasCompleteRange = change.startDate && change.endDate;\n const isClearingRange = change.isInputEmpty;\n\n if (change.isInputValid && (hasCompleteRange || isClearingRange)) {\n onChange({ ...change, isDateRangeValid: true });\n }\n },\n },\n );\n\n return (\n <Flex gap={4} direction=\"column\">\n <MaskedDateRangeInput\n mode={filter.mode}\n ref={maskedDateRangeInputRef}\n onChange={handleInputChange}\n startDate={value?.startDate ?? null}\n endDate={value?.endDate ?? null}\n autoComplete=\"off\"\n />\n\n <DateFieldRangeCalendar\n startDate={value?.startDate ?? null}\n endDate={value?.endDate ?? null}\n onSelection={handleCalendarSelection}\n />\n </Flex>\n );\n};\n","import {\n useContext,\n useState,\n ReactNode,\n useEffect,\n KeyboardEvent,\n useCallback,\n useMemo,\n} from \"react\";\nimport ArrowDropDown from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_down.svg\";\nimport Event from \"@servicetitan/hammer-icon/mdi/round/event.svg\";\nimport { DateTime } from \"luxon\";\nimport {\n CustomFilter,\n DateFilter,\n DateRangeFilter,\n Filter,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"./internal/types\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { hasChangedFilter } from \"./internal/utils/filter-state\";\nimport Chip from \"../../../../components/Chip\";\nimport { FilterSelect } from \"./FilterSelect\";\nimport { FilterDateSingle } from \"./FilterDateSingle\";\nimport { FilterDateRange } from \"./FilterDateRange\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport Popover from \"../../../../components/Popover\";\nimport Flex from \"../../../../components/Flex\";\nimport Button from \"../../../../components/Button\";\n\nimport cx from \"classnames\";\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterButton component\n */\ninterface FilterButtonProps {\n /** Filter configuration object */\n filter: Filter;\n /** Optional child content for non-custom filter types */\n children?: ReactNode;\n /** Optional class name for the popover content */\n className?: string;\n}\n\n/**\n * FilterButton component provides a popover interface for filter selection.\n * Handles both controlled and uncontrolled filter updates.\n * Built into FilterGroup for single-select, multi-select, date, and date range filter rendering.\n *\n * Features:\n * - Maintains draft state for controlled filters\n * - Updates immediately for uncontrolled filters\n * - Provides Apply and Cancel actions in controlled mode\n * - Supports keyboard navigation and accessibility\n * - Renders custom, single-select, multi-select, date, and date range filter types\n * - Integrates with FilterGroup context for state management\n * - Displays appropriate icons for date-based filters\n * - Shows formatted date values in button labels\n */\nexport const FilterButton = ({\n filter,\n children,\n className,\n}: FilterButtonProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const { updateFilter, controlledFiltering } = useContext(FilterGroupContext);\n\n // MultiSelect filters need to be initialized with an empty array\n const [draftValue, setDraftValue] = useState<unknown>(\n filter.type === \"multiSelect\" ? [] : undefined,\n );\n\n /**\n * Returns the current value for the filter based on its type.\n * Used for resetting draft state and comparing changes.\n *\n * @returns The current filter value based on type:\n * - singleSelect: selectedItem\n * - multiSelect: selectedItems array\n * - date: date string value\n * - dateRange: { startDate, endDate } object\n * - custom: custom value\n */\n const getCurrentFilterValue = () => {\n switch (filter.type) {\n case \"singleSelect\":\n return (filter as SingleSelectFilter<unknown>).selectedItem;\n case \"multiSelect\":\n return (filter as MultiSelectFilter<unknown>).selectedItems || [];\n case \"date\":\n case \"dateRange\":\n return filter.value;\n case \"custom\":\n return (filter as CustomFilter<unknown>).value;\n default:\n return undefined;\n }\n };\n\n // Initialize draft state when popover opens\n useEffect(() => {\n if (isOpen) {\n const initialValue = getCurrentFilterValue();\n setDraftValue(initialValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const handleChange = useCallback(\n (value: unknown) => {\n if (hasChangedFilter(value, draftValue)) {\n // Always update draft state\n setDraftValue(value);\n\n // In uncontrolled mode, update immediately for all filter types\n if (!controlledFiltering) {\n updateFilter(filter.id, value, true);\n // Close popover immediately for single select and custom filters\n // Keep open for multi-select to allow keyboard navigation\n if (filter.type !== \"multiSelect\") {\n setIsOpen(false);\n }\n }\n }\n },\n [filter.id, filter.type, controlledFiltering, updateFilter, draftValue],\n );\n\n const handleSubmit = () => {\n const stateValue = getCurrentFilterValue();\n\n if (hasChangedFilter(draftValue, stateValue)) {\n updateFilter(filter.id, draftValue, true);\n }\n\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n // In uncontrolled mode, clicking outside should finalize changes, not cancel them\n if (!controlledFiltering) {\n setIsOpen(false);\n return;\n }\n\n const originalValue = getCurrentFilterValue();\n\n setDraftValue(originalValue);\n setIsOpen(false);\n };\n\n /**\n * Builds the button label text based on filter type and current selection.\n * Formats labels appropriately for each filter type to show current state.\n *\n * @returns Formatted label text:\n * - singleSelect: \"Label: Selected Item\" or just \"Label\"\n * - multiSelect: \"Label\" with selection count chip\n * - date: Full date string or \"Label\"\n * - dateRange: \"Label: Start - End\" or just \"Label\"\n * - custom: \"Label: Custom Value\" or just \"Label\"\n */\n const getButtonLabel = useMemo(() => {\n switch (filter.type) {\n case \"singleSelect\": {\n const singleSelectFilter = filter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n if (singleSelectFilter.selectedItem) {\n return `${filter.label}: ${singleSelectFilter.selectedItem.label}`;\n }\n return filter.label;\n }\n case \"multiSelect\": {\n const multiSelectFilter = filter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n if (\n multiSelectFilter.selectedItems &&\n multiSelectFilter.selectedItems.length > 0\n ) {\n const selectionCount =\n multiSelectFilter.selectedItems.length.toString();\n return (\n <>\n {filter.label}\n <Chip\n label={selectionCount}\n color=\"#0265DC\"\n size=\"small\"\n aria-label={`${selectionCount} selected items`}\n />\n </>\n );\n }\n return filter.label;\n }\n case \"date\":\n if (filter.value) {\n const date = DateTime.fromISO(filter.value, { zone: \"local\" });\n return `${filter.label}: ${date.monthShort} ${date.day}, ${date.year}`;\n }\n return filter.label;\n case \"dateRange\":\n if (filter.value) {\n const start = DateTime.fromISO(filter.value.startDate as string, {\n zone: \"local\",\n });\n const end = DateTime.fromISO(filter.value.endDate as string, {\n zone: \"local\",\n });\n\n // If the start and end dates are in the same year, we don't shiw year in start date\n const isSameYear = start.year === end.year;\n const formattedStart = isSameYear\n ? `${start.monthShort} ${start.day}`\n : `${start.monthShort} ${start.day}, ${start.year}`;\n\n return `${filter.label}: ${formattedStart} – ${end.monthShort} ${end.day}, ${end.year}`;\n }\n return filter.label;\n case \"custom\":\n if (filter.labelChipCount) {\n return (\n <>\n {filter.label}\n <Chip\n label={filter.labelChipCount.toString()}\n color=\"#0265DC\"\n size=\"small\"\n aria-label={`${filter.labelChipCount} selected items`}\n />\n </>\n );\n }\n return filter.label;\n default:\n return filter.label;\n }\n }, [filter]);\n\n /**\n * Renders the appropriate filter content based on filter type.\n * Each filter type has its own specialized component for optimal UX.\n *\n * @returns React component for the filter type:\n * - custom: Custom render function\n * - singleSelect: FilterSelect with Listbox\n * - multiSelect: FilterSelect with ListView\n * - date: FilterDateSingle with calendar\n * - dateRange: FilterDateRange with range calendar\n */\n const getContent = useMemo(() => {\n switch (filter.type) {\n case \"custom\":\n return filter.buttonRender({\n value: draftValue,\n onChange: handleChange,\n });\n case \"singleSelect\":\n return (\n <FilterSelect\n filter={filter as SingleSelectFilter<{ id: string; label: string }>}\n draftValue={draftValue as { id: string; label: string } | undefined}\n onDraftChange={handleChange}\n />\n );\n case \"multiSelect\":\n return (\n <FilterSelect\n filter={filter as MultiSelectFilter<{ id: string; label: string }>}\n draftValue={\n draftValue as { id: string; label: string }[] | undefined\n }\n onDraftChange={handleChange}\n />\n );\n case \"date\":\n return (\n <FilterDateSingle\n filter={filter as DateFilter}\n draftValue={draftValue as string | null}\n onDraftChange={handleChange}\n />\n );\n case \"dateRange\":\n return (\n <FilterDateRange\n filter={filter as DateRangeFilter}\n draftValue={\n draftValue as {\n startDate: string | null;\n endDate: string | null;\n } | null\n }\n onDraftChange={handleChange}\n />\n );\n default:\n return children;\n }\n }, [filter, draftValue, handleChange, children]);\n\n const handleOutsidePress = () => {\n if (controlledFiltering) {\n handleCancel();\n } else {\n // For multi-select in uncontrolled mode, submit when closing\n if (filter.type === \"multiSelect\") {\n updateFilter(filter.id, draftValue, true);\n }\n handleSubmit();\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n // In uncontrolled mode, Enter should submit\n if (!controlledFiltering) {\n handleSubmit();\n }\n }\n\n if (e.key === \"Escape\") {\n // Trigger the same logic as clicking outside\n handleOutsidePress();\n }\n };\n\n const triggerClasses = cx(styles[\"filter-button-trigger\"], {\n [styles[\"filter-button-trigger--selected\"]]:\n (filter.type === \"custom\" && filter.value) ||\n (filter.type === \"singleSelect\" && filter.selectedItem) ||\n (filter.type === \"multiSelect\" &&\n filter.selectedItems &&\n filter.selectedItems.length > 0) ||\n (filter.type === \"date\" && filter.value) ||\n (filter.type === \"dateRange\" && filter.value),\n });\n\n const contentClasses = cx(styles[\"filter-button-content\"], className);\n\n const iconOptions =\n filter.type === \"date\" || filter.type === \"dateRange\"\n ? { before: Event }\n : { after: ArrowDropDown };\n\n return (\n <FilterItemWrapper filter={filter}>\n <Popover\n open={isOpen}\n onClickOutside={isOpen ? handleOutsidePress : undefined}\n placement=\"bottom-start\"\n >\n <Popover.Button\n onKeyDown={handleKeyDown}\n appearance=\"ghost\"\n size=\"small\"\n icon={iconOptions}\n data-id={filter.id}\n data-anv=\"toolbar-button\"\n className={triggerClasses}\n onClick={() => {\n setIsOpen(!isOpen);\n }}\n >\n {getButtonLabel}\n </Popover.Button>\n\n <Popover.Content onKeyDown={handleKeyDown} className={contentClasses}>\n {getContent}\n {controlledFiltering && (\n <Flex\n gap={2}\n justifyContent=\"flex-end\"\n className={styles[\"filter-button-buttons\"]}\n >\n <Popover.Close size=\"small\" onClick={handleCancel}>\n Cancel\n </Popover.Close>\n <Button appearance=\"primary\" size=\"small\" onClick={handleSubmit}>\n Apply\n </Button>\n </Flex>\n )}\n </Popover.Content>\n </Popover>\n </FilterItemWrapper>\n );\n};\n","import { ComponentPropsWithoutRef, forwardRef, useContext } from \"react\";\nimport { LayoutUtilProps } from \"../../../types\";\nimport { Flex } from \"../../../components/Flex\";\nimport { ToolbarOverflowContext } from \"./internal/ToolbarOverflowContext\";\n\nimport styles from \"./ToolbarControlGroup.module.scss\";\n\n/**\n * Props for the ToolbarControlGroup component\n *\n * @extends ComponentPropsWithoutRef<'div'>\n * @extends LayoutUtilProps\n */\nexport type ToolbarControlGroupProps = ComponentPropsWithoutRef<\"div\"> &\n LayoutUtilProps & {\n /**\n * Accessible label for the control group\n */\n \"aria-label\"?: string;\n };\n\n/**\n * ToolbarControlGroup component provides a flex container for grouping related toolbar controls.\n * Can be used for filters, buttons, or other toolbar items.\n *\n * Features:\n * - Groups related toolbar controls in a flex container\n * - Supports accessibility with aria-label\n * - Handles overflow and wrapping based on toolbar context\n * - Integrates with layout utilities for spacing and alignment\n *\n * @example\n * <ToolbarControlGroup aria-label=\"Formatting controls\">\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold\" />\n * <Toolbar.Button icon={ItalicIcon} aria-label=\"Italic\" />\n * </ToolbarControlGroup>\n */\nconst ToolbarControlGroupElement = forwardRef<\n HTMLDivElement,\n ToolbarControlGroupProps\n>((props, ref) => {\n const { children, \"aria-label\": ariaLabel, ...rest } = props;\n const { overflow } = useContext(ToolbarOverflowContext);\n\n return (\n <Flex\n ref={ref}\n alignItems=\"center\"\n gap={1}\n wrap={overflow === \"collapse\" ? \"nowrap\" : \"wrap\"}\n data-anv=\"toolbar-control-group\"\n role=\"group\"\n aria-label={ariaLabel ? ariaLabel : \"Toolbar controls\"}\n className={styles[\"toolbar-control-group\"]}\n {...rest}\n >\n {children}\n </Flex>\n );\n});\n\nToolbarControlGroupElement.displayName = \"ToolbarControlGroup\";\n\nexport const ToolbarControlGroup = ToolbarControlGroupElement;\n","import * as React from \"react\";\nconst SvgTune = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: \"1em\", height: \"1em\", viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 18c0 .55.45 1 1 1h5v-2H4c-.55 0-1 .45-1 1zM3 6c0 .55.45 1 1 1h9V5H4c-.55 0-1 .45-1 1zm10 14v-1h7c.55 0 1-.45 1-1s-.45-1-1-1h-7v-1c0-.55-.45-1-1-1s-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1zM7 10v1H4c-.55 0-1 .45-1 1s.45 1 1 1h3v1c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1s-1 .45-1 1zm14 2c0-.55-.45-1-1-1h-9v2h9c.55 0 1-.45 1-1zm-5-3c.55 0 1-.45 1-1V7h3c.55 0 1-.45 1-1s-.45-1-1-1h-3V4c0-.55-.45-1-1-1s-1 .45-1 1v4c0 .55.45 1 1 1z\" }));\nexport default SvgTune;\n","import { useContext, useEffect, useState, useMemo, useCallback } from \"react\";\nimport IconTune from \"@servicetitan/hammer-icon/mdi/round/tune.svg\";\nimport IconClose from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport Search from \"@servicetitan/hammer-icon/mdi/round/search.svg\";\nimport {\n CustomFilter,\n Filter,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"./internal/types\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { Checkbox } from \"../../../../components/Checkbox\";\nimport { Radio } from \"../../../../components/Radio\";\nimport { Combobox } from \"../../../../components/Combobox\";\nimport { Flex } from \"../../../../components/Flex\";\nimport { useContainerQuery } from \"../../../../internal/hooks\";\nimport {\n checkActiveFilters,\n getActiveFilters,\n resetFilters,\n updateSingleFilter,\n} from \"./internal/utils/filter-state\";\nimport { DateFieldSingle } from \"../../../../components/DateFieldSingle\";\nimport { DateFieldRange } from \"../../../../components/DateFieldRange\";\nimport ButtonToggle from \"../../../../components/ButtonToggle\";\nimport Chip from \"../../../../components/Chip\";\nimport Drawer from \"../../../../components/Drawer\";\nimport Button from \"../../../../components/Button\";\n\nimport cx from \"classnames\";\nimport styles from \"./Filters.module.scss\";\n\n/**\n * FilterDrawer component provides a drawer interface for filter selection.\n * Always operates in controlled mode with batch updates.\n * Built into FilterGroup for mobile and overflow filter editing.\n *\n * Features:\n * - Shows all available filters in a side panel\n * - Maintains separate draft state for all filters\n * - Updates filters only when Apply is clicked\n * - Provides Clear All functionality\n * - Supports boolean, custom, single-select, multi-select, date, and date range filter types\n * - Integrates with FilterGroup context for state management\n * - Handles date and date range filters with appropriate input components\n */\nexport const FilterDrawer = () => {\n const [open, setOpen] = useState(false);\n\n // Get filter context from parent\n const {\n filters,\n updateFilter,\n onFilterChange,\n hiddenFilters,\n filterGroupRef,\n } = useContext(FilterGroupContext);\n\n const containerQuery = useContainerQuery(filterGroupRef);\n const showInlineFilters =\n containerQuery &&\n containerQuery.name !== \"xs\" &&\n containerQuery.name !== \"sm\";\n\n // Local draft state for filters within the drawer\n const [draftFilters, setDraftFilters] = useState<Filter[]>(filters);\n\n // Local search value state for combobox search fields\n const [searchValues, setSearchValues] = useState<Record<string, string>>({});\n\n // Count active filters based on view mode\n const activeFiltersCount = getActiveFilters(\n !showInlineFilters ? filters : hiddenFilters,\n ).length;\n\n /**\n * Reset draft filters when drawer opens or context filters change\n * Ensures drawer always shows current filter state when opened\n */\n useEffect(() => {\n if (open) {\n // Deep clone the filters to ensure all nested properties are copied\n setDraftFilters(\n filters.map((filter) => {\n switch (filter.type) {\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: filter.selectedItem\n ? filter.items.find(\n (item) => item.id === filter.selectedItem?.id,\n ) || filter.selectedItem\n : undefined,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: filter.selectedItems\n ? filter.selectedItems.map((selectedItem) => {\n // Find the matching item in the current items list\n const matchingItem = filter.items.find(\n (item) => item.id === selectedItem.id,\n );\n return matchingItem || selectedItem;\n })\n : [],\n };\n case \"date\":\n return {\n ...filter,\n value: filter.value as string | null,\n };\n case \"dateRange\":\n return {\n ...filter,\n value: filter.value as {\n startDate: string | null;\n endDate: string | null;\n } | null,\n };\n case \"custom\":\n return {\n ...filter,\n value: filter.value ? { ...filter.value } : undefined,\n };\n default:\n return { ...filter };\n }\n }),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n /**\n * Handles changing a draft filter value\n * Updates only the draft state, not the actual filters\n *\n * @param filterId - ID of the filter to update\n * @param value - New value for the filter\n */\n const handleDraftChange = useCallback(\n (filterId: string, value: unknown) => {\n setDraftFilters((draft) => updateSingleFilter(draft, filterId, value));\n\n // Reset search when selection is made for filters with search\n const filter = filters.find((f) => f.id === filterId);\n if (\n (filter?.type === \"singleSelect\" || filter?.type === \"multiSelect\") &&\n filter.hasSearch &&\n value\n ) {\n // Clear the search value\n setSearchValues((prev) => ({ ...prev, [filterId]: \"\" }));\n // Reset the items list\n requestAnimationFrame(() => {\n filter.onSearch?.(\"\");\n });\n }\n },\n [filters],\n );\n\n /**\n * Clears all draft filters in the drawer\n * Does not affect the actual filters until Apply is clicked\n */\n const clearDraftFilters = () => {\n setDraftFilters(resetFilters(draftFilters));\n };\n\n const hasActiveDraftFilters = checkActiveFilters(draftFilters);\n\n /**\n * Render filter form controls based on filter types\n * Delegates rendering to appropriate components based on filter type\n */\n const filterForm = useMemo(\n () =>\n draftFilters.map((draftFilter) => {\n // Find the original filter to get the render functions\n const originalFilter = filters.find((f) => f.id === draftFilter.id);\n if (!originalFilter) return null;\n\n switch (draftFilter.type) {\n case \"boolean\":\n return (\n <Checkbox\n key={draftFilter.id}\n label={draftFilter.label}\n checked={draftFilter.checked}\n onChange={(e) =>\n handleDraftChange(draftFilter.id, e?.target.checked ?? false)\n }\n />\n );\n case \"custom\": {\n const customFilter = originalFilter as CustomFilter;\n return (\n <div key={draftFilter.id}>\n {customFilter.drawerRender?.({\n value: draftFilter.value,\n onChange: (value) => handleDraftChange(draftFilter.id, value),\n })}\n </div>\n );\n }\n case \"singleSelect\": {\n const singleSelectFilter = originalFilter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n const draftSingleSelectFilter = draftFilter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n\n if (singleSelectFilter.simpleDrawerVariant) {\n // Simple variant: Radio group\n return (\n <div key={draftFilter.id}>\n <Radio.Group legend={singleSelectFilter.label}>\n {singleSelectFilter.items.map((item) => (\n <Radio\n key={item.id}\n name={`${singleSelectFilter.id}-radio`}\n value={item.id}\n label={item.label}\n checked={\n draftSingleSelectFilter.selectedItem?.id === item.id\n }\n onChange={(e) => {\n if (e?.target.checked) {\n const selected = singleSelectFilter.items.find(\n (opt) => opt.id === e.target.value,\n );\n handleDraftChange(draftFilter.id, selected);\n }\n }}\n />\n ))}\n </Radio.Group>\n </div>\n );\n } else {\n // Default variant: Combobox with search\n // Ensure selected item uses the reference from current items array\n const selectedItem = draftSingleSelectFilter.selectedItem\n ? (singleSelectFilter.items?.find(\n (item) =>\n item.id === draftSingleSelectFilter.selectedItem?.id,\n ) ?? null)\n : null;\n\n return (\n <Combobox\n key={draftFilter.id}\n items={singleSelectFilter.items}\n selectedItem={selectedItem}\n onChange={(\n selectedItem: { id: string; label: string } | null,\n ) => {\n handleDraftChange(draftFilter.id, selectedItem);\n }}\n itemToString={(item) => item?.label ?? \"\"}\n disableFilter={singleSelectFilter.hasSearch}\n >\n {singleSelectFilter.hasSearch ? (\n <Combobox.SearchField\n label={draftSingleSelectFilter.label}\n prefix={{ icon: { svg: Search } }}\n placeholder=\"Search...\"\n size=\"small\"\n value={\n draftSingleSelectFilter.selectedItem?.label ||\n searchValues[draftFilter.id] ||\n \"\"\n }\n onChange={(e) => {\n const searchValue = e.target.value;\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: searchValue,\n }));\n singleSelectFilter.onSearch?.(searchValue);\n }}\n onClear={() => {\n // Clear our controlled search value\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: \"\",\n }));\n // Clear the selection\n handleDraftChange(draftFilter.id, undefined);\n // Reset the parent's items list\n singleSelectFilter.onSearchClear?.();\n }}\n data-anv=\"filter-drawer-combobox-search\"\n />\n ) : (\n <Combobox.SelectTrigger\n label={singleSelectFilter.label}\n placeholder=\"Select an option...\"\n size=\"small\"\n />\n )}\n <Combobox.Content>\n {({ items }) => (\n <Combobox.List style={{ padding: 0 }}>\n {items.map((item, i) => (\n <Combobox.Item key={item.id} item={item} index={i}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n );\n }\n }\n case \"multiSelect\": {\n const multiSelectFilter = originalFilter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n const draftMultiSelectFilter = draftFilter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n\n if (multiSelectFilter.simpleDrawerVariant) {\n // Simple variant: ListView\n return (\n <Checkbox.Group\n key={draftFilter.id}\n legend={multiSelectFilter.label}\n >\n {multiSelectFilter.items.map((item) => (\n <Checkbox\n key={item.id}\n label={item.label}\n checked={\n draftMultiSelectFilter.selectedItems?.some(\n (selected) => selected.id === item.id,\n ) ?? false\n }\n onChange={(e) => {\n const currentSelected =\n draftMultiSelectFilter.selectedItems || [];\n if (e?.target.checked) {\n // Add item to selection\n handleDraftChange(draftFilter.id, [\n ...currentSelected,\n item,\n ]);\n } else {\n // Remove item from selection\n handleDraftChange(\n draftFilter.id,\n currentSelected.filter(\n (selected) => selected.id !== item.id,\n ),\n );\n }\n }}\n />\n ))}\n </Checkbox.Group>\n );\n } else {\n // Default variant: Combobox with multiple selection\n const hasActiveSearch =\n searchValues[draftFilter.id] &&\n searchValues[draftFilter.id].length > 0;\n\n return (\n <Combobox\n key={draftFilter.id}\n items={multiSelectFilter.items}\n selectedItems={draftMultiSelectFilter.selectedItems || []}\n onChange={(\n selectedItems: { id: string; label: string }[] | null,\n ) => handleDraftChange(draftFilter.id, selectedItems)}\n itemToString={(item) => item?.label ?? \"\"}\n itemToKey={(item) => item?.id ?? \"\"}\n disableFilter={multiSelectFilter.hasSearch}\n multiple\n disableCloseOnSelectItem={!hasActiveSearch}\n >\n {multiSelectFilter.hasSearch ? (\n <Combobox.SearchField\n label={multiSelectFilter.label}\n prefix={{ icon: { svg: Search } }}\n placeholder=\"Search...\"\n size=\"small\"\n value={searchValues[draftFilter.id] || \"\"}\n onChange={(e) => {\n const searchValue = e.target.value;\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: searchValue,\n }));\n multiSelectFilter.onSearch?.(searchValue);\n }}\n onClear={() => {\n // Clear our controlled search value\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: \"\",\n }));\n handleDraftChange(draftFilter.id, []);\n multiSelectFilter.onSearchClear?.();\n }}\n data-anv=\"filter-drawer-combobox-search\"\n />\n ) : (\n <Combobox.SelectTrigger\n label={multiSelectFilter.label}\n placeholder=\"Select options...\"\n size=\"small\"\n />\n )}\n <Combobox.Content>\n {({ items }) => (\n <Combobox.List style={{ padding: 0 }}>\n {items.map((item, i) => (\n <Combobox.Item key={item.id} item={item} index={i}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n );\n }\n }\n case \"date\": {\n return (\n <DateFieldSingle\n key={draftFilter.id}\n label={draftFilter.label}\n value={draftFilter.value as string | null}\n onChange={(change) => {\n handleDraftChange(draftFilter.id, change.date);\n }}\n mode={draftFilter.mode}\n />\n );\n }\n case \"dateRange\": {\n return (\n <DateFieldRange\n key={draftFilter.id}\n label={draftFilter.label}\n value={\n draftFilter.value as {\n startDate: string | null;\n endDate: string | null;\n } | null\n }\n onChange={(change) => {\n handleDraftChange(draftFilter.id, {\n startDate: change.startDate,\n endDate: change.endDate,\n });\n }}\n mode={draftFilter.mode}\n />\n );\n }\n default:\n return null;\n }\n }),\n [draftFilters, filters, searchValues, handleDraftChange],\n );\n\n /**\n * Applies all draft filter changes to the actual filters\n * Updates filters individually then triggers batch update\n */\n const applyFiltering = () => {\n // Update all filters with their current draft values\n draftFilters.forEach((draftFilter) => {\n switch (draftFilter.type) {\n case \"boolean\":\n updateFilter(draftFilter.id, draftFilter.checked, false);\n break;\n case \"singleSelect\":\n updateFilter(\n draftFilter.id,\n (draftFilter as SingleSelectFilter).selectedItem,\n false,\n );\n break;\n case \"multiSelect\":\n updateFilter(\n draftFilter.id,\n (draftFilter as MultiSelectFilter).selectedItems,\n false,\n );\n break;\n case \"date\":\n case \"dateRange\":\n case \"custom\":\n updateFilter(draftFilter.id, draftFilter.value, false);\n break;\n }\n });\n\n // Submit all filters at once after updates\n onFilterChange?.(draftFilters);\n setOpen(false);\n };\n\n const handleCancel = () => {\n setOpen(false);\n };\n\n const hasHiddenActiveFilters = activeFiltersCount > 0;\n\n const triggerClasses = cx(\n styles[\"filter-button-trigger\"],\n styles[\"filter-drawer-trigger\"],\n {\n [styles[\"filter-drawer-trigger--chipped\"]]: hasHiddenActiveFilters,\n },\n );\n\n return (\n <>\n <ButtonToggle\n data-anv=\"filter-group-drawer-trigger\"\n icon={{ before: IconTune }}\n onClick={() => setOpen(true)}\n className={triggerClasses}\n checked={open}\n >\n Filters\n {hasHiddenActiveFilters && (\n <Chip\n size=\"small\"\n color=\"#0265DC\"\n label={activeFiltersCount.toString()}\n />\n )}\n </ButtonToggle>\n\n <Drawer\n data-anv=\"filter-group-drawer\"\n data-testid=\"filter-group-drawer\"\n open={open}\n onClose={() => setOpen(false)}\n >\n <Drawer.Content>\n <Flex direction=\"column\" gap={6} grow={1}>\n {filterForm}\n </Flex>\n </Drawer.Content>\n\n <Drawer.Footer>\n <Flex\n justifyContent={\n hasActiveDraftFilters ? \"space-between\" : \"flex-end\"\n }\n grow={1}\n >\n {hasActiveDraftFilters && (\n <Button\n appearance=\"ghost\"\n icon={{ before: IconClose }}\n onClick={clearDraftFilters}\n >\n Clear All Filters\n </Button>\n )}\n\n <Flex gap=\"3\">\n <Button onClick={handleCancel}>Cancel</Button>\n <Button appearance=\"primary\" onClick={applyFiltering}>\n Apply\n </Button>\n </Flex>\n </Flex>\n </Drawer.Footer>\n </Drawer>\n </>\n );\n};\n","import {\n ComponentPropsWithoutRef,\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n useCallback,\n} from \"react\";\nimport { useMergeRefs } from \"../../../../hooks\";\nimport CloseIcon from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport {\n BooleanFilter,\n CustomFilter,\n DateFilter,\n DateRangeFilter,\n Filter,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"./internal/types\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport Button from \"../../../../components/Button\";\nimport { LayoutUtilProps } from \"../../../../types\";\nimport { useContainerQuery } from \"../../../../internal/hooks\";\nimport {\n checkActiveFilters,\n resetFilters,\n updateSingleFilter,\n} from \"./internal/utils/filter-state\";\nimport { FilterToggleButton } from \"./FilterToggleButton\";\nimport { FilterButton } from \"./FilterButton\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { ToolbarControlGroup } from \"../ToolbarControlGroup\";\nimport { FilterDrawer } from \"./FilterDrawer\";\n\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterGroup component\n *\n * @extends ComponentPropsWithoutRef<\"div\">\n * @extends LayoutUtilProps\n */\nexport type FilterGroupProps = ComponentPropsWithoutRef<\"div\"> &\n LayoutUtilProps & {\n /** Array of filter objects */\n filters: Filter[];\n /** Callback function when filters change */\n onFilterChange?: (filters: Filter[]) => void;\n /** Whether the filters are submission is controlled via an apply button */\n controlledFiltering?: boolean;\n };\n\n/**\n * FilterGroup component displays a group of filters with toggles and a clear button.\n * Also contains the FilterDrawer for additional filter options.\n *\n * Features:\n * - Renders filter toggles and popovers for all filter types\n * - Supports controlled and uncontrolled filtering\n * - Integrates with FilterDrawer for batch filter editing\n * - Provides a clear all filters button\n * - Handles overflow and hidden filters\n * - Shares filter state via context for child components\n * - Supports boolean, custom, single-select, multi-select, date, and date range filter types\n * - Preserves filter state when filter configuration changes\n *\n * @example\n * <FilterGroup\n * filters={filters}\n * onFilterChange={handleFilter}\n * controlledFiltering={true}\n * />\n */\nconst FilterGroupElement = forwardRef<HTMLDivElement, FilterGroupProps>(\n (props, ref) => {\n const {\n filters: initialFilters,\n onFilterChange,\n controlledFiltering = false,\n ...rest\n } = props;\n\n const [filters, setFilters] = useState<Filter[]>(initialFilters);\n const [hiddenFilters, setHiddenFilters] = useState<Filter[]>([]);\n const filterGroupRef = useRef<HTMLDivElement>(null);\n const containerQuery = useContainerQuery(filterGroupRef);\n\n const showInlineFilters =\n containerQuery &&\n containerQuery.name !== \"xs\" &&\n containerQuery.name !== \"sm\";\n\n // Temporary override to test if filters show when forced to true\n // const showInlineFilters = true;\n\n // Update filters when props change\n useEffect(() => {\n setFilters((prevFilters) => {\n return initialFilters.map((newFilter: Filter) => {\n // Find the existing filter with the same ID\n const existingFilter = prevFilters.find((f) => f.id === newFilter.id);\n\n // If we have an existing filter, preserve its selected state\n if (existingFilter) {\n switch (newFilter.type) {\n case \"boolean\":\n return {\n ...newFilter,\n checked: (existingFilter as BooleanFilter).checked,\n };\n case \"singleSelect\":\n return {\n ...newFilter,\n selectedItem: (existingFilter as SingleSelectFilter<unknown>)\n .selectedItem,\n };\n case \"multiSelect\":\n return {\n ...newFilter,\n selectedItems: (existingFilter as MultiSelectFilter<unknown>)\n .selectedItems,\n };\n case \"date\":\n return {\n ...newFilter,\n value: (existingFilter as DateFilter).value,\n };\n case \"dateRange\":\n return {\n ...newFilter,\n value: (existingFilter as DateRangeFilter).value,\n };\n case \"custom\":\n return {\n ...newFilter,\n value: (existingFilter as CustomFilter<unknown>).value,\n };\n default:\n return newFilter;\n }\n }\n\n return newFilter;\n });\n });\n }, [initialFilters]);\n\n /**\n * Updates filter state when a filter is changed\n *\n * @param filterId - ID of the filter to update\n * @param value - New value for the filter\n */\n const updateFilter = useCallback(\n (filterId: string, value: unknown, submit: boolean) => {\n setFilters((prevFilters) => {\n const updatedFilters = updateSingleFilter(\n prevFilters,\n filterId,\n value,\n );\n\n if (submit) {\n onFilterChange?.(updatedFilters);\n }\n\n return updatedFilters;\n });\n },\n [onFilterChange],\n );\n\n /**\n * Adds a filter to the list of hidden filters.\n *\n * @param filter - The filter to add to the hidden filters array\n */\n const addHiddenFilter = useCallback((filter: Filter) => {\n setHiddenFilters((prev) => [...prev, filter]);\n }, []);\n\n /**\n * Removes a filter from the list of hidden filters.\n *\n * @param filter - The filter to remove from the hidden filters array\n */\n const removeHiddenFilter = useCallback((filter: Filter) => {\n setHiddenFilters((prev) => prev.filter((f) => f.id !== filter.id));\n }, []);\n\n /**\n * Clears all active filters\n */\n const clearAllFilters = () => {\n const resetAllFilters = resetFilters(filters);\n setFilters(resetAllFilters);\n onFilterChange?.(resetAllFilters);\n\n // Since the clear button disappears after clearing, we need to set focus on the first focusable element in the filter group\n setTimeout(() => {\n if (filterGroupRef.current) {\n const firstFocusable = filterGroupRef.current.querySelector(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ) as HTMLElement;\n\n if (firstFocusable) {\n firstFocusable.focus();\n }\n }\n }, 0);\n };\n\n const hasActiveFilters = checkActiveFilters(filters);\n\n // Create filter controls that are displayed in the group\n const filterGroupControls = filters.map((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return (\n <FilterToggleButton\n key={filter.id}\n id={filter.id}\n checked={filter.checked}\n onClick={() => {\n updateFilter(filter.id, !filter.checked, true);\n }}\n >\n {filter.label}\n </FilterToggleButton>\n );\n case \"custom\":\n case \"singleSelect\":\n case \"multiSelect\":\n case \"date\":\n case \"dateRange\":\n return <FilterButton key={filter.id} filter={filter} />;\n // TODO: Add cases for other filter types here as needed\n default:\n return null;\n }\n });\n\n const value = useMemo(\n () => ({\n filterGroupRef,\n filters,\n updateFilter,\n onFilterChange,\n controlledFiltering,\n hiddenFilters,\n addHiddenFilter,\n removeHiddenFilter,\n }),\n [\n filterGroupRef,\n filters,\n updateFilter,\n onFilterChange,\n controlledFiltering,\n hiddenFilters,\n addHiddenFilter,\n removeHiddenFilter,\n ],\n );\n\n return (\n <FilterGroupContext.Provider value={value}>\n <ToolbarControlGroup\n ref={useMergeRefs([filterGroupRef, ref])}\n data-anv=\"toolbar-filter-group\"\n aria-label=\"Filter controls\"\n {...rest}\n >\n {showInlineFilters && filterGroupControls}\n <FilterDrawer />\n\n {showInlineFilters && hasActiveFilters && (\n <FilterItemWrapper>\n <Button\n appearance=\"ghost\"\n size=\"small\"\n className={styles[\"filter-button-trigger\"]}\n icon={{\n before: CloseIcon,\n }}\n onClick={clearAllFilters}\n >\n Clear Filters\n </Button>\n </FilterItemWrapper>\n )}\n </ToolbarControlGroup>\n </FilterGroupContext.Provider>\n );\n },\n);\n\nFilterGroupElement.displayName = \"FilterGroup\";\n\nexport const FilterGroup = FilterGroupElement;\n","import { forwardRef, Ref } from \"react\";\nimport { SearchFieldProps, SearchField } from \"../../../components/SearchField\";\n\nimport cx from \"classnames\";\nimport styles from \"./ToolbarSearchField.module.scss\";\n\n/**\n * Props for the ToolbarSearchField component\n *\n * @extends Omit<SearchFieldProps, \"size\">\n */\nexport type ToolbarSearchFieldProps = Omit<SearchFieldProps, \"size\">;\n\n/**\n * ToolbarSearchField component renders a small-sized search field for use in toolbars.\n *\n * Features:\n * - Renders a search field styled for toolbar usage\n * - Always uses small size for compact layout\n * - Supports all SearchField props except size\n * - Integrates with toolbar layouts and accessibility\n *\n * @example\n * <ToolbarSearchField placeholder=\"Search...\" />\n */\nexport const ToolbarSearchField = forwardRef(\n (props: ToolbarSearchFieldProps, ref: Ref<HTMLInputElement>) => {\n const { className, ...rest } = props;\n\n const searchFieldStyles = cx(styles[\"toolbar-search-field\"], className);\n\n return (\n <div className={styles[\"toolbar-search-field-container\"]}>\n <SearchField\n ref={ref}\n className={searchFieldStyles}\n size=\"small\"\n data-anv=\"toolbar-search-field\"\n {...rest}\n />\n </div>\n );\n },\n);\n\nToolbarSearchField.displayName = \"ToolbarSearchField\";\n","import { ToolbarButton } from \"./ToolbarButton\";\nimport { ToolbarButtonToggle } from \"./ToolbarButtonToggle\";\nimport { ToolbarButtonLink } from \"./ToolbarButtonLink\";\nimport { ToolbarSelect } from \"./ToolbarSelect\";\nimport { ToolbarItemProps, ToolbarOverflowTypes } from \"./types\";\nimport {\n ComponentPropsWithoutRef,\n forwardRef,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { LayoutUtilProps } from \"../../../types\";\nimport { useLayoutPropsUtil } from \"../../../internal/hooks\";\nimport {\n handleToolbarKeyDown,\n updateToolbarItemsTabIndex,\n} from \"./internal/utils/accessibility\";\nimport { ToolbarOverflowContext } from \"./internal/ToolbarOverflowContext\";\nimport Flex from \"../../../components/Flex\";\nimport { useMergeRefs } from \"../../../hooks\";\nimport { ToolbarOverflowMenu } from \"./internal/ToolbarOverflowMenu\";\nimport { FilterGroup } from \"./Filters/FilterGroup\";\nimport { ToolbarControlGroup } from \"./ToolbarControlGroup\";\nimport { ToolbarSearchField } from \"./ToolbarSearchField\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Props for the Toolbar component\n * @extends ComponentPropsWithoutRef<\"div\">\n * @extends LayoutUtilProps\n */\nexport type ToolbarProps = ComponentPropsWithoutRef<\"div\"> &\n LayoutUtilProps & {\n /**\n * Description of the content this toolbar is associated with, used for accessibility\n */\n associatedContent: string;\n /**\n * Orientation of the toolbar\n * @default horizontal\n */\n direction?: \"vertical\" | \"horizontal\";\n /**\n * How to handle overflow when items don't fit\n * @default wrap\n */\n overflow?: ToolbarOverflowTypes;\n /**\n * Additional items to display in the overflow menu\n */\n additionalItems?: ReactElement[];\n };\n\n/**\n * Toolbar component for grouping related interactive elements with anvil2 tracking.\n *\n * Features:\n * - Horizontal or vertical orientation\n * - Overflow handling with wrap or collapse behavior\n * - Keyboard navigation following ARIA best practices\n * - Screen reader announcements and accessibility\n * - Automatic overflow menu for collapsed items\n * - Support for buttons, toggles, selects, and links\n * - Layout utilities for positioning and spacing\n * - Context-based state management for child components\n * - Automatic tracking ID generation for analytics\n * - Integration with anvil2 tracking system\n *\n * @example\n * <Toolbar associatedContent=\"document editor\" overflow=\"collapse\">\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold\" />\n * <Toolbar.ButtonToggle icon={ItalicIcon} aria-label=\"Italic\" />\n * <Toolbar.Select\n * items={fontOptions}\n * selected=\"arial\"\n * accessibleLabel=\"Font family\"\n * />\n * </Toolbar>\n */\nexport const ToolbarElement = forwardRef<HTMLDivElement, ToolbarProps>(\n (props, ref) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const {\n associatedContent,\n className,\n children,\n style,\n direction = \"horizontal\",\n overflow = \"wrap\",\n onKeyDown,\n additionalItems,\n ...rest\n } = componentProps;\n\n // State for tracking items that should appear in the overflow menu\n const [overflowItems, setOverflowItems] = useState<ToolbarItemProps[]>([]);\n const toolbarItemsRef = useRef<HTMLDivElement>(null);\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n // Track original order of items to maintain consistent ordering in the overflow menu\n const [orderedIds, setOrderedIds] = useState<string[]>([]);\n\n // Update ordered IDs when children change to maintain correct overflow order\n useEffect(() => {\n const newOrderedIds = Array.from(\n toolbarItemsRef.current?.querySelectorAll(\"[data-id]\") || [],\n ).map((el) => {\n return el.getAttribute(\"data-id\") as string;\n });\n\n setOrderedIds(newOrderedIds);\n }, [children]);\n\n // Add item to overflow menu\n const addItem = useCallback((item: ToolbarItemProps) => {\n setOverflowItems((prev) => [...prev, item]);\n }, []);\n\n // Remove item from overflow menu\n const removeItem = useCallback((item: ToolbarItemProps) => {\n setOverflowItems((prev) =>\n prev.filter((component) => component.id !== item.id),\n );\n }, []);\n\n // Initialize tabindex values\n useEffect(() => {\n if (toolbarRef.current) {\n // Initialize toolbar with the first item active\n updateToolbarItemsTabIndex(toolbarRef.current);\n }\n }, [children]);\n\n // Handle keyboard navigation events within the toolbar\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (toolbarRef.current) {\n handleToolbarKeyDown(event, toolbarRef.current);\n }\n\n onKeyDown?.(event);\n },\n [onKeyDown],\n );\n\n // Determine if overflow menu should be shown\n const showOverflowMenu =\n (overflow === \"collapse\" && overflowItems.length > 0) ||\n !!additionalItems;\n\n // Context value provided to all toolbar children\n const value = useMemo(\n () => ({\n overflowItems,\n addItem,\n removeItem,\n toolbarRef,\n orderedIds,\n overflow,\n }),\n [overflowItems, addItem, removeItem, toolbarRef, orderedIds, overflow],\n );\n\n const styleCombined = {\n ...style,\n ...layoutStyles,\n };\n\n const toolbarClassNames = cx(styles[\"toolbar\"], className);\n\n const toolbarContentClassNames = cx(styles[\"toolbar-content\"], {\n [styles[`overflow-${overflow}`]]: overflow,\n });\n\n return (\n <ToolbarOverflowContext.Provider value={value}>\n <Flex\n direction={direction === \"horizontal\" ? \"row\" : \"column\"}\n wrap={overflow === \"wrap\" ? \"wrap\" : \"nowrap\"}\n alignItems=\"center\"\n className={toolbarClassNames}\n style={styleCombined}\n ref={useMergeRefs([toolbarRef, ref])}\n role=\"toolbar\"\n data-anv=\"toolbar\"\n aria-orientation={direction}\n aria-label={`Toolbar for ${associatedContent}. Use arrow keys to navigate through toolbar controls.`}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <Flex\n ref={useMergeRefs([toolbarItemsRef, ref])}\n className={toolbarContentClassNames}\n direction={direction === \"horizontal\" ? \"row\" : \"column\"}\n wrap={overflow === \"wrap\" ? \"wrap\" : \"nowrap\"}\n alignItems=\"center\"\n grow={1}\n data-anv=\"toolbar-content\"\n data-overflow={overflow}\n >\n {children}\n </Flex>\n\n {showOverflowMenu && (\n <ToolbarOverflowMenu\n direction={direction}\n additionalItems={additionalItems}\n />\n )}\n </Flex>\n </ToolbarOverflowContext.Provider>\n );\n },\n);\n\nToolbarElement.displayName = \"Toolbar\";\n\n/**\n * Toolbar component for grouping related interactive elements.\n *\n * Features:\n * - Horizontal or vertical orientation\n * - Overflow handling with wrap or collapse behavior\n * - Keyboard navigation following ARIA best practices\n * - Screen reader announcements and accessibility\n * - Automatic overflow menu for collapsed items\n * - Support for buttons, toggles, selects, and links\n * - Layout utilities for positioning and spacing\n * - Context-based state management for child components\n *\n * @example\n * <Toolbar associatedContent=\"document editor\" overflow=\"collapse\">\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold\" />\n * <Toolbar.ButtonToggle icon={ItalicIcon} aria-label=\"Italic\" />\n * <Toolbar.Select\n * items={fontOptions}\n * selected=\"arial\"\n * accessibleLabel=\"Font family\"\n * />\n * </Toolbar>\n *\n * @example\n * <Toolbar associatedContent=\"data table\" overflow=\"wrap\">\n * <Toolbar.Search placeholder=\"Search...\" />\n * <Toolbar.Filters\n * filters={filters}\n * onFilterChange={handleFilter}\n * controlledFiltering={true}\n * />\n * <Toolbar.ControlGroup aria-label=\"Actions\">\n * <Toolbar.Button icon={AddIcon} aria-label=\"Add item\" />\n * <Toolbar.Button icon={ExportIcon} aria-label=\"Export\" />\n * </Toolbar.ControlGroup>\n * </Toolbar>\n */\nexport const Toolbar = Object.assign(ToolbarElement, {\n /**\n * ToolbarButton component for standard clickable actions within a toolbar with anvil2 tracking.\n *\n * Features:\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Automatic tooltip for icon-only buttons\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold text\" />\n *\n * @example\n * <Toolbar.Button appearance=\"primary\">\n * Save\n * </Toolbar.Button>\n */\n Button: ToolbarButton,\n /**\n * ToolbarButtonToggle component for toggleable actions within a toolbar with anvil2 tracking.\n *\n * Features:\n * - Toggle state management\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Toolbar.ButtonToggle icon={BoldIcon} aria-label=\"Bold\" checked={isBold} />\n */\n ButtonToggle: ToolbarButtonToggle,\n /**\n * ToolbarButtonLink component for link actions within a toolbar with anvil2 tracking.\n *\n * Features:\n * - Link functionality with href support\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Toolbar.ButtonLink href=\"/help\">\n * Help\n * </Toolbar.ButtonLink>\n */\n ButtonLink: ToolbarButtonLink,\n /**\n * ToolbarSelect component provides a dropdown selector within a toolbar with anvil2 tracking.\n *\n * Features:\n * - Dropdown menu with selectable options\n * - Controlled and uncontrolled usage patterns\n * - Automatic overflow menu integration\n * - Accessibility support with proper ARIA labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Dropdown arrow icon indicator\n * - Listbox integration for keyboard navigation\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Toolbar.Select\n * items={fontOptions}\n * selected=\"arial\"\n * accessibleLabel=\"Font family\"\n * onChange={(id) => setFont(id)}\n * />\n */\n Select: ToolbarSelect,\n /**\n * FilterGroup component displays a group of filters with toggles and a clear button.\n * Also contains the FilterDrawer for additional filter options.\n *\n * Features:\n * - Renders filter toggles and popovers for all filter types\n * - Supports controlled and uncontrolled filtering\n * - Integrates with FilterDrawer for batch filter editing\n * - Provides a clear all filters button\n * - Handles overflow and hidden filters\n * - Shares filter state via context for child components\n * - Supports boolean, custom, single-select, multi-select, date, and date range filter types\n * - Date filters include calendar popup for easy selection\n * - Date range filters support start and end date selection\n *\n * @example\n * <Toolbar.Filters\n * filters={filters}\n * onFilterChange={handleFilter}\n * controlledFiltering={true}\n * />\n */\n Filters: FilterGroup,\n /**\n * ToolbarControlGroup component provides a flex container for grouping related toolbar controls.\n * Can be used for filters, buttons, or other toolbar items.\n *\n * Features:\n * - Groups related toolbar controls in a flex container\n * - Supports accessibility with aria-label\n * - Handles overflow and wrapping based on toolbar context\n * - Integrates with layout utilities for spacing and alignment\n *\n * @example\n * <Toolbar.ControlGroup aria-label=\"Formatting controls\">\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold\" />\n * <Toolbar.Button icon={ItalicIcon} aria-label=\"Italic\" />\n * </Toolbar.ControlGroup>\n */\n ControlGroup: ToolbarControlGroup,\n /**\n * ToolbarSearchField component renders a small-sized search field for use in toolbars.\n *\n * Features:\n * - Renders a search field styled for toolbar usage\n * - Always uses small size for compact layout\n * - Supports all SearchField props except size\n * - Integrates with toolbar layouts and accessibility\n *\n * @example\n * <Toolbar.Search placeholder=\"Search...\" />\n */\n Search: ToolbarSearchField,\n});\n"],"names":["core.primitive?.BreakpointSm","core.primitive?.BreakpointMd","core.primitive?.BreakpointLg","core.primitive?.BreakpointXl","core.primitive?.BreakpointXxl","styles","item","ArrowDropDown","items","MoreHoriz","MoreVert","Event","selectedItem","Search","IconTune","IconClose","value","CloseIcon"],"mappings":"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"}
1
+ {"version":3,"file":"Toolbar-BvFwcXOk.js","sources":["../src/internal/hooks/useContainerQuery/useContainerQuery.ts","../src/beta/components/Toolbar/internal/ToolbarItemOverflowContext.tsx","../src/beta/components/Toolbar/internal/ToolbarOverflowContext.tsx","../src/beta/components/Toolbar/internal/utils/accessibility.ts","../src/beta/components/Toolbar/internal/ToolbarItemWrapper.tsx","../src/beta/components/Toolbar/ToolbarButton.tsx","../src/beta/components/Toolbar/ToolbarButtonToggle.tsx","../src/beta/components/Toolbar/ToolbarButtonLink.tsx","../src/beta/components/Toolbar/ToolbarSelect.tsx","../src/beta/components/Toolbar/internal/ToolbarOverflowMenu.tsx","../src/beta/components/Toolbar/Filters/internal/FilterGroupContext.tsx","../src/beta/components/Toolbar/Filters/FilterItemWrapper.tsx","../src/beta/components/Toolbar/Filters/internal/utils/filter-state.ts","../src/beta/components/Toolbar/Filters/FilterToggleButton.tsx","../src/beta/components/Toolbar/Filters/FilterSelect.tsx","../src/beta/components/Toolbar/Filters/FilterDateSingle.tsx","../src/beta/components/Toolbar/Filters/FilterDateRange.tsx","../src/beta/components/Toolbar/Filters/FilterButton.tsx","../src/beta/components/Toolbar/ToolbarControlGroup.tsx","../../hammer-icon/mdi/round/tune.svg","../src/beta/components/Toolbar/Filters/FilterDrawer.tsx","../src/beta/components/Toolbar/Filters/FilterGroup.tsx","../src/beta/components/Toolbar/ToolbarSearchField.tsx","../src/beta/components/Toolbar/Toolbar.tsx"],"sourcesContent":["import { useEffect, useState, RefObject } from \"react\";\nimport { core } from \"@servicetitan/hammer-token\";\n\n/**\n * Return type for the useContainerQuery hook\n */\nexport type ContainerQueryReturnProps = {\n /**\n * The breakpoint name\n */\n name: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\";\n /**\n * Minimum width for this breakpoint\n */\n min: number | undefined;\n /**\n * Maximum width for this breakpoint\n */\n max: number | undefined;\n /**\n * Current container width\n */\n containerWidth: number;\n /**\n * Current container height\n */\n containerHeight: number;\n};\n\n/**\n * Determines if the current container width matches a specific breakpoint\n * @param containerWidth - The container width\n * @param name - The breakpoint name\n * @param min - Minimum width for this breakpoint\n * @param max - Maximum width for this breakpoint\n * @returns Breakpoint information if matched, undefined otherwise\n */\nfunction containerBreakpoint(\n containerWidth: number,\n name: ContainerQueryReturnProps[\"name\"],\n min?: number,\n max?: number,\n): ContainerQueryReturnProps | undefined {\n if (\n (min == null || containerWidth >= min) &&\n (max == null || containerWidth < max)\n ) {\n return {\n name,\n min,\n max,\n containerWidth,\n containerHeight: 0, // Will be updated with actual height\n } as const;\n }\n return undefined;\n}\n\n/**\n * Determines the current breakpoint based on container width and hammer-token breakpoint values.\n *\n * Features:\n * - Validates that all required hammer-token breakpoint values are available\n * - Uses cascade logic to determine the appropriate breakpoint\n * - Returns the first matching breakpoint in order of preference\n * - Handles edge cases where breakpoint values are missing\n * - Uses container dimensions for accurate measurements\n * - Supports all standard breakpoints (xs, sm, md, lg, xl, xxl)\n *\n * @param containerWidth - The width of the container element\n * @param containerHeight - The height of the container element\n * @returns Current breakpoint information or undefined if breakpoint values are unavailable\n */\nconst getContainerBreakpoint = (\n containerWidth: number,\n containerHeight: number,\n) => {\n if (!core.primitive?.BreakpointSm) return;\n if (!core.primitive?.BreakpointMd) return;\n if (!core.primitive?.BreakpointLg) return;\n if (!core.primitive?.BreakpointXl) return;\n if (!core.primitive?.BreakpointXxl) return;\n\n const sm = parseInt(core.primitive?.BreakpointSm.value);\n const md = parseInt(core.primitive?.BreakpointMd.value);\n const lg = parseInt(core.primitive?.BreakpointLg.value);\n const xl = parseInt(core.primitive?.BreakpointXl.value);\n const xxl = parseInt(core.primitive?.BreakpointXxl.value);\n\n const result =\n containerBreakpoint(containerWidth, \"xs\", undefined, sm) ??\n containerBreakpoint(containerWidth, \"sm\", sm, md) ??\n containerBreakpoint(containerWidth, \"md\", md, lg) ??\n containerBreakpoint(containerWidth, \"lg\", lg, xl) ??\n containerBreakpoint(containerWidth, \"xl\", xl, xxl) ??\n containerBreakpoint(containerWidth, \"xxl\", xxl, undefined);\n\n return result ? { ...result, containerHeight } : undefined;\n};\n\n/**\n * Custom hook for detecting current breakpoint based on container dimensions.\n *\n * Features:\n * - Detects current breakpoint based on container width instead of viewport width\n * - Supports all standard breakpoints (xs, sm, md, lg, xl, xxl)\n * - Provides container dimensions information\n * - Uses hammer-token breakpoint values for consistency\n * - Listens for container resize events using ResizeObserver\n * - Supports optional disable functionality\n * - Uses container element dimensions for accurate measurements\n *\n * @param containerRef - React ref to the container element to observe\n * @param props - Optional configuration object\n * @param props.disable - Whether to disable the hook\n * @returns Current breakpoint information or undefined if disabled\n */\nexport const useContainerQuery = (\n containerRef: RefObject<HTMLElement>,\n props?: { disable?: boolean },\n) => {\n const [size, setSize] = useState<ContainerQueryReturnProps | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (props?.disable || !containerRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n const breakpoint = getContainerBreakpoint(width, height);\n setSize(breakpoint);\n }\n });\n\n resizeObserver.observe(containerRef.current);\n\n // Set initial size\n const rect = containerRef.current.getBoundingClientRect();\n setSize(getContainerBreakpoint(rect.width, rect.height));\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [containerRef, props?.disable]);\n\n if (props?.disable) return undefined;\n return size;\n};\n","import { createContext, useContext } from \"react\";\n\n/**\n * Context for denoting if the current item is rendered in the overflow menu\n */\ntype OverflowItemContextType = {\n /**\n * Whether the current item is rendered inside the overflow menu\n */\n isInOverflowMenu: boolean;\n};\n\n/**\n * Context for managing overflow menu state\n */\nexport const OverflowItemContext = createContext<OverflowItemContextType>({\n isInOverflowMenu: false,\n});\n\n/**\n * Hook for accessing overflow menu context\n * @returns OverflowItemContextType - The overflow menu context\n */\nexport const useOverFlowItemContext = () => useContext(OverflowItemContext);\n","import { createContext, RefObject } from \"react\";\nimport { ToolbarItemProps, ToolbarOverflowTypes } from \"../types\";\n\n/**\n * Context for sharing toolbar state with child components for overflow handling\n */\nexport type ToolbarOverFlowContextProps = {\n /**\n * Array of toolbar items that should appear in the overflow menu\n */\n overflowItems: ToolbarItemProps[];\n /**\n * Function to add an item to the overflow menu\n */\n addItem: (element: ToolbarItemProps) => void;\n /**\n * Function to remove an item from the overflow menu\n */\n removeItem: (element: ToolbarItemProps) => void;\n /**\n * Reference to the toolbar container element\n */\n toolbarRef: RefObject<HTMLDivElement>;\n /**\n * Array of item IDs in their original order\n */\n orderedIds?: string[];\n /**\n * Overflow behavior type (wrap or collapse)\n */\n overflow: ToolbarOverflowTypes;\n};\n\n/**\n * Context for managing toolbar overflow state and operations\n */\nexport const ToolbarOverflowContext =\n createContext<ToolbarOverFlowContextProps>({\n overflowItems: [],\n addItem: () => {\n return;\n },\n removeItem: () => {\n return;\n },\n toolbarRef: { current: null },\n orderedIds: [],\n overflow: \"wrap\",\n });\n","import { KeyboardEvent } from \"react\";\nimport { getKeyboardFocusableElements } from \"../../../../../internal/functions\";\n\n/**\n * Gets all visible focusable elements for a specific toolbar instance.\n * Filters out hidden items and includes the overflow trigger if present.\n */\nexport function getToolbarElements(toolbarElement: HTMLElement) {\n const toolbarContent = toolbarElement.querySelector<HTMLElement>(\n '[data-anv=\"toolbar-content\"]',\n );\n\n const mainItems = getKeyboardFocusableElements(toolbarContent).filter(\n (item) => {\n // Only include visible items that are explicitly marked as toolbar items\n const isHidden = !item.closest('[aria-hidden=\"true\"]');\n const isInDrawer = !item.closest('[data-anv=\"filter-group-drawer\"]');\n const isInPopover = !item.closest('[data-anv=\"popover-content\"]');\n return isHidden && isInDrawer && isInPopover;\n },\n );\n\n const overflowTrigger = toolbarElement.querySelector<HTMLElement>(\n '[data-anv=\"toolbar-overflow-trigger\"]',\n );\n\n return overflowTrigger ? [...mainItems, overflowTrigger] : mainItems;\n}\n\n/**\n * Updates tabindex values for all items in a toolbar.\n * Sets tabindex=\"0\" for the active item and tabindex=\"-1\" for all others.\n */\nexport function updateToolbarItemsTabIndex(\n toolbarElement: HTMLElement,\n activeItem?: Element | number,\n) {\n if (!toolbarElement) return;\n\n // Get all toolbar items\n const items = getToolbarElements(toolbarElement);\n if (!items.length) return;\n\n // Determine the active index - default to the first item\n let activeIndex = 0;\n\n if (typeof activeItem === \"number\") {\n // If activeItem is a number, use it directly\n activeIndex = Math.max(0, Math.min(activeItem, items.length - 1));\n } else if (activeItem instanceof Element) {\n // If activeItem is an element, find its index\n const foundIndex = items.indexOf(activeItem);\n if (foundIndex !== -1) {\n activeIndex = foundIndex;\n }\n }\n\n // Update tabindex values\n items.forEach((item, index) => {\n item.setAttribute(\"tabindex\", index === activeIndex ? \"0\" : \"-1\");\n });\n\n return items[activeIndex];\n}\n\n/**\n * Handles keyboard navigation within the toolbar component following ARIA practices.\n *\n * Navigation behavior:\n * - Left/Right arrows move focus in horizontal toolbars\n * - Up/Down arrows move focus in vertical toolbars\n * - Home/End move to first/last items\n * - Navigation wraps around at the ends\n * - Only visible items are included in navigation\n */\nexport function handleToolbarKeyDown(\n event: KeyboardEvent<HTMLElement>,\n toolbarElement: HTMLElement,\n) {\n if (!toolbarElement || event.altKey || event.ctrlKey || event.metaKey) return;\n\n const items = getToolbarElements(toolbarElement);\n if (!items.length) return;\n\n const activeElement = event.target as HTMLElement;\n if (!toolbarElement.contains(activeElement)) return;\n\n const activeItem = items.find(\n (item) =>\n item === activeElement ||\n Array.from(item.children).some((child) => child === activeElement),\n );\n\n const activeIndex = activeItem ? items.indexOf(activeItem) : -1;\n if (activeIndex === -1) return;\n\n let nextIndex = activeIndex;\n const isVertical =\n toolbarElement.getAttribute(\"aria-orientation\") === \"vertical\";\n\n switch (event.key) {\n case \"ArrowLeft\":\n case \"ArrowUp\":\n event.preventDefault();\n if (\n (isVertical && event.key === \"ArrowUp\") ||\n (!isVertical && event.key === \"ArrowLeft\")\n ) {\n nextIndex = activeIndex <= 0 ? items.length - 1 : activeIndex - 1;\n }\n break;\n\n case \"ArrowRight\":\n case \"ArrowDown\":\n event.preventDefault();\n if (\n (isVertical && event.key === \"ArrowDown\") ||\n (!isVertical && event.key === \"ArrowRight\")\n ) {\n nextIndex = activeIndex >= items.length - 1 ? 0 : activeIndex + 1;\n }\n break;\n\n case \"Home\":\n event.preventDefault();\n nextIndex = 0;\n break;\n\n case \"End\":\n event.preventDefault();\n nextIndex = items.length - 1;\n break;\n\n default:\n return;\n }\n\n updateToolbarItemsTabIndex(toolbarElement, nextIndex);\n (items[nextIndex] as HTMLElement)?.focus();\n}\n\n/**\n * Handles keyboard navigation within overflow menu using arrow keys\n */\nexport const handleMenuKeyboardNavigation = (\n event: KeyboardEvent<HTMLUListElement>,\n) => {\n const menuItems = Array.from(\n event.currentTarget.querySelectorAll('[role=\"menuitem\"]'),\n ).map((menuItem) => {\n // Get first focusable element or fallback to menuitem itself\n return getKeyboardFocusableElements(menuItem as HTMLElement)[0] || menuItem;\n });\n\n if (!menuItems.length) return;\n\n const currentIndex = menuItems.indexOf(document.activeElement as HTMLElement);\n if (currentIndex === -1) return;\n\n let nextIndex = currentIndex;\n const isModifierKey = event.altKey || event.ctrlKey || event.metaKey;\n\n if (isModifierKey) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n event.preventDefault();\n const direction = event.key === \"ArrowDown\" ? 1 : -1;\n nextIndex =\n (currentIndex + direction + menuItems.length) % menuItems.length;\n break;\n }\n case \"Home\":\n event.preventDefault();\n nextIndex = 0;\n break;\n case \"End\":\n event.preventDefault();\n nextIndex = menuItems.length - 1;\n break;\n default:\n return;\n }\n\n (menuItems[nextIndex] as HTMLElement)?.focus();\n};\n","import { useContext, useEffect, useId, useRef, useCallback } from \"react\";\nimport { ToolbarItemProps } from \"../types\";\nimport { ToolbarOverflowContext } from \"./ToolbarOverflowContext\";\nimport { useIntersectionObserver } from \"../../../../internal/hooks\";\nimport { updateToolbarItemsTabIndex } from \"./utils/accessibility\";\n\nimport cx from \"classnames\";\nimport styles from \"../Toolbar.module.scss\";\n\n/**\n * Props for the ToolbarItemWrapper component\n */\nexport type ToolbarItemWrapperProps = {\n /**\n * Toolbar item configuration without ID (ID is generated internally)\n */\n item: Omit<ToolbarItemProps, \"id\">;\n /**\n * The toolbar item component to wrap\n */\n children: React.ReactNode;\n /** Optional override for the intersection observer root element */\n observerRoot?: Element | null;\n /** Optional override for visibility change handling */\n onVisibilityChange?: (isVisible: boolean) => void;\n /** Optional margin offset for the intersection observer root */\n rootMargin?: string;\n /** Optional class name to apply to the wrapper element */\n className?: string;\n};\n\n/**\n * ToolbarItemWrapper manages item visibility and focus behavior within a toolbar.\n *\n * Features:\n * - Intersection observation for overflow detection\n * - Automatic overflow menu integration in collapse mode\n * - Focus management and keyboard navigation\n * - ARIA compliance for accessibility\n * - Visibility state management\n * - Proper tab index handling\n * - Context integration with toolbar state\n *\n * @example\n * <ToolbarItemWrapper item={{ itemType: \"button\", itemProps: buttonProps }}>\n * <ToolbarButton {...buttonProps} />\n * </ToolbarItemWrapper>\n */\nexport const ToolbarItemWrapper = ({\n item,\n children,\n observerRoot,\n onVisibilityChange,\n rootMargin,\n className,\n}: ToolbarItemWrapperProps) => {\n const { addItem, removeItem, toolbarRef, overflow } = useContext(\n ToolbarOverflowContext,\n );\n const itemId = useId();\n const elementRef = useRef<HTMLDivElement | null>(null);\n const isCollapseMode = overflow === \"collapse\";\n const prevIntersectingRef = useRef<boolean>(true); // Start as visible\n\n /**\n * Handles visibility changes from intersection observer in collapse mode\n * In collapse mode:\n * - When item becomes visible, removes it from overflow menu\n * - When item becomes hidden, adds it to overflow menu\n */\n const handleVisibilityChange = useCallback(\n (isVisible: boolean) => {\n if (!isCollapseMode || prevIntersectingRef.current === isVisible) return;\n\n if (onVisibilityChange) {\n onVisibilityChange(isVisible);\n } else if (item) {\n const itemWithId = { ...item, id: itemId };\n if (isVisible) {\n removeItem(itemWithId);\n } else {\n addItem(itemWithId);\n }\n }\n prevIntersectingRef.current = isVisible;\n },\n [isCollapseMode, onVisibilityChange, item, itemId, addItem, removeItem],\n );\n\n const { isIntersecting, ref } = useIntersectionObserver({\n root: isCollapseMode ? (observerRoot ?? toolbarRef.current) : null,\n threshold: 1,\n initialIsIntersecting: true, // Start as visible\n onChange: handleVisibilityChange,\n rootMargin,\n });\n\n const setRefCallback = useCallback(\n (node: HTMLDivElement | null) => {\n elementRef.current = node;\n // Only set up intersection observer in collapse mode\n if (isCollapseMode) {\n ref(node);\n }\n },\n [ref, isCollapseMode],\n );\n\n /**\n * Manages focus behavior between toolbar items using accessibility utils\n * - Uses updateToolbarItemsTabIndex to manage focus state\n * - Ensures proper keyboard navigation support\n * - Maintains ARIA compliance for focus management\n */\n const handleFocusOrClick = useCallback(() => {\n if (!toolbarRef.current || !elementRef.current) return;\n\n const currentElement = elementRef.current.querySelector(\"button, a, input\");\n if (!currentElement) return;\n\n updateToolbarItemsTabIndex(toolbarRef.current, currentElement);\n }, [toolbarRef]);\n\n // Set up focus management\n useEffect(() => {\n const interactiveEl = elementRef.current?.querySelector(\"button, a, input\");\n if (!interactiveEl) return;\n\n interactiveEl.addEventListener(\"focus\", handleFocusOrClick);\n interactiveEl.addEventListener(\"click\", handleFocusOrClick);\n\n return () => {\n interactiveEl.removeEventListener(\"focus\", handleFocusOrClick);\n interactiveEl.removeEventListener(\"click\", handleFocusOrClick);\n };\n }, [handleFocusOrClick]);\n\n const toolbarItemClassName = cx(styles[\"toolbar-item\"], className);\n const isHidden = isCollapseMode && !isIntersecting;\n\n return (\n <div\n ref={setRefCallback}\n className={toolbarItemClassName}\n style={{ visibility: isHidden ? \"hidden\" : \"visible\" }}\n aria-hidden={isHidden}\n {...{ inert: isHidden ? \"\" : undefined }}\n data-id={itemId}\n data-anv=\"toolbar-item\"\n >\n {children}\n </div>\n );\n};\n","import { forwardRef } from \"react\";\nimport Button, { ButtonProps } from \"../../../components/Button\";\nimport { ToolbarItemAppearance, WithAriaLabelEnforcement } from \"./types\";\nimport { DataTrackingId } from \"../../../types\";\nimport { useOverFlowItemContext } from \"./internal/ToolbarItemOverflowContext\";\nimport Tooltip from \"../../../components/Tooltip\";\nimport { ToolbarItemWrapper } from \"./internal/ToolbarItemWrapper\";\nimport { useTrackingId } from \"../../../hooks\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Base props for the ToolbarButton component\n * @extends Omit<ButtonProps, \"appearance\" | \"aria-label\" | \"children\">\n */\ntype ToolbarButtonBaseProps = Omit<\n ButtonProps,\n \"appearance\" | \"aria-label\" | \"children\"\n> & {\n /**\n * Visual appearance of the button\n * @default ghost\n */\n appearance?: ToolbarItemAppearance;\n};\n\n/**\n * Props for the ToolbarButton component\n * @extends WithAriaLabelEnforcement<ToolbarButtonBaseProps>\n */\nexport type ToolbarButtonProps =\n WithAriaLabelEnforcement<ToolbarButtonBaseProps> & DataTrackingId;\n\n/**\n * ToolbarButton component for standard clickable actions within a toolbar.\n *\n * Features:\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Automatic tooltip for icon-only buttons\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n *\n * @example\n * <ToolbarButton icon={BoldIcon} aria-label=\"Bold text\" />\n *\n * @example\n * <ToolbarButton appearance=\"primary\">\n * Save\n * </ToolbarButton>\n */\nexport const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n (props, _ref) => {\n const { appearance = \"ghost\", className, children, ...rest } = props;\n\n // Checks if this component is rendered inside the overflow menu and fallbacks when the context is unavailable\n const { isInOverflowMenu = false } = useOverFlowItemContext?.() || {};\n\n const trackingId = useTrackingId({\n name: \"ToolbarButton\",\n data: {\n disabled: props.disabled,\n \"aria-label\": props[\"aria-label\"],\n children: props.children,\n },\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const buttonClassNames = cx(className, styles[\"toolbar-button-item\"]);\n\n const item = children ? (\n <Button\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n data-anv=\"toolbar-button\"\n className={buttonClassNames}\n {...rest}\n >\n {children}\n </Button>\n ) : (\n <Tooltip>\n <Tooltip.Trigger>\n <Button\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n data-anv=\"toolbar-button\"\n className={buttonClassNames}\n {...rest}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>{rest[\"aria-label\"]}</Tooltip.Content>\n </Tooltip>\n );\n\n if (isInOverflowMenu) {\n return item;\n }\n\n return (\n <ToolbarItemWrapper item={{ itemProps: props, itemType: \"button\" }}>\n {item}\n </ToolbarItemWrapper>\n );\n },\n);\n\nToolbarButton.displayName = \"ToolbarButton\";\n","import { forwardRef } from \"react\";\nimport ButtonToggle, {\n ButtonToggleProps,\n} from \"../../../components/ButtonToggle\";\nimport { WithAriaLabelEnforcement } from \"./types\";\nimport { DataTrackingId } from \"../../../types\";\nimport { useOverFlowItemContext } from \"./internal/ToolbarItemOverflowContext\";\nimport Tooltip from \"../../../components/Tooltip\";\nimport { ToolbarItemWrapper } from \"./internal/ToolbarItemWrapper\";\nimport { useTrackingId } from \"../../../hooks\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Base props for the ToolbarButtonToggle component\n * @extends Omit<ButtonToggleProps, \"aria-label\" | \"children\">\n */\ntype ToolbarButtonToggleBaseProps = Omit<\n ButtonToggleProps,\n \"aria-label\" | \"children\"\n> & {\n /**\n * Is this toolbar control a filter?\n */\n isFilter?: boolean;\n};\n\n/**\n * Props for the ToolbarButtonToggle component\n * @extends WithAriaLabelEnforcement<ToolbarButtonToggleBaseProps>\n */\nexport type ToolbarButtonToggleProps =\n WithAriaLabelEnforcement<ToolbarButtonToggleBaseProps> & DataTrackingId;\n\n/**\n * ToolbarButtonToggle component for toggleable actions within a toolbar.\n *\n * Features:\n * - Toggle state management (on/off)\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Automatic tooltip for icon-only toggles\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Visual feedback for toggle state\n * - Proper ARIA attributes for toggle semantics\n *\n * @example\n * <ToolbarButtonToggle icon={BoldIcon} aria-label=\"Bold\" checked={isBold} />\n *\n * @example\n * <ToolbarButtonToggle checked={isItalic}>\n * Italic\n * </ToolbarButtonToggle>\n */\nexport const ToolbarButtonToggle = forwardRef<\n HTMLButtonElement,\n ToolbarButtonToggleProps\n>((props, _ref) => {\n const { className, children, isFilter, ...rest } = props;\n\n // Checks if this component is rendered inside the overflow menu and fallbacks when the context is unavailable\n const { isInOverflowMenu = false } = useOverFlowItemContext?.() || {};\n\n const trackingId = useTrackingId({\n name: \"ToolbarButtonToggle\",\n data: {\n checked: props.checked,\n disabled: props.disabled,\n \"aria-label\": props[\"aria-label\"],\n children: props.children,\n },\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const buttonToggleClassNames = cx(\n className,\n styles[\"toolbar-button-item\"],\n styles[\"toolbar-button-toggle-item\"],\n );\n\n const item = children ? (\n <ButtonToggle\n data-tracking-id={trackingId}\n size=\"small\"\n data-anv=\"toolbar-button-toggle\"\n className={buttonToggleClassNames}\n {...rest}\n >\n {children}\n </ButtonToggle>\n ) : (\n <Tooltip>\n <Tooltip.Trigger>\n <ButtonToggle\n data-tracking-id={trackingId}\n size=\"small\"\n data-anv=\"toolbar-button-toggle\"\n className={buttonToggleClassNames}\n {...rest}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>{rest[\"aria-label\"]}</Tooltip.Content>\n </Tooltip>\n );\n\n if (isInOverflowMenu || isFilter) {\n return item;\n }\n\n return (\n <ToolbarItemWrapper item={{ itemProps: props, itemType: \"buttonToggle\" }}>\n {item}\n </ToolbarItemWrapper>\n );\n});\n\nToolbarButtonToggle.displayName = \"ToolbarButtonToggle\";\n","import { forwardRef } from \"react\";\nimport ButtonLink, { ButtonLinkProps } from \"../../../components/ButtonLink\";\nimport { ToolbarItemAppearance, WithAriaLabelEnforcement } from \"./types\";\nimport { DataTrackingId } from \"../../../types\";\nimport { useOverFlowItemContext } from \"./internal/ToolbarItemOverflowContext\";\nimport Tooltip from \"../../../components/Tooltip\";\nimport { ToolbarItemWrapper } from \"./internal/ToolbarItemWrapper\";\nimport { useTrackingId } from \"../../../hooks\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Base props for the ToolbarButtonLink component\n * @extends Omit<ButtonLinkProps, \"appearance\" | \"aria-label\" | \"children\">\n */\ntype ToolbarButtonLinkBaseProps = Omit<\n ButtonLinkProps,\n \"appearance\" | \"aria-label\" | \"children\"\n> & {\n /**\n * Visual appearance of the button link\n * @default ghost\n */\n appearance?: ToolbarItemAppearance;\n};\n\n/**\n * Props for the ToolbarButtonLink component\n * @extends WithAriaLabelEnforcement<ToolbarButtonLinkBaseProps>\n */\nexport type ToolbarButtonLinkProps =\n WithAriaLabelEnforcement<ToolbarButtonLinkBaseProps> & DataTrackingId;\n\n/**\n * ToolbarButtonLink component for link actions within a toolbar.\n *\n * Features:\n * - Link functionality with href support\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Automatic tooltip for icon-only links\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Proper anchor element semantics\n *\n * @example\n * <ToolbarButtonLink href=\"/help\">\n * Help\n * </ToolbarButtonLink>\n *\n * @example\n * <ToolbarButtonLink icon={ExternalLinkIcon} href=\"/docs\" aria-label=\"Documentation\" />\n */\nexport const ToolbarButtonLink = forwardRef<\n HTMLAnchorElement,\n ToolbarButtonLinkProps\n>((props, _ref) => {\n const { appearance = \"ghost\", className, children, ...rest } = props;\n\n // Checks if this component is rendered inside the overflow menu and fallbacks when the context is unavailable\n const { isInOverflowMenu = false } = useOverFlowItemContext?.() || {};\n\n const trackingId = useTrackingId({\n name: \"ToolbarButtonLink\",\n data: {\n href: props.href,\n disabled: props.disabled,\n \"aria-label\": props[\"aria-label\"],\n children: props.children,\n target: props.target,\n },\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const buttonLinkClassNames = cx(className, styles[\"toolbar-button-item\"]);\n\n const item = children ? (\n <ButtonLink\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n data-anv=\"toolbar-button-link\"\n className={buttonLinkClassNames}\n {...rest}\n >\n {children}\n </ButtonLink>\n ) : (\n <Tooltip>\n <Tooltip.Trigger>\n <ButtonLink\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n data-anv=\"toolbar-button-link\"\n className={buttonLinkClassNames}\n {...rest}\n />\n </Tooltip.Trigger>\n <Tooltip.Content>{rest[\"aria-label\"]}</Tooltip.Content>\n </Tooltip>\n );\n\n if (isInOverflowMenu) {\n return item;\n }\n\n return (\n <ToolbarItemWrapper item={{ itemProps: props, itemType: \"buttonLink\" }}>\n {item}\n </ToolbarItemWrapper>\n );\n});\n\nToolbarButtonLink.displayName = \"ToolbarButtonLink\";\n","import { forwardRef, useEffect, useId, useRef, useState } from \"react\";\nimport ArrowDropDown from \"@servicetitan/hammer-icon/mdi/round/arrow_drop_down.svg\";\nimport Listbox, { ListboxItemType } from \"../../../components/Listbox\";\nimport Popover from \"../../../components/Popover\";\nimport { ToolbarItemAppearance } from \"./types\";\nimport { DataTrackingId } from \"../../../types\";\nimport { useOverFlowItemContext } from \"./internal/ToolbarItemOverflowContext\";\nimport { ToolbarItemWrapper } from \"./internal/ToolbarItemWrapper\";\nimport { useTrackingId } from \"../../../hooks\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Type for items in the ToolbarSelect dropdown\n * @extends ItemType<T & { id: string }>\n */\ntype ToolbarSelectItem<T = Record<string, unknown>> = ListboxItemType<\n T & {\n id: string;\n }\n>;\n\n/**\n * Props for the ToolbarSelect component\n * @extends Omit<React.ComponentPropsWithoutRef<typeof Popover.Button>, \"appearance\" | \"onChange\">\n */\nexport type ToolbarSelectProps<T = Record<string, unknown>> = Omit<\n React.ComponentPropsWithoutRef<typeof Popover.Button>,\n \"appearance\" | \"onChange\"\n> & {\n /**\n * Visual appearance of the select button\n * @default ghost\n */\n appearance?: ToolbarItemAppearance;\n /**\n * Callback function when selection changes\n */\n onChange?: (optionId: string) => void;\n /**\n * Currently selected item ID (controlled mode)\n */\n selected?: string;\n /**\n * Array of selectable items\n */\n items: ToolbarSelectItem<T>[];\n /**\n * Accessible label for the select component\n */\n accessibleLabel: string;\n} & DataTrackingId;\n\n/**\n * ToolbarSelect component provides a dropdown selector within a toolbar.\n *\n * Features:\n * - Dropdown menu with selectable options\n * - Controlled and uncontrolled usage patterns\n * - Automatic overflow menu integration\n * - Accessibility support with proper ARIA labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Dropdown arrow icon indicator\n * - Listbox integration for keyboard navigation\n *\n * @example\n * <ToolbarSelect\n * items={fontOptions}\n * selected=\"arial\"\n * accessibleLabel=\"Font family\"\n * onChange={(id) => setFont(id)}\n * />\n *\n * @example\n * <ToolbarSelect\n * appearance=\"primary\"\n * items={colorOptions}\n * accessibleLabel=\"Text color\"\n * />\n */\nexport const ToolbarSelect = forwardRef<HTMLButtonElement, ToolbarSelectProps>(\n (props, _ref) => {\n const {\n appearance = \"ghost\",\n onChange,\n selected: selectedItemId,\n accessibleLabel,\n className,\n items,\n ...rest\n } = props;\n const selectId = useId();\n const popoverContentRef = useRef<HTMLDivElement>(null);\n\n // Popover open/close state - like TimeField does\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n\n // Internal state for uncontrolled mode\n const defaultId = items.length > 0 ? items[0].id : \"\";\n const [internalSelectedId, setInternalSelectedId] = useState(defaultId);\n\n // Use controlled value if provided, otherwise use internal state\n const selectedId = selectedItemId ?? internalSelectedId;\n\n // Find the selected item by ID (or default to first item using defaultId)\n const selectedItem =\n items.find((item) => item.id === selectedId) ||\n items.find((item) => item.id === defaultId);\n\n // Update internal selection when items change and current selection is no longer valid\n useEffect(() => {\n if (\n !selectedItemId &&\n items.length > 0 &&\n !items.some((item) => item.id === internalSelectedId)\n ) {\n setInternalSelectedId(items[0].id);\n }\n }, [items, selectedItemId, internalSelectedId]);\n\n // Return focus to trigger button when popover closes\n const prevIsPopoverOpen = useRef(isPopoverOpen);\n useEffect(() => {\n // Only restore focus if popover was open and is now closed\n if (prevIsPopoverOpen.current && !isPopoverOpen) {\n setTimeout(() => {\n const triggerButton = document.getElementById(selectId);\n if (triggerButton) {\n triggerButton.focus();\n }\n });\n }\n prevIsPopoverOpen.current = isPopoverOpen;\n }, [isPopoverOpen, selectId]);\n\n // Handle selection change\n const handleSelectionChange = (\n selected: ToolbarSelectItem<Record<string, unknown>> | undefined,\n ) => {\n if (selected?.id) {\n if (selectedItemId === undefined) {\n setInternalSelectedId(selected.id);\n }\n\n onChange?.(selected.id);\n\n // Close the popover after selection\n setIsPopoverOpen(false);\n }\n };\n\n // Handle keyboard navigation on the button\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.code === \"ArrowDown\" && isPopoverOpen) {\n // Focus the listbox container and let it handle the first option focus\n const listboxContainer = popoverContentRef.current?.querySelector(\n '[role=\"listbox\"]',\n ) as HTMLElement;\n if (listboxContainer) {\n listboxContainer.focus();\n }\n event.stopPropagation();\n event.preventDefault();\n }\n };\n\n // Checks if this component is rendered inside the overflow menu and fallbacks when the context is unavailable\n const { isInOverflowMenu = false } = useOverFlowItemContext?.() || {};\n\n const trackingId = useTrackingId({\n name: \"ToolbarSelect\",\n data: {\n selected: props.selected,\n disabled: props.disabled,\n \"aria-label\": props[\"aria-label\"],\n items: props.items,\n },\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const buttonClassNames = cx(className, styles[\"toolbar-button-item\"]);\n\n const item = (\n <Popover\n noPadding\n open={isPopoverOpen}\n onClickOutside={() => {\n setIsPopoverOpen(false);\n }}\n onClose={() => {\n setIsPopoverOpen(false);\n }}\n >\n <Popover.Button\n data-tracking-id={trackingId}\n appearance={appearance}\n size=\"small\"\n icon={{ after: ArrowDropDown }}\n className={buttonClassNames}\n id={selectId}\n data-anv=\"toolbar-select\"\n onClick={() => {\n setIsPopoverOpen(!isPopoverOpen);\n }}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {selectedItem?.label}\n </Popover.Button>\n <Popover.Content\n ref={popoverContentRef}\n className={styles[\"toolbar-select-content\"]}\n aria-label={`${accessibleLabel} options`}\n >\n <Listbox\n selected={selectedItem}\n onSelectionChange={handleSelectionChange}\n items={items}\n aria-labelledby={selectId}\n disableAutoSelectOnFocus={true}\n >\n {({ items }) =>\n items.map((item) => (\n <Listbox.Option key={item.label} item={item}>\n {item.label}\n </Listbox.Option>\n ))\n }\n </Listbox>\n </Popover.Content>\n </Popover>\n );\n\n if (isInOverflowMenu) {\n return item;\n }\n\n return (\n <ToolbarItemWrapper item={{ itemProps: props, itemType: \"select\" }}>\n {item}\n </ToolbarItemWrapper>\n );\n },\n);\n\nToolbarSelect.displayName = \"ToolbarSelect\";\n","import { ReactElement, useContext, useId, useMemo } from \"react\";\nimport MoreHoriz from \"@servicetitan/hammer-icon/mdi/round/more_horiz.svg\";\nimport MoreVert from \"@servicetitan/hammer-icon/mdi/round//more_vert.svg\";\nimport { ToolbarItemProps } from \"../types\";\nimport { ToolbarButton, ToolbarButtonProps } from \"../ToolbarButton\";\nimport {\n ToolbarButtonToggle,\n ToolbarButtonToggleProps,\n} from \"../ToolbarButtonToggle\";\nimport {\n ToolbarButtonLink,\n ToolbarButtonLinkProps,\n} from \"../ToolbarButtonLink\";\nimport { ToolbarSelect, ToolbarSelectProps } from \"../ToolbarSelect\";\nimport { ToolbarOverflowContext } from \"./ToolbarOverflowContext\";\nimport Popover from \"../../../../components/Popover\";\nimport Icon from \"../../../../components/Icon\";\nimport { OverflowItemContext } from \"./ToolbarItemOverflowContext\";\nimport { handleMenuKeyboardNavigation } from \"./utils/accessibility\";\n\nimport cx from \"classnames\";\nimport styles from \"../Toolbar.module.scss\";\n\n/**\n * Component to render appropriate toolbar items in the overflow menu\n * @param itemType - Type of toolbar item to render\n * @param itemProps - Props for the toolbar item\n * @returns ReactElement - The rendered toolbar item\n */\nconst OverflowItem = ({ itemType, itemProps }: ToolbarItemProps) => {\n // Based on the item type, use the corresponding toolbar component\n switch (itemType) {\n case \"button\":\n return <ToolbarButton {...(itemProps as ToolbarButtonProps)} />;\n\n case \"buttonToggle\":\n return (\n <ToolbarButtonToggle {...(itemProps as ToolbarButtonToggleProps)} />\n );\n\n case \"buttonLink\":\n return <ToolbarButtonLink {...(itemProps as ToolbarButtonLinkProps)} />;\n\n case \"select\":\n return <ToolbarSelect {...(itemProps as ToolbarSelectProps)} />;\n\n default:\n return null;\n }\n};\n\n/**\n * Props for the ToolbarOverflowMenu component\n */\nexport type ToolbarOverflowMenuProps = {\n /**\n * Additional items to display in the overflow menu\n */\n additionalItems?: ReactElement[];\n /**\n * Direction of the parent toolbar\n * @default horizontal\n */\n direction?: \"vertical\" | \"horizontal\";\n};\n\n/**\n * ToolbarOverflowMenu component displays toolbar items that don't fit in the main toolbar.\n *\n * Features:\n * - Automatic rendering when items overflow in collapse mode\n * - Maintains consistent item ordering with the main toolbar\n * - Preserves item state between toolbar and overflow menu\n * - Provides accessible navigation with keyboard and screen readers\n * - Adapts to both horizontal and vertical toolbar layouts\n * - Context-aware rendering for child components\n * - Proper ARIA menu semantics\n * - Keyboard navigation support\n */\nexport const ToolbarOverflowMenu = ({\n additionalItems,\n direction,\n}: ToolbarOverflowMenuProps) => {\n // Gives us the array of items that need to appear\n const { overflowItems, orderedIds } = useContext(ToolbarOverflowContext);\n const menuTriggerId = useId();\n\n // Sort overflow items to match their original order in the toolbar\n const orderedItems = useMemo(() => {\n const allElements = orderedIds?.map((id) => {\n return overflowItems.find((item) => item.id === id);\n });\n\n return allElements?.filter((item) => item !== undefined) || [];\n }, [orderedIds, overflowItems]);\n\n const popoverButtonClassNames = cx(\n styles[\"toolbar-button-item\"],\n styles[\"toolbar-overflow-trigger\"],\n );\n\n const overflowIcon = direction === \"horizontal\" ? MoreHoriz : MoreVert;\n\n return (\n <Popover noPadding>\n <Popover.Button\n size=\"small\"\n appearance=\"ghost\"\n id={menuTriggerId}\n className={popoverButtonClassNames}\n data-anv=\"toolbar-overflow-trigger\"\n aria-label=\"Additional toolbar options\"\n >\n <Icon svg={overflowIcon} size=\"small\" />\n </Popover.Button>\n <Popover.Content>\n <OverflowItemContext.Provider value={{ isInOverflowMenu: true }}>\n <ul\n role=\"menu\"\n className={styles[\"toolbar-overflow-content\"]}\n data-anv=\"toolbar-overflow-menu\"\n aria-labelledby={menuTriggerId}\n onKeyDown={handleMenuKeyboardNavigation}\n >\n {orderedItems.map((item) => {\n const { itemType, itemProps, id } = item;\n return (\n <li\n key={`${itemType}-${id}`}\n role=\"menuitem\"\n data-anv=\"toolbar-overflow-item\"\n >\n <OverflowItem\n itemType={itemType}\n itemProps={itemProps}\n id={id}\n />\n </li>\n );\n })}\n\n {additionalItems?.map((item, index) => (\n <li\n key={`additional-item-${index}`}\n role=\"menuitem\"\n data-anv=\"toolbar-overflow-item\"\n >\n {item}\n </li>\n ))}\n </ul>\n </OverflowItemContext.Provider>\n </Popover.Content>\n </Popover>\n );\n};\n","import { createContext, RefObject } from \"react\";\nimport { FilterGroupProps } from \"../FilterGroup\";\nimport { Filter, FilterValue } from \"./types\";\n\n/**\n * Context for sharing filter state and operations between FilterGroup and its children\n *\n * @extends FilterGroupProps\n */\ntype FilterGroupContextProps = FilterGroupProps & {\n /** Reference to the filter group DOM element\n * @default { current: null }\n */\n filterGroupRef: RefObject<HTMLDivElement>;\n /** Current filters array\n * @default []\n */\n filters: Filter[];\n /** Function to update a single filter and submit if needed\n * @default () => {}\n */\n updateFilter: (filterId: string, value: FilterValue, submit: boolean) => void;\n /** Array of filters that are currently hidden due to overflow\n * @default []\n */\n hiddenFilters: Filter[];\n /** Function to mark a filter as hidden\n * @default () => {}\n */\n addHiddenFilter: (filter: Filter) => void;\n /** Function to mark a filter as visible\n * @default () => {}\n */\n removeHiddenFilter: (filter: Filter) => void;\n};\n\n/**\n * Context provider for filter-related operations\n * Used to share filter state between FilterGroup and FilterDrawer\n */\nexport const FilterGroupContext = createContext<FilterGroupContextProps>({\n filterGroupRef: { current: null },\n filters: [],\n updateFilter: () => {},\n controlledFiltering: false,\n hiddenFilters: [],\n addHiddenFilter: () => {},\n removeHiddenFilter: () => {},\n});\n","import { useContext } from \"react\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { Filter } from \"./internal/types\";\nimport {\n ToolbarItemWrapper,\n ToolbarItemWrapperProps,\n} from \"../internal/ToolbarItemWrapper\";\nimport { ToolbarButtonProps } from \"../ToolbarButton\";\n\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterItemWrapper component\n */\ntype FilterItemWrapperProps = {\n /**\n * Optional filter object. If provided, visibility changes will be tracked in FilterGroupContext.\n * If not provided, only basic visibility tracking will be used.\n */\n filter?: Filter;\n /** The content to render inside the wrapper */\n children: React.ReactNode;\n};\n\n/**\n * FilterItemWrapper extends ToolbarItemWrapper to handle filter-specific visibility.\n * Uses FilterGroupContext to track hidden filters instead of overflow menu.\n * Built into FilterButton and other filter components for consistent overflow handling.\n *\n * Features:\n * - Wraps filter controls for consistent overflow and visibility handling\n * - Integrates with FilterGroupContext to track hidden filters\n */\nexport const FilterItemWrapper = ({\n filter,\n children,\n}: FilterItemWrapperProps) => {\n const { addHiddenFilter, removeHiddenFilter, filterGroupRef } =\n useContext(FilterGroupContext);\n\n const props: ToolbarItemWrapperProps = {\n item: {\n itemType: \"button\",\n itemProps: {\n children: null,\n \"aria-hidden\": true,\n } as ToolbarButtonProps,\n },\n children,\n className: styles[\"filter-item\"],\n observerRoot: filterGroupRef.current,\n onVisibilityChange: (isVisible: boolean) => {\n // Only track in FilterGroupContext if a filter is provided\n if (filter) {\n if (isVisible) {\n removeHiddenFilter?.(filter);\n } else {\n addHiddenFilter?.(filter);\n }\n }\n },\n rootMargin: \"0px -80px 0px 0px\",\n };\n\n return <ToolbarItemWrapper {...props} />;\n};\n","import { Filter, FilterValue } from \"../types\";\n\n/**\n * Returns an array of filters that are currently active (i.e., have a value set).\n *\n * @param {Filter[]} filters - Array of filter objects to check\n * @returns {Filter[]} Array of active filters\n */\nexport const getActiveFilters = (filters: Filter[]): Filter[] => {\n return filters.filter((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return filter.checked;\n case \"custom\":\n return filter.value !== undefined;\n case \"singleSelect\":\n return filter.selectedItem !== undefined;\n case \"multiSelect\":\n return filter.selectedItems && filter.selectedItems.length > 0;\n case \"date\":\n case \"dateRange\":\n return filter.value !== null && filter.value !== undefined;\n default:\n return false;\n }\n });\n};\n\n/**\n * Checks if any filters in the array have active values\n *\n * @param {Filter[]} filters - Array of filter objects to check\n * @returns {boolean} True if any filter has an active value\n */\nexport const checkActiveFilters = (filters: Filter[]): boolean => {\n return getActiveFilters(filters).length > 0;\n};\n\n/**\n * Resets all filters to their default state\n *\n * @param {Filter[]} filters - Array of filter objects to reset\n * @returns {Filter[]} New array with reset filters\n */\nexport const resetFilters = (filters: Filter[]): Filter[] => {\n return filters.map((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return {\n ...filter,\n checked: false,\n };\n case \"custom\":\n return {\n ...filter,\n value: undefined,\n };\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: undefined,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: [],\n };\n case \"date\":\n case \"dateRange\":\n return {\n ...filter,\n value: null,\n };\n default:\n return filter;\n }\n });\n};\n\n/**\n * Updates a single filter in an array of filters\n *\n * @param {Filter[]} filters - Array of filter objects\n * @param {string} filterId - ID of the filter to update\n * @param {FilterValue} value - New value for the filter\n * @returns {Filter[]} New array with updated filter\n */\nexport const updateSingleFilter = (\n filters: Filter[],\n filterId: string,\n value: FilterValue,\n): Filter[] => {\n return filters.map((filter) => {\n if (filter.id !== filterId) return filter;\n\n switch (filter.type) {\n case \"boolean\":\n return {\n ...filter,\n checked: value as boolean,\n };\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: value,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: value as unknown[],\n };\n case \"date\":\n return {\n ...filter,\n value: value as string | null,\n };\n case \"dateRange\":\n return {\n ...filter,\n value: value as {\n startDate: string | null;\n endDate: string | null;\n } | null,\n };\n case \"custom\":\n return {\n ...filter,\n value,\n };\n default:\n return filter;\n }\n });\n};\n\n/**\n * Determines if two filter values are different.\n * For singleSelect, compares by id if both are objects with id.\n *\n * @param {T} a - First value to compare\n * @param {T} b - Second value to compare\n * @returns {boolean} True if the values are different\n */\nexport const hasChangedFilter = <T>(a: T, b: T): boolean => {\n // For singleSelect, compare by id if both are objects with id\n if (\n a &&\n b &&\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n \"id\" in a &&\n \"id\" in b\n ) {\n return a.id !== b.id;\n }\n // Fallback to strict equality\n return a !== b;\n};\n","import {\n ToolbarButtonToggle,\n ToolbarButtonToggleProps,\n} from \"../ToolbarButtonToggle\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport { BooleanFilter } from \"./internal/types\";\n\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterToggleButton component\n *\n * @extends Omit<ToolbarButtonToggleProps, \"checked\">\n */\nexport type FilterToggleButtonProps = Omit<\n ToolbarButtonToggleProps,\n \"checked\"\n> & {\n /** Unique identifier for the filter */\n id: string;\n /** Whether the toggle is checked */\n checked: boolean;\n /** The content to display inside the toggle button */\n children: React.ReactNode;\n};\n\n/**\n * FilterToggleButton wraps ToolbarButtonToggle in a FilterItemWrapper for consistent overflow behavior with other filter types.\n * Built into FilterGroup for boolean filter rendering.\n *\n * Features:\n * - Renders a toggle button for boolean filters\n * - Integrates with FilterGroup and FilterItemWrapper for overflow handling\n * - Supports accessibility and keyboard navigation\n */\nexport const FilterToggleButton = ({\n id,\n checked,\n children,\n ...props\n}: FilterToggleButtonProps) => {\n // Construct a BooleanFilter object from the props\n const filter: BooleanFilter = {\n id,\n type: \"boolean\",\n checked,\n label: typeof children === \"string\" ? children : id,\n };\n\n return (\n <FilterItemWrapper filter={filter}>\n <ToolbarButtonToggle\n checked={checked}\n isFilter\n {...props}\n className={styles[\"filter-button-trigger\"]}\n data-anv=\"toolbar-boolean-filter\"\n >\n {children}\n </ToolbarButtonToggle>\n </FilterItemWrapper>\n );\n};\n","import { useMemo } from \"react\";\nimport { MultiSelectFilter, SingleSelectFilter } from \"./internal/types\";\nimport Listbox from \"../../../../components/Listbox\";\nimport ListView from \"../../../../components/ListView\";\nimport { SearchField } from \"../../../../components/SearchField\";\n\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterSelect component\n */\ninterface FilterSelectProps<Item extends { id: string; label: string }> {\n /** The filter configuration object */\n filter: SingleSelectFilter<Item> | MultiSelectFilter<Item>;\n /** The current draft value for the filter */\n draftValue: Item | Item[] | undefined;\n /** Callback to update the draft value */\n onDraftChange: (value: Item | Item[] | undefined) => void;\n}\n\n/**\n * FilterSelect component renders a Listbox or ListView for single or multi-select filters.\n * Built into FilterButton and FilterDrawer for filter selection UI.\n *\n * Features:\n * - Renders a Listbox for single select filters\n * - Renders a ListView for multi select filters\n * - Supports search field for filtering options\n */\nexport const FilterSelect = <Item extends { id: string; label: string }>({\n filter,\n draftValue,\n onDraftChange,\n}: FilterSelectProps<Item>) => {\n const isMultiSelect = filter.type === \"multiSelect\";\n\n const singleSelectList = useMemo(\n () => (\n <Listbox\n key={filter.id}\n items={filter.items}\n selected={draftValue as Item | undefined}\n onSelectionChange={(selected: Item | undefined) => {\n onDraftChange(selected);\n }}\n disableAutoSelectOnFocus\n style={{ padding: 0 }}\n >\n {({ items }) =>\n items.map((item) => (\n <Listbox.Option key={item.id} item={item} disabled={item.disabled}>\n {item.label}\n </Listbox.Option>\n ))\n }\n </Listbox>\n ),\n [filter.id, filter.items, draftValue, onDraftChange],\n );\n\n const multiSelectList = useMemo(\n () => (\n <ListView\n key={filter.id}\n items={filter.items}\n selected={Array.isArray(draftValue) ? draftValue : []}\n onSelectionChange={(selectedItems: unknown[]) => {\n const items = selectedItems as Item[];\n onDraftChange(items);\n }}\n style={{ padding: 0 }}\n >\n {({ items }) =>\n items.map((item) => (\n <ListView.Option key={item.id} item={item}>\n {item.label}\n </ListView.Option>\n ))\n }\n </ListView>\n ),\n [filter.id, filter.items, draftValue, onDraftChange],\n );\n\n return (\n <>\n {filter.hasSearch && (\n <SearchField\n size=\"small\"\n className={styles[\"filter-select-search\"]}\n onChange={(e) => {\n filter.onSearch?.(e.target.value);\n }}\n onClear={() => {\n filter.onSearchClear?.();\n }}\n data-anv=\"filter-select-search\"\n />\n )}\n {isMultiSelect ? multiSelectList : singleSelectList}\n </>\n );\n};\n","import { useRef } from \"react\";\nimport { DateFilter } from \"./internal/types\";\nimport Flex from \"../../../../components/Flex\";\nimport {\n MaskedDateInput,\n MaskedDateInputRef,\n} from \"../../../../components/DateFieldSingle/internal/MaskedDateInput\";\nimport { DateFieldSingleChange } from \"../../../../components/DateFieldSingle\";\nimport { useDateFieldSingleConversion } from \"../../../../components/DateFieldSingle/internal/useDateFieldSingleConversion\";\nimport { useDateFieldSingleState } from \"../../../../components/DateFieldSingle/internal/useDateFieldSingleState\";\nimport { DateFieldSingleCalendar } from \"../../../../components/DateFieldSingle/internal/DateFieldSingleCalendar\";\n\n/**\n * Props for the FilterDateSingle component\n */\ninterface FilterDateSingleProps {\n /**\n * The date filter configuration object containing mode and other settings\n */\n filter: DateFilter;\n /**\n * The current draft value for the date filter in ISO 8601 format\n */\n draftValue: string | null;\n /**\n * Callback function to update the draft value when the date changes\n */\n onDraftChange: (value: string | null) => void;\n}\n\n/**\n * FilterDateSingle component for selecting a single date in toolbar filters.\n *\n * Features:\n * - Renders a masked date input field with format validation\n * - Provides calendar popup for date selection\n * - Integrates with toolbar filter state management\n * - Supports controlled and uncontrolled date selection\n * - Maintains draft state for filter changes\n */\nexport const FilterDateSingle = ({\n filter,\n draftValue,\n onDraftChange,\n}: FilterDateSingleProps) => {\n const maskedDateInputRef = useRef<MaskedDateInputRef>(null);\n\n const handleChange = (change: DateFieldSingleChange) => {\n onDraftChange(change.date);\n };\n\n const { value, onChange } = useDateFieldSingleConversion({\n value: draftValue,\n onChange: handleChange,\n });\n\n const { handleInputChange, handleCalendarSelection } =\n useDateFieldSingleState({\n valueProp: value,\n onChange: (change) => onChange({ ...change, isDateValid: true }),\n });\n\n return (\n <Flex gap={4} direction=\"column\">\n <MaskedDateInput\n mode={filter.mode}\n ref={maskedDateInputRef}\n onChange={handleInputChange}\n lastValidDate={value ?? null}\n autoComplete=\"off\"\n />\n\n <DateFieldSingleCalendar\n value={value ?? null}\n onSelection={handleCalendarSelection}\n />\n </Flex>\n );\n};\n","import { useRef } from \"react\";\nimport { DateRangeFilter } from \"./internal/types\";\nimport {\n MaskedDateRangeInput,\n MaskedDateRangeInputRef,\n} from \"../../../../components/DateFieldRange/internal/MaskedDateRangeInput\";\nimport { DateFieldRangeChange } from \"../../../../components/DateFieldRange\";\nimport { useDateFieldRangeConversion } from \"../../../../components/DateFieldRange/internal/useDateFieldRangeConversion\";\nimport { useDateFieldRangeState } from \"../../../../components/DateFieldRange/internal/useDateFieldRangeState\";\nimport Flex from \"../../../../components/Flex\";\nimport { DateFieldRangeCalendar } from \"../../../../components/DateFieldRange/internal/DateFieldRangeCalendar\";\n\n/**\n * Props for the FilterDateRange component\n */\ninterface FilterDateRangeProps {\n /**\n * The date range filter configuration object containing mode and other settings\n */\n filter: DateRangeFilter;\n /**\n * The current draft value for the date range filter with start and end dates in ISO 8601 format\n */\n draftValue: { startDate: string | null; endDate: string | null } | null;\n /**\n * Callback function to update the draft value when the date range changes\n */\n onDraftChange: (\n value: { startDate: string | null; endDate: string | null } | null,\n ) => void;\n}\n\n/**\n * FilterDateRange component for selecting a date range in toolbar filters.\n *\n * Features:\n * - Renders a masked date range input field with format validation\n * - Provides calendar popup for date range selection\n * - Integrates with toolbar filter state management\n * - Supports controlled and uncontrolled date range selection\n * - Maintains draft state for filter changes\n * - Handles start and end date selection independently\n */\nexport const FilterDateRange = ({\n filter,\n draftValue,\n onDraftChange,\n}: FilterDateRangeProps) => {\n const maskedDateRangeInputRef = useRef<MaskedDateRangeInputRef>(null);\n\n const handleChange = (change: DateFieldRangeChange) => {\n // Only call onDraftChange when we have a complete date range (both start and end)\n // or when clearing the range (both null)\n const hasCompleteRange = change.startDate && change.endDate;\n const isClearingRange = !change.startDate && !change.endDate;\n\n if (hasCompleteRange || isClearingRange) {\n onDraftChange({\n startDate: change.startDate,\n endDate: change.endDate,\n });\n }\n };\n\n const { value, onChange } = useDateFieldRangeConversion({\n value: draftValue,\n onChange: handleChange,\n });\n\n const { handleInputChange, handleCalendarSelection } = useDateFieldRangeState(\n {\n valueProp: value,\n onChange: (change) => {\n // Only call handleChange if input is valid and we have a complete range, or if clearing\n const hasCompleteRange = change.startDate && change.endDate;\n const isClearingRange = change.isInputEmpty;\n\n if (change.isInputValid && (hasCompleteRange || isClearingRange)) {\n onChange({ ...change, isDateRangeValid: true });\n }\n },\n },\n );\n\n return (\n <Flex gap={4} direction=\"column\">\n <MaskedDateRangeInput\n mode={filter.mode}\n ref={maskedDateRangeInputRef}\n onChange={handleInputChange}\n startDate={value?.startDate ?? null}\n endDate={value?.endDate ?? null}\n autoComplete=\"off\"\n />\n\n <DateFieldRangeCalendar\n startDate={value?.startDate ?? null}\n endDate={value?.endDate ?? null}\n onSelection={handleCalendarSelection}\n />\n </Flex>\n );\n};\n","import {\n useContext,\n useState,\n ReactNode,\n useEffect,\n KeyboardEvent,\n useCallback,\n useMemo,\n} from \"react\";\nimport ArrowDropDown from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_down.svg\";\nimport Event from \"@servicetitan/hammer-icon/mdi/round/event.svg\";\nimport { DateTime } from \"luxon\";\nimport {\n CustomFilter,\n DateFilter,\n DateRangeFilter,\n Filter,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"./internal/types\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { hasChangedFilter } from \"./internal/utils/filter-state\";\nimport Chip from \"../../../../components/Chip\";\nimport { FilterSelect } from \"./FilterSelect\";\nimport { FilterDateSingle } from \"./FilterDateSingle\";\nimport { FilterDateRange } from \"./FilterDateRange\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport Popover from \"../../../../components/Popover\";\nimport Flex from \"../../../../components/Flex\";\nimport Button from \"../../../../components/Button\";\n\nimport cx from \"classnames\";\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterButton component\n */\ninterface FilterButtonProps {\n /** Filter configuration object */\n filter: Filter;\n /** Optional child content for non-custom filter types */\n children?: ReactNode;\n /** Optional class name for the popover content */\n className?: string;\n}\n\n/**\n * FilterButton component provides a popover interface for filter selection.\n * Handles both controlled and uncontrolled filter updates.\n * Built into FilterGroup for single-select, multi-select, date, and date range filter rendering.\n *\n * Features:\n * - Maintains draft state for controlled filters\n * - Updates immediately for uncontrolled filters\n * - Provides Apply and Cancel actions in controlled mode\n * - Supports keyboard navigation and accessibility\n * - Renders custom, single-select, multi-select, date, and date range filter types\n * - Integrates with FilterGroup context for state management\n * - Displays appropriate icons for date-based filters\n * - Shows formatted date values in button labels\n */\nexport const FilterButton = ({\n filter,\n children,\n className,\n}: FilterButtonProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const { updateFilter, controlledFiltering } = useContext(FilterGroupContext);\n\n // MultiSelect filters need to be initialized with an empty array\n const [draftValue, setDraftValue] = useState<unknown>(\n filter.type === \"multiSelect\" ? [] : undefined,\n );\n\n /**\n * Returns the current value for the filter based on its type.\n * Used for resetting draft state and comparing changes.\n *\n * @returns The current filter value based on type:\n * - singleSelect: selectedItem\n * - multiSelect: selectedItems array\n * - date: date string value\n * - dateRange: { startDate, endDate } object\n * - custom: custom value\n */\n const getCurrentFilterValue = () => {\n switch (filter.type) {\n case \"singleSelect\":\n return (filter as SingleSelectFilter<unknown>).selectedItem;\n case \"multiSelect\":\n return (filter as MultiSelectFilter<unknown>).selectedItems || [];\n case \"date\":\n case \"dateRange\":\n return filter.value;\n case \"custom\":\n return (filter as CustomFilter<unknown>).value;\n default:\n return undefined;\n }\n };\n\n // Initialize draft state when popover opens\n useEffect(() => {\n if (isOpen) {\n const initialValue = getCurrentFilterValue();\n setDraftValue(initialValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const handleChange = useCallback(\n (value: unknown) => {\n if (hasChangedFilter(value, draftValue)) {\n // Always update draft state\n setDraftValue(value);\n\n // In uncontrolled mode, update immediately for all filter types\n if (!controlledFiltering) {\n updateFilter(filter.id, value, true);\n // Close popover immediately for single select and custom filters\n // Keep open for multi-select to allow keyboard navigation\n if (filter.type !== \"multiSelect\") {\n setIsOpen(false);\n }\n }\n }\n },\n [filter.id, filter.type, controlledFiltering, updateFilter, draftValue],\n );\n\n const handleSubmit = () => {\n const stateValue = getCurrentFilterValue();\n\n if (hasChangedFilter(draftValue, stateValue)) {\n updateFilter(filter.id, draftValue, true);\n }\n\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n // In uncontrolled mode, clicking outside should finalize changes, not cancel them\n if (!controlledFiltering) {\n setIsOpen(false);\n return;\n }\n\n const originalValue = getCurrentFilterValue();\n\n setDraftValue(originalValue);\n setIsOpen(false);\n };\n\n /**\n * Builds the button label text based on filter type and current selection.\n * Formats labels appropriately for each filter type to show current state.\n *\n * @returns Formatted label text:\n * - singleSelect: \"Label: Selected Item\" or just \"Label\"\n * - multiSelect: \"Label\" with selection count chip\n * - date: Full date string or \"Label\"\n * - dateRange: \"Label: Start - End\" or just \"Label\"\n * - custom: \"Label: Custom Value\" or just \"Label\"\n */\n const getButtonLabel = useMemo(() => {\n switch (filter.type) {\n case \"singleSelect\": {\n const singleSelectFilter = filter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n if (singleSelectFilter.selectedItem) {\n return `${filter.label}: ${singleSelectFilter.selectedItem.label}`;\n }\n return filter.label;\n }\n case \"multiSelect\": {\n const multiSelectFilter = filter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n if (\n multiSelectFilter.selectedItems &&\n multiSelectFilter.selectedItems.length > 0\n ) {\n const selectionCount =\n multiSelectFilter.selectedItems.length.toString();\n return (\n <>\n {filter.label}\n <Chip\n label={selectionCount}\n color=\"#0265DC\"\n size=\"small\"\n aria-label={`${selectionCount} selected items`}\n />\n </>\n );\n }\n return filter.label;\n }\n case \"date\":\n if (filter.value) {\n const date = DateTime.fromISO(filter.value, { zone: \"local\" });\n return `${filter.label}: ${date.monthShort} ${date.day}, ${date.year}`;\n }\n return filter.label;\n case \"dateRange\":\n if (filter.value) {\n const start = DateTime.fromISO(filter.value.startDate as string, {\n zone: \"local\",\n });\n const end = DateTime.fromISO(filter.value.endDate as string, {\n zone: \"local\",\n });\n\n // If the start and end dates are in the same year, we don't shiw year in start date\n const isSameYear = start.year === end.year;\n const formattedStart = isSameYear\n ? `${start.monthShort} ${start.day}`\n : `${start.monthShort} ${start.day}, ${start.year}`;\n\n return `${filter.label}: ${formattedStart} – ${end.monthShort} ${end.day}, ${end.year}`;\n }\n return filter.label;\n case \"custom\":\n if (filter.labelChipCount) {\n return (\n <>\n {filter.label}\n <Chip\n label={filter.labelChipCount.toString()}\n color=\"#0265DC\"\n size=\"small\"\n aria-label={`${filter.labelChipCount} selected items`}\n />\n </>\n );\n }\n return filter.label;\n default:\n return filter.label;\n }\n }, [filter]);\n\n /**\n * Renders the appropriate filter content based on filter type.\n * Each filter type has its own specialized component for optimal UX.\n *\n * @returns React component for the filter type:\n * - custom: Custom render function\n * - singleSelect: FilterSelect with Listbox\n * - multiSelect: FilterSelect with ListView\n * - date: FilterDateSingle with calendar\n * - dateRange: FilterDateRange with range calendar\n */\n const getContent = useMemo(() => {\n switch (filter.type) {\n case \"custom\":\n return filter.buttonRender({\n value: draftValue,\n onChange: handleChange,\n });\n case \"singleSelect\":\n return (\n <FilterSelect\n filter={filter as SingleSelectFilter<{ id: string; label: string }>}\n draftValue={draftValue as { id: string; label: string } | undefined}\n onDraftChange={handleChange}\n />\n );\n case \"multiSelect\":\n return (\n <FilterSelect\n filter={filter as MultiSelectFilter<{ id: string; label: string }>}\n draftValue={\n draftValue as { id: string; label: string }[] | undefined\n }\n onDraftChange={handleChange}\n />\n );\n case \"date\":\n return (\n <FilterDateSingle\n filter={filter as DateFilter}\n draftValue={draftValue as string | null}\n onDraftChange={handleChange}\n />\n );\n case \"dateRange\":\n return (\n <FilterDateRange\n filter={filter as DateRangeFilter}\n draftValue={\n draftValue as {\n startDate: string | null;\n endDate: string | null;\n } | null\n }\n onDraftChange={handleChange}\n />\n );\n default:\n return children;\n }\n }, [filter, draftValue, handleChange, children]);\n\n const handleOutsidePress = () => {\n if (controlledFiltering) {\n handleCancel();\n } else {\n // For multi-select in uncontrolled mode, submit when closing\n if (filter.type === \"multiSelect\") {\n updateFilter(filter.id, draftValue, true);\n }\n handleSubmit();\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n // In uncontrolled mode, Enter should submit\n if (!controlledFiltering) {\n handleSubmit();\n }\n }\n\n if (e.key === \"Escape\") {\n // Trigger the same logic as clicking outside\n handleOutsidePress();\n }\n };\n\n const triggerClasses = cx(styles[\"filter-button-trigger\"], {\n [styles[\"filter-button-trigger--selected\"]]:\n (filter.type === \"custom\" && filter.value) ||\n (filter.type === \"singleSelect\" && filter.selectedItem) ||\n (filter.type === \"multiSelect\" &&\n filter.selectedItems &&\n filter.selectedItems.length > 0) ||\n (filter.type === \"date\" && filter.value) ||\n (filter.type === \"dateRange\" && filter.value),\n });\n\n const contentClasses = cx(styles[\"filter-button-content\"], className);\n\n const iconOptions =\n filter.type === \"date\" || filter.type === \"dateRange\"\n ? { before: Event }\n : { after: ArrowDropDown };\n\n return (\n <FilterItemWrapper filter={filter}>\n <Popover\n open={isOpen}\n onClickOutside={isOpen ? handleOutsidePress : undefined}\n placement=\"bottom-start\"\n >\n <Popover.Button\n onKeyDown={handleKeyDown}\n appearance=\"ghost\"\n size=\"small\"\n icon={iconOptions}\n data-id={filter.id}\n data-anv=\"toolbar-button\"\n className={triggerClasses}\n onClick={() => {\n setIsOpen(!isOpen);\n }}\n >\n {getButtonLabel}\n </Popover.Button>\n\n <Popover.Content onKeyDown={handleKeyDown} className={contentClasses}>\n {getContent}\n {controlledFiltering && (\n <Flex\n gap={2}\n justifyContent=\"flex-end\"\n className={styles[\"filter-button-buttons\"]}\n >\n <Popover.Close size=\"small\" onClick={handleCancel}>\n Cancel\n </Popover.Close>\n <Button appearance=\"primary\" size=\"small\" onClick={handleSubmit}>\n Apply\n </Button>\n </Flex>\n )}\n </Popover.Content>\n </Popover>\n </FilterItemWrapper>\n );\n};\n","import { ComponentPropsWithoutRef, forwardRef, useContext } from \"react\";\nimport { LayoutUtilProps } from \"../../../types\";\nimport { Flex } from \"../../../components/Flex\";\nimport { ToolbarOverflowContext } from \"./internal/ToolbarOverflowContext\";\n\nimport styles from \"./ToolbarControlGroup.module.scss\";\n\n/**\n * Props for the ToolbarControlGroup component\n *\n * @extends ComponentPropsWithoutRef<'div'>\n * @extends LayoutUtilProps\n */\nexport type ToolbarControlGroupProps = ComponentPropsWithoutRef<\"div\"> &\n LayoutUtilProps & {\n /**\n * Accessible label for the control group\n */\n \"aria-label\"?: string;\n };\n\n/**\n * ToolbarControlGroup component provides a flex container for grouping related toolbar controls.\n * Can be used for filters, buttons, or other toolbar items.\n *\n * Features:\n * - Groups related toolbar controls in a flex container\n * - Supports accessibility with aria-label\n * - Handles overflow and wrapping based on toolbar context\n * - Integrates with layout utilities for spacing and alignment\n *\n * @example\n * <ToolbarControlGroup aria-label=\"Formatting controls\">\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold\" />\n * <Toolbar.Button icon={ItalicIcon} aria-label=\"Italic\" />\n * </ToolbarControlGroup>\n */\nconst ToolbarControlGroupElement = forwardRef<\n HTMLDivElement,\n ToolbarControlGroupProps\n>((props, ref) => {\n const { children, \"aria-label\": ariaLabel, ...rest } = props;\n const { overflow } = useContext(ToolbarOverflowContext);\n\n return (\n <Flex\n ref={ref}\n alignItems=\"center\"\n gap={1}\n wrap={overflow === \"collapse\" ? \"nowrap\" : \"wrap\"}\n data-anv=\"toolbar-control-group\"\n role=\"group\"\n aria-label={ariaLabel ? ariaLabel : \"Toolbar controls\"}\n className={styles[\"toolbar-control-group\"]}\n {...rest}\n >\n {children}\n </Flex>\n );\n});\n\nToolbarControlGroupElement.displayName = \"ToolbarControlGroup\";\n\nexport const ToolbarControlGroup = ToolbarControlGroupElement;\n","import * as React from \"react\";\nconst SvgTune = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: \"1em\", height: \"1em\", viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 18c0 .55.45 1 1 1h5v-2H4c-.55 0-1 .45-1 1zM3 6c0 .55.45 1 1 1h9V5H4c-.55 0-1 .45-1 1zm10 14v-1h7c.55 0 1-.45 1-1s-.45-1-1-1h-7v-1c0-.55-.45-1-1-1s-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1zM7 10v1H4c-.55 0-1 .45-1 1s.45 1 1 1h3v1c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1s-1 .45-1 1zm14 2c0-.55-.45-1-1-1h-9v2h9c.55 0 1-.45 1-1zm-5-3c.55 0 1-.45 1-1V7h3c.55 0 1-.45 1-1s-.45-1-1-1h-3V4c0-.55-.45-1-1-1s-1 .45-1 1v4c0 .55.45 1 1 1z\" }));\nexport default SvgTune;\n","import { useContext, useEffect, useState, useMemo, useCallback } from \"react\";\nimport IconTune from \"@servicetitan/hammer-icon/mdi/round/tune.svg\";\nimport IconClose from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport Search from \"@servicetitan/hammer-icon/mdi/round/search.svg\";\nimport {\n CustomFilter,\n Filter,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"./internal/types\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { Checkbox } from \"../../../../components/Checkbox\";\nimport { Radio } from \"../../../../components/Radio\";\nimport { Combobox } from \"../../../../components/Combobox\";\nimport { Flex } from \"../../../../components/Flex\";\nimport { useContainerQuery } from \"../../../../internal/hooks\";\nimport {\n checkActiveFilters,\n getActiveFilters,\n resetFilters,\n updateSingleFilter,\n} from \"./internal/utils/filter-state\";\nimport { DateFieldSingle } from \"../../../../components/DateFieldSingle\";\nimport { DateFieldRange } from \"../../../../components/DateFieldRange\";\nimport ButtonToggle from \"../../../../components/ButtonToggle\";\nimport Chip from \"../../../../components/Chip\";\nimport Drawer from \"../../../../components/Drawer\";\nimport Button from \"../../../../components/Button\";\n\nimport cx from \"classnames\";\nimport styles from \"./Filters.module.scss\";\n\n/**\n * FilterDrawer component provides a drawer interface for filter selection.\n * Always operates in controlled mode with batch updates.\n * Built into FilterGroup for mobile and overflow filter editing.\n *\n * Features:\n * - Shows all available filters in a side panel\n * - Maintains separate draft state for all filters\n * - Updates filters only when Apply is clicked\n * - Provides Clear All functionality\n * - Supports boolean, custom, single-select, multi-select, date, and date range filter types\n * - Integrates with FilterGroup context for state management\n * - Handles date and date range filters with appropriate input components\n */\nexport const FilterDrawer = () => {\n const [open, setOpen] = useState(false);\n\n // Get filter context from parent\n const {\n filters,\n updateFilter,\n onFilterChange,\n hiddenFilters,\n filterGroupRef,\n } = useContext(FilterGroupContext);\n\n const containerQuery = useContainerQuery(filterGroupRef);\n const showInlineFilters =\n containerQuery &&\n containerQuery.name !== \"xs\" &&\n containerQuery.name !== \"sm\";\n\n // Local draft state for filters within the drawer\n const [draftFilters, setDraftFilters] = useState<Filter[]>(filters);\n\n // Local search value state for combobox search fields\n const [searchValues, setSearchValues] = useState<Record<string, string>>({});\n\n // Count active filters based on view mode\n const activeFiltersCount = getActiveFilters(\n !showInlineFilters ? filters : hiddenFilters,\n ).length;\n\n /**\n * Reset draft filters when drawer opens or context filters change\n * Ensures drawer always shows current filter state when opened\n */\n useEffect(() => {\n if (open) {\n // Deep clone the filters to ensure all nested properties are copied\n setDraftFilters(\n filters.map((filter) => {\n switch (filter.type) {\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: filter.selectedItem\n ? filter.items.find(\n (item) => item.id === filter.selectedItem?.id,\n ) || filter.selectedItem\n : undefined,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: filter.selectedItems\n ? filter.selectedItems.map((selectedItem) => {\n // Find the matching item in the current items list\n const matchingItem = filter.items.find(\n (item) => item.id === selectedItem.id,\n );\n return matchingItem || selectedItem;\n })\n : [],\n };\n case \"date\":\n return {\n ...filter,\n value: filter.value as string | null,\n };\n case \"dateRange\":\n return {\n ...filter,\n value: filter.value as {\n startDate: string | null;\n endDate: string | null;\n } | null,\n };\n case \"custom\":\n return {\n ...filter,\n value: filter.value ? { ...filter.value } : undefined,\n };\n default:\n return { ...filter };\n }\n }),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n /**\n * Handles changing a draft filter value\n * Updates only the draft state, not the actual filters\n *\n * @param filterId - ID of the filter to update\n * @param value - New value for the filter\n */\n const handleDraftChange = useCallback(\n (filterId: string, value: unknown) => {\n setDraftFilters((draft) => updateSingleFilter(draft, filterId, value));\n\n // Reset search when selection is made for filters with search\n const filter = filters.find((f) => f.id === filterId);\n if (\n (filter?.type === \"singleSelect\" || filter?.type === \"multiSelect\") &&\n filter.hasSearch &&\n value\n ) {\n // Clear the search value\n setSearchValues((prev) => ({ ...prev, [filterId]: \"\" }));\n // Reset the items list\n requestAnimationFrame(() => {\n filter.onSearch?.(\"\");\n });\n }\n },\n [filters],\n );\n\n /**\n * Clears all draft filters in the drawer\n * Does not affect the actual filters until Apply is clicked\n */\n const clearDraftFilters = () => {\n setDraftFilters(resetFilters(draftFilters));\n };\n\n const hasActiveDraftFilters = checkActiveFilters(draftFilters);\n\n /**\n * Render filter form controls based on filter types\n * Delegates rendering to appropriate components based on filter type\n */\n const filterForm = useMemo(\n () =>\n draftFilters.map((draftFilter) => {\n // Find the original filter to get the render functions\n const originalFilter = filters.find((f) => f.id === draftFilter.id);\n if (!originalFilter) return null;\n\n switch (draftFilter.type) {\n case \"boolean\":\n return (\n <Checkbox\n key={draftFilter.id}\n label={draftFilter.label}\n checked={draftFilter.checked}\n onChange={(e) =>\n handleDraftChange(draftFilter.id, e?.target.checked ?? false)\n }\n />\n );\n case \"custom\": {\n const customFilter = originalFilter as CustomFilter;\n return (\n <div key={draftFilter.id}>\n {customFilter.drawerRender?.({\n value: draftFilter.value,\n onChange: (value) => handleDraftChange(draftFilter.id, value),\n })}\n </div>\n );\n }\n case \"singleSelect\": {\n const singleSelectFilter = originalFilter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n const draftSingleSelectFilter = draftFilter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n\n if (singleSelectFilter.simpleDrawerVariant) {\n // Simple variant: Radio group\n return (\n <div key={draftFilter.id}>\n <Radio.Group legend={singleSelectFilter.label}>\n {singleSelectFilter.items.map((item) => (\n <Radio\n key={item.id}\n name={`${singleSelectFilter.id}-radio`}\n value={item.id}\n label={item.label}\n checked={\n draftSingleSelectFilter.selectedItem?.id === item.id\n }\n onChange={(e) => {\n if (e?.target.checked) {\n const selected = singleSelectFilter.items.find(\n (opt) => opt.id === e.target.value,\n );\n handleDraftChange(draftFilter.id, selected);\n }\n }}\n />\n ))}\n </Radio.Group>\n </div>\n );\n } else {\n // Default variant: Combobox with search\n // Ensure selected item uses the reference from current items array\n const selectedItem = draftSingleSelectFilter.selectedItem\n ? (singleSelectFilter.items?.find(\n (item) =>\n item.id === draftSingleSelectFilter.selectedItem?.id,\n ) ?? null)\n : null;\n\n return (\n <Combobox\n key={draftFilter.id}\n items={singleSelectFilter.items}\n selectedItem={selectedItem}\n onChange={(\n selectedItem: { id: string; label: string } | null,\n ) => {\n handleDraftChange(draftFilter.id, selectedItem);\n }}\n itemToString={(item) => item?.label ?? \"\"}\n disableFilter={singleSelectFilter.hasSearch}\n >\n {singleSelectFilter.hasSearch ? (\n <Combobox.SearchField\n label={draftSingleSelectFilter.label}\n prefix={{ icon: { svg: Search } }}\n placeholder=\"Search...\"\n size=\"small\"\n value={\n draftSingleSelectFilter.selectedItem?.label ||\n searchValues[draftFilter.id] ||\n \"\"\n }\n onChange={(e) => {\n const searchValue = e.target.value;\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: searchValue,\n }));\n singleSelectFilter.onSearch?.(searchValue);\n }}\n onClear={() => {\n // Clear our controlled search value\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: \"\",\n }));\n // Clear the selection\n handleDraftChange(draftFilter.id, undefined);\n // Reset the parent's items list\n singleSelectFilter.onSearchClear?.();\n }}\n data-anv=\"filter-drawer-combobox-search\"\n />\n ) : (\n <Combobox.SelectTrigger\n label={singleSelectFilter.label}\n placeholder=\"Select an option...\"\n size=\"small\"\n />\n )}\n <Combobox.Content>\n {({ items }) => (\n <Combobox.List style={{ padding: 0 }}>\n {items.map((item, i) => (\n <Combobox.Item key={item.id} item={item} index={i}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n );\n }\n }\n case \"multiSelect\": {\n const multiSelectFilter = originalFilter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n const draftMultiSelectFilter = draftFilter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n\n if (multiSelectFilter.simpleDrawerVariant) {\n // Simple variant: ListView\n return (\n <Checkbox.Group\n key={draftFilter.id}\n legend={multiSelectFilter.label}\n >\n {multiSelectFilter.items.map((item) => (\n <Checkbox\n key={item.id}\n label={item.label}\n checked={\n draftMultiSelectFilter.selectedItems?.some(\n (selected) => selected.id === item.id,\n ) ?? false\n }\n onChange={(e) => {\n const currentSelected =\n draftMultiSelectFilter.selectedItems || [];\n if (e?.target.checked) {\n // Add item to selection\n handleDraftChange(draftFilter.id, [\n ...currentSelected,\n item,\n ]);\n } else {\n // Remove item from selection\n handleDraftChange(\n draftFilter.id,\n currentSelected.filter(\n (selected) => selected.id !== item.id,\n ),\n );\n }\n }}\n />\n ))}\n </Checkbox.Group>\n );\n } else {\n // Default variant: Combobox with multiple selection\n const hasActiveSearch =\n searchValues[draftFilter.id] &&\n searchValues[draftFilter.id].length > 0;\n\n return (\n <Combobox\n key={draftFilter.id}\n items={multiSelectFilter.items}\n selectedItems={draftMultiSelectFilter.selectedItems || []}\n onChange={(\n selectedItems: { id: string; label: string }[] | null,\n ) => handleDraftChange(draftFilter.id, selectedItems)}\n itemToString={(item) => item?.label ?? \"\"}\n itemToKey={(item) => item?.id ?? \"\"}\n disableFilter={multiSelectFilter.hasSearch}\n multiple\n disableCloseOnSelectItem={!hasActiveSearch}\n >\n {multiSelectFilter.hasSearch ? (\n <Combobox.SearchField\n label={multiSelectFilter.label}\n prefix={{ icon: { svg: Search } }}\n placeholder=\"Search...\"\n size=\"small\"\n value={searchValues[draftFilter.id] || \"\"}\n onChange={(e) => {\n const searchValue = e.target.value;\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: searchValue,\n }));\n multiSelectFilter.onSearch?.(searchValue);\n }}\n onClear={() => {\n // Clear our controlled search value\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: \"\",\n }));\n handleDraftChange(draftFilter.id, []);\n multiSelectFilter.onSearchClear?.();\n }}\n data-anv=\"filter-drawer-combobox-search\"\n />\n ) : (\n <Combobox.SelectTrigger\n label={multiSelectFilter.label}\n placeholder=\"Select options...\"\n size=\"small\"\n />\n )}\n <Combobox.Content>\n {({ items }) => (\n <Combobox.List style={{ padding: 0 }}>\n {items.map((item, i) => (\n <Combobox.Item key={item.id} item={item} index={i}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n );\n }\n }\n case \"date\": {\n return (\n <DateFieldSingle\n key={draftFilter.id}\n label={draftFilter.label}\n value={draftFilter.value as string | null}\n onChange={(change) => {\n handleDraftChange(draftFilter.id, change.date);\n }}\n mode={draftFilter.mode}\n />\n );\n }\n case \"dateRange\": {\n return (\n <DateFieldRange\n key={draftFilter.id}\n label={draftFilter.label}\n value={\n draftFilter.value as {\n startDate: string | null;\n endDate: string | null;\n } | null\n }\n onChange={(change) => {\n handleDraftChange(draftFilter.id, {\n startDate: change.startDate,\n endDate: change.endDate,\n });\n }}\n mode={draftFilter.mode}\n />\n );\n }\n default:\n return null;\n }\n }),\n [draftFilters, filters, searchValues, handleDraftChange],\n );\n\n /**\n * Applies all draft filter changes to the actual filters\n * Updates filters individually then triggers batch update\n */\n const applyFiltering = () => {\n // Update all filters with their current draft values\n draftFilters.forEach((draftFilter) => {\n switch (draftFilter.type) {\n case \"boolean\":\n updateFilter(draftFilter.id, draftFilter.checked, false);\n break;\n case \"singleSelect\":\n updateFilter(\n draftFilter.id,\n (draftFilter as SingleSelectFilter).selectedItem,\n false,\n );\n break;\n case \"multiSelect\":\n updateFilter(\n draftFilter.id,\n (draftFilter as MultiSelectFilter).selectedItems,\n false,\n );\n break;\n case \"date\":\n case \"dateRange\":\n case \"custom\":\n updateFilter(draftFilter.id, draftFilter.value, false);\n break;\n }\n });\n\n // Submit all filters at once after updates\n onFilterChange?.(draftFilters);\n setOpen(false);\n };\n\n const handleCancel = () => {\n setOpen(false);\n };\n\n const hasHiddenActiveFilters = activeFiltersCount > 0;\n\n const triggerClasses = cx(\n styles[\"filter-button-trigger\"],\n styles[\"filter-drawer-trigger\"],\n {\n [styles[\"filter-drawer-trigger--chipped\"]]: hasHiddenActiveFilters,\n },\n );\n\n return (\n <>\n <ButtonToggle\n data-anv=\"filter-group-drawer-trigger\"\n icon={{ before: IconTune }}\n onClick={() => setOpen(true)}\n className={triggerClasses}\n checked={open}\n >\n Filters\n {hasHiddenActiveFilters && (\n <Chip\n size=\"small\"\n color=\"#0265DC\"\n label={activeFiltersCount.toString()}\n />\n )}\n </ButtonToggle>\n\n <Drawer\n data-anv=\"filter-group-drawer\"\n data-testid=\"filter-group-drawer\"\n open={open}\n onClose={() => setOpen(false)}\n >\n <Drawer.Content>\n <Flex direction=\"column\" gap={6} grow={1}>\n {filterForm}\n </Flex>\n </Drawer.Content>\n\n <Drawer.Footer>\n <Flex\n justifyContent={\n hasActiveDraftFilters ? \"space-between\" : \"flex-end\"\n }\n grow={1}\n >\n {hasActiveDraftFilters && (\n <Button\n appearance=\"ghost\"\n icon={{ before: IconClose }}\n onClick={clearDraftFilters}\n >\n Clear All Filters\n </Button>\n )}\n\n <Flex gap=\"3\">\n <Button onClick={handleCancel}>Cancel</Button>\n <Button appearance=\"primary\" onClick={applyFiltering}>\n Apply\n </Button>\n </Flex>\n </Flex>\n </Drawer.Footer>\n </Drawer>\n </>\n );\n};\n","import {\n ComponentPropsWithoutRef,\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n useCallback,\n} from \"react\";\nimport { useMergeRefs } from \"../../../../hooks\";\nimport CloseIcon from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport {\n BooleanFilter,\n CustomFilter,\n DateFilter,\n DateRangeFilter,\n Filter,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"./internal/types\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport Button from \"../../../../components/Button\";\nimport { LayoutUtilProps } from \"../../../../types\";\nimport { useContainerQuery } from \"../../../../internal/hooks\";\nimport {\n checkActiveFilters,\n resetFilters,\n updateSingleFilter,\n} from \"./internal/utils/filter-state\";\nimport { FilterToggleButton } from \"./FilterToggleButton\";\nimport { FilterButton } from \"./FilterButton\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { ToolbarControlGroup } from \"../ToolbarControlGroup\";\nimport { FilterDrawer } from \"./FilterDrawer\";\n\nimport styles from \"./Filters.module.scss\";\n\n/**\n * Props for the FilterGroup component\n *\n * @extends ComponentPropsWithoutRef<\"div\">\n * @extends LayoutUtilProps\n */\nexport type FilterGroupProps = ComponentPropsWithoutRef<\"div\"> &\n LayoutUtilProps & {\n /** Array of filter objects */\n filters: Filter[];\n /** Callback function when filters change */\n onFilterChange?: (filters: Filter[]) => void;\n /** Whether the filters are submission is controlled via an apply button */\n controlledFiltering?: boolean;\n };\n\n/**\n * FilterGroup component displays a group of filters with toggles and a clear button.\n * Also contains the FilterDrawer for additional filter options.\n *\n * Features:\n * - Renders filter toggles and popovers for all filter types\n * - Supports controlled and uncontrolled filtering\n * - Integrates with FilterDrawer for batch filter editing\n * - Provides a clear all filters button\n * - Handles overflow and hidden filters\n * - Shares filter state via context for child components\n * - Supports boolean, custom, single-select, multi-select, date, and date range filter types\n * - Preserves filter state when filter configuration changes\n *\n * @example\n * <FilterGroup\n * filters={filters}\n * onFilterChange={handleFilter}\n * controlledFiltering={true}\n * />\n */\nconst FilterGroupElement = forwardRef<HTMLDivElement, FilterGroupProps>(\n (props, ref) => {\n const {\n filters: initialFilters,\n onFilterChange,\n controlledFiltering = false,\n ...rest\n } = props;\n\n const [filters, setFilters] = useState<Filter[]>(initialFilters);\n const [hiddenFilters, setHiddenFilters] = useState<Filter[]>([]);\n const filterGroupRef = useRef<HTMLDivElement>(null);\n const containerQuery = useContainerQuery(filterGroupRef);\n\n const showInlineFilters =\n containerQuery &&\n containerQuery.name !== \"xs\" &&\n containerQuery.name !== \"sm\";\n\n // Temporary override to test if filters show when forced to true\n // const showInlineFilters = true;\n\n // Update filters when props change\n useEffect(() => {\n setFilters((prevFilters) => {\n return initialFilters.map((newFilter: Filter) => {\n // Find the existing filter with the same ID\n const existingFilter = prevFilters.find((f) => f.id === newFilter.id);\n\n // If we have an existing filter, preserve its selected state\n if (existingFilter) {\n switch (newFilter.type) {\n case \"boolean\":\n return {\n ...newFilter,\n checked: (existingFilter as BooleanFilter).checked,\n };\n case \"singleSelect\":\n return {\n ...newFilter,\n selectedItem: (existingFilter as SingleSelectFilter<unknown>)\n .selectedItem,\n };\n case \"multiSelect\":\n return {\n ...newFilter,\n selectedItems: (existingFilter as MultiSelectFilter<unknown>)\n .selectedItems,\n };\n case \"date\":\n return {\n ...newFilter,\n value: (existingFilter as DateFilter).value,\n };\n case \"dateRange\":\n return {\n ...newFilter,\n value: (existingFilter as DateRangeFilter).value,\n };\n case \"custom\":\n return {\n ...newFilter,\n value: (existingFilter as CustomFilter<unknown>).value,\n };\n default:\n return newFilter;\n }\n }\n\n return newFilter;\n });\n });\n }, [initialFilters]);\n\n /**\n * Updates filter state when a filter is changed\n *\n * @param filterId - ID of the filter to update\n * @param value - New value for the filter\n */\n const updateFilter = useCallback(\n (filterId: string, value: unknown, submit: boolean) => {\n setFilters((prevFilters) => {\n const updatedFilters = updateSingleFilter(\n prevFilters,\n filterId,\n value,\n );\n\n if (submit) {\n onFilterChange?.(updatedFilters);\n }\n\n return updatedFilters;\n });\n },\n [onFilterChange],\n );\n\n /**\n * Adds a filter to the list of hidden filters.\n *\n * @param filter - The filter to add to the hidden filters array\n */\n const addHiddenFilter = useCallback((filter: Filter) => {\n setHiddenFilters((prev) => [...prev, filter]);\n }, []);\n\n /**\n * Removes a filter from the list of hidden filters.\n *\n * @param filter - The filter to remove from the hidden filters array\n */\n const removeHiddenFilter = useCallback((filter: Filter) => {\n setHiddenFilters((prev) => prev.filter((f) => f.id !== filter.id));\n }, []);\n\n /**\n * Clears all active filters\n */\n const clearAllFilters = () => {\n const resetAllFilters = resetFilters(filters);\n setFilters(resetAllFilters);\n onFilterChange?.(resetAllFilters);\n\n // Since the clear button disappears after clearing, we need to set focus on the first focusable element in the filter group\n setTimeout(() => {\n if (filterGroupRef.current) {\n const firstFocusable = filterGroupRef.current.querySelector(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ) as HTMLElement;\n\n if (firstFocusable) {\n firstFocusable.focus();\n }\n }\n }, 0);\n };\n\n const hasActiveFilters = checkActiveFilters(filters);\n\n // Create filter controls that are displayed in the group\n const filterGroupControls = filters.map((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return (\n <FilterToggleButton\n key={filter.id}\n id={filter.id}\n checked={filter.checked}\n onClick={() => {\n updateFilter(filter.id, !filter.checked, true);\n }}\n >\n {filter.label}\n </FilterToggleButton>\n );\n case \"custom\":\n case \"singleSelect\":\n case \"multiSelect\":\n case \"date\":\n case \"dateRange\":\n return <FilterButton key={filter.id} filter={filter} />;\n // TODO: Add cases for other filter types here as needed\n default:\n return null;\n }\n });\n\n const value = useMemo(\n () => ({\n filterGroupRef,\n filters,\n updateFilter,\n onFilterChange,\n controlledFiltering,\n hiddenFilters,\n addHiddenFilter,\n removeHiddenFilter,\n }),\n [\n filterGroupRef,\n filters,\n updateFilter,\n onFilterChange,\n controlledFiltering,\n hiddenFilters,\n addHiddenFilter,\n removeHiddenFilter,\n ],\n );\n\n return (\n <FilterGroupContext.Provider value={value}>\n <ToolbarControlGroup\n ref={useMergeRefs([filterGroupRef, ref])}\n data-anv=\"toolbar-filter-group\"\n aria-label=\"Filter controls\"\n {...rest}\n >\n {showInlineFilters && filterGroupControls}\n <FilterDrawer />\n\n {showInlineFilters && hasActiveFilters && (\n <FilterItemWrapper>\n <Button\n appearance=\"ghost\"\n size=\"small\"\n className={styles[\"filter-button-trigger\"]}\n icon={{\n before: CloseIcon,\n }}\n onClick={clearAllFilters}\n >\n Clear Filters\n </Button>\n </FilterItemWrapper>\n )}\n </ToolbarControlGroup>\n </FilterGroupContext.Provider>\n );\n },\n);\n\nFilterGroupElement.displayName = \"FilterGroup\";\n\nexport const FilterGroup = FilterGroupElement;\n","import { forwardRef, Ref } from \"react\";\nimport { SearchFieldProps, SearchField } from \"../../../components/SearchField\";\n\nimport cx from \"classnames\";\nimport styles from \"./ToolbarSearchField.module.scss\";\n\n/**\n * Props for the ToolbarSearchField component\n *\n * @extends Omit<SearchFieldProps, \"size\">\n */\nexport type ToolbarSearchFieldProps = Omit<SearchFieldProps, \"size\">;\n\n/**\n * ToolbarSearchField component renders a small-sized search field for use in toolbars.\n *\n * Features:\n * - Renders a search field styled for toolbar usage\n * - Always uses small size for compact layout\n * - Supports all SearchField props except size\n * - Integrates with toolbar layouts and accessibility\n *\n * @example\n * <ToolbarSearchField placeholder=\"Search...\" />\n */\nexport const ToolbarSearchField = forwardRef(\n (props: ToolbarSearchFieldProps, ref: Ref<HTMLInputElement>) => {\n const { className, ...rest } = props;\n\n const searchFieldStyles = cx(styles[\"toolbar-search-field\"], className);\n\n return (\n <div className={styles[\"toolbar-search-field-container\"]}>\n <SearchField\n ref={ref}\n className={searchFieldStyles}\n size=\"small\"\n data-anv=\"toolbar-search-field\"\n {...rest}\n />\n </div>\n );\n },\n);\n\nToolbarSearchField.displayName = \"ToolbarSearchField\";\n","import { ToolbarButton } from \"./ToolbarButton\";\nimport { ToolbarButtonToggle } from \"./ToolbarButtonToggle\";\nimport { ToolbarButtonLink } from \"./ToolbarButtonLink\";\nimport { ToolbarSelect } from \"./ToolbarSelect\";\nimport { ToolbarItemProps, ToolbarOverflowTypes } from \"./types\";\nimport {\n ComponentPropsWithoutRef,\n forwardRef,\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { LayoutUtilProps } from \"../../../types\";\nimport { useLayoutPropsUtil } from \"../../../internal/hooks\";\nimport {\n handleToolbarKeyDown,\n updateToolbarItemsTabIndex,\n} from \"./internal/utils/accessibility\";\nimport { ToolbarOverflowContext } from \"./internal/ToolbarOverflowContext\";\nimport Flex from \"../../../components/Flex\";\nimport { useMergeRefs } from \"../../../hooks\";\nimport { ToolbarOverflowMenu } from \"./internal/ToolbarOverflowMenu\";\nimport { FilterGroup } from \"./Filters/FilterGroup\";\nimport { ToolbarControlGroup } from \"./ToolbarControlGroup\";\nimport { ToolbarSearchField } from \"./ToolbarSearchField\";\n\nimport cx from \"classnames\";\nimport styles from \"./Toolbar.module.scss\";\n\n/**\n * Props for the Toolbar component\n * @extends ComponentPropsWithoutRef<\"div\">\n * @extends LayoutUtilProps\n */\nexport type ToolbarProps = ComponentPropsWithoutRef<\"div\"> &\n LayoutUtilProps & {\n /**\n * Description of the content this toolbar is associated with, used for accessibility\n */\n associatedContent: string;\n /**\n * Orientation of the toolbar\n * @default horizontal\n */\n direction?: \"vertical\" | \"horizontal\";\n /**\n * How to handle overflow when items don't fit\n * @default wrap\n */\n overflow?: ToolbarOverflowTypes;\n /**\n * Additional items to display in the overflow menu\n */\n additionalItems?: ReactElement[];\n };\n\n/**\n * Toolbar component for grouping related interactive elements with anvil2 tracking.\n *\n * Features:\n * - Horizontal or vertical orientation\n * - Overflow handling with wrap or collapse behavior\n * - Keyboard navigation following ARIA best practices\n * - Screen reader announcements and accessibility\n * - Automatic overflow menu for collapsed items\n * - Support for buttons, toggles, selects, and links\n * - Layout utilities for positioning and spacing\n * - Context-based state management for child components\n * - Automatic tracking ID generation for analytics\n * - Integration with anvil2 tracking system\n *\n * @example\n * <Toolbar associatedContent=\"document editor\" overflow=\"collapse\">\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold\" />\n * <Toolbar.ButtonToggle icon={ItalicIcon} aria-label=\"Italic\" />\n * <Toolbar.Select\n * items={fontOptions}\n * selected=\"arial\"\n * accessibleLabel=\"Font family\"\n * />\n * </Toolbar>\n */\nexport const ToolbarElement = forwardRef<HTMLDivElement, ToolbarProps>(\n (props, ref) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const {\n associatedContent,\n className,\n children,\n style,\n direction = \"horizontal\",\n overflow = \"wrap\",\n onKeyDown,\n additionalItems,\n ...rest\n } = componentProps;\n\n // State for tracking items that should appear in the overflow menu\n const [overflowItems, setOverflowItems] = useState<ToolbarItemProps[]>([]);\n const toolbarItemsRef = useRef<HTMLDivElement>(null);\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n // Track original order of items to maintain consistent ordering in the overflow menu\n const [orderedIds, setOrderedIds] = useState<string[]>([]);\n\n // Update ordered IDs when children change to maintain correct overflow order\n useEffect(() => {\n const newOrderedIds = Array.from(\n toolbarItemsRef.current?.querySelectorAll(\"[data-id]\") || [],\n ).map((el) => {\n return el.getAttribute(\"data-id\") as string;\n });\n\n setOrderedIds(newOrderedIds);\n }, [children]);\n\n // Add item to overflow menu\n const addItem = useCallback((item: ToolbarItemProps) => {\n setOverflowItems((prev) => [...prev, item]);\n }, []);\n\n // Remove item from overflow menu\n const removeItem = useCallback((item: ToolbarItemProps) => {\n setOverflowItems((prev) =>\n prev.filter((component) => component.id !== item.id),\n );\n }, []);\n\n // Initialize tabindex values\n useEffect(() => {\n if (toolbarRef.current) {\n // Initialize toolbar with the first item active\n updateToolbarItemsTabIndex(toolbarRef.current);\n }\n }, [children]);\n\n // Handle keyboard navigation events within the toolbar\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (toolbarRef.current) {\n handleToolbarKeyDown(event, toolbarRef.current);\n }\n\n onKeyDown?.(event);\n },\n [onKeyDown],\n );\n\n // Determine if overflow menu should be shown\n const showOverflowMenu =\n (overflow === \"collapse\" && overflowItems.length > 0) ||\n !!additionalItems;\n\n // Context value provided to all toolbar children\n const value = useMemo(\n () => ({\n overflowItems,\n addItem,\n removeItem,\n toolbarRef,\n orderedIds,\n overflow,\n }),\n [overflowItems, addItem, removeItem, toolbarRef, orderedIds, overflow],\n );\n\n const styleCombined = {\n ...style,\n ...layoutStyles,\n };\n\n const toolbarClassNames = cx(styles[\"toolbar\"], className);\n\n const toolbarContentClassNames = cx(styles[\"toolbar-content\"], {\n [styles[`overflow-${overflow}`]]: overflow,\n });\n\n return (\n <ToolbarOverflowContext.Provider value={value}>\n <Flex\n direction={direction === \"horizontal\" ? \"row\" : \"column\"}\n wrap={overflow === \"wrap\" ? \"wrap\" : \"nowrap\"}\n alignItems=\"center\"\n className={toolbarClassNames}\n style={styleCombined}\n ref={useMergeRefs([toolbarRef, ref])}\n role=\"toolbar\"\n data-anv=\"toolbar\"\n aria-orientation={direction}\n aria-label={`Toolbar for ${associatedContent}. Use arrow keys to navigate through toolbar controls.`}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <Flex\n ref={useMergeRefs([toolbarItemsRef, ref])}\n className={toolbarContentClassNames}\n direction={direction === \"horizontal\" ? \"row\" : \"column\"}\n wrap={overflow === \"wrap\" ? \"wrap\" : \"nowrap\"}\n alignItems=\"center\"\n grow={1}\n data-anv=\"toolbar-content\"\n data-overflow={overflow}\n >\n {children}\n </Flex>\n\n {showOverflowMenu && (\n <ToolbarOverflowMenu\n direction={direction}\n additionalItems={additionalItems}\n />\n )}\n </Flex>\n </ToolbarOverflowContext.Provider>\n );\n },\n);\n\nToolbarElement.displayName = \"Toolbar\";\n\n/**\n * Toolbar component for grouping related interactive elements.\n *\n * Features:\n * - Horizontal or vertical orientation\n * - Overflow handling with wrap or collapse behavior\n * - Keyboard navigation following ARIA best practices\n * - Screen reader announcements and accessibility\n * - Automatic overflow menu for collapsed items\n * - Support for buttons, toggles, selects, and links\n * - Layout utilities for positioning and spacing\n * - Context-based state management for child components\n *\n * @example\n * <Toolbar associatedContent=\"document editor\" overflow=\"collapse\">\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold\" />\n * <Toolbar.ButtonToggle icon={ItalicIcon} aria-label=\"Italic\" />\n * <Toolbar.Select\n * items={fontOptions}\n * selected=\"arial\"\n * accessibleLabel=\"Font family\"\n * />\n * </Toolbar>\n *\n * @example\n * <Toolbar associatedContent=\"data table\" overflow=\"wrap\">\n * <Toolbar.Search placeholder=\"Search...\" />\n * <Toolbar.Filters\n * filters={filters}\n * onFilterChange={handleFilter}\n * controlledFiltering={true}\n * />\n * <Toolbar.ControlGroup aria-label=\"Actions\">\n * <Toolbar.Button icon={AddIcon} aria-label=\"Add item\" />\n * <Toolbar.Button icon={ExportIcon} aria-label=\"Export\" />\n * </Toolbar.ControlGroup>\n * </Toolbar>\n */\nexport const Toolbar = Object.assign(ToolbarElement, {\n /**\n * ToolbarButton component for standard clickable actions within a toolbar with anvil2 tracking.\n *\n * Features:\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Automatic tooltip for icon-only buttons\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold text\" />\n *\n * @example\n * <Toolbar.Button appearance=\"primary\">\n * Save\n * </Toolbar.Button>\n */\n Button: ToolbarButton,\n /**\n * ToolbarButtonToggle component for toggleable actions within a toolbar with anvil2 tracking.\n *\n * Features:\n * - Toggle state management\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Toolbar.ButtonToggle icon={BoldIcon} aria-label=\"Bold\" checked={isBold} />\n */\n ButtonToggle: ToolbarButtonToggle,\n /**\n * ToolbarButtonLink component for link actions within a toolbar with anvil2 tracking.\n *\n * Features:\n * - Link functionality with href support\n * - Designed specifically for toolbar integration\n * - Consistent styling with other toolbar items\n * - Overflow menu support\n * - Accessibility enforcement for aria-labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Toolbar.ButtonLink href=\"/help\">\n * Help\n * </Toolbar.ButtonLink>\n */\n ButtonLink: ToolbarButtonLink,\n /**\n * ToolbarSelect component provides a dropdown selector within a toolbar with anvil2 tracking.\n *\n * Features:\n * - Dropdown menu with selectable options\n * - Controlled and uncontrolled usage patterns\n * - Automatic overflow menu integration\n * - Accessibility support with proper ARIA labels\n * - Small size optimized for toolbar layout\n * - Ghost and primary appearance options\n * - Dropdown arrow icon indicator\n * - Listbox integration for keyboard navigation\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Toolbar.Select\n * items={fontOptions}\n * selected=\"arial\"\n * accessibleLabel=\"Font family\"\n * onChange={(id) => setFont(id)}\n * />\n */\n Select: ToolbarSelect,\n /**\n * FilterGroup component displays a group of filters with toggles and a clear button.\n * Also contains the FilterDrawer for additional filter options.\n *\n * Features:\n * - Renders filter toggles and popovers for all filter types\n * - Supports controlled and uncontrolled filtering\n * - Integrates with FilterDrawer for batch filter editing\n * - Provides a clear all filters button\n * - Handles overflow and hidden filters\n * - Shares filter state via context for child components\n * - Supports boolean, custom, single-select, multi-select, date, and date range filter types\n * - Date filters include calendar popup for easy selection\n * - Date range filters support start and end date selection\n *\n * @example\n * <Toolbar.Filters\n * filters={filters}\n * onFilterChange={handleFilter}\n * controlledFiltering={true}\n * />\n */\n Filters: FilterGroup,\n /**\n * ToolbarControlGroup component provides a flex container for grouping related toolbar controls.\n * Can be used for filters, buttons, or other toolbar items.\n *\n * Features:\n * - Groups related toolbar controls in a flex container\n * - Supports accessibility with aria-label\n * - Handles overflow and wrapping based on toolbar context\n * - Integrates with layout utilities for spacing and alignment\n *\n * @example\n * <Toolbar.ControlGroup aria-label=\"Formatting controls\">\n * <Toolbar.Button icon={BoldIcon} aria-label=\"Bold\" />\n * <Toolbar.Button icon={ItalicIcon} aria-label=\"Italic\" />\n * </Toolbar.ControlGroup>\n */\n ControlGroup: ToolbarControlGroup,\n /**\n * ToolbarSearchField component renders a small-sized search field for use in toolbars.\n *\n * Features:\n * - Renders a search field styled for toolbar usage\n * - Always uses small size for compact layout\n * - Supports all SearchField props except size\n * - Integrates with toolbar layouts and accessibility\n *\n * @example\n * <Toolbar.Search placeholder=\"Search...\" />\n */\n Search: ToolbarSearchField,\n});\n"],"names":["core.primitive?.BreakpointSm","core.primitive?.BreakpointMd","core.primitive?.BreakpointLg","core.primitive?.BreakpointXl","core.primitive?.BreakpointXxl","styles","item","ArrowDropDown","items","MoreHoriz","MoreVert","Event","selectedItem","Search","IconTune","IconClose","value","CloseIcon"],"mappings":"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"}