@ds-mo/ui 12.7.0 → 12.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/dist/.build-stamp +1 -1
  2. package/dist/agent-patterns.json +22 -9
  3. package/dist/agent.json +230 -18
  4. package/dist/angular/ds-button-filled.d.ts +1 -1
  5. package/dist/angular/ds-button-filled.js +3 -3
  6. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  7. package/dist/angular/ds-button-unfilled.js +3 -3
  8. package/dist/angular/ds-card-overview.d.ts +19 -0
  9. package/dist/angular/ds-card-overview.js +42 -0
  10. package/dist/angular/index.d.ts +1 -1
  11. package/dist/angular/index.js +1 -0
  12. package/dist/angular/proxies.d.ts +1 -0
  13. package/dist/angular/proxies.js +1 -0
  14. package/dist/components/ds-agent-activity.js +1 -1
  15. package/dist/components/ds-agent-response.js +1 -1
  16. package/dist/components/ds-agent-source-list.js +1 -1
  17. package/dist/components/ds-agent-tool-call.js +1 -1
  18. package/dist/components/ds-attachment-list.js +1 -1
  19. package/dist/components/ds-badge.js +1 -1
  20. package/dist/components/ds-bar-nav.js +1 -1
  21. package/dist/components/ds-bar-title.js +1 -1
  22. package/dist/components/ds-bar-title.js.map +1 -1
  23. package/dist/components/ds-bar-workflow.js +1 -1
  24. package/dist/components/ds-breadcrumb.js +1 -1
  25. package/dist/components/ds-button-filled.js +1 -1
  26. package/dist/components/ds-button-unfilled.js +1 -1
  27. package/dist/components/ds-card-data-viz-bar.js +1 -1
  28. package/dist/components/ds-card-data-viz-bar.js.map +1 -1
  29. package/dist/components/ds-card-data-viz-donut.js +1 -1
  30. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  31. package/dist/components/ds-card-data-viz-line.js +1 -1
  32. package/dist/components/ds-card-data-viz-line.js.map +1 -1
  33. package/dist/components/ds-card-overview.d.ts +11 -0
  34. package/dist/components/ds-card-overview.js +2 -0
  35. package/dist/components/ds-card-overview.js.map +1 -0
  36. package/dist/components/ds-card-setting.js +1 -1
  37. package/dist/components/ds-card-shell-data-viz.js +1 -1
  38. package/dist/components/ds-chart-bar-stacked.js +1 -1
  39. package/dist/components/ds-chart-bar-stacked.js.map +1 -1
  40. package/dist/components/ds-chart-bar.js +1 -1
  41. package/dist/components/ds-chart-bar.js.map +1 -1
  42. package/dist/components/ds-chart-donut.js +1 -1
  43. package/dist/components/ds-chart-donut.js.map +1 -1
  44. package/dist/components/ds-chart-legend.js +1 -1
  45. package/dist/components/ds-chart-line.js +1 -1
  46. package/dist/components/ds-chart-line.js.map +1 -1
  47. package/dist/components/ds-checkbox.js +1 -1
  48. package/dist/components/ds-chip.js +1 -1
  49. package/dist/components/ds-code-block.js +1 -1
  50. package/dist/components/ds-conversation-list-item.js +1 -1
  51. package/dist/components/ds-conversation-list-item.js.map +1 -1
  52. package/dist/components/ds-conversation-list-section.js +1 -1
  53. package/dist/components/ds-conversation-list.js +1 -1
  54. package/dist/components/ds-conversation-list.js.map +1 -1
  55. package/dist/components/ds-divider.js +1 -1
  56. package/dist/components/ds-empty-state.js +1 -1
  57. package/dist/components/ds-field.js +1 -1
  58. package/dist/components/ds-input.js +1 -1
  59. package/dist/components/ds-markdown.js +1 -1
  60. package/dist/components/ds-menu.js +1 -1
  61. package/dist/components/ds-message-bubble.js +1 -1
  62. package/dist/components/ds-message-composer.js +1 -1
  63. package/dist/components/ds-message-scroller.js +1 -1
  64. package/dist/components/ds-message-scroller.js.map +1 -1
  65. package/dist/components/ds-message.js +1 -1
  66. package/dist/components/ds-mobile-bar-nav.js +1 -1
  67. package/dist/components/ds-mobile-header.js +1 -1
  68. package/dist/components/ds-mobile-section-switcher.js +1 -1
  69. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  70. package/dist/components/ds-modal.js +1 -1
  71. package/dist/components/ds-modal.js.map +1 -1
  72. package/dist/components/ds-panel-nav.js +1 -1
  73. package/dist/components/ds-panel-nav.js.map +1 -1
  74. package/dist/components/ds-panel-sub-nav.js +1 -1
  75. package/dist/components/ds-panel-tool-header.js +1 -1
  76. package/dist/components/ds-panel-tool-search.js +1 -1
  77. package/dist/components/ds-panel-tools.js +1 -1
  78. package/dist/components/ds-radio.js +1 -1
  79. package/dist/components/ds-scroll-overlay.js +1 -1
  80. package/dist/components/ds-scroll-overlay.js.map +1 -1
  81. package/dist/components/ds-select-multi.js +1 -1
  82. package/dist/components/ds-select.js +1 -1
  83. package/dist/components/ds-shell-app.js +1 -1
  84. package/dist/components/ds-shell-app.js.map +1 -1
  85. package/dist/components/ds-shell-gradient-picker.js +1 -1
  86. package/dist/components/ds-shell-gradient-picker.js.map +1 -1
  87. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  88. package/dist/components/ds-shell-page.js +1 -1
  89. package/dist/components/ds-shell-page.js.map +1 -1
  90. package/dist/components/ds-shell-tools.js +1 -1
  91. package/dist/components/ds-skeleton.js +1 -1
  92. package/dist/components/ds-skeleton.js.map +1 -1
  93. package/dist/components/ds-slider.js +1 -1
  94. package/dist/components/ds-slider.js.map +1 -1
  95. package/dist/components/ds-swatch-picker.js +1 -1
  96. package/dist/components/ds-switch.js +1 -1
  97. package/dist/components/ds-tab-group.js +1 -1
  98. package/dist/components/ds-tag.js +1 -1
  99. package/dist/components/ds-text.js +1 -1
  100. package/dist/components/ds-toast.js +1 -1
  101. package/dist/components/ds-toast.js.map +1 -1
  102. package/dist/components/ds-tooltip-data-viz.js +1 -1
  103. package/dist/components/ds-tooltip.js +1 -1
  104. package/dist/components/ds-typing-indicator.js +1 -1
  105. package/dist/components/p-2foAUsDN.js +2 -0
  106. package/dist/components/p-2foAUsDN.js.map +1 -0
  107. package/dist/components/{p-C9h13YnX.js → p-38PfdMkF.js} +2 -2
  108. package/dist/components/p-69lHhJiX.js +2 -0
  109. package/dist/components/p-69lHhJiX.js.map +1 -0
  110. package/dist/components/{p-CnAkobDW.js → p-B6NvVdeO.js} +2 -2
  111. package/dist/components/p-B6Vuayt6.js +2 -0
  112. package/dist/components/p-B6Vuayt6.js.map +1 -0
  113. package/dist/components/p-B6vE3ujd.js +2 -0
  114. package/dist/components/p-B6vE3ujd.js.map +1 -0
  115. package/dist/components/p-BBePKRHC.js +2 -0
  116. package/dist/components/p-BBePKRHC.js.map +1 -0
  117. package/dist/components/{p-BT5hgg5i.js → p-BFRMwl93.js} +2 -2
  118. package/dist/components/p-BKOlvCGS.js +2 -0
  119. package/dist/components/p-BKOlvCGS.js.map +1 -0
  120. package/dist/components/{p-C7bZ-jiU.js → p-BO5aqZcf.js} +2 -2
  121. package/dist/components/p-BX0BMhgz.js +2 -0
  122. package/dist/components/p-BX0BMhgz.js.map +1 -0
  123. package/dist/components/{p-C_9ZH0A3.js → p-BXaieghV.js} +2 -2
  124. package/dist/components/p-BlHzmszE.js +2 -0
  125. package/dist/components/{p-Bl001G0Y.js.map → p-BlHzmszE.js.map} +1 -1
  126. package/dist/components/p-By_s1wNN.js +2 -0
  127. package/dist/components/p-By_s1wNN.js.map +1 -0
  128. package/dist/components/p-CNgPwd11.js +2 -0
  129. package/dist/components/{p-1darPzys.js.map → p-CNgPwd11.js.map} +1 -1
  130. package/dist/components/{p-BcfC6phQ.js → p-CNjOyUQu.js} +2 -2
  131. package/dist/components/p-CNjOyUQu.js.map +1 -0
  132. package/dist/components/{p-k0Hmj1KV.js → p-CPwpgUWT.js} +2 -2
  133. package/dist/components/{p-DIa73GJP.js → p-CU2673IJ.js} +2 -2
  134. package/dist/components/{p-Crsn82rz.js → p-CsX3ICz7.js} +2 -2
  135. package/dist/components/{p-B-9A0e_0.js → p-D0e77tkd.js} +2 -2
  136. package/dist/components/p-D1bNvIpb.js +2 -0
  137. package/dist/components/p-D1bNvIpb.js.map +1 -0
  138. package/dist/components/{p-CvyTZ4Mg.js → p-D9u1_OEZ.js} +2 -2
  139. package/dist/components/{p-B_5nxOeB.js → p-DB9XJm2c.js} +2 -2
  140. package/dist/components/{p-CUAYsK44.js → p-DIFUsoM-.js} +2 -2
  141. package/dist/components/p-DhKvqh5G.js +2 -0
  142. package/dist/components/p-DhKvqh5G.js.map +1 -0
  143. package/dist/components/{p-guQ7hv6W.js → p-DhLmoCe_.js} +2 -2
  144. package/dist/components/{p-CqWV4Hl_.js → p-DmAHufd5.js} +2 -2
  145. package/dist/components/p-DzM3SzPz.js +2 -0
  146. package/dist/components/p-DzM3SzPz.js.map +1 -0
  147. package/dist/components/{p-DNFd4Ao-.js → p-G3qIxpQj.js} +2 -2
  148. package/dist/components/{p-C6xC48hG.js → p-Re2kPrXm.js} +2 -2
  149. package/dist/components/{p--eKXTylf.js → p-Utr23NC-.js} +2 -2
  150. package/dist/components/{p-5-QAFB4j.js → p-Vdufoj7G.js} +2 -2
  151. package/dist/components/{p-BuiZcSga.js → p-huw1oRbt.js} +2 -2
  152. package/dist/components/p-huw1oRbt.js.map +1 -0
  153. package/dist/components/p-ukB-dPOK.js +2 -0
  154. package/dist/components/{p-pgxlkvUy.js.map → p-ukB-dPOK.js.map} +1 -1
  155. package/dist/components/p-yhj1lIPx.js +2 -0
  156. package/dist/docs/components.json +599 -11
  157. package/dist/lib/components/Menu/menu-position.d.ts +6 -6
  158. package/dist/lib/toast/toast-types.d.ts +3 -3
  159. package/dist/lib/utils/anchored-position.d.ts +34 -0
  160. package/dist/lib/utils/choice-popup-alignment.d.ts +2 -2
  161. package/dist/lib/utils/index.d.ts +2 -0
  162. package/dist/lib/utils/index.js +31 -0
  163. package/dist/lib/utils/index.js.map +3 -3
  164. package/dist/lib/utils/metric-change.d.ts +52 -0
  165. package/dist/lib/utils/token-defaults.d.ts +3 -0
  166. package/dist/mcp-data/registry/agent-activity.json +1 -1
  167. package/dist/mcp-data/registry/agent-response.json +1 -1
  168. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  169. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  170. package/dist/mcp-data/registry/attachment-list.json +1 -1
  171. package/dist/mcp-data/registry/avatar.json +1 -1
  172. package/dist/mcp-data/registry/badge.json +1 -1
  173. package/dist/mcp-data/registry/bar-nav.json +1 -1
  174. package/dist/mcp-data/registry/bar-title.json +2 -2
  175. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  176. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  177. package/dist/mcp-data/registry/button-filled.json +122 -6
  178. package/dist/mcp-data/registry/button-unfilled.json +49 -5
  179. package/dist/mcp-data/registry/card-data-viz-bar.json +2 -2
  180. package/dist/mcp-data/registry/card-data-viz-donut.json +2 -1
  181. package/dist/mcp-data/registry/card-data-viz-line.json +2 -2
  182. package/dist/mcp-data/registry/card-overview.json +317 -0
  183. package/dist/mcp-data/registry/card-setting.json +1 -1
  184. package/dist/mcp-data/registry/card-shell-data-viz.json +1 -1
  185. package/dist/mcp-data/registry/chart-bar-stacked.json +14 -9
  186. package/dist/mcp-data/registry/chart-bar.json +15 -10
  187. package/dist/mcp-data/registry/chart-donut.json +3 -2
  188. package/dist/mcp-data/registry/chart-legend.json +1 -1
  189. package/dist/mcp-data/registry/chart-line.json +15 -10
  190. package/dist/mcp-data/registry/checkbox.json +1 -1
  191. package/dist/mcp-data/registry/chip.json +1 -1
  192. package/dist/mcp-data/registry/code-block.json +1 -1
  193. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  194. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  195. package/dist/mcp-data/registry/conversation-list.json +1 -1
  196. package/dist/mcp-data/registry/divider.json +1 -1
  197. package/dist/mcp-data/registry/empty-state.json +1 -1
  198. package/dist/mcp-data/registry/field.json +1 -1
  199. package/dist/mcp-data/registry/icon.json +1 -1
  200. package/dist/mcp-data/registry/input.json +1 -1
  201. package/dist/mcp-data/registry/loader.json +1 -1
  202. package/dist/mcp-data/registry/markdown.json +1 -1
  203. package/dist/mcp-data/registry/menu.json +3 -3
  204. package/dist/mcp-data/registry/message-bubble.json +1 -1
  205. package/dist/mcp-data/registry/message-composer.json +1 -1
  206. package/dist/mcp-data/registry/message-scroller.json +1 -1
  207. package/dist/mcp-data/registry/message.json +1 -1
  208. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  209. package/dist/mcp-data/registry/mobile-header.json +1 -1
  210. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  211. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  212. package/dist/mcp-data/registry/modal.json +1 -1
  213. package/dist/mcp-data/registry/panel-nav.json +1 -1
  214. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  215. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  216. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  217. package/dist/mcp-data/registry/panel-tools.json +3 -2
  218. package/dist/mcp-data/registry/radio.json +1 -1
  219. package/dist/mcp-data/registry/registry.json +233 -18
  220. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  221. package/dist/mcp-data/registry/select-multi.json +1 -1
  222. package/dist/mcp-data/registry/select.json +1 -1
  223. package/dist/mcp-data/registry/shell-app.json +1 -1
  224. package/dist/mcp-data/registry/shell-gradient-picker.json +1 -1
  225. package/dist/mcp-data/registry/shell-gradient-swatch.json +1 -1
  226. package/dist/mcp-data/registry/shell-page.json +5 -4
  227. package/dist/mcp-data/registry/shell-tools.json +1 -1
  228. package/dist/mcp-data/registry/skeleton.json +1 -1
  229. package/dist/mcp-data/registry/slider.json +1 -1
  230. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  231. package/dist/mcp-data/registry/switch.json +1 -1
  232. package/dist/mcp-data/registry/tab-group.json +1 -1
  233. package/dist/mcp-data/registry/tag.json +1 -1
  234. package/dist/mcp-data/registry/text.json +1 -1
  235. package/dist/mcp-data/registry/toast.json +2 -2
  236. package/dist/mcp-data/registry/tooltip-data-viz.json +3 -1
  237. package/dist/mcp-data/registry/tooltip.json +3 -8
  238. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  239. package/dist/react/components.d.ts +1 -0
  240. package/dist/react/components.js +1 -0
  241. package/dist/react/ds-card-overview.d.ts +12 -0
  242. package/dist/react/ds-card-overview.js +12 -0
  243. package/dist/styles/control-elevation.css +11 -0
  244. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +32 -0
  245. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +20 -0
  246. package/dist/types/components/CardOverview/CardOverview.d.ts +59 -0
  247. package/dist/types/components/CardOverview/card-overview-types.d.ts +32 -0
  248. package/dist/types/components/CardOverview/index.d.ts +2 -0
  249. package/dist/types/components/ChartBar/ChartBar.d.ts +11 -0
  250. package/dist/types/components/ChartBarStacked/ChartBarStacked.d.ts +11 -0
  251. package/dist/types/components/ChartLine/ChartLine.d.ts +11 -0
  252. package/dist/types/components/Menu/Menu.d.ts +7 -4
  253. package/dist/types/components/Menu/menu-position.d.ts +6 -6
  254. package/dist/types/components/ShellPage/ShellPage.d.ts +1 -0
  255. package/dist/types/components/Tooltip/Tooltip.d.ts +1 -4
  256. package/dist/types/components.d.ts +212 -2
  257. package/dist/types/toast/toast-types.d.ts +3 -3
  258. package/dist/types/utils/anchored-position-controller.d.ts +96 -0
  259. package/dist/types/utils/anchored-position.d.ts +35 -0
  260. package/dist/types/utils/cartesian-chart-layout.d.ts +13 -0
  261. package/dist/types/utils/chart-viewport-controller.d.ts +21 -0
  262. package/dist/types/utils/choice-popup-alignment.d.ts +2 -2
  263. package/dist/types/utils/index.d.ts +2 -0
  264. package/dist/types/utils/metric-change.d.ts +53 -0
  265. package/dist/types/utils/select-controller.d.ts +3 -3
  266. package/dist/types/utils/token-defaults.d.ts +3 -0
  267. package/package.json +3 -3
  268. package/dist/components/p-1darPzys.js +0 -2
  269. package/dist/components/p-B8C_yfLQ.js +0 -2
  270. package/dist/components/p-B8C_yfLQ.js.map +0 -1
  271. package/dist/components/p-BcfC6phQ.js.map +0 -1
  272. package/dist/components/p-Bl001G0Y.js +0 -2
  273. package/dist/components/p-BuiZcSga.js.map +0 -1
  274. package/dist/components/p-Bv9frkvW.js +0 -2
  275. package/dist/components/p-Bv9frkvW.js.map +0 -1
  276. package/dist/components/p-C0-K8vnW.js +0 -2
  277. package/dist/components/p-C0-K8vnW.js.map +0 -1
  278. package/dist/components/p-C2ym_Ich.js +0 -2
  279. package/dist/components/p-C_ewSXTT.js +0 -2
  280. package/dist/components/p-C_ewSXTT.js.map +0 -1
  281. package/dist/components/p-Ca9-fnFl.js +0 -2
  282. package/dist/components/p-Ca9-fnFl.js.map +0 -1
  283. package/dist/components/p-CydY-v7X.js +0 -2
  284. package/dist/components/p-CydY-v7X.js.map +0 -1
  285. package/dist/components/p-De7NquTI.js +0 -2
  286. package/dist/components/p-De7NquTI.js.map +0 -1
  287. package/dist/components/p-Dg3xLna0.js +0 -2
  288. package/dist/components/p-Dg3xLna0.js.map +0 -1
  289. package/dist/components/p-pgxlkvUy.js +0 -2
  290. package/dist/lib/utils/anchored-popup.d.ts +0 -23
  291. package/dist/types/components/Tooltip/tooltip-position.d.ts +0 -21
  292. package/dist/types/utils/anchored-popup.d.ts +0 -24
  293. /package/dist/components/{p-C9h13YnX.js.map → p-38PfdMkF.js.map} +0 -0
  294. /package/dist/components/{p-CnAkobDW.js.map → p-B6NvVdeO.js.map} +0 -0
  295. /package/dist/components/{p-BT5hgg5i.js.map → p-BFRMwl93.js.map} +0 -0
  296. /package/dist/components/{p-C7bZ-jiU.js.map → p-BO5aqZcf.js.map} +0 -0
  297. /package/dist/components/{p-C_9ZH0A3.js.map → p-BXaieghV.js.map} +0 -0
  298. /package/dist/components/{p-k0Hmj1KV.js.map → p-CPwpgUWT.js.map} +0 -0
  299. /package/dist/components/{p-DIa73GJP.js.map → p-CU2673IJ.js.map} +0 -0
  300. /package/dist/components/{p-Crsn82rz.js.map → p-CsX3ICz7.js.map} +0 -0
  301. /package/dist/components/{p-B-9A0e_0.js.map → p-D0e77tkd.js.map} +0 -0
  302. /package/dist/components/{p-CvyTZ4Mg.js.map → p-D9u1_OEZ.js.map} +0 -0
  303. /package/dist/components/{p-B_5nxOeB.js.map → p-DB9XJm2c.js.map} +0 -0
  304. /package/dist/components/{p-CUAYsK44.js.map → p-DIFUsoM-.js.map} +0 -0
  305. /package/dist/components/{p-guQ7hv6W.js.map → p-DhLmoCe_.js.map} +0 -0
  306. /package/dist/components/{p-CqWV4Hl_.js.map → p-DmAHufd5.js.map} +0 -0
  307. /package/dist/components/{p-DNFd4Ao-.js.map → p-G3qIxpQj.js.map} +0 -0
  308. /package/dist/components/{p-C6xC48hG.js.map → p-Re2kPrXm.js.map} +0 -0
  309. /package/dist/components/{p--eKXTylf.js.map → p-Utr23NC-.js.map} +0 -0
  310. /package/dist/components/{p-5-QAFB4j.js.map → p-Vdufoj7G.js.map} +0 -0
  311. /package/dist/components/{p-C2ym_Ich.js.map → p-yhj1lIPx.js.map} +0 -0
