@ds-mo/ui 14.18.0 → 14.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/README.md +7 -0
  2. package/dist/.package-ready.json +1 -1
  3. package/dist/agent-patterns.json +4 -3
  4. package/dist/agent.json +59 -22
  5. package/dist/angular/ds-filter-menu.d.ts +1 -1
  6. package/dist/angular/ds-filter-menu.js +3 -3
  7. package/dist/angular/ds-input.d.ts +1 -1
  8. package/dist/angular/ds-input.js +3 -3
  9. package/dist/angular/ds-menu.d.ts +1 -1
  10. package/dist/angular/ds-menu.js +3 -3
  11. package/dist/angular/ds-pagination.d.ts +1 -1
  12. package/dist/angular/ds-pagination.js +3 -3
  13. package/dist/angular/ds-panel-tool-header.d.ts +3 -8
  14. package/dist/angular/ds-panel-tools.d.ts +3 -8
  15. package/dist/angular/ds-select.d.ts +1 -1
  16. package/dist/angular/ds-select.js +3 -3
  17. package/dist/angular/ds-tooltip.d.ts +1 -1
  18. package/dist/angular/ds-tooltip.js +3 -3
  19. package/dist/components/ds-agent-activity.js +1 -1
  20. package/dist/components/ds-agent-questionnaire.js +1 -1
  21. package/dist/components/ds-agent-response.js +1 -1
  22. package/dist/components/ds-agent-source-list.js +1 -1
  23. package/dist/components/ds-agent-tool-call.js +1 -1
  24. package/dist/components/ds-attachment-list.js +1 -1
  25. package/dist/components/ds-badge.js +1 -1
  26. package/dist/components/ds-banner.js +1 -1
  27. package/dist/components/ds-banner.js.map +1 -1
  28. package/dist/components/ds-bar-action.js +1 -1
  29. package/dist/components/ds-bar-action.js.map +1 -1
  30. package/dist/components/ds-bar-nav.js +1 -1
  31. package/dist/components/ds-bar-title.js +1 -1
  32. package/dist/components/ds-bar-workflow.js +1 -1
  33. package/dist/components/ds-bar-workflow.js.map +1 -1
  34. package/dist/components/ds-breadcrumb.js +1 -1
  35. package/dist/components/ds-button-filled.js +1 -1
  36. package/dist/components/ds-button-unfilled.js +1 -1
  37. package/dist/components/ds-card-chart.js +1 -1
  38. package/dist/components/ds-card-overview.js +1 -1
  39. package/dist/components/ds-card-setting.js +1 -1
  40. package/dist/components/ds-chart-legend.js +1 -1
  41. package/dist/components/ds-chart.js +1 -1
  42. package/dist/components/ds-checkbox.js +1 -1
  43. package/dist/components/ds-chip.js +1 -1
  44. package/dist/components/ds-code-block.js +1 -1
  45. package/dist/components/ds-conversation-list-item.js +1 -1
  46. package/dist/components/ds-conversation-list-section.js +1 -1
  47. package/dist/components/ds-conversation-list.js +1 -1
  48. package/dist/components/ds-conversation-list.js.map +1 -1
  49. package/dist/components/ds-divider.js +1 -1
  50. package/dist/components/ds-empty-state.js +1 -1
  51. package/dist/components/ds-field.js +1 -1
  52. package/dist/components/ds-filter-menu.js +1 -1
  53. package/dist/components/ds-input.js +1 -1
  54. package/dist/components/ds-markdown.js +1 -1
  55. package/dist/components/ds-menu.js +1 -1
  56. package/dist/components/ds-message-actions.js +1 -1
  57. package/dist/components/ds-message-bubble.js +1 -1
  58. package/dist/components/ds-message-composer.js +1 -1
  59. package/dist/components/ds-message-composer.js.map +1 -1
  60. package/dist/components/ds-message-scroller.js +1 -1
  61. package/dist/components/ds-message.js +1 -1
  62. package/dist/components/ds-mobile-bar-nav.js +1 -1
  63. package/dist/components/ds-mobile-header.js +1 -1
  64. package/dist/components/ds-mobile-section-switcher.js +1 -1
  65. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  66. package/dist/components/ds-modal.js +1 -1
  67. package/dist/components/ds-pagination.js +1 -1
  68. package/dist/components/ds-panel-nav.js +1 -1
  69. package/dist/components/ds-panel-sub-nav.js +1 -1
  70. package/dist/components/ds-panel-tool-header.js +1 -1
  71. package/dist/components/ds-panel-tool-search.js +1 -1
  72. package/dist/components/ds-panel-tools.js +1 -1
  73. package/dist/components/ds-paper-texture.js +1 -1
  74. package/dist/components/ds-radio.js +1 -1
  75. package/dist/components/ds-scroll-overlay.js +1 -1
  76. package/dist/components/ds-select.js +1 -1
  77. package/dist/components/ds-shell-app.js +1 -1
  78. package/dist/components/ds-shell-app.js.map +1 -1
  79. package/dist/components/ds-shell-page.js +1 -1
  80. package/dist/components/ds-shell-tools.js +1 -1
  81. package/dist/components/ds-skeleton.js +1 -1
  82. package/dist/components/ds-slider.js +1 -1
  83. package/dist/components/ds-swatch-picker.js +1 -1
  84. package/dist/components/ds-switch.js +1 -1
  85. package/dist/components/ds-tab-group.js +1 -1
  86. package/dist/components/ds-table-filter.js +1 -1
  87. package/dist/components/ds-table-saved-views.js +1 -1
  88. package/dist/components/ds-table-sort.js +1 -1
  89. package/dist/components/ds-table-toolbar.js +1 -1
  90. package/dist/components/ds-table.js +1 -1
  91. package/dist/components/ds-table.js.map +1 -1
  92. package/dist/components/ds-tag.js +1 -1
  93. package/dist/components/ds-text.js +1 -1
  94. package/dist/components/ds-toast.js +1 -1
  95. package/dist/components/ds-toast.js.map +1 -1
  96. package/dist/components/ds-tooltip-chart.js +1 -1
  97. package/dist/components/ds-tooltip.js +1 -1
  98. package/dist/components/ds-typing-indicator.js +1 -1
  99. package/dist/components/ds-typing-indicator.js.map +1 -1
  100. package/dist/components/p--CRAu9fJ.js +2 -0
  101. package/dist/components/{p-C6yLERx6.js → p-B1JRCDHS.js} +2 -2
  102. package/dist/components/p-BBG6Sswb.js +2 -0
  103. package/dist/components/{p-Drcl4zS9.js.map → p-BBG6Sswb.js.map} +1 -1
  104. package/dist/components/{p-Dd8VKdAO.js → p-BCOl1x0_.js} +2 -2
  105. package/dist/components/{p-C9StMCWg.js → p-BHVOiWz5.js} +2 -2
  106. package/dist/components/p-BNiuAMeh.js +2 -0
  107. package/dist/components/p-BNiuAMeh.js.map +1 -0
  108. package/dist/components/{p-DJ0GCCFa.js → p-BNkU9dcc.js} +2 -2
  109. package/dist/components/p-BPG0r_mC.js +2 -0
  110. package/dist/components/p-BPG0r_mC.js.map +1 -0
  111. package/dist/components/{p-DHzn7INS.js → p-BS0AbMNK.js} +2 -2
  112. package/dist/components/p-BUDAwJVV.js +2 -0
  113. package/dist/components/p-BUDAwJVV.js.map +1 -0
  114. package/dist/components/p-BZVWmzKf.js +2 -0
  115. package/dist/components/p-BZVWmzKf.js.map +1 -0
  116. package/dist/components/{p-CihNoe1M.js → p-B_jZIC9R.js} +2 -2
  117. package/dist/components/{p-CAJIARNW.js → p-Bbb9A3NV.js} +2 -2
  118. package/dist/components/{p-Dginv8PT.js → p-Bf7PZJPT.js} +2 -2
  119. package/dist/components/{p-D6P_1YrL.js → p-BhYS_Ump.js} +2 -2
  120. package/dist/components/p-BknXYAEc.js +2 -0
  121. package/dist/components/{p-9GuNIXuz.js.map → p-BknXYAEc.js.map} +1 -1
  122. package/dist/components/{p-BKx2ihnG.js → p-Bu3dOjpW.js} +2 -2
  123. package/dist/components/{p-BiBXCjjo.js → p-BxGQ3cRJ.js} +2 -2
  124. package/dist/components/{p-Dl3gciej.js → p-BysVBVQv.js} +2 -2
  125. package/dist/components/{p-CBa_6lqj.js → p-C-Y7gYgz.js} +2 -2
  126. package/dist/components/{p-9EQ3xLI1.js → p-C6R5Lft0.js} +2 -2
  127. package/dist/components/{p-DPR0TGGJ.js → p-C9gC4haA.js} +2 -2
  128. package/dist/components/{p-LHzBS95u.js → p-CAnnQL1F.js} +2 -2
  129. package/dist/components/p-CY4YFAT3.js +2 -0
  130. package/dist/components/p-CY4YFAT3.js.map +1 -0
  131. package/dist/components/{p-3WlVHGUe.js → p-Cg0kimXZ.js} +2 -2
  132. package/dist/components/{p-HZz5aJKz.js → p-CsBICYmt.js} +2 -2
  133. package/dist/components/p-CwjVgUqy.js +2 -0
  134. package/dist/components/p-CwjVgUqy.js.map +1 -0
  135. package/dist/components/p-D1eEgwcP.js +2 -0
  136. package/dist/components/p-D1eEgwcP.js.map +1 -0
  137. package/dist/components/{p-oCc3mz_c.js → p-D3fMaUJ3.js} +2 -2
  138. package/dist/components/p-D7R4yE2C.js +2 -0
  139. package/dist/components/{p-Ba7DaFkb.js.map → p-D7R4yE2C.js.map} +1 -1
  140. package/dist/components/{p-CHEt4mW8.js → p-DAvh38E4.js} +2 -2
  141. package/dist/components/{p-DPpHSIzS.js → p-DBue3ISk.js} +2 -2
  142. package/dist/components/{p-BdgoB2ef.js → p-DDgeXGbB.js} +2 -2
  143. package/dist/components/{p-hp_2W2Qy.js → p-DOUDRJbE.js} +2 -2
  144. package/dist/components/{p-Be-vZpWx.js → p-DUdOmSFR.js} +2 -2
  145. package/dist/components/p-DaAXY-XS.js +2 -0
  146. package/dist/components/p-DaAXY-XS.js.map +1 -0
  147. package/dist/components/{p-B9ZfoprK.js → p-DlYw4UGQ.js} +2 -2
  148. package/dist/components/p-DlYw4UGQ.js.map +1 -0
  149. package/dist/components/p-DtndC9f1.js +2 -0
  150. package/dist/components/p-DtndC9f1.js.map +1 -0
  151. package/dist/components/p-HB_cf_aR.js +2 -0
  152. package/dist/components/{p-BBmRD_S0.js.map → p-HB_cf_aR.js.map} +1 -1
  153. package/dist/components/{p-BTTxl3ro.js → p-ZpQBAwZC.js} +2 -2
  154. package/dist/components/p-ZpQBAwZC.js.map +1 -0
  155. package/dist/components/p-ag6Io-kL.js +2 -0
  156. package/dist/components/p-ag6Io-kL.js.map +1 -0
  157. package/dist/components/p-fg9EKoZp.js +2 -0
  158. package/dist/components/{p-DMaQkEYP.js.map → p-fg9EKoZp.js.map} +1 -1
  159. package/dist/components/p-iMuFgSoM.js +2 -0
  160. package/dist/components/p-iMuFgSoM.js.map +1 -0
  161. package/dist/components/{p-CbZ0RU2c.js → p-r8PMqlqm.js} +2 -2
  162. package/dist/components/{p-B145kX-i.js → p-uI6z53BE.js} +2 -2
  163. package/dist/docs/components.json +252 -37
  164. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +12 -0
  165. package/dist/lib/shell/index.d.ts +1 -1
  166. package/dist/lib/shell/index.js.map +1 -1
  167. package/dist/lib/utils/anchored-position.d.ts +6 -2
  168. package/dist/mcp-data/registry/badge.json +7 -9
  169. package/dist/mcp-data/registry/banner.json +2 -2
  170. package/dist/mcp-data/registry/bar-action.json +2 -2
  171. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  172. package/dist/mcp-data/registry/conversation-list.json +2 -2
  173. package/dist/mcp-data/registry/filter-menu.json +21 -6
  174. package/dist/mcp-data/registry/input.json +23 -3
  175. package/dist/mcp-data/registry/menu.json +22 -4
  176. package/dist/mcp-data/registry/message-composer.json +2 -2
  177. package/dist/mcp-data/registry/pagination.json +31 -10
  178. package/dist/mcp-data/registry/panel-nav.json +1 -1
  179. package/dist/mcp-data/registry/panel-tool-header.json +3 -3
  180. package/dist/mcp-data/registry/panel-tools.json +5 -4
  181. package/dist/mcp-data/registry/registry.json +58 -21
  182. package/dist/mcp-data/registry/select.json +17 -3
  183. package/dist/mcp-data/registry/shell-app.json +3 -2
  184. package/dist/mcp-data/registry/table.json +21 -1
  185. package/dist/mcp-data/registry/toast.json +2 -2
  186. package/dist/mcp-data/registry/tooltip.json +20 -3
  187. package/dist/mcp-data/registry/typing-indicator.json +4 -4
  188. package/dist/react/ds-panel-tool-header.d.ts +2 -5
  189. package/dist/react/ds-panel-tools.d.ts +2 -5
  190. package/dist/types/components/Badge/Badge.d.ts +2 -16
  191. package/dist/types/components/Banner/Banner.d.ts +0 -1
  192. package/dist/types/components/BarAction/BarAction.d.ts +0 -7
  193. package/dist/types/components/ConversationList/ConversationList.d.ts +1 -0
  194. package/dist/types/components/FilterMenu/FilterMenu.d.ts +5 -5
  195. package/dist/types/components/Input/Input.d.ts +7 -0
  196. package/dist/types/components/Menu/Menu.d.ts +3 -4
  197. package/dist/types/components/MessageComposer/MessageComposer.d.ts +0 -3
  198. package/dist/types/components/Pagination/Pagination.d.ts +2 -0
  199. package/dist/types/components/Pagination/pagination-types.d.ts +2 -0
  200. package/dist/types/components/PanelToolHeader/PanelToolHeader.d.ts +2 -5
  201. package/dist/types/components/PanelTools/PanelTools.d.ts +2 -5
  202. package/dist/types/components/PanelTools/panel-tools-types.d.ts +12 -0
  203. package/dist/types/components/Select/Select.d.ts +3 -0
  204. package/dist/types/components/Table/Table.d.ts +1 -13
  205. package/dist/types/components/Table/table-body-renderer.d.ts +36 -0
  206. package/dist/types/components/Table/table-load-view.d.ts +17 -0
  207. package/dist/types/components/Table/table-row-view.d.ts +26 -0
  208. package/dist/types/components/Table/table-skeleton-view.d.ts +12 -0
  209. package/dist/types/components/Tooltip/Tooltip.d.ts +3 -0
  210. package/dist/types/components.d.ts +72 -23
  211. package/dist/types/shell/index.d.ts +1 -1
  212. package/dist/types/utils/anchored-overlay-boundary.d.ts +14 -0
  213. package/dist/types/utils/anchored-overlay-interaction-controller.d.ts +26 -0
  214. package/dist/types/utils/anchored-position-controller.d.ts +14 -0
  215. package/dist/types/utils/anchored-position.d.ts +6 -2
  216. package/dist/types/utils/select-controller.d.ts +1 -0
  217. package/dist/vue/ds-filter-menu.js +1 -0
  218. package/dist/vue/ds-input.js +1 -0
  219. package/dist/vue/ds-menu.js +1 -0
  220. package/dist/vue/ds-pagination.js +1 -0
  221. package/dist/vue/ds-select.js +1 -0
  222. package/dist/vue/ds-tooltip.js +1 -0
  223. package/package.json +4 -1
  224. package/dist/components/p-9GuNIXuz.js +0 -2
  225. package/dist/components/p-B9ZfoprK.js.map +0 -1
  226. package/dist/components/p-BBmRD_S0.js +0 -2
  227. package/dist/components/p-BTTxl3ro.js.map +0 -1
  228. package/dist/components/p-Ba7DaFkb.js +0 -2
  229. package/dist/components/p-BcNYvLMi.js +0 -2
  230. package/dist/components/p-BcNYvLMi.js.map +0 -1
  231. package/dist/components/p-CI5Ce8VF.js +0 -2
  232. package/dist/components/p-CI5Ce8VF.js.map +0 -1
  233. package/dist/components/p-Cgm7YMLw.js +0 -2
  234. package/dist/components/p-Cgm7YMLw.js.map +0 -1
  235. package/dist/components/p-Cj5Hkt6Y.js +0 -2
  236. package/dist/components/p-Cj5Hkt6Y.js.map +0 -1
  237. package/dist/components/p-DC_8dK55.js +0 -2
  238. package/dist/components/p-DC_8dK55.js.map +0 -1
  239. package/dist/components/p-DKY3IJqt.js +0 -2
  240. package/dist/components/p-DKY3IJqt.js.map +0 -1
  241. package/dist/components/p-DMaQkEYP.js +0 -2
  242. package/dist/components/p-DQyvAN44.js +0 -2
  243. package/dist/components/p-DQyvAN44.js.map +0 -1
  244. package/dist/components/p-DaxKVtZG.js +0 -2
  245. package/dist/components/p-DbJahF86.js +0 -2
  246. package/dist/components/p-DbJahF86.js.map +0 -1
  247. package/dist/components/p-DhKvqh5G.js +0 -2
  248. package/dist/components/p-DhKvqh5G.js.map +0 -1
  249. package/dist/components/p-Drcl4zS9.js +0 -2
  250. package/dist/components/p-DzPw6aDK.js +0 -2
  251. package/dist/components/p-DzPw6aDK.js.map +0 -1
  252. package/dist/components/p-jk2-y5dH.js +0 -2
  253. package/dist/components/p-jk2-y5dH.js.map +0 -1
  254. package/dist/types/shell/badge-gradient-ring.d.ts +0 -28
  255. /package/dist/components/{p-DaxKVtZG.js.map → p--CRAu9fJ.js.map} +0 -0
  256. /package/dist/components/{p-C6yLERx6.js.map → p-B1JRCDHS.js.map} +0 -0
  257. /package/dist/components/{p-Dd8VKdAO.js.map → p-BCOl1x0_.js.map} +0 -0
  258. /package/dist/components/{p-C9StMCWg.js.map → p-BHVOiWz5.js.map} +0 -0
  259. /package/dist/components/{p-DJ0GCCFa.js.map → p-BNkU9dcc.js.map} +0 -0
  260. /package/dist/components/{p-DHzn7INS.js.map → p-BS0AbMNK.js.map} +0 -0
  261. /package/dist/components/{p-CihNoe1M.js.map → p-B_jZIC9R.js.map} +0 -0
  262. /package/dist/components/{p-CAJIARNW.js.map → p-Bbb9A3NV.js.map} +0 -0
  263. /package/dist/components/{p-Dginv8PT.js.map → p-Bf7PZJPT.js.map} +0 -0
  264. /package/dist/components/{p-D6P_1YrL.js.map → p-BhYS_Ump.js.map} +0 -0
  265. /package/dist/components/{p-BKx2ihnG.js.map → p-Bu3dOjpW.js.map} +0 -0
  266. /package/dist/components/{p-BiBXCjjo.js.map → p-BxGQ3cRJ.js.map} +0 -0
  267. /package/dist/components/{p-Dl3gciej.js.map → p-BysVBVQv.js.map} +0 -0
  268. /package/dist/components/{p-CBa_6lqj.js.map → p-C-Y7gYgz.js.map} +0 -0
  269. /package/dist/components/{p-9EQ3xLI1.js.map → p-C6R5Lft0.js.map} +0 -0
  270. /package/dist/components/{p-DPR0TGGJ.js.map → p-C9gC4haA.js.map} +0 -0
  271. /package/dist/components/{p-LHzBS95u.js.map → p-CAnnQL1F.js.map} +0 -0
  272. /package/dist/components/{p-3WlVHGUe.js.map → p-Cg0kimXZ.js.map} +0 -0
  273. /package/dist/components/{p-HZz5aJKz.js.map → p-CsBICYmt.js.map} +0 -0
  274. /package/dist/components/{p-oCc3mz_c.js.map → p-D3fMaUJ3.js.map} +0 -0
  275. /package/dist/components/{p-CHEt4mW8.js.map → p-DAvh38E4.js.map} +0 -0
  276. /package/dist/components/{p-DPpHSIzS.js.map → p-DBue3ISk.js.map} +0 -0
  277. /package/dist/components/{p-BdgoB2ef.js.map → p-DDgeXGbB.js.map} +0 -0
  278. /package/dist/components/{p-hp_2W2Qy.js.map → p-DOUDRJbE.js.map} +0 -0
  279. /package/dist/components/{p-Be-vZpWx.js.map → p-DUdOmSFR.js.map} +0 -0
  280. /package/dist/components/{p-CbZ0RU2c.js.map → p-r8PMqlqm.js.map} +0 -0
  281. /package/dist/components/{p-B145kX-i.js.map → p-uI6z53BE.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-08-25T22:10:52",
2
+ "timestamp": "2026-08-26T23:19:46",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -1799,29 +1799,26 @@
1799
1799
  },
