@ds-mo/ui 15.1.0 → 15.2.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 (230) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +2 -2
  3. package/dist/agent.json +286 -4
  4. package/dist/angular/ds-map-cluster-marker.d.ts +18 -0
  5. package/dist/angular/ds-map-cluster-marker.js +43 -0
  6. package/dist/angular/ds-map-entity-marker.d.ts +18 -0
  7. package/dist/angular/ds-map-entity-marker.js +43 -0
  8. package/dist/angular/index.d.ts +1 -1
  9. package/dist/angular/index.js +2 -0
  10. package/dist/angular/proxies.d.ts +2 -0
  11. package/dist/angular/proxies.js +2 -0
  12. package/dist/components/ds-agent-activity.js +1 -1
  13. package/dist/components/ds-agent-questionnaire.js +1 -1
  14. package/dist/components/ds-agent-response.js +1 -1
  15. package/dist/components/ds-agent-source-list.js +1 -1
  16. package/dist/components/ds-agent-tool-call.js +1 -1
  17. package/dist/components/ds-attachment-list.js +1 -1
  18. package/dist/components/ds-badge.js +1 -1
  19. package/dist/components/ds-banner.js +1 -1
  20. package/dist/components/ds-bar-action.js +1 -1
  21. package/dist/components/ds-bar-nav.js +1 -1
  22. package/dist/components/ds-bar-page-title.js +1 -1
  23. package/dist/components/ds-bar-title.js +1 -1
  24. package/dist/components/ds-bar-workflow.js +1 -1
  25. package/dist/components/ds-breadcrumb.js +1 -1
  26. package/dist/components/ds-button-filled.js +1 -1
  27. package/dist/components/ds-button-inverted.js +1 -1
  28. package/dist/components/ds-button-unfilled.js +1 -1
  29. package/dist/components/ds-calendar.js +1 -1
  30. package/dist/components/ds-card-action-center.js +1 -1
  31. package/dist/components/ds-card-chart.js +1 -1
  32. package/dist/components/ds-card-navigation.js +1 -1
  33. package/dist/components/ds-card-overview.js +1 -1
  34. package/dist/components/ds-card-setting.js +1 -1
  35. package/dist/components/ds-card-settings-scope.js +1 -1
  36. package/dist/components/ds-chart-legend.js +1 -1
  37. package/dist/components/ds-chart.js +1 -1
  38. package/dist/components/ds-checkbox.js +1 -1
  39. package/dist/components/ds-chip.js +1 -1
  40. package/dist/components/ds-code-block.js +1 -1
  41. package/dist/components/ds-conversation-list-item.js +1 -1
  42. package/dist/components/ds-conversation-list-section.js +1 -1
  43. package/dist/components/ds-conversation-list.js +1 -1
  44. package/dist/components/ds-data-customize.js +1 -1
  45. package/dist/components/ds-data-filter.js +1 -1
  46. package/dist/components/ds-data-group.js +1 -1
  47. package/dist/components/ds-data-preferences.js +1 -1
  48. package/dist/components/ds-data-saved-views.js +1 -1
  49. package/dist/components/ds-data-saved-views.js.map +1 -1
  50. package/dist/components/ds-data-search.js +1 -1
  51. package/dist/components/ds-data-search.js.map +1 -1
  52. package/dist/components/ds-data-sort.js +1 -1
  53. package/dist/components/ds-data-toolbar.js +1 -1
  54. package/dist/components/ds-empty-state.js +1 -1
  55. package/dist/components/ds-field.js +1 -1
  56. package/dist/components/ds-filter-menu.js +1 -1
  57. package/dist/components/ds-input-date.js +1 -1
  58. package/dist/components/ds-input-time.js +1 -1
  59. package/dist/components/ds-input.js +1 -1
  60. package/dist/components/ds-map-cluster-marker.d.ts +11 -0
  61. package/dist/components/ds-map-cluster-marker.js +2 -0
  62. package/dist/components/ds-map-cluster-marker.js.map +1 -0
  63. package/dist/components/ds-map-entity-marker.d.ts +11 -0
  64. package/dist/components/ds-map-entity-marker.js +2 -0
  65. package/dist/components/ds-map-entity-marker.js.map +1 -0
  66. package/dist/components/ds-markdown.js +1 -1
  67. package/dist/components/ds-menu.js +1 -1
  68. package/dist/components/ds-message-actions.js +1 -1
  69. package/dist/components/ds-message-bubble.js +1 -1
  70. package/dist/components/ds-message-composer.js +1 -1
  71. package/dist/components/ds-message-scroller.js +1 -1
  72. package/dist/components/ds-message.js +1 -1
  73. package/dist/components/ds-mobile-bar-nav.js +1 -1
  74. package/dist/components/ds-mobile-header.js +1 -1
  75. package/dist/components/ds-mobile-section-switcher.js +1 -1
  76. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  77. package/dist/components/ds-modal.js +1 -1
  78. package/dist/components/ds-pagination.js +1 -1
  79. package/dist/components/ds-panel-nav.js +1 -1
  80. package/dist/components/ds-panel-sub-nav.js +1 -1
  81. package/dist/components/ds-panel-tool-header.js +1 -1
  82. package/dist/components/ds-panel-tool-search.js +1 -1
  83. package/dist/components/ds-panel-tools.js +1 -1
  84. package/dist/components/ds-paper-texture.js +1 -1
  85. package/dist/components/ds-radio.js +1 -1
  86. package/dist/components/ds-score.js +1 -1
  87. package/dist/components/ds-scroll-overlay.js +1 -1
  88. package/dist/components/ds-scroll-overlay.js.map +1 -1
  89. package/dist/components/ds-select.js +1 -1
  90. package/dist/components/ds-shell-app.js +1 -1
  91. package/dist/components/ds-shell-page.js +1 -1
  92. package/dist/components/ds-shell-tools.js +1 -1
  93. package/dist/components/ds-skeleton.js +1 -1
  94. package/dist/components/ds-slider.js +1 -1
  95. package/dist/components/ds-swatch-picker.js +1 -1
  96. package/dist/components/ds-switch.js +1 -1
  97. package/dist/components/ds-tab-group.js +1 -1
  98. package/dist/components/ds-table.js +1 -1
  99. package/dist/components/ds-tag.js +1 -1
  100. package/dist/components/ds-text.js +1 -1
  101. package/dist/components/ds-textarea.js +1 -1
  102. package/dist/components/ds-time-picker.js +1 -1
  103. package/dist/components/ds-toast.js +1 -1
  104. package/dist/components/ds-tooltip-chart.js +1 -1
  105. package/dist/components/ds-tooltip.js +1 -1
  106. package/dist/components/ds-typing-indicator.js +1 -1
  107. package/dist/components/{p-CD4DZPy_.js → p-5SVmAjXY.js} +2 -2
  108. package/dist/components/{p-B_jdoM7e.js → p-B3CZvMXs.js} +2 -2
  109. package/dist/components/{p-Bn8I7iw6.js → p-B6qQaYkB.js} +2 -2
  110. package/dist/components/p-BCnzbfma.js +2 -0
  111. package/dist/components/{p-0qY_HDId.js.map → p-BCnzbfma.js.map} +1 -1
  112. package/dist/components/{p-D922f6Tb.js → p-BJJh-Bf7.js} +2 -2
  113. package/dist/components/{p-5URekSny.js → p-BLSSaVWm.js} +2 -2
  114. package/dist/components/{p-BciTtTwx.js → p-BLuqpHvp.js} +2 -2
  115. package/dist/components/{p-BciTtTwx.js.map → p-BLuqpHvp.js.map} +1 -1
  116. package/dist/components/{p-BeNa6tw5.js → p-BOhefRMt.js} +2 -2
  117. package/dist/components/{p-BKZdqJQB.js → p-BR5OC2PX.js} +2 -2
  118. package/dist/components/{p-CUcUHwI3.js → p-BX506yEW.js} +2 -2
  119. package/dist/components/{p-C6xVxqOn.js → p-BZ_e69zx.js} +2 -2
  120. package/dist/components/{p-DEW7r0U9.js → p-BfF4RZdp.js} +2 -2
  121. package/dist/components/{p-etifxiDc.js → p-Br5e83Fr.js} +2 -2
  122. package/dist/components/{p-8yBdCXCn.js → p-BtnTQp4K.js} +2 -2
  123. package/dist/components/{p-Di5FH7eh.js → p-Bv9rSkp0.js} +2 -2
  124. package/dist/components/{p-CiH4GG6r.js → p-BzYW1IqO.js} +2 -2
  125. package/dist/components/{p-DpoTwJAR.js → p-C0JkLR83.js} +2 -2
  126. package/dist/components/{p-CiJ1WR11.js → p-C1gaWjOm.js} +2 -2
  127. package/dist/components/{p-D0y7Sja6.js → p-C6Aavz9h.js} +2 -2
  128. package/dist/components/{p-DVOjjuXc.js → p-C6zycbhC.js} +2 -2
  129. package/dist/components/{p-BhJXmuRA.js → p-CNZ6-kWd.js} +2 -2
  130. package/dist/components/{p-DVINzOoK.js → p-CR-Jjdcn.js} +2 -2
  131. package/dist/components/{p-Dfs98tpL.js → p-CRk0TjQv.js} +2 -2
  132. package/dist/components/{p-DHICPS4n.js → p-CTGgXIXM.js} +2 -2
  133. package/dist/components/{p-Dw9sE6Iw.js → p-CZ7hxDy_.js} +2 -2
  134. package/dist/components/{p-CYzFfFcH.js → p-C_Ma6Xa-.js} +2 -2
  135. package/dist/components/{p-ZhP2tVmM.js → p-Cn6AfzeF.js} +2 -2
  136. package/dist/components/{p-Dn9QHL4O.js → p-Cu8o2rOz.js} +2 -2
  137. package/dist/components/{p-FIBCluwV.js → p-CuWPWC3t.js} +2 -2
  138. package/dist/components/{p-DOAybCp0.js → p-D5HxZrMA.js} +2 -2
  139. package/dist/components/{p-Dzndkdx5.js → p-D7K1ZHML.js} +2 -2
  140. package/dist/components/{p-CzIpquvw.js → p-DFO5lV_A.js} +2 -2
  141. package/dist/components/{p-CdGXzRP8.js → p-Dlp1HqgS.js} +2 -2
  142. package/dist/components/{p-0FYD2bev.js → p-Dqfc6Nvd.js} +2 -2
  143. package/dist/components/{p-0FYD2bev.js.map → p-Dqfc6Nvd.js.map} +1 -1
  144. package/dist/components/{p-CNxvnQ6A.js → p-DsLXlxt3.js} +2 -2
  145. package/dist/components/{p-ljbw3UMZ.js → p-ER5M085B.js} +2 -2
  146. package/dist/components/{p-xdmJCPCg.js → p-QWukusRL.js} +2 -2
  147. package/dist/components/{p-E5W27Fu_.js → p-UY63jmrO.js} +2 -2
  148. package/dist/components/{p-D1vQGJzc.js → p-YrnU2fM7.js} +2 -2
  149. package/dist/components/{p-Do2FJd1y.js → p-ZYWnJaye.js} +2 -2
  150. package/dist/components/{p-DwbcNDJF.js → p-ZwRLjD5M.js} +2 -2
  151. package/dist/components/p-lamoJZE4.js +2 -0
  152. package/dist/components/{p-BgQMEHRa.js.map → p-lamoJZE4.js.map} +1 -1
  153. package/dist/components/{p-CdgOLWX9.js → p-mV4vSjSK.js} +2 -2
  154. package/dist/components/{p-Cqc2U1ZQ.js → p-mux14tWZ.js} +2 -2
  155. package/dist/components/{p-C-3YqeTb.js → p-mxZoWfnS.js} +2 -2
  156. package/dist/components/{p-CmexIVnE.js → p-p0FVyEFa.js} +2 -2
  157. package/dist/components/{p-Bpd6YCo4.js → p-uADksYMl.js} +2 -2
  158. package/dist/components/{p-Bm7rqs3C.js → p-xhn1cZgU.js} +2 -2
  159. package/dist/components/{p-Bm7rqs3C.js.map → p-xhn1cZgU.js.map} +1 -1
  160. package/dist/docs/components.json +488 -1
  161. package/dist/lint/index.js +1 -1
  162. package/dist/mcp-data/registry/bar-title.json +2 -2
  163. package/dist/mcp-data/registry/calendar.json +1 -1
  164. package/dist/mcp-data/registry/data-search.json +1 -1
  165. package/dist/mcp-data/registry/map-cluster-marker.json +263 -0
  166. package/dist/mcp-data/registry/map-entity-marker.json +321 -0
  167. package/dist/mcp-data/registry/registry.json +291 -3
  168. package/dist/mcp-data/registry/shell-app.json +1 -1
  169. package/dist/mcp-data/registry/shell-page.json +3 -3
  170. package/dist/react/components.d.ts +2 -0
  171. package/dist/react/components.js +2 -0
  172. package/dist/react/ds-map-cluster-marker.d.ts +12 -0
  173. package/dist/react/ds-map-cluster-marker.js +12 -0
  174. package/dist/react/ds-map-entity-marker.d.ts +12 -0
  175. package/dist/react/ds-map-entity-marker.js +12 -0
  176. package/dist/types/components/MapClusterMarker/MapClusterMarker.d.ts +19 -0
  177. package/dist/types/components/MapEntityMarker/MapEntityMarker.d.ts +26 -0
  178. package/dist/types/components.d.ts +195 -0
  179. package/dist/vue/components.d.ts +2 -0
  180. package/dist/vue/components.js +2 -0
  181. package/dist/vue/ds-map-cluster-marker.d.ts +3 -0
  182. package/dist/vue/ds-map-cluster-marker.js +14 -0
  183. package/dist/vue/ds-map-entity-marker.d.ts +3 -0
  184. package/dist/vue/ds-map-entity-marker.js +17 -0
  185. package/package.json +1 -1
  186. package/dist/components/p-0qY_HDId.js +0 -2
  187. package/dist/components/p-BgQMEHRa.js +0 -2
  188. /package/dist/components/{p-CD4DZPy_.js.map → p-5SVmAjXY.js.map} +0 -0
  189. /package/dist/components/{p-B_jdoM7e.js.map → p-B3CZvMXs.js.map} +0 -0
  190. /package/dist/components/{p-Bn8I7iw6.js.map → p-B6qQaYkB.js.map} +0 -0
  191. /package/dist/components/{p-D922f6Tb.js.map → p-BJJh-Bf7.js.map} +0 -0
  192. /package/dist/components/{p-5URekSny.js.map → p-BLSSaVWm.js.map} +0 -0
  193. /package/dist/components/{p-BeNa6tw5.js.map → p-BOhefRMt.js.map} +0 -0
  194. /package/dist/components/{p-BKZdqJQB.js.map → p-BR5OC2PX.js.map} +0 -0
  195. /package/dist/components/{p-CUcUHwI3.js.map → p-BX506yEW.js.map} +0 -0
  196. /package/dist/components/{p-C6xVxqOn.js.map → p-BZ_e69zx.js.map} +0 -0
  197. /package/dist/components/{p-DEW7r0U9.js.map → p-BfF4RZdp.js.map} +0 -0
  198. /package/dist/components/{p-etifxiDc.js.map → p-Br5e83Fr.js.map} +0 -0
  199. /package/dist/components/{p-8yBdCXCn.js.map → p-BtnTQp4K.js.map} +0 -0
  200. /package/dist/components/{p-Di5FH7eh.js.map → p-Bv9rSkp0.js.map} +0 -0
  201. /package/dist/components/{p-CiH4GG6r.js.map → p-BzYW1IqO.js.map} +0 -0
  202. /package/dist/components/{p-DpoTwJAR.js.map → p-C0JkLR83.js.map} +0 -0
  203. /package/dist/components/{p-CiJ1WR11.js.map → p-C1gaWjOm.js.map} +0 -0
  204. /package/dist/components/{p-D0y7Sja6.js.map → p-C6Aavz9h.js.map} +0 -0
  205. /package/dist/components/{p-DVOjjuXc.js.map → p-C6zycbhC.js.map} +0 -0
  206. /package/dist/components/{p-BhJXmuRA.js.map → p-CNZ6-kWd.js.map} +0 -0
  207. /package/dist/components/{p-DVINzOoK.js.map → p-CR-Jjdcn.js.map} +0 -0
  208. /package/dist/components/{p-Dfs98tpL.js.map → p-CRk0TjQv.js.map} +0 -0
  209. /package/dist/components/{p-DHICPS4n.js.map → p-CTGgXIXM.js.map} +0 -0
  210. /package/dist/components/{p-Dw9sE6Iw.js.map → p-CZ7hxDy_.js.map} +0 -0
  211. /package/dist/components/{p-CYzFfFcH.js.map → p-C_Ma6Xa-.js.map} +0 -0
  212. /package/dist/components/{p-ZhP2tVmM.js.map → p-Cn6AfzeF.js.map} +0 -0
  213. /package/dist/components/{p-Dn9QHL4O.js.map → p-Cu8o2rOz.js.map} +0 -0
  214. /package/dist/components/{p-FIBCluwV.js.map → p-CuWPWC3t.js.map} +0 -0
  215. /package/dist/components/{p-DOAybCp0.js.map → p-D5HxZrMA.js.map} +0 -0
  216. /package/dist/components/{p-Dzndkdx5.js.map → p-D7K1ZHML.js.map} +0 -0
  217. /package/dist/components/{p-CzIpquvw.js.map → p-DFO5lV_A.js.map} +0 -0
  218. /package/dist/components/{p-CdGXzRP8.js.map → p-Dlp1HqgS.js.map} +0 -0
  219. /package/dist/components/{p-CNxvnQ6A.js.map → p-DsLXlxt3.js.map} +0 -0
  220. /package/dist/components/{p-ljbw3UMZ.js.map → p-ER5M085B.js.map} +0 -0
  221. /package/dist/components/{p-xdmJCPCg.js.map → p-QWukusRL.js.map} +0 -0
  222. /package/dist/components/{p-E5W27Fu_.js.map → p-UY63jmrO.js.map} +0 -0
  223. /package/dist/components/{p-D1vQGJzc.js.map → p-YrnU2fM7.js.map} +0 -0
  224. /package/dist/components/{p-Do2FJd1y.js.map → p-ZYWnJaye.js.map} +0 -0
  225. /package/dist/components/{p-DwbcNDJF.js.map → p-ZwRLjD5M.js.map} +0 -0
  226. /package/dist/components/{p-CdgOLWX9.js.map → p-mV4vSjSK.js.map} +0 -0
  227. /package/dist/components/{p-Cqc2U1ZQ.js.map → p-mux14tWZ.js.map} +0 -0
  228. /package/dist/components/{p-C-3YqeTb.js.map → p-mxZoWfnS.js.map} +0 -0
  229. /package/dist/components/{p-CmexIVnE.js.map → p-p0FVyEFa.js.map} +0 -0
  230. /package/dist/components/{p-Bpd6YCo4.js.map → p-uADksYMl.js.map} +0 -0
