@ds-mo/ui 14.17.1 → 14.18.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 (251) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +6 -6
  3. package/dist/agent.json +60 -32
  4. package/dist/angular/ds-button-filled.d.ts +1 -1
  5. package/dist/angular/ds-button-filled.js +3 -3
  6. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  7. package/dist/angular/ds-button-unfilled.js +3 -3
  8. package/dist/angular/ds-mobile-bar-nav.d.ts +1 -1
  9. package/dist/angular/ds-mobile-bar-nav.js +3 -3
  10. package/dist/components/ds-agent-activity.js +1 -1
  11. package/dist/components/ds-agent-questionnaire.js +1 -1
  12. package/dist/components/ds-agent-response.js +1 -1
  13. package/dist/components/ds-agent-source-list.js +1 -1
  14. package/dist/components/ds-agent-tool-call.js +1 -1
  15. package/dist/components/ds-attachment-list.js +1 -1
  16. package/dist/components/ds-badge.js +1 -1
  17. package/dist/components/ds-banner.js +1 -1
  18. package/dist/components/ds-bar-action.js +1 -1
  19. package/dist/components/ds-bar-nav.js +1 -1
  20. package/dist/components/ds-bar-title.js +1 -1
  21. package/dist/components/ds-bar-workflow.js +1 -1
  22. package/dist/components/ds-bar-workflow.js.map +1 -1
  23. package/dist/components/ds-breadcrumb.js +1 -1
  24. package/dist/components/ds-button-filled.js +1 -1
  25. package/dist/components/ds-button-unfilled.js +1 -1
  26. package/dist/components/ds-card-chart.js +1 -1
  27. package/dist/components/ds-card-chart.js.map +1 -1
  28. package/dist/components/ds-card-overview.js +1 -1
  29. package/dist/components/ds-card-setting.js +1 -1
  30. package/dist/components/ds-card-setting.js.map +1 -1
  31. package/dist/components/ds-chart-legend.js +1 -1
  32. package/dist/components/ds-chart.js +1 -1
  33. package/dist/components/ds-checkbox.js +1 -1
  34. package/dist/components/ds-chip.js +1 -1
  35. package/dist/components/ds-code-block.js +1 -1
  36. package/dist/components/ds-conversation-list-item.js +1 -1
  37. package/dist/components/ds-conversation-list-section.js +1 -1
  38. package/dist/components/ds-conversation-list.js +1 -1
  39. package/dist/components/ds-divider.js +1 -1
  40. package/dist/components/ds-empty-state.js +1 -1
  41. package/dist/components/ds-field.js +1 -1
  42. package/dist/components/ds-filter-menu.js +1 -1
  43. package/dist/components/ds-input.js +1 -1
  44. package/dist/components/ds-markdown.js +1 -1
  45. package/dist/components/ds-menu.js +1 -1
  46. package/dist/components/ds-message-actions.js +1 -1
  47. package/dist/components/ds-message-actions.js.map +1 -1
  48. package/dist/components/ds-message-bubble.js +1 -1
  49. package/dist/components/ds-message-composer.js +1 -1
  50. package/dist/components/ds-message-scroller.js +1 -1
  51. package/dist/components/ds-message.js +1 -1
  52. package/dist/components/ds-mobile-bar-nav.js +1 -1
  53. package/dist/components/ds-mobile-header.js +1 -1
  54. package/dist/components/ds-mobile-section-switcher.js +1 -1
  55. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  56. package/dist/components/ds-modal.js +1 -1
  57. package/dist/components/ds-pagination.js +1 -1
  58. package/dist/components/ds-panel-nav.js +1 -1
  59. package/dist/components/ds-panel-sub-nav.js +1 -1
  60. package/dist/components/ds-panel-tool-header.js +1 -1
  61. package/dist/components/ds-panel-tool-search.js +1 -1
  62. package/dist/components/ds-panel-tools.js +1 -1
  63. package/dist/components/ds-paper-texture.js +1 -1
  64. package/dist/components/ds-radio.js +1 -1
  65. package/dist/components/ds-scroll-overlay.js +1 -1
  66. package/dist/components/ds-select.js +1 -1
  67. package/dist/components/ds-shell-app.js +1 -1
  68. package/dist/components/ds-shell-app.js.map +1 -1
  69. package/dist/components/ds-shell-page.js +1 -1
  70. package/dist/components/ds-shell-tools.js +1 -1
  71. package/dist/components/ds-skeleton.js +1 -1
  72. package/dist/components/ds-slider.js +1 -1
  73. package/dist/components/ds-swatch-picker.js +1 -1
  74. package/dist/components/ds-switch.js +1 -1
  75. package/dist/components/ds-tab-group.js +1 -1
  76. package/dist/components/ds-table-filter.js +1 -1
  77. package/dist/components/ds-table-filter.js.map +1 -1
  78. package/dist/components/ds-table-saved-views.js +1 -1
  79. package/dist/components/ds-table-sort.js +1 -1
  80. package/dist/components/ds-table-sort.js.map +1 -1
  81. package/dist/components/ds-table-toolbar.js +1 -1
  82. package/dist/components/ds-table-toolbar.js.map +1 -1
  83. package/dist/components/ds-table.js +1 -1
  84. package/dist/components/ds-table.js.map +1 -1
  85. package/dist/components/ds-tag.js +1 -1
  86. package/dist/components/ds-text.js +1 -1
  87. package/dist/components/ds-toast.js +1 -1
  88. package/dist/components/ds-toast.js.map +1 -1
  89. package/dist/components/ds-tooltip-chart.js +1 -1
  90. package/dist/components/ds-tooltip.js +1 -1
  91. package/dist/components/ds-typing-indicator.js +1 -1
  92. package/dist/components/{p-y4jhIkRc.js → p-3WlVHGUe.js} +2 -2
  93. package/dist/components/{p-DAqSoyd4.js → p-9EQ3xLI1.js} +2 -2
  94. package/dist/components/p-9GuNIXuz.js +2 -0
  95. package/dist/components/{p-B0PEg5RF.js.map → p-9GuNIXuz.js.map} +1 -1
  96. package/dist/components/p-B0Byw6OX.js +2 -0
  97. package/dist/components/p-B0Byw6OX.js.map +1 -0
  98. package/dist/components/{p-DSIOINBK.js → p-B145kX-i.js} +2 -2
  99. package/dist/components/{p-DZ55e3j9.js → p-B9ZfoprK.js} +2 -2
  100. package/dist/components/{p-DNJTN_s0.js → p-BBmRD_S0.js} +2 -2
  101. package/dist/components/{p-C4TgWJi9.js → p-BKx2ihnG.js} +2 -2
  102. package/dist/components/{p-Be1sY58w.js → p-BTTxl3ro.js} +2 -2
  103. package/dist/components/p-Ba7DaFkb.js +2 -0
  104. package/dist/components/{p-DEjh3klB.js.map → p-Ba7DaFkb.js.map} +1 -1
  105. package/dist/components/{p-CKmfuK7k.js → p-BcNYvLMi.js} +2 -2
  106. package/dist/components/p-BcNYvLMi.js.map +1 -0
  107. package/dist/components/{p-rrFMAZkj.js → p-BdgoB2ef.js} +2 -2
  108. package/dist/components/{p-U8JIZzI2.js → p-Be-vZpWx.js} +2 -2
  109. package/dist/components/p-Be-vZpWx.js.map +1 -0
  110. package/dist/components/{p-DQqOzDEq.js → p-BiBXCjjo.js} +2 -2
  111. package/dist/components/{p-D1YhYulL.js → p-C6yLERx6.js} +2 -2
  112. package/dist/components/{p-Dg9qiMDa.js → p-C9StMCWg.js} +2 -2
  113. package/dist/components/{p-7tZx4ukz.js → p-CAJIARNW.js} +2 -2
  114. package/dist/components/{p-BVlfQ8xZ.js → p-CBa_6lqj.js} +2 -2
  115. package/dist/components/p-CBa_6lqj.js.map +1 -0
  116. package/dist/components/{p-D2z2DgtX.js → p-CHEt4mW8.js} +2 -2
  117. package/dist/components/p-CI5Ce8VF.js +2 -0
  118. package/dist/components/p-CI5Ce8VF.js.map +1 -0
  119. package/dist/components/{p-BHz78C8h.js → p-CbZ0RU2c.js} +2 -2
  120. package/dist/components/{p-BFSLT0yc.js → p-Cgm7YMLw.js} +2 -2
  121. package/dist/components/{p-BFSLT0yc.js.map → p-Cgm7YMLw.js.map} +1 -1
  122. package/dist/components/{p-Bn8NryHK.js → p-CihNoe1M.js} +2 -2
  123. package/dist/components/{p-D4K9CE8a.js → p-Cj5Hkt6Y.js} +2 -2
  124. package/dist/components/{p-ruPTIV6t.js → p-D6P_1YrL.js} +2 -2
  125. package/dist/components/p-DC_8dK55.js +2 -0
  126. package/dist/components/p-DC_8dK55.js.map +1 -0
  127. package/dist/components/p-DHzn7INS.js +2 -0
  128. package/dist/components/{p-DIEK54fV.js.map → p-DHzn7INS.js.map} +1 -1
  129. package/dist/components/{p-BNkU9dcc.js → p-DJ0GCCFa.js} +2 -2
  130. package/dist/components/p-DKY3IJqt.js +2 -0
  131. package/dist/components/p-DKY3IJqt.js.map +1 -0
  132. package/dist/components/{p-DsJW5W3W.js → p-DMaQkEYP.js} +2 -2
  133. package/dist/components/p-DNpLDbWY.js +2 -0
  134. package/dist/components/p-DNpLDbWY.js.map +1 -0
  135. package/dist/components/{p-PD1Vfg0t.js → p-DPR0TGGJ.js} +2 -2
  136. package/dist/components/{p-CMFvaY05.js → p-DPpHSIzS.js} +2 -2
  137. package/dist/components/p-DQyvAN44.js +2 -0
  138. package/dist/components/p-DQyvAN44.js.map +1 -0
  139. package/dist/components/p-DaxKVtZG.js +2 -0
  140. package/dist/components/p-DaxKVtZG.js.map +1 -0
  141. package/dist/components/{p-a6qP60zb.js → p-DbJahF86.js} +2 -2
  142. package/dist/components/{p-D8Qd6gkf.js → p-Dd8VKdAO.js} +2 -2
  143. package/dist/components/{p-C0X2zKbB.js → p-Dginv8PT.js} +2 -2
  144. package/dist/components/{p-BHDkJmrC.js → p-Dl3gciej.js} +2 -2
  145. package/dist/components/p-Drcl4zS9.js +2 -0
  146. package/dist/components/p-DzPw6aDK.js +2 -0
  147. package/dist/components/p-DzPw6aDK.js.map +1 -0
  148. package/dist/components/{p-BhYWdbEp.js → p-HZz5aJKz.js} +2 -2
  149. package/dist/components/{p-BGXqFq2C.js → p-LHzBS95u.js} +2 -2
  150. package/dist/components/{p-DHuyj-9J.js → p-hp_2W2Qy.js} +2 -2
  151. package/dist/components/p-jk2-y5dH.js +2 -0
  152. package/dist/components/p-jk2-y5dH.js.map +1 -0
  153. package/dist/components/{p-CzcWZiH-.js → p-oCc3mz_c.js} +2 -2
  154. package/dist/docs/components.json +234 -19
  155. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +2 -0
  156. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +2 -2
  157. package/dist/lib/shell/index.js +17 -25
  158. package/dist/lib/shell/index.js.map +2 -2
  159. package/dist/lib/shell/shell-responsive.d.ts +6 -1
  160. package/dist/lib/utils/anchored-position.d.ts +2 -0
  161. package/dist/lib/utils/button-render.d.ts +1 -0
  162. package/dist/mcp-data/registry/button-filled.json +20 -1
  163. package/dist/mcp-data/registry/button-unfilled.json +23 -3
  164. package/dist/mcp-data/registry/filter-menu.json +2 -2
  165. package/dist/mcp-data/registry/input.json +2 -2
  166. package/dist/mcp-data/registry/menu.json +2 -1
  167. package/dist/mcp-data/registry/mobile-bar-nav.json +57 -6
  168. package/dist/mcp-data/registry/pagination.json +5 -4
  169. package/dist/mcp-data/registry/panel-tools.json +4 -4
  170. package/dist/mcp-data/registry/registry.json +59 -31
  171. package/dist/mcp-data/registry/select.json +2 -2
  172. package/dist/mcp-data/registry/shell-app.json +5 -5
  173. package/dist/mcp-data/registry/shell-tools.json +4 -4
  174. package/dist/mcp-data/registry/table-filter.json +3 -3
  175. package/dist/mcp-data/registry/table-sort.json +5 -4
  176. package/dist/mcp-data/registry/table-toolbar.json +10 -9
  177. package/dist/mcp-data/registry/table.json +4 -4
  178. package/dist/styles/table.css +30 -10
  179. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +2 -0
  180. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +2 -0
  181. package/dist/types/components/Menu/Menu.d.ts +1 -0
  182. package/dist/types/components/MobileBarNav/MobileBarNav.d.ts +4 -0
  183. package/dist/types/components/Pagination/Pagination.d.ts +8 -0
  184. package/dist/types/components/PanelTools/panel-tools-types.d.ts +2 -2
  185. package/dist/types/components/Table/Table.d.ts +1 -0
  186. package/dist/types/components/TableToolbar/TableToolbar.d.ts +5 -0
  187. package/dist/types/components.d.ts +51 -0
  188. package/dist/types/shell/shell-responsive.d.ts +6 -1
  189. package/dist/types/utils/anchored-position.d.ts +2 -0
  190. package/dist/types/utils/button-render.d.ts +1 -0
  191. package/dist/vue/ds-button-filled.js +1 -0
  192. package/dist/vue/ds-button-unfilled.js +1 -0
  193. package/dist/vue/ds-mobile-bar-nav.js +3 -0
  194. package/package.json +1 -1
  195. package/dist/components/p-23u3lIr1.js +0 -2
  196. package/dist/components/p-Asi9h3pa.js +0 -2
  197. package/dist/components/p-Asi9h3pa.js.map +0 -1
  198. package/dist/components/p-B0PEg5RF.js +0 -2
  199. package/dist/components/p-BBxcMVqk.js +0 -2
  200. package/dist/components/p-BBxcMVqk.js.map +0 -1
  201. package/dist/components/p-BEvBJ65v.js +0 -2
  202. package/dist/components/p-BEvBJ65v.js.map +0 -1
  203. package/dist/components/p-BVlfQ8xZ.js.map +0 -1
  204. package/dist/components/p-BX0BMhgz.js +0 -2
  205. package/dist/components/p-BX0BMhgz.js.map +0 -1
  206. package/dist/components/p-Bh67XbfB.js +0 -2
  207. package/dist/components/p-Bh67XbfB.js.map +0 -1
  208. package/dist/components/p-CKmfuK7k.js.map +0 -1
  209. package/dist/components/p-DEjh3klB.js +0 -2
  210. package/dist/components/p-DIEK54fV.js +0 -2
  211. package/dist/components/p-DOqnJVos.js +0 -2
  212. package/dist/components/p-DOqnJVos.js.map +0 -1
  213. package/dist/components/p-Dr4AgJbV.js +0 -2
  214. package/dist/components/p-Dr4AgJbV.js.map +0 -1
  215. package/dist/components/p-NzGRAPcF.js +0 -2
  216. package/dist/components/p-NzGRAPcF.js.map +0 -1
  217. package/dist/components/p-U8JIZzI2.js.map +0 -1
  218. package/dist/components/p-ZZzC52Ea.js +0 -2
  219. package/dist/components/p-ZZzC52Ea.js.map +0 -1
  220. package/dist/components/p-__lNIImO.js +0 -2
  221. package/dist/components/p-__lNIImO.js.map +0 -1
  222. /package/dist/components/{p-y4jhIkRc.js.map → p-3WlVHGUe.js.map} +0 -0
  223. /package/dist/components/{p-DAqSoyd4.js.map → p-9EQ3xLI1.js.map} +0 -0
  224. /package/dist/components/{p-DSIOINBK.js.map → p-B145kX-i.js.map} +0 -0
  225. /package/dist/components/{p-DZ55e3j9.js.map → p-B9ZfoprK.js.map} +0 -0
  226. /package/dist/components/{p-DNJTN_s0.js.map → p-BBmRD_S0.js.map} +0 -0
  227. /package/dist/components/{p-C4TgWJi9.js.map → p-BKx2ihnG.js.map} +0 -0
  228. /package/dist/components/{p-Be1sY58w.js.map → p-BTTxl3ro.js.map} +0 -0
  229. /package/dist/components/{p-rrFMAZkj.js.map → p-BdgoB2ef.js.map} +0 -0
  230. /package/dist/components/{p-DQqOzDEq.js.map → p-BiBXCjjo.js.map} +0 -0
  231. /package/dist/components/{p-D1YhYulL.js.map → p-C6yLERx6.js.map} +0 -0
  232. /package/dist/components/{p-Dg9qiMDa.js.map → p-C9StMCWg.js.map} +0 -0
  233. /package/dist/components/{p-7tZx4ukz.js.map → p-CAJIARNW.js.map} +0 -0
  234. /package/dist/components/{p-D2z2DgtX.js.map → p-CHEt4mW8.js.map} +0 -0
  235. /package/dist/components/{p-BHz78C8h.js.map → p-CbZ0RU2c.js.map} +0 -0
  236. /package/dist/components/{p-Bn8NryHK.js.map → p-CihNoe1M.js.map} +0 -0
  237. /package/dist/components/{p-D4K9CE8a.js.map → p-Cj5Hkt6Y.js.map} +0 -0
  238. /package/dist/components/{p-ruPTIV6t.js.map → p-D6P_1YrL.js.map} +0 -0
  239. /package/dist/components/{p-BNkU9dcc.js.map → p-DJ0GCCFa.js.map} +0 -0
  240. /package/dist/components/{p-DsJW5W3W.js.map → p-DMaQkEYP.js.map} +0 -0
  241. /package/dist/components/{p-PD1Vfg0t.js.map → p-DPR0TGGJ.js.map} +0 -0
  242. /package/dist/components/{p-CMFvaY05.js.map → p-DPpHSIzS.js.map} +0 -0
  243. /package/dist/components/{p-a6qP60zb.js.map → p-DbJahF86.js.map} +0 -0
  244. /package/dist/components/{p-D8Qd6gkf.js.map → p-Dd8VKdAO.js.map} +0 -0
  245. /package/dist/components/{p-C0X2zKbB.js.map → p-Dginv8PT.js.map} +0 -0
  246. /package/dist/components/{p-BHDkJmrC.js.map → p-Dl3gciej.js.map} +0 -0
  247. /package/dist/components/{p-23u3lIr1.js.map → p-Drcl4zS9.js.map} +0 -0
  248. /package/dist/components/{p-BhYWdbEp.js.map → p-HZz5aJKz.js.map} +0 -0
  249. /package/dist/components/{p-BGXqFq2C.js.map → p-LHzBS95u.js.map} +0 -0
  250. /package/dist/components/{p-DHuyj-9J.js.map → p-hp_2W2Qy.js.map} +0 -0
  251. /package/dist/components/{p-CzcWZiH-.js.map → p-oCc3mz_c.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"names":["isMenuSwatchPickerSection","section","variant","isMenuPickerSection","snapshotMenuSections","sections","map","options","option","swatchSection","items","item","menuReorderableRange","index","reorderable","start","end","length","moveReorderableMenuItemBefore","fromIndex","insertBefore","range","clamped","Math","min","max","toIndex","next","splice","moveReorderableMenuItemBy","offset","locateMenuItem","flatIndex","remaining","sectionIndex","itemIndex","createMenuReorderDetail","nextItems","indexOf","value","matched","findIndex","candidate","menuCss","MENU_ITEM_TAG_SIZE","lg","md","sm","xs","MENU_FOCUSABLE_SELECTOR","join","Menu","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","open","size","selectionMode","side","align","anchorAlignment","sideOffset","TOKEN_CSS_LENGTHS","space050","alignOffset","initialFocusVisible","menuLabel","shouldRender","closing","pos","x","y","focusedIndex","positionReady","focusRingVisible","reorderFromFlat","reorderInsertBefore","reorderAnnouncement","clickOutsideHandler","closeTimer","suppressItemClick","reorderPointer","position","AnchoredPositionController","getAnchor","resolvedAnchor","getPopup","el","querySelector","measure","anchorEl","popup","anchorRect","getBoundingClientRect","sectionInsetPx","viewportPadPx","minWidth","style","choicePopupMinWidth","width","removeProperty","popupWidth","offsetWidth","popupFallbackWidthPx","popupHeight","offsetHeight","popupFallbackHeightPx","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","viewportWidth","window","innerWidth","viewportHeight","innerHeight","apply","onReady","liveUpdate","topLayer","lastRenderedSections","closingSections","onReorderPointerMove","event","drag","pointerId","activeSections","resolveReorderInsertBefore","clientY","onReorderPointerUp","clearReorderPointer","queueMicrotask","emitReorder","onReorderPointerCancel","componentDidLoad","onOpenChange","disconnectedCallback","cancelPositionRetry","cancelLivePositionUpdate","teardownListeners","isOpen","setupListeners","schedulePositionUpdate","focusInitialItem","positionReadyCallback","undefined","captureClosingSections","closeAnimationMs","finishClose","setTimeout","onAnchorChange","onPositionPropsChange","resolveCssLengthPx","TOKEN_DEFAULTS","menuWidthXs","menuFallbackHeight","resolveMotionTimeMs","motionShort2","animationDurationShort3","matches","hidePopover","dsAfterClose","emit","visibleSections","anchor","anchorId","document","getElementById","anchorFocusTarget","focusAnchor","setFocus","focus","moveFocusAfterTab","backwards","candidates","Array","from","querySelectorAll","filter","element","closest","getClientRects","compositeTabLeavesPopup","focusables","currentIndex","target","shiftKey","flatItems","flatMap","hasCompositeSections","some","cancel","scheduleLivePositionUpdate","scheduleLiveUpdate","callback","schedule","calculatePosition","update","requestAnimationFrame","flat","selectedIdx","it","isSelected","isInactive","firstEnabledIdx","btns","e","t","contains","close","addEventListener","observe","unobserve","removeEventListener","clearTimeout","restoreFocus","dsClose","handleKeyDown","key","preventDefault","altKey","ctrlKey","handleReorderKey","enabled","i","cur","safe","stopPropagation","focusItem","idx","handleItemClick","dsSelect","handleSwatchSelect","dsSwatchSelect","located","detail","flatIndexFor","announceReorder","dsReorder","count","label","onReorderPointerDown","button","buttons","sectionStart","row","rect","top","height","render","h","Host","display","flatIdx","dragLocated","dragRange","popupStyle","left","transform","round","zIndex","visibility","menuWidth","popover","class","role","si","Boolean","header","as","CONTROL_SUPPORTING_TEXT_VARIANT","emphasis","color","groupLabel","onDsChange","isFocused","isSingleSelectionItem","showSwitch","usesLeading","icon","locked","dragging","dropBefore","dropAfter","type","isDestructive","String","switchValue","disabled","tabIndex","onMouseDown","onClick","onFocus","onPointerDown","name","CONTROL_TEXT_VARIANT","subtext","tag","intent","contrast","rounded","isInset","dot","hasRing","checked","presentation"],"sources":["src/wc/components/Menu/menu-types.ts","src/wc/components/Menu/menu-sections.ts","src/wc/components/Menu/menu-reorder.ts","src/wc/components/Menu/Menu.css?tag=ds-menu&encapsulation=scoped","src/wc/components/Menu/Menu.tsx"],"sourcesContent":["import type { SwatchPickerOption, SwatchPickerSection } from '../SwatchPicker/swatch-picker-types';\nimport type { TagContrast, TagIntent } from '../Tag/Tag';\n\nexport type { MenuAlign, MenuSide } from './menu-position';\nexport {\n PANEL_NAV_USER_MENU_PLACEMENT,\n PANEL_TOOLS_HEADER_MENU_PLACEMENT,\n type MenuPlacement,\n} from './menu-placement';\n\nexport interface MenuItemTagData {\n label: string;\n intent?: TagIntent;\n contrast?: TagContrast;\n rounded?: boolean;\n}\n\nexport interface MenuItemData {\n label: string;\n value?: string;\n subtext?: string;\n /** Leading decorative icon. Ignored when `reorderable` is true. */\n icon?: string;\n /** Show a supplemental brand notification dot. */\n dot?: boolean;\n /** Show a non-interactive tag at the trailing edge of the row. */\n tag?: MenuItemTagData;\n isSelected?: boolean;\n isInactive?: boolean;\n isDestructive?: boolean;\n /** Render a compact switch indicator; the menu row owns interaction. */\n showSwitch?: boolean;\n switchValue?: boolean;\n /** Prefix a drag handle and allow pointer and keyboard reorder within the contiguous reorderable run. */\n reorderable?: boolean;\n}\n\n/** Next section item order after a pointer or keyboard reorder. */\nexport interface MenuReorderDetail {\n item: MenuItemData;\n fromIndex: number;\n toIndex: number;\n sectionIndex: number;\n items: MenuItemData[];\n}\n\nexport interface MenuItemsSection {\n header?: string;\n items: MenuItemData[];\n}\n\nexport interface MenuSwatchPickerSection {\n header?: string;\n variant: 'swatch-picker';\n value: string;\n options?: SwatchPickerOption[];\n sections?: SwatchPickerSection[];\n groupLabel?: string;\n}\n\nexport type MenuSection =\n | MenuItemsSection\n | MenuSwatchPickerSection;\n\nexport function isMenuSwatchPickerSection(\n section: MenuSection,\n): section is MenuSwatchPickerSection {\n return 'variant' in section && section.variant === 'swatch-picker';\n}\n\nexport function isMenuPickerSection(\n section: MenuSection,\n): section is MenuSwatchPickerSection {\n return isMenuSwatchPickerSection(section);\n}\n\nexport type { SwatchPickerOption, SwatchPickerSection };\n","import type { MenuSection } from './menu-types';\nimport { isMenuSwatchPickerSection } from './menu-types';\n\n/** Preserve the exact menu context painted during exit motion. */\nexport function snapshotMenuSections(sections: readonly MenuSection[]): MenuSection[] {\n return sections.map(section => {\n if (isMenuSwatchPickerSection(section)) {\n return {\n ...section,\n ...(section.options\n ? { options: section.options.map(option => ({ ...option })) }\n : {}),\n ...(section.sections\n ? {\n sections: section.sections.map(swatchSection => ({\n ...swatchSection,\n options: swatchSection.options.map(option => ({ ...option })),\n })),\n }\n : {}),\n };\n }\n return { ...section, items: section.items.map(item => ({ ...item })) };\n });\n}\n","import {\n isMenuPickerSection,\n type MenuItemData,\n type MenuReorderDetail,\n type MenuSection,\n} from './menu-types';\n\nexport interface MenuReorderRange {\n start: number;\n end: number;\n}\n\n/** Contiguous reorderable run containing `index`, or null when that row cannot move. */\nexport function menuReorderableRange(\n items: readonly MenuItemData[],\n index: number,\n): MenuReorderRange | null {\n if (!items[index]?.reorderable) return null;\n\n let start = index;\n while (start > 0 && items[start - 1]?.reorderable) start -= 1;\n\n let end = index;\n while (end < items.length - 1 && items[end + 1]?.reorderable) end += 1;\n\n return { start, end };\n}\n\n/**\n * Move a reorderable row so it would be inserted before `insertBefore`.\n * `insertBefore` is clamped to the contiguous reorderable run.\n */\nexport function moveReorderableMenuItemBefore(\n items: readonly MenuItemData[],\n fromIndex: number,\n insertBefore: number,\n): MenuItemData[] | null {\n const range = menuReorderableRange(items, fromIndex);\n if (!range) return null;\n\n const clamped = Math.min(Math.max(insertBefore, range.start), range.end + 1);\n let toIndex = clamped;\n if (fromIndex < toIndex) toIndex -= 1;\n if (toIndex === fromIndex || toIndex < range.start || toIndex > range.end) return null;\n\n const next = [...items];\n const [item] = next.splice(fromIndex, 1);\n next.splice(toIndex, 0, item);\n return next;\n}\n\n/** Keyboard step: move one slot within the reorderable run. */\nexport function moveReorderableMenuItemBy(\n items: readonly MenuItemData[],\n fromIndex: number,\n offset: number,\n): MenuItemData[] | null {\n if (offset === 0) return null;\n return moveReorderableMenuItemBefore(\n items,\n fromIndex,\n fromIndex + (offset < 0 ? offset : offset + 1),\n );\n}\n\nexport function locateMenuItem(\n sections: readonly MenuSection[],\n flatIndex: number,\n): { sectionIndex: number; itemIndex: number; items: MenuItemData[] } | null {\n let remaining = flatIndex;\n for (let sectionIndex = 0; sectionIndex < sections.length; sectionIndex += 1) {\n const section = sections[sectionIndex];\n if (isMenuPickerSection(section)) continue;\n if (remaining < section.items.length) {\n return { sectionIndex, itemIndex: remaining, items: section.items };\n }\n remaining -= section.items.length;\n }\n return null;\n}\n\nexport function createMenuReorderDetail(\n items: MenuItemData[],\n fromIndex: number,\n nextItems: MenuItemData[],\n sectionIndex: number,\n): MenuReorderDetail | null {\n const item = items[fromIndex];\n if (!item) return null;\n const toIndex = nextItems.indexOf(item);\n if (toIndex < 0) {\n const value = item.value;\n const matched = value\n ? nextItems.findIndex(candidate => candidate.value === value)\n : -1;\n if (matched < 0) return null;\n return { item, fromIndex, toIndex: matched, sectionIndex, items: nextItems };\n }\n return { item, fromIndex, toIndex, sectionIndex, items: nextItems };\n}\n","@import '../../utils/choice-list.css';\n@import '../../utils/visually-hidden.css';\n@import '../../utils/forced-colors.css';\n\n/* Inactive: `.ds-control-inactive` (50% opacity). */\n\n.menu-item--destructive .menu-item__label {\n /* Beat ds-text color-* host classes for destructive rows. */\n color: var(--color-foreground-bold-negative) !important;\n}\n\n/* Standard md icon zone keeps the dot aligned with other control suffixes. */\n.menu-item__dot-box {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n pointer-events: none;\n}\n\n/* Switch suffix keeps an 8px label-to-control gap without changing the\n density gap between a prefix icon or drag handle and the label. */\n.menu-item__switch {\n flex-shrink: 0;\n margin-inline-start: calc(\n var(--dimension-space-100) - var(--ds-control-gap, var(--dimension-space-050))\n );\n}\n\n/* ── Prefix icon / reorder handle ────────────────────────────────────────── */\n\n.menu-item > .menu-item__handle {\n pointer-events: auto;\n cursor: grab;\n touch-action: none;\n}\n\n.menu-item > .menu-item__handle:active,\n.menu-item--dragging > .menu-item__handle {\n cursor: grabbing;\n}\n\n.menu-item--dragging {\n opacity: var(--effect-opacity-medium);\n}\n\n.menu-item__drop-rail {\n position: absolute;\n z-index: var(--dimension-z-index-raised);\n inset-inline: var(--dimension-space-050);\n block-size: var(--dimension-stroke-width-025);\n border-radius: var(--dimension-radius-half);\n background: var(--color-border-bold-brand);\n pointer-events: none;\n}\n\n.menu-item__drop-rail--before {\n inset-block-start: calc(-1 * var(--dimension-space-025));\n transform: translateY(-50%);\n}\n\n.menu-item__drop-rail--after {\n inset-block-end: calc(-1 * var(--dimension-space-025));\n transform: translateY(50%);\n}\n\n@media (forced-colors: active) {\n .menu-item__drop-rail {\n background: var(--ds-forced-color-selected);\n }\n}\n","import {\n Component,\n Prop,\n State,\n Event,\n EventEmitter,\n Element,\n Watch,\n Listen,\n h,\n Host,\n} from '@stencil/core';\nimport {\n choicePopupMinWidth,\n CONTROL_SUPPORTING_TEXT_VARIANT,\n CONTROL_TEXT_VARIANT,\n resolveChoicePopupAlignOffset,\n resolveCssLengthPx,\n resolveMotionTimeMs,\n TOKEN_CSS_LENGTHS,\n TOKEN_DEFAULTS,\n type ChoicePopupAnchorAlignment,\n type ControlSize,\n} from '../../utils';\nimport { AnchoredPositionController } from '../../utils/anchored-position-controller';\nimport type { MenuAlign, MenuSide } from './menu-position';\nimport {\n isMenuPickerSection,\n isMenuSwatchPickerSection,\n type MenuItemData,\n type MenuReorderDetail,\n type MenuSection,\n} from './menu-types';\nimport { snapshotMenuSections } from './menu-sections';\nimport {\n createMenuReorderDetail,\n locateMenuItem,\n menuReorderableRange,\n moveReorderableMenuItemBefore,\n moveReorderableMenuItemBy,\n} from './menu-reorder';\n\nexport type MenuSelectionMode = 'none' | 'single';\nexport type MenuSize = ControlSize;\nconst MENU_ITEM_TAG_SIZE: Record<MenuSize, 'md' | 'sm' | 'xs'> = {\n lg: 'md',\n md: 'sm',\n sm: 'xs',\n xs: 'xs',\n};\n\nconst MENU_FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n@Component({\n tag: 'ds-menu',\n styleUrl: 'Menu.css',\n scoped: true,\n})\nexport class Menu {\n @Element() el!: HTMLElement;\n\n @Prop({ mutable: true }) open: boolean = false;\n @Prop() items: MenuItemData[] = [];\n /** Choice-row density. */\n @Prop() size: MenuSize = 'md';\n /** Give ordinary rows mutually-exclusive menu semantics using isSelected. */\n @Prop() selectionMode: MenuSelectionMode = 'none';\n @Prop() sections: MenuSection[] = [];\n /** Preferred side; placement flips to the opposite side when that offers a better fit. */\n @Prop() side: MenuSide = 'bottom';\n @Prop() align: MenuAlign = 'start';\n /** Align choice-row edges to the anchor by default; use `popup-frame` only for custom frame geometry. */\n @Prop() anchorAlignment: ChoicePopupAnchorAlignment = 'choice-cell';\n /** Gap between anchor and menu — number (px) or TokoMo length (`var(--dimension-space-050)`, etc.). */\n @Prop() sideOffset: number | string = TOKEN_CSS_LENGTHS.space050;\n /** Cross-axis offset — number (px) or TokoMo length. */\n @Prop() alignOffset: number | string = 0;\n @Prop() menuWidth: string | undefined;\n @Prop() minWidth: string | undefined;\n /** External trigger element to position against. Set via JS: menuEl.anchor = buttonEl */\n @Prop() anchor: HTMLElement | undefined;\n /** ID of the external trigger element for positioning */\n @Prop() anchorId: string | undefined;\n /** Show a visible ring on the initially focused menu item. Use only when the opener was keyboard-driven. */\n @Prop() initialFocusVisible: boolean = false;\n /** Accessible name for the popup menu. */\n @Prop() menuLabel: string = 'Menu';\n\n @State() private shouldRender: boolean = false;\n @State() private closing: boolean = false;\n @State() private pos: { x: number; y: number } = { x: 0, y: 0 };\n @State() private focusedIndex: number = 0;\n @State() private positionReady: boolean = false;\n @State() private focusRingVisible: boolean = false;\n @State() private reorderFromFlat: number | null = null;\n @State() private reorderInsertBefore: number | null = null;\n @State() private reorderAnnouncement = '';\n\n @Event() dsClose!: EventEmitter<void>;\n /** Emitted after the popup's exit motion is complete and its rendered content is removed. */\n @Event() dsAfterClose!: EventEmitter<void>;\n @Event() dsSelect!: EventEmitter<MenuItemData>;\n /** Emitted when a generic `swatch-picker` section option is chosen. */\n @Event() dsSwatchSelect!: EventEmitter<string>;\n /** Emitted after a pointer drop or keyboard move; Menu never mutates item order. */\n @Event() dsReorder!: EventEmitter<MenuReorderDetail>;\n\n private clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private positionReadyCallback: (() => void) | undefined;\n private suppressItemClick = false;\n private reorderPointer: {\n pointerId: number;\n sectionIndex: number;\n fromIndex: number;\n } | null = null;\n /**\n * Anchored placement. The choice-cell measurement stays here on purpose: the\n * inner-cell align offset and the `--dimension-menu-width-xs` floor are Menu\n * semantics, not shared geometry.\n */\n private readonly position = new AnchoredPositionController({\n getAnchor: () => this.resolvedAnchor ?? null,\n getPopup: () => this.el.querySelector<HTMLElement>('.menu-popup'),\n measure: (anchorEl, popup) => {\n if (!this.open) return null;\n\n const anchorRect = anchorEl.getBoundingClientRect();\n const sectionInsetPx = this.viewportPadPx;\n if (!this.minWidth) {\n if (\n this.anchorAlignment === 'choice-cell' &&\n (this.side === 'top' || this.side === 'bottom')\n ) {\n popup.style.minWidth = `max(var(--dimension-menu-width-xs), ${choicePopupMinWidth(\n anchorRect.width,\n sectionInsetPx\n )}px)`;\n } else {\n popup.style.removeProperty('min-width');\n }\n }\n\n return {\n anchorRect,\n popupWidth: popup.offsetWidth || this.popupFallbackWidthPx,\n popupHeight: popup.offsetHeight || this.popupFallbackHeightPx,\n side: this.side,\n align: this.align,\n sideOffsetPx: this.sideOffsetPx,\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: this.align,\n alignOffsetPx: this.alignOffsetPx,\n sectionInsetPx,\n anchorAlignment: this.anchorAlignment,\n }),\n viewportPadPx: this.viewportPadPx,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n };\n },\n apply: ({ x, y }) => {\n this.pos = { x, y };\n },\n onReady: () => {\n this.positionReady = true;\n },\n liveUpdate: 'double-frame',\n topLayer: true,\n });\n /** Last content actually painted while open; retained unchanged through exit motion. */\n private lastRenderedSections: MenuSection[] = [];\n private closingSections: MenuSection[] | null = null;\n\n componentDidLoad() {\n if (this.open) this.onOpenChange(true);\n }\n\n disconnectedCallback() {\n this.cancelPositionRetry();\n this.cancelLivePositionUpdate();\n this.clearReorderPointer();\n this.teardownListeners();\n }\n\n @Watch('open')\n onOpenChange(isOpen: boolean) {\n if (isOpen) {\n this.teardownListeners();\n this.closingSections = null;\n this.shouldRender = true;\n this.closing = false;\n this.positionReady = false;\n this.focusRingVisible = this.initialFocusVisible;\n this.setupListeners();\n this.schedulePositionUpdate(() => {\n this.focusInitialItem();\n });\n } else if (this.shouldRender) {\n this.positionReadyCallback = undefined;\n this.cancelPositionRetry();\n this.captureClosingSections();\n this.closing = true;\n this.teardownListeners();\n const closeAnimationMs = this.closeAnimationMs;\n if (closeAnimationMs <= 0) {\n this.finishClose();\n return;\n }\n this.closeTimer = setTimeout(() => {\n this.closeTimer = null;\n this.finishClose();\n }, closeAnimationMs);\n }\n }\n\n @Watch('anchor')\n @Watch('anchorId')\n onAnchorChange() {\n if (this.open) this.schedulePositionUpdate();\n }\n\n @Watch('side')\n @Watch('align')\n @Watch('anchorAlignment')\n @Watch('sideOffset')\n @Watch('alignOffset')\n onPositionPropsChange() {\n if (this.open) this.schedulePositionUpdate();\n }\n\n private get viewportPadPx(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n }\n\n private get sideOffsetPx(): number {\n return resolveCssLengthPx(this.sideOffset, TOKEN_DEFAULTS.space050);\n }\n\n private get alignOffsetPx(): number {\n return resolveCssLengthPx(this.alignOffset, 0);\n }\n\n private get popupFallbackWidthPx(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuWidthXs, TOKEN_DEFAULTS.menuWidthXs);\n }\n\n private get popupFallbackHeightPx(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.menuFallbackHeight, TOKEN_DEFAULTS.menuFallbackHeight);\n }\n\n private get closeAnimationMs(): number {\n return resolveMotionTimeMs(TOKEN_DEFAULTS.motionShort2, TOKEN_DEFAULTS.animationDurationShort3);\n }\n\n private finishClose() {\n const popup = this.el.querySelector<HTMLElement>('.menu-popup');\n if (popup?.matches(':popover-open')) popup.hidePopover();\n this.shouldRender = false;\n this.closing = false;\n this.lastRenderedSections = [];\n this.closingSections = null;\n this.clearReorderPointer();\n this.reorderAnnouncement = '';\n this.dsAfterClose.emit();\n }\n\n private captureClosingSections() {\n if (this.closingSections) return;\n const visibleSections = this.lastRenderedSections.length\n ? this.lastRenderedSections\n : this.activeSections;\n this.closingSections = snapshotMenuSections(visibleSections);\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 null;\n }\n\n private get anchorFocusTarget(): HTMLElement | null {\n const anchor = this.resolvedAnchor;\n if (!anchor) return null;\n if (anchor.matches(MENU_FOCUSABLE_SELECTOR)) return anchor;\n return anchor.querySelector<HTMLElement>(MENU_FOCUSABLE_SELECTOR) ?? anchor;\n }\n\n private focusAnchor() {\n const anchor = this.resolvedAnchor as\n (HTMLElement & { setFocus?: () => Promise<void> | void }) | null;\n if (anchor?.setFocus) {\n anchor.setFocus();\n return;\n }\n this.anchorFocusTarget?.focus();\n }\n\n private moveFocusAfterTab(backwards: boolean) {\n const anchor = this.anchorFocusTarget;\n if (!anchor) return;\n if (backwards) {\n anchor.focus();\n return;\n }\n\n const candidates = Array.from(\n document.querySelectorAll<HTMLElement>(MENU_FOCUSABLE_SELECTOR)\n ).filter(\n element =>\n !element.closest('.menu-popup') &&\n !element.closest('[inert]') &&\n element.getClientRects().length > 0\n );\n const index = candidates.indexOf(anchor);\n (candidates[index + 1] ?? anchor).focus();\n }\n\n private compositeTabLeavesPopup(event: KeyboardEvent): boolean {\n const popup = this.el.querySelector<HTMLElement>('.menu-popup');\n if (!popup) return true;\n const focusables = Array.from(\n popup.querySelectorAll<HTMLElement>(MENU_FOCUSABLE_SELECTOR)\n ).filter(element => element.getClientRects().length > 0);\n const currentIndex = focusables.indexOf(event.target as HTMLElement);\n if (currentIndex < 0) return true;\n return event.shiftKey ? currentIndex === 0 : currentIndex === focusables.length - 1;\n }\n\n private get activeSections(): MenuSection[] {\n if (this.sections.length > 0) return this.sections;\n if (this.items.length > 0) return [{ items: this.items }];\n return [];\n }\n\n private get flatItems(): MenuItemData[] {\n return this.activeSections.flatMap(section =>\n isMenuPickerSection(section) ? [] : section.items\n );\n }\n\n /** Rich preference content is a non-modal dialog, not an ARIA action menu. */\n private get hasCompositeSections(): boolean {\n return this.activeSections.some(isMenuPickerSection);\n }\n\n private cancelPositionRetry() {\n this.position.cancel();\n }\n\n private cancelLivePositionUpdate() {\n this.position.cancel();\n }\n\n /** Reposition after the current scroll/layout frame without hiding the open popup. */\n private scheduleLivePositionUpdate() {\n this.position.scheduleLiveUpdate();\n }\n\n /** Retry until anchor + popup exist — do not reveal at 0,0 on a failed first pass. */\n private schedulePositionUpdate(onReady?: () => void) {\n if (!this.open) return;\n this.positionReady = false;\n // Opening often sets `open` and `anchorId` together. Each Watch reschedules\n // placement; keep the open-path ready callback so initial focus is not dropped.\n if (onReady) this.positionReadyCallback = onReady;\n const callback = this.positionReadyCallback;\n this.position.schedule(() => {\n if (this.positionReadyCallback === callback) {\n this.positionReadyCallback = undefined;\n }\n callback?.();\n });\n }\n\n /** @returns `true` when anchor and popup were found and `pos` was updated. */\n private calculatePosition(): boolean {\n return this.position.update();\n }\n\n /** Focus the selected item when present, otherwise the first enabled item. */\n private focusInitialItem() {\n if (this.hasCompositeSections) {\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>('.menu-popup [tabindex=\"0\"]')?.focus();\n });\n return;\n }\n\n const flat = this.flatItems;\n const selectedIdx = flat.findIndex(it => it.isSelected && !it.isInactive);\n const firstEnabledIdx = flat.findIndex(it => !it.isInactive || !!it.reorderable);\n this.focusedIndex = selectedIdx >= 0 ? selectedIdx : firstEnabledIdx >= 0 ? firstEnabledIdx : 0;\n\n requestAnimationFrame(() => {\n const btns = this.el.querySelectorAll<HTMLElement>('.menu-item');\n btns[this.focusedIndex]?.focus();\n });\n }\n\n private setupListeners() {\n this.clickOutsideHandler = (e: MouseEvent) => {\n const t = e.target as Node;\n const popup = this.el.querySelector('.menu-popup');\n const anchorEl = this.resolvedAnchor;\n if (popup?.contains(t) || anchorEl?.contains(t)) return;\n this.close();\n };\n\n document.addEventListener('mousedown', this.clickOutsideHandler, true);\n this.position.observe();\n }\n\n private teardownListeners() {\n this.position.unobserve();\n if (this.clickOutsideHandler) {\n document.removeEventListener('mousedown', this.clickOutsideHandler, true);\n this.clickOutsideHandler = null;\n }\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private close(restoreFocus = true) {\n this.captureClosingSections();\n if (restoreFocus) this.focusAnchor();\n this.dsClose.emit();\n this.open = false;\n this.onOpenChange(false);\n }\n\n @Listen('keydown')\n handleKeyDown(e: KeyboardEvent) {\n if (!this.shouldRender || this.closing) return;\n\n if (e.key === 'Escape') {\n e.preventDefault();\n this.close();\n return;\n }\n\n if (e.key === 'Tab') {\n if (this.hasCompositeSections && !this.compositeTabLeavesPopup(e)) return;\n e.preventDefault();\n this.close(false);\n this.moveFocusAfterTab(e.shiftKey);\n return;\n }\n\n if (this.hasCompositeSections) return;\n\n if ((e.key === 'ArrowUp' || e.key === 'ArrowDown') && e.altKey && !e.ctrlKey && !e.shiftKey) {\n this.handleReorderKey(e);\n return;\n }\n\n const flat = this.flatItems;\n const enabled = flat\n .map((it, i) => ({ it, i }))\n .filter(({ it }) => !it.isInactive || !!it.reorderable)\n .map(({ i }) => i);\n if (!enabled.length) return;\n\n const cur = enabled.indexOf(this.focusedIndex);\n const safe = cur < 0 ? 0 : cur;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n e.stopPropagation();\n this.focusRingVisible = true;\n this.focusedIndex = enabled[(safe + 1) % enabled.length];\n this.focusItem(this.focusedIndex);\n break;\n case 'ArrowUp':\n e.preventDefault();\n e.stopPropagation();\n this.focusRingVisible = true;\n this.focusedIndex = enabled[(safe - 1 + enabled.length) % enabled.length];\n this.focusItem(this.focusedIndex);\n break;\n case 'Home':\n e.preventDefault();\n e.stopPropagation();\n this.focusRingVisible = true;\n this.focusedIndex = enabled[0];\n this.focusItem(this.focusedIndex);\n break;\n case 'End':\n e.preventDefault();\n e.stopPropagation();\n this.focusRingVisible = true;\n this.focusedIndex = enabled[enabled.length - 1];\n this.focusItem(this.focusedIndex);\n break;\n }\n }\n\n private focusItem(idx: number) {\n const btns = this.el.querySelectorAll<HTMLElement>('.menu-item');\n btns[idx]?.focus();\n }\n\n private handleItemClick(item: MenuItemData) {\n if (this.suppressItemClick) {\n this.suppressItemClick = false;\n return;\n }\n if (item.isInactive) return;\n // Consumers commonly change the item source while handling selection.\n // Capture first so the exit animation never paints the next menu context.\n this.captureClosingSections();\n this.dsSelect.emit(item);\n }\n\n private handleSwatchSelect(value: string) {\n this.dsSwatchSelect.emit(value);\n }\n\n private handleReorderKey(event: KeyboardEvent): void {\n const located = locateMenuItem(this.activeSections, this.focusedIndex);\n if (!located || !located.items[located.itemIndex]?.reorderable) return;\n\n const nextItems = moveReorderableMenuItemBy(\n located.items,\n located.itemIndex,\n event.key === 'ArrowUp' ? -1 : 1\n );\n if (!nextItems) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.emitReorder(located.items, located.itemIndex, nextItems, located.sectionIndex);\n }\n\n private emitReorder(\n items: MenuItemData[],\n fromIndex: number,\n nextItems: MenuItemData[],\n sectionIndex: number\n ): void {\n const detail = createMenuReorderDetail(items, fromIndex, nextItems, sectionIndex);\n if (!detail) return;\n this.focusedIndex = this.flatIndexFor(sectionIndex, detail.toIndex);\n this.announceReorder(detail);\n this.dsReorder.emit(detail);\n }\n\n private flatIndexFor(sectionIndex: number, itemIndex: number): number {\n let flat = 0;\n for (let index = 0; index < this.activeSections.length; index += 1) {\n const section = this.activeSections[index];\n if (isMenuPickerSection(section)) continue;\n if (index === sectionIndex) return flat + itemIndex;\n flat += section.items.length;\n }\n return itemIndex;\n }\n\n private announceReorder(detail: MenuReorderDetail): void {\n const range = menuReorderableRange(detail.items, detail.toIndex);\n const count = range ? range.end - range.start + 1 : detail.items.length;\n const position = range ? detail.toIndex - range.start + 1 : detail.toIndex + 1;\n this.reorderAnnouncement = `${detail.item.label} moved to position ${position} of ${count}`;\n }\n\n private onReorderPointerDown(\n event: PointerEvent,\n sectionIndex: number,\n itemIndex: number,\n flatIndex: number\n ): void {\n if (event.button !== 0) return;\n const section = this.activeSections[sectionIndex];\n if (!section || isMenuPickerSection(section)) return;\n if (!section.items[itemIndex]?.reorderable) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.suppressItemClick = true;\n this.focusRingVisible = false;\n this.focusedIndex = flatIndex;\n this.focusItem(flatIndex);\n this.reorderPointer = {\n pointerId: event.pointerId,\n sectionIndex,\n fromIndex: itemIndex,\n };\n this.reorderFromFlat = flatIndex;\n this.reorderInsertBefore = itemIndex;\n window.addEventListener('pointermove', this.onReorderPointerMove);\n window.addEventListener('pointerup', this.onReorderPointerUp);\n window.addEventListener('pointercancel', this.onReorderPointerCancel);\n }\n\n private onReorderPointerMove = (event: PointerEvent) => {\n const drag = this.reorderPointer;\n if (!drag || event.pointerId !== drag.pointerId) return;\n const section = this.activeSections[drag.sectionIndex];\n if (!section || isMenuPickerSection(section)) return;\n\n const insertBefore = this.resolveReorderInsertBefore(\n event.clientY,\n drag.sectionIndex,\n drag.fromIndex,\n section.items\n );\n if (insertBefore !== this.reorderInsertBefore) this.reorderInsertBefore = insertBefore;\n };\n\n private onReorderPointerUp = (event: PointerEvent) => {\n const drag = this.reorderPointer;\n if (!drag || event.pointerId !== drag.pointerId) return;\n\n const section = this.activeSections[drag.sectionIndex];\n const insertBefore = this.reorderInsertBefore;\n this.clearReorderPointer();\n queueMicrotask(() => {\n this.suppressItemClick = false;\n });\n if (!section || isMenuPickerSection(section) || insertBefore === null) return;\n\n const nextItems = moveReorderableMenuItemBefore(section.items, drag.fromIndex, insertBefore);\n if (!nextItems) return;\n this.emitReorder(section.items, drag.fromIndex, nextItems, drag.sectionIndex);\n };\n\n private onReorderPointerCancel = (event: PointerEvent) => {\n if (!this.reorderPointer || event.pointerId !== this.reorderPointer.pointerId) return;\n this.clearReorderPointer();\n queueMicrotask(() => {\n this.suppressItemClick = false;\n });\n };\n\n private resolveReorderInsertBefore(\n clientY: number,\n sectionIndex: number,\n fromIndex: number,\n items: MenuItemData[]\n ): number {\n const range = menuReorderableRange(items, fromIndex);\n if (!range) return fromIndex;\n\n const buttons = [...this.el.querySelectorAll<HTMLElement>('.menu-item')];\n const sectionStart = this.flatIndexFor(sectionIndex, 0);\n let insertBefore = range.end + 1;\n for (let itemIndex = range.start; itemIndex <= range.end; itemIndex += 1) {\n const row = buttons[sectionStart + itemIndex];\n if (!row) continue;\n const rect = row.getBoundingClientRect();\n if (clientY < rect.top + rect.height / 2) {\n insertBefore = itemIndex;\n break;\n }\n }\n return Math.min(Math.max(insertBefore, range.start), range.end + 1);\n }\n\n private clearReorderPointer(): void {\n if (this.reorderPointer) {\n window.removeEventListener('pointermove', this.onReorderPointerMove);\n window.removeEventListener('pointerup', this.onReorderPointerUp);\n window.removeEventListener('pointercancel', this.onReorderPointerCancel);\n }\n this.reorderPointer = null;\n this.reorderFromFlat = null;\n this.reorderInsertBefore = null;\n }\n\n render() {\n if (!this.shouldRender) return <Host style={{ display: 'contents' }} />;\n\n const sections = this.closing\n ? (this.closingSections ?? this.lastRenderedSections)\n : this.activeSections;\n const hasCompositeSections = sections.some(isMenuPickerSection);\n if (!this.closing) {\n this.lastRenderedSections = snapshotMenuSections(sections);\n this.closingSections = null;\n }\n let flatIdx = 0;\n const dragLocated =\n this.reorderFromFlat === null ? null : locateMenuItem(sections, this.reorderFromFlat);\n const dragRange = dragLocated\n ? menuReorderableRange(dragLocated.items, dragLocated.itemIndex)\n : null;\n\n const popupStyle: Record<string, string> = {\n position: 'fixed',\n left: '0',\n top: '0',\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 if (this.menuWidth) popupStyle['width'] = this.menuWidth;\n if (this.minWidth) popupStyle['min-width'] = this.minWidth;\n\n return (\n <Host style={{ display: 'contents' }}>\n <div\n popover=\"manual\"\n class={{\n 'menu-popup': true,\n 'menu-popup--closing': this.closing,\n 'ds-choice-popup': true,\n 'ds-choice-popup--closing': this.closing,\n }}\n style={popupStyle}\n role={hasCompositeSections ? 'dialog' : 'menu'}\n aria-label={this.menuLabel}\n aria-orientation={hasCompositeSections ? undefined : 'vertical'}\n >\n <div class=\"ds-choice-list\">\n {sections.map((section, si) => (\n <div\n key={si}\n class={{\n 'menu-section': true,\n 'menu-section--divided': si < sections.length - 1,\n 'menu-section--swatch-picker': isMenuPickerSection(section),\n 'ds-choice-section': true,\n 'ds-chrome-column': true,\n 'ds-chrome-space--sm': true,\n 'ds-choice-section--divided': si < sections.length - 1,\n 'ds-choice-section--headed-after-first': si > 0 && Boolean(section.header),\n }}\n role={section.header ? 'group' : undefined}\n aria-label={section.header}\n >\n {section.header && (\n <ds-text\n class={`section-header ds-choice-section__header ds-control-section-heading ds-control--${this.size}`}\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n emphasis\n color=\"primary\"\n aria-hidden=\"true\"\n >\n <span class=\"ds-choice-section__header-label\">{section.header}</span>\n </ds-text>\n )}\n {isMenuSwatchPickerSection(section) ? (\n <ds-swatch-picker\n value={section.value}\n groupLabel={section.groupLabel ?? section.header ?? 'Swatch options'}\n options={section.options ?? []}\n sections={section.sections ?? []}\n onDsChange={(e: CustomEvent<string>) => {\n e.stopPropagation();\n this.handleSwatchSelect(e.detail);\n }}\n />\n ) : (\n section.items.map((item, itemIndex) => {\n const idx = flatIdx++;\n const isFocused = this.focusedIndex === idx;\n const isSingleSelectionItem =\n !hasCompositeSections && this.selectionMode === 'single' && !item.showSwitch;\n const usesLeading = section.items.some(\n candidate => candidate.reorderable || !!candidate.icon\n );\n const locked = !!item.isInactive && !item.reorderable;\n const dragging = this.reorderFromFlat === idx;\n const dropBefore =\n dragLocated?.sectionIndex === si &&\n dragRange !== null &&\n itemIndex <= dragRange.end &&\n this.reorderInsertBefore === itemIndex;\n const dropAfter =\n dragLocated?.sectionIndex === si &&\n dragRange !== null &&\n this.reorderInsertBefore === dragRange.end + 1 &&\n itemIndex === dragRange.end;\n return (\n <button\n key={item.value ?? `${si}-${item.label}`}\n type=\"button\"\n class={{\n 'menu-item': true,\n 'ds-choice-item': true,\n 'ds-control-frame': true,\n [`ds-control--${this.size}`]: true,\n 'ds-focus-ring-inset': true,\n 'ds-focus-ring--visible': isFocused && this.focusRingVisible,\n 'ds-interaction-fill': !locked,\n 'ds-interaction-fill--selected': !!item.isSelected && !locked,\n 'menu-item--selected': !!item.isSelected,\n 'menu-item--switch': !!item.showSwitch,\n 'ds-control-inactive': locked,\n 'menu-item--destructive': !!item.isDestructive,\n 'menu-item--focused': isFocused,\n 'menu-item--dragging': dragging,\n }}\n role={\n hasCompositeSections\n ? undefined\n : item.showSwitch\n ? 'menuitemcheckbox'\n : isSingleSelectionItem\n ? 'menuitemradio'\n : 'menuitem'\n }\n aria-checked={\n !hasCompositeSections && item.showSwitch\n ? String(!!item.switchValue)\n : isSingleSelectionItem\n ? String(!!item.isSelected)\n : undefined\n }\n aria-pressed={\n hasCompositeSections\n ? String(item.showSwitch ? !!item.switchValue : !!item.isSelected)\n : undefined\n }\n aria-current={\n !hasCompositeSections &&\n !item.showSwitch &&\n !isSingleSelectionItem &&\n item.isSelected\n ? 'true'\n : undefined\n }\n aria-description={\n item.reorderable\n ? item.isInactive\n ? 'Visibility cannot be changed. Alt + Arrow Up or Alt + Arrow Down moves this row.'\n : 'Drag to reorder. Alt + Arrow Up or Alt + Arrow Down moves this row.'\n : undefined\n }\n aria-disabled={item.isInactive ? 'true' : undefined}\n disabled={locked}\n tabIndex={hasCompositeSections ? 0 : isFocused ? 0 : -1}\n onMouseDown={() => {\n this.focusRingVisible = false;\n }}\n onClick={() => this.handleItemClick(item)}\n onFocus={() => {\n this.focusedIndex = idx;\n }}\n >\n {(dropBefore || dropAfter) && (\n <span\n class={{\n 'menu-item__drop-rail': true,\n 'menu-item__drop-rail--before': dropBefore,\n 'menu-item__drop-rail--after': dropAfter,\n }}\n data-menu-drop-rail\n aria-hidden=\"true\"\n />\n )}\n {item.reorderable ? (\n <span\n class=\"menu-item__handle ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n data-menu-handle\n aria-hidden=\"true\"\n onPointerDown={event =>\n this.onReorderPointerDown(event, si, itemIndex, idx)\n }\n onClick={event => {\n event.preventDefault();\n event.stopPropagation();\n }}\n >\n <ds-icon name=\"Drag\" size={this.size} color=\"inherit\" />\n </span>\n ) : usesLeading && item.icon ? (\n <span\n class=\"menu-item__icon ds-choice-item__icon ds-control-icon-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-icon name={item.icon} size={this.size} color=\"inherit\" />\n </span>\n ) : usesLeading ? (\n <span\n class=\"menu-item__icon-spacer ds-choice-item__icon ds-control-icon-box\"\n aria-hidden=\"true\"\n />\n ) : null}\n <div class=\"menu-item__content ds-choice-item__content ds-interaction-fill__content\">\n <ds-text\n class=\"menu-item__label ds-choice-item__label ds-control-label-box\"\n as=\"span\"\n variant={CONTROL_TEXT_VARIANT[this.size]}\n color={item.isSelected ? 'primary' : 'secondary'}\n >\n {item.label}\n </ds-text>\n {item.subtext && (\n <ds-text\n class=\"menu-item__subtext ds-choice-item__subtext ds-control-label-box\"\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT[this.size]}\n color=\"secondary\"\n >\n {item.subtext}\n </ds-text>\n )}\n </div>\n {item.tag && (\n <ds-tag\n class=\"ds-choice-item__tag ds-interaction-fill__content\"\n label={item.tag.label}\n size={MENU_ITEM_TAG_SIZE[this.size]}\n intent={item.tag.intent ?? 'neutral'}\n contrast={item.tag.contrast ?? 'faint'}\n rounded={item.tag.rounded ?? false}\n isInset\n />\n )}\n {item.dot && (\n <span\n class=\"menu-item__dot-box ds-interaction-fill__content\"\n aria-hidden=\"true\"\n >\n <ds-badge\n class=\"menu-item__dot\"\n variant=\"dot\"\n hasRing={false}\n label=\"\"\n />\n </span>\n )}\n {item.showSwitch && (\n <ds-switch\n class=\"menu-item__switch ds-interaction-fill__content\"\n size={this.size}\n checked={!!item.switchValue}\n isInactive={!!item.isInactive}\n presentation\n />\n )}\n </button>\n );\n })\n )}\n </div>\n ))}\n </div>\n </div>\n <div class=\"ds-visually-hidden\" role=\"status\" aria-live=\"polite\">\n {this.reorderAnnouncement}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"geAgEM,SAAUA,EACdC,GAEA,MAAO,YAAaA,GAAWA,EAAQC,UAAY,eACrD,CAEM,SAAUC,EACdF,GAEA,OAAOD,EAA0BC,EACnC,CCtEM,SAAUG,EAAqBC,GACnC,OAAOA,EAASC,KAAIL,IAClB,GAAID,EAA0BC,GAAU,CACtC,MAAO,IACFA,KACCA,EAAQM,QACR,CAAEA,QAASN,EAAQM,QAAQD,KAAIE,IAAM,IAAUA,OAC/C,MACAP,EAAQI,SACR,CACEA,SAAUJ,EAAQI,SAASC,KAAIG,IAAa,IACvCA,EACHF,QAASE,EAAcF,QAAQD,KAAIE,IAAM,IAAUA,WAGvD,G,CAGR,MAAO,IAAKP,EAASS,MAAOT,EAAQS,MAAMJ,KAAIK,IAAI,IAAUA,MAAU,GAE1E,CCXM,SAAUC,EACdF,EACAG,GAEA,IAAKH,EAAMG,IAAQC,YAAa,OAAO,KAEvC,IAAIC,EAAQF,EACZ,MAAOE,EAAQ,GAAKL,EAAMK,EAAQ,IAAID,YAAaC,GAAS,EAE5D,IAAIC,EAAMH,EACV,MAAOG,EAAMN,EAAMO,OAAS,GAAKP,EAAMM,EAAM,IAAIF,YAAaE,GAAO,EAErE,MAAO,CAAED,QAAOC,MAClB,C,SAMgBE,EACdR,EACAS,EACAC,GAEA,MAAMC,EAAQT,EAAqBF,EAAOS,GAC1C,IAAKE,EAAO,OAAO,KAEnB,MAAMC,EAAUC,KAAKC,IAAID,KAAKE,IAAIL,EAAcC,EAAMN,OAAQM,EAAML,IAAM,GAC1E,IAAIU,EAAUJ,EACd,GAAIH,EAAYO,EAASA,GAAW,EACpC,GAAIA,IAAYP,GAAaO,EAAUL,EAAMN,OAASW,EAAUL,EAAML,IAAK,OAAO,KAElF,MAAMW,EAAO,IAAIjB,GACjB,MAAOC,GAAQgB,EAAKC,OAAOT,EAAW,GACtCQ,EAAKC,OAAOF,EAAS,EAAGf,GACxB,OAAOgB,CACT,C,SAGgBE,EACdnB,EACAS,EACAW,GAEA,GAAIA,IAAW,EAAG,OAAO,KACzB,OAAOZ,EACLR,EACAS,EACAA,GAAaW,EAAS,EAAIA,EAASA,EAAS,GAEhD,CAEM,SAAUC,EACd1B,EACA2B,GAEA,IAAIC,EAAYD,EAChB,IAAK,IAAIE,EAAe,EAAGA,EAAe7B,EAASY,OAAQiB,GAAgB,EAAG,CAC5E,MAAMjC,EAAUI,EAAS6B,GACzB,GAAI/B,EAAoBF,GAAU,SAClC,GAAIgC,EAAYhC,EAAQS,MAAMO,OAAQ,CACpC,MAAO,CAAEiB,eAAcC,UAAWF,EAAWvB,MAAOT,EAAQS,M,CAE9DuB,GAAahC,EAAQS,MAAMO,M,CAE7B,OAAO,IACT,CAEM,SAAUmB,EACd1B,EACAS,EACAkB,EACAH,GAEA,MAAMvB,EAAOD,EAAMS,GACnB,IAAKR,EAAM,OAAO,KAClB,MAAMe,EAAUW,EAAUC,QAAQ3B,GAClC,GAAIe,EAAU,EAAG,CACf,MAAMa,EAAQ5B,EAAK4B,MACnB,MAAMC,EAAUD,EACZF,EAAUI,WAAUC,GAAaA,EAAUH,QAAUA,KACrD,EACJ,GAAIC,EAAU,EAAG,OAAO,KACxB,MAAO,CAAE7B,OAAMQ,YAAWO,QAASc,EAASN,eAAcxB,MAAO2B,E,CAEnE,MAAO,CAAE1B,OAAMQ,YAAWO,UAASQ,eAAcxB,MAAO2B,EAC1D,CCnGA,MAAMM,EAAU,IAAM,gouBC4CtB,MAAMC,EAA2D,CAC/DC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,MAGN,MAAMC,EAA0B,CAC9B,UACA,yBACA,6CACA,yBACA,2BACA,mCACAC,KAAK,K,MAOMC,EAAIC,EAAA,MAAAD,UAAAE,EALjB,WAAAC,CAAAC,G,+OAQ2BC,KAAAC,KAAgB,MACjCD,KAAA9C,MAAwB,GAExB8C,KAAAE,KAAiB,KAEjBF,KAAAG,cAAmC,OACnCH,KAAAnD,SAA0B,GAE1BmD,KAAAI,KAAiB,SACjBJ,KAAAK,MAAmB,QAEnBL,KAAAM,gBAA8C,cAE9CN,KAAAO,WAA8BC,EAAkBC,SAEhDT,KAAAU,YAA+B,EAQ/BV,KAAAW,oBAA+B,MAE/BX,KAAAY,UAAoB,OAEXZ,KAAAa,aAAwB,MACxBb,KAAAc,QAAmB,MACnBd,KAAAe,IAAgC,CAAEC,EAAG,EAAGC,EAAG,GAC3CjB,KAAAkB,aAAuB,EACvBlB,KAAAmB,cAAyB,MACzBnB,KAAAoB,iBAA4B,MAC5BpB,KAAAqB,gBAAiC,KACjCrB,KAAAsB,oBAAqC,KACrCtB,KAAAuB,oBAAsB,GAW/BvB,KAAAwB,oBAAwD,KACxDxB,KAAAyB,WAAmD,KAEnDzB,KAAA0B,kBAAoB,MACpB1B,KAAA2B,eAIG,KAMM3B,KAAA4B,SAAW,IAAIC,EAA2B,CACzDC,UAAW,IAAM9B,KAAK+B,gBAAkB,KACxCC,SAAU,IAAMhC,KAAKiC,GAAGC,cAA2B,eACnDC,QAAS,CAACC,EAAUC,KAClB,IAAKrC,KAAKC,KAAM,OAAO,KAEvB,MAAMqC,EAAaF,EAASG,wBAC5B,MAAMC,EAAiBxC,KAAKyC,cAC5B,IAAKzC,KAAK0C,SAAU,CAClB,GACE1C,KAAKM,kBAAoB,gBACxBN,KAAKI,OAAS,OAASJ,KAAKI,OAAS,UACtC,CACAiC,EAAMM,MAAMD,SAAW,uCAAuCE,EAC5DN,EAAWO,MACXL,O,KAEG,CACLH,EAAMM,MAAMG,eAAe,Y,EAI/B,MAAO,CACLR,aACAS,WAAYV,EAAMW,aAAehD,KAAKiD,qBACtCC,YAAab,EAAMc,cAAgBnD,KAAKoD,sBACxChD,KAAMJ,KAAKI,KACXC,MAAOL,KAAKK,MACZgD,aAAcrD,KAAKqD,aACnBC,cAAeC,EAA8B,CAC3ClD,MAAOL,KAAKK,MACZiD,cAAetD,KAAKsD,cACpBd,iBACAlC,gBAAiBN,KAAKM,kBAExBmC,cAAezC,KAAKyC,cACpBe,cAAeC,OAAOC,WACtBC,eAAgBF,OAAOG,YACxB,EAEHC,MAAO,EAAG7C,IAAGC,QACXjB,KAAKe,IAAM,CAAEC,IAAGC,IAAG,EAErB6C,QAAS,KACP9D,KAAKmB,cAAgB,IAAI,EAE3B4C,WAAY,eACZC,SAAU,OAGJhE,KAAAiE,qBAAsC,GACtCjE,KAAAkE,gBAAwC,KAyaxClE,KAAAmE,qBAAwBC,IAC9B,MAAMC,EAAOrE,KAAK2B,eAClB,IAAK0C,GAAQD,EAAME,YAAcD,EAAKC,UAAW,OACjD,MAAM7H,EAAUuD,KAAKuE,eAAeF,EAAK3F,cACzC,IAAKjC,GAAWE,EAAoBF,GAAU,OAE9C,MAAMmB,EAAeoC,KAAKwE,2BACxBJ,EAAMK,QACNJ,EAAK3F,aACL2F,EAAK1G,UACLlB,EAAQS,OAEV,GAAIU,IAAiBoC,KAAKsB,oBAAqBtB,KAAKsB,oBAAsB1D,CAAY,EAGhFoC,KAAA0E,mBAAsBN,IAC5B,MAAMC,EAAOrE,KAAK2B,eAClB,IAAK0C,GAAQD,EAAME,YAAcD,EAAKC,UAAW,OAEjD,MAAM7H,EAAUuD,KAAKuE,eAAeF,EAAK3F,cACzC,MAAMd,EAAeoC,KAAKsB,oBAC1BtB,KAAK2E,sBACLC,gBAAe,KACb5E,KAAK0B,kBAAoB,KAAK,IAEhC,IAAKjF,GAAWE,EAAoBF,IAAYmB,IAAiB,KAAM,OAEvE,MAAMiB,EAAYnB,EAA8BjB,EAAQS,MAAOmH,EAAK1G,UAAWC,GAC/E,IAAKiB,EAAW,OAChBmB,KAAK6E,YAAYpI,EAAQS,MAAOmH,EAAK1G,UAAWkB,EAAWwF,EAAK3F,aAAa,EAGvEsB,KAAA8E,uBAA0BV,IAChC,IAAKpE,KAAK2B,gBAAkByC,EAAME,YAActE,KAAK2B,eAAe2C,UAAW,OAC/EtE,KAAK2E,sBACLC,gBAAe,KACb5E,KAAK0B,kBAAoB,KAAK,GAC9B,CA6TL,CAzwBC,gBAAAqD,GACE,GAAI/E,KAAKC,KAAMD,KAAKgF,aAAa,K,CAGnC,oBAAAC,GACEjF,KAAKkF,sBACLlF,KAAKmF,2BACLnF,KAAK2E,sBACL3E,KAAKoF,mB,CAIP,YAAAJ,CAAaK,GACX,GAAIA,EAAQ,CACVrF,KAAKoF,oBACLpF,KAAKkE,gBAAkB,KACvBlE,KAAKa,aAAe,KACpBb,KAAKc,QAAU,MACfd,KAAKmB,cAAgB,MACrBnB,KAAKoB,iBAAmBpB,KAAKW,oBAC7BX,KAAKsF,iBACLtF,KAAKuF,wBAAuB,KAC1BvF,KAAKwF,kBAAkB,G,MAEpB,GAAIxF,KAAKa,aAAc,CAC5Bb,KAAKyF,sBAAwBC,UAC7B1F,KAAKkF,sBACLlF,KAAK2F,yBACL3F,KAAKc,QAAU,KACfd,KAAKoF,oBACL,MAAMQ,EAAmB5F,KAAK4F,iBAC9B,GAAIA,GAAoB,EAAG,CACzB5F,KAAK6F,cACL,M,CAEF7F,KAAKyB,WAAaqE,YAAW,KAC3B9F,KAAKyB,WAAa,KAClBzB,KAAK6F,aAAa,GACjBD,E,EAMP,cAAAG,GACE,GAAI/F,KAAKC,KAAMD,KAAKuF,wB,CAQtB,qBAAAS,GACE,GAAIhG,KAAKC,KAAMD,KAAKuF,wB,CAGtB,iBAAY9C,GACV,OAAOwD,EAAmBC,EAAezF,SAAUyF,EAAezF,S,CAGpE,gBAAY4C,GACV,OAAO4C,EAAmBjG,KAAKO,WAAY2F,EAAezF,S,CAG5D,iBAAY6C,GACV,OAAO2C,EAAmBjG,KAAKU,YAAa,E,CAG9C,wBAAYuC,GACV,OAAOgD,EAAmBC,EAAeC,YAAaD,EAAeC,Y,CAGvE,yBAAY/C,GACV,OAAO6C,EAAmBC,EAAeE,mBAAoBF,EAAeE,mB,CAG9E,oBAAYR,GACV,OAAOS,EAAoBH,EAAeI,aAAcJ,EAAeK,wB,CAGjE,WAAAV,GACN,MAAMxD,EAAQrC,KAAKiC,GAAGC,cAA2B,eACjD,GAAIG,GAAOmE,QAAQ,iBAAkBnE,EAAMoE,cAC3CzG,KAAKa,aAAe,MACpBb,KAAKc,QAAU,MACfd,KAAKiE,qBAAuB,GAC5BjE,KAAKkE,gBAAkB,KACvBlE,KAAK2E,sBACL3E,KAAKuB,oBAAsB,GAC3BvB,KAAK0G,aAAaC,M,CAGZ,sBAAAhB,GACN,GAAI3F,KAAKkE,gBAAiB,OAC1B,MAAM0C,EAAkB5G,KAAKiE,qBAAqBxG,OAC9CuC,KAAKiE,qBACLjE,KAAKuE,eACTvE,KAAKkE,gBAAkBtH,EAAqBgK,E,CAG9C,kBAAY7E,GACV,GAAI/B,KAAK6G,OAAQ,OAAO7G,KAAK6G,OAC7B,GAAI7G,KAAK8G,SAAU,OAAOC,SAASC,eAAehH,KAAK8G,UACvD,OAAO,I,CAGT,qBAAYG,GACV,MAAMJ,EAAS7G,KAAK+B,eACpB,IAAK8E,EAAQ,OAAO,KACpB,GAAIA,EAAOL,QAAQ/G,GAA0B,OAAOoH,EACpD,OAAOA,EAAO3E,cAA2BzC,IAA4BoH,C,CAG/D,WAAAK,GACN,MAAML,EAAS7G,KAAK+B,eAEpB,GAAI8E,GAAQM,SAAU,CACpBN,EAAOM,WACP,M,CAEFnH,KAAKiH,mBAAmBG,O,CAGlB,iBAAAC,CAAkBC,GACxB,MAAMT,EAAS7G,KAAKiH,kBACpB,IAAKJ,EAAQ,OACb,GAAIS,EAAW,CACbT,EAAOO,QACP,M,CAGF,MAAMG,EAAaC,MAAMC,KACvBV,SAASW,iBAA8BjI,IACvCkI,QACAC,IACGA,EAAQC,QAAQ,iBAChBD,EAAQC,QAAQ,YACjBD,EAAQE,iBAAiBrK,OAAS,IAEtC,MAAMJ,EAAQkK,EAAWzI,QAAQ+H,IAChCU,EAAWlK,EAAQ,IAAMwJ,GAAQO,O,CAG5B,uBAAAW,CAAwB3D,GAC9B,MAAM/B,EAAQrC,KAAKiC,GAAGC,cAA2B,eACjD,IAAKG,EAAO,OAAO,KACnB,MAAM2F,EAAaR,MAAMC,KACvBpF,EAAMqF,iBAA8BjI,IACpCkI,QAAOC,GAAWA,EAAQE,iBAAiBrK,OAAS,IACtD,MAAMwK,EAAeD,EAAWlJ,QAAQsF,EAAM8D,QAC9C,GAAID,EAAe,EAAG,OAAO,KAC7B,OAAO7D,EAAM+D,SAAWF,IAAiB,EAAIA,IAAiBD,EAAWvK,OAAS,C,CAGpF,kBAAY8G,GACV,GAAIvE,KAAKnD,SAASY,OAAS,EAAG,OAAOuC,KAAKnD,SAC1C,GAAImD,KAAK9C,MAAMO,OAAS,EAAG,MAAO,CAAC,CAAEP,MAAO8C,KAAK9C,QACjD,MAAO,E,CAGT,aAAYkL,GACV,OAAOpI,KAAKuE,eAAe8D,SAAQ5L,GACjCE,EAAoBF,GAAW,GAAKA,EAAQS,O,CAKhD,wBAAYoL,GACV,OAAOtI,KAAKuE,eAAegE,KAAK5L,E,CAG1B,mBAAAuI,GACNlF,KAAK4B,SAAS4G,Q,CAGR,wBAAArD,GACNnF,KAAK4B,SAAS4G,Q,CAIR,0BAAAC,GACNzI,KAAK4B,SAAS8G,oB,CAIR,sBAAAnD,CAAuBzB,GAC7B,IAAK9D,KAAKC,KAAM,OAChBD,KAAKmB,cAAgB,MAGrB,GAAI2C,EAAS9D,KAAKyF,sBAAwB3B,EAC1C,MAAM6E,EAAW3I,KAAKyF,sBACtBzF,KAAK4B,SAASgH,UAAS,KACrB,GAAI5I,KAAKyF,wBAA0BkD,EAAU,CAC3C3I,KAAKyF,sBAAwBC,S,CAE/BiD,KAAY,G,CAKR,iBAAAE,GACN,OAAO7I,KAAK4B,SAASkH,Q,CAIf,gBAAAtD,GACN,GAAIxF,KAAKsI,qBAAsB,CAC7BS,uBAAsB,KACpB/I,KAAKiC,GAAGC,cAA2B,+BAA+BkF,OAAO,IAE3E,M,CAGF,MAAM4B,EAAOhJ,KAAKoI,UAClB,MAAMa,EAAcD,EAAK/J,WAAUiK,GAAMA,EAAGC,aAAeD,EAAGE,aAC9D,MAAMC,EAAkBL,EAAK/J,WAAUiK,IAAOA,EAAGE,cAAgBF,EAAG5L,cACpE0C,KAAKkB,aAAe+H,GAAe,EAAIA,EAAcI,GAAmB,EAAIA,EAAkB,EAE9FN,uBAAsB,KACpB,MAAMO,EAAOtJ,KAAKiC,GAAGyF,iBAA8B,cACnD4B,EAAKtJ,KAAKkB,eAAekG,OAAO,G,CAI5B,cAAA9B,GACNtF,KAAKwB,oBAAuB+H,IAC1B,MAAMC,EAAID,EAAErB,OACZ,MAAM7F,EAAQrC,KAAKiC,GAAGC,cAAc,eACpC,MAAME,EAAWpC,KAAK+B,eACtB,GAAIM,GAAOoH,SAASD,IAAMpH,GAAUqH,SAASD,GAAI,OACjDxJ,KAAK0J,OAAO,EAGd3C,SAAS4C,iBAAiB,YAAa3J,KAAKwB,oBAAqB,MACjExB,KAAK4B,SAASgI,S,CAGR,iBAAAxE,GACNpF,KAAK4B,SAASiI,YACd,GAAI7J,KAAKwB,oBAAqB,CAC5BuF,SAAS+C,oBAAoB,YAAa9J,KAAKwB,oBAAqB,MACpExB,KAAKwB,oBAAsB,I,CAE7B,GAAIxB,KAAKyB,WAAY,CACnBsI,aAAa/J,KAAKyB,YAClBzB,KAAKyB,WAAa,I,EAId,KAAAiI,CAAMM,EAAe,MAC3BhK,KAAK2F,yBACL,GAAIqE,EAAchK,KAAKkH,cACvBlH,KAAKiK,QAAQtD,OACb3G,KAAKC,KAAO,MACZD,KAAKgF,aAAa,M,CAIpB,aAAAkF,CAAcX,GACZ,IAAKvJ,KAAKa,cAAgBb,KAAKc,QAAS,OAExC,GAAIyI,EAAEY,MAAQ,SAAU,CACtBZ,EAAEa,iBACFpK,KAAK0J,QACL,M,CAGF,GAAIH,EAAEY,MAAQ,MAAO,CACnB,GAAInK,KAAKsI,uBAAyBtI,KAAK+H,wBAAwBwB,GAAI,OACnEA,EAAEa,iBACFpK,KAAK0J,MAAM,OACX1J,KAAKqH,kBAAkBkC,EAAEpB,UACzB,M,CAGF,GAAInI,KAAKsI,qBAAsB,OAE/B,IAAKiB,EAAEY,MAAQ,WAAaZ,EAAEY,MAAQ,cAAgBZ,EAAEc,SAAWd,EAAEe,UAAYf,EAAEpB,SAAU,CAC3FnI,KAAKuK,iBAAiBhB,GACtB,M,CAGF,MAAMP,EAAOhJ,KAAKoI,UAClB,MAAMoC,EAAUxB,EACblM,KAAI,CAACoM,EAAIuB,KAAC,CAAQvB,KAAIuB,MACtB9C,QAAO,EAAGuB,SAAUA,EAAGE,cAAgBF,EAAG5L,cAC1CR,KAAI,EAAG2N,OAAQA,IAClB,IAAKD,EAAQ/M,OAAQ,OAErB,MAAMiN,EAAMF,EAAQ1L,QAAQkB,KAAKkB,cACjC,MAAMyJ,EAAOD,EAAM,EAAI,EAAIA,EAE3B,OAAQnB,EAAEY,KACR,IAAK,YACHZ,EAAEa,iBACFb,EAAEqB,kBACF5K,KAAKoB,iBAAmB,KACxBpB,KAAKkB,aAAesJ,GAASG,EAAO,GAAKH,EAAQ/M,QACjDuC,KAAK6K,UAAU7K,KAAKkB,cACpB,MACF,IAAK,UACHqI,EAAEa,iBACFb,EAAEqB,kBACF5K,KAAKoB,iBAAmB,KACxBpB,KAAKkB,aAAesJ,GAASG,EAAO,EAAIH,EAAQ/M,QAAU+M,EAAQ/M,QAClEuC,KAAK6K,UAAU7K,KAAKkB,cACpB,MACF,IAAK,OACHqI,EAAEa,iBACFb,EAAEqB,kBACF5K,KAAKoB,iBAAmB,KACxBpB,KAAKkB,aAAesJ,EAAQ,GAC5BxK,KAAK6K,UAAU7K,KAAKkB,cACpB,MACF,IAAK,MACHqI,EAAEa,iBACFb,EAAEqB,kBACF5K,KAAKoB,iBAAmB,KACxBpB,KAAKkB,aAAesJ,EAAQA,EAAQ/M,OAAS,GAC7CuC,KAAK6K,UAAU7K,KAAKkB,cACpB,M,CAIE,SAAA2J,CAAUC,GAChB,MAAMxB,EAAOtJ,KAAKiC,GAAGyF,iBAA8B,cACnD4B,EAAKwB,IAAM1D,O,CAGL,eAAA2D,CAAgB5N,GACtB,GAAI6C,KAAK0B,kBAAmB,CAC1B1B,KAAK0B,kBAAoB,MACzB,M,CAEF,GAAIvE,EAAKiM,WAAY,OAGrBpJ,KAAK2F,yBACL3F,KAAKgL,SAASrE,KAAKxJ,E,CAGb,kBAAA8N,CAAmBlM,GACzBiB,KAAKkL,eAAevE,KAAK5H,E,CAGnB,gBAAAwL,CAAiBnG,GACvB,MAAM+G,EAAU5M,EAAeyB,KAAKuE,eAAgBvE,KAAKkB,cACzD,IAAKiK,IAAYA,EAAQjO,MAAMiO,EAAQxM,YAAYrB,YAAa,OAEhE,MAAMuB,EAAYR,EAChB8M,EAAQjO,MACRiO,EAAQxM,UACRyF,EAAM+F,MAAQ,WAAY,EAAK,GAEjC,IAAKtL,EAAW,OAEhBuF,EAAMgG,iBACNhG,EAAMwG,kBACN5K,KAAK6E,YAAYsG,EAAQjO,MAAOiO,EAAQxM,UAAWE,EAAWsM,EAAQzM,a,CAGhE,WAAAmG,CACN3H,EACAS,EACAkB,EACAH,GAEA,MAAM0M,EAASxM,EAAwB1B,EAAOS,EAAWkB,EAAWH,GACpE,IAAK0M,EAAQ,OACbpL,KAAKkB,aAAelB,KAAKqL,aAAa3M,EAAc0M,EAAOlN,SAC3D8B,KAAKsL,gBAAgBF,GACrBpL,KAAKuL,UAAU5E,KAAKyE,E,CAGd,YAAAC,CAAa3M,EAAsBC,GACzC,IAAIqK,EAAO,EACX,IAAK,IAAI3L,EAAQ,EAAGA,EAAQ2C,KAAKuE,eAAe9G,OAAQJ,GAAS,EAAG,CAClE,MAAMZ,EAAUuD,KAAKuE,eAAelH,GACpC,GAAIV,EAAoBF,GAAU,SAClC,GAAIY,IAAUqB,EAAc,OAAOsK,EAAOrK,EAC1CqK,GAAQvM,EAAQS,MAAMO,M,CAExB,OAAOkB,C,CAGD,eAAA2M,CAAgBF,GACtB,MAAMvN,EAAQT,EAAqBgO,EAAOlO,MAAOkO,EAAOlN,SACxD,MAAMsN,EAAQ3N,EAAQA,EAAML,IAAMK,EAAMN,MAAQ,EAAI6N,EAAOlO,MAAMO,OACjE,MAAMmE,EAAW/D,EAAQuN,EAAOlN,QAAUL,EAAMN,MAAQ,EAAI6N,EAAOlN,QAAU,EAC7E8B,KAAKuB,oBAAsB,GAAG6J,EAAOjO,KAAKsO,2BAA2B7J,QAAe4J,G,CAG9E,oBAAAE,CACNtH,EACA1F,EACAC,EACAH,GAEA,GAAI4F,EAAMuH,SAAW,EAAG,OACxB,MAAMlP,EAAUuD,KAAKuE,eAAe7F,GACpC,IAAKjC,GAAWE,EAAoBF,GAAU,OAC9C,IAAKA,EAAQS,MAAMyB,IAAYrB,YAAa,OAE5C8G,EAAMgG,iBACNhG,EAAMwG,kBACN5K,KAAK0B,kBAAoB,KACzB1B,KAAKoB,iBAAmB,MACxBpB,KAAKkB,aAAe1C,EACpBwB,KAAK6K,UAAUrM,GACfwB,KAAK2B,eAAiB,CACpB2C,UAAWF,EAAME,UACjB5F,eACAf,UAAWgB,GAEbqB,KAAKqB,gBAAkB7C,EACvBwB,KAAKsB,oBAAsB3C,EAC3B8E,OAAOkG,iBAAiB,cAAe3J,KAAKmE,sBAC5CV,OAAOkG,iBAAiB,YAAa3J,KAAK0E,oBAC1CjB,OAAOkG,iBAAiB,gBAAiB3J,KAAK8E,uB,CA2CxC,0BAAAN,CACNC,EACA/F,EACAf,EACAT,GAEA,MAAMW,EAAQT,EAAqBF,EAAOS,GAC1C,IAAKE,EAAO,OAAOF,EAEnB,MAAMiO,EAAU,IAAI5L,KAAKiC,GAAGyF,iBAA8B,eAC1D,MAAMmE,EAAe7L,KAAKqL,aAAa3M,EAAc,GACrD,IAAId,EAAeC,EAAML,IAAM,EAC/B,IAAK,IAAImB,EAAYd,EAAMN,MAAOoB,GAAad,EAAML,IAAKmB,GAAa,EAAG,CACxE,MAAMmN,EAAMF,EAAQC,EAAelN,GACnC,IAAKmN,EAAK,SACV,MAAMC,EAAOD,EAAIvJ,wBACjB,GAAIkC,EAAUsH,EAAKC,IAAMD,EAAKE,OAAS,EAAG,CACxCrO,EAAee,EACf,K,EAGJ,OAAOZ,KAAKC,IAAID,KAAKE,IAAIL,EAAcC,EAAMN,OAAQM,EAAML,IAAM,E,CAG3D,mBAAAmH,GACN,GAAI3E,KAAK2B,eAAgB,CACvB8B,OAAOqG,oBAAoB,cAAe9J,KAAKmE,sBAC/CV,OAAOqG,oBAAoB,YAAa9J,KAAK0E,oBAC7CjB,OAAOqG,oBAAoB,gBAAiB9J,KAAK8E,uB,CAEnD9E,KAAK2B,eAAiB,KACtB3B,KAAKqB,gBAAkB,KACvBrB,KAAKsB,oBAAsB,I,CAG7B,MAAA4K,GACE,IAAKlM,KAAKa,aAAc,OAAOsL,EAACC,EAAI,CAACzJ,MAAO,CAAE0J,QAAS,cAEvD,MAAMxP,EAAWmD,KAAKc,QACjBd,KAAKkE,iBAAmBlE,KAAKiE,qBAC9BjE,KAAKuE,eACT,MAAM+D,EAAuBzL,EAAS0L,KAAK5L,GAC3C,IAAKqD,KAAKc,QAAS,CACjBd,KAAKiE,qBAAuBrH,EAAqBC,GACjDmD,KAAKkE,gBAAkB,I,CAEzB,IAAIoI,EAAU,EACd,MAAMC,EACJvM,KAAKqB,kBAAoB,KAAO,KAAO9C,EAAe1B,EAAUmD,KAAKqB,iBACvE,MAAMmL,EAAYD,EACdnP,EAAqBmP,EAAYrP,MAAOqP,EAAY5N,WACpD,KAEJ,MAAM8N,EAAqC,CACzC7K,SAAU,QACV8K,KAAM,IACNV,IAAK,IACLW,UAAW,aAAa5O,KAAK6O,MAAM5M,KAAKe,IAAIC,SAASjD,KAAK6O,MAAM5M,KAAKe,IAAIE,QACzE4L,OAAQ,OACRC,WAAY9M,KAAKmB,cAAgB,UAAY,UAG/C,GAAInB,KAAK+M,UAAWN,EAAW,SAAWzM,KAAK+M,UAC/C,GAAI/M,KAAK0C,SAAU+J,EAAW,aAAezM,KAAK0C,SAElD,OACEyJ,EAACC,EAAI,CAACzJ,MAAO,CAAE0J,QAAS,aACtBF,EAAA,OACEa,QAAQ,SACRC,MAAO,CACL,aAAc,KACd,sBAAuBjN,KAAKc,QAC5B,kBAAmB,KACnB,2BAA4Bd,KAAKc,SAEnC6B,MAAO8J,EACPS,KAAM5E,EAAuB,SAAW,OAAM,aAClCtI,KAAKY,UAAS,mBACR0H,EAAuB5C,UAAY,YAErDyG,EAAA,OAAKc,MAAM,kBACRpQ,EAASC,KAAI,CAACL,EAAS0Q,IACtBhB,EAAA,OACEhC,IAAKgD,EACLF,MAAO,CACL,eAAgB,KAChB,wBAAyBE,EAAKtQ,EAASY,OAAS,EAChD,8BAA+Bd,EAAoBF,GACnD,oBAAqB,KACrB,mBAAoB,KACpB,sBAAuB,KACvB,6BAA8B0Q,EAAKtQ,EAASY,OAAS,EACrD,wCAAyC0P,EAAK,GAAKC,QAAQ3Q,EAAQ4Q,SAErEH,KAAMzQ,EAAQ4Q,OAAS,QAAU3H,UAAS,aAC9BjJ,EAAQ4Q,QAEnB5Q,EAAQ4Q,QACPlB,EAAA,WACEc,MAAO,mFAAmFjN,KAAKE,OAC/FoN,GAAG,OACH5Q,QAAS6Q,EAAgCvN,KAAKE,MAC9CsN,SAAQ,KACRC,MAAM,UAAS,cACH,QAEZtB,EAAA,QAAMc,MAAM,mCAAmCxQ,EAAQ4Q,SAG1D7Q,EAA0BC,GACzB0P,EAAA,oBACEpN,MAAOtC,EAAQsC,MACf2O,WAAYjR,EAAQiR,YAAcjR,EAAQ4Q,QAAU,iBACpDtQ,QAASN,EAAQM,SAAW,GAC5BF,SAAUJ,EAAQI,UAAY,GAC9B8Q,WAAapE,IACXA,EAAEqB,kBACF5K,KAAKiL,mBAAmB1B,EAAE6B,OAAO,IAIrC3O,EAAQS,MAAMJ,KAAI,CAACK,EAAMwB,KACvB,MAAMmM,EAAMwB,IACZ,MAAMsB,EAAY5N,KAAKkB,eAAiB4J,EACxC,MAAM+C,GACHvF,GAAwBtI,KAAKG,gBAAkB,WAAahD,EAAK2Q,WACpE,MAAMC,EAActR,EAAQS,MAAMqL,MAChCrJ,GAAaA,EAAU5B,eAAiB4B,EAAU8O,OAEpD,MAAMC,IAAW9Q,EAAKiM,aAAejM,EAAKG,YAC1C,MAAM4Q,EAAWlO,KAAKqB,kBAAoByJ,EAC1C,MAAMqD,EACJ5B,GAAa7N,eAAiByO,GAC9BX,IAAc,MACd7N,GAAa6N,EAAUhP,KACvBwC,KAAKsB,sBAAwB3C,EAC/B,MAAMyP,EACJ7B,GAAa7N,eAAiByO,GAC9BX,IAAc,MACdxM,KAAKsB,sBAAwBkL,EAAUhP,IAAM,GAC7CmB,IAAc6N,EAAUhP,IAC1B,OACE2O,EAAA,UACEhC,IAAKhN,EAAK4B,OAAS,GAAGoO,KAAMhQ,EAAKsO,QACjC4C,KAAK,SACLpB,MAAO,CACL,YAAa,KACb,iBAAkB,KAClB,mBAAoB,KACpB,CAAC,eAAejN,KAAKE,QAAS,KAC9B,sBAAuB,KACvB,yBAA0B0N,GAAa5N,KAAKoB,iBAC5C,uBAAwB6M,EACxB,kCAAmC9Q,EAAKgM,aAAe8E,EACvD,wBAAyB9Q,EAAKgM,WAC9B,sBAAuBhM,EAAK2Q,WAC5B,sBAAuBG,EACvB,2BAA4B9Q,EAAKmR,cACjC,qBAAsBV,EACtB,sBAAuBM,GAEzBhB,KACE5E,EACI5C,UACAvI,EAAK2Q,WACH,mBACAD,EACE,gBACA,WAAU,gBAGjBvF,GAAwBnL,EAAK2Q,WAC1BS,SAASpR,EAAKqR,aACdX,EACEU,SAASpR,EAAKgM,YACdzD,UAAS,eAGf4C,EACIiG,OAAOpR,EAAK2Q,aAAe3Q,EAAKqR,cAAgBrR,EAAKgM,YACrDzD,UAAS,gBAGZ4C,IACAnL,EAAK2Q,aACLD,GACD1Q,EAAKgM,WACD,OACAzD,UAAS,mBAGbvI,EAAKG,YACDH,EAAKiM,WACH,mFACA,sEACF1D,UAAS,gBAEAvI,EAAKiM,WAAa,OAAS1D,UAC1C+I,SAAUR,EACVS,SAAUpG,EAAuB,EAAIsF,EAAY,GAAI,EACrDe,YAAa,KACX3O,KAAKoB,iBAAmB,KAAK,EAE/BwN,QAAS,IAAM5O,KAAK+K,gBAAgB5N,GACpC0R,QAAS,KACP7O,KAAKkB,aAAe4J,CAAG,IAGvBqD,GAAcC,IACdjC,EAAA,QACEc,MAAO,CACL,uBAAwB,KACxB,+BAAgCkB,EAChC,8BAA+BC,GAChC,yCAEW,SAGfjR,EAAKG,YACJ6O,EAAA,QACEc,MAAM,0FAAyF,sCAEnF,OACZ6B,cAAe1K,GACbpE,KAAK0L,qBAAqBtH,EAAO+I,EAAIxO,EAAWmM,GAElD8D,QAASxK,IACPA,EAAMgG,iBACNhG,EAAMwG,iBAAiB,GAGzBuB,EAAA,WAAS4C,KAAK,OAAO7O,KAAMF,KAAKE,KAAMuN,MAAM,aAE5CM,GAAe5Q,EAAK6Q,KACtB7B,EAAA,QACEc,MAAM,wFAAuF,cACjF,QAEZd,EAAA,WAAS4C,KAAM5R,EAAK6Q,KAAM9N,KAAMF,KAAKE,KAAMuN,MAAM,aAEjDM,EACF5B,EAAA,QACEc,MAAM,kEAAiE,cAC3D,SAEZ,KACJd,EAAA,OAAKc,MAAM,2EACTd,EAAA,WACEc,MAAM,8DACNK,GAAG,OACH5Q,QAASsS,EAAqBhP,KAAKE,MACnCuN,MAAOtQ,EAAKgM,WAAa,UAAY,aAEpChM,EAAKsO,OAEPtO,EAAK8R,SACJ9C,EAAA,WACEc,MAAM,kEACNK,GAAG,OACH5Q,QAAS6Q,EAAgCvN,KAAKE,MAC9CuN,MAAM,aAELtQ,EAAK8R,UAIX9R,EAAK+R,KACJ/C,EAAA,UACEc,MAAM,mDACNxB,MAAOtO,EAAK+R,IAAIzD,MAChBvL,KAAMd,EAAmBY,KAAKE,MAC9BiP,OAAQhS,EAAK+R,IAAIC,QAAU,UAC3BC,SAAUjS,EAAK+R,IAAIE,UAAY,QAC/BC,QAASlS,EAAK+R,IAAIG,SAAW,MAC7BC,QAAO,OAGVnS,EAAKoS,KACJpD,EAAA,QACEc,MAAM,kDAAiD,cAC3C,QAEZd,EAAA,YACEc,MAAM,iBACNvQ,QAAQ,MACR8S,QAAS,MACT/D,MAAM,MAIXtO,EAAK2Q,YACJ3B,EAAA,aACEc,MAAM,iDACN/M,KAAMF,KAAKE,KACXuP,UAAWtS,EAAKqR,YAChBpF,aAAcjM,EAAKiM,WACnBsG,aAAY,OAGT,SAQvBvD,EAAA,OAAKc,MAAM,qBAAqBC,KAAK,SAAQ,YAAW,UACrDlN,KAAKuB,qB","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as o,H as e,c as i,h as c,a as s,t as r}from"./index.js";import{d as n}from"./p-BGXqFq2C.js";import{D as t,s as d}from"./p-DOUk4KoT.js";import{s as a}from"./p-B8q-6a03.js";import{C as l,a as h}from"./p-CuwopElg.js";const b=()=>`@media (forced-colors: active){.sc-ds-checkbox:root,.sc-ds-checkbox-h,.ds-forced-colors-scope.sc-ds-checkbox{--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-checkbox-h,.ds-control-inactive.sc-ds-checkbox{opacity:var(--effect-opacity-medium);pointer-events:none;cursor:not-allowed}@media (forced-colors: active){.ds-control-inactive.sc-ds-checkbox-h,.ds-control-inactive.sc-ds-checkbox{color:var(--ds-forced-color-disabled);opacity:1}}.ds-control--lg.sc-ds-checkbox,.ds-control--lg.sc-ds-checkbox-h,.ds-control--md.sc-ds-checkbox-h,.ds-control--md.sc-ds-checkbox,.ds-control--sm.sc-ds-checkbox-h,.ds-control--sm.sc-ds-checkbox,.ds-control--xs.sc-ds-checkbox-h,.ds-control--xs.sc-ds-checkbox{--ds-control-radius:var(--dimension-radius-025)}.ds-control--lg.sc-ds-checkbox-h,.ds-control--lg.sc-ds-checkbox{--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-checkbox-h,.ds-control--md.sc-ds-checkbox{--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-checkbox-h,.ds-control--sm.sc-ds-checkbox{--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-checkbox-h,.ds-control--xs.sc-ds-checkbox{--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}@media (forced-colors: active){.sc-ds-checkbox:root,.sc-ds-checkbox-h,.ds-forced-colors-scope.sc-ds-checkbox{--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-checkbox-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-checkbox-h,.ds-focus-ring.sc-ds-checkbox,.ds-focus-ring-inset.sc-ds-checkbox-h,.ds-focus-ring-inset.sc-ds-checkbox{outline:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation}.ds-focus-ring.sc-ds-checkbox-h:focus-visible,.ds-focus-ring.sc-ds-checkbox: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-checkbox-h,.ds-focus-ring.ds-focus-ring--visible.sc-ds-checkbox{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-checkbox-h:focus-visible,.ds-focus-ring-inset.sc-ds-checkbox:focus-visible{outline:none}.ds-focus-ring-inset.sc-ds-checkbox-h:focus-visible::after,.ds-focus-ring-inset.sc-ds-checkbox: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-checkbox-h,.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-checkbox{outline:none}.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-checkbox-h::after,.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-checkbox::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-checkbox-h{--ds-focus-ring-color:var(--ds-forced-color-selected)}}@media (forced-colors: active){.sc-ds-checkbox:root,.sc-ds-checkbox-h,.ds-forced-colors-scope.sc-ds-checkbox{--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-checkbox-h,.ds-interaction-fill.sc-ds-checkbox{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-checkbox-h::before,.ds-interaction-fill.sc-ds-checkbox::before,.ds-interaction-fill.sc-ds-checkbox-h::after,.ds-interaction-fill.sc-ds-checkbox::after{content:'';position:absolute;inset:0;border-radius:inherit;background:transparent;pointer-events:none;cursor:inherit;transition:none}.ds-interaction-fill.sc-ds-checkbox-h::before,.ds-interaction-fill.sc-ds-checkbox::before{z-index:1}.ds-interaction-fill.sc-ds-checkbox-h::after,.ds-interaction-fill.sc-ds-checkbox::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-checkbox-h,.ds-interaction-fill--bordered.sc-ds-checkbox{--ds-interaction-border-width:var(--dimension-stroke-width-012);--ds-interaction-border-color:var(--color-border-secondary)}.ds-interaction-fill--selected.sc-ds-checkbox-h::before,.ds-interaction-fill--selected.sc-ds-checkbox::before{background:var(--ds-interaction-active)}.ds-interaction-fill--selected.sc-ds-checkbox-h,.ds-interaction-fill--selected.sc-ds-checkbox{--ds-interaction-dot-ring:var(--ds-interaction-active)}@media (hover: hover) and (pointer: fine){.ds-interaction-fill.sc-ds-checkbox-h:hover:not(:disabled)::after,.ds-interaction-fill.sc-ds-checkbox:hover:not(:disabled)::after{background:var(--ds-interaction-hover)}}.ds-interaction-fill.sc-ds-checkbox-h:active:not(:disabled)::after,.ds-interaction-fill.sc-ds-checkbox:active:not(:disabled)::after{background:var(--ds-interaction-pressed)}.ds-interaction-fill--grouped.sc-ds-checkbox-h::after,.ds-interaction-fill--grouped.sc-ds-checkbox::after,.ds-interaction-fill--grouped.sc-ds-checkbox-h:active:not(:disabled)::after,.ds-interaction-fill--grouped.sc-ds-checkbox:active:not(:disabled)::after{background:var(--ds-interaction-group-fill, transparent)}@media (hover: hover) and (pointer: fine){.ds-interaction-fill--grouped.sc-ds-checkbox-h:hover:not(:disabled)::after,.ds-interaction-fill--grouped.sc-ds-checkbox:hover:not(:disabled)::after{background:var(--ds-interaction-group-fill, transparent)}}.ds-interaction-fill--grouped.sc-ds-checkbox-h,.ds-interaction-fill--grouped.sc-ds-checkbox{--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-checkbox-h>.ds-interaction-fill__content.sc-ds-checkbox,.ds-interaction-fill.sc-ds-checkbox>.ds-interaction-fill__content.sc-ds-checkbox,.ds-interaction-fill__content.sc-ds-checkbox{position:relative;z-index:2;cursor:inherit}.ds-interaction-fill--on-faint.sc-ds-checkbox-h,.ds-interaction-fill--on-faint.sc-ds-checkbox{--ds-interaction-active:var(--color-interaction-active)}.ds-interaction-fill--on-medium.sc-ds-checkbox-h,.ds-interaction-fill--on-medium.sc-ds-checkbox{--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-checkbox-h,.ds-interaction-fill--on-bold.sc-ds-checkbox{--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-checkbox-h,.ds-interaction-fill--on-strong.sc-ds-checkbox{--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-checkbox-h,.ds-interaction-fill--on-translucent.sc-ds-checkbox{--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-checkbox-h,.ds-interaction-fill--on-inverted.sc-ds-checkbox{--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-checkbox-h,.ds-interaction-fill--on-media.sc-ds-checkbox{--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-checkbox-h,.ds-interaction-fill--on-always-dark.sc-ds-checkbox{--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-checkbox-h,.ds-interaction-fill--on-navigation.sc-ds-checkbox{--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-checkbox-h::after,.ds-interaction-fill.sc-ds-checkbox::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-checkbox-h::before,.ds-interaction-fill--selected.sc-ds-checkbox::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-checkbox-h:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(.ds-focus-ring--visible)::after,.ds-interaction-fill.sc-ds-checkbox: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-checkbox:root,.sc-ds-checkbox-h,.ds-forced-colors-scope.sc-ds-checkbox{--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-checkbox-h{display:inline-flex;align-items:center;box-sizing:border-box;gap:var(--ds-control-gap);height:var(--ds-control-height);padding:0 var(--ds-control-padding-inline);border-radius:var(--ds-control-radius);cursor:default;user-select:none}.checkbox--described.sc-ds-checkbox-h{height:auto;min-height:var(--ds-control-height);padding-block:var(--dimension-space-075)}.checkbox--presentation.sc-ds-checkbox-h{width:var(--ds-control-icon);height:var(--ds-control-icon);padding:0;gap:0;pointer-events:none}.checkbox--lg.sc-ds-checkbox-h{--_checkbox-box:var(--dimension-iconography-md);--_checkbox-stroke:var(--dimension-stroke-width-018)}.checkbox--md.sc-ds-checkbox-h{--_checkbox-box:var(--dimension-iconography-sm);--_checkbox-stroke:var(--dimension-stroke-width-015)}.checkbox--sm.sc-ds-checkbox-h{--_checkbox-box:var(--dimension-iconography-xs);--_checkbox-stroke:var(--dimension-stroke-width-012)}.checkbox--xs.sc-ds-checkbox-h{--_checkbox-box:var(--dimension-size-100);--_checkbox-stroke:calc(var(--dimension-stroke-width-base) * 3 / 32)}.checkbox__placement.sc-ds-checkbox{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--ds-control-icon);height:var(--ds-control-icon)}.box.sc-ds-checkbox{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--_checkbox-box);height:var(--_checkbox-box);border:0;border-radius:var(--dimension-radius-025);box-shadow:inset 0 0 0 var(--_checkbox-stroke) var(--color-foreground-tertiary);transition:background-color var(--effect-motion-short-2), box-shadow var(--effect-motion-short-2)}.box--marked.sc-ds-checkbox{color:var(--color-foreground-on-bold-background-primary);background-color:var(--color-background-bold-brand);box-shadow:none}.checkbox__mark.sc-ds-checkbox{width:100%;height:100%;flex-shrink:0;fill:currentColor}.checkbox__copy.sc-ds-checkbox{display:grid;flex:1;gap:var(--dimension-space-025);min-width:0;padding:0 var(--ds-control-label-inset)}@media (forced-colors: active){.box.sc-ds-checkbox{border:var(--_checkbox-stroke) solid var(--ds-forced-color-content);box-shadow:none}.box--marked.sc-ds-checkbox{color:var(--ds-forced-color-on-selected);background-color:var(--ds-forced-color-selected);border-color:var(--ds-forced-color-selected)}}`;let f=0;const v=o(class o extends e{constructor(o){super();if(o!==false){this.__registerHost()}this.dsChange=i(this,"dsChange",7);this.internals=this.attachInternals();this.labelId=`ds-checkbox-label-${++f}`;this.descriptionId=`${this.labelId}-description`;this.checked=false;this.size="md";this.value="on";this.disabled=false;this.required=false;this.requiredMessage=t;this.indeterminate=false;this.isInactive=false;this.presentation=false;this.initialChecked=false;this.initialIndeterminate=false;this.formDisabled=false;this.handleActivate=()=>{if(this.isInactive||this.disabled||this.formDisabled||this.presentation)return;if(this.indeterminate)this.indeterminate=false;this.checked=!this.checked;this.dsChange.emit(this.checked)};this.handleKeyDown=o=>{if(o.key==="Enter"||o.key===" "){o.preventDefault();this.handleActivate()}}}componentWillLoad(){this.initialChecked=this.checked;this.initialIndeterminate=this.indeterminate;this.syncFormValue()}syncFormValue(){const o=this.isInactive||this.disabled||this.formDisabled||this.presentation;a(this.internals,this.checked?this.value:null,{inactive:o});const e=this.required&&!o&&!this.checked;d(this.internals,e,this.requiredMessage)}formDisabledCallback(o){this.formDisabled=o;this.syncFormValue()}formResetCallback(){this.checked=this.initialChecked;this.indeterminate=this.initialIndeterminate}render(){const o=this.isInactive||this.disabled||this.formDisabled;const e=this.checked||this.indeterminate;const i=this.required&&!o&&!this.checked;return c(s,{key:"b9f37dc3bdc006add4b04d04999eb0abad552446",role:this.presentation?undefined:"checkbox","aria-checked":this.presentation?undefined:this.indeterminate?"mixed":String(this.checked),"aria-disabled":!this.presentation&&o?"true":undefined,"aria-required":!this.presentation&&this.required?"true":undefined,"aria-invalid":!this.presentation&&i?"true":undefined,"aria-labelledby":this.presentation?undefined:this.labelId,"aria-describedby":!this.presentation&&this.description?this.descriptionId:undefined,"aria-hidden":this.presentation?"true":undefined,tabIndex:this.presentation||o?-1:0,class:{checkbox:true,"checkbox--presentation":this.presentation,"checkbox--described":Boolean(this.description),[`checkbox--${this.size}`]:true,[`ds-control--${this.size}`]:true,"ds-control-inactive":o&&!this.presentation,"ds-focus-ring-inset":!this.presentation,"ds-interaction-fill":!o&&!this.presentation},onClick:this.presentation?undefined:this.handleActivate,onKeyDown:this.presentation?undefined:this.handleKeyDown},c("span",{key:"4f6c2a7fc21d95eb3d3387be5612111cc1d3800a",class:"checkbox__placement ds-interaction-fill__content","aria-hidden":"true"},c("span",{key:"cd01de3d56dc5370e6f318e36d334476e3b9b64b",class:{box:true,"box--marked":e}},e&&c("svg",{key:"5b9293253852ab532db547aef27521afad8b4e95",class:"checkbox__mark",viewBox:"0 0 16 16",fill:"currentColor",focusable:"false"},c("path",{key:"65f085fb15b82bf794780afb0a9fe1621a15b683",d:this.indeterminate?"M12 7.375V8.625H4V7.375H12Z":"M12.9756 4.65527L7.22559 11.4053C7.11258 11.5379 6.94946 11.6169 6.77539 11.624C6.60111 11.631 6.43095 11.5657 6.30762 11.4424L3.05762 8.19238L3.94238 7.30762L6.71289 10.0781L12.0244 3.84473L12.9756 4.65527Z"})))),!this.presentation&&c("span",{key:"f7d5337d2e0b7200c31097f0a16fafe810c98297",class:"checkbox__copy ds-interaction-fill__content"},c("ds-text",{key:"fb7b8d4d8c19b8f8c4548ece180ab872efc1e547",class:"checkbox__label",as:"span",variant:l[this.size],textId:this.labelId},this.label),this.description?c("ds-text",{as:"span",variant:h[this.size],color:"secondary",textId:this.descriptionId},this.description):null))}static get formAssociated(){return true}static get watchers(){return{checked:[{syncFormValue:0}],value:[{syncFormValue:0}],disabled:[{syncFormValue:0}],isInactive:[{syncFormValue:0}],required:[{syncFormValue:0}],presentation:[{syncFormValue:0}]}}static get style(){return b()}},[66,"ds-checkbox",{label:[1],description:[1],checked:[1028],size:[1],name:[513],value:[1],disabled:[516],required:[516],requiredMessage:[1,"required-message"],indeterminate:[1028],isInactive:[4,"is-inactive"],presentation:[4],formDisabled:[32]},undefined,{checked:[{syncFormValue:0}],value:[{syncFormValue:0}],disabled:[{syncFormValue:0}],isInactive:[{syncFormValue:0}],required:[{syncFormValue:0}],presentation:[{syncFormValue:0}]}]);function u(){if(typeof customElements==="undefined"){return}const o=["ds-checkbox","ds-text"];o.forEach((o=>{switch(o){case"ds-checkbox":if(!customElements.get(r(o))){customElements.define(r(o),v)}break;case"ds-text":if(!customElements.get(r(o))){n()}break}}))}u();export{v as C,u as d};
2
- //# sourceMappingURL=p-B0PEg5RF.js.map
@@ -1,2 +0,0 @@
1
- import{c as t}from"./p-BX0BMhgz.js";const i=8;class s{constructor(t){this.scrollResizeHandler=null;this.resizeObserver=null;this.retryRaf=null;this.liveRaf=null;this.last=null;this.isReady=false;this.options=t}get ready(){return this.isReady}observe(){this.bindListeners()}unobserve(){this.unbindListeners();this.cancel();this.last=null;this.isReady=false}schedule(t){this.cancelRetry();this.isReady=false;let s=this.options.retryBudget??i;const e=()=>{this.retryRaf=null;if(this.update()){this.isReady=true;this.options.onReady?.();t?.();return}if(s>0){s-=1;this.retryRaf=requestAnimationFrame(e)}};this.retryRaf=requestAnimationFrame(e)}update(){const i=this.options.getAnchor();if(!i)return false;const s=this.options.getPopup();if(!s)return false;if(this.options.topLayer&&typeof s.showPopover==="function"&&!s.matches(":popover-open")){try{s.showPopover()}catch{return false}}const e=this.options.measure(i,s);if(!e)return false;const h=t(e);if(!this.last||this.last.x!==h.x||this.last.y!==h.y||this.last.resolvedSide!==h.resolvedSide){this.last=h;this.options.apply(h)}return true}scheduleLiveUpdate(){const t=this.options.liveUpdate??"sync";if(t==="sync"){this.update();return}if(this.liveRaf!==null)return;if(t==="frame"){this.liveRaf=requestAnimationFrame((()=>{this.liveRaf=null;this.update()}));return}this.liveRaf=requestAnimationFrame((()=>{this.update();this.liveRaf=requestAnimationFrame((()=>{this.liveRaf=null;this.update()}))}))}cancel(){this.cancelRetry();if(this.liveRaf!==null){cancelAnimationFrame(this.liveRaf);this.liveRaf=null}}cancelRetry(){if(this.retryRaf===null)return;cancelAnimationFrame(this.retryRaf);this.retryRaf=null}bindListeners(){this.unbindListeners();this.scrollResizeHandler=()=>this.scheduleLiveUpdate();window.addEventListener("scroll",this.scrollResizeHandler,true);window.addEventListener("resize",this.scrollResizeHandler);if(this.options.observeResize&&typeof ResizeObserver!=="undefined"){this.resizeObserver=new ResizeObserver((()=>this.update()));this.observeResizeTargets()}}unbindListeners(){if(this.scrollResizeHandler){window.removeEventListener("scroll",this.scrollResizeHandler,true);window.removeEventListener("resize",this.scrollResizeHandler);this.scrollResizeHandler=null}this.resizeObserver?.disconnect();this.resizeObserver=null}observeResizeTargets(){if(!this.resizeObserver)return;const t=this.options.getPopup();if(t)this.resizeObserver.observe(t);const i=this.options.getAnchor();if(i)this.resizeObserver.observe(i)}}export{s as A};
2
- //# sourceMappingURL=p-BBxcMVqk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["POSITION_RETRY_BUDGET","AnchoredPositionController","constructor","options","this","scrollResizeHandler","resizeObserver","retryRaf","liveRaf","last","isReady","ready","observe","bindListeners","unobserve","unbindListeners","cancel","schedule","onReady","cancelRetry","remaining","retryBudget","attempt","update","requestAnimationFrame","anchor","getAnchor","popup","getPopup","topLayer","showPopover","matches","input","measure","next","computeAnchoredPosition","x","y","resolvedSide","apply","scheduleLiveUpdate","mode","liveUpdate","cancelAnimationFrame","window","addEventListener","observeResize","ResizeObserver","observeResizeTargets","removeEventListener","disconnect"],"sources":["src/wc/utils/anchored-position-controller.ts"],"sourcesContent":["import {\n computeAnchoredPosition,\n type AnchoredPosition,\n type AnchoredPositionInput,\n} from './anchored-position';\n\n/** Frames to wait for an anchor and popup to become measurable before giving up. */\nconst POSITION_RETRY_BUDGET = 8;\n\n/**\n * How the scroll/resize path reschedules. Each consumer family measured\n * differently before consolidation, and the differences are preserved verbatim\n * so placement timing is unchanged.\n *\n * - `sync` — measure inside the listener. Selects.\n * - `frame` — coalesce and measure on the next frame. Tooltips.\n * - `double-frame` — coalesce, measure next frame, then measure once more the\n * frame after. Scroll-driven owners such as ShellPage commit a compact-header\n * render in the frame after the scroll event, so a single frame reads a stale\n * anchor rect. Menus.\n */\nexport type AnchoredLiveUpdateMode = 'sync' | 'frame' | 'double-frame';\n\nexport interface AnchoredPositionControllerOptions {\n /** Resolve the anchor at measure time; positioning retries while this is null. */\n getAnchor: () => HTMLElement | null;\n /** Resolve the popup at measure time; positioning retries while this is null. */\n getPopup: () => HTMLElement | null;\n /**\n * Build the layout input for one measurement pass.\n *\n * The owning component keeps its own anchor semantics here — inner-cell align\n * offsets, minimum widths, and token resolution stay with the component rather\n * than moving into this controller. Return `null` when the component's own\n * guards say the popup is not measurable yet, which schedules a retry.\n */\n measure: (anchor: HTMLElement, popup: HTMLElement) => AnchoredPositionInput | null;\n /** Commit a changed position. Not called when the result is unchanged. */\n apply: (position: AnchoredPosition) => void;\n /**\n * Move a `popover=\"manual\"` popup into the native top layer before measuring.\n *\n * Use this for popups that remain in their owner's DOM tree. The top layer\n * gives `position: fixed` viewport coordinates even when an application\n * ancestor establishes a fixed-position containing block through containment,\n * transforms, or filters.\n */\n topLayer?: boolean;\n /** Fired once per `start()` when the first measurement succeeds. */\n onReady?: () => void;\n /** Scroll/resize behavior. Defaults to `sync`. */\n liveUpdate?: AnchoredLiveUpdateMode;\n /**\n * Re-measure when the popup or anchor resizes. Tooltips need this because the\n * label's `ds-text` upgrade changes the measured width after mount.\n */\n observeResize?: boolean;\n retryBudget?: number;\n}\n\n/**\n * Lifecycle owner for an element-anchored popup: listener binding, measurement\n * retries, frame coalescing, and teardown.\n *\n * Pairs with `computeAnchoredPosition`, which owns the geometry. Split this way\n * because the geometry is pure and exhaustively testable while the lifecycle is\n * timing-dependent; keeping them separate means the risky half lives in exactly\n * one place.\n *\n * Not suitable for overlays that place several popups in one shared pass — Toast\n * positions N anchored records inside a single layout commit and keeps its own\n * scheduler, using only the geometry function.\n */\nexport class AnchoredPositionController {\n private readonly options: AnchoredPositionControllerOptions;\n private scrollResizeHandler: (() => void) | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private retryRaf: number | null = null;\n private liveRaf: number | null = null;\n private last: AnchoredPosition | null = null;\n private isReady = false;\n\n constructor(options: AnchoredPositionControllerOptions) {\n this.options = options;\n }\n\n /** `true` once a measurement has succeeded, for gating popup reveal. */\n get ready(): boolean {\n return this.isReady;\n }\n\n /**\n * Bind scroll/resize tracking for an opening popup.\n *\n * Deliberately does not schedule placement: every consumer binds listeners and\n * then schedules in its own order, and folding both into one call produced two\n * overlapping retry loops. Call `schedule()` or `update()` separately.\n */\n observe(): void {\n this.bindListeners();\n }\n\n /** Unbind tracking, cancel pending frames, and clear the cached position. */\n unobserve(): void {\n this.unbindListeners();\n this.cancel();\n this.last = null;\n this.isReady = false;\n }\n\n /**\n * Retry measurement each frame until it succeeds or the budget runs out, so a\n * popup is never revealed at 0,0 after a failed first pass.\n */\n schedule(onReady?: () => void): void {\n this.cancelRetry();\n this.isReady = false;\n\n let remaining = this.options.retryBudget ?? POSITION_RETRY_BUDGET;\n\n const attempt = () => {\n this.retryRaf = null;\n if (this.update()) {\n this.isReady = true;\n this.options.onReady?.();\n onReady?.();\n return;\n }\n if (remaining > 0) {\n remaining -= 1;\n this.retryRaf = requestAnimationFrame(attempt);\n }\n };\n\n this.retryRaf = requestAnimationFrame(attempt);\n }\n\n /** Measure and commit once. @returns `false` when the popup is not measurable. */\n update(): boolean {\n const anchor = this.options.getAnchor();\n if (!anchor) return false;\n const popup = this.options.getPopup();\n if (!popup) return false;\n\n if (\n this.options.topLayer &&\n typeof popup.showPopover === 'function' &&\n !popup.matches(':popover-open')\n ) {\n try {\n popup.showPopover();\n } catch {\n // The popup may not be connected yet. The scheduled retry will try again\n // on the next frame instead of measuring it in the wrong coordinate space.\n return false;\n }\n }\n\n const input = this.options.measure(anchor, popup);\n if (!input) return false;\n\n const next = computeAnchoredPosition(input);\n if (\n !this.last ||\n this.last.x !== next.x ||\n this.last.y !== next.y ||\n this.last.resolvedSide !== next.resolvedSide\n ) {\n this.last = next;\n this.options.apply(next);\n }\n return true;\n }\n\n /** Reposition an already-open popup without hiding it. */\n scheduleLiveUpdate(): void {\n const mode = this.options.liveUpdate ?? 'sync';\n if (mode === 'sync') {\n this.update();\n return;\n }\n\n if (this.liveRaf !== null) return;\n\n if (mode === 'frame') {\n this.liveRaf = requestAnimationFrame(() => {\n this.liveRaf = null;\n this.update();\n });\n return;\n }\n\n // double-frame stays coalesced until the second frame resolves.\n this.liveRaf = requestAnimationFrame(() => {\n this.update();\n this.liveRaf = requestAnimationFrame(() => {\n this.liveRaf = null;\n this.update();\n });\n });\n }\n\n /** Cancel pending retry and live frames without unbinding listeners. */\n cancel(): void {\n this.cancelRetry();\n if (this.liveRaf !== null) {\n cancelAnimationFrame(this.liveRaf);\n this.liveRaf = null;\n }\n }\n\n private cancelRetry(): void {\n if (this.retryRaf === null) return;\n cancelAnimationFrame(this.retryRaf);\n this.retryRaf = null;\n }\n\n private bindListeners(): void {\n this.unbindListeners();\n this.scrollResizeHandler = () => this.scheduleLiveUpdate();\n // Capture phase so scrolling inside any ancestor repositions the popup.\n window.addEventListener('scroll', this.scrollResizeHandler, true);\n window.addEventListener('resize', this.scrollResizeHandler);\n\n if (this.options.observeResize && typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.update());\n this.observeResizeTargets();\n }\n }\n\n private unbindListeners(): void {\n if (this.scrollResizeHandler) {\n window.removeEventListener('scroll', this.scrollResizeHandler, true);\n window.removeEventListener('resize', this.scrollResizeHandler);\n this.scrollResizeHandler = null;\n }\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n /**\n * Re-attach the resize observer after the popup remounts. Safe to call\n * repeatedly; `ResizeObserver.observe` ignores duplicate targets.\n */\n observeResizeTargets(): void {\n if (!this.resizeObserver) return;\n const popup = this.options.getPopup();\n if (popup) this.resizeObserver.observe(popup);\n const anchor = this.options.getAnchor();\n if (anchor) this.resizeObserver.observe(anchor);\n }\n}\n"],"mappings":"oCAOA,MAAMA,EAAwB,E,MAkEjBC,EASX,WAAAC,CAAYC,GAPJC,KAAAC,oBAA2C,KAC3CD,KAAAE,eAAwC,KACxCF,KAAAG,SAA0B,KAC1BH,KAAAI,QAAyB,KACzBJ,KAAAK,KAAgC,KAChCL,KAAAM,QAAU,MAGhBN,KAAKD,QAAUA,C,CAIjB,SAAIQ,GACF,OAAOP,KAAKM,O,CAUd,OAAAE,GACER,KAAKS,e,CAIP,SAAAC,GACEV,KAAKW,kBACLX,KAAKY,SACLZ,KAAKK,KAAO,KACZL,KAAKM,QAAU,K,CAOjB,QAAAO,CAASC,GACPd,KAAKe,cACLf,KAAKM,QAAU,MAEf,IAAIU,EAAYhB,KAAKD,QAAQkB,aAAerB,EAE5C,MAAMsB,EAAU,KACdlB,KAAKG,SAAW,KAChB,GAAIH,KAAKmB,SAAU,CACjBnB,KAAKM,QAAU,KACfN,KAAKD,QAAQe,YACbA,MACA,M,CAEF,GAAIE,EAAY,EAAG,CACjBA,GAAa,EACbhB,KAAKG,SAAWiB,sBAAsBF,E,GAI1ClB,KAAKG,SAAWiB,sBAAsBF,E,CAIxC,MAAAC,GACE,MAAME,EAASrB,KAAKD,QAAQuB,YAC5B,IAAKD,EAAQ,OAAO,MACpB,MAAME,EAAQvB,KAAKD,QAAQyB,WAC3B,IAAKD,EAAO,OAAO,MAEnB,GACEvB,KAAKD,QAAQ0B,iBACNF,EAAMG,cAAgB,aAC5BH,EAAMI,QAAQ,iBACf,CACA,IACEJ,EAAMG,a,CACN,MAGA,OAAO,K,EAIX,MAAME,EAAQ5B,KAAKD,QAAQ8B,QAAQR,EAAQE,GAC3C,IAAKK,EAAO,OAAO,MAEnB,MAAME,EAAOC,EAAwBH,GACrC,IACG5B,KAAKK,MACNL,KAAKK,KAAK2B,IAAMF,EAAKE,GACrBhC,KAAKK,KAAK4B,IAAMH,EAAKG,GACrBjC,KAAKK,KAAK6B,eAAiBJ,EAAKI,aAChC,CACAlC,KAAKK,KAAOyB,EACZ9B,KAAKD,QAAQoC,MAAML,E,CAErB,OAAO,I,CAIT,kBAAAM,GACE,MAAMC,EAAOrC,KAAKD,QAAQuC,YAAc,OACxC,GAAID,IAAS,OAAQ,CACnBrC,KAAKmB,SACL,M,CAGF,GAAInB,KAAKI,UAAY,KAAM,OAE3B,GAAIiC,IAAS,QAAS,CACpBrC,KAAKI,QAAUgB,uBAAsB,KACnCpB,KAAKI,QAAU,KACfJ,KAAKmB,QAAQ,IAEf,M,CAIFnB,KAAKI,QAAUgB,uBAAsB,KACnCpB,KAAKmB,SACLnB,KAAKI,QAAUgB,uBAAsB,KACnCpB,KAAKI,QAAU,KACfJ,KAAKmB,QAAQ,GACb,G,CAKN,MAAAP,GACEZ,KAAKe,cACL,GAAIf,KAAKI,UAAY,KAAM,CACzBmC,qBAAqBvC,KAAKI,SAC1BJ,KAAKI,QAAU,I,EAIX,WAAAW,GACN,GAAIf,KAAKG,WAAa,KAAM,OAC5BoC,qBAAqBvC,KAAKG,UAC1BH,KAAKG,SAAW,I,CAGV,aAAAM,GACNT,KAAKW,kBACLX,KAAKC,oBAAsB,IAAMD,KAAKoC,qBAEtCI,OAAOC,iBAAiB,SAAUzC,KAAKC,oBAAqB,MAC5DuC,OAAOC,iBAAiB,SAAUzC,KAAKC,qBAEvC,GAAID,KAAKD,QAAQ2C,sBAAwBC,iBAAmB,YAAa,CACvE3C,KAAKE,eAAiB,IAAIyC,gBAAe,IAAM3C,KAAKmB,WACpDnB,KAAK4C,sB,EAID,eAAAjC,GACN,GAAIX,KAAKC,oBAAqB,CAC5BuC,OAAOK,oBAAoB,SAAU7C,KAAKC,oBAAqB,MAC/DuC,OAAOK,oBAAoB,SAAU7C,KAAKC,qBAC1CD,KAAKC,oBAAsB,I,CAE7BD,KAAKE,gBAAgB4C,aACrB9C,KAAKE,eAAiB,I,CAOxB,oBAAA0C,GACE,IAAK5C,KAAKE,eAAgB,OAC1B,MAAMqB,EAAQvB,KAAKD,QAAQyB,WAC3B,GAAID,EAAOvB,KAAKE,eAAeM,QAAQe,GACvC,MAAMF,EAASrB,KAAKD,QAAQuB,YAC5B,GAAID,EAAQrB,KAAKE,eAAeM,QAAQa,E","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- const t=1200;const r=768;const n="activity";function e(n){if(n>=t)return"desktop";if(n>=r)return"tablet";return"mobile"}function s(t){return t==="desktop"?"roomy":"compact"}function i(t,r){if(!r)return"area";if(r==="help")return"help";if(r==="search")return"search";if(r==="messages")return"messages";if(r==="agents")return"agents";return"inbox"}function a(t){return t==="stacks"||t==="activity"}function u(t,r){const e=r.filter(a);if(a(t)&&e.includes(t))return t;if(e.includes(n))return n;return e[0]??""}function c(t,r,n){return n||t!==r}export{t as S,i as a,e as b,s as c,a as i,u as r,c as s};
2
- //# sourceMappingURL=p-BEvBJ65v.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["SHELL_DESKTOP_BREAKPOINT","SHELL_MOBILE_BREAKPOINT","SHELL_DEFAULT_INBOX_TOOL","resolveShellResponsiveMode","width","resolveManagedShellPageCapacity","mode","shellMobileDestinationForTool","open","tool","isShellInboxTool","resolveAvailableInboxTool","preferred","available","inbox","filter","includes","shouldEmitMobileDestinationChange","active","next","navigationOpen"],"sources":["src/wc/shell/shell-responsive.ts"],"sourcesContent":["import type { PanelToolsToolId } from '../components/PanelTools/panel-tools-types';\n\nexport type ShellResponsiveMode = 'desktop' | 'tablet' | 'mobile';\nexport type MobileDestination = 'area' | 'search' | 'inbox' | 'messages' | 'agents' | 'help';\nexport type ShellInboxToolId = PanelToolsToolId;\n\nexport const SHELL_DESKTOP_BREAKPOINT = 1200;\nexport const SHELL_MOBILE_BREAKPOINT = 768;\nexport const SHELL_DEFAULT_INBOX_TOOL: ShellInboxToolId = 'activity';\n\nexport function resolveShellResponsiveMode(width: number): ShellResponsiveMode {\n if (width >= SHELL_DESKTOP_BREAKPOINT) return 'desktop';\n if (width >= SHELL_MOBILE_BREAKPOINT) return 'tablet';\n return 'mobile';\n}\n\nexport function resolveManagedShellPageCapacity(\n mode: ShellResponsiveMode\n): 'roomy' | 'compact' | 'constrained' {\n return mode === 'desktop' ? 'roomy' : 'compact';\n}\n\nexport function shellMobileDestinationForTool(\n open: boolean,\n tool: PanelToolsToolId | ''\n): MobileDestination {\n if (!open || !tool) return 'area';\n if (tool === 'help') return 'help';\n if (tool === 'search') return 'search';\n if (tool === 'messages') return 'messages';\n if (tool === 'agents') return 'agents';\n return 'inbox';\n}\n\nexport function isShellInboxTool(tool: string): tool is ShellInboxToolId {\n return tool === 'stacks' || tool === 'activity';\n}\n\nexport function resolveAvailableInboxTool(\n preferred: string,\n available: readonly PanelToolsToolId[]\n): ShellInboxToolId | '' {\n const inbox = available.filter(isShellInboxTool);\n if (isShellInboxTool(preferred) && inbox.includes(preferred)) return preferred;\n if (inbox.includes(SHELL_DEFAULT_INBOX_TOOL)) return SHELL_DEFAULT_INBOX_TOOL;\n return inbox[0] ?? '';\n}\n\n/** Active-destination reselects are inert unless they also dismiss the Menu pane. */\nexport function shouldEmitMobileDestinationChange(\n active: MobileDestination,\n next: MobileDestination,\n navigationOpen: boolean\n): boolean {\n return navigationOpen || active !== next;\n}\n"],"mappings":"AAMO,MAAMA,EAA2B,KACjC,MAAMC,EAA0B,IAChC,MAAMC,EAA6C,WAEpD,SAAUC,EAA2BC,GACzC,GAAIA,GAASJ,EAA0B,MAAO,UAC9C,GAAII,GAASH,EAAyB,MAAO,SAC7C,MAAO,QACT,CAEM,SAAUI,EACdC,GAEA,OAAOA,IAAS,UAAY,QAAU,SACxC,CAEM,SAAUC,EACdC,EACAC,GAEA,IAAcA,EAAM,MAAO,OAC3B,GAAIA,IAAS,OAAQ,MAAO,OAC5B,GAAIA,IAAS,SAAU,MAAO,SAC9B,GAAIA,IAAS,WAAY,MAAO,WAChC,GAAIA,IAAS,SAAU,MAAO,SAC9B,MAAO,OACT,CAEM,SAAUC,EAAiBD,GAC/B,OAAOA,IAAS,UAAYA,IAAS,UACvC,CAEM,SAAUE,EACdC,EACAC,GAEA,MAAMC,EAAQD,EAAUE,OAAOL,GAC/B,GAAIA,EAAiBE,IAAcE,EAAME,SAASJ,GAAY,OAAOA,EACrE,GAAIE,EAAME,SAASd,GAA2B,OAAOA,EACrD,OAAOY,EAAM,IAAM,EACrB,C,SAGgBG,EACdC,EACAC,EACAC,GAEA,OAAOA,GAAkBF,IAAWC,CACtC,Q","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["mobileBarNavCss","MINIMUM_DIRECT_PRESS_MS","MobileBarNav","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","activeDestination","currentArea","id","icon","label","sheetNavExpanded","menuLabel","searchLabel","inboxLabel","messagesLabel","agentsLabel","helpLabel","searchDot","inboxDot","messagesDot","agentsDot","pressedItemId","activePointerId","pressedAt","pressClearTimer","disconnectedCallback","clearPressedItem","clearPressTimer","clearTimeout","beginDirectPress","itemId","event","isPrimary","pointerType","button","pointerId","performance","now","target","currentTarget","setPointerCapture","finishDirectPress","remaining","Math","max","setTimeout","cancelDirectPress","pressHandlers","onPointerDown","onPointerUp","onPointerCancel","onLostPointerCapture","destinationConfig","dot","selectDestination","destination","shouldEmitMobileDestinationChange","dsDestinationChange","emit","requestAnimationFrame","focusDestination","el","querySelector","focus","preventScroll","renderDestination","item","selected","h","type","class","undefined","onClick","name","size","color","variant","render","tools","Host","key","String","dsSheetNavToggle","map"],"sources":["src/wc/components/MobileBarNav/MobileBarNav.css?tag=ds-mobile-bar-nav&encapsulation=scoped","src/wc/components/MobileBarNav/MobileBarNav.tsx"],"sourcesContent":["@import '../../utils/chrome-layout.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n\n:host {\n display: block;\n min-width: 0;\n background: var(--color-background-primary);\n color: var(--color-foreground-tertiary);\n -webkit-user-select: none;\n user-select: none;\n -webkit-touch-callout: none;\n}\n\n.mobile-bar-nav {\n justify-content: space-between;\n min-width: 0;\n padding-block-end: max(var(--ds-chrome-padding), env(safe-area-inset-bottom));\n border-top: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n background: var(--color-background-primary);\n -webkit-user-select: none;\n user-select: none;\n -webkit-touch-callout: none;\n}\n\n.mobile-bar-nav__group {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n}\n\n.mobile-bar-nav__item {\n appearance: none;\n flex: 0 0 var(--dimension-size-500);\n width: var(--dimension-size-500);\n height: var(--dimension-size-500);\n padding: var(--dimension-space-100);\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: inherit;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: default;\n}\n\n.mobile-bar-nav__item--selected {\n color: var(--color-foreground-primary);\n}\n\n/*\n * Safari can retain its native :active state after a direct touch. On coarse\n * touch-only pointers, the component-owned class provides one deterministic\n * press frame and clears it after release/cancel.\n */\n@media (hover: none) and (pointer: coarse) {\n .mobile-bar-nav__item.ds-interaction-fill:active:not(:disabled)::after {\n background: transparent;\n }\n\n .mobile-bar-nav__item--pressed.ds-interaction-fill::after,\n .mobile-bar-nav__item--pressed.ds-interaction-fill:active:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n }\n}\n\n.mobile-bar-nav__divider {\n flex: 0 0 var(--dimension-stroke-width-012);\n width: var(--dimension-stroke-width-012);\n height: var(--dimension-iconography-lg);\n background: var(--color-border-tertiary);\n pointer-events: none;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.mobile-bar-nav__icon {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--dimension-iconography-lg);\n height: var(--dimension-iconography-lg);\n}\n\n.mobile-bar-nav__dot {\n position: absolute;\n inset-block-start: calc(var(--dimension-space-025) * -1);\n inset-inline-end: calc(var(--dimension-space-025) * -1);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n} from '@stencil/core';\nimport {\n shouldEmitMobileDestinationChange,\n type MobileDestination,\n} from '../../shell/shell-responsive';\nimport type { PanelNavItem } from '../PanelNav/panel-nav-types';\nimport type { MobileBarNavDestinationDetail } from './mobile-bar-nav-types';\n\ninterface DestinationConfig {\n id: MobileDestination;\n icon: string;\n label: string;\n dot: boolean;\n}\n\nconst MINIMUM_DIRECT_PRESS_MS = 120;\n\n@Component({\n tag: 'ds-mobile-bar-nav',\n styleUrl: 'MobileBarNav.css',\n scoped: true,\n})\nexport class MobileBarNav {\n @Element() el!: HTMLElement;\n\n @Prop() activeDestination: MobileDestination = 'area';\n @Prop() currentArea: PanelNavItem = {\n id: 'tracking',\n icon: 'MapPage',\n label: 'Tracking',\n };\n @Prop() sheetNavExpanded: boolean = false;\n @Prop() menuLabel: string = 'Menu';\n @Prop() searchLabel: string = 'Search';\n @Prop() inboxLabel: string = 'Inbox';\n @Prop() messagesLabel: string = 'Messages';\n @Prop() agentsLabel: string = 'Agents';\n @Prop() helpLabel: string = 'Help & Support';\n @Prop() searchDot: boolean = false;\n @Prop() inboxDot: boolean = false;\n @Prop() messagesDot: boolean = false;\n @Prop() agentsDot: boolean = false;\n\n @State() private pressedItemId: string | null = null;\n\n @Event() dsSheetNavToggle!: EventEmitter<boolean>;\n @Event() dsDestinationChange!: EventEmitter<MobileBarNavDestinationDetail>;\n\n private activePointerId: number | null = null;\n private pressedAt = 0;\n private pressClearTimer: ReturnType<typeof setTimeout> | null = null;\n\n disconnectedCallback() {\n this.clearPressedItem();\n }\n\n private clearPressTimer() {\n if (this.pressClearTimer === null) return;\n clearTimeout(this.pressClearTimer);\n this.pressClearTimer = null;\n }\n\n private clearPressedItem() {\n this.clearPressTimer();\n this.activePointerId = null;\n this.pressedItemId = null;\n }\n\n private beginDirectPress(itemId: string, event: PointerEvent) {\n if (!event.isPrimary || event.pointerType === 'mouse' || event.button !== 0) return;\n\n this.clearPressTimer();\n this.activePointerId = event.pointerId;\n this.pressedAt = performance.now();\n this.pressedItemId = itemId;\n\n const target = event.currentTarget as HTMLElement;\n try {\n target.setPointerCapture(event.pointerId);\n } catch {\n // Pointer capture can fail if Safari has already cancelled the stream.\n }\n }\n\n private finishDirectPress(event: PointerEvent) {\n if (event.pointerId !== this.activePointerId) return;\n\n this.activePointerId = null;\n const remaining = Math.max(\n 0,\n MINIMUM_DIRECT_PRESS_MS - (performance.now() - this.pressedAt)\n );\n\n this.clearPressTimer();\n this.pressClearTimer = setTimeout(() => {\n this.pressClearTimer = null;\n this.pressedItemId = null;\n }, remaining);\n }\n\n private cancelDirectPress(event: PointerEvent) {\n if (event.pointerId !== this.activePointerId) return;\n this.clearPressedItem();\n }\n\n private pressHandlers(itemId: string) {\n return {\n onPointerDown: (event: PointerEvent) => this.beginDirectPress(itemId, event),\n onPointerUp: (event: PointerEvent) => this.finishDirectPress(event),\n onPointerCancel: (event: PointerEvent) => this.cancelDirectPress(event),\n onLostPointerCapture: (event: PointerEvent) => this.finishDirectPress(event),\n };\n }\n\n private destinationConfig(): DestinationConfig[] {\n const currentArea =\n this.activeDestination === 'help'\n ? {\n id: 'help' as const,\n icon: 'CircleQuestion',\n label: this.helpLabel,\n dot: false,\n }\n : {\n id: 'area' as const,\n icon: this.currentArea.icon || 'MapPage',\n label: this.currentArea.label || 'Area',\n dot: false,\n };\n\n return [\n currentArea,\n { id: 'search', icon: 'MagnifyingGlass', label: this.searchLabel, dot: this.searchDot },\n { id: 'inbox', icon: 'Inbox', label: this.inboxLabel, dot: this.inboxDot },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: this.messagesLabel,\n dot: this.messagesDot,\n },\n { id: 'agents', icon: 'AI', label: this.agentsLabel, dot: this.agentsDot },\n ];\n }\n\n private selectDestination(destination: MobileDestination) {\n if (\n !shouldEmitMobileDestinationChange(\n this.activeDestination,\n destination,\n this.sheetNavExpanded\n )\n ) {\n return;\n }\n this.dsDestinationChange.emit({ destination });\n // Owners may replace the visible mobile stage (and transiently drop focus\n // in WebKit) while handling the controlled destination change.\n requestAnimationFrame(() => {\n void this.focusDestination(destination);\n });\n }\n\n @Method()\n async focusDestination(destination: MobileDestination | 'sheet-nav') {\n const target = this.el.querySelector<HTMLElement>(\n `#${\n destination === 'sheet-nav'\n ? 'ds-mobile-sheet-nav-trigger'\n : `ds-mobile-bar-${destination}-trigger`\n }`\n );\n target?.focus({ preventScroll: true });\n }\n\n private renderDestination(item: DestinationConfig) {\n const selected = !this.sheetNavExpanded && item.id === this.activeDestination;\n return (\n <button\n id={`ds-mobile-bar-${item.id}-trigger`}\n type=\"button\"\n class={{\n 'mobile-bar-nav__item': true,\n 'mobile-bar-nav__item--selected': selected,\n 'mobile-bar-nav__item--pressed': this.pressedItemId === item.id,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n aria-label={item.label}\n aria-current={selected ? 'page' : undefined}\n onClick={() => this.selectDestination(item.id)}\n {...this.pressHandlers(item.id)}\n >\n <span class=\"mobile-bar-nav__icon ds-interaction-fill__content\">\n <ds-icon name={item.icon} size=\"lg\" color=\"inherit\" />\n {item.dot && (\n <ds-badge class=\"mobile-bar-nav__dot\" variant=\"dot\" label=\"\" aria-hidden=\"true\" />\n )}\n </span>\n </button>\n );\n }\n\n render() {\n const [currentArea, ...tools] = this.destinationConfig();\n\n return (\n <Host>\n <nav class=\"mobile-bar-nav ds-chrome-row ds-chrome-space--md\" aria-label=\"Primary\">\n <div class=\"mobile-bar-nav__group mobile-bar-nav__group--context\">\n <button\n id=\"ds-mobile-sheet-nav-trigger\"\n type=\"button\"\n class={{\n 'mobile-bar-nav__item': true,\n 'mobile-bar-nav__item--selected': this.sheetNavExpanded,\n 'mobile-bar-nav__item--pressed':\n this.pressedItemId === 'sheet-nav',\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n aria-label={this.menuLabel}\n aria-expanded={String(this.sheetNavExpanded)}\n aria-controls=\"ds-mobile-sheet-nav\"\n onClick={() => this.dsSheetNavToggle.emit(!this.sheetNavExpanded)}\n {...this.pressHandlers('sheet-nav')}\n >\n <span class=\"mobile-bar-nav__icon ds-interaction-fill__content\">\n <ds-icon\n name={this.sheetNavExpanded ? 'Cross' : 'Hamburger'}\n size=\"lg\"\n color=\"inherit\"\n />\n </span>\n </button>\n <span class=\"mobile-bar-nav__divider\" aria-hidden=\"true\" />\n {this.renderDestination(currentArea)}\n </div>\n <div class=\"mobile-bar-nav__group mobile-bar-nav__group--tools\">\n {tools.map(item => this.renderDestination(item))}\n </div>\n </nav>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- const t={top:"bottom",right:"left",bottom:"top",left:"right"};function o(t,o){const{anchorRect:n,popupWidth:e,popupHeight:r,align:i,sideOffsetPx:p,alignOffsetPx:c}=t;if(o==="top"||o==="bottom"){return{x:i==="start"?n.left+c:i==="end"?n.right-e+c:n.left+n.width/2-e/2+c,y:o==="top"?n.top-r-p:n.bottom+p}}return{x:o==="left"?n.left-e-p:n.right+p,y:i==="start"?n.top+c:i==="end"?n.bottom-r+c:n.top+n.height/2-r/2+c}}function n(t,o,n){const{popupWidth:e,popupHeight:r,viewportPadPx:i,viewportWidth:p,viewportHeight:c}=t;if(o==="top"||o==="bottom"){return Math.max(i-n.y,0)+Math.max(n.y+r-(c-i),0)}return Math.max(i-n.x,0)+Math.max(n.x+e-(p-i),0)}function e(t,o,n,e){const r=Math.max(e,n-o-e);return Math.min(Math.max(t,e),r)}function r(r){const i=o(r,r.side);const p=t[r.side];const c=o(r,p);const s=n(r,r.side,i);const h=n(r,p,c);const a=s>0&&h<s;const u=a?p:r.side;const f=a?c:i;return{x:e(f.x,r.popupWidth,r.viewportWidth,r.viewportPadPx),y:e(f.y,r.popupHeight,r.viewportHeight,r.viewportPadPx),resolvedSide:u}}export{r as c};
2
- //# sourceMappingURL=p-BX0BMhgz.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["OPPOSITE_SIDE","top","right","bottom","left","rawPosition","input","side","anchorRect","anchor","popupWidth","popupHeight","align","sideOffsetPx","alignOffsetPx","x","width","y","height","mainAxisOverflow","position","viewportPadPx","viewportWidth","viewportHeight","Math","max","clampToViewport","value","size","viewportSize","padding","maximum","min","computeAnchoredPosition","preferred","oppositeSide","opposite","preferredOverflow","oppositeOverflow","useOpposite","resolvedSide"],"sources":["src/wc/utils/anchored-position.ts"],"sourcesContent":["export type AnchoredSide = 'top' | 'right' | 'bottom' | 'left';\nexport type AnchoredAlign = 'start' | 'center' | 'end';\n\nexport interface AnchoredPositionInput {\n anchorRect: Pick<DOMRectReadOnly, 'top' | 'left' | 'right' | 'bottom' | 'width' | 'height'>;\n popupWidth: number;\n popupHeight: number;\n side: AnchoredSide;\n align: AnchoredAlign;\n sideOffsetPx: number;\n alignOffsetPx: number;\n viewportPadPx: number;\n viewportWidth: number;\n viewportHeight: number;\n}\n\nexport interface AnchoredPosition {\n x: number;\n y: number;\n /** Side actually used, which differs from the request when placement flipped. */\n resolvedSide: AnchoredSide;\n}\n\nconst OPPOSITE_SIDE: Record<AnchoredSide, AnchoredSide> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n};\n\n/** Unclamped coordinates for one candidate side. */\nfunction rawPosition(\n input: AnchoredPositionInput,\n side: AnchoredSide,\n): Pick<AnchoredPosition, 'x' | 'y'> {\n const { anchorRect: anchor, popupWidth, popupHeight, align, sideOffsetPx, alignOffsetPx } = input;\n\n if (side === 'top' || side === 'bottom') {\n return {\n x:\n align === 'start'\n ? anchor.left + alignOffsetPx\n : align === 'end'\n ? anchor.right - popupWidth + alignOffsetPx\n : anchor.left + anchor.width / 2 - popupWidth / 2 + alignOffsetPx,\n y: side === 'top'\n ? anchor.top - popupHeight - sideOffsetPx\n : anchor.bottom + sideOffsetPx,\n };\n }\n\n return {\n x: side === 'left'\n ? anchor.left - popupWidth - sideOffsetPx\n : anchor.right + sideOffsetPx,\n y:\n align === 'start'\n ? anchor.top + alignOffsetPx\n : align === 'end'\n ? anchor.bottom - popupHeight + alignOffsetPx\n : anchor.top + anchor.height / 2 - popupHeight / 2 + alignOffsetPx,\n };\n}\n\n/** Total main-axis spill past the padded viewport for a candidate position. */\nfunction mainAxisOverflow(\n input: AnchoredPositionInput,\n side: AnchoredSide,\n position: Pick<AnchoredPosition, 'x' | 'y'>,\n): number {\n const { popupWidth, popupHeight, viewportPadPx, viewportWidth, viewportHeight } = input;\n\n if (side === 'top' || side === 'bottom') {\n return Math.max(viewportPadPx - position.y, 0) +\n Math.max(position.y + popupHeight - (viewportHeight - viewportPadPx), 0);\n }\n\n return Math.max(viewportPadPx - position.x, 0) +\n Math.max(position.x + popupWidth - (viewportWidth - viewportPadPx), 0);\n}\n\nfunction clampToViewport(value: number, size: number, viewportSize: number, padding: number): number {\n const maximum = Math.max(padding, viewportSize - size - padding);\n return Math.min(Math.max(value, padding), maximum);\n}\n\n/**\n * Pure viewport-fixed anchored-popup layout math shared by every element-anchored\n * overlay: menus, selects, tooltips, and anchored toasts.\n *\n * `side` is preferred. When the popup spills past the padded viewport there and\n * the opposite side spills less, placement flips on the main axis; the result is\n * then clamped into the viewport on both axes. Cross-axis `align` is applied\n * before clamping so `alignOffsetPx` stays an additive nudge.\n *\n * Callers own their own anchor semantics — inner-cell alignment offsets and\n * minimum widths belong to the calling component, not here.\n * @see choice-popup-alignment.ts for the choice-cell alignment transform.\n */\nexport function computeAnchoredPosition(input: AnchoredPositionInput): AnchoredPosition {\n const preferred = rawPosition(input, input.side);\n const oppositeSide = OPPOSITE_SIDE[input.side];\n const opposite = rawPosition(input, oppositeSide);\n const preferredOverflow = mainAxisOverflow(input, input.side, preferred);\n const oppositeOverflow = mainAxisOverflow(input, oppositeSide, opposite);\n const useOpposite = preferredOverflow > 0 && oppositeOverflow < preferredOverflow;\n const resolvedSide = useOpposite ? oppositeSide : input.side;\n const position = useOpposite ? opposite : preferred;\n\n return {\n x: clampToViewport(position.x, input.popupWidth, input.viewportWidth, input.viewportPadPx),\n y: clampToViewport(position.y, input.popupHeight, input.viewportHeight, input.viewportPadPx),\n resolvedSide,\n };\n}\n"],"mappings":"AAuBA,MAAMA,EAAoD,CACxDC,IAAK,SACLC,MAAO,OACPC,OAAQ,MACRC,KAAM,SAIR,SAASC,EACPC,EACAC,GAEA,MAAQC,WAAYC,EAAMC,WAAEA,EAAUC,YAAEA,EAAWC,MAAEA,EAAKC,aAAEA,EAAYC,cAAEA,GAAkBR,EAE5F,GAAIC,IAAS,OAASA,IAAS,SAAU,CACvC,MAAO,CACLQ,EACEH,IAAU,QACNH,EAAOL,KAAOU,EACdF,IAAU,MACRH,EAAOP,MAAQQ,EAAaI,EAC5BL,EAAOL,KAAOK,EAAOO,MAAQ,EAAIN,EAAa,EAAII,EAC1DG,EAAGV,IAAS,MACRE,EAAOR,IAAMU,EAAcE,EAC3BJ,EAAON,OAASU,E,CAIxB,MAAO,CACLE,EAAGR,IAAS,OACRE,EAAOL,KAAOM,EAAaG,EAC3BJ,EAAOP,MAAQW,EACnBI,EACEL,IAAU,QACNH,EAAOR,IAAMa,EACbF,IAAU,MACRH,EAAON,OAASQ,EAAcG,EAC9BL,EAAOR,IAAMQ,EAAOS,OAAS,EAAIP,EAAc,EAAIG,EAE/D,CAGA,SAASK,EACPb,EACAC,EACAa,GAEA,MAAMV,WAAEA,EAAUC,YAAEA,EAAWU,cAAEA,EAAaC,cAAEA,EAAaC,eAAEA,GAAmBjB,EAElF,GAAIC,IAAS,OAASA,IAAS,SAAU,CACvC,OAAOiB,KAAKC,IAAIJ,EAAgBD,EAASH,EAAG,GAC1CO,KAAKC,IAAIL,EAASH,EAAIN,GAAeY,EAAiBF,GAAgB,E,CAG1E,OAAOG,KAAKC,IAAIJ,EAAgBD,EAASL,EAAG,GAC1CS,KAAKC,IAAIL,EAASL,EAAIL,GAAcY,EAAgBD,GAAgB,EACxE,CAEA,SAASK,EAAgBC,EAAeC,EAAcC,EAAsBC,GAC1E,MAAMC,EAAUP,KAAKC,IAAIK,EAASD,EAAeD,EAAOE,GACxD,OAAON,KAAKQ,IAAIR,KAAKC,IAAIE,EAAOG,GAAUC,EAC5C,CAeM,SAAUE,EAAwB3B,GACtC,MAAM4B,EAAY7B,EAAYC,EAAOA,EAAMC,MAC3C,MAAM4B,EAAenC,EAAcM,EAAMC,MACzC,MAAM6B,EAAW/B,EAAYC,EAAO6B,GACpC,MAAME,EAAoBlB,EAAiBb,EAAOA,EAAMC,KAAM2B,GAC9D,MAAMI,EAAmBnB,EAAiBb,EAAO6B,EAAcC,GAC/D,MAAMG,EAAcF,EAAoB,GAAKC,EAAmBD,EAChE,MAAMG,EAAeD,EAAcJ,EAAe7B,EAAMC,KACxD,MAAMa,EAAWmB,EAAcH,EAAWF,EAE1C,MAAO,CACLnB,EAAGW,EAAgBN,EAASL,EAAGT,EAAMI,WAAYJ,EAAMgB,cAAehB,EAAMe,eAC5EJ,EAAGS,EAAgBN,EAASH,EAAGX,EAAMK,YAAaL,EAAMiB,eAAgBjB,EAAMe,eAC9EmB,eAEJ,Q","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as e,H as s,c as t,h as o,a as i,t as n}from"./index.js";import{p as r}from"./p-DFQ9mcbK.js";import{d as a}from"./p-a6qP60zb.js";import{d as l}from"./p-NzGRAPcF.js";import{d}from"./p-BFfLvMZd.js";import{d as c}from"./p-JPTkZ3Ji.js";import{d as h}from"./p-Be1sY58w.js";import{d as f}from"./p-BGXqFq2C.js";import{d as u}from"./p-D4K9CE8a.js";const p=["search","messages","agents","stacks","activity","help"];const m={search:"Search",messages:"Messages",stacks:"Stacks",activity:"Activity",agents:"Agents",help:"Help & Support"};const g={search:"K",agents:"A",messages:"M",stacks:"S",activity:"N",help:"/"};const v=[{id:"search",icon:"MagnifyingGlass",label:m.search,railPlacement:"header",order:0,shortcutKey:g.search,mobileDestination:"search"},{id:"messages",icon:"MessageBubbleStack",label:m.messages,order:1,shortcutKey:g.messages,mobileDestination:"messages"},{id:"agents",icon:"AI",label:m.agents,order:2,shortcutKey:g.agents,mobileDestination:"agents"},{id:"stacks",icon:"ViewMenu",label:m.stacks,order:3,shortcutKey:g.stacks,mobileDestination:"inbox"},{id:"activity",icon:"Bell",label:m.activity,order:4,shortcutKey:g.activity,mobileDestination:"inbox"},{id:"help",icon:"CircleQuestion",label:m.help,railPlacement:"footer",order:5,shortcutKey:g.help,mobileDestination:"help"}];function b(e){const s=new Map;for(const t of e){if(t.id.trim()&&!s.has(t.id))s.set(t.id,t)}const t={header:0,body:1,footer:2};return Array.from(s.values()).sort(((e,s)=>{const o=_(e);const i=_(s);const n=t[o]-t[i];if(n!==0)return n;const r=p.findIndex((s=>s===e.id));const a=p.findIndex((e=>e===s.id));const l=e.order??(r<0?Number.MAX_SAFE_INTEGER:r);const d=s.order??(a<0?Number.MAX_SAFE_INTEGER:a);return l-d}))}function w(e){return typeof e==="string"&&e.trim().length>0}function _(e){if(e.railPlacement)return e.railPlacement;if(e.id==="search")return"header";if(e.id==="help")return"footer";return"body"}function y(e,s,t){if(!t||e.some((e=>e.id===t))){return{open:s,activeTool:t,removedTool:""}}return{open:false,activeTool:"",removedTool:t}}function x(e){const s=e.transitionProperty.split(",").map((e=>e.trim()));const t=e.transitionDuration.split(",").map((e=>r(e.trim(),0)));const o=e.transitionDelay.split(",").map((e=>r(e.trim(),0)));return s.reduce(((e,s,i)=>{if(s!=="all"&&s!=="max-width")return e;const n=t[i%t.length]??0;const r=o[i%o.length]??0;return Math.max(e,n+r,0)}),0)}function k(e,s){return!e&&s==="idle"}function T(e,s,t){if(t==="closing")return e<=.5;if(t==="opening")return s>0&&e>=s-.5;return true}function C(e,s,t){if(e&&s===t){return{open:false,activeTool:t,selected:false}}return{open:true,activeTool:t,selected:true}}const A=()=>`.ds-control--lg,:host(.ds-control--lg),:host(.ds-control--md),.ds-control--md,:host(.ds-control--sm),.ds-control--sm,:host(.ds-control--xs),.ds-control--xs{--ds-control-radius:var(--dimension-radius-025)}:host(.ds-control--lg),.ds-control--lg{--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)}:host(.ds-control--md),.ds-control--md{--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)}:host(.ds-control--sm),.ds-control--sm{--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)}:host(.ds-control--xs),.ds-control--xs{--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}:host(.ds-chrome-space--sm),.ds-chrome-space--sm{--ds-chrome-padding:var(--dimension-space-050);--ds-chrome-gap:var(--dimension-space-050)}:host(.ds-chrome-space--md),.ds-chrome-space--md{--ds-chrome-padding:var(--dimension-space-100);--ds-chrome-gap:var(--dimension-space-100)}:host(.ds-chrome-space--lg),.ds-chrome-space--lg{--ds-chrome-padding:var(--dimension-space-200);--ds-chrome-gap:var(--dimension-space-200)}:host(.ds-chrome-row),.ds-chrome-row,:host(.ds-chrome-column),.ds-chrome-column,:host(.ds-chrome-grid),.ds-chrome-grid{display:flex;box-sizing:border-box;gap:var(--ds-chrome-gap, var(--dimension-space-100));padding:var(--ds-chrome-padding, var(--dimension-space-100))}:host(.ds-chrome-row),.ds-chrome-row{flex-direction:row;align-items:center}:host(.ds-chrome-column),.ds-chrome-column{flex-direction:column}:host(.ds-chrome-grid),.ds-chrome-grid{display:grid;align-items:center}@media (forced-colors: active){:root,:host,.ds-forced-colors-scope{--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}}:host{--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)}:host(.ds-focus-ring),.ds-focus-ring,:host(.ds-focus-ring-inset),.ds-focus-ring-inset{outline:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation}:host(.ds-focus-ring:focus-visible),.ds-focus-ring:focus-visible{outline:var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);outline-offset:var(--ds-focus-ring-offset)}:host(.ds-focus-ring.ds-focus-ring--visible),.ds-focus-ring.ds-focus-ring--visible{outline:var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);outline-offset:var(--ds-focus-ring-offset)}:host(.ds-focus-ring-inset:focus-visible),.ds-focus-ring-inset:focus-visible{outline:none}:host(.ds-focus-ring-inset:focus-visible)::after,.ds-focus-ring-inset:focus-visible::after{outline:var(--ds-focus-ring-width) solid var(--ds-focus-ring-color);outline-offset:calc(-1 * var(--ds-focus-ring-width))}:host(.ds-focus-ring-inset.ds-focus-ring--visible),.ds-focus-ring-inset.ds-focus-ring--visible{outline:none}:host(.ds-focus-ring-inset.ds-focus-ring--visible)::after,.ds-focus-ring-inset.ds-focus-ring--visible::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){:host{--ds-focus-ring-color:var(--ds-forced-color-selected)}}:host(.ds-scrollbar-hidden),.ds-scrollbar-hidden{scrollbar-width:none}:host(.ds-scrollbar-hidden)::-webkit-scrollbar,.ds-scrollbar-hidden::-webkit-scrollbar{display:none}:host{display:block;flex:0 0 auto;box-sizing:border-box;height:100%;min-height:0;overflow:hidden;--_panel-tools-rail-width:var(--dimension-size-600);--_panel-tools-drawer-width:var(--ds-shell-panel-tools-width, var(--dimension-panel-width-xs));--_panel-tools-border:var(--dimension-stroke-width-012, 1px) solid var(--color-border-tertiary);--_panel-tools-expand-dur:var(--effect-animation-duration-medium-1, 300ms)}.panel-tools__layout{display:flex;flex-direction:row-reverse;align-items:stretch;height:100%;min-height:0;box-sizing:border-box}.panel-tools__drawer{flex:0 0 auto;max-width:0;min-width:0;height:100%;min-height:0;overflow:hidden;box-sizing:border-box;transition:none}:host(.panel-tools--ready) .panel-tools__drawer{transition:max-width var(--_panel-tools-expand-dur) var(--effect-animation-easing-ease-in-out, ease)}:host(.panel-tools--ready.panel-tools--motion-opening) .panel-tools__drawer{transition:max-width var(--_panel-tools-expand-dur) var(--effect-animation-easing-ease-out, ease-out)}:host(.panel-tools--ready.panel-tools--motion-closing) .panel-tools__drawer{transition:max-width var(--_panel-tools-expand-dur) var(--effect-animation-easing-ease-in, ease-in)}:host(.panel-tools--open) .panel-tools__drawer{max-width:var(--_panel-tools-drawer-width)}.panel-tools__drawer--visible{border-left:var(--_panel-tools-border)}.panel-tools__drawer-surface{display:flex;flex-direction:column;width:var(--_panel-tools-drawer-width);height:100%;min-height:0;box-sizing:border-box;background-color:transparent}.panel-tools__full-views,.panel-tools__full-view{flex:1 1 auto;min-height:0;overflow:hidden}.panel-tools__full-view{height:100%}.panel-tools__full-view{display:none}.panel-tools__full-view--active{display:block}:host([presentation='fullscreen']){height:100vh;inset:0;position:fixed;width:100vw;z-index:var(--dimension-z-index-modal)}:host([presentation='fullscreen']) .panel-tools__rail{display:none}:host([presentation='fullscreen']) .panel-tools__drawer{max-width:100vw;transition:none;width:100vw}:host([presentation='fullscreen']) .panel-tools__drawer--visible{border-left:none}:host([presentation='fullscreen']) .panel-tools__drawer-surface{background-color:transparent;width:100vw}:host([presentation='fullscreen']:not(.panel-tools--fullscreen)) .panel-tools__drawer-surface,:host(.panel-tools--fullscreen:not([presentation='fullscreen'])) .panel-tools__drawer-surface{visibility:hidden}:host(.panel-tools--presentation-snap) .panel-tools__drawer{transition:none}.panel-tools__body{flex:1 1 auto;min-height:0;overflow:auto;position:relative}:host(.panel-tools--drawer-resting) .panel-tools__body{content-visibility:auto;contain-intrinsic-size:auto 200px}.panel-tools__view{display:none;height:100%;min-height:0;box-sizing:border-box;padding:var(--dimension-space-200);color:var(--color-foreground-secondary);font-family:var(--typography-font-family-ui);font-size:var(--typography-fontsize-md);line-height:var(--typography-lineheight-md);font-weight:var(--typography-weight-regular);letter-spacing:var(--typography-letterspacing-negative-half)}.panel-tools__view ::slotted(*){margin:0;color:var(--color-foreground-secondary);font-family:var(--typography-font-family-ui);font-size:var(--typography-fontsize-md);line-height:var(--typography-lineheight-md);font-weight:var(--typography-weight-regular);letter-spacing:var(--typography-letterspacing-negative-half)}.panel-tools__view--active{display:block}.panel-tools__rail{flex:0 0 var(--_panel-tools-rail-width);width:var(--_panel-tools-rail-width);min-width:var(--_panel-tools-rail-width);display:flex;flex-direction:column;box-sizing:border-box;height:100%;min-height:0;border-left:var(--_panel-tools-border);background-color:transparent}.panel-tools__rail-header{justify-content:center;height:var(--dimension-size-600);flex-shrink:0;border-bottom:var(--_panel-tools-border)}.panel-tools__rail-body{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden}.panel-tools__rail-actions{display:flex;flex-direction:column;gap:var(--dimension-space-050);width:100%}.panel-tools__rail-footer{justify-content:center;flex-shrink:0;margin-top:auto}.panel-tools__rail-action{display:flex;align-items:center;justify-content:center;width:100%;height:var(--ds-control-height);flex-shrink:0}@media (prefers-reduced-motion: reduce){:host(.panel-tools--ready.panel-tools--motion-opening) .panel-tools__drawer,:host(.panel-tools--ready.panel-tools--motion-closing) .panel-tools__drawer{transition:none}}`;const z=e(class e extends s{constructor(e){super();if(e!==false){this.__registerHost()}this.__attachShadow();this.dsToolChange=t(this,"dsToolChange",7);this.dsPresentationChange=t(this,"dsPresentationChange",7);this.dsHeaderBack=t(this,"dsHeaderBack",7);this.dsHeaderAction=t(this,"dsHeaderAction",7);this.dsChromeTransitionStart=t(this,"dsChromeTransitionStart",7);this.dsChromeTransitionEnd=t(this,"dsChromeTransitionEnd",7);this.open=false;this.presentation="drawer";this.fullscreenHeaderMode="shared";this.activeTool="";this.items=[];this.toolsLabel="Tools";this.toolShortcutsLabel="Tool shortcuts";this.headers={};this.storageKey="";this.motion="idle";this.drawerSurfaceRetained=false;this.readyForMotion=false;this.presentationMotionSuppressed=false;this.rovingIndex=0;this.fullViewToolIds=[];this.railBodyScrollable=false;this.motionEnableGeneration=0;this.presentationMotionGeneration=0;this.transitionGeneration=0;this.transitionFallbackTimer=null;this.ignoreReplacementTerminal=false;this.focusBeforeFullscreen=null;this.fullViewObserver=null;this.handleComposedHeaderAction=e=>{const s=e.detail;if(!this.activeTool||!s?.id)return;e.stopPropagation();this.dsHeaderAction.emit({tool:this.activeTool,id:s.id})};this.handleTransitionEnd=e=>{const s=this.renderRoot.querySelector(".panel-tools__drawer");if(e.target!==s)return;if(e.propertyName!=="max-width")return;if(this.ignoreReplacementTerminal){this.ignoreReplacementTerminal=false;return}if(e.type==="transitioncancel")return;if(s&&!this.drawerTransitionAtTerminal(s,this.motion))return;this.finishDrawerTransition()};this.handleToolChange=e=>{const s=C(this.open,this.activeTool,e);this.open=s.open;this.activeTool=s.activeTool;this.dsToolChange.emit({id:e,selected:s.selected})};this.handleRailKeyDown=(e,s)=>{const t=this.orderedRailItems;if(!t.length)return;if(e.key==="Enter"||e.key===" "){e.preventDefault();this.handleToolChange(t[s].id);return}if(e.key==="ArrowDown"){if(s>=t.length-1)return;e.preventDefault();this.focusRailAt(s+1);return}if(e.key==="ArrowUp"){if(s<=0)return;e.preventDefault();this.focusRailAt(s-1)}}}get railItems(){return this.items??[]}get orderedRailItems(){return b(this.railItems)}disconnectedCallback(){this.el.removeEventListener("transitionend",this.handleTransitionEnd);this.el.removeEventListener("transitioncancel",this.handleTransitionEnd);this.el.removeEventListener("dsAction",this.handleComposedHeaderAction);this.clearTransitionCompletion();this.motionEnableGeneration+=1;this.fullViewObserver?.disconnect();this.fullViewObserver=null;this.disconnectRailBodyObserver()}presentationChanged(e,t){if(e===t)return;if(this.el.getAttribute("presentation")!==e){this.el.setAttribute("presentation",e)}const o=++this.presentationMotionGeneration;this.presentationMotionSuppressed=true;requestAnimationFrame((()=>{requestAnimationFrame((()=>{if(o!==this.presentationMotionGeneration)return;this.presentationMotionSuppressed=false}))}));if(e==="fullscreen"){this.focusBeforeFullscreen=document.activeElement instanceof s?document.activeElement:null;this.open=true}else if(t==="fullscreen"){const e=this.focusBeforeFullscreen;const s=this.activeHeader().actions?.[0]?.id;requestAnimationFrame((async()=>{if(e?.isConnected){e.focus({preventScroll:true})}const t=e?document.activeElement===e||e.contains(document.activeElement):false;if(!t&&s)await this.focusHeaderAction(s);this.focusBeforeFullscreen=null}))}this.dsPresentationChange.emit({presentation:e})}handleFullscreenEscape(e){if(this.presentation!=="fullscreen"||e.key!=="Escape")return;e.preventDefault();e.stopPropagation();this.presentation="drawer"}deferMotionEnable(){if(this.readyForMotion)return;const e=++this.motionEnableGeneration;requestAnimationFrame((()=>{if(e!==this.motionEnableGeneration)return;requestAnimationFrame((()=>{if(e!==this.motionEnableGeneration)return;this.readyForMotion=true}))}))}connectedCallback(){this.el.addEventListener("transitionend",this.handleTransitionEnd);this.el.addEventListener("transitioncancel",this.handleTransitionEnd);this.el.addEventListener("dsAction",this.handleComposedHeaderAction)}componentWillLoad(){this.restoreLastActiveTool();this.drawerSurfaceRetained=this.open}openChanged(e,s){if(e)this.drawerSurfaceRetained=true;if(this.readyForMotion&&s!==undefined&&s!==e){this.startDrawerTransition(e?"opening":"closing")}else if(!e){this.drawerSurfaceRetained=false}this.deferMotionEnable()}activeToolChanged(){this.persistLastActiveTool();this.deferMotionEnable()}storageKeyChanged(){this.restoreLastActiveTool()}componentDidLoad(){this.deferMotionEnable();this.connectRailBodyObserver();this.updateRailBodyScrollable();this.syncFullViewTools();this.fullViewObserver=new MutationObserver((()=>this.syncFullViewTools()));this.fullViewObserver.observe(this.el,{childList:true,attributes:true,attributeFilter:["slot"]})}componentDidRender(){this.updateRailBodyScrollable()}connectRailBodyObserver(){this.disconnectRailBodyObserver();if(!this.railBodyEl||typeof ResizeObserver==="undefined")return;this.railBodyObserver=new ResizeObserver((()=>this.updateRailBodyScrollable()));this.railBodyObserver.observe(this.railBodyEl)}disconnectRailBodyObserver(){this.railBodyObserver?.disconnect();this.railBodyObserver=undefined}updateRailBodyScrollable(){const e=Boolean(this.railBodyEl&&this.railBodyEl.scrollHeight>this.railBodyEl.clientHeight+1);if(e!==this.railBodyScrollable)this.railBodyScrollable=e}itemsChanged(){this.rovingIndex=0;this.reconcileActiveTool();this.deferMotionEnable()}restoreLastActiveTool(){if(!this.storageKey||this.activeTool)return;try{const e=localStorage.getItem(this.storageKey);if(w(e))this.activeTool=e}catch{}}persistLastActiveTool(){if(!this.storageKey||!this.activeTool)return;try{localStorage.setItem(this.storageKey,this.activeTool)}catch{}}clearPersistedTool(){if(!this.storageKey)return;try{localStorage.removeItem(this.storageKey)}catch{}}reconcileActiveTool(){const e=y(this.railItems,this.open,this.activeTool);if(!e.removedTool)return;this.clearPersistedTool();this.open=e.open;this.activeTool=e.activeTool;this.dsToolChange.emit({id:e.removedTool,selected:false})}startDrawerTransition(e){const s=this.renderRoot.querySelector(".panel-tools__drawer");if(this.motion!=="idle"){this.finishDrawerTransition();this.ignoreReplacementTerminal=true}this.motion=e;this.dsChromeTransitionStart.emit({source:"panel-tools",phase:e});const t=++this.transitionGeneration;requestAnimationFrame((()=>{requestAnimationFrame((()=>{if(t!==this.transitionGeneration||this.motion!==e)return;if(!s){this.finishDrawerTransition();return}if(this.drawerTransitionAtTerminal(s,e)){this.finishDrawerTransition();return}const o=x(getComputedStyle(s));if(o<=0){this.finishDrawerTransition();return}this.transitionFallbackTimer=window.setTimeout((()=>{this.finishDrawerTransition()}),o)}))}))}drawerTransitionAtTerminal(e,s){const t=e.getBoundingClientRect().width;const o=e.querySelector(".panel-tools__drawer-surface");const i=o?.getBoundingClientRect().width??0;return T(t,i,s)}finishDrawerTransition(){const e=this.motion;const s=e!=="idle";this.clearTransitionCompletion();if(!s)return;this.ignoreReplacementTerminal=false;this.motion="idle";if(e==="closing"&&!this.open){this.drawerSurfaceRetained=false}this.dsChromeTransitionEnd.emit({source:"panel-tools"})}clearTransitionCompletion(){this.transitionGeneration+=1;if(this.transitionFallbackTimer!==null){window.clearTimeout(this.transitionFallbackTimer);this.transitionFallbackTimer=null}}isRailSelected(e){return this.open&&this.activeTool===e}isDrawerPresent(){return this.open||this.drawerSurfaceRetained}isViewActive(e){return this.isDrawerPresent()&&this.activeTool===e}hasFullView(e){return this.fullViewToolIds.includes(e)}syncFullViewTools(){const e=this.orderedRailItems.map((e=>e.id));const s=e.filter((e=>Boolean(this.el.querySelector(`[slot="${e}-view"]`))));if(s.join("|")!==this.fullViewToolIds.join("|"))this.fullViewToolIds=s}get renderRoot(){return this.el.shadowRoot??this.el}headerLabel(){if(!this.isDrawerPresent()||!this.activeTool)return"";const e=this.railItems.find((e=>e.id===this.activeTool));return e?.label??m[this.activeTool]??this.activeTool}resolvedHeaders(){return this.headers??{}}activeHeader(){if(!this.activeTool)return{};return this.resolvedHeaders()[this.activeTool]??{}}async activateTool(e){const s=this.railItems.find((s=>s.id===e));if(!s||s.isInactive)return;this.handleToolChange(e)}async closeDrawer(){if(!this.open)return;const e=this.activeTool;this.open=false;if(e){this.dsToolChange.emit({id:e,selected:false})}}async focusHeaderAction(e){const s=this.renderRoot.querySelector(`[data-header-action-id="${CSS.escape(e)}"]`);await(s?.setFocus?.())}focusRailAt(e){const s=this.orderedRailItems;if(!s.length)return;const t=Math.max(0,Math.min(e,s.length-1));if(t===this.rovingIndex)return;this.rovingIndex=t;const o=Array.from(this.renderRoot.querySelectorAll(".panel-tools__rail-action .button-icon"));o[t]?.focus({preventScroll:true})}renderRailAction(e,s){const t=e.ariaLabel??e.label??m[e.id]??e.id;return o("ds-tooltip",{key:e.id,label:t,shortcutKey:e.shortcutKey??g[e.id],side:"left",size:"sm"},o("ds-button-unfilled",{variant:"icon",class:"panel-tools__rail-action",icon:e.icon,isActive:this.isRailSelected(e.id),activeFill:false,hasBorder:false,pressScale:false,dot:e.dot??false,isInactive:e.isInactive,focusTabIndex:s===this.rovingIndex?0:-1,"aria-label":t,pressed:this.isRailSelected(e.id),onFocusin:()=>{this.rovingIndex=s},onKeyDown:e=>this.handleRailKeyDown(e,s),onDsClick:()=>this.handleToolChange(e.id)}))}render(){const e=this.headerLabel();const s=this.activeHeader();const t=s.title?.trim()||e;const n=s.actions??[];const r=this.orderedRailItems;const a=r.filter((e=>_(e)==="header"));const l=r.filter((e=>_(e)==="body"));const d=r.filter((e=>_(e)==="footer"));const c=a.length;const h=c+l.length;const f=this.isDrawerPresent();const u=k(this.open,this.motion);const p=Boolean(f&&this.activeTool&&this.hasFullView(this.activeTool));const m=r.map((e=>e.id));return o(i,{key:"5d2dbf71de99f6355be88dc44e6aac3bab9a754b",class:{"panel-tools":true,"panel-tools--open":this.open,"panel-tools--ready":this.readyForMotion,"panel-tools--motion-opening":this.motion==="opening","panel-tools--motion-closing":this.motion==="closing","panel-tools--drawer-resting":u,"panel-tools--fullscreen":this.presentation==="fullscreen","panel-tools--presentation-snap":this.presentationMotionSuppressed},role:this.presentation==="fullscreen"?"dialog":"complementary","aria-modal":this.presentation==="fullscreen"?"true":undefined,"aria-label":this.toolsLabel},o("div",{key:"ab69cd8748ed7a7cf64bda2a682d88025da52c2a",class:"panel-tools__layout"},o("nav",{key:"2d623f2c01785868e01bbfe953980c91861909ad",class:"panel-tools__rail","aria-label":this.toolShortcutsLabel},a.length?o("div",{class:"panel-tools__rail-header ds-chrome-row ds-chrome-space--md"},a.map(((e,s)=>this.renderRailAction(e,s)))):null,o("div",{key:"b1aa853019eed5c5be6f93430c4f591e54312efa",class:{"panel-tools__rail-body":true,"ds-chrome-column":true,"ds-chrome-space--md":true,"ds-scrollbar-hidden":true,"ds-focus-ring":this.railBodyScrollable},ref:e=>{const s=e??undefined;if(s===this.railBodyEl)return;this.railBodyEl=s;this.connectRailBodyObserver()},role:this.railBodyScrollable?"region":undefined,"aria-label":this.railBodyScrollable?this.toolShortcutsLabel:undefined,tabIndex:this.railBodyScrollable?0:undefined},o("div",{key:"f6b578df291d3d16f295d62404b5044abb4050d6",class:"panel-tools__rail-actions"},l.map(((e,s)=>this.renderRailAction(e,c+s))))),d.length?o("div",{class:"panel-tools__rail-footer ds-chrome-row ds-chrome-space--md"},d.map(((e,s)=>this.renderRailAction(e,h+s)))):null),o("div",{key:"5ad373773aee9a81961036cb7d0a01d8b547744b",class:{"panel-tools__drawer":true,"panel-tools__drawer--visible":f},"aria-hidden":f?null:"true",inert:f?undefined:true},o("div",{key:"b76a27b16233fb0a6e6549708e1c53b0803e24af",class:"panel-tools__drawer-surface"},this.presentation!=="fullscreen"||this.fullscreenHeaderMode==="shared"?o("ds-panel-tool-header",{class:"panel-tools__header",heading:t,showBack:s.showBack??false,backIcon:s.backIcon||"ChevronLeft",backAriaLabel:s.backAriaLabel||"Back",showMenu:false,ref:e=>{const s=e;if(s)s.actions=n},onDsBack:()=>{if(this.activeTool)this.dsHeaderBack.emit({tool:this.activeTool})}}):null,o("div",{key:"740d03f95786bf3daf19a7107fafcf2c6b306e66",class:"panel-tools__body",hidden:p},m.map((e=>{const s=this.isViewActive(e);return o("div",{class:{"panel-tools__view":true,"panel-tools__view--active":s},hidden:!s},o("slot",{name:e}))}))),o("div",{key:"a3562ca649abaa158ee8eccbb582300d71d30aee",class:"panel-tools__full-views",hidden:!p},m.map((e=>o("div",{class:{"panel-tools__full-view":true,"panel-tools__full-view--active":this.isViewActive(e)&&this.hasFullView(e)},hidden:!(this.isViewActive(e)&&this.hasFullView(e))},o("slot",{name:`${e}-view`})))))))))}get el(){return this}static get watchers(){return{presentation:[{presentationChanged:0}],open:[{openChanged:0}],activeTool:[{activeToolChanged:0}],storageKey:[{storageKeyChanged:0}],items:[{itemsChanged:0}]}}static get style(){return A()}},[257,"ds-panel-tools",{open:[1540],presentation:[1537],fullscreenHeaderMode:[513,"fullscreen-header-mode"],activeTool:[1537,"active-tool"],items:[16],toolsLabel:[1,"tools-label"],toolShortcutsLabel:[1,"tool-shortcuts-label"],headers:[16],storageKey:[1,"storage-key"],motion:[32],drawerSurfaceRetained:[32],readyForMotion:[32],presentationMotionSuppressed:[32],rovingIndex:[32],fullViewToolIds:[32],railBodyScrollable:[32],activateTool:[64],closeDrawer:[64],focusHeaderAction:[64]},[[10,"keydown","handleFullscreenEscape"]],{presentation:[{presentationChanged:0}],open:[{openChanged:0}],activeTool:[{activeToolChanged:0}],storageKey:[{storageKeyChanged:0}],items:[{itemsChanged:0}]}]);function S(){if(typeof customElements==="undefined"){return}const e=["ds-panel-tools","ds-badge","ds-button-unfilled","ds-icon","ds-loader","ds-panel-tool-header","ds-text","ds-tooltip"];e.forEach((e=>{switch(e){case"ds-panel-tools":if(!customElements.get(n(e))){customElements.define(n(e),z)}break;case"ds-badge":if(!customElements.get(n(e))){a()}break;case"ds-button-unfilled":if(!customElements.get(n(e))){l()}break;case"ds-icon":if(!customElements.get(n(e))){d()}break;case"ds-loader":if(!customElements.get(n(e))){c()}break;case"ds-panel-tool-header":if(!customElements.get(n(e))){h()}break;case"ds-text":if(!customElements.get(n(e))){f()}break;case"ds-tooltip":if(!customElements.get(n(e))){u()}break}}))}S();export{z as P,m as a,C as b,v as c,S as d,b as o,y as r};
2
- //# sourceMappingURL=p-Bh67XbfB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["PANEL_TOOLS_TOOL_IDS","PANEL_TOOLS_LABELS","search","messages","stacks","activity","agents","help","PANEL_TOOLS_SHORTCUTS","PANEL_TOOLS_DEFAULT_ITEMS","id","icon","label","railPlacement","order","shortcutKey","mobileDestination","orderPanelToolsItems","items","firstById","Map","item","trim","has","set","regionOrder","header","body","footer","Array","from","values","sort","left","right","leftRegion","panelToolsRailPlacement","rightRegion","regionDelta","leftCanonical","findIndex","rightCanonical","leftOrder","Number","MAX_SAFE_INTEGER","rightOrder","isPanelToolsToolId","value","length","reconcilePanelToolsAvailability","open","activeTool","some","removedTool","panelToolsDrawerTransitionMs","style","properties","transitionProperty","split","map","durations","transitionDuration","parseCssTimeMs","delays","transitionDelay","reduce","max","property","index","duration","delay","Math","panelToolsDrawerResting","motion","panelToolsDrawerAtTerminal","width","targetWidth","resolvePanelToolActivation","selected","panelToolsCss","PanelTools","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","presentation","fullscreenHeaderMode","toolsLabel","toolShortcutsLabel","headers","storageKey","drawerSurfaceRetained","readyForMotion","presentationMotionSuppressed","rovingIndex","fullViewToolIds","railBodyScrollable","motionEnableGeneration","presentationMotionGeneration","transitionGeneration","transitionFallbackTimer","ignoreReplacementTerminal","focusBeforeFullscreen","fullViewObserver","handleComposedHeaderAction","event","detail","stopPropagation","dsHeaderAction","emit","tool","handleTransitionEnd","drawer","renderRoot","querySelector","target","propertyName","type","drawerTransitionAtTerminal","finishDrawerTransition","handleToolChange","next","dsToolChange","handleRailKeyDown","e","orderedRailItems","key","preventDefault","focusRailAt","railItems","disconnectedCallback","el","removeEventListener","clearTransitionCompletion","disconnect","disconnectRailBodyObserver","presentationChanged","previous","getAttribute","setAttribute","presentationGeneration","requestAnimationFrame","document","activeElement","fallbackActionId","activeHeader","actions","async","isConnected","focus","preventScroll","focusRestored","contains","focusHeaderAction","dsPresentationChange","handleFullscreenEscape","deferMotionEnable","generation","connectedCallback","addEventListener","componentWillLoad","restoreLastActiveTool","openChanged","isOpen","wasOpen","undefined","startDrawerTransition","activeToolChanged","persistLastActiveTool","storageKeyChanged","componentDidLoad","connectRailBodyObserver","updateRailBodyScrollable","syncFullViewTools","MutationObserver","observe","childList","attributes","attributeFilter","componentDidRender","railBodyEl","ResizeObserver","railBodyObserver","Boolean","scrollHeight","clientHeight","itemsChanged","reconcileActiveTool","stored","localStorage","getItem","setItem","clearPersistedTool","removeItem","phase","dsChromeTransitionStart","source","fallbackMs","getComputedStyle","window","setTimeout","getBoundingClientRect","surface","completedPhase","wasTransitioning","dsChromeTransitionEnd","clearTimeout","isRailSelected","isDrawerPresent","isViewActive","hasFullView","includes","ids","filter","join","shadowRoot","headerLabel","find","candidate","resolvedHeaders","activateTool","entry","isInactive","closeDrawer","action","CSS","escape","setFocus","bounded","min","querySelectorAll","renderRailAction","ariaLabel","h","side","size","variant","class","isActive","activeFill","hasBorder","pressScale","dot","focusTabIndex","pressed","onFocusin","onKeyDown","onDsClick","render","headerTitle","title","headerActions","headerItems","bodyItems","footerItems","headerCount","footerStart","showDrawerChrome","drawerResting","activeFullView","toolIds","Host","role","ref","element","tabIndex","bodyIdx","footerIdx","inert","heading","showBack","backIcon","backAriaLabel","showMenu","toolHeader","onDsBack","dsHeaderBack","hidden","active","name"],"sources":["src/wc/components/PanelTools/panel-tools-types.ts","src/wc/components/PanelTools/panel-tools-utils.ts","src/wc/components/PanelTools/PanelTools.css?tag=ds-panel-tools&encapsulation=shadow","src/wc/components/PanelTools/PanelTools.tsx"],"sourcesContent":["/** Application-owned tool id for the shell rail and responsive tool views. */\nexport type PanelToolsToolId = string;\n\n/** Canonical Motive shell recipe used when item metadata is omitted. */\nexport type CanonicalPanelToolsToolId =\n | 'search'\n | 'messages'\n | 'agents'\n | 'stacks'\n | 'activity'\n | 'help';\n\nexport const PANEL_TOOLS_TOOL_IDS: CanonicalPanelToolsToolId[] = [\n 'search',\n 'messages',\n 'agents',\n 'stacks',\n 'activity',\n 'help',\n];\n\n/** Rail header slot — mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: CanonicalPanelToolsToolId = 'search';\n\n/** Rail footer slot — flush to the bottom of the tools column. */\nexport const PANEL_TOOLS_FOOTER_TOOL_ID: CanonicalPanelToolsToolId = 'help';\n\nexport const PANEL_TOOLS_LABELS: Record<CanonicalPanelToolsToolId, string> = {\n search: 'Search',\n messages: 'Messages',\n stacks: 'Stacks',\n activity: 'Activity',\n agents: 'Agents',\n help: 'Help & Support',\n};\n\nexport const PANEL_TOOLS_SHORTCUTS: Partial<Record<CanonicalPanelToolsToolId, string>> = {\n search: 'K',\n agents: 'A',\n messages: 'M',\n stacks: 'S',\n activity: 'N',\n help: '/',\n};\n\nexport interface PanelToolsItem {\n id: PanelToolsToolId;\n /** Icon name for <ds-icon>. */\n icon: string;\n /** Visible and accessible fallback label for custom tool ids. */\n label?: string;\n /** Explicit rail region; canonical Search/Help placement is the fallback. */\n railPlacement?: 'header' | 'body' | 'footer';\n /** Stable ordering within the selected rail region. */\n order?: number;\n /** Optional shortcut label displayed by the tooltip. */\n shortcutKey?: string;\n /** Mobile destination recipe; canonical ids retain their explicit defaults. */\n mobileDestination?: 'search' | 'inbox' | 'messages' | 'agents' | 'help';\n /** Whether this rail button is currently pressed/active. */\n selected?: boolean;\n /** Show a notification dot. */\n dot?: boolean;\n isInactive?: boolean;\n ariaLabel?: string;\n}\n\n/** Canonical shell recipe used by Lab and by managed ShellApp examples. */\nexport const PANEL_TOOLS_DEFAULT_ITEMS: PanelToolsItem[] = [\n {\n id: 'search',\n icon: 'MagnifyingGlass',\n label: PANEL_TOOLS_LABELS.search,\n railPlacement: 'header',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.search,\n mobileDestination: 'search',\n },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: PANEL_TOOLS_LABELS.messages,\n order: 1,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.messages,\n mobileDestination: 'messages',\n },\n {\n id: 'agents',\n icon: 'AI',\n label: PANEL_TOOLS_LABELS.agents,\n order: 2,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.agents,\n mobileDestination: 'agents',\n },\n {\n id: 'stacks',\n icon: 'ViewMenu',\n label: PANEL_TOOLS_LABELS.stacks,\n order: 3,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.stacks,\n mobileDestination: 'inbox',\n },\n {\n id: 'activity',\n icon: 'Bell',\n label: PANEL_TOOLS_LABELS.activity,\n order: 4,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.activity,\n mobileDestination: 'inbox',\n },\n {\n id: 'help',\n icon: 'CircleQuestion',\n label: PANEL_TOOLS_LABELS.help,\n railPlacement: 'footer',\n order: 5,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.help,\n mobileDestination: 'help',\n },\n];\n\nexport interface PanelToolsHeaderAction {\n id: string;\n icon: string;\n ariaLabel: string;\n triggerId?: string;\n controls?: string;\n expanded?: boolean;\n haspopup?: 'menu' | 'dialog' | 'listbox' | 'tree' | 'grid';\n pressed?: boolean;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsHeaderConfig {\n title?: string;\n showBack?: boolean;\n backIcon?: string;\n backAriaLabel?: string;\n actions?: PanelToolsHeaderAction[];\n}\n\n/** Per-tool header state. The application replaces the object when a tool changes depth or actions. */\nexport type PanelToolsHeaders = Partial<Record<PanelToolsToolId, PanelToolsHeaderConfig>>;\n","import { parseCssTimeMs } from '../../utils/resolve-css-time-ms';\nimport {\n PANEL_TOOLS_TOOL_IDS,\n type PanelToolsItem,\n type PanelToolsToolId,\n} from './panel-tools-types';\n\nexport function orderPanelToolsItems(items: PanelToolsItem[]): PanelToolsItem[] {\n const firstById = new Map<PanelToolsToolId, PanelToolsItem>();\n for (const item of items) {\n if (item.id.trim() && !firstById.has(item.id)) firstById.set(item.id, item);\n }\n const regionOrder = { header: 0, body: 1, footer: 2 } as const;\n return Array.from(firstById.values()).sort((left, right) => {\n const leftRegion = panelToolsRailPlacement(left);\n const rightRegion = panelToolsRailPlacement(right);\n const regionDelta = regionOrder[leftRegion] - regionOrder[rightRegion];\n if (regionDelta !== 0) return regionDelta;\n\n const leftCanonical = PANEL_TOOLS_TOOL_IDS.findIndex(id => id === left.id);\n const rightCanonical = PANEL_TOOLS_TOOL_IDS.findIndex(id => id === right.id);\n const leftOrder = left.order ?? (leftCanonical < 0 ? Number.MAX_SAFE_INTEGER : leftCanonical);\n const rightOrder =\n right.order ?? (rightCanonical < 0 ? Number.MAX_SAFE_INTEGER : rightCanonical);\n return leftOrder - rightOrder;\n });\n}\n\nexport function isPanelToolsToolId(value: string | null): value is PanelToolsToolId {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nexport function panelToolsRailPlacement(\n item: PanelToolsItem\n): 'header' | 'body' | 'footer' {\n if (item.railPlacement) return item.railPlacement;\n if (item.id === 'search') return 'header';\n if (item.id === 'help') return 'footer';\n return 'body';\n}\n\nexport function reconcilePanelToolsAvailability(\n items: PanelToolsItem[],\n open: boolean,\n activeTool: PanelToolsToolId | ''\n): { open: boolean; activeTool: PanelToolsToolId | ''; removedTool: PanelToolsToolId | '' } {\n if (!activeTool || items.some(item => item.id === activeTool)) {\n return { open, activeTool, removedTool: '' };\n }\n return { open: false, activeTool: '', removedTool: activeTool };\n}\n\nexport function shouldResyncPanelToolsItems(\n prev: PanelToolsItem[],\n next: PanelToolsItem[]\n): boolean {\n if (prev.length !== next.length) return true;\n return next.some((item, index) => {\n const prior = prev[index];\n if (!prior) return true;\n return (\n prior.id !== item.id ||\n prior.icon !== item.icon ||\n prior.label !== item.label ||\n prior.railPlacement !== item.railPlacement ||\n prior.order !== item.order ||\n prior.shortcutKey !== item.shortcutKey ||\n prior.mobileDestination !== item.mobileDestination ||\n prior.selected !== item.selected ||\n prior.dot !== item.dot ||\n prior.isInactive !== item.isInactive ||\n prior.ariaLabel !== item.ariaLabel\n );\n });\n}\n\nexport type PanelToolsMotion = 'opening' | 'closing' | 'idle';\n\nexport interface PanelToolsTransitionStyle {\n transitionProperty: string;\n transitionDuration: string;\n transitionDelay: string;\n}\n\n/** Maximum computed time for the drawer's max-width transition, including delay. */\nexport function panelToolsDrawerTransitionMs(style: PanelToolsTransitionStyle): number {\n const properties = style.transitionProperty.split(',').map(item => item.trim());\n const durations = style.transitionDuration.split(',').map(item => parseCssTimeMs(item.trim(), 0));\n const delays = style.transitionDelay.split(',').map(item => parseCssTimeMs(item.trim(), 0));\n\n return properties.reduce((max, property, index) => {\n if (property !== 'all' && property !== 'max-width') return max;\n const duration = durations[index % durations.length] ?? 0;\n const delay = delays[index % delays.length] ?? 0;\n return Math.max(max, duration + delay, 0);\n }, 0);\n}\n\n/** True when the drawer clip is fully closed — safe to skip painting slot content. */\nexport function panelToolsDrawerResting(open: boolean, motion: PanelToolsMotion): boolean {\n return !open && motion === 'idle';\n}\n\n/** True only when the animated clip has reached the terminal width for its motion phase. */\nexport function panelToolsDrawerAtTerminal(\n width: number,\n targetWidth: number,\n motion: PanelToolsMotion\n): boolean {\n if (motion === 'closing') return width <= 0.5;\n if (motion === 'opening') return targetWidth > 0 && width >= targetWidth - 0.5;\n return true;\n}\n\n/** Toggle or switch rail tool selection — repeat activation closes the active tool. */\nexport function resolvePanelToolActivation(\n open: boolean,\n activeTool: PanelToolsToolId | '',\n id: PanelToolsToolId\n): { open: boolean; activeTool: PanelToolsToolId; selected: boolean } {\n if (open && activeTool === id) {\n return { open: false, activeTool: id, selected: false };\n }\n return { open: true, activeTool: id, selected: true };\n}\n","@import '../../utils/control-density.css';\n@import '../../utils/chrome-layout.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/scrollbar-hidden.css';\n\n:host {\n display: block;\n flex: 0 0 auto;\n box-sizing: border-box;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n --_panel-tools-rail-width: var(--dimension-size-600);\n --_panel-tools-drawer-width: var(--ds-shell-panel-tools-width, var(--dimension-panel-width-xs));\n --_panel-tools-border: var(--dimension-stroke-width-012, 1px) solid var(--color-border-tertiary);\n /* Match panel-nav expand timing (medium-1); easing differs by direction. */\n --_panel-tools-expand-dur: var(--effect-animation-duration-medium-1, 300ms);\n}\n\n.panel-tools__layout {\n display: flex;\n flex-direction: row-reverse;\n align-items: stretch;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n}\n\n/* Clip frame — only max-width animates (slide reveal, same as pre-rail :host). */\n.panel-tools__drawer {\n flex: 0 0 auto;\n max-width: 0;\n min-width: 0;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n transition: none;\n}\n\n:host(.panel-tools--ready) .panel-tools__drawer {\n transition: max-width var(--_panel-tools-expand-dur)\n var(--effect-animation-easing-ease-in-out, ease);\n}\n\n:host(.panel-tools--ready.panel-tools--motion-opening) .panel-tools__drawer {\n transition: max-width var(--_panel-tools-expand-dur)\n var(--effect-animation-easing-ease-out, ease-out);\n}\n\n:host(.panel-tools--ready.panel-tools--motion-closing) .panel-tools__drawer {\n transition: max-width var(--_panel-tools-expand-dur)\n var(--effect-animation-easing-ease-in, ease-in);\n}\n\n:host(.panel-tools--open) .panel-tools__drawer {\n max-width: var(--_panel-tools-drawer-width);\n}\n\n.panel-tools__drawer--visible {\n border-left: var(--_panel-tools-border);\n}\n\n/* Fixed-width surface — ShellApp supplies the standard 300px tools width. */\n.panel-tools__drawer-surface {\n display: flex;\n flex-direction: column;\n width: var(--_panel-tools-drawer-width);\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n background-color: transparent;\n}\n\n.panel-tools__full-views,\n.panel-tools__full-view {\n flex: 1 1 auto;\n min-height: 0;\n overflow: hidden;\n}\n\n.panel-tools__full-view {\n height: 100%;\n}\n\n.panel-tools__full-view {\n display: none;\n}\n.panel-tools__full-view--active {\n display: block;\n}\n\n:host([presentation='fullscreen']) {\n height: 100vh;\n inset: 0;\n position: fixed;\n width: 100vw;\n z-index: var(--dimension-z-index-modal);\n}\n\n:host([presentation='fullscreen']) .panel-tools__rail {\n display: none;\n}\n:host([presentation='fullscreen']) .panel-tools__drawer {\n max-width: 100vw;\n transition: none;\n width: 100vw;\n}\n:host([presentation='fullscreen']) .panel-tools__drawer--visible {\n border-left: none;\n}\n:host([presentation='fullscreen']) .panel-tools__drawer-surface {\n background-color: transparent;\n width: 100vw;\n}\n\n/*\n * A framework can update the reflected presentation attribute before Stencil\n * commits the matching render class. Conceal that single inconsistent frame so\n * slotted master/detail content never paints against the previous geometry.\n */\n:host([presentation='fullscreen']:not(.panel-tools--fullscreen)) .panel-tools__drawer-surface,\n:host(.panel-tools--fullscreen:not([presentation='fullscreen'])) .panel-tools__drawer-surface {\n visibility: hidden;\n}\n\n:host(.panel-tools--presentation-snap) .panel-tools__drawer {\n transition: none;\n}\n\n.panel-tools__body {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n position: relative;\n}\n\n/* Skip paint while fully closed; cleared during open/close motion for WYSIWYG slide. */\n:host(.panel-tools--drawer-resting) .panel-tools__body {\n content-visibility: auto;\n contain-intrinsic-size: auto 200px;\n}\n\n.panel-tools__view {\n display: none;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n padding: var(--dimension-space-200);\n color: var(--color-foreground-secondary);\n font-family: var(--typography-font-family-ui);\n font-size: var(--typography-fontsize-md);\n line-height: var(--typography-lineheight-md);\n font-weight: var(--typography-weight-regular);\n letter-spacing: var(--typography-letterspacing-negative-half);\n}\n\n.panel-tools__view ::slotted(*) {\n margin: 0;\n color: var(--color-foreground-secondary);\n font-family: var(--typography-font-family-ui);\n font-size: var(--typography-fontsize-md);\n line-height: var(--typography-lineheight-md);\n font-weight: var(--typography-weight-regular);\n letter-spacing: var(--typography-letterspacing-negative-half);\n}\n\n.panel-tools__view--active {\n display: block;\n}\n\n/* Rail — mirrors collapsed panel-nav width, padding, and item rhythm. */\n.panel-tools__rail {\n flex: 0 0 var(--_panel-tools-rail-width);\n width: var(--_panel-tools-rail-width);\n min-width: var(--_panel-tools-rail-width);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n height: 100%;\n min-height: 0;\n border-left: var(--_panel-tools-border);\n background-color: transparent;\n}\n\n.panel-tools__rail-header {\n justify-content: center;\n height: var(--dimension-size-600);\n flex-shrink: 0;\n border-bottom: var(--_panel-tools-border);\n}\n\n.panel-tools__rail-body {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.panel-tools__rail-actions {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n width: 100%;\n}\n\n/* Flush to the bottom of the rail — mirrors Search header pin. */\n.panel-tools__rail-footer {\n justify-content: center;\n flex-shrink: 0;\n margin-top: auto;\n}\n\n.panel-tools__rail-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: var(--ds-control-height);\n flex-shrink: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host(.panel-tools--ready.panel-tools--motion-opening) .panel-tools__drawer,\n :host(.panel-tools--ready.panel-tools--motion-closing) .panel-tools__drawer {\n transition: none;\n }\n}\n","import {\n Component,\n Prop,\n Event,\n EventEmitter,\n Element,\n State,\n Watch,\n Method,\n Listen,\n h,\n Host,\n} from '@stencil/core';\nimport type { ChromeTransitionDetail } from '../../shell/chrome-transition';\nimport {\n PANEL_TOOLS_LABELS,\n PANEL_TOOLS_SHORTCUTS,\n type PanelToolsHeaderAction,\n type PanelToolsHeaderConfig,\n type PanelToolsHeaders,\n type PanelToolsItem,\n type PanelToolsToolId,\n} from './panel-tools-types';\nimport {\n isPanelToolsToolId,\n orderPanelToolsItems,\n panelToolsDrawerAtTerminal,\n panelToolsDrawerResting,\n panelToolsDrawerTransitionMs,\n panelToolsRailPlacement,\n reconcilePanelToolsAvailability,\n resolvePanelToolActivation,\n} from './panel-tools-utils';\n\n@Component({\n tag: 'ds-panel-tools',\n styleUrl: 'PanelTools.css',\n shadow: true,\n})\nexport class PanelTools {\n @Element() el!: HTMLElement;\n\n /** When false, only the icon rail is shown. */\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n\n /** Drawer presentation or viewport-covering presentation for the active tool. */\n @Prop({ mutable: true, reflect: true }) presentation: 'drawer' | 'fullscreen' = 'drawer';\n\n /** Let a fullscreen product supply independent master/detail headers inside its view. */\n @Prop({ attribute: 'fullscreen-header-mode', reflect: true })\n fullscreenHeaderMode: 'shared' | 'split' = 'shared';\n\n /** Active tool view — `search`, `agents`, `messages`, `stacks`, `activity`, or `help`. */\n @Prop({ mutable: true, attribute: 'active-tool', reflect: true })\n activeTool: PanelToolsToolId | '' = '';\n\n /**\n * Rail items rendered in the right column.\n * Set via JS property: `el.items = [...]`. Replace the array reference to update.\n */\n @Prop() items: PanelToolsItem[] = [];\n\n @Prop() toolsLabel: string = 'Tools';\n @Prop() toolShortcutsLabel: string = 'Tool shortcuts';\n\n /** Active header state per tool. Replace the object when title, depth, or actions change. */\n @Prop() headers: PanelToolsHeaders = {};\n\n /**\n * Optional localStorage key for the last active tool. The drawer always starts\n * closed; only the tool identity is restored for continuity within this browser.\n */\n @Prop({ attribute: 'storage-key' }) storageKey: string = '';\n\n /** Emitted when a rail button is toggled. Detail = { id, selected }. */\n @Event({ bubbles: true, composed: true }) dsToolChange!: EventEmitter<{\n id: PanelToolsToolId;\n selected: boolean;\n }>;\n\n /** Emitted when fullscreen changes, including Escape-initiated exits. */\n @Event({ bubbles: true, composed: true }) dsPresentationChange!: EventEmitter<{\n presentation: 'drawer' | 'fullscreen';\n }>;\n\n /** Requests navigation to the active tool's parent view. */\n @Event({ bubbles: true, composed: true }) dsHeaderBack!: EventEmitter<{\n tool: PanelToolsToolId;\n }>;\n\n /** Requests one application-owned action from the active tool header. */\n @Event({ bubbles: true, composed: true }) dsHeaderAction!: EventEmitter<{\n tool: PanelToolsToolId;\n id: string;\n }>;\n\n /** Bubbling lifecycle — `ds-bar-nav` defers overflow checks during drawer motion. */\n @Event({ bubbles: true, composed: true })\n dsChromeTransitionStart!: EventEmitter<ChromeTransitionDetail>;\n\n @Event({ bubbles: true, composed: true })\n dsChromeTransitionEnd!: EventEmitter<ChromeTransitionDetail>;\n\n /** Arms open vs close easing for the in-flight width transition. */\n @State() private motion: 'opening' | 'closing' | 'idle' = 'idle';\n\n /** Keeps header and slotted content painted until the closing clip transition completes. */\n @State() private drawerSurfaceRetained = false;\n\n /** Suppresses width transition until the host has painted its initial open state. */\n @State() private readyForMotion = false;\n\n /** Fullscreen presentation changes snap without borrowing drawer width motion. */\n @State() private presentationMotionSuppressed = false;\n\n @State() private rovingIndex = 0;\n @State() private fullViewToolIds: PanelToolsToolId[] = [];\n @State() private railBodyScrollable = false;\n\n private motionEnableGeneration = 0;\n private presentationMotionGeneration = 0;\n private transitionGeneration = 0;\n private transitionFallbackTimer: number | null = null;\n /** Ignores the old transition's terminal event when reversing direction. */\n private ignoreReplacementTerminal = false;\n private focusBeforeFullscreen: HTMLElement | null = null;\n private fullViewObserver: MutationObserver | null = null;\n private railBodyEl?: HTMLElement;\n private railBodyObserver?: ResizeObserver;\n\n private get railItems(): PanelToolsItem[] {\n return this.items ?? [];\n }\n\n private get orderedRailItems(): PanelToolsItem[] {\n return orderPanelToolsItems(this.railItems);\n }\n\n disconnectedCallback() {\n this.el.removeEventListener('transitionend', this.handleTransitionEnd);\n this.el.removeEventListener('transitioncancel', this.handleTransitionEnd);\n this.el.removeEventListener('dsAction', this.handleComposedHeaderAction);\n this.clearTransitionCompletion();\n this.motionEnableGeneration += 1;\n this.fullViewObserver?.disconnect();\n this.fullViewObserver = null;\n this.disconnectRailBodyObserver();\n }\n\n @Watch('presentation')\n presentationChanged(next: 'drawer' | 'fullscreen', previous?: 'drawer' | 'fullscreen') {\n if (next === previous) return;\n // Framework property bindings can update slotted master/detail content in\n // the same render that requests fullscreen. Reflect the host selector\n // immediately so that content cannot paint once in the drawer geometry\n // while Stencil waits to commit its next render.\n if (this.el.getAttribute('presentation') !== next) {\n this.el.setAttribute('presentation', next);\n }\n const presentationGeneration = ++this.presentationMotionGeneration;\n this.presentationMotionSuppressed = true;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (presentationGeneration !== this.presentationMotionGeneration) return;\n this.presentationMotionSuppressed = false;\n });\n });\n if (next === 'fullscreen') {\n this.focusBeforeFullscreen =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n this.open = true;\n } else if (previous === 'fullscreen') {\n const focusBeforeFullscreen = this.focusBeforeFullscreen;\n const fallbackActionId = this.activeHeader().actions?.[0]?.id;\n requestAnimationFrame(async () => {\n if (focusBeforeFullscreen?.isConnected) {\n focusBeforeFullscreen.focus({ preventScroll: true });\n }\n const focusRestored = focusBeforeFullscreen\n ? document.activeElement === focusBeforeFullscreen ||\n focusBeforeFullscreen.contains(document.activeElement)\n : false;\n if (!focusRestored && fallbackActionId) await this.focusHeaderAction(fallbackActionId);\n this.focusBeforeFullscreen = null;\n });\n }\n this.dsPresentationChange.emit({ presentation: next });\n }\n\n @Listen('keydown', { target: 'window', capture: true })\n handleFullscreenEscape(event: KeyboardEvent) {\n if (this.presentation !== 'fullscreen' || event.key !== 'Escape') return;\n event.preventDefault();\n event.stopPropagation();\n this.presentation = 'drawer';\n }\n\n private deferMotionEnable() {\n if (this.readyForMotion) return;\n const generation = ++this.motionEnableGeneration;\n requestAnimationFrame(() => {\n if (generation !== this.motionEnableGeneration) return;\n requestAnimationFrame(() => {\n if (generation !== this.motionEnableGeneration) return;\n this.readyForMotion = true;\n });\n });\n }\n\n connectedCallback() {\n this.el.addEventListener('transitionend', this.handleTransitionEnd);\n this.el.addEventListener('transitioncancel', this.handleTransitionEnd);\n this.el.addEventListener('dsAction', this.handleComposedHeaderAction);\n }\n\n private handleComposedHeaderAction = (event: Event) => {\n const detail = (event as CustomEvent<{ id?: string }>).detail;\n if (!this.activeTool || !detail?.id) return;\n event.stopPropagation();\n this.dsHeaderAction.emit({ tool: this.activeTool, id: detail.id });\n };\n\n componentWillLoad() {\n this.restoreLastActiveTool();\n this.drawerSurfaceRetained = this.open;\n }\n\n @Watch('open')\n openChanged(isOpen: boolean, wasOpen?: boolean) {\n if (isOpen) this.drawerSurfaceRetained = true;\n if (this.readyForMotion && wasOpen !== undefined && wasOpen !== isOpen) {\n this.startDrawerTransition(isOpen ? 'opening' : 'closing');\n } else if (!isOpen) {\n this.drawerSurfaceRetained = false;\n }\n this.deferMotionEnable();\n }\n\n @Watch('activeTool')\n activeToolChanged() {\n this.persistLastActiveTool();\n this.deferMotionEnable();\n }\n\n @Watch('storageKey')\n storageKeyChanged() {\n this.restoreLastActiveTool();\n }\n\n componentDidLoad() {\n this.deferMotionEnable();\n this.connectRailBodyObserver();\n this.updateRailBodyScrollable();\n this.syncFullViewTools();\n this.fullViewObserver = new MutationObserver(() => this.syncFullViewTools());\n this.fullViewObserver.observe(this.el, {\n childList: true,\n attributes: true,\n attributeFilter: ['slot'],\n });\n }\n\n componentDidRender() {\n this.updateRailBodyScrollable();\n }\n\n private connectRailBodyObserver() {\n this.disconnectRailBodyObserver();\n if (!this.railBodyEl || typeof ResizeObserver === 'undefined') return;\n this.railBodyObserver = new ResizeObserver(() => this.updateRailBodyScrollable());\n this.railBodyObserver.observe(this.railBodyEl);\n }\n\n private disconnectRailBodyObserver() {\n this.railBodyObserver?.disconnect();\n this.railBodyObserver = undefined;\n }\n\n private updateRailBodyScrollable() {\n const next = Boolean(\n this.railBodyEl && this.railBodyEl.scrollHeight > this.railBodyEl.clientHeight + 1\n );\n if (next !== this.railBodyScrollable) this.railBodyScrollable = next;\n }\n\n @Watch('items')\n itemsChanged() {\n this.rovingIndex = 0;\n this.reconcileActiveTool();\n this.deferMotionEnable();\n }\n\n private restoreLastActiveTool() {\n if (!this.storageKey || this.activeTool) return;\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (isPanelToolsToolId(stored)) this.activeTool = stored;\n } catch {\n /* localStorage unavailable */\n }\n }\n\n private persistLastActiveTool() {\n if (!this.storageKey || !this.activeTool) return;\n try {\n localStorage.setItem(this.storageKey, this.activeTool);\n } catch {\n /* unavailable */\n }\n }\n\n private clearPersistedTool() {\n if (!this.storageKey) return;\n try {\n localStorage.removeItem(this.storageKey);\n } catch {\n /* unavailable */\n }\n }\n\n private reconcileActiveTool() {\n const next = reconcilePanelToolsAvailability(this.railItems, this.open, this.activeTool);\n if (!next.removedTool) return;\n this.clearPersistedTool();\n this.open = next.open;\n this.activeTool = next.activeTool;\n this.dsToolChange.emit({ id: next.removedTool, selected: false });\n }\n\n private startDrawerTransition(phase: 'opening' | 'closing') {\n const drawer = this.renderRoot.querySelector('.panel-tools__drawer') as HTMLElement | null;\n if (this.motion !== 'idle') {\n this.finishDrawerTransition();\n this.ignoreReplacementTerminal = true;\n }\n this.motion = phase;\n this.dsChromeTransitionStart.emit({ source: 'panel-tools', phase });\n const generation = ++this.transitionGeneration;\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (generation !== this.transitionGeneration || this.motion !== phase) return;\n if (!drawer) {\n this.finishDrawerTransition();\n return;\n }\n\n if (this.drawerTransitionAtTerminal(drawer, phase)) {\n this.finishDrawerTransition();\n return;\n }\n\n const fallbackMs = panelToolsDrawerTransitionMs(getComputedStyle(drawer));\n if (fallbackMs <= 0) {\n this.finishDrawerTransition();\n return;\n }\n this.transitionFallbackTimer = window.setTimeout(() => {\n this.finishDrawerTransition();\n }, fallbackMs);\n });\n });\n }\n\n private handleTransitionEnd = (event: TransitionEvent) => {\n const drawer = this.renderRoot.querySelector('.panel-tools__drawer') as HTMLElement | null;\n if (event.target !== drawer) return;\n if (event.propertyName !== 'max-width') return;\n if (this.ignoreReplacementTerminal) {\n this.ignoreReplacementTerminal = false;\n return;\n }\n // Changing from the neutral transition recipe to the direction-specific\n // easing can cancel the transition that the reflected `open` class began.\n // The replacement transition and its watchdog still own completion; ending\n // motion here would hide the fixed-width tool surface while it is visible.\n if (event.type === 'transitioncancel') return;\n if (drawer && !this.drawerTransitionAtTerminal(drawer, this.motion)) return;\n this.finishDrawerTransition();\n };\n\n private drawerTransitionAtTerminal(\n drawer: HTMLElement,\n phase: 'opening' | 'closing' | 'idle'\n ): boolean {\n const width = drawer.getBoundingClientRect().width;\n const surface = drawer.querySelector('.panel-tools__drawer-surface') as HTMLElement | null;\n const targetWidth = surface?.getBoundingClientRect().width ?? 0;\n return panelToolsDrawerAtTerminal(width, targetWidth, phase);\n }\n\n private finishDrawerTransition() {\n const completedPhase = this.motion;\n const wasTransitioning = completedPhase !== 'idle';\n this.clearTransitionCompletion();\n if (!wasTransitioning) return;\n this.ignoreReplacementTerminal = false;\n this.motion = 'idle';\n if (completedPhase === 'closing' && !this.open) {\n this.drawerSurfaceRetained = false;\n }\n this.dsChromeTransitionEnd.emit({ source: 'panel-tools' });\n }\n\n private clearTransitionCompletion() {\n this.transitionGeneration += 1;\n if (this.transitionFallbackTimer !== null) {\n window.clearTimeout(this.transitionFallbackTimer);\n this.transitionFallbackTimer = null;\n }\n }\n\n /** Rail selection follows `open` immediately — independent of the slide animation. */\n private isRailSelected(id: PanelToolsToolId): boolean {\n return this.open && this.activeTool === id;\n }\n\n /** Drawer body stays mounted while the clip frame animates closed. */\n private isDrawerPresent(): boolean {\n return this.open || this.drawerSurfaceRetained;\n }\n\n private isViewActive(id: PanelToolsToolId): boolean {\n return this.isDrawerPresent() && this.activeTool === id;\n }\n\n private hasFullView(id: PanelToolsToolId): boolean {\n return this.fullViewToolIds.includes(id);\n }\n\n private syncFullViewTools() {\n const ids = this.orderedRailItems.map(item => item.id);\n const next = ids.filter(id => Boolean(this.el.querySelector(`[slot=\"${id}-view\"]`)));\n if (next.join('|') !== this.fullViewToolIds.join('|')) this.fullViewToolIds = next;\n }\n\n private get renderRoot(): ParentNode {\n return this.el.shadowRoot ?? this.el;\n }\n\n private headerLabel(): string {\n if (!this.isDrawerPresent() || !this.activeTool) return '';\n const item = this.railItems.find(candidate => candidate.id === this.activeTool);\n return (\n item?.label ??\n PANEL_TOOLS_LABELS[this.activeTool as keyof typeof PANEL_TOOLS_LABELS] ??\n this.activeTool\n );\n }\n\n private resolvedHeaders(): PanelToolsHeaders {\n return this.headers ?? {};\n }\n\n private activeHeader(): PanelToolsHeaderConfig {\n if (!this.activeTool) return {};\n return this.resolvedHeaders()[this.activeTool] ?? {};\n }\n\n private handleToolChange = (id: PanelToolsToolId) => {\n const next = resolvePanelToolActivation(this.open, this.activeTool, id);\n this.open = next.open;\n this.activeTool = next.activeTool;\n this.dsToolChange.emit({ id, selected: next.selected });\n };\n\n /** Toggle any rail tool open/closed — shell shortcuts K/A/S/M/N call this. */\n @Method()\n async activateTool(id: PanelToolsToolId) {\n const item = this.railItems.find(entry => entry.id === id);\n if (!item || item.isInactive) return;\n this.handleToolChange(id);\n }\n\n /** Close the tools drawer when open — used by shell keyboard shortcuts. */\n @Method()\n async closeDrawer() {\n if (!this.open) return;\n const id = this.activeTool;\n this.open = false;\n if (id) {\n this.dsToolChange.emit({ id, selected: false });\n }\n }\n\n /** Focus an active tool-header action by its application-owned id. */\n @Method()\n async focusHeaderAction(id: string) {\n const action = this.renderRoot.querySelector(`[data-header-action-id=\"${CSS.escape(id)}\"]`) as\n | (HTMLElement & { setFocus?: () => Promise<void> })\n | null;\n await action?.setFocus?.();\n }\n\n private focusRailAt(index: number) {\n const items = this.orderedRailItems;\n if (!items.length) return;\n const bounded = Math.max(0, Math.min(index, items.length - 1));\n if (bounded === this.rovingIndex) return;\n this.rovingIndex = bounded;\n const actions = Array.from(\n this.renderRoot.querySelectorAll<HTMLElement>('.panel-tools__rail-action .button-icon')\n );\n actions[bounded]?.focus({ preventScroll: true });\n }\n\n private handleRailKeyDown = (e: KeyboardEvent, index: number) => {\n const items = this.orderedRailItems;\n if (!items.length) return;\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.handleToolChange(items[index].id);\n return;\n }\n\n if (e.key === 'ArrowDown') {\n if (index >= items.length - 1) return;\n e.preventDefault();\n this.focusRailAt(index + 1);\n return;\n }\n\n if (e.key === 'ArrowUp') {\n if (index <= 0) return;\n e.preventDefault();\n this.focusRailAt(index - 1);\n }\n };\n\n private renderRailAction(item: PanelToolsItem, index: number) {\n const label =\n item.ariaLabel ??\n item.label ??\n PANEL_TOOLS_LABELS[item.id as keyof typeof PANEL_TOOLS_LABELS] ??\n item.id;\n return (\n <ds-tooltip\n key={item.id}\n label={label}\n shortcutKey={\n item.shortcutKey ??\n PANEL_TOOLS_SHORTCUTS[item.id as keyof typeof PANEL_TOOLS_SHORTCUTS]\n }\n side=\"left\"\n size=\"sm\"\n >\n <ds-button-unfilled\n variant=\"icon\"\n class=\"panel-tools__rail-action\"\n icon={item.icon}\n isActive={this.isRailSelected(item.id)}\n activeFill={false}\n hasBorder={false}\n pressScale={false}\n dot={item.dot ?? false}\n isInactive={item.isInactive}\n focusTabIndex={index === this.rovingIndex ? 0 : -1}\n aria-label={label}\n pressed={this.isRailSelected(item.id)}\n onFocusin={() => {\n this.rovingIndex = index;\n }}\n onKeyDown={(e: KeyboardEvent) => this.handleRailKeyDown(e, index)}\n onDsClick={() => this.handleToolChange(item.id)}\n />\n </ds-tooltip>\n );\n }\n\n render() {\n const headerLabel = this.headerLabel();\n const header = this.activeHeader();\n const headerTitle = header.title?.trim() || headerLabel;\n const headerActions = header.actions ?? [];\n const orderedRailItems = this.orderedRailItems;\n const headerItems = orderedRailItems.filter(\n item => panelToolsRailPlacement(item) === 'header'\n );\n const bodyItems = orderedRailItems.filter(\n item => panelToolsRailPlacement(item) === 'body'\n );\n const footerItems = orderedRailItems.filter(\n item => panelToolsRailPlacement(item) === 'footer'\n );\n const headerCount = headerItems.length;\n const footerStart = headerCount + bodyItems.length;\n const showDrawerChrome = this.isDrawerPresent();\n const drawerResting = panelToolsDrawerResting(this.open, this.motion);\n const activeFullView = Boolean(\n showDrawerChrome && this.activeTool && this.hasFullView(this.activeTool)\n );\n const toolIds = orderedRailItems.map(item => item.id);\n\n return (\n <Host\n class={{\n 'panel-tools': true,\n 'panel-tools--open': this.open,\n 'panel-tools--ready': this.readyForMotion,\n 'panel-tools--motion-opening': this.motion === 'opening',\n 'panel-tools--motion-closing': this.motion === 'closing',\n 'panel-tools--drawer-resting': drawerResting,\n 'panel-tools--fullscreen': this.presentation === 'fullscreen',\n 'panel-tools--presentation-snap': this.presentationMotionSuppressed,\n }}\n role={this.presentation === 'fullscreen' ? 'dialog' : 'complementary'}\n aria-modal={this.presentation === 'fullscreen' ? 'true' : undefined}\n aria-label={this.toolsLabel}\n >\n <div class=\"panel-tools__layout\">\n <nav class=\"panel-tools__rail\" aria-label={this.toolShortcutsLabel}>\n {headerItems.length ? (\n <div class=\"panel-tools__rail-header ds-chrome-row ds-chrome-space--md\">\n {headerItems.map((item, index) => this.renderRailAction(item, index))}\n </div>\n ) : null}\n <div\n class={{\n 'panel-tools__rail-body': true,\n 'ds-chrome-column': true,\n 'ds-chrome-space--md': true,\n 'ds-scrollbar-hidden': true,\n 'ds-focus-ring': this.railBodyScrollable,\n }}\n ref={element => {\n const next = (element as HTMLElement) ?? undefined;\n if (next === this.railBodyEl) return;\n this.railBodyEl = next;\n this.connectRailBodyObserver();\n }}\n role={this.railBodyScrollable ? 'region' : undefined}\n aria-label={this.railBodyScrollable ? this.toolShortcutsLabel : undefined}\n tabIndex={this.railBodyScrollable ? 0 : undefined}\n >\n <div class=\"panel-tools__rail-actions\">\n {bodyItems.map((item, bodyIdx) =>\n this.renderRailAction(item, headerCount + bodyIdx)\n )}\n </div>\n </div>\n {footerItems.length ? (\n <div class=\"panel-tools__rail-footer ds-chrome-row ds-chrome-space--md\">\n {footerItems.map((item, footerIdx) =>\n this.renderRailAction(item, footerStart + footerIdx)\n )}\n </div>\n ) : null}\n </nav>\n\n <div\n class={{\n 'panel-tools__drawer': true,\n 'panel-tools__drawer--visible': showDrawerChrome,\n }}\n aria-hidden={showDrawerChrome ? null : 'true'}\n inert={showDrawerChrome ? undefined : true}\n >\n <div class=\"panel-tools__drawer-surface\">\n {this.presentation !== 'fullscreen' || this.fullscreenHeaderMode === 'shared' ? (\n <ds-panel-tool-header\n class=\"panel-tools__header\"\n heading={headerTitle}\n showBack={header.showBack ?? false}\n backIcon={header.backIcon || 'ChevronLeft'}\n backAriaLabel={header.backAriaLabel || 'Back'}\n showMenu={false}\n ref={element => {\n const toolHeader = element as\n | (HTMLDsPanelToolHeaderElement & {\n actions: PanelToolsHeaderAction[];\n })\n | undefined;\n if (toolHeader) toolHeader.actions = headerActions;\n }}\n onDsBack={() => {\n if (this.activeTool) this.dsHeaderBack.emit({ tool: this.activeTool });\n }}\n />\n ) : null}\n <div class=\"panel-tools__body\" hidden={activeFullView}>\n {toolIds.map(id => {\n const active = this.isViewActive(id);\n return (\n <div\n class={{\n 'panel-tools__view': true,\n 'panel-tools__view--active': active,\n }}\n hidden={!active}\n >\n <slot name={id} />\n </div>\n );\n })}\n </div>\n <div class=\"panel-tools__full-views\" hidden={!activeFullView}>\n {toolIds.map(id => (\n <div\n class={{\n 'panel-tools__full-view': true,\n 'panel-tools__full-view--active':\n this.isViewActive(id) && this.hasFullView(id),\n }}\n hidden={!(this.isViewActive(id) && this.hasFullView(id))}\n >\n <slot name={`${id}-view`} />\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}