@ds-mo/ui 11.1.0 → 12.1.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 (246) hide show
  1. package/README.md +1 -1
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +150 -9
  4. package/dist/agent.json +488 -174
  5. package/dist/angular/ds-bar-title.d.ts +28 -0
  6. package/dist/angular/ds-bar-title.js +48 -0
  7. package/dist/angular/ds-panel-nav.d.ts +1 -1
  8. package/dist/angular/{ds-app-shell.d.ts → ds-shell-app.d.ts} +5 -5
  9. package/dist/angular/{ds-app-shell.js → ds-shell-app.js} +10 -10
  10. package/dist/angular/ds-shell-page.d.ts +12 -0
  11. package/dist/angular/ds-shell-page.js +38 -0
  12. package/dist/angular/index.d.ts +1 -1
  13. package/dist/angular/index.js +3 -1
  14. package/dist/angular/proxies.d.ts +3 -1
  15. package/dist/angular/proxies.js +3 -1
  16. package/dist/components/ds-agent-activity.js +1 -1
  17. package/dist/components/ds-agent-response.js +1 -1
  18. package/dist/components/ds-agent-response.js.map +1 -1
  19. package/dist/components/ds-agent-source-list.js +1 -1
  20. package/dist/components/ds-agent-tool-call.js +1 -1
  21. package/dist/components/ds-attachment-list.js +1 -1
  22. package/dist/components/ds-avatar.js +1 -1
  23. package/dist/components/ds-avatar.js.map +1 -1
  24. package/dist/components/ds-badge.js +1 -1
  25. package/dist/components/ds-bar-nav.js +1 -1
  26. package/dist/components/ds-bar-nav.js.map +1 -1
  27. package/dist/components/{ds-app-shell.d.ts → ds-bar-title.d.ts} +4 -4
  28. package/dist/components/ds-bar-title.js +2 -0
  29. package/dist/components/ds-bar-title.js.map +1 -0
  30. package/dist/components/ds-button-filled.js +1 -1
  31. package/dist/components/ds-button-unfilled.js +1 -1
  32. package/dist/components/ds-card-data-viz-donut.js +1 -1
  33. package/dist/components/ds-card-setting.js +1 -1
  34. package/dist/components/ds-card-shell-data-viz.js +1 -1
  35. package/dist/components/ds-chart-bar.js +1 -1
  36. package/dist/components/ds-chart-donut.js +1 -1
  37. package/dist/components/ds-chart-legend.js +1 -1
  38. package/dist/components/ds-chart-line.js +1 -1
  39. package/dist/components/ds-checkbox.js +1 -1
  40. package/dist/components/ds-chip.js +1 -1
  41. package/dist/components/ds-code-block.js +1 -1
  42. package/dist/components/ds-conversation-list-item.js +1 -1
  43. package/dist/components/ds-conversation-list-item.js.map +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-empty-state.js +1 -1
  47. package/dist/components/ds-field.js +1 -1
  48. package/dist/components/ds-icon.js +1 -1
  49. package/dist/components/ds-input.js +1 -1
  50. package/dist/components/ds-markdown.js +1 -1
  51. package/dist/components/ds-menu.js +1 -1
  52. package/dist/components/ds-message-composer.js +1 -1
  53. package/dist/components/ds-message-composer.js.map +1 -1
  54. package/dist/components/ds-message-scroller.js +1 -1
  55. package/dist/components/ds-message-scroller.js.map +1 -1
  56. package/dist/components/ds-message.js +1 -1
  57. package/dist/components/ds-modal.js +1 -1
  58. package/dist/components/ds-modal.js.map +1 -1
  59. package/dist/components/ds-panel-nav.js +1 -1
  60. package/dist/components/ds-panel-nav.js.map +1 -1
  61. package/dist/components/ds-panel-sub-nav.js +1 -1
  62. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  63. package/dist/components/ds-panel-tool-header.js +1 -1
  64. package/dist/components/ds-panel-tool-search.js +1 -1
  65. package/dist/components/ds-panel-tool-search.js.map +1 -1
  66. package/dist/components/ds-panel-tools.js +1 -1
  67. package/dist/components/ds-panel-tools.js.map +1 -1
  68. package/dist/components/ds-radio.js +1 -1
  69. package/dist/components/ds-select-multi.js +1 -1
  70. package/dist/components/ds-select-multi.js.map +1 -1
  71. package/dist/components/ds-select.js +1 -1
  72. package/dist/components/ds-select.js.map +1 -1
  73. package/dist/components/ds-shell-app.d.ts +11 -0
  74. package/dist/components/ds-shell-app.js +2 -0
  75. package/dist/components/ds-shell-app.js.map +1 -0
  76. package/dist/components/ds-shell-gradient-picker.js +1 -1
  77. package/dist/components/ds-shell-gradient-picker.js.map +1 -1
  78. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  79. package/dist/components/ds-shell-page.d.ts +11 -0
  80. package/dist/components/ds-shell-page.js +2 -0
  81. package/dist/components/ds-shell-page.js.map +1 -0
  82. package/dist/components/ds-skeleton.js +1 -1
  83. package/dist/components/ds-slider.js +1 -1
  84. package/dist/components/ds-slider.js.map +1 -1
  85. package/dist/components/ds-swatch-picker.js +1 -1
  86. package/dist/components/ds-switch.js +1 -1
  87. package/dist/components/ds-tab-group.js +1 -1
  88. package/dist/components/ds-tag.js +1 -1
  89. package/dist/components/ds-text.js +1 -1
  90. package/dist/components/ds-toast.js +1 -1
  91. package/dist/components/ds-tooltip-data-viz.js +1 -1
  92. package/dist/components/ds-tooltip.js +1 -1
  93. package/dist/components/ds-typing-indicator.js +1 -1
  94. package/dist/components/{p-DJ78wdNv.js → p-B9jvSGid.js} +2 -2
  95. package/dist/components/{p-DuNZGFkV.js → p-BAfG3M8z.js} +2 -2
  96. package/dist/components/p-BAfG3M8z.js.map +1 -0
  97. package/dist/components/{p-Dh4q5TSS.js → p-BfEjWe8U.js} +2 -2
  98. package/dist/components/{p-CZZYGqKz.js → p-Bs6SS34m.js} +2 -2
  99. package/dist/components/p-BzsITTZa.js +2 -0
  100. package/dist/components/p-BzsITTZa.js.map +1 -0
  101. package/dist/components/p-C3Zfn7hz.js +2 -0
  102. package/dist/components/p-C3Zfn7hz.js.map +1 -0
  103. package/dist/components/{p-bNpFhP5L.js → p-CR7yMitN.js} +2 -2
  104. package/dist/components/p-CTV_QWC5.js +2 -0
  105. package/dist/components/p-CTV_QWC5.js.map +1 -0
  106. package/dist/components/p-CUik7PCi.js +2 -0
  107. package/dist/components/p-CUik7PCi.js.map +1 -0
  108. package/dist/components/{p-BKhG2xrW.js → p-D2x17ei-.js} +1 -1
  109. package/dist/components/{p-BKhG2xrW.js.map → p-D2x17ei-.js.map} +1 -1
  110. package/dist/components/{p-CjP8sYlo.js → p-DABj3qTX.js} +2 -2
  111. package/dist/components/p-DfIch2Dk.js +2 -0
  112. package/dist/components/{p-BCCt2eT_.js.map → p-DfIch2Dk.js.map} +1 -1
  113. package/dist/components/{p-Bet_UjML.js → p-Dfxnxx7L.js} +2 -2
  114. package/dist/components/{p-CrwU83-g.js → p-Dg3xLna0.js} +2 -2
  115. package/dist/components/{p-BaZRP4Oo.js → p-DpyTrZa2.js} +2 -2
  116. package/dist/components/{p-P_4vE1ub.js → p-Dqwcw1-m.js} +2 -2
  117. package/dist/components/{p-CyoHRqy6.js → p-DszI94sZ.js} +2 -2
  118. package/dist/components/{p-DrDHC7V6.js → p-DxeHimqk.js} +2 -2
  119. package/dist/components/{p-DrDHC7V6.js.map → p-DxeHimqk.js.map} +1 -1
  120. package/dist/components/p-Dy3Skua8.js +2 -0
  121. package/dist/components/{p-B_qVPsEU.js.map → p-Dy3Skua8.js.map} +1 -1
  122. package/dist/components/{p-CLn7QnE0.js → p-Dy_sZ-dI.js} +2 -2
  123. package/dist/components/{p-BEWtqFX7.js → p-LFGbdi7Y.js} +2 -2
  124. package/dist/components/{p-0kEg-Z4f.js → p-liMPkhUP.js} +2 -2
  125. package/dist/components/{p-CPPAndX2.js → p-tDXHTAJh.js} +2 -2
  126. package/dist/components/{p-DTqCBjUj.js → p-webARv8d.js} +2 -2
  127. package/dist/docs/components.json +1122 -330
  128. package/dist/lib/shell/chrome-transition.d.ts +1 -1
  129. package/dist/lib/shell/index.js +1 -1
  130. package/dist/lib/shell/index.js.map +1 -1
  131. package/dist/lib/shell/shell-gradient.d.ts +2 -2
  132. package/dist/mcp-data/registry/agent-activity.json +1 -1
  133. package/dist/mcp-data/registry/agent-response.json +1 -1
  134. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  135. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  136. package/dist/mcp-data/registry/attachment-list.json +1 -1
  137. package/dist/mcp-data/registry/avatar.json +2 -2
  138. package/dist/mcp-data/registry/badge.json +5 -5
  139. package/dist/mcp-data/registry/bar-nav.json +9 -9
  140. package/dist/mcp-data/registry/bar-title.json +451 -0
  141. package/dist/mcp-data/registry/button-filled.json +1 -1
  142. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  143. package/dist/mcp-data/registry/card-data-viz-donut.json +1 -1
  144. package/dist/mcp-data/registry/card-setting.json +1 -1
  145. package/dist/mcp-data/registry/card-shell-data-viz.json +1 -1
  146. package/dist/mcp-data/registry/chart-bar.json +1 -1
  147. package/dist/mcp-data/registry/chart-donut.json +1 -1
  148. package/dist/mcp-data/registry/chart-legend.json +1 -1
  149. package/dist/mcp-data/registry/chart-line.json +1 -1
  150. package/dist/mcp-data/registry/checkbox.json +1 -1
  151. package/dist/mcp-data/registry/chip.json +1 -1
  152. package/dist/mcp-data/registry/code-block.json +5 -4
  153. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  154. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  155. package/dist/mcp-data/registry/conversation-list.json +1 -1
  156. package/dist/mcp-data/registry/divider.json +1 -1
  157. package/dist/mcp-data/registry/empty-state.json +1 -1
  158. package/dist/mcp-data/registry/field.json +1 -1
  159. package/dist/mcp-data/registry/icon.json +2 -2
  160. package/dist/mcp-data/registry/input.json +1 -1
  161. package/dist/mcp-data/registry/loader.json +1 -1
  162. package/dist/mcp-data/registry/markdown.json +1 -1
  163. package/dist/mcp-data/registry/menu.json +2 -2
  164. package/dist/mcp-data/registry/message-bubble.json +1 -1
  165. package/dist/mcp-data/registry/message-composer.json +8 -6
  166. package/dist/mcp-data/registry/message-scroller.json +5 -4
  167. package/dist/mcp-data/registry/message.json +1 -1
  168. package/dist/mcp-data/registry/modal.json +6 -5
  169. package/dist/mcp-data/registry/panel-nav.json +9 -9
  170. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  171. package/dist/mcp-data/registry/panel-tool-header.json +5 -4
  172. package/dist/mcp-data/registry/panel-tool-search.json +7 -6
  173. package/dist/mcp-data/registry/panel-tools.json +14 -14
  174. package/dist/mcp-data/registry/radio.json +1 -1
  175. package/dist/mcp-data/registry/registry.json +497 -177
  176. package/dist/mcp-data/registry/select-multi.json +3 -2
  177. package/dist/mcp-data/registry/select.json +3 -2
  178. package/dist/mcp-data/registry/shell-app.json +213 -0
  179. package/dist/mcp-data/registry/shell-gradient-picker.json +9 -9
  180. package/dist/mcp-data/registry/shell-gradient-swatch.json +3 -3
  181. package/dist/mcp-data/registry/shell-page.json +200 -0
  182. package/dist/mcp-data/registry/skeleton.json +1 -1
  183. package/dist/mcp-data/registry/slider.json +1 -1
  184. package/dist/mcp-data/registry/swatch-picker.json +2 -2
  185. package/dist/mcp-data/registry/switch.json +1 -1
  186. package/dist/mcp-data/registry/tab-group.json +1 -1
  187. package/dist/mcp-data/registry/tag.json +1 -1
  188. package/dist/mcp-data/registry/text.json +1 -1
  189. package/dist/mcp-data/registry/toast.json +1 -1
  190. package/dist/mcp-data/registry/tooltip-data-viz.json +1 -1
  191. package/dist/mcp-data/registry/tooltip.json +1 -1
  192. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  193. package/dist/react/components.d.ts +3 -1
  194. package/dist/react/components.js +3 -1
  195. package/dist/react/ds-bar-title.d.ts +14 -0
  196. package/dist/react/ds-bar-title.js +16 -0
  197. package/dist/react/{ds-app-shell.d.ts → ds-shell-app.d.ts} +3 -3
  198. package/dist/react/ds-shell-app.js +12 -0
  199. package/dist/react/ds-shell-page.d.ts +9 -0
  200. package/dist/react/ds-shell-page.js +12 -0
  201. package/dist/types/components/Badge/Badge.d.ts +1 -1
  202. package/dist/types/components/BarTitle/BarTitle.d.ts +76 -0
  203. package/dist/types/components/BarTitle/bar-title-types.d.ts +30 -0
  204. package/dist/types/components/BarTitle/index.d.ts +2 -0
  205. package/dist/types/components/Menu/Menu.d.ts +5 -0
  206. package/dist/types/components/PanelNav/PanelNav.d.ts +1 -1
  207. package/dist/types/components/{AppShell/AppShell.d.ts → ShellApp/ShellApp.d.ts} +3 -3
  208. package/dist/types/components/ShellPage/ShellPage.d.ts +42 -0
  209. package/dist/types/components/ShellPage/index.d.ts +3 -0
  210. package/dist/types/components/ShellPage/shell-page-responsive.d.ts +12 -0
  211. package/dist/types/components/ShellPage/shell-page-types.d.ts +5 -0
  212. package/dist/types/components.d.ts +278 -55
  213. package/dist/types/shell/chrome-transition.d.ts +1 -1
  214. package/dist/types/shell/shell-gradient.d.ts +2 -2
  215. package/dist/types/shell/shell-shortcuts.d.ts +1 -1
  216. package/package.json +3 -3
  217. package/dist/components/ds-app-shell.js +0 -2
  218. package/dist/components/ds-app-shell.js.map +0 -1
  219. package/dist/components/p-BCCt2eT_.js +0 -2
  220. package/dist/components/p-B_qVPsEU.js +0 -2
  221. package/dist/components/p-BsnezUUC.js +0 -2
  222. package/dist/components/p-BsnezUUC.js.map +0 -1
  223. package/dist/components/p-C1K5QGUZ.js +0 -2
  224. package/dist/components/p-C1K5QGUZ.js.map +0 -1
  225. package/dist/components/p-CKaJx0IX.js +0 -2
  226. package/dist/components/p-CKaJx0IX.js.map +0 -1
  227. package/dist/components/p-DuNZGFkV.js.map +0 -1
  228. package/dist/components/p-ZTugT4as.js +0 -2
  229. package/dist/components/p-ZTugT4as.js.map +0 -1
  230. package/dist/mcp-data/registry/app-shell.json +0 -210
  231. package/dist/react/ds-app-shell.js +0 -12
  232. /package/dist/components/{p-DJ78wdNv.js.map → p-B9jvSGid.js.map} +0 -0
  233. /package/dist/components/{p-Dh4q5TSS.js.map → p-BfEjWe8U.js.map} +0 -0
  234. /package/dist/components/{p-CZZYGqKz.js.map → p-Bs6SS34m.js.map} +0 -0
  235. /package/dist/components/{p-bNpFhP5L.js.map → p-CR7yMitN.js.map} +0 -0
  236. /package/dist/components/{p-CjP8sYlo.js.map → p-DABj3qTX.js.map} +0 -0
  237. /package/dist/components/{p-Bet_UjML.js.map → p-Dfxnxx7L.js.map} +0 -0
  238. /package/dist/components/{p-CrwU83-g.js.map → p-Dg3xLna0.js.map} +0 -0
  239. /package/dist/components/{p-BaZRP4Oo.js.map → p-DpyTrZa2.js.map} +0 -0
  240. /package/dist/components/{p-P_4vE1ub.js.map → p-Dqwcw1-m.js.map} +0 -0
  241. /package/dist/components/{p-CyoHRqy6.js.map → p-DszI94sZ.js.map} +0 -0
  242. /package/dist/components/{p-CLn7QnE0.js.map → p-Dy_sZ-dI.js.map} +0 -0
  243. /package/dist/components/{p-BEWtqFX7.js.map → p-LFGbdi7Y.js.map} +0 -0
  244. /package/dist/components/{p-0kEg-Z4f.js.map → p-liMPkhUP.js.map} +0 -0
  245. /package/dist/components/{p-CPPAndX2.js.map → p-tDXHTAJh.js.map} +0 -0
  246. /package/dist/components/{p-DTqCBjUj.js.map → p-webARv8d.js.map} +0 -0