@@ -87,7 +87,7 @@
87
87
  "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
88
88
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
89
89
  "On desktop and tablet, panel section navigation replaces BarNav with BarPageTitle; collapsed PanelNav exposes child sections through its anchored flyout.",
90
- "When panel section navigation moves BarPageTitle into the shell bar, routed content starts at the standard 32px desktop or 16px tablet gutter and ShellPage reports no page-local sticky-header height.",
90
+ "When panel section navigation moves BarPageTitle into the shell bar, routed content starts at the standard 16px desktop and tablet gutter and ShellPage reports no page-local sticky-header height.",
91
91
  "On mobile, ShellApp hides and inerts desktop chrome, uses a solid primary stage, and composes MobileHeader, MobileSheetNav, ShellTools, and the persistent MobileBarNav around the same application-owned content.",
92
92
  "The section-navigation preference also selects mobile navigation: bar preserves flat area selection and the header section picker; panel expands child routes inline in MobileSheetNav and combines the page title with any local subsection in one sheet trigger.",
93
93
  "Opening MobileSheetNav temporarily overlays the active routed page or global tool; closing it without selecting an area restores that same destination and its nested state. The sheet exposes the router-derived current area only while the routed area owns the mobile stage, so a global tool never leaves an underlying route highlighted.",
@@ -73,7 +73,7 @@
73
73
  "A ShellPage-managed BarTitle remains concealed until headerCapacity is available and its rendered variant matches the resolved presentation, preventing a default-variant flash during route activation.",
74
74
  "responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
75
75
  "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
76
- "The default content inset is balanced on every side: 32px in desktop mode and 16px in tablet and mobile modes.",
76
+ "The default content inset is balanced at 16px on every side in desktop, tablet, and mobile modes.",
77
77
  "When desktopHeaderPlacement=shell-bar, desktop and tablet ignore page-header-specific block-start seam overrides and expose --ds-shell-page-content-block-start-offset as the responsive gutter only; mobile keeps its MobileHeader geometry and existing seam.",
78
78
  "contentInsetBlockStart can independently remove the top gutter for table and canvas pages that should meet the sticky header; exact roomy and compact block-start sizes support pages whose seam changes with header capacity.",
79
79
  "The selected content surface persists unchanged across desktop, tablet, and mobile modes.",
