@ds-mo/ui 13.5.0 → 13.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +9 -2
  3. package/dist/agent.json +171 -8
  4. package/dist/angular/ds-banner.d.ts +23 -0
  5. package/dist/angular/ds-banner.js +45 -0
  6. package/dist/angular/ds-modal.d.ts +1 -1
  7. package/dist/angular/ds-modal.js +3 -3
  8. package/dist/angular/index.d.ts +1 -1
  9. package/dist/angular/index.js +1 -0
  10. package/dist/angular/proxies.d.ts +1 -0
  11. package/dist/angular/proxies.js +1 -0
  12. package/dist/components/ds-agent-activity.js +1 -1
  13. package/dist/components/ds-agent-response.js +1 -1
  14. package/dist/components/ds-agent-source-list.js +1 -1
  15. package/dist/components/ds-agent-tool-call.js +1 -1
  16. package/dist/components/ds-attachment-list.js +1 -1
  17. package/dist/components/ds-badge.js +1 -1
  18. package/dist/components/ds-banner.d.ts +11 -0
  19. package/dist/components/ds-banner.js +2 -0
  20. package/dist/components/ds-banner.js.map +1 -0
  21. package/dist/components/ds-bar-nav.js +1 -1
  22. package/dist/components/ds-bar-title.js +1 -1
  23. package/dist/components/ds-bar-workflow.js +1 -1
  24. package/dist/components/ds-breadcrumb.js +1 -1
  25. package/dist/components/ds-button-filled.js +1 -1
  26. package/dist/components/ds-button-unfilled.js +1 -1
  27. package/dist/components/ds-card-data-viz.js +1 -1
  28. package/dist/components/ds-card-overview.js +1 -1
  29. package/dist/components/ds-card-setting.js +1 -1
  30. package/dist/components/ds-card-setting.js.map +1 -1
  31. package/dist/components/ds-chart-bar.js +1 -1
  32. package/dist/components/ds-chart-donut.js +1 -1
  33. package/dist/components/ds-chart-legend.js +1 -1
  34. package/dist/components/ds-chart-line.js +1 -1
  35. package/dist/components/ds-checkbox.js +1 -1
  36. package/dist/components/ds-chip.js +1 -1
  37. package/dist/components/ds-code-block.js +1 -1
  38. package/dist/components/ds-conversation-list-item.js +1 -1
  39. package/dist/components/ds-conversation-list-section.js +1 -1
  40. package/dist/components/ds-conversation-list.js +1 -1
  41. package/dist/components/ds-divider.js +1 -1
  42. package/dist/components/ds-empty-state.js +1 -1
  43. package/dist/components/ds-field.js +1 -1
  44. package/dist/components/ds-input.js +1 -1
  45. package/dist/components/ds-markdown.js +1 -1
  46. package/dist/components/ds-menu.js +1 -1
  47. package/dist/components/ds-message-actions.js +1 -1
  48. package/dist/components/ds-message-actions.js.map +1 -1
  49. package/dist/components/ds-message-bubble.js +1 -1
  50. package/dist/components/ds-message-composer.js +1 -1
  51. package/dist/components/ds-message-scroller.js +1 -1
  52. package/dist/components/ds-message.js +1 -1
  53. package/dist/components/ds-mobile-bar-nav.js +1 -1
  54. package/dist/components/ds-mobile-header.js +1 -1
  55. package/dist/components/ds-mobile-section-switcher.js +1 -1
  56. package/dist/components/ds-mobile-sheet-nav.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-sub-nav.js +1 -1
  61. package/dist/components/ds-panel-tool-header.js +1 -1
  62. package/dist/components/ds-panel-tool-search.js +1 -1
  63. package/dist/components/ds-panel-tools.js +1 -1
  64. package/dist/components/ds-radio.js +1 -1
  65. package/dist/components/ds-scroll-overlay.js +1 -1
  66. package/dist/components/ds-scroll-overlay.js.map +1 -1
  67. package/dist/components/ds-select.js +1 -1
  68. package/dist/components/ds-shell-app.js +1 -1
  69. package/dist/components/ds-shell-app.js.map +1 -1
  70. package/dist/components/ds-shell-page.js +1 -1
  71. package/dist/components/ds-shell-tools.js +1 -1
  72. package/dist/components/ds-skeleton.js +1 -1
  73. package/dist/components/ds-slider.js +1 -1
  74. package/dist/components/ds-swatch-picker.js +1 -1
  75. package/dist/components/ds-switch.js +1 -1
  76. package/dist/components/ds-tab-group.js +1 -1
  77. package/dist/components/ds-tag.js +1 -1
  78. package/dist/components/ds-text.js +1 -1
  79. package/dist/components/ds-toast.js +1 -1
  80. package/dist/components/ds-tooltip-data-viz.js +1 -1
  81. package/dist/components/ds-tooltip.js +1 -1
  82. package/dist/components/ds-typing-indicator.js +1 -1
  83. package/dist/components/{p-BN9FZESH.js → p-1S9AW2MA.js} +2 -2
  84. package/dist/components/{p-D4bVE7e4.js → p-6B411hQA.js} +2 -2
  85. package/dist/components/{p-D5PN6zdD.js → p-B-kRByho.js} +2 -2
  86. package/dist/components/{p-CmUGA_q4.js → p-B4_0Ys4w.js} +2 -2
  87. package/dist/components/{p-BApNi_xA.js → p-B6RrZQqw.js} +2 -2
  88. package/dist/components/{p-CQ4vAZ9j.js → p-BBtjABBS.js} +2 -2
  89. package/dist/components/{p-CmMfRM1s.js → p-BFfHIu6y.js} +2 -2
  90. package/dist/components/{p-CBiAsFAZ.js → p-BPyymeuR.js} +2 -2
  91. package/dist/components/{p-Bgh0uG51.js → p-BR_oMaas.js} +2 -2
  92. package/dist/components/{p-w2kKeG_h.js → p-Bb4f5SuF.js} +2 -2
  93. package/dist/components/p-Bl6A5AJq.js +2 -0
  94. package/dist/components/{p-CIgag7g2.js.map → p-Bl6A5AJq.js.map} +1 -1
  95. package/dist/components/{p-B5snQKiP.js → p-BmNpPyzf.js} +2 -2
  96. package/dist/components/{p-CWItD0gL.js → p-Bmo4T96l.js} +2 -2
  97. package/dist/components/{p-DHAuidt1.js → p-Bsfpxto1.js} +2 -2
  98. package/dist/components/{p-BxEOlO5k.js → p-CKRJX0Y0.js} +2 -2
  99. package/dist/components/{p-1moOgMI-.js → p-Ca6s5fLR.js} +2 -2
  100. package/dist/components/{p-RT1mts9U.js → p-CbjFUpOj.js} +2 -2
  101. package/dist/components/{p-CqOswTy8.js → p-CuJ3J6OJ.js} +2 -2
  102. package/dist/components/{p-BQTJ7ePr.js → p-CxgMUvqg.js} +2 -2
  103. package/dist/components/{p-a6cnCKWk.js → p-CzraIk34.js} +2 -2
  104. package/dist/components/p-CzraIk34.js.map +1 -0
  105. package/dist/components/{p-CWKrq35a.js → p-D0bM3cKj.js} +2 -2
  106. package/dist/components/{p-UtfErnpX.js → p-D2cjoj2r.js} +2 -2
  107. package/dist/components/{p-CGwVooB6.js → p-DHF5cLzr.js} +2 -2
  108. package/dist/components/{p-BgjtMMye.js → p-DVuxzrCC.js} +2 -2
  109. package/dist/components/p-DX4c3kZ1.js +2 -0
  110. package/dist/components/p-DX4c3kZ1.js.map +1 -0
  111. package/dist/components/p-DaqFuVKZ.js +2 -0
  112. package/dist/components/p-DaqFuVKZ.js.map +1 -0
  113. package/dist/components/{p-DXGKfXTh.js → p-DfvDNcoq.js} +2 -2
  114. package/dist/components/p-Di81y9Q2.js +2 -0
  115. package/dist/components/{p-C_3mZMFK.js → p-Eep5mxtv.js} +2 -2
  116. package/dist/components/{p-DoNdiEly.js → p-IYy-jODg.js} +2 -2
  117. package/dist/components/{p-DtV263qO.js → p-iCjUWcp7.js} +2 -2
  118. package/dist/components/{p-BgASe-BH.js → p-og48Kh2i.js} +2 -2
  119. package/dist/components/{p-BSocHH2X.js → p-wOOAzVMC.js} +2 -2
  120. package/dist/docs/components.json +436 -1
  121. package/dist/mcp-data/registry/banner.json +333 -0
  122. package/dist/mcp-data/registry/bar-title.json +3 -3
  123. package/dist/mcp-data/registry/message-actions.json +2 -1
  124. package/dist/mcp-data/registry/mobile-bar-nav.json +3 -3
  125. package/dist/mcp-data/registry/modal.json +25 -5
  126. package/dist/mcp-data/registry/panel-tool-header.json +3 -3
  127. package/dist/mcp-data/registry/panel-tools.json +3 -2
  128. package/dist/mcp-data/registry/registry.json +173 -7
  129. package/dist/mcp-data/registry/shell-app.json +6 -2
  130. package/dist/react/components.d.ts +1 -0
  131. package/dist/react/components.js +1 -0
  132. package/dist/react/ds-banner.d.ts +13 -0
  133. package/dist/react/ds-banner.js +15 -0
  134. package/dist/types/components/Banner/Banner.d.ts +50 -0
  135. package/dist/types/components/Modal/Modal.d.ts +4 -0
  136. package/dist/types/components/PanelTools/PanelTools.d.ts +7 -0
  137. package/dist/types/components.d.ts +138 -0
  138. package/package.json +1 -1
  139. package/dist/components/p-4scN0Mgn.js +0 -2
  140. package/dist/components/p-B3PdrMP0.js +0 -2
  141. package/dist/components/p-B3PdrMP0.js.map +0 -1
  142. package/dist/components/p-CIgag7g2.js +0 -2
  143. package/dist/components/p-CUSz0JFa.js +0 -2
  144. package/dist/components/p-CUSz0JFa.js.map +0 -1
  145. package/dist/components/p-a6cnCKWk.js.map +0 -1
  146. /package/dist/components/{p-BN9FZESH.js.map → p-1S9AW2MA.js.map} +0 -0
  147. /package/dist/components/{p-D4bVE7e4.js.map → p-6B411hQA.js.map} +0 -0
  148. /package/dist/components/{p-D5PN6zdD.js.map → p-B-kRByho.js.map} +0 -0
  149. /package/dist/components/{p-CmUGA_q4.js.map → p-B4_0Ys4w.js.map} +0 -0
  150. /package/dist/components/{p-BApNi_xA.js.map → p-B6RrZQqw.js.map} +0 -0
  151. /package/dist/components/{p-CQ4vAZ9j.js.map → p-BBtjABBS.js.map} +0 -0
  152. /package/dist/components/{p-CmMfRM1s.js.map → p-BFfHIu6y.js.map} +0 -0
  153. /package/dist/components/{p-CBiAsFAZ.js.map → p-BPyymeuR.js.map} +0 -0
  154. /package/dist/components/{p-Bgh0uG51.js.map → p-BR_oMaas.js.map} +0 -0
  155. /package/dist/components/{p-w2kKeG_h.js.map → p-Bb4f5SuF.js.map} +0 -0
  156. /package/dist/components/{p-B5snQKiP.js.map → p-BmNpPyzf.js.map} +0 -0
  157. /package/dist/components/{p-CWItD0gL.js.map → p-Bmo4T96l.js.map} +0 -0
  158. /package/dist/components/{p-DHAuidt1.js.map → p-Bsfpxto1.js.map} +0 -0
  159. /package/dist/components/{p-BxEOlO5k.js.map → p-CKRJX0Y0.js.map} +0 -0
  160. /package/dist/components/{p-1moOgMI-.js.map → p-Ca6s5fLR.js.map} +0 -0
  161. /package/dist/components/{p-RT1mts9U.js.map → p-CbjFUpOj.js.map} +0 -0
  162. /package/dist/components/{p-CqOswTy8.js.map → p-CuJ3J6OJ.js.map} +0 -0
  163. /package/dist/components/{p-BQTJ7ePr.js.map → p-CxgMUvqg.js.map} +0 -0
  164. /package/dist/components/{p-CWKrq35a.js.map → p-D0bM3cKj.js.map} +0 -0
  165. /package/dist/components/{p-UtfErnpX.js.map → p-D2cjoj2r.js.map} +0 -0
  166. /package/dist/components/{p-CGwVooB6.js.map → p-DHF5cLzr.js.map} +0 -0
  167. /package/dist/components/{p-BgjtMMye.js.map → p-DVuxzrCC.js.map} +0 -0
  168. /package/dist/components/{p-DXGKfXTh.js.map → p-DfvDNcoq.js.map} +0 -0
  169. /package/dist/components/{p-4scN0Mgn.js.map → p-Di81y9Q2.js.map} +0 -0
  170. /package/dist/components/{p-C_3mZMFK.js.map → p-Eep5mxtv.js.map} +0 -0
  171. /package/dist/components/{p-DoNdiEly.js.map → p-IYy-jODg.js.map} +0 -0
  172. /package/dist/components/{p-DtV263qO.js.map → p-iCjUWcp7.js.map} +0 -0
  173. /package/dist/components/{p-BgASe-BH.js.map → p-og48Kh2i.js.map} +0 -0
  174. /package/dist/components/{p-BSocHH2X.js.map → p-wOOAzVMC.js.map} +0 -0