1800
1800
  {
1801
1801
  "name": "gradientBackground",
1802
- "type": "boolean",
1802
+ "type": "boolean | undefined",
1803
1803
  "complexType": {
1804
1804
  "original": "boolean",
1805
- "resolved": "boolean",
1805
+ "resolved": "boolean | undefined",
1806
1806
  "references": {}
1807
1807
  },
1808
1808
  "mutable": false,
1809
1809
  "attr": "gradient-background",
1810
1810
  "reflectToAttr": true,
1811
- "docs": "Ring samples the shell gradient stack (base fill + wash) instead of a flat\n`box-shadow`. Auto-enabled under an ShellApp with an active gradient preset;\nset `gradient-background` to opt in/out explicitly.\n\nThe attribute must NOT start with `on` — Stencil's setAccessor routes any\nunknown `on*` member down the event-listener path during attribute\nreflection, calling addEventListener with a non-listener and throwing.",
1812
- "docsTags": [
1813
- {
1814
- "name": "default",
1815
- "text": "false"
1816
- }
1817
- ],
1818
- "default": "false",
1811
+ "docs": "Ring samples the shell gradient stack (base fill + wash) instead of a flat\n`box-shadow`. Omit to inherit ShellApp context; set true or false to override.\n\nThe attribute must NOT start with `on` — Stencil's setAccessor routes any\nunknown `on*` member down the event-listener path during attribute\nreflection, calling addEventListener with a non-listener and throwing.",
1812
+ "docsTags": [],
1819
1813
  "values": [
1820
1814
  {
1821
1815
  "type": "boolean"
1816
+ },
1817
+ {
1818
+ "type": "undefined"
1822
1819
  }
1823
1820
  ],
1824
- "optional": false,
1821
+ "optional": true,
1825
1822
  "required": false,
1826
1823
  "getter": false,
1827
1824
  "setter": false
@@ -9652,6 +9649,36 @@
9652
9649
  "getter": false,
9653
9650
  "setter": false
9654
9651
  },