@@ -347,12 +347,12 @@
347
347
  "files": [
348
348
  {
349
349
  "path": "src/wc/components/ShellPage/ShellPage.css",
350
- "content": ":host {\n --_shell-page-content-background: var(--color-background-primary);\n --_shell-page-header-background: var(--color-background-primary);\n --_shell-page-responsive-content-block-start-inset: var(--dimension-space-400);\n --_shell-page-content-block-start-inset: var(\n --ds-shell-page-content-block-start-inset,\n var(--_shell-page-responsive-content-block-start-inset)\n );\n --ds-shell-page-sticky-header-block-size: var(--dimension-size-600);\n --ds-shell-page-content-block-start-offset: calc(\n var(--ds-shell-page-sticky-header-block-size) + var(--_shell-page-content-block-start-inset)\n );\n display: block;\n position: relative;\n min-width: 0;\n min-height: 100%;\n box-sizing: border-box;\n background: var(--_shell-page-content-background);\n}\n\n:host(.shell-page-host--surface-secondary) {\n --_shell-page-content-background: var(--color-background-secondary);\n}\n\n:host(.shell-page-host--surface-secondary[responsive-mode='desktop']),\n:host(.shell-page-host--surface-secondary[responsive-mode='tablet']) {\n --_shell-page-header-background: var(--color-background-secondary);\n}\n\n:host([responsive-mode='tablet']),\n:host([responsive-mode='mobile']) {\n --_shell-page-responsive-content-block-start-inset: var(--dimension-space-200);\n}\n\n:host([responsive-mode='mobile']) {\n --ds-shell-page-sticky-header-block-size: calc(\n var(--dimension-size-500) + var(--dimension-space-200)\n );\n}\n\n:host(.shell-page-host--header-compact),\n:host(.shell-page-host--header-constrained) {\n --_shell-page-content-block-start-inset: var(\n --ds-shell-page-compact-content-block-start-inset,\n var(--_shell-page-responsive-content-block-start-inset)\n );\n}\n\n:host(.shell-page-host--inset-none),\n:host(.shell-page-host--block-start-inset-none) {\n --_shell-page-content-block-start-inset: 0px;\n}\n\n:host(.shell-page-host--desktop-header-shell-bar) {\n --ds-shell-page-sticky-header-block-size: 0px;\n}\n\n:host(.shell-page-host--desktop-header-shell-bar.shell-page-host--inset-default) {\n --_shell-page-content-block-start-inset: var(--_shell-page-responsive-content-block-start-inset);\n}\n\n.shell-page__scroll-sentinel {\n position: absolute;\n inset-block-start: var(--ds-shell-page-header-travel, 0);\n inset-inline-start: 0;\n width: var(--dimension-stroke-width-012);\n height: var(--dimension-stroke-width-012);\n pointer-events: none;\n}\n\n.shell-page__sticky-header {\n position: sticky;\n inset-block-start: var(--ds-shell-page-sticky-offset, 0);\n z-index: var(--dimension-z-index-overlay);\n min-width: 0;\n background: var(--_shell-page-header-background);\n overflow: visible;\n overflow-anchor: none;\n}\n\n.shell-page__desktop-header ::slotted(ds-bar-title),\n.shell-page__desktop-header ::slotted(ds-bar-workflow),\n.shell-page__mobile-header ::slotted(ds-mobile-header) {\n display: block;\n min-width: 0;\n}\n\n.shell-page__desktop-header[hidden],\n.shell-page__mobile-header[hidden] {\n display: none;\n}\n\n:host(.shell-page-host--mobile) .shell-page__scroll-sentinel,\n:host(.shell-page-host--mobile) .shell-page__flow-spacer {\n display: none;\n}\n\n.shell-page__flow-spacer {\n height: var(--ds-shell-page-flow-spacer, 0);\n background: var(--_shell-page-content-background);\n}\n\n.shell-page__content {\n min-width: 0;\n box-sizing: border-box;\n background: var(--_shell-page-content-background);\n}\n\n:host(.shell-page-host--inset-default) .shell-page__content {\n padding: var(--dimension-space-400);\n padding-block-start: var(--_shell-page-content-block-start-inset);\n}\n\n:host(.shell-page-host--inset-default[responsive-mode='tablet']) .shell-page__content,\n:host(.shell-page-host--inset-default[responsive-mode='mobile']) .shell-page__content {\n padding: var(--dimension-space-200);\n padding-block-start: var(--_shell-page-content-block-start-inset);\n}\n\n:host(.shell-page-host--inset-none) .shell-page__content {\n padding: 0;\n}\n",
350
+ "content": ":host {\n --_shell-page-content-background: var(--color-background-primary);\n --_shell-page-header-background: var(--color-background-primary);\n --_shell-page-responsive-content-block-start-inset: var(--dimension-space-200);\n --_shell-page-content-block-start-inset: var(\n --ds-shell-page-content-block-start-inset,\n var(--_shell-page-responsive-content-block-start-inset)\n );\n --ds-shell-page-sticky-header-block-size: var(--dimension-size-600);\n --ds-shell-page-content-block-start-offset: calc(\n var(--ds-shell-page-sticky-header-block-size) + var(--_shell-page-content-block-start-inset)\n );\n display: block;\n position: relative;\n min-width: 0;\n min-height: 100%;\n box-sizing: border-box;\n background: var(--_shell-page-content-background);\n}\n\n:host(.shell-page-host--surface-secondary) {\n --_shell-page-content-background: var(--color-background-secondary);\n}\n\n:host(.shell-page-host--surface-secondary[responsive-mode='desktop']),\n:host(.shell-page-host--surface-secondary[responsive-mode='tablet']) {\n --_shell-page-header-background: var(--color-background-secondary);\n}\n\n:host([responsive-mode='tablet']),\n:host([responsive-mode='mobile']) {\n --_shell-page-responsive-content-block-start-inset: var(--dimension-space-200);\n}\n\n:host([responsive-mode='mobile']) {\n --ds-shell-page-sticky-header-block-size: calc(\n var(--dimension-size-500) + var(--dimension-space-200)\n );\n}\n\n:host(.shell-page-host--header-compact),\n:host(.shell-page-host--header-constrained) {\n --_shell-page-content-block-start-inset: var(\n --ds-shell-page-compact-content-block-start-inset,\n var(--_shell-page-responsive-content-block-start-inset)\n );\n}\n\n:host(.shell-page-host--inset-none),\n:host(.shell-page-host--block-start-inset-none) {\n --_shell-page-content-block-start-inset: 0px;\n}\n\n:host(.shell-page-host--desktop-header-shell-bar) {\n --ds-shell-page-sticky-header-block-size: 0px;\n}\n\n:host(.shell-page-host--desktop-header-shell-bar.shell-page-host--inset-default) {\n --_shell-page-content-block-start-inset: var(--_shell-page-responsive-content-block-start-inset);\n}\n\n.shell-page__scroll-sentinel {\n position: absolute;\n inset-block-start: var(--ds-shell-page-header-travel, 0);\n inset-inline-start: 0;\n width: var(--dimension-stroke-width-012);\n height: var(--dimension-stroke-width-012);\n pointer-events: none;\n}\n\n.shell-page__sticky-header {\n position: sticky;\n inset-block-start: var(--ds-shell-page-sticky-offset, 0);\n z-index: var(--dimension-z-index-overlay);\n min-width: 0;\n background: var(--_shell-page-header-background);\n overflow: visible;\n overflow-anchor: none;\n}\n\n.shell-page__desktop-header ::slotted(ds-bar-title),\n.shell-page__desktop-header ::slotted(ds-bar-workflow),\n.shell-page__mobile-header ::slotted(ds-mobile-header) {\n display: block;\n min-width: 0;\n}\n\n.shell-page__desktop-header[hidden],\n.shell-page__mobile-header[hidden] {\n display: none;\n}\n\n:host(.shell-page-host--mobile) .shell-page__scroll-sentinel,\n:host(.shell-page-host--mobile) .shell-page__flow-spacer {\n display: none;\n}\n\n.shell-page__flow-spacer {\n height: var(--ds-shell-page-flow-spacer, 0);\n background: var(--_shell-page-content-background);\n}\n\n.shell-page__content {\n min-width: 0;\n box-sizing: border-box;\n background: var(--_shell-page-content-background);\n}\n\n:host(.shell-page-host--inset-default) .shell-page__content {\n padding: var(--dimension-space-200);\n padding-block-start: var(--_shell-page-content-block-start-inset);\n}\n\n:host(.shell-page-host--inset-default[responsive-mode='tablet']) .shell-page__content,\n:host(.shell-page-host--inset-default[responsive-mode='mobile']) .shell-page__content {\n padding: var(--dimension-space-200);\n padding-block-start: var(--_shell-page-content-block-start-inset);\n}\n\n:host(.shell-page-host--inset-none) .shell-page__content {\n padding: 0;\n}\n",
351
351
  "type": "registry:ui"
352
352
  },
353
353
  {
354
354
  "path": "src/wc/components/ShellPage/ShellPage.tsx",
355
- "content": "import { Component, Element, h, Host, Prop, State, Watch } from '@stencil/core';\nimport type { ShellResponsiveMode } from '../../shell/shell-responsive';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport type { BarTitleVariant } from '../BarTitle/bar-title-types';\nimport { resolveShellPageHeaderVariant } from './shell-page-responsive';\nimport type {\n ShellPageCapacity,\n ShellPageContentInset,\n ShellPageContentSurface,\n ShellPageDesktopHeaderPlacement,\n ShellPageHeaderPresentation,\n} from './shell-page-types';\n\ntype BarTitleElement = HTMLElement & { variant: BarTitleVariant };\n\n@Component({\n tag: 'ds-shell-page',\n styleUrl: 'ShellPage.css',\n scoped: true,\n})\nexport class ShellPage {\n private static readonly MAX_HEADER_REVEAL_FRAMES = 12;\n private static readonly MAX_HEADER_GEOMETRY_FRAMES = 12;\n\n @Element() el!: HTMLElement;\n\n /** Automatic capacity/scroll behavior, or an explicit header variant override. */\n @Prop() headerPresentation: ShellPageHeaderPresentation = 'auto';\n\n /** Available page-header capacity supplied by the owning application shell. */\n @Prop() headerCapacity?: ShellPageCapacity;\n\n /** Desktop title chrome is rendered in this page or externally in the shell bar. */\n @Prop({ attribute: 'desktop-header-placement', reflect: true })\n desktopHeaderPlacement: ShellPageDesktopHeaderPlacement = 'page';\n\n /** Standard page gutters, or no inset for full-bleed page content. */\n @Prop() contentInset: ShellPageContentInset = 'default';\n\n /** Preserve the responsive side/end gutters while allowing content to meet the header. */\n @Prop() contentInsetBlockStart: ShellPageContentInset = 'default';\n\n /** Exact block-start content inset, overriding the responsive default when provided. */\n @Prop() contentInsetBlockStartSize?: string;\n\n /** Exact block-start content inset while the header is compact or constrained. */\n @Prop() compactContentInsetBlockStartSize?: string;\n\n /** Allow roomy automatic headers to compact as the page scrolls. */\n @Prop() scrollCompaction: boolean = true;\n\n /** Canvas surface painted around and beneath routed page content. */\n @Prop() contentSurface: ShellPageContentSurface = 'primary';\n\n /** Explicit shell breakpoint presentation. Mobile uses the dedicated mobile-header slot. */\n @Prop({ attribute: 'responsive-mode', reflect: true })\n responsiveMode: ShellResponsiveMode = 'desktop';\n\n @State() private pageTopVisible = true;\n\n private sentinelEl: HTMLElement | null = null;\n private spacerEl: HTMLElement | null = null;\n private stickyHeaderEl: HTMLElement | null = null;\n private headerEl: BarTitleElement | null = null;\n private expandedHeaderHeight = 0;\n private headerTravel = 0;\n private expandedGeometryFrozen = false;\n private pageHeaderResizeObserver: ResizeObserver | null = null;\n private headerResizeObserver: ResizeObserver | null = null;\n private headerMutationObserver: MutationObserver | null = null;\n private headerRevealFrame: number | null = null;\n private headerGeometryFrame: number | null = null;\n private reconnectFrame: number | null = null;\n private scrollRoot: HTMLElement | Window | null = null;\n private hasLoaded = false;\n\n @Watch('headerCapacity')\n @Watch('headerPresentation')\n @Watch('scrollCompaction')\n handleHeaderContractChange() {\n this.syncHeaderVariant(true);\n }\n\n @Watch('responsiveMode')\n handleResponsiveModeChange() {\n this.el.style.removeProperty('--ds-shell-page-sticky-header-block-size');\n this.observeHeader(\n this.responsiveMode === 'mobile' || this.desktopHeaderExternal ? null : this.findHeader()\n );\n this.syncPageHeaderBlockSize();\n }\n\n @Watch('desktopHeaderPlacement')\n handleDesktopHeaderPlacementChange() {\n this.observeHeader(this.desktopHeaderExternal ? null : this.findHeader());\n this.syncPageHeaderBlockSize();\n }\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.connectRuntime();\n }\n\n componentDidRender() {\n this.syncHeaderVariant();\n this.syncPageHeaderBlockSize();\n }\n\n connectedCallback() {\n if (!this.hasLoaded) return;\n if (this.reconnectFrame !== null) cancelAnimationFrame(this.reconnectFrame);\n this.reconnectFrame = requestAnimationFrame(() => {\n this.reconnectFrame = null;\n if (this.el.isConnected) this.connectRuntime();\n });\n }\n\n disconnectedCallback() {\n if (this.reconnectFrame !== null) cancelAnimationFrame(this.reconnectFrame);\n this.reconnectFrame = null;\n this.headerResizeObserver?.disconnect();\n this.headerResizeObserver = null;\n this.pageHeaderResizeObserver?.disconnect();\n this.pageHeaderResizeObserver = null;\n this.headerMutationObserver?.disconnect();\n this.headerMutationObserver = null;\n this.cancelHeaderReveal();\n this.cancelHeaderGeometrySync();\n this.headerEl?.style.removeProperty('--ds-bar-title-divider-inset');\n this.scrollRoot?.removeEventListener('scroll', this.handleScroll);\n this.scrollRoot = null;\n }\n\n private connectRuntime() {\n this.observePageHeaderGeometry();\n this.observeHeader(this.responsiveMode === 'mobile' ? null : this.findHeader());\n this.connectScrollRoot();\n }\n\n private get effectiveVariant(): BarTitleVariant {\n if (this.desktopHeaderExternal) return 'compact';\n return resolveShellPageHeaderVariant(\n this.headerPresentation,\n this.headerCapacity ?? 'roomy',\n this.effectiveScrollCompaction ? this.pageTopVisible : true\n );\n }\n\n private get desktopHeaderExternal(): boolean {\n return this.responsiveMode !== 'mobile' && this.desktopHeaderPlacement === 'shell-bar';\n }\n\n private get effectiveScrollCompaction(): boolean {\n return this.scrollCompaction && !this.desktopHeaderExternal;\n }\n\n private get headerContractResolved(): boolean {\n return this.headerPresentation !== 'auto' || this.headerCapacity !== undefined;\n }\n\n private get isScrollCompacted(): boolean {\n return (\n this.effectiveScrollCompaction &&\n this.headerPresentation === 'auto' &&\n this.headerCapacity === 'roomy' &&\n !this.pageTopVisible\n );\n }\n\n private get contentInsetStyles(): { [name: string]: string } {\n const styles: { [name: string]: string } = {};\n const expanded = this.contentInsetBlockStartSize?.trim();\n const compact = this.compactContentInsetBlockStartSize?.trim();\n if (expanded) styles['--ds-shell-page-content-block-start-inset'] = expanded;\n if (compact) styles['--ds-shell-page-compact-content-block-start-inset'] = compact;\n return styles;\n }\n\n private composedParent(element: Element): Element | null {\n return (element as HTMLElement).assignedSlot?.parentElement ?? element.parentElement;\n }\n\n private findScrollRoot(): HTMLElement | Window {\n let ancestor = this.composedParent(this.el);\n while (ancestor && ancestor !== document.documentElement) {\n const overflow = getComputedStyle(ancestor).overflowY;\n if (overflow === 'auto' || overflow === 'scroll' || overflow === 'overlay') {\n return ancestor as HTMLElement;\n }\n ancestor = this.composedParent(ancestor);\n }\n return window;\n }\n\n private connectScrollRoot() {\n const next = this.findScrollRoot();\n if (next === this.scrollRoot) return;\n this.scrollRoot?.removeEventListener('scroll', this.handleScroll);\n this.scrollRoot = next;\n this.scrollRoot.addEventListener('scroll', this.handleScroll, { passive: true });\n this.handleScroll();\n }\n\n private get scrollRootResolved(): boolean {\n const shell = this.el.closest('ds-shell-app');\n if (!shell) return true;\n const expected = shell.querySelector<HTMLElement>('.shell-app__content');\n return expected !== null && this.scrollRoot === expected;\n }\n\n private handleScroll = () => {\n if (!this.sentinelEl || !this.scrollRoot) return;\n const rootTop =\n this.scrollRoot === window ? 0 : (this.scrollRoot as HTMLElement).getBoundingClientRect().top;\n this.syncHeaderDividerInset(rootTop);\n const nextPageTopVisible = this.sentinelEl.getBoundingClientRect().top >= rootTop;\n if (\n this.effectiveScrollCompaction &&\n !nextPageTopVisible &&\n this.pageTopVisible &&\n this.headerEl?.classList.contains(this.variantClass('expanded'))\n ) {\n this.captureExpandedHeaderGeometry(this.headerEl);\n this.expandedGeometryFrozen = true;\n }\n if (\n nextPageTopVisible &&\n this.expandedGeometryFrozen &&\n this.el.getBoundingClientRect().top >= rootTop\n ) {\n this.expandedGeometryFrozen = false;\n if (this.headerEl?.classList.contains(this.variantClass('expanded'))) {\n this.captureExpandedHeaderGeometry(this.headerEl);\n }\n }\n this.pageTopVisible = nextPageTopVisible;\n };\n\n private findHeader(): BarTitleElement | null {\n return this.el.querySelector<BarTitleElement>('ds-bar-title');\n }\n\n private get compactHeaderHeight(): number {\n return resolveCssLengthPx('--dimension-size-600', 0);\n }\n\n private syncHeaderDividerInset(rootTop?: number) {\n const header = this.headerEl;\n if (!header) return;\n\n const ownsScrollTransition =\n this.effectiveScrollCompaction &&\n this.headerPresentation === 'auto' &&\n this.headerCapacity === 'roomy';\n const expandedInset = resolveCssLengthPx('--dimension-space-400', 0);\n if (\n !ownsScrollTransition ||\n !this.sentinelEl ||\n !this.scrollRoot ||\n this.headerTravel <= 0 ||\n expandedInset <= 0\n ) {\n header.style.removeProperty('--ds-bar-title-divider-inset');\n return;\n }\n\n const scrollRootTop =\n rootTop ??\n (this.scrollRoot === window\n ? 0\n : (this.scrollRoot as HTMLElement).getBoundingClientRect().top);\n const remainingTravel = this.sentinelEl.getBoundingClientRect().top - scrollRootTop;\n const progress = Math.min(1, Math.max(0, 1 - remainingTravel / this.headerTravel));\n header.style.setProperty('--ds-bar-title-divider-inset', `${expandedInset * (1 - progress)}px`);\n }\n\n private setHeaderTravel(distance: number) {\n const next = Math.max(0, distance);\n if (Math.abs(next - this.headerTravel) < 0.5) return;\n this.headerTravel = next;\n this.el.style.setProperty('--ds-shell-page-header-travel', `${next}px`);\n this.handleScroll();\n }\n\n private measureHeaderTravel(header: BarTitleElement) {\n const anchor = header.querySelector<HTMLElement>('[data-shell-page-header-anchor]');\n const compactHeight = this.compactHeaderHeight;\n if (!anchor || compactHeight <= 0) return;\n\n const headerRect = header.getBoundingClientRect();\n const anchorRect = anchor.getBoundingClientRect();\n if (headerRect.height <= 0 || anchorRect.height <= 0) return;\n\n const expandedAnchorTop = anchorRect.top - headerRect.top;\n const compactAnchorTop = Math.max(0, (compactHeight - anchorRect.height) / 2);\n this.setHeaderTravel(expandedAnchorTop - compactAnchorTop);\n }\n\n private captureExpandedHeaderGeometry(header: BarTitleElement) {\n // Keep the largest observed expanded geometry for this header instance.\n // During a variant handoff Chromium can briefly report the compact box\n // before the child host class mutation is delivered; that transient must\n // not erase the flow reservation captured at the roomy page top.\n this.expandedHeaderHeight = Math.max(\n this.expandedHeaderHeight,\n header.getBoundingClientRect().height\n );\n this.measureHeaderTravel(header);\n }\n\n private setSpacerHeight(height: number) {\n if (!this.spacerEl) return;\n this.spacerEl.style.setProperty('--ds-shell-page-flow-spacer', `${Math.max(0, height)}px`);\n }\n\n private variantClass(variant: BarTitleVariant): string {\n return `bar-title-host--${variant}`;\n }\n\n private setStickyHeaderOffset(renderedVariant: BarTitleVariant) {\n this.stickyHeaderEl?.style.setProperty(\n '--ds-shell-page-sticky-offset',\n renderedVariant === 'expanded' &&\n this.effectiveScrollCompaction &&\n this.headerPresentation === 'auto' &&\n this.headerCapacity === 'roomy'\n ? `${-this.headerTravel}px`\n : '0px'\n );\n }\n\n private syncPageHeaderBlockSize() {\n if (this.desktopHeaderExternal) {\n this.el.style.setProperty('--ds-shell-page-sticky-header-block-size', '0px');\n return;\n }\n const renderedHeight = this.stickyHeaderEl?.getBoundingClientRect().height ?? 0;\n if (renderedHeight > 0) {\n this.el.style.setProperty('--ds-shell-page-sticky-header-block-size', `${renderedHeight}px`);\n } else {\n this.el.style.removeProperty('--ds-shell-page-sticky-header-block-size');\n }\n }\n\n private observePageHeaderGeometry() {\n this.pageHeaderResizeObserver?.disconnect();\n this.pageHeaderResizeObserver = null;\n this.syncPageHeaderBlockSize();\n\n if (!this.stickyHeaderEl || typeof ResizeObserver === 'undefined') return;\n this.pageHeaderResizeObserver = new ResizeObserver(() => {\n this.syncPageHeaderBlockSize();\n });\n this.pageHeaderResizeObserver.observe(this.stickyHeaderEl);\n }\n\n private syncRenderedHeaderGeometry(header: BarTitleElement) {\n const renderedVariant = this.effectiveVariant;\n if (!header.classList.contains(this.variantClass(renderedVariant))) return;\n\n this.syncPageHeaderBlockSize();\n\n // Update both flow-preservation pieces before reading layout. Otherwise a\n // reverse compact → expanded render can briefly contain the tall header and\n // the compact spacer together, giving browser scroll anchoring a transient\n // height change to compensate.\n this.setSpacerHeight(\n this.isScrollCompacted ? this.expandedHeaderHeight - this.compactHeaderHeight : 0\n );\n this.setStickyHeaderOffset(renderedVariant);\n\n if (renderedVariant === 'expanded' && !this.expandedGeometryFrozen) {\n this.captureExpandedHeaderGeometry(header);\n this.setStickyHeaderOffset(renderedVariant);\n }\n }\n\n private cancelHeaderGeometrySync() {\n if (this.headerGeometryFrame !== null) cancelAnimationFrame(this.headerGeometryFrame);\n this.headerGeometryFrame = null;\n }\n\n private scheduleHeaderGeometrySync(header: BarTitleElement) {\n this.cancelHeaderGeometrySync();\n let framesRemaining = ShellPage.MAX_HEADER_GEOMETRY_FRAMES;\n let framesElapsed = 0;\n const sync = () => {\n if (this.headerEl !== header) return;\n framesRemaining -= 1;\n framesElapsed += 1;\n // In WebKit a child's componentDidLoad can precede its assignment into\n // the parent's rendered slot. Revalidate after ShellApp has had a frame\n // to expose the actual content scroller.\n this.connectScrollRoot();\n this.syncRenderedHeaderGeometry(header);\n const geometryReady =\n this.effectiveVariant !== 'expanded' ||\n (this.expandedHeaderHeight > 0 && this.headerTravel > 0);\n if (\n (geometryReady && this.scrollRootResolved && framesElapsed >= 2) ||\n framesRemaining <= 0\n ) {\n this.headerGeometryFrame = null;\n return;\n }\n this.headerGeometryFrame = requestAnimationFrame(sync);\n };\n this.headerGeometryFrame = requestAnimationFrame(sync);\n }\n\n private cancelHeaderReveal() {\n if (this.headerRevealFrame !== null) cancelAnimationFrame(this.headerRevealFrame);\n this.headerRevealFrame = null;\n this.headerEl?.removeAttribute('data-shell-page-syncing');\n }\n\n private revealHeaderWhenSynced(header: BarTitleElement, variant: BarTitleVariant) {\n // Stencil normally re-renders within a frame or two of a prop change. Stop\n // polling at the cap, but fail closed: a stale variant must never paint.\n let framesRemaining = ShellPage.MAX_HEADER_REVEAL_FRAMES;\n const reveal = () => {\n if (this.headerEl !== header) {\n header.removeAttribute('data-shell-page-syncing');\n return;\n }\n framesRemaining -= 1;\n if (header.classList.contains(this.variantClass(variant))) {\n header.removeAttribute('data-shell-page-syncing');\n this.headerRevealFrame = null;\n return;\n }\n if (framesRemaining <= 0) {\n this.headerRevealFrame = null;\n return;\n }\n this.headerRevealFrame = requestAnimationFrame(reveal);\n };\n this.headerRevealFrame = requestAnimationFrame(reveal);\n }\n\n private syncHeaderVariant(concealUntilSynced = false) {\n const header = this.headerEl;\n if (!header) return;\n\n this.syncHeaderDividerInset();\n if (!this.headerContractResolved) {\n this.cancelHeaderReveal();\n header.setAttribute('data-shell-page-syncing', '');\n return;\n }\n\n const next = this.effectiveVariant;\n const renderedVariantIsStale = !header.classList.contains(this.variantClass(next));\n if (!renderedVariantIsStale) this.syncRenderedHeaderGeometry(header);\n if (renderedVariantIsStale && this.isScrollCompacted) {\n // Preserve the expanded flow before asking BarTitle to become compact.\n // This prevents the sentinel from moving back into view during the\n // parent/child render handoff and keeps the variant transition stable.\n this.setSpacerHeight(this.expandedHeaderHeight - this.compactHeaderHeight);\n this.setStickyHeaderOffset(next);\n }\n if (concealUntilSynced) {\n this.cancelHeaderReveal();\n header.setAttribute('data-shell-page-syncing', '');\n }\n if (header.variant !== next) {\n header.variant = next;\n // The child update and its MutationObserver callback can land in\n // different phases across engines. Poll the rendered class as the\n // authoritative handoff before committing sticky/spacer geometry.\n this.scheduleHeaderGeometrySync(header);\n }\n if (concealUntilSynced) {\n this.revealHeaderWhenSynced(header, next);\n }\n }\n\n private observeHeader(header: BarTitleElement | null) {\n this.cancelHeaderReveal();\n this.cancelHeaderGeometrySync();\n this.headerResizeObserver?.disconnect();\n this.headerResizeObserver = null;\n this.headerMutationObserver?.disconnect();\n this.headerMutationObserver = null;\n this.headerEl?.style.removeProperty('--ds-bar-title-divider-inset');\n this.headerEl = header;\n this.expandedHeaderHeight = 0;\n this.expandedGeometryFrozen = false;\n this.setHeaderTravel(0);\n this.setSpacerHeight(0);\n this.stickyHeaderEl?.style.setProperty('--ds-shell-page-sticky-offset', '0px');\n\n if (!header) return;\n if (header.classList.contains(this.variantClass('expanded'))) {\n this.captureExpandedHeaderGeometry(header);\n }\n if (typeof ResizeObserver !== 'undefined') {\n this.headerResizeObserver = new ResizeObserver(() => {\n this.syncRenderedHeaderGeometry(header);\n });\n this.headerResizeObserver.observe(header);\n }\n if (typeof MutationObserver !== 'undefined') {\n this.headerMutationObserver = new MutationObserver(() => {\n this.syncRenderedHeaderGeometry(header);\n });\n this.headerMutationObserver.observe(header, {\n attributes: true,\n attributeFilter: ['class'],\n childList: true,\n subtree: true,\n });\n }\n this.syncHeaderVariant(true);\n this.scheduleHeaderGeometrySync(header);\n }\n\n private handleHeaderSlotChange = (event: Event) => {\n if (this.responsiveMode === 'mobile') return;\n const slot = event.target as HTMLSlotElement;\n const header = slot\n .assignedElements()\n .find(element => element.tagName.toLowerCase() === 'ds-bar-title');\n this.observeHeader((header as BarTitleElement | undefined) ?? null);\n };\n\n render() {\n const mobile = this.responsiveMode === 'mobile';\n return (\n <Host\n role=\"main\"\n style={this.contentInsetStyles}\n class={{\n 'shell-page-host--inset-default': this.contentInset === 'default',\n 'shell-page-host--inset-none': this.contentInset === 'none',\n 'shell-page-host--block-start-inset-none': this.contentInsetBlockStart === 'none',\n 'shell-page-host--surface-primary': this.contentSurface === 'primary',\n 'shell-page-host--surface-secondary': this.contentSurface === 'secondary',\n 'shell-page-host--mobile': mobile,\n 'shell-page-host--desktop-header-shell-bar': this.desktopHeaderExternal,\n [`shell-page-host--header-${this.effectiveVariant}`]: true,\n }}\n >\n <div\n ref={el => {\n this.sentinelEl = el ?? null;\n }}\n class=\"shell-page__scroll-sentinel\"\n aria-hidden=\"true\"\n />\n <div\n ref={el => {\n this.stickyHeaderEl = el ?? null;\n }}\n class=\"shell-page__sticky-header\"\n >\n <div\n class=\"shell-page__desktop-header\"\n hidden={mobile}\n aria-hidden={mobile ? 'true' : undefined}\n inert={mobile ? true : undefined}\n >\n <slot name=\"header\" onSlotchange={this.handleHeaderSlotChange} />\n </div>\n <div\n class=\"shell-page__mobile-header\"\n hidden={!mobile}\n aria-hidden={!mobile ? 'true' : undefined}\n inert={!mobile ? true : undefined}\n >\n <slot name=\"mobile-header\" />\n </div>\n </div>\n <div\n ref={el => {\n this.spacerEl = el ?? null;\n }}\n class=\"shell-page__flow-spacer\"\n aria-hidden=\"true\"\n />\n <div class=\"shell-page__content\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n",
355
+ "content": "import { Component, Element, h, Host, Prop, State, Watch } from '@stencil/core';\nimport type { ShellResponsiveMode } from '../../shell/shell-responsive';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport type { BarTitleVariant } from '../BarTitle/bar-title-types';\nimport { resolveShellPageHeaderVariant } from './shell-page-responsive';\nimport type {\n ShellPageCapacity,\n ShellPageContentInset,\n ShellPageContentSurface,\n ShellPageDesktopHeaderPlacement,\n ShellPageHeaderPresentation,\n} from './shell-page-types';\n\ntype BarTitleElement = HTMLElement & { variant: BarTitleVariant };\n\n@Component({\n tag: 'ds-shell-page',\n styleUrl: 'ShellPage.css',\n scoped: true,\n})\nexport class ShellPage {\n private static readonly MAX_HEADER_REVEAL_FRAMES = 12;\n private static readonly MAX_HEADER_GEOMETRY_FRAMES = 12;\n\n @Element() el!: HTMLElement;\n\n /** Automatic capacity/scroll behavior, or an explicit header variant override. */\n @Prop() headerPresentation: ShellPageHeaderPresentation = 'auto';\n\n /** Available page-header capacity supplied by the owning application shell. */\n @Prop() headerCapacity?: ShellPageCapacity;\n\n /** Desktop title chrome is rendered in this page or externally in the shell bar. */\n @Prop({ attribute: 'desktop-header-placement', reflect: true })\n desktopHeaderPlacement: ShellPageDesktopHeaderPlacement = 'page';\n\n /** Standard page gutters, or no inset for full-bleed page content. */\n @Prop() contentInset: ShellPageContentInset = 'default';\n\n /** Preserve the responsive side/end gutters while allowing content to meet the header. */\n @Prop() contentInsetBlockStart: ShellPageContentInset = 'default';\n\n /** Exact block-start content inset, overriding the responsive default when provided. */\n @Prop() contentInsetBlockStartSize?: string;\n\n /** Exact block-start content inset while the header is compact or constrained. */\n @Prop() compactContentInsetBlockStartSize?: string;\n\n /** Allow roomy automatic headers to compact as the page scrolls. */\n @Prop() scrollCompaction: boolean = true;\n\n /** Canvas surface painted around and beneath routed page content. */\n @Prop() contentSurface: ShellPageContentSurface = 'primary';\n\n /** Explicit shell breakpoint presentation. Mobile uses the dedicated mobile-header slot. */\n @Prop({ attribute: 'responsive-mode', reflect: true })\n responsiveMode: ShellResponsiveMode = 'desktop';\n\n @State() private pageTopVisible = true;\n\n private sentinelEl: HTMLElement | null = null;\n private spacerEl: HTMLElement | null = null;\n private stickyHeaderEl: HTMLElement | null = null;\n private headerEl: BarTitleElement | null = null;\n private expandedHeaderHeight = 0;\n private headerTravel = 0;\n private expandedGeometryFrozen = false;\n private pageHeaderResizeObserver: ResizeObserver | null = null;\n private headerResizeObserver: ResizeObserver | null = null;\n private headerMutationObserver: MutationObserver | null = null;\n private headerRevealFrame: number | null = null;\n private headerGeometryFrame: number | null = null;\n private reconnectFrame: number | null = null;\n private scrollRoot: HTMLElement | Window | null = null;\n private hasLoaded = false;\n\n @Watch('headerCapacity')\n @Watch('headerPresentation')\n @Watch('scrollCompaction')\n handleHeaderContractChange() {\n this.syncHeaderVariant(true);\n }\n\n @Watch('responsiveMode')\n handleResponsiveModeChange() {\n this.el.style.removeProperty('--ds-shell-page-sticky-header-block-size');\n this.observeHeader(\n this.responsiveMode === 'mobile' || this.desktopHeaderExternal ? null : this.findHeader()\n );\n this.syncPageHeaderBlockSize();\n }\n\n @Watch('desktopHeaderPlacement')\n handleDesktopHeaderPlacementChange() {\n this.observeHeader(this.desktopHeaderExternal ? null : this.findHeader());\n this.syncPageHeaderBlockSize();\n }\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.connectRuntime();\n }\n\n componentDidRender() {\n this.syncHeaderVariant();\n this.syncPageHeaderBlockSize();\n }\n\n connectedCallback() {\n if (!this.hasLoaded) return;\n if (this.reconnectFrame !== null) cancelAnimationFrame(this.reconnectFrame);\n this.reconnectFrame = requestAnimationFrame(() => {\n this.reconnectFrame = null;\n if (this.el.isConnected) this.connectRuntime();\n });\n }\n\n disconnectedCallback() {\n if (this.reconnectFrame !== null) cancelAnimationFrame(this.reconnectFrame);\n this.reconnectFrame = null;\n this.headerResizeObserver?.disconnect();\n this.headerResizeObserver = null;\n this.pageHeaderResizeObserver?.disconnect();\n this.pageHeaderResizeObserver = null;\n this.headerMutationObserver?.disconnect();\n this.headerMutationObserver = null;\n this.cancelHeaderReveal();\n this.cancelHeaderGeometrySync();\n this.headerEl?.style.removeProperty('--ds-bar-title-divider-inset');\n this.scrollRoot?.removeEventListener('scroll', this.handleScroll);\n this.scrollRoot = null;\n }\n\n private connectRuntime() {\n this.observePageHeaderGeometry();\n this.observeHeader(this.responsiveMode === 'mobile' ? null : this.findHeader());\n this.connectScrollRoot();\n }\n\n private get effectiveVariant(): BarTitleVariant {\n if (this.desktopHeaderExternal) return 'compact';\n return resolveShellPageHeaderVariant(\n this.headerPresentation,\n this.headerCapacity ?? 'roomy',\n this.effectiveScrollCompaction ? this.pageTopVisible : true\n );\n }\n\n private get desktopHeaderExternal(): boolean {\n return this.responsiveMode !== 'mobile' && this.desktopHeaderPlacement === 'shell-bar';\n }\n\n private get effectiveScrollCompaction(): boolean {\n return this.scrollCompaction && !this.desktopHeaderExternal;\n }\n\n private get headerContractResolved(): boolean {\n return this.headerPresentation !== 'auto' || this.headerCapacity !== undefined;\n }\n\n private get isScrollCompacted(): boolean {\n return (\n this.effectiveScrollCompaction &&\n this.headerPresentation === 'auto' &&\n this.headerCapacity === 'roomy' &&\n !this.pageTopVisible\n );\n }\n\n private get contentInsetStyles(): { [name: string]: string } {\n const styles: { [name: string]: string } = {};\n const expanded = this.contentInsetBlockStartSize?.trim();\n const compact = this.compactContentInsetBlockStartSize?.trim();\n if (expanded) styles['--ds-shell-page-content-block-start-inset'] = expanded;\n if (compact) styles['--ds-shell-page-compact-content-block-start-inset'] = compact;\n return styles;\n }\n\n private composedParent(element: Element): Element | null {\n return (element as HTMLElement).assignedSlot?.parentElement ?? element.parentElement;\n }\n\n private findScrollRoot(): HTMLElement | Window {\n let ancestor = this.composedParent(this.el);\n while (ancestor && ancestor !== document.documentElement) {\n const overflow = getComputedStyle(ancestor).overflowY;\n if (overflow === 'auto' || overflow === 'scroll' || overflow === 'overlay') {\n return ancestor as HTMLElement;\n }\n ancestor = this.composedParent(ancestor);\n }\n return window;\n }\n\n private connectScrollRoot() {\n const next = this.findScrollRoot();\n if (next === this.scrollRoot) return;\n this.scrollRoot?.removeEventListener('scroll', this.handleScroll);\n this.scrollRoot = next;\n this.scrollRoot.addEventListener('scroll', this.handleScroll, { passive: true });\n this.handleScroll();\n }\n\n private get scrollRootResolved(): boolean {\n const shell = this.el.closest('ds-shell-app');\n if (!shell) return true;\n const expected = shell.querySelector<HTMLElement>('.shell-app__content');\n return expected !== null && this.scrollRoot === expected;\n }\n\n private handleScroll = () => {\n if (!this.sentinelEl || !this.scrollRoot) return;\n const rootTop =\n this.scrollRoot === window ? 0 : (this.scrollRoot as HTMLElement).getBoundingClientRect().top;\n this.syncHeaderDividerInset(rootTop);\n const nextPageTopVisible = this.sentinelEl.getBoundingClientRect().top >= rootTop;\n if (\n this.effectiveScrollCompaction &&\n !nextPageTopVisible &&\n this.pageTopVisible &&\n this.headerEl?.classList.contains(this.variantClass('expanded'))\n ) {\n this.captureExpandedHeaderGeometry(this.headerEl);\n this.expandedGeometryFrozen = true;\n }\n if (\n nextPageTopVisible &&\n this.expandedGeometryFrozen &&\n this.el.getBoundingClientRect().top >= rootTop\n ) {\n this.expandedGeometryFrozen = false;\n if (this.headerEl?.classList.contains(this.variantClass('expanded'))) {\n this.captureExpandedHeaderGeometry(this.headerEl);\n }\n }\n this.pageTopVisible = nextPageTopVisible;\n };\n\n private findHeader(): BarTitleElement | null {\n return this.el.querySelector<BarTitleElement>('ds-bar-title');\n }\n\n private get compactHeaderHeight(): number {\n return resolveCssLengthPx('--dimension-size-600', 0);\n }\n\n private syncHeaderDividerInset(rootTop?: number) {\n const header = this.headerEl;\n if (!header) return;\n\n const ownsScrollTransition =\n this.effectiveScrollCompaction &&\n this.headerPresentation === 'auto' &&\n this.headerCapacity === 'roomy';\n const expandedInset = resolveCssLengthPx('--dimension-space-200', 0);\n if (\n !ownsScrollTransition ||\n !this.sentinelEl ||\n !this.scrollRoot ||\n this.headerTravel <= 0 ||\n expandedInset <= 0\n ) {\n header.style.removeProperty('--ds-bar-title-divider-inset');\n return;\n }\n\n const scrollRootTop =\n rootTop ??\n (this.scrollRoot === window\n ? 0\n : (this.scrollRoot as HTMLElement).getBoundingClientRect().top);\n const remainingTravel = this.sentinelEl.getBoundingClientRect().top - scrollRootTop;\n const progress = Math.min(1, Math.max(0, 1 - remainingTravel / this.headerTravel));\n header.style.setProperty('--ds-bar-title-divider-inset', `${expandedInset * (1 - progress)}px`);\n }\n\n private setHeaderTravel(distance: number) {\n const next = Math.max(0, distance);\n if (Math.abs(next - this.headerTravel) < 0.5) return;\n this.headerTravel = next;\n this.el.style.setProperty('--ds-shell-page-header-travel', `${next}px`);\n this.handleScroll();\n }\n\n private measureHeaderTravel(header: BarTitleElement) {\n const anchor = header.querySelector<HTMLElement>('[data-shell-page-header-anchor]');\n const compactHeight = this.compactHeaderHeight;\n if (!anchor || compactHeight <= 0) return;\n\n const headerRect = header.getBoundingClientRect();\n const anchorRect = anchor.getBoundingClientRect();\n if (headerRect.height <= 0 || anchorRect.height <= 0) return;\n\n const expandedAnchorTop = anchorRect.top - headerRect.top;\n const compactAnchorTop = Math.max(0, (compactHeight - anchorRect.height) / 2);\n this.setHeaderTravel(expandedAnchorTop - compactAnchorTop);\n }\n\n private captureExpandedHeaderGeometry(header: BarTitleElement) {\n // Keep the largest observed expanded geometry for this header instance.\n // During a variant handoff Chromium can briefly report the compact box\n // before the child host class mutation is delivered; that transient must\n // not erase the flow reservation captured at the roomy page top.\n this.expandedHeaderHeight = Math.max(\n this.expandedHeaderHeight,\n header.getBoundingClientRect().height\n );\n this.measureHeaderTravel(header);\n }\n\n private setSpacerHeight(height: number) {\n if (!this.spacerEl) return;\n this.spacerEl.style.setProperty('--ds-shell-page-flow-spacer', `${Math.max(0, height)}px`);\n }\n\n private variantClass(variant: BarTitleVariant): string {\n return `bar-title-host--${variant}`;\n }\n\n private setStickyHeaderOffset(renderedVariant: BarTitleVariant) {\n this.stickyHeaderEl?.style.setProperty(\n '--ds-shell-page-sticky-offset',\n renderedVariant === 'expanded' &&\n this.effectiveScrollCompaction &&\n this.headerPresentation === 'auto' &&\n this.headerCapacity === 'roomy'\n ? `${-this.headerTravel}px`\n : '0px'\n );\n }\n\n private syncPageHeaderBlockSize() {\n if (this.desktopHeaderExternal) {\n this.el.style.setProperty('--ds-shell-page-sticky-header-block-size', '0px');\n return;\n }\n const renderedHeight = this.stickyHeaderEl?.getBoundingClientRect().height ?? 0;\n if (renderedHeight > 0) {\n this.el.style.setProperty('--ds-shell-page-sticky-header-block-size', `${renderedHeight}px`);\n } else {\n this.el.style.removeProperty('--ds-shell-page-sticky-header-block-size');\n }\n }\n\n private observePageHeaderGeometry() {\n this.pageHeaderResizeObserver?.disconnect();\n this.pageHeaderResizeObserver = null;\n this.syncPageHeaderBlockSize();\n\n if (!this.stickyHeaderEl || typeof ResizeObserver === 'undefined') return;\n this.pageHeaderResizeObserver = new ResizeObserver(() => {\n this.syncPageHeaderBlockSize();\n });\n this.pageHeaderResizeObserver.observe(this.stickyHeaderEl);\n }\n\n private syncRenderedHeaderGeometry(header: BarTitleElement) {\n const renderedVariant = this.effectiveVariant;\n if (!header.classList.contains(this.variantClass(renderedVariant))) return;\n\n this.syncPageHeaderBlockSize();\n\n // Update both flow-preservation pieces before reading layout. Otherwise a\n // reverse compact → expanded render can briefly contain the tall header and\n // the compact spacer together, giving browser scroll anchoring a transient\n // height change to compensate.\n this.setSpacerHeight(\n this.isScrollCompacted ? this.expandedHeaderHeight - this.compactHeaderHeight : 0\n );\n this.setStickyHeaderOffset(renderedVariant);\n\n if (renderedVariant === 'expanded' && !this.expandedGeometryFrozen) {\n this.captureExpandedHeaderGeometry(header);\n this.setStickyHeaderOffset(renderedVariant);\n }\n }\n\n private cancelHeaderGeometrySync() {\n if (this.headerGeometryFrame !== null) cancelAnimationFrame(this.headerGeometryFrame);\n this.headerGeometryFrame = null;\n }\n\n private scheduleHeaderGeometrySync(header: BarTitleElement) {\n this.cancelHeaderGeometrySync();\n let framesRemaining = ShellPage.MAX_HEADER_GEOMETRY_FRAMES;\n let framesElapsed = 0;\n const sync = () => {\n if (this.headerEl !== header) return;\n framesRemaining -= 1;\n framesElapsed += 1;\n // In WebKit a child's componentDidLoad can precede its assignment into\n // the parent's rendered slot. Revalidate after ShellApp has had a frame\n // to expose the actual content scroller.\n this.connectScrollRoot();\n this.syncRenderedHeaderGeometry(header);\n const geometryReady =\n this.effectiveVariant !== 'expanded' ||\n (this.expandedHeaderHeight > 0 && this.headerTravel > 0);\n if (\n (geometryReady && this.scrollRootResolved && framesElapsed >= 2) ||\n framesRemaining <= 0\n ) {\n this.headerGeometryFrame = null;\n return;\n }\n this.headerGeometryFrame = requestAnimationFrame(sync);\n };\n this.headerGeometryFrame = requestAnimationFrame(sync);\n }\n\n private cancelHeaderReveal() {\n if (this.headerRevealFrame !== null) cancelAnimationFrame(this.headerRevealFrame);\n this.headerRevealFrame = null;\n this.headerEl?.removeAttribute('data-shell-page-syncing');\n }\n\n private revealHeaderWhenSynced(header: BarTitleElement, variant: BarTitleVariant) {\n // Stencil normally re-renders within a frame or two of a prop change. Stop\n // polling at the cap, but fail closed: a stale variant must never paint.\n let framesRemaining = ShellPage.MAX_HEADER_REVEAL_FRAMES;\n const reveal = () => {\n if (this.headerEl !== header) {\n header.removeAttribute('data-shell-page-syncing');\n return;\n }\n framesRemaining -= 1;\n if (header.classList.contains(this.variantClass(variant))) {\n header.removeAttribute('data-shell-page-syncing');\n this.headerRevealFrame = null;\n return;\n }\n if (framesRemaining <= 0) {\n this.headerRevealFrame = null;\n return;\n }\n this.headerRevealFrame = requestAnimationFrame(reveal);\n };\n this.headerRevealFrame = requestAnimationFrame(reveal);\n }\n\n private syncHeaderVariant(concealUntilSynced = false) {\n const header = this.headerEl;\n if (!header) return;\n\n this.syncHeaderDividerInset();\n if (!this.headerContractResolved) {\n this.cancelHeaderReveal();\n header.setAttribute('data-shell-page-syncing', '');\n return;\n }\n\n const next = this.effectiveVariant;\n const renderedVariantIsStale = !header.classList.contains(this.variantClass(next));\n if (!renderedVariantIsStale) this.syncRenderedHeaderGeometry(header);\n if (renderedVariantIsStale && this.isScrollCompacted) {\n // Preserve the expanded flow before asking BarTitle to become compact.\n // This prevents the sentinel from moving back into view during the\n // parent/child render handoff and keeps the variant transition stable.\n this.setSpacerHeight(this.expandedHeaderHeight - this.compactHeaderHeight);\n this.setStickyHeaderOffset(next);\n }\n if (concealUntilSynced) {\n this.cancelHeaderReveal();\n header.setAttribute('data-shell-page-syncing', '');\n }\n if (header.variant !== next) {\n header.variant = next;\n // The child update and its MutationObserver callback can land in\n // different phases across engines. Poll the rendered class as the\n // authoritative handoff before committing sticky/spacer geometry.\n this.scheduleHeaderGeometrySync(header);\n }\n if (concealUntilSynced) {\n this.revealHeaderWhenSynced(header, next);\n }\n }\n\n private observeHeader(header: BarTitleElement | null) {\n this.cancelHeaderReveal();\n this.cancelHeaderGeometrySync();\n this.headerResizeObserver?.disconnect();\n this.headerResizeObserver = null;\n this.headerMutationObserver?.disconnect();\n this.headerMutationObserver = null;\n this.headerEl?.style.removeProperty('--ds-bar-title-divider-inset');\n this.headerEl = header;\n this.expandedHeaderHeight = 0;\n this.expandedGeometryFrozen = false;\n this.setHeaderTravel(0);\n this.setSpacerHeight(0);\n this.stickyHeaderEl?.style.setProperty('--ds-shell-page-sticky-offset', '0px');\n\n if (!header) return;\n if (header.classList.contains(this.variantClass('expanded'))) {\n this.captureExpandedHeaderGeometry(header);\n }\n if (typeof ResizeObserver !== 'undefined') {\n this.headerResizeObserver = new ResizeObserver(() => {\n this.syncRenderedHeaderGeometry(header);\n });\n this.headerResizeObserver.observe(header);\n }\n if (typeof MutationObserver !== 'undefined') {\n this.headerMutationObserver = new MutationObserver(() => {\n this.syncRenderedHeaderGeometry(header);\n });\n this.headerMutationObserver.observe(header, {\n attributes: true,\n attributeFilter: ['class'],\n childList: true,\n subtree: true,\n });\n }\n this.syncHeaderVariant(true);\n this.scheduleHeaderGeometrySync(header);\n }\n\n private handleHeaderSlotChange = (event: Event) => {\n if (this.responsiveMode === 'mobile') return;\n const slot = event.target as HTMLSlotElement;\n const header = slot\n .assignedElements()\n .find(element => element.tagName.toLowerCase() === 'ds-bar-title');\n this.observeHeader((header as BarTitleElement | undefined) ?? null);\n };\n\n render() {\n const mobile = this.responsiveMode === 'mobile';\n return (\n <Host\n role=\"main\"\n style={this.contentInsetStyles}\n class={{\n 'shell-page-host--inset-default': this.contentInset === 'default',\n 'shell-page-host--inset-none': this.contentInset === 'none',\n 'shell-page-host--block-start-inset-none': this.contentInsetBlockStart === 'none',\n 'shell-page-host--surface-primary': this.contentSurface === 'primary',\n 'shell-page-host--surface-secondary': this.contentSurface === 'secondary',\n 'shell-page-host--mobile': mobile,\n 'shell-page-host--desktop-header-shell-bar': this.desktopHeaderExternal,\n [`shell-page-host--header-${this.effectiveVariant}`]: true,\n }}\n >\n <div\n ref={el => {\n this.sentinelEl = el ?? null;\n }}\n class=\"shell-page__scroll-sentinel\"\n aria-hidden=\"true\"\n />\n <div\n ref={el => {\n this.stickyHeaderEl = el ?? null;\n }}\n class=\"shell-page__sticky-header\"\n >\n <div\n class=\"shell-page__desktop-header\"\n hidden={mobile}\n aria-hidden={mobile ? 'true' : undefined}\n inert={mobile ? true : undefined}\n >\n <slot name=\"header\" onSlotchange={this.handleHeaderSlotChange} />\n </div>\n <div\n class=\"shell-page__mobile-header\"\n hidden={!mobile}\n aria-hidden={!mobile ? 'true' : undefined}\n inert={!mobile ? true : undefined}\n >\n <slot name=\"mobile-header\" />\n </div>\n </div>\n <div\n ref={el => {\n this.spacerEl = el ?? null;\n }}\n class=\"shell-page__flow-spacer\"\n aria-hidden=\"true\"\n />\n <div class=\"shell-page__content\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n",
356
356
  "type": "registry:ui"
357
357
  },
358
358
  {
@@ -52,6 +52,8 @@ export { DsInputDate } from "./ds-input-date.js";
52
52
  export { DsInputTime } from "./ds-input-time.js";
53
53
  export { DsInput } from "./ds-input.js";
54
54
  export { DsLoader } from "./ds-loader.js";
55
+ export { DsMapClusterMarker } from "./ds-map-cluster-marker.js";
56
+ export { DsMapEntityMarker } from "./ds-map-entity-marker.js";
55
57
  export { DsMarkdown } from "./ds-markdown.js";
56
58
  export { DsMenu } from "./ds-menu.js";
57
59
  export { DsMessageActions } from "./ds-message-actions.js";
@@ -53,6 +53,8 @@ export { DsInputDate } from "./ds-input-date.js";
53
53
  export { DsInputTime } from "./ds-input-time.js";
54
54
  export { DsInput } from "./ds-input.js";
55
55
  export { DsLoader } from "./ds-loader.js";
56
+ export { DsMapClusterMarker } from "./ds-map-cluster-marker.js";
57
+ export { DsMapEntityMarker } from "./ds-map-entity-marker.js";
56
58
  export { DsMarkdown } from "./ds-markdown.js";
57
59
  export { DsMenu } from "./ds-menu.js";
58
60
  export { DsMessageActions } from "./ds-message-actions.js";
@@ -0,0 +1,12 @@
1
+ /**
2
+ * This file was automatically generated by the Stencil React Output Target.
3
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
+ */
5
+ import type { EventName, StencilReactComponent } from './react-runtime.js';
6
+ import { type DsMapClusterMarkerCustomEvent } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsMapClusterMarker as DsMapClusterMarkerElement } from "@ds-mo/ui/dist/components/ds-map-cluster-marker.js";
9
+ export type DsMapClusterMarkerEvents = {
10
+ onDsClick: EventName<DsMapClusterMarkerCustomEvent<MouseEvent>>;
11
+ };
12
+ export declare const DsMapClusterMarker: StencilReactComponent<DsMapClusterMarkerElement, DsMapClusterMarkerEvents, Components.DsMapClusterMarker, 'label'>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { createComponent } from './react-runtime.js';
3
+ import React from 'react';
4
+ import { DsMapClusterMarker as DsMapClusterMarkerElement, defineCustomElement as defineDsMapClusterMarker } from "@ds-mo/ui/dist/components/ds-map-cluster-marker.js";
5
+ export const DsMapClusterMarker = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-map-cluster-marker',
7
+ elementClass: DsMapClusterMarkerElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: { onDsClick: 'dsClick' },
11
+ defineCustomElement: defineDsMapClusterMarker
12
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * This file was automatically generated by the Stencil React Output Target.
3
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
+ */
5
+ import type { EventName, StencilReactComponent } from './react-runtime.js';
6
+ import { type DsMapEntityMarkerCustomEvent } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsMapEntityMarker as DsMapEntityMarkerElement } from "@ds-mo/ui/dist/components/ds-map-entity-marker.js";
9
+ export type DsMapEntityMarkerEvents = {
10
+ onDsClick: EventName<DsMapEntityMarkerCustomEvent<MouseEvent>>;
11
+ };
12
+ export declare const DsMapEntityMarker: StencilReactComponent<DsMapEntityMarkerElement, DsMapEntityMarkerEvents, Components.DsMapEntityMarker, 'label'>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { createComponent } from './react-runtime.js';
3
+ import React from 'react';
4
+ import { DsMapEntityMarker as DsMapEntityMarkerElement, defineCustomElement as defineDsMapEntityMarker } from "@ds-mo/ui/dist/components/ds-map-entity-marker.js";
5
+ export const DsMapEntityMarker = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-map-entity-marker',
7
+ elementClass: DsMapEntityMarkerElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: { onDsClick: 'dsClick' },
11
+ defineCustomElement: defineDsMapEntityMarker
12
+ });
@@ -0,0 +1,19 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ export declare class MapClusterMarker {
3
+ /** Accessible action label. Describe the cluster and what activation does. */
4
+ label: string;
5
+ /** Short visible cluster identifier revealed on hover or keyboard focus. */
6
+ caption: string;
7
+ /** Number of represented entities, compacted at one thousand and above. */
8
+ count: number;
9
+ /** De-emphasizes this cluster when an owner-managed selection is active elsewhere. */
10
+ dimmed: boolean;
11
+ /** Fired when the cluster's native button is activated. */
12
+ dsClick: EventEmitter<MouseEvent>;
13
+ private buttonEl?;
14
+ /** Moves keyboard focus to the cluster button. */
15
+ setFocus(): Promise<void>;
16
+ private handleClick;
17
+ render(): any;
18
+ }
19
+ //# sourceMappingURL=MapClusterMarker.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ export type MapEntityMarkerState = 'in-motion' | 'idling' | 'stationary' | 'immobilized' | 'stale';
3
+ export declare class MapEntityMarker {
4
+ /** Accessible action label. Describe what activating the marker opens. */
5
+ label: string;
6
+ /** Short visible identifier revealed on hover or keyboard focus. */
7
+ caption: string;
8
+ /** Canonical IcoMo icon name for the represented map entity. Immobilized state uses MapKey. */
9
+ icon: string;
10
+ /** Semantic operating state that selects the marker background. */
11
+ state: MapEntityMarkerState;
12
+ /** Adds the stale-data outline while preserving the last known operating state. */
13
+ stale: boolean;
14
+ /** Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359. */
15
+ heading: number;
16
+ /** De-emphasizes this marker when an owner-managed selection is active elsewhere. */
17
+ dimmed: boolean;
18
+ /** Fired when the marker's native button is activated. */
19
+ dsClick: EventEmitter<MouseEvent>;
20
+ private buttonEl?;
21
+ /** Moves keyboard focus to the marker button. */
22
+ setFocus(): Promise<void>;
23
+ private handleClick;
24
+ render(): any;
25
+ }
26
+ //# sourceMappingURL=MapEntityMarker.d.ts.map
@@ -52,6 +52,7 @@ import { InputSize, InputTextAlign, InputType, InputWidth } from "./components/I
52
52
  import { InputDateSize, InputDateWidth } from "./components/InputDate/InputDate";