@@ -1 +1 @@
1
- {"schemaVersion":1,"package":"@ds-mo/ui","version":"13.5.0","components":66,"digest":"eebaa1f1eabb8a41935b6137f29b9e5a04282391042c802fc0025b1e4802e141","completedAt":"2026-07-31T23:33:12.355Z"}
1
+ {"schemaVersion":1,"package":"@ds-mo/ui","version":"13.6.1","components":67,"digest":"860dd632a0ab5a430878b0c760667f3f3d49e5097bbd9db8d879edfe4e55c8cd","completedAt":"2026-08-02T03:35:46.739Z"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "13.5.0",
4
+ "packageVersion": "13.6.1",
5
5
  "kind": "patterns",
6
6
  "entries": [
7
7
  {
@@ -136,6 +136,11 @@
136
136
  "component": "component:ds-mobile-bar-nav",
137
137
  "role": "Managed persistent mobile destinations for Menu, current area, Search, Agents, Inbox, and Help.",
138
138
  "required": false
139
+ },
140
+ {
141
+ "component": "component:ds-banner",
142
+ "role": "Optional application-owned global message placed in the single shell banner lane.",
143
+ "required": false
139
144
  }
140
145
  ],
141
146
  "stateOwnership": [
@@ -145,6 +150,7 @@
145
150
  "ShellApp owns responsive mode, PanelNav presentation, tool open state, active tool, mobile Inbox grouping, Menu state, fullscreen presentation, focus restoration, and breakpoint state preservation.",
146
151
  "Tool products and routed content are instantiated once by the application in named tool-view and default slots; ShellApp changes presentation without recreating those owners.",
147
152
  "The application owns account menus, tool product data, page actions, and the consequences of every emitted intent event.",
153
+ "The application resolves competing global messages to one Banner and owns its actions, controlled open state, orientation for the available shell capacity, dismissal persistence, and removal after exit motion.",
148
154
  "Use composition=\"slotted\" only when a team intentionally needs to assemble the public lower-level chrome components itself."
149
155
  ],
150
156
  "accessibility": [
@@ -157,7 +163,8 @@
157
163
  "responsiveBehavior": [
158
164
  "ShellApp automatically resolves desktop at 1200px and wider, tablet from 768px through 1199px, and mobile below 768px.",
159
165
  "Desktop and tablet use PanelNav, BarNav, PanelTools through ShellTools, and ShellPage chrome.",
160
- "Mobile uses MobileSheetNav, MobileBarNav, MobileHeader, ShellTools mobile presentation, and the same routed content owner.",
166
+ "Mobile uses MobileSheetNav, MobileBarNav, MobileHeader, ShellTools mobile presentation, and the same routed content owner. MobileBarNav paints its primary surface through the bottom safe-area inset so light browser chrome and application chrome meet without a secondary-surface seam.",
167
+ "An optional Banner spans the complete application above desktop navigation, workspace, tools, and mobile global surfaces while remaining below the operating-system top safe area.",
161
168
  "Switching breakpoints changes presentation and inert state without recreating route or tool elements.",
162
169
  "Messages, Stacks, and Activity use explicit mobile grouping metadata and default to the canonical Inbox recipe."
163
170
  ],
package/dist/agent.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "13.5.0",
4
+ "packageVersion": "13.6.1",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -620,6 +620,157 @@
620
620
  "text"
621
621
  ]
622
622
  },