@@ -0,0 +1,53 @@
1
+ export type MetricTrendDirection = 'up' | 'down';
2
+ /**
3
+ * How a change should read to the user. Deliberately separate from direction:
4
+ * a metric can fall and read positive, or move and read neutral, so the arrow
5
+ * and the sentiment are independent.
6
+ */
7
+ export type MetricTrendTone = 'positive' | 'negative' | 'neutral';
8
+ /** Display-ready trend for an overview score or metric. */
9
+ export interface MetricTrend {
10
+ direction: MetricTrendDirection;
11
+ /** Formatted change, for example `9` or `32%`. */
12
+ value: string;
13
+ tone: MetricTrendTone;
14
+ }
15
+ export interface MetricChange {
16
+ /** Signed difference, current minus previous. */
17
+ delta: number;
18
+ /** Magnitude of the difference. */
19
+ absolute: number;
20
+ /**
21
+ * Magnitude as a share of the previous value, so `0.32` means 32 percent.
22
+ * Zero when the previous value is zero, because the change has no base to
23
+ * measure against and an infinite increase is not reportable.
24
+ */
25
+ ratio: number;
26
+ /** `null` when the values match or either side is missing. */
27
+ direction: MetricTrendDirection | null;
28
+ }
29
+ export interface ResolveMetricTrendOptions {
30
+ /** Lower is better, so a decrease reads positive. Collisions, costs, defects. */
31
+ inverted?: boolean;
32
+ /** Report the change without a positive or negative reading. */
33
+ neutral?: boolean;
34
+ /** Report the change as a share of the previous value rather than a magnitude. */
35
+ display?: 'absolute' | 'percentage';
36
+ locale?: string;
37
+ }
38
+ /**
39
+ * Compare a metric against its previous period.
40
+ *
41
+ * Reports magnitudes only — whether a rise is good news is a product decision,
42
+ * so callers pair this with `resolveMetricTrend` or map `direction` themselves.
43
+ */
44
+ export declare function computeMetricChange(current: number | null | undefined, previous: number | null | undefined): MetricChange;
45
+ /**
46
+ * Build a display-ready trend, or `null` when there is nothing to report so the
47
+ * caller can omit the trend entirely rather than render a zero.
48
+ *
49
+ * Percentages are formatted without decimals to match the product's overview
50
+ * bar; `formatPercentage` is not used because it requires one or two decimals.
51
+ */
52
+ export declare function resolveMetricTrend(current: number | null | undefined, previous: number | null | undefined, options?: ResolveMetricTrendOptions): MetricTrend | null;
53
+ //# sourceMappingURL=metric-change.d.ts.map
@@ -24,7 +24,8 @@ export interface SelectControllerState<T extends ChoiceOption> {
24
24
  *
25
25
  * Decorated Stencil state and scalar/array selection remain in each component;
26
26
  * this controller owns only popup lifecycle, focus, positioning, typeahead,
27
- * and listbox keyboard traversal.
27
+ * and listbox keyboard traversal. Anchored placement is delegated to
28
+ * `AnchoredPositionController`; only the choice-cell measurement stays here.
28
29
  */
29
30
  export declare class SelectController<T extends ChoiceOption> {
30
31
  private readonly state;
@@ -34,8 +35,7 @@ export declare class SelectController<T extends ChoiceOption> {
34
35
  private typeahead;
35
36
  private typeaheadTimer;
36
37
  private outsideHandler;
37
- private repositionHandler;
38
- private positionRetryRaf;
38
+ private readonly position;
39
39
  constructor(state: SelectControllerState<T>);
40
40
  get activeOptionId(): string | undefined;
41
41
  setTriggerElement: (element: HTMLButtonElement | null) => void;
@@ -1,7 +1,10 @@
1
1
  /** TokoMo CSS custom-property names for shared component defaults (runtime resolution). */
2
2
  export declare const TOKEN_DEFAULTS: {
3
3
  readonly space050: "--dimension-space-050";
4
+ readonly space100: "--dimension-space-100";
4
5
  readonly space200: "--dimension-space-200";
6
+ readonly space300: "--dimension-space-300";
7
+ readonly space400: "--dimension-space-400";
5
8
  readonly radius025: "--dimension-radius-025";
6
9
  readonly size200: "--dimension-size-200";
7
10
  readonly size300: "--dimension-size-300";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ds-mo/ui",
3
- "version": "12.7.0",
3
+ "version": "12.8.0",
4
4
  "description": "CompoMo — composable web components styled with TokoMo design tokens",
5
5
  "keywords": [
6
6
  "web-components",
@@ -107,7 +107,7 @@
107
107
  "@angular/core": ">=19 <23",
108
108
  "@angular/forms": ">=19 <23",
109
109
  "@ds-mo/icons": "^6.4.0",
110
- "@ds-mo/tokens": "^3.1.1",
110
+ "@ds-mo/tokens": "^5.0.0",
111
111
  "react": "^18 || ^19",
112
112
  "react-dom": "^18 || ^19"
113
113
  },
@@ -132,7 +132,7 @@
132
132
  "@angular/forms": "^22.0.7",
133
133
  "@axe-core/playwright": "^4.12.1",
134
134
  "@ds-mo/icons": "^6.4.0",
135
- "@ds-mo/tokens": "^3.1.1",
135
+ "@ds-mo/tokens": "^5.0.0",
136
136
  "@eslint/js": "^10.0.1",
137
137
  "@modelcontextprotocol/sdk": "^1.29.0",
138
138
  "@playwright/test": "^1.55.0",
@@ -1,2 +0,0 @@
1
- import{p as t,t as e,H as i,h as a,a as s}from"./index.js";import{d as n}from"./p-BAfG3M8z.js";import{d as r}from"./p-Ca-I2UnB.js";import{d}from"./p-k0Hmj1KV.js";const c=()=>`.ds-visually-hidden.sc-ds-agent-activity-h,.ds-visually-hidden.sc-ds-agent-activity{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sc-ds-agent-activity-h{display:block}.agent-activity.sc-ds-agent-activity{margin:0}summary.sc-ds-agent-activity{align-items:center;color:var(--color-foreground-secondary);cursor:default;display:flex;gap:var(--dimension-space-050);list-style:none;padding:var(--dimension-space-025) 0}summary.sc-ds-agent-activity::-webkit-details-marker{display:none}details[open].sc-ds-agent-activity summary.sc-ds-agent-activity ds-icon.sc-ds-agent-activity{transform:rotate(90deg)}ds-text.agent-activity__summary-label.sc-ds-agent-activity{min-width:0}ol.sc-ds-agent-activity{display:grid;gap:var(--dimension-space-075);list-style:none;margin:0;padding:var(--dimension-space-100) 0 0 var(--dimension-space-200)}.agent-activity__item.sc-ds-agent-activity{align-items:start;display:grid;gap:var(--dimension-space-050);grid-template-columns:auto minmax(0, 1fr)}.agent-activity__marker.sc-ds-agent-activity{align-items:center;color:var(--color-foreground-faint-neutral);display:flex;padding-block-start:var(--dimension-space-025)}.agent-activity__item--active.sc-ds-agent-activity .agent-activity__marker.sc-ds-agent-activity{color:var(--color-foreground-faint-brand)}.agent-activity__item--error.sc-ds-agent-activity .agent-activity__marker.sc-ds-agent-activity{color:var(--color-foreground-bold-negative)}.agent-activity__item.sc-ds-agent-activity span.sc-ds-agent-activity:last-child{display:grid;gap:var(--dimension-space-025)}.agent-activity__pending-dot.sc-ds-agent-activity{width:var(--dimension-size-050);height:var(--dimension-size-050);border-radius:var(--dimension-radius-half);background:currentColor}@media (prefers-reduced-motion: no-preference){summary.sc-ds-agent-activity ds-icon.sc-ds-agent-activity{transition:transform var(--effect-motion-short-2)}}`;const o=t(class t extends i{constructor(t){super();if(t!==false){this.__registerHost()}this.items=[];this.heading="Activity";this.open=false;this.expanded=false;this.handleToggle=t=>{this.expanded=t.currentTarget.open}}componentWillLoad(){this.expanded=this.open}handleOpenChange(t){this.expanded=t}get currentItem(){return this.items.find((t=>t.state==="active"))??this.items.find((t=>t.state==="error"))??[...this.items].reverse().find((t=>t.state==="complete"))??this.items.find((t=>t.state==="pending"))}stateLabel(t){if(t.state==="active")return"In progress";if(t.state==="complete")return"Complete";if(t.state==="error")return"Error";return"Pending"}render(){return a(s,{key:"63a8d8cd69fcf662158a637d8747b55642340c08"},a("details",{key:"023d51e9b50403bb4243e56084dd48766e01d85f",class:"agent-activity",open:this.open,onToggle:this.handleToggle},a("summary",{key:"ed08b0fdee381a45048d1129c16bbd8be6f8cfc2"},a("ds-icon",{key:"625634e9bd20df77f429d091dba6ef44e6b04bae",name:"ChevronRight",size:"xs",color:"inherit"}),a("ds-text",{key:"528a3c96b5246187b95a7f420431098ef75b8151",class:"agent-activity__summary-label",variant:"text-body-small",shimmer:!this.expanded&&this.currentItem?.state==="active"},this.expanded?this.heading:this.currentItem?.label??this.heading)),a("ol",{key:"2a6a35255d2e1553b67418ae8de43abe2101030e"},this.items.map((t=>a("li",{class:`agent-activity__item agent-activity__item--${t.state}`},a("span",{class:"agent-activity__marker","aria-hidden":"true"},t.state==="active"?a("ds-loader",{size:"xs",color:"inherit"}):t.state==="pending"?a("span",{class:"agent-activity__pending-dot"}):a("ds-icon",{name:t.state==="error"?"ErrorTriangle":"Check",size:"xs",color:"inherit"})),a("span",null,a("ds-text",{variant:"text-body-small",shimmer:t.state==="active"},t.label),t.detail?a("ds-text",{variant:"text-caption",color:"secondary"},t.detail):null,a("span",{class:"agent-activity__state ds-visually-hidden"},this.stateLabel(t)))))))))}static get watchers(){return{open:[{handleOpenChange:0}]}}static get style(){return c()}},[2,"ds-agent-activity",{items:[16],heading:[1],open:[4],expanded:[32]},undefined,{open:[{handleOpenChange:0}]}]);function l(){if(typeof customElements==="undefined"){return}const t=["ds-agent-activity","ds-icon","ds-loader","ds-text"];t.forEach((t=>{switch(t){case"ds-agent-activity":if(!customElements.get(e(t))){customElements.define(e(t),o)}break;case"ds-icon":if(!customElements.get(e(t))){n()}break;case"ds-loader":if(!customElements.get(e(t))){r()}break;case"ds-text":if(!customElements.get(e(t))){d()}break}}))}l();export{o as A,l as d};
2
- //# sourceMappingURL=p-1darPzys.js.map
@@ -1,2 +0,0 @@
1
- const t={top:"bottom",right:"left",bottom:"top",left:"right"};function o(t,o){const{anchorRect:n,popupWidth:e,popupHeight:p,align:i,sideOffsetPx:r,alignOffsetPx:s}=t;if(o==="top"||o==="bottom"){return{x:i==="start"?n.left+s:i==="end"?n.right-e+s:n.left+n.width/2-e/2+s,y:o==="top"?n.top-p-r:n.bottom+r}}return{x:o==="left"?n.left-e-r:n.right+r,y:i==="start"?n.top+s:i==="end"?n.bottom-p+s:n.top+n.height/2-p/2+s}}function n(t,o,n){const{popupWidth:e,popupHeight:p,viewportPadPx:i,viewportWidth:r,viewportHeight:s}=t;if(o==="top"||o==="bottom"){return Math.max(i-n.y,0)+Math.max(n.y+p-(s-i),0)}return Math.max(i-n.x,0)+Math.max(n.x+e-(r-i),0)}function e(e){const p=o(e,e.side);const i=t[e.side];const r=o(e,i);const s=n(e,e.side,p);const c=n(e,i,r);const h=s>0&&c<s;const a=h?i:e.side;const f=h?r:p;const u=Math.max(e.viewportPadPx,e.viewportWidth-e.popupWidth-e.viewportPadPx);const M=Math.max(e.viewportPadPx,e.viewportHeight-e.popupHeight-e.viewportPadPx);return{x:Math.min(Math.max(f.x,e.viewportPadPx),u),y:Math.min(Math.max(f.y,e.viewportPadPx),M),resolvedSide:a}}export{e as c};
2
- //# sourceMappingURL=p-B8C_yfLQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["OPPOSITE_SIDE","top","right","bottom","left","rawPosition","input","side","anchorRect","anchor","popupWidth","popupHeight","align","sideOffsetPx","alignOffsetPx","x","width","y","height","mainAxisOverflow","position","viewportPadPx","viewportWidth","viewportHeight","Math","max","computeTooltipPosition","preferred","oppositeSide","opposite","preferredOverflow","oppositeOverflow","useOpposite","resolvedSide","maxX","maxY","min"],"sources":["src/wc/components/Tooltip/tooltip-position.ts"],"sourcesContent":["import type { TooltipAlign, TooltipSide } from './Tooltip';\n\nexport interface TooltipPositionInput {\n anchorRect: Pick<DOMRectReadOnly, 'top' | 'left' | 'right' | 'bottom' | 'width' | 'height'>;\n popupWidth: number;\n popupHeight: number;\n side: TooltipSide;\n align: TooltipAlign;\n sideOffsetPx: number;\n alignOffsetPx: number;\n viewportPadPx: number;\n viewportWidth: number;\n viewportHeight: number;\n}\n\nexport interface TooltipPosition {\n x: number;\n y: number;\n resolvedSide: TooltipSide;\n}\n\nconst OPPOSITE_SIDE: Record<TooltipSide, TooltipSide> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n};\n\nfunction rawPosition(\n input: TooltipPositionInput,\n side: TooltipSide,\n): Pick<TooltipPosition, 'x' | 'y'> {\n const {\n anchorRect: anchor,\n popupWidth,\n popupHeight,\n align,\n sideOffsetPx,\n alignOffsetPx,\n } = 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\nfunction mainAxisOverflow(\n input: TooltipPositionInput,\n side: TooltipSide,\n position: Pick<TooltipPosition, 'x' | 'y'>,\n): number {\n const {\n popupWidth,\n popupHeight,\n viewportPadPx,\n viewportWidth,\n viewportHeight,\n } = input;\n\n if (side === 'top' || side === 'bottom') {\n return Math.max(viewportPadPx - position.y, 0) +\n Math.max(position.y + popupHeight - (viewportHeight - viewportPadPx), 0);\n }\n\n return Math.max(viewportPadPx - position.x, 0) +\n Math.max(position.x + popupWidth - (viewportWidth - viewportPadPx), 0);\n}\n\n/** Flip on the preferred axis when needed, then clamp within the viewport. */\nexport function computeTooltipPosition(input: TooltipPositionInput): TooltipPosition {\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 maxX = Math.max(input.viewportPadPx, input.viewportWidth - input.popupWidth - input.viewportPadPx);\n const maxY = Math.max(input.viewportPadPx, input.viewportHeight - input.popupHeight - input.viewportPadPx);\n\n return {\n x: Math.min(Math.max(position.x, input.viewportPadPx), maxX),\n y: Math.min(Math.max(position.y, input.viewportPadPx), maxY),\n resolvedSide,\n };\n}\n"],"mappings":"AAqBA,MAAMA,EAAkD,CACtDC,IAAK,SACLC,MAAO,OACPC,OAAQ,MACRC,KAAM,SAGR,SAASC,EACPC,EACAC,GAEA,MACEC,WAAYC,EAAMC,WAClBA,EAAUC,YACVA,EAAWC,MACXA,EAAKC,aACLA,EAAYC,cACZA,GACER,EAEJ,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,CAEA,SAASK,EACPb,EACAC,EACAa,GAEA,MAAMV,WACJA,EAAUC,YACVA,EAAWU,cACXA,EAAaC,cACbA,EAAaC,eACbA,GACEjB,EAEJ,GAAIC,IAAS,OAASA,IAAS,SAAU,CACvC,OAAOiB,KAAKC,IAAIJ,EAAgBD,EAASH,EAAG,GAC1CO,KAAKC,IAAIL,EAASH,EAAIN,GAAeY,EAAiBF,GAAgB,E,CAG1E,OAAOG,KAAKC,IAAIJ,EAAgBD,EAASL,EAAG,GAC1CS,KAAKC,IAAIL,EAASL,EAAIL,GAAcY,EAAgBD,GAAgB,EACxE,CAGM,SAAUK,EAAuBpB,GACrC,MAAMqB,EAAYtB,EAAYC,EAAOA,EAAMC,MAC3C,MAAMqB,EAAe5B,EAAcM,EAAMC,MACzC,MAAMsB,EAAWxB,EAAYC,EAAOsB,GACpC,MAAME,EAAoBX,EAAiBb,EAAOA,EAAMC,KAAMoB,GAC9D,MAAMI,EAAmBZ,EAAiBb,EAAOsB,EAAcC,GAC/D,MAAMG,EAAcF,EAAoB,GAAKC,EAAmBD,EAChE,MAAMG,EAAeD,EAAcJ,EAAetB,EAAMC,KACxD,MAAMa,EAAWY,EAAcH,EAAWF,EAC1C,MAAMO,EAAOV,KAAKC,IAAInB,EAAMe,cAAef,EAAMgB,cAAgBhB,EAAMI,WAAaJ,EAAMe,eAC1F,MAAMc,EAAOX,KAAKC,IAAInB,EAAMe,cAAef,EAAMiB,eAAiBjB,EAAMK,YAAcL,EAAMe,eAE5F,MAAO,CACLN,EAAGS,KAAKY,IAAIZ,KAAKC,IAAIL,EAASL,EAAGT,EAAMe,eAAgBa,GACvDjB,EAAGO,KAAKY,IAAIZ,KAAKC,IAAIL,EAASH,EAAGX,EAAMe,eAAgBc,GACvDF,eAEJ,Q","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["PANEL_TOOLS_TOOL_IDS","PANEL_TOOLS_PRIMARY_TOOL_ID","PANEL_TOOLS_FOOTER_TOOL_ID","PANEL_TOOLS_LABELS","search","messages","stacks","activity","agents","help","PANEL_TOOLS_SHORTCUTS","parsePanelToolsItems","items","itemsJson","parseJsonArrayProp","orderPanelToolsItems","firstById","Map","item","has","id","set","flatMap","get","isPanelToolsToolId","value","includes","reconcilePanelToolsAvailability","open","activeTool","some","removedTool","panelToolsDrawerTransitionMs","style","properties","transitionProperty","split","map","trim","durations","transitionDuration","parseCssTimeMs","delays","transitionDelay","reduce","max","property","index","duration","length","delay","Math","panelToolsDrawerResting","motion","panelToolsDrawerAtTerminal","width","targetWidth","resolvePanelToolActivation","selected","panelToolsCss","PanelTools","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","presentation","fullscreenHeaderMode","toolsLabel","toolShortcutsLabel","headers","headersJson","storageKey","drawerSurfaceRetained","readyForMotion","presentationMotionSuppressed","rovingIndex","fullViewToolIds","motionEnableGeneration","presentationMotionGeneration","transitionGeneration","transitionFallbackTimer","ignoreReplacementTerminal","focusBeforeFullscreen","fullViewObserver","handleComposedHeaderAction","event","detail","stopPropagation","dsHeaderAction","emit","tool","handleTransitionEnd","drawer","el","querySelector","target","propertyName","type","drawerTransitionAtTerminal","finishDrawerTransition","handleToolChange","next","dsToolChange","handleRailKeyDown","e","orderedRailItems","key","preventDefault","focusRailAt","railItems","headerItem","find","footerItem","bodyItems","filter","ordered","push","disconnectedCallback","removeEventListener","clearTransitionCompletion","disconnect","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","syncFullViewTools","MutationObserver","observe","childList","attributes","attributeFilter","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","ids","Boolean","join","headerLabel","resolvedHeaders","Object","keys","parsed","JSON","parse","Array","isArray","activateTool","entry","isInactive","closeDrawer","action","CSS","escape","setFocus","bounded","min","from","querySelectorAll","renderRailAction","label","ariaLabel","h","shortcutKey","side","size","variant","class","icon","isActive","activeFill","hasBorder","dot","focusTabIndex","pressed","onFocusin","onKeyDown","onDsClick","render","header","headerTitle","title","headerActions","footerIndex","showDrawerChrome","drawerResting","activeFullView","toolIds","Host","role","bodyIdx","inert","heading","showBack","backIcon","backAriaLabel","showMenu","ref","element","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=scoped","src/wc/components/PanelTools/PanelTools.tsx"],"sourcesContent":["/** Tool ids for the `ds-panel-tools` rail and drawer views. */\nexport type PanelToolsToolId = 'search' | 'agents' | 'messages' | 'stacks' | 'activity' | 'help';\n\nexport const PANEL_TOOLS_TOOL_IDS: PanelToolsToolId[] = [\n 'search',\n 'agents',\n 'messages',\n 'stacks',\n 'activity',\n 'help',\n];\n\n/** Rail header slot — mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: PanelToolsToolId = 'search';\n\n/** Rail footer slot — flush to the bottom of the tools column. */\nexport const PANEL_TOOLS_FOOTER_TOOL_ID: PanelToolsToolId = 'help';\n\nexport const PANEL_TOOLS_LABELS: Record<PanelToolsToolId, 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<PanelToolsToolId, 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 /** 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\nexport interface PanelToolsHeaderAction {\n id: string;\n icon: string;\n ariaLabel: string;\n triggerId?: string;\n controls?: string;\n expanded?: boolean;\n haspopup?: 'menu' | 'dialog' | 'listbox' | 'tree' | 'grid';\n pressed?: boolean;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsHeaderConfig {\n title?: string;\n showBack?: boolean;\n backIcon?: string;\n backAriaLabel?: string;\n actions?: PanelToolsHeaderAction[];\n}\n\n/** Per-tool header state. The application replaces the object when a tool changes depth or actions. */\nexport type PanelToolsHeaders = Partial<Record<PanelToolsToolId, PanelToolsHeaderConfig>>;\n","import { parseJsonArrayProp } from '../BarNav/bar-nav-utils';\nimport { parseCssTimeMs } from '../../utils/resolve-css-time-ms';\nimport {\n PANEL_TOOLS_TOOL_IDS,\n type PanelToolsItem,\n type PanelToolsToolId,\n} from './panel-tools-types';\n\nexport function parsePanelToolsItems(items: PanelToolsItem[], itemsJson: string): PanelToolsItem[] {\n if (itemsJson) {\n return parseJsonArrayProp<PanelToolsItem>(itemsJson, []);\n }\n return items ?? [];\n}\n\nexport function orderPanelToolsItems(items: PanelToolsItem[]): PanelToolsItem[] {\n const firstById = new Map<PanelToolsToolId, PanelToolsItem>();\n for (const item of items) {\n if (!firstById.has(item.id)) firstById.set(item.id, item);\n }\n return PANEL_TOOLS_TOOL_IDS.flatMap(id => {\n const item = firstById.get(id);\n return item ? [item] : [];\n });\n}\n\nexport function isPanelToolsToolId(value: string | null): value is PanelToolsToolId {\n return value !== null && PANEL_TOOLS_TOOL_IDS.includes(value as PanelToolsToolId);\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.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/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);\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);\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_FOOTER_TOOL_ID,\n PANEL_TOOLS_LABELS,\n PANEL_TOOLS_PRIMARY_TOOL_ID,\n PANEL_TOOLS_SHORTCUTS,\n type PanelToolsHeaderAction,\n type PanelToolsHeaderConfig,\n type PanelToolsHeaders,\n type PanelToolsItem,\n type PanelToolsToolId,\n} from './panel-tools-types';\nimport {\n isPanelToolsToolId,\n orderPanelToolsItems,\n panelToolsDrawerAtTerminal,\n parsePanelToolsItems,\n panelToolsDrawerResting,\n panelToolsDrawerTransitionMs,\n reconcilePanelToolsAvailability,\n resolvePanelToolActivation,\n} from './panel-tools-utils';\n\n@Component({\n tag: 'ds-panel-tools',\n styleUrl: 'PanelTools.css',\n scoped: 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 /** JSON fallback for `items` — useful when framework bindings don't propagate arrays. */\n @Prop({ attribute: 'items-json' }) itemsJson: string = '';\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 /** JSON fallback for `headers`. The `headers` property takes precedence when non-empty. */\n @Prop({ attribute: 'headers-json' }) headersJson: string = '';\n\n /**\n * Optional localStorage key for the last active tool. The drawer always starts\n * closed; only the tool identity is restored for continuity within this browser.\n */\n @Prop({ attribute: 'storage-key' }) storageKey: string = '';\n\n /** Emitted when a rail button is toggled. Detail = { id, selected }. */\n @Event({ bubbles: true, composed: true }) dsToolChange!: EventEmitter<{\n id: PanelToolsToolId;\n selected: boolean;\n }>;\n\n /** Emitted when fullscreen changes, including Escape-initiated exits. */\n @Event({ bubbles: true, composed: true }) dsPresentationChange!: EventEmitter<{\n presentation: 'drawer' | 'fullscreen';\n }>;\n\n /** Requests navigation to the active tool's parent view. */\n @Event({ bubbles: true, composed: true }) dsHeaderBack!: EventEmitter<{\n tool: PanelToolsToolId;\n }>;\n\n /** Requests one application-owned action from the active tool header. */\n @Event({ bubbles: true, composed: true }) dsHeaderAction!: EventEmitter<{\n tool: PanelToolsToolId;\n id: string;\n }>;\n\n /** Bubbling lifecycle — `ds-bar-nav` defers overflow checks during drawer motion. */\n @Event({ bubbles: true, composed: true })\n dsChromeTransitionStart!: EventEmitter<ChromeTransitionDetail>;\n\n @Event({ bubbles: true, composed: true })\n dsChromeTransitionEnd!: EventEmitter<ChromeTransitionDetail>;\n\n /** Arms open vs close easing for the in-flight width transition. */\n @State() private motion: 'opening' | 'closing' | 'idle' = 'idle';\n\n /** Keeps header and slotted content painted until the closing clip transition completes. */\n @State() private drawerSurfaceRetained = false;\n\n /** Suppresses width transition until the host has painted its initial open state. */\n @State() private readyForMotion = false;\n\n /** Fullscreen presentation changes snap without borrowing drawer width motion. */\n @State() private presentationMotionSuppressed = false;\n\n @State() private rovingIndex = 0;\n @State() private fullViewToolIds: PanelToolsToolId[] = [];\n\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\n private get railItems(): PanelToolsItem[] {\n return parsePanelToolsItems(this.items, this.itemsJson);\n }\n\n private get orderedRailItems(): PanelToolsItem[] {\n const railItems = orderPanelToolsItems(this.railItems);\n const headerItem = railItems.find(item => item.id === PANEL_TOOLS_PRIMARY_TOOL_ID);\n const footerItem = railItems.find(item => item.id === PANEL_TOOLS_FOOTER_TOOL_ID);\n const bodyItems = railItems.filter(\n item => item.id !== PANEL_TOOLS_PRIMARY_TOOL_ID && item.id !== PANEL_TOOLS_FOOTER_TOOL_ID\n );\n const ordered: PanelToolsItem[] = [];\n if (headerItem) ordered.push(headerItem);\n ordered.push(...bodyItems);\n if (footerItem) ordered.push(footerItem);\n return ordered;\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 }\n\n @Watch('presentation')\n presentationChanged(next: 'drawer' | 'fullscreen', previous?: 'drawer' | 'fullscreen') {\n if (next === previous) return;\n // Framework property bindings can update slotted master/detail content in\n // the same render that requests fullscreen. Reflect the host selector\n // immediately so that content cannot paint once in the drawer geometry\n // while Stencil waits to commit its next render.\n if (this.el.getAttribute('presentation') !== next) {\n this.el.setAttribute('presentation', next);\n }\n const presentationGeneration = ++this.presentationMotionGeneration;\n this.presentationMotionSuppressed = true;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (presentationGeneration !== this.presentationMotionGeneration) return;\n this.presentationMotionSuppressed = false;\n });\n });\n if (next === 'fullscreen') {\n this.focusBeforeFullscreen =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n this.open = true;\n } else if (previous === 'fullscreen') {\n const focusBeforeFullscreen = this.focusBeforeFullscreen;\n const fallbackActionId = this.activeHeader().actions?.[0]?.id;\n requestAnimationFrame(async () => {\n if (focusBeforeFullscreen?.isConnected) {\n focusBeforeFullscreen.focus({ preventScroll: true });\n }\n const focusRestored = focusBeforeFullscreen\n ? document.activeElement === focusBeforeFullscreen ||\n focusBeforeFullscreen.contains(document.activeElement)\n : false;\n if (!focusRestored && fallbackActionId) await this.focusHeaderAction(fallbackActionId);\n this.focusBeforeFullscreen = null;\n });\n }\n this.dsPresentationChange.emit({ presentation: next });\n }\n\n @Listen('keydown', { target: 'window', capture: true })\n handleFullscreenEscape(event: KeyboardEvent) {\n if (this.presentation !== 'fullscreen' || event.key !== 'Escape') return;\n event.preventDefault();\n event.stopPropagation();\n this.presentation = 'drawer';\n }\n\n private deferMotionEnable() {\n if (this.readyForMotion) return;\n const generation = ++this.motionEnableGeneration;\n requestAnimationFrame(() => {\n if (generation !== this.motionEnableGeneration) return;\n requestAnimationFrame(() => {\n if (generation !== this.motionEnableGeneration) return;\n this.readyForMotion = true;\n });\n });\n }\n\n connectedCallback() {\n this.el.addEventListener('transitionend', this.handleTransitionEnd);\n this.el.addEventListener('transitioncancel', this.handleTransitionEnd);\n this.el.addEventListener('dsAction', this.handleComposedHeaderAction);\n }\n\n private handleComposedHeaderAction = (event: Event) => {\n const detail = (event as CustomEvent<{ id?: string }>).detail;\n if (!this.activeTool || !detail?.id) return;\n event.stopPropagation();\n this.dsHeaderAction.emit({ tool: this.activeTool, id: detail.id });\n };\n\n componentWillLoad() {\n this.restoreLastActiveTool();\n this.drawerSurfaceRetained = this.open;\n }\n\n @Watch('open')\n openChanged(isOpen: boolean, wasOpen?: boolean) {\n if (isOpen) this.drawerSurfaceRetained = true;\n if (this.readyForMotion && wasOpen !== undefined && wasOpen !== isOpen) {\n this.startDrawerTransition(isOpen ? 'opening' : 'closing');\n } else if (!isOpen) {\n this.drawerSurfaceRetained = false;\n }\n this.deferMotionEnable();\n }\n\n @Watch('activeTool')\n activeToolChanged() {\n this.persistLastActiveTool();\n this.deferMotionEnable();\n }\n\n @Watch('storageKey')\n storageKeyChanged() {\n this.restoreLastActiveTool();\n }\n\n componentDidLoad() {\n this.deferMotionEnable();\n this.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 @Watch('items')\n @Watch('itemsJson')\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.el.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.el.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: PanelToolsToolId[] = ['search', 'messages', 'stacks', 'activity', 'agents', 'help'];\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 headerLabel(): string {\n if (!this.isDrawerPresent() || !this.activeTool) return '';\n return PANEL_TOOLS_LABELS[this.activeTool as PanelToolsToolId] ?? '';\n }\n\n private resolvedHeaders(): PanelToolsHeaders {\n if (Object.keys(this.headers).length) return this.headers;\n if (!this.headersJson.trim()) return {};\n try {\n const parsed = JSON.parse(this.headersJson);\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as PanelToolsHeaders)\n : {};\n } catch {\n return {};\n }\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.el.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.el.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 = item.ariaLabel ?? PANEL_TOOLS_LABELS[item.id];\n return (\n <ds-tooltip\n key={item.id}\n label={label}\n shortcutKey={PANEL_TOOLS_SHORTCUTS[item.id]}\n side=\"left\"\n size=\"sm\"\n >\n <ds-button-unfilled\n variant=\"icon\"\n class=\"panel-tools__rail-action\"\n icon={item.icon}\n isActive={this.isRailSelected(item.id)}\n activeFill={false}\n hasBorder={false}\n 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 headerItem = orderedRailItems.find(item => item.id === PANEL_TOOLS_PRIMARY_TOOL_ID);\n const footerItem = orderedRailItems.find(item => item.id === PANEL_TOOLS_FOOTER_TOOL_ID);\n const bodyItems = orderedRailItems.filter(\n item => item.id !== PANEL_TOOLS_PRIMARY_TOOL_ID && item.id !== PANEL_TOOLS_FOOTER_TOOL_ID\n );\n const footerIndex = footerItem ? (headerItem ? 1 : 0) + bodyItems.length : -1;\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: PanelToolsToolId[] = [\n 'search',\n 'messages',\n 'stacks',\n 'activity',\n 'agents',\n 'help',\n ];\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 {headerItem ? (\n <div class=\"panel-tools__rail-header ds-chrome-row ds-chrome-space--md\">\n {this.renderRailAction(headerItem, 0)}\n </div>\n ) : null}\n <div class=\"panel-tools__rail-body ds-chrome-column ds-chrome-space--md ds-scrollbar-hidden\">\n <div class=\"panel-tools__rail-actions\">\n {bodyItems.map((item, bodyIdx) =>\n this.renderRailAction(item, headerItem ? bodyIdx + 1 : bodyIdx)\n )}\n </div>\n </div>\n {footerItem ? (\n <div class=\"panel-tools__rail-footer ds-chrome-row ds-chrome-space--md\">\n {this.renderRailAction(footerItem, footerIndex)}\n </div>\n ) : null}\n </nav>\n\n <div\n class={{\n 'panel-tools__drawer': true,\n 'panel-tools__drawer--visible': showDrawerChrome,\n }}\n aria-hidden={showDrawerChrome ? null : 'true'}\n inert={showDrawerChrome ? undefined : true}\n >\n <div class=\"panel-tools__drawer-surface\">\n {this.presentation !== 'fullscreen' || this.fullscreenHeaderMode === 'shared' ? (\n <ds-panel-tool-header\n class=\"panel-tools__header\"\n heading={headerTitle}\n showBack={header.showBack ?? false}\n backIcon={header.backIcon || 'ChevronLeft'}\n backAriaLabel={header.backAriaLabel || 'Back'}\n showMenu={false}\n ref={element => {\n const toolHeader = element as\n | (HTMLDsPanelToolHeaderElement & {\n actions: PanelToolsHeaderAction[];\n })\n | undefined;\n if (toolHeader) toolHeader.actions = headerActions;\n }}\n onDsBack={() => {\n if (this.activeTool) this.dsHeaderBack.emit({ tool: this.activeTool });\n }}\n />\n ) : null}\n <div class=\"panel-tools__body\" hidden={activeFullView}>\n {toolIds.map(id => {\n const active = this.isViewActive(id);\n return (\n <div\n class={{\n 'panel-tools__view': true,\n 'panel-tools__view--active': active,\n }}\n hidden={!active}\n >\n <slot name={id} />\n </div>\n );\n })}\n </div>\n <div class=\"panel-tools__full-views\" hidden={!activeFullView}>\n {toolIds.map(id => (\n <div\n class={{\n 'panel-tools__full-view': true,\n 'panel-tools__full-view--active':\n this.isViewActive(id) && this.hasFullView(id),\n }}\n hidden={!(this.isViewActive(id) && this.hasFullView(id))}\n >\n <slot name={`${id}-view`} />\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as t,H as o,h as i,a as s,t as a}from"./index.js";import{d as n}from"./p-k0Hmj1KV.js";import{T as e,r as d}from"./p-Dg3xLna0.js";const r=()=>`.ds-control--lg.sc-ds-tooltip-data-viz,.ds-control--lg.sc-ds-tooltip-data-viz-h,.ds-control--md.sc-ds-tooltip-data-viz-h,.ds-control--md.sc-ds-tooltip-data-viz,.ds-control--sm.sc-ds-tooltip-data-viz-h,.ds-control--sm.sc-ds-tooltip-data-viz,.ds-control--xs.sc-ds-tooltip-data-viz-h,.ds-control--xs.sc-ds-tooltip-data-viz{--ds-control-radius:var(--dimension-radius-025)}.ds-control--lg.sc-ds-tooltip-data-viz-h,.ds-control--lg.sc-ds-tooltip-data-viz{--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-tooltip-data-viz-h,.ds-control--md.sc-ds-tooltip-data-viz{--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-tooltip-data-viz-h,.ds-control--sm.sc-ds-tooltip-data-viz{--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-tooltip-data-viz-h,.ds-control--xs.sc-ds-tooltip-data-viz{--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}.sc-ds-tooltip-data-viz-h{position:absolute;z-index:var(--dimension-z-index-tooltip);display:block;box-sizing:border-box;background-color:var(--color-translucent-translucent);backdrop-filter:blur(var(--effect-blur-md));-webkit-backdrop-filter:blur(var(--effect-blur-md));border-radius:var(--ds-control-radius, var(--dimension-radius-025));box-shadow:var(--effect-elevation-elevated-floating);white-space:nowrap;pointer-events:none;opacity:0}.tooltip-data-viz--visible.sc-ds-tooltip-data-viz-h{animation:tooltip-data-viz-fade-in var(--effect-motion-short-2) forwards}.tooltip-data-viz__item.sc-ds-tooltip-data-viz{box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));display:flex;align-items:center;gap:var(--dimension-space-025);padding:0 var(--ds-control-padding-inline, var(--dimension-space-075))}.tooltip-data-viz__label.sc-ds-tooltip-data-viz,.tooltip-data-viz__value.sc-ds-tooltip-data-viz{padding:0 var(--ds-control-label-inset, var(--dimension-space-025))}@keyframes tooltip-data-viz-fade-in{from{opacity:0}to{opacity:1}}@media (prefers-reduced-motion: reduce){.tooltip-data-viz--visible.sc-ds-tooltip-data-viz-h{animation:none;opacity:1}}`;const l=12;const c=8;const p=t(class t extends o{constructor(t){super();if(t!==false){this.__registerHost()}this.value="";this.label="";this.x=0;this.y=0;this.delay=e.animationDelayInstant;this.side="right";this.align="bottom";this.visible=false;this.delayTimer=null}componentDidLoad(){this.scheduleShow();this.calculatePlacement()}disconnectedCallback(){this.clearDelayTimer()}onAnchorChange(){requestAnimationFrame((()=>this.calculatePlacement()))}onDelayChange(){if(!this.visible)this.scheduleShow()}get showDelayMs(){return d(this.delay,e.animationDelayInstant)}clearDelayTimer(){if(this.delayTimer){clearTimeout(this.delayTimer);this.delayTimer=null}}scheduleShow(){this.clearDelayTimer();this.visible=false;const t=this.showDelayMs;if(t<=0){this.visible=true;return}this.delayTimer=setTimeout((()=>{this.delayTimer=null;this.visible=true;requestAnimationFrame((()=>this.calculatePlacement()))}),t)}calculatePlacement(){const t=this.el.getBoundingClientRect();if(!t.width||!t.height)return;const o=t.right>window.innerWidth-c?"left":"right";const i=t.bottom>window.innerHeight-c?"top":"bottom";if(o!==this.side)this.side=o;if(i!==this.align)this.align=i}render(){const t=this.side==="right"?`${l}px`:`calc(-100% - ${l}px)`;const o=this.align==="bottom"?`${l}px`:`calc(-100% - ${l}px)`;return i(s,{key:"ea5d2d0c71043d6873a595a89ff946f4b66576df",class:{"tooltip-data-viz":true,"tooltip-data-viz--visible":this.visible},style:{left:`${this.x}px`,top:`${this.y}px`,transform:`translate(${t}, ${o})`}},i("div",{key:"98ec7bd1f1e0d071c067d0ccb3287b06077c8a07",class:"tooltip-data-viz__item ds-control--md"},i("ds-text",{key:"46b508ba46d7b968459cd7a7716f7272d322c77d",class:"tooltip-data-viz__label",as:"span",variant:"text-body-medium",color:"var(--color-translucent-foreground-secondary)"},this.label),i("ds-text",{key:"437c917fc1d28cf900cc9348acef0c54ed890975",class:"tooltip-data-viz__value",as:"span",variant:"text-body-medium",emphasis:true,color:"var(--color-translucent-foreground-primary)"},this.value)))}get el(){return this}static get watchers(){return{x:[{onAnchorChange:0}],y:[{onAnchorChange:0}],delay:[{onDelayChange:0}]}}static get style(){return r()}},[2,"ds-tooltip-data-viz",{value:[8],label:[1],x:[2],y:[2],delay:[8],side:[32],align:[32],visible:[32]},undefined,{x:[{onAnchorChange:0}],y:[{onAnchorChange:0}],delay:[{onDelayChange:0}]}]);function h(){if(typeof customElements==="undefined"){return}const t=["ds-tooltip-data-viz","ds-text"];t.forEach((t=>{switch(t){case"ds-tooltip-data-viz":if(!customElements.get(a(t))){customElements.define(a(t),p)}break;case"ds-text":if(!customElements.get(a(t))){n()}break}}))}h();export{p as T,h as d};
2
- //# sourceMappingURL=p-Bl001G0Y.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["buttonUnfilledCss","ICON_SIZE","lg","md","sm","xs","ButtonUnfilled","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","variant","size","width","label","icon","isActive","activeFill","hasBorder","rounded","dot","isInactive","isLoading","type","ariaLabel","buttonEl","handleClick","event","preventDefault","stopPropagation","dsClick","emit","dsChange","setFocus","focus","showIcon","showLabel","showDot","visuallyActive","expanded","dotRing","accessibleName","undefined","render","bg","background","textVariant","CONTROL_TEXT_VARIANT","iconSize","cls","h","Host","key","class","controlWidthClass","tabIndex","ref","el","disabled","focusTabIndex","controls","String","haspopup","pressed","onPointerDown","beginElevatedControlPress","onClick","color","name","as","emphasis"],"sources":["src/wc/components/ButtonUnfilled/ButtonUnfilled.css?tag=ds-button-unfilled&encapsulation=scoped","src/wc/components/ButtonUnfilled/ButtonUnfilled.tsx"],"sourcesContent":["@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-press.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/control-width.css';\n\n:host {\n display: inline-flex;\n outline: none;\n --ds-button-unfilled-fg: var(--color-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-secondary);\n --ds-button-unfilled-border: var(--color-border-secondary);\n}\n\n/* Icon-only: fixed square from density height (hug). Fill stretches the hit target. */\n:host(.button-unfilled-host--icon.ds-control-width--hug) {\n width: var(--ds-control-height, var(--dimension-size-400));\n height: var(--ds-control-height, var(--dimension-size-400));\n min-width: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.button-unfilled-host--icon.ds-control-width--fill) {\n height: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.ds-control-width--fill) .button-unfilled {\n width: 100%;\n}\n\n.button-unfilled {\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n color: var(--ds-button-unfilled-fg);\n cursor: default;\n -webkit-user-select: none;\n user-select: none;\n overflow: hidden;\n /* Hover/press/selected fill: `.ds-interaction-fill` (+ `--selected` / `--on-*`).\n Active and popup-open foreground changes resolve atomically with the fill. */\n}\n\n.button-unfilled--icon {\n width: 100%;\n height: 100%;\n padding: 0;\n}\n\n.button-unfilled--rounded {\n --ds-control-radius: var(--dimension-radius-half);\n}\n\n.button-unfilled--active {\n color: var(--ds-button-unfilled-fg-active);\n}\n\n/*\n * An open popup is a transient pressed state, not a selected state. Keep the\n * pressed wash visible for the popup's complete rendered lifecycle even when\n * shell chrome opts out of selected fills with `activeFill=false`.\n */\n.button-unfilled.button-unfilled--expanded::after,\n.button-unfilled.button-unfilled--expanded:hover:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* Inset stroke via interaction-fill ::after (above selected / hover washes). */\n.button-unfilled--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-button-unfilled-border);\n}\n\n/* Fallback if interaction-fill is omitted (should be rare — prefer keep the util class). */\n.button-unfilled--bordered:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity). */\n\n/* Foreground / chrome tokens per surface — interaction tokens come from util `--on-*`. */\n.button-unfilled--background-medium {\n --ds-button-unfilled-fg: var(--color-foreground-on-medium-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-medium-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-medium-neutral);\n --ds-button-unfilled-border: var(--color-border-on-medium-background-secondary);\n}\n\n.button-unfilled--background-bold {\n --ds-button-unfilled-fg: var(--color-foreground-on-bold-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-bold-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-bold-neutral);\n --ds-button-unfilled-border: var(--color-border-on-bold-background-secondary);\n}\n\n.button-unfilled--background-strong {\n --ds-button-unfilled-fg: var(--color-foreground-on-strong-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-strong-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-strong-neutral);\n --ds-button-unfilled-border: var(--color-border-on-strong-background-secondary);\n}\n\n.button-unfilled--background-translucent {\n --ds-button-unfilled-fg: var(--color-translucent-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-translucent-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-translucent-translucent);\n --ds-button-unfilled-border: var(--color-translucent-border-secondary);\n}\n\n.button-unfilled--background-inverted {\n --ds-button-unfilled-fg: var(--color-inverted-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-inverted-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-inverted-background);\n --ds-button-unfilled-border: var(--color-inverted-border-secondary);\n}\n\n.button-unfilled--background-media {\n --ds-button-unfilled-fg: var(--color-media-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-media-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-media-background);\n --ds-button-unfilled-border: var(--color-media-border-secondary);\n}\n\n.button-unfilled--on-always-dark {\n --ds-button-unfilled-fg: var(--color-always-dark-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-always-dark-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-always-dark-background);\n --ds-button-unfilled-border: var(--color-always-dark-border-secondary);\n}\n\n/*\n * After surface ring defaults: selected fill remaps the knock-out to the active\n * wash so the badge halo matches the selected background.\n */\n.button-unfilled.ds-interaction-fill--selected {\n --ds-button-unfilled-dot-ring: var(--ds-interaction-active);\n}\n\n.button-unfilled__icon-wrap {\n position: relative;\n z-index: 2;\n}\n\n.button-unfilled__label {\n position: relative;\n z-index: 2;\n white-space: nowrap;\n flex-shrink: 0;\n min-width: 0;\n}\n\n.button-unfilled__label--loading {\n visibility: hidden;\n}\n\n.button-unfilled > .button-unfilled__loader-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.button-unfilled__dot {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n pointer-events: none;\n}\n","import { Component, Element, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';\nimport { controlWidthClass, CONTROL_TEXT_VARIANT, type ControlWidth } from '../../utils';\nimport { beginElevatedControlPress } from '../../utils/control-press';\n\nexport type ButtonUnfilledBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'always-dark';\n\nexport type ButtonUnfilledVariant = 'icon' | 'label' | 'icon-label';\n\nexport type ButtonUnfilledSize = 'lg' | 'md' | 'sm' | 'xs';\n\nexport type ButtonUnfilledWidth = ControlWidth;\nexport type ButtonUnfilledPopup = 'true' | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\n\n/**\n * `ds-icon` size prop matching control-density icon metrics\n * (lg→24 / md→20 / sm→16 / xs→12 via `--dimension-iconography-*`).\n */\nconst ICON_SIZE: Record<ButtonUnfilledSize, 'lg' | 'md' | 'sm' | 'xs'> = {\n lg: 'lg',\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\n@Component({\n tag: 'ds-button-unfilled',\n styleUrl: 'ButtonUnfilled.css',\n scoped: true,\n})\nexport class ButtonUnfilled {\n @Element() el!: HTMLElement;\n\n /**\n * Content layout. Default is label-only; pass `icon` for icon-only chrome\n * (nav / tool rails) or `icon-label` for leading icon + text.\n */\n @Prop() variant: ButtonUnfilledVariant = 'label';\n\n /** Control density (height, padding, icon, type). */\n @Prop() size: ButtonUnfilledSize = 'md';\n\n /** Width fit — hug content (default) or fill the parent. */\n @Prop() width: ButtonUnfilledWidth = 'hug';\n\n /** Visible text for `label` / `icon-label` variants. */\n @Prop() label: string = '';\n\n /** Icon name passed to <ds-icon> for `icon` / `icon-label` variants. */\n @Prop() icon: string = '';\n\n /** Active/selected visual state. Always promotes foreground to primary. */\n @Prop() isActive: boolean = false;\n\n /**\n * When active, render the selected interaction fill.\n * Default `true` for general UI. Shell chrome (nav / tool rails) should pass\n * `false` so selection is foreground-only (primary color, no fill).\n */\n @Prop() activeFill: boolean = true;\n\n /** Show a 1px secondary inset border. Default on; shell chrome can pass `false`. */\n @Prop() hasBorder: boolean = true;\n\n /** Use the half-radius treatment instead of the default control radius. */\n @Prop() rounded: boolean = false;\n\n /** Show a notification dot at the top-right of the icon zone (icon variant only). */\n @Prop() dot: boolean = false;\n\n /** Disables interaction. */\n @Prop() isInactive: boolean = false;\n\n /** Shows an inline loader and prevents interaction without applying inactive opacity. */\n @Prop() isLoading: boolean = false;\n\n /** Native button type. */\n @Prop() type: 'button' | 'submit' | 'reset' = 'button';\n\n /** Actual parent surface context. Omit on primary and secondary surfaces. */\n @Prop() background: ButtonUnfilledBackground | undefined;\n\n /** Accessible name override. Required for icon-only buttons. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n @Prop() controls: string | undefined;\n @Prop() expanded: boolean | undefined;\n @Prop() haspopup: ButtonUnfilledPopup | undefined;\n @Prop() pressed: boolean | undefined;\n\n /**\n * Native `tabindex` for roving keyboard groups in shell chrome.\n * Omit for the default button tab stop (`0`).\n */\n @Prop({ attribute: 'tab-index' }) focusTabIndex?: number;\n\n @Event() dsClick!: EventEmitter<MouseEvent>;\n @Event() dsChange!: EventEmitter<boolean>;\n\n private buttonEl: HTMLButtonElement | null = null;\n\n @Method()\n async setFocus() {\n this.buttonEl?.focus();\n }\n\n private handleClick = (event: MouseEvent) => {\n if (this.isInactive || this.isLoading) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.dsClick.emit(event);\n this.dsChange.emit(!this.isActive);\n };\n\n private get showIcon(): boolean {\n return this.variant === 'icon' || this.variant === 'icon-label';\n }\n\n private get showLabel(): boolean {\n return this.variant === 'label' || this.variant === 'icon-label';\n }\n\n private get showDot(): boolean {\n return this.variant === 'icon' && this.dot && !this.isLoading;\n }\n\n /** An expanded popup trigger is visually active even when selection is controlled separately. */\n private get visuallyActive(): boolean {\n return this.isActive || this.expanded === true;\n }\n\n /** Knock-out ring: selected fill → active wash; otherwise surface token. */\n private get dotRing(): string {\n if (this.isActive && this.activeFill) {\n return 'var(--ds-interaction-active)';\n }\n return 'var(--ds-button-unfilled-dot-ring)';\n }\n\n private get accessibleName(): string | undefined {\n if (this.ariaLabel) return this.ariaLabel;\n if (this.isLoading && this.variant === 'label' && this.label) return this.label;\n return undefined;\n }\n\n render() {\n const bg = this.background;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n\n const cls: Record<string, boolean> = {\n 'button-unfilled': true,\n 'ds-focus-ring-inset': true,\n 'ds-control-press-scale': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': this.isActive && this.activeFill && !this.isInactive,\n 'ds-interaction-fill--on-faint': bg === 'faint',\n 'ds-interaction-fill--on-medium': bg === 'medium',\n 'ds-interaction-fill--on-bold': bg === 'bold',\n 'ds-interaction-fill--on-strong': bg === 'strong',\n 'ds-interaction-fill--on-translucent': bg === 'translucent',\n 'ds-interaction-fill--on-inverted': bg === 'inverted',\n 'ds-interaction-fill--on-media': bg === 'media',\n 'ds-interaction-fill--on-always-dark': bg === 'always-dark',\n 'button-unfilled--active': this.visuallyActive,\n 'button-unfilled--expanded': this.expanded === true && !this.isInactive,\n 'button-unfilled--bordered': this.hasBorder,\n 'button-unfilled--rounded': this.rounded,\n 'ds-control-inactive': this.isInactive,\n 'ds-control--lg': this.size === 'lg',\n 'ds-control--md': this.size === 'md',\n 'ds-control--sm': this.size === 'sm',\n 'ds-control--xs': this.size === 'xs',\n 'ds-control-frame': true,\n 'button-unfilled--icon': this.variant === 'icon',\n 'button-unfilled--label': this.variant === 'label',\n 'button-unfilled--icon-label': this.variant === 'icon-label',\n 'button-unfilled--background-faint': bg === 'faint',\n 'button-unfilled--background-medium': bg === 'medium',\n 'button-unfilled--background-bold': bg === 'bold',\n 'button-unfilled--background-strong': bg === 'strong',\n 'button-unfilled--background-translucent': bg === 'translucent',\n 'button-unfilled--background-inverted': bg === 'inverted',\n 'button-unfilled--background-media': bg === 'media',\n 'button-unfilled--on-always-dark': bg === 'always-dark',\n };\n\n return (\n <Host\n class={{\n 'button-unfilled-host': true,\n 'button-unfilled-host--icon': this.variant === 'icon',\n 'ds-control--lg': this.size === 'lg',\n 'ds-control--md': this.size === 'md',\n 'ds-control--sm': this.size === 'sm',\n 'ds-control--xs': this.size === 'xs',\n ...controlWidthClass(this.width),\n }}\n tabIndex={-1}\n >\n <button\n ref={el => {\n this.buttonEl = el ?? null;\n }}\n type={this.type}\n class={cls}\n disabled={this.isInactive}\n tabIndex={this.focusTabIndex ?? 0}\n aria-label={this.accessibleName}\n aria-busy={this.isLoading ? 'true' : undefined}\n aria-disabled={this.isLoading ? 'true' : undefined}\n aria-controls={this.controls}\n aria-expanded={this.expanded === undefined ? undefined : String(this.expanded)}\n aria-haspopup={this.haspopup}\n aria-pressed={this.pressed === undefined ? undefined : String(this.pressed)}\n onPointerDown={event =>\n beginElevatedControlPress(event, !this.isInactive && !this.isLoading)\n }\n onClick={this.handleClick}\n >\n {this.showIcon && (\n <span class=\"button-unfilled__icon-wrap ds-control-icon-box ds-interaction-fill__content\">\n {this.isLoading\n ? <ds-loader size={iconSize} color=\"inherit\" />\n : <ds-icon name={this.icon} size={iconSize} color=\"inherit\" />\n }\n {this.showDot && (\n <ds-badge\n class=\"button-unfilled__dot\"\n variant=\"dot\"\n background={this.dotRing}\n label=\"\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n )}\n {this.showLabel && (\n <ds-text\n class={{\n 'button-unfilled__label': true,\n 'ds-control-label-box': true,\n 'button-unfilled__label--loading': this.isLoading && this.variant === 'label',\n 'ds-interaction-fill__content': true,\n }}\n as=\"span\"\n variant={textVariant}\n emphasis\n color=\"inherit\"\n >\n {this.label}\n </ds-text>\n )}\n {this.isLoading && this.variant === 'label' && (\n <span class=\"button-unfilled__loader-overlay ds-interaction-fill__content\">\n <ds-loader size={iconSize} color=\"inherit\" />\n </span>\n )}\n </button>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{c as t,a as i,r as s}from"./p-CydY-v7X.js";import{r as n}from"./p-BJMRBHKW.js";import{r as e,T as h}from"./p-Dg3xLna0.js";function r(t,i){return i.length>0?i:[{options:t}]}function o(t){return t.flatMap((t=>t.options))}function a(t){return t.length>0&&t.every((t=>Boolean(t.icon)))}function u(t){return t.some((t=>Boolean(t.subtext?.trim())))}function l(t,i){const s=i.trim().toLocaleLowerCase();if(!s)return t;return t.map((t=>{const i=t.header?.toLocaleLowerCase().includes(s);return{...t,options:i?t.options:t.options.filter((t=>`${t.label} ${t.subtext??""}`.toLocaleLowerCase().includes(s)))}})).filter((t=>t.options.length>0))}function c(t){return t.map(((t,i)=>({option:t,index:i}))).filter((({option:t})=>!t.isInactive)).map((({index:t})=>t))}function f(t,i,s){const n=c(t);if(!n.length)return-1;const e=n.indexOf(i);const h=e>=0?e:s===1?-1:0;return n[(h+s+n.length)%n.length]}function d(t,i,s){const n=i.toLocaleLowerCase();if(!n)return-1;for(let i=1;i<=t.length;i+=1){const e=(Math.max(s,-1)+i)%t.length;const h=t[e];if(!h.isInactive&&h.label.toLocaleLowerCase().startsWith(n))return e}return-1}function p(t){return{"ds-interaction-fill--on-faint":t==="faint","ds-interaction-fill--on-medium":t==="medium","ds-interaction-fill--on-bold":t==="bold","ds-interaction-fill--on-strong":t==="strong","ds-interaction-fill--on-translucent":t==="translucent","ds-interaction-fill--on-inverted":t==="inverted","ds-interaction-fill--on-media":t==="media","ds-interaction-fill--on-always-dark":t==="always-dark"}}const m=8;class w{constructor(t){this.state=t;this.triggerEl=null;this.popupEl=null;this.searchEl=null;this.typeahead="";this.typeaheadTimer=null;this.outsideHandler=null;this.repositionHandler=null;this.positionRetryRaf=null;this.setTriggerElement=t=>{this.triggerEl=t};this.setPopupElement=t=>{this.popupEl=t};this.setSearchElement=t=>{this.searchEl=t};this.handleTriggerKeyDown=t=>{if(!this.state.open){if(["ArrowDown","ArrowUp","Enter"," "].includes(t.key)){t.preventDefault();this.openPopup(true,t.key==="ArrowUp"?"last":"first")}else if(this.isTypeaheadKey(t)){t.preventDefault();this.openPopup(true);if(this.state.searchable)this.state.searchTerm=t.key;else this.handleTypeahead(t.key)}return}this.handleListKeyDown(t)};this.handleListKeyDown=t=>{switch(t.key){case"ArrowDown":t.preventDefault();this.state.focusRingVisible=true;this.state.activeIndex=f(this.state.options,this.state.activeIndex,1);break;case"ArrowUp":t.preventDefault();this.state.focusRingVisible=true;this.state.activeIndex=f(this.state.options,this.state.activeIndex,-1);break;case"Home":t.preventDefault();this.state.focusRingVisible=true;this.state.activeIndex=c(this.state.options)[0]??-1;break;case"End":{t.preventDefault();this.state.focusRingVisible=true;const i=c(this.state.options);this.state.activeIndex=i[i.length-1]??-1;break}case"Enter":case" ":{if(t.key===" "&&this.state.searchable&&t.target===this.searchEl)break;t.preventDefault();const i=this.state.options[this.state.activeIndex];if(i)this.state.selectOption(i);break}case"Escape":t.preventDefault();this.closePopup(true);break;case"Tab":this.closePopup();break;default:if(!this.state.searchable&&this.isTypeaheadKey(t)){this.handleTypeahead(t.key)}}}}get activeOptionId(){return!this.state.isLoading&&this.state.activeIndex>=0?`${this.state.generatedId}-option-${this.state.activeIndex}`:undefined}connect(){if(this.state.open)this.openChanged(true)}disconnect(){this.cancelPositionRetry();this.unbindPopupListeners();if(this.typeaheadTimer)clearTimeout(this.typeaheadTimer)}setFocus(){this.triggerEl?.focus()}optionsChanged(){if(!this.state.open)return;const t=c(this.state.options);if(!t.includes(this.state.activeIndex))this.state.activeIndex=t[0]??-1;requestAnimationFrame((()=>this.updatePosition()))}loadingChanged(){if(this.state.open)requestAnimationFrame((()=>this.updatePosition()))}openChanged(t){if(t){this.bindPopupListeners();this.schedulePositionUpdate((()=>{this.scrollActiveOptionIntoView();if(this.state.searchable)this.searchEl?.focus()}));return}this.cancelPositionRetry();this.unbindPopupListeners();this.state.searchTerm="";this.state.positionReady=false}searchChanged(){this.state.activeIndex=c(this.state.options)[0]??-1;requestAnimationFrame((()=>{this.updatePosition();this.scrollActiveOptionIntoView()}))}activeIndexChanged(){requestAnimationFrame((()=>this.scrollActiveOptionIntoView()))}openPopup(t,i){if(this.state.isDisabled||!this.state.options.length&&!this.state.isLoading)return;const s=c(this.state.options);this.state.activeIndex=i==="last"?s[s.length-1]??-1:this.state.preferredIndex>=0?this.state.preferredIndex:s[0]??-1;this.state.focusRingVisible=t;this.state.open=true}closePopup(t=false){if(!this.state.open)return;this.state.open=false;if(t)requestAnimationFrame((()=>this.triggerEl?.focus()))}focusSearchOrTrigger(){requestAnimationFrame((()=>this.state.searchable?this.searchEl?.focus():this.triggerEl?.focus()))}isTypeaheadKey(t){return t.key.length===1&&!t.metaKey&&!t.ctrlKey&&!t.altKey}handleTypeahead(t){if(this.typeaheadTimer)clearTimeout(this.typeaheadTimer);this.state.focusRingVisible=true;const i=t.toLocaleLowerCase();const s=this.typeahead.length>0&&[...this.typeahead].every((t=>t===i));this.typeahead=s?i:`${this.typeahead}${i}`;const n=d(this.state.options,this.typeahead,this.state.activeIndex);if(n>=0)this.state.activeIndex=n;const r=e(h.animationDurationMedium1,h.animationDurationMedium1);this.typeaheadTimer=setTimeout((()=>{this.typeahead="";this.typeaheadTimer=null}),r)}scrollActiveOptionIntoView(){if(!this.state.open||!this.activeOptionId)return;this.state.host.querySelector(`#${this.activeOptionId}`)?.scrollIntoView({block:"nearest",inline:"nearest"})}bindPopupListeners(){this.unbindPopupListeners();this.outsideHandler=t=>{if(this.state.host.contains(t.target))return;this.closePopup()};this.repositionHandler=()=>{this.updatePosition()};document.addEventListener("mousedown",this.outsideHandler,true);window.addEventListener("scroll",this.repositionHandler,true);window.addEventListener("resize",this.repositionHandler)}unbindPopupListeners(){if(this.outsideHandler){document.removeEventListener("mousedown",this.outsideHandler,true);this.outsideHandler=null}if(this.repositionHandler){window.removeEventListener("scroll",this.repositionHandler,true);window.removeEventListener("resize",this.repositionHandler);this.repositionHandler=null}}cancelPositionRetry(){if(this.positionRetryRaf===null)return;cancelAnimationFrame(this.positionRetryRaf);this.positionRetryRaf=null}schedulePositionUpdate(t){if(!this.state.open)return;this.cancelPositionRetry();this.state.positionReady=false;let i=m;const s=()=>{this.positionRetryRaf=null;if(!this.state.open)return;if(this.updatePosition()){t?.();return}if(i>0){i-=1;this.positionRetryRaf=requestAnimationFrame(s)}};this.positionRetryRaf=requestAnimationFrame(s)}updatePosition(){if(!this.state.open||!this.triggerEl||!this.popupEl||!this.popupEl.isConnected||!this.state.host.contains(this.popupEl))return false;const e=n(h.space050,h.space050);this.popupEl.style.minWidth=`${t(this.triggerEl.offsetWidth,e)}px`;this.state.position=i({anchorRect:this.triggerEl.getBoundingClientRect(),popupWidth:this.popupEl.offsetWidth,popupHeight:this.popupEl.offsetHeight,side:"bottom",align:"start",sideOffsetPx:e,alignOffsetPx:s({align:"start",alignOffsetPx:0,sectionInsetPx:e}),viewportPadPx:e,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight});this.state.positionReady=true;return true}}export{w as S,l as a,u as b,a as c,p as d,c as e,o as f,r};
2
- //# sourceMappingURL=p-Bv9frkvW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["resolveChoiceSections","options","sections","length","flattenChoiceSections","flatMap","section","choiceListUsesIcons","every","option","Boolean","icon","choiceListUsesSubtext","some","subtext","trim","filterChoiceSections","searchTerm","normalized","toLocaleLowerCase","map","sectionMatches","header","includes","filter","label","enabledChoiceIndexes","index","isInactive","moveChoiceIndex","currentIndex","direction","enabled","currentEnabledIndex","indexOf","start","findChoiceTypeaheadMatch","query","offset","Math","max","startsWith","choiceBackgroundClassMap","background","POSITION_RETRY_BUDGET","SelectController","constructor","state","this","triggerEl","popupEl","searchEl","typeahead","typeaheadTimer","outsideHandler","repositionHandler","positionRetryRaf","setTriggerElement","element","setPopupElement","setSearchElement","handleTriggerKeyDown","event","open","key","preventDefault","openPopup","isTypeaheadKey","searchable","handleTypeahead","handleListKeyDown","focusRingVisible","activeIndex","target","selectOption","closePopup","activeOptionId","isLoading","generatedId","undefined","connect","openChanged","disconnect","cancelPositionRetry","unbindPopupListeners","clearTimeout","setFocus","focus","optionsChanged","requestAnimationFrame","updatePosition","loadingChanged","bindPopupListeners","schedulePositionUpdate","scrollActiveOptionIntoView","positionReady","searchChanged","activeIndexChanged","focusVisible","edge","isDisabled","preferredIndex","restoreFocus","focusSearchOrTrigger","metaKey","ctrlKey","altKey","repeatedCharacter","character","match","resetMs","resolveCssTimeMs","TOKEN_DEFAULTS","animationDurationMedium1","setTimeout","host","querySelector","scrollIntoView","block","inline","contains","document","addEventListener","window","removeEventListener","cancelAnimationFrame","onReady","remaining","attempt","isConnected","sectionPadding","resolveCssLengthPx","space050","style","minWidth","choicePopupMinWidth","offsetWidth","position","computeAnchoredPopupPosition","anchorRect","getBoundingClientRect","popupWidth","popupHeight","offsetHeight","side","align","sideOffsetPx","alignOffsetPx","resolveChoicePopupAlignOffset","sectionInsetPx","viewportPadPx","viewportWidth","innerWidth","viewportHeight","innerHeight"],"sources":["src/wc/utils/choice-list.ts","src/wc/utils/select-controller.ts"],"sourcesContent":["export interface ChoiceOption {\n label: string;\n value: string;\n subtext?: string;\n /** Rendered only when every option in the complete list supplies an icon. */\n icon?: string;\n isInactive?: boolean;\n}\n\nexport interface ChoiceSection {\n header?: string;\n options: ChoiceOption[];\n divider?: boolean;\n}\n\nexport type ChoiceBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'always-dark';\n\nexport function resolveChoiceSections(\n options: ChoiceOption[],\n sections: ChoiceSection[],\n): ChoiceSection[] {\n return sections.length > 0 ? sections : [{ options }];\n}\n\nexport function flattenChoiceSections(sections: ChoiceSection[]): ChoiceOption[] {\n return sections.flatMap(section => section.options);\n}\n\n/** A choice list has one stable row layout: every option has an icon, or none do. */\nexport function choiceListUsesIcons(options: ChoiceOption[]): boolean {\n return options.length > 0 && options.every(option => Boolean(option.icon));\n}\n\n/** Once one option needs supporting text, every row keeps the same two-line structure. */\nexport function choiceListUsesSubtext(options: ChoiceOption[]): boolean {\n return options.some(option => Boolean(option.subtext?.trim()));\n}\n\nexport function filterChoiceSections(\n sections: ChoiceSection[],\n searchTerm: string,\n): ChoiceSection[] {\n const normalized = searchTerm.trim().toLocaleLowerCase();\n if (!normalized) return sections;\n\n return sections\n .map(section => {\n const sectionMatches = section.header?.toLocaleLowerCase().includes(normalized);\n return {\n ...section,\n options: sectionMatches\n ? section.options\n : section.options.filter(option =>\n `${option.label} ${option.subtext ?? ''}`.toLocaleLowerCase().includes(normalized),\n ),\n };\n })\n .filter(section => section.options.length > 0);\n}\n\nexport function enabledChoiceIndexes(options: ChoiceOption[]): number[] {\n return options\n .map((option, index) => ({ option, index }))\n .filter(({ option }) => !option.isInactive)\n .map(({ index }) => index);\n}\n\nexport function moveChoiceIndex(\n options: ChoiceOption[],\n currentIndex: number,\n direction: 1 | -1,\n): number {\n const enabled = enabledChoiceIndexes(options);\n if (!enabled.length) return -1;\n\n const currentEnabledIndex = enabled.indexOf(currentIndex);\n const start = currentEnabledIndex >= 0 ? currentEnabledIndex : direction === 1 ? -1 : 0;\n return enabled[(start + direction + enabled.length) % enabled.length];\n}\n\nexport function findChoiceTypeaheadMatch(\n options: ChoiceOption[],\n query: string,\n currentIndex: number,\n): number {\n const normalized = query.toLocaleLowerCase();\n if (!normalized) return -1;\n\n for (let offset = 1; offset <= options.length; offset += 1) {\n const index = (Math.max(currentIndex, -1) + offset) % options.length;\n const option = options[index];\n if (!option.isInactive && option.label.toLocaleLowerCase().startsWith(normalized)) return index;\n }\n return -1;\n}\n\nexport function choiceBackgroundClassMap(\n background: ChoiceBackground | undefined,\n): Record<string, boolean> {\n return {\n 'ds-interaction-fill--on-faint': background === 'faint',\n 'ds-interaction-fill--on-medium': background === 'medium',\n 'ds-interaction-fill--on-bold': background === 'bold',\n 'ds-interaction-fill--on-strong': background === 'strong',\n 'ds-interaction-fill--on-translucent': background === 'translucent',\n 'ds-interaction-fill--on-inverted': background === 'inverted',\n 'ds-interaction-fill--on-media': background === 'media',\n 'ds-interaction-fill--on-always-dark': background === 'always-dark',\n };\n}\n","import { computeAnchoredPopupPosition } from './anchored-popup';\nimport {\n enabledChoiceIndexes,\n findChoiceTypeaheadMatch,\n moveChoiceIndex,\n type ChoiceOption,\n} from './choice-list';\nimport {\n choicePopupMinWidth,\n resolveChoicePopupAlignOffset,\n} from './choice-popup-alignment';\nimport { resolveCssLengthPx } from './resolve-css-length-px';\nimport { resolveCssTimeMs } from './resolve-css-time-ms';\nimport { TOKEN_DEFAULTS } from './token-defaults';\n\ntype PopupPosition = { x: number; y: number };\n\nexport interface SelectControllerState<T extends ChoiceOption> {\n readonly host: HTMLElement;\n readonly generatedId: string;\n readonly options: T[];\n readonly searchable: boolean;\n readonly isLoading: boolean;\n readonly isDisabled: boolean;\n readonly preferredIndex: number;\n open: boolean;\n activeIndex: number;\n searchTerm: string;\n focusRingVisible: boolean;\n position: PopupPosition;\n positionReady: boolean;\n selectOption(option: T): void;\n}\n\nconst POSITION_RETRY_BUDGET = 8;\n\n/**\n * Shared Select/SelectMulti interaction controller.\n *\n * Decorated Stencil state and scalar/array selection remain in each component;\n * this controller owns only popup lifecycle, focus, positioning, typeahead,\n * and listbox keyboard traversal.\n */\nexport class SelectController<T extends ChoiceOption> {\n private triggerEl: HTMLButtonElement | null = null;\n private popupEl: HTMLDivElement | null = null;\n private searchEl: HTMLInputElement | null = null;\n private typeahead = '';\n private typeaheadTimer: ReturnType<typeof setTimeout> | null = null;\n private outsideHandler: ((event: MouseEvent) => void) | null = null;\n private repositionHandler: (() => void) | null = null;\n private positionRetryRaf: number | null = null;\n\n constructor(private readonly state: SelectControllerState<T>) {}\n\n get activeOptionId(): string | undefined {\n return !this.state.isLoading && this.state.activeIndex >= 0\n ? `${this.state.generatedId}-option-${this.state.activeIndex}`\n : undefined;\n }\n\n setTriggerElement = (element: HTMLButtonElement | null) => {\n this.triggerEl = element;\n };\n\n setPopupElement = (element: HTMLDivElement | null) => {\n this.popupEl = element;\n };\n\n setSearchElement = (element: HTMLInputElement | null) => {\n this.searchEl = element;\n };\n\n connect() {\n if (this.state.open) this.openChanged(true);\n }\n\n disconnect() {\n this.cancelPositionRetry();\n this.unbindPopupListeners();\n if (this.typeaheadTimer) clearTimeout(this.typeaheadTimer);\n }\n\n setFocus() {\n this.triggerEl?.focus();\n }\n\n optionsChanged() {\n if (!this.state.open) return;\n const enabled = enabledChoiceIndexes(this.state.options);\n if (!enabled.includes(this.state.activeIndex)) this.state.activeIndex = enabled[0] ?? -1;\n requestAnimationFrame(() => this.updatePosition());\n }\n\n loadingChanged() {\n if (this.state.open) requestAnimationFrame(() => this.updatePosition());\n }\n\n openChanged(open: boolean) {\n if (open) {\n this.bindPopupListeners();\n this.schedulePositionUpdate(() => {\n this.scrollActiveOptionIntoView();\n if (this.state.searchable) this.searchEl?.focus();\n });\n return;\n }\n this.cancelPositionRetry();\n this.unbindPopupListeners();\n this.state.searchTerm = '';\n this.state.positionReady = false;\n }\n\n searchChanged() {\n this.state.activeIndex = enabledChoiceIndexes(this.state.options)[0] ?? -1;\n requestAnimationFrame(() => {\n this.updatePosition();\n this.scrollActiveOptionIntoView();\n });\n }\n\n activeIndexChanged() {\n requestAnimationFrame(() => this.scrollActiveOptionIntoView());\n }\n\n openPopup(focusVisible: boolean, edge?: 'first' | 'last') {\n if (this.state.isDisabled || (!this.state.options.length && !this.state.isLoading)) return;\n const enabled = enabledChoiceIndexes(this.state.options);\n this.state.activeIndex =\n edge === 'last'\n ? (enabled[enabled.length - 1] ?? -1)\n : this.state.preferredIndex >= 0\n ? this.state.preferredIndex\n : (enabled[0] ?? -1);\n this.state.focusRingVisible = focusVisible;\n this.state.open = true;\n }\n\n closePopup(restoreFocus = false) {\n if (!this.state.open) return;\n this.state.open = false;\n if (restoreFocus) requestAnimationFrame(() => this.triggerEl?.focus());\n }\n\n focusSearchOrTrigger() {\n requestAnimationFrame(() =>\n this.state.searchable ? this.searchEl?.focus() : this.triggerEl?.focus()\n );\n }\n\n handleTriggerKeyDown = (event: KeyboardEvent) => {\n if (!this.state.open) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openPopup(true, event.key === 'ArrowUp' ? 'last' : 'first');\n } else if (this.isTypeaheadKey(event)) {\n event.preventDefault();\n this.openPopup(true);\n if (this.state.searchable) this.state.searchTerm = event.key;\n else this.handleTypeahead(event.key);\n }\n return;\n }\n this.handleListKeyDown(event);\n };\n\n handleListKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = moveChoiceIndex(\n this.state.options,\n this.state.activeIndex,\n 1,\n );\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = moveChoiceIndex(\n this.state.options,\n this.state.activeIndex,\n -1,\n );\n break;\n case 'Home':\n event.preventDefault();\n this.state.focusRingVisible = true;\n this.state.activeIndex = enabledChoiceIndexes(this.state.options)[0] ?? -1;\n break;\n case 'End': {\n event.preventDefault();\n this.state.focusRingVisible = true;\n const enabled = enabledChoiceIndexes(this.state.options);\n this.state.activeIndex = enabled[enabled.length - 1] ?? -1;\n break;\n }\n case 'Enter':\n case ' ': {\n if (event.key === ' ' && this.state.searchable && event.target === this.searchEl) break;\n event.preventDefault();\n const option = this.state.options[this.state.activeIndex];\n if (option) this.state.selectOption(option);\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.closePopup(true);\n break;\n case 'Tab':\n this.closePopup();\n break;\n default:\n if (!this.state.searchable && this.isTypeaheadKey(event)) {\n this.handleTypeahead(event.key);\n }\n }\n };\n\n private isTypeaheadKey(event: KeyboardEvent) {\n return event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey;\n }\n\n private handleTypeahead(key: string) {\n if (this.typeaheadTimer) clearTimeout(this.typeaheadTimer);\n this.state.focusRingVisible = true;\n const normalized = key.toLocaleLowerCase();\n const repeatedCharacter =\n this.typeahead.length > 0 &&\n [...this.typeahead].every(character => character === normalized);\n this.typeahead = repeatedCharacter ? normalized : `${this.typeahead}${normalized}`;\n const match = findChoiceTypeaheadMatch(\n this.state.options,\n this.typeahead,\n this.state.activeIndex,\n );\n if (match >= 0) this.state.activeIndex = match;\n const resetMs = resolveCssTimeMs(\n TOKEN_DEFAULTS.animationDurationMedium1,\n TOKEN_DEFAULTS.animationDurationMedium1,\n );\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = '';\n this.typeaheadTimer = null;\n }, resetMs);\n }\n\n private scrollActiveOptionIntoView() {\n if (!this.state.open || !this.activeOptionId) return;\n this.state.host\n .querySelector<HTMLElement>(`#${this.activeOptionId}`)\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n private bindPopupListeners() {\n this.unbindPopupListeners();\n this.outsideHandler = event => {\n if (this.state.host.contains(event.target as Node)) return;\n this.closePopup();\n };\n this.repositionHandler = () => {\n this.updatePosition();\n };\n document.addEventListener('mousedown', this.outsideHandler, true);\n window.addEventListener('scroll', this.repositionHandler, true);\n window.addEventListener('resize', this.repositionHandler);\n }\n\n private unbindPopupListeners() {\n if (this.outsideHandler) {\n document.removeEventListener('mousedown', this.outsideHandler, true);\n this.outsideHandler = null;\n }\n if (this.repositionHandler) {\n window.removeEventListener('scroll', this.repositionHandler, true);\n window.removeEventListener('resize', this.repositionHandler);\n this.repositionHandler = null;\n }\n }\n\n private cancelPositionRetry() {\n if (this.positionRetryRaf === null) return;\n cancelAnimationFrame(this.positionRetryRaf);\n this.positionRetryRaf = null;\n }\n\n private schedulePositionUpdate(onReady?: () => void) {\n if (!this.state.open) return;\n this.cancelPositionRetry();\n this.state.positionReady = false;\n let remaining = POSITION_RETRY_BUDGET;\n const attempt = () => {\n this.positionRetryRaf = null;\n if (!this.state.open) return;\n if (this.updatePosition()) {\n onReady?.();\n return;\n }\n if (remaining > 0) {\n remaining -= 1;\n this.positionRetryRaf = requestAnimationFrame(attempt);\n }\n };\n this.positionRetryRaf = requestAnimationFrame(attempt);\n }\n\n private updatePosition(): boolean {\n if (\n !this.state.open ||\n !this.triggerEl ||\n !this.popupEl ||\n !this.popupEl.isConnected ||\n !this.state.host.contains(this.popupEl)\n ) return false;\n const sectionPadding = resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n this.popupEl.style.minWidth = `${choicePopupMinWidth(\n this.triggerEl.offsetWidth,\n sectionPadding,\n )}px`;\n this.state.position = computeAnchoredPopupPosition({\n anchorRect: this.triggerEl.getBoundingClientRect(),\n popupWidth: this.popupEl.offsetWidth,\n popupHeight: this.popupEl.offsetHeight,\n side: 'bottom',\n align: 'start',\n sideOffsetPx: sectionPadding,\n alignOffsetPx: resolveChoicePopupAlignOffset({\n align: 'start',\n alignOffsetPx: 0,\n sectionInsetPx: sectionPadding,\n }),\n viewportPadPx: sectionPadding,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n this.state.positionReady = true;\n return true;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as t,H as i,h as s,a as o,t as n}from"./index.js";import{c as e}from"./p-B8C_yfLQ.js";import{d as r}from"./p-k0Hmj1KV.js";import{a as d,T as l,r as a,b as c}from"./p-Dg3xLna0.js";import{r as h}from"./p-BJMRBHKW.js";import{C as p}from"./p-CuwopElg.js";const u=new Set(["⌘","⇧","⌥","⌃"]);const m={alt:"⌥",cmd:"⌘",command:"⌘",control:"⌃",ctrl:"⌃",option:"⌥",shift:"⇧"};function f(t){return m[t.toLowerCase()]??t}function g(t){const i=t.trim();if(!i)return[];if(i.includes("+")){return i.split("+").map((t=>t.trim())).filter(Boolean).map(f)}if(/\s/.test(i)){return i.split(/\s+/).filter(Boolean).map(f)}const s=Array.from(i);const o=[];while(s.length>1&&u.has(s[0])){o.push(s.shift())}o.push(s.join(""));return o}const v=()=>`.ds-control--lg.sc-ds-tooltip,.ds-control--lg.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip,.ds-control--sm.sc-ds-tooltip-h,.ds-control--sm.sc-ds-tooltip,.ds-control--xs.sc-ds-tooltip-h,.ds-control--xs.sc-ds-tooltip{--ds-control-radius:var(--dimension-radius-025)}.ds-control--lg.sc-ds-tooltip-h,.ds-control--lg.sc-ds-tooltip{--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-tooltip-h,.ds-control--md.sc-ds-tooltip{--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-tooltip-h,.ds-control--sm.sc-ds-tooltip{--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-tooltip-h,.ds-control--xs.sc-ds-tooltip{--ds-control-height:var(--dimension-size-200);--ds-control-icon:var(--dimension-iconography-xs);--ds-control-padding-inline:var(--dimension-space-025);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:0}.ds-control--lg.sc-ds-tooltip,.ds-control--lg.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip-h,.ds-control--md.sc-ds-tooltip,.ds-control--sm.sc-ds-tooltip-h,.ds-control--sm.sc-ds-tooltip,.ds-control--xs.sc-ds-tooltip-h,.ds-control--xs.sc-ds-tooltip{--ds-control-radius:var(--dimension-radius-025)}.ds-control--lg.sc-ds-tooltip-h,.ds-control--lg.sc-ds-tooltip{--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-tooltip-h,.ds-control--md.sc-ds-tooltip{--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-tooltip-h,.ds-control--sm.sc-ds-tooltip{--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-tooltip-h,.ds-control--xs.sc-ds-tooltip{--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}.key-hint-group.sc-ds-tooltip{display:inline-flex;align-items:center;gap:var(--dimension-stroke-width-012);width:max-content;flex-shrink:0}.key-hint.sc-ds-tooltip{box-sizing:border-box;min-width:var(--ds-control-icon, var(--dimension-iconography-md));width:var(--ds-control-icon, var(--dimension-iconography-md));height:var(--ds-control-icon, var(--dimension-iconography-md));padding-inline:0;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;background-color:var(--color-background-secondary);border:var(--dimension-stroke-width-015) solid var(--color-border-tertiary);border-bottom-width:var(--dimension-stroke-width-025);border-radius:var(--dimension-radius-025);color:var(--color-foreground-secondary)}.key-hint--wide.sc-ds-tooltip{width:calc(var(--ds-control-icon, var(--dimension-iconography-md)) * 1.5)}.key-hint__label.sc-ds-tooltip{display:inline-flex;width:max-content;min-width:max-content;font-family:var(--typography-font-family);font-size:var(--typography-fontsize-xs);line-height:1;font-weight:var(--typography-weight-regular);letter-spacing:0;text-transform:uppercase;color:inherit}.ds-control--xs.sc-ds-tooltip .key-hint__label.sc-ds-tooltip{font-size:calc(var(--typography-fontsize-xs) * 0.78)}.tooltip-popup.sc-ds-tooltip{box-sizing:border-box;background-color:var(--color-background-primary);border-radius:var(--ds-control-radius, var(--dimension-radius-025));box-shadow:var(--effect-elevation-elevated-floating);white-space:nowrap;pointer-events:none;animation:tooltipFadeIn var(--effect-motion-short-2) forwards;will-change:transform;backface-visibility:hidden}.tooltip-popup--instant.sc-ds-tooltip{animation:none;opacity:1}.tooltip-popup--closing.sc-ds-tooltip{animation:tooltipFadeOut var(--effect-motion-short-3) forwards}.tooltip-inner.sc-ds-tooltip{box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));display:flex;align-items:center;gap:var(--ds-control-gap, var(--dimension-space-050));padding:0 var(--ds-control-padding-inline, var(--dimension-space-075))}.tooltip-inner.sc-ds-tooltip>ds-text.sc-ds-tooltip{flex-shrink:0;min-width:max-content;max-width:none;padding:0 var(--ds-control-label-inset, var(--dimension-space-025));color:var(--color-foreground-primary)}@keyframes tooltipFadeIn{from{opacity:0}to{opacity:1}}@keyframes tooltipFadeOut{from{opacity:1}to{opacity:0}}@media (prefers-reduced-motion: reduce){.tooltip-popup.sc-ds-tooltip,.tooltip-popup--instant.sc-ds-tooltip{animation:none;opacity:1}.tooltip-popup--closing.sc-ds-tooltip{animation:none;opacity:0}}`;const y={md:l.size400,sm:l.size300,xs:l.size200};let b=0;let x=0;let w=null;function C(t){const i=document.createElement("ds-text");i.as="span";i.variant=t.variant;i.emphasis=t.emphasis??false;i.color=t.color??"inherit";if(t.wrap)i.wrap=t.wrap;i.textContent=t.text;return i}function k(t){t.style.flexShrink="0";t.style.minWidth="max-content";t.style.maxWidth="none";t.style.padding="0 var(--ds-control-label-inset, var(--dimension-space-025))";t.style.color="var(--color-foreground-primary)"}const O=t(class t extends i{constructor(t){super();if(t!==false){this.__registerHost()}this.size="md";this.side="top";this.align="center";this.sideOffset=d.space050;this.alignOffset=0;this.delay=l.animationDelayMedium3;this.shortcutKeyPosition="end";this.tooltipId=`ds-tooltip-${++x}`;this.delayTimer=null;this.closeTimer=null;this.anchor=null;this.popupEl=null;this.positionObserver=null;this.anchorObserver=null;this.positionFrame=null;this.skipEnterAnimation=false;this.isOpen=false;this.lastInteractionWasKeyboard=false;this.pointerEnterHandler=t=>{if(t.pointerType==="touch")return;this.show()};this.pointerLeaveHandler=t=>{if(t.pointerType==="touch")return;this.hide()};this.pointerDownHandler=t=>{this.lastInteractionWasKeyboard=false;if(t.pointerType==="touch"&&(this.isOpen||this.popupEl))this.hideInstant()};this.keyDownHandler=()=>{this.lastInteractionWasKeyboard=true};this.focusHandler=()=>{if(this.lastInteractionWasKeyboard||this.anchor?.matches(":focus-visible"))this.show()};this.blurHandler=t=>{const i=t.relatedTarget;if(i&&this.anchor?.contains(i))return;this.hide()};this.scrollResizeHandler=()=>{if(this.positionFrame!==null)return;this.positionFrame=requestAnimationFrame((()=>{this.positionFrame=null;this.calculatePosition()}))};this.escapeHandler=t=>{if(t.key!=="Escape"||!this.isOpen)return;t.preventDefault();this.hide()};this.handleSlotChange=()=>{const t=this.el.querySelector("slot");const i=t?.assignedElements?.()[0]??this.el.firstElementChild;if(i===this.anchor)return;if(this.isOpen||this.popupEl)this.hideInstant();this.unbindAnchor();this.bindAnchor()}}componentDidLoad(){this.bindAnchor();this.anchorObserver=new MutationObserver((()=>this.handleSlotChange()));this.anchorObserver.observe(this.el,{childList:true})}disconnectedCallback(){if(w===this)w=null;this.anchorObserver?.disconnect();this.anchorObserver=null;this.unbindAnchor();this.clearTimers();this.destroyPopup()}onContentOrPositionChange(){if(!this.label?.trim()){if(this.isOpen||this.popupEl)this.hideInstant();return}if(!this.popupEl||!this.isOpen)return;this.renderPopupContent();this.schedulePosition()}get viewportPadPx(){return h(l.space050,l.space050)}get sideOffsetPx(){return h(this.sideOffset,l.space050)}get alignOffsetPx(){return h(this.alignOffset,0)}get hoverDelayMs(){return a(this.delay,l.animationDelayMedium3)}get instantReopenMs(){return a(l.animationDurationMedium1,l.animationDurationMedium1)}get fadeOutMs(){return c(l.motionShort3,l.animationDurationShort3)}get tooltipFallbackWidthPx(){return h(l.tooltipFallbackWidth,l.tooltipFallbackWidth)}get tooltipFallbackHeightPx(){const t=y[this.size];return h(t,t)}bindAnchor(){const t=this.el.querySelector("slot");const i=t?.assignedElements?.()??[];const s=i[0]??this.el.firstElementChild;if(!s||s===this.anchor)return;this.anchor=s;s.addEventListener("pointerenter",this.pointerEnterHandler);s.addEventListener("pointerleave",this.pointerLeaveHandler);s.addEventListener("pointerdown",this.pointerDownHandler);s.addEventListener("keydown",this.keyDownHandler);s.addEventListener("focusin",this.focusHandler);s.addEventListener("focusout",this.blurHandler)}unbindAnchor(){if(!this.anchor)return;this.unlinkDescribedBy();this.anchor.removeEventListener("pointerenter",this.pointerEnterHandler);this.anchor.removeEventListener("pointerleave",this.pointerLeaveHandler);this.anchor.removeEventListener("pointerdown",this.pointerDownHandler);this.anchor.removeEventListener("keydown",this.keyDownHandler);this.anchor.removeEventListener("focusin",this.focusHandler);this.anchor.removeEventListener("focusout",this.blurHandler);this.anchor=null}linkDescribedBy(){if(!this.anchor||!this.popupEl)return;const t=new Set((this.anchor.getAttribute("aria-describedby")??"").split(/\s+/).filter(Boolean));t.add(this.tooltipId);this.anchor.setAttribute("aria-describedby",Array.from(t).join(" "))}unlinkDescribedBy(){if(!this.anchor)return;const t=(this.anchor.getAttribute("aria-describedby")??"").split(/\s+/).filter((t=>t&&t!==this.tooltipId));if(t.length)this.anchor.setAttribute("aria-describedby",t.join(" "));else this.anchor.removeAttribute("aria-describedby")}clearTimers(){if(this.delayTimer){clearTimeout(this.delayTimer);this.delayTimer=null}if(this.closeTimer){clearTimeout(this.closeTimer);this.closeTimer=null}}setupOpenListeners(){window.addEventListener("scroll",this.scrollResizeHandler,true);window.addEventListener("resize",this.scrollResizeHandler);document.addEventListener("keydown",this.escapeHandler)}teardownOpenListeners(){window.removeEventListener("scroll",this.scrollResizeHandler,true);window.removeEventListener("resize",this.scrollResizeHandler);document.removeEventListener("keydown",this.escapeHandler);if(this.positionFrame!==null){cancelAnimationFrame(this.positionFrame);this.positionFrame=null}}destroyPopup(){this.teardownOpenListeners();this.positionObserver?.disconnect();this.positionObserver=null;this.unlinkDescribedBy();if(!this.popupEl)return;this.popupEl.remove();this.popupEl=null}schedulePosition(){if(!this.popupEl)return;const t=()=>{const t=this.popupEl?.querySelector(":scope > .tooltip-inner > ds-text");if(t instanceof i)k(t)};requestAnimationFrame((()=>{t();this.calculatePosition();requestAnimationFrame((()=>{t();this.calculatePosition()}))}));this.positionObserver?.disconnect();this.positionObserver=new ResizeObserver((()=>this.calculatePosition()));this.positionObserver.observe(this.popupEl);if(this.anchor)this.positionObserver.observe(this.anchor)}hideInstant(){this.clearTimers();b=Date.now();if(w===this)w=null;this.destroyPopup();this.isOpen=false;this.skipEnterAnimation=false}show(){if(!this.label?.trim())return;this.clearTimers();let t=Date.now()-b<this.instantReopenMs;if(w&&w!==this){w.hideInstant();t=true}w=this;this.skipEnterAnimation=t;if(t){this.mountPopup();return}this.delayTimer=setTimeout((()=>{this.delayTimer=null;if(!this.label?.trim())return;this.mountPopup()}),this.hoverDelayMs)}hide(){this.clearTimers();if(!this.popupEl&&!this.isOpen)return;b=Date.now();if(!this.popupEl){this.isOpen=false;return}this.popupEl.classList.remove("tooltip-popup--instant");this.popupEl.classList.add("tooltip-popup--closing");if(this.fadeOutMs===0){if(w===this)w=null;this.destroyPopup();this.isOpen=false;this.skipEnterAnimation=false;return}this.closeTimer=setTimeout((()=>{this.closeTimer=null;if(w===this)w=null;this.destroyPopup();this.isOpen=false;this.skipEnterAnimation=false}),this.fadeOutMs)}mountPopup(){if(!this.popupEl){const t=document.createElement("div");t.id=this.tooltipId;t.setAttribute("role","tooltip");t.className="tooltip-popup sc-ds-tooltip";Object.assign(t.style,{position:"fixed",left:"0",top:"0",zIndex:"var(--dimension-z-index-tooltip)",pointerEvents:"none"});document.body.appendChild(t);this.popupEl=t}this.setupOpenListeners();this.linkDescribedBy();this.popupEl.classList.toggle("tooltip-popup--instant",this.skipEnterAnimation);this.popupEl.classList.remove("tooltip-popup--closing");this.renderPopupContent();this.schedulePosition();this.isOpen=true}renderPopupContent(){if(!this.popupEl)return;const t=p[this.size];const i=this.size==="md"?"ds-control--md":this.size==="sm"?"ds-control--sm":"ds-control--xs";const s="sc-ds-tooltip";const o=document.createElement("div");o.className=`tooltip-inner ${i} ${s}`;const n=t=>{if(!this.shortcutKey||this.shortcutKeyPosition!==t)return;const i=document.createElement("span");i.className=`key-hint-group ${s}`;i.setAttribute("aria-hidden","true");for(const t of g(this.shortcutKey)){const o=document.createElement("span");const n=Array.from(t).length>1?" key-hint--wide":"";o.className=`key-hint${n} ${s}`;const e=document.createElement("span");e.className=`key-hint__label ${s}`;e.textContent=t;o.appendChild(e);i.appendChild(o)}o.appendChild(i)};n("start");const e=C({variant:t,wrap:"nowrap",text:this.label});k(e);o.appendChild(e);n("end");this.popupEl.replaceChildren(o)}calculatePosition(){if(!this.anchor||!this.popupEl)return;const t=this.popupEl;const i=this.anchor.getBoundingClientRect();const s=t.offsetWidth||this.tooltipFallbackWidthPx;const o=t.offsetHeight||this.tooltipFallbackHeightPx;const{x:n,y:r,resolvedSide:d}=e({anchorRect:i,popupWidth:s,popupHeight:o,side:this.side,align:this.align,sideOffsetPx:this.sideOffsetPx,alignOffsetPx:this.alignOffsetPx,viewportPadPx:this.viewportPadPx,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight});t.dataset.side=d;t.style.transform=`translate(${Math.round(n)}px, ${Math.round(r)}px)`}render(){return s(o,{key:"c50a5720187392284e92f137f50a7fcb8f911e13",style:{display:"contents"}},s("slot",{key:"3f3fdf29bc826fef861a2b0dd129718cdbb388e7",onSlotchange:this.handleSlotChange}))}get el(){return this}static get watchers(){return{label:[{onContentOrPositionChange:0}],size:[{onContentOrPositionChange:0}],side:[{onContentOrPositionChange:0}],align:[{onContentOrPositionChange:0}],sideOffset:[{onContentOrPositionChange:0}],alignOffset:[{onContentOrPositionChange:0}],shortcutKey:[{onContentOrPositionChange:0}],shortcutKeyPosition:[{onContentOrPositionChange:0}]}}static get style(){return v()}},[262,"ds-tooltip",{label:[1],size:[1],side:[1],align:[1],sideOffset:[8,"side-offset"],alignOffset:[8,"align-offset"],delay:[8],shortcutKey:[1,"shortcut-key"],shortcutKeyPosition:[1,"shortcut-key-position"]},undefined,{label:[{onContentOrPositionChange:0}],size:[{onContentOrPositionChange:0}],side:[{onContentOrPositionChange:0}],align:[{onContentOrPositionChange:0}],sideOffset:[{onContentOrPositionChange:0}],alignOffset:[{onContentOrPositionChange:0}],shortcutKey:[{onContentOrPositionChange:0}],shortcutKeyPosition:[{onContentOrPositionChange:0}]}]);function P(){if(typeof customElements==="undefined"){return}const t=["ds-tooltip","ds-text"];t.forEach((t=>{switch(t){case"ds-tooltip":if(!customElements.get(n(t))){customElements.define(n(t),O)}break;case"ds-text":if(!customElements.get(n(t))){r()}break}}))}P();export{O as T,P as d};
2
- //# sourceMappingURL=p-C0-K8vnW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["MODIFIER_GLYPHS","Set","MODIFIER_LABELS","alt","cmd","command","control","ctrl","option","shift","canonicalKeyLabel","label","toLowerCase","shortcutKeyLabels","shortcut","normalized","trim","includes","split","map","part","filter","Boolean","test","characters","Array","from","labels","length","has","push","join","tooltipCss","FALLBACK_HEIGHT","md","TOKEN_DEFAULTS","size400","sm","size300","xs","size200","lastDismissedAt","tooltipIdCounter","activeTooltip","createDsText","opts","el","document","createElement","as","variant","emphasis","color","wrap","textContent","text","styleTooltipLabel","style","flexShrink","minWidth","maxWidth","padding","Tooltip","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","size","side","align","sideOffset","TOKEN_CSS_LENGTHS","space050","alignOffset","delay","animationDelayMedium3","shortcutKeyPosition","tooltipId","delayTimer","closeTimer","anchor","popupEl","positionObserver","anchorObserver","positionFrame","skipEnterAnimation","isOpen","lastInteractionWasKeyboard","pointerEnterHandler","event","pointerType","show","pointerLeaveHandler","hide","pointerDownHandler","hideInstant","keyDownHandler","focusHandler","matches","blurHandler","e","next","relatedTarget","contains","scrollResizeHandler","requestAnimationFrame","calculatePosition","escapeHandler","key","preventDefault","handleSlotChange","slot","querySelector","assignedElements","firstElementChild","unbindAnchor","bindAnchor","componentDidLoad","MutationObserver","observe","childList","disconnectedCallback","disconnect","clearTimers","destroyPopup","onContentOrPositionChange","renderPopupContent","schedulePosition","viewportPadPx","resolveCssLengthPx","sideOffsetPx","alignOffsetPx","hoverDelayMs","resolveCssTimeMs","instantReopenMs","animationDurationMedium1","fadeOutMs","resolveMotionTimeMs","motionShort3","animationDurationShort3","tooltipFallbackWidthPx","tooltipFallbackWidth","tooltipFallbackHeightPx","token","slotted","child","addEventListener","unlinkDescribedBy","removeEventListener","linkDescribedBy","ids","getAttribute","add","setAttribute","id","removeAttribute","clearTimeout","setupOpenListeners","window","teardownOpenListeners","cancelAnimationFrame","remove","reapplyLabelStyles","ResizeObserver","Date","now","instant","mountPopup","setTimeout","classList","tip","className","Object","assign","position","left","top","zIndex","pointerEvents","body","appendChild","toggle","textVariant","CONTROL_TEXT_VARIANT","density","sc","inner","appendShortcut","shortcutKey","group","hint","wide","replaceChildren","a","getBoundingClientRect","tw","offsetWidth","th","offsetHeight","x","y","resolvedSide","computeTooltipPosition","anchorRect","popupWidth","popupHeight","viewportWidth","innerWidth","viewportHeight","innerHeight","dataset","transform","Math","round","render","h","Host","display","onSlotchange"],"sources":["src/wc/utils/shortcut-key.ts","src/wc/components/Tooltip/Tooltip.css?tag=ds-tooltip&encapsulation=scoped","src/wc/components/Tooltip/Tooltip.tsx"],"sourcesContent":["const MODIFIER_GLYPHS = new Set(['⌘', '⇧', '⌥', '⌃']);\nconst MODIFIER_LABELS: Readonly<Record<string, string>> = {\n alt: '⌥',\n cmd: '⌘',\n command: '⌘',\n control: '⌃',\n ctrl: '⌃',\n option: '⌥',\n shift: '⇧',\n};\n\nfunction canonicalKeyLabel(label: string): string {\n return MODIFIER_LABELS[label.toLowerCase()] ?? label;\n}\n\n/** Split a shortcut chord into the labels rendered on individual keycaps. */\nexport function shortcutKeyLabels(shortcut: string): string[] {\n const normalized = shortcut.trim();\n if (!normalized) return [];\n\n if (normalized.includes('+')) {\n return normalized.split('+').map(part => part.trim()).filter(Boolean).map(canonicalKeyLabel);\n }\n\n if (/\\s/.test(normalized)) {\n return normalized.split(/\\s+/).filter(Boolean).map(canonicalKeyLabel);\n }\n\n const characters = Array.from(normalized);\n const labels: string[] = [];\n while (characters.length > 1 && MODIFIER_GLYPHS.has(characters[0])) {\n labels.push(characters.shift()!);\n }\n labels.push(characters.join(''));\n return labels;\n}\n","@import '../../utils/control-density.css';\n@import '../../utils/key-hint.css';\n\n.tooltip-popup {\n box-sizing: border-box;\n background-color: var(--color-background-primary);\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n box-shadow: var(--effect-elevation-elevated-floating);\n white-space: nowrap;\n pointer-events: none;\n animation: tooltipFadeIn var(--effect-motion-short-2) forwards;\n will-change: transform;\n backface-visibility: hidden;\n}\n\n/* Warm handoff between nearby triggers — no enter fade (avoids 20–100ms lag). */\n.tooltip-popup--instant {\n animation: none;\n opacity: 1;\n}\n\n.tooltip-popup--closing {\n animation: tooltipFadeOut var(--effect-motion-short-3) forwards;\n}\n\n/* Density: md / sm / xs via `.ds-control--*` on `.tooltip-inner`. */\n.tooltip-inner {\n box-sizing: border-box;\n height: var(--ds-control-height, var(--dimension-size-400));\n display: flex;\n align-items: center;\n gap: var(--ds-control-gap, var(--dimension-space-050));\n padding: 0 var(--ds-control-padding-inline, var(--dimension-space-075));\n}\n\n/*\n * Label layout lives on ds-text (metric-box + control label-inset).\n * NOTE: Stencil scopes this to `ds-text.sc-ds-tooltip`, but portaled\n * createElement ds-text loses that class when Text's <Host class> renders.\n * `renderPopupContent` therefore also sets these as inline styles.\n */\n.tooltip-inner > ds-text {\n flex-shrink: 0;\n min-width: max-content;\n max-width: none;\n padding: 0 var(--ds-control-label-inset, var(--dimension-space-025));\n color: var(--color-foreground-primary);\n}\n\n@keyframes tooltipFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes tooltipFadeOut {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .tooltip-popup,\n .tooltip-popup--instant {\n animation: none;\n opacity: 1;\n }\n\n .tooltip-popup--closing {\n animation: none;\n opacity: 0;\n }\n}\n","import { Component, Prop, Element, Watch, h, Host } from '@stencil/core';\nimport {\n CONTROL_TEXT_VARIANT,\n resolveCssLengthPx,\n resolveCssTimeMs,\n resolveMotionTimeMs,\n TOKEN_CSS_LENGTHS,\n TOKEN_DEFAULTS,\n} from '../../utils';\nimport type { TextVariant } from '../Text/text-types';\nimport { shortcutKeyLabels } from '../../utils/shortcut-key';\nimport { computeTooltipPosition } from './tooltip-position';\n// Side-effect: register `ds-text` — the portal builds it via createElement, not JSX.\nimport '../Text/Text';\n\nexport type TooltipSide = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipAlign = 'start' | 'center' | 'end';\nexport type TooltipSize = 'md' | 'sm' | 'xs';\n\nconst FALLBACK_HEIGHT: Record<TooltipSize, string> = {\n md: TOKEN_DEFAULTS.size400,\n sm: TOKEN_DEFAULTS.size300,\n xs: TOKEN_DEFAULTS.size200,\n};\n\nlet lastDismissedAt = 0;\nlet tooltipIdCounter = 0;\n/** Currently open tooltip — force-cleared on warm handoff so tips don't cross-fade. */\nlet activeTooltip: Tooltip | null = null;\n\ntype DsTextEl = HTMLElement & {\n as: string;\n variant: TextVariant;\n emphasis: boolean;\n color: string;\n wrap: string;\n};\n\nfunction createDsText(opts: {\n variant: TextVariant;\n emphasis?: boolean;\n color?: string;\n wrap?: 'wrap' | 'nowrap' | 'balance' | 'pretty';\n text: string;\n}): DsTextEl {\n const el = document.createElement('ds-text') as DsTextEl;\n el.as = 'span';\n el.variant = opts.variant;\n el.emphasis = opts.emphasis ?? false;\n el.color = opts.color ?? 'inherit';\n if (opts.wrap) el.wrap = opts.wrap;\n el.textContent = opts.text;\n return el;\n}\n\n/**\n * Control-density label styles for portaled ds-text.\n * Scoped CSS requires `sc-ds-tooltip` on the host, but Text's `<Host class>`\n * overwrites imperative className — so these must be inline to stick.\n */\nfunction styleTooltipLabel(el: HTMLElement) {\n el.style.flexShrink = '0';\n el.style.minWidth = 'max-content';\n el.style.maxWidth = 'none';\n el.style.padding = '0 var(--ds-control-label-inset, var(--dimension-space-025))';\n el.style.color = 'var(--color-foreground-primary)';\n}\n\n/**\n * Imperative body portal for the popup.\n * Stencil must not own the portaled node — moving a VDOM child to `document.body`\n * causes recreate → re-portal → @State loops that freeze the page.\n */\n@Component({\n tag: 'ds-tooltip',\n styleUrl: 'Tooltip.css',\n scoped: true,\n})\nexport class Tooltip {\n @Element() el!: HTMLElement;\n\n /**\n * Tooltip text. Empty/whitespace skips show — useful when the wrapper must stay\n * mounted for layout/animation stability (e.g. PanelNav expand/collapse).\n */\n @Prop() label!: string;\n\n /** Control density (height, padding, type). */\n @Prop() size: TooltipSize = 'md';\n\n @Prop() side: TooltipSide = 'top';\n @Prop() align: TooltipAlign = 'center';\n /** Gap between anchor and tooltip — number (px) or TokoMo length. */\n @Prop() sideOffset: number | string = TOKEN_CSS_LENGTHS.space050;\n /** Cross-axis offset — number (px) or TokoMo length. */\n @Prop() alignOffset: number | string = 0;\n /**\n * Hover show delay before the tooltip appears.\n * Default: `--effect-animation-delay-medium-3` (1000ms). Accepts a number (ms)\n * or a TokoMo time token / `var(--effect-animation-delay-*)`. Applies to the\n * initial hover/focus show only — after a recent dismiss, reopen is instant.\n * Prefer the default; override only for denser chrome or rare/destructive actions.\n */\n @Prop() delay: number | string = TOKEN_DEFAULTS.animationDelayMedium3;\n @Prop() shortcutKey: string | undefined;\n @Prop() shortcutKeyPosition: 'start' | 'end' = 'end';\n\n private tooltipId = `ds-tooltip-${++tooltipIdCounter}`;\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private anchor: HTMLElement | null = null;\n private popupEl: HTMLElement | null = null;\n private positionObserver: ResizeObserver | null = null;\n private anchorObserver: MutationObserver | null = null;\n private positionFrame: number | null = null;\n private skipEnterAnimation = false;\n private isOpen = false;\n private lastInteractionWasKeyboard = false;\n private pointerEnterHandler = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n this.show();\n };\n private pointerLeaveHandler = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n this.hide();\n };\n private pointerDownHandler = (event: PointerEvent) => {\n this.lastInteractionWasKeyboard = false;\n if (event.pointerType === 'touch' && (this.isOpen || this.popupEl)) this.hideInstant();\n };\n private keyDownHandler = () => {\n this.lastInteractionWasKeyboard = true;\n };\n /** focusin/focusout so nested focus targets (e.g. ds-button-* inner button) still open the tip. */\n private focusHandler = () => {\n if (this.lastInteractionWasKeyboard || this.anchor?.matches(':focus-visible')) this.show();\n };\n private blurHandler: (e: FocusEvent) => void = (e) => {\n const next = e.relatedTarget as Node | null;\n if (next && this.anchor?.contains(next)) return;\n this.hide();\n };\n private scrollResizeHandler = () => {\n if (this.positionFrame !== null) return;\n this.positionFrame = requestAnimationFrame(() => {\n this.positionFrame = null;\n this.calculatePosition();\n });\n };\n private escapeHandler = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !this.isOpen) return;\n event.preventDefault();\n this.hide();\n };\n\n componentDidLoad() {\n this.bindAnchor();\n this.anchorObserver = new MutationObserver(() => this.handleSlotChange());\n this.anchorObserver.observe(this.el, { childList: true });\n }\n\n disconnectedCallback() {\n if (activeTooltip === this) activeTooltip = null;\n this.anchorObserver?.disconnect();\n this.anchorObserver = null;\n this.unbindAnchor();\n this.clearTimers();\n this.destroyPopup();\n }\n\n @Watch('label')\n @Watch('size')\n @Watch('side')\n @Watch('align')\n @Watch('sideOffset')\n @Watch('alignOffset')\n @Watch('shortcutKey')\n @Watch('shortcutKeyPosition')\n onContentOrPositionChange() {\n if (!this.label?.trim()) {\n if (this.isOpen || this.popupEl) this.hideInstant();\n return;\n }\n if (!this.popupEl || !this.isOpen) return;\n this.renderPopupContent();\n this.schedulePosition();\n }\n\n private get viewportPadPx(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.space050, TOKEN_DEFAULTS.space050);\n }\n\n private get sideOffsetPx(): number {\n return resolveCssLengthPx(this.sideOffset, TOKEN_DEFAULTS.space050);\n }\n\n private get alignOffsetPx(): number {\n return resolveCssLengthPx(this.alignOffset, 0);\n }\n\n private get hoverDelayMs(): number {\n return resolveCssTimeMs(this.delay, TOKEN_DEFAULTS.animationDelayMedium3);\n }\n\n private get instantReopenMs(): number {\n return resolveCssTimeMs(\n TOKEN_DEFAULTS.animationDurationMedium1,\n TOKEN_DEFAULTS.animationDurationMedium1,\n );\n }\n\n private get fadeOutMs(): number {\n return resolveMotionTimeMs(TOKEN_DEFAULTS.motionShort3, TOKEN_DEFAULTS.animationDurationShort3);\n }\n\n private get tooltipFallbackWidthPx(): number {\n return resolveCssLengthPx(TOKEN_DEFAULTS.tooltipFallbackWidth, TOKEN_DEFAULTS.tooltipFallbackWidth);\n }\n\n private get tooltipFallbackHeightPx(): number {\n const token = FALLBACK_HEIGHT[this.size];\n return resolveCssLengthPx(token, token);\n }\n\n private bindAnchor() {\n const slot = this.el.querySelector('slot') as HTMLSlotElement | null;\n const slotted = slot?.assignedElements?.() ?? [];\n const child = (slotted[0] ?? this.el.firstElementChild) as HTMLElement | null;\n if (!child || child === this.anchor) return;\n this.anchor = child;\n child.addEventListener('pointerenter', this.pointerEnterHandler);\n child.addEventListener('pointerleave', this.pointerLeaveHandler);\n child.addEventListener('pointerdown', this.pointerDownHandler);\n child.addEventListener('keydown', this.keyDownHandler);\n child.addEventListener('focusin', this.focusHandler);\n child.addEventListener('focusout', this.blurHandler);\n }\n\n private unbindAnchor() {\n if (!this.anchor) return;\n this.unlinkDescribedBy();\n this.anchor.removeEventListener('pointerenter', this.pointerEnterHandler);\n this.anchor.removeEventListener('pointerleave', this.pointerLeaveHandler);\n this.anchor.removeEventListener('pointerdown', this.pointerDownHandler);\n this.anchor.removeEventListener('keydown', this.keyDownHandler);\n this.anchor.removeEventListener('focusin', this.focusHandler);\n this.anchor.removeEventListener('focusout', this.blurHandler);\n this.anchor = null;\n }\n\n private linkDescribedBy() {\n if (!this.anchor || !this.popupEl) return;\n const ids = new Set((this.anchor.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean));\n ids.add(this.tooltipId);\n this.anchor.setAttribute('aria-describedby', Array.from(ids).join(' '));\n }\n\n private unlinkDescribedBy() {\n if (!this.anchor) return;\n const ids = (this.anchor.getAttribute('aria-describedby') ?? '')\n .split(/\\s+/)\n .filter(id => id && id !== this.tooltipId);\n if (ids.length) this.anchor.setAttribute('aria-describedby', ids.join(' '));\n else this.anchor.removeAttribute('aria-describedby');\n }\n\n private handleSlotChange = () => {\n const slot = this.el.querySelector('slot') as HTMLSlotElement | null;\n const next = (slot?.assignedElements?.()[0] ?? this.el.firstElementChild) as HTMLElement | null;\n if (next === this.anchor) return;\n if (this.isOpen || this.popupEl) this.hideInstant();\n this.unbindAnchor();\n this.bindAnchor();\n };\n\n private clearTimers() {\n if (this.delayTimer) { clearTimeout(this.delayTimer); this.delayTimer = null; }\n if (this.closeTimer) { clearTimeout(this.closeTimer); this.closeTimer = null; }\n }\n\n private setupOpenListeners() {\n window.addEventListener('scroll', this.scrollResizeHandler, true);\n window.addEventListener('resize', this.scrollResizeHandler);\n document.addEventListener('keydown', this.escapeHandler);\n }\n\n private teardownOpenListeners() {\n window.removeEventListener('scroll', this.scrollResizeHandler, true);\n window.removeEventListener('resize', this.scrollResizeHandler);\n document.removeEventListener('keydown', this.escapeHandler);\n if (this.positionFrame !== null) {\n cancelAnimationFrame(this.positionFrame);\n this.positionFrame = null;\n }\n }\n\n private destroyPopup() {\n this.teardownOpenListeners();\n this.positionObserver?.disconnect();\n this.positionObserver = null;\n this.unlinkDescribedBy();\n if (!this.popupEl) return;\n this.popupEl.remove();\n this.popupEl = null;\n }\n\n /**\n * Position after `ds-text` upgrades and lays out. Measuring synchronously in\n * `mountPopup` reads a collapsed/fallback width and places left/right tips wrong.\n */\n private schedulePosition() {\n if (!this.popupEl) return;\n\n const reapplyLabelStyles = () => {\n const label = this.popupEl?.querySelector(':scope > .tooltip-inner > ds-text');\n if (label instanceof HTMLElement) styleTooltipLabel(label);\n };\n\n requestAnimationFrame(() => {\n reapplyLabelStyles();\n this.calculatePosition();\n requestAnimationFrame(() => {\n reapplyLabelStyles();\n this.calculatePosition();\n });\n });\n\n this.positionObserver?.disconnect();\n this.positionObserver = new ResizeObserver(() => this.calculatePosition());\n this.positionObserver.observe(this.popupEl);\n if (this.anchor) this.positionObserver.observe(this.anchor);\n }\n\n /** Drop the open tip immediately (warm handoff to another tooltip). */\n private hideInstant() {\n this.clearTimers();\n lastDismissedAt = Date.now();\n if (activeTooltip === this) activeTooltip = null;\n this.destroyPopup();\n this.isOpen = false;\n this.skipEnterAnimation = false;\n }\n\n private show() {\n // Empty label = wrapper present for DOM stability (e.g. PanelNav expand/collapse)\n // but no tip should appear.\n if (!this.label?.trim()) return;\n this.clearTimers();\n let instant = Date.now() - lastDismissedAt < this.instantReopenMs;\n if (activeTooltip && activeTooltip !== this) {\n activeTooltip.hideInstant();\n instant = true;\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- module singleton tracks the active instance\n activeTooltip = this;\n this.skipEnterAnimation = instant;\n if (instant) {\n this.mountPopup();\n return;\n }\n this.delayTimer = setTimeout(() => {\n this.delayTimer = null;\n if (!this.label?.trim()) return;\n this.mountPopup();\n }, this.hoverDelayMs);\n }\n\n private hide() {\n this.clearTimers();\n if (!this.popupEl && !this.isOpen) return;\n lastDismissedAt = Date.now();\n if (!this.popupEl) {\n this.isOpen = false;\n return;\n }\n this.popupEl.classList.remove('tooltip-popup--instant');\n this.popupEl.classList.add('tooltip-popup--closing');\n if (this.fadeOutMs === 0) {\n if (activeTooltip === this) activeTooltip = null;\n this.destroyPopup();\n this.isOpen = false;\n this.skipEnterAnimation = false;\n return;\n }\n this.closeTimer = setTimeout(() => {\n this.closeTimer = null;\n if (activeTooltip === this) activeTooltip = null;\n this.destroyPopup();\n this.isOpen = false;\n this.skipEnterAnimation = false;\n }, this.fadeOutMs);\n }\n\n private mountPopup() {\n if (!this.popupEl) {\n const tip = document.createElement('div');\n tip.id = this.tooltipId;\n tip.setAttribute('role', 'tooltip');\n // `sc-ds-tooltip` is required for Stencil scoped CSS to match outside the host.\n tip.className = 'tooltip-popup sc-ds-tooltip';\n Object.assign(tip.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n zIndex: 'var(--dimension-z-index-tooltip)',\n pointerEvents: 'none',\n });\n document.body.appendChild(tip);\n this.popupEl = tip;\n }\n\n this.setupOpenListeners();\n this.linkDescribedBy();\n this.popupEl.classList.toggle('tooltip-popup--instant', this.skipEnterAnimation);\n this.popupEl.classList.remove('tooltip-popup--closing');\n this.renderPopupContent();\n this.schedulePosition();\n this.isOpen = true;\n }\n\n private renderPopupContent() {\n if (!this.popupEl) return;\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const density =\n this.size === 'md' ? 'ds-control--md' : this.size === 'sm' ? 'ds-control--sm' : 'ds-control--xs';\n // Every layout node needs `sc-ds-tooltip` so scoped selectors (`.foo.sc-ds-tooltip`) match.\n const sc = 'sc-ds-tooltip';\n\n const inner = document.createElement('div');\n inner.className = `tooltip-inner ${density} ${sc}`;\n\n const appendShortcut = (position: 'start' | 'end') => {\n if (!this.shortcutKey || this.shortcutKeyPosition !== position) return;\n const group = document.createElement('span');\n group.className = `key-hint-group ${sc}`;\n group.setAttribute('aria-hidden', 'true');\n\n for (const label of shortcutKeyLabels(this.shortcutKey)) {\n const hint = document.createElement('span');\n const wide = Array.from(label).length > 1 ? ' key-hint--wide' : '';\n hint.className = `key-hint${wide} ${sc}`;\n const text = document.createElement('span');\n text.className = `key-hint__label ${sc}`;\n text.textContent = label;\n hint.appendChild(text);\n group.appendChild(hint);\n }\n inner.appendChild(group);\n };\n\n appendShortcut('start');\n\n // ds-text is the layout box (metric-box + 2px control label-inset).\n // Inline styles required — see styleTooltipLabel.\n const label = createDsText({ variant: textVariant, wrap: 'nowrap', text: this.label });\n styleTooltipLabel(label);\n inner.appendChild(label);\n\n appendShortcut('end');\n\n this.popupEl.replaceChildren(inner);\n }\n\n private calculatePosition() {\n if (!this.anchor || !this.popupEl) return;\n const tip = this.popupEl;\n const a = this.anchor.getBoundingClientRect();\n const tw = tip.offsetWidth || this.tooltipFallbackWidthPx;\n const th = tip.offsetHeight || this.tooltipFallbackHeightPx;\n const { x, y, resolvedSide } = computeTooltipPosition({\n anchorRect: a,\n popupWidth: tw,\n popupHeight: th,\n side: this.side,\n align: this.align,\n sideOffsetPx: this.sideOffsetPx,\n alignOffsetPx: this.alignOffsetPx,\n viewportPadPx: this.viewportPadPx,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n tip.dataset.side = resolvedSide;\n tip.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;\n }\n\n render() {\n return (\n <Host style={{ display: 'contents' }}>\n <slot onSlotchange={this.handleSlotChange} />\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as n}from"./p-Dg3xLna0.js";function r(n,r){return n===r||n.startsWith(`${r}/`)}function t(n,t){if(!n)return"";let u="";let e=0;for(const f of t){if(!f.href)continue;if(r(n,f.href)&&f.href.length>e){u=f.id;e=f.href.length}}return u}function u(n){return n.reduce(((n,r)=>n+r.items.length),0)}function e(n,r){return r?null:!n}function f(r){return r.split(",").map((r=>n(r.trim(),0)))}function i(n){const r=n.transitionProperty.split(",").map((n=>n.trim()));const t=f(n.transitionDuration);const u=f(n.transitionDelay);return r.reduce(((n,r,e)=>{if(r!=="all"&&r!=="width"&&r!=="min-width")return n;const f=t[e%t.length]??0;const i=u[e%u.length]??0;return Math.max(n,f+i,0)}),0)}function o(n){if(Array.isArray(n))return n;if(typeof n==="string"){try{const r=JSON.parse(n);return Array.isArray(r)?r:[]}catch{return[]}}return[]}function c(n,r){if(n)return true;if(r===null)return false;return r!=="false"}function s(n,r){return u(n)===0&&u(o(r))>0}export{i as a,e as b,t as d,o as p,c as r,s};
2
- //# sourceMappingURL=p-C2ym_Ich.js.map