53
53
  import { InputTimeSize, InputTimeWidth } from "./components/InputTime/InputTime";
54
54
  import { LoaderColor, LoaderSize } from "./components/Loader/Loader";
55
+ import { MapEntityMarkerState } from "./components/MapEntityMarker/MapEntityMarker";
55
56
  import { MenuSelectionMode, MenuSize } from "./components/Menu/Menu";
56
57
  import { MenuAlign, MenuSide } from "./components/Menu/menu-position";
57
58
  import { MessageBubbleVariant } from "./components/MessageBubble/MessageBubble";
@@ -134,6 +135,7 @@ export { InputSize, InputTextAlign, InputType, InputWidth } from "./components/I
134
135
  export { InputDateSize, InputDateWidth } from "./components/InputDate/InputDate";
135
136
  export { InputTimeSize, InputTimeWidth } from "./components/InputTime/InputTime";
136
137
  export { LoaderColor, LoaderSize } from "./components/Loader/Loader";
138
+ export { MapEntityMarkerState } from "./components/MapEntityMarker/MapEntityMarker";
137
139
  export { MenuSelectionMode, MenuSize } from "./components/Menu/Menu";
138
140
  export { MenuAlign, MenuSide } from "./components/Menu/menu-position";
139
141
  export { MessageBubbleVariant } from "./components/MessageBubble/MessageBubble";
