@ds-mo/ui 14.18.1 → 14.19.1

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 (359) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +16 -9
  4. package/dist/angular/ds-pagination.d.ts +1 -1
  5. package/dist/angular/ds-pagination.js +3 -3
  6. package/dist/components/ds-agent-activity.js +1 -1
  7. package/dist/components/ds-agent-questionnaire.js +1 -1
  8. package/dist/components/ds-agent-response.js +1 -1
  9. package/dist/components/ds-agent-source-list.js +1 -1
  10. package/dist/components/ds-agent-tool-call.js +1 -1
  11. package/dist/components/ds-attachment-list.js +1 -1
  12. package/dist/components/ds-avatar.js +1 -1
  13. package/dist/components/ds-badge.js +1 -1
  14. package/dist/components/ds-banner.js +1 -1
  15. package/dist/components/ds-banner.js.map +1 -1
  16. package/dist/components/ds-bar-action.js +1 -1
  17. package/dist/components/ds-bar-action.js.map +1 -1
  18. package/dist/components/ds-bar-nav.js +1 -1
  19. package/dist/components/ds-bar-title.js +1 -1
  20. package/dist/components/ds-bar-workflow.js +1 -1
  21. package/dist/components/ds-bar-workflow.js.map +1 -1
  22. package/dist/components/ds-breadcrumb.js +1 -1
  23. package/dist/components/ds-button-filled.js +1 -1
  24. package/dist/components/ds-button-unfilled.js +1 -1
  25. package/dist/components/ds-card-chart.js +1 -1
  26. package/dist/components/ds-card-chart.js.map +1 -1
  27. package/dist/components/ds-card-overview.js +1 -1
  28. package/dist/components/ds-card-overview.js.map +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-legend.js.map +1 -1
  33. package/dist/components/ds-chart.js +1 -1
  34. package/dist/components/ds-chart.js.map +1 -1
  35. package/dist/components/ds-checkbox.js +1 -1
  36. package/dist/components/ds-chip.js +1 -1
  37. package/dist/components/ds-chip.js.map +1 -1
  38. package/dist/components/ds-code-block.js +1 -1
  39. package/dist/components/ds-conversation-list-item.js +1 -1
  40. package/dist/components/ds-conversation-list-item.js.map +1 -1
  41. package/dist/components/ds-conversation-list-section.js +1 -1
  42. package/dist/components/ds-conversation-list.js +1 -1
  43. package/dist/components/ds-conversation-list.js.map +1 -1
  44. package/dist/components/ds-divider.js +1 -1
  45. package/dist/components/ds-empty-state.js +1 -1
  46. package/dist/components/ds-field.js +1 -1
  47. package/dist/components/ds-filter-menu.js +1 -1
  48. package/dist/components/ds-icon.js +1 -1
  49. package/dist/components/ds-input.js +1 -1
  50. package/dist/components/ds-loader.js +1 -1
  51. package/dist/components/ds-markdown.js +1 -1
  52. package/dist/components/ds-menu.js +1 -1
  53. package/dist/components/ds-message-actions.js +1 -1
  54. package/dist/components/ds-message-bubble.js +1 -1
  55. package/dist/components/ds-message-bubble.js.map +1 -1
  56. package/dist/components/ds-message-composer.js +1 -1
  57. package/dist/components/ds-message-composer.js.map +1 -1
  58. package/dist/components/ds-message-scroller.js +1 -1
  59. package/dist/components/ds-message-scroller.js.map +1 -1
  60. package/dist/components/ds-message.js +1 -1
  61. package/dist/components/ds-mobile-bar-nav.js +1 -1
  62. package/dist/components/ds-mobile-header.js +1 -1
  63. package/dist/components/ds-mobile-section-switcher.js +1 -1
  64. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  65. package/dist/components/ds-modal.js +1 -1
  66. package/dist/components/ds-pagination.js +1 -1
  67. package/dist/components/ds-panel-nav.js +1 -1
  68. package/dist/components/ds-panel-sub-nav.js +1 -1
  69. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  70. package/dist/components/ds-panel-tool-header.js +1 -1
  71. package/dist/components/ds-panel-tool-search.js +1 -1
  72. package/dist/components/ds-panel-tool-search.js.map +1 -1
  73. package/dist/components/ds-panel-tools.js +1 -1
  74. package/dist/components/ds-paper-texture.js +1 -1
  75. package/dist/components/ds-radio.js +1 -1
  76. package/dist/components/ds-scroll-overlay.js +1 -1
  77. package/dist/components/ds-scroll-overlay.js.map +1 -1
  78. package/dist/components/ds-select.js +1 -1
  79. package/dist/components/ds-shell-app.js +1 -1
  80. package/dist/components/ds-shell-app.js.map +1 -1
  81. package/dist/components/ds-shell-page.js +1 -1
  82. package/dist/components/ds-shell-tools.js +1 -1
  83. package/dist/components/ds-skeleton.js +1 -1
  84. package/dist/components/ds-slider.js +1 -1
  85. package/dist/components/ds-slider.js.map +1 -1
  86. package/dist/components/ds-swatch-picker.js +1 -1
  87. package/dist/components/ds-switch.js +1 -1
  88. package/dist/components/ds-tab-group.js +1 -1
  89. package/dist/components/ds-table-filter.js +1 -1
  90. package/dist/components/ds-table-saved-views.js +1 -1
  91. package/dist/components/ds-table-sort.js +1 -1
  92. package/dist/components/ds-table-sort.js.map +1 -1
  93. package/dist/components/ds-table-toolbar.js +1 -1
  94. package/dist/components/ds-table.js +1 -1
  95. package/dist/components/ds-table.js.map +1 -1
  96. package/dist/components/ds-tag.js +1 -1
  97. package/dist/components/ds-text.js +1 -1
  98. package/dist/components/ds-toast.js +1 -1
  99. package/dist/components/ds-toast.js.map +1 -1
  100. package/dist/components/ds-tooltip-chart.js +1 -1
  101. package/dist/components/ds-tooltip.js +1 -1
  102. package/dist/components/ds-typing-indicator.js +1 -1
  103. package/dist/components/p-0XTyQNRG.js +2 -0
  104. package/dist/components/{p-JPTkZ3Ji.js.map → p-0XTyQNRG.js.map} +1 -1
  105. package/dist/components/{p-DFQ9mcbK.js → p-1YHFQeI7.js} +1 -1
  106. package/dist/components/p-1YHFQeI7.js.map +1 -0
  107. package/dist/components/p-B-HsfQOK.js +2 -0
  108. package/dist/components/p-B-HsfQOK.js.map +1 -0
  109. package/dist/components/p-B4wTnsUL.js +2 -0
  110. package/dist/components/p-B4wTnsUL.js.map +1 -0
  111. package/dist/components/p-B6WQre5D.js +2 -0
  112. package/dist/components/p-B6WQre5D.js.map +1 -0
  113. package/dist/components/{p-B1JRCDHS.js → p-BHhmB9-4.js} +2 -2
  114. package/dist/components/{p-B1JRCDHS.js.map → p-BHhmB9-4.js.map} +1 -1
  115. package/dist/components/{p-CqQFowZd.js → p-BNq9fr9S.js} +2 -2
  116. package/dist/components/p-BNq9fr9S.js.map +1 -0
  117. package/dist/components/{p-BKp__CQX.js → p-BWwiCvep.js} +2 -2
  118. package/dist/components/p-BWwiCvep.js.map +1 -0
  119. package/dist/components/{p-BBG6Sswb.js → p-BYFS2qWb.js} +2 -2
  120. package/dist/components/{p-BBG6Sswb.js.map → p-BYFS2qWb.js.map} +1 -1
  121. package/dist/components/{p-uI6z53BE.js → p-Bb4KnRy0.js} +2 -2
  122. package/dist/components/{p-HB_cf_aR.js → p-BeA6Jv-3.js} +2 -2
  123. package/dist/components/{p-HB_cf_aR.js.map → p-BeA6Jv-3.js.map} +1 -1
  124. package/dist/components/{p-1Hu9jlju.js → p-Bf7PZJPT.js} +2 -2
  125. package/dist/components/{p-Bbb9A3NV.js → p-BjRD57w3.js} +2 -2
  126. package/dist/components/p-BjRD57w3.js.map +1 -0
  127. package/dist/components/{p-CKVHrOEp.js → p-BmlGeaY8.js} +2 -2
  128. package/dist/components/p-BmlGeaY8.js.map +1 -0
  129. package/dist/components/{p-CLVxgTme.js → p-BubgDQlb.js} +2 -2
  130. package/dist/components/p-BubgDQlb.js.map +1 -0
  131. package/dist/components/{p-BNkU9dcc.js → p-Bv6FSDPR.js} +2 -2
  132. package/dist/components/{p-BNkU9dcc.js.map → p-Bv6FSDPR.js.map} +1 -1
  133. package/dist/components/p-Bx1IHqJb.js +2 -0
  134. package/dist/components/p-Bx1IHqJb.js.map +1 -0
  135. package/dist/components/{p-D3fMaUJ3.js → p-Bx5BSd6F.js} +2 -2
  136. package/dist/components/p-Bx5BSd6F.js.map +1 -0
  137. package/dist/components/{p-B8q-6a03.js → p-C0qN3PSb.js} +1 -1
  138. package/dist/components/{p-B8q-6a03.js.map → p-C0qN3PSb.js.map} +1 -1
  139. package/dist/components/{p-H5T258T-.js → p-CFsLF-ts.js} +2 -2
  140. package/dist/components/p-CFsLF-ts.js.map +1 -0
  141. package/dist/components/p-CKtJ6FHM.js +2 -0
  142. package/dist/components/p-CKtJ6FHM.js.map +1 -0
  143. package/dist/components/p-CRSwNbPk.js +2 -0
  144. package/dist/components/p-CRSwNbPk.js.map +1 -0
  145. package/dist/components/{p-BFfLvMZd.js → p-Cea7rROU.js} +2 -2
  146. package/dist/components/{p-BFfLvMZd.js.map → p-Cea7rROU.js.map} +1 -1
  147. package/dist/components/{p-B0Byw6OX.js → p-CgGcgMjs.js} +1 -1
  148. package/dist/components/{p-B0Byw6OX.js.map → p-CgGcgMjs.js.map} +1 -1
  149. package/dist/components/{p-C-Y7gYgz.js → p-ChfVRPHw.js} +2 -2
  150. package/dist/components/p-ChfVRPHw.js.map +1 -0
  151. package/dist/components/{p-CJq3n5kA.js → p-Ck1hgD6g.js} +2 -2
  152. package/dist/components/p-Ck1hgD6g.js.map +1 -0
  153. package/dist/components/{p-BMc0DE59.js → p-CochmPyg.js} +1 -1
  154. package/dist/components/p-CochmPyg.js.map +1 -0
  155. package/dist/components/{p-iMuFgSoM.js → p-Cp5Hr7Vz.js} +2 -2
  156. package/dist/components/p-Cp5Hr7Vz.js.map +1 -0
  157. package/dist/components/p-CpUXubax.js +2 -0
  158. package/dist/components/{p-DtndC9f1.js.map → p-CpUXubax.js.map} +1 -1
  159. package/dist/components/p-Crz606uD.js +2 -0
  160. package/dist/components/p-Crz606uD.js.map +1 -0
  161. package/dist/components/p-Cxr0IQjC.js.map +1 -1
  162. package/dist/components/p-D-MWvpg6.js +2 -0
  163. package/dist/components/p-D-MWvpg6.js.map +1 -0
  164. package/dist/components/{p-Bu3dOjpW.js → p-D7v6Na7U.js} +2 -2
  165. package/dist/components/{p-Bu3dOjpW.js.map → p-D7v6Na7U.js.map} +1 -1
  166. package/dist/components/{p-C6DNhlES.js → p-DA5H_Iq_.js} +1 -1
  167. package/dist/components/p-DA5H_Iq_.js.map +1 -0
  168. package/dist/components/p-DBYCwq9L.js +2 -0
  169. package/dist/components/{p-BXN-e7vF.js.map → p-DBYCwq9L.js.map} +1 -1
  170. package/dist/components/{p-CY4YFAT3.js → p-DCbKsABt.js} +1 -1
  171. package/dist/components/p-DCbKsABt.js.map +1 -0
  172. package/dist/components/{p-C6R5Lft0.js → p-DFC0sRM-.js} +2 -2
  173. package/dist/components/p-DFC0sRM-.js.map +1 -0
  174. package/dist/components/{p-CsBICYmt.js → p-DGkn8FwV.js} +2 -2
  175. package/dist/components/p-DGkn8FwV.js.map +1 -0
  176. package/dist/components/p-DIqT1m2r.js +2 -0
  177. package/dist/components/p-DIqT1m2r.js.map +1 -0
  178. package/dist/components/p-DKt_8s-U.js +2 -0
  179. package/dist/components/p-DKt_8s-U.js.map +1 -0
  180. package/dist/components/p-DOUk4KoT.js.map +1 -1
  181. package/dist/components/p-DQBT1Jkf.js +2 -0
  182. package/dist/components/p-DQBT1Jkf.js.map +1 -0
  183. package/dist/components/p-DW5Ita-P.js +2 -0
  184. package/dist/components/{p-DUdOmSFR.js.map → p-DW5Ita-P.js.map} +1 -1
  185. package/dist/components/{p-DNpLDbWY.js → p-DZ58Sg5a.js} +1 -1
  186. package/dist/components/p-DZ58Sg5a.js.map +1 -0
  187. package/dist/components/{p-DDgeXGbB.js → p-DZv2g9Pe.js} +2 -2
  188. package/dist/components/p-DZv2g9Pe.js.map +1 -0
  189. package/dist/components/{p-BknXYAEc.js → p-DdH7b4JF.js} +2 -2
  190. package/dist/components/p-DdH7b4JF.js.map +1 -0
  191. package/dist/components/{p-DBue3ISk.js → p-Demfba7T.js} +2 -2
  192. package/dist/components/p-Demfba7T.js.map +1 -0
  193. package/dist/components/p-Djxw2FjZ.js +2 -0
  194. package/dist/components/{p-CwjVgUqy.js.map → p-Djxw2FjZ.js.map} +1 -1
  195. package/dist/components/p-DmWoFSGs.js +2 -0
  196. package/dist/components/p-DmWoFSGs.js.map +1 -0
  197. package/dist/components/p-Do8wbFff.js +2 -0
  198. package/dist/components/p-Do8wbFff.js.map +1 -0
  199. package/dist/components/p-Drnyq8z7.js +2 -0
  200. package/dist/components/p-Drnyq8z7.js.map +1 -0
  201. package/dist/components/p-DsgEY6mZ.js +2 -0
  202. package/dist/components/p-DsgEY6mZ.js.map +1 -0
  203. package/dist/components/p-Is1lFmwp.js +2 -0
  204. package/dist/components/p-Is1lFmwp.js.map +1 -0
  205. package/dist/components/{p-BUDAwJVV.js → p-caLOcQUK.js} +2 -2
  206. package/dist/components/p-caLOcQUK.js.map +1 -0
  207. package/dist/components/{p-D1eEgwcP.js → p-etg-Uk1u.js} +1 -1
  208. package/dist/components/{p-D1eEgwcP.js.map → p-etg-Uk1u.js.map} +1 -1
  209. package/dist/components/{p-C9gC4haA.js → p-fRDzpfi9.js} +2 -2
  210. package/dist/components/p-fRDzpfi9.js.map +1 -0
  211. package/dist/components/{p-C-vRkDyn.js → p-rCeztgVn.js} +1 -1
  212. package/dist/components/{p-C-vRkDyn.js.map → p-rCeztgVn.js.map} +1 -1
  213. package/dist/components/{p-B_jZIC9R.js → p-vrotWZxt.js} +2 -2
  214. package/dist/components/{p-B_jZIC9R.js.map → p-vrotWZxt.js.map} +1 -1
  215. package/dist/docs/components.json +35 -6
  216. package/dist/lib/shell/index.d.ts +2 -2
  217. package/dist/lib/shell/index.js +8 -6
  218. package/dist/lib/shell/index.js.map +2 -2
  219. package/dist/lib/toast/index.js +1 -4
  220. package/dist/lib/toast/index.js.map +2 -2
  221. package/dist/lib/utils/index.d.ts +1 -1
  222. package/dist/lib/utils/index.js +104 -22
  223. package/dist/lib/utils/index.js.map +2 -2
  224. package/dist/mcp/cli.js +70 -31
  225. package/dist/mcp-data/registry/agent-activity.json +1 -1
  226. package/dist/mcp-data/registry/agent-questionnaire.json +3 -3
  227. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  228. package/dist/mcp-data/registry/agent-tool-call.json +2 -2
  229. package/dist/mcp-data/registry/attachment-list.json +1 -1
  230. package/dist/mcp-data/registry/badge.json +1 -1
  231. package/dist/mcp-data/registry/banner.json +2 -2
  232. package/dist/mcp-data/registry/bar-action.json +1 -1
  233. package/dist/mcp-data/registry/bar-nav.json +3 -3
  234. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  235. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  236. package/dist/mcp-data/registry/button-filled.json +1 -1
  237. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  238. package/dist/mcp-data/registry/card-chart.json +2 -2
  239. package/dist/mcp-data/registry/card-overview.json +3 -3
  240. package/dist/mcp-data/registry/card-setting.json +1 -1
  241. package/dist/mcp-data/registry/chart-legend.json +1 -1
  242. package/dist/mcp-data/registry/chart.json +1 -1
  243. package/dist/mcp-data/registry/checkbox.json +1 -1
  244. package/dist/mcp-data/registry/chip.json +1 -1
  245. package/dist/mcp-data/registry/code-block.json +1 -1
  246. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  247. package/dist/mcp-data/registry/conversation-list.json +2 -2
  248. package/dist/mcp-data/registry/divider.json +1 -1
  249. package/dist/mcp-data/registry/empty-state.json +1 -1
  250. package/dist/mcp-data/registry/field.json +1 -1
  251. package/dist/mcp-data/registry/filter-menu.json +1 -1
  252. package/dist/mcp-data/registry/icon.json +2 -2
  253. package/dist/mcp-data/registry/input.json +2 -2
  254. package/dist/mcp-data/registry/loader.json +1 -1
  255. package/dist/mcp-data/registry/menu.json +3 -3
  256. package/dist/mcp-data/registry/message-bubble.json +1 -1
  257. package/dist/mcp-data/registry/message-composer.json +2 -2
  258. package/dist/mcp-data/registry/message-scroller.json +3 -3
  259. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  260. package/dist/mcp-data/registry/mobile-header.json +2 -2
  261. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  262. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  263. package/dist/mcp-data/registry/modal.json +2 -2
  264. package/dist/mcp-data/registry/pagination.json +32 -11
  265. package/dist/mcp-data/registry/panel-nav.json +2 -2
  266. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  267. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  268. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  269. package/dist/mcp-data/registry/panel-tools.json +2 -2
  270. package/dist/mcp-data/registry/radio.json +1 -1
  271. package/dist/mcp-data/registry/registry.json +15 -8
  272. package/dist/mcp-data/registry/select.json +1 -1
  273. package/dist/mcp-data/registry/shell-app.json +2 -2
  274. package/dist/mcp-data/registry/shell-page.json +1 -1
  275. package/dist/mcp-data/registry/shell-tools.json +1 -1
  276. package/dist/mcp-data/registry/skeleton.json +2 -2
  277. package/dist/mcp-data/registry/slider.json +2 -2
  278. package/dist/mcp-data/registry/swatch-picker.json +3 -3
  279. package/dist/mcp-data/registry/switch.json +2 -2
  280. package/dist/mcp-data/registry/tab-group.json +2 -2
  281. package/dist/mcp-data/registry/table-sort.json +1 -1
  282. package/dist/mcp-data/registry/table.json +18 -18
  283. package/dist/mcp-data/registry/tag.json +2 -2
  284. package/dist/mcp-data/registry/text.json +4 -4
  285. package/dist/mcp-data/registry/toast.json +2 -2
  286. package/dist/mcp-data/registry/tooltip-chart.json +2 -2
  287. package/dist/mcp-data/registry/tooltip.json +2 -2
  288. package/dist/styles/prose.css +42 -38
  289. package/dist/styles/table.css +39 -67
  290. package/dist/types/components/CardSetting/index.d.ts +1 -1
  291. package/dist/types/components/Pagination/Pagination.d.ts +2 -0
  292. package/dist/types/components/Pagination/pagination-types.d.ts +2 -0
  293. package/dist/types/components/TooltipChart/index.d.ts +1 -1
  294. package/dist/types/components.d.ts +11 -0
  295. package/dist/types/shell/index.d.ts +2 -2
  296. package/dist/types/utils/index.d.ts +1 -1
  297. package/dist/vue/ds-pagination.js +1 -0
  298. package/package.json +11 -1
  299. package/dist/components/p-B00PEE6t.js +0 -2
  300. package/dist/components/p-B00PEE6t.js.map +0 -1
  301. package/dist/components/p-BCOl1x0_.js +0 -2
  302. package/dist/components/p-BCOl1x0_.js.map +0 -1
  303. package/dist/components/p-BHVOiWz5.js +0 -2
  304. package/dist/components/p-BHVOiWz5.js.map +0 -1
  305. package/dist/components/p-BKp__CQX.js.map +0 -1
  306. package/dist/components/p-BMc0DE59.js.map +0 -1
  307. package/dist/components/p-BPG0r_mC.js +0 -2
  308. package/dist/components/p-BPG0r_mC.js.map +0 -1
  309. package/dist/components/p-BUDAwJVV.js.map +0 -1
  310. package/dist/components/p-BXN-e7vF.js +0 -2
  311. package/dist/components/p-Bbb9A3NV.js.map +0 -1
  312. package/dist/components/p-Bece5KH3.js +0 -2
  313. package/dist/components/p-Bece5KH3.js.map +0 -1
  314. package/dist/components/p-BhYS_Ump.js +0 -2
  315. package/dist/components/p-BhYS_Ump.js.map +0 -1
  316. package/dist/components/p-Bkh7scMQ.js +0 -2
  317. package/dist/components/p-Bkh7scMQ.js.map +0 -1
  318. package/dist/components/p-BknXYAEc.js.map +0 -1
  319. package/dist/components/p-C-Y7gYgz.js.map +0 -1
  320. package/dist/components/p-C6DNhlES.js.map +0 -1
  321. package/dist/components/p-C6R5Lft0.js.map +0 -1
  322. package/dist/components/p-C9gC4haA.js.map +0 -1
  323. package/dist/components/p-CAnnQL1F.js +0 -2
  324. package/dist/components/p-CAnnQL1F.js.map +0 -1
  325. package/dist/components/p-CE2IKOsy.js +0 -2
  326. package/dist/components/p-CE2IKOsy.js.map +0 -1
  327. package/dist/components/p-CJq3n5kA.js.map +0 -1
  328. package/dist/components/p-CKVHrOEp.js.map +0 -1
  329. package/dist/components/p-CLVxgTme.js.map +0 -1
  330. package/dist/components/p-CY4YFAT3.js.map +0 -1
  331. package/dist/components/p-Cg0kimXZ.js +0 -2
  332. package/dist/components/p-Cg0kimXZ.js.map +0 -1
  333. package/dist/components/p-CqQFowZd.js.map +0 -1
  334. package/dist/components/p-CsBICYmt.js.map +0 -1
  335. package/dist/components/p-CwjVgUqy.js +0 -2
  336. package/dist/components/p-D123Jvp-.js +0 -2
  337. package/dist/components/p-D123Jvp-.js.map +0 -1
  338. package/dist/components/p-D3fMaUJ3.js.map +0 -1
  339. package/dist/components/p-D7R4yE2C.js +0 -2
  340. package/dist/components/p-D7R4yE2C.js.map +0 -1
  341. package/dist/components/p-D7haeL5y.js +0 -2
  342. package/dist/components/p-D7haeL5y.js.map +0 -1
  343. package/dist/components/p-DAvh38E4.js +0 -2
  344. package/dist/components/p-DAvh38E4.js.map +0 -1
  345. package/dist/components/p-DBue3ISk.js.map +0 -1
  346. package/dist/components/p-DDgeXGbB.js.map +0 -1
  347. package/dist/components/p-DFQ9mcbK.js.map +0 -1
  348. package/dist/components/p-DNpLDbWY.js.map +0 -1
  349. package/dist/components/p-DUdOmSFR.js +0 -2
  350. package/dist/components/p-DtndC9f1.js +0 -2
  351. package/dist/components/p-H5T258T-.js.map +0 -1
  352. package/dist/components/p-JPTkZ3Ji.js +0 -2
  353. package/dist/components/p-LK-jpxwq.js +0 -2
  354. package/dist/components/p-LK-jpxwq.js.map +0 -1
  355. package/dist/components/p-ag6Io-kL.js +0 -2
  356. package/dist/components/p-ag6Io-kL.js.map +0 -1
  357. package/dist/components/p-iMuFgSoM.js.map +0 -1
  358. /package/dist/components/{p-uI6z53BE.js.map → p-Bb4KnRy0.js.map} +0 -0
  359. /package/dist/components/{p-1Hu9jlju.js.map → p-Bf7PZJPT.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"names":["shellToolsCss","ShellTools","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","responsiveMode","open","activeTool","presentation","fullscreenHeaderMode","items","headers","storageKey","toolsLabel","toolShortcutsLabel","inboxLabel","inboxNavigationLabel","panelToolsEl","selectInboxTool","event","id","detail","availableInboxTools","includes","mobileActiveTool","dsToolChange","emit","selected","handlePanelToolChange","handlePanelPresentationChange","handleMobileHeaderAction","tool","stopPropagation","dsHeaderAction","presentationChanged","next","previous","getAttribute","setAttribute","resolvedItems","filter","item","isInactive","itemUsesShellInbox","map","mobileViewOrder","orderPanelToolsItems","toolLabel","find","candidate","label","ariaLabel","PANEL_TOOLS_LABELS","inbox","isShellInboxTool","resolveAvailableInboxTool","componentWillLoad","reconcileAvailability","handleItemsChange","reconcilePanelToolsAvailability","resolvedHeaders","activeHeader","activateMobileTool","entry","resolvePanelToolActivation","activateTool","closeDrawer","focusHeaderAction","action","el","shadowRoot","querySelector","CSS","escape","setFocus","renderForwardedSlots","flatMap","h","key","class","slot","name","renderDesktop","ref","element","onDsToolChange","onDsPresentationChange","renderMobileHeader","header","configuredTitle","title","trim","actions","inboxRoot","Boolean","showBack","sections","variant","dot","heading","headingLevel","value","sectionsAriaLabel","sectionsPresentation","sectionsSize","onDsSectionChange","backAriaLabel","side","size","icon","backIcon","activeFill","hasBorder","onDsClick","dsHeaderBack","triggerId","undefined","haspopup","controls","expanded","pressed","renderMobile","inert","active","hidden","render","mobile","Host","role"],"sources":["src/wc/components/ShellTools/ShellTools.css?tag=ds-shell-tools&encapsulation=shadow","src/wc/components/ShellTools/ShellTools.tsx"],"sourcesContent":[":host {\n display: block;\n min-width: 0;\n min-height: 0;\n height: 100%;\n background: transparent;\n}\n\n:host([responsive-mode='mobile']) {\n width: 100%;\n background: var(--color-background-primary);\n}\n\n.shell-tools__desktop,\n.shell-tools__desktop ds-panel-tools,\n.shell-tools__mobile {\n display: block;\n min-width: 0;\n min-height: 0;\n height: 100%;\n}\n\n.shell-tools__slot-proxy {\n display: block;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.shell-tools__mobile {\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n background: var(--color-background-primary);\n}\n\n.shell-tools__mobile-header {\n grid-row: 1;\n}\n\n.shell-tools__mobile-body,\n.shell-tools__view {\n min-width: 0;\n min-height: 0;\n height: 100%;\n}\n\n.shell-tools__mobile-body {\n grid-row: 2;\n overflow: hidden;\n}\n\n.shell-tools__view {\n overflow: auto;\n overscroll-behavior: contain;\n}\n\n.shell-tools__view[hidden] {\n display: none;\n}\n\n.shell-tools__view ::slotted(*) {\n min-height: 0;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n Watch,\n} from '@stencil/core';\nimport {\n PANEL_TOOLS_LABELS,\n type PanelToolsHeaderConfig,\n type PanelToolsHeaders,\n type PanelToolsItem,\n type PanelToolsToolId,\n} from '../PanelTools/panel-tools-types';\nimport {\n orderPanelToolsItems,\n reconcilePanelToolsAvailability,\n resolvePanelToolActivation,\n} from '../PanelTools/panel-tools-utils';\nimport {\n itemUsesShellInbox,\n isShellInboxTool,\n resolveAvailableInboxTool,\n type ShellInboxToolId,\n type ShellResponsiveMode,\n} from '../../shell/shell-responsive';\n\n@Component({\n tag: 'ds-shell-tools',\n styleUrl: 'ShellTools.css',\n shadow: true,\n})\nexport class ShellTools {\n @Element() el!: HTMLElement;\n\n /** Resolved by ShellApp; mobile uses a full-stage tool presentation. */\n @Prop({ attribute: 'responsive-mode', reflect: true })\n responsiveMode: ShellResponsiveMode = 'desktop';\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n @Prop({ mutable: true, attribute: 'active-tool', reflect: true })\n activeTool: PanelToolsToolId | '' = '';\n @Prop({ mutable: true, reflect: true }) presentation: 'drawer' | 'fullscreen' = 'drawer';\n @Prop({ attribute: 'fullscreen-header-mode', reflect: true })\n fullscreenHeaderMode: 'shared' | 'split' = 'shared';\n @Prop() items: PanelToolsItem[] = [];\n @Prop() headers: PanelToolsHeaders = {};\n @Prop({ attribute: 'storage-key' }) storageKey: string = '';\n @Prop() toolsLabel: string = 'Tools';\n @Prop() toolShortcutsLabel: string = 'Tool shortcuts';\n @Prop() inboxLabel: string = 'Inbox';\n @Prop() inboxNavigationLabel: string = 'Inbox sections';\n\n @Watch('presentation')\n presentationChanged(next: 'drawer' | 'fullscreen', previous: 'drawer' | 'fullscreen') {\n if (next === previous) return;\n\n /*\n * Consumers update ShellTools and their slotted master/detail layout in the\n * same render. Forward the request immediately so PanelTools can conceal\n * its surface until its matching render class commits on the next frame.\n */\n if (this.panelToolsEl && this.panelToolsEl.getAttribute('presentation') !== next) {\n this.panelToolsEl.setAttribute('presentation', next);\n }\n }\n\n @Event({ bubbles: true, composed: true }) dsToolChange!: EventEmitter<{\n id: PanelToolsToolId;\n selected: boolean;\n }>;\n @Event({ bubbles: true, composed: true }) dsPresentationChange!: EventEmitter<{\n presentation: 'drawer' | 'fullscreen';\n }>;\n @Event({ bubbles: true, composed: true }) dsHeaderBack!: EventEmitter<{\n tool: PanelToolsToolId;\n }>;\n @Event({ bubbles: true, composed: true }) dsHeaderAction!: EventEmitter<{\n tool: PanelToolsToolId;\n id: string;\n }>;\n\n private panelToolsEl: HTMLDsPanelToolsElement | null = null;\n\n private get resolvedItems(): PanelToolsItem[] {\n return this.items ?? [];\n }\n\n private get availableInboxTools(): ShellInboxToolId[] {\n return this.resolvedItems\n .filter(\n item =>\n !item.isInactive &&\n itemUsesShellInbox(item)\n )\n .map(item => item.id as ShellInboxToolId);\n }\n\n private get mobileViewOrder(): PanelToolsToolId[] {\n return orderPanelToolsItems(this.resolvedItems).map(item => item.id);\n }\n\n private toolLabel(id: PanelToolsToolId): string {\n const item = this.resolvedItems.find(candidate => candidate.id === id);\n return (\n item?.label ??\n item?.ariaLabel ??\n PANEL_TOOLS_LABELS[id as keyof typeof PANEL_TOOLS_LABELS] ??\n id\n );\n }\n\n private get mobileActiveTool(): PanelToolsToolId | '' {\n const item = this.resolvedItems.find(candidate => candidate.id === this.activeTool);\n const inbox = item ? itemUsesShellInbox(item) : isShellInboxTool(this.activeTool);\n if (!inbox) return this.activeTool;\n return resolveAvailableInboxTool(this.activeTool, this.availableInboxTools);\n }\n\n componentWillLoad() {\n this.reconcileAvailability();\n }\n\n @Watch('items')\n handleItemsChange() {\n this.reconcileAvailability();\n }\n\n private reconcileAvailability() {\n const next = reconcilePanelToolsAvailability(this.resolvedItems, this.open, this.activeTool);\n this.open = next.open;\n this.activeTool = next.activeTool;\n }\n\n private resolvedHeaders(): PanelToolsHeaders {\n return this.headers ?? {};\n }\n\n private activeHeader(tool: PanelToolsToolId): PanelToolsHeaderConfig {\n return this.resolvedHeaders()[tool] ?? {};\n }\n\n private activateMobileTool(id: PanelToolsToolId) {\n const item = this.resolvedItems.find(entry => entry.id === id);\n if (!item || item.isInactive) return;\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 private selectInboxTool = (event: CustomEvent<string>) => {\n const id = event.detail;\n if (!this.availableInboxTools.includes(id) || id === this.mobileActiveTool) return;\n this.open = true;\n this.activeTool = id;\n this.dsToolChange.emit({ id, selected: true });\n };\n\n private handlePanelToolChange = (\n event: CustomEvent<{ id: PanelToolsToolId; selected: boolean }>\n ) => {\n this.activeTool = event.detail.id;\n this.open = event.detail.selected;\n };\n\n private handlePanelPresentationChange = (\n event: CustomEvent<{ presentation: 'drawer' | 'fullscreen' }>\n ) => {\n this.presentation = event.detail.presentation;\n };\n\n private handleMobileHeaderAction = (\n tool: PanelToolsToolId,\n id: string,\n event: CustomEvent<MouseEvent>\n ) => {\n event.stopPropagation();\n this.dsHeaderAction.emit({ tool, id });\n };\n\n /** Match PanelTools' imperative activation contract in every responsive mode. */\n @Method()\n async activateTool(id: PanelToolsToolId) {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.activateTool(id);\n return;\n }\n this.activateMobileTool(id);\n }\n\n /** Close the active global tool surface. */\n @Method()\n async closeDrawer() {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.closeDrawer();\n return;\n }\n if (!this.open) return;\n const id = this.activeTool;\n this.open = false;\n if (id) this.dsToolChange.emit({ id, selected: false });\n }\n\n /** Focus an application-owned action in the visible shared tool header. */\n @Method()\n async focusHeaderAction(id: string) {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.focusHeaderAction(id);\n return;\n }\n const action = (this.el.shadowRoot ?? this.el).querySelector(\n `[data-header-action-id=\"${CSS.escape(id)}\"]`\n ) as\n | (HTMLElement & { setFocus?: () => Promise<void> })\n | null;\n await action?.setFocus?.();\n }\n\n private renderForwardedSlots() {\n return this.mobileViewOrder.flatMap(id => [\n <div key={`tool:${id}`} class=\"shell-tools__slot-proxy\" slot={id}>\n <slot name={id} />\n </div>,\n <div\n key={`tool-view:${id}`}\n class=\"shell-tools__slot-proxy\"\n slot={`${id}-view`}\n >\n <slot name={`${id}-view`} />\n </div>,\n ]);\n }\n\n private renderDesktop() {\n return (\n <div class=\"shell-tools__desktop\">\n <ds-panel-tools\n open={this.open}\n activeTool={this.activeTool}\n presentation={this.presentation}\n fullscreenHeaderMode={this.fullscreenHeaderMode}\n items={this.resolvedItems}\n headers={this.resolvedHeaders()}\n storageKey={this.storageKey}\n toolsLabel={this.toolsLabel}\n toolShortcutsLabel={this.toolShortcutsLabel}\n ref={element => {\n this.panelToolsEl = element as HTMLDsPanelToolsElement | null;\n }}\n onDsToolChange={this.handlePanelToolChange}\n onDsPresentationChange={this.handlePanelPresentationChange}\n >\n {this.renderForwardedSlots()}\n </ds-panel-tools>\n </div>\n );\n }\n\n private renderMobileHeader(tool: PanelToolsToolId) {\n const header = this.activeHeader(tool);\n const configuredTitle = header.title?.trim();\n const title = configuredTitle || this.toolLabel(tool);\n const actions = (header.actions ?? []).filter(action => action.id !== 'fullscreen');\n const item = this.resolvedItems.find(candidate => candidate.id === tool);\n const inboxRoot = Boolean(item && itemUsesShellInbox(item) && !header.showBack);\n const sections =\n inboxRoot\n ? this.availableInboxTools.map(id => {\n const item = this.resolvedItems.find(candidate => candidate.id === id);\n return {\n id,\n label: this.toolLabel(id),\n variant: 'label' as const,\n dot: item?.dot,\n };\n })\n : [];\n\n return (\n <ds-mobile-header\n class=\"shell-tools__mobile-header\"\n heading={title}\n headingLevel=\"h2\"\n sections={sections}\n value={tool}\n sectionsAriaLabel={this.inboxNavigationLabel}\n sectionsPresentation={inboxRoot ? 'segmented' : 'switcher'}\n sectionsSize=\"lg\"\n onDsSectionChange={this.selectInboxTool}\n >\n {header.showBack ? (\n <ds-tooltip\n slot=\"leading\"\n label={header.backAriaLabel || 'Back'}\n side=\"bottom\"\n size=\"sm\"\n >\n <ds-button-unfilled\n variant=\"icon\"\n icon={header.backIcon || 'ChevronLeft'}\n size=\"md\"\n aria-label={header.backAriaLabel || 'Back'}\n activeFill={false}\n hasBorder={false}\n onDsClick={() => this.dsHeaderBack.emit({ tool })}\n />\n </ds-tooltip>\n ) : null}\n {actions.map(action => (\n <ds-tooltip\n slot=\"trailing\"\n key={action.id}\n label={action.ariaLabel}\n side=\"bottom\"\n size=\"sm\"\n >\n <ds-button-unfilled\n id={action.triggerId || undefined}\n data-header-action-id={action.id}\n variant=\"icon\"\n icon={action.icon}\n size=\"md\"\n aria-label={action.ariaLabel}\n haspopup={action.haspopup}\n controls={action.controls}\n expanded={action.expanded}\n pressed={action.pressed}\n isInactive={action.isInactive}\n activeFill={false}\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) =>\n this.handleMobileHeaderAction(tool, action.id, event)}\n />\n </ds-tooltip>\n ))}\n </ds-mobile-header>\n );\n }\n\n private renderMobile() {\n const tool = this.mobileActiveTool;\n return (\n <div\n class=\"shell-tools__mobile\"\n aria-hidden={this.open && tool ? undefined : 'true'}\n inert={this.open && tool ? undefined : true}\n >\n {tool ? this.renderMobileHeader(tool) : null}\n <div class=\"shell-tools__mobile-body\">\n {this.mobileViewOrder.map(id => {\n const active = this.open && id === tool;\n return (\n <div\n key={`mobile-tool-view:${id}`}\n class={{\n 'shell-tools__view': true,\n 'shell-tools__view--active': active,\n }}\n hidden={!active}\n aria-hidden={active ? undefined : 'true'}\n inert={active ? undefined : true}\n >\n <slot name={`${id}-view`}>\n <slot name={id} />\n </slot>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n render() {\n const mobile = this.responsiveMode === 'mobile';\n return (\n <Host\n role={\n mobile\n ? this.presentation === 'fullscreen'\n ? 'dialog'\n : 'complementary'\n : undefined\n }\n aria-modal={mobile && this.presentation === 'fullscreen' ? 'true' : undefined}\n aria-label={mobile ? this.toolsLabel : undefined}\n >\n {mobile ? this.renderMobile() : this.renderDesktop()}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["SCROLL_OVERLAY_BLOCK_SIZE","SCROLL_OVERLAY_CONTENT_BLOCK_SIZE","SCROLL_OVERLAY_FADE_BLOCK_SIZE","ScrollOverlayController","constructor","options","this","overlayBlockSize","overlayContentBlockSize","fadeBlockSize","connect","resizeObserver","ResizeObserver","sync","onGeometryChange","observe","viewport","content","overlay","disconnect","syncOverlayGeometry","syncFadeWindow","getOverlayBlockSize","getOverlayContentBlockSize","host","overlayRect","getBoundingClientRect","Math","max","ceil","height","assigned","querySelector","overlayContentSelector","style","setProperty","visibleContent","firstElementChild","HTMLElement","topInset","top","fadeLead","resolveCssLengthPx","fadeEnd","scrollTop","clientHeight","fadeStart"],"sources":["src/wc/utils/scroll-overlay-controller.ts"],"sourcesContent":["import { resolveCssLengthPx } from './resolve-css-length-px';\n\nexport const SCROLL_OVERLAY_BLOCK_SIZE = '--ds-scroll-overlay-block-size';\nexport const SCROLL_OVERLAY_CONTENT_BLOCK_SIZE = '--ds-scroll-overlay-content-block-size';\nexport const SCROLL_OVERLAY_FADE_BLOCK_SIZE = '--ds-scroll-overlay-fade-block-size';\n\ninterface ScrollOverlayControllerOptions {\n host: HTMLElement;\n viewport: HTMLElement;\n content: HTMLElement;\n overlay: HTMLElement;\n overlayContentSelector?: string;\n onGeometryChange?: () => void;\n}\n\n/**\n * Keeps a content-owned alpha mask pinned behind a fixed overlay.\n *\n * The mask lives on the long content element so native scrollbars stay outside\n * the fade and the actual parent surface shows through. Its stop positions are\n * therefore expressed in content coordinates and must follow scrollTop.\n */\nexport class ScrollOverlayController {\n private resizeObserver?: ResizeObserver;\n private overlayBlockSize = 0;\n private overlayContentBlockSize = 0;\n private fadeBlockSize = 0;\n\n constructor(private readonly options: ScrollOverlayControllerOptions) {}\n\n connect(): void {\n this.resizeObserver = new ResizeObserver(() => {\n this.sync();\n this.options.onGeometryChange?.();\n });\n this.resizeObserver.observe(this.options.viewport);\n this.resizeObserver.observe(this.options.content);\n this.resizeObserver.observe(this.options.overlay);\n this.sync();\n }\n\n disconnect(): void {\n this.resizeObserver?.disconnect();\n }\n\n sync(): void {\n this.syncOverlayGeometry();\n this.syncFadeWindow();\n }\n\n getOverlayBlockSize(): number {\n return this.overlayBlockSize;\n }\n\n getOverlayContentBlockSize(): number {\n return this.overlayContentBlockSize;\n }\n\n private syncOverlayGeometry(): void {\n const { host, overlay } = this.options;\n const overlayRect = overlay.getBoundingClientRect();\n this.overlayBlockSize = Math.max(Math.ceil(overlayRect.height), 0);\n\n const assigned = host.querySelector<HTMLElement>(\n this.options.overlayContentSelector ?? '[slot=\"overlay\"]',\n );\n if (!assigned) {\n this.overlayBlockSize = 0;\n this.overlayContentBlockSize = 0;\n this.fadeBlockSize = 0;\n host.style.setProperty(SCROLL_OVERLAY_BLOCK_SIZE, '0px');\n host.style.setProperty(SCROLL_OVERLAY_CONTENT_BLOCK_SIZE, '0px');\n host.style.setProperty(SCROLL_OVERLAY_FADE_BLOCK_SIZE, '0px');\n return;\n }\n\n const visibleContent =\n assigned.firstElementChild instanceof HTMLElement ? assigned.firstElementChild : assigned;\n const topInset = Math.max(\n Math.ceil(visibleContent.getBoundingClientRect().top - overlayRect.top),\n 0,\n );\n this.overlayContentBlockSize = Math.max(this.overlayBlockSize - topInset, 0);\n const fadeLead = resolveCssLengthPx('var(--dimension-space-100)', 8);\n this.fadeBlockSize = this.overlayContentBlockSize + fadeLead;\n\n host.style.setProperty(SCROLL_OVERLAY_BLOCK_SIZE, `${this.overlayBlockSize}px`);\n host.style.setProperty(\n SCROLL_OVERLAY_CONTENT_BLOCK_SIZE,\n `${this.overlayContentBlockSize}px`,\n );\n host.style.setProperty(SCROLL_OVERLAY_FADE_BLOCK_SIZE, `${this.fadeBlockSize}px`);\n }\n\n private syncFadeWindow(): void {\n const { viewport, content } = this.options;\n const fadeEnd = Math.max(viewport.scrollTop + viewport.clientHeight, 0);\n const fadeStart = Math.max(fadeEnd - this.fadeBlockSize, 0);\n content.style.setProperty('--ds-scroll-edge-fade-window-start', `${fadeStart}px`);\n content.style.setProperty('--ds-scroll-edge-fade-window-end', `${fadeEnd}px`);\n }\n}\n"],"mappings":"oCAEO,MAAMA,EAA4B,iCAClC,MAAMC,EAAoC,yCAC1C,MAAMC,EAAiC,sC,MAkBjCC,EAMX,WAAAC,CAA6BC,GAAAC,KAAAD,UAJrBC,KAAAC,iBAAmB,EACnBD,KAAAE,wBAA0B,EAC1BF,KAAAG,cAAgB,C,CAIxB,OAAAC,GACEJ,KAAKK,eAAiB,IAAIC,gBAAe,KACvCN,KAAKO,OACLP,KAAKD,QAAQS,oBAAoB,IAEnCR,KAAKK,eAAeI,QAAQT,KAAKD,QAAQW,UACzCV,KAAKK,eAAeI,QAAQT,KAAKD,QAAQY,SACzCX,KAAKK,eAAeI,QAAQT,KAAKD,QAAQa,SACzCZ,KAAKO,M,CAGP,UAAAM,GACEb,KAAKK,gBAAgBQ,Y,CAGvB,IAAAN,GACEP,KAAKc,sBACLd,KAAKe,gB,CAGP,mBAAAC,GACE,OAAOhB,KAAKC,gB,CAGd,0BAAAgB,GACE,OAAOjB,KAAKE,uB,CAGN,mBAAAY,GACN,MAAMI,KAAEA,EAAIN,QAAEA,GAAYZ,KAAKD,QAC/B,MAAMoB,EAAcP,EAAQQ,wBAC5BpB,KAAKC,iBAAmBoB,KAAKC,IAAID,KAAKE,KAAKJ,EAAYK,QAAS,GAEhE,MAAMC,EAAWP,EAAKQ,cACpB1B,KAAKD,QAAQ4B,wBAA0B,oBAEzC,IAAKF,EAAU,CACbzB,KAAKC,iBAAmB,EACxBD,KAAKE,wBAA0B,EAC/BF,KAAKG,cAAgB,EACrBe,EAAKU,MAAMC,YAAYnC,EAA2B,OAClDwB,EAAKU,MAAMC,YAAYlC,EAAmC,OAC1DuB,EAAKU,MAAMC,YAAYjC,EAAgC,OACvD,M,CAGF,MAAMkC,EACJL,EAASM,6BAA6BC,YAAcP,EAASM,kBAAoBN,EACnF,MAAMQ,EAAWZ,KAAKC,IACpBD,KAAKE,KAAKO,EAAeV,wBAAwBc,IAAMf,EAAYe,KACnE,GAEFlC,KAAKE,wBAA0BmB,KAAKC,IAAItB,KAAKC,iBAAmBgC,EAAU,GAC1E,MAAME,EAAWC,EAAmB,6BAA8B,GAClEpC,KAAKG,cAAgBH,KAAKE,wBAA0BiC,EAEpDjB,EAAKU,MAAMC,YAAYnC,EAA2B,GAAGM,KAAKC,sBAC1DiB,EAAKU,MAAMC,YACTlC,EACA,GAAGK,KAAKE,6BAEVgB,EAAKU,MAAMC,YAAYjC,EAAgC,GAAGI,KAAKG,kB,CAGzD,cAAAY,GACN,MAAML,SAAEA,EAAQC,QAAEA,GAAYX,KAAKD,QACnC,MAAMsC,EAAUhB,KAAKC,IAAIZ,EAAS4B,UAAY5B,EAAS6B,aAAc,GACrE,MAAMC,EAAYnB,KAAKC,IAAIe,EAAUrC,KAAKG,cAAe,GACzDQ,EAAQiB,MAAMC,YAAY,qCAAsC,GAAGW,OACnE7B,EAAQiB,MAAMC,YAAY,mCAAoC,GAAGQ,M","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["deriveBarNavValueFromUrl","path","basePath","tabs","value","hideTabs","startsWith","remainder","slice","length","seg","split","selectableTabs","getSelectableTabs","id","tab","find","t","shouldResyncBarNavProps","resolvedTabs","tabsToMenuSections","selectedId","sections","batch","item","isTabDivider","push","items","label","dot","isSelected","isInactive","tabsToOverflowMenuSections","trimLeadingDividers","tabsOverflowContainer","tabListScrollWidth","containerClientWidth","collapsed","hysteresis","diff","visibleTabCountForWidth","itemWidths","availableWidth","overflowTriggerWidth","itemGap","listExtraWidth","fullWidth","widthForItemCount","availableForTabs","Math","max","count","i","width","trimTrailingDividers","end","start","itemsWidth","reduce","sum","CHROME_TRANSITION_START","CHROME_TRANSITION_END","ChromeTransitionDepth","constructor","this","depth","enter","exit","isActive","ChromeTransitionGate","active","createRafCoalescer","onFrame","rafId","schedule","requestAnimationFrame","cancel","cancelAnimationFrame","readChromeTransitionSource","event","detail","source","readChromeTransitionPhase","phase","barNavCss","BarNav","__stencil_proxyCustomElement","HTMLElement","registerHost","navStyle","currentUrl","moreTabsLabel","urlDerivedValue","hideTabsForDetailRoute","tabsCollapsed","menuOpen","menuTriggerActive","tabLayoutCommitted","visibleTabs","overflowTabs","menuInitialFocusVisible","overflowRovingFocused","focusedTabId","headerEl","triggerEl","menuEl","visibleTabListEl","probeTabListEl","resizeObserver","intrinsicWidthRetryCount","tabLayoutPendingFrames","panelNavTransition","panelToolsTransition","overflowCoalescer","updateTabsCollapsed","chromeTransitionShell","committedSection","pendingSection","onChromeTransitionStart","onChromeTransitionEnd","scheduleOverflowCheck","handleOverflowFocus","handleOverflowBlur","effectiveValue","renderedSelectableTabs","hasOverflowTabs","syncFocusedTabId","preferred","some","first","digestTabsConfig","map","join","resetTabOverflowLayout","onHostPropsChange","applyHostProps","onSelectionChange","syncMenuSections","onMenuOpenChange","open","onTabsCollapsedChange","prevCollapsed","undefined","queueMicrotask","focusVisibleSelectedTab","componentWillLoad","componentDidLoad","syncHostPropsIfNeeded","scheduleDeferredHostPropSync","setupOverflowObserver","bindChromeTransitionListeners","componentDidRender","chromeOverflowPaused","syncMenuAnchor","disconnectedCallback","disconnect","unbindChromeTransitionListeners","shell","el","closest","addEventListener","removeEventListener","syncValueFromUrl","remaining","HOST_PROP_SYNC_BUDGET","tick","ResizeObserver","observe","getLeftZoneAvailableWidth","headerStyle","getComputedStyle","horizontalPadding","parseFloat","paddingLeft","paddingRight","clientWidth","getTabsIntrinsicWidth","scrollWidth","getHeaderGap","style","columnGap","gap","getOverflowTriggerReserveWidth","getBoundingClientRect","getProbeTabMetrics","tabList","children","Array","from","child","childrenWidth","gapWidth","setOverflowTabLayout","nextCollapsed","visibleChanged","overflowChanged","scheduleIntrinsicWidthRetry","INTRINSIC_WIDTH_RETRY_MAX","forceTabLayoutCommit","fallbackCollapsed","metrics","intrinsicWidth","TAB_LAYOUT_COMMIT_MAX_FRAMES","shouldCollapse","OVERFLOW_HYSTERESIS_PX","visibleCount","anchor","handleMenuSelect","e","selectTab","String","handleMenuClose","handleMenuAfterClose","incomingTabs","nextBasePath","sectionChanged","tabsConfigChanged","dsTabChange","emit","querySelector","focus","preventScroll","focusVisibleTab","focusLastVisibleTab","last","reverse","findEnabledVisibleTab","step","index","handleTabKeyDown","targetId","target","getAttribute","focusedId","key","focused","preventDefault","currentIndex","findIndex","nextIndex","setFocus","reversedIndex","toggleTabMenu","options","minWidth","focusVisible","handleTriggerKeyDown","renderTabList","probe","h","role","class","heading","ref","next","onKeyDown","onFocusin","type","panelId","disabled","tabIndex","onClick","onFocus","as","variant","emphasis","color","hasRing","render","sectionReady","hasTabs","tabGroupKey","renderedTabs","Host","inert","lineTruncation","wrap","icon","activeFill","hasBorder","focusTabIndex","haspopup","expanded","onDsClick","onFocusout","side","align","sideOffset","initialFocusVisible","onDsSelect","onDsClose","onDsAfterClose"],"sources":["src/wc/components/BarNav/bar-nav-utils.ts","src/wc/components/BarNav/bar-nav-tabs-menu-utils.ts","src/wc/shell/chrome-transition.ts","src/wc/components/BarNav/BarNav.css?tag=ds-bar-nav&encapsulation=scoped","src/wc/components/BarNav/BarNav.tsx"],"sourcesContent":["import { getSelectableTabs } from '../TabGroup/tab-item-utils';\nimport type { BarNavTab } from './bar-nav-types';\n\nexport interface BarNavUrlState {\n /** Tab id derived from the URL, or empty when none applies. */\n value: string;\n /** When true, tabs should be hidden (e.g. non-tab child routes like detail pages). */\n hideTabs: boolean;\n}\n\n/** Derive BarNav tab selection from `currentUrl` relative to `basePath`.\n * Mirrors motive-webapp-lab `resolveBarNavState` tab-selection semantics. */\nexport function deriveBarNavValueFromUrl(\n path: string,\n basePath: string,\n tabs: BarNavTab[],\n): BarNavUrlState {\n if (!path || !basePath) {\n return { value: '', hideTabs: false };\n }\n\n if (path !== basePath && !path.startsWith(`${basePath}/`)) {\n return { value: '', hideTabs: false };\n }\n\n const remainder = path.slice(basePath.length);\n const seg = remainder.startsWith('/') ? remainder.slice(1).split('/')[0] : '';\n const selectableTabs = getSelectableTabs(tabs);\n\n if (!seg) {\n return { value: selectableTabs[0]?.id ?? '', hideTabs: false };\n }\n\n const tab = selectableTabs.find(t => t.id === seg);\n if (tab) {\n return { value: tab.id, hideTabs: false };\n }\n\n return { value: '', hideTabs: true };\n}\n\n/** True when host array props have data but resolved internal state is still empty. */\nexport function shouldResyncBarNavProps(\n resolvedTabs: BarNavTab[],\n tabs: BarNavTab[],\n): boolean {\n return resolvedTabs.length === 0 && (tabs?.length ?? 0) > 0;\n}\n","import type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport {\n getSelectableTabs,\n isTabDivider,\n type TabItem,\n type TabItemTab,\n} from '../TabGroup/tab-item-utils';\n\n/** Map BarNav tabs to menu sections, preserving `{ type: 'divider' }` as section breaks. */\nexport function tabsToMenuSections(tabs: TabItem[], selectedId: string): MenuSection[] {\n const sections: MenuSection[] = [];\n let batch: MenuItemData[] = [];\n\n for (const item of tabs) {\n if (isTabDivider(item)) {\n if (batch.length > 0) {\n sections.push({ items: batch });\n batch = [];\n }\n continue;\n }\n\n batch.push({\n label: item.label,\n value: item.id,\n dot: item.dot,\n isSelected: item.id === selectedId,\n isInactive: item.isInactive,\n });\n }\n\n if (batch.length > 0) {\n sections.push({ items: batch });\n }\n\n return sections;\n}\n\nexport function tabsToOverflowMenuSections(tabs: TabItem[], selectedId: string): MenuSection[] {\n return tabsToMenuSections(trimLeadingDividers(tabs), selectedId);\n}\n\nexport function getActiveTab(tabs: TabItem[], selectedId: string): TabItemTab | undefined {\n const selectable = getSelectableTabs(tabs);\n return selectable.find(tab => tab.id === selectedId) ?? selectable[0];\n}\n\nexport function getActiveTabLabel(tabs: TabItem[], selectedId: string): string {\n return getActiveTab(tabs, selectedId)?.label ?? 'Tabs';\n}\n\n/** True when tablist content exceeds the available width (with optional hysteresis). */\nexport function tabsOverflowContainer(\n tabListScrollWidth: number,\n containerClientWidth: number,\n collapsed: boolean,\n hysteresis = 2,\n): boolean {\n const diff = tabListScrollWidth - containerClientWidth;\n if (collapsed) {\n return diff > -hysteresis;\n }\n return diff > hysteresis;\n}\n\nexport function visibleTabCountForWidth(\n itemWidths: number[],\n availableWidth: number,\n overflowTriggerWidth: number,\n itemGap: number,\n listExtraWidth: number,\n): number {\n if (itemWidths.length === 0 || availableWidth <= 0) return 0;\n\n const fullWidth = widthForItemCount(itemWidths, itemWidths.length, itemGap, listExtraWidth);\n if (fullWidth <= availableWidth) return itemWidths.length;\n\n const availableForTabs = Math.max(0, availableWidth - overflowTriggerWidth);\n let count = 0;\n\n for (let i = 1; i <= itemWidths.length; i++) {\n const width = widthForItemCount(itemWidths, i, itemGap, listExtraWidth);\n if (width > availableForTabs) break;\n count = i;\n }\n\n return count;\n}\n\nexport function trimTrailingDividers(tabs: TabItem[]): TabItem[] {\n let end = tabs.length;\n while (end > 0 && isTabDivider(tabs[end - 1])) {\n end -= 1;\n }\n return tabs.slice(0, end);\n}\n\nfunction trimLeadingDividers(tabs: TabItem[]): TabItem[] {\n let start = 0;\n while (start < tabs.length && isTabDivider(tabs[start])) {\n start += 1;\n }\n return tabs.slice(start);\n}\n\nfunction widthForItemCount(\n itemWidths: number[],\n count: number,\n itemGap: number,\n listExtraWidth: number,\n): number {\n if (count <= 0) return 0;\n const itemsWidth = itemWidths.slice(0, count).reduce((sum, width) => sum + width, 0);\n return listExtraWidth + itemsWidth + itemGap * Math.max(0, count - 1);\n}\n","/** Bubbling/composed events — `ds-shell-app` and `ds-bar-nav` coordinate during width motion. */\n\nexport const CHROME_TRANSITION_START = 'dsChromeTransitionStart';\nexport const CHROME_TRANSITION_END = 'dsChromeTransitionEnd';\n\nexport type ChromeTransitionSource = 'panel-nav' | 'panel-tools';\n\nexport interface ChromeTransitionDetail {\n source: ChromeTransitionSource;\n /** Panel-tools drawer motion direction; omitted for panel-nav. */\n phase?: 'opening' | 'closing';\n}\n\n/** Reference-counted gate — used while panel-nav width is transitioning. */\nexport class ChromeTransitionDepth {\n private depth = 0;\n\n enter(): void {\n this.depth += 1;\n }\n\n exit(): void {\n this.depth = Math.max(0, this.depth - 1);\n }\n\n get isActive(): boolean {\n return this.depth > 0;\n }\n}\n\n/** Idempotent gate for one physical chrome surface.\n * Duplicate start notifications still require only one matching end. */\nexport class ChromeTransitionGate {\n private active = false;\n\n enter(): void {\n this.active = true;\n }\n\n exit(): void {\n this.active = false;\n }\n\n get isActive(): boolean {\n return this.active;\n }\n}\n\nexport interface RafCoalescer {\n schedule(): void;\n cancel(): void;\n}\n\n/** Coalesce bursty layout work (ResizeObserver, prop churn) to one callback per frame. */\nexport function createRafCoalescer(onFrame: () => void): RafCoalescer {\n let rafId = 0;\n return {\n schedule() {\n if (rafId !== 0) return;\n rafId = requestAnimationFrame(() => {\n rafId = 0;\n onFrame();\n });\n },\n cancel() {\n if (rafId !== 0) {\n cancelAnimationFrame(rafId);\n rafId = 0;\n }\n },\n };\n}\n\nexport function readChromeTransitionSource(event: Event): ChromeTransitionSource | undefined {\n return (event as CustomEvent<ChromeTransitionDetail>).detail?.source;\n}\n\nexport function readChromeTransitionPhase(event: Event): ChromeTransitionDetail['phase'] {\n return (event as CustomEvent<ChromeTransitionDetail>).detail?.phase;\n}\n","@import '../../utils/control-density.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/chrome-layout.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n\n:host {\n display: block;\n}\n\n.bar-nav {\n position: relative;\n height: var(--dimension-size-600);\n border-bottom: var(--dimension-stroke-width-012) solid var(--_bar-nav-border);\n background-color: var(--_bar-nav-bg);\n color: var(--_bar-nav-fg-primary);\n -webkit-user-select: none;\n user-select: none;\n overflow: hidden;\n transition:\n background-color var(--effect-motion-short-3),\n border-color var(--effect-motion-short-3),\n color var(--effect-motion-short-3);\n isolation: isolate;\n /* Default chrome — app surfaces */\n --_bar-nav-bg: var(--color-background-secondary);\n --_bar-nav-border: var(--color-border-tertiary);\n --_bar-nav-fg-primary: var(--color-foreground-primary);\n --_bar-nav-fg-secondary: var(--color-foreground-secondary);\n --_bar-nav-hover: var(--color-interaction-hover);\n --_bar-nav-pressed: var(--color-interaction-pressed);\n --_bar-nav-focus: var(--color-interaction-focus);\n --_bar-nav-dot: var(--color-foreground-bold-brand);\n --ds-focus-ring-color: var(--_bar-nav-focus);\n}\n\n/* Style slots — same app tokens for now; hook texture/glyph layers later. */\n.bar-nav--dashboard,\n.bar-nav--settings {\n --_bar-nav-bg: var(--color-background-secondary);\n --_bar-nav-border: var(--color-border-tertiary);\n --_bar-nav-fg-primary: var(--color-foreground-primary);\n --_bar-nav-fg-secondary: var(--color-foreground-secondary);\n --_bar-nav-hover: var(--color-interaction-hover);\n --_bar-nav-pressed: var(--color-interaction-pressed);\n --_bar-nav-focus: var(--color-interaction-focus);\n --_bar-nav-dot: var(--color-foreground-bold-brand);\n}\n\n/* Shell-owned chrome (bg + wash) — bar is a transparent frame. */\n:host-context(ds-shell-app:not([gradient-preset='none'])) .bar-nav,\n:host-context(ds-shell-app.shell-app--paper-texture) .bar-nav {\n background-color: transparent;\n}\n\n.bar-nav > :not(.bar-nav__tabs-probe) {\n position: relative;\n z-index: 3;\n}\n\n/* Overflow — keep fitting tabs visible and pin the overflow trigger to the far edge. */\n.bar-nav--tabs-collapsed {\n display: flex;\n gap: var(--dimension-space-100);\n align-items: center;\n}\n\n/* Expanded tabs — consume full header width */\n.bar-nav__left {\n position: relative;\n flex: 1 1 0%;\n min-width: 0;\n width: 0;\n display: flex;\n align-items: center;\n}\n\n.bar-nav__tabs-visible {\n flex: 1;\n min-width: 0;\n width: 100%;\n}\n\n/* Unconstrained width so intrinsic tab row width is measurable while collapsed */\n.bar-nav__tabs-probe {\n position: absolute;\n left: 0;\n top: 0;\n visibility: hidden;\n pointer-events: none;\n overflow: visible;\n width: max-content;\n max-width: none;\n z-index: -1;\n}\n\n.bar-nav__tabs-probe > div {\n width: max-content;\n}\n\n.bar-nav__tab-list {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n position: relative;\n width: max-content;\n}\n\n.bar-nav__tab {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n height: var(--ds-control-height);\n min-width: var(--ds-control-height);\n padding: 0 var(--ds-control-padding-inline);\n box-sizing: border-box;\n border: none;\n border-radius: var(--ds-control-radius);\n background-color: transparent;\n color: var(--_bar-nav-fg-secondary);\n cursor: default;\n position: relative;\n flex-shrink: 0;\n -webkit-user-select: none;\n user-select: none;\n transition: color var(--effect-motion-short-2);\n}\n\n.bar-nav__tab::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: var(--ds-control-radius);\n background: transparent;\n pointer-events: none;\n cursor: inherit;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .bar-nav__tab:hover::after {\n background: var(--_bar-nav-hover);\n }\n}\n\n.bar-nav__tab:active::after {\n background: var(--_bar-nav-pressed);\n}\n\n.bar-nav__tab--selected {\n color: var(--_bar-nav-fg-primary);\n}\n\n.bar-nav__tab-label {\n display: inline-flex;\n align-items: center;\n white-space: nowrap;\n}\n\n.bar-nav__tab-divider {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--dimension-space-100);\n height: var(--ds-control-height);\n padding-block: var(--ds-control-padding-inline);\n flex-shrink: 0;\n pointer-events: none;\n}\n\n.bar-nav__tab-divider-line {\n width: var(--dimension-stroke-width-012);\n align-self: stretch;\n background-color: var(--_bar-nav-border);\n}\n\n/* In-flow placeholder while measuring overflow — avoids layout jump; hidden from view/accessibility. */\n.bar-nav__tabs-pending {\n flex: 1;\n min-width: 0;\n height: var(--ds-control-height);\n visibility: hidden;\n pointer-events: none;\n}\n\n/* Overflow trigger — compact icon button aligned to the right edge. */\n.bar-nav__overflow-trigger {\n margin-left: auto;\n --ds-button-unfilled-fg: var(--_bar-nav-fg-secondary);\n --ds-button-unfilled-fg-active: var(--_bar-nav-fg-primary);\n --ds-interaction-hover: var(--_bar-nav-hover);\n --ds-interaction-pressed: var(--_bar-nav-pressed);\n --ds-focus-ring-color: var(--_bar-nav-focus);\n}\n\n/* Fallback heading when no tabs — matches a single (selected) tab so the area\n name shares the tab label's type token, color, height and horizontal inset.\n Inset = tab button padding (space-075, 6px) + label inset (space-025, 2px).\n Color comes from ds-text color=\"primary\"; beat Text's inline-box display. */\nds-text.bar-nav__heading {\n display: inline-flex;\n align-items: center;\n height: var(--ds-control-height);\n padding-inline: calc(var(--ds-control-padding-inline) + var(--ds-control-label-inset));\n -webkit-user-select: none;\n user-select: none;\n}\n","import {\n Component,\n Prop,\n Event,\n EventEmitter,\n Element,\n Watch,\n State,\n h,\n Host,\n} from '@stencil/core';\nimport type { NavChromeStyle } from '../../shell/nav-chrome';\nimport type { MenuItemData } from '../Menu/menu-types';\nimport { getSelectableTabs, isTabDivider, type TabItemTab } from '../TabGroup/tab-item-utils';\nimport type { BarNavTab } from './bar-nav-types';\nimport {\n deriveBarNavValueFromUrl,\n shouldResyncBarNavProps,\n} from './bar-nav-utils';\nimport {\n tabsOverflowContainer,\n tabsToOverflowMenuSections,\n trimTrailingDividers,\n visibleTabCountForWidth,\n} from './bar-nav-tabs-menu-utils';\nimport {\n CHROME_TRANSITION_END,\n CHROME_TRANSITION_START,\n ChromeTransitionGate,\n createRafCoalescer,\n readChromeTransitionSource,\n readChromeTransitionPhase,\n} from '../../shell/chrome-transition';\n\n@Component({\n tag: 'ds-bar-nav',\n styleUrl: 'BarNav.css',\n scoped: true,\n})\nexport class BarNav {\n /** Style slot: `dashboard` or `settings`. Colors match for now. */\n @Prop({ attribute: 'nav-style', reflect: true }) navStyle: NavChromeStyle = 'dashboard';\n\n @Element() el!: HTMLElement;\n\n /**\n * Tab items for the left section.\n * Set via JS property: `el.tabs = [...]`. Replace the array reference to update.\n */\n @Prop() tabs: BarNavTab[] = [];\n\n /** ID of the currently active tab. Overridden when `currentUrl` + `basePath` are set. */\n @Prop({ mutable: true }) value: string = '';\n\n /**\n * Fallback heading shown when no tabs are provided.\n * When tabs are present the heading is hidden.\n */\n @Prop() heading: string | undefined;\n\n /** Section base path (e.g. `/dashboard/safety`). Used with `currentUrl` to derive `value`. */\n @Prop() basePath: string = '';\n\n /** Current route URL. When set with `basePath`, the active tab is derived automatically. */\n @Prop() currentUrl: string = '';\n @Prop() moreTabsLabel: string = 'More tabs';\n\n /** Emitted when the active tab changes. Detail = tab id. */\n @Event() dsTabChange!: EventEmitter<string>;\n\n @State() private resolvedTabs: BarNavTab[] = [];\n @State() private urlDerivedValue: string = '';\n @State() private hideTabsForDetailRoute = false;\n @State() private tabsCollapsed = false;\n @State() private menuOpen = false;\n @State() private menuTriggerActive = false;\n /** When false, defer showing expanded tabs or the collapsed trigger until intrinsic width is measured (avoids a one-frame flash of the full tab row on narrow viewports). */\n @State() private tabLayoutCommitted = false;\n @State() private visibleTabs: BarNavTab[] = [];\n @State() private overflowTabs: BarNavTab[] = [];\n @State() private menuInitialFocusVisible = false;\n @State() private overflowRovingFocused = false;\n @State() private focusedTabId = '';\n\n private static readonly HOST_PROP_SYNC_BUDGET = 8;\n private static readonly INTRINSIC_WIDTH_RETRY_MAX = 3;\n private static readonly TAB_LAYOUT_COMMIT_MAX_FRAMES = 16;\n private static readonly OVERFLOW_HYSTERESIS_PX = 8;\n\n private headerEl: HTMLElement | null = null;\n private triggerEl: (HTMLElement & { setFocus?: () => Promise<void> }) | null = null;\n private menuEl: HTMLDsMenuElement | null = null;\n private visibleTabListEl: HTMLElement | null = null;\n private probeTabListEl: HTMLElement | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private intrinsicWidthRetryCount = 0;\n private tabLayoutPendingFrames = 0;\n private readonly panelNavTransition = new ChromeTransitionGate();\n private readonly panelToolsTransition = new ChromeTransitionGate();\n private readonly overflowCoalescer = createRafCoalescer(() => {\n this.updateTabsCollapsed();\n });\n private chromeTransitionShell: HTMLElement | null = null;\n /** Matches `basePath` once tabs + URL are reconciled for the active section. */\n @State() private committedSection = '';\n /** Section waiting for URL + tabs to catch up after a cross-area navigation. */\n @State() private pendingSection = '';\n\n private get effectiveValue(): string {\n if (this.currentUrl && this.basePath) {\n return this.urlDerivedValue;\n }\n return this.value;\n }\n\n private get renderedSelectableTabs(): TabItemTab[] {\n const tabs = this.hasOverflowTabs ? this.visibleTabs : this.resolvedTabs;\n return getSelectableTabs(tabs);\n }\n\n private get hasOverflowTabs(): boolean {\n return this.tabLayoutCommitted && this.tabsCollapsed && this.overflowTabs.length > 0;\n }\n\n private syncFocusedTabId(preferred: string, tabs: TabItemTab[]) {\n if (tabs.some(tab => tab.id === preferred && !tab.isInactive)) {\n this.focusedTabId = preferred;\n return;\n }\n const first = tabs.find(tab => !tab.isInactive);\n this.focusedTabId = first?.id ?? '';\n }\n\n private digestTabsConfig(tabs: BarNavTab[]): string {\n return tabs.map(t => (isTabDivider(t) ? '|' : t.id)).join(',');\n }\n\n private resetTabOverflowLayout() {\n this.tabLayoutCommitted = false;\n this.tabsCollapsed = false;\n this.menuOpen = false;\n this.menuTriggerActive = false;\n this.menuInitialFocusVisible = false;\n this.intrinsicWidthRetryCount = 0;\n this.tabLayoutPendingFrames = 0;\n this.visibleTabs = [];\n this.overflowTabs = [];\n }\n\n @Watch('tabs')\n @Watch('currentUrl')\n @Watch('basePath')\n onHostPropsChange() {\n this.applyHostProps();\n }\n\n @Watch('value')\n @Watch('urlDerivedValue')\n onSelectionChange() {\n this.syncFocusedTabId(this.effectiveValue, this.renderedSelectableTabs);\n this.syncMenuSections();\n this.scheduleOverflowCheck();\n }\n\n @Watch('menuOpen')\n onMenuOpenChange(open: boolean) {\n if (this.menuEl) {\n this.menuEl.open = open;\n }\n }\n\n @Watch('tabsCollapsed')\n onTabsCollapsedChange(collapsed: boolean, prevCollapsed: boolean | undefined) {\n if (!collapsed) {\n this.menuOpen = false;\n this.menuTriggerActive = false;\n this.menuInitialFocusVisible = false;\n this.menuEl = null;\n }\n this.scheduleOverflowCheck();\n if (collapsed) {\n requestAnimationFrame(() => {\n this.scheduleOverflowCheck();\n });\n }\n if (collapsed || prevCollapsed === undefined || prevCollapsed === collapsed) return;\n requestAnimationFrame(() => this.scheduleOverflowCheck());\n queueMicrotask(() => this.focusVisibleSelectedTab());\n }\n\n componentWillLoad() {\n this.applyHostProps();\n this.syncFocusedTabId(this.effectiveValue, getSelectableTabs(this.resolvedTabs));\n }\n\n componentDidLoad() {\n this.syncHostPropsIfNeeded();\n this.scheduleDeferredHostPropSync();\n this.setupOverflowObserver();\n this.bindChromeTransitionListeners();\n this.scheduleOverflowCheck();\n }\n\n componentDidRender() {\n if (this.chromeOverflowPaused()) {\n this.syncMenuAnchor();\n return;\n }\n this.scheduleOverflowCheck();\n this.syncMenuAnchor();\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.overflowCoalescer.cancel();\n this.unbindChromeTransitionListeners();\n }\n\n private bindChromeTransitionListeners() {\n const shell = this.el.closest<HTMLElement>('ds-shell-app');\n if (!shell) return;\n this.chromeTransitionShell = shell;\n shell.addEventListener(CHROME_TRANSITION_START, this.onChromeTransitionStart);\n shell.addEventListener(CHROME_TRANSITION_END, this.onChromeTransitionEnd);\n }\n\n private unbindChromeTransitionListeners() {\n if (!this.chromeTransitionShell) return;\n this.chromeTransitionShell.removeEventListener(\n CHROME_TRANSITION_START,\n this.onChromeTransitionStart,\n );\n this.chromeTransitionShell.removeEventListener(\n CHROME_TRANSITION_END,\n this.onChromeTransitionEnd,\n );\n this.chromeTransitionShell = null;\n }\n\n private onChromeTransitionStart = (event: Event) => {\n const source = readChromeTransitionSource(event);\n if (source === 'panel-nav') {\n this.panelNavTransition.enter();\n return;\n }\n if (source === 'panel-tools') {\n const phase = readChromeTransitionPhase(event) ?? 'opening';\n if (phase === 'closing') {\n this.panelToolsTransition.enter();\n }\n }\n };\n\n private chromeOverflowPaused(): boolean {\n return this.panelNavTransition.isActive || this.panelToolsTransition.isActive;\n }\n\n private onChromeTransitionEnd = (event: Event) => {\n const source = readChromeTransitionSource(event);\n if (source === 'panel-nav') {\n this.panelNavTransition.exit();\n if (!this.panelNavTransition.isActive) {\n this.scheduleOverflowCheck();\n }\n return;\n }\n if (source === 'panel-tools') {\n this.panelToolsTransition.exit();\n this.scheduleOverflowCheck();\n }\n };\n\n /** Re-resolve props assigned by the host after componentWillLoad (Angular ngAfterViewInit). */\n private syncHostPropsIfNeeded() {\n if (shouldResyncBarNavProps(this.resolvedTabs, this.tabs)) {\n this.applyHostProps();\n } else if (this.currentUrl && this.basePath) {\n this.syncValueFromUrl();\n }\n }\n\n /** Poll across animation frames — host props may land without triggering @Watch. */\n private scheduleDeferredHostPropSync() {\n let remaining = BarNav.HOST_PROP_SYNC_BUDGET;\n const tick = () => {\n this.syncHostPropsIfNeeded();\n if (--remaining > 0) {\n requestAnimationFrame(tick);\n }\n };\n queueMicrotask(tick);\n }\n\n private setupOverflowObserver() {\n if (typeof ResizeObserver === 'undefined' || !this.headerEl) return;\n this.resizeObserver?.disconnect();\n this.resizeObserver = new ResizeObserver(() => {\n if (this.chromeOverflowPaused()) return;\n this.scheduleOverflowCheck();\n });\n this.resizeObserver.observe(this.headerEl);\n }\n\n private scheduleOverflowCheck() {\n if (this.chromeOverflowPaused()) return;\n this.overflowCoalescer.schedule();\n }\n\n /** Width available for the tab row or collapsed trigger. */\n private getLeftZoneAvailableWidth(): number {\n if (!this.headerEl) return 0;\n\n const headerStyle = getComputedStyle(this.headerEl);\n const horizontalPadding =\n (parseFloat(headerStyle.paddingLeft) || 0) + (parseFloat(headerStyle.paddingRight) || 0);\n\n return Math.max(0, this.headerEl.clientWidth - horizontalPadding);\n }\n\n private getTabsIntrinsicWidth(): number {\n return this.probeTabListEl?.scrollWidth ?? 0;\n }\n\n private getHeaderGap(): number {\n if (!this.headerEl) return 0;\n const style = getComputedStyle(this.headerEl);\n return parseFloat(style.columnGap || style.gap) || 0;\n }\n\n private getOverflowTriggerReserveWidth(): number {\n if (!this.triggerEl) {\n return 40;\n }\n return this.triggerEl.getBoundingClientRect().width + this.getHeaderGap();\n }\n\n private getProbeTabMetrics():\n | {\n itemWidths: number[];\n itemGap: number;\n listExtraWidth: number;\n }\n | null {\n const tabList = this.probeTabListEl;\n if (!tabList) return null;\n\n const children = Array.from(tabList.children) as HTMLElement[];\n const itemWidths = children.map(child => child.getBoundingClientRect().width);\n if (itemWidths.length === 0 || itemWidths.some(width => width === 0)) return null;\n\n const style = getComputedStyle(tabList);\n const itemGap = parseFloat(style.columnGap || style.gap) || 0;\n const childrenWidth = itemWidths.reduce((sum, width) => sum + width, 0);\n const gapWidth = itemGap * Math.max(0, itemWidths.length - 1);\n const listExtraWidth = Math.max(0, tabList.scrollWidth - childrenWidth - gapWidth);\n\n return { itemWidths, itemGap, listExtraWidth };\n }\n\n private setOverflowTabLayout(visibleTabs: BarNavTab[], overflowTabs: BarNavTab[]) {\n const nextCollapsed = overflowTabs.length > 0;\n const visibleChanged =\n this.digestTabsConfig(visibleTabs) !== this.digestTabsConfig(this.visibleTabs);\n const overflowChanged =\n this.digestTabsConfig(overflowTabs) !== this.digestTabsConfig(this.overflowTabs);\n\n if (visibleChanged) {\n this.visibleTabs = visibleTabs;\n }\n if (overflowChanged) {\n this.overflowTabs = overflowTabs;\n }\n if (nextCollapsed !== this.tabsCollapsed) {\n this.tabsCollapsed = nextCollapsed;\n if (!nextCollapsed) {\n this.menuOpen = false;\n this.menuTriggerActive = false;\n }\n }\n this.syncFocusedTabId(\n this.effectiveValue,\n getSelectableTabs(nextCollapsed ? visibleTabs : this.resolvedTabs),\n );\n }\n\n private scheduleIntrinsicWidthRetry() {\n if (this.intrinsicWidthRetryCount >= BarNav.INTRINSIC_WIDTH_RETRY_MAX) return;\n this.intrinsicWidthRetryCount++;\n requestAnimationFrame(() => this.scheduleOverflowCheck());\n }\n\n private forceTabLayoutCommit(fallbackCollapsed: boolean) {\n this.intrinsicWidthRetryCount = 0;\n this.tabLayoutPendingFrames = 0;\n this.setOverflowTabLayout(\n fallbackCollapsed ? [] : this.resolvedTabs,\n fallbackCollapsed ? this.resolvedTabs : [],\n );\n this.tabLayoutCommitted = true;\n }\n\n private updateTabsCollapsed() {\n if (!this.headerEl || this.resolvedTabs.length === 0 || this.hideTabsForDetailRoute) {\n if (this.tabsCollapsed) {\n this.setOverflowTabLayout([], []);\n }\n this.intrinsicWidthRetryCount = 0;\n this.tabLayoutPendingFrames = 0;\n this.tabLayoutCommitted = true;\n return;\n }\n\n const metrics = this.getProbeTabMetrics();\n const intrinsicWidth = this.getTabsIntrinsicWidth();\n if (!metrics || intrinsicWidth === 0) {\n this.tabLayoutPendingFrames += 1;\n if (this.intrinsicWidthRetryCount >= BarNav.INTRINSIC_WIDTH_RETRY_MAX) {\n this.forceTabLayoutCommit(false);\n } else if (this.tabLayoutPendingFrames >= BarNav.TAB_LAYOUT_COMMIT_MAX_FRAMES) {\n this.forceTabLayoutCommit(false);\n } else {\n this.scheduleIntrinsicWidthRetry();\n }\n return;\n }\n this.intrinsicWidthRetryCount = 0;\n this.tabLayoutPendingFrames = 0;\n\n const shouldCollapse = tabsOverflowContainer(\n intrinsicWidth,\n this.getLeftZoneAvailableWidth(),\n this.tabsCollapsed,\n BarNav.OVERFLOW_HYSTERESIS_PX,\n );\n\n if (!shouldCollapse) {\n this.setOverflowTabLayout(this.resolvedTabs, []);\n this.tabLayoutCommitted = true;\n return;\n }\n\n const visibleCount = visibleTabCountForWidth(\n metrics.itemWidths,\n this.getLeftZoneAvailableWidth(),\n this.getOverflowTriggerReserveWidth(),\n metrics.itemGap,\n metrics.listExtraWidth,\n );\n const visibleTabs = trimTrailingDividers(this.resolvedTabs.slice(0, visibleCount));\n const overflowTabs = this.resolvedTabs.slice(visibleTabs.length);\n this.setOverflowTabLayout(visibleTabs, overflowTabs);\n this.tabLayoutCommitted = true;\n }\n\n private syncMenuAnchor() {\n if (!this.menuEl || !this.triggerEl || !this.hasOverflowTabs) return;\n this.menuEl.anchor = this.triggerEl;\n this.syncMenuSections();\n }\n\n private handleMenuSelect(e: Event) {\n const detail = (e as CustomEvent<MenuItemData>).detail;\n if (detail?.value !== undefined) {\n this.selectTab(String(detail.value));\n }\n this.menuOpen = false;\n this.menuInitialFocusVisible = false;\n }\n\n private handleMenuClose() {\n this.menuOpen = false;\n this.menuInitialFocusVisible = false;\n }\n\n private handleMenuAfterClose() {\n if (!this.menuOpen) this.menuTriggerActive = false;\n }\n\n /** Batch tabs/basePath/currentUrl updates so URL derivation never runs with a mixed section. */\n private incomingTabs(): BarNavTab[] {\n return this.tabs ?? [];\n }\n\n private applyHostProps() {\n const nextBasePath = this.basePath;\n const sectionChanged =\n nextBasePath !== '' &&\n this.committedSection !== '' &&\n nextBasePath !== this.committedSection;\n\n if (sectionChanged) {\n this.urlDerivedValue = '';\n this.committedSection = '';\n this.pendingSection = nextBasePath;\n this.resolvedTabs = [];\n this.resetTabOverflowLayout();\n return;\n }\n\n if (this.pendingSection) {\n if (!nextBasePath || nextBasePath !== this.pendingSection) {\n return;\n }\n if (!this.currentUrl.startsWith(this.pendingSection)) {\n return;\n }\n const tabs = this.incomingTabs();\n if (tabs.length === 0) {\n return;\n }\n this.pendingSection = '';\n }\n\n const tabs = this.incomingTabs();\n const tabsConfigChanged =\n this.digestTabsConfig(tabs) !== this.digestTabsConfig(this.resolvedTabs);\n\n this.resolvedTabs = tabs;\n this.syncValueFromUrl();\n this.committedSection = nextBasePath;\n if (tabsConfigChanged) {\n this.resetTabOverflowLayout();\n }\n this.scheduleOverflowCheck();\n }\n\n private syncMenuSections() {\n if (!this.menuEl) return;\n this.menuEl.sections = tabsToOverflowMenuSections(this.overflowTabs, this.effectiveValue);\n }\n\n private syncValueFromUrl() {\n const tabs = this.incomingTabs();\n\n if (!this.currentUrl || !this.basePath) {\n this.urlDerivedValue = '';\n this.hideTabsForDetailRoute = false;\n return;\n }\n\n if (!this.currentUrl.startsWith(this.basePath)) {\n this.urlDerivedValue = '';\n this.hideTabsForDetailRoute = false;\n return;\n }\n\n const { value, hideTabs } = deriveBarNavValueFromUrl(\n this.currentUrl,\n this.basePath,\n tabs,\n );\n this.urlDerivedValue = value;\n this.hideTabsForDetailRoute = hideTabs;\n }\n\n private selectTab(id: string) {\n this.value = id;\n this.dsTabChange.emit(id);\n }\n\n /** Move focus to the selected tab in the visible tab group (after expand). */\n private focusVisibleSelectedTab() {\n const tab = this.visibleTabListEl?.querySelector(\n `[data-tab-id=\"${this.effectiveValue}\"]`,\n ) as HTMLElement | null;\n tab?.focus({ preventScroll: true });\n }\n\n private focusVisibleTab(id: string) {\n this.focusedTabId = id;\n const tab = this.visibleTabListEl?.querySelector(\n `[data-tab-id=\"${id}\"]`,\n ) as HTMLElement | null;\n tab?.focus({ preventScroll: true });\n }\n\n private focusLastVisibleTab() {\n const last = [...this.renderedSelectableTabs].reverse().find(tab => !tab.isInactive);\n if (last) this.focusVisibleTab(last.id);\n }\n\n private findEnabledVisibleTab(from: number, step: 1 | -1): number | null {\n const tabs = this.renderedSelectableTabs;\n for (let index = from + step; index >= 0 && index < tabs.length; index += step) {\n if (!tabs[index]?.isInactive) return index;\n }\n return null;\n }\n\n private handleTabKeyDown(e: KeyboardEvent) {\n const tabs = this.renderedSelectableTabs;\n if (!tabs.length) return;\n const targetId = (e.target as HTMLElement | null)?.getAttribute('data-tab-id');\n const focusedId = targetId ?? this.focusedTabId;\n\n if (e.key === 'Enter' || e.key === ' ') {\n const focused = tabs.find(tab => tab.id === focusedId);\n if (!focused || focused.isInactive) return;\n e.preventDefault();\n this.selectTab(focused.id);\n return;\n }\n\n const currentIndex = tabs.findIndex(tab => tab.id === focusedId);\n if (currentIndex < 0) return;\n\n let nextIndex: number | null;\n if (e.key === 'ArrowRight') {\n nextIndex = this.findEnabledVisibleTab(currentIndex, 1);\n if (nextIndex === null && this.hasOverflowTabs) {\n e.preventDefault();\n this.overflowRovingFocused = true;\n void this.triggerEl?.setFocus?.();\n return;\n }\n } else if (e.key === 'ArrowLeft') {\n nextIndex = this.findEnabledVisibleTab(currentIndex, -1);\n } else if (e.key === 'Home') {\n nextIndex = tabs.findIndex(tab => !tab.isInactive);\n } else if (e.key === 'End') {\n const reversedIndex = [...tabs].reverse().findIndex(tab => !tab.isInactive);\n nextIndex = reversedIndex < 0 ? null : tabs.length - 1 - reversedIndex;\n } else {\n return;\n }\n\n if (nextIndex === null || nextIndex < 0 || nextIndex === currentIndex) return;\n e.preventDefault();\n this.focusVisibleTab(tabs[nextIndex].id);\n }\n\n private toggleTabMenu(options?: { focusVisible?: boolean }) {\n if (this.menuOpen) {\n this.menuOpen = false;\n this.menuInitialFocusVisible = false;\n return;\n }\n\n if (this.menuEl && this.triggerEl) {\n this.menuEl.anchor = this.triggerEl;\n this.menuEl.minWidth = '';\n this.syncMenuSections();\n }\n\n this.menuInitialFocusVisible = options?.focusVisible ?? false;\n this.menuTriggerActive = true;\n this.menuOpen = true;\n }\n\n private handleOverflowFocus = () => {\n this.overflowRovingFocused = true;\n };\n\n private handleOverflowBlur = () => {\n this.overflowRovingFocused = false;\n };\n\n private handleTriggerKeyDown(e: KeyboardEvent) {\n if (!this.hasOverflowTabs) return;\n\n if (!this.menuOpen) {\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this.overflowRovingFocused = false;\n this.focusLastVisibleTab();\n return;\n }\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.toggleTabMenu({ focusVisible: true });\n }\n return;\n }\n\n if (e.key === 'Escape') {\n e.preventDefault();\n this.menuOpen = false;\n this.menuInitialFocusVisible = false;\n void this.triggerEl?.setFocus?.();\n }\n }\n\n private renderTabList(tabs: BarNavTab[], probe: boolean) {\n return (\n <div\n role=\"tablist\"\n class=\"bar-nav__tab-list\"\n aria-label={this.heading}\n ref={el => {\n if (probe) {\n const next = (el as HTMLElement) ?? null;\n if (next === this.probeTabListEl) return;\n this.probeTabListEl = next;\n if (next) {\n this.intrinsicWidthRetryCount = 0;\n this.tabLayoutPendingFrames = 0;\n this.scheduleOverflowCheck();\n }\n } else {\n this.visibleTabListEl = (el as HTMLElement) ?? null;\n }\n }}\n onKeyDown={probe ? undefined : (e: KeyboardEvent) => this.handleTabKeyDown(e)}\n onFocusin={probe ? undefined : () => {\n this.overflowRovingFocused = false;\n }}\n >\n {tabs.map((tab, index) => {\n if (isTabDivider(tab)) {\n return (\n <div class=\"bar-nav__tab-divider\" key={`divider-${index}`} aria-hidden=\"true\">\n <div class=\"bar-nav__tab-divider-line\" />\n </div>\n );\n }\n\n const isSelected = tab.id === this.effectiveValue;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n data-tab-id={tab.id}\n class={{\n 'bar-nav__tab': true,\n 'bar-nav__tab--selected': isSelected,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-control-inactive': !!tab.isInactive,\n }}\n aria-selected={isSelected ? 'true' : 'false'}\n aria-disabled={tab.isInactive ? 'true' : undefined}\n aria-controls={tab.panelId ?? undefined}\n disabled={tab.isInactive}\n tabIndex={\n !probe && !this.overflowRovingFocused && tab.id === this.focusedTabId\n ? 0\n : -1\n }\n onClick={() => !probe && !tab.isInactive && this.selectTab(tab.id)}\n onFocus={() => {\n if (!probe) this.focusedTabId = tab.id;\n }}\n >\n <span\n class={{\n 'bar-nav__tab-label': true,\n 'ds-control-label-box': true,\n 'ds-control-label-dot': !!tab.dot,\n 'bar-nav__tab-label--dot': !!tab.dot,\n }}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" emphasis={isSelected} color=\"inherit\">\n {tab.label}\n </ds-text>\n {tab.dot && (\n <ds-badge\n class=\"bar-nav__tab-dot ds-control-label-dot__badge\"\n variant=\"dot\"\n hasRing={false}\n label=\"\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </button>\n );\n })}\n </div>\n );\n }\n\n render() {\n // Section gating only applies when `basePath` is set (SPA section sync).\n // Tabs without a base path must still render — otherwise a single-tab bar\n // (or any non-routed tabs) silently falls through to an empty header.\n const sectionReady =\n this.basePath === '' || this.committedSection === this.basePath;\n const hasTabs =\n sectionReady && this.resolvedTabs.length > 0 && !this.hideTabsForDetailRoute;\n const tabGroupKey = this.basePath || 'no-section';\n const renderedTabs = this.hasOverflowTabs ? this.visibleTabs : this.resolvedTabs;\n\n return (\n <Host>\n <header\n class={{\n 'bar-nav': true,\n 'ds-control--md': true,\n 'ds-chrome-row': true,\n 'ds-chrome-space--md': true,\n 'bar-nav--dashboard': this.navStyle === 'dashboard',\n 'bar-nav--settings': this.navStyle === 'settings',\n 'bar-nav--tabs-collapsed':\n hasTabs && this.hasOverflowTabs,\n }}\n ref={el => {\n this.headerEl = el as HTMLElement;\n if (el && !this.resizeObserver) {\n this.setupOverflowObserver();\n }\n }}\n >\n {hasTabs && (\n <div class=\"bar-nav__tabs-probe\" aria-hidden=\"true\" inert>\n <div key={`probe-${tabGroupKey}`}>\n {this.renderTabList(this.resolvedTabs, true)}\n </div>\n </div>\n )}\n\n {hasTabs && this.tabLayoutCommitted && renderedTabs.length > 0 && (\n <div class=\"bar-nav__left\">\n <div key={`visible-${tabGroupKey}`} class=\"bar-nav__tabs-visible\">\n {this.renderTabList(renderedTabs, false)}\n </div>\n </div>\n )}\n\n {hasTabs && !this.tabLayoutCommitted && (\n <div class=\"bar-nav__tabs-pending\" aria-hidden=\"true\" />\n )}\n\n {!hasTabs && this.heading && (\n <ds-text\n class=\"bar-nav__heading\"\n lineTruncation={1}\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis\n color=\"primary\"\n wrap=\"nowrap\"\n >\n {this.heading}\n </ds-text>\n )}\n\n {hasTabs && this.hasOverflowTabs && (\n <ds-button-unfilled variant=\"icon\"\n class={{\n 'bar-nav__overflow-trigger': true,\n }}\n icon=\"ChevronDown\"\n activeFill={false}\n hasBorder={false}\n focusTabIndex={this.overflowRovingFocused ? 0 : -1}\n ref={(el?: HTMLDsButtonUnfilledElement) => {\n this.triggerEl = (el as (HTMLElement & { setFocus?: () => Promise<void> })) ?? null;\n }}\n haspopup=\"menu\"\n expanded={this.menuTriggerActive}\n aria-label={this.moreTabsLabel}\n onDsClick={() => this.toggleTabMenu({ focusVisible: false })}\n onFocusin={this.handleOverflowFocus}\n onFocusout={this.handleOverflowBlur}\n onKeyDown={(e: KeyboardEvent) => this.handleTriggerKeyDown(e)}\n />\n )}\n\n </header>\n\n {hasTabs && this.hasOverflowTabs && (\n <ds-menu\n ref={el => {\n this.menuEl = (el as HTMLDsMenuElement) ?? null;\n }}\n open={this.menuOpen}\n sections={tabsToOverflowMenuSections(this.overflowTabs, this.effectiveValue)}\n side=\"bottom\"\n align=\"end\"\n sideOffset=\"calc(var(--dimension-space-100) + var(--dimension-space-050))\"\n initialFocusVisible={this.menuInitialFocusVisible}\n onDsSelect={(e: Event) => this.handleMenuSelect(e)}\n onDsClose={() => this.handleMenuClose()}\n onDsAfterClose={() => this.handleMenuAfterClose()}\n />\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["resolveMobileSectionPosition","sections","value","selectable","getSelectableTabs","matchedIndex","findIndex","section","id","selectedIndex","selected","hasPrevious","hasNext","length","mobileSectionSwitcherCss","nextMobileSectionSwitcherId","MobileSectionSwitcher","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","navigationLabel","menuOpen","initialFocusVisible","instanceId","triggerId","menuId","triggerEl","toggleMenu","event","selectableSections","detail","closeMenu","handleSelect","String","find","candidate","isInactive","selectedSection","dsChange","emit","requestAnimationFrame","focus","resolvedSections","triggerAriaLabel","label","menuSections","groups","items","commit","push","isTabDivider","dot","isSelected","handleSectionsChange","render","h","Host","ref","element","class","type","onClick","as","variant","emphasis","color","lineTruncation","anchorId","align","menuLabel","open","onDsClose","onDsSelect"],"sources":["src/wc/components/MobileSectionSwitcher/mobile-section-switcher-utils.ts","src/wc/components/MobileSectionSwitcher/MobileSectionSwitcher.css?tag=ds-mobile-section-switcher&encapsulation=scoped","src/wc/components/MobileSectionSwitcher/MobileSectionSwitcher.tsx"],"sourcesContent":["import { getSelectableTabs, type TabItem, type TabItemTab } from '../TabGroup/tab-item-utils';\n\nexport interface MobileSectionPosition {\n selectedIndex: number;\n selected?: TabItemTab;\n hasPrevious: boolean;\n hasNext: boolean;\n}\n\n/** Resolve ordered selectable neighbors while ignoring visual divider entries. */\nexport function resolveMobileSectionPosition(\n sections: TabItem[],\n value: string\n): MobileSectionPosition {\n const selectable = getSelectableTabs(sections);\n const matchedIndex = selectable.findIndex(section => section.id === value);\n const selectedIndex = matchedIndex >= 0 ? matchedIndex : 0;\n return {\n selectedIndex,\n selected: selectable[selectedIndex],\n hasPrevious: selectedIndex > 0,\n hasNext: selectedIndex < selectable.length - 1,\n };\n}\n\n","@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n\n:host {\n display: block;\n min-width: 0;\n max-width: 100%;\n color: var(--color-foreground-primary);\n}\n\n.mobile-section-switcher {\n appearance: none;\n display: grid;\n grid-template-columns: var(--dimension-size-100) minmax(0, auto) var(--dimension-size-100);\n align-items: center;\n justify-content: center;\n gap: var(--dimension-space-050);\n max-width: 100%;\n min-height: var(--dimension-size-400);\n padding-inline: var(--dimension-space-100);\n border: 0;\n border-radius: var(--dimension-radius-100);\n background: var(--color-background-secondary);\n color: inherit;\n box-sizing: border-box;\n cursor: default;\n}\n\n.mobile-section-switcher--expanded {\n background: var(--color-background-tertiary);\n}\n\n.mobile-section-switcher__label {\n min-width: 0;\n max-width: 100%;\n text-align: center;\n}\n\n.mobile-section-switcher__position {\n width: var(--dimension-size-050);\n height: var(--dimension-size-050);\n border-radius: var(--dimension-radius-half);\n background: currentColor;\n opacity: 0;\n}\n\n.mobile-section-switcher__position--visible {\n opacity: 1;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport {\n getSelectableTabs,\n isTabDivider,\n type TabItem,\n type TabItemTab,\n} from '../TabGroup/tab-item-utils';\nimport { resolveMobileSectionPosition } from './mobile-section-switcher-utils';\n\nlet nextMobileSectionSwitcherId = 0;\n\n@Component({\n tag: 'ds-mobile-section-switcher',\n styleUrl: 'MobileSectionSwitcher.css',\n scoped: true,\n})\nexport class MobileSectionSwitcher {\n @Element() el!: HTMLElement;\n\n /** Ordered controlled sections. Divider entries group the popup menu. */\n @Prop() sections: TabItem[] = [];\n /** Controlled selected section id. */\n @Prop() value: string = '';\n /** Accessible name for the section chooser. */\n @Prop() navigationLabel: string = 'Change page section';\n\n /** Selection intent. The route, tool, or workflow owner updates `value`. */\n @Event() dsChange!: EventEmitter<string>;\n\n @State() private menuOpen = false;\n @State() private initialFocusVisible = false;\n\n private readonly instanceId = nextMobileSectionSwitcherId++;\n private readonly triggerId = `ds-mobile-section-switcher-trigger-${this.instanceId}`;\n private readonly menuId = `ds-mobile-section-switcher-menu-${this.instanceId}`;\n private triggerEl: HTMLButtonElement | null = null;\n\n private get resolvedSections(): TabItem[] {\n return this.sections ?? [];\n }\n\n private get selectableSections(): TabItemTab[] {\n return getSelectableTabs(this.resolvedSections);\n }\n\n private get selectedIndex(): number {\n return resolveMobileSectionPosition(this.resolvedSections, this.value).selectedIndex;\n }\n\n private get selectedSection(): TabItemTab | undefined {\n return this.selectableSections[this.selectedIndex];\n }\n\n private get hasPrevious(): boolean {\n return resolveMobileSectionPosition(this.resolvedSections, this.value).hasPrevious;\n }\n\n private get hasNext(): boolean {\n return resolveMobileSectionPosition(this.resolvedSections, this.value).hasNext;\n }\n\n private get triggerAriaLabel(): string {\n return `${this.navigationLabel}. Current section: ${this.selectedSection?.label ?? ''}`;\n }\n\n private get menuSections(): MenuSection[] {\n const groups: MenuSection[] = [];\n let items: MenuItemData[] = [];\n const commit = () => {\n if (items.length) groups.push({ items });\n items = [];\n };\n\n for (const section of this.resolvedSections) {\n if (isTabDivider(section)) {\n commit();\n continue;\n }\n items.push({\n label: section.label,\n value: section.id,\n dot: section.dot,\n isSelected: section.id === this.selectedSection?.id,\n isInactive: section.isInactive,\n });\n }\n commit();\n return groups;\n }\n\n @Watch('sections')\n handleSectionsChange() {\n if (this.selectableSections.length <= 1) this.closeMenu();\n }\n\n private toggleMenu = (event: MouseEvent) => {\n if (this.selectableSections.length <= 1) return;\n this.initialFocusVisible = event.detail === 0;\n this.menuOpen = !this.menuOpen;\n };\n\n private closeMenu = () => {\n this.menuOpen = false;\n };\n\n private handleSelect = (event: CustomEvent<MenuItemData>) => {\n const id = String(event.detail.value ?? '');\n const section = this.selectableSections.find(candidate => candidate.id === id);\n if (!section || section.isInactive) return;\n this.closeMenu();\n if (id !== this.selectedSection?.id) this.dsChange.emit(id);\n requestAnimationFrame(() => this.triggerEl?.focus());\n };\n\n render() {\n const selected = this.selectedSection;\n if (!selected) return <Host />;\n\n return (\n <Host>\n <button\n ref={element => {\n this.triggerEl = element ?? null;\n }}\n id={this.triggerId}\n class={{\n 'mobile-section-switcher': true,\n 'mobile-section-switcher--expanded': this.menuOpen,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-controls={this.menuId}\n aria-expanded={String(this.menuOpen)}\n aria-label={this.triggerAriaLabel}\n onClick={this.toggleMenu}\n >\n <span\n class={{\n 'mobile-section-switcher__position': true,\n 'mobile-section-switcher__position--visible': this.hasPrevious,\n 'ds-interaction-fill__content': true,\n }}\n aria-hidden=\"true\"\n />\n <ds-text\n class=\"mobile-section-switcher__label ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis\n color=\"inherit\"\n lineTruncation={1}\n >\n {selected.label}\n </ds-text>\n <span\n class={{\n 'mobile-section-switcher__position': true,\n 'mobile-section-switcher__position--visible': this.hasNext,\n 'ds-interaction-fill__content': true,\n }}\n aria-hidden=\"true\"\n />\n </button>\n\n {this.selectableSections.length > 1 ? (\n <ds-menu\n id={this.menuId}\n anchorId={this.triggerId}\n align=\"center\"\n menuLabel={this.navigationLabel}\n open={this.menuOpen}\n initialFocusVisible={this.initialFocusVisible}\n sections={this.menuSections}\n onDsClose={this.closeMenu}\n onDsSelect={this.handleSelect}\n />\n ) : null}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -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","collisionBounds","boundary","collisionRect","viewportWidth","viewportHeight","viewportPadPx","mainAxisOverflow","position","bounds","Math","max","clampToBounds","value","size","minimum","maximumEdge","maximum","min","computeAnchoredPosition","preferred","oppositeSide","opposite","preferredOverflow","oppositeOverflow","useOpposite","resolvedSide","availableHeight","POSITION_RETRY_BUDGET","AnchoredPositionController","constructor","options","this","scrollResizeHandler","resizeObserver","retryRaf","liveRaf","anchorMotionRaf","activeAnchorMotions","ownerDocument","last","isReady","anchorMotionStartHandler","event","eventCanMoveAnchor","scheduleAnchorMotionUpdate","anchorMotionEndHandler","ready","observe","bindListeners","unobserve","unbindListeners","cancel","schedule","onReady","cancelRetry","remaining","retryBudget","attempt","update","requestAnimationFrame","getAnchor","popup","getPopup","observeResizeTargets","topLayer","showPopover","matches","measure","next","apply","scheduleLiveUpdate","mode","liveUpdate","cancelAnimationFrame","window","addEventListener","observeResize","ResizeObserver","observeAnchorMotion","getOwnerDocument","removeEventListener","disconnect","target","Element","contains","tick","isConnected","ANCHORED_OVERLAY_BOUNDARY_ATTRIBUTE","composedParentElement","element","assignedSlot","parentElement","root","getRootNode","ShadowRoot","host","findAnchoredOverlayBoundary","current","HTMLElement","hasAttribute","resolveAnchoredOverlayBoundaryRect","explicitBoundary","undefined","getBoundingClientRect"],"sources":["src/wc/utils/anchored-position.ts","src/wc/utils/anchored-position-controller.ts","src/wc/utils/anchored-overlay-boundary.ts"],"sourcesContent":["export type AnchoredSide = 'top' | 'right' | 'bottom' | 'left';\nexport type AnchoredAlign = 'start' | 'center' | 'end';\n\nexport type AnchoredCollisionRect = Pick<\n DOMRectReadOnly,\n 'top' | 'left' | 'right' | 'bottom' | 'width' | 'height'\n>;\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 /** Optional page or panel collision rectangle in viewport-fixed coordinates. */\n collisionRect?: AnchoredCollisionRect;\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 /** Vertical room available on the resolved side inside the padded viewport. */\n availableHeight: number;\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 collisionBounds(input: AnchoredPositionInput) {\n const boundary = input.collisionRect ?? {\n top: 0,\n left: 0,\n right: input.viewportWidth,\n bottom: input.viewportHeight,\n };\n return {\n top: boundary.top + input.viewportPadPx,\n left: boundary.left + input.viewportPadPx,\n right: boundary.right - input.viewportPadPx,\n bottom: boundary.bottom - input.viewportPadPx,\n };\n}\n\nfunction mainAxisOverflow(\n input: AnchoredPositionInput,\n side: AnchoredSide,\n position: Pick<AnchoredPosition, 'x' | 'y'>,\n): number {\n const { popupWidth, popupHeight } = input;\n const bounds = collisionBounds(input);\n\n if (side === 'top' || side === 'bottom') {\n return Math.max(bounds.top - position.y, 0) +\n Math.max(position.y + popupHeight - bounds.bottom, 0);\n }\n\n return Math.max(bounds.left - position.x, 0) +\n Math.max(position.x + popupWidth - bounds.right, 0);\n}\n\nfunction clampToBounds(value: number, size: number, minimum: number, maximumEdge: number): number {\n const maximum = Math.max(minimum, maximumEdge - size);\n return Math.min(Math.max(value, minimum), 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 collision boundary and\n * the opposite side spills less, placement flips on the main axis; the result is\n * then clamped into that boundary on both axes. The viewport is the fallback when\n * no page or panel collision rectangle is supplied. 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 bounds = collisionBounds(input);\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 const availableHeight =\n resolvedSide === 'top'\n ? input.anchorRect.top - bounds.top - input.sideOffsetPx\n : resolvedSide === 'bottom'\n ? bounds.bottom - input.anchorRect.bottom - input.sideOffsetPx\n : bounds.bottom - bounds.top;\n\n return {\n x: clampToBounds(position.x, input.popupWidth, bounds.left, bounds.right),\n y: clampToBounds(position.y, input.popupHeight, bounds.top, bounds.bottom),\n resolvedSide,\n availableHeight: Math.max(0, availableHeight),\n };\n}\n","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 /** Stable owner fallback when framework bindings assign open before anchor. */\n getOwnerDocument?: () => Document | 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 /**\n * Follow CSS transitions or animations that move the anchor without resizing\n * it. The observer only runs a measurement loop while related motion is active.\n */\n observeAnchorMotion?: 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 anchorMotionRaf: number | null = null;\n private activeAnchorMotions = 0;\n private ownerDocument: Document | null = null;\n private last: AnchoredPosition | null = null;\n private isReady = false;\n private readonly anchorMotionStartHandler = (event: Event) => {\n if (!this.eventCanMoveAnchor(event)) return;\n this.activeAnchorMotions += 1;\n this.scheduleAnchorMotionUpdate();\n };\n private readonly anchorMotionEndHandler = (event: Event) => {\n if (!this.eventCanMoveAnchor(event)) return;\n this.activeAnchorMotions = Math.max(0, this.activeAnchorMotions - 1);\n this.scheduleAnchorMotionUpdate();\n };\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 this.observeResizeTargets();\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 this.last.availableHeight !== next.availableHeight\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 if (this.anchorMotionRaf !== null) {\n cancelAnimationFrame(this.anchorMotionRaf);\n this.anchorMotionRaf = 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 if (this.options.observeAnchorMotion) {\n this.ownerDocument =\n this.options.getAnchor()?.ownerDocument ?? this.options.getOwnerDocument?.() ?? null;\n this.ownerDocument?.addEventListener('transitionrun', this.anchorMotionStartHandler, true);\n this.ownerDocument?.addEventListener('transitionend', this.anchorMotionEndHandler, true);\n this.ownerDocument?.addEventListener('transitioncancel', this.anchorMotionEndHandler, true);\n this.ownerDocument?.addEventListener('animationstart', this.anchorMotionStartHandler, true);\n this.ownerDocument?.addEventListener('animationend', this.anchorMotionEndHandler, true);\n this.ownerDocument?.addEventListener('animationcancel', this.anchorMotionEndHandler, true);\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 this.ownerDocument?.removeEventListener('transitionrun', this.anchorMotionStartHandler, true);\n this.ownerDocument?.removeEventListener('transitionend', this.anchorMotionEndHandler, true);\n this.ownerDocument?.removeEventListener('transitioncancel', this.anchorMotionEndHandler, true);\n this.ownerDocument?.removeEventListener('animationstart', this.anchorMotionStartHandler, true);\n this.ownerDocument?.removeEventListener('animationend', this.anchorMotionEndHandler, true);\n this.ownerDocument?.removeEventListener('animationcancel', this.anchorMotionEndHandler, true);\n this.ownerDocument = null;\n this.activeAnchorMotions = 0;\n }\n\n private eventCanMoveAnchor(event: Event): boolean {\n const anchor = this.options.getAnchor();\n const target = event.target;\n if (!anchor || !(target instanceof Element)) return false;\n // Motion on the anchor or one of its layout ancestors can move its rect.\n // Descendant-only animation is irrelevant unless it resizes the anchor,\n // which the ResizeObserver path already covers.\n return target === anchor || target.contains(anchor);\n }\n\n private scheduleAnchorMotionUpdate(): void {\n if (this.anchorMotionRaf !== null) return;\n const tick = () => {\n this.anchorMotionRaf = null;\n this.update();\n if (this.activeAnchorMotions <= 0 || !this.options.getAnchor()?.isConnected) {\n this.activeAnchorMotions = 0;\n return;\n }\n this.anchorMotionRaf = requestAnimationFrame(tick);\n };\n this.anchorMotionRaf = requestAnimationFrame(tick);\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","import type { AnchoredCollisionRect } from './anchored-position';\n\n/** Attribute placed on a page or panel whose visible rectangle owns anchored overlays. */\nexport const ANCHORED_OVERLAY_BOUNDARY_ATTRIBUTE = 'data-ds-overlay-boundary';\n\n/** An element-owned collision rectangle, or an explicit escape to the viewport. */\nexport type AnchoredOverlayBoundary = HTMLElement | 'viewport';\n\nfunction composedParentElement(element: Element): Element | null {\n if (element.assignedSlot) return element.assignedSlot;\n if (element.parentElement) return element.parentElement;\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root.host : null;\n}\n\n/**\n * Find the nearest collision owner through light DOM, assigned slots, and open\n * shadow roots. The popup may live in the top layer or a body portal; ownership\n * follows its anchor instead of the popup's rendering location.\n */\nexport function findAnchoredOverlayBoundary(anchor: Element): HTMLElement | null {\n let current: Element | null = anchor;\n while (current) {\n if (\n current instanceof HTMLElement &&\n current.hasAttribute(ANCHORED_OVERLAY_BOUNDARY_ATTRIBUTE)\n ) {\n return current;\n }\n current = composedParentElement(current);\n }\n return null;\n}\n\n/** Resolve an explicit owner first, then the nearest composed-tree boundary. */\nexport function resolveAnchoredOverlayBoundaryRect(\n anchor: Element,\n explicitBoundary?: AnchoredOverlayBoundary,\n): AnchoredCollisionRect | undefined {\n if (explicitBoundary === 'viewport') return undefined;\n return (explicitBoundary ?? findAnchoredOverlayBoundary(anchor))?.getBoundingClientRect();\n}\n"],"mappings":"AAgCA,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,EAAgBb,GACvB,MAAMc,EAAWd,EAAMe,eAAiB,CACtCpB,IAAK,EACLG,KAAM,EACNF,MAAOI,EAAMgB,cACbnB,OAAQG,EAAMiB,gBAEhB,MAAO,CACLtB,IAAKmB,EAASnB,IAAMK,EAAMkB,cAC1BpB,KAAMgB,EAAShB,KAAOE,EAAMkB,cAC5BtB,MAAOkB,EAASlB,MAAQI,EAAMkB,cAC9BrB,OAAQiB,EAASjB,OAASG,EAAMkB,cAEpC,CAEA,SAASC,EACPnB,EACAC,EACAmB,GAEA,MAAMhB,WAAEA,EAAUC,YAAEA,GAAgBL,EACpC,MAAMqB,EAASR,EAAgBb,GAE/B,GAAIC,IAAS,OAASA,IAAS,SAAU,CACvC,OAAOqB,KAAKC,IAAIF,EAAO1B,IAAMyB,EAAST,EAAG,GACvCW,KAAKC,IAAIH,EAAST,EAAIN,EAAcgB,EAAOxB,OAAQ,E,CAGvD,OAAOyB,KAAKC,IAAIF,EAAOvB,KAAOsB,EAASX,EAAG,GACxCa,KAAKC,IAAIH,EAASX,EAAIL,EAAaiB,EAAOzB,MAAO,EACrD,CAEA,SAAS4B,EAAcC,EAAeC,EAAcC,EAAiBC,GACnE,MAAMC,EAAUP,KAAKC,IAAII,EAASC,EAAcF,GAChD,OAAOJ,KAAKQ,IAAIR,KAAKC,IAAIE,EAAOE,GAAUE,EAC5C,CAgBM,SAAUE,EAAwB/B,GACtC,MAAMqB,EAASR,EAAgBb,GAC/B,MAAMgC,EAAYjC,EAAYC,EAAOA,EAAMC,MAC3C,MAAMgC,EAAevC,EAAcM,EAAMC,MACzC,MAAMiC,EAAWnC,EAAYC,EAAOiC,GACpC,MAAME,EAAoBhB,EAAiBnB,EAAOA,EAAMC,KAAM+B,GAC9D,MAAMI,EAAmBjB,EAAiBnB,EAAOiC,EAAcC,GAC/D,MAAMG,EAAcF,EAAoB,GAAKC,EAAmBD,EAChE,MAAMG,EAAeD,EAAcJ,EAAejC,EAAMC,KACxD,MAAMmB,EAAWiB,EAAcH,EAAWF,EAC1C,MAAMO,EACJD,IAAiB,MACbtC,EAAME,WAAWP,IAAM0B,EAAO1B,IAAMK,EAAMO,aAC1C+B,IAAiB,SACfjB,EAAOxB,OAASG,EAAME,WAAWL,OAASG,EAAMO,aAChDc,EAAOxB,OAASwB,EAAO1B,IAE/B,MAAO,CACLc,EAAGe,EAAcJ,EAASX,EAAGT,EAAMI,WAAYiB,EAAOvB,KAAMuB,EAAOzB,OACnEe,EAAGa,EAAcJ,EAAST,EAAGX,EAAMK,YAAagB,EAAO1B,IAAK0B,EAAOxB,QACnEyC,eACAC,gBAAiBjB,KAAKC,IAAI,EAAGgB,GAEjC,CC7IA,MAAMC,EAAwB,E,MAyEjBC,EAsBX,WAAAC,CAAYC,GApBJC,KAAAC,oBAA2C,KAC3CD,KAAAE,eAAwC,KACxCF,KAAAG,SAA0B,KAC1BH,KAAAI,QAAyB,KACzBJ,KAAAK,gBAAiC,KACjCL,KAAAM,oBAAsB,EACtBN,KAAAO,cAAiC,KACjCP,KAAAQ,KAAgC,KAChCR,KAAAS,QAAU,MACDT,KAAAU,yBAA4BC,IAC3C,IAAKX,KAAKY,mBAAmBD,GAAQ,OACrCX,KAAKM,qBAAuB,EAC5BN,KAAKa,4BAA4B,EAElBb,KAAAc,uBAA0BH,IACzC,IAAKX,KAAKY,mBAAmBD,GAAQ,OACrCX,KAAKM,oBAAsB5B,KAAKC,IAAI,EAAGqB,KAAKM,oBAAsB,GAClEN,KAAKa,4BAA4B,EAIjCb,KAAKD,QAAUA,C,CAIjB,SAAIgB,GACF,OAAOf,KAAKS,O,CAUd,OAAAO,GACEhB,KAAKiB,e,CAIP,SAAAC,GACElB,KAAKmB,kBACLnB,KAAKoB,SACLpB,KAAKQ,KAAO,KACZR,KAAKS,QAAU,K,CAOjB,QAAAY,CAASC,GACPtB,KAAKuB,cACLvB,KAAKS,QAAU,MAEf,IAAIe,EAAYxB,KAAKD,QAAQ0B,aAAe7B,EAE5C,MAAM8B,EAAU,KACd1B,KAAKG,SAAW,KAChB,GAAIH,KAAK2B,SAAU,CACjB3B,KAAKS,QAAU,KACfT,KAAKD,QAAQuB,YACbA,MACA,M,CAEF,GAAIE,EAAY,EAAG,CACjBA,GAAa,EACbxB,KAAKG,SAAWyB,sBAAsBF,E,GAI1C1B,KAAKG,SAAWyB,sBAAsBF,E,CAIxC,MAAAC,GACE,MAAMpE,EAASyC,KAAKD,QAAQ8B,YAC5B,IAAKtE,EAAQ,OAAO,MACpB,MAAMuE,EAAQ9B,KAAKD,QAAQgC,WAC3B,IAAKD,EAAO,OAAO,MACnB9B,KAAKgC,uBAEL,GACEhC,KAAKD,QAAQkC,iBACNH,EAAMI,cAAgB,aAC5BJ,EAAMK,QAAQ,iBACf,CACA,IACEL,EAAMI,a,CACN,MAGA,OAAO,K,EAIX,MAAM9E,EAAQ4C,KAAKD,QAAQqC,QAAQ7E,EAAQuE,GAC3C,IAAK1E,EAAO,OAAO,MAEnB,MAAMiF,EAAOlD,EAAwB/B,GACrC,IACG4C,KAAKQ,MACNR,KAAKQ,KAAK3C,IAAMwE,EAAKxE,GACrBmC,KAAKQ,KAAKzC,IAAMsE,EAAKtE,GACrBiC,KAAKQ,KAAKd,eAAiB2C,EAAK3C,cAChCM,KAAKQ,KAAKb,kBAAoB0C,EAAK1C,gBACnC,CACAK,KAAKQ,KAAO6B,EACZrC,KAAKD,QAAQuC,MAAMD,E,CAErB,OAAO,I,CAIT,kBAAAE,GACE,MAAMC,EAAOxC,KAAKD,QAAQ0C,YAAc,OACxC,GAAID,IAAS,OAAQ,CACnBxC,KAAK2B,SACL,M,CAGF,GAAI3B,KAAKI,UAAY,KAAM,OAE3B,GAAIoC,IAAS,QAAS,CACpBxC,KAAKI,QAAUwB,uBAAsB,KACnC5B,KAAKI,QAAU,KACfJ,KAAK2B,QAAQ,IAEf,M,CAIF3B,KAAKI,QAAUwB,uBAAsB,KACnC5B,KAAK2B,SACL3B,KAAKI,QAAUwB,uBAAsB,KACnC5B,KAAKI,QAAU,KACfJ,KAAK2B,QAAQ,GACb,G,CAKN,MAAAP,GACEpB,KAAKuB,cACL,GAAIvB,KAAKI,UAAY,KAAM,CACzBsC,qBAAqB1C,KAAKI,SAC1BJ,KAAKI,QAAU,I,CAEjB,GAAIJ,KAAKK,kBAAoB,KAAM,CACjCqC,qBAAqB1C,KAAKK,iBAC1BL,KAAKK,gBAAkB,I,EAInB,WAAAkB,GACN,GAAIvB,KAAKG,WAAa,KAAM,OAC5BuC,qBAAqB1C,KAAKG,UAC1BH,KAAKG,SAAW,I,CAGV,aAAAc,GACNjB,KAAKmB,kBACLnB,KAAKC,oBAAsB,IAAMD,KAAKuC,qBAEtCI,OAAOC,iBAAiB,SAAU5C,KAAKC,oBAAqB,MAC5D0C,OAAOC,iBAAiB,SAAU5C,KAAKC,qBAEvC,GAAID,KAAKD,QAAQ8C,sBAAwBC,iBAAmB,YAAa,CACvE9C,KAAKE,eAAiB,IAAI4C,gBAAe,IAAM9C,KAAK2B,WACpD3B,KAAKgC,sB,CAGP,GAAIhC,KAAKD,QAAQgD,oBAAqB,CACpC/C,KAAKO,cACHP,KAAKD,QAAQ8B,aAAatB,eAAiBP,KAAKD,QAAQiD,sBAAwB,KAClFhD,KAAKO,eAAeqC,iBAAiB,gBAAiB5C,KAAKU,yBAA0B,MACrFV,KAAKO,eAAeqC,iBAAiB,gBAAiB5C,KAAKc,uBAAwB,MACnFd,KAAKO,eAAeqC,iBAAiB,mBAAoB5C,KAAKc,uBAAwB,MACtFd,KAAKO,eAAeqC,iBAAiB,iBAAkB5C,KAAKU,yBAA0B,MACtFV,KAAKO,eAAeqC,iBAAiB,eAAgB5C,KAAKc,uBAAwB,MAClFd,KAAKO,eAAeqC,iBAAiB,kBAAmB5C,KAAKc,uBAAwB,K,EAIjF,eAAAK,GACN,GAAInB,KAAKC,oBAAqB,CAC5B0C,OAAOM,oBAAoB,SAAUjD,KAAKC,oBAAqB,MAC/D0C,OAAOM,oBAAoB,SAAUjD,KAAKC,qBAC1CD,KAAKC,oBAAsB,I,CAE7BD,KAAKE,gBAAgBgD,aACrBlD,KAAKE,eAAiB,KACtBF,KAAKO,eAAe0C,oBAAoB,gBAAiBjD,KAAKU,yBAA0B,MACxFV,KAAKO,eAAe0C,oBAAoB,gBAAiBjD,KAAKc,uBAAwB,MACtFd,KAAKO,eAAe0C,oBAAoB,mBAAoBjD,KAAKc,uBAAwB,MACzFd,KAAKO,eAAe0C,oBAAoB,iBAAkBjD,KAAKU,yBAA0B,MACzFV,KAAKO,eAAe0C,oBAAoB,eAAgBjD,KAAKc,uBAAwB,MACrFd,KAAKO,eAAe0C,oBAAoB,kBAAmBjD,KAAKc,uBAAwB,MACxFd,KAAKO,cAAgB,KACrBP,KAAKM,oBAAsB,C,CAGrB,kBAAAM,CAAmBD,GACzB,MAAMpD,EAASyC,KAAKD,QAAQ8B,YAC5B,MAAMsB,EAASxC,EAAMwC,OACrB,IAAK5F,KAAY4F,aAAkBC,SAAU,OAAO,MAIpD,OAAOD,IAAW5F,GAAU4F,EAAOE,SAAS9F,E,CAGtC,0BAAAsD,GACN,GAAIb,KAAKK,kBAAoB,KAAM,OACnC,MAAMiD,EAAO,KACXtD,KAAKK,gBAAkB,KACvBL,KAAK2B,SACL,GAAI3B,KAAKM,qBAAuB,IAAMN,KAAKD,QAAQ8B,aAAa0B,YAAa,CAC3EvD,KAAKM,oBAAsB,EAC3B,M,CAEFN,KAAKK,gBAAkBuB,sBAAsB0B,EAAK,EAEpDtD,KAAKK,gBAAkBuB,sBAAsB0B,E,CAO/C,oBAAAtB,GACE,IAAKhC,KAAKE,eAAgB,OAC1B,MAAM4B,EAAQ9B,KAAKD,QAAQgC,WAC3B,GAAID,EAAO9B,KAAKE,eAAec,QAAQc,GACvC,MAAMvE,EAASyC,KAAKD,QAAQ8B,YAC5B,GAAItE,EAAQyC,KAAKE,eAAec,QAAQzD,E,EC3TrC,MAAMiG,EAAsC,2BAKnD,SAASC,EAAsBC,GAC7B,GAAIA,EAAQC,aAAc,OAAOD,EAAQC,aACzC,GAAID,EAAQE,cAAe,OAAOF,EAAQE,cAC1C,MAAMC,EAAOH,EAAQI,cACrB,OAAOD,aAAgBE,WAAaF,EAAKG,KAAO,IAClD,CAOM,SAAUC,EAA4B1G,GAC1C,IAAI2G,EAA0B3G,EAC9B,MAAO2G,EAAS,CACd,GACEA,aAAmBC,aACnBD,EAAQE,aAAaZ,GACrB,CACA,OAAOU,C,CAETA,EAAUT,EAAsBS,E,CAElC,OAAO,IACT,CAGM,SAAUG,EACd9G,EACA+G,GAEA,GAAIA,IAAqB,WAAY,OAAOC,UAC5C,OAAQD,GAAoBL,EAA4B1G,KAAUiH,uBACpE,Q","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as o,H as t,c as n,h as r,a as i,t as s}from"./index.js";import{d as a}from"./p-BFfLvMZd.js";import{d as e}from"./p-CAnnQL1F.js";import{C as c}from"./p-CuwopElg.js";const d=()=>`.ds-control--lg.sc-ds-tag,.ds-control--lg.sc-ds-tag-h,.ds-control--md.sc-ds-tag-h,.ds-control--md.sc-ds-tag,.ds-control--sm.sc-ds-tag-h,.ds-control--sm.sc-ds-tag,.ds-control--xs.sc-ds-tag-h,.ds-control--xs.sc-ds-tag{--ds-control-radius:var(--dimension-radius-025)}.ds-control--lg.sc-ds-tag-h,.ds-control--lg.sc-ds-tag{--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-tag-h,.ds-control--md.sc-ds-tag{--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-tag-h,.ds-control--sm.sc-ds-tag{--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-tag-h,.ds-control--xs.sc-ds-tag{--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-tag:root,.sc-ds-tag-h,.ds-forced-colors-scope.sc-ds-tag{--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-tag-h,.ds-interaction-fill.sc-ds-tag{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-tag-h::before,.ds-interaction-fill.sc-ds-tag::before,.ds-interaction-fill.sc-ds-tag-h::after,.ds-interaction-fill.sc-ds-tag::after{content:'';position:absolute;inset:0;border-radius:inherit;background:transparent;pointer-events:none;cursor:inherit;transition:none}.ds-interaction-fill.sc-ds-tag-h::before,.ds-interaction-fill.sc-ds-tag::before{z-index:1}.ds-interaction-fill.sc-ds-tag-h::after,.ds-interaction-fill.sc-ds-tag::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-tag-h,.ds-interaction-fill--bordered.sc-ds-tag{--ds-interaction-border-width:var(--dimension-stroke-width-012);--ds-interaction-border-color:var(--color-border-secondary)}.ds-interaction-fill--selected.sc-ds-tag-h::before,.ds-interaction-fill--selected.sc-ds-tag::before{background:var(--ds-interaction-active)}.ds-interaction-fill--selected.sc-ds-tag-h,.ds-interaction-fill--selected.sc-ds-tag{--ds-interaction-dot-ring:var(--ds-interaction-active)}@media (hover: hover) and (pointer: fine){.ds-interaction-fill.sc-ds-tag-h:hover:not(:disabled)::after,.ds-interaction-fill.sc-ds-tag:hover:not(:disabled)::after{background:var(--ds-interaction-hover)}}.ds-interaction-fill.sc-ds-tag-h:active:not(:disabled)::after,.ds-interaction-fill.sc-ds-tag:active:not(:disabled)::after{background:var(--ds-interaction-pressed)}.ds-interaction-fill--grouped.sc-ds-tag-h::after,.ds-interaction-fill--grouped.sc-ds-tag::after,.ds-interaction-fill--grouped.sc-ds-tag-h:active:not(:disabled)::after,.ds-interaction-fill--grouped.sc-ds-tag:active:not(:disabled)::after{background:var(--ds-interaction-group-fill, transparent)}@media (hover: hover) and (pointer: fine){.ds-interaction-fill--grouped.sc-ds-tag-h:hover:not(:disabled)::after,.ds-interaction-fill--grouped.sc-ds-tag:hover:not(:disabled)::after{background:var(--ds-interaction-group-fill, transparent)}}.ds-interaction-fill--grouped.sc-ds-tag-h,.ds-interaction-fill--grouped.sc-ds-tag{--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-tag-h>.ds-interaction-fill__content.sc-ds-tag,.ds-interaction-fill.sc-ds-tag>.ds-interaction-fill__content.sc-ds-tag,.ds-interaction-fill__content.sc-ds-tag{position:relative;z-index:2;cursor:inherit}.ds-interaction-fill--on-faint.sc-ds-tag-h,.ds-interaction-fill--on-faint.sc-ds-tag{--ds-interaction-active:var(--color-interaction-active)}.ds-interaction-fill--on-medium.sc-ds-tag-h,.ds-interaction-fill--on-medium.sc-ds-tag{--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-tag-h,.ds-interaction-fill--on-bold.sc-ds-tag{--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-tag-h,.ds-interaction-fill--on-strong.sc-ds-tag{--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-tag-h,.ds-interaction-fill--on-translucent.sc-ds-tag{--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-tag-h,.ds-interaction-fill--on-inverted.sc-ds-tag{--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-tag-h,.ds-interaction-fill--on-media.sc-ds-tag{--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-tag-h,.ds-interaction-fill--on-always-dark.sc-ds-tag{--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-tag-h,.ds-interaction-fill--on-navigation.sc-ds-tag{--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-tag-h::after,.ds-interaction-fill.sc-ds-tag::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-tag-h::before,.ds-interaction-fill--selected.sc-ds-tag::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-tag-h:hover:not(:disabled):not(:focus-visible):not(:focus-within):not(.ds-focus-ring--visible)::after,.ds-interaction-fill.sc-ds-tag: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-tag:root,.sc-ds-tag-h,.ds-forced-colors-scope.sc-ds-tag{--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-tag-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-tag-h,.ds-focus-ring.sc-ds-tag,.ds-focus-ring-inset.sc-ds-tag-h,.ds-focus-ring-inset.sc-ds-tag{outline:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation}.ds-focus-ring.sc-ds-tag-h:focus-visible,.ds-focus-ring.sc-ds-tag: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-tag-h,.ds-focus-ring.ds-focus-ring--visible.sc-ds-tag{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-tag-h:focus-visible,.ds-focus-ring-inset.sc-ds-tag:focus-visible{outline:none}.ds-focus-ring-inset.sc-ds-tag-h:focus-visible::after,.ds-focus-ring-inset.sc-ds-tag: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-tag-h,.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-tag{outline:none}.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-tag-h::after,.ds-focus-ring-inset.ds-focus-ring--visible.sc-ds-tag::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-tag-h{--ds-focus-ring-color:var(--ds-forced-color-selected)}}@media (forced-colors: active){.sc-ds-tag:root,.sc-ds-tag-h,.ds-forced-colors-scope.sc-ds-tag{--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-tag-h,.ds-control-inactive.sc-ds-tag{opacity:var(--effect-opacity-medium);pointer-events:none;cursor:not-allowed}@media (forced-colors: active){.ds-control-inactive.sc-ds-tag-h,.ds-control-inactive.sc-ds-tag{color:var(--ds-forced-color-disabled);opacity:1}}.sc-ds-tag-h{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;color:var(--color-foreground-primary);position:relative;border-radius:var(--ds-control-radius, var(--dimension-radius-025));height:var(--ds-control-height);padding:0 var(--ds-control-padding-inline);gap:var(--ds-control-gap);user-select:none;-webkit-user-select:none}.tag--rounded.sc-ds-tag-h{border-radius:var(--dimension-radius-half)}.tag__label.sc-ds-tag{position:relative;z-index:2;padding:0 var(--ds-control-label-inset);white-space:nowrap;flex-shrink:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.ds-control--lg.ds-control--inset.sc-ds-tag-h,.ds-control--lg.ds-control--inset.sc-ds-tag{--ds-control-height:calc(var(--dimension-size-500) - var(--dimension-space-050));--ds-control-padding-inline:calc( var(--dimension-space-100) - var(--dimension-space-025) )}.ds-control--md.ds-control--inset.sc-ds-tag-h,.ds-control--md.ds-control--inset.sc-ds-tag{--ds-control-height:calc(var(--dimension-size-400) - var(--dimension-space-050));--ds-control-padding-inline:calc( var(--dimension-space-075) - var(--dimension-space-025) )}.ds-control--sm.ds-control--inset.sc-ds-tag-h,.ds-control--sm.ds-control--inset.sc-ds-tag{--ds-control-height:calc(var(--dimension-size-300) - var(--dimension-space-050));--ds-control-padding-inline:calc( var(--dimension-space-050) - var(--dimension-space-025) )}.ds-control--xs.ds-control--inset.sc-ds-tag-h,.ds-control--xs.ds-control--inset.sc-ds-tag{--ds-control-height:calc(var(--dimension-size-200) - var(--dimension-space-050));--ds-control-padding-inline:calc( var(--dimension-space-025) - var(--dimension-space-025) )}.ds-control--lg.ds-control--inset-double.sc-ds-tag-h,.ds-control--lg.ds-control--inset-double.sc-ds-tag{--ds-control-height:calc(var(--dimension-size-500) - var(--dimension-space-100));--ds-control-padding-inline:calc( var(--dimension-space-100) - var(--dimension-space-050) )}.ds-control--md.ds-control--inset-double.sc-ds-tag-h,.ds-control--md.ds-control--inset-double.sc-ds-tag{--ds-control-height:calc(var(--dimension-size-400) - var(--dimension-space-100));--ds-control-padding-inline:calc( var(--dimension-space-075) - var(--dimension-space-050) )}.ds-control--sm.ds-control--inset-double.sc-ds-tag-h,.ds-control--sm.ds-control--inset-double.sc-ds-tag{--ds-control-height:calc(var(--dimension-size-300) - var(--dimension-space-100));--ds-control-padding-inline:calc( var(--dimension-space-050) - var(--dimension-space-050) )}.sc-ds-tag-h{min-inline-size:var(--ds-control-height)}.tag--intent-neutral.tag--contrast-strong.sc-ds-tag-h{background-color:var(--color-background-strong-neutral);color:var(--color-foreground-medium-neutral)}.tag--intent-brand.tag--contrast-strong.sc-ds-tag-h{background-color:var(--color-background-strong-brand);color:var(--color-foreground-on-strong-background-primary)}.tag--intent-ai.tag--contrast-strong.sc-ds-tag-h{background-color:var(--color-background-strong-ai);color:var(--color-foreground-medium-ai)}.tag--intent-negative.tag--contrast-strong.sc-ds-tag-h{background-color:var(--color-background-strong-negative);color:var(--color-foreground-medium-negative)}.tag--intent-warning.tag--contrast-strong.sc-ds-tag-h{background-color:var(--color-background-strong-warning);color:var(--color-foreground-medium-warning)}.tag--intent-caution.tag--contrast-strong.sc-ds-tag-h{background-color:var(--color-background-strong-caution);color:var(--color-foreground-medium-caution)}.tag--intent-positive.tag--contrast-strong.sc-ds-tag-h{background-color:var(--color-background-strong-positive);color:var(--color-foreground-medium-positive)}.tag--intent-neutral.tag--contrast-bold.sc-ds-tag-h{background-color:var(--color-background-bold-neutral);color:var(--color-foreground-on-bold-background-primary)}.tag--intent-brand.tag--contrast-bold.sc-ds-tag-h{background-color:var(--color-background-bold-brand);color:var(--color-foreground-on-bold-background-primary)}.tag--intent-ai.tag--contrast-bold.sc-ds-tag-h{background-color:var(--color-background-bold-ai);color:var(--color-foreground-on-bold-background-primary)}.tag--intent-negative.tag--contrast-bold.sc-ds-tag-h{background-color:var(--color-background-bold-negative);color:var(--color-foreground-on-bold-background-primary)}.tag--intent-warning.tag--contrast-bold.sc-ds-tag-h{background-color:var(--color-background-bold-warning);color:var(--color-foreground-on-bold-background-primary)}.tag--intent-caution.tag--contrast-bold.sc-ds-tag-h{background-color:var(--color-background-bold-caution);color:var(--color-foreground-on-bold-background-primary)}.tag--intent-positive.tag--contrast-bold.sc-ds-tag-h{background-color:var(--color-background-bold-positive);color:var(--color-foreground-on-bold-background-primary)}.tag--intent-neutral.tag--contrast-medium.sc-ds-tag-h{background-color:var(--color-background-medium-neutral);color:var(--color-foreground-strong-neutral)}.tag--intent-brand.tag--contrast-medium.sc-ds-tag-h{background-color:var(--color-background-medium-brand);color:var(--color-foreground-on-medium-background-primary)}.tag--intent-ai.tag--contrast-medium.sc-ds-tag-h{background-color:var(--color-background-medium-ai);color:var(--color-foreground-strong-ai)}.tag--intent-negative.tag--contrast-medium.sc-ds-tag-h{background-color:var(--color-background-medium-negative);color:var(--color-foreground-strong-negative)}.tag--intent-warning.tag--contrast-medium.sc-ds-tag-h{background-color:var(--color-background-medium-warning);color:var(--color-foreground-strong-warning)}.tag--intent-caution.tag--contrast-medium.sc-ds-tag-h{background-color:var(--color-background-medium-caution);color:var(--color-foreground-strong-caution)}.tag--intent-positive.tag--contrast-medium.sc-ds-tag-h{background-color:var(--color-background-medium-positive);color:var(--color-foreground-strong-positive)}.tag--intent-neutral.tag--contrast-faint.sc-ds-tag-h{background-color:var(--color-background-faint-neutral);color:var(--color-foreground-bold-neutral)}.tag--intent-brand.tag--contrast-faint.sc-ds-tag-h{background-color:var(--color-background-faint-brand);color:var(--color-foreground-bold-brand)}.tag--intent-ai.tag--contrast-faint.sc-ds-tag-h{background-color:var(--color-background-faint-ai);color:var(--color-foreground-bold-ai)}.tag--intent-negative.tag--contrast-faint.sc-ds-tag-h{background-color:var(--color-background-faint-negative);color:var(--color-foreground-bold-negative)}.tag--intent-warning.tag--contrast-faint.sc-ds-tag-h{background-color:var(--color-background-faint-warning);color:var(--color-foreground-bold-warning)}.tag--intent-caution.tag--contrast-faint.sc-ds-tag-h{background-color:var(--color-background-faint-caution);color:var(--color-foreground-bold-caution)}.tag--intent-positive.tag--contrast-faint.sc-ds-tag-h{background-color:var(--color-background-faint-positive);color:var(--color-foreground-bold-positive)}.tag--interactive.sc-ds-tag-h{padding:0;gap:0}.tag__button.sc-ds-tag{all:unset;position:relative;z-index:0;display:flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:0;max-width:100%;height:100%;padding:0 var(--ds-control-padding-inline);gap:var(--ds-control-gap);border-radius:inherit;color:inherit;cursor:default}.tag__button.sc-ds-tag:disabled{cursor:not-allowed}.tag__button--expanded.sc-ds-tag::after{background:var(--ds-interaction-pressed)}.tag__prefix-icon.sc-ds-tag,.tag__suffix-icon.sc-ds-tag{position:relative;z-index:2;display:inline-flex;flex-shrink:0;width:var(--ds-control-icon);height:var(--ds-control-icon)}`;const l={md:"md",sm:"sm",xs:"xs"};const g=o(class o extends t{constructor(o){super();if(o!==false){this.__registerHost()}this.dsClick=n(this,"dsClick",7);this.icon="";this.intent="neutral";this.contrast="faint";this.size="md";this.isInset=false;this.insetDepth="single";this.rounded=false;this.interactive=false;this.expanded=false;this.isInactive=false;this.handleClick=o=>{if(!this.interactive||this.isInactive)return;this.dsClick.emit(o)}}render(){const o=c[this.size];const t=l[this.size];const n=this.isInset&&this.insetDepth==="double"&&this.size!=="xs";const s=this.maxWidth!=null?{maxWidth:typeof this.maxWidth==="number"?`${this.maxWidth}px`:this.maxWidth}:undefined;const a={tag:true,[`tag--intent-${this.intent}`]:true,[`tag--contrast-${this.contrast}`]:true,[`tag--size-${this.size}`]:true,"ds-control--md":this.size==="md","ds-control--sm":this.size==="sm","ds-control--xs":this.size==="xs","ds-control--inset":this.isInset&&!n,"ds-control--inset-double":n,"tag--rounded":this.rounded,"tag--interactive":this.interactive,"ds-control-inactive":this.interactive&&this.isInactive};const e=[this.icon&&r("ds-icon",{class:"tag__prefix-icon",name:this.icon,size:t,color:"inherit"}),r("ds-text",{class:"tag__label",as:"span",variant:o,color:"inherit"},this.label)];if(!this.interactive){return r(i,{class:a,style:s},e)}return r(i,{class:a,style:s},r("button",{type:"button",class:{tag__button:true,"tag__button--expanded":this.expanded,"ds-interaction-fill":true,"ds-focus-ring-inset":true},"aria-haspopup":"menu","aria-expanded":this.expanded?"true":"false","aria-controls":this.ariaControls,disabled:this.isInactive||undefined,onClick:this.handleClick},e,r("ds-icon",{class:"tag__suffix-icon",name:"ChevronUpDown",size:t,color:"inherit"})))}static get style(){return d()}},[2,"ds-tag",{label:[1],icon:[1],intent:[1],contrast:[1],size:[1],isInset:[4,"is-inset"],insetDepth:[1,"inset-depth"],rounded:[4],maxWidth:[8,"max-width"],interactive:[4],expanded:[4],ariaControls:[1,"aria-controls"],isInactive:[4,"is-inactive"]}]);function v(){if(typeof customElements==="undefined"){return}const o=["ds-tag","ds-icon","ds-text"];o.forEach((o=>{switch(o){case"ds-tag":if(!customElements.get(s(o))){customElements.define(s(o),g)}break;case"ds-icon":if(!customElements.get(s(o))){a()}break;case"ds-text":if(!customElements.get(s(o))){e()}break}}))}v();export{g as T,v as d};
2
- //# sourceMappingURL=p-Cg0kimXZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["tagCss","ICON_SIZE","md","sm","xs","Tag","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","icon","intent","contrast","size","isInset","insetDepth","rounded","interactive","expanded","isInactive","handleClick","event","dsClick","emit","render","textVariant","CONTROL_TEXT_VARIANT","iconSize","doubleInset","maxWidthStyle","maxWidth","undefined","hostClass","tag","content","h","class","name","color","as","variant","label","Host","style","type","tag__button","ariaControls","disabled","onClick"],"sources":["src/wc/components/Tag/Tag.css?tag=ds-tag&encapsulation=scoped","src/wc/components/Tag/Tag.tsx"],"sourcesContent":["@import '../../utils/tag-chip.css';\n@import '../../utils/control-density-inset.css';\n\n/* A one-character rounded Tag resolves to a circle at every density. */\n:host {\n min-inline-size: var(--ds-control-height);\n}\n\n/* ── Intent × Contrast — strong ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-strong) { background-color: var(--color-background-strong-neutral); color: var(--color-foreground-medium-neutral); }\n:host(.tag--intent-brand.tag--contrast-strong) { background-color: var(--color-background-strong-brand); color: var(--color-foreground-on-strong-background-primary); }\n:host(.tag--intent-ai.tag--contrast-strong) { background-color: var(--color-background-strong-ai); color: var(--color-foreground-medium-ai); }\n:host(.tag--intent-negative.tag--contrast-strong) { background-color: var(--color-background-strong-negative); color: var(--color-foreground-medium-negative); }\n:host(.tag--intent-warning.tag--contrast-strong) { background-color: var(--color-background-strong-warning); color: var(--color-foreground-medium-warning); }\n:host(.tag--intent-caution.tag--contrast-strong) { background-color: var(--color-background-strong-caution); color: var(--color-foreground-medium-caution); }\n:host(.tag--intent-positive.tag--contrast-strong) { background-color: var(--color-background-strong-positive); color: var(--color-foreground-medium-positive); }\n\n/* ── Intent × Contrast — bold ───────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-bold) { background-color: var(--color-background-bold-neutral); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-brand.tag--contrast-bold) { background-color: var(--color-background-bold-brand); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-ai.tag--contrast-bold) { background-color: var(--color-background-bold-ai); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-negative.tag--contrast-bold) { background-color: var(--color-background-bold-negative); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-warning.tag--contrast-bold) { background-color: var(--color-background-bold-warning); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-caution.tag--contrast-bold) { background-color: var(--color-background-bold-caution); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-positive.tag--contrast-bold) { background-color: var(--color-background-bold-positive); color: var(--color-foreground-on-bold-background-primary); }\n\n/* ── Intent × Contrast — medium ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-medium) { background-color: var(--color-background-medium-neutral); color: var(--color-foreground-strong-neutral); }\n:host(.tag--intent-brand.tag--contrast-medium) { background-color: var(--color-background-medium-brand); color: var(--color-foreground-on-medium-background-primary); }\n:host(.tag--intent-ai.tag--contrast-medium) { background-color: var(--color-background-medium-ai); color: var(--color-foreground-strong-ai); }\n:host(.tag--intent-negative.tag--contrast-medium) { background-color: var(--color-background-medium-negative); color: var(--color-foreground-strong-negative); }\n:host(.tag--intent-warning.tag--contrast-medium) { background-color: var(--color-background-medium-warning); color: var(--color-foreground-strong-warning); }\n:host(.tag--intent-caution.tag--contrast-medium) { background-color: var(--color-background-medium-caution); color: var(--color-foreground-strong-caution); }\n:host(.tag--intent-positive.tag--contrast-medium) { background-color: var(--color-background-medium-positive); color: var(--color-foreground-strong-positive); }\n\n/* ── Intent × Contrast — faint ──────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-faint) { background-color: var(--color-background-faint-neutral); color: var(--color-foreground-bold-neutral); }\n:host(.tag--intent-brand.tag--contrast-faint) { background-color: var(--color-background-faint-brand); color: var(--color-foreground-bold-brand); }\n:host(.tag--intent-ai.tag--contrast-faint) { background-color: var(--color-background-faint-ai); color: var(--color-foreground-bold-ai); }\n:host(.tag--intent-negative.tag--contrast-faint) { background-color: var(--color-background-faint-negative); color: var(--color-foreground-bold-negative); }\n:host(.tag--intent-warning.tag--contrast-faint) { background-color: var(--color-background-faint-warning); color: var(--color-foreground-bold-warning); }\n:host(.tag--intent-caution.tag--contrast-faint) { background-color: var(--color-background-faint-caution); color: var(--color-foreground-bold-caution); }\n:host(.tag--intent-positive.tag--contrast-faint) { background-color: var(--color-background-faint-positive); color: var(--color-foreground-bold-positive); }\n\n/* ── Interactive menu trigger ───────────────────────────────────────────── */\n\n:host(.tag--interactive) {\n padding: 0;\n gap: 0;\n}\n\n.tag__button {\n all: unset;\n position: relative;\n z-index: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n height: 100%;\n padding: 0 var(--ds-control-padding-inline);\n gap: var(--ds-control-gap);\n border-radius: inherit;\n color: inherit;\n cursor: default;\n}\n\n.tag__button:disabled {\n cursor: not-allowed;\n}\n\n.tag__button--expanded::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* Hover/press wash stays above the Tag's semantic background. */\n\n/* ── Icons ──────────────────────────────────────────────────────────────── */\n\n.tag__prefix-icon,\n.tag__suffix-icon {\n position: relative;\n z-index: 2;\n display: inline-flex;\n flex-shrink: 0;\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n}\n","import { Component, Event, EventEmitter, Prop, h, Host } from '@stencil/core';\nimport { CONTROL_TEXT_VARIANT, type ControlInsetDepth } from '../../utils';\n\nexport type TagIntent = 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type TagContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type TagSize = 'md' | 'sm' | 'xs';\n\n/**\n * `ds-icon` size prop matching control-density icon metrics\n * (md→20 / sm→16 / xs→12 via `--dimension-iconography-*`).\n */\nconst ICON_SIZE: Record<TagSize, 'md' | 'sm' | 'xs'> = {\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\n@Component({\n tag: 'ds-tag',\n styleUrl: 'Tag.css',\n scoped: true,\n})\nexport class Tag {\n @Prop() label!: string;\n /** Canonical icon name rendered before the visible label. */\n @Prop() icon: string = '';\n @Prop() intent: TagIntent = 'neutral';\n @Prop() contrast: TagContrast = 'faint';\n @Prop() size: TagSize = 'md';\n /** Use the reduced outer geometry when nested inside a control of the same size. */\n @Prop() isInset: boolean = false;\n /** Single removes 4px overall; double removes 8px overall (xs stays single). */\n @Prop() insetDepth: ControlInsetDepth = 'single';\n @Prop() rounded: boolean = false;\n @Prop() maxWidth: string | number | undefined;\n /** Render a menu-trigger button with a fixed ChevronUpDown suffix. */\n @Prop() interactive: boolean = false;\n /** Controlled open state for the menu triggered by an interactive Tag. */\n @Prop() expanded: boolean = false;\n /** ID of the menu controlled by an interactive Tag. */\n @Prop() ariaControls: string | undefined;\n /** Disable an interactive Tag and apply the shared inactive treatment. */\n @Prop() isInactive: boolean = false;\n\n /** Fired when the interactive Tag button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private handleClick = (event: MouseEvent) => {\n if (!this.interactive || this.isInactive) return;\n this.dsClick.emit(event);\n };\n\n render() {\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const doubleInset = this.isInset && this.insetDepth === 'double' && this.size !== 'xs';\n\n const maxWidthStyle = this.maxWidth != null\n ? { maxWidth: typeof this.maxWidth === 'number' ? `${this.maxWidth}px` : this.maxWidth }\n : undefined;\n const hostClass = {\n 'tag': true,\n [`tag--intent-${this.intent}`]: true,\n [`tag--contrast-${this.contrast}`]: true,\n [`tag--size-${this.size}`]: true,\n 'ds-control--md': this.size === 'md',\n 'ds-control--sm': this.size === 'sm',\n 'ds-control--xs': this.size === 'xs',\n 'ds-control--inset': this.isInset && !doubleInset,\n 'ds-control--inset-double': doubleInset,\n 'tag--rounded': this.rounded,\n 'tag--interactive': this.interactive,\n 'ds-control-inactive': this.interactive && this.isInactive,\n };\n const content = [\n this.icon && (\n <ds-icon\n class=\"tag__prefix-icon\"\n name={this.icon}\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n ),\n <ds-text class=\"tag__label\" as=\"span\" variant={textVariant} color=\"inherit\">\n {this.label}\n </ds-text>,\n ];\n\n if (!this.interactive) {\n return <Host class={hostClass} style={maxWidthStyle}>{content}</Host>;\n }\n\n return (\n <Host class={hostClass} style={maxWidthStyle}>\n <button\n type=\"button\"\n class={{\n 'tag__button': true,\n 'tag__button--expanded': this.expanded,\n 'ds-interaction-fill': true,\n 'ds-focus-ring-inset': true,\n }}\n aria-haspopup=\"menu\"\n aria-expanded={this.expanded ? 'true' : 'false'}\n aria-controls={this.ariaControls}\n disabled={this.isInactive || undefined}\n onClick={this.handleClick}\n >\n {content}\n <ds-icon\n class=\"tag__suffix-icon\"\n name=\"ChevronUpDown\"\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n </button>\n </Host>\n );\n }\n}\n"],"mappings":"8KAAA,MAAMA,EAAS,IAAM,k5mBCWrB,MAAMC,EAAiD,CACrDC,GAAI,KACJC,GAAI,KACJC,GAAI,M,MAQOC,EAAGC,EAAA,MAAAD,UAAAE,EALhB,WAAAC,CAAAC,G,6EAQUC,KAAAC,KAAe,GACfD,KAAAE,OAAoB,UACpBF,KAAAG,SAAwB,QACxBH,KAAAI,KAAgB,KAEhBJ,KAAAK,QAAmB,MAEnBL,KAAAM,WAAgC,SAChCN,KAAAO,QAAmB,MAGnBP,KAAAQ,YAAuB,MAEvBR,KAAAS,SAAoB,MAIpBT,KAAAU,WAAsB,MAKtBV,KAAAW,YAAeC,IACrB,IAAKZ,KAAKQ,aAAeR,KAAKU,WAAY,OAC1CV,KAAKa,QAAQC,KAAKF,EAAM,CAsE3B,CAnEC,MAAAG,GACE,MAAMC,EAAcC,EAAqBjB,KAAKI,MAC9C,MAAMc,EAAW3B,EAAUS,KAAKI,MAChC,MAAMe,EAAcnB,KAAKK,SAAWL,KAAKM,aAAe,UAAYN,KAAKI,OAAS,KAElF,MAAMgB,EAAgBpB,KAAKqB,UAAY,KACnC,CAAEA,gBAAiBrB,KAAKqB,WAAa,SAAW,GAAGrB,KAAKqB,aAAerB,KAAKqB,UAC5EC,UACJ,MAAMC,EAAY,CAChBC,IAAO,KACP,CAAC,eAAexB,KAAKE,UAAW,KAChC,CAAC,iBAAiBF,KAAKG,YAAa,KACpC,CAAC,aAAaH,KAAKI,QAAS,KAC5B,iBAAkBJ,KAAKI,OAAS,KAChC,iBAAkBJ,KAAKI,OAAS,KAChC,iBAAkBJ,KAAKI,OAAS,KAChC,oBAAqBJ,KAAKK,UAAYc,EACtC,2BAA4BA,EAC5B,eAAgBnB,KAAKO,QACrB,mBAAoBP,KAAKQ,YACzB,sBAAuBR,KAAKQ,aAAeR,KAAKU,YAElD,MAAMe,EAAU,CACdzB,KAAKC,MACHyB,EAAA,WACEC,MAAM,mBACNC,KAAM5B,KAAKC,KACXG,KAAMc,EACNW,MAAM,YAGVH,EAAA,WAASC,MAAM,aAAaG,GAAG,OAAOC,QAASf,EAAaa,MAAM,WAC/D7B,KAAKgC,QAIV,IAAKhC,KAAKQ,YAAa,CACrB,OAAOkB,EAACO,EAAI,CAACN,MAAOJ,EAAWW,MAAOd,GAAgBK,E,CAGxD,OACEC,EAACO,EAAI,CAACN,MAAOJ,EAAWW,MAAOd,GAC7BM,EAAA,UACES,KAAK,SACLR,MAAO,CACLS,YAAe,KACf,wBAAyBpC,KAAKS,SAC9B,sBAAuB,KACvB,sBAAuB,MACxB,gBACa,OAAM,gBACLT,KAAKS,SAAW,OAAS,QAAO,gBAChCT,KAAKqC,aACpBC,SAAUtC,KAAKU,YAAcY,UAC7BiB,QAASvC,KAAKW,aAEbc,EACDC,EAAA,WACEC,MAAM,mBACNC,KAAK,gBACLxB,KAAMc,EACNW,MAAM,a","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["PANEL_TOOLS_TOOL_IDS","PANEL_TOOLS_PRIMARY_TOOL_ID","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","anchor","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","boundary","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 'agents',\n 'messages',\n 'activity',\n 'search',\n 'stacks',\n 'help',\n];\n\n/** Rail header slot — mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: CanonicalPanelToolsToolId = 'agents';\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 Agents/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' | 'activity' | '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: 'agents',\n icon: 'AI',\n label: PANEL_TOOLS_LABELS.agents,\n railPlacement: 'header',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.agents,\n mobileDestination: 'agents',\n },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: PANEL_TOOLS_LABELS.messages,\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.messages,\n mobileDestination: 'messages',\n },\n {\n id: 'activity',\n icon: 'Bell',\n label: PANEL_TOOLS_LABELS.activity,\n order: 1,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.activity,\n mobileDestination: 'activity',\n },\n {\n id: 'search',\n icon: 'MagnifyingGlass',\n label: PANEL_TOOLS_LABELS.search,\n order: 2,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.search,\n mobileDestination: 'search',\n },\n {\n id: 'help',\n icon: 'CircleQuestion',\n label: PANEL_TOOLS_LABELS.help,\n railPlacement: 'footer',\n order: 0,\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 PanelToolsHeaderActionDetail {\n tool: PanelToolsToolId;\n id: string;\n /** Rendered header action host. Pass this to an external overlay's element anchor prop. */\n anchor?: HTMLElement;\n}\n\nexport interface PanelToolHeaderActionDetail {\n id: string;\n originalEvent: MouseEvent;\n /** Rendered action host, suitable for anchoring an external overlay across a shadow boundary. */\n anchor: HTMLElement;\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_PRIMARY_TOOL_ID,\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 === PANEL_TOOLS_PRIMARY_TOOL_ID) 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 PanelToolsHeaderActionDetail,\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 })\n dsHeaderAction!: EventEmitter<PanelToolsHeaderActionDetail>;\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; anchor?: HTMLElement }>).detail;\n if (!this.activeTool || !detail?.id) return;\n event.stopPropagation();\n this.dsHeaderAction.emit({\n tool: this.activeTool,\n id: detail.id,\n anchor: detail.anchor,\n });\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 boundary=\"viewport\"\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":"6VAYO,MAAMA,EAAoD,CAC/D,SACA,WACA,WACA,SACA,SACA,QAIK,MAAMC,EAAyD,SAK/D,MAAMC,EAAgE,CAC3EC,OAAQ,SACRC,SAAU,WACVC,OAAQ,SACRC,SAAU,WACVC,OAAQ,SACRC,KAAM,kBAGD,MAAMC,EAA4E,CACvFN,OAAQ,IACRI,OAAQ,IACRH,SAAU,IACVC,OAAQ,IACRC,SAAU,IACVE,KAAM,KA0BD,MAAME,EAA8C,CACzD,CACEC,GAAI,SACJC,KAAM,KACNC,MAAOX,EAAmBK,OAC1BO,cAAe,SACfC,MAAO,EACPC,YAAaP,EAAsBF,OACnCU,kBAAmB,UAErB,CACEN,GAAI,WACJC,KAAM,qBACNC,MAAOX,EAAmBE,SAC1BW,MAAO,EACPC,YAAaP,EAAsBL,SACnCa,kBAAmB,YAErB,CACEN,GAAI,WACJC,KAAM,OACNC,MAAOX,EAAmBI,SAC1BS,MAAO,EACPC,YAAaP,EAAsBH,SACnCW,kBAAmB,YAErB,CACEN,GAAI,SACJC,KAAM,kBACNC,MAAOX,EAAmBC,OAC1BY,MAAO,EACPC,YAAaP,EAAsBN,OACnCc,kBAAmB,UAErB,CACEN,GAAI,OACJC,KAAM,iBACNC,MAAOX,EAAmBM,KAC1BM,cAAe,SACfC,MAAO,EACPC,YAAaP,EAAsBD,KACnCS,kBAAmB,SCrGjB,SAAUC,EAAqBC,GACnC,MAAMC,EAAY,IAAIC,IACtB,IAAK,MAAMC,KAAQH,EAAO,CACxB,GAAIG,EAAKX,GAAGY,SAAWH,EAAUI,IAAIF,EAAKX,IAAKS,EAAUK,IAAIH,EAAKX,GAAIW,E,CAExE,MAAMI,EAAc,CAAEC,OAAQ,EAAGC,KAAM,EAAGC,OAAQ,GAClD,OAAOC,MAAMC,KAAKX,EAAUY,UAAUC,MAAK,CAACC,EAAMC,KAChD,MAAMC,EAAaC,EAAwBH,GAC3C,MAAMI,EAAcD,EAAwBF,GAC5C,MAAMI,EAAcb,EAAYU,GAAcV,EAAYY,GAC1D,GAAIC,IAAgB,EAAG,OAAOA,EAE9B,MAAMC,EAAgBxC,EAAqByC,WAAU9B,GAAMA,IAAOuB,EAAKvB,KACvE,MAAM+B,EAAiB1C,EAAqByC,WAAU9B,GAAMA,IAAOwB,EAAMxB,KACzE,MAAMgC,EAAYT,EAAKnB,QAAUyB,EAAgB,EAAII,OAAOC,iBAAmBL,GAC/E,MAAMM,EACJX,EAAMpB,QAAU2B,EAAiB,EAAIE,OAAOC,iBAAmBH,GACjE,OAAOC,EAAYG,CAAU,GAEjC,CAEM,SAAUC,EAAmBC,GACjC,cAAcA,IAAU,UAAYA,EAAMzB,OAAO0B,OAAS,CAC5D,CAEM,SAAUZ,EACdf,GAEA,GAAIA,EAAKR,cAAe,OAAOQ,EAAKR,cACpC,GAAIQ,EAAKX,KAAOV,EAA6B,MAAO,SACpD,GAAIqB,EAAKX,KAAO,OAAQ,MAAO,SAC/B,MAAO,MACT,C,SAEgBuC,EACd/B,EACAgC,EACAC,GAEA,IAAKA,GAAcjC,EAAMkC,MAAK/B,GAAQA,EAAKX,KAAOyC,IAAa,CAC7D,MAAO,CAAED,OAAMC,aAAYE,YAAa,G,CAE1C,MAAO,CAAEH,KAAM,MAAOC,WAAY,GAAIE,YAAaF,EACrD,CAmCM,SAAUG,EAA6BC,GAC3C,MAAMC,EAAaD,EAAME,mBAAmBC,MAAM,KAAKC,KAAItC,GAAQA,EAAKC,SACxE,MAAMsC,EAAYL,EAAMM,mBAAmBH,MAAM,KAAKC,KAAItC,GAAQyC,EAAezC,EAAKC,OAAQ,KAC9F,MAAMyC,EAASR,EAAMS,gBAAgBN,MAAM,KAAKC,KAAItC,GAAQyC,EAAezC,EAAKC,OAAQ,KAExF,OAAOkC,EAAWS,QAAO,CAACC,EAAKC,EAAUC,KACvC,GAAID,IAAa,OAASA,IAAa,YAAa,OAAOD,EAC3D,MAAMG,EAAWT,EAAUQ,EAAQR,EAAUZ,SAAW,EACxD,MAAMsB,EAAQP,EAAOK,EAAQL,EAAOf,SAAW,EAC/C,OAAOuB,KAAKL,IAAIA,EAAKG,EAAWC,EAAO,EAAE,GACxC,EACL,CAGM,SAAUE,EAAwBtB,EAAeuB,GACrD,OAAQvB,GAAQuB,IAAW,MAC7B,C,SAGgBC,EACdC,EACAC,EACAH,GAEA,GAAIA,IAAW,UAAW,OAAOE,GAAS,GAC1C,GAAIF,IAAW,UAAW,OAAOG,EAAc,GAAKD,GAASC,EAAc,GAC3E,OAAO,IACT,C,SAGgBC,EACd3B,EACAC,EACAzC,GAEA,GAAIwC,GAAQC,IAAezC,EAAI,CAC7B,MAAO,CAAEwC,KAAM,MAAOC,WAAYzC,EAAIoE,SAAU,M,CAElD,MAAO,CAAE5B,KAAM,KAAMC,WAAYzC,EAAIoE,SAAU,KACjD,CC7HA,MAAMC,EAAgB,IAAM,s6Q,MCwCfC,EAAUC,EAAA,MAAAD,UAAAE,EALvB,WAAAC,CAAAC,G,gYAS0CC,KAAAnC,KAAgB,MAGhBmC,KAAAC,aAAwC,SAIhFD,KAAAE,qBAA2C,SAI3CF,KAAAlC,WAAoC,GAM5BkC,KAAAnE,MAA0B,GAE1BmE,KAAAG,WAAqB,QACrBH,KAAAI,mBAA6B,iBAG7BJ,KAAAK,QAA6B,GAMDL,KAAAM,WAAqB,GA8BxCN,KAAAZ,OAAyC,OAGzCY,KAAAO,sBAAwB,MAGxBP,KAAAQ,eAAiB,MAGjBR,KAAAS,6BAA+B,MAE/BT,KAAAU,YAAc,EACdV,KAAAW,gBAAsC,GACtCX,KAAAY,mBAAqB,MAE9BZ,KAAAa,uBAAyB,EACzBb,KAAAc,6BAA+B,EAC/Bd,KAAAe,qBAAuB,EACvBf,KAAAgB,wBAAyC,KAEzChB,KAAAiB,0BAA4B,MAC5BjB,KAAAkB,sBAA4C,KAC5ClB,KAAAmB,iBAA4C,KAyF5CnB,KAAAoB,2BAA8BC,IACpC,MAAMC,EAAUD,EAA6DC,OAC7E,IAAKtB,KAAKlC,aAAewD,GAAQjG,GAAI,OACrCgG,EAAME,kBACNvB,KAAKwB,eAAeC,KAAK,CACvBC,KAAM1B,KAAKlC,WACXzC,GAAIiG,EAAOjG,GACXsG,OAAQL,EAAOK,QACf,EAiJI3B,KAAA4B,oBAAuBP,IAC7B,MAAMQ,EAAS7B,KAAK8B,WAAWC,cAAc,wBAC7C,GAAIV,EAAMW,SAAWH,EAAQ,OAC7B,GAAIR,EAAMY,eAAiB,YAAa,OACxC,GAAIjC,KAAKiB,0BAA2B,CAClCjB,KAAKiB,0BAA4B,MACjC,M,CAMF,GAAII,EAAMa,OAAS,mBAAoB,OACvC,GAAIL,IAAW7B,KAAKmC,2BAA2BN,EAAQ7B,KAAKZ,QAAS,OACrEY,KAAKoC,wBAAwB,EAiFvBpC,KAAAqC,iBAAoBhH,IAC1B,MAAMiH,EAAO9C,EAA2BQ,KAAKnC,KAAMmC,KAAKlC,WAAYzC,GACpE2E,KAAKnC,KAAOyE,EAAKzE,KACjBmC,KAAKlC,WAAawE,EAAKxE,WACvBkC,KAAKuC,aAAad,KAAK,CAAEpG,KAAIoE,SAAU6C,EAAK7C,UAAW,EA2CjDO,KAAAwC,kBAAoB,CAACC,EAAkB1D,KAC7C,MAAMlD,EAAQmE,KAAK0C,iBACnB,IAAK7G,EAAM8B,OAAQ,OAEnB,GAAI8E,EAAEE,MAAQ,SAAWF,EAAEE,MAAQ,IAAK,CACtCF,EAAEG,iBACF5C,KAAKqC,iBAAiBxG,EAAMkD,GAAO1D,IACnC,M,CAGF,GAAIoH,EAAEE,MAAQ,YAAa,CACzB,GAAI5D,GAASlD,EAAM8B,OAAS,EAAG,OAC/B8E,EAAEG,iBACF5C,KAAK6C,YAAY9D,EAAQ,GACzB,M,CAGF,GAAI0D,EAAEE,MAAQ,UAAW,CACvB,GAAI5D,GAAS,EAAG,OAChB0D,EAAEG,iBACF5C,KAAK6C,YAAY9D,EAAQ,E,EA+L9B,CA/kBC,aAAY+D,GACV,OAAO9C,KAAKnE,OAAS,E,CAGvB,oBAAY6G,GACV,OAAO9G,EAAqBoE,KAAK8C,U,CAGnC,oBAAAC,GACE/C,KAAKgD,GAAGC,oBAAoB,gBAAiBjD,KAAK4B,qBAClD5B,KAAKgD,GAAGC,oBAAoB,mBAAoBjD,KAAK4B,qBACrD5B,KAAKgD,GAAGC,oBAAoB,WAAYjD,KAAKoB,4BAC7CpB,KAAKkD,4BACLlD,KAAKa,wBAA0B,EAC/Bb,KAAKmB,kBAAkBgC,aACvBnD,KAAKmB,iBAAmB,KACxBnB,KAAKoD,4B,CAIP,mBAAAC,CAAoBf,EAA+BgB,GACjD,GAAIhB,IAASgB,EAAU,OAKvB,GAAItD,KAAKgD,GAAGO,aAAa,kBAAoBjB,EAAM,CACjDtC,KAAKgD,GAAGQ,aAAa,eAAgBlB,E,CAEvC,MAAMmB,IAA2BzD,KAAKc,6BACtCd,KAAKS,6BAA+B,KACpCiD,uBAAsB,KACpBA,uBAAsB,KACpB,GAAID,IAA2BzD,KAAKc,6BAA8B,OAClEd,KAAKS,6BAA+B,KAAK,GACzC,IAEJ,GAAI6B,IAAS,aAAc,CACzBtC,KAAKkB,sBACHyC,SAASC,yBAAyB/D,EAAc8D,SAASC,cAAgB,KAC3E5D,KAAKnC,KAAO,I,MACP,GAAIyF,IAAa,aAAc,CACpC,MAAMpC,EAAwBlB,KAAKkB,sBACnC,MAAM2C,EAAmB7D,KAAK8D,eAAeC,UAAU,IAAI1I,GAC3DqI,uBAAsBM,UACpB,GAAI9C,GAAuB+C,YAAa,CACtC/C,EAAsBgD,MAAM,CAAEC,cAAe,M,CAE/C,MAAMC,EAAgBlD,EAClByC,SAASC,gBAAkB1C,GAC3BA,EAAsBmD,SAASV,SAASC,eACxC,MACJ,IAAKQ,GAAiBP,QAAwB7D,KAAKsE,kBAAkBT,GACrE7D,KAAKkB,sBAAwB,IAAI,G,CAGrClB,KAAKuE,qBAAqB9C,KAAK,CAAExB,aAAcqC,G,CAIjD,sBAAAkC,CAAuBnD,GACrB,GAAIrB,KAAKC,eAAiB,cAAgBoB,EAAMsB,MAAQ,SAAU,OAClEtB,EAAMuB,iBACNvB,EAAME,kBACNvB,KAAKC,aAAe,Q,CAGd,iBAAAwE,GACN,GAAIzE,KAAKQ,eAAgB,OACzB,MAAMkE,IAAe1E,KAAKa,uBAC1B6C,uBAAsB,KACpB,GAAIgB,IAAe1E,KAAKa,uBAAwB,OAChD6C,uBAAsB,KACpB,GAAIgB,IAAe1E,KAAKa,uBAAwB,OAChDb,KAAKQ,eAAiB,IAAI,GAC1B,G,CAIN,iBAAAmE,GACE3E,KAAKgD,GAAG4B,iBAAiB,gBAAiB5E,KAAK4B,qBAC/C5B,KAAKgD,GAAG4B,iBAAiB,mBAAoB5E,KAAK4B,qBAClD5B,KAAKgD,GAAG4B,iBAAiB,WAAY5E,KAAKoB,2B,CAc5C,iBAAAyD,GACE7E,KAAK8E,wBACL9E,KAAKO,sBAAwBP,KAAKnC,I,CAIpC,WAAAkH,CAAYC,EAAiBC,GAC3B,GAAID,EAAQhF,KAAKO,sBAAwB,KACzC,GAAIP,KAAKQ,gBAAkByE,IAAYC,WAAaD,IAAYD,EAAQ,CACtEhF,KAAKmF,sBAAsBH,EAAS,UAAY,U,MAC3C,IAAKA,EAAQ,CAClBhF,KAAKO,sBAAwB,K,CAE/BP,KAAKyE,mB,CAIP,iBAAAW,GACEpF,KAAKqF,wBACLrF,KAAKyE,mB,CAIP,iBAAAa,GACEtF,KAAK8E,uB,CAGP,gBAAAS,GACEvF,KAAKyE,oBACLzE,KAAKwF,0BACLxF,KAAKyF,2BACLzF,KAAK0F,oBACL1F,KAAKmB,iBAAmB,IAAIwE,kBAAiB,IAAM3F,KAAK0F,sBACxD1F,KAAKmB,iBAAiByE,QAAQ5F,KAAKgD,GAAI,CACrC6C,UAAW,KACXC,WAAY,KACZC,gBAAiB,CAAC,S,CAItB,kBAAAC,GACEhG,KAAKyF,0B,CAGC,uBAAAD,GACNxF,KAAKoD,6BACL,IAAKpD,KAAKiG,mBAAqBC,iBAAmB,YAAa,OAC/DlG,KAAKmG,iBAAmB,IAAID,gBAAe,IAAMlG,KAAKyF,6BACtDzF,KAAKmG,iBAAiBP,QAAQ5F,KAAKiG,W,CAG7B,0BAAA7C,GACNpD,KAAKmG,kBAAkBhD,aACvBnD,KAAKmG,iBAAmBjB,S,CAGlB,wBAAAO,GACN,MAAMnD,EAAO8D,QACXpG,KAAKiG,YAAcjG,KAAKiG,WAAWI,aAAerG,KAAKiG,WAAWK,aAAe,GAEnF,GAAIhE,IAAStC,KAAKY,mBAAoBZ,KAAKY,mBAAqB0B,C,CAIlE,YAAAiE,GACEvG,KAAKU,YAAc,EACnBV,KAAKwG,sBACLxG,KAAKyE,mB,CAGC,qBAAAK,GACN,IAAK9E,KAAKM,YAAcN,KAAKlC,WAAY,OACzC,IACE,MAAM2I,EAASC,aAAaC,QAAQ3G,KAAKM,YACzC,GAAI7C,EAAmBgJ,GAASzG,KAAKlC,WAAa2I,C,CAClD,M,EAKI,qBAAApB,GACN,IAAKrF,KAAKM,aAAeN,KAAKlC,WAAY,OAC1C,IACE4I,aAAaE,QAAQ5G,KAAKM,WAAYN,KAAKlC,W,CAC3C,M,EAKI,kBAAA+I,GACN,IAAK7G,KAAKM,WAAY,OACtB,IACEoG,aAAaI,WAAW9G,KAAKM,W,CAC7B,M,EAKI,mBAAAkG,GACN,MAAMlE,EAAO1E,EAAgCoC,KAAK8C,UAAW9C,KAAKnC,KAAMmC,KAAKlC,YAC7E,IAAKwE,EAAKtE,YAAa,OACvBgC,KAAK6G,qBACL7G,KAAKnC,KAAOyE,EAAKzE,KACjBmC,KAAKlC,WAAawE,EAAKxE,WACvBkC,KAAKuC,aAAad,KAAK,CAAEpG,GAAIiH,EAAKtE,YAAayB,SAAU,O,CAGnD,qBAAA0F,CAAsB4B,GAC5B,MAAMlF,EAAS7B,KAAK8B,WAAWC,cAAc,wBAC7C,GAAI/B,KAAKZ,SAAW,OAAQ,CAC1BY,KAAKoC,yBACLpC,KAAKiB,0BAA4B,I,CAEnCjB,KAAKZ,OAAS2H,EACd/G,KAAKgH,wBAAwBvF,KAAK,CAAEwF,OAAQ,cAAeF,UAC3D,MAAMrC,IAAe1E,KAAKe,qBAE1B2C,uBAAsB,KACpBA,uBAAsB,KACpB,GAAIgB,IAAe1E,KAAKe,sBAAwBf,KAAKZ,SAAW2H,EAAO,OACvE,IAAKlF,EAAQ,CACX7B,KAAKoC,yBACL,M,CAGF,GAAIpC,KAAKmC,2BAA2BN,EAAQkF,GAAQ,CAClD/G,KAAKoC,yBACL,M,CAGF,MAAM8E,EAAajJ,EAA6BkJ,iBAAiBtF,IACjE,GAAIqF,GAAc,EAAG,CACnBlH,KAAKoC,yBACL,M,CAEFpC,KAAKgB,wBAA0BoG,OAAOC,YAAW,KAC/CrH,KAAKoC,wBAAwB,GAC5B8E,EAAW,GACd,G,CAqBE,0BAAA/E,CACNN,EACAkF,GAEA,MAAMzH,EAAQuC,EAAOyF,wBAAwBhI,MAC7C,MAAMiI,EAAU1F,EAAOE,cAAc,gCACrC,MAAMxC,EAAcgI,GAASD,wBAAwBhI,OAAS,EAC9D,OAAOD,EAA2BC,EAAOC,EAAawH,E,CAGhD,sBAAA3E,GACN,MAAMoF,EAAiBxH,KAAKZ,OAC5B,MAAMqI,EAAmBD,IAAmB,OAC5CxH,KAAKkD,4BACL,IAAKuE,EAAkB,OACvBzH,KAAKiB,0BAA4B,MACjCjB,KAAKZ,OAAS,OACd,GAAIoI,IAAmB,YAAcxH,KAAKnC,KAAM,CAC9CmC,KAAKO,sBAAwB,K,CAE/BP,KAAK0H,sBAAsBjG,KAAK,CAAEwF,OAAQ,e,CAGpC,yBAAA/D,GACNlD,KAAKe,sBAAwB,EAC7B,GAAIf,KAAKgB,0BAA4B,KAAM,CACzCoG,OAAOO,aAAa3H,KAAKgB,yBACzBhB,KAAKgB,wBAA0B,I,EAK3B,cAAA4G,CAAevM,GACrB,OAAO2E,KAAKnC,MAAQmC,KAAKlC,aAAezC,C,CAIlC,eAAAwM,GACN,OAAO7H,KAAKnC,MAAQmC,KAAKO,qB,CAGnB,YAAAuH,CAAazM,GACnB,OAAO2E,KAAK6H,mBAAqB7H,KAAKlC,aAAezC,C,CAG/C,WAAA0M,CAAY1M,GAClB,OAAO2E,KAAKW,gBAAgBqH,SAAS3M,E,CAG/B,iBAAAqK,GACN,MAAMuC,EAAMjI,KAAK0C,iBAAiBpE,KAAItC,GAAQA,EAAKX,KACnD,MAAMiH,EAAO2F,EAAIC,QAAO7M,GAAM+K,QAAQpG,KAAKgD,GAAGjB,cAAc,UAAU1G,eACtE,GAAIiH,EAAK6F,KAAK,OAASnI,KAAKW,gBAAgBwH,KAAK,KAAMnI,KAAKW,gBAAkB2B,C,CAGhF,cAAYR,GACV,OAAO9B,KAAKgD,GAAGoF,YAAcpI,KAAKgD,E,CAG5B,WAAAqF,GACN,IAAKrI,KAAK6H,oBAAsB7H,KAAKlC,WAAY,MAAO,GACxD,MAAM9B,EAAOgE,KAAK8C,UAAUwF,MAAKC,GAAaA,EAAUlN,KAAO2E,KAAKlC,aACpE,OACE9B,GAAMT,OACNX,EAAmBoF,KAAKlC,aACxBkC,KAAKlC,U,CAID,eAAA0K,GACN,OAAOxI,KAAKK,SAAW,E,CAGjB,YAAAyD,GACN,IAAK9D,KAAKlC,WAAY,MAAO,GAC7B,OAAOkC,KAAKwI,kBAAkBxI,KAAKlC,aAAe,E,CAYpD,kBAAM2K,CAAapN,GACjB,MAAMW,EAAOgE,KAAK8C,UAAUwF,MAAKI,GAASA,EAAMrN,KAAOA,IACvD,IAAKW,GAAQA,EAAK2M,WAAY,OAC9B3I,KAAKqC,iBAAiBhH,E,CAKxB,iBAAMuN,GACJ,IAAK5I,KAAKnC,KAAM,OAChB,MAAMxC,EAAK2E,KAAKlC,WAChBkC,KAAKnC,KAAO,MACZ,GAAIxC,EAAI,CACN2E,KAAKuC,aAAad,KAAK,CAAEpG,KAAIoE,SAAU,O,EAM3C,uBAAM6E,CAAkBjJ,GACtB,MAAMwN,EAAS7I,KAAK8B,WAAWC,cAAc,2BAA2B+G,IAAIC,OAAO1N,cAG7EwN,GAAQG,a,CAGR,WAAAnG,CAAY9D,GAClB,MAAMlD,EAAQmE,KAAK0C,iBACnB,IAAK7G,EAAM8B,OAAQ,OACnB,MAAMsL,EAAU/J,KAAKL,IAAI,EAAGK,KAAKgK,IAAInK,EAAOlD,EAAM8B,OAAS,IAC3D,GAAIsL,IAAYjJ,KAAKU,YAAa,OAClCV,KAAKU,YAAcuI,EACnB,MAAMlF,EAAUvH,MAAMC,KACpBuD,KAAK8B,WAAWqH,iBAA8B,2CAEhDpF,EAAQkF,IAAU/E,MAAM,CAAEC,cAAe,M,CA2BnC,gBAAAiF,CAAiBpN,EAAsB+C,GAC7C,MAAMxD,EACJS,EAAKqN,WACLrN,EAAKT,OACLX,EAAmBoB,EAAKX,KACxBW,EAAKX,GACP,OACEiO,EAAA,cACE3G,IAAK3G,EAAKX,GACVE,MAAOA,EACPG,YACEM,EAAKN,aACLP,EAAsBa,EAAKX,IAE7BkO,KAAK,OACLC,KAAK,KACLC,SAAS,YAETH,EAAA,sBACEI,QAAQ,OACRC,MAAM,2BACNrO,KAAMU,EAAKV,KACXsO,SAAU5J,KAAK4H,eAAe5L,EAAKX,IACnCwO,WAAY,MACZC,UAAW,MACXC,WAAY,MACZC,IAAKhO,EAAKgO,KAAO,MACjBrB,WAAY3M,EAAK2M,WACjBsB,cAAelL,IAAUiB,KAAKU,YAAc,GAAI,EAAE,aACtCnF,EACZ2O,QAASlK,KAAK4H,eAAe5L,EAAKX,IAClC8O,UAAW,KACTnK,KAAKU,YAAc3B,CAAK,EAE1BqL,UAAY3H,GAAqBzC,KAAKwC,kBAAkBC,EAAG1D,GAC3DsL,UAAW,IAAMrK,KAAKqC,iBAAiBrG,EAAKX,M,CAMpD,MAAAiP,GACE,MAAMjC,EAAcrI,KAAKqI,cACzB,MAAMhM,EAAS2D,KAAK8D,eACpB,MAAMyG,EAAclO,EAAOmO,OAAOvO,QAAUoM,EAC5C,MAAMoC,EAAgBpO,EAAO0H,SAAW,GACxC,MAAMrB,EAAmB1C,KAAK0C,iBAC9B,MAAMgI,EAAchI,EAAiBwF,QACnClM,GAAQe,EAAwBf,KAAU,WAE5C,MAAM2O,EAAYjI,EAAiBwF,QACjClM,GAAQe,EAAwBf,KAAU,SAE5C,MAAM4O,EAAclI,EAAiBwF,QACnClM,GAAQe,EAAwBf,KAAU,WAE5C,MAAM6O,EAAcH,EAAY/M,OAChC,MAAMmN,EAAcD,EAAcF,EAAUhN,OAC5C,MAAMoN,EAAmB/K,KAAK6H,kBAC9B,MAAMmD,EAAgB7L,EAAwBa,KAAKnC,KAAMmC,KAAKZ,QAC9D,MAAM6L,EAAiB7E,QACrB2E,GAAoB/K,KAAKlC,YAAckC,KAAK+H,YAAY/H,KAAKlC,aAE/D,MAAMoN,EAAUxI,EAAiBpE,KAAItC,GAAQA,EAAKX,KAElD,OACEiO,EAAC6B,EAAI,CAAAxI,IAAA,2CACHgH,MAAO,CACL,cAAe,KACf,oBAAqB3J,KAAKnC,KAC1B,qBAAsBmC,KAAKQ,eAC3B,8BAA+BR,KAAKZ,SAAW,UAC/C,8BAA+BY,KAAKZ,SAAW,UAC/C,8BAA+B4L,EAC/B,0BAA2BhL,KAAKC,eAAiB,aACjD,iCAAkCD,KAAKS,8BAEzC2K,KAAMpL,KAAKC,eAAiB,aAAe,SAAW,gBAAe,aACzDD,KAAKC,eAAiB,aAAe,OAASiF,UAAS,aACvDlF,KAAKG,YAEjBmJ,EAAA,OAAA3G,IAAA,2CAAKgH,MAAM,uBACTL,EAAA,OAAA3G,IAAA,2CAAKgH,MAAM,oBAAmB,aAAa3J,KAAKI,oBAC7CsK,EAAY/M,OACX2L,EAAA,OAAKK,MAAM,8DACRe,EAAYpM,KAAI,CAACtC,EAAM+C,IAAUiB,KAAKoJ,iBAAiBpN,EAAM+C,MAE9D,KACJuK,EAAA,OAAA3G,IAAA,2CACEgH,MAAO,CACL,yBAA0B,KAC1B,mBAAoB,KACpB,sBAAuB,KACvB,sBAAuB,KACvB,gBAAiB3J,KAAKY,oBAExByK,IAAKC,IACH,MAAMhJ,EAAQgJ,GAA2BpG,UACzC,GAAI5C,IAAStC,KAAKiG,WAAY,OAC9BjG,KAAKiG,WAAa3D,EAClBtC,KAAKwF,yBAAyB,EAEhC4F,KAAMpL,KAAKY,mBAAqB,SAAWsE,UAAS,aACxClF,KAAKY,mBAAqBZ,KAAKI,mBAAqB8E,UAChEqG,SAAUvL,KAAKY,mBAAqB,EAAIsE,WAExCoE,EAAA,OAAA3G,IAAA,2CAAKgH,MAAM,6BACRgB,EAAUrM,KAAI,CAACtC,EAAMwP,IACpBxL,KAAKoJ,iBAAiBpN,EAAM6O,EAAcW,OAI/CZ,EAAYjN,OACX2L,EAAA,OAAKK,MAAM,8DACRiB,EAAYtM,KAAI,CAACtC,EAAMyP,IACtBzL,KAAKoJ,iBAAiBpN,EAAM8O,EAAcW,MAG5C,MAGNnC,EAAA,OAAA3G,IAAA,2CACEgH,MAAO,CACL,sBAAuB,KACvB,+BAAgCoB,GACjC,cACYA,EAAmB,KAAO,OACvCW,MAAOX,EAAmB7F,UAAY,MAEtCoE,EAAA,OAAA3G,IAAA,2CAAKgH,MAAM,+BACR3J,KAAKC,eAAiB,cAAgBD,KAAKE,uBAAyB,SACnEoJ,EAAA,wBACEK,MAAM,sBACNgC,QAASpB,EACTqB,SAAUvP,EAAOuP,UAAY,MAC7BC,SAAUxP,EAAOwP,UAAY,cAC7BC,cAAezP,EAAOyP,eAAiB,OACvCC,SAAU,MACVV,IAAKC,IACH,MAAMU,EAAaV,EAKnB,GAAIU,EAAYA,EAAWjI,QAAU0G,CAAa,EAEpDwB,SAAU,KACR,GAAIjM,KAAKlC,WAAYkC,KAAKkM,aAAazK,KAAK,CAAEC,KAAM1B,KAAKlC,YAAa,IAGxE,KACJwL,EAAA,OAAA3G,IAAA,2CAAKgH,MAAM,oBAAoBwC,OAAQlB,GACpCC,EAAQ5M,KAAIjD,IACX,MAAM+Q,EAASpM,KAAK8H,aAAazM,GACjC,OACEiO,EAAA,OACEK,MAAO,CACL,oBAAqB,KACrB,4BAA6ByC,GAE/BD,QAASC,GAET9C,EAAA,QAAM+C,KAAMhR,IACR,KAIZiO,EAAA,OAAA3G,IAAA,2CAAKgH,MAAM,0BAA0BwC,QAASlB,GAC3CC,EAAQ5M,KAAIjD,GACXiO,EAAA,OACEK,MAAO,CACL,yBAA0B,KAC1B,iCACE3J,KAAK8H,aAAazM,IAAO2E,KAAK+H,YAAY1M,IAE9C8Q,SAAUnM,KAAK8H,aAAazM,IAAO2E,KAAK+H,YAAY1M,KAEpDiO,EAAA,QAAM+C,KAAM,GAAGhR,kB","ignoreList":[]}