@ds-mo/ui 15.5.0 → 15.6.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 (256) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +48 -23
  4. package/dist/angular/ds-data-preferences.d.ts +1 -1
  5. package/dist/angular/ds-data-preferences.js +3 -3
  6. package/dist/angular/ds-menu.d.ts +7 -1
  7. package/dist/angular/ds-menu.js +5 -2
  8. package/dist/angular/ds-table.d.ts +1 -1
  9. package/dist/angular/ds-table.js +3 -3
  10. package/dist/components/THIRD-PARTY-NOTICES +1 -1
  11. package/dist/components/bundled-dependencies.json +1 -1
  12. package/dist/components/ds-agent-questionnaire.js +1 -1
  13. package/dist/components/ds-agent-response.js +1 -1
  14. package/dist/components/ds-banner.js +1 -1
  15. package/dist/components/ds-bar-nav.js +1 -1
  16. package/dist/components/ds-bar-page-title.js +1 -1
  17. package/dist/components/ds-bar-title.js +1 -1
  18. package/dist/components/ds-bar-workflow.js +1 -1
  19. package/dist/components/ds-button-filled.js +1 -1
  20. package/dist/components/ds-button-unfilled.js +1 -1
  21. package/dist/components/ds-calendar.js +1 -1
  22. package/dist/components/ds-card-chart.js +1 -1
  23. package/dist/components/ds-card-overview.js +1 -1
  24. package/dist/components/ds-card-setting.js +1 -1
  25. package/dist/components/ds-code-block.js +1 -1
  26. package/dist/components/ds-data-customize.js +1 -1
  27. package/dist/components/ds-data-filter.js +1 -1
  28. package/dist/components/ds-data-group.js +1 -1
  29. package/dist/components/ds-data-preferences.js +1 -1
  30. package/dist/components/ds-data-preferences.js.map +1 -1
  31. package/dist/components/ds-data-saved-views.js +1 -1
  32. package/dist/components/ds-data-search.js +1 -1
  33. package/dist/components/ds-data-search.js.map +1 -1
  34. package/dist/components/ds-data-sort.js +1 -1
  35. package/dist/components/ds-filter-menu.js +1 -1
  36. package/dist/components/ds-input-date.js +1 -1
  37. package/dist/components/ds-input-time.js +1 -1
  38. package/dist/components/ds-input.js +1 -1
  39. package/dist/components/ds-map-entity-marker.js +1 -1
  40. package/dist/components/ds-map-entity-marker.js.map +1 -1
  41. package/dist/components/ds-markdown.js +1 -1
  42. package/dist/components/ds-menu.js +1 -1
  43. package/dist/components/ds-message-actions.js +1 -1
  44. package/dist/components/ds-message-composer.js +1 -1
  45. package/dist/components/ds-message-scroller.js +1 -1
  46. package/dist/components/ds-mobile-header.js +1 -1
  47. package/dist/components/ds-mobile-section-switcher.js +1 -1
  48. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  49. package/dist/components/ds-modal.js +1 -1
  50. package/dist/components/ds-pagination.js +1 -1
  51. package/dist/components/ds-panel-nav.js +1 -1
  52. package/dist/components/ds-panel-tool-header.js +1 -1
  53. package/dist/components/ds-panel-tool-search.js +1 -1
  54. package/dist/components/ds-panel-tools.js +1 -1
  55. package/dist/components/ds-select.js +1 -1
  56. package/dist/components/ds-shell-app.js +1 -1
  57. package/dist/components/ds-shell-tools.js +1 -1
  58. package/dist/components/ds-table.js +1 -1
  59. package/dist/components/ds-table.js.map +1 -1
  60. package/dist/components/ds-toast.js +1 -1
  61. package/dist/components/ds-toast.js.map +1 -1
  62. package/dist/components/ds-tooltip.js +1 -1
  63. package/dist/components/{p-BO5URdZF.js → p-B-pkoIX9.js} +2 -2
  64. package/dist/components/{p--STJbKuN.js → p-B3o9zn3Y.js} +2 -2
  65. package/dist/components/p-BR9Pjp15.js +2 -0
  66. package/dist/components/{p-Bq_ypMSy.js.map → p-BR9Pjp15.js.map} +1 -1
  67. package/dist/components/{p-rmPIcWED.js → p-BZY40-pE.js} +2 -2
  68. package/dist/components/{p-D-J7GgjY.js → p-BqipGGua.js} +2 -2
  69. package/dist/components/{p-D-J7GgjY.js.map → p-BqipGGua.js.map} +1 -1
  70. package/dist/components/{p-PtxCwf5S.js → p-C6kUn-vb.js} +2 -2
  71. package/dist/components/p-CElsKlxj.js +2 -0
  72. package/dist/components/{p-C1oczmAc.js.map → p-CElsKlxj.js.map} +1 -1
  73. package/dist/components/p-CIMyD_6H.js +2 -0
  74. package/dist/components/{p-C5BBIDVm.js.map → p-CIMyD_6H.js.map} +1 -1
  75. package/dist/components/{p-BcpIK9S6.js → p-CSxwWcwW.js} +2 -2
  76. package/dist/components/p-CUYLGe5d.js +2 -0
  77. package/dist/components/{p-D9_iDlkT.js.map → p-CUYLGe5d.js.map} +1 -1
  78. package/dist/components/{p-wRhYxngW.js → p-CaFXrn_8.js} +2 -2
  79. package/dist/components/{p-BYeG0b5N.js → p-DObhRLBa.js} +2 -2
  80. package/dist/components/{p-C_9VGgPf.js → p-DP07JCed.js} +2 -2
  81. package/dist/components/{p-Dg6hnCc2.js → p-DVsGfz7J.js} +2 -2
  82. package/dist/components/{p-Dg6hnCc2.js.map → p-DVsGfz7J.js.map} +1 -1
  83. package/dist/components/p-DYGllrVT.js +2 -0
  84. package/dist/components/{p-DEYCF-oJ.js.map → p-DYGllrVT.js.map} +1 -1
  85. package/dist/components/{p-BGSG6xIS.js → p-DYtVsnDS.js} +2 -2
  86. package/dist/components/p-DbW8S5qe.js +2 -0
  87. package/dist/components/p-DbW8S5qe.js.map +1 -0
  88. package/dist/components/p-DcxY_pdJ.js +2 -0
  89. package/dist/components/{p-CA3iQ1ME.js.map → p-DcxY_pdJ.js.map} +1 -1
  90. package/dist/components/{p-B6TX55c5.js → p-DdFeWC-e.js} +2 -2
  91. package/dist/components/p-DlCLfwP4.js +2 -0
  92. package/dist/components/p-DuCfCvPs.js +2 -0
  93. package/dist/components/p-DuCfCvPs.js.map +1 -0
  94. package/dist/components/{p-BYrBU_U9.js → p-HMDczkQf.js} +2 -2
  95. package/dist/components/p-HfZ1gI2q.js +2 -0
  96. package/dist/components/{p-jp7hwRtC.js.map → p-HfZ1gI2q.js.map} +1 -1
  97. package/dist/components/{p-DR_8IPn9.js → p-KA8srEed.js} +2 -2
  98. package/dist/components/{p-CXGjCWSh.js → p-OJ5WeR05.js} +2 -2
  99. package/dist/components/p-Ouk6FCxc.js +2 -0
  100. package/dist/components/{p-PzYJqN8B.js.map → p-Ouk6FCxc.js.map} +1 -1
  101. package/dist/components/p-leZFu-cd.js +2 -0
  102. package/dist/components/{p-DPFg5d4_.js.map → p-leZFu-cd.js.map} +1 -1
  103. package/dist/components/{p-DjbT9kKm.js → p-wXKIVUTn.js} +2 -2
  104. package/dist/components/p-xMBaOeKa.js +2 -0
  105. package/dist/components/p-xMBaOeKa.js.map +1 -0
  106. package/dist/docs/components.json +208 -30
  107. package/dist/lint/index.js +1 -1
  108. package/dist/mcp-data/registry/agent-activity.json +1 -1
  109. package/dist/mcp-data/registry/agent-questionnaire.json +1 -1
  110. package/dist/mcp-data/registry/agent-response.json +1 -1
  111. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  112. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  113. package/dist/mcp-data/registry/attachment-list.json +1 -1
  114. package/dist/mcp-data/registry/avatar.json +1 -1
  115. package/dist/mcp-data/registry/badge.json +1 -1
  116. package/dist/mcp-data/registry/banner.json +1 -1
  117. package/dist/mcp-data/registry/bar-action.json +1 -1
  118. package/dist/mcp-data/registry/bar-nav.json +1 -1
  119. package/dist/mcp-data/registry/bar-page-title.json +1 -1
  120. package/dist/mcp-data/registry/bar-title.json +1 -1
  121. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  122. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  123. package/dist/mcp-data/registry/button-filled.json +2 -2
  124. package/dist/mcp-data/registry/button-inverted.json +1 -1
  125. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  126. package/dist/mcp-data/registry/calendar.json +1 -1
  127. package/dist/mcp-data/registry/card-action-center.json +1 -1
  128. package/dist/mcp-data/registry/card-chart.json +1 -1
  129. package/dist/mcp-data/registry/card-navigation.json +1 -1
  130. package/dist/mcp-data/registry/card-overview.json +1 -1
  131. package/dist/mcp-data/registry/card-setting.json +1 -1
  132. package/dist/mcp-data/registry/card-settings-scope.json +1 -1
  133. package/dist/mcp-data/registry/chart-legend.json +1 -1
  134. package/dist/mcp-data/registry/chart.json +1 -1
  135. package/dist/mcp-data/registry/checkbox-group.json +1 -1
  136. package/dist/mcp-data/registry/checkbox.json +1 -1
  137. package/dist/mcp-data/registry/chip.json +1 -1
  138. package/dist/mcp-data/registry/code-block.json +1 -1
  139. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  140. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  141. package/dist/mcp-data/registry/conversation-list.json +1 -1
  142. package/dist/mcp-data/registry/data-customize.json +1 -1
  143. package/dist/mcp-data/registry/data-filter.json +1 -1
  144. package/dist/mcp-data/registry/data-group.json +1 -1
  145. package/dist/mcp-data/registry/data-preferences.json +22 -6
  146. package/dist/mcp-data/registry/data-saved-views.json +1 -1
  147. package/dist/mcp-data/registry/data-search.json +1 -1
  148. package/dist/mcp-data/registry/data-sort.json +1 -1
  149. package/dist/mcp-data/registry/data-toolbar.json +1 -1
  150. package/dist/mcp-data/registry/divider.json +1 -1
  151. package/dist/mcp-data/registry/empty-state.json +1 -1
  152. package/dist/mcp-data/registry/field.json +1 -1
  153. package/dist/mcp-data/registry/filter-menu.json +1 -1
  154. package/dist/mcp-data/registry/icon.json +1 -1
  155. package/dist/mcp-data/registry/inline-banner-settings.json +1 -1
  156. package/dist/mcp-data/registry/input-date.json +1 -1
  157. package/dist/mcp-data/registry/input-time.json +1 -1
  158. package/dist/mcp-data/registry/input.json +1 -1
  159. package/dist/mcp-data/registry/loader.json +1 -1
  160. package/dist/mcp-data/registry/map-cluster-marker.json +1 -1
  161. package/dist/mcp-data/registry/map-entity-marker.json +6 -6
  162. package/dist/mcp-data/registry/markdown.json +1 -1
  163. package/dist/mcp-data/registry/menu.json +31 -12
  164. package/dist/mcp-data/registry/message-actions.json +1 -1
  165. package/dist/mcp-data/registry/message-bubble.json +1 -1
  166. package/dist/mcp-data/registry/message-composer.json +1 -1
  167. package/dist/mcp-data/registry/message-scroller.json +1 -1
  168. package/dist/mcp-data/registry/message.json +1 -1
  169. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  170. package/dist/mcp-data/registry/mobile-header.json +1 -1
  171. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  172. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  173. package/dist/mcp-data/registry/modal.json +1 -1
  174. package/dist/mcp-data/registry/pagination.json +1 -1
  175. package/dist/mcp-data/registry/panel-nav.json +1 -1
  176. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  177. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  178. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  179. package/dist/mcp-data/registry/panel-tools.json +1 -1
  180. package/dist/mcp-data/registry/paper-texture.json +1 -1
  181. package/dist/mcp-data/registry/radio-tile.json +1 -1
  182. package/dist/mcp-data/registry/radio.json +1 -1
  183. package/dist/mcp-data/registry/registry.json +48 -23
  184. package/dist/mcp-data/registry/score.json +1 -1
  185. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  186. package/dist/mcp-data/registry/select.json +1 -1
  187. package/dist/mcp-data/registry/setting-row-checkbox.json +1 -1
  188. package/dist/mcp-data/registry/setting-row-radio.json +1 -1
  189. package/dist/mcp-data/registry/setting-row-toggle.json +1 -1
  190. package/dist/mcp-data/registry/shell-app.json +1 -1
  191. package/dist/mcp-data/registry/shell-page.json +1 -1
  192. package/dist/mcp-data/registry/shell-tools.json +1 -1
  193. package/dist/mcp-data/registry/skeleton.json +1 -1
  194. package/dist/mcp-data/registry/slider.json +1 -1
  195. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  196. package/dist/mcp-data/registry/switch.json +1 -1
  197. package/dist/mcp-data/registry/tab-group.json +1 -1
  198. package/dist/mcp-data/registry/table.json +59 -19
  199. package/dist/mcp-data/registry/tag.json +1 -1
  200. package/dist/mcp-data/registry/text.json +1 -1
  201. package/dist/mcp-data/registry/textarea.json +1 -1
  202. package/dist/mcp-data/registry/time-picker.json +1 -1
  203. package/dist/mcp-data/registry/toast.json +1 -1
  204. package/dist/mcp-data/registry/tooltip-chart.json +1 -1
  205. package/dist/mcp-data/registry/tooltip.json +1 -1
  206. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  207. package/dist/react/ds-menu.d.ts +2 -1
  208. package/dist/react/ds-menu.js +1 -0
  209. package/dist/styles/table.css +41 -0
  210. package/dist/types/components/DataPreferences/DataPreferences.d.ts +3 -0
  211. package/dist/types/components/MapEntityMarker/MapEntityMarker.d.ts +1 -1
  212. package/dist/types/components/Menu/Menu.d.ts +5 -1
  213. package/dist/types/components/Menu/menu-types.d.ts +36 -0
  214. package/dist/types/components/Table/Table.d.ts +11 -2
  215. package/dist/types/components/Table/index.d.ts +1 -1
  216. package/dist/types/components/Table/table-column-customizer.d.ts +23 -4
  217. package/dist/types/components/Table/table-layout-controller.d.ts +2 -1
  218. package/dist/types/components/Table/table-types.d.ts +3 -1
  219. package/dist/types/components.d.ts +44 -8
  220. package/dist/vue/ds-data-preferences.js +1 -0
  221. package/dist/vue/ds-menu.js +2 -0
  222. package/dist/vue/ds-table.js +2 -0
  223. package/package.json +3 -3
  224. package/dist/components/p-Bq_ypMSy.js +0 -2
  225. package/dist/components/p-C1oczmAc.js +0 -2
  226. package/dist/components/p-C5BBIDVm.js +0 -2
  227. package/dist/components/p-CA3iQ1ME.js +0 -2
  228. package/dist/components/p-CE6MaXBg.js +0 -2
  229. package/dist/components/p-CE6MaXBg.js.map +0 -1
  230. package/dist/components/p-D9_iDlkT.js +0 -2
  231. package/dist/components/p-DEYCF-oJ.js +0 -2
  232. package/dist/components/p-DPFg5d4_.js +0 -2
  233. package/dist/components/p-DvGrsLgt.js +0 -2
  234. package/dist/components/p-DvGrsLgt.js.map +0 -1
  235. package/dist/components/p-PzYJqN8B.js +0 -2
  236. package/dist/components/p-aD5cw_m2.js +0 -2
  237. package/dist/components/p-aD5cw_m2.js.map +0 -1
  238. package/dist/components/p-jp7hwRtC.js +0 -2
  239. package/dist/components/p-kDZ0sEII.js +0 -2
  240. package/dist/components/p-t2Ebn8si.js +0 -2
  241. package/dist/components/p-t2Ebn8si.js.map +0 -1
  242. /package/dist/components/{p-BO5URdZF.js.map → p-B-pkoIX9.js.map} +0 -0
  243. /package/dist/components/{p--STJbKuN.js.map → p-B3o9zn3Y.js.map} +0 -0
  244. /package/dist/components/{p-rmPIcWED.js.map → p-BZY40-pE.js.map} +0 -0
  245. /package/dist/components/{p-PtxCwf5S.js.map → p-C6kUn-vb.js.map} +0 -0
  246. /package/dist/components/{p-BcpIK9S6.js.map → p-CSxwWcwW.js.map} +0 -0
  247. /package/dist/components/{p-wRhYxngW.js.map → p-CaFXrn_8.js.map} +0 -0
  248. /package/dist/components/{p-BYeG0b5N.js.map → p-DObhRLBa.js.map} +0 -0
  249. /package/dist/components/{p-C_9VGgPf.js.map → p-DP07JCed.js.map} +0 -0
  250. /package/dist/components/{p-BGSG6xIS.js.map → p-DYtVsnDS.js.map} +0 -0
  251. /package/dist/components/{p-B6TX55c5.js.map → p-DdFeWC-e.js.map} +0 -0
  252. /package/dist/components/{p-kDZ0sEII.js.map → p-DlCLfwP4.js.map} +0 -0
  253. /package/dist/components/{p-BYrBU_U9.js.map → p-HMDczkQf.js.map} +0 -0
  254. /package/dist/components/{p-DR_8IPn9.js.map → p-KA8srEed.js.map} +0 -0
  255. /package/dist/components/{p-CXGjCWSh.js.map → p-OJ5WeR05.js.map} +0 -0
  256. /package/dist/components/{p-DjbT9kKm.js.map → p-wXKIVUTn.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":["filterMenuCss","filterMenuId","ICON_SIZE","lg","md","sm","xs","DATE_MODE_TABS","id","label","RELATIVE_DATE_OPTIONS","DATE_FILTER_RELATIVE_PRESETS","map","preset","value","dateFilterRelativeValue","FilterMenu","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","embedded","vertical","open","triggerLabel","showSelectedCount","icon","size","width","showIndicator","hasBorder","neutralTrigger","applyRequired","activeFill","collapseLabel","ariaLabel","filters","values","matchModes","side","align","sideOffset","TOKEN_CSS_LENGTHS","space050","alignOffset","menuWidth","menuWidthLg","menuLabel","categoriesLabel","clearLabel","searchPlaceholder","noResultsText","footerLayout","initialFocusVisible","shouldRender","closing","positionReady","pos","x","y","focusRingVisible","activeOptionIndex","captionCompact","dateModeByFilter","optionQueryByFilter","generatedId","triggerElement","pendingInitialFocusVisible","closeTimer","hasLoaded","tasks","ConnectionTasks","el","isConnected","closingSnapshot","position","AnchoredPositionController","getAnchor","resolvedAnchor","getPopup","querySelector","getOwnerDocument","ownerDocument","measure","anchor","popup","anchorRect","getBoundingClientRect","sectionInsetPx","resolveCssLengthPx","TOKEN_DEFAULTS","popupWidth","offsetWidth","popupFallbackWidth","popupHeight","offsetHeight","popupFallbackHeight","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","viewportPadPx","viewportPad","viewportWidth","window","innerWidth","viewportHeight","innerHeight","collisionRect","resolveAnchoredOverlayBoundaryRect","boundary","apply","onReady","liveUpdate","observeResize","topLayer","interaction","AnchoredOverlayInteractionController","onOutsideActivation","close","changeValue","detail","draftValues","filterId","dsChange","emit","changeMode","draftModes","mode","dsMatchModeChange","hasPendingChanges","normalize","Array","isArray","length","sort","undefined","modes","some","filter","JSON","stringify","applyDraft","Object","keys","dsClear","Set","componentDidLoad","syncCaptionCompactObserver","onOpenChange","connectedCallback","disconnectedCallback","disconnectCaptionCompactObserver","unobserve","teardownListeners","onCollapseLabelChange","isOpen","setupListeners","schedule","focusInitialCategory","cancel","captureClosingSnapshot","duration","resolveMotionTimeMs","motionShort2","animationDurationShort3","finishClose","setTimeout","onPositionInputChange","handleKeyDown","event","key","preventDefault","tabLeavesPopup","moveFocusAfterTab","shiftKey","anchorId","document","getElementById","usesInternalTrigger","menuFallbackHeight","connect","observe","disconnect","clearTimeout","restoreFocus","focusAnchor","dsOpenChange","dsClose","toggleFromTrigger","handleTriggerKeyDown","matches","hidePopover","dsAfterClose","options","option","fromEntries","entries","activeFilterId","frame","focus","selectedFilter","find","selectedCount","kind","totalSelected","reduce","total","activeFilterCount","selectCategory","dsActiveFilterChange","handleCategoryKeyDown","currentIndex","findIndex","nextIndex","handlePanelKeyDown","handleOptionKeyDown","index","visibleOptions","selectOption","includes","enabled","candidate","optionIndex","isInactive","current","indexOf","next","direction","start","optionMatchesQuery","query","normalized","trim","toLocaleLowerCase","description","booleanOption","fieldLabel","setOptionQuery","firstEnabled","content","scrollTop","handleOptionSearchKeyDown","toggleMultiple","checked","selected","add","delete","ordered","has","dateMode","parseDateFilterValue","setDateMode","renderRelativeDateOptions","relativeFilter","h","class","role","ChoiceOptionRow","active","usesSubtext","tabIndex","onFocus","onKeyDown","onHover","onSelect","renderDateCalendar","selectionMode","onDsChange","stopPropagation","renderDateFilter","hasContainer","tabs","renderOptionSearch","ChoiceSearch","hasFocusBoundary","hasInteractionFill","placeholder","controls","inputRef","onValueChange","renderNoOptionResults","body","renderOptions","allOptions","choiceListUsesSubtext","subtext","isSelected","leading","presentation","Boolean","captionIconOnly","captionCompactDisconnect","observeTableCaptionCompact","compact","renderCaptionTooltip","trigger","renderFooter","categoriesClear","appliedCount","as","variant","color","type","disabled","onClick","renderMatchModeFooter","nextMode","render","Host","name","emphasis","state","activeFilter","hasActiveFilters","categoriesClearFooter","textVariant","CONTROL_TEXT_VARIANT","iconSize","popupId","popupStyle","left","top","transform","Math","round","zIndex","visibility","controlWidthClass","ref","element","inputId","String","lineTruncation","popover","style","count","divider","onMouseDown","hasRing","intent","contrast","isInset","rounded"],"sources":["src/wc/components/FilterMenu/FilterMenu.css?tag=ds-filter-menu&encapsulation=scoped","src/wc/components/FilterMenu/FilterMenu.tsx"],"sourcesContent":["@import '../../utils/radius.css';\n@import '../../utils/choice-list.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/select-trigger.css';\n@import '../../utils/search-control.css';\n@import '../../utils/table-caption-control.css';\n\n:host(.filter-menu-host--external-trigger) {\n display: contents;\n}\n\n.filter-menu {\n display: flex;\n min-height: 0;\n flex-direction: column;\n color: var(--color-foreground-secondary);\n}\n\n.filter-menu__body {\n display: grid;\n grid-template-columns: var(--dimension-menu-width-xs) var(--dimension-menu-width-sm);\n min-height: calc(var(--dimension-size-800) * 4 + var(--dimension-space-150));\n max-height: calc(100vh - var(--dimension-size-800) - var(--dimension-size-600));\n}\n\n.filter-menu__category-pane {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n border-inline-end: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.filter-menu__categories {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.filter-menu__category-section {\n display: flex;\n min-width: 0;\n flex-direction: column;\n}\n\n.filter-menu__category-section.ds-choice-section--divided {\n padding-block-end: var(--dimension-space-050);\n}\n\n.filter-menu__category {\n justify-content: space-between;\n width: 100%;\n border: 0;\n background: transparent;\n color: var(--color-foreground-secondary);\n cursor: default;\n text-align: start;\n}\n\n.filter-menu__category--active {\n color: var(--color-foreground-primary);\n}\n\n.filter-menu__category-dot-box {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n pointer-events: none;\n}\n\n.filter-menu__options {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-menu__options-content {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1 1 auto;\n flex-direction: column;\n overflow: auto;\n}\n\n.filter-menu__option-search {\n position: relative;\n flex: 0 0 var(--dimension-size-500);\n min-width: 0;\n min-height: var(--dimension-size-500);\n background: transparent;\n}\n\n.filter-menu__option-search::after {\n content: '';\n position: absolute;\n inset: auto 0 0;\n height: var(--dimension-stroke-width-012);\n background-color: var(--color-border-tertiary);\n pointer-events: none;\n}\n\n.filter-menu__option-search .select-search {\n height: 100%;\n background: transparent;\n}\n\n.filter-menu__options--date,\n.filter-menu__option-list--date,\n.filter-menu__date {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n}\n\n.filter-menu__option-list--date,\n.filter-menu__date {\n flex: 1 1 auto;\n}\n\n.filter-menu__date-header {\n flex: 0 0 var(--dimension-size-500);\n justify-content: center;\n min-block-size: var(--dimension-size-500);\n padding: var(--dimension-space-050);\n background: var(--color-background-secondary);\n}\n\n.filter-menu__date-body {\n display: flex;\n flex: 1 1 auto;\n min-height: 0;\n flex-direction: column;\n}\n\n.filter-menu__date-relative {\n flex: 1 1 auto;\n}\n\n.filter-menu__date-body > ds-calendar {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n\n.filter-menu__footer {\n flex: 0 0 auto;\n}\n\n.filter-menu__footer--categories-clear .ds-choice-footer__content {\n justify-content: flex-start;\n}\n\n.filter-menu__footer--categories-clear[aria-hidden='true']::before {\n visibility: hidden;\n}\n\n.ds-choice-footer__content:has(.filter-menu__apply) {\n column-gap: var(--dimension-space-100);\n}\n\n.filter-menu__apply ds-text {\n padding-right: 0;\n}\n\n.filter-menu__action-separator + .filter-menu__clear ds-text {\n padding-left: 0;\n}\n\n.filter-menu__apply {\n color: var(--color-foreground-bold-brand);\n}\n\n.filter-menu__apply:disabled {\n color: var(--color-foreground-tertiary);\n text-decoration-line: none;\n}\n\n.filter-menu__clear {\n --ds-text-action-foreground: var(--color-foreground-bold-negative);\n\n color: var(--ds-text-action-foreground);\n}\n\n.filter-menu__match-mode-footer {\n flex: 0 0 auto;\n}\n\n.filter-menu__match-mode-content {\n justify-content: flex-start;\n padding-inline: calc(\n var(--dimension-space-050) + var(--ds-control-padding-inline, var(--dimension-space-075)) +\n var(--ds-control-label-inset, var(--dimension-space-025))\n );\n}\n\n.filter-menu__match-mode-toggle {\n appearance: none;\n display: inline-flex;\n align-items: center;\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n cursor: default;\n}\n\n@media (forced-colors: active) {\n .filter-menu__category-pane {\n border-inline-end-color: var(--ds-forced-color-content);\n }\n}\n\n.data-preferences-embedded {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n color: var(--color-foreground-secondary);\n}\n\n.data-preferences-embedded .filter-menu__body {\n grid-template-columns: min(var(--dimension-menu-width-xs), 40%) minmax(0, 1fr);\n}\n\n.filter-menu-vertical__section {\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n.filter-menu-vertical__section > summary {\n cursor: default;\n padding: var(--dimension-space-200);\n}\n.filter-menu-vertical__section > summary ds-text {\n display: inline;\n}\n\n.filter-menu-vertical__section > summary {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n list-style: none;\n}\n.filter-menu-vertical__section > summary::-webkit-details-marker {\n display: none;\n}\n.filter-menu-vertical__section:not([open]) .filter-menu-vertical__chevron {\n transform: rotate(-90deg);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n type VNode,\n Watch,\n} from '@stencil/core';\nimport {\n CONTROL_TEXT_VARIANT,\n DATE_FILTER_RELATIVE_PRESETS,\n controlWidthClass,\n dateFilterRelativeValue,\n parseDateFilterValue,\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n TOKEN_CSS_LENGTHS,\n TOKEN_DEFAULTS,\n type ControlWidth,\n} from '../../utils';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\nimport type { AnchoredAlign, AnchoredSide } from '../../utils/anchored-position';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { ConnectionTasks } from '../../utils/connection-tasks';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\nimport { ChoiceOptionRow, ChoiceSearch } from '../../utils/choice-list-parts';\nimport { choiceListUsesSubtext } from '../../utils/choice-list';\n\nexport type FilterMenuFilterKind = 'single' | 'multiple' | 'boolean' | 'date';\nexport type FilterMenuSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type FilterMenuWidth = ControlWidth;\nexport type FilterMenuFooterLayout = 'summary' | 'categories-clear';\nexport type FilterMenuMatchMode = 'any' | 'all';\ntype FilterMenuDateMode = 'range' | 'relative';\n\nexport interface FilterMenuOption {\n label: string;\n value: string;\n description?: string;\n isInactive?: boolean;\n}\n\nexport interface FilterMenuFilter {\n id: string;\n label: string;\n kind: FilterMenuFilterKind;\n options?: FilterMenuOption[];\n description?: string;\n fieldLabel?: string;\n /** Draw a standard menu-section divider after this category. */\n divider?: boolean;\n}\n\nexport type FilterMenuValue = string[] | boolean | string;\nexport type FilterMenuValues = Record<string, FilterMenuValue | undefined>;\nexport type FilterMenuMatchModes = Record<string, FilterMenuMatchMode | undefined>;\n\nexport interface FilterMenuChangeDetail {\n filterId: string;\n value: FilterMenuValue;\n}\n\nexport interface FilterMenuMatchModeChangeDetail {\n filterId: string;\n mode: FilterMenuMatchMode;\n}\n\nlet filterMenuId = 0;\n\nconst ICON_SIZE: Record<FilterMenuSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\nconst DATE_MODE_TABS = [\n { id: 'relative', label: 'Relative' },\n { id: 'range', label: 'Range' },\n];\n\nconst RELATIVE_DATE_OPTIONS: FilterMenuOption[] = DATE_FILTER_RELATIVE_PRESETS.map(preset => ({\n label: preset.label,\n value: dateFilterRelativeValue(preset.value),\n}));\n\n@Component({\n tag: 'ds-filter-menu',\n styleUrl: 'FilterMenu.css',\n scoped: true,\n})\nexport class FilterMenu {\n @Element() el!: HTMLElement;\n\n /** Controlled popup visibility. */\n /** Render content inside a parent-owned surface; the parent owns dismissal and positioning. */\n @Prop() embedded: boolean = false;\n /** Stacked, collapsible sections for a configuration panel. */\n @Prop() vertical: boolean = false;\n @Prop({ mutable: true }) open: boolean = false;\n /** Select trigger text. */\n @Prop() triggerLabel: string = 'Filters';\n /** Append the active-filter count to the visible trigger label. */\n @Prop() showSelectedCount: boolean = true;\n /** Optional select trigger prefix icon name. */\n @Prop() icon: string | undefined = 'Filters';\n /** Select trigger density. */\n @Prop() size: FilterMenuSize = 'md';\n /** Select trigger width fit. */\n @Prop() width: FilterMenuWidth = 'hug';\n /** Show the surface-aware inset border around the select trigger. */\n /** Show the trigger chevron. */\n @Prop() showIndicator: boolean = true;\n @Prop() hasBorder: boolean = true;\n /** Show selected interaction fill when one or more criteria are active. */\n /** Keep trigger colors neutral when a value is selected. */\n @Prop() neutralTrigger: boolean = false;\n /** Stage filter edits until Apply is pressed. */\n @Prop() applyRequired: boolean = false;\n @State() private draftValues?: FilterMenuValues;\n @State() private draftModes?: FilterMenuMatchModes;\n\n private changeValue(detail: FilterMenuChangeDetail): void {\n if (this.applyRequired)\n this.draftValues = { ...(this.draftValues ?? this.values), [detail.filterId]: detail.value };\n else this.dsChange.emit(detail);\n }\n private changeMode(detail: FilterMenuMatchModeChangeDetail): void {\n if (this.applyRequired)\n this.draftModes = { ...(this.draftModes ?? this.matchModes), [detail.filterId]: detail.mode };\n else this.dsMatchModeChange.emit(detail);\n }\n private get hasPendingChanges(): boolean {\n const normalize = (value: FilterMenuValue | undefined) =>\n Array.isArray(value) ? (value.length ? [...value].sort() : undefined) : value || undefined;\n const values = this.draftValues ?? this.values;\n const modes = this.draftModes ?? this.matchModes;\n return this.filters.some(\n filter =>\n JSON.stringify(normalize(values[filter.id])) !==\n JSON.stringify(normalize(this.values[filter.id])) ||\n (modes[filter.id] ?? 'any') !== (this.matchModes[filter.id] ?? 'any')\n );\n }\n private applyDraft(): void {\n if (!this.hasPendingChanges) return;\n if (this.draftValues && Object.keys(this.draftValues).length === 0) {\n this.dsClear.emit();\n } else if (this.draftValues) {\n for (const id of new Set([...Object.keys(this.values), ...Object.keys(this.draftValues)])) {\n if (JSON.stringify(this.values[id]) !== JSON.stringify(this.draftValues[id]))\n this.dsChange.emit({\n filterId: id,\n value:\n this.draftValues[id] ??\n (Array.isArray(this.values[id])\n ? []\n : typeof this.values[id] === 'boolean'\n ? false\n : ''),\n });\n }\n }\n if (this.draftModes) {\n for (const filterId of new Set([\n ...Object.keys(this.matchModes),\n ...Object.keys(this.draftModes),\n ])) {\n const mode = this.draftModes[filterId] ?? 'any';\n if ((this.matchModes[filterId] ?? 'any') !== mode)\n this.dsMatchModeChange.emit({ filterId, mode });\n }\n }\n }\n @Prop() activeFill: boolean = false;\n /**\n * Opt into table-caption icon-only chrome below 900px. The trigger omits its\n * visible label and chevron; keep an accessible name via aria-label.\n */\n @Prop({ reflect: true }) collapseLabel: boolean = false;\n /** ID applied to the internal select trigger. */\n @Prop() inputId: string | undefined;\n /** Direct accessible name for the internal select trigger. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Product-owned filter categories and option definitions. */\n @Prop() filters: FilterMenuFilter[] = [];\n /** Controlled values keyed by filter id. */\n @Prop() values: FilterMenuValues = {};\n /** Controlled any/all match mode keyed by multiple-choice filter id. Defaults to any. */\n @Prop() matchModes: FilterMenuMatchModes = {};\n /** Controlled category shown in the option pane. */\n @Prop() activeFilterId: string | undefined;\n /** External trigger element to position against. */\n @Prop() anchor: HTMLElement | undefined;\n /** ID of the external trigger element used for positioning and focus return. */\n @Prop() anchorId: string | undefined;\n /** Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used. */\n @Prop() boundary: HTMLElement | undefined;\n /** Preferred popup side; collision handling may flip it. */\n @Prop() side: AnchoredSide = 'bottom';\n /** Cross-axis alignment against the trigger. */\n @Prop() align: AnchoredAlign = 'end';\n /** Gap between trigger and popup — number in px or a TokoMo length. */\n @Prop() sideOffset: number | string = TOKEN_CSS_LENGTHS.space050;\n /** Cross-axis offset — number in px or a TokoMo length. */\n @Prop() alignOffset: number | string = 0;\n /** Popup width. It remains clamped to its collision boundary by the component recipe. */\n @Prop() menuWidth: string = TOKEN_CSS_LENGTHS.menuWidthLg;\n /** Accessible name for the non-modal filter dialog. */\n @Prop() menuLabel: string = 'Filters';\n /** Accessible name for the category tab list. */\n @Prop() categoriesLabel: string = 'Filter categories';\n /** Footer action and date-clear accessible label. */\n @Prop() clearLabel: string = 'Clear';\n /** Placeholder shown in each non-date option search header. */\n @Prop() searchPlaceholder: string = 'Search';\n /** Empty-state text shown when an option search has no matches. */\n @Prop() noResultsText: string = 'No results';\n /** Footer recipe: full-width selected summary or reserved category-pane Clear action. */\n @Prop() footerLayout: FilterMenuFooterLayout = 'summary';\n /** Show a visible focus ring on initial entry after keyboard activation. */\n @Prop() initialFocusVisible: boolean = false;\n\n @State() private shouldRender = false;\n @State() private closing = false;\n @State() private positionReady = false;\n @State() private pos: { x: number; y: number } = { x: 0, y: 0 };\n @State() private focusRingVisible = false;\n @State() private activeOptionIndex = 0;\n @State() private captionCompact = false;\n @State() private dateModeByFilter: Record<string, FilterMenuDateMode> = {};\n @State() private optionQueryByFilter: Record<string, string> = {};\n\n /** Requests a controlled value replacement without closing the popup. */\n @Event() dsChange!: EventEmitter<FilterMenuChangeDetail>;\n /** Requests that the consumer clear every filter value. */\n @Event() dsClear!: EventEmitter<void>;\n /** Requests a controlled any/all mode replacement for a multiple-choice filter. */\n @Event() dsMatchModeChange!: EventEmitter<FilterMenuMatchModeChangeDetail>;\n /** Requests a controlled active-category replacement. */\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n /** Requests that the controlled popup close. */\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted whenever internal select-trigger activation changes popup visibility. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n /** Emitted after exit motion and rendered popup removal complete. */\n @Event() dsAfterClose!: EventEmitter<void>;\n\n private readonly generatedId = `ds-filter-menu-${++filterMenuId}`;\n private triggerElement: HTMLButtonElement | null = null;\n private pendingInitialFocusVisible = false;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private captionCompactDisconnect: (() => void) | undefined;\n private hasLoaded = false;\n private readonly tasks = new ConnectionTasks(() => this.el.isConnected);\n private closingSnapshot: {\n filters: FilterMenuFilter[];\n values: FilterMenuValues;\n matchModes: FilterMenuMatchModes;\n activeFilterId: string | undefined;\n } | null = null;\n\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.resolvedAnchor,\n getPopup: () => this.el.querySelector<HTMLElement>('.filter-menu-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n if (!this.open) return null;\n const anchorRect = anchor.getBoundingClientRect();\n const sectionInsetPx = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n return {\n anchorRect,\n popupWidth: popup.offsetWidth || this.popupFallbackWidth,\n popupHeight: popup.offsetHeight || this.popupFallbackHeight,\n side: this.side,\n align: this.align,\n sideOffsetPx: resolveCssLengthPx(this.sideOffset, TOKEN_DEFAULTS.space050),\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: this.align,\n alignOffsetPx: resolveCssLengthPx(this.alignOffset, 0),\n sectionInsetPx,\n }),\n viewportPadPx: this.viewportPad,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect: resolveAnchoredOverlayBoundaryRect(anchor, this.boundary),\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.positionReady = true;\n },\n liveUpdate: 'double-frame',\n observeResize: true,\n topLayer: true,\n });\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.resolvedAnchor,\n getPopup: () => this.el.querySelector<HTMLElement>('.filter-menu-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.close(),\n });\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.syncCaptionCompactObserver();\n if (this.open) this.onOpenChange(true);\n }\n\n connectedCallback() {\n if (!this.hasLoaded) return;\n this.syncCaptionCompactObserver();\n if (this.open) this.onOpenChange(true);\n }\n\n disconnectedCallback() {\n this.disconnectCaptionCompactObserver();\n this.position.unobserve();\n this.teardownListeners();\n this.shouldRender = false;\n this.closing = false;\n this.positionReady = false;\n this.closingSnapshot = null;\n this.pendingInitialFocusVisible = false;\n if (!this.open) {\n this.dateModeByFilter = {};\n this.optionQueryByFilter = {};\n }\n }\n\n @Watch('collapseLabel')\n onCollapseLabelChange() {\n this.syncCaptionCompactObserver();\n }\n\n @Watch('open')\n onOpenChange(isOpen: boolean) {\n if (!isOpen) {\n this.draftValues = undefined;\n this.draftModes = undefined;\n }\n if (this.embedded || !this.hasLoaded || !this.el.isConnected) return;\n if (isOpen) {\n this.teardownListeners();\n this.closingSnapshot = null;\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.focusRingVisible = this.pendingInitialFocusVisible || this.initialFocusVisible;\n this.setupListeners();\n this.position.schedule(() => this.focusInitialCategory());\n return;\n }\n\n if (!this.shouldRender || this.closing) return;\n this.position.cancel();\n this.captureClosingSnapshot();\n this.closing = true;\n this.teardownListeners();\n const duration = resolveMotionTimeMs(\n TOKEN_DEFAULTS.motionShort2,\n TOKEN_DEFAULTS.animationDurationShort3\n );\n if (duration <= 0) {\n this.finishClose();\n return;\n }\n this.closeTimer = setTimeout(() => this.finishClose(), duration);\n }\n\n @Watch('anchor')\n @Watch('anchorId')\n @Watch('boundary')\n @Watch('side')\n @Watch('align')\n @Watch('sideOffset')\n @Watch('alignOffset')\n @Watch('menuWidth')\n onPositionInputChange() {\n if (this.open && this.el.isConnected) this.position.schedule();\n }\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (this.embedded && (event.key === 'Escape' || event.key === 'Tab')) return;\n if ((!this.shouldRender && !this.embedded) || this.closing) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (event.key !== 'Tab' || !this.tabLeavesPopup(event)) return;\n event.preventDefault();\n this.close(false);\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n\n private get resolvedAnchor(): HTMLElement | null {\n if (this.anchor) return this.anchor;\n if (this.anchorId) return document.getElementById(this.anchorId);\n return this.triggerElement;\n }\n\n private get usesInternalTrigger(): boolean {\n return !this.embedded && !this.anchor && !this.anchorId;\n }\n\n private get viewportPad(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n }\n\n private get popupFallbackWidth(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthLg, TOKEN_DEFAULTS.menuWidthLg);\n }\n\n private get popupFallbackHeight(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private setupListeners() {\n this.interaction.connect();\n this.position.observe();\n }\n\n private teardownListeners() {\n this.tasks.cancel();\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private close(restoreFocus = true) {\n this.captureClosingSnapshot();\n if (restoreFocus) this.interaction.focusAnchor();\n this.dsOpenChange.emit(false);\n this.dsClose.emit();\n this.open = false;\n this.onOpenChange(false);\n }\n\n private toggleFromTrigger(event: MouseEvent) {\n if (this.open) {\n this.close();\n return;\n }\n this.pendingInitialFocusVisible = event.detail === 0;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private handleTriggerKeyDown(event: KeyboardEvent) {\n if (event.key !== 'ArrowDown' || this.open) return;\n event.preventDefault();\n this.pendingInitialFocusVisible = true;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private finishClose() {\n if (this.open || !this.closing || !this.el.isConnected) return;\n const popup = this.el.querySelector<HTMLElement>('.filter-menu-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.closingSnapshot = null;\n this.closeTimer = null;\n this.dateModeByFilter = {};\n this.optionQueryByFilter = {};\n this.dsAfterClose.emit();\n }\n\n private captureClosingSnapshot() {\n if (this.closingSnapshot) return;\n this.closingSnapshot = {\n filters: this.filters.map(filter => ({\n ...filter,\n options: filter.options?.map(option => ({ ...option })),\n })),\n values: Object.fromEntries(\n Object.entries(this.values).map(([key, value]) => [\n key,\n Array.isArray(value) ? [...value] : value,\n ])\n ),\n matchModes: { ...this.matchModes },\n activeFilterId: this.activeFilterId,\n };\n }\n\n private focusInitialCategory() {\n this.tasks.frame(() => {\n this.el.querySelector<HTMLElement>('.filter-menu__category[tabindex=\"0\"]')?.focus();\n this.pendingInitialFocusVisible = false;\n });\n }\n\n private tabLeavesPopup(event: KeyboardEvent): boolean {\n return this.interaction.tabLeavesPopup(event);\n }\n\n private selectedFilter(filters: FilterMenuFilter[], activeFilterId: string | undefined) {\n return filters.find(filter => filter.id === activeFilterId) ?? filters[0];\n }\n\n private selectedCount(filter: FilterMenuFilter, values: FilterMenuValues): number {\n const value = values[filter.id];\n if (filter.kind === 'multiple') return Array.isArray(value) ? value.length : 0;\n if (filter.kind === 'boolean') return value === true ? 1 : 0;\n return typeof value === 'string' && value.length > 0 ? 1 : 0;\n }\n\n private totalSelected(filters: FilterMenuFilter[], values: FilterMenuValues): number {\n return filters.reduce((total, filter) => total + this.selectedCount(filter, values), 0);\n }\n\n private activeFilterCount(filters: FilterMenuFilter[], values: FilterMenuValues): number {\n return filters.filter(filter => this.selectedCount(filter, values) > 0).length;\n }\n\n private selectCategory(filterId: string, focus = false) {\n this.activeOptionIndex = 0;\n this.dsActiveFilterChange.emit(filterId);\n if (!focus) return;\n this.tasks.frame(() => {\n this.el.querySelector<HTMLElement>(`[data-filter-category=\"${filterId}\"]`)?.focus();\n });\n }\n\n private handleCategoryKeyDown(\n event: KeyboardEvent,\n filters: FilterMenuFilter[],\n filterId: string\n ) {\n const currentIndex = filters.findIndex(filter => filter.id === filterId);\n let nextIndex: number;\n if (event.key === 'ArrowDown') nextIndex = (currentIndex + 1) % filters.length;\n else if (event.key === 'ArrowUp')\n nextIndex = (currentIndex - 1 + filters.length) % filters.length;\n else if (event.key === 'Home') nextIndex = 0;\n else if (event.key === 'End') nextIndex = filters.length - 1;\n else if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.tasks.frame(() => {\n this.el\n .querySelector<HTMLElement>(\n '.filter-menu__options [role=\"option\"], .filter-menu__options [data-date-option], .filter-menu__options input'\n )\n ?.focus();\n });\n return;\n } else return;\n\n event.preventDefault();\n this.focusRingVisible = true;\n this.selectCategory(filters[nextIndex].id, true);\n }\n\n private handlePanelKeyDown(event: KeyboardEvent, filterId: string) {\n if (event.key !== 'ArrowLeft') return;\n event.preventDefault();\n this.el.querySelector<HTMLElement>(`[data-filter-category=\"${filterId}\"]`)?.focus();\n }\n\n private handleOptionKeyDown(\n event: KeyboardEvent,\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n index: number,\n values: FilterMenuValues,\n visibleOptions: FilterMenuOption[] = filter.options ?? []\n ) {\n if (event.key === 'ArrowLeft') {\n this.handlePanelKeyDown(event, filter.id);\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.selectOption(filter, option, values);\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const enabled = visibleOptions\n .map((candidate, optionIndex) => ({ candidate, optionIndex }))\n .filter(({ candidate }) => !candidate.isInactive)\n .map(({ optionIndex }) => optionIndex);\n if (!enabled.length) return;\n const current = enabled.indexOf(index);\n let next: number;\n if (event.key === 'Home') next = enabled[0];\n else if (event.key === 'End') next = enabled[enabled.length - 1];\n else {\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n const start = current >= 0 ? current : direction === 1 ? -1 : 0;\n next = enabled[(start + direction + enabled.length) % enabled.length];\n }\n this.activeOptionIndex = next;\n this.focusRingVisible = true;\n this.tasks.frame(() => {\n this.el\n .querySelector<HTMLElement>(`#${this.generatedId}-${filter.id}-option-${next}`)\n ?.focus();\n });\n }\n\n private optionMatchesQuery(option: FilterMenuOption, query: string): boolean {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return true;\n return `${option.label} ${option.description ?? ''}`.toLocaleLowerCase().includes(normalized);\n }\n\n private visibleOptions(\n filter: FilterMenuFilter,\n query = this.optionQueryByFilter[filter.id] ?? ''\n ) {\n if (filter.kind === 'boolean') {\n const option = this.booleanOption(filter);\n return this.optionMatchesQuery(option, query) ? [option] : [];\n }\n return (filter.options ?? []).filter(option => this.optionMatchesQuery(option, query));\n }\n\n private booleanOption(filter: FilterMenuFilter): FilterMenuOption {\n return {\n label: filter.fieldLabel ?? filter.label,\n value: 'true',\n description: filter.description,\n };\n }\n\n private setOptionQuery(filter: FilterMenuFilter, value: string) {\n const visibleOptions = this.visibleOptions(filter, value);\n const firstEnabled = visibleOptions.findIndex(option => !option.isInactive);\n this.activeOptionIndex = firstEnabled;\n this.focusRingVisible = false;\n this.optionQueryByFilter = { ...this.optionQueryByFilter, [filter.id]: value };\n this.tasks.frame(() => {\n const content = this.el.querySelector<HTMLElement>('.filter-menu__options-content');\n if (content) content.scrollTop = 0;\n this.position.schedule();\n });\n }\n\n private handleOptionSearchKeyDown(event: KeyboardEvent, filter: FilterMenuFilter) {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n const visibleOptions = this.visibleOptions(filter);\n const enabled = visibleOptions\n .map((option, index) => ({ option, index }))\n .filter(({ option }) => !option.isInactive)\n .map(({ index }) => index);\n if (!enabled.length) return;\n event.preventDefault();\n const next = event.key === 'ArrowDown' ? enabled[0] : enabled[enabled.length - 1];\n this.activeOptionIndex = next;\n this.focusRingVisible = true;\n this.tasks.frame(() => {\n this.el\n .querySelector<HTMLElement>(`#${this.generatedId}-${filter.id}-option-${next}`)\n ?.focus();\n });\n }\n\n private toggleMultiple(\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n checked: boolean,\n values: FilterMenuValues\n ) {\n if (option.isInactive) return;\n const current = Array.isArray(values[filter.id]) ? (values[filter.id] as string[]) : [];\n const selected = new Set(current);\n if (checked) selected.add(option.value);\n else selected.delete(option.value);\n const ordered = (filter.options ?? [])\n .map(candidate => candidate.value)\n .filter(value => selected.has(value));\n this.changeValue({ filterId: filter.id, value: ordered });\n }\n\n private selectOption(\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n values: FilterMenuValues\n ) {\n if (option.isInactive) return;\n if (filter.kind === 'single') {\n this.changeValue({ filterId: filter.id, value: option.value });\n return;\n }\n const selected = Array.isArray(values[filter.id])\n ? (values[filter.id] as string[]).includes(option.value)\n : false;\n this.toggleMultiple(filter, option, !selected, values);\n }\n\n private dateMode(filterId: string, value: FilterMenuValue | undefined): FilterMenuDateMode {\n return this.dateModeByFilter[filterId] ?? parseDateFilterValue(value)?.kind ?? 'relative';\n }\n\n private setDateMode(filter: FilterMenuFilter, mode: string) {\n if (mode !== 'range' && mode !== 'relative') return;\n this.dateModeByFilter = { ...this.dateModeByFilter, [filter.id]: mode };\n this.activeOptionIndex = 0;\n }\n\n private renderRelativeDateOptions(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n const relativeFilter: FilterMenuFilter = {\n ...filter,\n kind: 'single',\n options: RELATIVE_DATE_OPTIONS,\n };\n return (\n <div\n class=\"filter-menu__date-relative ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"listbox\"\n aria-label=\"Relative date\"\n >\n {RELATIVE_DATE_OPTIONS.map((option, index) => (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-relative-${index}`}\n option={option}\n selected={value === option.value}\n active={index === this.activeOptionIndex}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={false}\n tabIndex={index === this.activeOptionIndex ? 0 : -1}\n onFocus={() => {\n this.activeOptionIndex = index;\n }}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleOptionKeyDown(event, relativeFilter, option, index, {\n [filter.id]: value,\n })\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeOptionIndex = index;\n }}\n onSelect={() => this.changeValue({ filterId: filter.id, value: option.value })}\n />\n ))}\n </div>\n );\n }\n\n private renderDateCalendar(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n return (\n <ds-calendar\n selectionMode=\"range\"\n value={typeof value === 'string' ? value : ''}\n onDsChange={(event: CustomEvent<string>) => {\n event.stopPropagation();\n this.changeValue({ filterId: filter.id, value: event.detail });\n }}\n />\n );\n }\n\n private renderDateFilter(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n const mode = this.dateMode(filter.id, value);\n return (\n <div class=\"filter-menu__date\">\n <header class=\"filter-menu__date-header ds-chrome-header ds-chrome-header--bounded\">\n <ds-tab-group\n ariaLabel=\"Date filter mode\"\n size=\"md\"\n width=\"fill\"\n hasContainer={false}\n value={mode}\n tabs={DATE_MODE_TABS}\n onDsChange={(event: CustomEvent<string>) => {\n event.stopPropagation();\n this.setDateMode(filter, event.detail);\n }}\n />\n </header>\n <div class=\"filter-menu__date-body\">\n {mode === 'relative'\n ? this.renderRelativeDateOptions(filter, value)\n : this.renderDateCalendar(filter, value)}\n </div>\n </div>\n );\n }\n\n private renderOptionSearch(filter: FilterMenuFilter) {\n return (\n <div class=\"filter-menu__option-search\">\n <ChoiceSearch\n size=\"md\"\n hasFocusBoundary={false}\n hasInteractionFill={false}\n value={this.optionQueryByFilter[filter.id] ?? ''}\n placeholder={this.searchPlaceholder}\n ariaLabel={`Search ${filter.label} options`}\n controls={`${this.generatedId}-${filter.id}-options`}\n inputRef={() => undefined}\n clearLabel={`Clear ${filter.label} search`}\n onValueChange={value => this.setOptionQuery(filter, value)}\n onKeyDown={(event: KeyboardEvent) => this.handleOptionSearchKeyDown(event, filter)}\n />\n </div>\n );\n }\n\n private renderNoOptionResults() {\n return (\n <div\n class=\"ds-choice-empty ds-empty-region\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.noResultsText}\n aria-live=\"polite\"\n >\n <ds-empty-state body={this.noResultsText} />\n </div>\n );\n }\n\n private renderOptions(filter: FilterMenuFilter, values: FilterMenuValues) {\n const value = values[filter.id];\n if (filter.kind === 'multiple' || filter.kind === 'single') {\n const selected = Array.isArray(value) ? value : [];\n const allOptions = filter.options ?? [];\n const options = this.visibleOptions(filter);\n const usesSubtext = choiceListUsesSubtext(\n allOptions.map(option => ({\n label: option.label,\n value: option.value,\n subtext: option.description,\n }))\n );\n if (!options.length) return this.renderNoOptionResults();\n return options.map((option, index) => {\n const isSelected =\n filter.kind === 'multiple' ? selected.includes(option.value) : value === option.value;\n return (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-option-${index}`}\n option={{\n label: option.label,\n value: option.value,\n subtext: option.description,\n isInactive: option.isInactive,\n }}\n selected={isSelected}\n active={index === this.activeOptionIndex}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={usesSubtext}\n tabIndex={index === this.activeOptionIndex ? 0 : -1}\n leading={\n filter.kind === 'multiple' ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox label=\"\" size=\"md\" checked={isSelected} presentation />\n </span>\n ) : undefined\n }\n onFocus={() => {\n this.activeOptionIndex = index;\n }}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleOptionKeyDown(event, filter, option, index, values, options)\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeOptionIndex = index;\n }}\n onSelect={() => this.selectOption(filter, option, values)}\n />\n );\n });\n }\n\n if (filter.kind === 'boolean') {\n const [option] = this.visibleOptions(filter);\n if (!option) return this.renderNoOptionResults();\n return (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-option-0`}\n option={{\n label: option.label,\n value: option.value,\n subtext: option.description,\n }}\n selected={value === true}\n active\n focusRingVisible={this.focusRingVisible}\n usesSubtext={Boolean(option.description)}\n tabIndex={0}\n leading={\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox label=\"\" size=\"md\" checked={value === true} presentation />\n </span>\n }\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') this.handlePanelKeyDown(event, filter.id);\n else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.changeValue({ filterId: filter.id, value: value !== true });\n }\n }}\n onHover={() => {\n this.focusRingVisible = false;\n }}\n onSelect={() => this.changeValue({ filterId: filter.id, value: value !== true })}\n />\n );\n }\n\n return this.renderDateFilter(filter, value);\n }\n\n private get captionIconOnly(): boolean {\n return (\n this.collapseLabel && this.captionCompact && this.usesInternalTrigger && Boolean(this.icon)\n );\n }\n\n private syncCaptionCompactObserver(): void {\n this.disconnectCaptionCompactObserver();\n if (!this.el.isConnected) return;\n if (!this.collapseLabel) {\n if (this.captionCompact) this.captionCompact = false;\n return;\n }\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n if (this.captionCompact !== compact) this.captionCompact = compact;\n });\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n private renderCaptionTooltip(trigger: VNode, label: string): VNode {\n if (!this.collapseLabel) return trigger;\n return (\n <ds-tooltip label={label} side=\"top\" size=\"sm\">\n {trigger}\n </ds-tooltip>\n );\n }\n\n private renderFooter(totalSelected: number, categoriesClear: boolean) {\n const appliedCount = this.totalSelected(this.filters, this.values);\n if (this.applyRequired && totalSelected === 0 && appliedCount === 0) return null;\n return (\n <div\n class={{\n 'filter-menu__footer': true,\n 'filter-menu__footer--categories-clear': categoriesClear,\n 'ds-choice-footer': true,\n }}\n aria-hidden={\n !this.applyRequired &&\n categoriesClear &&\n totalSelected === 0 &&\n !this.draftValues &&\n !this.draftModes\n ? 'true'\n : undefined\n }\n >\n <div class=\"ds-choice-footer__content ds-control--md\">\n {!categoriesClear ? (\n <ds-text\n class=\"ds-choice-footer__summary\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n aria-live=\"polite\"\n >\n {totalSelected} selected\n </ds-text>\n ) : null}\n {this.applyRequired ? (\n <button\n class=\"filter-menu__apply ds-choice-footer__clear ds-text-action\"\n type=\"button\"\n disabled={!this.hasPendingChanges}\n onClick={() => this.applyDraft()}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n Apply\n </ds-text>\n </button>\n ) : null}\n {this.applyRequired && (totalSelected > 0 || appliedCount > 0) ? (\n <ds-text\n class=\"filter-menu__action-separator\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"tertiary\"\n aria-hidden=\"true\"\n >\n ·\n </ds-text>\n ) : null}\n {totalSelected > 0 || (this.applyRequired && appliedCount > 0) ? (\n <button\n class=\"filter-menu__clear ds-choice-footer__clear ds-text-action\"\n type=\"button\"\n onClick={() => {\n if (this.applyRequired) {\n this.draftValues = {};\n this.draftModes = {};\n }\n this.dsClear.emit();\n }}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.clearLabel}\n </ds-text>\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n private renderMatchModeFooter(filter: FilterMenuFilter, matchModes: FilterMenuMatchModes) {\n const mode: FilterMenuMatchMode = matchModes[filter.id] === 'all' ? 'all' : 'any';\n const nextMode: FilterMenuMatchMode = mode === 'any' ? 'all' : 'any';\n return (\n <div class=\"filter-menu__match-mode-footer ds-choice-footer\">\n <div class=\"filter-menu__match-mode-content ds-choice-footer__content ds-control--md\">\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n Limit results to\n </ds-text>\n <button\n class=\"filter-menu__match-mode-toggle ds-text-action ds-focus-ring\"\n type=\"button\"\n aria-label={`Limit ${filter.label} results to ${nextMode} selected`}\n onClick={() => this.changeMode({ filterId: filter.id, mode: nextMode })}\n onKeyDown={(event: KeyboardEvent) => this.handlePanelKeyDown(event, filter.id)}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {mode}\n </ds-text>\n </button>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n selected\n </ds-text>\n </div>\n </div>\n );\n }\n\n render() {\n if (this.vertical)\n return (\n <Host class=\"filter-menu-vertical\">\n {this.filters.map(filter => (\n <details open key={filter.id} class=\"filter-menu-vertical__section\">\n <summary>\n <ds-icon class=\"filter-menu-vertical__chevron\" name=\"ChevronDown\" size=\"md\" />\n <ds-text variant=\"text-body-medium\" emphasis>\n {filter.label}\n </ds-text>\n </summary>\n {filter.kind !== 'date' && this.renderOptionSearch(filter)}\n <div\n id={`${this.generatedId}-${filter.id}-options`}\n role={filter.kind === 'date' ? undefined : 'listbox'}\n aria-label={filter.label}\n aria-multiselectable={filter.kind === 'multiple' ? 'true' : undefined}\n class=\"ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n >\n {this.renderOptions(filter, this.values)}\n </div>\n {filter.kind === 'multiple' && this.renderMatchModeFooter(filter, this.matchModes)}\n </details>\n ))}\n </Host>\n );\n const state =\n this.closing && this.closingSnapshot\n ? this.closingSnapshot\n : {\n filters: this.filters,\n values: this.draftValues ?? this.values,\n matchModes: this.draftModes ?? this.matchModes,\n activeFilterId: this.activeFilterId,\n };\n const activeFilter = this.selectedFilter(state.filters, state.activeFilterId);\n const totalSelected = this.totalSelected(state.filters, state.values);\n const activeFilterCount = this.activeFilterCount(state.filters, state.values);\n const hasActiveFilters = activeFilterCount > 0;\n const categoriesClearFooter = this.footerLayout === 'categories-clear';\n const label = `${this.triggerLabel}${\n this.showSelectedCount && hasActiveFilters ? ` · ${activeFilterCount}` : ''\n }`;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const popupId = `${this.generatedId}-popup`;\n const popupStyle: Record<string, string> = {\n position: 'fixed',\n left: '0',\n top: '0',\n width: this.menuWidth,\n transform: `translate(${Math.round(this.pos.x)}px, ${Math.round(this.pos.y)}px)`,\n zIndex: '9998',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n\n return (\n <Host\n class={{\n 'filter-menu-host': true,\n 'filter-menu-host--external-trigger': !this.usesInternalTrigger,\n 'ds-select-trigger-host': this.usesInternalTrigger,\n [`ds-control--${this.size}`]: true,\n 'ds-table-caption-control': this.collapseLabel,\n 'ds-table-caption-control--compact': this.captionIconOnly,\n ...controlWidthClass(this.width),\n }}\n >\n {this.usesInternalTrigger\n ? this.renderCaptionTooltip(\n <button\n ref={element => {\n this.triggerElement = (element as HTMLButtonElement) ?? null;\n }}\n id={this.inputId ?? `${this.generatedId}-trigger`}\n type=\"button\"\n class={{\n trigger: true,\n 'ds-control-frame': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': this.activeFill && hasActiveFilters,\n 'trigger--expanded': this.open || this.closing,\n 'ds-interaction-fill--surface-open': this.open || this.closing,\n 'trigger--bordered': this.hasBorder,\n 'trigger--has-value': hasActiveFilters && !this.neutralTrigger,\n [`ds-control--${this.size}`]: true,\n }}\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n aria-expanded={String(this.open)}\n aria-controls={this.open ? popupId : undefined}\n aria-label={this.ariaLabel ?? this.menuLabel}\n onClick={(event: MouseEvent) => this.toggleFromTrigger(event)}\n onKeyDown={(event: KeyboardEvent) => this.handleTriggerKeyDown(event)}\n >\n {this.icon ? (\n <span\n class=\"trigger__prefix ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n </span>\n ) : null}\n {this.captionIconOnly ? null : (\n <ds-text\n class=\"trigger__label-box trigger__label trigger__label-content ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant={textVariant}\n color=\"inherit\"\n lineTruncation={1}\n >\n {label}\n </ds-text>\n )}\n {this.captionIconOnly || !this.showIndicator ? null : (\n <span\n class=\"trigger__chevron ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name=\"ChevronDown\" size={iconSize} color=\"inherit\" />\n </span>\n )}\n </button>,\n this.captionIconOnly ? label : ''\n )\n : null}\n\n {this.shouldRender || this.embedded ? (\n <div\n id={popupId}\n popover={this.embedded ? undefined : 'manual'}\n class={{\n 'filter-menu-popup': true,\n 'ds-choice-popup': !this.embedded,\n 'data-preferences-embedded': this.embedded,\n 'ds-choice-popup--closing': this.closing,\n }}\n style={this.embedded ? undefined : popupStyle}\n role=\"dialog\"\n aria-label={this.menuLabel}\n >\n {activeFilter ? (\n <div class=\"filter-menu\">\n <div class=\"filter-menu__body\">\n <div class=\"filter-menu__category-pane\">\n <div\n class=\"filter-menu__categories ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"tablist\"\n aria-label={this.categoriesLabel}\n aria-orientation=\"vertical\"\n >\n {state.filters.map(filter => {\n const active = filter.id === activeFilter.id;\n const count = this.selectedCount(filter, state.values);\n return (\n <div\n key={filter.id}\n class={{\n 'filter-menu__category-section': true,\n 'ds-choice-section--divided': Boolean(filter.divider),\n }}\n >\n <button\n id={`${this.generatedId}-${filter.id}-tab`}\n type=\"button\"\n role=\"tab\"\n data-filter-category={filter.id}\n class={{\n 'filter-menu__category': true,\n 'filter-menu__category--active': active,\n 'ds-choice-item': true,\n 'ds-control-frame': true,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-focus-ring--visible': active && this.focusRingVisible,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': active,\n }}\n aria-selected={String(active)}\n aria-controls={`${this.generatedId}-panel`}\n tabIndex={active ? 0 : -1}\n onMouseDown={() => {\n this.focusRingVisible = false;\n }}\n onClick={() => this.selectCategory(filter.id)}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleCategoryKeyDown(event, state.filters, filter.id)\n }\n >\n <ds-text\n class=\"ds-choice-item__content ds-choice-item__label ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={active ? 'primary' : 'secondary'}\n >\n {filter.label}\n </ds-text>\n {count > 0 && filter.kind === 'date' ? (\n <span\n class=\"filter-menu__category-dot-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-badge variant=\"dot\" hasRing={false} label=\"\" />\n </span>\n ) : count > 0 ? (\n <ds-tag\n class=\"ds-choice-item__tag ds-interaction-fill__content\"\n label={String(count)}\n size=\"sm\"\n intent=\"brand\"\n contrast=\"bold\"\n isInset\n rounded\n />\n ) : null}\n </button>\n </div>\n );\n })}\n </div>\n {categoriesClearFooter ? this.renderFooter(totalSelected, true) : null}\n </div>\n\n <div\n id={`${this.generatedId}-panel`}\n class={{\n 'filter-menu__options': true,\n 'filter-menu__options--date': activeFilter.kind === 'date',\n }}\n role=\"tabpanel\"\n aria-labelledby={`${this.generatedId}-${activeFilter.id}-tab`}\n >\n {activeFilter.kind === 'date' ? null : this.renderOptionSearch(activeFilter)}\n <div class=\"filter-menu__options-content\">\n {activeFilter.kind === 'date' ? (\n <div key={activeFilter.id} class=\"filter-menu__option-list--date\">\n {this.renderOptions(activeFilter, state.values)}\n </div>\n ) : (\n <div\n id={`${this.generatedId}-${activeFilter.id}-options`}\n key={activeFilter.id}\n class=\"filter-menu__option-list ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"listbox\"\n aria-label={activeFilter.label}\n aria-multiselectable={\n activeFilter.kind === 'multiple' ? 'true' : undefined\n }\n >\n {this.renderOptions(activeFilter, state.values)}\n </div>\n )}\n </div>\n {activeFilter.kind === 'multiple'\n ? this.renderMatchModeFooter(activeFilter, state.matchModes)\n : null}\n </div>\n </div>\n\n {!categoriesClearFooter && totalSelected > 0\n ? this.renderFooter(totalSelected, false)\n : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </Host>\n );\n }\n}\n"],"mappings":"86BAAA,MAAMA,EAAgB,IAAM,qtwCC0E5B,IAAIC,EAAe,EAEnB,MAAMC,EAA+D,CACnEC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,MAGN,MAAMC,EAAiB,CACrB,CAAEC,GAAI,WAAYC,MAAO,YACzB,CAAED,GAAI,QAASC,MAAO,UAGxB,MAAMC,EAA4CC,EAA6BC,KAAIC,IAAM,CACvFJ,MAAOI,EAAOJ,MACdK,MAAOC,EAAwBF,EAAOC,W,MAQ3BE,EAAUC,EAAA,MAAAD,UAAAE,EALvB,WAAAC,CAAAC,G,uVAUUC,KAAAC,SAAoB,MAEpBD,KAAAE,SAAoB,MACHF,KAAAG,KAAgB,MAEjCH,KAAAI,aAAuB,UAEvBJ,KAAAK,kBAA6B,KAE7BL,KAAAM,KAA2B,UAE3BN,KAAAO,KAAuB,KAEvBP,KAAAQ,MAAyB,MAGzBR,KAAAS,cAAyB,KACzBT,KAAAU,UAAqB,KAGrBV,KAAAW,eAA0B,MAE1BX,KAAAY,cAAyB,MAwDzBZ,KAAAa,WAAsB,MAKLb,KAAAc,cAAyB,MAIfd,KAAAe,UAA2B,KAEtDf,KAAAgB,QAA8B,GAE9BhB,KAAAiB,OAA2B,GAE3BjB,KAAAkB,WAAmC,GAUnClB,KAAAmB,KAAqB,SAErBnB,KAAAoB,MAAuB,MAEvBpB,KAAAqB,WAA8BC,EAAkBC,SAEhDvB,KAAAwB,YAA+B,EAE/BxB,KAAAyB,UAAoBH,EAAkBI,YAEtC1B,KAAA2B,UAAoB,UAEpB3B,KAAA4B,gBAA0B,oBAE1B5B,KAAA6B,WAAqB,QAErB7B,KAAA8B,kBAA4B,SAE5B9B,KAAA+B,cAAwB,aAExB/B,KAAAgC,aAAuC,UAEvChC,KAAAiC,oBAA+B,MAEtBjC,KAAAkC,aAAe,MACflC,KAAAmC,QAAU,MACVnC,KAAAoC,cAAgB,MAChBpC,KAAAqC,IAAgC,CAAEC,EAAG,EAAGC,EAAG,GAC3CvC,KAAAwC,iBAAmB,MACnBxC,KAAAyC,kBAAoB,EACpBzC,KAAA0C,eAAiB,MACjB1C,KAAA2C,iBAAuD,GACvD3C,KAAA4C,oBAA8C,GAiB9C5C,KAAA6C,YAAc,oBAAoBjE,IAC3CoB,KAAA8C,eAA2C,KAC3C9C,KAAA+C,2BAA6B,MAC7B/C,KAAAgD,WAAmD,KAEnDhD,KAAAiD,UAAY,MACHjD,KAAAkD,MAAQ,IAAIC,GAAgB,IAAMnD,KAAKoD,GAAGC,cACnDrD,KAAAsD,gBAKG,KAEMtD,KAAAuD,SAAW,IAAIC,EAA2B,CACzDC,UAAW,IAAMzD,KAAK0D,eACtBC,SAAU,IAAM3D,KAAKoD,GAAGQ,cAA2B,sBACnDC,iBAAkB,IAAM7D,KAAKoD,GAAGU,cAChCC,QAAS,CAACC,EAAQC,KAChB,IAAKjE,KAAKG,KAAM,OAAO,KACvB,MAAM+D,EAAaF,EAAOG,wBAC1B,MAAMC,EAAiBC,EAAmBC,EAAe/C,SAAU+C,EAAe/C,UAClF,MAAO,CACL2C,aACAK,WAAYN,EAAMO,aAAexE,KAAKyE,mBACtCC,YAAaT,EAAMU,cAAgB3E,KAAK4E,oBACxCzD,KAAMnB,KAAKmB,KACXC,MAAOpB,KAAKoB,MACZyD,aAAcR,EAAmBrE,KAAKqB,WAAYiD,EAAe/C,UACjEuD,cAAeC,EAA8B,CAC3C3D,MAAOpB,KAAKoB,MACZ0D,cAAeT,EAAmBrE,KAAKwB,YAAa,GACpD4C,mBAEFY,cAAehF,KAAKiF,YACpBC,cAAeC,OAAOC,WACtBC,eAAgBF,OAAOG,YACvBC,cAAeC,EAAmCxB,EAAQhE,KAAKyF,UAChE,EAEHC,MAAO,EAAGpD,IAAGC,QACXvC,KAAKqC,IAAM,CAAEC,IAAGC,IAAG,EAErBoD,QAAS,KACP3F,KAAKoC,cAAgB,IAAI,EAE3BwD,WAAY,eACZC,cAAe,KACfC,SAAU,OAEK9F,KAAA+F,YAAc,IAAIC,EAAqC,CACtEvC,UAAW,IAAMzD,KAAK0D,eACtBC,SAAU,IAAM3D,KAAKoD,GAAGQ,cAA2B,sBACnDC,iBAAkB,IAAM7D,KAAKoD,GAAGU,cAChCmC,oBAAqB,IAAMjG,KAAKkG,SA2gCnC,CA/rCS,WAAAC,CAAYC,GAClB,GAAIpG,KAAKY,cACPZ,KAAKqG,YAAc,IAAMrG,KAAKqG,aAAerG,KAAKiB,OAAS,CAACmF,EAAOE,UAAWF,EAAO3G,YAClFO,KAAKuG,SAASC,KAAKJ,E,CAElB,UAAAK,CAAWL,GACjB,GAAIpG,KAAKY,cACPZ,KAAK0G,WAAa,IAAM1G,KAAK0G,YAAc1G,KAAKkB,WAAa,CAACkF,EAAOE,UAAWF,EAAOO,WACpF3G,KAAK4G,kBAAkBJ,KAAKJ,E,CAEnC,qBAAYS,GACV,MAAMC,EAAarH,GACjBsH,MAAMC,QAAQvH,GAAUA,EAAMwH,OAAS,IAAIxH,GAAOyH,OAASC,UAAa1H,GAAS0H,UACnF,MAAMlG,EAASjB,KAAKqG,aAAerG,KAAKiB,OACxC,MAAMmG,EAAQpH,KAAK0G,YAAc1G,KAAKkB,WACtC,OAAOlB,KAAKgB,QAAQqG,MAClBC,GACEC,KAAKC,UAAUV,EAAU7F,EAAOqG,EAAOnI,QACrCoI,KAAKC,UAAUV,EAAU9G,KAAKiB,OAAOqG,EAAOnI,QAC7CiI,EAAME,EAAOnI,KAAO,UAAYa,KAAKkB,WAAWoG,EAAOnI,KAAO,Q,CAG7D,UAAAsI,GACN,IAAKzH,KAAK6G,kBAAmB,OAC7B,GAAI7G,KAAKqG,aAAeqB,OAAOC,KAAK3H,KAAKqG,aAAaY,SAAW,EAAG,CAClEjH,KAAK4H,QAAQpB,M,MACR,GAAIxG,KAAKqG,YAAa,CAC3B,IAAK,MAAMlH,KAAM,IAAI0I,IAAI,IAAIH,OAAOC,KAAK3H,KAAKiB,WAAYyG,OAAOC,KAAK3H,KAAKqG,eAAgB,CACzF,GAAIkB,KAAKC,UAAUxH,KAAKiB,OAAO9B,MAASoI,KAAKC,UAAUxH,KAAKqG,YAAYlH,IACtEa,KAAKuG,SAASC,KAAK,CACjBF,SAAUnH,EACVM,MACEO,KAAKqG,YAAYlH,KAChB4H,MAAMC,QAAQhH,KAAKiB,OAAO9B,IACvB,UACOa,KAAKiB,OAAO9B,KAAQ,UACzB,MACA,K,EAIhB,GAAIa,KAAK0G,WAAY,CACnB,IAAK,MAAMJ,KAAY,IAAIuB,IAAI,IAC1BH,OAAOC,KAAK3H,KAAKkB,eACjBwG,OAAOC,KAAK3H,KAAK0G,cAClB,CACF,MAAMC,EAAO3G,KAAK0G,WAAWJ,IAAa,MAC1C,IAAKtG,KAAKkB,WAAWoF,IAAa,SAAWK,EAC3C3G,KAAK4G,kBAAkBJ,KAAK,CAAEF,WAAUK,Q,GAuIhD,gBAAAmB,GACE9H,KAAKiD,UAAY,KACjBjD,KAAK+H,6BACL,GAAI/H,KAAKG,KAAMH,KAAKgI,aAAa,K,CAGnC,iBAAAC,GACE,IAAKjI,KAAKiD,UAAW,OACrBjD,KAAK+H,6BACL,GAAI/H,KAAKG,KAAMH,KAAKgI,aAAa,K,CAGnC,oBAAAE,GACElI,KAAKmI,mCACLnI,KAAKuD,SAAS6E,YACdpI,KAAKqI,oBACLrI,KAAKkC,aAAe,MACpBlC,KAAKmC,QAAU,MACfnC,KAAKoC,cAAgB,MACrBpC,KAAKsD,gBAAkB,KACvBtD,KAAK+C,2BAA6B,MAClC,IAAK/C,KAAKG,KAAM,CACdH,KAAK2C,iBAAmB,GACxB3C,KAAK4C,oBAAsB,E,EAK/B,qBAAA0F,GACEtI,KAAK+H,4B,CAIP,YAAAC,CAAaO,GACX,IAAKA,EAAQ,CACXvI,KAAKqG,YAAcc,UACnBnH,KAAK0G,WAAaS,S,CAEpB,GAAInH,KAAKC,WAAaD,KAAKiD,YAAcjD,KAAKoD,GAAGC,YAAa,OAC9D,GAAIkF,EAAQ,CACVvI,KAAKqI,oBACLrI,KAAKsD,gBAAkB,KACvBtD,KAAKkC,aAAe,KACpBlC,KAAKmC,QAAU,MACfnC,KAAKoC,cAAgB,MACrBpC,KAAKwC,iBAAmBxC,KAAK+C,4BAA8B/C,KAAKiC,oBAChEjC,KAAKwI,iBACLxI,KAAKuD,SAASkF,UAAS,IAAMzI,KAAK0I,yBAClC,M,CAGF,IAAK1I,KAAKkC,cAAgBlC,KAAKmC,QAAS,OACxCnC,KAAKuD,SAASoF,SACd3I,KAAK4I,yBACL5I,KAAKmC,QAAU,KACfnC,KAAKqI,oBACL,MAAMQ,EAAWC,EACfxE,EAAeyE,aACfzE,EAAe0E,yBAEjB,GAAIH,GAAY,EAAG,CACjB7I,KAAKiJ,cACL,M,CAEFjJ,KAAKgD,WAAakG,YAAW,IAAMlJ,KAAKiJ,eAAeJ,E,CAWzD,qBAAAM,GACE,GAAInJ,KAAKG,MAAQH,KAAKoD,GAAGC,YAAarD,KAAKuD,SAASkF,U,CAItD,aAAAW,CAAcC,GACZ,GAAIrJ,KAAKC,WAAaoJ,EAAMC,MAAQ,UAAYD,EAAMC,MAAQ,OAAQ,OACtE,IAAMtJ,KAAKkC,eAAiBlC,KAAKC,UAAaD,KAAKmC,QAAS,OAC5D,GAAIkH,EAAMC,MAAQ,SAAU,CAC1BD,EAAME,iBACNvJ,KAAKkG,QACL,M,CAEF,GAAImD,EAAMC,MAAQ,QAAUtJ,KAAKwJ,eAAeH,GAAQ,OACxDA,EAAME,iBACNvJ,KAAKkG,MAAM,OACXlG,KAAK+F,YAAY0D,kBAAkBJ,EAAMK,S,CAG3C,kBAAYhG,GACV,GAAI1D,KAAKgE,OAAQ,OAAOhE,KAAKgE,OAC7B,GAAIhE,KAAK2J,SAAU,OAAOC,SAASC,eAAe7J,KAAK2J,UACvD,OAAO3J,KAAK8C,c,CAGd,uBAAYgH,GACV,OAAQ9J,KAAKC,WAAaD,KAAKgE,SAAWhE,KAAK2J,Q,CAGjD,eAAY1E,GACV,OAAOZ,EAAmBC,EAAe/C,SAAU+C,EAAe/C,S,CAGpE,sBAAYkD,GACV,OAAOJ,EAAmBC,EAAe5C,YAAa4C,EAAe5C,Y,CAGvE,uBAAYkD,GACV,OAAOP,EAAmBC,EAAeyF,mBAAoBzF,EAAeyF,mB,CAGtE,cAAAvB,GACNxI,KAAK+F,YAAYiE,UACjBhK,KAAKuD,SAAS0G,S,CAGR,iBAAA5B,GACNrI,KAAKkD,MAAMyF,SACX3I,KAAKuD,SAAS6E,YACdpI,KAAK+F,YAAYmE,aACjB,GAAIlK,KAAKgD,WAAY,CACnBmH,aAAanK,KAAKgD,YAClBhD,KAAKgD,WAAa,I,EAId,KAAAkD,CAAMkE,EAAe,MAC3BpK,KAAK4I,yBACL,GAAIwB,EAAcpK,KAAK+F,YAAYsE,cACnCrK,KAAKsK,aAAa9D,KAAK,OACvBxG,KAAKuK,QAAQ/D,OACbxG,KAAKG,KAAO,MACZH,KAAKgI,aAAa,M,CAGZ,iBAAAwC,CAAkBnB,GACxB,GAAIrJ,KAAKG,KAAM,CACbH,KAAKkG,QACL,M,CAEFlG,KAAK+C,2BAA6BsG,EAAMjD,SAAW,EACnDpG,KAAKG,KAAO,KACZH,KAAKsK,aAAa9D,KAAK,MACvBxG,KAAKgI,aAAa,K,CAGZ,oBAAAyC,CAAqBpB,GAC3B,GAAIA,EAAMC,MAAQ,aAAetJ,KAAKG,KAAM,OAC5CkJ,EAAME,iBACNvJ,KAAK+C,2BAA6B,KAClC/C,KAAKG,KAAO,KACZH,KAAKsK,aAAa9D,KAAK,MACvBxG,KAAKgI,aAAa,K,CAGZ,WAAAiB,GACN,GAAIjJ,KAAKG,OAASH,KAAKmC,UAAYnC,KAAKoD,GAAGC,YAAa,OACxD,MAAMY,EAAQjE,KAAKoD,GAAGQ,cAA2B,sBACjD,GAAIK,GAAOyG,QAAQ,iBAAkBzG,EAAM0G,cAC3C3K,KAAKkC,aAAe,MACpBlC,KAAKmC,QAAU,MACfnC,KAAKsD,gBAAkB,KACvBtD,KAAKgD,WAAa,KAClBhD,KAAK2C,iBAAmB,GACxB3C,KAAK4C,oBAAsB,GAC3B5C,KAAK4K,aAAapE,M,CAGZ,sBAAAoC,GACN,GAAI5I,KAAKsD,gBAAiB,OAC1BtD,KAAKsD,gBAAkB,CACrBtC,QAAShB,KAAKgB,QAAQzB,KAAI+H,IAAM,IAC3BA,EACHuD,QAASvD,EAAOuD,SAAStL,KAAIuL,IAAM,IAAUA,UAE/C7J,OAAQyG,OAAOqD,YACbrD,OAAOsD,QAAQhL,KAAKiB,QAAQ1B,KAAI,EAAE+J,EAAK7J,KAAW,CAChD6J,EACAvC,MAAMC,QAAQvH,GAAS,IAAIA,GAASA,MAGxCyB,WAAY,IAAKlB,KAAKkB,YACtB+J,eAAgBjL,KAAKiL,e,CAIjB,oBAAAvC,GACN1I,KAAKkD,MAAMgI,OAAM,KACflL,KAAKoD,GAAGQ,cAA2B,yCAAyCuH,QAC5EnL,KAAK+C,2BAA6B,KAAK,G,CAInC,cAAAyG,CAAeH,GACrB,OAAOrJ,KAAK+F,YAAYyD,eAAeH,E,CAGjC,cAAA+B,CAAepK,EAA6BiK,GAClD,OAAOjK,EAAQqK,MAAK/D,GAAUA,EAAOnI,KAAO8L,KAAmBjK,EAAQ,E,CAGjE,aAAAsK,CAAchE,EAA0BrG,GAC9C,MAAMxB,EAAQwB,EAAOqG,EAAOnI,IAC5B,GAAImI,EAAOiE,OAAS,WAAY,OAAOxE,MAAMC,QAAQvH,GAASA,EAAMwH,OAAS,EAC7E,GAAIK,EAAOiE,OAAS,UAAW,OAAO9L,IAAU,KAAO,EAAI,EAC3D,cAAcA,IAAU,UAAYA,EAAMwH,OAAS,EAAI,EAAI,C,CAGrD,aAAAuE,CAAcxK,EAA6BC,GACjD,OAAOD,EAAQyK,QAAO,CAACC,EAAOpE,IAAWoE,EAAQ1L,KAAKsL,cAAchE,EAAQrG,IAAS,E,CAG/E,iBAAA0K,CAAkB3K,EAA6BC,GACrD,OAAOD,EAAQsG,QAAOA,GAAUtH,KAAKsL,cAAchE,EAAQrG,GAAU,IAAGgG,M,CAGlE,cAAA2E,CAAetF,EAAkB6E,EAAQ,OAC/CnL,KAAKyC,kBAAoB,EACzBzC,KAAK6L,qBAAqBrF,KAAKF,GAC/B,IAAK6E,EAAO,OACZnL,KAAKkD,MAAMgI,OAAM,KACflL,KAAKoD,GAAGQ,cAA2B,0BAA0B0C,QAAe6E,OAAO,G,CAI/E,qBAAAW,CACNzC,EACArI,EACAsF,GAEA,MAAMyF,EAAe/K,EAAQgL,WAAU1E,GAAUA,EAAOnI,KAAOmH,IAC/D,IAAI2F,EACJ,GAAI5C,EAAMC,MAAQ,YAAa2C,GAAaF,EAAe,GAAK/K,EAAQiG,YACnE,GAAIoC,EAAMC,MAAQ,UACrB2C,GAAaF,EAAe,EAAI/K,EAAQiG,QAAUjG,EAAQiG,YACvD,GAAIoC,EAAMC,MAAQ,OAAQ2C,EAAY,OACtC,GAAI5C,EAAMC,MAAQ,MAAO2C,EAAYjL,EAAQiG,OAAS,OACtD,GAAIoC,EAAMC,MAAQ,aAAc,CACnCD,EAAME,iBACNvJ,KAAKkD,MAAMgI,OAAM,KACflL,KAAKoD,GACFQ,cACC,iHAEAuH,OAAO,IAEb,M,MACK,OAEP9B,EAAME,iBACNvJ,KAAKwC,iBAAmB,KACxBxC,KAAK4L,eAAe5K,EAAQiL,GAAW9M,GAAI,K,CAGrC,kBAAA+M,CAAmB7C,EAAsB/C,GAC/C,GAAI+C,EAAMC,MAAQ,YAAa,OAC/BD,EAAME,iBACNvJ,KAAKoD,GAAGQ,cAA2B,0BAA0B0C,QAAe6E,O,CAGtE,mBAAAgB,CACN9C,EACA/B,EACAwD,EACAsB,EACAnL,EACAoL,EAAqC/E,EAAOuD,SAAW,IAEvD,GAAIxB,EAAMC,MAAQ,YAAa,CAC7BtJ,KAAKkM,mBAAmB7C,EAAO/B,EAAOnI,IACtC,M,CAEF,GAAIkK,EAAMC,MAAQ,SAAWD,EAAMC,MAAQ,IAAK,CAC9CD,EAAME,iBACNvJ,KAAKsM,aAAahF,EAAQwD,EAAQ7J,GAClC,M,CAEF,IAAK,CAAC,YAAa,UAAW,OAAQ,OAAOsL,SAASlD,EAAMC,KAAM,OAClED,EAAME,iBACN,MAAMiD,EAAUH,EACb9M,KAAI,CAACkN,EAAWC,KAAW,CAAQD,YAAWC,kBAC9CpF,QAAO,EAAGmF,gBAAiBA,EAAUE,aACrCpN,KAAI,EAAGmN,iBAAkBA,IAC5B,IAAKF,EAAQvF,OAAQ,OACrB,MAAM2F,EAAUJ,EAAQK,QAAQT,GAChC,IAAIU,EACJ,GAAIzD,EAAMC,MAAQ,OAAQwD,EAAON,EAAQ,QACpC,GAAInD,EAAMC,MAAQ,MAAOwD,EAAON,EAAQA,EAAQvF,OAAS,OACzD,CACH,MAAM8F,EAAY1D,EAAMC,MAAQ,YAAc,GAAI,EAClD,MAAM0D,EAAQJ,GAAW,EAAIA,EAAUG,IAAc,GAAI,EAAK,EAC9DD,EAAON,GAASQ,EAAQD,EAAYP,EAAQvF,QAAUuF,EAAQvF,O,CAEhEjH,KAAKyC,kBAAoBqK,EACzB9M,KAAKwC,iBAAmB,KACxBxC,KAAKkD,MAAMgI,OAAM,KACflL,KAAKoD,GACFQ,cAA2B,IAAI5D,KAAK6C,eAAeyE,EAAOnI,aAAa2N,MACtE3B,OAAO,G,CAIP,kBAAA8B,CAAmBnC,EAA0BoC,GACnD,MAAMC,EAAaD,EAAME,OAAOC,oBAChC,IAAKF,EAAY,OAAO,KACxB,MAAO,GAAGrC,EAAO1L,SAAS0L,EAAOwC,aAAe,KAAKD,oBAAoBd,SAASY,E,CAG5E,cAAAd,CACN/E,EACA4F,EAAQlN,KAAK4C,oBAAoB0E,EAAOnI,KAAO,IAE/C,GAAImI,EAAOiE,OAAS,UAAW,CAC7B,MAAMT,EAAS9K,KAAKuN,cAAcjG,GAClC,OAAOtH,KAAKiN,mBAAmBnC,EAAQoC,GAAS,CAACpC,GAAU,E,CAE7D,OAAQxD,EAAOuD,SAAW,IAAIvD,QAAOwD,GAAU9K,KAAKiN,mBAAmBnC,EAAQoC,I,CAGzE,aAAAK,CAAcjG,GACpB,MAAO,CACLlI,MAAOkI,EAAOkG,YAAclG,EAAOlI,MACnCK,MAAO,OACP6N,YAAahG,EAAOgG,Y,CAIhB,cAAAG,CAAenG,EAA0B7H,GAC/C,MAAM4M,EAAiBrM,KAAKqM,eAAe/E,EAAQ7H,GACnD,MAAMiO,EAAerB,EAAeL,WAAUlB,IAAWA,EAAO6B,aAChE3M,KAAKyC,kBAAoBiL,EACzB1N,KAAKwC,iBAAmB,MACxBxC,KAAK4C,oBAAsB,IAAK5C,KAAK4C,oBAAqB,CAAC0E,EAAOnI,IAAKM,GACvEO,KAAKkD,MAAMgI,OAAM,KACf,MAAMyC,EAAU3N,KAAKoD,GAAGQ,cAA2B,iCACnD,GAAI+J,EAASA,EAAQC,UAAY,EACjC5N,KAAKuD,SAASkF,UAAU,G,CAIpB,yBAAAoF,CAA0BxE,EAAsB/B,GACtD,GAAI+B,EAAMC,MAAQ,aAAeD,EAAMC,MAAQ,UAAW,OAC1D,MAAM+C,EAAiBrM,KAAKqM,eAAe/E,GAC3C,MAAMkF,EAAUH,EACb9M,KAAI,CAACuL,EAAQsB,KAAK,CAAQtB,SAAQsB,YAClC9E,QAAO,EAAGwD,aAAcA,EAAO6B,aAC/BpN,KAAI,EAAG6M,WAAYA,IACtB,IAAKI,EAAQvF,OAAQ,OACrBoC,EAAME,iBACN,MAAMuD,EAAOzD,EAAMC,MAAQ,YAAckD,EAAQ,GAAKA,EAAQA,EAAQvF,OAAS,GAC/EjH,KAAKyC,kBAAoBqK,EACzB9M,KAAKwC,iBAAmB,KACxBxC,KAAKkD,MAAMgI,OAAM,KACflL,KAAKoD,GACFQ,cAA2B,IAAI5D,KAAK6C,eAAeyE,EAAOnI,aAAa2N,MACtE3B,OAAO,G,CAIP,cAAA2C,CACNxG,EACAwD,EACAiD,EACA9M,GAEA,GAAI6J,EAAO6B,WAAY,OACvB,MAAMC,EAAU7F,MAAMC,QAAQ/F,EAAOqG,EAAOnI,KAAQ8B,EAAOqG,EAAOnI,IAAmB,GACrF,MAAM6O,EAAW,IAAInG,IAAI+E,GACzB,GAAImB,EAASC,EAASC,IAAInD,EAAOrL,YAC5BuO,EAASE,OAAOpD,EAAOrL,OAC5B,MAAM0O,GAAW7G,EAAOuD,SAAW,IAChCtL,KAAIkN,GAAaA,EAAUhN,QAC3B6H,QAAO7H,GAASuO,EAASI,IAAI3O,KAChCO,KAAKmG,YAAY,CAAEG,SAAUgB,EAAOnI,GAAIM,MAAO0O,G,CAGzC,YAAA7B,CACNhF,EACAwD,EACA7J,GAEA,GAAI6J,EAAO6B,WAAY,OACvB,GAAIrF,EAAOiE,OAAS,SAAU,CAC5BvL,KAAKmG,YAAY,CAAEG,SAAUgB,EAAOnI,GAAIM,MAAOqL,EAAOrL,QACtD,M,CAEF,MAAMuO,EAAWjH,MAAMC,QAAQ/F,EAAOqG,EAAOnI,KACxC8B,EAAOqG,EAAOnI,IAAiBoN,SAASzB,EAAOrL,OAChD,MACJO,KAAK8N,eAAexG,EAAQwD,GAASkD,EAAU/M,E,CAGzC,QAAAoN,CAAS/H,EAAkB7G,GACjC,OAAOO,KAAK2C,iBAAiB2D,IAAagI,EAAqB7O,IAAQ8L,MAAQ,U,CAGzE,WAAAgD,CAAYjH,EAA0BX,GAC5C,GAAIA,IAAS,SAAWA,IAAS,WAAY,OAC7C3G,KAAK2C,iBAAmB,IAAK3C,KAAK2C,iBAAkB,CAAC2E,EAAOnI,IAAKwH,GACjE3G,KAAKyC,kBAAoB,C,CAGnB,yBAAA+L,CAA0BlH,EAA0B7H,GAC1D,MAAMgP,EAAmC,IACpCnH,EACHiE,KAAM,SACNV,QAASxL,GAEX,OACEqP,EAAA,OACEC,MAAM,iFACNC,KAAK,UAAS,aACH,iBAEVvP,EAAsBE,KAAI,CAACuL,EAAQsB,IAClCsC,EAACG,EAAe,CACdtO,KAAK,KACLpB,GAAI,GAAGa,KAAK6C,eAAeyE,EAAOnI,eAAeiN,IACjDtB,OAAQA,EACRkD,SAAUvO,IAAUqL,EAAOrL,MAC3BqP,OAAQ1C,IAAUpM,KAAKyC,kBACvBD,iBAAkBxC,KAAKwC,iBACvBuM,YAAa,MACbC,SAAU5C,IAAUpM,KAAKyC,kBAAoB,GAAI,EACjDwM,QAAS,KACPjP,KAAKyC,kBAAoB2J,CAAK,EAEhC8C,UAAY7F,GACVrJ,KAAKmM,oBAAoB9C,EAAOoF,EAAgB3D,EAAQsB,EAAO,CAC7D,CAAC9E,EAAOnI,IAAKM,IAGjB0P,QAAS,KACPnP,KAAKwC,iBAAmB,MACxBxC,KAAKyC,kBAAoB2J,CAAK,EAEhCgD,SAAU,IAAMpP,KAAKmG,YAAY,CAAEG,SAAUgB,EAAOnI,GAAIM,MAAOqL,EAAOrL,Y,CAOxE,kBAAA4P,CAAmB/H,EAA0B7H,GACnD,OACEiP,EAAA,eACEY,cAAc,QACd7P,aAAcA,IAAU,SAAWA,EAAQ,GAC3C8P,WAAalG,IACXA,EAAMmG,kBACNxP,KAAKmG,YAAY,CAAEG,SAAUgB,EAAOnI,GAAIM,MAAO4J,EAAMjD,QAAS,G,CAM9D,gBAAAqJ,CAAiBnI,EAA0B7H,GACjD,MAAMkH,EAAO3G,KAAKqO,SAAS/G,EAAOnI,GAAIM,GACtC,OACEiP,EAAA,OAAKC,MAAM,qBACTD,EAAA,UAAQC,MAAM,uEACZD,EAAA,gBACE3N,UAAU,mBACVR,KAAK,KACLC,MAAM,OACNkP,aAAc,MACdjQ,MAAOkH,EACPgJ,KAAMzQ,EACNqQ,WAAalG,IACXA,EAAMmG,kBACNxP,KAAKuO,YAAYjH,EAAQ+B,EAAMjD,OAAO,KAI5CsI,EAAA,OAAKC,MAAM,0BACRhI,IAAS,WACN3G,KAAKwO,0BAA0BlH,EAAQ7H,GACvCO,KAAKqP,mBAAmB/H,EAAQ7H,I,CAMpC,kBAAAmQ,CAAmBtI,GACzB,OACEoH,EAAA,OAAKC,MAAM,8BACTD,EAACmB,EAAY,CACXtP,KAAK,KACLuP,iBAAkB,MAClBC,mBAAoB,MACpBtQ,MAAOO,KAAK4C,oBAAoB0E,EAAOnI,KAAO,GAC9C6Q,YAAahQ,KAAK8B,kBAClBf,UAAW,UAAUuG,EAAOlI,gBAC5B6Q,SAAU,GAAGjQ,KAAK6C,eAAeyE,EAAOnI,aACxC+Q,SAAU,IAAM/I,UAChBtF,WAAY,SAASyF,EAAOlI,eAC5B+Q,cAAe1Q,GAASO,KAAKyN,eAAenG,EAAQ7H,GACpDyP,UAAY7F,GAAyBrJ,KAAK6N,0BAA0BxE,EAAO/B,K,CAM3E,qBAAA8I,GACN,OACE1B,EAAA,OACEC,MAAM,kCACNC,KAAK,SAAQ,gBACC,QAAO,gBACP,OAAM,aACR5O,KAAK+B,cAAa,YACpB,UAEV2M,EAAA,kBAAgB2B,KAAMrQ,KAAK+B,gB,CAKzB,aAAAuO,CAAchJ,EAA0BrG,GAC9C,MAAMxB,EAAQwB,EAAOqG,EAAOnI,IAC5B,GAAImI,EAAOiE,OAAS,YAAcjE,EAAOiE,OAAS,SAAU,CAC1D,MAAMyC,EAAWjH,MAAMC,QAAQvH,GAASA,EAAQ,GAChD,MAAM8Q,EAAajJ,EAAOuD,SAAW,GACrC,MAAMA,EAAU7K,KAAKqM,eAAe/E,GACpC,MAAMyH,EAAcyB,EAClBD,EAAWhR,KAAIuL,IAAM,CACnB1L,MAAO0L,EAAO1L,MACdK,MAAOqL,EAAOrL,MACdgR,QAAS3F,EAAOwC,iBAGpB,IAAKzC,EAAQ5D,OAAQ,OAAOjH,KAAKoQ,wBACjC,OAAOvF,EAAQtL,KAAI,CAACuL,EAAQsB,KAC1B,MAAMsE,EACJpJ,EAAOiE,OAAS,WAAayC,EAASzB,SAASzB,EAAOrL,OAASA,IAAUqL,EAAOrL,MAClF,OACEiP,EAACG,EAAe,CACdtO,KAAK,KACLpB,GAAI,GAAGa,KAAK6C,eAAeyE,EAAOnI,aAAaiN,IAC/CtB,OAAQ,CACN1L,MAAO0L,EAAO1L,MACdK,MAAOqL,EAAOrL,MACdgR,QAAS3F,EAAOwC,YAChBX,WAAY7B,EAAO6B,YAErBqB,SAAU0C,EACV5B,OAAQ1C,IAAUpM,KAAKyC,kBACvBD,iBAAkBxC,KAAKwC,iBACvBuM,YAAaA,EACbC,SAAU5C,IAAUpM,KAAKyC,kBAAoB,GAAI,EACjDkO,QACErJ,EAAOiE,OAAS,WACdmD,EAAA,QACEC,MAAM,wEAAuE,cACjE,QAEZD,EAAA,eAAatP,MAAM,GAAGmB,KAAK,KAAKwN,QAAS2C,EAAYE,aAAY,QAEjEzJ,UAEN8H,QAAS,KACPjP,KAAKyC,kBAAoB2J,CAAK,EAEhC8C,UAAY7F,GACVrJ,KAAKmM,oBAAoB9C,EAAO/B,EAAQwD,EAAQsB,EAAOnL,EAAQ4J,GAEjEsE,QAAS,KACPnP,KAAKwC,iBAAmB,MACxBxC,KAAKyC,kBAAoB2J,CAAK,EAEhCgD,SAAU,IAAMpP,KAAKsM,aAAahF,EAAQwD,EAAQ7J,IAClD,G,CAKR,GAAIqG,EAAOiE,OAAS,UAAW,CAC7B,MAAOT,GAAU9K,KAAKqM,eAAe/E,GACrC,IAAKwD,EAAQ,OAAO9K,KAAKoQ,wBACzB,OACE1B,EAACG,EAAe,CACdtO,KAAK,KACLpB,GAAI,GAAGa,KAAK6C,eAAeyE,EAAOnI,cAClC2L,OAAQ,CACN1L,MAAO0L,EAAO1L,MACdK,MAAOqL,EAAOrL,MACdgR,QAAS3F,EAAOwC,aAElBU,SAAUvO,IAAU,KACpBqP,OAAM,KACNtM,iBAAkBxC,KAAKwC,iBACvBuM,YAAa8B,QAAQ/F,EAAOwC,aAC5B0B,SAAU,EACV2B,QACEjC,EAAA,QACEC,MAAM,wEAAuE,cACjE,QAEZD,EAAA,eAAatP,MAAM,GAAGmB,KAAK,KAAKwN,QAAStO,IAAU,KAAMmR,aAAY,QAGzE1B,UAAY7F,IACV,GAAIA,EAAMC,MAAQ,YAAatJ,KAAKkM,mBAAmB7C,EAAO/B,EAAOnI,SAChE,GAAIkK,EAAMC,MAAQ,SAAWD,EAAMC,MAAQ,IAAK,CACnDD,EAAME,iBACNvJ,KAAKmG,YAAY,CAAEG,SAAUgB,EAAOnI,GAAIM,MAAOA,IAAU,M,GAG7D0P,QAAS,KACPnP,KAAKwC,iBAAmB,KAAK,EAE/B4M,SAAU,IAAMpP,KAAKmG,YAAY,CAAEG,SAAUgB,EAAOnI,GAAIM,MAAOA,IAAU,Q,CAK/E,OAAOO,KAAKyP,iBAAiBnI,EAAQ7H,E,CAGvC,mBAAYqR,GACV,OACE9Q,KAAKc,eAAiBd,KAAK0C,gBAAkB1C,KAAK8J,qBAAuB+G,QAAQ7Q,KAAKM,K,CAIlF,0BAAAyH,GACN/H,KAAKmI,mCACL,IAAKnI,KAAKoD,GAAGC,YAAa,OAC1B,IAAKrD,KAAKc,cAAe,CACvB,GAAId,KAAK0C,eAAgB1C,KAAK0C,eAAiB,MAC/C,M,CAEF1C,KAAK+Q,yBAA2BC,EAA2BhR,KAAKoD,IAAI6N,IAClE,GAAIjR,KAAK0C,iBAAmBuO,EAASjR,KAAK0C,eAAiBuO,CAAO,G,CAI9D,gCAAA9I,GACNnI,KAAK+Q,6BACL/Q,KAAK+Q,yBAA2B5J,S,CAG1B,oBAAA+J,CAAqBC,EAAgB/R,GAC3C,IAAKY,KAAKc,cAAe,OAAOqQ,EAChC,OACEzC,EAAA,cAAYtP,MAAOA,EAAO+B,KAAK,MAAMZ,KAAK,MACvC4Q,E,CAKC,YAAAC,CAAa5F,EAAuB6F,GAC1C,MAAMC,EAAetR,KAAKwL,cAAcxL,KAAKgB,QAAShB,KAAKiB,QAC3D,GAAIjB,KAAKY,eAAiB4K,IAAkB,GAAK8F,IAAiB,EAAG,OAAO,KAC5E,OACE5C,EAAA,OACEC,MAAO,CACL,sBAAuB,KACvB,wCAAyC0C,EACzC,mBAAoB,MACrB,eAEErR,KAAKY,eACNyQ,GACA7F,IAAkB,IACjBxL,KAAKqG,cACLrG,KAAK0G,WACF,OACAS,WAGNuH,EAAA,OAAKC,MAAM,6CACP0C,EACA3C,EAAA,WACEC,MAAM,4BACN4C,GAAG,OACHC,QAAQ,mBACRC,MAAM,YAAW,YACP,UAETjG,EAAa,aAEd,KACHxL,KAAKY,cACJ8N,EAAA,UACEC,MAAM,4DACN+C,KAAK,SACLC,UAAW3R,KAAK6G,kBAChB+K,QAAS,IAAM5R,KAAKyH,cAEpBiH,EAAA,WAAS6C,GAAG,OAAOC,QAAQ,mBAAmBC,MAAM,WAAS,UAI7D,KACHzR,KAAKY,gBAAkB4K,EAAgB,GAAK8F,EAAe,GAC1D5C,EAAA,WACEC,MAAM,gCACN4C,GAAG,OACHC,QAAQ,mBACRC,MAAM,WAAU,cACJ,QAAM,KAIlB,KACHjG,EAAgB,GAAMxL,KAAKY,eAAiB0Q,EAAe,EAC1D5C,EAAA,UACEC,MAAM,4DACN+C,KAAK,SACLE,QAAS,KACP,GAAI5R,KAAKY,cAAe,CACtBZ,KAAKqG,YAAc,GACnBrG,KAAK0G,WAAa,E,CAEpB1G,KAAK4H,QAAQpB,MAAM,GAGrBkI,EAAA,WAAS6C,GAAG,OAAOC,QAAQ,mBAAmBC,MAAM,WACjDzR,KAAK6B,aAGR,M,CAMJ,qBAAAgQ,CAAsBvK,EAA0BpG,GACtD,MAAMyF,EAA4BzF,EAAWoG,EAAOnI,MAAQ,MAAQ,MAAQ,MAC5E,MAAM2S,EAAgCnL,IAAS,MAAQ,MAAQ,MAC/D,OACE+H,EAAA,OAAKC,MAAM,mDACTD,EAAA,OAAKC,MAAM,4EACTD,EAAA,WAAS6C,GAAG,OAAOC,QAAQ,mBAAmBC,MAAM,aAAW,oBAG/D/C,EAAA,UACEC,MAAM,8DACN+C,KAAK,SAAQ,aACD,SAASpK,EAAOlI,oBAAoB0S,aAChDF,QAAS,IAAM5R,KAAKyG,WAAW,CAAEH,SAAUgB,EAAOnI,GAAIwH,KAAMmL,IAC5D5C,UAAY7F,GAAyBrJ,KAAKkM,mBAAmB7C,EAAO/B,EAAOnI,KAE3EuP,EAAA,WAAS6C,GAAG,OAAOC,QAAQ,mBAAmBC,MAAM,WACjD9K,IAGL+H,EAAA,WAAS6C,GAAG,OAAOC,QAAQ,mBAAmBC,MAAM,aAAW,a,CAQvE,MAAAM,GACE,GAAI/R,KAAKE,SACP,OACEwO,EAACsD,EAAI,CAACrD,MAAM,wBACT3O,KAAKgB,QAAQzB,KAAI+H,GAChBoH,EAAA,WAASvO,KAAI,KAACmJ,IAAKhC,EAAOnI,GAAIwP,MAAM,iCAClCD,EAAA,eACEA,EAAA,WAASC,MAAM,gCAAgCsD,KAAK,cAAc1R,KAAK,OACvEmO,EAAA,WAAS8C,QAAQ,mBAAmBU,SAAQ,MACzC5K,EAAOlI,QAGXkI,EAAOiE,OAAS,QAAUvL,KAAK4P,mBAAmBtI,GACnDoH,EAAA,OACEvP,GAAI,GAAGa,KAAK6C,eAAeyE,EAAOnI,aAClCyP,KAAMtH,EAAOiE,OAAS,OAASpE,UAAY,UAAS,aACxCG,EAAOlI,MAAK,uBACFkI,EAAOiE,OAAS,WAAa,OAASpE,UAC5DwH,MAAM,uDAEL3O,KAAKsQ,cAAchJ,EAAQtH,KAAKiB,SAElCqG,EAAOiE,OAAS,YAAcvL,KAAK6R,sBAAsBvK,EAAQtH,KAAKkB,gBAKjF,MAAMiR,EACJnS,KAAKmC,SAAWnC,KAAKsD,gBACjBtD,KAAKsD,gBACL,CACEtC,QAAShB,KAAKgB,QACdC,OAAQjB,KAAKqG,aAAerG,KAAKiB,OACjCC,WAAYlB,KAAK0G,YAAc1G,KAAKkB,WACpC+J,eAAgBjL,KAAKiL,gBAE7B,MAAMmH,EAAepS,KAAKoL,eAAe+G,EAAMnR,QAASmR,EAAMlH,gBAC9D,MAAMO,EAAgBxL,KAAKwL,cAAc2G,EAAMnR,QAASmR,EAAMlR,QAC9D,MAAM0K,EAAoB3L,KAAK2L,kBAAkBwG,EAAMnR,QAASmR,EAAMlR,QACtE,MAAMoR,EAAmB1G,EAAoB,EAC7C,MAAM2G,EAAwBtS,KAAKgC,eAAiB,mBACpD,MAAM5C,EAAQ,GAAGY,KAAKI,eACpBJ,KAAKK,mBAAqBgS,EAAmB,MAAM1G,IAAsB,KAE3E,MAAM4G,EAAcC,EAAqBxS,KAAKO,MAC9C,MAAMkS,EAAW5T,EAAUmB,KAAKO,MAChC,MAAMmS,EAAU,GAAG1S,KAAK6C,oBACxB,MAAM8P,EAAqC,CACzCpP,SAAU,QACVqP,KAAM,IACNC,IAAK,IACLrS,MAAOR,KAAKyB,UACZqR,UAAW,aAAaC,KAAKC,MAAMhT,KAAKqC,IAAIC,SAASyQ,KAAKC,MAAMhT,KAAKqC,IAAIE,QACzE0Q,OAAQ,OACRC,WAAYlT,KAAKoC,cAAgB,UAAY,UAG/C,OACEsM,EAACsD,EAAI,CACHrD,MAAO,CACL,mBAAoB,KACpB,sCAAuC3O,KAAK8J,oBAC5C,yBAA0B9J,KAAK8J,oBAC/B,CAAC,eAAe9J,KAAKO,QAAS,KAC9B,2BAA4BP,KAAKc,cACjC,oCAAqCd,KAAK8Q,mBACvCqC,EAAkBnT,KAAKQ,SAG3BR,KAAK8J,oBACF9J,KAAKkR,qBACHxC,EAAA,UACE0E,IAAKC,IACHrT,KAAK8C,eAAkBuQ,GAAiC,IAAI,EAE9DlU,GAAIa,KAAKsT,SAAW,GAAGtT,KAAK6C,sBAC5B6O,KAAK,SACL/C,MAAO,CACLwC,QAAS,KACT,mBAAoB,KACpB,sBAAuB,KACvB,sBAAuB,KACvB,gCAAiCnR,KAAKa,YAAcwR,EACpD,oBAAqBrS,KAAKG,MAAQH,KAAKmC,QACvC,oCAAqCnC,KAAKG,MAAQH,KAAKmC,QACvD,oBAAqBnC,KAAKU,UAC1B,qBAAsB2R,IAAqBrS,KAAKW,eAChD,CAAC,eAAeX,KAAKO,QAAS,MAEhCqO,KAAK,WAAU,gBACD,SAAQ,gBACP2E,OAAOvT,KAAKG,MAAK,gBACjBH,KAAKG,KAAOuS,EAAUvL,UAAS,aAClCnH,KAAKe,WAAaf,KAAK2B,UACnCiQ,QAAUvI,GAAsBrJ,KAAKwK,kBAAkBnB,GACvD6F,UAAY7F,GAAyBrJ,KAAKyK,qBAAqBpB,IAE9DrJ,KAAKM,KACJoO,EAAA,QACEC,MAAM,mEAAkE,cAC5D,QAEZD,EAAA,WAASuD,KAAMjS,KAAKM,KAAMC,KAAMkS,EAAUhB,MAAM,aAEhD,KACHzR,KAAK8Q,gBAAkB,KACtBpC,EAAA,WACEC,MAAM,6GACN4C,GAAG,OACHC,QAASe,EACTd,MAAM,UACN+B,eAAgB,GAEfpU,GAGJY,KAAK8Q,kBAAoB9Q,KAAKS,cAAgB,KAC7CiO,EAAA,QACEC,MAAM,oEAAmE,cAC7D,QAEZD,EAAA,WAASuD,KAAK,cAAc1R,KAAMkS,EAAUhB,MAAM,cAIxDzR,KAAK8Q,gBAAkB1R,EAAQ,IAEjC,KAEHY,KAAKkC,cAAgBlC,KAAKC,SACzByO,EAAA,OACEvP,GAAIuT,EACJe,QAASzT,KAAKC,SAAWkH,UAAY,SACrCwH,MAAO,CACL,oBAAqB,KACrB,mBAAoB3O,KAAKC,SACzB,4BAA6BD,KAAKC,SAClC,2BAA4BD,KAAKmC,SAEnCuR,MAAO1T,KAAKC,SAAWkH,UAAYwL,EACnC/D,KAAK,SAAQ,aACD5O,KAAK2B,WAEhByQ,EACC1D,EAAA,OAAKC,MAAM,eACTD,EAAA,OAAKC,MAAM,qBACTD,EAAA,OAAKC,MAAM,8BACTD,EAAA,OACEC,MAAM,8EACNC,KAAK,UAAS,aACF5O,KAAK4B,gBAAe,mBACf,YAEhBuQ,EAAMnR,QAAQzB,KAAI+H,IACjB,MAAMwH,EAASxH,EAAOnI,KAAOiT,EAAajT,GAC1C,MAAMwU,EAAQ3T,KAAKsL,cAAchE,EAAQ6K,EAAMlR,QAC/C,OACEyN,EAAA,OACEpF,IAAKhC,EAAOnI,GACZwP,MAAO,CACL,gCAAiC,KACjC,6BAA8BkC,QAAQvJ,EAAOsM,WAG/ClF,EAAA,UACEvP,GAAI,GAAGa,KAAK6C,eAAeyE,EAAOnI,SAClCuS,KAAK,SACL9C,KAAK,MAAK,uBACYtH,EAAOnI,GAC7BwP,MAAO,CACL,wBAAyB,KACzB,gCAAiCG,EACjC,iBAAkB,KAClB,mBAAoB,KACpB,iBAAkB,KAClB,sBAAuB,KACvB,yBAA0BA,GAAU9O,KAAKwC,iBACzC,sBAAuB,KACvB,gCAAiCsM,GAClC,gBACcyE,OAAOzE,GAAO,gBACd,GAAG9O,KAAK6C,oBACvBmM,SAAUF,EAAS,GAAI,EACvB+E,YAAa,KACX7T,KAAKwC,iBAAmB,KAAK,EAE/BoP,QAAS,IAAM5R,KAAK4L,eAAetE,EAAOnI,IAC1C+P,UAAY7F,GACVrJ,KAAK8L,sBAAsBzC,EAAO8I,EAAMnR,QAASsG,EAAOnI,KAG1DuP,EAAA,WACEC,MAAM,kGACN4C,GAAG,OACHC,QAAQ,mBACRC,MAAO3C,EAAS,UAAY,aAE3BxH,EAAOlI,OAETuU,EAAQ,GAAKrM,EAAOiE,OAAS,OAC5BmD,EAAA,QACEC,MAAM,6DAA4D,cACtD,QAEZD,EAAA,YAAU8C,QAAQ,MAAMsC,QAAS,MAAO1U,MAAM,MAE9CuU,EAAQ,EACVjF,EAAA,UACEC,MAAM,mDACNvP,MAAOmU,OAAOI,GACdpT,KAAK,KACLwT,OAAO,QACPC,SAAS,OACTC,QAAO,KACPC,QAAO,OAEP,MAEF,KAIX5B,EAAwBtS,KAAKoR,aAAa5F,EAAe,MAAQ,MAGpEkD,EAAA,OACEvP,GAAI,GAAGa,KAAK6C,oBACZ8L,MAAO,CACL,uBAAwB,KACxB,6BAA8ByD,EAAa7G,OAAS,QAEtDqD,KAAK,WAAU,kBACE,GAAG5O,KAAK6C,eAAeuP,EAAajT,UAEpDiT,EAAa7G,OAAS,OAAS,KAAOvL,KAAK4P,mBAAmBwC,GAC/D1D,EAAA,OAAKC,MAAM,gCACRyD,EAAa7G,OAAS,OACrBmD,EAAA,OAAKpF,IAAK8I,EAAajT,GAAIwP,MAAM,kCAC9B3O,KAAKsQ,cAAc8B,EAAcD,EAAMlR,SAG1CyN,EAAA,OACEvP,GAAI,GAAGa,KAAK6C,eAAeuP,EAAajT,aACxCmK,IAAK8I,EAAajT,GAClBwP,MAAM,+EACNC,KAAK,UAAS,aACFwD,EAAahT,MAAK,uBAE5BgT,EAAa7G,OAAS,WAAa,OAASpE,WAG7CnH,KAAKsQ,cAAc8B,EAAcD,EAAMlR,UAI7CmR,EAAa7G,OAAS,WACnBvL,KAAK6R,sBAAsBO,EAAcD,EAAMjR,YAC/C,QAINoR,GAAyB9G,EAAgB,EACvCxL,KAAKoR,aAAa5F,EAAe,OACjC,MAEJ,MAEJ,K","ignoreList":[]}
1
+ {"version":3,"names":["filterMenuCss","filterMenuId","ICON_SIZE","lg","md","sm","xs","DATE_MODE_TABS","id","label","RELATIVE_DATE_OPTIONS","DATE_FILTER_RELATIVE_PRESETS","map","preset","value","dateFilterRelativeValue","FilterMenu","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","embedded","vertical","open","triggerLabel","showSelectedCount","icon","size","width","showIndicator","hasBorder","neutralTrigger","applyRequired","activeFill","collapseLabel","ariaLabel","filters","values","matchModes","side","align","sideOffset","TOKEN_CSS_LENGTHS","space050","alignOffset","menuWidth","menuWidthLg","menuLabel","categoriesLabel","clearLabel","searchPlaceholder","noResultsText","footerLayout","initialFocusVisible","shouldRender","closing","positionReady","pos","x","y","focusRingVisible","activeOptionIndex","captionCompact","dateModeByFilter","optionQueryByFilter","generatedId","triggerElement","pendingInitialFocusVisible","closeTimer","hasLoaded","tasks","ConnectionTasks","el","isConnected","closingSnapshot","position","AnchoredPositionController","getAnchor","resolvedAnchor","getPopup","querySelector","getOwnerDocument","ownerDocument","measure","anchor","popup","anchorRect","getBoundingClientRect","sectionInsetPx","resolveCssLengthPx","TOKEN_DEFAULTS","popupWidth","offsetWidth","popupFallbackWidth","popupHeight","offsetHeight","popupFallbackHeight","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","viewportPadPx","viewportPad","viewportWidth","window","innerWidth","viewportHeight","innerHeight","collisionRect","resolveAnchoredOverlayBoundaryRect","boundary","apply","onReady","liveUpdate","observeResize","topLayer","interaction","AnchoredOverlayInteractionController","onOutsideActivation","close","changeValue","detail","draftValues","filterId","dsChange","emit","changeMode","draftModes","mode","dsMatchModeChange","hasPendingChanges","normalize","Array","isArray","length","sort","undefined","modes","some","filter","JSON","stringify","applyDraft","Object","keys","dsClear","Set","componentDidLoad","syncCaptionCompactObserver","onOpenChange","connectedCallback","disconnectedCallback","disconnectCaptionCompactObserver","unobserve","teardownListeners","onCollapseLabelChange","isOpen","setupListeners","schedule","focusInitialCategory","cancel","captureClosingSnapshot","duration","resolveMotionTimeMs","motionShort2","animationDurationShort3","finishClose","setTimeout","onPositionInputChange","handleKeyDown","event","key","preventDefault","tabLeavesPopup","moveFocusAfterTab","shiftKey","anchorId","document","getElementById","usesInternalTrigger","menuFallbackHeight","connect","observe","disconnect","clearTimeout","restoreFocus","focusAnchor","dsOpenChange","dsClose","toggleFromTrigger","handleTriggerKeyDown","matches","hidePopover","dsAfterClose","options","option","fromEntries","entries","activeFilterId","frame","focus","selectedFilter","find","selectedCount","kind","totalSelected","reduce","total","activeFilterCount","selectCategory","dsActiveFilterChange","handleCategoryKeyDown","currentIndex","findIndex","nextIndex","handlePanelKeyDown","handleOptionKeyDown","index","visibleOptions","selectOption","includes","enabled","candidate","optionIndex","isInactive","current","indexOf","next","direction","start","optionMatchesQuery","query","normalized","trim","toLocaleLowerCase","description","booleanOption","fieldLabel","setOptionQuery","firstEnabled","content","scrollTop","handleOptionSearchKeyDown","toggleMultiple","checked","selected","add","delete","ordered","has","dateMode","parseDateFilterValue","setDateMode","renderRelativeDateOptions","relativeFilter","h","class","role","ChoiceOptionRow","active","usesSubtext","tabIndex","onFocus","onKeyDown","onHover","onSelect","renderDateCalendar","selectionMode","onDsChange","stopPropagation","renderDateFilter","hasContainer","tabs","renderOptionSearch","ChoiceSearch","hasFocusBoundary","hasInteractionFill","placeholder","controls","inputRef","onValueChange","renderNoOptionResults","body","renderOptions","allOptions","choiceListUsesSubtext","subtext","isSelected","leading","presentation","Boolean","captionIconOnly","captionCompactDisconnect","observeTableCaptionCompact","compact","renderCaptionTooltip","trigger","renderFooter","categoriesClear","appliedCount","as","variant","color","type","disabled","onClick","renderMatchModeFooter","nextMode","render","Host","name","emphasis","state","activeFilter","hasActiveFilters","categoriesClearFooter","textVariant","CONTROL_TEXT_VARIANT","iconSize","popupId","popupStyle","left","top","transform","Math","round","zIndex","visibility","controlWidthClass","ref","element","inputId","String","lineTruncation","popover","style","count","divider","onMouseDown","hasRing","intent","contrast","isInset","rounded"],"sources":["src/wc/components/FilterMenu/FilterMenu.css?tag=ds-filter-menu&encapsulation=scoped","src/wc/components/FilterMenu/FilterMenu.tsx"],"sourcesContent":["@import '../../utils/radius.css';\n@import '../../utils/choice-list.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/select-trigger.css';\n@import '../../utils/search-control.css';\n@import '../../utils/table-caption-control.css';\n\n:host(.filter-menu-host--external-trigger) {\n display: contents;\n}\n\n.filter-menu {\n display: flex;\n min-height: 0;\n flex-direction: column;\n color: var(--color-foreground-secondary);\n}\n\n.filter-menu__body {\n display: grid;\n grid-template-columns: var(--dimension-menu-width-xs) var(--dimension-menu-width-sm);\n min-height: calc(var(--dimension-size-800) * 4 + var(--dimension-space-150));\n max-height: calc(100vh - var(--dimension-size-800) - var(--dimension-size-600));\n}\n\n.filter-menu__category-pane {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n border-inline-end: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.filter-menu__categories {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.filter-menu__category-section {\n display: flex;\n min-width: 0;\n flex-direction: column;\n}\n\n.filter-menu__category-section.ds-choice-section--divided {\n padding-block-end: var(--dimension-space-050);\n}\n\n.filter-menu__category {\n justify-content: space-between;\n width: 100%;\n border: 0;\n background: transparent;\n color: var(--color-foreground-secondary);\n cursor: default;\n text-align: start;\n}\n\n.filter-menu__category--active {\n color: var(--color-foreground-primary);\n}\n\n.filter-menu__category-dot-box {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n pointer-events: none;\n}\n\n.filter-menu__options {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n}\n\n.filter-menu__options-content {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1 1 auto;\n flex-direction: column;\n overflow: auto;\n}\n\n.filter-menu__option-search {\n position: relative;\n flex: 0 0 var(--dimension-size-500);\n min-width: 0;\n min-height: var(--dimension-size-500);\n background: transparent;\n}\n\n.filter-menu__option-search::after {\n content: '';\n position: absolute;\n inset: auto 0 0;\n height: var(--dimension-stroke-width-012);\n background-color: var(--color-border-tertiary);\n pointer-events: none;\n}\n\n.filter-menu__option-search .select-search {\n height: 100%;\n background: transparent;\n}\n\n.filter-menu__options--date,\n.filter-menu__option-list--date,\n.filter-menu__date {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n}\n\n.filter-menu__option-list--date,\n.filter-menu__date {\n flex: 1 1 auto;\n}\n\n.filter-menu__date-header {\n flex: 0 0 var(--dimension-size-500);\n justify-content: center;\n min-block-size: var(--dimension-size-500);\n padding: var(--dimension-space-050);\n background: var(--color-background-secondary);\n}\n\n.filter-menu__date-body {\n display: flex;\n flex: 1 1 auto;\n min-height: 0;\n flex-direction: column;\n}\n\n.filter-menu__date-relative {\n flex: 1 1 auto;\n}\n\n.filter-menu__date-body > ds-calendar {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n\n.filter-menu__footer {\n flex: 0 0 auto;\n}\n\n.filter-menu__footer--categories-clear .ds-choice-footer__content {\n justify-content: flex-start;\n}\n\n.filter-menu__footer--categories-clear[aria-hidden='true']::before {\n visibility: hidden;\n}\n\n.ds-choice-footer__content:has(.filter-menu__apply) {\n column-gap: var(--dimension-space-100);\n}\n\n.filter-menu__apply ds-text {\n padding-right: 0;\n}\n\n.filter-menu__action-separator + .filter-menu__clear ds-text {\n padding-left: 0;\n}\n\n.filter-menu__apply {\n color: var(--color-foreground-bold-brand);\n}\n\n.filter-menu__apply:disabled {\n color: var(--color-foreground-tertiary);\n text-decoration-line: none;\n}\n\n.filter-menu__clear {\n --ds-text-action-foreground: var(--color-foreground-bold-negative);\n\n color: var(--ds-text-action-foreground);\n}\n\n.filter-menu__match-mode-footer {\n flex: 0 0 auto;\n}\n\n.filter-menu__match-mode-content {\n justify-content: flex-start;\n padding-inline: calc(\n var(--dimension-space-050) + var(--ds-control-padding-inline, var(--dimension-space-075)) +\n var(--ds-control-label-inset, var(--dimension-space-025))\n );\n}\n\n.filter-menu__match-mode-toggle {\n appearance: none;\n display: inline-flex;\n align-items: center;\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n cursor: default;\n}\n\n@media (forced-colors: active) {\n .filter-menu__category-pane {\n border-inline-end-color: var(--ds-forced-color-content);\n }\n}\n\n.data-preferences-embedded {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n color: var(--color-foreground-secondary);\n}\n\n.data-preferences-embedded .filter-menu__body {\n grid-template-columns: min(var(--dimension-menu-width-xs), 40%) minmax(0, 1fr);\n}\n\n.filter-menu-vertical__section {\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n.filter-menu-vertical__section > summary {\n cursor: default;\n padding: var(--dimension-space-200);\n}\n.filter-menu-vertical__section > summary ds-text {\n display: inline;\n}\n\n.filter-menu-vertical__section > summary {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n list-style: none;\n}\n.filter-menu-vertical__section > summary::-webkit-details-marker {\n display: none;\n}\n.filter-menu-vertical__section:not([open]) .filter-menu-vertical__chevron {\n transform: rotate(-90deg);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Prop,\n State,\n type VNode,\n Watch,\n} from '@stencil/core';\nimport {\n CONTROL_TEXT_VARIANT,\n DATE_FILTER_RELATIVE_PRESETS,\n controlWidthClass,\n dateFilterRelativeValue,\n parseDateFilterValue,\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n TOKEN_CSS_LENGTHS,\n TOKEN_DEFAULTS,\n type ControlWidth,\n} from '../../utils';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\nimport type { AnchoredAlign, AnchoredSide } from '../../utils/anchored-position';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport { ConnectionTasks } from '../../utils/connection-tasks';\nimport { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\nimport { ChoiceOptionRow, ChoiceSearch } from '../../utils/choice-list-parts';\nimport { choiceListUsesSubtext } from '../../utils/choice-list';\n\nexport type FilterMenuFilterKind = 'single' | 'multiple' | 'boolean' | 'date';\nexport type FilterMenuSize = 'lg' | 'md' | 'sm' | 'xs';\nexport type FilterMenuWidth = ControlWidth;\nexport type FilterMenuFooterLayout = 'summary' | 'categories-clear';\nexport type FilterMenuMatchMode = 'any' | 'all';\ntype FilterMenuDateMode = 'range' | 'relative';\n\nexport interface FilterMenuOption {\n label: string;\n value: string;\n description?: string;\n isInactive?: boolean;\n}\n\nexport interface FilterMenuFilter {\n id: string;\n label: string;\n kind: FilterMenuFilterKind;\n options?: FilterMenuOption[];\n description?: string;\n fieldLabel?: string;\n /** Draw a standard menu-section divider after this category. */\n divider?: boolean;\n}\n\nexport type FilterMenuValue = string[] | boolean | string;\nexport type FilterMenuValues = Record<string, FilterMenuValue | undefined>;\nexport type FilterMenuMatchModes = Record<string, FilterMenuMatchMode | undefined>;\n\nexport interface FilterMenuChangeDetail {\n filterId: string;\n value: FilterMenuValue;\n}\n\nexport interface FilterMenuMatchModeChangeDetail {\n filterId: string;\n mode: FilterMenuMatchMode;\n}\n\nlet filterMenuId = 0;\n\nconst ICON_SIZE: Record<FilterMenuSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\nconst DATE_MODE_TABS = [\n { id: 'relative', label: 'Relative' },\n { id: 'range', label: 'Range' },\n];\n\nconst RELATIVE_DATE_OPTIONS: FilterMenuOption[] = DATE_FILTER_RELATIVE_PRESETS.map(preset => ({\n label: preset.label,\n value: dateFilterRelativeValue(preset.value),\n}));\n\n@Component({\n tag: 'ds-filter-menu',\n styleUrl: 'FilterMenu.css',\n scoped: true,\n})\nexport class FilterMenu {\n @Element() el!: HTMLElement;\n\n /** Controlled popup visibility. */\n /** Render content inside a parent-owned surface; the parent owns dismissal and positioning. */\n @Prop() embedded: boolean = false;\n /** Stacked, collapsible sections for a configuration panel. */\n @Prop() vertical: boolean = false;\n @Prop({ mutable: true }) open: boolean = false;\n /** Select trigger text. */\n @Prop() triggerLabel: string = 'Filters';\n /** Append the active-filter count to the visible trigger label. */\n @Prop() showSelectedCount: boolean = true;\n /** Optional select trigger prefix icon name. */\n @Prop() icon: string | undefined = 'Filters';\n /** Select trigger density. */\n @Prop() size: FilterMenuSize = 'md';\n /** Select trigger width fit. */\n @Prop() width: FilterMenuWidth = 'hug';\n /** Show the surface-aware inset border around the select trigger. */\n /** Show the trigger chevron. */\n @Prop() showIndicator: boolean = true;\n @Prop() hasBorder: boolean = true;\n /** Show selected interaction fill when one or more criteria are active. */\n /** Keep trigger colors neutral when a value is selected. */\n @Prop() neutralTrigger: boolean = false;\n /** Stage filter edits until Apply is pressed. */\n @Prop() applyRequired: boolean = false;\n @State() private draftValues?: FilterMenuValues;\n @State() private draftModes?: FilterMenuMatchModes;\n\n private changeValue(detail: FilterMenuChangeDetail): void {\n if (this.applyRequired)\n this.draftValues = { ...(this.draftValues ?? this.values), [detail.filterId]: detail.value };\n else this.dsChange.emit(detail);\n }\n private changeMode(detail: FilterMenuMatchModeChangeDetail): void {\n if (this.applyRequired)\n this.draftModes = { ...(this.draftModes ?? this.matchModes), [detail.filterId]: detail.mode };\n else this.dsMatchModeChange.emit(detail);\n }\n private get hasPendingChanges(): boolean {\n const normalize = (value: FilterMenuValue | undefined) =>\n Array.isArray(value) ? (value.length ? [...value].sort() : undefined) : value || undefined;\n const values = this.draftValues ?? this.values;\n const modes = this.draftModes ?? this.matchModes;\n return this.filters.some(\n filter =>\n JSON.stringify(normalize(values[filter.id])) !==\n JSON.stringify(normalize(this.values[filter.id])) ||\n (modes[filter.id] ?? 'any') !== (this.matchModes[filter.id] ?? 'any')\n );\n }\n private applyDraft(): void {\n if (!this.hasPendingChanges) return;\n if (this.draftValues && Object.keys(this.draftValues).length === 0) {\n this.dsClear.emit();\n } else if (this.draftValues) {\n for (const id of new Set([...Object.keys(this.values), ...Object.keys(this.draftValues)])) {\n if (JSON.stringify(this.values[id]) !== JSON.stringify(this.draftValues[id]))\n this.dsChange.emit({\n filterId: id,\n value:\n this.draftValues[id] ??\n (Array.isArray(this.values[id])\n ? []\n : typeof this.values[id] === 'boolean'\n ? false\n : ''),\n });\n }\n }\n if (this.draftModes) {\n for (const filterId of new Set([\n ...Object.keys(this.matchModes),\n ...Object.keys(this.draftModes),\n ])) {\n const mode = this.draftModes[filterId] ?? 'any';\n if ((this.matchModes[filterId] ?? 'any') !== mode)\n this.dsMatchModeChange.emit({ filterId, mode });\n }\n }\n }\n @Prop() activeFill: boolean = false;\n /**\n * Opt into table-caption icon-only chrome below 900px. The trigger omits its\n * visible label and chevron; keep an accessible name via aria-label.\n */\n @Prop({ reflect: true }) collapseLabel: boolean = false;\n /** ID applied to the internal select trigger. */\n @Prop() inputId: string | undefined;\n /** Direct accessible name for the internal select trigger. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Product-owned filter categories and option definitions. */\n @Prop() filters: FilterMenuFilter[] = [];\n /** Controlled values keyed by filter id. */\n @Prop() values: FilterMenuValues = {};\n /** Controlled any/all match mode keyed by multiple-choice filter id. Defaults to any. */\n @Prop() matchModes: FilterMenuMatchModes = {};\n /** Controlled category shown in the option pane. */\n @Prop() activeFilterId: string | undefined;\n /** External trigger element to position against. */\n @Prop() anchor: HTMLElement | undefined;\n /** ID of the external trigger element used for positioning and focus return. */\n @Prop() anchorId: string | undefined;\n /** Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used. */\n @Prop() boundary: HTMLElement | undefined;\n /** Preferred popup side; collision handling may flip it. */\n @Prop() side: AnchoredSide = 'bottom';\n /** Cross-axis alignment against the trigger. */\n @Prop() align: AnchoredAlign = 'end';\n /** Gap between trigger and popup — number in px or a TokoMo length. */\n @Prop() sideOffset: number | string = TOKEN_CSS_LENGTHS.space050;\n /** Cross-axis offset — number in px or a TokoMo length. */\n @Prop() alignOffset: number | string = 0;\n /** Popup width. It remains clamped to its collision boundary by the component recipe. */\n @Prop() menuWidth: string = TOKEN_CSS_LENGTHS.menuWidthLg;\n /** Accessible name for the non-modal filter dialog. */\n @Prop() menuLabel: string = 'Filters';\n /** Accessible name for the category tab list. */\n @Prop() categoriesLabel: string = 'Filter categories';\n /** Footer action and date-clear accessible label. */\n @Prop() clearLabel: string = 'Clear';\n /** Placeholder shown in each non-date option search header. */\n @Prop() searchPlaceholder: string = 'Search';\n /** Empty-state text shown when an option search has no matches. */\n @Prop() noResultsText: string = 'No results';\n /** Footer recipe: full-width selected summary or reserved category-pane Clear action. */\n @Prop() footerLayout: FilterMenuFooterLayout = 'summary';\n /** Show a visible focus ring on initial entry after keyboard activation. */\n @Prop() initialFocusVisible: boolean = false;\n\n @State() private shouldRender = false;\n @State() private closing = false;\n @State() private positionReady = false;\n @State() private pos: { x: number; y: number } = { x: 0, y: 0 };\n @State() private focusRingVisible = false;\n @State() private activeOptionIndex = 0;\n @State() private captionCompact = false;\n @State() private dateModeByFilter: Record<string, FilterMenuDateMode> = {};\n @State() private optionQueryByFilter: Record<string, string> = {};\n\n /** Requests a controlled value replacement without closing the popup. */\n @Event() dsChange!: EventEmitter<FilterMenuChangeDetail>;\n /** Requests that the consumer clear every filter value. */\n @Event() dsClear!: EventEmitter<void>;\n /** Requests a controlled any/all mode replacement for a multiple-choice filter. */\n @Event() dsMatchModeChange!: EventEmitter<FilterMenuMatchModeChangeDetail>;\n /** Requests a controlled active-category replacement. */\n @Event() dsActiveFilterChange!: EventEmitter<string>;\n /** Requests that the controlled popup close. */\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted whenever internal select-trigger activation changes popup visibility. */\n @Event() dsOpenChange!: EventEmitter<boolean>;\n /** Emitted after exit motion and rendered popup removal complete. */\n @Event() dsAfterClose!: EventEmitter<void>;\n\n private readonly generatedId = `ds-filter-menu-${++filterMenuId}`;\n private triggerElement: HTMLButtonElement | null = null;\n private pendingInitialFocusVisible = false;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private captionCompactDisconnect: (() => void) | undefined;\n private hasLoaded = false;\n private readonly tasks = new ConnectionTasks(() => this.el.isConnected);\n private closingSnapshot: {\n filters: FilterMenuFilter[];\n values: FilterMenuValues;\n matchModes: FilterMenuMatchModes;\n activeFilterId: string | undefined;\n } | null = null;\n\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.resolvedAnchor,\n getPopup: () => this.el.querySelector<HTMLElement>('.filter-menu-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n measure: (anchor, popup) => {\n if (!this.open) return null;\n const anchorRect = anchor.getBoundingClientRect();\n const sectionInsetPx = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n return {\n anchorRect,\n popupWidth: popup.offsetWidth || this.popupFallbackWidth,\n popupHeight: popup.offsetHeight || this.popupFallbackHeight,\n side: this.side,\n align: this.align,\n sideOffsetPx: resolveCssLengthPx(this.sideOffset, TOKEN_DEFAULTS.space050),\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: this.align,\n alignOffsetPx: resolveCssLengthPx(this.alignOffset, 0),\n sectionInsetPx,\n }),\n viewportPadPx: this.viewportPad,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n collisionRect: resolveAnchoredOverlayBoundaryRect(anchor, this.boundary),\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.positionReady = true;\n },\n liveUpdate: 'double-frame',\n observeResize: true,\n topLayer: true,\n });\n private readonly interaction = new AnchoredOverlayInteractionController({\n getAnchor: () => this.resolvedAnchor,\n getPopup: () => this.el.querySelector<HTMLElement>('.filter-menu-popup'),\n getOwnerDocument: () => this.el.ownerDocument,\n onOutsideActivation: () => this.close(),\n });\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.syncCaptionCompactObserver();\n if (this.open) this.onOpenChange(true);\n }\n\n connectedCallback() {\n if (!this.hasLoaded) return;\n this.syncCaptionCompactObserver();\n if (this.open) this.onOpenChange(true);\n }\n\n disconnectedCallback() {\n this.disconnectCaptionCompactObserver();\n this.position.unobserve();\n this.teardownListeners();\n this.shouldRender = false;\n this.closing = false;\n this.positionReady = false;\n this.closingSnapshot = null;\n this.pendingInitialFocusVisible = false;\n if (!this.open) {\n this.dateModeByFilter = {};\n this.optionQueryByFilter = {};\n }\n }\n\n @Watch('collapseLabel')\n onCollapseLabelChange() {\n this.syncCaptionCompactObserver();\n }\n\n @Watch('open')\n onOpenChange(isOpen: boolean) {\n if (!isOpen) {\n this.draftValues = undefined;\n this.draftModes = undefined;\n }\n if (this.embedded || !this.hasLoaded || !this.el.isConnected) return;\n if (isOpen) {\n this.teardownListeners();\n this.closingSnapshot = null;\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.focusRingVisible = this.pendingInitialFocusVisible || this.initialFocusVisible;\n this.setupListeners();\n this.position.schedule(() => this.focusInitialCategory());\n return;\n }\n\n if (!this.shouldRender || this.closing) return;\n this.position.cancel();\n this.captureClosingSnapshot();\n this.closing = true;\n this.teardownListeners();\n const duration = resolveMotionTimeMs(\n TOKEN_DEFAULTS.motionShort2,\n TOKEN_DEFAULTS.animationDurationShort3\n );\n if (duration <= 0) {\n this.finishClose();\n return;\n }\n this.closeTimer = setTimeout(() => this.finishClose(), duration);\n }\n\n @Watch('anchor')\n @Watch('anchorId')\n @Watch('boundary')\n @Watch('side')\n @Watch('align')\n @Watch('sideOffset')\n @Watch('alignOffset')\n @Watch('menuWidth')\n onPositionInputChange() {\n if (this.open && this.el.isConnected) this.position.schedule();\n }\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (this.embedded && (event.key === 'Escape' || event.key === 'Tab')) return;\n if ((!this.shouldRender && !this.embedded) || this.closing) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (event.key !== 'Tab' || !this.tabLeavesPopup(event)) return;\n event.preventDefault();\n this.close(false);\n this.interaction.moveFocusAfterTab(event.shiftKey);\n }\n\n private get resolvedAnchor(): HTMLElement | null {\n if (this.anchor) return this.anchor;\n if (this.anchorId) return document.getElementById(this.anchorId);\n return this.triggerElement;\n }\n\n private get usesInternalTrigger(): boolean {\n return !this.embedded && !this.anchor && !this.anchorId;\n }\n\n private get viewportPad(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n }\n\n private get popupFallbackWidth(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthLg, TOKEN_DEFAULTS.menuWidthLg);\n }\n\n private get popupFallbackHeight(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private setupListeners() {\n this.interaction.connect();\n this.position.observe();\n }\n\n private teardownListeners() {\n this.tasks.cancel();\n this.position.unobserve();\n this.interaction.disconnect();\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private close(restoreFocus = true) {\n this.captureClosingSnapshot();\n if (restoreFocus) this.interaction.focusAnchor();\n this.dsOpenChange.emit(false);\n this.dsClose.emit();\n this.open = false;\n this.onOpenChange(false);\n }\n\n private toggleFromTrigger(event: MouseEvent) {\n if (this.open) {\n this.close();\n return;\n }\n this.pendingInitialFocusVisible = event.detail === 0;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private handleTriggerKeyDown(event: KeyboardEvent) {\n if (event.key !== 'ArrowDown' || this.open) return;\n event.preventDefault();\n this.pendingInitialFocusVisible = true;\n this.open = true;\n this.dsOpenChange.emit(true);\n this.onOpenChange(true);\n }\n\n private finishClose() {\n if (this.open || !this.closing || !this.el.isConnected) return;\n const popup = this.el.querySelector<HTMLElement>('.filter-menu-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.closingSnapshot = null;\n this.closeTimer = null;\n this.dateModeByFilter = {};\n this.optionQueryByFilter = {};\n this.dsAfterClose.emit();\n }\n\n private captureClosingSnapshot() {\n if (this.closingSnapshot) return;\n this.closingSnapshot = {\n filters: this.filters.map(filter => ({\n ...filter,\n options: filter.options?.map(option => ({ ...option })),\n })),\n values: Object.fromEntries(\n Object.entries(this.values).map(([key, value]) => [\n key,\n Array.isArray(value) ? [...value] : value,\n ])\n ),\n matchModes: { ...this.matchModes },\n activeFilterId: this.activeFilterId,\n };\n }\n\n private focusInitialCategory() {\n this.tasks.frame(() => {\n this.el.querySelector<HTMLElement>('.filter-menu__category[tabindex=\"0\"]')?.focus();\n this.pendingInitialFocusVisible = false;\n });\n }\n\n private tabLeavesPopup(event: KeyboardEvent): boolean {\n return this.interaction.tabLeavesPopup(event);\n }\n\n private selectedFilter(filters: FilterMenuFilter[], activeFilterId: string | undefined) {\n return filters.find(filter => filter.id === activeFilterId) ?? filters[0];\n }\n\n private selectedCount(filter: FilterMenuFilter, values: FilterMenuValues): number {\n const value = values[filter.id];\n if (filter.kind === 'multiple') return Array.isArray(value) ? value.length : 0;\n if (filter.kind === 'boolean') return value === true ? 1 : 0;\n return typeof value === 'string' && value.length > 0 ? 1 : 0;\n }\n\n private totalSelected(filters: FilterMenuFilter[], values: FilterMenuValues): number {\n return filters.reduce((total, filter) => total + this.selectedCount(filter, values), 0);\n }\n\n private activeFilterCount(filters: FilterMenuFilter[], values: FilterMenuValues): number {\n return filters.filter(filter => this.selectedCount(filter, values) > 0).length;\n }\n\n private selectCategory(filterId: string, focus = false) {\n this.activeOptionIndex = 0;\n this.dsActiveFilterChange.emit(filterId);\n if (!focus) return;\n this.tasks.frame(() => {\n this.el.querySelector<HTMLElement>(`[data-filter-category=\"${filterId}\"]`)?.focus();\n });\n }\n\n private handleCategoryKeyDown(\n event: KeyboardEvent,\n filters: FilterMenuFilter[],\n filterId: string\n ) {\n const currentIndex = filters.findIndex(filter => filter.id === filterId);\n let nextIndex: number;\n if (event.key === 'ArrowDown') nextIndex = (currentIndex + 1) % filters.length;\n else if (event.key === 'ArrowUp')\n nextIndex = (currentIndex - 1 + filters.length) % filters.length;\n else if (event.key === 'Home') nextIndex = 0;\n else if (event.key === 'End') nextIndex = filters.length - 1;\n else if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.tasks.frame(() => {\n this.el\n .querySelector<HTMLElement>(\n '.filter-menu__options [role=\"option\"], .filter-menu__options [data-date-option], .filter-menu__options input'\n )\n ?.focus();\n });\n return;\n } else return;\n\n event.preventDefault();\n this.focusRingVisible = true;\n this.selectCategory(filters[nextIndex].id, true);\n }\n\n private handlePanelKeyDown(event: KeyboardEvent, filterId: string) {\n if (event.key !== 'ArrowLeft') return;\n event.preventDefault();\n this.el.querySelector<HTMLElement>(`[data-filter-category=\"${filterId}\"]`)?.focus();\n }\n\n private handleOptionKeyDown(\n event: KeyboardEvent,\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n index: number,\n values: FilterMenuValues,\n visibleOptions: FilterMenuOption[] = filter.options ?? []\n ) {\n if (event.key === 'ArrowLeft') {\n this.handlePanelKeyDown(event, filter.id);\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.selectOption(filter, option, values);\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) return;\n event.preventDefault();\n const enabled = visibleOptions\n .map((candidate, optionIndex) => ({ candidate, optionIndex }))\n .filter(({ candidate }) => !candidate.isInactive)\n .map(({ optionIndex }) => optionIndex);\n if (!enabled.length) return;\n const current = enabled.indexOf(index);\n let next: number;\n if (event.key === 'Home') next = enabled[0];\n else if (event.key === 'End') next = enabled[enabled.length - 1];\n else {\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n const start = current >= 0 ? current : direction === 1 ? -1 : 0;\n next = enabled[(start + direction + enabled.length) % enabled.length];\n }\n this.activeOptionIndex = next;\n this.focusRingVisible = true;\n this.tasks.frame(() => {\n this.el\n .querySelector<HTMLElement>(`#${this.generatedId}-${filter.id}-option-${next}`)\n ?.focus();\n });\n }\n\n private optionMatchesQuery(option: FilterMenuOption, query: string): boolean {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return true;\n return `${option.label} ${option.description ?? ''}`.toLocaleLowerCase().includes(normalized);\n }\n\n private visibleOptions(\n filter: FilterMenuFilter,\n query = this.optionQueryByFilter[filter.id] ?? ''\n ) {\n if (filter.kind === 'boolean') {\n const option = this.booleanOption(filter);\n return this.optionMatchesQuery(option, query) ? [option] : [];\n }\n return (filter.options ?? []).filter(option => this.optionMatchesQuery(option, query));\n }\n\n private booleanOption(filter: FilterMenuFilter): FilterMenuOption {\n return {\n label: filter.fieldLabel ?? filter.label,\n value: 'true',\n description: filter.description,\n };\n }\n\n private setOptionQuery(filter: FilterMenuFilter, value: string) {\n const visibleOptions = this.visibleOptions(filter, value);\n const firstEnabled = visibleOptions.findIndex(option => !option.isInactive);\n this.activeOptionIndex = firstEnabled;\n this.focusRingVisible = false;\n this.optionQueryByFilter = { ...this.optionQueryByFilter, [filter.id]: value };\n this.tasks.frame(() => {\n const content = this.el.querySelector<HTMLElement>('.filter-menu__options-content');\n if (content) content.scrollTop = 0;\n this.position.schedule();\n });\n }\n\n private handleOptionSearchKeyDown(event: KeyboardEvent, filter: FilterMenuFilter) {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n const visibleOptions = this.visibleOptions(filter);\n const enabled = visibleOptions\n .map((option, index) => ({ option, index }))\n .filter(({ option }) => !option.isInactive)\n .map(({ index }) => index);\n if (!enabled.length) return;\n event.preventDefault();\n const next = event.key === 'ArrowDown' ? enabled[0] : enabled[enabled.length - 1];\n this.activeOptionIndex = next;\n this.focusRingVisible = true;\n this.tasks.frame(() => {\n this.el\n .querySelector<HTMLElement>(`#${this.generatedId}-${filter.id}-option-${next}`)\n ?.focus();\n });\n }\n\n private toggleMultiple(\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n checked: boolean,\n values: FilterMenuValues\n ) {\n if (option.isInactive) return;\n const current = Array.isArray(values[filter.id]) ? (values[filter.id] as string[]) : [];\n const selected = new Set(current);\n if (checked) selected.add(option.value);\n else selected.delete(option.value);\n const ordered = (filter.options ?? [])\n .map(candidate => candidate.value)\n .filter(value => selected.has(value));\n this.changeValue({ filterId: filter.id, value: ordered });\n }\n\n private selectOption(\n filter: FilterMenuFilter,\n option: FilterMenuOption,\n values: FilterMenuValues\n ) {\n if (option.isInactive) return;\n if (filter.kind === 'single') {\n this.changeValue({ filterId: filter.id, value: option.value });\n return;\n }\n const selected = Array.isArray(values[filter.id])\n ? (values[filter.id] as string[]).includes(option.value)\n : false;\n this.toggleMultiple(filter, option, !selected, values);\n }\n\n private dateMode(filterId: string, value: FilterMenuValue | undefined): FilterMenuDateMode {\n return this.dateModeByFilter[filterId] ?? parseDateFilterValue(value)?.kind ?? 'relative';\n }\n\n private setDateMode(filter: FilterMenuFilter, mode: string) {\n if (mode !== 'range' && mode !== 'relative') return;\n this.dateModeByFilter = { ...this.dateModeByFilter, [filter.id]: mode };\n this.activeOptionIndex = 0;\n }\n\n private renderRelativeDateOptions(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n const relativeFilter: FilterMenuFilter = {\n ...filter,\n kind: 'single',\n options: RELATIVE_DATE_OPTIONS,\n };\n return (\n <div\n class=\"filter-menu__date-relative ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"listbox\"\n aria-label=\"Relative date\"\n >\n {RELATIVE_DATE_OPTIONS.map((option, index) => (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-relative-${index}`}\n option={option}\n selected={value === option.value}\n active={index === this.activeOptionIndex}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={false}\n tabIndex={index === this.activeOptionIndex ? 0 : -1}\n onFocus={() => {\n this.activeOptionIndex = index;\n }}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleOptionKeyDown(event, relativeFilter, option, index, {\n [filter.id]: value,\n })\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeOptionIndex = index;\n }}\n onSelect={() => this.changeValue({ filterId: filter.id, value: option.value })}\n />\n ))}\n </div>\n );\n }\n\n private renderDateCalendar(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n return (\n <ds-calendar\n selectionMode=\"range\"\n value={typeof value === 'string' ? value : ''}\n onDsChange={(event: CustomEvent<string>) => {\n event.stopPropagation();\n this.changeValue({ filterId: filter.id, value: event.detail });\n }}\n />\n );\n }\n\n private renderDateFilter(filter: FilterMenuFilter, value: FilterMenuValue | undefined) {\n const mode = this.dateMode(filter.id, value);\n return (\n <div class=\"filter-menu__date\">\n <header class=\"filter-menu__date-header ds-chrome-header ds-chrome-header--bounded\">\n <ds-tab-group\n ariaLabel=\"Date filter mode\"\n size=\"md\"\n width=\"fill\"\n hasContainer={false}\n value={mode}\n tabs={DATE_MODE_TABS}\n onDsChange={(event: CustomEvent<string>) => {\n event.stopPropagation();\n this.setDateMode(filter, event.detail);\n }}\n />\n </header>\n <div class=\"filter-menu__date-body\">\n {mode === 'relative'\n ? this.renderRelativeDateOptions(filter, value)\n : this.renderDateCalendar(filter, value)}\n </div>\n </div>\n );\n }\n\n private renderOptionSearch(filter: FilterMenuFilter) {\n return (\n <div class=\"filter-menu__option-search\">\n <ChoiceSearch\n size=\"md\"\n hasFocusBoundary={false}\n hasInteractionFill={false}\n value={this.optionQueryByFilter[filter.id] ?? ''}\n placeholder={this.searchPlaceholder}\n ariaLabel={`Search ${filter.label} options`}\n controls={`${this.generatedId}-${filter.id}-options`}\n inputRef={() => undefined}\n clearLabel={`Clear ${filter.label} search`}\n onValueChange={value => this.setOptionQuery(filter, value)}\n onKeyDown={(event: KeyboardEvent) => this.handleOptionSearchKeyDown(event, filter)}\n />\n </div>\n );\n }\n\n private renderNoOptionResults() {\n return (\n <div\n class=\"ds-choice-empty ds-empty-region\"\n role=\"option\"\n aria-selected=\"false\"\n aria-disabled=\"true\"\n aria-label={this.noResultsText}\n aria-live=\"polite\"\n >\n <ds-empty-state body={this.noResultsText} />\n </div>\n );\n }\n\n private renderOptions(filter: FilterMenuFilter, values: FilterMenuValues) {\n const value = values[filter.id];\n if (filter.kind === 'multiple' || filter.kind === 'single') {\n const selected = Array.isArray(value) ? value : [];\n const allOptions = filter.options ?? [];\n const options = this.visibleOptions(filter);\n const usesSubtext = choiceListUsesSubtext(\n allOptions.map(option => ({\n label: option.label,\n value: option.value,\n subtext: option.description,\n }))\n );\n if (!options.length) return this.renderNoOptionResults();\n return options.map((option, index) => {\n const isSelected =\n filter.kind === 'multiple' ? selected.includes(option.value) : value === option.value;\n return (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-option-${index}`}\n option={{\n label: option.label,\n value: option.value,\n subtext: option.description,\n isInactive: option.isInactive,\n }}\n selected={isSelected}\n active={index === this.activeOptionIndex}\n focusRingVisible={this.focusRingVisible}\n usesSubtext={usesSubtext}\n tabIndex={index === this.activeOptionIndex ? 0 : -1}\n leading={\n filter.kind === 'multiple' ? (\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox label=\"\" size=\"md\" checked={isSelected} presentation />\n </span>\n ) : undefined\n }\n onFocus={() => {\n this.activeOptionIndex = index;\n }}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleOptionKeyDown(event, filter, option, index, values, options)\n }\n onHover={() => {\n this.focusRingVisible = false;\n this.activeOptionIndex = index;\n }}\n onSelect={() => this.selectOption(filter, option, values)}\n />\n );\n });\n }\n\n if (filter.kind === 'boolean') {\n const [option] = this.visibleOptions(filter);\n if (!option) return this.renderNoOptionResults();\n return (\n <ChoiceOptionRow\n size=\"md\"\n id={`${this.generatedId}-${filter.id}-option-0`}\n option={{\n label: option.label,\n value: option.value,\n subtext: option.description,\n }}\n selected={value === true}\n active\n focusRingVisible={this.focusRingVisible}\n usesSubtext={Boolean(option.description)}\n tabIndex={0}\n leading={\n <span\n class=\"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-checkbox label=\"\" size=\"md\" checked={value === true} presentation />\n </span>\n }\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') this.handlePanelKeyDown(event, filter.id);\n else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.changeValue({ filterId: filter.id, value: value !== true });\n }\n }}\n onHover={() => {\n this.focusRingVisible = false;\n }}\n onSelect={() => this.changeValue({ filterId: filter.id, value: value !== true })}\n />\n );\n }\n\n return this.renderDateFilter(filter, value);\n }\n\n private get captionIconOnly(): boolean {\n return (\n this.collapseLabel && this.captionCompact && this.usesInternalTrigger && Boolean(this.icon)\n );\n }\n\n private syncCaptionCompactObserver(): void {\n this.disconnectCaptionCompactObserver();\n if (!this.el.isConnected) return;\n if (!this.collapseLabel) {\n if (this.captionCompact) this.captionCompact = false;\n return;\n }\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n if (this.captionCompact !== compact) this.captionCompact = compact;\n });\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n private renderCaptionTooltip(trigger: VNode, label: string): VNode {\n if (!this.collapseLabel) return trigger;\n return (\n <ds-tooltip label={label} side=\"top\" size=\"sm\">\n {trigger}\n </ds-tooltip>\n );\n }\n\n private renderFooter(totalSelected: number, categoriesClear: boolean) {\n const appliedCount = this.totalSelected(this.filters, this.values);\n if (this.applyRequired && totalSelected === 0 && appliedCount === 0) return null;\n return (\n <div\n class={{\n 'filter-menu__footer': true,\n 'filter-menu__footer--categories-clear': categoriesClear,\n 'ds-choice-footer': true,\n }}\n aria-hidden={\n !this.applyRequired &&\n categoriesClear &&\n totalSelected === 0 &&\n !this.draftValues &&\n !this.draftModes\n ? 'true'\n : undefined\n }\n >\n <div class=\"ds-choice-footer__content ds-control--md\">\n {!categoriesClear ? (\n <ds-text\n class=\"ds-choice-footer__summary\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n aria-live=\"polite\"\n >\n {totalSelected} selected\n </ds-text>\n ) : null}\n {this.applyRequired ? (\n <button\n class=\"filter-menu__apply ds-choice-footer__clear ds-text-action\"\n type=\"button\"\n disabled={!this.hasPendingChanges}\n onClick={() => this.applyDraft()}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n Apply\n </ds-text>\n </button>\n ) : null}\n {this.applyRequired && (totalSelected > 0 || appliedCount > 0) ? (\n <ds-text\n class=\"filter-menu__action-separator\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"tertiary\"\n aria-hidden=\"true\"\n >\n ·\n </ds-text>\n ) : null}\n {totalSelected > 0 || (this.applyRequired && appliedCount > 0) ? (\n <button\n class=\"filter-menu__clear ds-choice-footer__clear ds-text-action\"\n type=\"button\"\n onClick={() => {\n if (this.applyRequired) {\n this.draftValues = {};\n this.draftModes = {};\n }\n this.dsClear.emit();\n }}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.clearLabel}\n </ds-text>\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n private renderMatchModeFooter(filter: FilterMenuFilter, matchModes: FilterMenuMatchModes) {\n const mode: FilterMenuMatchMode = matchModes[filter.id] === 'all' ? 'all' : 'any';\n const nextMode: FilterMenuMatchMode = mode === 'any' ? 'all' : 'any';\n return (\n <div class=\"filter-menu__match-mode-footer ds-choice-footer\">\n <div class=\"filter-menu__match-mode-content ds-choice-footer__content ds-control--md\">\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n Limit results to\n </ds-text>\n <button\n class=\"filter-menu__match-mode-toggle ds-text-action ds-focus-ring\"\n type=\"button\"\n aria-label={`Limit ${filter.label} results to ${nextMode} selected`}\n onClick={() => this.changeMode({ filterId: filter.id, mode: nextMode })}\n onKeyDown={(event: KeyboardEvent) => this.handlePanelKeyDown(event, filter.id)}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {mode}\n </ds-text>\n </button>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\">\n selected\n </ds-text>\n </div>\n </div>\n );\n }\n\n render() {\n if (this.vertical)\n return (\n <Host class=\"filter-menu-vertical\">\n {this.filters.map(filter => (\n <details open key={filter.id} class=\"filter-menu-vertical__section\">\n <summary>\n <ds-icon class=\"filter-menu-vertical__chevron\" name=\"ChevronDown\" size=\"md\" />\n <ds-text variant=\"text-body-medium\" emphasis>\n {filter.label}\n </ds-text>\n </summary>\n {filter.kind !== 'date' && this.renderOptionSearch(filter)}\n <div\n id={`${this.generatedId}-${filter.id}-options`}\n role={filter.kind === 'date' ? undefined : 'listbox'}\n aria-label={filter.label}\n aria-multiselectable={filter.kind === 'multiple' ? 'true' : undefined}\n class=\"ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n >\n {this.renderOptions(filter, this.values)}\n </div>\n {filter.kind === 'multiple' && this.renderMatchModeFooter(filter, this.matchModes)}\n </details>\n ))}\n </Host>\n );\n const state =\n this.closing && this.closingSnapshot\n ? this.closingSnapshot\n : {\n filters: this.filters,\n values: this.draftValues ?? this.values,\n matchModes: this.draftModes ?? this.matchModes,\n activeFilterId: this.activeFilterId,\n };\n const activeFilter = this.selectedFilter(state.filters, state.activeFilterId);\n const totalSelected = this.totalSelected(state.filters, state.values);\n const activeFilterCount = this.activeFilterCount(state.filters, state.values);\n const hasActiveFilters = activeFilterCount > 0;\n const categoriesClearFooter = this.footerLayout === 'categories-clear';\n const label = `${this.triggerLabel}${\n this.showSelectedCount && hasActiveFilters ? ` · ${activeFilterCount}` : ''\n }`;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const popupId = `${this.generatedId}-popup`;\n const popupStyle: Record<string, string> = {\n position: 'fixed',\n left: '0',\n top: '0',\n width: this.menuWidth,\n transform: `translate(${Math.round(this.pos.x)}px, ${Math.round(this.pos.y)}px)`,\n zIndex: '9998',\n visibility: this.positionReady ? 'visible' : 'hidden',\n };\n\n return (\n <Host\n class={{\n 'filter-menu-host': true,\n 'filter-menu-host--external-trigger': !this.usesInternalTrigger,\n 'ds-select-trigger-host': this.usesInternalTrigger,\n [`ds-control--${this.size}`]: true,\n 'ds-table-caption-control': this.collapseLabel,\n 'ds-table-caption-control--compact': this.captionIconOnly,\n ...controlWidthClass(this.width),\n }}\n >\n {this.usesInternalTrigger\n ? this.renderCaptionTooltip(\n <button\n ref={element => {\n this.triggerElement = (element as HTMLButtonElement) ?? null;\n }}\n id={this.inputId ?? `${this.generatedId}-trigger`}\n type=\"button\"\n class={{\n trigger: true,\n 'ds-control-frame': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': this.activeFill && hasActiveFilters,\n 'trigger--expanded': this.open || this.closing,\n 'ds-interaction-fill--surface-open': this.open || this.closing,\n 'trigger--bordered': this.hasBorder,\n 'trigger--has-value': hasActiveFilters && !this.neutralTrigger,\n [`ds-control--${this.size}`]: true,\n }}\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n aria-expanded={String(this.open)}\n aria-controls={this.open ? popupId : undefined}\n aria-label={this.ariaLabel ?? this.menuLabel}\n onClick={(event: MouseEvent) => this.toggleFromTrigger(event)}\n onKeyDown={(event: KeyboardEvent) => this.handleTriggerKeyDown(event)}\n >\n {this.icon ? (\n <span\n class=\"trigger__prefix ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n </span>\n ) : null}\n {this.captionIconOnly ? null : (\n <ds-text\n class=\"trigger__label-box trigger__label trigger__label-content ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant={textVariant}\n color=\"inherit\"\n lineTruncation={1}\n >\n {label}\n </ds-text>\n )}\n {this.captionIconOnly || !this.showIndicator ? null : (\n <span\n class=\"trigger__chevron ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name=\"ChevronDown\" size={iconSize} color=\"inherit\" />\n </span>\n )}\n </button>,\n this.captionIconOnly ? label : ''\n )\n : null}\n\n {this.shouldRender || this.embedded ? (\n <div\n id={popupId}\n popover={this.embedded ? undefined : 'manual'}\n class={{\n 'filter-menu-popup': true,\n 'ds-choice-popup': !this.embedded,\n 'data-preferences-embedded': this.embedded,\n 'ds-choice-popup--closing': this.closing,\n }}\n style={this.embedded ? undefined : popupStyle}\n role=\"dialog\"\n aria-label={this.menuLabel}\n >\n {activeFilter ? (\n <div class=\"filter-menu\">\n <div class=\"filter-menu__body\">\n <div class=\"filter-menu__category-pane\">\n <div\n class=\"filter-menu__categories ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"tablist\"\n aria-label={this.categoriesLabel}\n aria-orientation=\"vertical\"\n >\n {state.filters.map(filter => {\n const active = filter.id === activeFilter.id;\n const count = this.selectedCount(filter, state.values);\n return (\n <div\n key={filter.id}\n class={{\n 'filter-menu__category-section': true,\n 'ds-choice-section--divided': Boolean(filter.divider),\n }}\n >\n <button\n id={`${this.generatedId}-${filter.id}-tab`}\n type=\"button\"\n role=\"tab\"\n data-filter-category={filter.id}\n class={{\n 'filter-menu__category': true,\n 'filter-menu__category--active': active,\n 'ds-choice-item': true,\n 'ds-control-frame': true,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-focus-ring--visible': active && this.focusRingVisible,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': active,\n }}\n aria-selected={String(active)}\n aria-controls={`${this.generatedId}-panel`}\n tabIndex={active ? 0 : -1}\n onMouseDown={() => {\n this.focusRingVisible = false;\n }}\n onClick={() => this.selectCategory(filter.id)}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleCategoryKeyDown(event, state.filters, filter.id)\n }\n >\n <ds-text\n class=\"ds-choice-item__content ds-choice-item__label ds-control-label-box ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={active ? 'primary' : 'secondary'}\n >\n {filter.label}\n </ds-text>\n {count > 0 && filter.kind === 'date' ? (\n <span\n class=\"filter-menu__category-dot-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-badge variant=\"dot\" hasRing={false} label=\"\" />\n </span>\n ) : count > 0 ? (\n <ds-tag\n class=\"ds-choice-item__tag ds-interaction-fill__content\"\n label={String(count)}\n size=\"sm\"\n intent=\"brand\"\n contrast=\"bold\"\n isInset\n rounded\n />\n ) : null}\n </button>\n </div>\n );\n })}\n </div>\n {categoriesClearFooter ? this.renderFooter(totalSelected, true) : null}\n </div>\n\n <div\n id={`${this.generatedId}-panel`}\n class={{\n 'filter-menu__options': true,\n 'filter-menu__options--date': activeFilter.kind === 'date',\n }}\n role=\"tabpanel\"\n aria-labelledby={`${this.generatedId}-${activeFilter.id}-tab`}\n >\n {activeFilter.kind === 'date' ? null : this.renderOptionSearch(activeFilter)}\n <div class=\"filter-menu__options-content\">\n {activeFilter.kind === 'date' ? (\n <div key={activeFilter.id} class=\"filter-menu__option-list--date\">\n {this.renderOptions(activeFilter, state.values)}\n </div>\n ) : (\n <div\n id={`${this.generatedId}-${activeFilter.id}-options`}\n key={activeFilter.id}\n class=\"filter-menu__option-list ds-choice-list ds-chrome-column ds-chrome-space--sm\"\n role=\"listbox\"\n aria-label={activeFilter.label}\n aria-multiselectable={\n activeFilter.kind === 'multiple' ? 'true' : undefined\n }\n >\n {this.renderOptions(activeFilter, state.values)}\n </div>\n )}\n </div>\n {activeFilter.kind === 'multiple'\n ? this.renderMatchModeFooter(activeFilter, state.matchModes)\n : null}\n </div>\n </div>\n\n {!categoriesClearFooter && totalSelected > 0\n ? this.renderFooter(totalSelected, false)\n : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{p as s,H as e,c as t,h as i,a as o,t as l}from"./index.js";import{o as a,a as r,r as n,b as h,d}from"./p-CA3iQ1ME.js";import{i as c,r as m,a as u}from"./p-CgGcgMjs.js";import{d as b}from"./p-CwdRaJER.js";import{d as p}from"./p-D-J7GgjY.js";import{d as f}from"./p-D_iZPukF.js";import{d as g}from"./p-pPtjNRqC.js";import{d as v}from"./p-0XTyQNRG.js";import{d as k}from"./p-t2Ebn8si.js";import{d as w}from"./p-D9_iDlkT.js";import{d as _}from"./p-C5BBIDVm.js";import{d as y}from"./p-C_9VGgPf.js";import{d as E}from"./p-B9y6azEw.js";import{d as j}from"./p-Bf-BphXP.js";import{d as C}from"./p-7MwoWtTJ.js";import{d as x}from"./p-d76Ry5nh.js";import{d as D}from"./p-D8OWhnID.js";import{d as T}from"./p-DvGrsLgt.js";const L=()=>`:host{display:block;min-width:0;min-height:0;height:100%;background:transparent}:host([responsive-mode='mobile']){width:100%;background:var(--color-background-primary)}.shell-tools__desktop,.shell-tools__desktop ds-panel-tools,.shell-tools__mobile{display:block;min-width:0;min-height:0;height:100%}.shell-tools__slot-proxy{display:block;width:100%;height:100%;min-width:0;min-height:0}.shell-tools__mobile{display:grid;grid-template-rows:auto minmax(0, 1fr);background:var(--color-background-primary)}.shell-tools__mobile-header{grid-row:1}.shell-tools__mobile-body,.shell-tools__view{min-width:0;min-height:0;height:100%}.shell-tools__mobile-body{grid-row:2;overflow:hidden}.shell-tools__view{overflow:auto;overscroll-behavior:contain}.shell-tools__view[hidden]{display:none}.shell-tools__view ::slotted(*){min-height:0}`;const A=s(class s extends e{constructor(s){super();if(s!==false){this.__registerHost()}this.__attachShadow();this.dsToolChange=t(this,"dsToolChange",7);this.dsPresentationChange=t(this,"dsPresentationChange",7);this.dsHeaderBack=t(this,"dsHeaderBack",7);this.dsHeaderAction=t(this,"dsHeaderAction",7);this.dsRailAccessoryAction=t(this,"dsRailAccessoryAction",7);this.responsiveMode="desktop";this.open=false;this.activeTool="";this.presentation="drawer";this.fullscreenHeaderMode="shared";this.items=[];this.accessories=[];this.headers={};this.storageKey="";this.toolsLabel="Tools";this.toolShortcutsLabel="Tool shortcuts";this.inboxLabel="Inbox";this.inboxNavigationLabel="Inbox sections";this.panelToolsEl=null;this.selectInboxTool=s=>{const e=s.detail;if(!this.availableInboxTools.includes(e)||e===this.mobileActiveTool)return;this.open=true;this.activeTool=e;this.dsToolChange.emit({id:e,selected:true})};this.handlePanelToolChange=s=>{this.activeTool=s.detail.id;this.open=s.detail.selected};this.handlePanelPresentationChange=s=>{this.presentation=s.detail.presentation};this.handlePanelRailAccessoryAction=s=>{s.stopPropagation();this.dsRailAccessoryAction.emit(s.detail)};this.handleMobileHeaderAction=(s,e,t)=>{t.stopPropagation();this.dsHeaderAction.emit({tool:s,id:e})}}presentationChanged(s,e){if(s===e)return;if(this.panelToolsEl&&this.panelToolsEl.getAttribute("presentation")!==s){this.panelToolsEl.setAttribute("presentation",s)}}get resolvedItems(){return this.items??[]}get availableInboxTools(){return this.resolvedItems.filter((s=>!s.isInactive&&c(s))).map((s=>s.id))}get mobileViewOrder(){return a(this.resolvedItems).map((s=>s.id))}toolLabel(s){const e=this.resolvedItems.find((e=>e.id===s));return e?.label??e?.ariaLabel??r[s]??s}get mobileActiveTool(){const s=this.resolvedItems.find((s=>s.id===this.activeTool));const e=s?c(s):u(this.activeTool);if(!e)return this.activeTool;return m(this.activeTool,this.availableInboxTools)}componentWillLoad(){this.reconcileAvailability()}handleItemsChange(){this.reconcileAvailability()}reconcileAvailability(){const s=n(this.resolvedItems,this.open,this.activeTool);this.open=s.open;this.activeTool=s.activeTool}resolvedHeaders(){return this.headers??{}}activeHeader(s){return this.resolvedHeaders()[s]??{}}activateMobileTool(s){const e=this.resolvedItems.find((e=>e.id===s));if(!e||e.isInactive)return;const t=h(this.open,this.activeTool,s);this.open=t.open;this.activeTool=t.activeTool;this.dsToolChange.emit({id:s,selected:t.selected})}async activateTool(s){if(this.responsiveMode!=="mobile"){await(this.panelToolsEl?.activateTool(s));return}this.activateMobileTool(s)}async closeDrawer(){if(this.responsiveMode!=="mobile"){await(this.panelToolsEl?.closeDrawer());return}if(!this.open)return;const s=this.activeTool;this.open=false;if(s)this.dsToolChange.emit({id:s,selected:false})}async focusHeaderAction(s){if(this.responsiveMode!=="mobile"){await(this.panelToolsEl?.focusHeaderAction(s));return}const e=(this.el.shadowRoot??this.el).querySelector(`[data-header-action-id="${CSS.escape(s)}"]`);await(e?.setFocus?.())}renderForwardedSlots(){return this.mobileViewOrder.flatMap((s=>[i("div",{key:`tool:${s}`,class:"shell-tools__slot-proxy",slot:s},i("slot",{name:s})),i("div",{key:`tool-view:${s}`,class:"shell-tools__slot-proxy",slot:`${s}-view`},i("slot",{name:`${s}-view`}))]))}renderDesktop(){return i("div",{class:"shell-tools__desktop"},i("ds-panel-tools",{open:this.open,activeTool:this.activeTool,presentation:this.presentation,fullscreenHeaderMode:this.fullscreenHeaderMode,items:this.resolvedItems,accessories:this.accessories??[],headers:this.resolvedHeaders(),storageKey:this.storageKey,toolsLabel:this.toolsLabel,toolShortcutsLabel:this.toolShortcutsLabel,ref:s=>{this.panelToolsEl=s},onDsToolChange:this.handlePanelToolChange,onDsPresentationChange:this.handlePanelPresentationChange,onDsRailAccessoryAction:this.handlePanelRailAccessoryAction},this.renderForwardedSlots()))}renderMobileHeader(s){const e=this.activeHeader(s);const t=e.title?.trim();const o=t||this.toolLabel(s);const l=(e.actions??[]).filter((s=>s.id!=="fullscreen"));const a=this.resolvedItems.find((e=>e.id===s));const r=Boolean(a&&c(a)&&!e.showBack);const n=r?this.availableInboxTools.map((s=>{const e=this.resolvedItems.find((e=>e.id===s));return{id:s,label:this.toolLabel(s),variant:"label",dot:e?.dot}})):[];return i("ds-mobile-header",{class:"shell-tools__mobile-header",heading:o,headingLevel:"h2",sections:n,value:s,sectionsAriaLabel:this.inboxNavigationLabel,sectionsPresentation:r?"segmented":"switcher",sectionsSize:"lg",onDsSectionChange:this.selectInboxTool},e.showBack?i("ds-tooltip",{slot:"leading",label:e.backAriaLabel||"Back",side:"bottom",size:"sm"},i("ds-button-unfilled",{variant:"icon",icon:e.backIcon||"ChevronLeft",size:"md","aria-label":e.backAriaLabel||"Back",activeFill:false,hasBorder:false,onDsClick:()=>this.dsHeaderBack.emit({tool:s})})):null,l.map((e=>i("ds-tooltip",{slot:"trailing",key:e.id,label:e.ariaLabel,side:"bottom",size:"sm"},i("ds-button-unfilled",{id:e.triggerId||undefined,"data-header-action-id":e.id,variant:"icon",icon:e.icon,size:"md","aria-label":e.ariaLabel,haspopup:e.haspopup,controls:e.controls,expanded:e.expanded,surfaceOpen:e.surfaceOpen,pressed:e.pressed,isInactive:e.isInactive,activeFill:false,hasBorder:false,onDsClick:t=>this.handleMobileHeaderAction(s,e.id,t)})))))}renderMobile(){const s=this.mobileActiveTool;return i("div",{class:"shell-tools__mobile","aria-hidden":this.open&&s?undefined:"true",inert:this.open&&s?undefined:true},s?this.renderMobileHeader(s):null,i("div",{class:"shell-tools__mobile-body"},this.mobileViewOrder.map((e=>{const t=this.open&&e===s;return i("div",{key:`mobile-tool-view:${e}`,class:{"shell-tools__view":true,"shell-tools__view--active":t},hidden:!t,"aria-hidden":t?undefined:"true",inert:t?undefined:true},i("slot",{name:`${e}-view`},i("slot",{name:e})))}))))}render(){const s=this.responsiveMode==="mobile";return i(o,{key:"2d37a27c84f573363751de4aed6c9bf468fb2a8c",role:s?this.presentation==="fullscreen"?"dialog":"complementary":undefined,"aria-modal":s&&this.presentation==="fullscreen"?"true":undefined,"aria-label":s?this.toolsLabel:undefined},s?this.renderMobile():this.renderDesktop())}get el(){return this}static get watchers(){return{presentation:[{presentationChanged:0}],items:[{handleItemsChange:0}]}}static get style(){return L()}},[257,"ds-shell-tools",{responsiveMode:[513,"responsive-mode"],open:[1540],activeTool:[1537,"active-tool"],presentation:[1537],fullscreenHeaderMode:[513,"fullscreen-header-mode"],items:[16],accessories:[16],headers:[16],storageKey:[1,"storage-key"],toolsLabel:[1,"tools-label"],toolShortcutsLabel:[1,"tool-shortcuts-label"],inboxLabel:[1,"inbox-label"],inboxNavigationLabel:[1,"inbox-navigation-label"],activateTool:[64],closeDrawer:[64],focusHeaderAction:[64]},undefined,{presentation:[{presentationChanged:0}],items:[{handleItemsChange:0}]}]);function B(){if(typeof customElements==="undefined"){return}const s=["ds-shell-tools","ds-badge","ds-button-unfilled","ds-divider","ds-icon","ds-loader","ds-menu","ds-mobile-header","ds-mobile-section-switcher","ds-panel-tool-header","ds-panel-tools","ds-swatch-picker","ds-switch","ds-tab-group","ds-tag","ds-text","ds-tooltip"];s.forEach((s=>{switch(s){case"ds-shell-tools":if(!customElements.get(l(s))){customElements.define(l(s),A)}break;case"ds-badge":if(!customElements.get(l(s))){b()}break;case"ds-button-unfilled":if(!customElements.get(l(s))){p()}break;case"ds-divider":if(!customElements.get(l(s))){f()}break;case"ds-icon":if(!customElements.get(l(s))){g()}break;case"ds-loader":if(!customElements.get(l(s))){v()}break;case"ds-menu":if(!customElements.get(l(s))){k()}break;case"ds-mobile-header":if(!customElements.get(l(s))){w()}break;case"ds-mobile-section-switcher":if(!customElements.get(l(s))){_()}break;case"ds-panel-tool-header":if(!customElements.get(l(s))){y()}break;case"ds-panel-tools":if(!customElements.get(l(s))){d()}break;case"ds-swatch-picker":if(!customElements.get(l(s))){E()}break;case"ds-switch":if(!customElements.get(l(s))){j()}break;case"ds-tab-group":if(!customElements.get(l(s))){C()}break;case"ds-tag":if(!customElements.get(l(s))){x()}break;case"ds-text":if(!customElements.get(l(s))){D()}break;case"ds-tooltip":if(!customElements.get(l(s))){T()}break}}))}B();export{A as S,B as d};
2
- //# sourceMappingURL=p-rmPIcWED.js.map
1
+ import{p as s,H as e,c as t,h as i,a as o,t as l}from"./index.js";import{o as a,a as r,r as n,b as h,d}from"./p-DcxY_pdJ.js";import{i as c,r as m,a as u}from"./p-CgGcgMjs.js";import{d as p}from"./p-CwdRaJER.js";import{d as b}from"./p-BqipGGua.js";import{d as f}from"./p-D_iZPukF.js";import{d as g}from"./p-pPtjNRqC.js";import{d as v}from"./p-0XTyQNRG.js";import{d as k}from"./p-xMBaOeKa.js";import{d as w}from"./p-CUYLGe5d.js";import{d as _}from"./p-CIMyD_6H.js";import{d as y}from"./p-DP07JCed.js";import{d as C}from"./p-B9y6azEw.js";import{d as E}from"./p-Bf-BphXP.js";import{d as j}from"./p-7MwoWtTJ.js";import{d as x}from"./p-d76Ry5nh.js";import{d as D}from"./p-D8OWhnID.js";import{d as T}from"./p-DbW8S5qe.js";const L=()=>`:host{display:block;min-width:0;min-height:0;height:100%;background:transparent}:host([responsive-mode='mobile']){width:100%;background:var(--color-background-primary)}.shell-tools__desktop,.shell-tools__desktop ds-panel-tools,.shell-tools__mobile{display:block;min-width:0;min-height:0;height:100%}.shell-tools__slot-proxy{display:block;width:100%;height:100%;min-width:0;min-height:0}.shell-tools__mobile{display:grid;grid-template-rows:auto minmax(0, 1fr);background:var(--color-background-primary)}.shell-tools__mobile-header{grid-row:1}.shell-tools__mobile-body,.shell-tools__view{min-width:0;min-height:0;height:100%}.shell-tools__mobile-body{grid-row:2;overflow:hidden}.shell-tools__view{overflow:auto;overscroll-behavior:contain}.shell-tools__view[hidden]{display:none}.shell-tools__view ::slotted(*){min-height:0}`;const B=s(class s extends e{constructor(s){super();if(s!==false){this.__registerHost()}this.__attachShadow();this.dsToolChange=t(this,"dsToolChange",7);this.dsPresentationChange=t(this,"dsPresentationChange",7);this.dsHeaderBack=t(this,"dsHeaderBack",7);this.dsHeaderAction=t(this,"dsHeaderAction",7);this.dsRailAccessoryAction=t(this,"dsRailAccessoryAction",7);this.responsiveMode="desktop";this.open=false;this.activeTool="";this.presentation="drawer";this.fullscreenHeaderMode="shared";this.items=[];this.accessories=[];this.headers={};this.storageKey="";this.toolsLabel="Tools";this.toolShortcutsLabel="Tool shortcuts";this.inboxLabel="Inbox";this.inboxNavigationLabel="Inbox sections";this.panelToolsEl=null;this.selectInboxTool=s=>{const e=s.detail;if(!this.availableInboxTools.includes(e)||e===this.mobileActiveTool)return;this.open=true;this.activeTool=e;this.dsToolChange.emit({id:e,selected:true})};this.handlePanelToolChange=s=>{this.activeTool=s.detail.id;this.open=s.detail.selected};this.handlePanelPresentationChange=s=>{this.presentation=s.detail.presentation};this.handlePanelRailAccessoryAction=s=>{s.stopPropagation();this.dsRailAccessoryAction.emit(s.detail)};this.handleMobileHeaderAction=(s,e,t)=>{t.stopPropagation();this.dsHeaderAction.emit({tool:s,id:e})}}presentationChanged(s,e){if(s===e)return;if(this.panelToolsEl&&this.panelToolsEl.getAttribute("presentation")!==s){this.panelToolsEl.setAttribute("presentation",s)}}get resolvedItems(){return this.items??[]}get availableInboxTools(){return this.resolvedItems.filter((s=>!s.isInactive&&c(s))).map((s=>s.id))}get mobileViewOrder(){return a(this.resolvedItems).map((s=>s.id))}toolLabel(s){const e=this.resolvedItems.find((e=>e.id===s));return e?.label??e?.ariaLabel??r[s]??s}get mobileActiveTool(){const s=this.resolvedItems.find((s=>s.id===this.activeTool));const e=s?c(s):u(this.activeTool);if(!e)return this.activeTool;return m(this.activeTool,this.availableInboxTools)}componentWillLoad(){this.reconcileAvailability()}handleItemsChange(){this.reconcileAvailability()}reconcileAvailability(){const s=n(this.resolvedItems,this.open,this.activeTool);this.open=s.open;this.activeTool=s.activeTool}resolvedHeaders(){return this.headers??{}}activeHeader(s){return this.resolvedHeaders()[s]??{}}activateMobileTool(s){const e=this.resolvedItems.find((e=>e.id===s));if(!e||e.isInactive)return;const t=h(this.open,this.activeTool,s);this.open=t.open;this.activeTool=t.activeTool;this.dsToolChange.emit({id:s,selected:t.selected})}async activateTool(s){if(this.responsiveMode!=="mobile"){await(this.panelToolsEl?.activateTool(s));return}this.activateMobileTool(s)}async closeDrawer(){if(this.responsiveMode!=="mobile"){await(this.panelToolsEl?.closeDrawer());return}if(!this.open)return;const s=this.activeTool;this.open=false;if(s)this.dsToolChange.emit({id:s,selected:false})}async focusHeaderAction(s){if(this.responsiveMode!=="mobile"){await(this.panelToolsEl?.focusHeaderAction(s));return}const e=(this.el.shadowRoot??this.el).querySelector(`[data-header-action-id="${CSS.escape(s)}"]`);await(e?.setFocus?.())}renderForwardedSlots(){return this.mobileViewOrder.flatMap((s=>[i("div",{key:`tool:${s}`,class:"shell-tools__slot-proxy",slot:s},i("slot",{name:s})),i("div",{key:`tool-view:${s}`,class:"shell-tools__slot-proxy",slot:`${s}-view`},i("slot",{name:`${s}-view`}))]))}renderDesktop(){return i("div",{class:"shell-tools__desktop"},i("ds-panel-tools",{open:this.open,activeTool:this.activeTool,presentation:this.presentation,fullscreenHeaderMode:this.fullscreenHeaderMode,items:this.resolvedItems,accessories:this.accessories??[],headers:this.resolvedHeaders(),storageKey:this.storageKey,toolsLabel:this.toolsLabel,toolShortcutsLabel:this.toolShortcutsLabel,ref:s=>{this.panelToolsEl=s},onDsToolChange:this.handlePanelToolChange,onDsPresentationChange:this.handlePanelPresentationChange,onDsRailAccessoryAction:this.handlePanelRailAccessoryAction},this.renderForwardedSlots()))}renderMobileHeader(s){const e=this.activeHeader(s);const t=e.title?.trim();const o=t||this.toolLabel(s);const l=(e.actions??[]).filter((s=>s.id!=="fullscreen"));const a=this.resolvedItems.find((e=>e.id===s));const r=Boolean(a&&c(a)&&!e.showBack);const n=r?this.availableInboxTools.map((s=>{const e=this.resolvedItems.find((e=>e.id===s));return{id:s,label:this.toolLabel(s),variant:"label",dot:e?.dot}})):[];return i("ds-mobile-header",{class:"shell-tools__mobile-header",heading:o,headingLevel:"h2",sections:n,value:s,sectionsAriaLabel:this.inboxNavigationLabel,sectionsPresentation:r?"segmented":"switcher",sectionsSize:"lg",onDsSectionChange:this.selectInboxTool},e.showBack?i("ds-tooltip",{slot:"leading",label:e.backAriaLabel||"Back",side:"bottom",size:"sm"},i("ds-button-unfilled",{variant:"icon",icon:e.backIcon||"ChevronLeft",size:"md","aria-label":e.backAriaLabel||"Back",activeFill:false,hasBorder:false,onDsClick:()=>this.dsHeaderBack.emit({tool:s})})):null,l.map((e=>i("ds-tooltip",{slot:"trailing",key:e.id,label:e.ariaLabel,side:"bottom",size:"sm"},i("ds-button-unfilled",{id:e.triggerId||undefined,"data-header-action-id":e.id,variant:"icon",icon:e.icon,size:"md","aria-label":e.ariaLabel,haspopup:e.haspopup,controls:e.controls,expanded:e.expanded,surfaceOpen:e.surfaceOpen,pressed:e.pressed,isInactive:e.isInactive,activeFill:false,hasBorder:false,onDsClick:t=>this.handleMobileHeaderAction(s,e.id,t)})))))}renderMobile(){const s=this.mobileActiveTool;return i("div",{class:"shell-tools__mobile","aria-hidden":this.open&&s?undefined:"true",inert:this.open&&s?undefined:true},s?this.renderMobileHeader(s):null,i("div",{class:"shell-tools__mobile-body"},this.mobileViewOrder.map((e=>{const t=this.open&&e===s;return i("div",{key:`mobile-tool-view:${e}`,class:{"shell-tools__view":true,"shell-tools__view--active":t},hidden:!t,"aria-hidden":t?undefined:"true",inert:t?undefined:true},i("slot",{name:`${e}-view`},i("slot",{name:e})))}))))}render(){const s=this.responsiveMode==="mobile";return i(o,{key:"2d37a27c84f573363751de4aed6c9bf468fb2a8c",role:s?this.presentation==="fullscreen"?"dialog":"complementary":undefined,"aria-modal":s&&this.presentation==="fullscreen"?"true":undefined,"aria-label":s?this.toolsLabel:undefined},s?this.renderMobile():this.renderDesktop())}get el(){return this}static get watchers(){return{presentation:[{presentationChanged:0}],items:[{handleItemsChange:0}]}}static get style(){return L()}},[257,"ds-shell-tools",{responsiveMode:[513,"responsive-mode"],open:[1540],activeTool:[1537,"active-tool"],presentation:[1537],fullscreenHeaderMode:[513,"fullscreen-header-mode"],items:[16],accessories:[16],headers:[16],storageKey:[1,"storage-key"],toolsLabel:[1,"tools-label"],toolShortcutsLabel:[1,"tool-shortcuts-label"],inboxLabel:[1,"inbox-label"],inboxNavigationLabel:[1,"inbox-navigation-label"],activateTool:[64],closeDrawer:[64],focusHeaderAction:[64]},undefined,{presentation:[{presentationChanged:0}],items:[{handleItemsChange:0}]}]);function A(){if(typeof customElements==="undefined"){return}const s=["ds-shell-tools","ds-badge","ds-button-unfilled","ds-divider","ds-icon","ds-loader","ds-menu","ds-mobile-header","ds-mobile-section-switcher","ds-panel-tool-header","ds-panel-tools","ds-swatch-picker","ds-switch","ds-tab-group","ds-tag","ds-text","ds-tooltip"];s.forEach((s=>{switch(s){case"ds-shell-tools":if(!customElements.get(l(s))){customElements.define(l(s),B)}break;case"ds-badge":if(!customElements.get(l(s))){p()}break;case"ds-button-unfilled":if(!customElements.get(l(s))){b()}break;case"ds-divider":if(!customElements.get(l(s))){f()}break;case"ds-icon":if(!customElements.get(l(s))){g()}break;case"ds-loader":if(!customElements.get(l(s))){v()}break;case"ds-menu":if(!customElements.get(l(s))){k()}break;case"ds-mobile-header":if(!customElements.get(l(s))){w()}break;case"ds-mobile-section-switcher":if(!customElements.get(l(s))){_()}break;case"ds-panel-tool-header":if(!customElements.get(l(s))){y()}break;case"ds-panel-tools":if(!customElements.get(l(s))){d()}break;case"ds-swatch-picker":if(!customElements.get(l(s))){C()}break;case"ds-switch":if(!customElements.get(l(s))){E()}break;case"ds-tab-group":if(!customElements.get(l(s))){j()}break;case"ds-tag":if(!customElements.get(l(s))){x()}break;case"ds-text":if(!customElements.get(l(s))){D()}break;case"ds-tooltip":if(!customElements.get(l(s))){T()}break}}))}A();export{B as S,A as d};
2
+ //# sourceMappingURL=p-BZY40-pE.js.map