@ds-mo/ui 14.18.0 → 14.19.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 (281) hide show
  1. package/README.md +7 -0
  2. package/dist/.package-ready.json +1 -1
  3. package/dist/agent-patterns.json +4 -3
  4. package/dist/agent.json +59 -22
  5. package/dist/angular/ds-filter-menu.d.ts +1 -1
  6. package/dist/angular/ds-filter-menu.js +3 -3
  7. package/dist/angular/ds-input.d.ts +1 -1
  8. package/dist/angular/ds-input.js +3 -3
  9. package/dist/angular/ds-menu.d.ts +1 -1
  10. package/dist/angular/ds-menu.js +3 -3
  11. package/dist/angular/ds-pagination.d.ts +1 -1
  12. package/dist/angular/ds-pagination.js +3 -3
  13. package/dist/angular/ds-panel-tool-header.d.ts +3 -8
  14. package/dist/angular/ds-panel-tools.d.ts +3 -8
  15. package/dist/angular/ds-select.d.ts +1 -1
  16. package/dist/angular/ds-select.js +3 -3
  17. package/dist/angular/ds-tooltip.d.ts +1 -1
  18. package/dist/angular/ds-tooltip.js +3 -3
  19. package/dist/components/ds-agent-activity.js +1 -1
  20. package/dist/components/ds-agent-questionnaire.js +1 -1
  21. package/dist/components/ds-agent-response.js +1 -1
  22. package/dist/components/ds-agent-source-list.js +1 -1
  23. package/dist/components/ds-agent-tool-call.js +1 -1
  24. package/dist/components/ds-attachment-list.js +1 -1
  25. package/dist/components/ds-badge.js +1 -1
  26. package/dist/components/ds-banner.js +1 -1
  27. package/dist/components/ds-banner.js.map +1 -1
  28. package/dist/components/ds-bar-action.js +1 -1
  29. package/dist/components/ds-bar-action.js.map +1 -1
  30. package/dist/components/ds-bar-nav.js +1 -1
  31. package/dist/components/ds-bar-title.js +1 -1
  32. package/dist/components/ds-bar-workflow.js +1 -1
  33. package/dist/components/ds-bar-workflow.js.map +1 -1
  34. package/dist/components/ds-breadcrumb.js +1 -1
  35. package/dist/components/ds-button-filled.js +1 -1
  36. package/dist/components/ds-button-unfilled.js +1 -1
  37. package/dist/components/ds-card-chart.js +1 -1
  38. package/dist/components/ds-card-overview.js +1 -1
  39. package/dist/components/ds-card-setting.js +1 -1
  40. package/dist/components/ds-chart-legend.js +1 -1
  41. package/dist/components/ds-chart.js +1 -1
  42. package/dist/components/ds-checkbox.js +1 -1
  43. package/dist/components/ds-chip.js +1 -1
  44. package/dist/components/ds-code-block.js +1 -1
  45. package/dist/components/ds-conversation-list-item.js +1 -1
  46. package/dist/components/ds-conversation-list-section.js +1 -1
  47. package/dist/components/ds-conversation-list.js +1 -1
  48. package/dist/components/ds-conversation-list.js.map +1 -1
  49. package/dist/components/ds-divider.js +1 -1
  50. package/dist/components/ds-empty-state.js +1 -1
  51. package/dist/components/ds-field.js +1 -1
  52. package/dist/components/ds-filter-menu.js +1 -1
  53. package/dist/components/ds-input.js +1 -1
  54. package/dist/components/ds-markdown.js +1 -1
  55. package/dist/components/ds-menu.js +1 -1
  56. package/dist/components/ds-message-actions.js +1 -1
  57. package/dist/components/ds-message-bubble.js +1 -1
  58. package/dist/components/ds-message-composer.js +1 -1
  59. package/dist/components/ds-message-composer.js.map +1 -1
  60. package/dist/components/ds-message-scroller.js +1 -1
  61. package/dist/components/ds-message.js +1 -1
  62. package/dist/components/ds-mobile-bar-nav.js +1 -1
  63. package/dist/components/ds-mobile-header.js +1 -1
  64. package/dist/components/ds-mobile-section-switcher.js +1 -1
  65. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  66. package/dist/components/ds-modal.js +1 -1
  67. package/dist/components/ds-pagination.js +1 -1
  68. package/dist/components/ds-panel-nav.js +1 -1
  69. package/dist/components/ds-panel-sub-nav.js +1 -1
  70. package/dist/components/ds-panel-tool-header.js +1 -1
  71. package/dist/components/ds-panel-tool-search.js +1 -1
  72. package/dist/components/ds-panel-tools.js +1 -1
  73. package/dist/components/ds-paper-texture.js +1 -1
  74. package/dist/components/ds-radio.js +1 -1
  75. package/dist/components/ds-scroll-overlay.js +1 -1
  76. package/dist/components/ds-select.js +1 -1
  77. package/dist/components/ds-shell-app.js +1 -1
  78. package/dist/components/ds-shell-app.js.map +1 -1
  79. package/dist/components/ds-shell-page.js +1 -1
  80. package/dist/components/ds-shell-tools.js +1 -1
  81. package/dist/components/ds-skeleton.js +1 -1
  82. package/dist/components/ds-slider.js +1 -1
  83. package/dist/components/ds-swatch-picker.js +1 -1
  84. package/dist/components/ds-switch.js +1 -1
  85. package/dist/components/ds-tab-group.js +1 -1
  86. package/dist/components/ds-table-filter.js +1 -1
  87. package/dist/components/ds-table-saved-views.js +1 -1
  88. package/dist/components/ds-table-sort.js +1 -1
  89. package/dist/components/ds-table-toolbar.js +1 -1
  90. package/dist/components/ds-table.js +1 -1
  91. package/dist/components/ds-table.js.map +1 -1
  92. package/dist/components/ds-tag.js +1 -1
  93. package/dist/components/ds-text.js +1 -1
  94. package/dist/components/ds-toast.js +1 -1
  95. package/dist/components/ds-toast.js.map +1 -1
  96. package/dist/components/ds-tooltip-chart.js +1 -1
  97. package/dist/components/ds-tooltip.js +1 -1
  98. package/dist/components/ds-typing-indicator.js +1 -1
  99. package/dist/components/ds-typing-indicator.js.map +1 -1
  100. package/dist/components/p--CRAu9fJ.js +2 -0
  101. package/dist/components/{p-C6yLERx6.js → p-B1JRCDHS.js} +2 -2
  102. package/dist/components/p-BBG6Sswb.js +2 -0
  103. package/dist/components/{p-Drcl4zS9.js.map → p-BBG6Sswb.js.map} +1 -1
  104. package/dist/components/{p-Dd8VKdAO.js → p-BCOl1x0_.js} +2 -2
  105. package/dist/components/{p-C9StMCWg.js → p-BHVOiWz5.js} +2 -2
  106. package/dist/components/p-BNiuAMeh.js +2 -0
  107. package/dist/components/p-BNiuAMeh.js.map +1 -0
  108. package/dist/components/{p-DJ0GCCFa.js → p-BNkU9dcc.js} +2 -2
  109. package/dist/components/p-BPG0r_mC.js +2 -0
  110. package/dist/components/p-BPG0r_mC.js.map +1 -0
  111. package/dist/components/{p-DHzn7INS.js → p-BS0AbMNK.js} +2 -2
  112. package/dist/components/p-BUDAwJVV.js +2 -0
  113. package/dist/components/p-BUDAwJVV.js.map +1 -0
  114. package/dist/components/p-BZVWmzKf.js +2 -0
  115. package/dist/components/p-BZVWmzKf.js.map +1 -0
  116. package/dist/components/{p-CihNoe1M.js → p-B_jZIC9R.js} +2 -2
  117. package/dist/components/{p-CAJIARNW.js → p-Bbb9A3NV.js} +2 -2
  118. package/dist/components/{p-Dginv8PT.js → p-Bf7PZJPT.js} +2 -2
  119. package/dist/components/{p-D6P_1YrL.js → p-BhYS_Ump.js} +2 -2
  120. package/dist/components/p-BknXYAEc.js +2 -0
  121. package/dist/components/{p-9GuNIXuz.js.map → p-BknXYAEc.js.map} +1 -1
  122. package/dist/components/{p-BKx2ihnG.js → p-Bu3dOjpW.js} +2 -2
  123. package/dist/components/{p-BiBXCjjo.js → p-BxGQ3cRJ.js} +2 -2
  124. package/dist/components/{p-Dl3gciej.js → p-BysVBVQv.js} +2 -2
  125. package/dist/components/{p-CBa_6lqj.js → p-C-Y7gYgz.js} +2 -2
  126. package/dist/components/{p-9EQ3xLI1.js → p-C6R5Lft0.js} +2 -2
  127. package/dist/components/{p-DPR0TGGJ.js → p-C9gC4haA.js} +2 -2
  128. package/dist/components/{p-LHzBS95u.js → p-CAnnQL1F.js} +2 -2
  129. package/dist/components/p-CY4YFAT3.js +2 -0
  130. package/dist/components/p-CY4YFAT3.js.map +1 -0
  131. package/dist/components/{p-3WlVHGUe.js → p-Cg0kimXZ.js} +2 -2
  132. package/dist/components/{p-HZz5aJKz.js → p-CsBICYmt.js} +2 -2
  133. package/dist/components/p-CwjVgUqy.js +2 -0
  134. package/dist/components/p-CwjVgUqy.js.map +1 -0
  135. package/dist/components/p-D1eEgwcP.js +2 -0
  136. package/dist/components/p-D1eEgwcP.js.map +1 -0
  137. package/dist/components/{p-oCc3mz_c.js → p-D3fMaUJ3.js} +2 -2
  138. package/dist/components/p-D7R4yE2C.js +2 -0
  139. package/dist/components/{p-Ba7DaFkb.js.map → p-D7R4yE2C.js.map} +1 -1
  140. package/dist/components/{p-CHEt4mW8.js → p-DAvh38E4.js} +2 -2
  141. package/dist/components/{p-DPpHSIzS.js → p-DBue3ISk.js} +2 -2
  142. package/dist/components/{p-BdgoB2ef.js → p-DDgeXGbB.js} +2 -2
  143. package/dist/components/{p-hp_2W2Qy.js → p-DOUDRJbE.js} +2 -2
  144. package/dist/components/{p-Be-vZpWx.js → p-DUdOmSFR.js} +2 -2
  145. package/dist/components/p-DaAXY-XS.js +2 -0
  146. package/dist/components/p-DaAXY-XS.js.map +1 -0
  147. package/dist/components/{p-B9ZfoprK.js → p-DlYw4UGQ.js} +2 -2
  148. package/dist/components/p-DlYw4UGQ.js.map +1 -0
  149. package/dist/components/p-DtndC9f1.js +2 -0
  150. package/dist/components/p-DtndC9f1.js.map +1 -0
  151. package/dist/components/p-HB_cf_aR.js +2 -0
  152. package/dist/components/{p-BBmRD_S0.js.map → p-HB_cf_aR.js.map} +1 -1
  153. package/dist/components/{p-BTTxl3ro.js → p-ZpQBAwZC.js} +2 -2
  154. package/dist/components/p-ZpQBAwZC.js.map +1 -0
  155. package/dist/components/p-ag6Io-kL.js +2 -0
  156. package/dist/components/p-ag6Io-kL.js.map +1 -0
  157. package/dist/components/p-fg9EKoZp.js +2 -0
  158. package/dist/components/{p-DMaQkEYP.js.map → p-fg9EKoZp.js.map} +1 -1
  159. package/dist/components/p-iMuFgSoM.js +2 -0
  160. package/dist/components/p-iMuFgSoM.js.map +1 -0
  161. package/dist/components/{p-CbZ0RU2c.js → p-r8PMqlqm.js} +2 -2
  162. package/dist/components/{p-B145kX-i.js → p-uI6z53BE.js} +2 -2
  163. package/dist/docs/components.json +252 -37
  164. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +12 -0
  165. package/dist/lib/shell/index.d.ts +1 -1
  166. package/dist/lib/shell/index.js.map +1 -1
  167. package/dist/lib/utils/anchored-position.d.ts +6 -2
  168. package/dist/mcp-data/registry/badge.json +7 -9
  169. package/dist/mcp-data/registry/banner.json +2 -2
  170. package/dist/mcp-data/registry/bar-action.json +2 -2
  171. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  172. package/dist/mcp-data/registry/conversation-list.json +2 -2
  173. package/dist/mcp-data/registry/filter-menu.json +21 -6
  174. package/dist/mcp-data/registry/input.json +23 -3
  175. package/dist/mcp-data/registry/menu.json +22 -4
  176. package/dist/mcp-data/registry/message-composer.json +2 -2
  177. package/dist/mcp-data/registry/pagination.json +31 -10
  178. package/dist/mcp-data/registry/panel-nav.json +1 -1
  179. package/dist/mcp-data/registry/panel-tool-header.json +3 -3
  180. package/dist/mcp-data/registry/panel-tools.json +5 -4
  181. package/dist/mcp-data/registry/registry.json +58 -21
  182. package/dist/mcp-data/registry/select.json +17 -3
  183. package/dist/mcp-data/registry/shell-app.json +3 -2
  184. package/dist/mcp-data/registry/table.json +21 -1
  185. package/dist/mcp-data/registry/toast.json +2 -2
  186. package/dist/mcp-data/registry/tooltip.json +20 -3
  187. package/dist/mcp-data/registry/typing-indicator.json +4 -4
  188. package/dist/react/ds-panel-tool-header.d.ts +2 -5
  189. package/dist/react/ds-panel-tools.d.ts +2 -5
  190. package/dist/types/components/Badge/Badge.d.ts +2 -16
  191. package/dist/types/components/Banner/Banner.d.ts +0 -1
  192. package/dist/types/components/BarAction/BarAction.d.ts +0 -7
  193. package/dist/types/components/ConversationList/ConversationList.d.ts +1 -0
  194. package/dist/types/components/FilterMenu/FilterMenu.d.ts +5 -5
  195. package/dist/types/components/Input/Input.d.ts +7 -0
  196. package/dist/types/components/Menu/Menu.d.ts +3 -4
  197. package/dist/types/components/MessageComposer/MessageComposer.d.ts +0 -3
  198. package/dist/types/components/Pagination/Pagination.d.ts +2 -0
  199. package/dist/types/components/Pagination/pagination-types.d.ts +2 -0
  200. package/dist/types/components/PanelToolHeader/PanelToolHeader.d.ts +2 -5
  201. package/dist/types/components/PanelTools/PanelTools.d.ts +2 -5
  202. package/dist/types/components/PanelTools/panel-tools-types.d.ts +12 -0
  203. package/dist/types/components/Select/Select.d.ts +3 -0
  204. package/dist/types/components/Table/Table.d.ts +1 -13
  205. package/dist/types/components/Table/table-body-renderer.d.ts +36 -0
  206. package/dist/types/components/Table/table-load-view.d.ts +17 -0
  207. package/dist/types/components/Table/table-row-view.d.ts +26 -0
  208. package/dist/types/components/Table/table-skeleton-view.d.ts +12 -0
  209. package/dist/types/components/Tooltip/Tooltip.d.ts +3 -0
  210. package/dist/types/components.d.ts +72 -23
  211. package/dist/types/shell/index.d.ts +1 -1
  212. package/dist/types/utils/anchored-overlay-boundary.d.ts +14 -0
  213. package/dist/types/utils/anchored-overlay-interaction-controller.d.ts +26 -0
  214. package/dist/types/utils/anchored-position-controller.d.ts +14 -0
  215. package/dist/types/utils/anchored-position.d.ts +6 -2
  216. package/dist/types/utils/select-controller.d.ts +1 -0
  217. package/dist/vue/ds-filter-menu.js +1 -0
  218. package/dist/vue/ds-input.js +1 -0
  219. package/dist/vue/ds-menu.js +1 -0
  220. package/dist/vue/ds-pagination.js +1 -0
  221. package/dist/vue/ds-select.js +1 -0
  222. package/dist/vue/ds-tooltip.js +1 -0
  223. package/package.json +4 -1
  224. package/dist/components/p-9GuNIXuz.js +0 -2
  225. package/dist/components/p-B9ZfoprK.js.map +0 -1
  226. package/dist/components/p-BBmRD_S0.js +0 -2
  227. package/dist/components/p-BTTxl3ro.js.map +0 -1
  228. package/dist/components/p-Ba7DaFkb.js +0 -2
  229. package/dist/components/p-BcNYvLMi.js +0 -2
  230. package/dist/components/p-BcNYvLMi.js.map +0 -1
  231. package/dist/components/p-CI5Ce8VF.js +0 -2
  232. package/dist/components/p-CI5Ce8VF.js.map +0 -1
  233. package/dist/components/p-Cgm7YMLw.js +0 -2
  234. package/dist/components/p-Cgm7YMLw.js.map +0 -1
  235. package/dist/components/p-Cj5Hkt6Y.js +0 -2
  236. package/dist/components/p-Cj5Hkt6Y.js.map +0 -1
  237. package/dist/components/p-DC_8dK55.js +0 -2
  238. package/dist/components/p-DC_8dK55.js.map +0 -1
  239. package/dist/components/p-DKY3IJqt.js +0 -2
  240. package/dist/components/p-DKY3IJqt.js.map +0 -1
  241. package/dist/components/p-DMaQkEYP.js +0 -2
  242. package/dist/components/p-DQyvAN44.js +0 -2
  243. package/dist/components/p-DQyvAN44.js.map +0 -1
  244. package/dist/components/p-DaxKVtZG.js +0 -2
  245. package/dist/components/p-DbJahF86.js +0 -2
  246. package/dist/components/p-DbJahF86.js.map +0 -1
  247. package/dist/components/p-DhKvqh5G.js +0 -2
  248. package/dist/components/p-DhKvqh5G.js.map +0 -1
  249. package/dist/components/p-Drcl4zS9.js +0 -2
  250. package/dist/components/p-DzPw6aDK.js +0 -2
  251. package/dist/components/p-DzPw6aDK.js.map +0 -1
  252. package/dist/components/p-jk2-y5dH.js +0 -2
  253. package/dist/components/p-jk2-y5dH.js.map +0 -1
  254. package/dist/types/shell/badge-gradient-ring.d.ts +0 -28
  255. /package/dist/components/{p-DaxKVtZG.js.map → p--CRAu9fJ.js.map} +0 -0
  256. /package/dist/components/{p-C6yLERx6.js.map → p-B1JRCDHS.js.map} +0 -0
  257. /package/dist/components/{p-Dd8VKdAO.js.map → p-BCOl1x0_.js.map} +0 -0
  258. /package/dist/components/{p-C9StMCWg.js.map → p-BHVOiWz5.js.map} +0 -0
  259. /package/dist/components/{p-DJ0GCCFa.js.map → p-BNkU9dcc.js.map} +0 -0
  260. /package/dist/components/{p-DHzn7INS.js.map → p-BS0AbMNK.js.map} +0 -0
  261. /package/dist/components/{p-CihNoe1M.js.map → p-B_jZIC9R.js.map} +0 -0
  262. /package/dist/components/{p-CAJIARNW.js.map → p-Bbb9A3NV.js.map} +0 -0
  263. /package/dist/components/{p-Dginv8PT.js.map → p-Bf7PZJPT.js.map} +0 -0
  264. /package/dist/components/{p-D6P_1YrL.js.map → p-BhYS_Ump.js.map} +0 -0
  265. /package/dist/components/{p-BKx2ihnG.js.map → p-Bu3dOjpW.js.map} +0 -0
  266. /package/dist/components/{p-BiBXCjjo.js.map → p-BxGQ3cRJ.js.map} +0 -0
  267. /package/dist/components/{p-Dl3gciej.js.map → p-BysVBVQv.js.map} +0 -0
  268. /package/dist/components/{p-CBa_6lqj.js.map → p-C-Y7gYgz.js.map} +0 -0
  269. /package/dist/components/{p-9EQ3xLI1.js.map → p-C6R5Lft0.js.map} +0 -0
  270. /package/dist/components/{p-DPR0TGGJ.js.map → p-C9gC4haA.js.map} +0 -0
  271. /package/dist/components/{p-LHzBS95u.js.map → p-CAnnQL1F.js.map} +0 -0
  272. /package/dist/components/{p-3WlVHGUe.js.map → p-Cg0kimXZ.js.map} +0 -0
  273. /package/dist/components/{p-HZz5aJKz.js.map → p-CsBICYmt.js.map} +0 -0
  274. /package/dist/components/{p-oCc3mz_c.js.map → p-D3fMaUJ3.js.map} +0 -0
  275. /package/dist/components/{p-CHEt4mW8.js.map → p-DAvh38E4.js.map} +0 -0
  276. /package/dist/components/{p-DPpHSIzS.js.map → p-DBue3ISk.js.map} +0 -0
  277. /package/dist/components/{p-BdgoB2ef.js.map → p-DDgeXGbB.js.map} +0 -0
  278. /package/dist/components/{p-hp_2W2Qy.js.map → p-DOUDRJbE.js.map} +0 -0
  279. /package/dist/components/{p-Be-vZpWx.js.map → p-DUdOmSFR.js.map} +0 -0
  280. /package/dist/components/{p-CbZ0RU2c.js.map → p-r8PMqlqm.js.map} +0 -0
  281. /package/dist/components/{p-B145kX-i.js.map → p-uI6z53BE.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"names":["scrollEdgeFadeClassMap","opts","edges","Array","isArray","classes","scrollAware","hidden","edge","atEnd","PANEL_NAV_USER_MENU_PLACEMENT","side","align","anchorAlignment","sideOffset","alignOffset","NAV_STYLE_HINT_ATTR","readNavStyleAttr","attr","undefined","resolveNavChromeStyle","styleProp","hostAttr","docHint","fromHost","hint","document","documentElement","getAttribute","fromHint","shouldResyncNavChromeStyle","renderedStyle","style","PANEL_NAV_USER_MENU_ANCHOR_ID","scrollEdgeFadeCss","panelNavCss","PanelNav","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","navStyle","disableViewTransition","groups","routerMode","activeId","collapsed","breakpoint","storageKey","currentUrl","userName","userInitial","dashboardLabel","settingsLabel","accountLabel","accountMenuExpanded","dashboardNavigationLabel","settingsNavigationLabel","expandNavigationLabel","collapseNavigationLabel","navigationItemsLabel","parsedGroups","isAnimating","rovingIndex","viewportNarrow","urlDerivedActiveId","bodyScrollable","transitionFallbackTimer","initialRenderComplete","isDragging","dragStartX","didSnap","lastDeltaX","edgeOverlayTimer","showEdgeOverlay","effectiveActiveId","effectiveDisableViewTransition","resolvePanelNavDisableVt","el","onCollapsedChange","_next","prev","startCollapseAnimation","onViewportNarrowChange","next","getFirstRovingIndex","onBreakpointChange","disconnectResizeObserver","effectiveBreakpoint","connectResizeObserver","onGroupsChange","val","parsePanelNavGroups","syncActiveFromUrl","onActiveIdChange","onCurrentUrlChange","onNavStyleChange","newVal","componentWillLoad","resolvePanelNavStyle","isViewportNarrow","stored","localStorage","getItem","componentDidLoad","syncHostPropsIfNeeded","scheduleDeferredHostPropSync","connectScrollRegionObserver","updateBodyScrollable","componentDidRender","disconnectedCallback","disconnectScrollRegionObserver","clearCollapseAnimationCompletion","querySelector","clearEdgeOverlayTimer","globalMouseMoveHandler","window","removeEventListener","globalMouseUpHandler","dsChromeTransitionStart","emit","source","panel","widthBefore","getBoundingClientRect","width","transitionCompletionHandler","e","propertyName","finishCollapseAnimation","addEventListener","requestAnimationFrame","widthAfter","Math","abs","fallbackMs","panelNavWidthTransitionMs","getComputedStyle","setTimeout","wasAnimating","dsChromeTransitionEnd","clearTimeout","attributeValue","Number","isFinite","innerWidth","resizeObserver","ResizeObserver","observe","disconnect","bodyEl","scrollRegionObserver","Boolean","scrollHeight","clientHeight","deriveActiveIdFromUrl","getAllItems","shouldResyncPanelNavStyle","shouldResyncPanelNavGroups","remaining","HOST_PROP_SYNC_BUDGET","tick","queueMicrotask","applyToggle","setItem","String","dsNavToggle","flatMap","g","items","getFooterRovingIndex","length","getUserRovingIndex","getRovingElement","index","itemCount","querySelectorAll","focusRovingAt","focus","preventScroll","activateRovingIndex","handleToggle","handleItemClick","id","handleFooterAction","anchor","dsNavUserAction","menuPlacement","handleRovingKeyDown","key","preventDefault","footerIdx","userIdx","firstIdx","dsNavSelect","resolvePanelNavToggle","toggleCollapsed","dsNavFooterAction","handleUserAction","currentTarget","handleResizeHandleMouseEnter","prefersReducedMotion","handleResizeHandleMouseLeave","handleResizeHandleMouseDown","stopPropagation","wasCollapsed","clientX","body","cursor","userSelect","onMove","ev","deltaX","onUp","renderFooterAction","isDashboardChrome","footerLabel","h","label","size","variant","class","icon","activeFill","hasBorder","focusTabIndex","onDsClick","onKeyDown","onFocusin","renderFooterUser","tipLabel","userButton","type","tabIndex","onClick","onFocus","as","emphasis","color","lineTruncation","name","renderNavItem","item","idx","isActive","rovingPosition","itemContent","dot","hasRing","sharedProps","href","resolveSafeUrl","useAnchor","control","render","chromeStyle","isDashboard","navCls","Host","display","position","disabled","viewBox","fill","xmlns","focusable","d","ref","element","role","flatIdx","map","group","onMouseEnter","onMouseLeave","onMouseDown"],"sources":["src/wc/utils/scroll-edge-fade.ts","src/wc/components/Menu/menu-placement.ts","src/wc/shell/nav-chrome.ts","src/wc/components/PanelNav/panel-nav-types.ts","src/wc/utils/scroll-edge-fade.css?tag=ds-panel-nav&encapsulation=scoped","src/wc/components/PanelNav/PanelNav.css?tag=ds-panel-nav&encapsulation=scoped","src/wc/components/PanelNav/PanelNav.tsx"],"sourcesContent":["/** CSS custom property for scroll-edge fade depth (dimension token or length). */\nexport const SCROLL_EDGE_FADE_SIZE_VAR = '--ds-scroll-edge-fade-size';\n\nexport const SCROLL_EDGE_FADE_DEFAULT_SIZE = 'var(--dimension-size-600)';\n\nexport type ScrollEdgeFadeEdge = 'top' | 'bottom' | 'left' | 'right';\n\nexport type ScrollEdgeFadeSizeToken =\n | 'size-000'\n | 'size-050'\n | 'size-075'\n | 'size-100'\n | 'size-150'\n | 'size-200'\n | 'size-250'\n | 'size-300'\n | 'size-400'\n | 'size-500'\n | 'size-600'\n | 'size-800';\n\nexport type ScrollEdgeFadeSize = ScrollEdgeFadeSizeToken | (string & {});\n\nconst SIZE_VALUE: Record<ScrollEdgeFadeSizeToken, string> = {\n 'size-000': 'var(--dimension-size-000)',\n 'size-050': 'var(--dimension-size-050)',\n 'size-075': 'var(--dimension-size-075)',\n 'size-100': 'var(--dimension-size-100)',\n 'size-150': 'var(--dimension-size-150)',\n 'size-200': 'var(--dimension-size-200)',\n 'size-250': 'var(--dimension-size-250)',\n 'size-300': 'var(--dimension-size-300)',\n 'size-400': 'var(--dimension-size-400)',\n 'size-500': 'var(--dimension-size-500)',\n 'size-600': 'var(--dimension-size-600)',\n 'size-800': 'var(--dimension-size-800)',\n};\n\nconst SIZE_REF = `var(${SCROLL_EDGE_FADE_SIZE_VAR}, ${SCROLL_EDGE_FADE_DEFAULT_SIZE})`;\n\nexport interface ScrollEdgeFadeOptions {\n /** One or more edges to fade. */\n edges: ScrollEdgeFadeEdge | ScrollEdgeFadeEdge[];\n /**\n * Reveal and hide configured fades from the container's own scroll position.\n * Uses CSS scroll-driven animations with a static-fade fallback; no listener required.\n */\n scrollAware?: boolean;\n /**\n * When true, removes the complete mask. Pass a map to remove only configured\n * edges that are flush when scroll state already lives in JavaScript.\n */\n atEnd?: boolean | Partial<Record<ScrollEdgeFadeEdge, boolean>>;\n /** Force the mask off regardless of scroll position (`ds-fade` `visible={false}`). */\n hidden?: boolean;\n}\n\n/** Resolve a dimension size token name or raw CSS length for `--ds-scroll-edge-fade-size`. */\nexport function resolveScrollEdgeFadeSize(\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): string {\n if (height) return height;\n return Object.prototype.hasOwnProperty.call(SIZE_VALUE, size)\n ? SIZE_VALUE[size as ScrollEdgeFadeSizeToken]\n : size;\n}\n\n/** Inline style map setting fade depth on a scroll container. */\nexport function scrollEdgeFadeSizeStyle(\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): Record<string, string> {\n return {\n [SCROLL_EDGE_FADE_SIZE_VAR]: resolveScrollEdgeFadeSize(size, height),\n };\n}\n\n/**\n * Alpha mask for a scroll container edge — content fades to transparent so\n * textured backgrounds (shell gradients, images) show through.\n */\nexport function scrollEdgeFadeMaskImage(edge: ScrollEdgeFadeEdge): string {\n switch (edge) {\n case 'top':\n return `linear-gradient(to bottom, transparent 0, #000 ${SIZE_REF}, #000 100%)`;\n case 'bottom':\n return `linear-gradient(to bottom, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;\n case 'left':\n return `linear-gradient(to right, transparent 0, #000 ${SIZE_REF}, #000 100%)`;\n case 'right':\n return `linear-gradient(to right, #000 0, #000 calc(100% - ${SIZE_REF}), transparent 100%)`;\n }\n}\n\n/** Inline style map for a masked scroll region (single edge). */\nexport function scrollEdgeFadeMaskStyle(\n edge: ScrollEdgeFadeEdge,\n size: ScrollEdgeFadeSize = 'size-600',\n height?: string,\n): Record<string, string> {\n const mask = scrollEdgeFadeMaskImage(edge);\n return {\n ...scrollEdgeFadeSizeStyle(size, height),\n WebkitMaskImage: mask,\n maskImage: mask,\n WebkitMaskSize: '100% 100%',\n maskSize: '100% 100%',\n };\n}\n\n/** Class map for `scroll-edge-fade` modifiers — pair with `scroll-edge-fade.css`. */\nexport function scrollEdgeFadeClassMap(opts: ScrollEdgeFadeOptions): Record<string, boolean> {\n const edges = Array.isArray(opts.edges) ? opts.edges : [opts.edges];\n const classes: Record<string, boolean> = {\n 'scroll-edge-fade': true,\n 'scroll-edge-fade--scroll-aware': opts.scrollAware === true,\n 'scroll-edge-fade--hidden': opts.hidden === true,\n };\n\n for (const edge of edges) {\n classes[`scroll-edge-fade--${edge}`] = true;\n }\n\n const { atEnd } = opts;\n if (atEnd === true) {\n classes['scroll-edge-fade--at-end'] = true;\n } else if (atEnd && typeof atEnd === 'object') {\n for (const edge of edges) {\n if (atEnd[edge]) {\n classes[`scroll-edge-fade--${edge}-at-edge`] = true;\n }\n }\n }\n\n return classes;\n}\n\n/** Whether a scroll container is flush with the given edge (within `threshold` px). */\nexport function isScrollAtEdge(\n el: HTMLElement,\n edge: ScrollEdgeFadeEdge,\n threshold = 2,\n): boolean {\n switch (edge) {\n case 'top':\n return el.scrollTop <= threshold;\n case 'bottom':\n return el.scrollHeight - el.scrollTop - el.clientHeight <= threshold;\n case 'left':\n return el.scrollLeft <= threshold;\n case 'right':\n return el.scrollWidth - el.scrollLeft - el.clientWidth <= threshold;\n }\n}\n","import type { ChoicePopupAnchorAlignment } from '../../utils/choice-popup-alignment';\nimport type { MenuAlign, MenuSide } from './menu-position';\n\n/** Placement props bindable on `ds-menu` (side, align, offsets). */\nexport interface MenuPlacement {\n side: MenuSide;\n align: MenuAlign;\n anchorAlignment: ChoicePopupAnchorAlignment;\n sideOffset: number | string;\n alignOffset: number | string;\n}\n\n/**\n * Canonical `ds-menu` placement for the **panel-nav footer user menu**.\n * Anchor from `dsNavUserAction` detail `{ anchor }` (id `ds-panel-nav-user-menu-anchor`).\n *\n * Not for BarNav overflow menus — those use `side=\"bottom\"` / `align=\"end\"` internally.\n * `align: 'end'` bottom-aligns the last choice cell on the anchor; the side offset nudges into the content area:\n * - `sideOffset` space-100 + space-050 (12px): 4px past the panel-nav outer edge (anchor is ~8px inset).\n * - `anchorAlignment: 'choice-cell'`: the shared section inset puts the last row edge on the footer user row.\n */\nexport const PANEL_NAV_USER_MENU_PLACEMENT = {\n side: 'right',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n\n/**\n * Canonical placement for a menu opened by a PanelTools header action.\n * Matches BarNav overflow: the 32px trigger is 8px inside the 48px header, so\n * a 12px side offset places the popup 4px below the header edge. Choice-cell\n * alignment keeps the final menu item edge aligned with the trigger.\n */\nexport const PANEL_TOOLS_HEADER_MENU_PLACEMENT = {\n side: 'bottom',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n","/** Nav chrome style slot — dashboard vs settings. Colors unified for now; texture hooks use the class. */\nexport type NavChromeStyle = 'dashboard' | 'settings';\n\n/** Document hint for first paint before framework props land. */\nexport const NAV_STYLE_HINT_ATTR = 'data-nav-style';\n\nexport function readNavStyleAttr(attr: string | null): NavChromeStyle | undefined {\n if (attr === 'dashboard' || attr === 'settings') return attr;\n return undefined;\n}\n\nexport function setNavStyleHint(style: NavChromeStyle): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute(NAV_STYLE_HINT_ATTR, style);\n}\n\nexport function clearNavStyleHint(): void {\n if (typeof document === 'undefined') return;\n document.documentElement.removeAttribute(NAV_STYLE_HINT_ATTR);\n}\n\nexport function resolveNavChromeStyle(\n styleProp: NavChromeStyle,\n hostAttr: string | null,\n docHint?: string | null,\n): NavChromeStyle {\n const fromHost = readNavStyleAttr(hostAttr);\n if (fromHost) return fromHost;\n\n const hint =\n docHint !== undefined\n ? docHint\n : typeof document !== 'undefined'\n ? document.documentElement.getAttribute(NAV_STYLE_HINT_ATTR)\n : null;\n const fromHint = readNavStyleAttr(hint);\n if (fromHint) return fromHint;\n\n return styleProp;\n}\n\nexport function shouldResyncNavChromeStyle(\n renderedStyle: NavChromeStyle,\n style: NavChromeStyle,\n): boolean {\n return renderedStyle !== style;\n}\n","import type { MenuPlacement } from '../Menu/menu-placement';\nimport { PANEL_NAV_USER_MENU_PLACEMENT } from '../Menu/menu-placement';\nimport type { NavChromeStyle } from '../../shell/nav-chrome';\n\nexport type { NavChromeStyle };\nexport type PanelNavRouterMode = 'anchor' | 'event';\n\nexport interface PanelNavItem {\n id: string;\n icon: string;\n label: string;\n /** Show a notification dot badge on the item */\n dot?: boolean;\n /** Route path used for `currentUrl` matching. In `anchor` mode also sets `<a href>`.\n * In `event` mode navigation is delegated to the host via `dsNavSelect`. */\n href?: string;\n}\n\nexport interface PanelNavGroup {\n id?: string;\n label?: string;\n items: PanelNavItem[];\n}\n\n/** Stable `id` on the footer user button — use with `ds-menu` `anchor-id`. */\nexport const PANEL_NAV_USER_MENU_ANCHOR_ID = 'ds-panel-nav-user-menu-anchor';\n\n/** Detail for `dsNavUserAction` — anchor element for an external `ds-menu`. */\nexport interface PanelNavUserActionDetail {\n anchor: HTMLElement;\n /** Recommended `ds-menu` placement — spread onto external user menu instance. */\n menuPlacement: MenuPlacement;\n}\n\nexport { PANEL_NAV_USER_MENU_PLACEMENT };\n","/**\n * Scroll-edge alpha fade — the single edge-fade utility for overflow containers.\n * Masks scrolling content to transparent so flat surfaces, shell gradients, and\n * images show through.\n *\n * Static fades are the default (PanelNav intentionally keeps its bottom fade).\n * Add `.scroll-edge-fade--scroll-aware` to reveal/hide each configured edge from\n * the container's own scroll position without JavaScript. Browsers without CSS\n * scroll-driven animations retain the configured static fades.\n *\n * @see scroll-edge-fade.ts — `scrollEdgeFadeClassMap`, `isScrollAtEdge`, size helpers.\n */\n\n@property --ds-scroll-edge-fade-top {\n syntax: '<length-percentage>';\n inherits: false;\n /* stylelint-disable-next-line length-zero-no-unit -- @property requires a unit-compatible initial value. */\n initial-value: 0px;\n}\n\n@property --ds-scroll-edge-fade-bottom {\n syntax: '<length-percentage>';\n inherits: false;\n /* stylelint-disable-next-line length-zero-no-unit -- @property requires a unit-compatible initial value. */\n initial-value: 0px;\n}\n\n@property --ds-scroll-edge-fade-left {\n syntax: '<length-percentage>';\n inherits: false;\n /* stylelint-disable-next-line length-zero-no-unit -- @property requires a unit-compatible initial value. */\n initial-value: 0px;\n}\n\n@property --ds-scroll-edge-fade-right {\n syntax: '<length-percentage>';\n inherits: false;\n /* stylelint-disable-next-line length-zero-no-unit -- @property requires a unit-compatible initial value. */\n initial-value: 0px;\n}\n\n@keyframes ds-scroll-edge-fade-reveal-top {\n from { --ds-scroll-edge-fade-top: 0px; }\n to { --ds-scroll-edge-fade-top: var(--ds-scroll-edge-fade-target-top); }\n}\n\n@keyframes ds-scroll-edge-fade-reveal-bottom {\n from { --ds-scroll-edge-fade-bottom: var(--ds-scroll-edge-fade-target-bottom); }\n to { --ds-scroll-edge-fade-bottom: 0px; }\n}\n\n@keyframes ds-scroll-edge-fade-reveal-left {\n from { --ds-scroll-edge-fade-left: 0px; }\n to { --ds-scroll-edge-fade-left: var(--ds-scroll-edge-fade-target-left); }\n}\n\n@keyframes ds-scroll-edge-fade-reveal-right {\n from { --ds-scroll-edge-fade-right: var(--ds-scroll-edge-fade-target-right); }\n to { --ds-scroll-edge-fade-right: 0px; }\n}\n\n/* Mask gradients use #000 / transparent as alpha stops — not theme colors. */\n/* stylelint-disable color-no-hex */\n\n.scroll-edge-fade {\n --ds-scroll-edge-fade-size: var(--dimension-size-600);\n --ds-scroll-edge-fade-reveal-distance: var(--dimension-size-800);\n --ds-scroll-edge-fade-target-top: 0px;\n --ds-scroll-edge-fade-target-bottom: 0px;\n --ds-scroll-edge-fade-target-left: 0px;\n --ds-scroll-edge-fade-target-right: 0px;\n --ds-scroll-edge-fade-top: var(--ds-scroll-edge-fade-target-top);\n --ds-scroll-edge-fade-bottom: var(--ds-scroll-edge-fade-target-bottom);\n --ds-scroll-edge-fade-left: var(--ds-scroll-edge-fade-target-left);\n --ds-scroll-edge-fade-right: var(--ds-scroll-edge-fade-target-right);\n --ds-scroll-edge-fade-block-mask: linear-gradient(\n to bottom,\n transparent 0,\n #000 var(--ds-scroll-edge-fade-top),\n #000 calc(100% - var(--ds-scroll-edge-fade-bottom)),\n transparent 100%\n );\n --ds-scroll-edge-fade-inline-mask: linear-gradient(\n to right,\n transparent 0,\n #000 var(--ds-scroll-edge-fade-left),\n #000 calc(100% - var(--ds-scroll-edge-fade-right)),\n transparent 100%\n );\n\n /* Intersecting the block and inline masks lets every edge compose correctly. */\n -webkit-mask-image:\n var(--ds-scroll-edge-fade-block-mask),\n var(--ds-scroll-edge-fade-inline-mask);\n mask-image:\n var(--ds-scroll-edge-fade-block-mask),\n var(--ds-scroll-edge-fade-inline-mask);\n -webkit-mask-composite: source-in;\n mask-composite: intersect;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% 100%;\n mask-size: 100% 100%;\n}\n\n.scroll-edge-fade--top {\n --ds-scroll-edge-fade-target-top: var(--ds-scroll-edge-fade-size);\n}\n\n.scroll-edge-fade--bottom {\n --ds-scroll-edge-fade-target-bottom: var(--ds-scroll-edge-fade-size);\n}\n\n.scroll-edge-fade--left {\n --ds-scroll-edge-fade-target-left: var(--ds-scroll-edge-fade-size);\n}\n\n.scroll-edge-fade--right {\n --ds-scroll-edge-fade-target-right: var(--ds-scroll-edge-fade-size);\n}\n\n/* Manual per-edge state remains available when scroll state already lives in JS. */\n.scroll-edge-fade--top-at-edge {\n --ds-scroll-edge-fade-target-top: 0px;\n}\n\n.scroll-edge-fade--bottom-at-edge {\n --ds-scroll-edge-fade-target-bottom: 0px;\n}\n\n.scroll-edge-fade--left-at-edge {\n --ds-scroll-edge-fade-target-left: 0px;\n}\n\n.scroll-edge-fade--right-at-edge {\n --ds-scroll-edge-fade-target-right: 0px;\n}\n\n@supports (animation-timeline: scroll()) {\n .scroll-edge-fade--scroll-aware {\n animation-name:\n ds-scroll-edge-fade-reveal-top,\n ds-scroll-edge-fade-reveal-bottom,\n ds-scroll-edge-fade-reveal-left,\n ds-scroll-edge-fade-reveal-right;\n /* stylelint-disable-next-line declaration-property-value-disallowed-list -- scroll timelines require a nonzero sentinel duration; elapsed time is ignored. */\n animation-duration: 1ms;\n animation-timing-function: ease-in-out;\n animation-fill-mode: both;\n animation-timeline: scroll(self y), scroll(self y), scroll(self x), scroll(self x);\n animation-range:\n 0 var(--ds-scroll-edge-fade-reveal-distance),\n calc(100% - var(--ds-scroll-edge-fade-reveal-distance)) 100%,\n 0 var(--ds-scroll-edge-fade-reveal-distance),\n calc(100% - var(--ds-scroll-edge-fade-reveal-distance)) 100%;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .scroll-edge-fade--scroll-aware {\n animation: none;\n }\n }\n}\n\n.scroll-edge-fade--at-end,\n.scroll-edge-fade--hidden {\n -webkit-mask-image: none;\n mask-image: none;\n}\n\n/**\n * Masks a long content element against a scrollport-relative block window.\n * The owner updates the start/end offsets as the scrollport moves. Keeping the\n * mask on the content instead of the overflow element leaves native scrollbars\n * outside the fade.\n */\n.scroll-edge-fade--block-window {\n --ds-scroll-edge-fade-window-start: 100%;\n --ds-scroll-edge-fade-window-end: 100%;\n\n -webkit-mask-image: linear-gradient(\n to bottom,\n #000 0,\n #000 var(--ds-scroll-edge-fade-window-start),\n transparent var(--ds-scroll-edge-fade-window-end)\n );\n mask-image: linear-gradient(\n to bottom,\n #000 0,\n #000 var(--ds-scroll-edge-fade-window-start),\n transparent var(--ds-scroll-edge-fade-window-end)\n );\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n}\n\n/* stylelint-enable color-no-hex */\n","@import '../../utils/control-density.css';\n@import '../../utils/chrome-layout.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/scrollbar-hidden.css';\n\n/* ── Theme variables ──────────────────────────────────────────────────────── */\n\n.panel-nav {\n /* ─ Sizes ─ */\n --_nav-width: var(--dimension-panel-width-2xs);\n --_nav-width-collapsed: var(--dimension-size-600);\n --_nav-item-height: var(--dimension-size-400, 32px);\n --_nav-padding-x: var(--dimension-space-100, 8px);\n --_nav-padding-y: var(--dimension-space-100, 8px);\n /* gear button outer width = padding*2 + icon */\n --_nav-footer-btn-w: calc(var(--dimension-space-075, 6px) * 2 + var(--dimension-iconography-md, 20px));\n\n /* ─ Motion ─ */\n /* --ds-panel-nav-speed: unitless multiplier; override in Storybook to slow-mo (e.g. 10 = 10×).\n *-dur vars are duration-only (needed for calc); *-motion vars add easing for use in transitions. */\n --_nav-speed: var(--ds-panel-nav-speed, 1);\n --_nav-expand-dur: calc(var(--_nav-speed) * var(--effect-animation-duration-medium-1, 300ms));\n --_nav-expand-motion: var(--_nav-expand-dur) var(--effect-animation-easing-ease-in-out, ease);\n --_nav-label-fade-dur: calc(var(--_nav-speed) * var(--effect-animation-duration-medium-1, 300ms));\n --_nav-label-fade-motion: var(--_nav-label-fade-dur) var(--effect-animation-easing-ease-in-out, ease);\n --_nav-label-fade-out-dur: calc(var(--_nav-speed) * var(--effect-animation-duration-medium-1, 300ms));\n --_nav-label-fade-out-motion: var(--_nav-label-fade-out-dur) var(--effect-animation-easing-ease-in-out, ease);\n\n /* ─ Colours – default chrome (app surfaces) ─ */\n --_nav-bg: var(--color-background-secondary);\n --_nav-border: var(--color-border-tertiary);\n --_nav-divider: var(--color-border-tertiary);\n --_nav-fg-primary: var(--color-foreground-primary);\n --_nav-fg-secondary: var(--color-foreground-secondary);\n --_nav-fg-tertiary: var(--color-foreground-tertiary);\n --_nav-hover: var(--color-interaction-hover);\n --_nav-pressed: var(--color-interaction-pressed);\n --_nav-focus: var(--color-interaction-focus);\n --_nav-dot: var(--color-foreground-bold-brand);\n --ds-interaction-hover: var(--_nav-hover);\n --ds-interaction-pressed: var(--_nav-pressed);\n --ds-focus-ring-color: var(--_nav-focus);\n}\n\n/* ── Default chrome overrides ────────────────────────────────────────────── */\n\n/* Shell-owned chrome (bg + wash) — panel is a transparent frame. */\n:host-context(ds-shell-app:not([gradient-preset='none'])) .panel-nav,\n:host-context(ds-shell-app.shell-app--paper-texture) .panel-nav {\n background-color: transparent;\n}\n\n/* Style slots — same app tokens for now; hook texture/glyph layers on these classes later. */\n.panel-nav--dashboard,\n.panel-nav--settings {\n --_nav-bg: var(--color-background-secondary);\n --_nav-border: var(--color-border-tertiary);\n --_nav-divider: var(--color-border-tertiary);\n --_nav-fg-primary: var(--color-foreground-primary);\n --_nav-fg-secondary: var(--color-foreground-secondary);\n --_nav-fg-tertiary: var(--color-foreground-tertiary);\n --_nav-hover: var(--color-interaction-hover);\n --_nav-pressed: var(--color-interaction-pressed);\n --_nav-focus: var(--color-interaction-focus);\n --_nav-dot: var(--color-foreground-bold-brand);\n --ds-interaction-hover: var(--_nav-hover);\n --ds-interaction-pressed: var(--_nav-pressed);\n --ds-focus-ring-color: var(--_nav-focus);\n}\n\n/* ── Shell ───────────────────────────────────────────────────────────────── */\n\n.panel-nav {\n display: flex;\n flex-direction: column;\n position: relative;\n width: var(--_nav-width);\n min-width: var(--_nav-width);\n height: 100%;\n background-color: var(--_nav-bg);\n border-right: var(--dimension-stroke-width-012, 1px) solid var(--_nav-border);\n box-sizing: border-box;\n overflow: visible;\n transition:\n width var(--_nav-expand-motion),\n min-width var(--_nav-expand-motion),\n background-color var(--effect-motion-short-3, 200ms ease),\n border-color var(--effect-motion-short-3, 200ms ease);\n font-family: var(--typography-font-family-ui, system-ui);\n isolation: isolate;\n}\n\n.panel-nav__header,\n.panel-nav__body,\n.panel-nav__footer {\n position: relative;\n z-index: 3;\n}\n\n.panel-nav--collapsed {\n width: var(--_nav-width-collapsed);\n min-width: var(--_nav-width-collapsed);\n}\n\n/* ── Header ──────────────────────────────────────────────────────────────── */\n\n.panel-nav__header {\n height: var(--dimension-size-600, 48px);\n flex-shrink: 0;\n border-bottom: var(--dimension-stroke-width-012, 1px) solid var(--_nav-divider);\n transition: border-color var(--effect-motion-short-3, 200ms ease);\n}\n\n.panel-nav__header-btn {\n all: unset;\n /* Re-assert after unset — required for `.ds-interaction-fill` stacking. */\n position: relative;\n z-index: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--dimension-space-075, 6px);\n border-radius: var(--ds-control-radius, var(--dimension-radius-025, 2px));\n cursor: default;\n color: var(--_nav-fg-primary);\n flex-shrink: 0;\n box-sizing: border-box;\n transition: color var(--effect-motion-short-3, 200ms ease);\n /* Hover/press: `.ds-interaction-fill` (tokens from --_nav-* via --ds-interaction-*). */\n}\n\n.panel-nav--breakpoint-locked .panel-nav__header-btn {\n cursor: default;\n}\n\n/* Logo — visible by default; instant swap to toggle on hover (no crossfade overlap) */\n.panel-nav__header-logo {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n z-index: 2;\n opacity: 1;\n}\n\n.panel-nav__m-mark {\n width: var(--dimension-iconography-md, 20px);\n height: var(--dimension-iconography-md, 20px);\n display: block;\n}\n\n/* Toggle icon — stacked on logo; under hover wash (::after z-index 3) */\n.panel-nav__header-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n inset: 0;\n z-index: 2;\n opacity: 0;\n pointer-events: none;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .panel-nav:not(.panel-nav--breakpoint-locked)\n .panel-nav__header-btn:hover\n .panel-nav__header-logo {\n opacity: 0;\n }\n\n .panel-nav:not(.panel-nav--breakpoint-locked)\n .panel-nav__header-btn:hover\n .panel-nav__header-toggle {\n opacity: 1;\n }\n}\n\n/* ── Scrollable body ─────────────────────────────────────────────────────── */\n\n.panel-nav__body {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.panel-nav__sections {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-200, 16px);\n width: 100%;\n}\n\n/* ── Group ───────────────────────────────────────────────────────────────── */\n\n.panel-nav__group {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050, 4px);\n}\n\n/*\n * Section headers — typography via ds-text (text-caption + emphasis).\n * Element selector so display:flex beats Text's inline-block, and padding\n * isn't clobbered by sharing `.panel-nav__item-label-text` on the same host.\n */\nds-text.panel-nav__group-label {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n text-transform: uppercase;\n color: var(--_nav-fg-secondary);\n user-select: none;\n height: var(--dimension-size-300, 24px);\n /* Former nested pad: group-label (075) + item-label-text (025). */\n padding: 0 calc(var(--dimension-space-075, 6px) + var(--ds-control-label-inset));\n white-space: nowrap;\n overflow: hidden;\n max-height: var(--dimension-size-300, 24px);\n opacity: 1;\n transition:\n opacity var(--_nav-label-fade-motion) 0ms,\n max-height var(--_nav-label-fade-motion) 0ms,\n padding var(--_nav-label-fade-motion) 0ms,\n color var(--effect-motion-short-3, 200ms ease);\n}\n\n/* ── Item ────────────────────────────────────────────────────────────────── */\n\n.panel-nav__item {\n all: unset;\n /* Re-assert after unset — required for `.ds-interaction-fill` stacking. */\n position: relative;\n z-index: 0;\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050, 4px);\n padding: 0 var(--dimension-space-075, 6px);\n height: var(--dimension-size-400, 32px);\n border-radius: var(--ds-control-radius, var(--dimension-radius-025, 2px));\n cursor: default;\n color: var(--_nav-fg-secondary);\n box-sizing: border-box;\n width: 100%;\n user-select: none;\n transition: color var(--effect-motion-short-1, 50ms ease-in-out);\n /* Hover/press: `.ds-interaction-fill` — no --selected (icon/type weight only). */\n}\n\n/* ── Active item ─────────────────────────────────────────────────────────── */\n\n.panel-nav__item--active {\n color: var(--_nav-fg-primary);\n /* Bold typography via ds-text (text-body-medium + emphasis) on the label */\n}\n\n/* ── Item icon ───────────────────────────────────────────────────────────── */\n\n.panel-nav__item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--dimension-iconography-md, 20px);\n height: var(--dimension-iconography-md, 20px);\n position: relative;\n z-index: 2;\n}\n\n/* ── Item label ──────────────────────────────────────────────────────────── */\n\n.panel-nav__item-label {\n position: relative;\n z-index: 2;\n flex: 1;\n min-width: 0;\n height: var(--typography-lineheight-md, 20px);\n opacity: 1;\n /* Gradient wipe: mask sweeps left-to-right on expand, right-to-left on collapse */\n /* stylelint-disable-next-line color-named -- mask luminance stops, not theme colors */\n mask-image: linear-gradient(to right, black 50%, transparent 100%);\n /* stylelint-disable-next-line color-named -- mask luminance stops, not theme colors */\n -webkit-mask-image: linear-gradient(to right, black 50%, transparent 100%);\n mask-size: 200% 100%;\n -webkit-mask-size: 200% 100%;\n mask-position: 0% 0;\n -webkit-mask-position: 0% 0;\n transition:\n opacity var(--_nav-label-fade-motion) 0ms,\n mask-position var(--_nav-label-fade-motion) 0ms,\n -webkit-mask-position var(--_nav-label-fade-motion) 0ms;\n}\n\n.panel-nav__item-label-text {\n padding: 0 var(--ds-control-label-inset);\n}\n\n/* ── Item notification dot — 20px suffix zone matches the icon geometry ──── */\n\n.panel-nav__item-dot-box {\n position: absolute;\n z-index: 2;\n right: var(--dimension-space-075, 6px);\n top: var(--dimension-space-075, 6px);\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--dimension-iconography-md, 20px);\n height: var(--dimension-iconography-md, 20px);\n pointer-events: none;\n}\n\n.panel-nav__item-dot {\n transition:\n transform var(--_nav-expand-motion);\n}\n\n.panel-nav--collapsed .panel-nav__item-dot {\n transform: translate(\n calc(var(--dimension-space-075, 6px) + var(--dimension-stroke-width-012, 1px)),\n calc(0px - var(--dimension-space-075, 6px) - var(--dimension-stroke-width-012, 1px))\n );\n}\n\n.panel-nav--animating .panel-nav__item-label {\n text-overflow: clip;\n}\n\n.panel-nav--collapsed .panel-nav__item-label {\n opacity: 0;\n pointer-events: none;\n text-overflow: clip;\n mask-position: 100% 0;\n -webkit-mask-position: 100% 0;\n transition:\n opacity var(--_nav-label-fade-out-motion) 0ms,\n mask-position var(--_nav-label-fade-out-motion) 0ms,\n -webkit-mask-position var(--_nav-label-fade-out-motion) 0ms;\n}\n\n.panel-nav--collapsed ds-text.panel-nav__group-label {\n opacity: 0;\n max-height: 0;\n padding: 0 calc(var(--dimension-space-075, 6px) + var(--ds-control-label-inset));\n pointer-events: none;\n transition:\n opacity var(--_nav-label-fade-out-motion) 0ms,\n max-height var(--_nav-label-fade-out-motion) 0ms,\n padding var(--_nav-label-fade-out-motion) 0ms,\n color var(--effect-motion-short-3, 200ms ease);\n}\n\n/* ── Footer ──────────────────────────────────────────────────────────────── */\n\n.panel-nav__footer {\n position: relative;\n flex-shrink: 0;\n /* single row: padding*2 + item */\n height: calc(var(--_nav-padding-y) * 2 + var(--_nav-item-height));\n transition: height var(--_nav-expand-motion);\n}\n\n.panel-nav--collapsed .panel-nav__footer {\n /* two rows: padding*2 + item*2 + gap */\n height: calc(var(--_nav-padding-y) * 2 + var(--_nav-item-height) * 2 + var(--dimension-space-050, 4px));\n}\n\n/* ── Footer icon button (gear / dashboard) ───────────────────────────────── */\n\n.panel-nav__footer-btn {\n position: absolute;\n left: var(--_nav-padding-x);\n top: var(--_nav-padding-y);\n --ds-button-unfilled-fg: var(--_nav-fg-secondary);\n --ds-button-unfilled-fg-active: var(--_nav-fg-primary);\n --ds-interaction-hover: var(--_nav-hover);\n --ds-interaction-pressed: var(--_nav-pressed);\n --ds-focus-ring-color: var(--_nav-focus);\n}\n\n/* ── Footer user — absolutely positioned, slides from row to below gear ───── */\n\n.panel-nav__footer-user {\n position: absolute;\n /* Expanded row: balanced shell inset with an 8px gear-to-user gap. */\n left: calc(var(--_nav-padding-x) + var(--_nav-footer-btn-w) + var(--dimension-space-100, 8px));\n right: var(--_nav-padding-x);\n top: var(--_nav-padding-y);\n width: auto;\n min-width: 0;\n transition:\n left var(--_nav-expand-motion),\n right var(--_nav-expand-motion),\n top var(--_nav-expand-motion);\n}\n\n/* Popup-open state keeps the native footer trigger visibly pressed. */\n.panel-nav__footer-user--menu-expanded::after {\n background: var(--_nav-pressed);\n}\n\n.panel-nav__footer-user--menu-expanded {\n --ds-interaction-hover: var(--_nav-pressed);\n}\n\n.panel-nav--collapsed .panel-nav__footer-user {\n /* Resolve one shared square control while keeping both inline edges animatable. */\n left: var(--_nav-padding-x);\n right: calc(100% - var(--_nav-padding-x) - var(--_nav-item-height));\n top: calc(var(--_nav-padding-y) + var(--_nav-item-height) + var(--dimension-space-050, 4px));\n}\n\n/* Label: absolute so it stays in place and only fades — no mask slide */\n.panel-nav__footer-user-label {\n text-align: right;\n position: absolute;\n left: var(--dimension-space-075, 6px);\n right: calc(var(--dimension-space-075, 6px) + var(--dimension-iconography-md, 20px) + var(--dimension-space-050, 4px));\n top: 50%;\n transform: translateY(-50%);\n flex: none;\n height: var(--typography-lineheight-md, 20px);\n mask-image: none;\n -webkit-mask-image: none;\n transition: opacity var(--_nav-label-fade-motion);\n}\n\n.panel-nav--collapsed .panel-nav__footer-user-label {\n opacity: 0;\n pointer-events: none;\n mask-position: 0% 0;\n -webkit-mask-position: 0% 0;\n}\n\n/* ── Footer user icon — cross-fades chevron ↔ circle+initial ────────────── */\n\n/* Absolute — right-anchored in expanded, left-anchored in collapsed to match regular item icon position */\n.panel-nav__footer-user-icon {\n position: absolute;\n left: calc(100% - var(--dimension-iconography-md, 20px) - var(--dimension-space-075, 6px));\n top: 0;\n bottom: 0;\n height: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: left var(--_nav-expand-motion);\n}\n\n.panel-nav--collapsed .panel-nav__footer-user-icon {\n left: var(--dimension-space-075, 6px);\n}\n\n.panel-nav__footer-icon-expanded,\n.panel-nav__footer-icon-collapsed {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.panel-nav__footer-icon-expanded {\n opacity: 1;\n transition: opacity var(--_nav-label-fade-motion);\n}\n\n.panel-nav__footer-icon-collapsed {\n opacity: 0;\n transition: opacity var(--_nav-label-fade-motion);\n}\n\n.panel-nav--collapsed .panel-nav__footer-icon-expanded {\n opacity: 0;\n transition: opacity var(--_nav-label-fade-out-motion);\n}\n\n.panel-nav--collapsed .panel-nav__footer-icon-collapsed {\n opacity: 1;\n transition: opacity var(--_nav-label-fade-out-motion);\n}\n\n/* ── User initial — overlaid on the circle icon ─────────────────────────── */\n\n/*\n * Center the caption glyph on the Circle icon. Don't use inset:0 + flex — the\n * inner `.ds-text__element { width: 100% }` stretches and left-aligns the letter.\n * Translate-centering keeps the complete caption metric box on the icon center;\n * the caption variant remains the sole owner of its line-height.\n * (Do not set `inset: auto` after top/left — it resets them.)\n */\nds-text.panel-nav__user-initial,\nds-text.panel-nav__user-initial.ds-text--caption {\n position: absolute;\n top: 50%;\n left: 50%;\n right: auto;\n bottom: auto;\n transform: translate(-50%, -50%);\n display: block;\n width: max-content;\n max-width: none;\n min-width: 0;\n text-align: center;\n color: inherit;\n pointer-events: none;\n}\n\n/* ── Drag-to-resize handle ───────────────────────────────────────────────── */\n\n/* The resize overlay line — extends past the right edge; keep above workspace content */\n.panel-nav__resize-handle {\n position: absolute;\n top: 0;\n /* Centered on the right edge: --dimension-space-050 outside + inside = --dimension-space-100 hit zone */\n right: var(--dimension-space-n050, -4px);\n bottom: 0;\n width: var(--dimension-space-100, 8px);\n z-index: 20;\n cursor: ew-resize;\n touch-action: none;\n /* Needs a real background for Safari hit-testing */\n background: transparent;\n}\n\n/* Safari requires non-transparent fill for hit testing */\n.panel-nav__resize-handle::before {\n content: '';\n position: absolute;\n inset: 0;\n /* stylelint-disable-next-line color-named -- near-invisible hit-test fill; not a theme color */\n background: rgba(0, 0, 0, 0.001);\n}\n\n/* Resize overlay line */\n.panel-nav__resize-handle::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n width: var(--dimension-stroke-width-025, 2px);\n background: var(--color-foreground-primary);\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--effect-motion-short-2, 100ms ease-in-out);\n}\n\n.panel-nav__resize-handle--overlay::after {\n opacity: 1;\n}\n\n/* ── Reduced motion ──────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .panel-nav,\n .panel-nav *,\n .panel-nav *::before,\n .panel-nav *::after,\n .panel-nav__resize-handle,\n .panel-nav__resize-handle::before,\n .panel-nav__resize-handle::after {\n /* Near-instant — browsers treat 0 as \"no transition\" and can skip the end state. */\n transition-duration: var(--effect-animation-duration-instant) !important;\n animation-duration: var(--effect-animation-duration-instant) !important;\n transition-delay: var(--effect-animation-duration-instant) !important;\n }\n}\n","import {\n Component,\n Prop,\n Event,\n EventEmitter,\n Watch,\n State,\n Element,\n Method,\n h,\n Host,\n} from '@stencil/core';\nimport type { ChromeTransitionDetail } from '../../shell/chrome-transition';\nimport type { NavChromeStyle } from '../../shell/nav-chrome';\nimport {\n deriveActiveIdFromUrl,\n panelNavWidthTransitionMs,\n parsePanelNavGroups,\n resolvePanelNavDisableVt,\n resolvePanelNavStyle,\n resolvePanelNavToggle,\n shouldResyncPanelNavGroups,\n shouldResyncPanelNavStyle,\n} from './panel-nav-utils';\nimport {\n PANEL_NAV_USER_MENU_ANCHOR_ID,\n PANEL_NAV_USER_MENU_PLACEMENT,\n type PanelNavGroup,\n type PanelNavItem,\n type PanelNavRouterMode,\n type PanelNavUserActionDetail,\n} from './panel-nav-types';\nimport { scrollEdgeFadeClassMap } from '../../utils/scroll-edge-fade';\nimport { prefersReducedMotion } from '../../utils/resolve-css-time-ms';\nimport { resolveSafeUrl } from '../../utils/safe-url';\n\n@Component({\n tag: 'ds-panel-nav',\n styleUrl: 'PanelNav.css',\n styleUrls: ['../../utils/scroll-edge-fade.css'],\n scoped: true,\n})\nexport class PanelNav {\n /** Style slot: `dashboard` or `settings`. Colors match for now;\n * class hooks reserved for texture/glyph layers. Property: `navStyle`. Attribute: `nav-style`. */\n @Prop({ attribute: 'nav-style', reflect: true }) navStyle: NavChromeStyle = 'dashboard';\n\n /** When `true`, style changes apply synchronously — host app owns view transitions. */\n @Prop() disableViewTransition: boolean = false;\n\n /** Nav groups — set via JS property (`el.groups = [...]`) or JSON string attribute. */\n @Prop() groups: string | PanelNavGroup[] = '[]';\n\n /** How items with `href` render:\n * - `anchor` (default): native `<a href>` — works with routers that intercept anchors.\n * - `event`: always `<button>`; host handles navigation via `dsNavSelect`. */\n @Prop() routerMode: PanelNavRouterMode = 'anchor';\n\n /** ID of the currently active/selected nav item. Overridden by `currentUrl` matching when set. */\n @Prop() activeId: string = '';\n\n /** Whether the nav is in collapsed (icon-only) state.\n * Set `storageKey` to persist across reloads. `dsNavToggle` still fires on change. */\n @Prop({ mutable: true }) collapsed: boolean = false;\n\n /** Viewport width (px) below which the nav locks in icon-only mode. 0 = disabled. */\n @Prop() breakpoint: number = 0;\n\n /** `localStorage` key used to persist the collapsed state across page loads.\n * When set, collapsed state is restored on mount and written on each toggle. */\n @Prop() storageKey: string = '';\n\n /** Current route URL (e.g. `window.location.pathname` or the router's active URL).\n * When set the component derives the active item by matching item `href` values\n * against this string (longest segment-boundary prefix wins), overriding `activeId`. */\n @Prop() currentUrl: string = '';\n\n /** Display name for the footer user section */\n @Prop() userName: string = '';\n\n /** Single character shown in the collapsed avatar */\n @Prop() userInitial: string = '';\n\n @Prop() dashboardLabel: string = 'Dashboard';\n @Prop() settingsLabel: string = 'Settings';\n @Prop() accountLabel: string = 'Account';\n /** Keep the account-menu trigger visually pressed while its popup is open or closing. */\n @Prop() accountMenuExpanded: boolean = false;\n @Prop() dashboardNavigationLabel: string = 'Dashboard navigation';\n @Prop() settingsNavigationLabel: string = 'Settings navigation';\n @Prop() expandNavigationLabel: string = 'Expand navigation';\n @Prop() collapseNavigationLabel: string = 'Collapse navigation';\n /** Localized name for the body when overflow makes it a keyboard-scrollable region. */\n @Prop() navigationItemsLabel: string = 'Navigation items';\n\n /** Emitted when a nav item is clicked. Detail = the item's `id`. */\n @Event() dsNavSelect!: EventEmitter<string>;\n\n /** Emitted when the collapse toggle is clicked. Detail = new collapsed state. */\n @Event() dsNavToggle!: EventEmitter<boolean>;\n\n /** Bubbling lifecycle — `ds-shell-app` pauses chrome metrics during width motion. */\n @Event({ bubbles: true, composed: true })\n dsChromeTransitionStart!: EventEmitter<ChromeTransitionDetail>;\n\n @Event({ bubbles: true, composed: true })\n dsChromeTransitionEnd!: EventEmitter<ChromeTransitionDetail>;\n\n /** Emitted when the footer left button (gear / dashboard) is clicked. */\n @Event() dsNavFooterAction!: EventEmitter<void>;\n\n /** Emitted when the footer user button is clicked. Detail includes the anchor for `ds-menu`. */\n @Event() dsNavUserAction!: EventEmitter<PanelNavUserActionDetail>;\n\n @Element() el!: HTMLElement;\n\n @State() private renderedStyle: NavChromeStyle = 'dashboard';\n @State() private parsedGroups: PanelNavGroup[] = [];\n @State() private isAnimating = false;\n @State() private rovingIndex: number = 0;\n @State() private viewportNarrow: boolean = false;\n @State() private urlDerivedActiveId: string = '';\n @State() private bodyScrollable = false;\n\n private transitionCompletionHandler?: (e: TransitionEvent) => void;\n private transitionFallbackTimer: number | null = null;\n private resizeObserver?: ResizeObserver;\n private scrollRegionObserver?: ResizeObserver;\n private bodyEl?: HTMLElement;\n private initialRenderComplete = false;\n\n // Drag-to-resize state (not @State — no re-render needed)\n private isDragging = false;\n private dragStartX = 0;\n private didSnap = false;\n private lastDeltaX = 0;\n private edgeOverlayTimer: number | null = null;\n private globalMouseMoveHandler?: (e: MouseEvent) => void;\n private globalMouseUpHandler?: () => void;\n\n @State() private showEdgeOverlay = false;\n\n private static readonly HOST_PROP_SYNC_BUDGET = 8;\n\n /** The ID that should be treated as active. `currentUrl` matching takes precedence\n * over `activeId` when both are present. */\n private get effectiveActiveId(): string {\n return this.urlDerivedActiveId || this.activeId;\n }\n\n private get effectiveDisableViewTransition(): boolean {\n return resolvePanelNavDisableVt(\n this.disableViewTransition,\n this.el.getAttribute('disable-view-transition')\n );\n }\n\n @Watch('collapsed')\n onCollapsedChange(_next: boolean, prev: boolean | undefined) {\n if (prev === undefined || !this.initialRenderComplete) return;\n this.startCollapseAnimation();\n }\n\n @Watch('viewportNarrow')\n onViewportNarrowChange(next: boolean, prev: boolean | undefined) {\n if (prev === undefined || !this.initialRenderComplete) return;\n if (next && this.rovingIndex === 0) {\n this.rovingIndex = this.getFirstRovingIndex();\n }\n this.startCollapseAnimation();\n }\n\n @Watch('breakpoint')\n onBreakpointChange() {\n this.disconnectResizeObserver();\n if (this.effectiveBreakpoint() > 0) this.connectResizeObserver();\n }\n\n @Watch('groups')\n onGroupsChange(val: string | PanelNavGroup[]) {\n this.parsedGroups = parsePanelNavGroups(val);\n this.rovingIndex = 0;\n this.syncActiveFromUrl();\n }\n\n @Watch('activeId')\n @Watch('urlDerivedActiveId')\n onActiveIdChange() {\n /* Active route updates aria-current only — roving tab stop stays user-controlled. */\n }\n\n @Watch('currentUrl')\n onCurrentUrlChange() {\n this.syncActiveFromUrl();\n }\n\n @Watch('navStyle')\n onNavStyleChange(newVal: NavChromeStyle) {\n this.renderedStyle = newVal;\n }\n\n componentWillLoad() {\n this.renderedStyle = resolvePanelNavStyle(this.navStyle, this.el.getAttribute('nav-style'));\n this.viewportNarrow = this.isViewportNarrow();\n if (this.storageKey) {\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored !== null) this.collapsed = stored === 'true';\n } catch {\n /* localStorage unavailable */\n }\n }\n this.onGroupsChange(this.groups);\n this.syncActiveFromUrl();\n }\n\n componentDidLoad() {\n this.syncHostPropsIfNeeded();\n this.scheduleDeferredHostPropSync();\n if (this.effectiveBreakpoint() > 0) this.connectResizeObserver();\n this.connectScrollRegionObserver();\n this.updateBodyScrollable();\n this.initialRenderComplete = true;\n }\n\n componentDidRender() {\n this.updateBodyScrollable();\n }\n\n disconnectedCallback() {\n this.disconnectResizeObserver();\n this.disconnectScrollRegionObserver();\n this.clearCollapseAnimationCompletion(\n this.el.querySelector('.panel-nav') as HTMLElement | null\n );\n this.clearEdgeOverlayTimer();\n if (this.globalMouseMoveHandler) {\n window.removeEventListener('mousemove', this.globalMouseMoveHandler);\n }\n if (this.globalMouseUpHandler) {\n window.removeEventListener('mouseup', this.globalMouseUpHandler);\n }\n }\n\n private startCollapseAnimation() {\n if (this.isAnimating) return;\n this.isAnimating = true;\n this.dsChromeTransitionStart.emit({ source: 'panel-nav' });\n const panel = this.el.querySelector('.panel-nav') as HTMLElement | null;\n const widthBefore = panel?.getBoundingClientRect().width ?? 0;\n this.clearCollapseAnimationCompletion(panel);\n this.transitionCompletionHandler = (e: TransitionEvent) => {\n if (e.propertyName === 'width' || e.propertyName === 'min-width') {\n this.finishCollapseAnimation(panel);\n }\n };\n panel?.addEventListener('transitionend', this.transitionCompletionHandler);\n panel?.addEventListener('transitioncancel', this.transitionCompletionHandler);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (!this.isAnimating) return;\n const widthAfter = panel?.getBoundingClientRect().width ?? 0;\n if (Math.abs(widthAfter - widthBefore) < 1) {\n this.finishCollapseAnimation(panel);\n return;\n }\n if (!panel) {\n this.finishCollapseAnimation(panel);\n return;\n }\n\n const fallbackMs = panelNavWidthTransitionMs(getComputedStyle(panel));\n if (fallbackMs <= 0) {\n this.finishCollapseAnimation(panel);\n return;\n }\n this.transitionFallbackTimer = window.setTimeout(() => {\n this.finishCollapseAnimation(panel);\n }, fallbackMs);\n });\n });\n }\n\n private finishCollapseAnimation(panel: HTMLElement | null) {\n const wasAnimating = this.isAnimating;\n this.clearCollapseAnimationCompletion(panel);\n if (!wasAnimating) return;\n this.isAnimating = false;\n this.dsChromeTransitionEnd.emit({ source: 'panel-nav' });\n }\n\n private clearCollapseAnimationCompletion(panel: HTMLElement | null) {\n if (this.transitionCompletionHandler) {\n panel?.removeEventListener('transitionend', this.transitionCompletionHandler);\n panel?.removeEventListener('transitioncancel', this.transitionCompletionHandler);\n this.transitionCompletionHandler = undefined;\n }\n if (this.transitionFallbackTimer !== null) {\n window.clearTimeout(this.transitionFallbackTimer);\n this.transitionFallbackTimer = null;\n }\n }\n\n private effectiveBreakpoint(): number {\n if (this.breakpoint > 0) return this.breakpoint;\n const attributeValue = Number(this.el.getAttribute('breakpoint') ?? 0);\n return Number.isFinite(attributeValue) && attributeValue > 0 ? attributeValue : 0;\n }\n\n private isViewportNarrow(): boolean {\n const breakpoint = this.effectiveBreakpoint();\n return typeof window !== 'undefined' && breakpoint > 0 && window.innerWidth < breakpoint;\n }\n\n private connectResizeObserver() {\n this.viewportNarrow = this.isViewportNarrow();\n this.resizeObserver = new ResizeObserver(() => {\n this.viewportNarrow = this.isViewportNarrow();\n });\n this.resizeObserver.observe(document.documentElement);\n }\n\n private disconnectResizeObserver() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = undefined;\n }\n\n private connectScrollRegionObserver() {\n this.disconnectScrollRegionObserver();\n if (!this.bodyEl || typeof ResizeObserver === 'undefined') return;\n this.scrollRegionObserver = new ResizeObserver(() => this.updateBodyScrollable());\n this.scrollRegionObserver.observe(this.bodyEl);\n }\n\n private disconnectScrollRegionObserver() {\n this.scrollRegionObserver?.disconnect();\n this.scrollRegionObserver = undefined;\n }\n\n private updateBodyScrollable() {\n const next = Boolean(this.bodyEl && this.bodyEl.scrollHeight > this.bodyEl.clientHeight + 1);\n if (next !== this.bodyScrollable) this.bodyScrollable = next;\n }\n\n /** Derive active ID from the current URL by matching item `href` values.\n * Uses longest segment-boundary prefix match. */\n private syncActiveFromUrl() {\n if (!this.currentUrl) {\n this.urlDerivedActiveId = '';\n return;\n }\n this.urlDerivedActiveId = deriveActiveIdFromUrl(this.currentUrl, this.getAllItems());\n }\n\n /** Re-parse props assigned by the host after componentWillLoad (Angular ngAfterViewInit). */\n private syncHostPropsIfNeeded() {\n if (shouldResyncPanelNavStyle(this.renderedStyle, this.navStyle)) {\n this.renderedStyle = this.navStyle;\n }\n\n if (shouldResyncPanelNavGroups(this.parsedGroups, this.groups)) {\n this.onGroupsChange(this.groups);\n } else if (this.currentUrl) {\n this.syncActiveFromUrl();\n }\n }\n\n /** Poll across animation frames — host props may land without triggering @Watch. */\n private scheduleDeferredHostPropSync() {\n let remaining = PanelNav.HOST_PROP_SYNC_BUDGET;\n const tick = () => {\n this.syncHostPropsIfNeeded();\n if (--remaining > 0) {\n requestAnimationFrame(tick);\n }\n };\n queueMicrotask(tick);\n }\n\n /** Centralised toggle: updates the desktop preference unless breakpoint-locked. */\n private applyToggle(next: boolean) {\n if (this.viewportNarrow) return;\n this.collapsed = next;\n if (this.storageKey) {\n try {\n localStorage.setItem(this.storageKey, String(next));\n } catch {\n /* unavailable */\n }\n }\n this.dsNavToggle.emit(next);\n }\n\n private getAllItems(): PanelNavItem[] {\n return this.parsedGroups.flatMap(g => g.items);\n }\n\n private getFirstRovingIndex(): number {\n return this.viewportNarrow ? 1 : 0;\n }\n\n private getFooterRovingIndex(): number {\n return 1 + this.getAllItems().length;\n }\n\n private getUserRovingIndex(): number {\n return this.getFooterRovingIndex() + 1;\n }\n\n private getRovingElement(index: number): HTMLElement | null {\n const itemCount = this.getAllItems().length;\n if (index === 0) {\n return this.viewportNarrow ? null : this.el.querySelector('.panel-nav__header-btn');\n }\n if (index >= 1 && index <= itemCount) {\n const items = this.el.querySelectorAll<HTMLElement>('.panel-nav__body .panel-nav__item');\n return items[index - 1] ?? null;\n }\n if (index === this.getFooterRovingIndex()) {\n return this.el.querySelector('.panel-nav__footer-btn .button-unfilled');\n }\n if (index === this.getUserRovingIndex()) {\n return this.el.querySelector('.panel-nav__footer-user');\n }\n return null;\n }\n\n private focusRovingAt(index: number) {\n this.rovingIndex = index;\n this.getRovingElement(index)?.focus({ preventScroll: true });\n }\n\n private activateRovingIndex(index: number) {\n const itemCount = this.getAllItems().length;\n const items = this.getAllItems();\n if (index === 0) {\n this.handleToggle();\n return;\n }\n if (index >= 1 && index <= itemCount) {\n this.handleItemClick(items[index - 1].id);\n return;\n }\n if (index === this.getFooterRovingIndex()) {\n this.handleFooterAction();\n return;\n }\n if (index === this.getUserRovingIndex()) {\n const anchor = this.el.querySelector(\n `#${PANEL_NAV_USER_MENU_ANCHOR_ID}`\n ) as HTMLElement | null;\n if (anchor)\n this.dsNavUserAction.emit({ anchor, menuPlacement: PANEL_NAV_USER_MENU_PLACEMENT });\n }\n }\n\n private handleRovingKeyDown(e: KeyboardEvent, index: number) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.activateRovingIndex(index);\n return;\n }\n\n const footerIdx = this.getFooterRovingIndex();\n const userIdx = this.getUserRovingIndex();\n const firstIdx = this.getFirstRovingIndex();\n let next: number | undefined;\n\n switch (e.key) {\n case 'ArrowDown':\n if (index === userIdx) return;\n if (index === footerIdx) next = userIdx;\n else next = index + 1;\n break;\n case 'ArrowUp':\n if (index === firstIdx) return;\n if (index === userIdx) next = footerIdx;\n else if (index === footerIdx) next = footerIdx - 1;\n else next = index - 1;\n break;\n case 'ArrowRight':\n if (index === footerIdx) next = userIdx;\n else return;\n break;\n case 'ArrowLeft':\n if (index === userIdx) next = footerIdx;\n else return;\n break;\n case 'Home':\n e.preventDefault();\n next = firstIdx;\n break;\n case 'End':\n e.preventDefault();\n next = userIdx;\n break;\n default:\n return;\n }\n\n if (next === undefined || next === index) return;\n e.preventDefault();\n this.focusRovingAt(next);\n }\n\n private handleItemClick(id: string) {\n this.dsNavSelect.emit(id);\n }\n\n private handleToggle() {\n const next = resolvePanelNavToggle(this.collapsed, this.viewportNarrow);\n if (next !== null) this.applyToggle(next);\n }\n\n /** Toggle the desktop preference. No-op while the breakpoint locks the panel collapsed. */\n @Method()\n async toggleCollapsed() {\n this.handleToggle();\n }\n\n private handleFooterAction() {\n this.dsNavFooterAction.emit();\n }\n\n private handleUserAction(e: MouseEvent) {\n const anchor = e.currentTarget as HTMLElement;\n this.dsNavUserAction.emit({ anchor, menuPlacement: PANEL_NAV_USER_MENU_PLACEMENT });\n }\n\n private clearEdgeOverlayTimer() {\n if (this.edgeOverlayTimer !== null) {\n window.clearTimeout(this.edgeOverlayTimer);\n this.edgeOverlayTimer = null;\n }\n }\n\n private handleResizeHandleMouseEnter() {\n this.clearEdgeOverlayTimer();\n if (prefersReducedMotion()) {\n this.showEdgeOverlay = true;\n return;\n }\n this.edgeOverlayTimer = window.setTimeout(() => {\n this.showEdgeOverlay = true;\n this.edgeOverlayTimer = null;\n }, 500);\n }\n\n private handleResizeHandleMouseLeave() {\n if (this.isDragging) return;\n this.clearEdgeOverlayTimer();\n this.showEdgeOverlay = false;\n }\n\n private handleResizeHandleMouseDown(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n const wasCollapsed = this.collapsed || this.viewportNarrow;\n this.isDragging = true;\n this.dragStartX = e.clientX;\n this.didSnap = false;\n this.lastDeltaX = 0;\n this.clearEdgeOverlayTimer();\n this.showEdgeOverlay = false;\n\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n\n const onMove = (ev: MouseEvent) => {\n const deltaX = ev.clientX - this.dragStartX;\n this.lastDeltaX = Math.abs(deltaX);\n if (this.didSnap) return;\n if (!wasCollapsed && deltaX < -8) {\n this.applyToggle(true);\n this.didSnap = true;\n } else if (wasCollapsed && deltaX > 8) {\n this.applyToggle(false);\n this.didSnap = true;\n }\n };\n\n const onUp = () => {\n if (!this.didSnap && this.lastDeltaX < 3) {\n this.applyToggle(!wasCollapsed);\n }\n this.isDragging = false;\n this.showEdgeOverlay = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n this.globalMouseMoveHandler = undefined;\n this.globalMouseUpHandler = undefined;\n };\n\n this.globalMouseMoveHandler = onMove;\n this.globalMouseUpHandler = onUp;\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n }\n\n private renderFooterAction(isDashboardChrome: boolean) {\n // Short chrome labels — same string for tip + aria (not \"Open/Go to …\").\n const footerLabel = isDashboardChrome ? this.settingsLabel : this.dashboardLabel;\n return (\n <ds-tooltip label={footerLabel} side=\"right\" size=\"sm\">\n <ds-button-unfilled\n variant=\"icon\"\n class=\"panel-nav__footer-btn\"\n icon={isDashboardChrome ? 'Gear' : 'Dashboard'}\n activeFill={false}\n hasBorder={false}\n focusTabIndex={this.rovingIndex === this.getFooterRovingIndex() ? 0 : -1}\n aria-label={footerLabel}\n onDsClick={() => this.handleFooterAction()}\n onKeyDown={(e: KeyboardEvent) => this.handleRovingKeyDown(e, this.getFooterRovingIndex())}\n onFocusin={() => {\n this.rovingIndex = this.getFooterRovingIndex();\n }}\n />\n </ds-tooltip>\n );\n }\n\n private renderFooterUser(collapsed: boolean, userName: string, userInitial: string) {\n // Always wrap so collapse morph CSS can transition on a stable button node.\n // Tip only when collapsed (empty label → ds-tooltip skips show).\n const tipLabel = collapsed ? this.accountLabel : '';\n const userButton = (\n <button\n type=\"button\"\n id={PANEL_NAV_USER_MENU_ANCHOR_ID}\n class={{\n 'panel-nav__item': true,\n 'panel-nav__footer-user': true,\n 'panel-nav__footer-user--menu-expanded': this.accountMenuExpanded,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n tabIndex={this.rovingIndex === this.getUserRovingIndex() ? 0 : -1}\n aria-label={this.accountLabel}\n aria-haspopup=\"menu\"\n aria-expanded={String(this.accountMenuExpanded)}\n onClick={e => this.handleUserAction(e)}\n onKeyDown={(e: KeyboardEvent) => this.handleRovingKeyDown(e, this.getUserRovingIndex())}\n onFocus={() => {\n this.rovingIndex = this.getUserRovingIndex();\n }}\n >\n <ds-text\n class=\"panel-nav__item-label panel-nav__footer-user-label panel-nav__item-label-text ds-control--md\"\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis\n color=\"inherit\"\n lineTruncation={1}\n >\n {userName}\n </ds-text>\n <span class=\"panel-nav__item-icon panel-nav__footer-user-icon\" aria-hidden=\"true\">\n <span class=\"panel-nav__footer-icon-expanded\">\n <ds-icon name=\"ChevronUpDown\" size=\"md\" color=\"inherit\" />\n </span>\n <span class=\"panel-nav__footer-icon-collapsed\">\n <ds-icon name=\"Circle\" size=\"md\" color=\"inherit\" />\n <ds-text\n class=\"panel-nav__user-initial\"\n as=\"span\"\n variant=\"text-caption\"\n emphasis\n align=\"center\"\n color=\"inherit\"\n >\n {userInitial}\n </ds-text>\n </span>\n </span>\n </button>\n );\n\n return (\n <ds-tooltip label={tipLabel} side=\"right\" size=\"sm\">\n {userButton}\n </ds-tooltip>\n );\n }\n\n private renderNavItem(item: PanelNavItem, idx: number, collapsed: boolean) {\n const isActive = item.id === this.effectiveActiveId;\n const rovingPosition = idx + 1;\n\n const itemContent = [\n <span class=\"panel-nav__item-icon\">\n <ds-icon name={item.icon} size=\"md\" color=\"inherit\" />\n </span>,\n <ds-text\n class=\"panel-nav__item-label panel-nav__item-label-text ds-control--md\"\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis={isActive}\n color=\"inherit\"\n lineTruncation={1}\n >\n {item.label}\n </ds-text>,\n item.dot && (\n <span class=\"panel-nav__item-dot-box\" aria-hidden=\"true\">\n <ds-badge class=\"panel-nav__item-dot\" variant=\"dot\" hasRing={collapsed} label=\"\" />\n </span>\n ),\n ];\n\n const sharedProps = {\n class: {\n 'panel-nav__item': true,\n 'panel-nav__item--active': isActive,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n },\n 'aria-current': isActive ? ('page' as const) : undefined,\n tabIndex: rovingPosition === this.rovingIndex ? 0 : -1,\n onClick: () => this.handleItemClick(item.id),\n onKeyDown: (e: KeyboardEvent) => this.handleRovingKeyDown(e, rovingPosition),\n onFocus: () => {\n this.rovingIndex = rovingPosition;\n },\n };\n\n const href = resolveSafeUrl(item.href);\n const useAnchor = this.routerMode === 'anchor' && href;\n const control = useAnchor ? (\n <a {...sharedProps} href={href}>\n {itemContent}\n </a>\n ) : (\n <button {...sharedProps} type=\"button\">\n {itemContent}\n </button>\n );\n\n // Always wrap so label fade CSS can transition on a stable item node.\n // Tip only when collapsed (empty label → ds-tooltip skips show).\n return (\n <ds-tooltip label={collapsed ? item.label : ''} side=\"right\" size=\"sm\">\n {control}\n </ds-tooltip>\n );\n }\n\n render() {\n const chromeStyle = this.renderedStyle;\n const isDashboardChrome = chromeStyle === 'dashboard';\n const isDashboard = this.navStyle === 'dashboard';\n const collapsed = this.collapsed || this.viewportNarrow;\n const { userName, userInitial } = this;\n\n const navCls: Record<string, boolean> = {\n 'panel-nav': true,\n 'ds-control--md': true,\n 'panel-nav--dashboard': isDashboard,\n 'panel-nav--settings': !isDashboard,\n 'panel-nav--collapsed': collapsed,\n 'panel-nav--breakpoint-locked': this.viewportNarrow,\n 'panel-nav--animating': this.isAnimating,\n };\n\n return (\n <Host style={{ display: 'block', position: 'relative' }}>\n <nav\n class={navCls}\n aria-label={\n isDashboardChrome ? this.dashboardNavigationLabel : this.settingsNavigationLabel\n }\n >\n {/* ── Header: Motive logo, reveals collapse toggle on hover ── */}\n <div class=\"panel-nav__header ds-chrome-row ds-chrome-space--md\">\n <button\n type=\"button\"\n class=\"panel-nav__header-btn ds-focus-ring-inset ds-interaction-fill\"\n disabled={this.viewportNarrow}\n tabIndex={!this.viewportNarrow && this.rovingIndex === 0 ? 0 : -1}\n onClick={() => this.handleToggle()}\n onKeyDown={(e: KeyboardEvent) => this.handleRovingKeyDown(e, 0)}\n onFocus={() => {\n this.rovingIndex = 0;\n }}\n aria-label={collapsed ? this.expandNavigationLabel : this.collapseNavigationLabel}\n aria-expanded={collapsed ? 'false' : 'true'}\n >\n {/* Motive M mark — fades out on hover to reveal collapse toggle */}\n <span class=\"panel-nav__header-logo\" aria-hidden=\"true\">\n <svg\n class=\"panel-nav__m-mark\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n focusable=\"false\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M11.1159 4.31537H7.67021L2.53401 13.0703H0V15.6875H4.02716L8.24319 8.49978V15.6846H11.6342L15.8289 8.47829V15.6846H18.7122V4.3125H15.2559L11.1159 11.3648V4.31537Z\"\n fill=\"currentColor\"\n />\n </svg>\n </span>\n {/* Collapse / expand icon — revealed on hover via CSS */}\n <span class=\"panel-nav__header-toggle\" aria-hidden=\"true\">\n <ds-icon\n name={collapsed ? 'LeftExpandB' : 'LeftCollapseB'}\n size=\"md\"\n color=\"inherit\"\n />\n </span>\n </button>\n </div>\n\n {/* ── Scrollable body ── */}\n <div\n class={{\n 'panel-nav__body': true,\n 'ds-chrome-column': true,\n 'ds-chrome-space--md': true,\n 'ds-scrollbar-hidden': true,\n 'ds-focus-ring': this.bodyScrollable,\n ...scrollEdgeFadeClassMap({ edges: 'bottom' }),\n }}\n ref={element => {\n const next = (element as HTMLElement) ?? undefined;\n if (next === this.bodyEl) return;\n this.bodyEl = next;\n this.connectScrollRegionObserver();\n }}\n role={this.bodyScrollable ? 'region' : undefined}\n aria-label={this.bodyScrollable ? this.navigationItemsLabel : undefined}\n tabIndex={this.bodyScrollable ? 0 : undefined}\n >\n <div class=\"panel-nav__sections\">\n {(() => {\n let flatIdx = 0;\n return this.parsedGroups.map(group => (\n <div class=\"panel-nav__group\">\n {group.label && (\n <ds-text\n class=\"panel-nav__group-label ds-control--md\"\n as=\"span\"\n variant=\"text-caption\"\n emphasis\n color=\"inherit\"\n >\n {group.label}\n </ds-text>\n )}\n {group.items.map(item => this.renderNavItem(item, flatIdx++, collapsed))}\n </div>\n ));\n })()}\n </div>\n </div>\n\n {/* ── Footer ── */}\n <div class=\"panel-nav__footer\">\n {this.renderFooterAction(isDashboardChrome)}\n {this.renderFooterUser(collapsed, userName, userInitial)}\n </div>\n </nav>\n\n {/* Drag-to-resize handle — always rendered, hidden only when auto-collapsed by breakpoint */}\n {!this.viewportNarrow && (\n <div\n class={{\n 'panel-nav__resize-handle': true,\n 'panel-nav__resize-handle--overlay': this.showEdgeOverlay,\n }}\n onMouseEnter={() => this.handleResizeHandleMouseEnter()}\n onMouseLeave={() => this.handleResizeHandleMouseLeave()}\n onMouseDown={(e: MouseEvent) => this.handleResizeHandleMouseDown(e)}\n aria-hidden=\"true\"\n />\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import{p as e,H as i,c as t,h as r,a as n,t as o}from"./index.js";import{o as s,d}from"./p-ag6Io-kL.js";import{A as c,r as a}from"./p-CY4YFAT3.js";import{r as l,A as f}from"./p-D1eEgwcP.js";import{C as u}from"./p-C6DNhlES.js";import{c as h}from"./p-Cxr0IQjC.js";import{d as m}from"./p-BUDAwJVV.js";import{d as g}from"./p-BknXYAEc.js";import{d as v}from"./p-BFfLvMZd.js";import{d as p}from"./p-JPTkZ3Ji.js";import{d as b}from"./p-Cg0kimXZ.js";import{d as x}from"./p-CAnnQL1F.js";import{d as y}from"./p-iMuFgSoM.js";import{a as w,b as _,T as k}from"./p-DFQ9mcbK.js";import{r as C}from"./p-BMc0DE59.js";import{C as z}from"./p-CuwopElg.js";import{c as I}from"./p-DuFm-ieS.js";const F=()=>`@media (forced-colors: active){.sc-ds-filter-menu:root,.sc-ds-filter-menu-h,.ds-forced-colors-scope.sc-ds-filter-menu{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}.sc-ds-filter-menu-h{--ds-focus-ring-width:var(--dimension-stroke-width-025, 2px);--ds-focus-ring-offset:var(--dimension-space-025, 2px);--ds-focus-ring-color:var(--color-interaction-focus)}.ds-focus-ring.sc-ds-filter-menu-h,.ds-focus-ring.sc-ds-filter-menu,.ds-focus-ring-inset.sc-ds-filter-menu-h,.ds-focus-ring-inset.sc-ds-filter-menu{outline:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation}.ds-focus-ring.sc-ds-filter-menu-h:focus-visible,.ds-focus-ring.sc-ds-filter-menu:focus-visible{outline:var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);outline-offset:var(--ds-focus-ring-offset)}.ds-focus-ring.ds-focus-ring--visible.sc-ds-filter-menu-h,.ds-focus-ring.ds-focus-ring--visible.sc-ds-filter-menu{outline:var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);outline-offset:var(--ds-focus-ring-offset)}.ds-focus-ring-inset.sc-ds-filter-menu-h:focus-visible,.ds-focus-ring-inset.sc-ds-filter-menu:focus-visible{outline:none}.ds-focus-ring-inset.sc-ds-filter-menu-h:focus-visible::after,.ds-focus-ring-inset.sc-ds-filter-menu:focus-visible::after{outline:var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);outline-offset:calc(-1 * var(--ds-focus-ring-width))}.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-filter-menu-h,.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-filter-menu{outline:none}.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-filter-menu-h::after,.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-filter-menu::after{outline:var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);outline-offset:calc(-1 * var(--ds-focus-ring-width))}@media (forced-colors: active){.sc-ds-filter-menu-h{--ds-focus-ring-color:var(--ds-forced-color-selected)}}@media (forced-colors: active){.sc-ds-filter-menu:root,.sc-ds-filter-menu-h,.ds-forced-colors-scope.sc-ds-filter-menu{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}@media (forced-colors: active){.sc-ds-filter-menu:root,.sc-ds-filter-menu-h,.ds-forced-colors-scope.sc-ds-filter-menu{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}.ds-interaction-fill.sc-ds-filter-menu-h,.ds-interaction-fill.sc-ds-filter-menu{position:var(--ds-interaction-position, relative);z-index:var(--ds-interaction-z-index, 0);cursor:default;--ds-interaction-hover:var(--color-interaction-hover);--ds-interaction-pressed:var(--color-interaction-pressed);--ds-interaction-active:var(--color-interaction-active-brand);--ds-interaction-border-width:0px;--ds-interaction-border-color:transparent;--ds-interaction-divider-width:0px;--ds-interaction-divider-color:transparent;--ds-interaction-divider-inline-start-width:0px;--ds-interaction-divider-inline-start-color:transparent;--ds-interaction-divider-inline-end-width:0px;--ds-interaction-divider-inline-end-color:transparent}.ds-interaction-fill.sc-ds-filter-menu-h::before,.ds-interaction-fill.sc-ds-filter-menu::before,.ds-interaction-fill.sc-ds-filter-menu-h::after,.ds-interaction-fill.sc-ds-filter-menu::after{content:'';position:absolute;inset:0;border-radius:inherit;background:transparent;pointer-events:none;cursor:inherit;transition:none}.ds-interaction-fill.sc-ds-filter-menu-h::before,.ds-interaction-fill.sc-ds-filter-menu::before{z-index:1}.ds-interaction-fill.sc-ds-filter-menu-h::after,.ds-interaction-fill.sc-ds-filter-menu::after{z-index:3;box-shadow:inset 0 calc(-1 * var(--ds-interaction-divider-width)) 0 var(--ds-interaction-divider-color), inset var(--ds-interaction-divider-inline-start-width) 0 0 var(--ds-interaction-divider-inline-start-color), inset calc(-1 * var(--ds-interaction-divider-inline-end-width)) 0 0 var(--ds-interaction-divider-inline-end-color), inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color)}.ds-interaction-fill--bordered.sc-ds-filter-menu-h,.ds-interaction-fill--bordered.sc-ds-filter-menu{--ds-interaction-border-width:var(--dimension-stroke-width-012);--ds-interaction-border-color:var(--color-border-secondary)}.ds-interaction-fill--selected.sc-ds-filter-menu-h::before,.ds-interaction-fill--selected.sc-ds-filter-menu::before{background:var(--ds-interaction-active)}.ds-interaction-fill--selected.sc-ds-filter-menu-h,.ds-interaction-fill--selected.sc-ds-filter-menu{--ds-interaction-dot-ring:var(--ds-interaction-active)}@media (hover: hover) and (pointer: fine){.ds-interaction-fill.sc-ds-filter-menu-h:hover:not(:disabled)::after,.ds-interaction-fill.sc-ds-filter-menu:hover:not(:disabled)::after{background:var(--ds-interaction-hover)}}.ds-interaction-fill.sc-ds-filter-menu-h:active:not(:disabled)::after,.ds-interaction-fill.sc-ds-filter-menu:active:not(:disabled)::after{background:var(--ds-interaction-pressed)}.ds-interaction-fill--grouped.sc-ds-filter-menu-h::after,.ds-interaction-fill--grouped.sc-ds-filter-menu::after,.ds-interaction-fill--grouped.sc-ds-filter-menu-h:active:not(:disabled)::after,.ds-interaction-fill--grouped.sc-ds-filter-menu:active:not(:disabled)::after{background:var(--ds-interaction-group-fill, transparent)}@media (hover: hover) and (pointer: fine){.ds-interaction-fill--grouped.sc-ds-filter-menu-h:hover:not(:disabled)::after,.ds-interaction-fill--grouped.sc-ds-filter-menu:hover:not(:disabled)::after{background:var(--ds-interaction-group-fill, transparent)}}.ds-interaction-fill--grouped.sc-ds-filter-menu-h,.ds-interaction-fill--grouped.sc-ds-filter-menu{--ds-interaction-divider-width:var(--ds-interaction-group-divider-width, 0px);--ds-interaction-divider-color:var(--ds-interaction-group-divider-color, transparent);--ds-interaction-divider-inline-start-width:var( --ds-interaction-group-divider-inline-start-width, 0px );--ds-interaction-divider-inline-start-color:var( --ds-interaction-group-divider-inline-start-color, transparent );--ds-interaction-divider-inline-end-width:var( --ds-interaction-group-divider-inline-end-width, 0px );--ds-interaction-divider-inline-end-color:var( --ds-interaction-group-divider-inline-end-color, transparent )}.ds-interaction-fill.sc-ds-filter-menu-h>.ds-interaction-fill__content.sc-ds-filter-menu,.ds-interaction-fill.sc-ds-filter-menu>.ds-interaction-fill__content.sc-ds-filter-menu,.ds-interaction-fill__content.sc-ds-filter-menu{position:relative;z-index:2;cursor:inherit}.ds-interaction-fill--on-faint.sc-ds-filter-menu-h,.ds-interaction-fill--on-faint.sc-ds-filter-menu{--ds-interaction-active:var(--color-interaction-active)}.ds-interaction-fill--on-medium.sc-ds-filter-menu-h,.ds-interaction-fill--on-medium.sc-ds-filter-menu{--ds-interaction-hover:var(--color-interaction-on-medium-background-hover);--ds-interaction-pressed:var(--color-interaction-on-medium-background-pressed);--ds-interaction-active:var(--color-interaction-on-medium-background-active);--ds-focus-ring-color:var(--color-interaction-on-medium-background-focus)}.ds-interaction-fill--on-bold.sc-ds-filter-menu-h,.ds-interaction-fill--on-bold.sc-ds-filter-menu{--ds-interaction-hover:var(--color-interaction-on-bold-background-hover);--ds-interaction-pressed:var(--color-interaction-on-bold-background-pressed);--ds-interaction-active:var(--color-interaction-on-bold-background-active);--ds-focus-ring-color:var(--color-interaction-on-bold-background-focus)}.ds-interaction-fill--on-strong.sc-ds-filter-menu-h,.ds-interaction-fill--on-strong.sc-ds-filter-menu{--ds-interaction-hover:var(--color-interaction-on-strong-background-hover);--ds-interaction-pressed:var(--color-interaction-on-strong-background-pressed);--ds-interaction-active:var(--color-interaction-on-strong-background-active);--ds-focus-ring-color:var(--color-interaction-on-strong-background-focus)}.ds-interaction-fill--on-translucent.sc-ds-filter-menu-h,.ds-interaction-fill--on-translucent.sc-ds-filter-menu{--ds-interaction-hover:var(--color-translucent-interaction-hover);--ds-interaction-pressed:var(--color-translucent-interaction-pressed);--ds-interaction-active:var(--color-translucent-interaction-active-brand);--ds-focus-ring-color:var(--color-translucent-interaction-focus)}.ds-interaction-fill--on-inverted.sc-ds-filter-menu-h,.ds-interaction-fill--on-inverted.sc-ds-filter-menu{--ds-interaction-hover:var(--color-inverted-interaction-hover);--ds-interaction-pressed:var(--color-inverted-interaction-pressed);--ds-interaction-active:var(--color-inverted-interaction-active-brand);--ds-focus-ring-color:var(--color-inverted-interaction-focus)}.ds-interaction-fill--on-media.sc-ds-filter-menu-h,.ds-interaction-fill--on-media.sc-ds-filter-menu{--ds-interaction-hover:var(--color-media-interaction-hover);--ds-interaction-pressed:var(--color-media-interaction-pressed);--ds-interaction-active:var(--color-media-interaction-active);--ds-focus-ring-color:var(--color-media-interaction-focus)}.ds-interaction-fill--on-always-dark.sc-ds-filter-menu-h,.ds-interaction-fill--on-always-dark.sc-ds-filter-menu{--ds-interaction-hover:var(--color-always-dark-interaction-hover);--ds-interaction-pressed:var(--color-always-dark-interaction-pressed);--ds-interaction-active:var(--color-always-dark-interaction-active-brand);--ds-focus-ring-color:var(--color-always-dark-interaction-focus)}.ds-interaction-fill--on-navigation.sc-ds-filter-menu-h,.ds-interaction-fill--on-navigation.sc-ds-filter-menu{--ds-interaction-hover:var(--color-navigation-interaction-hover);--ds-interaction-pressed:var(--color-navigation-interaction-pressed);--ds-interaction-active:var(--color-navigation-interaction-active);--ds-focus-ring-color:var(--color-navigation-interaction-focus)}@media (forced-colors: active){.ds-interaction-fill.sc-ds-filter-menu-h::after,.ds-interaction-fill.sc-ds-filter-menu::after{box-shadow:none;outline:var(--ds-interaction-border-width) solid var(--ds-forced-color-control-boundary);outline-offset:calc(-1 * var(--ds-interaction-border-width))}.ds-interaction-fill--selected.sc-ds-filter-menu-h::before,.ds-interaction-fill--selected.sc-ds-filter-menu::before{background:transparent;outline:var(--dimension-stroke-width-025) solid var(--ds-forced-color-selected);outline-offset:calc(-1 * var(--dimension-stroke-width-025))}}@media (forced-colors: active) and (hover: hover) and (pointer: fine){.ds-interaction-fill.sc-ds-filter-menu-h:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(.ds-focus-ring--visible)::after,.ds-interaction-fill.sc-ds-filter-menu:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(.ds-focus-ring--visible)::after{outline-color:var(--ds-forced-color-selected);outline-width:var(--dimension-stroke-width-012)}}@media (forced-colors: active){.sc-ds-filter-menu:root,.sc-ds-filter-menu-h,.ds-forced-colors-scope.sc-ds-filter-menu{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}.ds-control-inactive.sc-ds-filter-menu-h,.ds-control-inactive.sc-ds-filter-menu{opacity:var(--effect-opacity-medium);pointer-events:none;cursor:not-allowed}@media (forced-colors: active){.ds-control-inactive.sc-ds-filter-menu-h,.ds-control-inactive.sc-ds-filter-menu{color:var(--ds-forced-color-disabled);opacity:1}}.ds-control--lg.sc-ds-filter-menu,.ds-control--lg.sc-ds-filter-menu-h,.ds-control--md.sc-ds-filter-menu-h,.ds-control--md.sc-ds-filter-menu,.ds-control--sm.sc-ds-filter-menu-h,.ds-control--sm.sc-ds-filter-menu,.ds-control--xs.sc-ds-filter-menu-h,.ds-control--xs.sc-ds-filter-menu{--ds-control-radius:var(--dimension-radius-025)}.ds-control--lg.sc-ds-filter-menu-h,.ds-control--lg.sc-ds-filter-menu{--ds-control-height:var(--dimension-size-500);--ds-control-icon:var(--dimension-iconography-lg);--ds-control-padding-inline:var(--dimension-space-100);--ds-control-label-inset:var(--dimension-space-050);--ds-control-gap:var(--dimension-space-050)}.ds-control--md.sc-ds-filter-menu-h,.ds-control--md.sc-ds-filter-menu{--ds-control-height:var(--dimension-size-400);--ds-control-icon:var(--dimension-iconography-md);--ds-control-padding-inline:var(--dimension-space-075);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-050)}.ds-control--sm.sc-ds-filter-menu-h,.ds-control--sm.sc-ds-filter-menu{--ds-control-height:var(--dimension-size-300);--ds-control-icon:var(--dimension-iconography-sm);--ds-control-padding-inline:var(--dimension-space-050);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-025)}.ds-control--xs.sc-ds-filter-menu-h,.ds-control--xs.sc-ds-filter-menu{--ds-control-height:var(--dimension-size-200);--ds-control-icon:var(--dimension-iconography-xs);--ds-control-padding-inline:var(--dimension-space-025);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:0}.ds-chrome-space--sm.sc-ds-filter-menu-h,.ds-chrome-space--sm.sc-ds-filter-menu{--ds-chrome-padding:var(--dimension-space-050);--ds-chrome-gap:var(--dimension-space-050)}.ds-chrome-space--md.sc-ds-filter-menu-h,.ds-chrome-space--md.sc-ds-filter-menu{--ds-chrome-padding:var(--dimension-space-100);--ds-chrome-gap:var(--dimension-space-100)}.ds-chrome-space--lg.sc-ds-filter-menu-h,.ds-chrome-space--lg.sc-ds-filter-menu{--ds-chrome-padding:var(--dimension-space-200);--ds-chrome-gap:var(--dimension-space-200)}.ds-chrome-row.sc-ds-filter-menu-h,.ds-chrome-row.sc-ds-filter-menu,.ds-chrome-column.sc-ds-filter-menu-h,.ds-chrome-column.sc-ds-filter-menu,.ds-chrome-grid.sc-ds-filter-menu-h,.ds-chrome-grid.sc-ds-filter-menu{display:flex;box-sizing:border-box;gap:var(--ds-chrome-gap, var(--dimension-space-100));padding:var(--ds-chrome-padding, var(--dimension-space-100))}.ds-chrome-row.sc-ds-filter-menu-h,.ds-chrome-row.sc-ds-filter-menu{flex-direction:row;align-items:center}.ds-chrome-column.sc-ds-filter-menu-h,.ds-chrome-column.sc-ds-filter-menu{flex-direction:column}.ds-chrome-grid.sc-ds-filter-menu-h,.ds-chrome-grid.sc-ds-filter-menu{display:grid;align-items:center}.ds-control-frame.sc-ds-filter-menu{display:inline-flex;align-items:center;box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));padding-inline:var(--ds-control-padding-inline, var(--dimension-space-075));gap:var(--ds-control-gap, var(--dimension-space-050));border-radius:var(--ds-control-radius, var(--dimension-radius-025))}.ds-control-section-heading.sc-ds-filter-menu{display:flex;align-items:center;box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));padding-inline:calc( var(--ds-control-padding-inline, var(--dimension-space-075)) + var(--ds-control-label-inset, var(--dimension-space-025)) )}.ds-control-icon-box.sc-ds-filter-menu{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--ds-control-icon, var(--dimension-iconography-md));height:var(--ds-control-icon, var(--dimension-iconography-md))}.ds-control-label-box.sc-ds-filter-menu{min-width:0;padding-inline:var(--ds-control-label-inset, var(--dimension-space-025))}.ds-control-label-dot.sc-ds-filter-menu{position:relative;padding-inline-end:calc( var(--ds-control-label-inset, var(--dimension-space-025)) + var(--ds-control-gap, var(--dimension-space-050)) )}.ds-control-label-dot__badge.sc-ds-filter-menu{position:absolute;inset-block-start:0;inset-inline-end:0;pointer-events:none}.ds-empty-region.sc-ds-filter-menu{display:flex;flex:1 1 auto;align-items:center;justify-content:center;box-sizing:border-box;min-width:0;min-height:0}.ds-empty-region--padded.sc-ds-filter-menu{padding:var(--dimension-space-200)}.sc-ds-filter-menu:where(.ds-text-decoration,.ds-text-action).sc-ds-filter-menu{text-decoration-color:var(--ds-text-decoration-color, var(--color-foreground-tertiary));text-decoration-thickness:var(--ds-text-decoration-thickness, var(--dimension-stroke-width-012));text-underline-offset:var(--ds-text-decoration-offset, var(--dimension-space-025))}.ds-text-action.sc-ds-filter-menu{--ds-text-action-foreground:var(--color-foreground-bold-brand);--ds-text-decoration-color:var(--ds-text-action-foreground);color:var(--ds-text-action-foreground);text-decoration-line:none}.ds-text-action--on-medium.sc-ds-filter-menu{--ds-text-action-foreground:var(--color-foreground-on-medium-background-primary);--ds-text-decoration-color:var(--color-foreground-on-medium-background-secondary);text-decoration-line:underline}.ds-text-action--on-strong.sc-ds-filter-menu{--ds-text-action-foreground:var(--color-foreground-on-strong-background-primary);--ds-text-decoration-color:var(--color-foreground-on-strong-background-secondary);text-decoration-line:underline}.ds-text-action--on-bold.sc-ds-filter-menu{--ds-text-action-foreground:var(--color-foreground-on-bold-background-primary);--ds-text-decoration-color:var(--color-foreground-on-bold-background-secondary);text-decoration-line:underline}@media (hover: hover) and (pointer: fine){.ds-text-action.sc-ds-filter-menu:hover{text-decoration-line:underline}}@media (forced-colors: active){.ds-text-action.sc-ds-filter-menu{text-decoration-line:underline;text-decoration-color:currentcolor}}.ds-choice-popup.sc-ds-filter-menu{box-sizing:border-box;display:flex;flex-direction:column;min-width:var(--ds-choice-popup-min-inline-size, var(--dimension-menu-width-xs));max-width:min(var(--dimension-panel-width-lg), calc(100vw - var(--dimension-space-200)));max-height:calc(100vh - var(--dimension-space-200));overflow:hidden;inset:auto;margin:0;padding:0;border:0;background-color:var(--color-background-primary);border-radius:var(--dimension-radius-075);box-shadow:var(--effect-shadow-elevated-floating);color:var(--color-foreground-secondary);animation:dsChoiceFadeIn var(--effect-motion-short-2) forwards;backface-visibility:hidden;will-change:transform;text-align:start}.ds-choice-popup.sc-ds-filter-menu::after{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;box-shadow:var(--effect-highlight-elevated-floating)}.ds-choice-popup--closing.sc-ds-filter-menu{animation:dsChoiceFadeOut var(--effect-motion-short-2) forwards}@keyframes dsChoiceFadeIn{from{opacity:0;transform:inherit scale(0.97)}to{opacity:1}}@keyframes dsChoiceFadeOut{from{opacity:1}to{opacity:0}}@media (prefers-reduced-motion: reduce){.ds-choice-popup.sc-ds-filter-menu{animation:none;opacity:1}.ds-choice-popup--closing.sc-ds-filter-menu{opacity:0}}.ds-choice-list.sc-ds-filter-menu{display:flex;flex-direction:column;min-height:0;overflow-y:auto;overscroll-behavior:contain}.ds-choice-section--divided.sc-ds-filter-menu{border-bottom:var(--dimension-stroke-width-015) solid var(--color-border-tertiary)}ds-text.ds-choice-section__header.sc-ds-filter-menu{text-align:start;-webkit-user-select:none;user-select:none}.ds-choice-section--headed-after-first.sc-ds-filter-menu{margin-block-start:var(--dimension-space-050)}.ds-choice-item.sc-ds-filter-menu{width:100%;border:none;border-radius:var(--ds-control-radius, var(--dimension-radius-025));background:transparent;cursor:default;-webkit-user-select:none;user-select:none;text-align:left;color:inherit}.ds-choice-item.sc-ds-filter-menu:has(.ds-choice-item__subtext){height:auto;min-height:var(--ds-control-height, var(--dimension-size-400));padding-block:var(--ds-control-padding-inline, var(--dimension-space-075));align-items:flex-start}.ds-choice-item__content.sc-ds-filter-menu{display:flex;flex:1;flex-direction:column;gap:var(--dimension-space-025);min-width:0}ds-text.ds-choice-item__label.sc-ds-filter-menu{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}ds-text.ds-choice-item__subtext.sc-ds-filter-menu{display:-webkit-box;overflow:hidden;white-space:normal;-webkit-box-orient:vertical;-webkit-line-clamp:2}.ds-choice-item__icon.sc-ds-filter-menu,.ds-choice-item__suffix.sc-ds-filter-menu{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--ds-control-icon, var(--dimension-iconography-md));height:var(--ds-control-icon, var(--dimension-iconography-md));pointer-events:none}.ds-choice-item.ds-interaction-fill--selected.sc-ds-filter-menu .ds-choice-item__icon.sc-ds-filter-menu{color:var(--color-foreground-primary)}.ds-choice-item__tag.sc-ds-filter-menu{flex-shrink:0;pointer-events:none}.ds-choice-empty.sc-ds-filter-menu,.ds-choice-loading.sc-ds-filter-menu{min-height:var(--dimension-size-600);padding:var(--dimension-space-100)}.ds-choice-footer.sc-ds-filter-menu{position:relative;box-sizing:border-box;padding-block:var(--dimension-space-050)}.ds-choice-footer.sc-ds-filter-menu::before{content:'';position:absolute;inset:0 0 auto;height:var(--dimension-stroke-width-012);background-color:var(--color-border-tertiary);pointer-events:none}.ds-choice-footer__content.sc-ds-filter-menu{display:flex;align-items:center;justify-content:space-between;column-gap:var(--dimension-space-050);box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400))}.ds-choice-footer__summary.sc-ds-filter-menu,.ds-choice-footer__summary-measure.sc-ds-filter-menu,.ds-choice-footer__clear.sc-ds-filter-menu ds-text.sc-ds-filter-menu,.ds-choice-footer__action.sc-ds-filter-menu ds-text.sc-ds-filter-menu{padding-inline:calc( var(--dimension-space-050) + var(--ds-control-padding-inline, var(--dimension-space-075)) + var(--ds-control-label-inset, var(--dimension-space-025)) )}.ds-choice-footer__summary.sc-ds-filter-menu,.ds-choice-footer__summary-measure.sc-ds-filter-menu,.ds-choice-footer__clear.sc-ds-filter-menu,.ds-choice-footer__action.sc-ds-filter-menu{white-space:nowrap}.ds-choice-footer__summary-measure.sc-ds-filter-menu{position:absolute;visibility:hidden;pointer-events:none}.ds-choice-footer__clear.sc-ds-filter-menu,.ds-choice-footer__action.sc-ds-filter-menu{appearance:none;display:inline-flex;align-items:center;padding:0;border:0;border-radius:var(--dimension-radius-025);background:transparent;cursor:default}@media (forced-colors: active){.ds-choice-popup.sc-ds-filter-menu{outline:var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);outline-offset:calc(-1 * var(--dimension-stroke-width-012))}.ds-choice-popup.sc-ds-filter-menu::after{box-shadow:none}.ds-choice-section--divided.sc-ds-filter-menu{border-bottom-color:var(--ds-forced-color-content)}.ds-choice-footer.sc-ds-filter-menu::before{background-color:var(--ds-forced-color-content)}}.ds-control-frame.sc-ds-filter-menu{display:inline-flex;align-items:center;box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));padding-inline:var(--ds-control-padding-inline, var(--dimension-space-075));gap:var(--ds-control-gap, var(--dimension-space-050));border-radius:var(--ds-control-radius, var(--dimension-radius-025))}.ds-control-section-heading.sc-ds-filter-menu{display:flex;align-items:center;box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));padding-inline:calc( var(--ds-control-padding-inline, var(--dimension-space-075)) + var(--ds-control-label-inset, var(--dimension-space-025)) )}.ds-control-icon-box.sc-ds-filter-menu{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--ds-control-icon, var(--dimension-iconography-md));height:var(--ds-control-icon, var(--dimension-iconography-md))}.ds-control-label-box.sc-ds-filter-menu{min-width:0;padding-inline:var(--ds-control-label-inset, var(--dimension-space-025))}.ds-control-label-dot.sc-ds-filter-menu{position:relative;padding-inline-end:calc( var(--ds-control-label-inset, var(--dimension-space-025)) + var(--ds-control-gap, var(--dimension-space-050)) )}.ds-control-label-dot__badge.sc-ds-filter-menu{position:absolute;inset-block-start:0;inset-inline-end:0;pointer-events:none}.ds-control-width--hug.sc-ds-filter-menu-h,.ds-control-width--hug.sc-ds-filter-menu{width:fit-content;max-width:100%;flex:0 0 auto;align-self:flex-start}.ds-control-width--fill.sc-ds-filter-menu-h,.ds-control-width--fill.sc-ds-filter-menu{width:100%;min-width:0;flex:1 1 auto;align-self:stretch}.ds-select-trigger-host.sc-ds-filter-menu-h{display:inline-flex;position:relative;min-inline-size:0;outline:none;--ds-select-fg:var(--color-foreground-secondary);--ds-select-fg-active:var(--color-foreground-primary);--ds-select-prefix-fg:var(--ds-select-fg);--ds-select-chevron-fg:var(--ds-select-fg);--ds-select-border:var(--color-border-secondary)}.ds-control-width--fill.sc-ds-filter-menu-h .trigger.sc-ds-filter-menu{width:100%}.trigger.sc-ds-filter-menu{justify-content:flex-start;box-sizing:border-box;inline-size:100%;max-inline-size:100%;min-inline-size:0;background:transparent;border:none;border-radius:var(--ds-control-radius, var(--dimension-radius-025));color:var(--ds-select-fg);cursor:default;font-family:inherit;-webkit-user-select:none;user-select:none;overflow:hidden;transition:color var(--effect-motion-short-2)}.trigger--bordered.sc-ds-filter-menu{--ds-interaction-border-width:var(--dimension-stroke-width-012);--ds-interaction-border-color:var(--ds-select-border)}.trigger--expanded.sc-ds-filter-menu{--ds-interaction-hover:var(--ds-interaction-pressed)}.trigger--expanded.sc-ds-filter-menu::after{background:var(--ds-interaction-pressed)}.trigger--has-value.sc-ds-filter-menu .trigger__label-box.sc-ds-filter-menu{color:var(--ds-select-fg-active)}.trigger--label-placeholder.sc-ds-filter-menu .trigger__label-box.sc-ds-filter-menu{color:var(--ds-select-fg)}.trigger__prefix.sc-ds-filter-menu,.trigger__chevron.sc-ds-filter-menu{position:relative;z-index:2}.trigger__prefix.sc-ds-filter-menu{color:var(--ds-select-prefix-fg)}.trigger__chevron.sc-ds-filter-menu{color:var(--ds-select-chevron-fg)}.trigger__label-box.sc-ds-filter-menu{position:relative;z-index:2;display:flex;align-items:center;flex:1 1 auto;overflow:hidden;text-align:left;color:inherit;transition:color var(--effect-motion-short-2)}.trigger__label-content.sc-ds-filter-menu{display:inline-flex;align-items:center;flex:1 1 auto;max-width:100%;min-width:0;overflow:hidden}.trigger__label.sc-ds-filter-menu{flex:1 1 auto;min-width:0;max-width:100%;overflow:hidden}.ds-select-trigger-host--background-medium.sc-ds-filter-menu-h{--ds-select-fg:var(--color-foreground-on-medium-background-secondary);--ds-select-fg-active:var(--color-foreground-on-medium-background-primary);--ds-select-border:var(--color-border-on-medium-background-secondary)}.ds-select-trigger-host--background-bold.sc-ds-filter-menu-h{--ds-select-fg:var(--color-foreground-on-bold-background-secondary);--ds-select-fg-active:var(--color-foreground-on-bold-background-primary);--ds-select-border:var(--color-border-on-bold-background-secondary)}.ds-select-trigger-host--background-strong.sc-ds-filter-menu-h{--ds-select-fg:var(--color-foreground-on-strong-background-secondary);--ds-select-fg-active:var(--color-foreground-on-strong-background-primary);--ds-select-border:var(--color-border-on-strong-background-secondary)}.ds-select-trigger-host--background-translucent.sc-ds-filter-menu-h{--ds-select-fg:var(--color-translucent-foreground-secondary);--ds-select-fg-active:var(--color-translucent-foreground-primary);--ds-select-border:var(--color-translucent-border-secondary)}.ds-select-trigger-host--background-inverted.sc-ds-filter-menu-h{--ds-select-fg:var(--color-inverted-foreground-secondary);--ds-select-fg-active:var(--color-inverted-foreground-primary);--ds-select-border:var(--color-inverted-border-secondary)}.ds-select-trigger-host--background-media.sc-ds-filter-menu-h{--ds-select-fg:var(--color-media-foreground-secondary);--ds-select-fg-active:var(--color-media-foreground-primary);--ds-select-border:var(--color-media-border-secondary)}.ds-select-trigger-host--background-always-dark.sc-ds-filter-menu-h{--ds-select-fg:var(--color-always-dark-foreground-secondary);--ds-select-fg-active:var(--color-always-dark-foreground-primary);--ds-select-border:var(--color-always-dark-border-secondary)}.ds-table-caption-control.sc-ds-filter-menu-h{--ds-choice-popup-min-inline-size:var(--dimension-menu-width-xs)}.ds-table-caption-control.ds-table-caption-control--compact.sc-ds-filter-menu-h{flex:0 0 auto;width:var(--ds-control-height, var(--dimension-size-400));height:var(--ds-control-height, var(--dimension-size-400));min-width:var(--ds-control-height, var(--dimension-size-400));min-height:var(--ds-control-height, var(--dimension-size-400));max-width:var(--ds-control-height, var(--dimension-size-400));inline-size:var(--ds-control-height, var(--dimension-size-400));min-inline-size:var(--ds-control-height, var(--dimension-size-400));max-inline-size:var(--ds-control-height, var(--dimension-size-400))}.ds-table-caption-control.ds-table-caption-control--compact.sc-ds-filter-menu-h .trigger.sc-ds-filter-menu{justify-content:center;inline-size:100%;min-inline-size:100%;height:100%;padding-inline:0}.ds-table-caption-control.ds-table-caption-control--compact.sc-ds-filter-menu-h .trigger--has-value.sc-ds-filter-menu{--ds-select-prefix-fg:var(--ds-select-fg-active)}@container ds-table (max-width: 899px){.sc-ds-filter-menu-h.ds-table-caption-control{flex:0 0 auto;inline-size:var(--ds-control-height, var(--dimension-size-400));min-inline-size:var(--ds-control-height, var(--dimension-size-400));max-inline-size:var(--ds-control-height, var(--dimension-size-400))}.sc-ds-filter-menu-h.ds-table-caption-control .trigger{justify-content:center;inline-size:100%;min-inline-size:100%;padding-inline:0}.sc-ds-filter-menu-h.ds-table-caption-control .trigger--has-value{--ds-select-prefix-fg:var(--ds-select-fg-active)}}.filter-menu-host--external-trigger.sc-ds-filter-menu-h{display:contents}.filter-menu.sc-ds-filter-menu{display:flex;min-height:0;flex-direction:column;color:var(--color-foreground-primary)}.filter-menu__body.sc-ds-filter-menu{display:grid;grid-template-columns:minmax(calc(var(--dimension-size-base) * 18), 2fr) minmax(0, 3fr);min-height:calc(var(--dimension-size-800) * 4 + var(--dimension-space-150));max-height:calc(100vh - var(--dimension-size-800) - var(--dimension-size-600))}.filter-menu__categories.sc-ds-filter-menu{min-width:0;border-inline-end:var(--dimension-stroke-width-012) solid var(--color-border-tertiary)}.filter-menu__category-section.sc-ds-filter-menu{display:flex;min-width:0;flex-direction:column}.filter-menu__category-section.ds-choice-section--divided.sc-ds-filter-menu{padding-block-end:var(--dimension-space-050)}.filter-menu__category.sc-ds-filter-menu{justify-content:space-between;width:100%;border:0;background:transparent;color:var(--color-foreground-secondary);cursor:default;text-align:start}.filter-menu__category--active.sc-ds-filter-menu{color:var(--color-foreground-primary)}.filter-menu__options.sc-ds-filter-menu{min-width:0;overflow:hidden}.filter-menu__date-field.sc-ds-filter-menu{display:flex;min-width:0;flex-direction:column;align-items:stretch;gap:var(--dimension-space-100)}.filter-menu__date-control.sc-ds-filter-menu{width:100%;border-radius:var(--dimension-radius-025);background:transparent;box-shadow:inset 0 0 0 var(--dimension-stroke-width-012) var(--color-border-secondary)}.filter-menu__date-control.sc-ds-filter-menu:focus-within{box-shadow:inset 0 0 0 var(--dimension-stroke-width-018) var(--color-border-bold-brand)}.filter-menu__date-input.sc-ds-filter-menu{flex:1 1 auto;min-width:0;height:100%;padding-inline:var(--dimension-space-100);border:0;outline:0;background:transparent;color:var(--color-foreground-primary);font:inherit}.filter-menu__footer.sc-ds-filter-menu{flex:0 0 auto}.filter-menu__clear.sc-ds-filter-menu{color:var(--color-foreground-bold-brand)}@media (max-width: 520px){.filter-menu__body.sc-ds-filter-menu{grid-template-columns:minmax(calc(var(--dimension-size-base) * 14), 2fr) minmax(0, 3fr)}}@media (forced-colors: active){.filter-menu__categories.sc-ds-filter-menu{border-inline-end-color:var(--ds-forced-color-content)}.filter-menu__date-control.sc-ds-filter-menu{outline:var(--dimension-stroke-width-012) solid var(--ds-forced-color-content)}}`;let A=0;const P={lg:"lg",md:"md",sm:"sm",xs:"xs"};const $=e(class e extends i{constructor(e){super();if(e!==false){this.__registerHost()}this.dsChange=t(this,"dsChange",7);this.dsClear=t(this,"dsClear",7);this.dsActiveFilterChange=t(this,"dsActiveFilterChange",7);this.dsClose=t(this,"dsClose",7);this.dsOpenChange=t(this,"dsOpenChange",7);this.dsAfterClose=t(this,"dsAfterClose",7);this.open=false;this.triggerLabel="Filters";this.icon="Filters";this.size="md";this.width="hug";this.hasBorder=true;this.activeFill=false;this.collapseLabel=false;this.ariaLabel=null;this.filters=[];this.values={};this.side="bottom";this.align="end";this.sideOffset=w.space050;this.alignOffset=0;this.menuWidth=w.menuWidthLg;this.menuLabel="Filters";this.categoriesLabel="Filter categories";this.clearLabel="Clear";this.initialFocusVisible=false;this.shouldRender=false;this.closing=false;this.positionReady=false;this.pos={x:0,y:0};this.focusRingVisible=false;this.activeOptionIndex=0;this.captionCompact=false;this.generatedId=`ds-filter-menu-${++A}`;this.triggerElement=null;this.pendingInitialFocusVisible=false;this.closeTimer=null;this.hasLoaded=false;this.closingSnapshot=null;this.position=new c({getAnchor:()=>this.resolvedAnchor,getPopup:()=>this.el.querySelector(".filter-menu-popup"),getOwnerDocument:()=>this.el.ownerDocument,measure:(e,i)=>{if(!this.open)return null;const t=e.getBoundingClientRect();const r=C(k.space050,k.space050);return{anchorRect:t,popupWidth:i.offsetWidth||this.popupFallbackWidth,popupHeight:i.offsetHeight||this.popupFallbackHeight,side:this.side,align:this.align,sideOffsetPx:C(this.sideOffset,k.space050),alignOffsetPx:l({align:this.align,alignOffsetPx:C(this.alignOffset,0),sectionInsetPx:r}),viewportPadPx:this.viewportPad,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,collisionRect:a(e,this.boundary)}},apply:({x:e,y:i})=>{this.pos={x:e,y:i}},onReady:()=>{this.positionReady=true},liveUpdate:"double-frame",observeResize:true,topLayer:true});this.interaction=new f({getAnchor:()=>this.resolvedAnchor,getPopup:()=>this.el.querySelector(".filter-menu-popup"),getOwnerDocument:()=>this.el.ownerDocument,onOutsideActivation:()=>this.close()})}componentDidLoad(){this.hasLoaded=true;this.syncCaptionCompactObserver();if(this.open)this.onOpenChange(true)}connectedCallback(){if(!this.hasLoaded)return;this.syncCaptionCompactObserver();if(this.open)this.onOpenChange(true)}disconnectedCallback(){this.disconnectCaptionCompactObserver();this.position.unobserve();this.teardownListeners()}onCollapseLabelChange(){this.syncCaptionCompactObserver()}onOpenChange(e){if(e){this.teardownListeners();this.closingSnapshot=null;this.shouldRender=true;this.closing=false;this.positionReady=false;this.focusRingVisible=this.pendingInitialFocusVisible||this.initialFocusVisible;this.setupListeners();this.position.schedule((()=>this.focusInitialCategory()));return}if(!this.shouldRender)return;this.position.cancel();this.captureClosingSnapshot();this.closing=true;this.teardownListeners();const i=_(k.motionShort2,k.animationDurationShort3);if(i<=0){this.finishClose();return}this.closeTimer=setTimeout((()=>this.finishClose()),i)}onPositionInputChange(){if(this.open)this.position.schedule()}handleKeyDown(e){if(!this.shouldRender||this.closing)return;if(e.key==="Escape"){e.preventDefault();this.close();return}if(e.key!=="Tab"||!this.tabLeavesPopup(e))return;e.preventDefault();this.close(false);this.interaction.moveFocusAfterTab(e.shiftKey)}get resolvedAnchor(){if(this.anchor)return this.anchor;if(this.anchorId)return document.getElementById(this.anchorId);return this.triggerElement}get usesInternalTrigger(){return!this.anchor&&!this.anchorId}get viewportPad(){return C(k.space050,k.space050)}get popupFallbackWidth(){return C(k.menuWidthLg,k.menuWidthLg)}get popupFallbackHeight(){return C(k.menuFallbackHeight,k.menuFallbackHeight)}setupListeners(){this.interaction.connect();this.position.observe()}teardownListeners(){this.position.unobserve();this.interaction.disconnect();if(this.closeTimer){clearTimeout(this.closeTimer);this.closeTimer=null}}close(e=true){this.captureClosingSnapshot();if(e)this.interaction.focusAnchor();this.dsOpenChange.emit(false);this.dsClose.emit();this.open=false;this.onOpenChange(false)}toggleFromTrigger(e){if(this.open){this.close();return}this.pendingInitialFocusVisible=e.detail===0;this.open=true;this.dsOpenChange.emit(true);this.onOpenChange(true)}handleTriggerKeyDown(e){if(e.key!=="ArrowDown"||this.open)return;e.preventDefault();this.pendingInitialFocusVisible=true;this.open=true;this.dsOpenChange.emit(true);this.onOpenChange(true)}finishClose(){const e=this.el.querySelector(".filter-menu-popup");if(e?.matches(":popover-open"))e.hidePopover();this.shouldRender=false;this.closing=false;this.closingSnapshot=null;this.closeTimer=null;this.dsAfterClose.emit()}captureClosingSnapshot(){if(this.closingSnapshot)return;this.closingSnapshot={filters:this.filters.map((e=>({...e,options:e.options?.map((e=>({...e})))}))),values:Object.fromEntries(Object.entries(this.values).map((([e,i])=>[e,Array.isArray(i)?[...i]:i]))),activeFilterId:this.activeFilterId}}focusInitialCategory(){requestAnimationFrame((()=>{this.el.querySelector('.filter-menu__category[tabindex="0"]')?.focus();this.pendingInitialFocusVisible=false}))}tabLeavesPopup(e){return this.interaction.tabLeavesPopup(e)}selectedFilter(e,i){return e.find((e=>e.id===i))??e[0]}selectedCount(e,i){const t=i[e.id];if(e.kind==="multiple")return Array.isArray(t)?t.length:0;if(e.kind==="boolean")return t===true?1:0;return typeof t==="string"&&t.length>0?1:0}totalSelected(e,i){return e.reduce(((e,t)=>e+this.selectedCount(t,i)),0)}activeFilterCount(e,i){return e.filter((e=>this.selectedCount(e,i)>0)).length}selectCategory(e,i=false){this.activeOptionIndex=0;this.dsActiveFilterChange.emit(e);if(!i)return;requestAnimationFrame((()=>{this.el.querySelector(`[data-filter-category="${e}"]`)?.focus()}))}handleCategoryKeyDown(e,i,t){const r=i.findIndex((e=>e.id===t));let n;if(e.key==="ArrowDown")n=(r+1)%i.length;else if(e.key==="ArrowUp")n=(r-1+i.length)%i.length;else if(e.key==="Home")n=0;else if(e.key==="End")n=i.length-1;else if(e.key==="ArrowRight"){e.preventDefault();requestAnimationFrame((()=>{this.el.querySelector('.filter-menu__options [role="option"], .filter-menu__options input')?.focus()}));return}else return;e.preventDefault();this.focusRingVisible=true;this.selectCategory(i[n].id,true)}handlePanelKeyDown(e,i){if(e.key!=="ArrowLeft")return;e.preventDefault();this.el.querySelector(`[data-filter-category="${i}"]`)?.focus()}handleOptionKeyDown(e,i,t,r,n){const o=i.options??[];if(e.key==="ArrowLeft"){this.handlePanelKeyDown(e,i.id);return}if(e.key==="Enter"||e.key===" "){e.preventDefault();this.selectOption(i,t,n);return}if(!["ArrowDown","ArrowUp","Home","End"].includes(e.key))return;e.preventDefault();const s=o.map(((e,i)=>({candidate:e,optionIndex:i}))).filter((({candidate:e})=>!e.isInactive)).map((({optionIndex:e})=>e));if(!s.length)return;const d=s.indexOf(r);let c;if(e.key==="Home")c=s[0];else if(e.key==="End")c=s[s.length-1];else{const i=e.key==="ArrowDown"?1:-1;const t=d>=0?d:i===1?-1:0;c=s[(t+i+s.length)%s.length]}this.activeOptionIndex=c;this.focusRingVisible=true;requestAnimationFrame((()=>{this.el.querySelector(`#${this.generatedId}-${i.id}-option-${c}`)?.focus()}))}toggleMultiple(e,i,t,r){if(i.isInactive)return;const n=Array.isArray(r[e.id])?r[e.id]:[];const o=new Set(n);if(t)o.add(i.value);else o.delete(i.value);const s=(e.options??[]).map((e=>e.value)).filter((e=>o.has(e)));this.dsChange.emit({filterId:e.id,value:s})}selectOption(e,i,t){if(i.isInactive)return;if(e.kind==="single"){this.dsChange.emit({filterId:e.id,value:i.value});return}const r=Array.isArray(t[e.id])?t[e.id].includes(i.value):false;this.toggleMultiple(e,i,!r,t)}renderOptions(e,i){const t=i[e.id];if(e.kind==="multiple"||e.kind==="single"){const n=Array.isArray(t)?t:[];const o=e.options??[];const s=h(o.map((e=>({label:e.label,value:e.value,subtext:e.description}))));return o.map(((o,d)=>{const c=e.kind==="multiple"?n.includes(o.value):t===o.value;return r(u,{size:"md",id:`${this.generatedId}-${e.id}-option-${d}`,option:{label:o.label,value:o.value,subtext:o.description,isInactive:o.isInactive},selected:c,active:d===this.activeOptionIndex,focusRingVisible:this.focusRingVisible,usesSubtext:s,tabIndex:d===this.activeOptionIndex?0:-1,leading:e.kind==="multiple"?r("span",{class:"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content","aria-hidden":"true"},r("ds-checkbox",{label:"",size:"md",checked:c,presentation:true})):undefined,onFocus:()=>{this.activeOptionIndex=d},onKeyDown:t=>this.handleOptionKeyDown(t,e,o,d,i),onHover:()=>{this.focusRingVisible=false;this.activeOptionIndex=d},onSelect:()=>this.selectOption(e,o,i)})}))}if(e.kind==="boolean"){const i={label:e.fieldLabel??e.label,value:"true",description:e.description};return r(u,{size:"md",id:`${this.generatedId}-${e.id}-option-0`,option:{label:i.label,value:i.value,subtext:i.description},selected:t===true,active:true,focusRingVisible:this.focusRingVisible,usesSubtext:Boolean(i.description),tabIndex:0,leading:r("span",{class:"ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content","aria-hidden":"true"},r("ds-checkbox",{label:"",size:"md",checked:t===true,presentation:true})),onKeyDown:i=>{if(i.key==="ArrowLeft")this.handlePanelKeyDown(i,e.id);else if(i.key==="Enter"||i.key===" "){i.preventDefault();this.dsChange.emit({filterId:e.id,value:t!==true})}},onHover:()=>{this.focusRingVisible=false},onSelect:()=>this.dsChange.emit({filterId:e.id,value:t!==true})})}const n=typeof t==="string"?t:"";const o=`${this.generatedId}-${e.id}-input`;return r("div",{class:"filter-menu__date-field"},r("label",{htmlFor:o},r("ds-text",{as:"span",variant:"text-body-small",emphasis:true,color:"primary"},e.fieldLabel??"Event date")),r("div",{class:"filter-menu__date-control ds-control-frame ds-control--md"},r("input",{id:o,class:"filter-menu__date-input",type:"date",value:n,onInput:i=>this.dsChange.emit({filterId:e.id,value:i.target.value})}),n?r("ds-button-unfilled",{variant:"icon",icon:"CrossCircle",size:"sm",isInset:true,hasBorder:false,rounded:true,ariaLabel:`${this.clearLabel} ${e.fieldLabel??e.label}`,onDsClick:i=>{i.stopPropagation();this.dsChange.emit({filterId:e.id,value:""})}}):null))}get captionIconOnly(){return this.collapseLabel&&this.captionCompact&&this.usesInternalTrigger&&Boolean(this.icon)}syncCaptionCompactObserver(){this.disconnectCaptionCompactObserver();if(!this.collapseLabel){if(this.captionCompact)this.captionCompact=false;return}this.captionCompactDisconnect=s(this.el,(e=>{if(this.captionCompact!==e)this.captionCompact=e}))}disconnectCaptionCompactObserver(){this.captionCompactDisconnect?.();this.captionCompactDisconnect=undefined}renderCaptionTooltip(e,i){if(!this.collapseLabel)return e;return r("ds-tooltip",{label:i,side:"top",size:"sm"},e)}render(){const e=this.closing&&this.closingSnapshot?this.closingSnapshot:{filters:this.filters,values:this.values,activeFilterId:this.activeFilterId};const i=this.selectedFilter(e.filters,e.activeFilterId);const t=this.totalSelected(e.filters,e.values);const o=this.activeFilterCount(e.filters,e.values);const s=o>0;const d=`${this.triggerLabel}${s?` · ${o}`:""}`;const c=z[this.size];const a=P[this.size];const l=`${this.generatedId}-popup`;const f={position:"fixed",left:"0",top:"0",width:this.menuWidth,transform:`translate(${Math.round(this.pos.x)}px, ${Math.round(this.pos.y)}px)`,zIndex:"9998",visibility:this.positionReady?"visible":"hidden"};return r(n,{key:"fb844d7a0b23ce902fea7fc7a8bfdf0f34a02fe8",class:{"filter-menu-host":true,"filter-menu-host--external-trigger":!this.usesInternalTrigger,"ds-select-trigger-host":this.usesInternalTrigger,[`ds-control--${this.size}`]:true,"ds-table-caption-control":this.collapseLabel,"ds-table-caption-control--compact":this.captionIconOnly,...I(this.width)}},this.usesInternalTrigger?this.renderCaptionTooltip(r("button",{ref:e=>{this.triggerElement=e??null},id:this.inputId??`${this.generatedId}-trigger`,type:"button",class:{trigger:true,"ds-control-frame":true,"ds-focus-ring-inset":true,"ds-interaction-fill":true,"ds-interaction-fill--selected":this.activeFill&&s,"trigger--expanded":this.open||this.closing,"trigger--bordered":this.hasBorder,"trigger--has-value":s,[`ds-control--${this.size}`]:true},role:"combobox","aria-haspopup":"dialog","aria-expanded":String(this.open),"aria-controls":this.open?l:undefined,"aria-label":this.ariaLabel??this.menuLabel,onClick:e=>this.toggleFromTrigger(e),onKeyDown:e=>this.handleTriggerKeyDown(e)},this.icon?r("span",{class:"trigger__prefix ds-control-icon-box ds-interaction-fill__content","aria-hidden":"true"},r("ds-icon",{name:this.icon,size:a,color:"inherit"})):null,this.captionIconOnly?null:r("ds-text",{class:"trigger__label-box trigger__label trigger__label-content ds-control-label-box ds-interaction-fill__content",as:"span",variant:c,color:"inherit",lineTruncation:1},d),this.captionIconOnly?null:r("span",{class:"trigger__chevron ds-control-icon-box ds-interaction-fill__content","aria-hidden":"true"},r("ds-icon",{name:"ChevronDown",size:a,color:"inherit"}))),this.captionIconOnly?d:""):null,this.shouldRender?r("div",{id:l,popover:"manual",class:{"filter-menu-popup":true,"ds-choice-popup":true,"ds-choice-popup--closing":this.closing},style:f,role:"dialog","aria-label":this.menuLabel},i?r("div",{class:"filter-menu"},r("div",{class:"filter-menu__body"},r("div",{class:"filter-menu__categories ds-choice-list ds-chrome-column ds-chrome-space--sm",role:"tablist","aria-label":this.categoriesLabel,"aria-orientation":"vertical"},e.filters.map((t=>{const n=t.id===i.id;const o=this.selectedCount(t,e.values);return r("div",{key:t.id,class:{"filter-menu__category-section":true,"ds-choice-section--divided":Boolean(t.divider)}},r("button",{id:`${this.generatedId}-${t.id}-tab`,type:"button",role:"tab","data-filter-category":t.id,class:{"filter-menu__category":true,"filter-menu__category--active":n,"ds-choice-item":true,"ds-control-frame":true,"ds-control--md":true,"ds-focus-ring-inset":true,"ds-focus-ring--visible":n&&this.focusRingVisible,"ds-interaction-fill":true,"ds-interaction-fill--selected":n},"aria-selected":String(n),"aria-controls":`${this.generatedId}-panel`,tabIndex:n?0:-1,onMouseDown:()=>{this.focusRingVisible=false},onClick:()=>this.selectCategory(t.id),onKeyDown:i=>this.handleCategoryKeyDown(i,e.filters,t.id)},r("ds-text",{class:"ds-choice-item__content ds-choice-item__label ds-control-label-box ds-interaction-fill__content",as:"span",variant:"text-body-medium",color:n?"primary":"secondary"},t.label),o>0?r("ds-tag",{class:"ds-choice-item__tag ds-interaction-fill__content",label:String(o),size:"sm",intent:"brand",contrast:"bold",isInset:true,rounded:true}):null))}))),r("div",{id:`${this.generatedId}-panel`,class:"filter-menu__options",role:"tabpanel","aria-labelledby":`${this.generatedId}-${i.id}-tab`},r("div",{key:i.id,class:"filter-menu__option-list ds-choice-list ds-chrome-column ds-chrome-space--sm",role:"listbox","aria-label":i.label,"aria-multiselectable":i.kind==="multiple"?"true":undefined},this.renderOptions(i,e.values)))),t>0?r("div",{class:"filter-menu__footer ds-choice-footer"},r("div",{class:"ds-choice-footer__content ds-control--md"},r("ds-text",{class:"ds-choice-footer__summary",as:"span",variant:"text-body-medium",color:"secondary","aria-live":"polite"},t," selected"),r("button",{class:"filter-menu__clear ds-choice-footer__clear ds-text-action",type:"button",onClick:()=>this.dsClear.emit()},r("ds-text",{as:"span",variant:"text-body-medium",color:"inherit"},this.clearLabel)))):null):null):null)}get el(){return this}static get watchers(){return{collapseLabel:[{onCollapseLabelChange:0}],open:[{onOpenChange:0}],anchor:[{onPositionInputChange:0}],anchorId:[{onPositionInputChange:0}],boundary:[{onPositionInputChange:0}],side:[{onPositionInputChange:0}],align:[{onPositionInputChange:0}],sideOffset:[{onPositionInputChange:0}],alignOffset:[{onPositionInputChange:0}],menuWidth:[{onPositionInputChange:0}]}}static get style(){return F()}},[2,"ds-filter-menu",{open:[1028],triggerLabel:[1,"trigger-label"],icon:[1],size:[1],width:[1],hasBorder:[4,"has-border"],activeFill:[4,"active-fill"],collapseLabel:[516,"collapse-label"],inputId:[1,"input-id"],ariaLabel:[1,"aria-label"],filters:[16],values:[16],activeFilterId:[1,"active-filter-id"],anchor:[16],anchorId:[1,"anchor-id"],boundary:[16],side:[1],align:[1],sideOffset:[8,"side-offset"],alignOffset:[8,"align-offset"],menuWidth:[1,"menu-width"],menuLabel:[1,"menu-label"],categoriesLabel:[1,"categories-label"],clearLabel:[1,"clear-label"],initialFocusVisible:[4,"initial-focus-visible"],shouldRender:[32],closing:[32],positionReady:[32],pos:[32],focusRingVisible:[32],activeOptionIndex:[32],captionCompact:[32]},[[0,"keydown","handleKeyDown"]],{collapseLabel:[{onCollapseLabelChange:0}],open:[{onOpenChange:0}],anchor:[{onPositionInputChange:0}],anchorId:[{onPositionInputChange:0}],boundary:[{onPositionInputChange:0}],side:[{onPositionInputChange:0}],align:[{onPositionInputChange:0}],sideOffset:[{onPositionInputChange:0}],alignOffset:[{onPositionInputChange:0}],menuWidth:[{onPositionInputChange:0}]}]);function j(){if(typeof customElements==="undefined"){return}const e=["ds-filter-menu","ds-badge","ds-button-unfilled","ds-checkbox","ds-icon","ds-loader","ds-tag","ds-text","ds-tooltip"];e.forEach((e=>{switch(e){case"ds-filter-menu":if(!customElements.get(o(e))){customElements.define(o(e),$)}break;case"ds-badge":if(!customElements.get(o(e))){m()}break;case"ds-button-unfilled":if(!customElements.get(o(e))){d()}break;case"ds-checkbox":if(!customElements.get(o(e))){g()}break;case"ds-icon":if(!customElements.get(o(e))){v()}break;case"ds-loader":if(!customElements.get(o(e))){p()}break;case"ds-tag":if(!customElements.get(o(e))){b()}break;case"ds-text":if(!customElements.get(o(e))){x()}break;case"ds-tooltip":if(!customElements.get(o(e))){y()}break}}))}j();export{$ as F,j as d};
2
+ //# sourceMappingURL=p-DtndC9f1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["filterMenuCss","filterMenuId","ICON_SIZE","lg","md","sm","xs","FilterMenu","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","open","triggerLabel","icon","size","width","hasBorder","activeFill","collapseLabel","ariaLabel","filters","values","side","align","sideOffset","TOKEN_CSS_LENGTHS","space050","alignOffset","menuWidth","menuWidthLg","menuLabel","categoriesLabel","clearLabel","initialFocusVisible","shouldRender","closing","positionReady","pos","x","y","focusRingVisible","activeOptionIndex","captionCompact","generatedId","triggerElement","pendingInitialFocusVisible","closeTimer","hasLoaded","closingSnapshot","position","AnchoredPositionController","getAnchor","resolvedAnchor","getPopup","el","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","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","emit","dsClose","toggleFromTrigger","detail","handleTriggerKeyDown","matches","hidePopover","dsAfterClose","map","filter","options","option","Object","fromEntries","entries","value","Array","isArray","activeFilterId","requestAnimationFrame","focus","selectedFilter","find","id","selectedCount","kind","length","totalSelected","reduce","total","activeFilterCount","selectCategory","filterId","dsActiveFilterChange","handleCategoryKeyDown","currentIndex","findIndex","nextIndex","handlePanelKeyDown","handleOptionKeyDown","index","selectOption","includes","enabled","candidate","optionIndex","isInactive","current","indexOf","next","direction","start","toggleMultiple","checked","selected","Set","add","delete","ordered","has","dsChange","renderOptions","usesSubtext","choiceListUsesSubtext","label","subtext","description","isSelected","h","ChoiceOptionRow","active","tabIndex","leading","class","presentation","undefined","onFocus","onKeyDown","onHover","onSelect","fieldLabel","Boolean","dateValue","inputId","htmlFor","as","variant","emphasis","color","type","onInput","target","isInset","rounded","onDsClick","stopPropagation","captionIconOnly","captionCompactDisconnect","observeTableCaptionCompact","compact","renderCaptionTooltip","trigger","render","state","activeFilter","hasActiveFilters","textVariant","CONTROL_TEXT_VARIANT","iconSize","popupId","popupStyle","left","top","transform","Math","round","zIndex","visibility","Host","controlWidthClass","ref","element","role","String","onClick","name","lineTruncation","popover","style","count","divider","onMouseDown","intent","contrast","dsClear"],"sources":["src/wc/components/FilterMenu/FilterMenu.css?tag=ds-filter-menu&encapsulation=scoped","src/wc/components/FilterMenu/FilterMenu.tsx"],"sourcesContent":["@import '../../utils/choice-list.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n@import '../../utils/select-trigger.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-primary);\n}\n\n.filter-menu__body {\n display: grid;\n grid-template-columns: minmax(calc(var(--dimension-size-base) * 18), 2fr) minmax(0, 3fr);\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__categories {\n min-width: 0;\n border-inline-end: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\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__options {\n min-width: 0;\n overflow: hidden;\n}\n\n.filter-menu__date-field {\n display: flex;\n min-width: 0;\n flex-direction: column;\n align-items: stretch;\n gap: var(--dimension-space-100);\n}\n\n.filter-menu__date-control {\n width: 100%;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--color-border-secondary);\n}\n\n.filter-menu__date-control:focus-within {\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-018) var(--color-border-bold-brand);\n}\n\n.filter-menu__date-input {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding-inline: var(--dimension-space-100);\n border: 0;\n outline: 0;\n background: transparent;\n color: var(--color-foreground-primary);\n font: inherit;\n}\n\n.filter-menu__footer {\n flex: 0 0 auto;\n}\n\n.filter-menu__clear {\n color: var(--color-foreground-bold-brand);\n}\n\n@media (max-width: 520px) {\n .filter-menu__body {\n grid-template-columns: minmax(calc(var(--dimension-size-base) * 14), 2fr) minmax(0, 3fr);\n }\n}\n\n@media (forced-colors: active) {\n .filter-menu__categories {\n border-inline-end-color: var(--ds-forced-color-content);\n }\n\n .filter-menu__date-control {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n }\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 controlWidthClass,\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 { AnchoredOverlayInteractionController } from '../../utils/anchored-overlay-interaction-controller';\nimport { resolveAnchoredOverlayBoundaryRect } from '../../utils/anchored-overlay-boundary';\nimport { ChoiceOptionRow } 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;\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>;\n\nexport interface FilterMenuChangeDetail {\n filterId: string;\n value: FilterMenuValue;\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\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 @Prop({ mutable: true }) open: boolean = false;\n /** Select trigger text. The selected count is appended automatically. */\n @Prop() triggerLabel: string = 'Filters';\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 @Prop() hasBorder: boolean = true;\n /** Show selected interaction fill when one or more criteria are active. */\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 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 /** 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\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 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 closingSnapshot: {\n filters: FilterMenuFilter[];\n values: FilterMenuValues;\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 }\n\n @Watch('collapseLabel')\n onCollapseLabelChange() {\n this.syncCaptionCompactObserver();\n }\n\n @Watch('open')\n onOpenChange(isOpen: boolean) {\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) 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.position.schedule();\n }\n\n @Listen('keydown')\n handleKeyDown(event: KeyboardEvent) {\n if (!this.shouldRender || 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.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.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 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.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 activeFilterId: this.activeFilterId,\n };\n }\n\n private focusInitialCategory() {\n requestAnimationFrame(() => {\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 requestAnimationFrame(() => {\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 requestAnimationFrame(() => {\n this.el\n .querySelector<HTMLElement>(\n '.filter-menu__options [role=\"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 ) {\n const options = filter.options ?? [];\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 = options\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 requestAnimationFrame(() => {\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.dsChange.emit({ 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.dsChange.emit({ 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 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 options = filter.options ?? [];\n const usesSubtext = choiceListUsesSubtext(\n options.map(option => ({\n label: option.label,\n value: option.value,\n subtext: option.description,\n }))\n );\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)\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: FilterMenuOption = {\n label: filter.fieldLabel ?? filter.label,\n value: 'true',\n description: filter.description,\n };\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.dsChange.emit({ filterId: filter.id, value: value !== true });\n }\n }}\n onHover={() => {\n this.focusRingVisible = false;\n }}\n onSelect={() => this.dsChange.emit({ filterId: filter.id, value: value !== true })}\n />\n );\n }\n\n const dateValue = typeof value === 'string' ? value : '';\n const inputId = `${this.generatedId}-${filter.id}-input`;\n return (\n <div class=\"filter-menu__date-field\">\n <label htmlFor={inputId}>\n <ds-text as=\"span\" variant=\"text-body-small\" emphasis color=\"primary\">\n {filter.fieldLabel ?? 'Event date'}\n </ds-text>\n </label>\n <div class=\"filter-menu__date-control ds-control-frame ds-control--md\">\n <input\n id={inputId}\n class=\"filter-menu__date-input\"\n type=\"date\"\n value={dateValue}\n onInput={(event: Event) =>\n this.dsChange.emit({\n filterId: filter.id,\n value: (event.target as HTMLInputElement).value,\n })\n }\n />\n {dateValue ? (\n <ds-button-unfilled\n variant=\"icon\"\n icon=\"CrossCircle\"\n size=\"sm\"\n isInset\n hasBorder={false}\n rounded\n ariaLabel={`${this.clearLabel} ${filter.fieldLabel ?? filter.label}`}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n event.stopPropagation();\n this.dsChange.emit({ filterId: filter.id, value: '' });\n }}\n />\n ) : null}\n </div>\n </div>\n );\n }\n\n private get captionIconOnly(): boolean {\n return (\n this.collapseLabel &&\n this.captionCompact &&\n this.usesInternalTrigger &&\n Boolean(this.icon)\n );\n }\n\n private syncCaptionCompactObserver(): void {\n this.disconnectCaptionCompactObserver();\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 render() {\n const state =\n this.closing && this.closingSnapshot\n ? this.closingSnapshot\n : {\n filters: this.filters,\n values: this.values,\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 label = `${this.triggerLabel}${hasActiveFilters ? ` · ${activeFilterCount}` : ''}`;\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 'trigger--bordered': this.hasBorder,\n 'trigger--has-value': hasActiveFilters,\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 ? 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 ? (\n <div\n id={popupId}\n popover=\"manual\"\n class={{\n 'filter-menu-popup': true,\n 'ds-choice-popup': true,\n 'ds-choice-popup--closing': this.closing,\n }}\n style={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\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 ? (\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\n <div\n id={`${this.generatedId}-panel`}\n class=\"filter-menu__options\"\n role=\"tabpanel\"\n aria-labelledby={`${this.generatedId}-${activeFilter.id}-tab`}\n >\n <div\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={activeFilter.kind === 'multiple' ? 'true' : undefined}\n >\n {this.renderOptions(activeFilter, state.values)}\n </div>\n </div>\n </div>\n\n {totalSelected > 0 ? (\n <div class=\"filter-menu__footer ds-choice-footer\">\n <div class=\"ds-choice-footer__content ds-control--md\">\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 <button\n class=\"filter-menu__clear ds-choice-footer__clear ds-text-action\"\n type=\"button\"\n onClick={() => this.dsClear.emit()}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.clearLabel}\n </ds-text>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import{p as t,t as e,H as a,h as i,a as s}from"./index.js";import{d as n}from"./p-BFfLvMZd.js";import{d as r}from"./p-JPTkZ3Ji.js";import{d}from"./p-CAnnQL1F.js";const c=()=>`.ds-visually-hidden.sc-ds-agent-activity-h,.ds-visually-hidden.sc-ds-agent-activity{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sc-ds-agent-activity-h{display:block}.agent-activity.sc-ds-agent-activity{margin:0}summary.sc-ds-agent-activity{align-items:center;color:var(--color-foreground-secondary);cursor:default;display:flex;gap:var(--dimension-space-050);list-style:none;padding:var(--dimension-space-025) 0}summary.sc-ds-agent-activity::-webkit-details-marker{display:none}details[open].sc-ds-agent-activity summary.sc-ds-agent-activity ds-icon.sc-ds-agent-activity{transform:rotate(90deg)}ds-text.agent-activity__summary-label.sc-ds-agent-activity{min-width:0}ol.sc-ds-agent-activity{display:grid;gap:var(--dimension-space-075);list-style:none;margin:0;padding:var(--dimension-space-100) 0 0 var(--dimension-space-200)}.agent-activity__item.sc-ds-agent-activity{align-items:start;display:grid;gap:var(--dimension-space-050);grid-template-columns:auto minmax(0, 1fr)}.agent-activity__marker.sc-ds-agent-activity{align-items:center;color:var(--color-foreground-faint-neutral);display:flex;padding-block-start:var(--dimension-space-025)}.agent-activity__item--active.sc-ds-agent-activity .agent-activity__marker.sc-ds-agent-activity{color:var(--color-foreground-faint-brand)}.agent-activity__item--error.sc-ds-agent-activity .agent-activity__marker.sc-ds-agent-activity{color:var(--color-foreground-bold-negative)}.agent-activity__item.sc-ds-agent-activity span.sc-ds-agent-activity:last-child{display:grid;gap:var(--dimension-space-025)}.agent-activity__pending-dot.sc-ds-agent-activity{width:var(--dimension-size-050);height:var(--dimension-size-050);border-radius:var(--dimension-radius-half);background:currentColor}@media (prefers-reduced-motion: no-preference){summary.sc-ds-agent-activity ds-icon.sc-ds-agent-activity{transition:transform var(--effect-motion-short-2)}}`;const o=t(class t extends a{constructor(t){super();if(t!==false){this.__registerHost()}this.items=[];this.heading="Activity";this.open=false;this.expanded=false;this.handleToggle=t=>{this.expanded=t.currentTarget.open}}componentWillLoad(){this.expanded=this.open}handleOpenChange(t){this.expanded=t}get currentItem(){return this.items.find((t=>t.state==="active"))??this.items.find((t=>t.state==="error"))??[...this.items].reverse().find((t=>t.state==="complete"))??this.items.find((t=>t.state==="pending"))}stateLabel(t){if(t.state==="active")return"In progress";if(t.state==="complete")return"Complete";if(t.state==="error")return"Error";return"Pending"}render(){return i(s,{key:"1b58f942830ddf809ddfee04d0caad173c35db9f"},i("details",{key:"51a120a5329ff1ab1d9fb1150e8c2873f667d840",class:"agent-activity",open:this.open,onToggle:this.handleToggle},i("summary",{key:"6fb41a6dda5a267a90a40b29ea4f27768339c9e9"},i("ds-icon",{key:"6c0668d23c506078557f45d430115e9e99ad3207",name:"ChevronRight",size:"xs",color:"inherit"}),i("ds-text",{key:"7647363b15516c46dd8e83963237ce0d9381ecf1",class:"agent-activity__summary-label",variant:"text-body-small",shimmer:!this.expanded&&this.currentItem?.state==="active"},this.expanded?this.heading:this.currentItem?.label??this.heading)),i("ol",{key:"cd8aee84bb53a0e2d6359da3d5340fb0ad72aa7a"},this.items.map((t=>i("li",{class:`agent-activity__item agent-activity__item--${t.state}`},i("span",{class:"agent-activity__marker","aria-hidden":"true"},t.state==="active"?i("ds-loader",{size:"xs",color:"inherit"}):t.state==="pending"?i("span",{class:"agent-activity__pending-dot"}):i("ds-icon",{name:t.state==="error"?"ErrorTriangle":"Check",size:"xs",color:"inherit"})),i("span",null,i("ds-text",{variant:"text-body-small",shimmer:t.state==="active"},t.label),t.detail?i("ds-text",{variant:"text-caption",color:"secondary"},t.detail):null,i("span",{class:"agent-activity__state ds-visually-hidden"},this.stateLabel(t)))))))))}static get watchers(){return{open:[{handleOpenChange:0}]}}static get style(){return c()}},[2,"ds-agent-activity",{items:[16],heading:[1],open:[4],expanded:[32]},undefined,{open:[{handleOpenChange:0}]}]);function l(){if(typeof customElements==="undefined"){return}const t=["ds-agent-activity","ds-icon","ds-loader","ds-text"];t.forEach((t=>{switch(t){case"ds-agent-activity":if(!customElements.get(e(t))){customElements.define(e(t),o)}break;case"ds-icon":if(!customElements.get(e(t))){n()}break;case"ds-loader":if(!customElements.get(e(t))){r()}break;case"ds-text":if(!customElements.get(e(t))){d()}break}}))}l();export{o as A,l as d};
2
+ //# sourceMappingURL=p-HB_cf_aR.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["agentActivityCss","AgentActivity","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","items","heading","open","expanded","handleToggle","event","currentTarget","componentWillLoad","handleOpenChange","currentItem","find","item","state","reverse","stateLabel","render","h","Host","key","class","onToggle","name","size","color","variant","shimmer","label","map","detail"],"sources":["src/wc/components/AgentActivity/AgentActivity.css?tag=ds-agent-activity&encapsulation=scoped","src/wc/components/AgentActivity/AgentActivity.tsx"],"sourcesContent":["@import '../../utils/visually-hidden.css';\n\n:host {\n display: block;\n}\n.agent-activity {\n margin: 0;\n}\nsummary {\n align-items: center;\n color: var(--color-foreground-secondary);\n cursor: default;\n display: flex;\n gap: var(--dimension-space-050);\n list-style: none;\n padding: var(--dimension-space-025) 0;\n}\nsummary::-webkit-details-marker {\n display: none;\n}\ndetails[open] summary ds-icon {\n transform: rotate(90deg);\n}\nds-text.agent-activity__summary-label {\n min-width: 0;\n}\nol {\n display: grid;\n gap: var(--dimension-space-075);\n list-style: none;\n margin: 0;\n padding: var(--dimension-space-100) 0 0 var(--dimension-space-200);\n}\n.agent-activity__item {\n align-items: start;\n display: grid;\n gap: var(--dimension-space-050);\n grid-template-columns: auto minmax(0, 1fr);\n}\n.agent-activity__marker {\n align-items: center;\n color: var(--color-foreground-faint-neutral);\n display: flex;\n padding-block-start: var(--dimension-space-025);\n}\n.agent-activity__item--active .agent-activity__marker {\n color: var(--color-foreground-faint-brand);\n}\n.agent-activity__item--error .agent-activity__marker {\n color: var(--color-foreground-bold-negative);\n}\n.agent-activity__item span:last-child {\n display: grid;\n gap: var(--dimension-space-025);\n}\n.agent-activity__pending-dot {\n width: var(--dimension-size-050);\n height: var(--dimension-size-050);\n border-radius: var(--dimension-radius-half);\n background: currentColor;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n summary ds-icon {\n transition: transform var(--effect-motion-short-2);\n }\n}\n","import { Component, Prop, State, Watch, h, Host } from '@stencil/core';\nimport type { AgentActivityItem } from '../conversation-types';\n\n@Component({\n tag: 'ds-agent-activity',\n styleUrl: 'AgentActivity.css',\n scoped: true,\n})\nexport class AgentActivity {\n @Prop() items: AgentActivityItem[] = [];\n @Prop() heading: string = 'Activity';\n @Prop() open: boolean = false;\n\n @State() private expanded: boolean = false;\n\n componentWillLoad() {\n this.expanded = this.open;\n }\n\n @Watch('open')\n handleOpenChange(open: boolean) {\n this.expanded = open;\n }\n\n private get currentItem(): AgentActivityItem | undefined {\n return (\n this.items.find(item => item.state === 'active') ??\n this.items.find(item => item.state === 'error') ??\n [...this.items].reverse().find(item => item.state === 'complete') ??\n this.items.find(item => item.state === 'pending')\n );\n }\n\n private handleToggle = (event: Event) => {\n this.expanded = (event.currentTarget as HTMLDetailsElement).open;\n };\n\n private stateLabel(item: AgentActivityItem): string {\n if (item.state === 'active') return 'In progress';\n if (item.state === 'complete') return 'Complete';\n if (item.state === 'error') return 'Error';\n return 'Pending';\n }\n\n render() {\n return (\n <Host>\n <details class=\"agent-activity\" open={this.open} onToggle={this.handleToggle}>\n <summary>\n <ds-icon name=\"ChevronRight\" size=\"xs\" color=\"inherit\" />\n <ds-text\n class=\"agent-activity__summary-label\"\n variant=\"text-body-small\"\n shimmer={!this.expanded && this.currentItem?.state === 'active'}\n >\n {this.expanded ? this.heading : this.currentItem?.label ?? this.heading}\n </ds-text>\n </summary>\n <ol>\n {this.items.map(item => (\n <li class={`agent-activity__item agent-activity__item--${item.state}`}>\n <span class=\"agent-activity__marker\" aria-hidden=\"true\">\n {item.state === 'active' ? (\n <ds-loader size=\"xs\" color=\"inherit\" />\n ) : item.state === 'pending' ? (\n <span class=\"agent-activity__pending-dot\" />\n ) : (\n <ds-icon\n name={item.state === 'error' ? 'ErrorTriangle' : 'Check'}\n size=\"xs\"\n color=\"inherit\"\n />\n )}\n </span>\n <span>\n <ds-text variant=\"text-body-small\" shimmer={item.state === 'active'}>\n {item.label}\n </ds-text>\n {item.detail ? (\n <ds-text variant=\"text-caption\" color=\"secondary\">\n {item.detail}\n </ds-text>\n ) : null}\n <span class=\"agent-activity__state ds-visually-hidden\">{this.stateLabel(item)}</span>\n </span>\n </li>\n ))}\n </ol>\n </details>\n </Host>\n );\n }\n}\n"],"mappings":"uKAAA,MAAMA,EAAmB,IAAM,66D,MCQlBC,EAAaC,EAAA,MAAAD,UAAAE,EAL1B,WAAAC,CAAAC,G,4CAMUC,KAAAC,MAA6B,GAC7BD,KAAAE,QAAkB,WAClBF,KAAAG,KAAgB,MAEPH,KAAAI,SAAoB,MAoB7BJ,KAAAK,aAAgBC,IACtBN,KAAKI,SAAYE,EAAMC,cAAqCJ,IAAI,CA0DnE,CA7EC,iBAAAK,GACER,KAAKI,SAAWJ,KAAKG,I,CAIvB,gBAAAM,CAAiBN,GACfH,KAAKI,SAAWD,C,CAGlB,eAAYO,GACV,OACEV,KAAKC,MAAMU,MAAKC,GAAQA,EAAKC,QAAU,YACvCb,KAAKC,MAAMU,MAAKC,GAAQA,EAAKC,QAAU,WACvC,IAAIb,KAAKC,OAAOa,UAAUH,MAAKC,GAAQA,EAAKC,QAAU,cACtDb,KAAKC,MAAMU,MAAKC,GAAQA,EAAKC,QAAU,W,CAQnC,UAAAE,CAAWH,GACjB,GAAIA,EAAKC,QAAU,SAAU,MAAO,cACpC,GAAID,EAAKC,QAAU,WAAY,MAAO,WACtC,GAAID,EAAKC,QAAU,QAAS,MAAO,QACnC,MAAO,S,CAGT,MAAAG,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,4CACHF,EAAA,WAAAE,IAAA,2CAASC,MAAM,iBAAiBjB,KAAMH,KAAKG,KAAMkB,SAAUrB,KAAKK,cAC9DY,EAAA,WAAAE,IAAA,4CACEF,EAAA,WAAAE,IAAA,2CAASG,KAAK,eAAeC,KAAK,KAAKC,MAAM,YAC7CP,EAAA,WAAAE,IAAA,2CACEC,MAAM,gCACNK,QAAQ,kBACRC,SAAU1B,KAAKI,UAAYJ,KAAKU,aAAaG,QAAU,UAEtDb,KAAKI,SAAWJ,KAAKE,QAAUF,KAAKU,aAAaiB,OAAS3B,KAAKE,UAGpEe,EAAA,MAAAE,IAAA,4CACGnB,KAAKC,MAAM2B,KAAIhB,GACdK,EAAA,MAAIG,MAAO,8CAA8CR,EAAKC,SAC5DI,EAAA,QAAMG,MAAM,yBAAwB,cAAa,QAC9CR,EAAKC,QAAU,SACdI,EAAA,aAAWM,KAAK,KAAKC,MAAM,YACzBZ,EAAKC,QAAU,UACjBI,EAAA,QAAMG,MAAM,gCAEZH,EAAA,WACEK,KAAMV,EAAKC,QAAU,QAAU,gBAAkB,QACjDU,KAAK,KACLC,MAAM,aAIZP,EAAA,YACEA,EAAA,WAASQ,QAAQ,kBAAkBC,QAASd,EAAKC,QAAU,UACxDD,EAAKe,OAEPf,EAAKiB,OACJZ,EAAA,WAASQ,QAAQ,eAAeD,MAAM,aACnCZ,EAAKiB,QAEN,KACJZ,EAAA,QAAMG,MAAM,4CAA4CpB,KAAKe,WAAWH,U","ignoreList":[]}
1
+ {"version":3,"names":["agentActivityCss","AgentActivity","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","items","heading","open","expanded","handleToggle","event","currentTarget","componentWillLoad","handleOpenChange","currentItem","find","item","state","reverse","stateLabel","render","h","Host","key","class","onToggle","name","size","color","variant","shimmer","label","map","detail"],"sources":["src/wc/components/AgentActivity/AgentActivity.css?tag=ds-agent-activity&encapsulation=scoped","src/wc/components/AgentActivity/AgentActivity.tsx"],"sourcesContent":["@import '../../utils/visually-hidden.css';\n\n:host {\n display: block;\n}\n.agent-activity {\n margin: 0;\n}\nsummary {\n align-items: center;\n color: var(--color-foreground-secondary);\n cursor: default;\n display: flex;\n gap: var(--dimension-space-050);\n list-style: none;\n padding: var(--dimension-space-025) 0;\n}\nsummary::-webkit-details-marker {\n display: none;\n}\ndetails[open] summary ds-icon {\n transform: rotate(90deg);\n}\nds-text.agent-activity__summary-label {\n min-width: 0;\n}\nol {\n display: grid;\n gap: var(--dimension-space-075);\n list-style: none;\n margin: 0;\n padding: var(--dimension-space-100) 0 0 var(--dimension-space-200);\n}\n.agent-activity__item {\n align-items: start;\n display: grid;\n gap: var(--dimension-space-050);\n grid-template-columns: auto minmax(0, 1fr);\n}\n.agent-activity__marker {\n align-items: center;\n color: var(--color-foreground-faint-neutral);\n display: flex;\n padding-block-start: var(--dimension-space-025);\n}\n.agent-activity__item--active .agent-activity__marker {\n color: var(--color-foreground-faint-brand);\n}\n.agent-activity__item--error .agent-activity__marker {\n color: var(--color-foreground-bold-negative);\n}\n.agent-activity__item span:last-child {\n display: grid;\n gap: var(--dimension-space-025);\n}\n.agent-activity__pending-dot {\n width: var(--dimension-size-050);\n height: var(--dimension-size-050);\n border-radius: var(--dimension-radius-half);\n background: currentColor;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n summary ds-icon {\n transition: transform var(--effect-motion-short-2);\n }\n}\n","import { Component, Prop, State, Watch, h, Host } from '@stencil/core';\nimport type { AgentActivityItem } from '../conversation-types';\n\n@Component({\n tag: 'ds-agent-activity',\n styleUrl: 'AgentActivity.css',\n scoped: true,\n})\nexport class AgentActivity {\n @Prop() items: AgentActivityItem[] = [];\n @Prop() heading: string = 'Activity';\n @Prop() open: boolean = false;\n\n @State() private expanded: boolean = false;\n\n componentWillLoad() {\n this.expanded = this.open;\n }\n\n @Watch('open')\n handleOpenChange(open: boolean) {\n this.expanded = open;\n }\n\n private get currentItem(): AgentActivityItem | undefined {\n return (\n this.items.find(item => item.state === 'active') ??\n this.items.find(item => item.state === 'error') ??\n [...this.items].reverse().find(item => item.state === 'complete') ??\n this.items.find(item => item.state === 'pending')\n );\n }\n\n private handleToggle = (event: Event) => {\n this.expanded = (event.currentTarget as HTMLDetailsElement).open;\n };\n\n private stateLabel(item: AgentActivityItem): string {\n if (item.state === 'active') return 'In progress';\n if (item.state === 'complete') return 'Complete';\n if (item.state === 'error') return 'Error';\n return 'Pending';\n }\n\n render() {\n return (\n <Host>\n <details class=\"agent-activity\" open={this.open} onToggle={this.handleToggle}>\n <summary>\n <ds-icon name=\"ChevronRight\" size=\"xs\" color=\"inherit\" />\n <ds-text\n class=\"agent-activity__summary-label\"\n variant=\"text-body-small\"\n shimmer={!this.expanded && this.currentItem?.state === 'active'}\n >\n {this.expanded ? this.heading : this.currentItem?.label ?? this.heading}\n </ds-text>\n </summary>\n <ol>\n {this.items.map(item => (\n <li class={`agent-activity__item agent-activity__item--${item.state}`}>\n <span class=\"agent-activity__marker\" aria-hidden=\"true\">\n {item.state === 'active' ? (\n <ds-loader size=\"xs\" color=\"inherit\" />\n ) : item.state === 'pending' ? (\n <span class=\"agent-activity__pending-dot\" />\n ) : (\n <ds-icon\n name={item.state === 'error' ? 'ErrorTriangle' : 'Check'}\n size=\"xs\"\n color=\"inherit\"\n />\n )}\n </span>\n <span>\n <ds-text variant=\"text-body-small\" shimmer={item.state === 'active'}>\n {item.label}\n </ds-text>\n {item.detail ? (\n <ds-text variant=\"text-caption\" color=\"secondary\">\n {item.detail}\n </ds-text>\n ) : null}\n <span class=\"agent-activity__state ds-visually-hidden\">{this.stateLabel(item)}</span>\n </span>\n </li>\n ))}\n </ol>\n </details>\n </Host>\n );\n }\n}\n"],"mappings":"kKAAA,MAAMA,EAAmB,IAAM,66D,MCQlBC,EAAaC,EAAA,MAAAD,UAAAE,EAL1B,WAAAC,CAAAC,G,4CAMUC,KAAAC,MAA6B,GAC7BD,KAAAE,QAAkB,WAClBF,KAAAG,KAAgB,MAEPH,KAAAI,SAAoB,MAoB7BJ,KAAAK,aAAgBC,IACtBN,KAAKI,SAAYE,EAAMC,cAAqCJ,IAAI,CA0DnE,CA7EC,iBAAAK,GACER,KAAKI,SAAWJ,KAAKG,I,CAIvB,gBAAAM,CAAiBN,GACfH,KAAKI,SAAWD,C,CAGlB,eAAYO,GACV,OACEV,KAAKC,MAAMU,MAAKC,GAAQA,EAAKC,QAAU,YACvCb,KAAKC,MAAMU,MAAKC,GAAQA,EAAKC,QAAU,WACvC,IAAIb,KAAKC,OAAOa,UAAUH,MAAKC,GAAQA,EAAKC,QAAU,cACtDb,KAAKC,MAAMU,MAAKC,GAAQA,EAAKC,QAAU,W,CAQnC,UAAAE,CAAWH,GACjB,GAAIA,EAAKC,QAAU,SAAU,MAAO,cACpC,GAAID,EAAKC,QAAU,WAAY,MAAO,WACtC,GAAID,EAAKC,QAAU,QAAS,MAAO,QACnC,MAAO,S,CAGT,MAAAG,GACE,OACEC,EAACC,EAAI,CAAAC,IAAA,4CACHF,EAAA,WAAAE,IAAA,2CAASC,MAAM,iBAAiBjB,KAAMH,KAAKG,KAAMkB,SAAUrB,KAAKK,cAC9DY,EAAA,WAAAE,IAAA,4CACEF,EAAA,WAAAE,IAAA,2CAASG,KAAK,eAAeC,KAAK,KAAKC,MAAM,YAC7CP,EAAA,WAAAE,IAAA,2CACEC,MAAM,gCACNK,QAAQ,kBACRC,SAAU1B,KAAKI,UAAYJ,KAAKU,aAAaG,QAAU,UAEtDb,KAAKI,SAAWJ,KAAKE,QAAUF,KAAKU,aAAaiB,OAAS3B,KAAKE,UAGpEe,EAAA,MAAAE,IAAA,4CACGnB,KAAKC,MAAM2B,KAAIhB,GACdK,EAAA,MAAIG,MAAO,8CAA8CR,EAAKC,SAC5DI,EAAA,QAAMG,MAAM,yBAAwB,cAAa,QAC9CR,EAAKC,QAAU,SACdI,EAAA,aAAWM,KAAK,KAAKC,MAAM,YACzBZ,EAAKC,QAAU,UACjBI,EAAA,QAAMG,MAAM,gCAEZH,EAAA,WACEK,KAAMV,EAAKC,QAAU,QAAU,gBAAkB,QACjDU,KAAK,KACLC,MAAM,aAIZP,EAAA,YACEA,EAAA,WAASQ,QAAQ,kBAAkBC,QAASd,EAAKC,QAAU,UACxDD,EAAKe,OAEPf,EAAKiB,OACJZ,EAAA,WAASQ,QAAQ,eAAeD,MAAM,aACnCZ,EAAKiB,QAEN,KACJZ,EAAA,QAAMG,MAAM,4CAA4CpB,KAAKe,WAAWH,U","ignoreList":[]}