@@ -0,0 +1,451 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "bar-title",
4
+ "title": "BarTitle",
5
+ "description": "Page-level title chrome with default and create/edit editor modes, optional route navigation, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/bar-title",
11
+ "source": "src/wc/components/BarTitle/BarTitle.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "stable",
16
+ "summary": "Page-level title chrome with default and create/edit editor modes, optional route navigation, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
17
+ "useWhen": [
18
+ "A top-level page needs one h1 above its content.",
19
+ "A list or detail page has multiple route-level sections that belong in the inline active-section menu.",
20
+ "A detail page needs a page-level Back action, or a create/edit page needs editor-mode Exit and Save chrome.",
21
+ "A page needs one primary action plus optional secondary or destructive overflow commands."
22
+ ],
23
+ "avoidWhen": [
24
+ "The title belongs to a PanelTools drawer or fullscreen pane; use PanelToolHeader through PanelTools instead.",
25
+ "The choices are primary application destinations or BarNav destinations rather than sections within the current page.",
26
+ "The heading belongs to a card, modal, or other bounded region rather than the page.",
27
+ "Local panels inside page content should remain directly selectable; use TabGroup instead.",
28
+ "Automatic sticky or responsive page orchestration is required; compose BarTitle in ShellPage rather than implementing it in the header."
29
+ ],
30
+ "alternatives": [
31
+ {
32
+ "when": "The header belongs to a PanelTools product view.",
33
+ "component": "component:ds-panel-tool-header",
34
+ "reason": "PanelToolHeader owns pane-level Back and actions without creating page chrome."
35
+ },
36
+ {
37
+ "when": "A small set of inner-page panels should remain visible as tabs.",
38
+ "component": "component:ds-tab-group",
39
+ "reason": "TabGroup is the local content-view control rather than route-level page title chrome."
40
+ }
41
+ ],
42
+ "commonlyComposedWith": [
43
+ "component:ds-shell-page",
44
+ "component:ds-button-filled",
45
+ "component:ds-button-unfilled",
46
+ "component:ds-menu",
47
+ "component:ds-text"
48
+ ],
49
+ "patterns": [
50
+ "pattern:shell-page"
51
+ ],
52
+ "accessibility": [
53
+ "Provide one concise heading; BarTitle renders exactly one h1 and changes only its visual recipe between variants.",
54
+ "Give Back a destination-specific accessible name such as Back to Drivers, provide the concise parent label such as Drivers for the expanded breadcrumb, and handle dsBack in the route owner.",
55
+ "Keep value synchronized with the current child route; dsSectionChange returns the selected section id.",
56
+ "Section and overflow triggers expose menu relationships and restore focus after selection or dismissal.",
57
+ "Use one filled primary action in the page decision area and mark destructive overflow actions explicitly."
58
+ ],
59
+ "states": [
60
+ "Omitting Back, sections, primaryAction, and actions produces the top-level title-only header.",
61
+ "Two or more selectable sections add the inline section trigger; one section does not render a redundant menu.",
62
+ "Dividers in sections or actions create separate Menu groups without becoming selectable rows.",
63
+ "expanded renders the larger heading, optional description, inset divider, and an xs icon-label Back breadcrumb in the top inset. The title and right-side actions share one top alignment whether Back is present, while the description remains in the left title column; compact renders 48px chrome with inline Back; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
64
+ "primaryAction collapse defaults to auto. Use never for exceptional default-mode actions whose hierarchy must remain visible in constrained layouts.",
65
+ "editor mode renders bold-brand chrome without the bottom boundary, treats the leading dsBack action as Exit, and keeps the primary Save action visible. Expanded uses Cross plus the Exit label and a label Save button; compact and constrained use Cross and Check icon buttons."
66
+ ],
67
+ "responsiveBehavior": [
68
+ "BarTitle does not observe viewport, shell, scroll, or container state. Its owner selects an explicit variant.",
69
+ "ShellPage is the standard owner for automatic expanded, compact, and constrained selection.",
70
+ "Compact titles use the shared md control inset so top-level headings align with BarNav and inline Back geometry aligns with PanelToolHeader. Long headings and section labels truncate independently while Back and action controls retain complete hit targets and accessible names.",
71
+ "A never-collapse default-mode primary action remains visible in constrained mode; the title and section label yield space first.",
72
+ "Editor mode keeps Exit and Save available in every presentation. Supply a concise Exit accessible name through backAriaLabel, use backLabel for the expanded Exit label, and provide primaryAction so dsAction can identify Save."
73
+ ],
74
+ "frameworkCaveats": {
75
+ "customElements": [
76
+ "Assign sections, primaryAction, and actions as JavaScript properties and replace array or object identities when controlled state changes.",
77
+ "Handle dsBack in the router owner, update value after dsSectionChange, and execute product commands from dsAction."
78
+ ],
79
+ "react": [
80
+ "Pass arrays and objects directly to DsBarTitle and keep value controlled from route state.",
81
+ "Place DsBarTitle in DsShellPage with slot=header when automatic page behavior is required."
82
+ ],
83
+ "angular": [
84
+ "Bind complex values on the standalone DsBarTitle adapter and handle the three intent events in the route shell.",
85
+ "Place ds-bar-title in ds-shell-page with slot=header; do not render router-outlet inside BarTitle."
86
+ ]
87
+ },
88
+ "references": [
89
+ {
90
+ "label": "Explicit variant examples",
91
+ "path": "src/wc/components/BarTitle/BarTitle.stories.ts"
92
+ },
93
+ {
94
+ "label": "ShellPage composition and responsive examples",
95
+ "path": "src/wc/components/ShellPage/ShellPage.stories.ts"
96
+ },
97
+ {
98
+ "label": "Cross-browser shell-page and header coverage",
99
+ "path": "tests/e2e/bar-title.spec.ts"
100
+ }
101
+ ]
102
+ },
103
+ "api": {
104
+ "props": {
105
+ "actions": {
106
+ "type": "BarTitleActionItem[]",
107
+ "resolvedType": "BarTitleActionItem[]",
108
+ "default": "[]",
109
+ "required": false,
110
+ "mutable": false,
111
+ "description": "Secondary page actions shown in the overflow menu. Dividers create groups."
112
+ },
113
+ "actionsAriaLabel": {
114
+ "type": "string",
115
+ "resolvedType": "string",
116
+ "attribute": "actions-aria-label",
117
+ "default": "'More page actions'",
118
+ "required": false,
119
+ "mutable": false,
120
+ "description": "Accessible name for the page-actions menu."
121
+ },
122
+ "backAriaLabel": {
123
+ "type": "string",
124
+ "resolvedType": "string",
125
+ "attribute": "back-aria-label",
126
+ "default": "'Back'",
127
+ "required": false,
128
+ "mutable": false,
129
+ "description": "Accessible name for the leading Back action."
130
+ },
131
+ "backLabel": {
132
+ "type": "string",
133
+ "resolvedType": "string",
134
+ "attribute": "back-label",
135
+ "default": "'Back'",
136
+ "required": false,
137
+ "mutable": false,
138
+ "description": "Visible parent-page label used by the expanded Back breadcrumb."
139
+ },
140
+ "description": {
141
+ "type": "string",
142
+ "resolvedType": "string",
143
+ "attribute": "description",
144
+ "default": "''",
145
+ "required": false,
146
+ "mutable": false,
147
+ "description": "Optional supporting copy shown in the expanded presentation."
148
+ },
149
+ "heading": {
150
+ "type": "string",
151
+ "resolvedType": "string",
152
+ "attribute": "heading",
153
+ "required": true,
154
+ "mutable": false,
155
+ "description": "The page's single visible h1."
156
+ },
157
+ "mode": {
158
+ "type": "BarTitleMode",
159
+ "resolvedType": "\"default\" | \"editor\"",
160
+ "attribute": "mode",
161
+ "default": "'default'",
162
+ "required": false,
163
+ "mutable": false,
164
+ "description": "Semantic page-header treatment. Editor mode uses bold-brand create/edit chrome."
165
+ },
166
+ "primaryAction": {
167
+ "type": "BarTitlePrimaryAction | null",
168
+ "resolvedType": "BarTitlePrimaryAction | null",
169
+ "default": "null",
170
+ "required": false,
171
+ "mutable": false,
172
+ "description": "The one highest-emphasis page action."
173
+ },
174
+ "sections": {
175
+ "type": "BarTitleSectionItem[]",
176
+ "resolvedType": "BarTitleSectionItem[]",
177
+ "default": "[]",
178
+ "required": false,
179
+ "mutable": false,
180
+ "description": "Optional page sections exposed through the active-section menu."
181
+ },
182
+ "sectionsAriaLabel": {
183
+ "type": "string",
184
+ "resolvedType": "string",
185
+ "attribute": "sections-aria-label",
186
+ "default": "'Change page section'",
187
+ "required": false,
188
+ "mutable": false,
189
+ "description": "Accessible name for the page-section menu."
190
+ },
191
+ "showBack": {
192
+ "type": "boolean",
193
+ "resolvedType": "boolean",
194
+ "attribute": "show-back",
195
+ "default": "false",
196
+ "required": false,
197
+ "mutable": false,
198
+ "description": "Show the leading page-level Back action."
199
+ },
200
+ "value": {
201
+ "type": "string",
202
+ "resolvedType": "string",
203
+ "attribute": "value",
204
+ "default": "''",
205
+ "required": false,
206
+ "mutable": false,
207
+ "description": "Id of the active page section."
208
+ },
209
+ "variant": {
210
+ "type": "BarTitleVariant",
211
+ "resolvedType": "\"compact\" | \"constrained\" | \"expanded\"",
212
+ "attribute": "variant",
213
+ "default": "'expanded'",
214
+ "required": false,
215
+ "mutable": false,
216
+ "description": "Explicit visual/capacity variant. ShellPage owns automatic selection."
217
+ }
218
+ },
219
+ "events": [
220
+ {
221
+ "name": "dsAction",
222
+ "detail": "string",
223
+ "bubbles": true,
224
+ "cancelable": true,
225
+ "composed": true,
226
+ "description": "Emitted with the activated primary or overflow action id."
227
+ },
228
+ {
229
+ "name": "dsBack",
230
+ "detail": "MouseEvent",
231
+ "bubbles": true,
232
+ "cancelable": true,
233
+ "composed": true,
234
+ "description": "Emitted when the leading Back action is activated."
235
+ },
236
+ {
237
+ "name": "dsSectionChange",
238
+ "detail": "string",
239
+ "bubbles": true,
240
+ "cancelable": true,
241
+ "composed": true,
242
+ "description": "Emitted with the newly selected page-section id."
243
+ }
244
+ ],
245
+ "methods": [],
246
+ "slots": []
247
+ },
248
+ "props": {
249
+ "actions": {
250
+ "type": "BarTitleActionItem[]",
251
+ "resolvedType": "BarTitleActionItem[]",
252
+ "default": "[]",
253
+ "required": false,
254
+ "mutable": false,
255
+ "description": "Secondary page actions shown in the overflow menu. Dividers create groups."
256
+ },
257
+ "actionsAriaLabel": {
258
+ "type": "string",
259
+ "resolvedType": "string",
260
+ "attribute": "actions-aria-label",
261
+ "default": "'More page actions'",
262
+ "required": false,
263
+ "mutable": false,
264
+ "description": "Accessible name for the page-actions menu."
265
+ },
266
+ "backAriaLabel": {
267
+ "type": "string",
268
+ "resolvedType": "string",
269
+ "attribute": "back-aria-label",
270
+ "default": "'Back'",
271
+ "required": false,
272
+ "mutable": false,
273
+ "description": "Accessible name for the leading Back action."
274
+ },
275
+ "backLabel": {
276
+ "type": "string",
277
+ "resolvedType": "string",
278
+ "attribute": "back-label",
279
+ "default": "'Back'",
280
+ "required": false,
281
+ "mutable": false,
282
+ "description": "Visible parent-page label used by the expanded Back breadcrumb."
283
+ },
284
+ "description": {
285
+ "type": "string",
286
+ "resolvedType": "string",
287
+ "attribute": "description",
288
+ "default": "''",
289
+ "required": false,
290
+ "mutable": false,
291
+ "description": "Optional supporting copy shown in the expanded presentation."
292
+ },
293
+ "heading": {
294
+ "type": "string",
295
+ "resolvedType": "string",
296
+ "attribute": "heading",
297
+ "required": true,
298
+ "mutable": false,
299
+ "description": "The page's single visible h1."
300
+ },
301
+ "mode": {
302
+ "type": "BarTitleMode",
303
+ "resolvedType": "\"default\" | \"editor\"",
304
+ "attribute": "mode",
305
+ "default": "'default'",
306
+ "required": false,
307
+ "mutable": false,
308
+ "description": "Semantic page-header treatment. Editor mode uses bold-brand create/edit chrome."
309
+ },
310
+ "primaryAction": {
311
+ "type": "BarTitlePrimaryAction | null",
312
+ "resolvedType": "BarTitlePrimaryAction | null",
313
+ "default": "null",
314
+ "required": false,
315
+ "mutable": false,
316
+ "description": "The one highest-emphasis page action."
317
+ },
318
+ "sections": {
319
+ "type": "BarTitleSectionItem[]",
320
+ "resolvedType": "BarTitleSectionItem[]",
321
+ "default": "[]",
322
+ "required": false,
323
+ "mutable": false,
324
+ "description": "Optional page sections exposed through the active-section menu."
325
+ },
326
+ "sectionsAriaLabel": {
327
+ "type": "string",
328
+ "resolvedType": "string",
329
+ "attribute": "sections-aria-label",
330
+ "default": "'Change page section'",
331
+ "required": false,
332
+ "mutable": false,
333
+ "description": "Accessible name for the page-section menu."
334
+ },
335
+ "showBack": {
336
+ "type": "boolean",
337
+ "resolvedType": "boolean",
338
+ "attribute": "show-back",
339
+ "default": "false",
340
+ "required": false,
341
+ "mutable": false,
342
+ "description": "Show the leading page-level Back action."
343
+ },
344
+ "value": {
345
+ "type": "string",
346
+ "resolvedType": "string",
347
+ "attribute": "value",
348
+ "default": "''",
349
+ "required": false,
350
+ "mutable": false,
351
+ "description": "Id of the active page section."
352
+ },
353
+ "variant": {
354
+ "type": "BarTitleVariant",
355
+ "resolvedType": "\"compact\" | \"constrained\" | \"expanded\"",
356
+ "attribute": "variant",
357
+ "default": "'expanded'",
358
+ "required": false,
359
+ "mutable": false,
360
+ "description": "Explicit visual/capacity variant. ShellPage owns automatic selection."
361
+ }
362
+ },
363
+ "events": [
364
+ {
365
+ "name": "dsAction",
366
+ "detail": "string",
367
+ "bubbles": true,
368
+ "cancelable": true,
369
+ "composed": true,
370
+ "description": "Emitted with the activated primary or overflow action id."
371
+ },
372
+ {
373
+ "name": "dsBack",
374
+ "detail": "MouseEvent",
375
+ "bubbles": true,
376
+ "cancelable": true,
377
+ "composed": true,
378
+ "description": "Emitted when the leading Back action is activated."
379
+ },
380
+ {
381
+ "name": "dsSectionChange",
382
+ "detail": "string",
383
+ "bubbles": true,
384
+ "cancelable": true,
385
+ "composed": true,
386
+ "description": "Emitted with the newly selected page-section id."
387
+ }
388
+ ],
389
+ "methods": [],
390
+ "slots": [],
391
+ "exports": {
392
+ "customElement": "ds-bar-title",
393
+ "react": "DsBarTitle",
394
+ "angular": "DsBarTitle"
395
+ },
396
+ "consumption": {
397
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
398
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
399
+ "customElements": {
400
+ "import": "import '@ds-mo/ui/dist/components/ds-bar-title.js';",
401
+ "example": "<ds-bar-title></ds-bar-title>"
402
+ },
403
+ "react": {
404
+ "import": "import { DsBarTitle } from '@ds-mo/ui/react';",
405
+ "example": "<DsBarTitle />"
406
+ },
407
+ "angular": {
408
+ "import": "import { DsBarTitle } from '@ds-mo/ui/angular/ds-bar-title';",
409
+ "example": "<ds-bar-title></ds-bar-title>"
410
+ },
411
+ "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: actions, primaryAction, sections.",
412
+ "peerDependencies": {
413
+ "required": [
414
+ "@ds-mo/tokens ^3.1.1",
415
+ "@ds-mo/icons ^6.4.0"
416
+ ],
417
+ "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
418
+ }
419
+ }
420
+ },
421
+ "dependencies": [
422
+ "@ds-mo/ui",
423
+ "@ds-mo/tokens",
424
+ "@ds-mo/icons"
425
+ ],
426
+ "registryDependencies": [
427
+ "button-filled",
428
+ "button-unfilled",
429
+ "icon",
430
+ "menu",
431
+ "text",
432
+ "tooltip"
433
+ ],
434
+ "files": [
435
+ {
436
+ "path": "src/wc/components/BarTitle/BarTitle.css",
437
+ "content": "@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n\n:host {\n display: block;\n min-width: 0;\n box-sizing: border-box;\n background: var(--color-background-primary);\n}\n\n:host([data-shell-page-syncing]) {\n visibility: hidden;\n}\n\n.bar-title {\n position: relative;\n min-width: 0;\n padding: 0;\n box-sizing: border-box;\n background: var(--color-background-primary);\n}\n\n:host(.bar-title-host--editor),\n:host(.bar-title-host--editor) .bar-title {\n background: var(--color-background-bold-brand);\n}\n\n.bar-title::after {\n content: '';\n position: absolute;\n inset: auto var(--dimension-space-400) 0;\n height: var(--dimension-stroke-width-012);\n background: var(--color-border-tertiary);\n pointer-events: none;\n}\n\n:host(.bar-title-host--editor) .bar-title::after {\n display: none;\n}\n\n.bar-title__inner {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--dimension-space-100);\n padding: var(--dimension-space-400);\n box-sizing: border-box;\n}\n\n.bar-title__row {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--dimension-space-100);\n min-height: var(--dimension-size-400);\n min-width: 0;\n}\n\n:host(.bar-title-host--expanded) .bar-title__row {\n gap: var(--dimension-space-400);\n}\n\n.bar-title__leading {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--dimension-space-050);\n min-width: 0;\n}\n\n/*\n * Pull the whole leading block up by exactly the breadcrumb row's own box\n * (its xs control-height + its top margin + the row-gap below it), so the\n * title row lands flush with the actions' top without moving actions.\n * Tied to the same tokens that size the breadcrumb, not a guessed pixel value.\n */\n:host(.bar-title-host--expanded.bar-title-host--has-back) .bar-title__leading {\n margin-block-start: calc(-1 * (var(--dimension-size-200) + var(--dimension-space-050) * 2));\n}\n\n.bar-title__title-row {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n min-width: 0;\n min-height: var(--dimension-size-400);\n}\n\n.bar-title__identity {\n display: flex;\n flex: 0 1 auto;\n align-items: center;\n gap: var(--dimension-space-050);\n min-width: 0;\n}\n\n.bar-title__back,\n.bar-title__breadcrumb-back,\n.bar-title__section-chevron {\n flex: 0 0 auto;\n}\n\n.bar-title__breadcrumb,\n.bar-title__exit {\n display: flex;\n align-items: center;\n min-width: 0;\n margin-block-start: var(--dimension-space-050);\n}\n\n.bar-title__heading {\n display: block;\n width: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: none;\n}\n\n.bar-title__divider {\n width: var(--dimension-stroke-width-012);\n height: var(--dimension-size-250);\n margin-inline-start: var(--dimension-space-100);\n flex: 0 0 var(--dimension-stroke-width-012);\n background: var(--color-border-tertiary);\n}\n\n.bar-title__section-selector {\n display: flex;\n flex: 0 1 auto;\n min-width: 0;\n max-width: var(--dimension-panel-width-sm);\n}\n\n.bar-title__section-trigger {\n --ds-control-radius: var(--dimension-radius-half);\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n height: var(--ds-control-height);\n min-width: 0;\n max-width: 100%;\n padding-inline: var(--ds-control-padding-inline);\n border: none;\n border-radius: var(--ds-control-radius);\n box-sizing: border-box;\n background: transparent;\n color: var(--color-foreground-secondary);\n cursor: pointer;\n font-family: inherit;\n user-select: none;\n transition: color var(--effect-motion-short-2);\n}\n\n.bar-title__section-trigger--expanded {\n color: var(--color-foreground-primary);\n}\n\n:host(.bar-title-host--editor) .bar-title__divider {\n background: var(--color-border-on-bold-background-tertiary);\n}\n\n:host(.bar-title-host--editor) .bar-title__section-trigger {\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n:host(.bar-title-host--editor) .bar-title__section-trigger--expanded {\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n.bar-title__section-trigger--expanded::after,\n.bar-title__section-trigger--expanded:hover::after {\n background: var(--ds-interaction-pressed);\n}\n\n.bar-title__section-label {\n min-width: 0;\n padding-inline: var(--ds-control-label-inset);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.bar-title__actions {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n flex: 0 0 auto;\n}\n\n.bar-title__description {\n display: block;\n min-width: 0;\n max-width: 100%;\n}\n\n:host(.bar-title-host--compact) .bar-title {\n height: var(--dimension-size-600);\n padding: var(--dimension-space-100);\n}\n\n:host(.bar-title-host--compact) .bar-title::after {\n inset-inline: 0;\n}\n\n:host(.bar-title-host--compact) .bar-title__inner {\n height: 100%;\n padding: 0;\n gap: 0;\n}\n\n:host(.bar-title-host--compact) .bar-title__row {\n height: 100%;\n align-items: center;\n}\n\n:host(.bar-title-host--compact) .bar-title__identity {\n height: var(--dimension-size-400);\n}\n\n:host(.bar-title-host--compact) .bar-title__divider {\n margin-inline-start: 0;\n}\n\n:host(.bar-title-host--compact) .bar-title__heading {\n display: inline-flex;\n flex: 1 1 auto;\n align-items: center;\n height: var(--dimension-size-400);\n padding-inline: calc(var(--ds-control-padding-inline) + var(--ds-control-label-inset));\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .bar-title__section-trigger {\n transition: none;\n }\n}\n",
438
+ "type": "registry:ui"
439
+ },
440
+ {
441
+ "path": "src/wc/components/BarTitle/BarTitle.tsx",
442
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop, State, Watch } from '@stencil/core';\nimport type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport {\n isBarTitleDivider,\n type BarTitleAction,\n type BarTitleActionItem,\n type BarTitleMode,\n type BarTitlePrimaryAction,\n type BarTitleSection,\n type BarTitleSectionItem,\n type BarTitleVariant,\n} from './bar-title-types';\n\nlet nextBarTitleId = 0;\n\ntype FocusableButton = HTMLElement & { setFocus?: () => Promise<void> };\n\n@Component({\n tag: 'ds-bar-title',\n styleUrl: 'BarTitle.css',\n scoped: true,\n})\nexport class BarTitle {\n /** The page's single visible h1. */\n @Prop() heading!: string;\n\n /** Optional supporting copy shown in the expanded presentation. */\n @Prop() description: string = '';\n\n /** Show the leading page-level Back action. */\n @Prop({ attribute: 'show-back' }) showBack: boolean = false;\n\n /** Accessible name for the leading Back action. */\n @Prop() backAriaLabel: string = 'Back';\n\n /** Visible parent-page label used by the expanded Back breadcrumb. */\n @Prop() backLabel: string = 'Back';\n\n /** Optional page sections exposed through the active-section menu. */\n @Prop() sections: BarTitleSectionItem[] = [];\n\n /** Id of the active page section. */\n @Prop() value: string = '';\n\n /** Accessible name for the page-section menu. */\n @Prop() sectionsAriaLabel: string = 'Change page section';\n\n /** The one highest-emphasis page action. */\n @Prop() primaryAction: BarTitlePrimaryAction | null = null;\n\n /** Secondary page actions shown in the overflow menu. Dividers create groups. */\n @Prop() actions: BarTitleActionItem[] = [];\n\n /** Accessible name for the page-actions menu. */\n @Prop() actionsAriaLabel: string = 'More page actions';\n\n /** Explicit visual/capacity variant. ShellPage owns automatic selection. */\n @Prop() variant: BarTitleVariant = 'expanded';\n\n /** Semantic page-header treatment. Editor mode uses bold-brand create/edit chrome. */\n @Prop() mode: BarTitleMode = 'default';\n\n /** Emitted when the leading Back action is activated. */\n @Event() dsBack!: EventEmitter<MouseEvent>;\n\n /** Emitted with the newly selected page-section id. */\n @Event() dsSectionChange!: EventEmitter<string>;\n\n /** Emitted with the activated primary or overflow action id. */\n @Event() dsAction!: EventEmitter<string>;\n\n @State() private sectionMenuOpen = false;\n @State() private actionMenuOpen = false;\n @State() private sectionMenuInitialFocusVisible = false;\n @State() private actionMenuInitialFocusVisible = false;\n\n private readonly instanceId = nextBarTitleId++;\n private readonly sectionMenuTriggerId = `bar-title-section-trigger-${this.instanceId}`;\n private readonly sectionMenuId = `bar-title-section-menu-${this.instanceId}`;\n private readonly actionMenuTriggerId = `bar-title-action-trigger-${this.instanceId}`;\n private readonly actionMenuId = `bar-title-action-menu-${this.instanceId}`;\n private sectionTriggerEl: HTMLButtonElement | null = null;\n private actionTriggerEl: FocusableButton | null = null;\n\n @Watch('sections')\n handleSectionsChange() {\n if (!this.hasSectionSelector) this.closeSectionMenu();\n }\n\n @Watch('actions')\n @Watch('primaryAction')\n handleActionsChange() {\n if (!this.showActionMenuTrigger) this.closeActionMenu();\n }\n\n private get compact(): boolean {\n return this.variant !== 'expanded';\n }\n\n private get editor(): boolean {\n return this.mode === 'editor';\n }\n\n /** Tooltip copy is fixed and generic; backAriaLabel/actionsAriaLabel stay page-specific. */\n private get backTooltipLabel(): string {\n return this.editor ? 'Exit' : 'Go back';\n }\n\n private get primaryCollapsed(): boolean {\n return (\n !this.editor &&\n this.variant === 'constrained' &&\n this.primaryAction !== null &&\n (this.primaryAction.collapse ?? 'auto') === 'auto'\n );\n }\n\n private get selectableSections(): BarTitleSection[] {\n return this.sections.filter((item): item is BarTitleSection => !isBarTitleDivider(item));\n }\n\n private get hasSectionSelector(): boolean {\n return this.selectableSections.length > 1;\n }\n\n private get effectiveValue(): string {\n return this.selectableSections.some(section => section.id === this.value)\n ? this.value\n : (this.selectableSections[0]?.id ?? '');\n }\n\n private get selectedSectionLabel(): string {\n return this.selectableSections.find(section => section.id === this.effectiveValue)?.label ?? '';\n }\n\n private get sectionTriggerAriaLabel(): string {\n return `${this.sectionsAriaLabel}. Current section: ${this.selectedSectionLabel}`;\n }\n\n private groupsFromItems<T extends BarTitleSection | BarTitleAction>(\n source: Array<T | { type: 'divider' }>,\n map: (item: T) => MenuItemData\n ): MenuSection[] {\n const groups: MenuSection[] = [];\n let items: MenuItemData[] = [];\n const commit = () => {\n if (items.length > 0) groups.push({ items });\n items = [];\n };\n\n for (const item of source) {\n if (isBarTitleDivider(item)) {\n commit();\n } else {\n items.push(map(item));\n }\n }\n commit();\n return groups;\n }\n\n private get sectionMenuSections(): MenuSection[] {\n return this.groupsFromItems(this.sections, section => ({\n label: section.label,\n value: section.id,\n isSelected: section.id === this.effectiveValue,\n isInactive: section.isInactive,\n }));\n }\n\n private get selectableActions(): BarTitleAction[] {\n return this.actions.filter((item): item is BarTitleAction => !isBarTitleDivider(item));\n }\n\n private get showActionMenuTrigger(): boolean {\n return (\n this.selectableActions.length > 0 || (this.primaryCollapsed && this.primaryAction !== null)\n );\n }\n\n private actionMenuItem(action: BarTitleAction | BarTitlePrimaryAction): MenuItemData {\n const primary = action as BarTitlePrimaryAction;\n return {\n label: action.label,\n value: action.id,\n isInactive: action.isInactive || primary.isLoading,\n isDestructive: action.isDestructive || primary.intent === 'negative',\n };\n }\n\n private get actionMenuSections(): MenuSection[] {\n const groups = this.groupsFromItems(this.actions, action => this.actionMenuItem(action));\n if (!this.primaryCollapsed || !this.primaryAction) return groups;\n return [{ items: [this.actionMenuItem(this.primaryAction)] }, ...groups];\n }\n\n private toggleSectionMenu = (event: MouseEvent) => {\n this.sectionMenuInitialFocusVisible = event.detail === 0;\n this.actionMenuOpen = false;\n this.sectionMenuOpen = !this.sectionMenuOpen;\n };\n\n private closeSectionMenu = () => {\n this.sectionMenuOpen = false;\n };\n\n private handleSectionSelect = (event: CustomEvent<MenuItemData>) => {\n const id = String(event.detail?.value ?? '');\n const selected = this.selectableSections.find(section => section.id === id);\n if (!selected || selected.isInactive) return;\n this.closeSectionMenu();\n this.dsSectionChange.emit(id);\n requestAnimationFrame(() => this.sectionTriggerEl?.focus());\n };\n\n private toggleActionMenu = (event: MouseEvent) => {\n this.actionMenuInitialFocusVisible = event.detail === 0;\n this.sectionMenuOpen = false;\n this.actionMenuOpen = !this.actionMenuOpen;\n };\n\n private closeActionMenu = () => {\n this.actionMenuOpen = false;\n };\n\n private handleActionSelect = (event: CustomEvent<MenuItemData>) => {\n const id = String(event.detail?.value ?? '');\n const primaryMatches = this.primaryCollapsed && this.primaryAction?.id === id;\n const action = this.selectableActions.find(candidate => candidate.id === id);\n if (!primaryMatches && !action) return;\n if (\n (primaryMatches && (this.primaryAction?.isInactive || this.primaryAction?.isLoading)) ||\n action?.isInactive\n ) {\n return;\n }\n this.closeActionMenu();\n this.dsAction.emit(id);\n requestAnimationFrame(() => void this.actionTriggerEl?.setFocus?.());\n };\n\n private renderSectionSelector() {\n if (!this.hasSectionSelector) return null;\n return [\n <div class=\"bar-title__divider\" aria-hidden=\"true\" />,\n <div class=\"bar-title__section-selector\">\n <button\n ref={el => {\n this.sectionTriggerEl = el ?? null;\n }}\n id={this.sectionMenuTriggerId}\n class={{\n 'bar-title__section-trigger': true,\n 'bar-title__section-trigger--expanded': this.sectionMenuOpen,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--on-bold': this.editor,\n }}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-controls={this.sectionMenuId}\n aria-expanded={String(this.sectionMenuOpen)}\n aria-label={this.sectionTriggerAriaLabel}\n onClick={this.toggleSectionMenu}\n >\n <ds-text\n class=\"bar-title__section-label ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis\n color={this.editor ? 'on-bold' : 'primary'}\n >\n {this.selectedSectionLabel}\n </ds-text>\n <ds-icon\n class=\"bar-title__section-chevron ds-interaction-fill__content\"\n name=\"ChevronUpDown\"\n size=\"md\"\n color=\"inherit\"\n aria-hidden=\"true\"\n />\n </button>\n </div>,\n ];\n }\n\n private renderActions() {\n const primary = this.primaryAction;\n const compactEditor = this.editor && this.compact;\n if (!primary && !this.showActionMenuTrigger) return null;\n\n return (\n <div class=\"bar-title__actions\">\n {primary && !this.primaryCollapsed ? (\n compactEditor ? (\n <ds-tooltip label={primary.label} side=\"bottom\" size=\"sm\">\n <ds-button-filled\n class=\"bar-title__primary-action\"\n variant=\"icon\"\n icon=\"Check\"\n label={primary.label}\n aria-label={primary.label}\n intent=\"brand\"\n contrast=\"faint\"\n background=\"bold\"\n size=\"md\"\n type={primary.type ?? 'button'}\n isInactive={primary.isInactive}\n isLoading={primary.isLoading}\n onDsClick={() => this.dsAction.emit(primary.id)}\n />\n </ds-tooltip>\n ) : (\n <ds-button-filled\n class=\"bar-title__primary-action\"\n variant={primary.icon ? 'icon-label' : 'label'}\n icon={primary.icon ?? ''}\n label={primary.label}\n intent={this.editor ? 'brand' : (primary.intent ?? 'brand')}\n contrast={this.editor ? 'faint' : (primary.contrast ?? 'bold')}\n background={this.editor ? 'bold' : undefined}\n size=\"md\"\n type={primary.type ?? 'button'}\n isInactive={primary.isInactive}\n isLoading={primary.isLoading}\n onDsClick={() => this.dsAction.emit(primary.id)}\n />\n )\n ) : null}\n {this.showActionMenuTrigger ? (\n <ds-tooltip label=\"Page options\" side=\"bottom\" size=\"sm\">\n <ds-button-unfilled\n ref={el => {\n this.actionTriggerEl = el ?? null;\n }}\n id={this.actionMenuTriggerId}\n class=\"bar-title__more-actions\"\n variant=\"icon\"\n icon=\"Ellipses\"\n aria-label={this.actionsAriaLabel}\n size=\"md\"\n background={this.editor ? 'bold' : undefined}\n activeFill={!this.compact && !this.editor}\n hasBorder={!this.compact && !this.primaryCollapsed && !this.editor}\n haspopup=\"menu\"\n controls={this.actionMenuId}\n expanded={this.actionMenuOpen}\n onDsClick={(event: CustomEvent<MouseEvent>) => this.toggleActionMenu(event.detail)}\n />\n </ds-tooltip>\n ) : null}\n </div>\n );\n }\n\n private renderBack(compact: boolean) {\n if (!this.showBack) return null;\n\n if (!compact) {\n if (this.editor) {\n return (\n <div class=\"bar-title__exit\">\n <ds-button-unfilled\n class=\"bar-title__exit-action\"\n variant=\"icon-label\"\n icon=\"Cross\"\n label={this.backLabel}\n aria-label={this.backAriaLabel}\n size=\"xs\"\n background=\"bold\"\n activeFill={false}\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) => this.dsBack.emit(event.detail)}\n />\n </div>\n );\n }\n\n return (\n <div class=\"bar-title__breadcrumb\">\n <ds-button-unfilled\n class=\"bar-title__breadcrumb-back\"\n variant=\"icon-label\"\n icon=\"ChevronLeft\"\n label={this.backLabel}\n aria-label={this.backAriaLabel}\n size=\"xs\"\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) => this.dsBack.emit(event.detail)}\n />\n </div>\n );\n }\n\n return (\n <ds-tooltip label={this.backTooltipLabel} side=\"bottom\" size=\"sm\">\n <ds-button-unfilled\n class=\"bar-title__back\"\n variant=\"icon\"\n icon={this.editor ? 'Cross' : 'ChevronLeft'}\n aria-label={this.backAriaLabel}\n size=\"md\"\n background={this.editor ? 'bold' : undefined}\n activeFill={false}\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) => this.dsBack.emit(event.detail)}\n />\n </ds-tooltip>\n );\n }\n\n render() {\n const compact = this.compact;\n return (\n <Host\n class={{\n 'bar-title-host--compact': compact,\n 'bar-title-host--expanded': this.variant === 'expanded',\n 'bar-title-host--constrained': this.variant === 'constrained',\n 'bar-title-host--editor': this.editor,\n 'bar-title-host--has-description': !!this.description,\n 'bar-title-host--has-back': this.showBack,\n }}\n >\n <div class=\"bar-title\">\n <div class=\"bar-title__inner\">\n <div class=\"bar-title__row\">\n <div class=\"bar-title__leading\">\n {!compact ? this.renderBack(false) : null}\n <div class=\"bar-title__title-row\">\n <div class=\"bar-title__identity\">\n {compact ? this.renderBack(true) : null}\n <ds-text\n class=\"bar-title__heading ds-control--md\"\n variant={compact ? 'text-title-small' : 'text-title-medium'}\n emphasis\n color={this.editor ? 'on-bold' : 'primary'}\n as=\"h1\"\n lineTruncation={1}\n >\n {this.heading}\n </ds-text>\n </div>\n {this.renderSectionSelector()}\n </div>\n {this.description && !compact ? (\n <ds-text\n class=\"bar-title__description\"\n variant=\"text-body-small\"\n color={\n this.editor\n ? 'var(--color-foreground-on-bold-background-secondary)'\n : 'secondary'\n }\n lineTruncation={2}\n wrap=\"wrap\"\n as=\"p\"\n >\n {this.description}\n </ds-text>\n ) : null}\n </div>\n {this.renderActions()}\n </div>\n </div>\n </div>\n\n {this.hasSectionSelector ? (\n <ds-menu\n id={this.sectionMenuId}\n class=\"bar-title__section-menu\"\n anchorId={this.sectionMenuTriggerId}\n menuLabel={this.sectionsAriaLabel}\n open={this.sectionMenuOpen}\n initialFocusVisible={this.sectionMenuInitialFocusVisible}\n sections={this.sectionMenuSections}\n onDsClose={this.closeSectionMenu}\n onDsSelect={this.handleSectionSelect}\n />\n ) : null}\n\n {this.showActionMenuTrigger ? (\n <ds-menu\n id={this.actionMenuId}\n class=\"bar-title__action-menu\"\n anchorId={this.actionMenuTriggerId}\n align=\"end\"\n menuLabel={this.actionsAriaLabel}\n open={this.actionMenuOpen}\n initialFocusVisible={this.actionMenuInitialFocusVisible}\n sections={this.actionMenuSections}\n onDsClose={this.closeActionMenu}\n onDsSelect={this.handleActionSelect}\n />\n ) : null}\n </Host>\n );\n }\n}\n",
443
+ "type": "registry:ui"
444
+ },
445
+ {
446
+ "path": "src/wc/components/BarTitle/bar-title-types.ts",
447
+ "content": "import type { ButtonFilledContrast, ButtonFilledIntent } from '../ButtonFilled/ButtonFilled';\n\nexport interface BarTitleSection {\n id: string;\n label: string;\n isInactive?: boolean;\n}\n\nexport interface BarTitleDivider {\n type: 'divider';\n}\n\nexport type BarTitleSectionItem = BarTitleSection | BarTitleDivider;\n\nexport interface BarTitleAction {\n id: string;\n label: string;\n isInactive?: boolean;\n isDestructive?: boolean;\n}\n\nexport interface BarTitlePrimaryAction extends BarTitleAction {\n icon?: string;\n intent?: ButtonFilledIntent;\n contrast?: ButtonFilledContrast;\n isLoading?: boolean;\n type?: 'button' | 'submit' | 'reset';\n collapse?: BarTitlePrimaryActionCollapse;\n}\n\nexport type BarTitleActionItem = BarTitleAction | BarTitleDivider;\n\nexport type BarTitleVariant = 'expanded' | 'compact' | 'constrained';\n\nexport type BarTitleMode = 'default' | 'editor';\n\nexport type BarTitlePrimaryActionCollapse = 'auto' | 'never';\n\nexport function isBarTitleDivider(\n item: BarTitleSectionItem | BarTitleActionItem\n): item is BarTitleDivider {\n return 'type' in item && item.type === 'divider';\n}\n",
448
+ "type": "registry:ui"
449
+ }
450
+ ]
451
+ }
@@ -391,7 +391,7 @@
391
391
  "peerDependencies": {
392
392
  "required": [
393
393
  "@ds-mo/tokens ^3.1.1",
394
- "@ds-mo/icons ^6.3.0"
394
+ "@ds-mo/icons ^6.4.0"
395
395
  ],
396
396
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
397
397
  }
@@ -505,7 +505,7 @@
505
505
  "peerDependencies": {
506
506
  "required": [
507
507
  "@ds-mo/tokens ^3.1.1",
508
- "@ds-mo/icons ^6.3.0"
508
+ "@ds-mo/icons ^6.4.0"
509
509
  ],
510
510
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
511
511
  }
@@ -183,7 +183,7 @@
183
183
  "peerDependencies": {
184
184
  "required": [
185
185
  "@ds-mo/tokens ^3.1.1",
186
- "@ds-mo/icons ^6.3.0"
186
+ "@ds-mo/icons ^6.4.0"
187
187
  ],
188
188
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
189
189
  }
@@ -250,7 +250,7 @@
250
250
  "peerDependencies": {
251
251
  "required": [
252
252
  "@ds-mo/tokens ^3.1.1",
253
- "@ds-mo/icons ^6.3.0"
253
+ "@ds-mo/icons ^6.4.0"
254
254
  ],
255
255
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
256
256
  }
@@ -145,7 +145,7 @@
145
145
  "peerDependencies": {
146
146
  "required": [
147
147
  "@ds-mo/tokens ^3.1.1",
148
- "@ds-mo/icons ^6.3.0"
148
+ "@ds-mo/icons ^6.4.0"
149
149
  ],
150
150
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
151
151
  }
@@ -159,7 +159,7 @@
159
159
  "peerDependencies": {
160
160
  "required": [
161
161
  "@ds-mo/tokens ^3.1.1",
162
- "@ds-mo/icons ^6.3.0"
162
+ "@ds-mo/icons ^6.4.0"
163
163
  ],
164
164
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
165
165
  }
@@ -315,7 +315,7 @@
315
315
  "peerDependencies": {
316
316
  "required": [
317
317
  "@ds-mo/tokens ^3.1.1",
318
- "@ds-mo/icons ^6.3.0"
318
+ "@ds-mo/icons ^6.4.0"
319
319
  ],
320
320
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
321
321
  }
@@ -251,7 +251,7 @@
251
251
  "peerDependencies": {
252
252
  "required": [
253
253
  "@ds-mo/tokens ^3.1.1",
254
- "@ds-mo/icons ^6.3.0"
254
+ "@ds-mo/icons ^6.4.0"
255
255
  ],
256
256
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
257
257
  }
@@ -191,7 +191,7 @@
191
191
  "peerDependencies": {
192
192
  "required": [
193
193
  "@ds-mo/tokens ^3.1.1",
194
- "@ds-mo/icons ^6.3.0"
194
+ "@ds-mo/icons ^6.4.0"
195
195
  ],
196
196
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
197
197
  }
@@ -333,7 +333,7 @@
333
333
  "peerDependencies": {
334
334
  "required": [
335
335
  "@ds-mo/tokens ^3.1.1",
336
- "@ds-mo/icons ^6.3.0"
336
+ "@ds-mo/icons ^6.4.0"
337
337
  ],
338
338
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
339
339
  }
@@ -246,7 +246,7 @@
246
246
  "peerDependencies": {
247
247
  "required": [
248
248
  "@ds-mo/tokens ^3.1.1",
249
- "@ds-mo/icons ^6.3.0"
249
+ "@ds-mo/icons ^6.4.0"
250
250
  ],
251
251
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
252
252
  }