623
+ {
624
+ "id": "component:ds-banner",
625
+ "tag": "ds-banner",
626
+ "name": "banner",
627
+ "title": "Banner",
628
+ "summary": "Persistent in-flow application banner with semantic color intent, explicit announcement urgency, horizontal actions, and controlled dismissal motion.",
629
+ "intentStatus": "complete",
630
+ "intent": {
631
+ "audience": "general",
632
+ "status": "stable",
633
+ "summary": "Persistent in-flow application banner with semantic color intent, explicit announcement urgency, horizontal actions, and controlled dismissal motion.",
634
+ "useWhen": [
635
+ "A persistent application-wide condition or announcement must remain visible while the user works.",
636
+ "A shell-level message needs optional actions and dismissal while reflowing the application rather than floating over it.",
637
+ "Message urgency and color intent must be selected independently."
638
+ ],
639
+ "avoidWhen": [
640
+ "Feedback is transient, queued, promise-driven, or anchored to a control; use Toast.",
641
+ "The message belongs inside a field, card, or bounded content section; use the future inline banner rather than shrinking the application shell.",
642
+ "Several global messages must be prioritized or queued; the application must resolve them to one active banner before rendering."
643
+ ],
644
+ "alternatives": [
645
+ {
646
+ "when": "Feedback is transient or follows a completed action.",
647
+ "component": "component:ds-toast",
648
+ "reason": "Toast owns queues, timers, stacking, swipe dismissal, and anchored feedback."
649
+ },
650
+ {
651
+ "when": "A bounded region has no content to show.",
652
+ "component": "component:ds-empty-state",
653
+ "reason": "EmptyState explains an empty result without creating global application urgency."
654
+ }
655
+ ],
656
+ "commonlyComposedWith": [
657
+ "component:ds-shell-app",
658
+ "component:ds-button-unfilled"
659
+ ],
660
+ "patterns": [
661
+ "pattern:application-shell"
662
+ ],
663
+ "accessibility": [
664
+ "Choose announcement=none for content present at page load, polite for non-urgent dynamic changes, and assertive only when immediate interruption is necessary.",
665
+ "Visual intent never chooses live-region urgency; a negative banner can be persistent and non-urgent, while a neutral banner can require prompt attention.",
666
+ "The close control is always available. Localize dismissLabel and keep the banner mounted until dsAfterClose before removing it.",
667
+ "Slotted actions retain their own accessible names, keyboard behavior, and outcome messaging."
668
+ ],
669
+ "states": [
670
+ "The application owns open. The always-present close control emits dsClose, and the application sets open=false to begin exit motion.",
671
+ "dsAfterClose fires once after the closing banner is inert, hidden from assistive technology, and no longer occupies layout space.",
672
+ "The opaque surface slides by its complete block size while occupied-shell space expands with the same short-3 duration. Opening uses the shell tool panel's ease-out curve; dismissal reverses with its ease-in curve, keeping the Banner boundary flush with the shell throughout.",
673
+ "Heading is optional and description is required. With orientation=horizontal they share one inline copy flow, so description begins after the heading and continuation lines use the complete text width beneath it. With orientation=vertical, description starts on the next line with a 4px gap.",
674
+ "The actions slot accepts at most two ds-button-unfilled controls. They stay in one horizontal trailing lane, align to the top of the dismiss control when sharing the copy row, and must receive the matching parent-surface background context.",
675
+ "Intent selects neutral, brand, positive, warning, caution, or negative hue. Contrast independently selects faint, medium, strong, or bold fill.",
676
+ "Banner has a real bottom boundary, no radius, no elevation, no icon, no timeout, and no internal queue."
677
+ ],
678
+ "responsiveBehavior": [
679
+ "Applications select orientation explicitly. Horizontal keeps copy and actions in one row, with actions top-aligned to dismissal. Vertical puts actions below copy on the 16px text boundary and keeps controls 16px above the bottom boundary; without actions it reserves no trailing row and keeps the copy visually balanced between the top and bottom edges.",
680
+ "When placed in ShellApp's banner slot, the banner spans the complete application above navigation, workspace, and tools.",
681
+ "ShellApp reserves the mobile top safe area once above the banner and keeps the banner visible while mobile tools or navigation surfaces replace the routed stage."
682
+ ],
683
+ "frameworkCaveats": {
684
+ "customElements": [
685
+ "Listen for dsClose, set open=false, and wait for dsAfterClose before conditionally removing the element.",
686
+ "Place at most one ds-banner in ShellApp's banner slot, choose horizontal or vertical orientation for the available shell capacity, and assign no more than two ds-button-unfilled elements slot=actions."
687
+ ],
688
+ "react": [
689
+ "Keep the component mounted while open changes from true to false; remove it in onDsAfterClose when unmounting is required.",
690
+ "Project no more than two ds-button-unfilled actions and pass each the matching background context."
691
+ ],
692
+ "angular": [
693
+ "Bind open as controlled application state, handle dsClose to update it, and wait for dsAfterClose before removing an ngIf owner.",
694
+ "Import and project no more than two DsButtonUnfilled actions with slot=actions and their matching background input."
695
+ ]
696
+ },
697
+ "references": [
698
+ {
699
+ "label": "Storybook examples",
700
+ "path": "src/wc/components/Banner/Banner.stories.ts"
701
+ },
702
+ {
703
+ "label": "Rendered behavior coverage",
704
+ "path": "tests/e2e/banner.spec.ts"
705
+ },
706
+ {
707
+ "label": "Application shell contract",
708
+ "path": "agent/patterns/application-shell/pattern.agent.json"
709
+ }
710
+ ]
711
+ },
712
+ "api": {
713
+ "props": {
714
+ "announcement": {
715
+ "type": "BannerAnnouncement",
716
+ "required": false
717
+ },
718
+ "contrast": {
719
+ "type": "BannerContrast",
720
+ "required": false
721
+ },
722
+ "description": {
723
+ "type": "string",
724
+ "required": true
725
+ },
726
+ "dismissLabel": {
727
+ "type": "string",
728
+ "required": false
729
+ },
730
+ "heading": {
731
+ "type": "string",
732
+ "required": false
733
+ },
734
+ "intent": {
735
+ "type": "BannerIntent",
736
+ "required": false
737
+ },
738
+ "open": {
739
+ "type": "boolean",
740
+ "required": false
741
+ },
742
+ "orientation": {
743
+ "type": "BannerOrientation",
744
+ "required": false
745
+ }
746
+ },
747
+ "events": [
748
+ {
749
+ "name": "dsAfterClose",
750
+ "detail": "void"
751
+ },
752
+ {
753
+ "name": "dsClose",
754
+ "detail": "MouseEvent"
755
+ }
756
+ ],
757
+ "slots": []
758
+ },
759
+ "exports": {
760
+ "customElement": "ds-banner",
761
+ "react": "DsBanner",
762
+ "angular": "DsBanner"
763
+ },
764
+ "dependencies": [
765
+ "@ds-mo/ui",
766
+ "@ds-mo/tokens"
767
+ ],
768
+ "componentDependencies": [
769
+ "button-unfilled",
770
+ "text",
771
+ "tooltip"
772
+ ]
773
+ },
623
774
  {
624
775
  "id": "component:ds-bar-nav",
625
776
  "tag": "ds-bar-nav",
@@ -846,7 +997,7 @@
846
997
  "responsiveBehavior": [
847
998
  "BarTitle does not observe viewport, shell, scroll, or container state. Its owner selects an explicit variant.",
848
999
  "ShellPage is the standard owner for automatic expanded, compact, and constrained selection.",
849
- "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.",
1000
+ "Compact titles use the shared compact-header geometry and 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.",
850
1001
  "A never-collapse primary action remains visible in constrained mode; the title and section label yield space first."
851
1002
  ],
852
1003
  "frameworkCaveats": {
@@ -4400,6 +4551,7 @@
4400
4551
  "states": [
4401
4552
  "The component owns clipboard execution and temporary copied feedback while the application supplies the exact copyable text.",
4402
4553
  "Feedback is controlled: the component emits the requested positive, negative, or cleared value while the application owns persistence and consequences.",
4554
+ "Selected feedback changes to the filled thumb icon without adding a persistent selected fill; hover and press feedback remain available.",
4403
4555
  "Copy, positive feedback, and negative feedback retain one stable order."
4404
4556
  ],
4405
4557
  "responsiveBehavior": [
@@ -4752,8 +4904,8 @@
4752
4904
  "Direct touch paints the pressed overlay immediately, keeps a quick tap visible for one short frame, and clears it after release or cancellation without relying on Safari's latch-prone active state."
4753
4905
  ],
4754
4906
  "responsiveBehavior": [
4755
- "Render only below the mobile breakpoint; its secondary surface extends through the bottom safe-area inset when the application enables viewport-fit=cover.",
4756
- "The secondary-background bar keeps an 8px outer inset; its two icon-only groups anchor to opposite edges while retaining fixed 40px targets and a divider between Menu and current area.",
4907
+ "Render only below the mobile breakpoint; its primary surface extends through the bottom safe-area inset when the application enables viewport-fit=cover.",
4908
+ "The primary-background bar keeps an 8px outer inset; its two icon-only groups anchor to opposite edges while retaining fixed 40px targets and a divider between Menu and current area.",
4757
4909
  "Bar chrome and its divider are not text-selectable and suppress the iOS touch callout."
4758
4910
  ],
4759
4911
  "references": [
@@ -5163,12 +5315,12 @@
5163
5315
  "tag": "ds-modal",
5164
5316
  "name": "modal",
5165
5317
  "title": "Modal",
5166
- "summary": "Dismissible native top-layer dialog for a focused confirmation or short blocking task, with a fixed title-and-close header, composable content, and an optional two-action footer.",
5318
+ "summary": "Dismissible native top-layer dialog for a focused confirmation or short blocking task, with a compact title-and-close header, optional supporting description, composable content, and an optional two-action footer.",
5167
5319
  "intentStatus": "complete",
5168
5320
  "intent": {
5169
5321
  "audience": "general",
5170
5322
  "status": "stable",
5171
- "summary": "Dismissible native top-layer dialog for a focused confirmation or short blocking task, with a fixed title-and-close header, composable content, and an optional two-action footer.",
5323
+ "summary": "Dismissible native top-layer dialog for a focused confirmation or short blocking task, with a compact title-and-close header, optional supporting description, composable content, and an optional two-action footer.",
5172
5324
  "useWhen": [
5173
5325
  "The user must confirm or cancel one focused decision before returning to the underlying interface.",
5174
5326
  "A short blocking task or compact form needs dialog semantics, focus containment, and explicit completion actions.",
@@ -5206,6 +5358,7 @@
5206
5358
  ],
5207
5359
  "accessibility": [
5208
5360
  "Provide a concise visible heading; the component uses it as the dialog's accessible name.",
5361
+ "When concise supporting context belongs in the header, provide description; it stays below the title and is included in the dialog's accessible description.",
5209
5362
  "Give the primary explanatory copy a stable id and pass it through aria-describedby so assistive technology receives the decision context.",
5210
5363
  "Opening the native modal dialog moves focus to the header Close action, whose visible tooltip matches its accessible name, traps Tab navigation inside the top layer, and makes outside content inert.",
5211
5364
  "Close, Escape, and backdrop activation emit dsClose with close-button, escape, or backdrop reason before beginning dismissal; use the component only when every dismissal path is safe.",
@@ -5218,12 +5371,13 @@
5218
5371
  "The owner opens the modal through the open property and responds to the typed dsClose detail for application state synchronization or dismissal analytics.",
5219
5372
  "The component mutates open to false for Close, Escape, and backdrop dismissal while retaining its rendered surface through exit motion.",
5220
5373
  "The default slot owns task content; the named footer slot is optional and is hidden when no actions are assigned.",
5374
+ "The optional header description remains stacked beneath the title with the shared compact-header rhythm; longer task content belongs in the default slot.",
5221
5375
  "Primary actions use a bold filled button with semantic intent. Secondary and cancel actions use bordered label-only unfilled buttons.",
5222
5376
  "The owner performs save, delete, cancel, and other product consequences before or while closing the modal."
5223
5377
  ],
5224
5378
  "responsiveBehavior": [
5225
5379
  "Choose the smallest sm, md, or lg width that fits the focused task; the top-layer dialog clamps to the viewport with token-based outer space.",
5226
- "Content scrolls independently when needed while the 64px header and optional 64px footer remain fixed.",
5380
+ "Content scrolls independently when needed while the header and optional 64px footer remain fixed. The title-only header uses the shared 48px compact geometry and grows when its optional description wraps.",
5227
5381
  "Avoid layouts whose minimum content width exceeds the narrow viewport clamp.",
5228
5382
  "The native top layer escapes transformed ancestors, clipping containers, and application stacking contexts without moving slotted content."
5229
5383
  ],
@@ -5269,6 +5423,10 @@
5269
5423
  "type": "string",
5270
5424
  "required": false
5271
5425
  },
5426
+ "description": {
5427
+ "type": "string",
5428
+ "required": false
5429
+ },
5272
5430
  "heading": {
5273
5431
  "type": "string",
5274
5432
  "required": true
@@ -5697,7 +5855,7 @@
5697
5855
  ],
5698
5856
  "states": [
5699
5857
  "The title remains left aligned whether the header has no actions, Back, one trailing action, or several trailing actions.",
5700
- "Leading and trailing control zones never shrink; only the title consumes and truncates within the remaining width, with a fixed 4px gap between zones.",
5858
+ "Leading and trailing control zones never shrink; only the title consumes and truncates within the remaining width. The header uses the shared 8px compact-header zone gap, while adjacent trailing actions retain their 4px control gap.",
5701
5859
  "Header chrome text is not selectable; actions remain keyboard focusable and interactive.",
5702
5860
  "Adjacent trailing actions keep the shared 4px control gap in drawer and fullscreen presentations.",
5703
5861
  "When fullscreen and overflow actions appear together, author fullscreen before overflow so Ellipses remains the rightmost action.",
@@ -5981,6 +6139,7 @@
5981
6139
  "Provide localized accessible labels for the rail, shortcut group, and every rendered tool.",
5982
6140
  "Use the canonical default recipe when the product needs Search first and Help last; custom recipes must preserve a deliberate keyboard and visual order.",
5983
6141
  "Keep focus on the selected rail action when opening a drawer and allow normal Tab navigation into its content.",
6142
+ "When the shortcut rail overflows, its labeled body becomes a keyboard-focusable scroll region without changing the rail action order.",
5984
6143
  "Do not trigger global shortcuts while focus is in an editable control.",
5985
6144
  "Use notification dots only as supplemental unread or new-content status and never as the sole status indication.",
5986
6145
  "Explain temporarily inactive tools through an accessible label or adjacent product guidance; omit unauthorized tools entirely."
@@ -6657,6 +6816,7 @@
6657
6816
  "component:ds-mobile-header",
6658
6817
  "component:ds-mobile-bar-nav",
6659
6818
  "component:ds-shell-page",
6819
+ "component:ds-banner",
6660
6820
  "component:ds-swatch-picker"
6661
6821
  ],
6662
6822
  "patterns": [
@@ -6666,6 +6826,7 @@
6666
6826
  "accessibility": [
6667
6827
  "Supply primary destinations through navigation and secondary route sections through pageChrome so managed ShellApp preserves their correct semantics.",
6668
6828
  "Ensure the default content region contains the page's single main landmark.",
6829
+ "Keep the shell-owned routed-content scroller keyboard-focusable while its page landmark retains content semantics.",
6669
6830
  "Keep the managed desktop/tablet and mobile presentations available without conditionally recreating routed or tool content.",
6670
6831
  "Do not override browser keyboard chords when enabling shell shortcuts.",
6671
6832
  "Require Search and Help as the minimum PanelTools actions and provide accessible labels for every tool.",
@@ -6678,6 +6839,7 @@
6678
6839
  "ShellApp renders the lower-level desktop, tablet, and mobile chrome, coordinates layout, gradient alignment, transitions, shortcuts, global surfaces, Inbox state, focus restoration, and mobile-stage visibility.",
6679
6840
  "The application router owns authorization, current URLs, history, and route execution; ShellApp forwards navigation and page intent events without routing.",
6680
6841
  "The application supplies each routed content owner and tool view once. ShellApp changes visibility, inert state, and presentation without recreating those nodes.",
6842
+ "The optional banner slot accepts one application-owned ds-banner above the complete shell row. The application owns its open state, orientation for the current shell capacity, action consequences, dismissal persistence, and resolution when several messages compete.",
6681
6843
  "Use composition=slotted only for advanced application architectures that intentionally own all lower-level chrome wiring.",
6682
6844
  "Set gradientPreset to the single resolved global chrome preference: neutral by default, none for solid chrome, or cool, neutral, warm, and fresh for token-based washes.",
6683
6845
  "The application owns gradient preference persistence, cross-tab synchronization, and server or account precedence; ShellApp owns rendering the resolved preset across authenticated routes.",
@@ -6693,6 +6855,7 @@
6693
6855
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
6694
6856
  "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.",
6695
6857
  "When the application enables viewport-fit=cover, ShellApp reserves the shared top safe-area inset once for the complete mobile stage; nested routed, sheet, and tool headers must not add a second top inset.",
6858
+ "A slotted Banner remains below the top safe-area inset and above routed, navigation, fullscreen-tool, and mobile global-surface presentations.",
6696
6859
  "Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
6697
6860
  "Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
6698
6861
  "The bottom bar remains visible at all route and tool depths in the foundation release."
@@ -0,0 +1,23 @@
1
+ import { ChangeDetectorRef, ElementRef, NgZone, EventEmitter } from '@angular/core';
2
+ import type { Components } from '@ds-mo/ui/components';
3
+ import type { DsBannerCustomEvent } from '@ds-mo/ui/components';
4
+ import * as i0 from "@angular/core";
5
+ export declare class DsBanner {
6
+ protected z: NgZone;
7
+ protected el: HTMLDsBannerElement;
8
+ dsClose: EventEmitter<DsBannerCustomEvent<MouseEvent>>;
9
+ dsAfterClose: EventEmitter<DsBannerCustomEvent<void>>;
10
+ constructor(c: ChangeDetectorRef, r: ElementRef, z: NgZone);
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<DsBanner, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<DsBanner, "ds-banner", never, { "announcement": { "alias": "announcement"; "required": false; }; "contrast": { "alias": "contrast"; "required": false; }; "description": { "alias": "description"; "required": true; }; "dismissLabel": { "alias": "dismissLabel"; "required": false; }; "heading": { "alias": "heading"; "required": false; }; "intent": { "alias": "intent"; "required": false; }; "open": { "alias": "open"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; }, { "dsClose": "dsClose"; "dsAfterClose": "dsAfterClose"; }, never, ["*"], true, never>;
13
+ }
14
+ export declare interface DsBanner extends Components.DsBanner {
15
+ /**
16
+ * Emitted when the close control requests dismissal. The application controls open.
17
+ */
18
+ dsClose: EventEmitter<DsBannerCustomEvent<MouseEvent>>;
19
+ /**
20
+ * Emitted once after controlled exit motion and layout collapse complete.
21
+ */
22
+ dsAfterClose: EventEmitter<DsBannerCustomEvent<void>>;
23
+ }
@@ -0,0 +1,45 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /* tslint:disable */
8
+ /* auto-generated angular directive proxies */
9
+ import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core';
10
+ import { ProxyCmp } from './angular-component-lib/utils.js';
11
+ import { defineCustomElement as defineDsBanner } from '@ds-mo/ui/components/ds-banner.js';
12
+ import * as i0 from "@angular/core";
13
+ let DsBanner = class DsBanner {
14
+ constructor(c, r, z) {
15
+ this.z = z;
16
+ this.dsClose = new EventEmitter();
17
+ this.dsAfterClose = new EventEmitter();
18
+ c.detach();
19
+ this.el = r.nativeElement;
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: DsBanner, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: DsBanner, isStandalone: true, selector: "ds-banner", inputs: { announcement: "announcement", contrast: "contrast", description: "description", dismissLabel: "dismissLabel", heading: "heading", intent: "intent", open: "open", orientation: "orientation" }, outputs: { dsClose: "dsClose", dsAfterClose: "dsAfterClose" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23
+ };
24
+ DsBanner = __decorate([
25
+ ProxyCmp({
26
+ defineCustomElementFn: defineDsBanner,
27
+ inputs: ['announcement', 'contrast', 'description', 'dismissLabel', 'heading', 'intent', 'open', 'orientation']
28
+ })
29
+ ], DsBanner);
30
+ export { DsBanner };
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: DsBanner, decorators: [{
32
+ type: Component,
33
+ args: [{
34
+ selector: 'ds-banner',
35
+ changeDetection: ChangeDetectionStrategy.OnPush,
36
+ template: '<ng-content></ng-content>',
37
+ // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
38
+ inputs: ['announcement', 'contrast', { name: 'description', required: true }, 'dismissLabel', 'heading', 'intent', 'open', 'orientation'],
39
+ outputs: ['dsClose', 'dsAfterClose'],
40
+ }]
41
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { dsClose: [{
42
+ type: Output
43
+ }], dsAfterClose: [{
44
+ type: Output
45
+ }] } });
@@ -10,7 +10,7 @@ export declare class DsModal {
10
10
  dsAfterClose: EventEmitter<DsModalCustomEvent<void>>;
11
11
  constructor(c: ChangeDetectorRef, r: ElementRef, z: NgZone);
12
12
  static ɵfac: i0.ɵɵFactoryDeclaration<DsModal, never>;
13
- static ɵcmp: i0.ɵɵComponentDeclaration<DsModal, "ds-modal", never, { "ariaDescribedby": { "alias": "ariaDescribedby"; "required": false; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; }; "heading": { "alias": "heading"; "required": true; }; "modalWidth": { "alias": "modalWidth"; "required": false; }; "open": { "alias": "open"; "required": false; }; }, { "dsClose": "dsClose"; "dsAfterClose": "dsAfterClose"; }, never, ["*"], true, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<DsModal, "ds-modal", never, { "ariaDescribedby": { "alias": "ariaDescribedby"; "required": false; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; }; "description": { "alias": "description"; "required": false; }; "heading": { "alias": "heading"; "required": true; }; "modalWidth": { "alias": "modalWidth"; "required": false; }; "open": { "alias": "open"; "required": false; }; }, { "dsClose": "dsClose"; "dsAfterClose": "dsAfterClose"; }, never, ["*"], true, never>;
14
14
  }
15
15
  export declare interface DsModal extends Components.DsModal {
16
16
  /**
@@ -19,12 +19,12 @@ let DsModal = class DsModal {
19
19
  this.el = r.nativeElement;
20
20
  }
21
21
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: DsModal, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
22
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: DsModal, isStandalone: true, selector: "ds-modal", inputs: { ariaDescribedby: "ariaDescribedby", closeAriaLabel: "closeAriaLabel", heading: "heading", modalWidth: "modalWidth", open: "open" }, outputs: { dsClose: "dsClose", dsAfterClose: "dsAfterClose" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: DsModal, isStandalone: true, selector: "ds-modal", inputs: { ariaDescribedby: "ariaDescribedby", closeAriaLabel: "closeAriaLabel", description: "description", heading: "heading", modalWidth: "modalWidth", open: "open" }, outputs: { dsClose: "dsClose", dsAfterClose: "dsAfterClose" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23
23
  };
24
24
  DsModal = __decorate([
25
25
  ProxyCmp({
26
26
  defineCustomElementFn: defineDsModal,
27
- inputs: ['ariaDescribedby', 'closeAriaLabel', 'heading', 'modalWidth', 'open']
27
+ inputs: ['ariaDescribedby', 'closeAriaLabel', 'description', 'heading', 'modalWidth', 'open']
28
28
  })
29
29
  ], DsModal);
30
30
  export { DsModal };
@@ -35,7 +35,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
35
35
  changeDetection: ChangeDetectionStrategy.OnPush,
36
36
  template: '<ng-content></ng-content>',
37
37
  // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
38
- inputs: ['ariaDescribedby', 'closeAriaLabel', { name: 'heading', required: true }, 'modalWidth', 'open'],
38
+ inputs: ['ariaDescribedby', 'closeAriaLabel', 'description', { name: 'heading', required: true }, 'modalWidth', 'open'],
39
39
  outputs: ['dsClose', 'dsAfterClose'],
40
40
  }]
41
41
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { dsClose: [{
@@ -1,2 +1,2 @@
1
1
  import * as d from './proxies';
2
- export declare const DIRECTIVES: (typeof d.DsAgentActivity | typeof d.DsAgentResponse | typeof d.DsAgentSourceList | typeof d.DsAgentToolCall | typeof d.DsAttachmentList | typeof d.DsAvatar | typeof d.DsBadge | typeof d.DsBarNav | typeof d.DsBarTitle | typeof d.DsBarWorkflow | typeof d.DsBreadcrumb | typeof d.DsButtonFilled | typeof d.DsButtonUnfilled | typeof d.DsCardDataViz | typeof d.DsCardOverview | typeof d.DsCardSetting | typeof d.DsChartBar | typeof d.DsChartDonut | typeof d.DsChartLegend | typeof d.DsChartLine | typeof d.DsCheckbox | typeof d.DsChip | typeof d.DsCodeBlock | typeof d.DsConversationListItem | typeof d.DsConversationListSection | typeof d.DsConversationList | typeof d.DsDivider | typeof d.DsEmptyState | typeof d.DsField | typeof d.DsIcon | typeof d.DsInput | typeof d.DsLoader | typeof d.DsMarkdown | typeof d.DsMenu | typeof d.DsMessageActions | typeof d.DsMessageBubble | typeof d.DsMessageComposer | typeof d.DsMessageScroller | typeof d.DsMessage | typeof d.DsMobileBarNav | typeof d.DsMobileHeader | typeof d.DsMobileSectionSwitcher | typeof d.DsMobileSheetNav | typeof d.DsModal | typeof d.DsPanelNav | typeof d.DsPanelSubNav | typeof d.DsPanelToolHeader | typeof d.DsPanelToolSearch | typeof d.DsPanelTools | typeof d.DsRadio | typeof d.DsScrollOverlay | typeof d.DsSelect | typeof d.DsShellApp | typeof d.DsShellPage | typeof d.DsShellTools | typeof d.DsSkeleton | typeof d.DsSlider | typeof d.DsSwatchPicker | typeof d.DsSwitch | typeof d.DsTabGroup | typeof d.DsTag | typeof d.DsText | typeof d.DsToast | typeof d.DsTooltipDataViz | typeof d.DsTooltip | typeof d.DsTypingIndicator)[];
2
+ export declare const DIRECTIVES: (typeof d.DsAgentActivity | typeof d.DsAgentResponse | typeof d.DsAgentSourceList | typeof d.DsAgentToolCall | typeof d.DsAttachmentList | typeof d.DsAvatar | typeof d.DsBadge | typeof d.DsBanner | typeof d.DsBarNav | typeof d.DsBarTitle | typeof d.DsBarWorkflow | typeof d.DsBreadcrumb | typeof d.DsButtonFilled | typeof d.DsButtonUnfilled | typeof d.DsCardDataViz | typeof d.DsCardOverview | typeof d.DsCardSetting | typeof d.DsChartBar | typeof d.DsChartDonut | typeof d.DsChartLegend | typeof d.DsChartLine | typeof d.DsCheckbox | typeof d.DsChip | typeof d.DsCodeBlock | typeof d.DsConversationListItem | typeof d.DsConversationListSection | typeof d.DsConversationList | typeof d.DsDivider | typeof d.DsEmptyState | typeof d.DsField | typeof d.DsIcon | typeof d.DsInput | typeof d.DsLoader | typeof d.DsMarkdown | typeof d.DsMenu | typeof d.DsMessageActions | typeof d.DsMessageBubble | typeof d.DsMessageComposer | typeof d.DsMessageScroller | typeof d.DsMessage | typeof d.DsMobileBarNav | typeof d.DsMobileHeader | typeof d.DsMobileSectionSwitcher | typeof d.DsMobileSheetNav | typeof d.DsModal | typeof d.DsPanelNav | typeof d.DsPanelSubNav | typeof d.DsPanelToolHeader | typeof d.DsPanelToolSearch | typeof d.DsPanelTools | typeof d.DsRadio | typeof d.DsScrollOverlay | typeof d.DsSelect | typeof d.DsShellApp | typeof d.DsShellPage | typeof d.DsShellTools | typeof d.DsSkeleton | typeof d.DsSlider | typeof d.DsSwatchPicker | typeof d.DsSwitch | typeof d.DsTabGroup | typeof d.DsTag | typeof d.DsText | typeof d.DsToast | typeof d.DsTooltipDataViz | typeof d.DsTooltip | typeof d.DsTypingIndicator)[];
@@ -7,6 +7,7 @@ export const DIRECTIVES = [
7
7
  d.DsAttachmentList,
8
8
  d.DsAvatar,
9
9
  d.DsBadge,
10
+ d.DsBanner,
10
11
  d.DsBarNav,
11
12
  d.DsBarTitle,
12
13
  d.DsBarWorkflow,
@@ -9,6 +9,7 @@ export { DsAgentToolCall } from './ds-agent-tool-call';
9
9
  export { DsAttachmentList } from './ds-attachment-list';
10
10
  export { DsAvatar } from './ds-avatar';
11
11
  export { DsBadge } from './ds-badge';
12
+ export { DsBanner } from './ds-banner';
12
13
  export { DsBarNav } from './ds-bar-nav';
13
14
  export { DsBarTitle } from './ds-bar-title';
14
15
  export { DsBarWorkflow } from './ds-bar-workflow';
@@ -10,6 +10,7 @@ export { DsAgentToolCall } from './ds-agent-tool-call.js';
10
10
  export { DsAttachmentList } from './ds-attachment-list.js';
11
11
  export { DsAvatar } from './ds-avatar.js';
12
12
  export { DsBadge } from './ds-badge.js';
13
+ export { DsBanner } from './ds-banner.js';
13
14
  export { DsBarNav } from './ds-bar-nav.js';
14
15
  export { DsBarTitle } from './ds-bar-title.js';
15
16
  export { DsBarWorkflow } from './ds-bar-workflow.js';
@@ -1,2 +1,2 @@
1
- import{A as o,d as s}from"./p-BSocHH2X.js";const t=o;const c=s;export{t as DsAgentActivity,c as defineCustomElement};
1
+ import{A as o,d as s}from"./p-wOOAzVMC.js";const t=o;const p=s;export{t as DsAgentActivity,p as defineCustomElement};
2
2
  //# sourceMappingURL=ds-agent-activity.js.map
@@ -1,2 +1,2 @@
1
- import{p as s,H as e,h as t,a,t as o}from"./index.js";import{d as i}from"./p-BSocHH2X.js";import{d as r}from"./p-B5snQKiP.js";import{d as n}from"./p-DXGKfXTh.js";import{d as c}from"./p-CWItD0gL.js";import{d}from"./p-DoNdiEly.js";import{d as m}from"./p-Bgh0uG51.js";import{d as l}from"./p-CWKrq35a.js";import{d as f}from"./p-BAfG3M8z.js";import{d as p}from"./p-Ca-I2UnB.js";import{d as u}from"./p-D5PN6zdD.js";import{d as b}from"./p-BxEOlO5k.js";import{d as h}from"./p-w2kKeG_h.js";import{d as k}from"./p-UtfErnpX.js";const g=()=>`.sc-ds-agent-response-h{display:block;width:100%;-webkit-user-select:none;user-select:none}.agent-response.sc-ds-agent-response{display:grid;gap:var(--dimension-space-150);min-width:0;width:100%;-webkit-user-select:none;user-select:none}`;const y=s(class s extends e{constructor(s){super();if(s!==false){this.__registerHost()}this.messageId="";this.author="";this.showAuthor=true;this.timestamp="";this.parts=[];this.streaming=false;this.metadataVisibility="always"}renderPart(s){switch(s.type){case"markdown":return t("ds-markdown",{key:s.id,content:s.content,streaming:s.state==="streaming"});case"activity":return t("ds-agent-activity",{key:s.id,items:s.items});case"tool":return t("ds-agent-tool-call",{key:s.id,name:s.name,label:s.label,state:s.state,input:s.input,output:s.output,error:s.error});case"attachments":return t("ds-attachment-list",{key:s.id,items:s.items});case"sources":return t("ds-agent-source-list",{key:s.id,items:s.items})}}render(){return t(a,{key:"d656554a2bf32265363c1507270cbdf5b9f7d5ef"},t("ds-message",{key:"75d7f29eefc6d221d66ff665ce1ce9f4ed3a940b",messageId:this.messageId,direction:"incoming",author:this.author,showAuthor:this.showAuthor,timestamp:this.timestamp,streaming:this.streaming,metadataVisibility:this.metadataVisibility},t("div",{key:"8ce0d2c6b33fce4c4e9da4c0a2ae48cf7775ec36",class:"agent-response"},this.parts.map((s=>this.renderPart(s)))),t("slot",{key:"5ebe02ae4d5991505d10f2815ced202961b29520",name:"footer",slot:"footer"}),t("slot",{key:"e6dcc5909049c72692bf00fd21846473ef8182be",name:"metadata-actions",slot:"metadata-actions"}),t("slot",{key:"8ee2602288b9b8a1ccf352e28ec44e167c1c20e8",name:"actions",slot:"actions"})))}static get style(){return g()}},[262,"ds-agent-response",{messageId:[1,"message-id"],author:[1],showAuthor:[4,"show-author"],timestamp:[1],parts:[16],streaming:[4],metadataVisibility:[1,"metadata-visibility"]}]);function E(){if(typeof customElements==="undefined"){return}const s=["ds-agent-response","ds-agent-activity","ds-agent-source-list","ds-agent-tool-call","ds-attachment-list","ds-badge","ds-button-unfilled","ds-code-block","ds-icon","ds-loader","ds-markdown","ds-message","ds-text","ds-tooltip"];s.forEach((s=>{switch(s){case"ds-agent-response":if(!customElements.get(o(s))){customElements.define(o(s),y)}break;case"ds-agent-activity":if(!customElements.get(o(s))){i()}break;case"ds-agent-source-list":if(!customElements.get(o(s))){r()}break;case"ds-agent-tool-call":if(!customElements.get(o(s))){n()}break;case"ds-attachment-list":if(!customElements.get(o(s))){c()}break;case"ds-badge":if(!customElements.get(o(s))){d()}break;case"ds-button-unfilled":if(!customElements.get(o(s))){m()}break;case"ds-code-block":if(!customElements.get(o(s))){l()}break;case"ds-icon":if(!customElements.get(o(s))){f()}break;case"ds-loader":if(!customElements.get(o(s))){p()}break;case"ds-markdown":if(!customElements.get(o(s))){u()}break;case"ds-message":if(!customElements.get(o(s))){b()}break;case"ds-text":if(!customElements.get(o(s))){h()}break;case"ds-tooltip":if(!customElements.get(o(s))){k()}break}}))}E();const w=y;const j=E;export{w as DsAgentResponse,j as defineCustomElement};
1
+ import{p as s,H as e,h as t,a,t as o}from"./index.js";import{d as i}from"./p-wOOAzVMC.js";import{d as r}from"./p-BmNpPyzf.js";import{d as n}from"./p-DfvDNcoq.js";import{d}from"./p-Bmo4T96l.js";import{d as m}from"./p-IYy-jODg.js";import{d as c}from"./p-BR_oMaas.js";import{d as l}from"./p-D0bM3cKj.js";import{d as f}from"./p-BAfG3M8z.js";import{d as p}from"./p-Ca-I2UnB.js";import{d as u}from"./p-B-kRByho.js";import{d as b}from"./p-CKRJX0Y0.js";import{d as h}from"./p-Bb4f5SuF.js";import{d as k}from"./p-D2cjoj2r.js";const g=()=>`.sc-ds-agent-response-h{display:block;width:100%;-webkit-user-select:none;user-select:none}.agent-response.sc-ds-agent-response{display:grid;gap:var(--dimension-space-150);min-width:0;width:100%;-webkit-user-select:none;user-select:none}`;const y=s(class s extends e{constructor(s){super();if(s!==false){this.__registerHost()}this.messageId="";this.author="";this.showAuthor=true;this.timestamp="";this.parts=[];this.streaming=false;this.metadataVisibility="always"}renderPart(s){switch(s.type){case"markdown":return t("ds-markdown",{key:s.id,content:s.content,streaming:s.state==="streaming"});case"activity":return t("ds-agent-activity",{key:s.id,items:s.items});case"tool":return t("ds-agent-tool-call",{key:s.id,name:s.name,label:s.label,state:s.state,input:s.input,output:s.output,error:s.error});case"attachments":return t("ds-attachment-list",{key:s.id,items:s.items});case"sources":return t("ds-agent-source-list",{key:s.id,items:s.items})}}render(){return t(a,{key:"f00ad2a6befb37d80646316eeb3224534da42e34"},t("ds-message",{key:"77cac049c395a0218ecfedd6d18ced731647c6c4",messageId:this.messageId,direction:"incoming",author:this.author,showAuthor:this.showAuthor,timestamp:this.timestamp,streaming:this.streaming,metadataVisibility:this.metadataVisibility},t("div",{key:"e8bae921851d7fbd338ddc7d7b2227f8a3096afb",class:"agent-response"},this.parts.map((s=>this.renderPart(s)))),t("slot",{key:"64f8c39faeb3df471f38db3e502e1706eaa73fd3",name:"footer",slot:"footer"}),t("slot",{key:"da3417e79bf1f95ac416845f5488903345899974",name:"metadata-actions",slot:"metadata-actions"}),t("slot",{key:"faf899db5b58dc9b041ea83f666f849888490eff",name:"actions",slot:"actions"})))}static get style(){return g()}},[262,"ds-agent-response",{messageId:[1,"message-id"],author:[1],showAuthor:[4,"show-author"],timestamp:[1],parts:[16],streaming:[4],metadataVisibility:[1,"metadata-visibility"]}]);function j(){if(typeof customElements==="undefined"){return}const s=["ds-agent-response","ds-agent-activity","ds-agent-source-list","ds-agent-tool-call","ds-attachment-list","ds-badge","ds-button-unfilled","ds-code-block","ds-icon","ds-loader","ds-markdown","ds-message","ds-text","ds-tooltip"];s.forEach((s=>{switch(s){case"ds-agent-response":if(!customElements.get(o(s))){customElements.define(o(s),y)}break;case"ds-agent-activity":if(!customElements.get(o(s))){i()}break;case"ds-agent-source-list":if(!customElements.get(o(s))){r()}break;case"ds-agent-tool-call":if(!customElements.get(o(s))){n()}break;case"ds-attachment-list":if(!customElements.get(o(s))){d()}break;case"ds-badge":if(!customElements.get(o(s))){m()}break;case"ds-button-unfilled":if(!customElements.get(o(s))){c()}break;case"ds-code-block":if(!customElements.get(o(s))){l()}break;case"ds-icon":if(!customElements.get(o(s))){f()}break;case"ds-loader":if(!customElements.get(o(s))){p()}break;case"ds-markdown":if(!customElements.get(o(s))){u()}break;case"ds-message":if(!customElements.get(o(s))){b()}break;case"ds-text":if(!customElements.get(o(s))){h()}break;case"ds-tooltip":if(!customElements.get(o(s))){k()}break}}))}j();const w=y;const E=j;export{w as DsAgentResponse,E as defineCustomElement};
2
2
  //# sourceMappingURL=ds-agent-response.js.map
@@ -1,2 +1,2 @@
1
- import{A as s,d as o}from"./p-B5snQKiP.js";const t=s;const n=o;export{t as DsAgentSourceList,n as defineCustomElement};
1
+ import{A as o,d as s}from"./p-BmNpPyzf.js";const p=o;const t=s;export{p as DsAgentSourceList,t as defineCustomElement};
2
2
  //# sourceMappingURL=ds-agent-source-list.js.map
@@ -1,2 +1,2 @@
1
- import{A as o,d as s}from"./p-DXGKfXTh.js";const t=o;const p=s;export{t as DsAgentToolCall,p as defineCustomElement};
1
+ import{A as o,d as s}from"./p-DfvDNcoq.js";const t=o;const c=s;export{t as DsAgentToolCall,c as defineCustomElement};
2
2
  //# sourceMappingURL=ds-agent-tool-call.js.map
@@ -1,2 +1,2 @@
1
- import{A as o,d as s}from"./p-CWItD0gL.js";const t=o;const p=s;export{t as DsAttachmentList,p as defineCustomElement};
1
+ import{A as o,d as s}from"./p-Bmo4T96l.js";const t=o;const m=s;export{t as DsAttachmentList,m as defineCustomElement};
2
2
  //# sourceMappingURL=ds-attachment-list.js.map
@@ -1,2 +1,2 @@
1
- import{B as o,d as s}from"./p-DoNdiEly.js";const t=o;const p=s;export{t as DsBadge,p as defineCustomElement};
1
+ import{B as o,d as s}from"./p-IYy-jODg.js";const t=o;const p=s;export{t as DsBadge,p as defineCustomElement};
2
2
  //# sourceMappingURL=ds-badge.js.map
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface DsBanner extends Components.DsBanner, HTMLElement {}
4
+ export const DsBanner: {
5
+ prototype: DsBanner;
6
+ new (): DsBanner;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1,2 @@
1
+ import{p as n,H as e,c as r,h as a,a as s,t as o}from"./index.js";import{d as i}from"./p-IYy-jODg.js";import{d}from"./p-BR_oMaas.js";import{d as t}from"./p-BAfG3M8z.js";import{d as c}from"./p-Ca-I2UnB.js";import{d as b}from"./p-Bb4f5SuF.js";import{d as l}from"./p-D2cjoj2r.js";import{a as h}from"./p-B6Vuayt6.js";import{T as g}from"./p-C4uYvyq6.js";const u=()=>`@media (forced-colors: active){.sc-ds-banner:root,.sc-ds-banner-h,.ds-forced-colors-scope.sc-ds-banner{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}.ds-control--lg.sc-ds-banner,.ds-control--lg.sc-ds-banner-h,.ds-control--md.sc-ds-banner-h,.ds-control--md.sc-ds-banner,.ds-control--sm.sc-ds-banner-h,.ds-control--sm.sc-ds-banner,.ds-control--xs.sc-ds-banner-h,.ds-control--xs.sc-ds-banner{--ds-control-radius:var(--dimension-radius-025)}.ds-control--lg.sc-ds-banner-h,.ds-control--lg.sc-ds-banner{--ds-control-height:var(--dimension-size-500);--ds-control-icon:var(--dimension-iconography-lg);--ds-control-padding-inline:var(--dimension-space-100);--ds-control-label-inset:var(--dimension-space-050);--ds-control-gap:var(--dimension-space-050)}.ds-control--md.sc-ds-banner-h,.ds-control--md.sc-ds-banner{--ds-control-height:var(--dimension-size-400);--ds-control-icon:var(--dimension-iconography-md);--ds-control-padding-inline:var(--dimension-space-075);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-050)}.ds-control--sm.sc-ds-banner-h,.ds-control--sm.sc-ds-banner{--ds-control-height:var(--dimension-size-300);--ds-control-icon:var(--dimension-iconography-sm);--ds-control-padding-inline:var(--dimension-space-050);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-025)}.ds-control--xs.sc-ds-banner-h,.ds-control--xs.sc-ds-banner{--ds-control-height:var(--dimension-size-200);--ds-control-icon:var(--dimension-iconography-xs);--ds-control-padding-inline:var(--dimension-space-025);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:0}.ds-chrome-header.sc-ds-banner{display:flex;align-items:center;box-sizing:border-box;min-width:0;min-block-size:var(--dimension-size-600);padding:var(--dimension-space-100);gap:var(--dimension-space-100)}.ds-chrome-header--wrapping.sc-ds-banner{flex-wrap:wrap}.ds-chrome-header--bounded.sc-ds-banner{border-block-end:var(--dimension-stroke-width-012) solid var(--color-border-tertiary)}.ds-chrome-header__leading.sc-ds-banner,.ds-chrome-header__trailing.sc-ds-banner{display:flex;align-items:center;flex:0 0 auto;min-width:0}.ds-chrome-header__trailing.sc-ds-banner{margin-inline-start:auto;gap:var(--dimension-space-100)}.ds-chrome-header__copy.sc-ds-banner{display:flex;flex:1 1 0;min-width:0;padding:var(--ds-control-padding-inline, var(--dimension-space-075));box-sizing:border-box}.ds-chrome-header__copy--wrapping.sc-ds-banner{align-items:baseline;flex-wrap:wrap;column-gap:var(--dimension-space-100);row-gap:var(--dimension-space-050)}.ds-chrome-header__copy--stacked.sc-ds-banner{align-items:stretch;flex-direction:column;gap:var(--dimension-space-050)}.ds-chrome-header__heading.sc-ds-banner,.ds-chrome-header__description.sc-ds-banner{width:auto;min-width:0;padding-inline:var(--ds-control-label-inset, var(--dimension-space-025));box-sizing:border-box}.ds-chrome-header__heading.sc-ds-banner{flex:0 1 auto}.ds-chrome-header__copy--wrapping.sc-ds-banner .ds-chrome-header__description.sc-ds-banner{flex:1 1 var(--dimension-card-width-xs)}.sc-ds-banner-h{display:grid;overflow:hidden;min-width:0;grid-template-rows:0fr;transition:grid-template-rows var(--effect-animation-duration-short-3) var(--_banner-motion-easing);--ds-banner-background:var(--color-background-faint-neutral);--ds-banner-heading:var(--color-foreground-primary);--ds-banner-description:var(--color-foreground-secondary);--ds-banner-border:var(--color-border-tertiary);--_banner-motion-easing:var(--effect-animation-easing-ease-in-out, ease)}.banner--open.sc-ds-banner-h{grid-template-rows:1fr;--_banner-motion-easing:var(--effect-animation-easing-ease-out, ease-out)}.banner--closing.sc-ds-banner-h{--_banner-motion-easing:var(--effect-animation-easing-ease-in, ease-in)}.banner--hidden.sc-ds-banner-h{display:none}.banner-overflow.sc-ds-banner{min-height:0;overflow:visible}.banner-surface.sc-ds-banner{display:flex;position:relative;width:100%;padding-inline-end:calc(var(--dimension-size-400) + var(--dimension-space-200));color:var(--ds-banner-description);background-color:var(--ds-banner-background);border-bottom:var(--dimension-stroke-width-012) solid var(--ds-banner-border);transform:translateY(-100%);transition:transform var(--effect-animation-duration-short-3) var(--_banner-motion-easing)}.banner--open.sc-ds-banner-h .banner-surface.sc-ds-banner{transform:translateY(0)}.banner-copy.sc-ds-banner{flex-basis:var(--dimension-card-width-sm)}.banner--orientation-horizontal.sc-ds-banner-h .banner-surface.sc-ds-banner{flex-wrap:nowrap}.banner--orientation-vertical.sc-ds-banner-h .banner-copy.sc-ds-banner{flex-basis:100%}.banner-copy-flow.sc-ds-banner{box-sizing:border-box;min-width:0;padding-inline:var(--ds-control-label-inset, var(--dimension-space-025));color:var(--ds-banner-description)}.banner-heading.sc-ds-banner{display:inline-block;width:auto;max-width:100%;margin-inline-end:var(--dimension-space-100);vertical-align:baseline;color:var(--ds-banner-heading)}.banner-description.sc-ds-banner{color:var(--ds-banner-description)}.banner-actions.sc-ds-banner{display:flex;align-items:center;flex:0 0 auto;flex-wrap:nowrap;min-width:0;gap:var(--dimension-space-100)}.banner-actions.sc-ds-banner slot.sc-ds-banner{display:contents}.banner-actions.sc-ds-banner-s>:not(ds-button-unfilled),.banner-actions .sc-ds-banner-s>:not(ds-button-unfilled),.banner-actions.sc-ds-banner-s>ds-button-unfilled:nth-of-type(n+3),.banner-actions .sc-ds-banner-s>ds-button-unfilled:nth-of-type(n+3){display:none}.banner-actions--empty.sc-ds-banner{display:none}.banner-trailing.sc-ds-banner{align-self:flex-start;flex-wrap:nowrap}.banner--orientation-vertical.sc-ds-banner-h:not(.banner--has-actions) .banner-trailing.sc-ds-banner{display:contents}.banner--orientation-vertical.banner--has-actions.sc-ds-banner-h .banner-trailing.sc-ds-banner{margin-inline:var(--dimension-space-100) auto;padding-block-end:var(--dimension-space-100);box-sizing:border-box}.banner--orientation-vertical.sc-ds-banner-h .banner-description.sc-ds-banner{display:block}.banner--orientation-vertical.sc-ds-banner-h .banner-heading.sc-ds-banner+.banner-description.sc-ds-banner{margin-block-start:var(--dimension-space-050)}.banner-close.sc-ds-banner{flex:0 0 auto}.banner-dismiss.sc-ds-banner{position:absolute;inset-block-start:var(--dimension-space-100);inset-inline-end:var(--dimension-space-100)}.banner--intent-neutral.sc-ds-banner-h{--ds-banner-faint-background:var(--color-background-faint-neutral)}.banner--intent-brand.sc-ds-banner-h{--ds-banner-faint-background:var(--color-background-faint-brand)}.banner--intent-positive.sc-ds-banner-h{--ds-banner-faint-background:var(--color-background-faint-positive)}.banner--intent-warning.sc-ds-banner-h{--ds-banner-faint-background:var(--color-background-faint-warning)}.banner--intent-caution.sc-ds-banner-h{--ds-banner-faint-background:var(--color-background-faint-caution)}.banner--intent-negative.sc-ds-banner-h{--ds-banner-faint-background:var(--color-background-faint-negative)}.banner--contrast-faint.sc-ds-banner-h{--ds-banner-background:var(--ds-banner-faint-background);--ds-banner-heading:var(--color-foreground-primary);--ds-banner-description:var(--color-foreground-secondary);--ds-banner-border:var(--color-border-tertiary)}.banner--contrast-medium.sc-ds-banner-h{--ds-banner-background:var(--color-background-medium-neutral);--ds-banner-heading:var(--color-foreground-on-medium-background-primary);--ds-banner-description:var(--color-foreground-on-medium-background-secondary);--ds-banner-border:var(--color-border-on-medium-background-tertiary)}.banner--intent-brand.banner--contrast-medium.sc-ds-banner-h{--ds-banner-background:var(--color-background-medium-brand)}.banner--intent-positive.banner--contrast-medium.sc-ds-banner-h{--ds-banner-background:var(--color-background-medium-positive)}.banner--intent-warning.banner--contrast-medium.sc-ds-banner-h{--ds-banner-background:var(--color-background-medium-warning)}.banner--intent-caution.banner--contrast-medium.sc-ds-banner-h{--ds-banner-background:var(--color-background-medium-caution)}.banner--intent-negative.banner--contrast-medium.sc-ds-banner-h{--ds-banner-background:var(--color-background-medium-negative)}.banner--contrast-strong.sc-ds-banner-h{--ds-banner-background:var(--color-background-strong-neutral);--ds-banner-heading:var(--color-foreground-on-strong-background-primary);--ds-banner-description:var(--color-foreground-on-strong-background-secondary);--ds-banner-border:var(--color-border-on-strong-background-tertiary)}.banner--intent-brand.banner--contrast-strong.sc-ds-banner-h{--ds-banner-background:var(--color-background-strong-brand)}.banner--intent-positive.banner--contrast-strong.sc-ds-banner-h{--ds-banner-background:var(--color-background-strong-positive)}.banner--intent-warning.banner--contrast-strong.sc-ds-banner-h{--ds-banner-background:var(--color-background-strong-warning)}.banner--intent-caution.banner--contrast-strong.sc-ds-banner-h{--ds-banner-background:var(--color-background-strong-caution)}.banner--intent-negative.banner--contrast-strong.sc-ds-banner-h{--ds-banner-background:var(--color-background-strong-negative)}.banner--contrast-bold.sc-ds-banner-h{--ds-banner-background:var(--color-background-bold-neutral);--ds-banner-heading:var(--color-foreground-on-bold-background-primary);--ds-banner-description:var(--color-foreground-on-bold-background-secondary);--ds-banner-border:var(--color-border-on-bold-background-tertiary)}.banner--intent-brand.banner--contrast-bold.sc-ds-banner-h{--ds-banner-background:var(--color-background-bold-brand)}.banner--intent-positive.banner--contrast-bold.sc-ds-banner-h{--ds-banner-background:var(--color-background-bold-positive)}.banner--intent-warning.banner--contrast-bold.sc-ds-banner-h{--ds-banner-background:var(--color-background-bold-warning)}.banner--intent-caution.banner--contrast-bold.sc-ds-banner-h{--ds-banner-background:var(--color-background-bold-caution)}.banner--intent-negative.banner--contrast-bold.sc-ds-banner-h{--ds-banner-background:var(--color-background-bold-negative)}@media (prefers-reduced-motion: reduce){.sc-ds-banner-h,.banner-surface.sc-ds-banner{transition:none}}@media (forced-colors: active){.banner-surface.sc-ds-banner{color:var(--ds-forced-color-content);background-color:var(--ds-forced-color-surface);border-bottom-color:var(--ds-forced-color-content)}.banner-heading.sc-ds-banner,.banner-description.sc-ds-banner{color:var(--ds-forced-color-content)}}`;const m=n(class n extends e{constructor(n){super();if(n!==false){this.__registerHost()}this.dsClose=r(this,"dsClose");this.dsAfterClose=r(this,"dsAfterClose");this.heading="";this.intent="neutral";this.contrast="faint";this.orientation="horizontal";this.open=true;this.dismissLabel="Dismiss banner";this.announcement="none";this.rendered=false;this.phase="closed";this.hasActions=false;this.loaded=false;this.transitionTimer=null;this.openFrame=null;this.closePending=false}componentWillLoad(){this.rendered=this.open}componentDidLoad(){this.loaded=true;this.updateActionsPresence();if(this.open)this.startOpen()}disconnectedCallback(){this.clearTransitionWork()}onOpenChange(n){if(!this.loaded)return;if(n)this.startOpen();else this.startClose()}get closeMotionMs(){return h(g.motionShort3,g.animationDurationShort3)}clearTransitionWork(){if(this.transitionTimer)clearTimeout(this.transitionTimer);if(this.openFrame!==null)cancelAnimationFrame(this.openFrame);this.transitionTimer=null;this.openFrame=null}startOpen(){this.clearTransitionWork();this.closePending=false;this.rendered=true;this.phase="closed";this.openFrame=requestAnimationFrame((()=>{this.openFrame=null;if(this.open)this.phase="open"}))}startClose(){this.clearTransitionWork();if(!this.rendered||this.phase==="closed"){this.rendered=false;return}this.closePending=true;this.phase="closing";const n=this.closeMotionMs;if(n<=0){this.finishClose();return}this.transitionTimer=setTimeout((()=>{this.transitionTimer=null;this.finishClose()}),n)}finishClose(){if(this.open||!this.closePending)return;this.closePending=false;this.rendered=false;this.phase="closed";this.dsAfterClose.emit()}updateActionsPresence(n){const e=n?n.assignedElements().filter((n=>n.tagName==="DS-BUTTON-UNFILLED")):Array.from(this.el.querySelectorAll('ds-button-unfilled[slot="actions"]'));this.hasActions=e.length>0}requestClose(n){if(!this.open||this.phase==="closing")return;this.dsClose.emit(n.detail)}get role(){if(this.announcement==="polite")return"status";if(this.announcement==="assertive")return"alert";return undefined}get ariaLive(){return this.announcement==="none"?undefined:this.announcement}render(){const n=this.phase==="closing";const e={banner:true,"banner--open":this.phase==="open","banner--closing":n,"banner--hidden":!this.rendered,"banner--has-actions":this.hasActions,[`banner--orientation-${this.orientation}`]:true,[`banner--intent-${this.intent}`]:true,[`banner--contrast-${this.contrast}`]:true};return a(s,{key:"804b90a941a8963cef638db6811faf399f479ff7",class:e},this.rendered&&a("div",{key:"a613bfd482e12f7d707d3ea1732d4f3e7cf57350",class:"banner-overflow"},a("section",{key:"9f98ebdae3487938ae354087b01323c27dd438f8",class:"banner-surface ds-chrome-header ds-chrome-header--wrapping",role:this.role,"aria-live":this.ariaLive,"aria-atomic":this.announcement==="none"?undefined:"true","aria-hidden":n?"true":undefined,inert:n?true:undefined,"data-phase":this.phase},a("div",{key:"9f65def287a9a199fa923a81c7186e6435c404ec",class:"banner-copy ds-chrome-header__copy ds-chrome-header__copy--wrapping ds-control--md"},a("ds-text",{key:"b8cfa1e68b160eea4e2b7d8bf0c4ec6ef8066e75",class:"banner-copy-flow",as:"div",variant:"text-body-medium",color:"inherit"},this.heading&&a("ds-text",{key:"5fa61195f23d298727ff5f96e368ff24d6ed19a2",class:"banner-heading",as:"span",variant:"text-title-small",color:"inherit"},this.heading),a("span",{key:"fe5443ce3204552de06dfcefb799ff184c536a05",class:"banner-description"},this.description))),a("div",{key:"728a07a6968e81b6987875671d9f29e312f59304",class:"banner-trailing ds-chrome-header__trailing"},a("div",{key:"60bcb027ab50ce018d0794c3bbedb5a305e48939",class:{"banner-actions":true,"banner-actions--empty":!this.hasActions}},a("slot",{key:"d0b423ddfeac2a9b385a3f6e68fb597c168a0c44",name:"actions",onSlotchange:n=>this.updateActionsPresence(n.currentTarget)})),a("div",{key:"0a494df161ea1b794f444255bd4a64a8169588c7",class:"banner-dismiss"},a("ds-tooltip",{key:"740fa8199363dc7e34c2ab2db01d8dc96d0b24e2",label:this.dismissLabel,side:"bottom",size:"sm"},a("ds-button-unfilled",{key:"cf407d5e08a5e5bacfe53c4c42129adc01f6bd76",class:"banner-close",variant:"icon",icon:"Cross",size:"md",type:"button",background:this.contrast,"aria-label":this.dismissLabel,hasBorder:false,activeFill:false,onDsClick:n=>this.requestClose(n)})))))))}get el(){return this}static get watchers(){return{open:[{onOpenChange:0}]}}static get style(){return u()}},[262,"ds-banner",{description:[1],heading:[1],intent:[513],contrast:[513],orientation:[513],open:[516],dismissLabel:[1,"dismiss-label"],announcement:[1],rendered:[32],phase:[32],hasActions:[32]},undefined,{open:[{onOpenChange:0}]}]);function f(){if(typeof customElements==="undefined"){return}const n=["ds-banner","ds-badge","ds-button-unfilled","ds-icon","ds-loader","ds-text","ds-tooltip"];n.forEach((n=>{switch(n){case"ds-banner":if(!customElements.get(o(n))){customElements.define(o(n),m)}break;case"ds-badge":if(!customElements.get(o(n))){i()}break;case"ds-button-unfilled":if(!customElements.get(o(n))){d()}break;case"ds-icon":if(!customElements.get(o(n))){t()}break;case"ds-loader":if(!customElements.get(o(n))){c()}break;case"ds-text":if(!customElements.get(o(n))){b()}break;case"ds-tooltip":if(!customElements.get(o(n))){l()}break}}))}f();const p=m;const v=f;export{p as DsBanner,v as defineCustomElement};
2
+ //# sourceMappingURL=ds-banner.js.map