9652
+ {
9653
+ "name": "boundary",
9654
+ "type": "HTMLElement | undefined",
9655
+ "complexType": {
9656
+ "original": "HTMLElement | undefined",
9657
+ "resolved": "HTMLElement | undefined",
9658
+ "references": {
9659
+ "HTMLElement": {
9660
+ "location": "global",
9661
+ "id": "global::HTMLElement"
9662
+ }
9663
+ }
9664
+ },
9665
+ "mutable": false,
9666
+ "reflectToAttr": false,
9667
+ "docs": "Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used.",
9668
+ "docsTags": [],
9669
+ "values": [
9670
+ {
9671
+ "type": "HTMLElement"
9672
+ },
9673
+ {
9674
+ "type": "undefined"
9675
+ }
9676
+ ],
9677
+ "optional": false,
9678
+ "required": false,
9679
+ "getter": false,
9680
+ "setter": false
9681
+ },
9655
9682
  {
9656
9683
  "name": "categoriesLabel",
9657
9684
  "type": "string",
@@ -9929,7 +9956,7 @@
9929
9956
  "mutable": false,
9930
9957
  "attr": "menu-width",
9931
9958
  "reflectToAttr": false,
9932
- "docs": "Popup width. It remains clamped to the viewport by the component recipe.",
9959
+ "docs": "Popup width. It remains clamped to its collision boundary by the component recipe.",
9933
9960
  "docsTags": [
9934
9961
  {
9935
9962
  "name": "default",
@@ -11516,6 +11543,46 @@
11516
11543
  "getter": false,
11517
11544
  "setter": false
11518
11545
  },
11546
+ {
11547
+ "name": "textAlign",
11548
+ "type": "\"end\" | \"start\"",
11549
+ "complexType": {
11550
+ "original": "InputTextAlign",
11551
+ "resolved": "\"end\" | \"start\"",
11552
+ "references": {
11553
+ "InputTextAlign": {
11554
+ "location": "local",
11555
+ "path": "/home/runner/work/compomo/compomo/src/wc/components/Input/Input.tsx",
11556
+ "id": "src/wc/components/Input/Input.tsx::InputTextAlign"
11557
+ }
11558
+ }
11559
+ },
11560
+ "mutable": false,
11561
+ "attr": "text-align",
11562
+ "reflectToAttr": false,
11563
+ "docs": "Align the editable value; number steppers follow the same inline edge.",
11564
+ "docsTags": [
11565
+ {
11566
+ "name": "default",
11567
+ "text": "'start'"
11568
+ }
11569
+ ],
11570
+ "default": "'start'",
11571
+ "values": [
11572
+ {
11573
+ "value": "end",
11574
+ "type": "string"
11575
+ },
11576
+ {
11577
+ "value": "start",
11578
+ "type": "string"
11579
+ }
11580
+ ],
11581
+ "optional": false,
11582
+ "required": false,
11583
+ "getter": false,
11584
+ "setter": false
11585
+ },
11519
11586
  {
11520
11587
  "name": "type",
11521
11588
  "type": "\"email\" | \"number\" | \"password\" | \"search\" | \"tel\" | \"text\" | \"url\"",
@@ -12373,6 +12440,36 @@
12373
12440
  "getter": false,
12374
12441
  "setter": false
12375
12442
  },
12443
+ {
12444
+ "name": "boundary",
12445
+ "type": "HTMLElement | undefined",
12446
+ "complexType": {
12447
+ "original": "HTMLElement | undefined",
12448
+ "resolved": "HTMLElement | undefined",
12449
+ "references": {
12450
+ "HTMLElement": {
12451
+ "location": "global",
12452
+ "id": "global::HTMLElement"
12453
+ }
12454
+ }
12455
+ },
12456
+ "mutable": false,
12457
+ "reflectToAttr": false,
12458
+ "docs": "Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used.",
12459
+ "docsTags": [],
12460
+ "values": [
12461
+ {
12462
+ "type": "HTMLElement"
12463
+ },
12464
+ {
12465
+ "type": "undefined"
12466
+ }
12467
+ ],
12468
+ "optional": false,
12469
+ "required": false,
12470
+ "getter": false,
12471
+ "setter": false
12472
+ },
12376
12473
  {
12377
12474
  "name": "initialFocusVisible",
12378
12475
  "type": "boolean",
@@ -16598,6 +16695,35 @@
16598
16695
  "getter": false,
16599
16696
  "setter": false
16600
16697
  },
16698
+ {
16699
+ "name": "showFirstLastButtons",
16700
+ "type": "boolean",
16701
+ "complexType": {
16702
+ "original": "boolean",
16703
+ "resolved": "boolean",
16704
+ "references": {}
16705
+ },
16706
+ "mutable": false,
16707
+ "attr": "show-first-last-buttons",
16708
+ "reflectToAttr": false,
16709
+ "docs": "Include direct first-page and last-page controls.",
16710
+ "docsTags": [
16711
+ {
16712
+ "name": "default",
16713
+ "text": "false"
16714
+ }
16715
+ ],
16716
+ "default": "false",
16717
+ "values": [
16718
+ {
16719
+ "type": "boolean"
16720
+ }
16721
+ ],
16722
+ "optional": false,
16723
+ "required": false,
16724
+ "getter": false,
16725
+ "setter": false
16726
+ },
16601
16727
  {
16602
16728
  "name": "totalItems",
16603
16729
  "type": "number",
@@ -18066,15 +18192,17 @@
18066
18192
  "events": [
18067
18193
  {
18068
18194
  "event": "dsAction",
18069
- "detail": "{ id: string; originalEvent: MouseEvent; }",
18195
+ "detail": "PanelToolHeaderActionDetail",
18070
18196
  "bubbles": true,
18071
18197
  "complexType": {
18072
- "original": "{ id: string; originalEvent: MouseEvent }",
18073
- "resolved": "{ id: string; originalEvent: MouseEvent; }",
18198
+ "original": "PanelToolHeaderActionDetail",
18199
+ "resolved": "PanelToolHeaderActionDetail",
18074
18200
  "references": {
18075
- "MouseEvent": {
18076
- "location": "global",
18077
- "id": "global::MouseEvent"
18201
+ "PanelToolHeaderActionDetail": {
18202
+ "location": "import",
18203
+ "path": "../PanelTools/panel-tools-types",
18204
+ "id": "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolHeaderActionDetail",
18205
+ "referenceLocation": "PanelToolHeaderActionDetail"
18078
18206
  }
18079
18207
  }
18080
18208
  },
@@ -19065,17 +19193,17 @@
19065
19193
  },
19066
19194
  {
19067
19195
  "event": "dsHeaderAction",
19068
- "detail": "{ tool: string; id: string; }",
19196
+ "detail": "PanelToolsHeaderActionDetail",
19069
19197
  "bubbles": true,
19070
19198
  "complexType": {
19071
- "original": "{\n tool: PanelToolsToolId;\n id: string;\n }",
19072
- "resolved": "{ tool: string; id: string; }",
19199
+ "original": "PanelToolsHeaderActionDetail",
19200
+ "resolved": "PanelToolsHeaderActionDetail",
19073
19201
  "references": {
19074
- "PanelToolsToolId": {
19202
+ "PanelToolsHeaderActionDetail": {
19075
19203
  "location": "import",
19076
19204
  "path": "./panel-tools-types",
19077
- "id": "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolsToolId",
19078
- "referenceLocation": "PanelToolsToolId"
19205
+ "id": "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolsHeaderActionDetail",
19206
+ "referenceLocation": "PanelToolsHeaderActionDetail"
19079
19207
  }
19080
19208
  }
19081
19209
  },
@@ -20042,6 +20170,36 @@
20042
20170
  "getter": false,
20043
20171
  "setter": false
20044
20172
  },
20173
+ {
20174
+ "name": "boundary",
20175
+ "type": "HTMLElement | undefined",
20176
+ "complexType": {
20177
+ "original": "HTMLElement | undefined",
20178
+ "resolved": "HTMLElement | undefined",
20179
+ "references": {
20180
+ "HTMLElement": {
20181
+ "location": "global",
20182
+ "id": "global::HTMLElement"
20183
+ }
20184
+ }
20185
+ },
20186
+ "mutable": false,
20187
+ "reflectToAttr": false,
20188
+ "docs": "Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used.",
20189
+ "docsTags": [],
20190
+ "values": [
20191
+ {
20192
+ "type": "HTMLElement"
20193
+ },
20194
+ {
20195
+ "type": "undefined"
20196
+ }
20197
+ ],
20198
+ "optional": false,
20199
+ "required": false,
20200
+ "getter": false,
20201
+ "setter": false
20202
+ },
20045
20203
  {
20046
20204
  "name": "clearLabel",
20047
20205
  "type": "string",
@@ -27393,13 +27551,13 @@
27393
27551
  "ds-checkbox",
27394
27552
  "ds-button-unfilled",
27395
27553
  "ds-text",
27396
- "ds-icon",
27397
- "ds-tag",
27398
- "ds-loader",
27399
- "ds-skeleton",
27400
27554
  "ds-empty-state",
27401
27555
  "ds-pagination",
27402
- "ds-divider"
27556
+ "ds-divider",
27557
+ "ds-skeleton",
27558
+ "ds-icon",
27559
+ "ds-tag",
27560
+ "ds-loader"
27403
27561
  ],
27404
27562
  "dependencyGraph": {
27405
27563
  "ds-table": [
@@ -27408,13 +27566,13 @@
27408
27566
  "ds-checkbox",
27409
27567
  "ds-button-unfilled",
27410
27568
  "ds-text",
27411
- "ds-icon",
27412
- "ds-tag",
27413
- "ds-loader",
27414
- "ds-skeleton",
27415
27569
  "ds-empty-state",
27416
27570
  "ds-pagination",
27417
- "ds-divider"
27571
+ "ds-divider",
27572
+ "ds-skeleton",
27573
+ "ds-icon",
27574
+ "ds-tag",
27575
+ "ds-loader"
27418
27576
  ],
27419
27577
  "ds-menu": [
27420
27578
  "ds-text",
@@ -30370,6 +30528,43 @@
30370
30528
  "getter": false,
30371
30529
  "setter": false
30372
30530
  },
30531
+ {
30532
+ "name": "boundary",
30533
+ "type": "\"viewport\" | HTMLElement | undefined",
30534
+ "complexType": {
30535
+ "original": "AnchoredOverlayBoundary | undefined",
30536
+ "resolved": "\"viewport\" | HTMLElement | undefined",
30537
+ "references": {
30538
+ "AnchoredOverlayBoundary": {
30539
+ "location": "import",
30540
+ "path": "../../utils/anchored-overlay-boundary",
30541
+ "id": "src/wc/utils/anchored-overlay-boundary.ts::AnchoredOverlayBoundary",
30542
+ "referenceLocation": "AnchoredOverlayBoundary"
30543
+ }
30544
+ }
30545
+ },
30546
+ "mutable": false,
30547
+ "attr": "boundary",
30548
+ "reflectToAttr": false,
30549
+ "docs": "Explicit collision owner, `viewport`, or the nearest data-ds-overlay-boundary ancestor.",
30550
+ "docsTags": [],
30551
+ "values": [
30552
+ {
30553
+ "value": "viewport",
30554
+ "type": "string"
30555
+ },
30556
+ {
30557
+ "type": "HTMLElement"
30558
+ },
30559
+ {
30560
+ "type": "undefined"
30561
+ }
30562
+ ],
30563
+ "optional": false,
30564
+ "required": false,
30565
+ "getter": false,
30566
+ "setter": false
30567
+ },
30373
30568
  {
30374
30569
  "name": "delay",
30375
30570
  "type": "number | string",
@@ -31103,10 +31298,10 @@
31103
31298
  "docsTags": [
31104
31299
  {
31105
31300
  "name": "default",
31106
- "text": "'Typing...'"
31301
+ "text": "'Typing…'"
31107
31302
  }
31108
31303
  ],
31109
- "default": "'Typing...'",
31304
+ "default": "'Typing…'",
31110
31305
  "values": [
31111
31306
  {
31112
31307
  "type": "string"
@@ -31372,6 +31567,11 @@
31372
31567
  "docstring": "",
31373
31568
  "path": "src/wc/components/Input/Input.tsx"
31374
31569
  },
31570
+ "src/wc/components/Input/Input.tsx::InputTextAlign": {
31571
+ "declaration": "export type InputTextAlign = 'start' | 'end';",
31572
+ "docstring": "",
31573
+ "path": "src/wc/components/Input/Input.tsx"
31574
+ },
31375
31575
  "src/wc/components/Input/Input.tsx::InputSize": {
31376
31576
  "declaration": "export type InputSize = 'lg' | 'md' | 'sm' | 'xs';",
31377
31577
  "docstring": "",
@@ -31657,6 +31857,11 @@
31657
31857
  "docstring": "",
31658
31858
  "path": "src/wc/components/Tooltip/Tooltip.tsx"
31659
31859
  },
31860
+ "src/wc/utils/anchored-overlay-boundary.ts::AnchoredOverlayBoundary": {
31861
+ "declaration": "export type AnchoredOverlayBoundary = HTMLElement | 'viewport';",
31862
+ "docstring": "",
31863
+ "path": "src/wc/utils/anchored-overlay-boundary.ts"
31864
+ },
31660
31865
  "src/wc/components/TooltipChart/TooltipChart.tsx::TooltipChartItem": {
31661
31866
  "declaration": "export interface TooltipChartItem {\n label: string;\n value: string | number;\n color?: string;\n}",
31662
31867
  "docstring": "",
@@ -31912,6 +32117,11 @@
31912
32117
  "docstring": "",
31913
32118
  "path": "src/wc/components/PanelTools/panel-tools-types.ts"
31914
32119
  },
32120
+ "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolHeaderActionDetail": {
32121
+ "declaration": "export interface PanelToolHeaderActionDetail {\n id: string;\n originalEvent: MouseEvent;\n /** Rendered action host, suitable for anchoring an external overlay across a shadow boundary. */\n anchor: HTMLElement;\n}",
32122
+ "docstring": "",
32123
+ "path": "src/wc/components/PanelTools/panel-tools-types.ts"
32124
+ },
31915
32125
  "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolsToolId": {
31916
32126
  "declaration": "string",
31917
32127
  "docstring": "",
@@ -31927,6 +32137,11 @@
31927
32137
  "docstring": "",
31928
32138
  "path": "src/wc/components/PanelTools/panel-tools-types.ts"
31929
32139
  },
32140
+ "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolsHeaderActionDetail": {
32141
+ "declaration": "export interface PanelToolsHeaderActionDetail {\n tool: PanelToolsToolId;\n id: string;\n /** Rendered header action host. Pass this to an external overlay's element anchor prop. */\n anchor?: HTMLElement;\n}",
32142
+ "docstring": "",
32143
+ "path": "src/wc/components/PanelTools/panel-tools-types.ts"
32144
+ },
31930
32145
  "src/wc/components/PaperTexture/paper-texture-types.ts::PaperTextureConfig": {
31931
32146
  "declaration": "export interface PaperTextureConfig {\n image?: HTMLImageElement | string;\n colorFront?: string;\n colorBack?: string;\n contrast?: number;\n roughness?: number;\n fiber?: number;\n fiberSize?: number;\n crumples?: number;\n crumpleSize?: number;\n folds?: number;\n foldCount?: number;\n fade?: number;\n drops?: number;\n seed?: number;\n fit?: PaperTextureFit;\n scale?: number;\n rotation?: number;\n originX?: number;\n originY?: number;\n offsetX?: number;\n offsetY?: number;\n worldWidth?: number;\n worldHeight?: number;\n speed?: number;\n frame?: number;\n minPixelRatio?: number;\n maxPixelCount?: number;\n /** CSS opacity applied after the shader has rendered. */\n opacity?: number;\n}",
31932
32147
  "docstring": "Literal parameters forwarded to Paper Design's paper texture shader.\nColors intentionally remain ordinary CSS color strings; they are not token\nreferences and are parsed once into shader RGBA uniforms.",
@@ -43,6 +43,18 @@ export interface PanelToolsHeaderAction {
43
43
  pressed?: boolean;
44
44
  isInactive?: boolean;
45
45
  }
46
+ export interface PanelToolsHeaderActionDetail {
47
+ tool: PanelToolsToolId;
48
+ id: string;
49
+ /** Rendered header action host. Pass this to an external overlay's element anchor prop. */
50
+ anchor?: HTMLElement;
51
+ }
52
+ export interface PanelToolHeaderActionDetail {
53
+ id: string;
54
+ originalEvent: MouseEvent;
55
+ /** Rendered action host, suitable for anchoring an external overlay across a shadow boundary. */
56
+ anchor: HTMLElement;
57
+ }
46
58
  export interface PanelToolsHeaderConfig {
47
59
  title?: string;
48
60
  showBack?: boolean;
@@ -3,7 +3,7 @@ export type { PanelNavGroup, PanelNavItem, } from '../components/PanelNav/panel-
3
3
  export type { BarNavTab } from '../components/BarNav/bar-nav-types';
4
4
  export type { ShellPageContentInset, ShellPageContentSurface, } from '../components/ShellPage/shell-page-types';
5
5
  export type { ShellAppComposition, ShellNavigationConfig, ShellNavigationSelectDetail, ShellPageChromeConfig, ShellToolsConfig, } from '../components/ShellApp/shell-app-types';
6
- export type { PanelToolsHeaderAction, PanelToolsHeaderConfig, PanelToolsHeaders, PanelToolsItem, PanelToolsToolId, } from '../components/PanelTools/panel-tools-types';
6
+ export type { PanelToolsHeaderAction, PanelToolsHeaderActionDetail, PanelToolHeaderActionDetail, PanelToolsHeaderConfig, PanelToolsHeaders, PanelToolsItem, PanelToolsToolId, } from '../components/PanelTools/panel-tools-types';
7
7
  export { PANEL_TOOLS_DEFAULT_ITEMS } from '../components/PanelTools/panel-tools-types';
8
8
  export { NAV_STYLE_HINT_ATTR, readNavStyleAttr, setNavStyleHint, clearNavStyleHint, } from './nav-chrome';
9
9
  export type { MenuPlacement } from '../components/Menu/menu-placement';
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/wc/components/PanelTools/panel-tools-types.ts", "../../../src/wc/shell/nav-chrome.ts", "../../../src/wc/components/Menu/menu-placement.ts", "../../../src/wc/shell/shell-gradient-presets.ts", "../../../src/wc/shell/shell-responsive.ts"],
4
- "sourcesContent": ["/** Application-owned tool id for the shell rail and responsive tool views. */\nexport type PanelToolsToolId = string;\n\n/** Canonical Motive shell recipe used when item metadata is omitted. */\nexport type CanonicalPanelToolsToolId =\n | 'search'\n | 'messages'\n | 'agents'\n | 'stacks'\n | 'activity'\n | 'help';\n\nexport const PANEL_TOOLS_TOOL_IDS: CanonicalPanelToolsToolId[] = [\n 'agents',\n 'messages',\n 'activity',\n 'search',\n 'stacks',\n 'help',\n];\n\n/** Rail header slot \u2014 mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: CanonicalPanelToolsToolId = 'agents';\n\n/** Rail footer slot \u2014 flush to the bottom of the tools column. */\nexport const PANEL_TOOLS_FOOTER_TOOL_ID: CanonicalPanelToolsToolId = 'help';\n\nexport const PANEL_TOOLS_LABELS: Record<CanonicalPanelToolsToolId, string> = {\n search: 'Search',\n messages: 'Messages',\n stacks: 'Stacks',\n activity: 'Activity',\n agents: 'Agents',\n help: 'Help & Support',\n};\n\nexport const PANEL_TOOLS_SHORTCUTS: Partial<Record<CanonicalPanelToolsToolId, string>> = {\n search: 'K',\n agents: 'A',\n messages: 'M',\n stacks: 'S',\n activity: 'N',\n help: '/',\n};\n\nexport interface PanelToolsItem {\n id: PanelToolsToolId;\n /** Icon name for <ds-icon>. */\n icon: string;\n /** Visible and accessible fallback label for custom tool ids. */\n label?: string;\n /** Explicit rail region; canonical Agents/Help placement is the fallback. */\n railPlacement?: 'header' | 'body' | 'footer';\n /** Stable ordering within the selected rail region. */\n order?: number;\n /** Optional shortcut label displayed by the tooltip. */\n shortcutKey?: string;\n /** Mobile destination recipe; canonical ids retain their explicit defaults. */\n mobileDestination?: 'search' | 'inbox' | 'activity' | 'messages' | 'agents' | 'help';\n /** Whether this rail button is currently pressed/active. */\n selected?: boolean;\n /** Show a notification dot. */\n dot?: boolean;\n isInactive?: boolean;\n ariaLabel?: string;\n}\n\n/** Canonical shell recipe used by Lab and by managed ShellApp examples. */\nexport const PANEL_TOOLS_DEFAULT_ITEMS: PanelToolsItem[] = [\n {\n id: 'agents',\n icon: 'AI',\n label: PANEL_TOOLS_LABELS.agents,\n railPlacement: 'header',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.agents,\n mobileDestination: 'agents',\n },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: PANEL_TOOLS_LABELS.messages,\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.messages,\n mobileDestination: 'messages',\n },\n {\n id: 'activity',\n icon: 'Bell',\n label: PANEL_TOOLS_LABELS.activity,\n order: 1,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.activity,\n mobileDestination: 'activity',\n },\n {\n id: 'search',\n icon: 'MagnifyingGlass',\n label: PANEL_TOOLS_LABELS.search,\n order: 2,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.search,\n mobileDestination: 'search',\n },\n {\n id: 'help',\n icon: 'CircleQuestion',\n label: PANEL_TOOLS_LABELS.help,\n railPlacement: 'footer',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.help,\n mobileDestination: 'help',\n },\n];\n\nexport interface PanelToolsHeaderAction {\n id: string;\n icon: string;\n ariaLabel: string;\n triggerId?: string;\n controls?: string;\n expanded?: boolean;\n haspopup?: 'menu' | 'dialog' | 'listbox' | 'tree' | 'grid';\n pressed?: boolean;\n isInactive?: boolean;\n}\n\nexport interface 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", "/** Nav chrome style slot \u2014 dashboard vs settings. Colors unified for now; texture hooks use the class. */\nexport type NavChromeStyle = 'dashboard' | 'settings';\n\n/** Document hint for first paint before framework props land. */\nexport const NAV_STYLE_HINT_ATTR = 'data-nav-style';\n\nexport function readNavStyleAttr(attr: string | null): NavChromeStyle | undefined {\n if (attr === 'dashboard' || attr === 'settings') return attr;\n return undefined;\n}\n\nexport function setNavStyleHint(style: NavChromeStyle): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute(NAV_STYLE_HINT_ATTR, style);\n}\n\nexport function clearNavStyleHint(): void {\n if (typeof document === 'undefined') return;\n document.documentElement.removeAttribute(NAV_STYLE_HINT_ATTR);\n}\n\nexport function resolveNavChromeStyle(\n styleProp: NavChromeStyle,\n hostAttr: string | null,\n docHint?: string | null,\n): NavChromeStyle {\n const fromHost = readNavStyleAttr(hostAttr);\n if (fromHost) return fromHost;\n\n const hint =\n docHint !== undefined\n ? docHint\n : typeof document !== 'undefined'\n ? document.documentElement.getAttribute(NAV_STYLE_HINT_ATTR)\n : null;\n const fromHint = readNavStyleAttr(hint);\n if (fromHint) return fromHint;\n\n return styleProp;\n}\n\nexport function shouldResyncNavChromeStyle(\n renderedStyle: NavChromeStyle,\n style: NavChromeStyle,\n): boolean {\n return renderedStyle !== style;\n}\n", "import type { ChoicePopupAnchorAlignment } from '../../utils/choice-popup-alignment';\nimport type { MenuAlign, MenuSide } from './menu-position';\n\n/** Placement props bindable on `ds-menu` (side, align, offsets). */\nexport interface MenuPlacement {\n side: MenuSide;\n align: MenuAlign;\n anchorAlignment: ChoicePopupAnchorAlignment;\n sideOffset: number | string;\n alignOffset: number | string;\n}\n\n/**\n * Canonical `ds-menu` placement for the **panel-nav footer user menu**.\n * Anchor from `dsNavUserAction` detail `{ anchor }` (id `ds-panel-nav-user-menu-anchor`).\n *\n * Not for BarNav overflow menus \u2014 those use `side=\"bottom\"` / `align=\"end\"` internally.\n * `align: 'end'` bottom-aligns the last choice cell on the anchor; the side offset nudges into the content area:\n * - `sideOffset` space-100 + space-050 (12px): 4px past the panel-nav outer edge (anchor is ~8px inset).\n * - `anchorAlignment: 'choice-cell'`: the shared section inset puts the last row edge on the footer user row.\n */\nexport const PANEL_NAV_USER_MENU_PLACEMENT = {\n side: 'right',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n\n/**\n * Canonical placement for a menu opened by a PanelTools header action.\n * Matches BarNav overflow: the 32px trigger is 8px inside the 48px header, so\n * a 12px side offset places the popup 4px below the header edge. Choice-cell\n * alignment keeps the final menu item edge aligned with the trigger.\n */\nexport const PANEL_TOOLS_HEADER_MENU_PLACEMENT = {\n side: 'bottom',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n", "/** Built-in shell chrome wash presets. */\nexport type ShellGradientPreset = 'none' | 'cool' | 'neutral' | 'warm' | 'fresh';\n\nexport const SHELL_GRADIENT_PRESETS: ShellGradientPreset[] = [\n 'none',\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Wash presets shown after the `none` option in pickers. */\nexport const SHELL_GRADIENT_WASH_PRESETS: Exclude<ShellGradientPreset, 'none'>[] = [\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Default wash when `gradient-preset` is omitted. */\nexport const DEFAULT_SHELL_GRADIENT_PRESET: ShellGradientPreset = 'neutral';\n\nexport const SHELL_GRADIENT_PRESET_LABELS: Record<ShellGradientPreset, string> = {\n none: 'None',\n cool: 'Cool',\n neutral: 'Neutral',\n warm: 'Warm',\n fresh: 'Fresh',\n};\n\nexport interface ShellGradientStop {\n color: string;\n position: number;\n}\n\nexport interface ShellGradientRecipe {\n opacity: number;\n stops: readonly ShellGradientStop[];\n}\n\nexport interface ShellGradientPickerPreview {\n backgroundColor: string;\n backgroundImage?: string;\n opacity?: number;\n}\n\nexport interface ShellGradientPickerOption {\n value: ShellGradientPreset;\n label: string;\n preview: ShellGradientPickerPreview;\n}\n\nexport interface ShellGradientPickerSection {\n options: ShellGradientPickerOption[];\n}\n\nconst SHELL_GRADIENT_RECIPES: Record<Exclude<ShellGradientPreset, 'none'>, ShellGradientRecipe> = {\n cool: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-blue-strong-background)', position: 100 },\n ],\n },\n neutral: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-grey-strong-background)', position: 100 },\n ],\n },\n warm: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-yellow-strong-background)', position: 100 },\n ],\n },\n fresh: {\n opacity: 0.4,\n stops: [\n { color: 'var(--color-color-intent-cyan-faint-background)', position: 0 },\n { color: 'var(--color-background-transparent)', position: 47 },\n { color: 'var(--color-background-transparent)', position: 58 },\n { color: 'var(--color-color-intent-red-faint-background)', position: 83 },\n { color: 'var(--color-color-intent-pink-faint-background)', position: 100 },\n ],\n },\n};\n\nconst GRADIENT_GEOMETRY = '100% 100% at 0% 0%';\n\nexport function shellGradientPresetStopToken(preset: ShellGradientPreset): string | null {\n if (preset === 'none') return null;\n const stops = SHELL_GRADIENT_RECIPES[preset].stops;\n return stops[stops.length - 1]?.color ?? null;\n}\n\nexport function shellGradientPresetRecipe(preset: ShellGradientPreset): ShellGradientRecipe | null {\n const normalized = normalizeShellGradientPreset(preset);\n return normalized === 'none' ? null : SHELL_GRADIENT_RECIPES[normalized];\n}\n\nexport function shellGradientPresetOpacity(preset: ShellGradientPreset): string {\n return String(shellGradientPresetRecipe(preset)?.opacity ?? 0);\n}\n\nexport function isShellGradientPreset(value: string): value is ShellGradientPreset {\n return (SHELL_GRADIENT_PRESETS as string[]).includes(value);\n}\n\n/**\n * Coerce unknown/absent presets to the default. Runtime values escape the\n * type: removing the reflected `gradient-preset` attribute (e.g. an Angular\n * `[attr.gradient-preset]=\"null\"` binding) drives the prop to null past its\n * field default \u2014 without normalization the stop lookup interpolates the\n * literal string \"undefined\" into CSS and the wash silently disappears.\n */\nexport function normalizeShellGradientPreset(\n value: string | null | undefined,\n): ShellGradientPreset {\n return value != null && isShellGradientPreset(value) ? value : DEFAULT_SHELL_GRADIENT_PRESET;\n}\n\n/** Radial wash for a preset \u2014 transparent at top-left into the intent stop. `none` returns no image. */\nexport function buildShellRadialGradientForPreset(preset: ShellGradientPreset): string {\n const normalized = normalizeShellGradientPreset(preset);\n if (normalized === 'none') return 'none';\n\n return buildShellRadialGradientFromStops(SHELL_GRADIENT_RECIPES[normalized].stops);\n}\n\n/** Build the production shell geometry from an ordered set of design-time stops. */\nexport function buildShellRadialGradientFromStops(stops: readonly ShellGradientStop[]): string {\n const serialized = stops.map(stop => `${stop.color} ${stop.position}%`).join(', ');\n return `radial-gradient(${GRADIENT_GEOMETRY}, ${serialized})`;\n}\n\n/** Generic SwatchPicker sections for the fixed shell appearance presets. */\nexport function shellGradientPickerSections(): ShellGradientPickerSection[] {\n return [\n {\n options: [{\n value: 'none',\n label: SHELL_GRADIENT_PRESET_LABELS.none,\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n },\n }],\n },\n {\n options: SHELL_GRADIENT_WASH_PRESETS.map(preset => ({\n value: preset,\n label: SHELL_GRADIENT_PRESET_LABELS[preset],\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n backgroundImage: buildShellRadialGradientForPreset(preset),\n opacity: Number(shellGradientPresetOpacity(preset)),\n },\n })),\n },\n ];\n}\n", "import type { PanelToolsToolId } from '../components/PanelTools/panel-tools-types';\n\nexport type ShellResponsiveMode = 'desktop' | 'tablet' | 'mobile';\nexport type MobileDestination =\n | 'area'\n | 'search'\n | 'inbox'\n | 'activity'\n | 'messages'\n | 'agents'\n | 'help';\nexport type ShellInboxToolId = PanelToolsToolId;\n\nexport const SHELL_DESKTOP_BREAKPOINT = 1200;\nexport const SHELL_MOBILE_BREAKPOINT = 768;\nexport const SHELL_DEFAULT_INBOX_TOOL: ShellInboxToolId = 'activity';\n\nexport function resolveShellResponsiveMode(width: number): ShellResponsiveMode {\n if (width >= SHELL_DESKTOP_BREAKPOINT) return 'desktop';\n if (width >= SHELL_MOBILE_BREAKPOINT) return 'tablet';\n return 'mobile';\n}\n\nexport function resolveManagedShellPageCapacity(\n mode: ShellResponsiveMode\n): 'roomy' | 'compact' | 'constrained' {\n return mode === 'desktop' ? 'roomy' : 'compact';\n}\n\nexport function shellMobileDestinationForTool(\n open: boolean,\n tool: PanelToolsToolId | ''\n): MobileDestination {\n if (!open || !tool) return 'area';\n if (tool === 'help') return 'help';\n if (tool === 'search') return 'search';\n if (tool === 'messages') return 'messages';\n if (tool === 'agents') return 'agents';\n return 'inbox';\n}\n\n/** Explicit item metadata wins over the legacy canonical Stacks/Activity grouping. */\nexport function itemUsesShellInbox(item: {\n id: PanelToolsToolId;\n mobileDestination?: MobileDestination;\n}): boolean {\n return item.mobileDestination === 'inbox' ||\n (item.mobileDestination === undefined && isShellInboxTool(item.id));\n}\n\nexport function isShellInboxTool(tool: string): tool is ShellInboxToolId {\n return tool === 'stacks' || tool === 'activity';\n}\n\nexport function resolveAvailableInboxTool(\n preferred: string,\n available: readonly PanelToolsToolId[]\n): ShellInboxToolId | '' {\n const inbox = available.filter(isShellInboxTool);\n if (isShellInboxTool(preferred) && inbox.includes(preferred)) return preferred;\n if (inbox.includes(SHELL_DEFAULT_INBOX_TOOL)) return SHELL_DEFAULT_INBOX_TOOL;\n return inbox[0] ?? '';\n}\n\n/** Active-destination reselects are inert unless they also dismiss the Menu pane. */\nexport function shouldEmitMobileDestinationChange(\n active: MobileDestination,\n next: MobileDestination,\n navigationOpen: boolean\n): boolean {\n return navigationOpen || active !== next;\n}\n"],
4
+ "sourcesContent": ["/** Application-owned tool id for the shell rail and responsive tool views. */\nexport type PanelToolsToolId = string;\n\n/** Canonical Motive shell recipe used when item metadata is omitted. */\nexport type CanonicalPanelToolsToolId =\n | 'search'\n | 'messages'\n | 'agents'\n | 'stacks'\n | 'activity'\n | 'help';\n\nexport const PANEL_TOOLS_TOOL_IDS: CanonicalPanelToolsToolId[] = [\n 'agents',\n 'messages',\n 'activity',\n 'search',\n 'stacks',\n 'help',\n];\n\n/** Rail header slot \u2014 mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: CanonicalPanelToolsToolId = 'agents';\n\n/** Rail footer slot \u2014 flush to the bottom of the tools column. */\nexport const PANEL_TOOLS_FOOTER_TOOL_ID: CanonicalPanelToolsToolId = 'help';\n\nexport const PANEL_TOOLS_LABELS: Record<CanonicalPanelToolsToolId, string> = {\n search: 'Search',\n messages: 'Messages',\n stacks: 'Stacks',\n activity: 'Activity',\n agents: 'Agents',\n help: 'Help & Support',\n};\n\nexport const PANEL_TOOLS_SHORTCUTS: Partial<Record<CanonicalPanelToolsToolId, string>> = {\n search: 'K',\n agents: 'A',\n messages: 'M',\n stacks: 'S',\n activity: 'N',\n help: '/',\n};\n\nexport interface PanelToolsItem {\n id: PanelToolsToolId;\n /** Icon name for <ds-icon>. */\n icon: string;\n /** Visible and accessible fallback label for custom tool ids. */\n label?: string;\n /** Explicit rail region; canonical Agents/Help placement is the fallback. */\n railPlacement?: 'header' | 'body' | 'footer';\n /** Stable ordering within the selected rail region. */\n order?: number;\n /** Optional shortcut label displayed by the tooltip. */\n shortcutKey?: string;\n /** Mobile destination recipe; canonical ids retain their explicit defaults. */\n mobileDestination?: 'search' | 'inbox' | 'activity' | 'messages' | 'agents' | 'help';\n /** Whether this rail button is currently pressed/active. */\n selected?: boolean;\n /** Show a notification dot. */\n dot?: boolean;\n isInactive?: boolean;\n ariaLabel?: string;\n}\n\n/** Canonical shell recipe used by Lab and by managed ShellApp examples. */\nexport const PANEL_TOOLS_DEFAULT_ITEMS: PanelToolsItem[] = [\n {\n id: 'agents',\n icon: 'AI',\n label: PANEL_TOOLS_LABELS.agents,\n railPlacement: 'header',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.agents,\n mobileDestination: 'agents',\n },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: PANEL_TOOLS_LABELS.messages,\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.messages,\n mobileDestination: 'messages',\n },\n {\n id: 'activity',\n icon: 'Bell',\n label: PANEL_TOOLS_LABELS.activity,\n order: 1,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.activity,\n mobileDestination: 'activity',\n },\n {\n id: 'search',\n icon: 'MagnifyingGlass',\n label: PANEL_TOOLS_LABELS.search,\n order: 2,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.search,\n mobileDestination: 'search',\n },\n {\n id: 'help',\n icon: 'CircleQuestion',\n label: PANEL_TOOLS_LABELS.help,\n railPlacement: 'footer',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.help,\n mobileDestination: 'help',\n },\n];\n\nexport interface PanelToolsHeaderAction {\n id: string;\n icon: string;\n ariaLabel: string;\n triggerId?: string;\n controls?: string;\n expanded?: boolean;\n haspopup?: 'menu' | 'dialog' | 'listbox' | 'tree' | 'grid';\n pressed?: boolean;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsHeaderActionDetail {\n tool: PanelToolsToolId;\n id: string;\n /** Rendered header action host. Pass this to an external overlay's element anchor prop. */\n anchor?: HTMLElement;\n}\n\nexport interface PanelToolHeaderActionDetail {\n id: string;\n originalEvent: MouseEvent;\n /** Rendered action host, suitable for anchoring an external overlay across a shadow boundary. */\n anchor: HTMLElement;\n}\n\nexport interface PanelToolsHeaderConfig {\n title?: string;\n showBack?: boolean;\n backIcon?: string;\n backAriaLabel?: string;\n actions?: PanelToolsHeaderAction[];\n}\n\n/** Per-tool header state. The application replaces the object when a tool changes depth or actions. */\nexport type PanelToolsHeaders = Partial<Record<PanelToolsToolId, PanelToolsHeaderConfig>>;\n", "/** Nav chrome style slot \u2014 dashboard vs settings. Colors unified for now; texture hooks use the class. */\nexport type NavChromeStyle = 'dashboard' | 'settings';\n\n/** Document hint for first paint before framework props land. */\nexport const NAV_STYLE_HINT_ATTR = 'data-nav-style';\n\nexport function readNavStyleAttr(attr: string | null): NavChromeStyle | undefined {\n if (attr === 'dashboard' || attr === 'settings') return attr;\n return undefined;\n}\n\nexport function setNavStyleHint(style: NavChromeStyle): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute(NAV_STYLE_HINT_ATTR, style);\n}\n\nexport function clearNavStyleHint(): void {\n if (typeof document === 'undefined') return;\n document.documentElement.removeAttribute(NAV_STYLE_HINT_ATTR);\n}\n\nexport function resolveNavChromeStyle(\n styleProp: NavChromeStyle,\n hostAttr: string | null,\n docHint?: string | null,\n): NavChromeStyle {\n const fromHost = readNavStyleAttr(hostAttr);\n if (fromHost) return fromHost;\n\n const hint =\n docHint !== undefined\n ? docHint\n : typeof document !== 'undefined'\n ? document.documentElement.getAttribute(NAV_STYLE_HINT_ATTR)\n : null;\n const fromHint = readNavStyleAttr(hint);\n if (fromHint) return fromHint;\n\n return styleProp;\n}\n\nexport function shouldResyncNavChromeStyle(\n renderedStyle: NavChromeStyle,\n style: NavChromeStyle,\n): boolean {\n return renderedStyle !== style;\n}\n", "import type { ChoicePopupAnchorAlignment } from '../../utils/choice-popup-alignment';\nimport type { MenuAlign, MenuSide } from './menu-position';\n\n/** Placement props bindable on `ds-menu` (side, align, offsets). */\nexport interface MenuPlacement {\n side: MenuSide;\n align: MenuAlign;\n anchorAlignment: ChoicePopupAnchorAlignment;\n sideOffset: number | string;\n alignOffset: number | string;\n}\n\n/**\n * Canonical `ds-menu` placement for the **panel-nav footer user menu**.\n * Anchor from `dsNavUserAction` detail `{ anchor }` (id `ds-panel-nav-user-menu-anchor`).\n *\n * Not for BarNav overflow menus \u2014 those use `side=\"bottom\"` / `align=\"end\"` internally.\n * `align: 'end'` bottom-aligns the last choice cell on the anchor; the side offset nudges into the content area:\n * - `sideOffset` space-100 + space-050 (12px): 4px past the panel-nav outer edge (anchor is ~8px inset).\n * - `anchorAlignment: 'choice-cell'`: the shared section inset puts the last row edge on the footer user row.\n */\nexport const PANEL_NAV_USER_MENU_PLACEMENT = {\n side: 'right',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n\n/**\n * Canonical placement for a menu opened by a PanelTools header action.\n * Matches BarNav overflow: the 32px trigger is 8px inside the 48px header, so\n * a 12px side offset places the popup 4px below the header edge. Choice-cell\n * alignment keeps the final menu item edge aligned with the trigger.\n */\nexport const PANEL_TOOLS_HEADER_MENU_PLACEMENT = {\n side: 'bottom',\n align: 'end',\n anchorAlignment: 'choice-cell',\n sideOffset: 'calc(var(--dimension-space-100) + var(--dimension-space-050))',\n alignOffset: 0,\n} as const satisfies MenuPlacement;\n", "/** Built-in shell chrome wash presets. */\nexport type ShellGradientPreset = 'none' | 'cool' | 'neutral' | 'warm' | 'fresh';\n\nexport const SHELL_GRADIENT_PRESETS: ShellGradientPreset[] = [\n 'none',\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Wash presets shown after the `none` option in pickers. */\nexport const SHELL_GRADIENT_WASH_PRESETS: Exclude<ShellGradientPreset, 'none'>[] = [\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Default wash when `gradient-preset` is omitted. */\nexport const DEFAULT_SHELL_GRADIENT_PRESET: ShellGradientPreset = 'neutral';\n\nexport const SHELL_GRADIENT_PRESET_LABELS: Record<ShellGradientPreset, string> = {\n none: 'None',\n cool: 'Cool',\n neutral: 'Neutral',\n warm: 'Warm',\n fresh: 'Fresh',\n};\n\nexport interface ShellGradientStop {\n color: string;\n position: number;\n}\n\nexport interface ShellGradientRecipe {\n opacity: number;\n stops: readonly ShellGradientStop[];\n}\n\nexport interface ShellGradientPickerPreview {\n backgroundColor: string;\n backgroundImage?: string;\n opacity?: number;\n}\n\nexport interface ShellGradientPickerOption {\n value: ShellGradientPreset;\n label: string;\n preview: ShellGradientPickerPreview;\n}\n\nexport interface ShellGradientPickerSection {\n options: ShellGradientPickerOption[];\n}\n\nconst SHELL_GRADIENT_RECIPES: Record<Exclude<ShellGradientPreset, 'none'>, ShellGradientRecipe> = {\n cool: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-blue-strong-background)', position: 100 },\n ],\n },\n neutral: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-grey-strong-background)', position: 100 },\n ],\n },\n warm: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-yellow-strong-background)', position: 100 },\n ],\n },\n fresh: {\n opacity: 0.4,\n stops: [\n { color: 'var(--color-color-intent-cyan-faint-background)', position: 0 },\n { color: 'var(--color-background-transparent)', position: 47 },\n { color: 'var(--color-background-transparent)', position: 58 },\n { color: 'var(--color-color-intent-red-faint-background)', position: 83 },\n { color: 'var(--color-color-intent-pink-faint-background)', position: 100 },\n ],\n },\n};\n\nconst GRADIENT_GEOMETRY = '100% 100% at 0% 0%';\n\nexport function shellGradientPresetStopToken(preset: ShellGradientPreset): string | null {\n if (preset === 'none') return null;\n const stops = SHELL_GRADIENT_RECIPES[preset].stops;\n return stops[stops.length - 1]?.color ?? null;\n}\n\nexport function shellGradientPresetRecipe(preset: ShellGradientPreset): ShellGradientRecipe | null {\n const normalized = normalizeShellGradientPreset(preset);\n return normalized === 'none' ? null : SHELL_GRADIENT_RECIPES[normalized];\n}\n\nexport function shellGradientPresetOpacity(preset: ShellGradientPreset): string {\n return String(shellGradientPresetRecipe(preset)?.opacity ?? 0);\n}\n\nexport function isShellGradientPreset(value: string): value is ShellGradientPreset {\n return (SHELL_GRADIENT_PRESETS as string[]).includes(value);\n}\n\n/**\n * Coerce unknown/absent presets to the default. Runtime values escape the\n * type: removing the reflected `gradient-preset` attribute (e.g. an Angular\n * `[attr.gradient-preset]=\"null\"` binding) drives the prop to null past its\n * field default \u2014 without normalization the stop lookup interpolates the\n * literal string \"undefined\" into CSS and the wash silently disappears.\n */\nexport function normalizeShellGradientPreset(\n value: string | null | undefined,\n): ShellGradientPreset {\n return value != null && isShellGradientPreset(value) ? value : DEFAULT_SHELL_GRADIENT_PRESET;\n}\n\n/** Radial wash for a preset \u2014 transparent at top-left into the intent stop. `none` returns no image. */\nexport function buildShellRadialGradientForPreset(preset: ShellGradientPreset): string {\n const normalized = normalizeShellGradientPreset(preset);\n if (normalized === 'none') return 'none';\n\n return buildShellRadialGradientFromStops(SHELL_GRADIENT_RECIPES[normalized].stops);\n}\n\n/** Build the production shell geometry from an ordered set of design-time stops. */\nexport function buildShellRadialGradientFromStops(stops: readonly ShellGradientStop[]): string {\n const serialized = stops.map(stop => `${stop.color} ${stop.position}%`).join(', ');\n return `radial-gradient(${GRADIENT_GEOMETRY}, ${serialized})`;\n}\n\n/** Generic SwatchPicker sections for the fixed shell appearance presets. */\nexport function shellGradientPickerSections(): ShellGradientPickerSection[] {\n return [\n {\n options: [{\n value: 'none',\n label: SHELL_GRADIENT_PRESET_LABELS.none,\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n },\n }],\n },\n {\n options: SHELL_GRADIENT_WASH_PRESETS.map(preset => ({\n value: preset,\n label: SHELL_GRADIENT_PRESET_LABELS[preset],\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n backgroundImage: buildShellRadialGradientForPreset(preset),\n opacity: Number(shellGradientPresetOpacity(preset)),\n },\n })),\n },\n ];\n}\n", "import type { PanelToolsToolId } from '../components/PanelTools/panel-tools-types';\n\nexport type ShellResponsiveMode = 'desktop' | 'tablet' | 'mobile';\nexport type MobileDestination =\n | 'area'\n | 'search'\n | 'inbox'\n | 'activity'\n | 'messages'\n | 'agents'\n | 'help';\nexport type ShellInboxToolId = PanelToolsToolId;\n\nexport const SHELL_DESKTOP_BREAKPOINT = 1200;\nexport const SHELL_MOBILE_BREAKPOINT = 768;\nexport const SHELL_DEFAULT_INBOX_TOOL: ShellInboxToolId = 'activity';\n\nexport function resolveShellResponsiveMode(width: number): ShellResponsiveMode {\n if (width >= SHELL_DESKTOP_BREAKPOINT) return 'desktop';\n if (width >= SHELL_MOBILE_BREAKPOINT) return 'tablet';\n return 'mobile';\n}\n\nexport function resolveManagedShellPageCapacity(\n mode: ShellResponsiveMode\n): 'roomy' | 'compact' | 'constrained' {\n return mode === 'desktop' ? 'roomy' : 'compact';\n}\n\nexport function shellMobileDestinationForTool(\n open: boolean,\n tool: PanelToolsToolId | ''\n): MobileDestination {\n if (!open || !tool) return 'area';\n if (tool === 'help') return 'help';\n if (tool === 'search') return 'search';\n if (tool === 'messages') return 'messages';\n if (tool === 'agents') return 'agents';\n return 'inbox';\n}\n\n/** Explicit item metadata wins over the legacy canonical Stacks/Activity grouping. */\nexport function itemUsesShellInbox(item: {\n id: PanelToolsToolId;\n mobileDestination?: MobileDestination;\n}): boolean {\n return item.mobileDestination === 'inbox' ||\n (item.mobileDestination === undefined && isShellInboxTool(item.id));\n}\n\nexport function isShellInboxTool(tool: string): tool is ShellInboxToolId {\n return tool === 'stacks' || tool === 'activity';\n}\n\nexport function resolveAvailableInboxTool(\n preferred: string,\n available: readonly PanelToolsToolId[]\n): ShellInboxToolId | '' {\n const inbox = available.filter(isShellInboxTool);\n if (isShellInboxTool(preferred) && inbox.includes(preferred)) return preferred;\n if (inbox.includes(SHELL_DEFAULT_INBOX_TOOL)) return SHELL_DEFAULT_INBOX_TOOL;\n return inbox[0] ?? '';\n}\n\n/** Active-destination reselects are inert unless they also dismiss the Menu pane. */\nexport function shouldEmitMobileDestinationChange(\n active: MobileDestination,\n next: MobileDestination,\n navigationOpen: boolean\n): boolean {\n return navigationOpen || active !== next;\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,6 @@
1
1
  export type AnchoredSide = 'top' | 'right' | 'bottom' | 'left';
2
2
  export type AnchoredAlign = 'start' | 'center' | 'end';
3
+ export type AnchoredCollisionRect = Pick<DOMRectReadOnly, 'top' | 'left' | 'right' | 'bottom' | 'width' | 'height'>;
3
4
  export interface AnchoredPositionInput {
4
5
  anchorRect: Pick<DOMRectReadOnly, 'top' | 'left' | 'right' | 'bottom' | 'width' | 'height'>;
5
6
  popupWidth: number;
@@ -11,6 +12,8 @@ export interface AnchoredPositionInput {
11
12
  viewportPadPx: number;
12
13
  viewportWidth: number;
13
14
  viewportHeight: number;
15
+ /** Optional page or panel collision rectangle in viewport-fixed coordinates. */
16
+ collisionRect?: AnchoredCollisionRect;
14
17
  }
15
18
  export interface AnchoredPosition {
16
19
  x: number;
@@ -24,9 +27,10 @@ export interface AnchoredPosition {
24
27
  * Pure viewport-fixed anchored-popup layout math shared by every element-anchored
25
28
  * overlay: menus, selects, tooltips, and anchored toasts.
26
29
  *
27
- * `side` is preferred. When the popup spills past the padded viewport there and
30
+ * `side` is preferred. When the popup spills past the padded collision boundary and
28
31
  * the opposite side spills less, placement flips on the main axis; the result is
29
- * then clamped into the viewport on both axes. Cross-axis `align` is applied
32
+ * then clamped into that boundary on both axes. The viewport is the fallback when
33
+ * no page or panel collision rectangle is supplied. Cross-axis `align` is applied
30
34
  * before clamping so `alignOffsetPx` stays an additive nudge.
31
35
  *
32
36
  * Callers own their own anchor semantics — inner-cell alignment offsets and