@@ -2395,6 +2397,71 @@ export namespace Components {
2395
2397
  */
2396
2398
  "size": LoaderSize;
2397
2399
  }
2400
+ interface DsMapClusterMarker {
2401
+ /**
2402
+ * Short visible cluster identifier revealed on hover or keyboard focus.
2403
+ * @default ''
2404
+ */
2405
+ "caption": string;
2406
+ /**
2407
+ * Number of represented entities, compacted at one thousand and above.
2408
+ * @default 0
2409
+ */
2410
+ "count": number;
2411
+ /**
2412
+ * De-emphasizes this cluster when an owner-managed selection is active elsewhere.
2413
+ * @default false
2414
+ */
2415
+ "dimmed": boolean;
2416
+ /**
2417
+ * Accessible action label. Describe the cluster and what activation does.
2418
+ */
2419
+ "label": string;
2420
+ /**
2421
+ * Moves keyboard focus to the cluster button.
2422
+ */
2423
+ "setFocus": () => Promise<void>;
2424
+ }
2425
+ interface DsMapEntityMarker {
2426
+ /**
2427
+ * Short visible identifier revealed on hover or keyboard focus.
2428
+ * @default ''
2429
+ */
2430
+ "caption": string;
2431
+ /**
2432
+ * De-emphasizes this marker when an owner-managed selection is active elsewhere.
2433
+ * @default false
2434
+ */
2435
+ "dimmed": boolean;
2436
+ /**
2437
+ * Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359.
2438
+ * @default 0
2439
+ */
2440
+ "heading": number;
2441
+ /**
2442
+ * Canonical IcoMo icon name for the represented map entity. Immobilized state uses MapKey.
2443
+ * @default 'MapEntityTravelGroup'
2444
+ */
2445
+ "icon": string;
2446
+ /**
2447
+ * Accessible action label. Describe what activating the marker opens.
2448
+ */
2449
+ "label": string;
2450
+ /**
2451
+ * Moves keyboard focus to the marker button.
2452
+ */
2453
+ "setFocus": () => Promise<void>;
2454
+ /**
2455
+ * Adds the stale-data outline while preserving the last known operating state.
2456
+ * @default false
2457
+ */
2458
+ "stale": boolean;
2459
+ /**
2460
+ * Semantic operating state that selects the marker background.
2461
+ * @default 'in-motion'
2462
+ */
2463
+ "state": MapEntityMarkerState;
2464
+ }
2398
2465
  interface DsMarkdown {
2399
2466
  /**
2400
2467
  * @default ''
@@ -4836,6 +4903,14 @@ export interface DsInputTimeCustomEvent<T> extends CustomEvent<T> {
4836
4903
  detail: T;
4837
4904
  target: HTMLDsInputTimeElement;
4838
4905
  }
4906
+ export interface DsMapClusterMarkerCustomEvent<T> extends CustomEvent<T> {
4907
+ detail: T;
4908
+ target: HTMLDsMapClusterMarkerElement;
4909
+ }
4910
+ export interface DsMapEntityMarkerCustomEvent<T> extends CustomEvent<T> {
4911
+ detail: T;
4912
+ target: HTMLDsMapEntityMarkerElement;
4913
+ }
4839
4914
  export interface DsMenuCustomEvent<T> extends CustomEvent<T> {
4840
4915
  detail: T;
4841
4916
  target: HTMLDsMenuElement;
@@ -5718,6 +5793,40 @@ declare global {
5718
5793
  prototype: HTMLDsLoaderElement;
5719
5794
  new (): HTMLDsLoaderElement;
5720
5795
  };
5796
+ interface HTMLDsMapClusterMarkerElementEventMap {
5797
+ "dsClick": MouseEvent;
5798
+ }
5799
+ interface HTMLDsMapClusterMarkerElement extends Components.DsMapClusterMarker, HTMLStencilElement {
5800
+ addEventListener<K extends keyof HTMLDsMapClusterMarkerElementEventMap>(type: K, listener: (this: HTMLDsMapClusterMarkerElement, ev: DsMapClusterMarkerCustomEvent<HTMLDsMapClusterMarkerElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
5801
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
5802
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
5803
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
5804
+ removeEventListener<K extends keyof HTMLDsMapClusterMarkerElementEventMap>(type: K, listener: (this: HTMLDsMapClusterMarkerElement, ev: DsMapClusterMarkerCustomEvent<HTMLDsMapClusterMarkerElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
5805
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
5806
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
5807
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
5808
+ }
5809
+ var HTMLDsMapClusterMarkerElement: {
5810
+ prototype: HTMLDsMapClusterMarkerElement;
5811
+ new (): HTMLDsMapClusterMarkerElement;
5812
+ };
5813
+ interface HTMLDsMapEntityMarkerElementEventMap {
5814
+ "dsClick": MouseEvent;
5815
+ }
5816
+ interface HTMLDsMapEntityMarkerElement extends Components.DsMapEntityMarker, HTMLStencilElement {
5817
+ addEventListener<K extends keyof HTMLDsMapEntityMarkerElementEventMap>(type: K, listener: (this: HTMLDsMapEntityMarkerElement, ev: DsMapEntityMarkerCustomEvent<HTMLDsMapEntityMarkerElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
5818
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
5819
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
5820
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
5821
+ removeEventListener<K extends keyof HTMLDsMapEntityMarkerElementEventMap>(type: K, listener: (this: HTMLDsMapEntityMarkerElement, ev: DsMapEntityMarkerCustomEvent<HTMLDsMapEntityMarkerElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
5822
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
5823
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
5824
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
5825
+ }
5826
+ var HTMLDsMapEntityMarkerElement: {
5827
+ prototype: HTMLDsMapEntityMarkerElement;
5828
+ new (): HTMLDsMapEntityMarkerElement;
5829
+ };
5721
5830
  interface HTMLDsMarkdownElement extends Components.DsMarkdown, HTMLStencilElement {
5722
5831
  }
5723
5832
  var HTMLDsMarkdownElement: {
@@ -6431,6 +6540,8 @@ declare global {
6431
6540
  "ds-input-date": HTMLDsInputDateElement;
6432
6541
  "ds-input-time": HTMLDsInputTimeElement;
6433
6542
  "ds-loader": HTMLDsLoaderElement;
6543
+ "ds-map-cluster-marker": HTMLDsMapClusterMarkerElement;
6544
+ "ds-map-entity-marker": HTMLDsMapEntityMarkerElement;
6434
6545
  "ds-markdown": HTMLDsMarkdownElement;
6435
6546
  "ds-menu": HTMLDsMenuElement;
6436
6547
  "ds-message": HTMLDsMessageElement;
@@ -8923,6 +9034,71 @@ declare namespace LocalJSX {
8923
9034
  */
8924
9035
  "size"?: LoaderSize;
8925
9036
  }
