@ds-mo/ui 14.18.0 → 14.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) 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 +44 -14
  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-panel-tool-header.d.ts +3 -8
  12. package/dist/angular/ds-panel-tools.d.ts +3 -8
  13. package/dist/angular/ds-select.d.ts +1 -1
  14. package/dist/angular/ds-select.js +3 -3
  15. package/dist/angular/ds-tooltip.d.ts +1 -1
  16. package/dist/angular/ds-tooltip.js +3 -3
  17. package/dist/components/ds-agent-activity.js +1 -1
  18. package/dist/components/ds-agent-questionnaire.js +1 -1
  19. package/dist/components/ds-agent-response.js +1 -1
  20. package/dist/components/ds-agent-source-list.js +1 -1
  21. package/dist/components/ds-agent-tool-call.js +1 -1
  22. package/dist/components/ds-attachment-list.js +1 -1
  23. package/dist/components/ds-badge.js +1 -1
  24. package/dist/components/ds-banner.js +1 -1
  25. package/dist/components/ds-banner.js.map +1 -1
  26. package/dist/components/ds-bar-action.js +1 -1
  27. package/dist/components/ds-bar-action.js.map +1 -1
  28. package/dist/components/ds-bar-nav.js +1 -1
  29. package/dist/components/ds-bar-title.js +1 -1
  30. package/dist/components/ds-bar-workflow.js +1 -1
  31. package/dist/components/ds-bar-workflow.js.map +1 -1
  32. package/dist/components/ds-breadcrumb.js +1 -1
  33. package/dist/components/ds-button-filled.js +1 -1
  34. package/dist/components/ds-button-unfilled.js +1 -1
  35. package/dist/components/ds-card-chart.js +1 -1
  36. package/dist/components/ds-card-overview.js +1 -1
  37. package/dist/components/ds-card-setting.js +1 -1
  38. package/dist/components/ds-chart-legend.js +1 -1
  39. package/dist/components/ds-chart.js +1 -1
  40. package/dist/components/ds-checkbox.js +1 -1
  41. package/dist/components/ds-chip.js +1 -1
  42. package/dist/components/ds-code-block.js +1 -1
  43. package/dist/components/ds-conversation-list-item.js +1 -1
  44. package/dist/components/ds-conversation-list-section.js +1 -1
  45. package/dist/components/ds-conversation-list.js +1 -1
  46. package/dist/components/ds-conversation-list.js.map +1 -1
  47. package/dist/components/ds-divider.js +1 -1
  48. package/dist/components/ds-empty-state.js +1 -1
  49. package/dist/components/ds-field.js +1 -1
  50. package/dist/components/ds-filter-menu.js +1 -1
  51. package/dist/components/ds-input.js +1 -1
  52. package/dist/components/ds-markdown.js +1 -1
  53. package/dist/components/ds-menu.js +1 -1
  54. package/dist/components/ds-message-actions.js +1 -1
  55. package/dist/components/ds-message-bubble.js +1 -1
  56. package/dist/components/ds-message-composer.js +1 -1
  57. package/dist/components/ds-message-composer.js.map +1 -1
  58. package/dist/components/ds-message-scroller.js +1 -1
  59. package/dist/components/ds-message.js +1 -1
  60. package/dist/components/ds-mobile-bar-nav.js +1 -1
  61. package/dist/components/ds-mobile-header.js +1 -1
  62. package/dist/components/ds-mobile-section-switcher.js +1 -1
  63. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  64. package/dist/components/ds-modal.js +1 -1
  65. package/dist/components/ds-pagination.js +1 -1
  66. package/dist/components/ds-panel-nav.js +1 -1
  67. package/dist/components/ds-panel-sub-nav.js +1 -1
  68. package/dist/components/ds-panel-tool-header.js +1 -1
  69. package/dist/components/ds-panel-tool-search.js +1 -1
  70. package/dist/components/ds-panel-tools.js +1 -1
  71. package/dist/components/ds-paper-texture.js +1 -1
  72. package/dist/components/ds-radio.js +1 -1
  73. package/dist/components/ds-scroll-overlay.js +1 -1
  74. package/dist/components/ds-select.js +1 -1
  75. package/dist/components/ds-shell-app.js +1 -1
  76. package/dist/components/ds-shell-app.js.map +1 -1
  77. package/dist/components/ds-shell-page.js +1 -1
  78. package/dist/components/ds-shell-tools.js +1 -1
  79. package/dist/components/ds-skeleton.js +1 -1
  80. package/dist/components/ds-slider.js +1 -1
  81. package/dist/components/ds-swatch-picker.js +1 -1
  82. package/dist/components/ds-switch.js +1 -1
  83. package/dist/components/ds-tab-group.js +1 -1
  84. package/dist/components/ds-table-filter.js +1 -1
  85. package/dist/components/ds-table-saved-views.js +1 -1
  86. package/dist/components/ds-table-sort.js +1 -1
  87. package/dist/components/ds-table-toolbar.js +1 -1
  88. package/dist/components/ds-table.js +1 -1
  89. package/dist/components/ds-table.js.map +1 -1
  90. package/dist/components/ds-tag.js +1 -1
  91. package/dist/components/ds-text.js +1 -1
  92. package/dist/components/ds-toast.js +1 -1
  93. package/dist/components/ds-toast.js.map +1 -1
  94. package/dist/components/ds-tooltip-chart.js +1 -1
  95. package/dist/components/ds-tooltip.js +1 -1
  96. package/dist/components/ds-typing-indicator.js +1 -1
  97. package/dist/components/ds-typing-indicator.js.map +1 -1
  98. package/dist/components/{p-Dginv8PT.js → p-1Hu9jlju.js} +2 -2
  99. package/dist/components/{p-BiBXCjjo.js → p-B00PEE6t.js} +2 -2
  100. package/dist/components/{p-C6yLERx6.js → p-B1JRCDHS.js} +2 -2
  101. package/dist/components/p-BBG6Sswb.js +2 -0
  102. package/dist/components/{p-Drcl4zS9.js.map → p-BBG6Sswb.js.map} +1 -1
  103. package/dist/components/{p-Dd8VKdAO.js → p-BCOl1x0_.js} +2 -2
  104. package/dist/components/{p-C9StMCWg.js → p-BHVOiWz5.js} +2 -2
  105. package/dist/components/{p-DJ0GCCFa.js → p-BNkU9dcc.js} +2 -2
  106. package/dist/components/p-BPG0r_mC.js +2 -0
  107. package/dist/components/p-BPG0r_mC.js.map +1 -0
  108. package/dist/components/p-BUDAwJVV.js +2 -0
  109. package/dist/components/p-BUDAwJVV.js.map +1 -0
  110. package/dist/components/{p-hp_2W2Qy.js → p-BXN-e7vF.js} +2 -2
  111. package/dist/components/{p-CihNoe1M.js → p-B_jZIC9R.js} +2 -2
  112. package/dist/components/{p-CAJIARNW.js → p-Bbb9A3NV.js} +2 -2
  113. package/dist/components/{p-jk2-y5dH.js → p-Bece5KH3.js} +2 -2
  114. package/dist/components/{p-D6P_1YrL.js → p-BhYS_Ump.js} +2 -2
  115. package/dist/components/p-Bkh7scMQ.js +2 -0
  116. package/dist/components/{p-DMaQkEYP.js.map → p-Bkh7scMQ.js.map} +1 -1
  117. package/dist/components/p-BknXYAEc.js +2 -0
  118. package/dist/components/{p-9GuNIXuz.js.map → p-BknXYAEc.js.map} +1 -1
  119. package/dist/components/{p-BKx2ihnG.js → p-Bu3dOjpW.js} +2 -2
  120. package/dist/components/{p-CBa_6lqj.js → p-C-Y7gYgz.js} +2 -2
  121. package/dist/components/{p-9EQ3xLI1.js → p-C6R5Lft0.js} +2 -2
  122. package/dist/components/{p-DPR0TGGJ.js → p-C9gC4haA.js} +2 -2
  123. package/dist/components/{p-LHzBS95u.js → p-CAnnQL1F.js} +2 -2
  124. package/dist/components/p-CE2IKOsy.js +2 -0
  125. package/dist/components/{p-DaxKVtZG.js.map → p-CE2IKOsy.js.map} +1 -1
  126. package/dist/components/{p-DHzn7INS.js → p-CKVHrOEp.js} +2 -2
  127. package/dist/components/{p-CbZ0RU2c.js → p-CLVxgTme.js} +2 -2
  128. package/dist/components/p-CY4YFAT3.js +2 -0
  129. package/dist/components/p-CY4YFAT3.js.map +1 -0
  130. package/dist/components/{p-3WlVHGUe.js → p-Cg0kimXZ.js} +2 -2
  131. package/dist/components/p-CqQFowZd.js +2 -0
  132. package/dist/components/p-CqQFowZd.js.map +1 -0
  133. package/dist/components/{p-HZz5aJKz.js → p-CsBICYmt.js} +2 -2
  134. package/dist/components/p-CwjVgUqy.js +2 -0
  135. package/dist/components/p-CwjVgUqy.js.map +1 -0
  136. package/dist/components/{p-Dl3gciej.js → p-D123Jvp-.js} +2 -2
  137. package/dist/components/p-D1eEgwcP.js +2 -0
  138. package/dist/components/p-D1eEgwcP.js.map +1 -0
  139. package/dist/components/{p-oCc3mz_c.js → p-D3fMaUJ3.js} +2 -2
  140. package/dist/components/p-D7R4yE2C.js +2 -0
  141. package/dist/components/{p-Ba7DaFkb.js.map → p-D7R4yE2C.js.map} +1 -1
  142. package/dist/components/{p-B9ZfoprK.js → p-D7haeL5y.js} +2 -2
  143. package/dist/components/p-D7haeL5y.js.map +1 -0
  144. package/dist/components/{p-CHEt4mW8.js → p-DAvh38E4.js} +2 -2
  145. package/dist/components/{p-DPpHSIzS.js → p-DBue3ISk.js} +2 -2
  146. package/dist/components/{p-BdgoB2ef.js → p-DDgeXGbB.js} +2 -2
  147. package/dist/components/{p-Be-vZpWx.js → p-DUdOmSFR.js} +2 -2
  148. package/dist/components/p-DtndC9f1.js +2 -0
  149. package/dist/components/p-DtndC9f1.js.map +1 -0
  150. package/dist/components/{p-BTTxl3ro.js → p-H5T258T-.js} +2 -2
  151. package/dist/components/p-H5T258T-.js.map +1 -0
  152. package/dist/components/p-HB_cf_aR.js +2 -0
  153. package/dist/components/{p-BBmRD_S0.js.map → p-HB_cf_aR.js.map} +1 -1
  154. package/dist/components/p-LK-jpxwq.js +2 -0
  155. package/dist/components/p-LK-jpxwq.js.map +1 -0
  156. package/dist/components/p-ag6Io-kL.js +2 -0
  157. package/dist/components/p-ag6Io-kL.js.map +1 -0
  158. package/dist/components/p-iMuFgSoM.js +2 -0
  159. package/dist/components/p-iMuFgSoM.js.map +1 -0
  160. package/dist/components/{p-B145kX-i.js → p-uI6z53BE.js} +2 -2
  161. package/dist/docs/components.json +223 -37
  162. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +12 -0
  163. package/dist/lib/shell/index.d.ts +1 -1
  164. package/dist/lib/shell/index.js.map +1 -1
  165. package/dist/lib/utils/anchored-position.d.ts +6 -2
  166. package/dist/mcp-data/registry/badge.json +7 -9
  167. package/dist/mcp-data/registry/banner.json +2 -2
  168. package/dist/mcp-data/registry/bar-action.json +2 -2
  169. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  170. package/dist/mcp-data/registry/conversation-list.json +2 -2
  171. package/dist/mcp-data/registry/filter-menu.json +21 -6
  172. package/dist/mcp-data/registry/input.json +23 -3
  173. package/dist/mcp-data/registry/menu.json +22 -4
  174. package/dist/mcp-data/registry/message-composer.json +2 -2
  175. package/dist/mcp-data/registry/panel-nav.json +1 -1
  176. package/dist/mcp-data/registry/panel-tool-header.json +3 -3
  177. package/dist/mcp-data/registry/panel-tools.json +5 -4
  178. package/dist/mcp-data/registry/registry.json +43 -13
  179. package/dist/mcp-data/registry/select.json +17 -3
  180. package/dist/mcp-data/registry/shell-app.json +3 -2
  181. package/dist/mcp-data/registry/table.json +21 -1
  182. package/dist/mcp-data/registry/toast.json +2 -2
  183. package/dist/mcp-data/registry/tooltip.json +20 -3
  184. package/dist/mcp-data/registry/typing-indicator.json +4 -4
  185. package/dist/react/ds-panel-tool-header.d.ts +2 -5
  186. package/dist/react/ds-panel-tools.d.ts +2 -5
  187. package/dist/types/components/Badge/Badge.d.ts +2 -16
  188. package/dist/types/components/Banner/Banner.d.ts +0 -1
  189. package/dist/types/components/BarAction/BarAction.d.ts +0 -7
  190. package/dist/types/components/ConversationList/ConversationList.d.ts +1 -0
  191. package/dist/types/components/FilterMenu/FilterMenu.d.ts +5 -5
  192. package/dist/types/components/Input/Input.d.ts +7 -0
  193. package/dist/types/components/Menu/Menu.d.ts +3 -4
  194. package/dist/types/components/MessageComposer/MessageComposer.d.ts +0 -3
  195. package/dist/types/components/PanelToolHeader/PanelToolHeader.d.ts +2 -5
  196. package/dist/types/components/PanelTools/PanelTools.d.ts +2 -5
  197. package/dist/types/components/PanelTools/panel-tools-types.d.ts +12 -0
  198. package/dist/types/components/Select/Select.d.ts +3 -0
  199. package/dist/types/components/Table/Table.d.ts +1 -13
  200. package/dist/types/components/Table/table-body-renderer.d.ts +36 -0
  201. package/dist/types/components/Table/table-load-view.d.ts +17 -0
  202. package/dist/types/components/Table/table-row-view.d.ts +26 -0
  203. package/dist/types/components/Table/table-skeleton-view.d.ts +12 -0
  204. package/dist/types/components/Tooltip/Tooltip.d.ts +3 -0
  205. package/dist/types/components.d.ts +61 -23
  206. package/dist/types/shell/index.d.ts +1 -1
  207. package/dist/types/utils/anchored-overlay-boundary.d.ts +14 -0
  208. package/dist/types/utils/anchored-overlay-interaction-controller.d.ts +26 -0
  209. package/dist/types/utils/anchored-position-controller.d.ts +14 -0
  210. package/dist/types/utils/anchored-position.d.ts +6 -2
  211. package/dist/types/utils/select-controller.d.ts +1 -0
  212. package/dist/vue/ds-filter-menu.js +1 -0
  213. package/dist/vue/ds-input.js +1 -0
  214. package/dist/vue/ds-menu.js +1 -0
  215. package/dist/vue/ds-select.js +1 -0
  216. package/dist/vue/ds-tooltip.js +1 -0
  217. package/package.json +4 -1
  218. package/dist/components/p-9GuNIXuz.js +0 -2
  219. package/dist/components/p-B9ZfoprK.js.map +0 -1
  220. package/dist/components/p-BBmRD_S0.js +0 -2
  221. package/dist/components/p-BTTxl3ro.js.map +0 -1
  222. package/dist/components/p-Ba7DaFkb.js +0 -2
  223. package/dist/components/p-BcNYvLMi.js +0 -2
  224. package/dist/components/p-BcNYvLMi.js.map +0 -1
  225. package/dist/components/p-CI5Ce8VF.js +0 -2
  226. package/dist/components/p-CI5Ce8VF.js.map +0 -1
  227. package/dist/components/p-Cgm7YMLw.js +0 -2
  228. package/dist/components/p-Cgm7YMLw.js.map +0 -1
  229. package/dist/components/p-Cj5Hkt6Y.js +0 -2
  230. package/dist/components/p-Cj5Hkt6Y.js.map +0 -1
  231. package/dist/components/p-DC_8dK55.js +0 -2
  232. package/dist/components/p-DC_8dK55.js.map +0 -1
  233. package/dist/components/p-DKY3IJqt.js +0 -2
  234. package/dist/components/p-DKY3IJqt.js.map +0 -1
  235. package/dist/components/p-DMaQkEYP.js +0 -2
  236. package/dist/components/p-DQyvAN44.js +0 -2
  237. package/dist/components/p-DQyvAN44.js.map +0 -1
  238. package/dist/components/p-DaxKVtZG.js +0 -2
  239. package/dist/components/p-DbJahF86.js +0 -2
  240. package/dist/components/p-DbJahF86.js.map +0 -1
  241. package/dist/components/p-DhKvqh5G.js +0 -2
  242. package/dist/components/p-DhKvqh5G.js.map +0 -1
  243. package/dist/components/p-Drcl4zS9.js +0 -2
  244. package/dist/components/p-DzPw6aDK.js +0 -2
  245. package/dist/components/p-DzPw6aDK.js.map +0 -1
  246. package/dist/types/shell/badge-gradient-ring.d.ts +0 -28
  247. /package/dist/components/{p-Dginv8PT.js.map → p-1Hu9jlju.js.map} +0 -0
  248. /package/dist/components/{p-BiBXCjjo.js.map → p-B00PEE6t.js.map} +0 -0
  249. /package/dist/components/{p-C6yLERx6.js.map → p-B1JRCDHS.js.map} +0 -0
  250. /package/dist/components/{p-Dd8VKdAO.js.map → p-BCOl1x0_.js.map} +0 -0
  251. /package/dist/components/{p-C9StMCWg.js.map → p-BHVOiWz5.js.map} +0 -0
  252. /package/dist/components/{p-DJ0GCCFa.js.map → p-BNkU9dcc.js.map} +0 -0
  253. /package/dist/components/{p-hp_2W2Qy.js.map → p-BXN-e7vF.js.map} +0 -0
  254. /package/dist/components/{p-CihNoe1M.js.map → p-B_jZIC9R.js.map} +0 -0
  255. /package/dist/components/{p-CAJIARNW.js.map → p-Bbb9A3NV.js.map} +0 -0
  256. /package/dist/components/{p-jk2-y5dH.js.map → p-Bece5KH3.js.map} +0 -0
  257. /package/dist/components/{p-D6P_1YrL.js.map → p-BhYS_Ump.js.map} +0 -0
  258. /package/dist/components/{p-BKx2ihnG.js.map → p-Bu3dOjpW.js.map} +0 -0
  259. /package/dist/components/{p-CBa_6lqj.js.map → p-C-Y7gYgz.js.map} +0 -0
  260. /package/dist/components/{p-9EQ3xLI1.js.map → p-C6R5Lft0.js.map} +0 -0
  261. /package/dist/components/{p-DPR0TGGJ.js.map → p-C9gC4haA.js.map} +0 -0
  262. /package/dist/components/{p-LHzBS95u.js.map → p-CAnnQL1F.js.map} +0 -0
  263. /package/dist/components/{p-DHzn7INS.js.map → p-CKVHrOEp.js.map} +0 -0
  264. /package/dist/components/{p-CbZ0RU2c.js.map → p-CLVxgTme.js.map} +0 -0
  265. /package/dist/components/{p-3WlVHGUe.js.map → p-Cg0kimXZ.js.map} +0 -0
  266. /package/dist/components/{p-HZz5aJKz.js.map → p-CsBICYmt.js.map} +0 -0
  267. /package/dist/components/{p-Dl3gciej.js.map → p-D123Jvp-.js.map} +0 -0
  268. /package/dist/components/{p-oCc3mz_c.js.map → p-D3fMaUJ3.js.map} +0 -0
  269. /package/dist/components/{p-CHEt4mW8.js.map → p-DAvh38E4.js.map} +0 -0
  270. /package/dist/components/{p-DPpHSIzS.js.map → p-DBue3ISk.js.map} +0 -0
  271. /package/dist/components/{p-BdgoB2ef.js.map → p-DDgeXGbB.js.map} +0 -0
  272. /package/dist/components/{p-Be-vZpWx.js.map → p-DUdOmSFR.js.map} +0 -0
  273. /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-26T21:14:02",
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",
@@ -18066,15 +18163,17 @@
18066
18163
  "events": [
18067
18164
  {
18068
18165
  "event": "dsAction",
18069
- "detail": "{ id: string; originalEvent: MouseEvent; }",
18166
+ "detail": "PanelToolHeaderActionDetail",
18070
18167
  "bubbles": true,
18071
18168
  "complexType": {
18072
- "original": "{ id: string; originalEvent: MouseEvent }",
18073
- "resolved": "{ id: string; originalEvent: MouseEvent; }",
18169
+ "original": "PanelToolHeaderActionDetail",
18170
+ "resolved": "PanelToolHeaderActionDetail",
18074
18171
  "references": {
18075
- "MouseEvent": {
18076
- "location": "global",
18077
- "id": "global::MouseEvent"
18172
+ "PanelToolHeaderActionDetail": {
18173
+ "location": "import",
18174
+ "path": "../PanelTools/panel-tools-types",
18175
+ "id": "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolHeaderActionDetail",
18176
+ "referenceLocation": "PanelToolHeaderActionDetail"
18078
18177
  }
18079
18178
  }
18080
18179
  },
@@ -19065,17 +19164,17 @@
19065
19164
  },
19066
19165
  {
19067
19166
  "event": "dsHeaderAction",
19068
- "detail": "{ tool: string; id: string; }",
19167
+ "detail": "PanelToolsHeaderActionDetail",
19069
19168
  "bubbles": true,
19070
19169
  "complexType": {
19071
- "original": "{\n tool: PanelToolsToolId;\n id: string;\n }",
19072
- "resolved": "{ tool: string; id: string; }",
19170
+ "original": "PanelToolsHeaderActionDetail",
19171
+ "resolved": "PanelToolsHeaderActionDetail",
19073
19172
  "references": {
19074
- "PanelToolsToolId": {
19173
+ "PanelToolsHeaderActionDetail": {
19075
19174
  "location": "import",
19076
19175
  "path": "./panel-tools-types",
19077
- "id": "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolsToolId",
19078
- "referenceLocation": "PanelToolsToolId"
19176
+ "id": "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolsHeaderActionDetail",
19177
+ "referenceLocation": "PanelToolsHeaderActionDetail"
19079
19178
  }
19080
19179
  }
19081
19180
  },
@@ -20042,6 +20141,36 @@
20042
20141
  "getter": false,
20043
20142
  "setter": false
20044
20143
  },
20144
+ {
20145
+ "name": "boundary",
20146
+ "type": "HTMLElement | undefined",
20147
+ "complexType": {
20148
+ "original": "HTMLElement | undefined",
20149
+ "resolved": "HTMLElement | undefined",
20150
+ "references": {
20151
+ "HTMLElement": {
20152
+ "location": "global",
20153
+ "id": "global::HTMLElement"
20154
+ }
20155
+ }
20156
+ },
20157
+ "mutable": false,
20158
+ "reflectToAttr": false,
20159
+ "docs": "Explicit collision owner; otherwise the nearest data-ds-overlay-boundary ancestor is used.",
20160
+ "docsTags": [],
20161
+ "values": [
20162
+ {
20163
+ "type": "HTMLElement"
20164
+ },
20165
+ {
20166
+ "type": "undefined"
20167
+ }
20168
+ ],
20169
+ "optional": false,
20170
+ "required": false,
20171
+ "getter": false,
20172
+ "setter": false
20173
+ },
20045
20174
  {
20046
20175
  "name": "clearLabel",
20047
20176
  "type": "string",
@@ -27393,13 +27522,13 @@
27393
27522
  "ds-checkbox",
27394
27523
  "ds-button-unfilled",
27395
27524
  "ds-text",
27396
- "ds-icon",
27397
- "ds-tag",
27398
- "ds-loader",
27399
- "ds-skeleton",
27400
27525
  "ds-empty-state",
27401
27526
  "ds-pagination",
27402
- "ds-divider"
27527
+ "ds-divider",
27528
+ "ds-skeleton",
27529
+ "ds-icon",
27530
+ "ds-tag",
27531
+ "ds-loader"
27403
27532
  ],
27404
27533
  "dependencyGraph": {
27405
27534
  "ds-table": [
@@ -27408,13 +27537,13 @@
27408
27537
  "ds-checkbox",
27409
27538
  "ds-button-unfilled",
27410
27539
  "ds-text",
27411
- "ds-icon",
27412
- "ds-tag",
27413
- "ds-loader",
27414
- "ds-skeleton",
27415
27540
  "ds-empty-state",
27416
27541
  "ds-pagination",
27417
- "ds-divider"
27542
+ "ds-divider",
27543
+ "ds-skeleton",
27544
+ "ds-icon",
27545
+ "ds-tag",
27546
+ "ds-loader"
27418
27547
  ],
27419
27548
  "ds-menu": [
27420
27549
  "ds-text",
@@ -30370,6 +30499,43 @@
30370
30499
  "getter": false,
30371
30500
  "setter": false
30372
30501
  },
30502
+ {
30503
+ "name": "boundary",
30504
+ "type": "\"viewport\" | HTMLElement | undefined",
30505
+ "complexType": {
30506
+ "original": "AnchoredOverlayBoundary | undefined",
30507
+ "resolved": "\"viewport\" | HTMLElement | undefined",
30508
+ "references": {
30509
+ "AnchoredOverlayBoundary": {
30510
+ "location": "import",
30511
+ "path": "../../utils/anchored-overlay-boundary",
30512
+ "id": "src/wc/utils/anchored-overlay-boundary.ts::AnchoredOverlayBoundary",
30513
+ "referenceLocation": "AnchoredOverlayBoundary"
30514
+ }
30515
+ }
30516
+ },
30517
+ "mutable": false,
30518
+ "attr": "boundary",
30519
+ "reflectToAttr": false,
30520
+ "docs": "Explicit collision owner, `viewport`, or the nearest data-ds-overlay-boundary ancestor.",
30521
+ "docsTags": [],
30522
+ "values": [
30523
+ {
30524
+ "value": "viewport",
30525
+ "type": "string"
30526
+ },
30527
+ {
30528
+ "type": "HTMLElement"
30529
+ },
30530
+ {
30531
+ "type": "undefined"
30532
+ }
30533
+ ],
30534
+ "optional": false,
30535
+ "required": false,
30536
+ "getter": false,
30537
+ "setter": false
30538
+ },
30373
30539
  {
30374
30540
  "name": "delay",
30375
30541
  "type": "number | string",
@@ -31103,10 +31269,10 @@
31103
31269
  "docsTags": [
31104
31270
  {
31105
31271
  "name": "default",
31106
- "text": "'Typing...'"
31272
+ "text": "'Typing…'"
31107
31273
  }
31108
31274
  ],
31109
- "default": "'Typing...'",
31275
+ "default": "'Typing…'",
31110
31276
  "values": [
31111
31277
  {
31112
31278
  "type": "string"
@@ -31372,6 +31538,11 @@
31372
31538
  "docstring": "",
31373
31539
  "path": "src/wc/components/Input/Input.tsx"
31374
31540
  },
31541
+ "src/wc/components/Input/Input.tsx::InputTextAlign": {
31542
+ "declaration": "export type InputTextAlign = 'start' | 'end';",
31543
+ "docstring": "",
31544
+ "path": "src/wc/components/Input/Input.tsx"
31545
+ },
31375
31546
  "src/wc/components/Input/Input.tsx::InputSize": {
31376
31547
  "declaration": "export type InputSize = 'lg' | 'md' | 'sm' | 'xs';",
31377
31548
  "docstring": "",
@@ -31657,6 +31828,11 @@
31657
31828
  "docstring": "",
31658
31829
  "path": "src/wc/components/Tooltip/Tooltip.tsx"
31659
31830
  },
31831
+ "src/wc/utils/anchored-overlay-boundary.ts::AnchoredOverlayBoundary": {
31832
+ "declaration": "export type AnchoredOverlayBoundary = HTMLElement | 'viewport';",
31833
+ "docstring": "",
31834
+ "path": "src/wc/utils/anchored-overlay-boundary.ts"
31835
+ },
31660
31836
  "src/wc/components/TooltipChart/TooltipChart.tsx::TooltipChartItem": {
31661
31837
  "declaration": "export interface TooltipChartItem {\n label: string;\n value: string | number;\n color?: string;\n}",
31662
31838
  "docstring": "",
@@ -31912,6 +32088,11 @@
31912
32088
  "docstring": "",
31913
32089
  "path": "src/wc/components/PanelTools/panel-tools-types.ts"
31914
32090
  },
32091
+ "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolHeaderActionDetail": {
32092
+ "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}",
32093
+ "docstring": "",
32094
+ "path": "src/wc/components/PanelTools/panel-tools-types.ts"
32095
+ },
31915
32096
  "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolsToolId": {
31916
32097
  "declaration": "string",
31917
32098
  "docstring": "",
@@ -31927,6 +32108,11 @@
31927
32108
  "docstring": "",
31928
32109
  "path": "src/wc/components/PanelTools/panel-tools-types.ts"
31929
32110
  },
32111
+ "src/wc/components/PanelTools/panel-tools-types.ts::PanelToolsHeaderActionDetail": {
32112
+ "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}",
32113
+ "docstring": "",
32114
+ "path": "src/wc/components/PanelTools/panel-tools-types.ts"
32115
+ },
31930
32116
  "src/wc/components/PaperTexture/paper-texture-types.ts::PaperTextureConfig": {
31931
32117
  "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
32118
  "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