9037
+ interface DsMapClusterMarker {
9038
+ /**
9039
+ * Short visible cluster identifier revealed on hover or keyboard focus.
9040
+ * @default ''
9041
+ */
9042
+ "caption"?: string;
9043
+ /**
9044
+ * Number of represented entities, compacted at one thousand and above.
9045
+ * @default 0
9046
+ */
9047
+ "count"?: number;
9048
+ /**
9049
+ * De-emphasizes this cluster when an owner-managed selection is active elsewhere.
9050
+ * @default false
9051
+ */
9052
+ "dimmed"?: boolean;
9053
+ /**
9054
+ * Accessible action label. Describe the cluster and what activation does.
9055
+ */
9056
+ "label": string;
9057
+ /**
9058
+ * Fired when the cluster's native button is activated.
9059
+ */
9060
+ "onDsClick"?: (event: DsMapClusterMarkerCustomEvent<MouseEvent>) => void;
9061
+ }
9062
+ interface DsMapEntityMarker {
9063
+ /**
9064
+ * Short visible identifier revealed on hover or keyboard focus.
9065
+ * @default ''
9066
+ */
9067
+ "caption"?: string;
9068
+ /**
9069
+ * De-emphasizes this marker when an owner-managed selection is active elsewhere.
9070
+ * @default false
9071
+ */
9072
+ "dimmed"?: boolean;
9073
+ /**
9074
+ * Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359.
9075
+ * @default 0
9076
+ */
9077
+ "heading"?: number;
9078
+ /**
9079
+ * Canonical IcoMo icon name for the represented map entity. Immobilized state uses MapKey.
9080
+ * @default 'MapEntityTravelGroup'
9081
+ */
9082
+ "icon"?: string;
9083
+ /**
9084
+ * Accessible action label. Describe what activating the marker opens.
9085
+ */
9086
+ "label": string;
9087
+ /**
9088
+ * Fired when the marker's native button is activated.
9089
+ */
9090
+ "onDsClick"?: (event: DsMapEntityMarkerCustomEvent<MouseEvent>) => void;
9091
+ /**
9092
+ * Adds the stale-data outline while preserving the last known operating state.
9093
+ * @default false
9094
+ */
9095
+ "stale"?: boolean;
9096
+ /**
9097
+ * Semantic operating state that selects the marker background.
9098
+ * @default 'in-motion'
9099
+ */
9100
+ "state"?: MapEntityMarkerState;
9101
+ }
8926
9102
  interface DsMarkdown {
8927
9103
  /**
8928
9104
  * @default ''
@@ -11927,6 +12103,21 @@ declare namespace LocalJSX {
11927
12103
  "color": LoaderColor;
11928
12104
  "label": string | undefined;
11929
12105
  }
12106
+ interface DsMapClusterMarkerAttributes {
12107
+ "label": string;
12108
+ "caption": string;
12109
+ "count": number;
12110
+ "dimmed": boolean;
12111
+ }
12112
+ interface DsMapEntityMarkerAttributes {
12113
+ "label": string;
12114
+ "caption": string;
12115
+ "icon": string;
12116
+ "state": MapEntityMarkerState;
12117
+ "stale": boolean;
12118
+ "heading": number;
12119
+ "dimmed": boolean;
12120
+ }
11930
12121
  interface DsMarkdownAttributes {
11931
12122
  "content": string;
11932
12123
  "streaming": boolean;
@@ -12493,6 +12684,8 @@ declare namespace LocalJSX {
12493
12684
  "ds-input-date": Omit<DsInputDate, keyof DsInputDateAttributes> & { [K in keyof DsInputDate & keyof DsInputDateAttributes]?: DsInputDate[K] } & { [K in keyof DsInputDate & keyof DsInputDateAttributes as `attr:${K}`]?: DsInputDateAttributes[K] } & { [K in keyof DsInputDate & keyof DsInputDateAttributes as `prop:${K}`]?: DsInputDate[K] };
12494
12685
  "ds-input-time": Omit<DsInputTime, keyof DsInputTimeAttributes> & { [K in keyof DsInputTime & keyof DsInputTimeAttributes]?: DsInputTime[K] } & { [K in keyof DsInputTime & keyof DsInputTimeAttributes as `attr:${K}`]?: DsInputTimeAttributes[K] } & { [K in keyof DsInputTime & keyof DsInputTimeAttributes as `prop:${K}`]?: DsInputTime[K] };
12495
12686
  "ds-loader": Omit<DsLoader, keyof DsLoaderAttributes> & { [K in keyof DsLoader & keyof DsLoaderAttributes]?: DsLoader[K] } & { [K in keyof DsLoader & keyof DsLoaderAttributes as `attr:${K}`]?: DsLoaderAttributes[K] } & { [K in keyof DsLoader & keyof DsLoaderAttributes as `prop:${K}`]?: DsLoader[K] };
12687
+ "ds-map-cluster-marker": Omit<DsMapClusterMarker, keyof DsMapClusterMarkerAttributes> & { [K in keyof DsMapClusterMarker & keyof DsMapClusterMarkerAttributes]?: DsMapClusterMarker[K] } & { [K in keyof DsMapClusterMarker & keyof DsMapClusterMarkerAttributes as `attr:${K}`]?: DsMapClusterMarkerAttributes[K] } & { [K in keyof DsMapClusterMarker & keyof DsMapClusterMarkerAttributes as `prop:${K}`]?: DsMapClusterMarker[K] } & OneOf<"label", DsMapClusterMarker["label"], DsMapClusterMarkerAttributes["label"]>;
12688
+ "ds-map-entity-marker": Omit<DsMapEntityMarker, keyof DsMapEntityMarkerAttributes> & { [K in keyof DsMapEntityMarker & keyof DsMapEntityMarkerAttributes]?: DsMapEntityMarker[K] } & { [K in keyof DsMapEntityMarker & keyof DsMapEntityMarkerAttributes as `attr:${K}`]?: DsMapEntityMarkerAttributes[K] } & { [K in keyof DsMapEntityMarker & keyof DsMapEntityMarkerAttributes as `prop:${K}`]?: DsMapEntityMarker[K] } & OneOf<"label", DsMapEntityMarker["label"], DsMapEntityMarkerAttributes["label"]>;
12496
12689
  "ds-markdown": Omit<DsMarkdown, keyof DsMarkdownAttributes> & { [K in keyof DsMarkdown & keyof DsMarkdownAttributes]?: DsMarkdown[K] } & { [K in keyof DsMarkdown & keyof DsMarkdownAttributes as `attr:${K}`]?: DsMarkdownAttributes[K] } & { [K in keyof DsMarkdown & keyof DsMarkdownAttributes as `prop:${K}`]?: DsMarkdown[K] };
12497
12690
  "ds-menu": Omit<DsMenu, keyof DsMenuAttributes> & { [K in keyof DsMenu & keyof DsMenuAttributes]?: DsMenu[K] } & { [K in keyof DsMenu & keyof DsMenuAttributes as `attr:${K}`]?: DsMenuAttributes[K] } & { [K in keyof DsMenu & keyof DsMenuAttributes as `prop:${K}`]?: DsMenu[K] };
12498
12691
  "ds-message": Omit<DsMessage, keyof DsMessageAttributes> & { [K in keyof DsMessage & keyof DsMessageAttributes]?: DsMessage[K] } & { [K in keyof DsMessage & keyof DsMessageAttributes as `attr:${K}`]?: DsMessageAttributes[K] } & { [K in keyof DsMessage & keyof DsMessageAttributes as `prop:${K}`]?: DsMessage[K] };
@@ -12612,6 +12805,8 @@ declare module "@stencil/core" {
12612
12805
  "ds-input-date": LocalJSX.IntrinsicElements["ds-input-date"] & JSXBase.HTMLAttributes<HTMLDsInputDateElement>;
12613
12806
  "ds-input-time": LocalJSX.IntrinsicElements["ds-input-time"] & JSXBase.HTMLAttributes<HTMLDsInputTimeElement>;
12614
12807
  "ds-loader": LocalJSX.IntrinsicElements["ds-loader"] & JSXBase.HTMLAttributes<HTMLDsLoaderElement>;
12808
+ "ds-map-cluster-marker": LocalJSX.IntrinsicElements["ds-map-cluster-marker"] & JSXBase.HTMLAttributes<HTMLDsMapClusterMarkerElement>;
12809
+ "ds-map-entity-marker": LocalJSX.IntrinsicElements["ds-map-entity-marker"] & JSXBase.HTMLAttributes<HTMLDsMapEntityMarkerElement>;
12615
12810
  "ds-markdown": LocalJSX.IntrinsicElements["ds-markdown"] & JSXBase.HTMLAttributes<HTMLDsMarkdownElement>;
12616
12811
  "ds-menu": LocalJSX.IntrinsicElements["ds-menu"] & JSXBase.HTMLAttributes<HTMLDsMenuElement>;
12617
12812
  "ds-message": LocalJSX.IntrinsicElements["ds-message"] & JSXBase.HTMLAttributes<HTMLDsMessageElement>;
@@ -52,6 +52,8 @@ export { DsInput } from './ds-input.js';
52
52
  export { DsInputDate } from './ds-input-date.js';
53
53
  export { DsInputTime } from './ds-input-time.js';
54
54
  export { DsLoader } from './ds-loader.js';
55
+ export { DsMapClusterMarker } from './ds-map-cluster-marker.js';
56
+ export { DsMapEntityMarker } from './ds-map-entity-marker.js';
55
57
  export { DsMarkdown } from './ds-markdown.js';
56
58
  export { DsMenu } from './ds-menu.js';
57
59
  export { DsMessage } from './ds-message.js';
@@ -54,6 +54,8 @@ export { DsInput } from './ds-input.js';
54
54
  export { DsInputDate } from './ds-input-date.js';
55
55
  export { DsInputTime } from './ds-input-time.js';
56
56
  export { DsLoader } from './ds-loader.js';
57
+ export { DsMapClusterMarker } from './ds-map-cluster-marker.js';
58
+ export { DsMapEntityMarker } from './ds-map-entity-marker.js';
57
59
  export { DsMarkdown } from './ds-markdown.js';
58
60
  export { DsMenu } from './ds-menu.js';
59
61
  export { DsMessage } from './ds-message.js';
@@ -0,0 +1,3 @@
1
+ import { type StencilVueComponent } from './vue-runtime.js';
2
+ import type { JSX } from '@ds-mo/ui/components';
3
+ export declare const DsMapClusterMarker: StencilVueComponent<JSX.DsMapClusterMarker>;
@@ -0,0 +1,14 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ /* auto-generated vue proxies */
4
+ import { defineContainer } from './vue-runtime.js';
5
+ import { defineCustomElement as defineDsMapClusterMarker } from '@ds-mo/ui/components/ds-map-cluster-marker.js';
6
+ export const DsMapClusterMarker = /*@__PURE__*/ defineContainer('ds-map-cluster-marker', defineDsMapClusterMarker, [
7
+ 'label',
8
+ 'caption',
9
+ 'count',
10
+ 'dimmed',
11
+ 'dsClick'
12
+ ], [
13
+ 'dsClick'
14
+ ]);
@@ -0,0 +1,3 @@
1
+ import { type StencilVueComponent } from './vue-runtime.js';
2
+ import type { JSX } from '@ds-mo/ui/components';
3
+ export declare const DsMapEntityMarker: StencilVueComponent<JSX.DsMapEntityMarker>;
@@ -0,0 +1,17 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ /* auto-generated vue proxies */
4
+ import { defineContainer } from './vue-runtime.js';
5
+ import { defineCustomElement as defineDsMapEntityMarker } from '@ds-mo/ui/components/ds-map-entity-marker.js';
6
+ export const DsMapEntityMarker = /*@__PURE__*/ defineContainer('ds-map-entity-marker', defineDsMapEntityMarker, [
7
+ 'label',
8
+ 'caption',
9
+ 'icon',
10
+ 'state',
11
+ 'stale',
12
+ 'heading',
13
+ 'dimmed',
14
+ 'dsClick'
15
+ ], [
16
+ 'dsClick'
17
+ ]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ds-mo/ui",
3
- "version": "15.1.0",
3
+ "version": "15.2.0",
4
4
  "description": "CompoMo — composable web components styled with TokoMo design tokens",
5
5
  "keywords": [
6
6
  "web-components",