@ds-mo/ui 9.1.0 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp +1 -1
- package/dist/agent-patterns.json +165 -1
- package/dist/agent.json +2110 -634
- package/dist/angular/ds-agent-activity.d.ts +12 -0
- package/dist/angular/ds-agent-activity.js +38 -0
- package/dist/angular/ds-agent-response.d.ts +12 -0
- package/dist/angular/ds-agent-response.js +38 -0
- package/dist/angular/ds-agent-source-list.d.ts +12 -0
- package/dist/angular/ds-agent-source-list.js +38 -0
- package/dist/angular/ds-agent-tool-call.d.ts +12 -0
- package/dist/angular/ds-agent-tool-call.js +38 -0
- package/dist/angular/ds-attachment-list.d.ts +12 -0
- package/dist/angular/ds-attachment-list.js +38 -0
- package/dist/angular/ds-avatar.d.ts +12 -0
- package/dist/angular/ds-avatar.js +38 -0
- package/dist/angular/ds-code-block.d.ts +12 -0
- package/dist/angular/ds-code-block.js +38 -0
- package/dist/angular/ds-conversation-list-item.d.ts +19 -0
- package/dist/angular/ds-conversation-list-item.js +42 -0
- package/dist/angular/ds-conversation-list-section.d.ts +12 -0
- package/dist/angular/ds-conversation-list-section.js +38 -0
- package/dist/angular/ds-conversation-list.d.ts +12 -0
- package/dist/angular/ds-conversation-list.js +37 -0
- package/dist/angular/ds-markdown.d.ts +12 -0
- package/dist/angular/ds-markdown.js +38 -0
- package/dist/angular/ds-menu.d.ts +1 -1
- package/dist/angular/ds-menu.js +3 -3
- package/dist/angular/ds-message-bubble.d.ts +12 -0
- package/dist/angular/ds-message-bubble.js +38 -0
- package/dist/angular/ds-message-composer.d.ts +23 -0
- package/dist/angular/ds-message-composer.js +49 -0
- package/dist/angular/ds-message-scroller.d.ts +15 -0
- package/dist/angular/ds-message-scroller.js +43 -0
- package/dist/angular/ds-message.d.ts +12 -0
- package/dist/angular/ds-message.js +38 -0
- package/dist/angular/ds-panel-tool-header.d.ts +25 -0
- package/dist/angular/ds-panel-tool-header.js +49 -0
- package/dist/angular/ds-panel-tool-search.d.ts +19 -0
- package/dist/angular/ds-panel-tool-search.js +49 -0
- package/dist/angular/ds-panel-tools.d.ts +30 -1
- package/dist/angular/ds-panel-tools.js +14 -5
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +17 -0
- package/dist/angular/proxies.d.ts +17 -0
- package/dist/angular/proxies.js +17 -0
- package/dist/components/ds-agent-activity.d.ts +11 -0
- package/dist/components/ds-agent-activity.js +2 -0
- package/dist/components/ds-agent-activity.js.map +1 -0
- package/dist/components/ds-agent-response.d.ts +11 -0
- package/dist/components/ds-agent-response.js +2 -0
- package/dist/components/ds-agent-response.js.map +1 -0
- package/dist/components/ds-agent-source-list.d.ts +11 -0
- package/dist/components/ds-agent-source-list.js +2 -0
- package/dist/components/ds-agent-source-list.js.map +1 -0
- package/dist/components/ds-agent-tool-call.d.ts +11 -0
- package/dist/components/ds-agent-tool-call.js +2 -0
- package/dist/components/ds-agent-tool-call.js.map +1 -0
- package/dist/components/ds-app-shell.js +1 -1
- package/dist/components/ds-app-shell.js.map +1 -1
- package/dist/components/ds-attachment-list.d.ts +11 -0
- package/dist/components/ds-attachment-list.js +2 -0
- package/dist/components/ds-attachment-list.js.map +1 -0
- package/dist/components/ds-avatar.d.ts +11 -0
- package/dist/components/ds-avatar.js +2 -0
- package/dist/components/ds-avatar.js.map +1 -0
- package/dist/components/ds-badge.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-nav.js.map +1 -1
- package/dist/components/ds-button-filled.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-card-data-viz-donut.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-card-shell-data-viz.js +1 -1
- package/dist/components/ds-card.js +1 -1
- package/dist/components/ds-chart-bar.js +1 -1
- package/dist/components/ds-chart-bar.js.map +1 -1
- package/dist/components/ds-chart-donut.js +1 -1
- package/dist/components/ds-chart-legend.js +1 -1
- package/dist/components/ds-chart-line.js +1 -1
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-code-block.d.ts +11 -0
- package/dist/components/ds-code-block.js +2 -0
- package/dist/components/ds-code-block.js.map +1 -0
- package/dist/components/ds-conversation-list-item.d.ts +11 -0
- package/dist/components/ds-conversation-list-item.js +2 -0
- package/dist/components/ds-conversation-list-item.js.map +1 -0
- package/dist/components/ds-conversation-list-section.d.ts +11 -0
- package/dist/components/ds-conversation-list-section.js +2 -0
- package/dist/components/ds-conversation-list-section.js.map +1 -0
- package/dist/components/ds-conversation-list.d.ts +11 -0
- package/dist/components/ds-conversation-list.js +2 -0
- package/dist/components/ds-conversation-list.js.map +1 -0
- package/dist/components/ds-divider.js +1 -1
- package/dist/components/ds-divider.js.map +1 -1
- package/dist/components/ds-empty-state.js +1 -1
- package/dist/components/ds-field.js +1 -1
- package/dist/components/ds-icon.js +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-markdown.d.ts +11 -0
- package/dist/components/ds-markdown.js +2 -0
- package/dist/components/ds-markdown.js.map +1 -0
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-bubble.d.ts +11 -0
- package/dist/components/ds-message-bubble.js +2 -0
- package/dist/components/ds-message-bubble.js.map +1 -0
- package/dist/components/ds-message-composer.d.ts +11 -0
- package/dist/components/ds-message-composer.js +2 -0
- package/dist/components/ds-message-composer.js.map +1 -0
- package/dist/components/ds-message-scroller.d.ts +11 -0
- package/dist/components/ds-message-scroller.js +2 -0
- package/dist/components/ds-message-scroller.js.map +1 -0
- package/dist/components/ds-message.d.ts +11 -0
- package/dist/components/ds-message.js +2 -0
- package/dist/components/ds-message.js.map +1 -0
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-nav.js.map +1 -1
- package/dist/components/ds-panel-sub-nav.js +1 -1
- package/dist/components/ds-panel-tool-header.d.ts +11 -0
- package/dist/components/ds-panel-tool-header.js +2 -0
- package/dist/components/ds-panel-tool-header.js.map +1 -0
- package/dist/components/ds-panel-tool-search.d.ts +11 -0
- package/dist/components/ds-panel-tool-search.js +2 -0
- package/dist/components/ds-panel-tool-search.js.map +1 -0
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-panel-tools.js.map +1 -1
- package/dist/components/ds-radio.js +1 -1
- package/dist/components/ds-select-multi.js +1 -1
- package/dist/components/ds-select-multi.js.map +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-select.js.map +1 -1
- package/dist/components/ds-shell-gradient-picker.js +1 -1
- package/dist/components/ds-shell-gradient-picker.js.map +1 -1
- package/dist/components/ds-shell-gradient-swatch.js +1 -1
- package/dist/components/ds-skeleton.js +1 -1
- package/dist/components/ds-slider.js +1 -1
- package/dist/components/ds-slider.js.map +1 -1
- package/dist/components/ds-swatch-picker.js +1 -1
- package/dist/components/ds-switch.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-tab-group.js.map +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-text.js +1 -1
- package/dist/components/ds-tooltip-data-viz.js +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/index.d.ts +14 -0
- package/dist/components/p--KbMQblZ.js +2 -0
- package/dist/components/p--KbMQblZ.js.map +1 -0
- package/dist/components/p-2br9YDbG.js +2 -0
- package/dist/components/p-2br9YDbG.js.map +1 -0
- package/dist/components/p-41UAx2eq.js +2 -0
- package/dist/components/p-41UAx2eq.js.map +1 -0
- package/dist/components/{p-HBIxvS5C.js → p-B1pWGQn1.js} +2 -2
- package/dist/components/p-B7NbIYjS.js +2 -0
- package/dist/components/p-B7NbIYjS.js.map +1 -0
- package/dist/components/p-BBu_Svz7.js +2 -0
- package/dist/components/p-BBu_Svz7.js.map +1 -0
- package/dist/components/p-BEQB8EnB.js +2 -0
- package/dist/components/p-BEQB8EnB.js.map +1 -0
- package/dist/components/{p-CZ9wemOA.js → p-BFWC17em.js} +2 -2
- package/dist/components/{p-KRGBGTu5.js → p-BO6C8abO.js} +2 -2
- package/dist/components/{p-CbS_WWs2.js → p-BSOZXagj.js} +2 -2
- package/dist/components/p-BSOZXagj.js.map +1 -0
- package/dist/components/{p-DT2MK8Kt.js → p-BZAEZENv.js} +2 -2
- package/dist/components/p-BhC1YyId.js +2 -0
- package/dist/components/p-BhC1YyId.js.map +1 -0
- package/dist/components/p-BjtXYFhw.js +2 -0
- package/dist/components/p-BjtXYFhw.js.map +1 -0
- package/dist/components/{p-B-zhgAvL.js → p-Bo5wikia.js} +2 -2
- package/dist/components/p-Bx1G7P6W.js +2 -0
- package/dist/components/p-Bx1G7P6W.js.map +1 -0
- package/dist/components/p-C0sq948W.js +2 -0
- package/dist/components/p-C0sq948W.js.map +1 -0
- package/dist/components/p-CC1C8s6m.js +2 -0
- package/dist/components/p-CC1C8s6m.js.map +1 -0
- package/dist/components/p-CKaJx0IX.js +2 -0
- package/dist/components/p-CKaJx0IX.js.map +1 -0
- package/dist/components/{p-DyZj3k9S.js → p-CZMEhdlA.js} +2 -2
- package/dist/components/{p-BbV68F23.js → p-CiwdnKKp.js} +2 -2
- package/dist/components/{p-BLzivrE3.js → p-CnM9SW_8.js} +2 -2
- package/dist/components/{p-C7UFYvsO.js → p-CuKn9I5f.js} +2 -2
- package/dist/components/p-DFMM60My.js +2 -0
- package/dist/components/p-DFMM60My.js.map +1 -0
- package/dist/components/p-DIsDiGcp.js +2 -0
- package/dist/components/p-DIsDiGcp.js.map +1 -0
- package/dist/components/p-DVsje4AY.js +2 -0
- package/dist/components/p-DVsje4AY.js.map +1 -0
- package/dist/components/p-Di-ThR90.js +2 -0
- package/dist/components/p-Di-ThR90.js.map +1 -0
- package/dist/components/{p-C7RObioO.js → p-Di4HBckb.js} +2 -2
- package/dist/components/p-a9nGf1s6.js +2 -0
- package/dist/components/p-a9nGf1s6.js.map +1 -0
- package/dist/components/p-gidVv1FX.js +2 -0
- package/dist/components/p-gidVv1FX.js.map +1 -0
- package/dist/components/p-rEe-3KR_.js +2 -0
- package/dist/components/p-rEe-3KR_.js.map +1 -0
- package/dist/components/p-t9Ei1kHP.js +2 -0
- package/dist/components/p-t9Ei1kHP.js.map +1 -0
- package/dist/docs/components.json +7834 -3899
- package/dist/lib/components/Menu/menu-placement.d.ts +13 -0
- package/dist/lib/shell/index.d.ts +1 -1
- package/dist/lib/shell/index.js +8 -0
- package/dist/lib/shell/index.js.map +2 -2
- package/dist/mcp-data/registry/agent-activity.json +158 -0
- package/dist/mcp-data/registry/agent-response.json +211 -0
- package/dist/mcp-data/registry/agent-source-list.json +153 -0
- package/dist/mcp-data/registry/agent-tool-call.json +213 -0
- package/dist/mcp-data/registry/app-shell.json +2 -2
- package/dist/mcp-data/registry/attachment-list.json +137 -0
- package/dist/mcp-data/registry/avatar.json +136 -0
- package/dist/mcp-data/registry/bar-nav.json +2 -2
- package/dist/mcp-data/registry/code-block.json +150 -0
- package/dist/mcp-data/registry/conversation-list-item.json +265 -0
- package/dist/mcp-data/registry/conversation-list-section.json +139 -0
- package/dist/mcp-data/registry/conversation-list.json +101 -0
- package/dist/mcp-data/registry/markdown.json +141 -0
- package/dist/mcp-data/registry/menu.json +27 -7
- package/dist/mcp-data/registry/message-bubble.json +119 -0
- package/dist/mcp-data/registry/message-composer.json +265 -0
- package/dist/mcp-data/registry/message-scroller.json +217 -0
- package/dist/mcp-data/registry/message.json +255 -0
- package/dist/mcp-data/registry/panel-nav.json +2 -2
- package/dist/mcp-data/registry/panel-tool-header.json +342 -0
- package/dist/mcp-data/registry/panel-tool-search.json +387 -0
- package/dist/mcp-data/registry/panel-tools.json +150 -10
- package/dist/mcp-data/registry/registry.json +2146 -619
- package/dist/mcp-data/registry/select.json +1 -1
- package/dist/mcp-data/registry/slider.json +4 -4
- package/dist/mcp-data/registry/tab-group.json +2 -2
- package/dist/mcp-data/registry/text.json +1 -1
- package/dist/react/components.d.ts +17 -0
- package/dist/react/components.js +17 -0
- package/dist/react/ds-agent-activity.d.ts +9 -0
- package/dist/react/ds-agent-activity.js +12 -0
- package/dist/react/ds-agent-response.d.ts +9 -0
- package/dist/react/ds-agent-response.js +12 -0
- package/dist/react/ds-agent-source-list.d.ts +9 -0
- package/dist/react/ds-agent-source-list.js +12 -0
- package/dist/react/ds-agent-tool-call.d.ts +9 -0
- package/dist/react/ds-agent-tool-call.js +12 -0
- package/dist/react/ds-attachment-list.d.ts +9 -0
- package/dist/react/ds-attachment-list.js +12 -0
- package/dist/react/ds-avatar.d.ts +9 -0
- package/dist/react/ds-avatar.js +12 -0
- package/dist/react/ds-code-block.d.ts +9 -0
- package/dist/react/ds-code-block.js +12 -0
- package/dist/react/ds-conversation-list-item.d.ts +14 -0
- package/dist/react/ds-conversation-list-item.js +12 -0
- package/dist/react/ds-conversation-list-section.d.ts +9 -0
- package/dist/react/ds-conversation-list-section.js +12 -0
- package/dist/react/ds-conversation-list.d.ts +9 -0
- package/dist/react/ds-conversation-list.js +12 -0
- package/dist/react/ds-markdown.d.ts +9 -0
- package/dist/react/ds-markdown.js +12 -0
- package/dist/react/ds-message-bubble.d.ts +9 -0
- package/dist/react/ds-message-bubble.js +12 -0
- package/dist/react/ds-message-composer.d.ts +16 -0
- package/dist/react/ds-message-composer.js +16 -0
- package/dist/react/ds-message-scroller.d.ts +12 -0
- package/dist/react/ds-message-scroller.js +12 -0
- package/dist/react/ds-message.d.ts +9 -0
- package/dist/react/ds-message.js +12 -0
- package/dist/react/ds-panel-tool-header.d.ts +17 -0
- package/dist/react/ds-panel-tool-header.js +16 -0
- package/dist/react/ds-panel-tool-search.d.ts +14 -0
- package/dist/react/ds-panel-tool-search.js +16 -0
- package/dist/react/ds-panel-tools.d.ts +10 -0
- package/dist/react/ds-panel-tools.js +3 -0
- package/dist/types/components/AgentActivity/AgentActivity.d.ts +14 -0
- package/dist/types/components/AgentResponse/AgentResponse.d.ts +12 -0
- package/dist/types/components/AgentSourceList/AgentSourceList.d.ts +9 -0
- package/dist/types/components/AgentToolCall/AgentToolCall.d.ts +13 -0
- package/dist/types/components/AppShell/AppShell.d.ts +4 -0
- package/dist/types/components/AttachmentList/AttachmentList.d.ts +8 -0
- package/dist/types/components/Avatar/Avatar.d.ts +8 -0
- package/dist/types/components/CodeBlock/CodeBlock.d.ts +11 -0
- package/dist/types/components/ConversationList/ConversationList.d.ts +4 -0
- package/dist/types/components/ConversationListItem/ConversationListItem.d.ts +22 -0
- package/dist/types/components/ConversationListSection/ConversationListSection.d.ts +9 -0
- package/dist/types/components/Markdown/Markdown.d.ts +15 -0
- package/dist/types/components/Menu/Menu.d.ts +3 -0
- package/dist/types/components/Menu/menu-placement.d.ts +13 -0
- package/dist/types/components/Menu/menu-types.d.ts +1 -1
- package/dist/types/components/Message/Message.d.ts +17 -0
- package/dist/types/components/MessageBubble/MessageBubble.d.ts +6 -0
- package/dist/types/components/MessageComposer/MessageComposer.d.ts +29 -0
- package/dist/types/components/MessageScroller/MessageScroller.d.ts +37 -0
- package/dist/types/components/PanelNav/PanelNav.d.ts +3 -0
- package/dist/types/components/PanelToolHeader/PanelToolHeader.d.ts +34 -0
- package/dist/types/components/PanelToolSearch/PanelToolSearch.d.ts +35 -0
- package/dist/types/components/PanelTools/PanelTools.d.ts +40 -1
- package/dist/types/components/PanelTools/panel-tools-types.d.ts +20 -0
- package/dist/types/components/PanelTools/panel-tools-utils.d.ts +2 -0
- package/dist/types/components/Slider/Slider.d.ts +1 -1
- package/dist/types/components/conversation-types.d.ts +55 -0
- package/dist/types/components.d.ts +1185 -8
- package/dist/types/shell/index.d.ts +1 -1
- package/dist/types/utils/choice-list-parts.d.ts +4 -1
- package/package.json +4 -1
- package/dist/components/p-CXF8yd-g.js +0 -2
- package/dist/components/p-CXF8yd-g.js.map +0 -1
- package/dist/components/p-CbS_WWs2.js.map +0 -1
- package/dist/components/p-VKIsOVza.js +0 -2
- package/dist/components/p-VKIsOVza.js.map +0 -1
- package/dist/components/p-tQ1QHeOE.js +0 -2
- package/dist/components/p-tQ1QHeOE.js.map +0 -1
- /package/dist/components/{p-HBIxvS5C.js.map → p-B1pWGQn1.js.map} +0 -0
- /package/dist/components/{p-CZ9wemOA.js.map → p-BFWC17em.js.map} +0 -0
- /package/dist/components/{p-KRGBGTu5.js.map → p-BO6C8abO.js.map} +0 -0
- /package/dist/components/{p-DT2MK8Kt.js.map → p-BZAEZENv.js.map} +0 -0
- /package/dist/components/{p-B-zhgAvL.js.map → p-Bo5wikia.js.map} +0 -0
- /package/dist/components/{p-DyZj3k9S.js.map → p-CZMEhdlA.js.map} +0 -0
- /package/dist/components/{p-BbV68F23.js.map → p-CiwdnKKp.js.map} +0 -0
- /package/dist/components/{p-BLzivrE3.js.map → p-CnM9SW_8.js.map} +0 -0
- /package/dist/components/{p-C7UFYvsO.js.map → p-CuKn9I5f.js.map} +0 -0
- /package/dist/components/{p-C7RObioO.js.map → p-Di4HBckb.js.map} +0 -0
|
@@ -20,6 +20,349 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"items": [
|
|
23
|
+
{
|
|
24
|
+
"name": "agent-activity",
|
|
25
|
+
"title": "AgentActivity",
|
|
26
|
+
"description": "Collapsible, user-safe summary of agent work steps without private reasoning.",
|
|
27
|
+
"type": "registry:ui",
|
|
28
|
+
"meta": {
|
|
29
|
+
"library": "@ds-mo/ui",
|
|
30
|
+
"distribution": "npm",
|
|
31
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/agent-activity",
|
|
32
|
+
"source": "src/wc/components/AgentActivity/AgentActivity.tsx",
|
|
33
|
+
"intentStatus": "complete",
|
|
34
|
+
"intent": {
|
|
35
|
+
"audience": "specialized",
|
|
36
|
+
"status": "experimental",
|
|
37
|
+
"summary": "Collapsible, user-safe summary of agent work steps without private reasoning.",
|
|
38
|
+
"useWhen": [
|
|
39
|
+
"An agent response benefits from concise progress or completion summaries."
|
|
40
|
+
],
|
|
41
|
+
"avoidWhen": [
|
|
42
|
+
"The content would reveal private chain-of-thought, hidden prompts, secrets, or raw internal traces."
|
|
43
|
+
],
|
|
44
|
+
"commonlyComposedWith": [
|
|
45
|
+
"component:ds-agent-response",
|
|
46
|
+
"component:ds-loader"
|
|
47
|
+
],
|
|
48
|
+
"patterns": [
|
|
49
|
+
"pattern:agent-chat"
|
|
50
|
+
],
|
|
51
|
+
"accessibility": [
|
|
52
|
+
"Each step has textual state and description; animation and color are supplementary.",
|
|
53
|
+
"The disclosure uses native keyboard and expanded-state semantics."
|
|
54
|
+
],
|
|
55
|
+
"states": [
|
|
56
|
+
"While collapsed, the summary follows the current user-safe activity and shimmers only while active; while expanded, the heading becomes Activity and the ordered list exposes every step.",
|
|
57
|
+
"Pending, active, complete, and error describe user-safe workflow progress."
|
|
58
|
+
],
|
|
59
|
+
"responsiveBehavior": [
|
|
60
|
+
"Steps wrap within the response width."
|
|
61
|
+
],
|
|
62
|
+
"references": [
|
|
63
|
+
{
|
|
64
|
+
"label": "Storybook examples",
|
|
65
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"props": {
|
|
70
|
+
"heading": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"required": false
|
|
73
|
+
},
|
|
74
|
+
"items": {
|
|
75
|
+
"type": "AgentActivityItem[]",
|
|
76
|
+
"required": false
|
|
77
|
+
},
|
|
78
|
+
"open": {
|
|
79
|
+
"type": "boolean",
|
|
80
|
+
"required": false
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"events": [],
|
|
84
|
+
"slots": [],
|
|
85
|
+
"exports": {
|
|
86
|
+
"customElement": "ds-agent-activity",
|
|
87
|
+
"react": "DsAgentActivity",
|
|
88
|
+
"angular": "DsAgentActivity"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"dependencies": [
|
|
92
|
+
"@ds-mo/ui",
|
|
93
|
+
"@ds-mo/tokens",
|
|
94
|
+
"@ds-mo/icons"
|
|
95
|
+
],
|
|
96
|
+
"registryDependencies": [
|
|
97
|
+
"icon",
|
|
98
|
+
"loader",
|
|
99
|
+
"text"
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "agent-response",
|
|
104
|
+
"title": "AgentResponse",
|
|
105
|
+
"description": "Ordered renderer for normalized immutable agent response parts inside a generic incoming message.",
|
|
106
|
+
"type": "registry:ui",
|
|
107
|
+
"meta": {
|
|
108
|
+
"library": "@ds-mo/ui",
|
|
109
|
+
"distribution": "npm",
|
|
110
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/agent-response",
|
|
111
|
+
"source": "src/wc/components/AgentResponse/AgentResponse.tsx",
|
|
112
|
+
"intentStatus": "complete",
|
|
113
|
+
"intent": {
|
|
114
|
+
"audience": "specialized",
|
|
115
|
+
"status": "experimental",
|
|
116
|
+
"summary": "Ordered renderer for normalized immutable agent response parts inside a generic incoming message.",
|
|
117
|
+
"useWhen": [
|
|
118
|
+
"An agent response combines Markdown, user-safe activity, display-only tools, attachments, and sources in authored order."
|
|
119
|
+
],
|
|
120
|
+
"avoidWhen": [
|
|
121
|
+
"The component would be expected to own a model, transport, persistence, title generation, approval policy, or private reasoning."
|
|
122
|
+
],
|
|
123
|
+
"commonlyComposedWith": [
|
|
124
|
+
"component:ds-message",
|
|
125
|
+
"component:ds-markdown",
|
|
126
|
+
"component:ds-agent-activity",
|
|
127
|
+
"component:ds-agent-tool-call",
|
|
128
|
+
"component:ds-agent-source-list"
|
|
129
|
+
],
|
|
130
|
+
"patterns": [
|
|
131
|
+
"pattern:agent-chat"
|
|
132
|
+
],
|
|
133
|
+
"accessibility": [
|
|
134
|
+
"Part order matches authored reading order and remains inside generic message semantics.",
|
|
135
|
+
"Streaming state supplements rather than replaces meaningful textual status."
|
|
136
|
+
],
|
|
137
|
+
"states": [
|
|
138
|
+
"The owner replaces immutable part arrays as scripted or live output changes."
|
|
139
|
+
],
|
|
140
|
+
"responsiveBehavior": [
|
|
141
|
+
"Rich content uses the wider ghost message treatment while respecting transcript constraints."
|
|
142
|
+
],
|
|
143
|
+
"references": [
|
|
144
|
+
{
|
|
145
|
+
"label": "Storybook examples",
|
|
146
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
},
|
|
150
|
+
"props": {
|
|
151
|
+
"author": {
|
|
152
|
+
"type": "string",
|
|
153
|
+
"required": false
|
|
154
|
+
},
|
|
155
|
+
"messageId": {
|
|
156
|
+
"type": "string",
|
|
157
|
+
"required": false
|
|
158
|
+
},
|
|
159
|
+
"parts": {
|
|
160
|
+
"type": "AgentResponsePart[]",
|
|
161
|
+
"required": false
|
|
162
|
+
},
|
|
163
|
+
"showAuthor": {
|
|
164
|
+
"type": "boolean",
|
|
165
|
+
"required": false
|
|
166
|
+
},
|
|
167
|
+
"streaming": {
|
|
168
|
+
"type": "boolean",
|
|
169
|
+
"required": false
|
|
170
|
+
},
|
|
171
|
+
"timestamp": {
|
|
172
|
+
"type": "string",
|
|
173
|
+
"required": false
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
"events": [],
|
|
177
|
+
"slots": [],
|
|
178
|
+
"exports": {
|
|
179
|
+
"customElement": "ds-agent-response",
|
|
180
|
+
"react": "DsAgentResponse",
|
|
181
|
+
"angular": "DsAgentResponse"
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"dependencies": [
|
|
185
|
+
"@ds-mo/ui",
|
|
186
|
+
"@ds-mo/tokens"
|
|
187
|
+
],
|
|
188
|
+
"registryDependencies": [
|
|
189
|
+
"agent-activity",
|
|
190
|
+
"agent-source-list",
|
|
191
|
+
"agent-tool-call",
|
|
192
|
+
"attachment-list",
|
|
193
|
+
"markdown",
|
|
194
|
+
"message",
|
|
195
|
+
"message-bubble"
|
|
196
|
+
]
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"name": "agent-source-list",
|
|
200
|
+
"title": "AgentSourceList",
|
|
201
|
+
"description": "Collapsible list of agent response sources with title, description, and validated external links.",
|
|
202
|
+
"type": "registry:ui",
|
|
203
|
+
"meta": {
|
|
204
|
+
"library": "@ds-mo/ui",
|
|
205
|
+
"distribution": "npm",
|
|
206
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/agent-source-list",
|
|
207
|
+
"source": "src/wc/components/AgentSourceList/AgentSourceList.tsx",
|
|
208
|
+
"intentStatus": "complete",
|
|
209
|
+
"intent": {
|
|
210
|
+
"audience": "specialized",
|
|
211
|
+
"status": "experimental",
|
|
212
|
+
"summary": "Collapsible list of agent response sources with title, description, and validated external links.",
|
|
213
|
+
"useWhen": [
|
|
214
|
+
"An agent response cites external material readers may inspect."
|
|
215
|
+
],
|
|
216
|
+
"avoidWhen": [
|
|
217
|
+
"The links are ordinary body links or are not sources for the response."
|
|
218
|
+
],
|
|
219
|
+
"commonlyComposedWith": [
|
|
220
|
+
"component:ds-agent-response",
|
|
221
|
+
"component:ds-markdown"
|
|
222
|
+
],
|
|
223
|
+
"patterns": [
|
|
224
|
+
"pattern:agent-chat"
|
|
225
|
+
],
|
|
226
|
+
"accessibility": [
|
|
227
|
+
"Each source uses descriptive linked text and visible supporting context.",
|
|
228
|
+
"Unsafe link schemes remain non-interactive text."
|
|
229
|
+
],
|
|
230
|
+
"responsiveBehavior": [
|
|
231
|
+
"Source titles and descriptions wrap within the response width."
|
|
232
|
+
],
|
|
233
|
+
"references": [
|
|
234
|
+
{
|
|
235
|
+
"label": "Storybook examples",
|
|
236
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
},
|
|
240
|
+
"props": {
|
|
241
|
+
"heading": {
|
|
242
|
+
"type": "string",
|
|
243
|
+
"required": false
|
|
244
|
+
},
|
|
245
|
+
"items": {
|
|
246
|
+
"type": "AgentSource[]",
|
|
247
|
+
"required": false
|
|
248
|
+
},
|
|
249
|
+
"open": {
|
|
250
|
+
"type": "boolean",
|
|
251
|
+
"required": false
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"events": [],
|
|
255
|
+
"slots": [],
|
|
256
|
+
"exports": {
|
|
257
|
+
"customElement": "ds-agent-source-list",
|
|
258
|
+
"react": "DsAgentSourceList",
|
|
259
|
+
"angular": "DsAgentSourceList"
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
"dependencies": [
|
|
263
|
+
"@ds-mo/ui",
|
|
264
|
+
"@ds-mo/tokens",
|
|
265
|
+
"@ds-mo/icons"
|
|
266
|
+
],
|
|
267
|
+
"registryDependencies": [
|
|
268
|
+
"icon",
|
|
269
|
+
"text"
|
|
270
|
+
]
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"name": "agent-tool-call",
|
|
274
|
+
"title": "AgentToolCall",
|
|
275
|
+
"description": "Display-only disclosure for an agent tool call, its safe input or output, and execution status.",
|
|
276
|
+
"type": "registry:ui",
|
|
277
|
+
"meta": {
|
|
278
|
+
"library": "@ds-mo/ui",
|
|
279
|
+
"distribution": "npm",
|
|
280
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/agent-tool-call",
|
|
281
|
+
"source": "src/wc/components/AgentToolCall/AgentToolCall.tsx",
|
|
282
|
+
"intentStatus": "complete",
|
|
283
|
+
"intent": {
|
|
284
|
+
"audience": "specialized",
|
|
285
|
+
"status": "experimental",
|
|
286
|
+
"summary": "Display-only disclosure for an agent tool call, its safe input or output, and execution status.",
|
|
287
|
+
"useWhen": [
|
|
288
|
+
"A prototype or agent product needs to expose user-safe tool execution detail."
|
|
289
|
+
],
|
|
290
|
+
"avoidWhen": [
|
|
291
|
+
"A participant must approve, deny, edit, or retry the tool call; those are product controls outside this component."
|
|
292
|
+
],
|
|
293
|
+
"commonlyComposedWith": [
|
|
294
|
+
"component:ds-agent-response",
|
|
295
|
+
"component:ds-code-block"
|
|
296
|
+
],
|
|
297
|
+
"patterns": [
|
|
298
|
+
"pattern:agent-chat"
|
|
299
|
+
],
|
|
300
|
+
"accessibility": [
|
|
301
|
+
"Queued, running, success, error, and denied states are available as text.",
|
|
302
|
+
"The disclosure uses native keyboard and expanded-state semantics."
|
|
303
|
+
],
|
|
304
|
+
"states": [
|
|
305
|
+
"This component presents state but never executes a tool or owns approval policy."
|
|
306
|
+
],
|
|
307
|
+
"responsiveBehavior": [
|
|
308
|
+
"Structured detail wraps and scrolls without widening the transcript."
|
|
309
|
+
],
|
|
310
|
+
"references": [
|
|
311
|
+
{
|
|
312
|
+
"label": "Storybook examples",
|
|
313
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
314
|
+
}
|
|
315
|
+
]
|
|
316
|
+
},
|
|
317
|
+
"props": {
|
|
318
|
+
"error": {
|
|
319
|
+
"type": "string",
|
|
320
|
+
"required": false
|
|
321
|
+
},
|
|
322
|
+
"input": {
|
|
323
|
+
"type": "unknown",
|
|
324
|
+
"required": false
|
|
325
|
+
},
|
|
326
|
+
"label": {
|
|
327
|
+
"type": "string",
|
|
328
|
+
"required": false
|
|
329
|
+
},
|
|
330
|
+
"name": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"required": false
|
|
333
|
+
},
|
|
334
|
+
"open": {
|
|
335
|
+
"type": "boolean",
|
|
336
|
+
"required": false
|
|
337
|
+
},
|
|
338
|
+
"output": {
|
|
339
|
+
"type": "unknown",
|
|
340
|
+
"required": false
|
|
341
|
+
},
|
|
342
|
+
"state": {
|
|
343
|
+
"type": "AgentToolState",
|
|
344
|
+
"required": false
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
"events": [],
|
|
348
|
+
"slots": [],
|
|
349
|
+
"exports": {
|
|
350
|
+
"customElement": "ds-agent-tool-call",
|
|
351
|
+
"react": "DsAgentToolCall",
|
|
352
|
+
"angular": "DsAgentToolCall"
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
"dependencies": [
|
|
356
|
+
"@ds-mo/ui",
|
|
357
|
+
"@ds-mo/tokens",
|
|
358
|
+
"@ds-mo/icons"
|
|
359
|
+
],
|
|
360
|
+
"registryDependencies": [
|
|
361
|
+
"icon",
|
|
362
|
+
"loader",
|
|
363
|
+
"text"
|
|
364
|
+
]
|
|
365
|
+
},
|
|
23
366
|
{
|
|
24
367
|
"name": "app-shell",
|
|
25
368
|
"title": "AppShell",
|
|
@@ -145,27 +488,163 @@
|
|
|
145
488
|
"registryDependencies": []
|
|
146
489
|
},
|
|
147
490
|
{
|
|
148
|
-
"name": "
|
|
149
|
-
"title": "
|
|
150
|
-
"description": "
|
|
491
|
+
"name": "attachment-list",
|
|
492
|
+
"title": "AttachmentList",
|
|
493
|
+
"description": "Channel-neutral list of message attachments with name, media type, size, and optional safe link.",
|
|
151
494
|
"type": "registry:ui",
|
|
152
495
|
"meta": {
|
|
153
496
|
"library": "@ds-mo/ui",
|
|
154
497
|
"distribution": "npm",
|
|
155
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
156
|
-
"source": "src/wc/components/
|
|
498
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/attachment-list",
|
|
499
|
+
"source": "src/wc/components/AttachmentList/AttachmentList.tsx",
|
|
157
500
|
"intentStatus": "complete",
|
|
158
501
|
"intent": {
|
|
159
502
|
"audience": "general",
|
|
160
|
-
"status": "
|
|
161
|
-
"summary": "
|
|
503
|
+
"status": "experimental",
|
|
504
|
+
"summary": "Channel-neutral list of message attachments with name, media type, size, and optional safe link.",
|
|
162
505
|
"useWhen": [
|
|
163
|
-
"
|
|
164
|
-
"An owning element needs a small visual dot indicating that supplemental notification information exists.",
|
|
165
|
-
"When the badge overlaps an icon or content, the immediate backing surface can be identified so its separation ring matches."
|
|
506
|
+
"A conversation message needs to display already-known attachment metadata."
|
|
166
507
|
],
|
|
167
508
|
"avoidWhen": [
|
|
168
|
-
"
|
|
509
|
+
"Users need to choose, upload, remove, or edit files; those controls belong to the product workflow."
|
|
510
|
+
],
|
|
511
|
+
"commonlyComposedWith": [
|
|
512
|
+
"component:ds-message",
|
|
513
|
+
"component:ds-message-bubble"
|
|
514
|
+
],
|
|
515
|
+
"patterns": [
|
|
516
|
+
"pattern:conversation"
|
|
517
|
+
],
|
|
518
|
+
"accessibility": [
|
|
519
|
+
"Attachment name remains visible and is the link text when a safe URL is available.",
|
|
520
|
+
"Media type and size are supporting metadata, never the only identifier."
|
|
521
|
+
],
|
|
522
|
+
"responsiveBehavior": [
|
|
523
|
+
"Long names wrap or truncate without overflowing the message surface."
|
|
524
|
+
],
|
|
525
|
+
"references": [
|
|
526
|
+
{
|
|
527
|
+
"label": "Storybook examples",
|
|
528
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
529
|
+
}
|
|
530
|
+
]
|
|
531
|
+
},
|
|
532
|
+
"props": {
|
|
533
|
+
"items": {
|
|
534
|
+
"type": "ConversationAttachment[]",
|
|
535
|
+
"required": false
|
|
536
|
+
},
|
|
537
|
+
"label": {
|
|
538
|
+
"type": "string",
|
|
539
|
+
"required": false
|
|
540
|
+
}
|
|
541
|
+
},
|
|
542
|
+
"events": [],
|
|
543
|
+
"slots": [],
|
|
544
|
+
"exports": {
|
|
545
|
+
"customElement": "ds-attachment-list",
|
|
546
|
+
"react": "DsAttachmentList",
|
|
547
|
+
"angular": "DsAttachmentList"
|
|
548
|
+
}
|
|
549
|
+
},
|
|
550
|
+
"dependencies": [
|
|
551
|
+
"@ds-mo/ui",
|
|
552
|
+
"@ds-mo/tokens",
|
|
553
|
+
"@ds-mo/icons"
|
|
554
|
+
],
|
|
555
|
+
"registryDependencies": [
|
|
556
|
+
"icon",
|
|
557
|
+
"text"
|
|
558
|
+
]
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
"name": "avatar",
|
|
562
|
+
"title": "Avatar",
|
|
563
|
+
"description": "Compact icon avatar for visually identifying a person, group, channel, or conversation type.",
|
|
564
|
+
"type": "registry:ui",
|
|
565
|
+
"meta": {
|
|
566
|
+
"library": "@ds-mo/ui",
|
|
567
|
+
"distribution": "npm",
|
|
568
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/avatar",
|
|
569
|
+
"source": "src/wc/components/Avatar/Avatar.tsx",
|
|
570
|
+
"intentStatus": "complete",
|
|
571
|
+
"intent": {
|
|
572
|
+
"audience": "general",
|
|
573
|
+
"status": "experimental",
|
|
574
|
+
"summary": "Compact icon avatar for visually identifying a person, group, channel, or conversation type.",
|
|
575
|
+
"useWhen": [
|
|
576
|
+
"A list or message composition needs a consistent 32px circular identity marker represented by an icon."
|
|
577
|
+
],
|
|
578
|
+
"avoidWhen": [
|
|
579
|
+
"The identity has a supplied photograph, initials, presence state, or editable profile behavior; those variants are not part of this primitive."
|
|
580
|
+
],
|
|
581
|
+
"commonlyComposedWith": [
|
|
582
|
+
"component:ds-conversation-list-item",
|
|
583
|
+
"component:ds-message"
|
|
584
|
+
],
|
|
585
|
+
"accessibility": [
|
|
586
|
+
"Provide label only when the icon communicates meaning that surrounding text does not already convey.",
|
|
587
|
+
"Omit label when the owning row or message already provides an equivalent accessible name."
|
|
588
|
+
],
|
|
589
|
+
"responsiveBehavior": [
|
|
590
|
+
"The avatar keeps its fixed 32px circle and 20px icon at every viewport size."
|
|
591
|
+
],
|
|
592
|
+
"references": [
|
|
593
|
+
{
|
|
594
|
+
"label": "Storybook examples",
|
|
595
|
+
"path": "src/wc/components/Avatar/Avatar.stories.ts"
|
|
596
|
+
}
|
|
597
|
+
]
|
|
598
|
+
},
|
|
599
|
+
"props": {
|
|
600
|
+
"icon": {
|
|
601
|
+
"type": "string",
|
|
602
|
+
"required": false
|
|
603
|
+
},
|
|
604
|
+
"label": {
|
|
605
|
+
"type": "string | undefined",
|
|
606
|
+
"required": false
|
|
607
|
+
}
|
|
608
|
+
},
|
|
609
|
+
"events": [],
|
|
610
|
+
"slots": [],
|
|
611
|
+
"exports": {
|
|
612
|
+
"customElement": "ds-avatar",
|
|
613
|
+
"react": "DsAvatar",
|
|
614
|
+
"angular": "DsAvatar"
|
|
615
|
+
}
|
|
616
|
+
},
|
|
617
|
+
"dependencies": [
|
|
618
|
+
"@ds-mo/ui",
|
|
619
|
+
"@ds-mo/tokens",
|
|
620
|
+
"@ds-mo/icons"
|
|
621
|
+
],
|
|
622
|
+
"registryDependencies": [
|
|
623
|
+
"icon"
|
|
624
|
+
]
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"name": "badge",
|
|
628
|
+
"title": "Badge",
|
|
629
|
+
"description": "Non-interactive brand counter or dot that supplements an owning control or label with unread notification information.",
|
|
630
|
+
"type": "registry:ui",
|
|
631
|
+
"meta": {
|
|
632
|
+
"library": "@ds-mo/ui",
|
|
633
|
+
"distribution": "npm",
|
|
634
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/badge",
|
|
635
|
+
"source": "src/wc/components/Badge/Badge.tsx",
|
|
636
|
+
"intentStatus": "complete",
|
|
637
|
+
"intent": {
|
|
638
|
+
"audience": "general",
|
|
639
|
+
"status": "stable",
|
|
640
|
+
"summary": "Non-interactive brand counter or dot that supplements an owning control or label with unread notification information.",
|
|
641
|
+
"useWhen": [
|
|
642
|
+
"An existing control, navigation item, or label needs a compact unread notification count.",
|
|
643
|
+
"An owning element needs a small visual dot indicating that supplemental notification information exists.",
|
|
644
|
+
"When the badge overlaps an icon or content, the immediate backing surface can be identified so its separation ring matches."
|
|
645
|
+
],
|
|
646
|
+
"avoidWhen": [
|
|
647
|
+
"The status must stand alone without an owning label or control.",
|
|
169
648
|
"The mark needs semantic positive, caution, negative, or neutral color; Badge intentionally uses one brand treatment.",
|
|
170
649
|
"The compact content is metadata or taxonomy; use Tag or Chip according to whether it is removable.",
|
|
171
650
|
"The badge itself would receive pointer or keyboard interaction; put interaction on the owning control."
|
|
@@ -1629,339 +2108,231 @@
|
|
|
1629
2108
|
]
|
|
1630
2109
|
},
|
|
1631
2110
|
{
|
|
1632
|
-
"name": "
|
|
1633
|
-
"title": "
|
|
1634
|
-
"description": "
|
|
2111
|
+
"name": "code-block",
|
|
2112
|
+
"title": "CodeBlock",
|
|
2113
|
+
"description": "Scrollable monospace code surface with optional language or filename context and copy action.",
|
|
1635
2114
|
"type": "registry:ui",
|
|
1636
2115
|
"meta": {
|
|
1637
2116
|
"library": "@ds-mo/ui",
|
|
1638
2117
|
"distribution": "npm",
|
|
1639
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
1640
|
-
"source": "src/wc/components/
|
|
2118
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/code-block",
|
|
2119
|
+
"source": "src/wc/components/CodeBlock/CodeBlock.tsx",
|
|
1641
2120
|
"intentStatus": "complete",
|
|
1642
2121
|
"intent": {
|
|
1643
2122
|
"audience": "general",
|
|
1644
|
-
"status": "
|
|
1645
|
-
"summary": "
|
|
2123
|
+
"status": "experimental",
|
|
2124
|
+
"summary": "Scrollable monospace code surface with optional language or filename context and copy action.",
|
|
1646
2125
|
"useWhen": [
|
|
1647
|
-
"
|
|
1648
|
-
"A list or panel needs an inset separator that does not define the outer edge of its container.",
|
|
1649
|
-
"Meaningful document or group structure requires an explicit horizontal or vertical separator."
|
|
2126
|
+
"A message or document displays fenced code that readers may copy."
|
|
1650
2127
|
],
|
|
1651
2128
|
"avoidWhen": [
|
|
1652
|
-
"
|
|
1653
|
-
"The line defines a container edge, control outline, or selected state; use the owning component's border treatment.",
|
|
1654
|
-
"The divider would compensate for weak headings or unclear information hierarchy.",
|
|
1655
|
-
"A decorative flourish does not clarify grouping."
|
|
1656
|
-
],
|
|
1657
|
-
"alternatives": [
|
|
1658
|
-
{
|
|
1659
|
-
"when": "Content needs an enclosing surface and outer boundary.",
|
|
1660
|
-
"component": "component:ds-card",
|
|
1661
|
-
"reason": "Card owns container chrome, structure, and edge treatment."
|
|
1662
|
-
},
|
|
1663
|
-
{
|
|
1664
|
-
"when": "A static compact label is being used to name a group.",
|
|
1665
|
-
"component": "component:ds-text",
|
|
1666
|
-
"reason": "Text communicates hierarchy directly instead of relying on a line."
|
|
1667
|
-
}
|
|
2129
|
+
"A live editor, terminal, diff viewer, or syntax-highlighting environment is required."
|
|
1668
2130
|
],
|
|
1669
2131
|
"commonlyComposedWith": [
|
|
1670
|
-
"component:ds-
|
|
1671
|
-
"component:ds-
|
|
1672
|
-
"component:ds-panel-sub-nav"
|
|
2132
|
+
"component:ds-markdown",
|
|
2133
|
+
"component:ds-button-unfilled"
|
|
1673
2134
|
],
|
|
1674
2135
|
"accessibility": [
|
|
1675
|
-
"
|
|
1676
|
-
"
|
|
1677
|
-
"Semantic orientation must match the divider's visual orientation.",
|
|
1678
|
-
"Do not use a semantic divider as a substitute for headings, landmarks, or explicit group labels."
|
|
1679
|
-
],
|
|
1680
|
-
"states": [
|
|
1681
|
-
"Horizontal and vertical variants separate sibling groups along the parent's layout axis.",
|
|
1682
|
-
"The omitted background context is for primary and secondary surfaces. Explicit faint documents a faint surface while using the same standard divider token.",
|
|
1683
|
-
"Other background contexts select their matching divider token, including navigation where Divider is composed inside app chrome.",
|
|
1684
|
-
"Inset is symmetric along the line axis. Explicit length is reserved for layout-specific separators; otherwise the line fills the available axis."
|
|
2136
|
+
"The copy action has explicit status wording and the code remains selectable text.",
|
|
2137
|
+
"Language and filename labels supplement rather than replace the code content."
|
|
1685
2138
|
],
|
|
1686
2139
|
"responsiveBehavior": [
|
|
1687
|
-
"
|
|
1688
|
-
"Divider does not infer layout direction or hide itself responsively."
|
|
2140
|
+
"Long lines scroll horizontally and do not widen the owning transcript."
|
|
1689
2141
|
],
|
|
1690
|
-
"frameworkCaveats": {
|
|
1691
|
-
"customElements": [
|
|
1692
|
-
"Set semantic mode only from known document structure; presentation alone should remain hidden from assistive technology."
|
|
1693
|
-
],
|
|
1694
|
-
"react": [
|
|
1695
|
-
"Derive orientation and visibility from the parent layout rather than viewport logic inside Divider."
|
|
1696
|
-
],
|
|
1697
|
-
"angular": [
|
|
1698
|
-
"Derive orientation and visibility from the parent layout rather than viewport logic inside Divider."
|
|
1699
|
-
]
|
|
1700
|
-
},
|
|
1701
2142
|
"references": [
|
|
1702
2143
|
{
|
|
1703
2144
|
"label": "Storybook examples",
|
|
1704
|
-
"path": "src/wc/components/
|
|
2145
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
1705
2146
|
}
|
|
1706
2147
|
]
|
|
1707
2148
|
},
|
|
1708
2149
|
"props": {
|
|
1709
|
-
"
|
|
1710
|
-
"type": "
|
|
1711
|
-
"required": false
|
|
1712
|
-
},
|
|
1713
|
-
"inset": {
|
|
1714
|
-
"type": "DividerInset",
|
|
1715
|
-
"required": false
|
|
1716
|
-
},
|
|
1717
|
-
"length": {
|
|
1718
|
-
"type": "DividerLength",
|
|
2150
|
+
"code": {
|
|
2151
|
+
"type": "string",
|
|
1719
2152
|
"required": false
|
|
1720
2153
|
},
|
|
1721
|
-
"
|
|
1722
|
-
"type": "
|
|
2154
|
+
"filename": {
|
|
2155
|
+
"type": "string",
|
|
1723
2156
|
"required": false
|
|
1724
2157
|
},
|
|
1725
|
-
"
|
|
1726
|
-
"type": "
|
|
2158
|
+
"language": {
|
|
2159
|
+
"type": "string",
|
|
1727
2160
|
"required": false
|
|
1728
2161
|
}
|
|
1729
2162
|
},
|
|
1730
2163
|
"events": [],
|
|
1731
2164
|
"slots": [],
|
|
1732
2165
|
"exports": {
|
|
1733
|
-
"customElement": "ds-
|
|
1734
|
-
"react": "
|
|
1735
|
-
"angular": "
|
|
2166
|
+
"customElement": "ds-code-block",
|
|
2167
|
+
"react": "DsCodeBlock",
|
|
2168
|
+
"angular": "DsCodeBlock"
|
|
1736
2169
|
}
|
|
1737
2170
|
},
|
|
1738
2171
|
"dependencies": [
|
|
1739
2172
|
"@ds-mo/ui",
|
|
1740
2173
|
"@ds-mo/tokens"
|
|
1741
2174
|
],
|
|
1742
|
-
"registryDependencies": [
|
|
2175
|
+
"registryDependencies": [
|
|
2176
|
+
"button-unfilled",
|
|
2177
|
+
"text"
|
|
2178
|
+
]
|
|
1743
2179
|
},
|
|
1744
2180
|
{
|
|
1745
|
-
"name": "
|
|
1746
|
-
"title": "
|
|
1747
|
-
"description": "
|
|
2181
|
+
"name": "conversation-list",
|
|
2182
|
+
"title": "ConversationList",
|
|
2183
|
+
"description": "Scrollable conversation-list region with dedicated empty and floating-action placement.",
|
|
1748
2184
|
"type": "registry:ui",
|
|
1749
2185
|
"meta": {
|
|
1750
2186
|
"library": "@ds-mo/ui",
|
|
1751
2187
|
"distribution": "npm",
|
|
1752
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
1753
|
-
"source": "src/wc/components/
|
|
2188
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/conversation-list",
|
|
2189
|
+
"source": "src/wc/components/ConversationList/ConversationList.tsx",
|
|
1754
2190
|
"intentStatus": "complete",
|
|
1755
2191
|
"intent": {
|
|
1756
2192
|
"audience": "general",
|
|
1757
|
-
"status": "
|
|
1758
|
-
"summary": "
|
|
2193
|
+
"status": "experimental",
|
|
2194
|
+
"summary": "Scrollable conversation-list region with dedicated empty and floating-action placement.",
|
|
1759
2195
|
"useWhen": [
|
|
1760
|
-
"A
|
|
1761
|
-
"A prominent empty region benefits from a decorative icon, visual title, and supporting body copy.",
|
|
1762
|
-
"A compact owner such as a Select popup needs only centered body copy."
|
|
2196
|
+
"A messaging-like surface needs a reusable history list with empty and action regions."
|
|
1763
2197
|
],
|
|
1764
2198
|
"avoidWhen": [
|
|
1765
|
-
"
|
|
1766
|
-
"The state is an error, warning, or confirmation that needs semantic intent and announcement from the owning workflow.",
|
|
1767
|
-
"The state needs a recovery action, link, or other interactive content; the current EmptyState pattern is intentionally message-only.",
|
|
1768
|
-
"A decorative illustration, arbitrary rich content, or custom layout is required."
|
|
1769
|
-
],
|
|
1770
|
-
"alternatives": [
|
|
1771
|
-
{
|
|
1772
|
-
"when": "A content region is waiting for structured data.",
|
|
1773
|
-
"component": "component:ds-skeleton",
|
|
1774
|
-
"reason": "Skeleton preserves expected geometry while content is pending."
|
|
1775
|
-
},
|
|
1776
|
-
{
|
|
1777
|
-
"when": "An operation is progressing without predictable content structure.",
|
|
1778
|
-
"component": "component:ds-loader",
|
|
1779
|
-
"reason": "Loader owns indeterminate progress rather than an empty outcome."
|
|
1780
|
-
},
|
|
1781
|
-
{
|
|
1782
|
-
"when": "Only ordinary prose is needed without empty-state layout.",
|
|
1783
|
-
"component": "component:ds-text",
|
|
1784
|
-
"reason": "Text owns typography without adding centered empty-state composition."
|
|
1785
|
-
}
|
|
2199
|
+
"The content is not a collection of conversations or threads."
|
|
1786
2200
|
],
|
|
1787
2201
|
"commonlyComposedWith": [
|
|
1788
|
-
"component:ds-
|
|
1789
|
-
"component:ds-
|
|
1790
|
-
"component:ds-
|
|
2202
|
+
"component:ds-conversation-list-section",
|
|
2203
|
+
"component:ds-conversation-list-item",
|
|
2204
|
+
"component:ds-empty-state"
|
|
1791
2205
|
],
|
|
1792
|
-
"
|
|
1793
|
-
"
|
|
1794
|
-
"EmptyState does not create a live region or alert automatically. The owner decides whether a dynamic transition requires announcement.",
|
|
1795
|
-
"The visual title does not impose a document heading level because the correct hierarchy belongs to the consuming page or region.",
|
|
1796
|
-
"Keep localized body copy concise and sufficient when using the body-only variant."
|
|
2206
|
+
"patterns": [
|
|
2207
|
+
"pattern:conversation"
|
|
1797
2208
|
],
|
|
1798
|
-
"
|
|
1799
|
-
"
|
|
1800
|
-
"
|
|
1801
|
-
"The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
|
|
1802
|
-
"All content is centered. The owner supplies container size and surrounding padding; do not compose actions into or immediately alongside the current EmptyState pattern.",
|
|
1803
|
-
"First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
|
|
2209
|
+
"accessibility": [
|
|
2210
|
+
"Provide an accessible list label through the surrounding heading or region.",
|
|
2211
|
+
"Keep the empty message descriptive and the floating action explicitly named."
|
|
1804
2212
|
],
|
|
1805
2213
|
"responsiveBehavior": [
|
|
1806
|
-
"The owner
|
|
1807
|
-
"EmptyState does not infer breakpoints or change composition automatically."
|
|
2214
|
+
"The list fills its owner, scrolls independently, and keeps its action at the lower end corner."
|
|
1808
2215
|
],
|
|
1809
|
-
"frameworkCaveats": {
|
|
1810
|
-
"customElements": [
|
|
1811
|
-
"Pass canonical IcoMo icon names and localized heading/body strings through properties or attributes."
|
|
1812
|
-
],
|
|
1813
|
-
"react": [
|
|
1814
|
-
"Choose one supported composition by passing body with optional heading and icon props."
|
|
1815
|
-
],
|
|
1816
|
-
"angular": [
|
|
1817
|
-
"Choose one supported composition by binding body with optional heading and icon inputs."
|
|
1818
|
-
]
|
|
1819
|
-
},
|
|
1820
2216
|
"references": [
|
|
1821
2217
|
{
|
|
1822
2218
|
"label": "Storybook examples",
|
|
1823
|
-
"path": "src/wc/components/
|
|
2219
|
+
"path": "src/wc/components/ConversationList/ConversationList.stories.ts"
|
|
1824
2220
|
}
|
|
1825
2221
|
]
|
|
1826
2222
|
},
|
|
1827
|
-
"props": {
|
|
1828
|
-
"body": {
|
|
1829
|
-
"type": "string",
|
|
1830
|
-
"required": false
|
|
1831
|
-
},
|
|
1832
|
-
"heading": {
|
|
1833
|
-
"type": "string | undefined",
|
|
1834
|
-
"required": false
|
|
1835
|
-
},
|
|
1836
|
-
"icon": {
|
|
1837
|
-
"type": "string | undefined",
|
|
1838
|
-
"required": false
|
|
1839
|
-
}
|
|
1840
|
-
},
|
|
2223
|
+
"props": {},
|
|
1841
2224
|
"events": [],
|
|
1842
2225
|
"slots": [],
|
|
1843
2226
|
"exports": {
|
|
1844
|
-
"customElement": "ds-
|
|
1845
|
-
"react": "
|
|
1846
|
-
"angular": "
|
|
2227
|
+
"customElement": "ds-conversation-list",
|
|
2228
|
+
"react": "DsConversationList",
|
|
2229
|
+
"angular": "DsConversationList"
|
|
1847
2230
|
}
|
|
1848
2231
|
},
|
|
1849
2232
|
"dependencies": [
|
|
1850
2233
|
"@ds-mo/ui",
|
|
1851
|
-
"@ds-mo/tokens"
|
|
1852
|
-
"@ds-mo/icons"
|
|
2234
|
+
"@ds-mo/tokens"
|
|
1853
2235
|
],
|
|
1854
|
-
"registryDependencies": [
|
|
1855
|
-
"icon",
|
|
1856
|
-
"text"
|
|
1857
|
-
]
|
|
2236
|
+
"registryDependencies": []
|
|
1858
2237
|
},
|
|
1859
2238
|
{
|
|
1860
|
-
"name": "
|
|
1861
|
-
"title": "
|
|
1862
|
-
"description": "
|
|
2239
|
+
"name": "conversation-list-item",
|
|
2240
|
+
"title": "ConversationListItem",
|
|
2241
|
+
"description": "Selectable conversation row with one-line preview, recency, unread presence, generic busy or error status, and channel-owned accessory slots.",
|
|
1863
2242
|
"type": "registry:ui",
|
|
1864
2243
|
"meta": {
|
|
1865
2244
|
"library": "@ds-mo/ui",
|
|
1866
2245
|
"distribution": "npm",
|
|
1867
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
1868
|
-
"source": "src/wc/components/
|
|
2246
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/conversation-list-item",
|
|
2247
|
+
"source": "src/wc/components/ConversationListItem/ConversationListItem.tsx",
|
|
1869
2248
|
"intentStatus": "complete",
|
|
1870
2249
|
"intent": {
|
|
1871
2250
|
"audience": "general",
|
|
1872
|
-
"status": "
|
|
1873
|
-
"summary": "
|
|
2251
|
+
"status": "experimental",
|
|
2252
|
+
"summary": "Selectable conversation row with one-line preview, recency, unread presence, generic busy or error status, and channel-owned accessory slots.",
|
|
1874
2253
|
"useWhen": [
|
|
1875
|
-
"
|
|
1876
|
-
"Help text or an error message must be programmatically associated with one control.",
|
|
1877
|
-
"A form layout needs one consistent label-control-message rhythm."
|
|
2254
|
+
"A conversation history needs a compact row that opens one thread."
|
|
1878
2255
|
],
|
|
1879
2256
|
"avoidWhen": [
|
|
1880
|
-
"The
|
|
1881
|
-
"Several controls belong to one question; use a semantic fieldset and legend instead.",
|
|
1882
|
-
"Text describes a region or group rather than one form control."
|
|
1883
|
-
],
|
|
1884
|
-
"alternatives": [
|
|
1885
|
-
{
|
|
1886
|
-
"when": "Several related controls answer one question.",
|
|
1887
|
-
"component": "component:ds-text",
|
|
1888
|
-
"reason": "Use native fieldset and legend semantics, then compose Text only for supporting content."
|
|
1889
|
-
}
|
|
2257
|
+
"The row represents a command rather than a persisted conversation."
|
|
1890
2258
|
],
|
|
1891
2259
|
"commonlyComposedWith": [
|
|
1892
|
-
"component:ds-
|
|
1893
|
-
"component:ds-
|
|
1894
|
-
"component:ds-
|
|
1895
|
-
"component:ds-
|
|
2260
|
+
"component:ds-conversation-list-section",
|
|
2261
|
+
"component:ds-avatar",
|
|
2262
|
+
"component:ds-badge",
|
|
2263
|
+
"component:ds-loader"
|
|
2264
|
+
],
|
|
2265
|
+
"patterns": [
|
|
2266
|
+
"pattern:conversation"
|
|
1896
2267
|
],
|
|
1897
2268
|
"accessibility": [
|
|
1898
|
-
"
|
|
1899
|
-
"
|
|
1900
|
-
"
|
|
1901
|
-
"Clicking the label focuses the slotted design-system control without opening a Select popup.",
|
|
1902
|
-
"Do not use placeholder text as the only label. Keep label text concise and put format or consequence guidance in description."
|
|
2269
|
+
"The conversation surface is one button with its title as the primary accessible name; actions are sibling controls so buttons are never nested.",
|
|
2270
|
+
"An action in the actions slot remains keyboard-focusable and appears on row focus as well as pointer hover; touch layouts keep it visible.",
|
|
2271
|
+
"Status copy must make busy or error meaning available without relying on motion or color."
|
|
1903
2272
|
],
|
|
1904
2273
|
"states": [
|
|
1905
|
-
"
|
|
1906
|
-
"
|
|
1907
|
-
"
|
|
1908
|
-
"
|
|
2274
|
+
"Rows reuse the md choice-item label/subtext recipe used by Menu, including 6px row padding, 2px text inset, and the shared content gap. The enclosing conversation-list scroll region supplies the larger 8px outer container padding.",
|
|
2275
|
+
"Busy and error are generic channel-neutral states; the owning product supplies suitable status wording.",
|
|
2276
|
+
"Any positive unreadCount renders one dot on the title row rather than a visible counter; the accessible row name may still announce the exact unread quantity.",
|
|
2277
|
+
"Hover and press use the shared interaction hover and pressed overlays. Only the selected conversation uses the persistent active fill.",
|
|
2278
|
+
"The title uses body-medium emphasis, not title-small, and the body-small preview truncates after one line. Unread titles use primary foreground; read titles use secondary foreground.",
|
|
2279
|
+
"The actions slot overlays the row at an 8px right inset without changing title or preview measure, and paints above the row interaction wash while that wash remains active."
|
|
1909
2280
|
],
|
|
1910
2281
|
"responsiveBehavior": [
|
|
1911
|
-
"
|
|
1912
|
-
"The form layout owns column count, wrapping, and responsive placement; Field keeps the vertical label-control-message composition intact."
|
|
2282
|
+
"Long titles and previews truncate without displacing trailing status."
|
|
1913
2283
|
],
|
|
1914
|
-
"frameworkCaveats": {
|
|
1915
|
-
"customElements": [
|
|
1916
|
-
"Set fieldId only when another element must reference a predictable control ID; otherwise use the generated association.",
|
|
1917
|
-
"Assign child component values and option arrays through their normal JavaScript properties."
|
|
1918
|
-
],
|
|
1919
|
-
"react": [
|
|
1920
|
-
"Compose one DsInput, DsSelect, or DsSelectMulti child and control validation timing in the form owner."
|
|
1921
|
-
],
|
|
1922
|
-
"angular": [
|
|
1923
|
-
"Compose the generated Field adapter around the control adapter and its matching Angular value accessor."
|
|
1924
|
-
]
|
|
1925
|
-
},
|
|
1926
2284
|
"references": [
|
|
1927
2285
|
{
|
|
1928
2286
|
"label": "Storybook examples",
|
|
1929
|
-
"path": "src/wc/components/
|
|
1930
|
-
},
|
|
1931
|
-
{
|
|
1932
|
-
"label": "Cross-browser form and accessibility coverage",
|
|
1933
|
-
"path": "tests/e2e/forms.spec.ts"
|
|
2287
|
+
"path": "src/wc/components/ConversationList/ConversationList.stories.ts"
|
|
1934
2288
|
}
|
|
1935
2289
|
]
|
|
1936
2290
|
},
|
|
1937
2291
|
"props": {
|
|
1938
|
-
"
|
|
1939
|
-
"type": "string
|
|
2292
|
+
"conversationId": {
|
|
2293
|
+
"type": "string",
|
|
1940
2294
|
"required": false
|
|
1941
2295
|
},
|
|
1942
|
-
"
|
|
2296
|
+
"conversationTitle": {
|
|
2297
|
+
"type": "string",
|
|
2298
|
+
"required": false
|
|
2299
|
+
},
|
|
2300
|
+
"preview": {
|
|
2301
|
+
"type": "string",
|
|
2302
|
+
"required": false
|
|
2303
|
+
},
|
|
2304
|
+
"selected": {
|
|
1943
2305
|
"type": "boolean",
|
|
1944
2306
|
"required": false
|
|
1945
2307
|
},
|
|
1946
|
-
"
|
|
1947
|
-
"type": "
|
|
2308
|
+
"state": {
|
|
2309
|
+
"type": "ConversationItemState",
|
|
1948
2310
|
"required": false
|
|
1949
2311
|
},
|
|
1950
|
-
"
|
|
1951
|
-
"type": "string
|
|
2312
|
+
"statusLabel": {
|
|
2313
|
+
"type": "string",
|
|
1952
2314
|
"required": false
|
|
1953
2315
|
},
|
|
1954
|
-
"
|
|
2316
|
+
"unreadCount": {
|
|
2317
|
+
"type": "number",
|
|
2318
|
+
"required": false
|
|
2319
|
+
},
|
|
2320
|
+
"updatedAt": {
|
|
1955
2321
|
"type": "string",
|
|
1956
|
-
"required":
|
|
2322
|
+
"required": false
|
|
1957
2323
|
}
|
|
1958
2324
|
},
|
|
1959
|
-
"events": [
|
|
2325
|
+
"events": [
|
|
2326
|
+
{
|
|
2327
|
+
"name": "dsSelect",
|
|
2328
|
+
"detail": "{ id: string }"
|
|
2329
|
+
}
|
|
2330
|
+
],
|
|
1960
2331
|
"slots": [],
|
|
1961
2332
|
"exports": {
|
|
1962
|
-
"customElement": "ds-
|
|
1963
|
-
"react": "
|
|
1964
|
-
"angular": "
|
|
2333
|
+
"customElement": "ds-conversation-list-item",
|
|
2334
|
+
"react": "DsConversationListItem",
|
|
2335
|
+
"angular": "DsConversationListItem"
|
|
1965
2336
|
}
|
|
1966
2337
|
},
|
|
1967
2338
|
"dependencies": [
|
|
@@ -1969,455 +2340,1297 @@
|
|
|
1969
2340
|
"@ds-mo/tokens"
|
|
1970
2341
|
],
|
|
1971
2342
|
"registryDependencies": [
|
|
2343
|
+
"badge",
|
|
2344
|
+
"loader",
|
|
1972
2345
|
"text"
|
|
1973
2346
|
]
|
|
1974
2347
|
},
|
|
1975
2348
|
{
|
|
1976
|
-
"name": "
|
|
1977
|
-
"title": "
|
|
1978
|
-
"description": "
|
|
2349
|
+
"name": "conversation-list-section",
|
|
2350
|
+
"title": "ConversationListSection",
|
|
2351
|
+
"description": "Semantically labelled section for grouping conversation rows by meaningful chronology or category.",
|
|
1979
2352
|
"type": "registry:ui",
|
|
1980
2353
|
"meta": {
|
|
1981
2354
|
"library": "@ds-mo/ui",
|
|
1982
2355
|
"distribution": "npm",
|
|
1983
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
1984
|
-
"source": "src/wc/components/
|
|
2356
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/conversation-list-section",
|
|
2357
|
+
"source": "src/wc/components/ConversationListSection/ConversationListSection.tsx",
|
|
1985
2358
|
"intentStatus": "complete",
|
|
1986
2359
|
"intent": {
|
|
1987
2360
|
"audience": "general",
|
|
1988
|
-
"status": "
|
|
1989
|
-
"summary": "
|
|
2361
|
+
"status": "experimental",
|
|
2362
|
+
"summary": "Semantically labelled section for grouping conversation rows by meaningful chronology or category.",
|
|
1990
2363
|
"useWhen": [
|
|
1991
|
-
"
|
|
1992
|
-
"A canonical flag glyph communicates a country or region with adjacent text or an explicit localized label.",
|
|
1993
|
-
"A standalone non-interactive symbol conveys meaning that is unavailable from nearby text."
|
|
2364
|
+
"A conversation list needs visible groups such as Today, Yesterday, or Older."
|
|
1994
2365
|
],
|
|
1995
2366
|
"avoidWhen": [
|
|
1996
|
-
"
|
|
1997
|
-
"The visual is an illustration, logo, chart, or arbitrary SVG artwork rather than a canonical IcoMo glyph.",
|
|
1998
|
-
"An alias, guessed name, or case-insensitive lookup would be required; runtime lookup uses exact canonical export names.",
|
|
1999
|
-
"A fallback glyph would be required when loading fails; Icon intentionally preserves an empty fixed-size box."
|
|
2000
|
-
],
|
|
2001
|
-
"alternatives": [
|
|
2002
|
-
{
|
|
2003
|
-
"when": "The icon initiates an action or persistent toggle.",
|
|
2004
|
-
"component": "component:ds-button-unfilled",
|
|
2005
|
-
"reason": "ButtonUnfilled owns interaction, focus, naming, and toggle semantics."
|
|
2006
|
-
},
|
|
2007
|
-
{
|
|
2008
|
-
"when": "The visual communicates indeterminate loading progress.",
|
|
2009
|
-
"component": "component:ds-loader",
|
|
2010
|
-
"reason": "Loader owns progress status and motion behavior."
|
|
2011
|
-
},
|
|
2012
|
-
{
|
|
2013
|
-
"when": "The compact visual is an unread count or notification dot.",
|
|
2014
|
-
"component": "component:ds-badge",
|
|
2015
|
-
"reason": "Badge owns supplemental notification semantics."
|
|
2016
|
-
}
|
|
2367
|
+
"A flat list is clearer or the proposed grouping has no meaning to readers."
|
|
2017
2368
|
],
|
|
2018
2369
|
"commonlyComposedWith": [
|
|
2019
|
-
"component:ds-
|
|
2020
|
-
"component:ds-
|
|
2021
|
-
"component:ds-menu",
|
|
2022
|
-
"component:ds-panel-nav"
|
|
2370
|
+
"component:ds-conversation-list",
|
|
2371
|
+
"component:ds-conversation-list-item"
|
|
2023
2372
|
],
|
|
2024
|
-
"
|
|
2025
|
-
"
|
|
2026
|
-
"The owning button, link, or composite control provides the accessible name; do not repeat that name on its nested Icon.",
|
|
2027
|
-
"Provide an explicit label only when the non-interactive icon itself communicates otherwise unavailable meaning.",
|
|
2028
|
-
"Tertiary and quaternary foregrounds are restricted to icons inside genuinely inactive or disabled UI, or to purely decorative icons; quaternary is the fainter tier, and informative icons and meaningful status graphics retain sufficient rendered contrast even when aria-hidden.",
|
|
2029
|
-
"Informative flags require an explicit localized country or region label; never derive accessible text from the export name.",
|
|
2030
|
-
"Icon never receives focus or owns interaction."
|
|
2373
|
+
"patterns": [
|
|
2374
|
+
"pattern:conversation"
|
|
2031
2375
|
],
|
|
2032
|
-
"
|
|
2033
|
-
"
|
|
2034
|
-
"Prefer the owning control's isInactive or native disabled state over manually selecting tertiary or quaternary so visual treatment and inactive semantics remain synchronized.",
|
|
2035
|
-
"Built-in glyph lookup accepts exact canonical IcoMo export names only. Names beginning with Flag select the flag catalog automatically.",
|
|
2036
|
-
"A cache miss lazy-loads into a fixed-size box without layout shift. Unknown names, failed loads, and rejected markup leave that box empty.",
|
|
2037
|
-
"Critical first-paint glyphs may be pre-registered before rendering; all resolved glyphs share a global cache.",
|
|
2038
|
-
"Every SVG is validated at the render boundary and injected as parsed DOM nodes so app-registered markup cannot bypass executable-content or external-reference checks."
|
|
2376
|
+
"accessibility": [
|
|
2377
|
+
"The visible heading labels the section and must describe the relationship shared by its rows."
|
|
2039
2378
|
],
|
|
2040
2379
|
"responsiveBehavior": [
|
|
2041
|
-
"
|
|
2042
|
-
"Icon does not scale from viewport width or change glyphs automatically."
|
|
2380
|
+
"Rows remain full width while the heading stays visible in document order."
|
|
2043
2381
|
],
|
|
2044
|
-
"frameworkCaveats": {
|
|
2045
|
-
"customElements": [
|
|
2046
|
-
"Import each canonical glyph as an SVG string and call registerIcons before first render when synchronous critical-icon paint is required."
|
|
2047
|
-
],
|
|
2048
|
-
"react": [
|
|
2049
|
-
"Keep nested control icons decorative and place the accessible name on the owning React control."
|
|
2050
|
-
],
|
|
2051
|
-
"angular": [
|
|
2052
|
-
"Keep nested control icons decorative and place the accessible name on the owning Angular control."
|
|
2053
|
-
]
|
|
2054
|
-
},
|
|
2055
2382
|
"references": [
|
|
2056
2383
|
{
|
|
2057
2384
|
"label": "Storybook examples",
|
|
2058
|
-
"path": "src/wc/components/
|
|
2059
|
-
},
|
|
2060
|
-
{
|
|
2061
|
-
"label": "Preload API guidance",
|
|
2062
|
-
"path": "src/wc/components/Icon/icon-cache.ts"
|
|
2385
|
+
"path": "src/wc/components/ConversationList/ConversationList.stories.ts"
|
|
2063
2386
|
}
|
|
2064
2387
|
]
|
|
2065
2388
|
},
|
|
2066
2389
|
"props": {
|
|
2067
|
-
"
|
|
2068
|
-
"type": "IconColor",
|
|
2069
|
-
"required": false
|
|
2070
|
-
},
|
|
2071
|
-
"label": {
|
|
2072
|
-
"type": "string | undefined",
|
|
2073
|
-
"required": false
|
|
2074
|
-
},
|
|
2075
|
-
"name": {
|
|
2390
|
+
"heading": {
|
|
2076
2391
|
"type": "string",
|
|
2077
2392
|
"required": false
|
|
2078
2393
|
},
|
|
2079
|
-
"
|
|
2080
|
-
"type": "
|
|
2394
|
+
"sectionId": {
|
|
2395
|
+
"type": "string",
|
|
2081
2396
|
"required": false
|
|
2082
2397
|
}
|
|
2083
2398
|
},
|
|
2084
2399
|
"events": [],
|
|
2085
2400
|
"slots": [],
|
|
2086
2401
|
"exports": {
|
|
2087
|
-
"customElement": "ds-
|
|
2088
|
-
"react": "
|
|
2089
|
-
"angular": "
|
|
2402
|
+
"customElement": "ds-conversation-list-section",
|
|
2403
|
+
"react": "DsConversationListSection",
|
|
2404
|
+
"angular": "DsConversationListSection"
|
|
2090
2405
|
}
|
|
2091
2406
|
},
|
|
2092
2407
|
"dependencies": [
|
|
2093
2408
|
"@ds-mo/ui",
|
|
2094
|
-
"@ds-mo/tokens"
|
|
2095
|
-
"@ds-mo/icons"
|
|
2409
|
+
"@ds-mo/tokens"
|
|
2096
2410
|
],
|
|
2097
|
-
"registryDependencies": [
|
|
2411
|
+
"registryDependencies": [
|
|
2412
|
+
"text"
|
|
2413
|
+
]
|
|
2098
2414
|
},
|
|
2099
2415
|
{
|
|
2100
|
-
"name": "
|
|
2101
|
-
"title": "
|
|
2102
|
-
"description": "
|
|
2416
|
+
"name": "divider",
|
|
2417
|
+
"title": "Divider",
|
|
2418
|
+
"description": "Horizontal or vertical separator between sibling content groups, decorative by default with optional structural semantics.",
|
|
2103
2419
|
"type": "registry:ui",
|
|
2104
2420
|
"meta": {
|
|
2105
2421
|
"library": "@ds-mo/ui",
|
|
2106
2422
|
"distribution": "npm",
|
|
2107
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
2108
|
-
"source": "src/wc/components/
|
|
2423
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/divider",
|
|
2424
|
+
"source": "src/wc/components/Divider/Divider.tsx",
|
|
2109
2425
|
"intentStatus": "complete",
|
|
2110
2426
|
"intent": {
|
|
2111
2427
|
"audience": "general",
|
|
2112
2428
|
"status": "stable",
|
|
2113
|
-
"summary": "
|
|
2429
|
+
"summary": "Horizontal or vertical separator between sibling content groups, decorative by default with optional structural semantics.",
|
|
2114
2430
|
"useWhen": [
|
|
2115
|
-
"
|
|
2116
|
-
"
|
|
2117
|
-
"
|
|
2431
|
+
"Related sibling content groups on one surface need stronger visual separation than spacing alone provides.",
|
|
2432
|
+
"A list or panel needs an inset separator that does not define the outer edge of its container.",
|
|
2433
|
+
"Meaningful document or group structure requires an explicit horizontal or vertical separator."
|
|
2118
2434
|
],
|
|
2119
2435
|
"avoidWhen": [
|
|
2120
|
-
"
|
|
2121
|
-
"The
|
|
2122
|
-
"The
|
|
2436
|
+
"Spacing alone communicates the grouping clearly.",
|
|
2437
|
+
"The line defines a container edge, control outline, or selected state; use the owning component's border treatment.",
|
|
2438
|
+
"The divider would compensate for weak headings or unclear information hierarchy.",
|
|
2439
|
+
"A decorative flourish does not clarify grouping."
|
|
2123
2440
|
],
|
|
2124
2441
|
"alternatives": [
|
|
2125
2442
|
{
|
|
2126
|
-
"when": "
|
|
2127
|
-
"component": "component:ds-
|
|
2128
|
-
"reason": "
|
|
2129
|
-
},
|
|
2130
|
-
{
|
|
2131
|
-
"when": "The value is an immediate on/off setting.",
|
|
2132
|
-
"component": "component:ds-switch",
|
|
2133
|
-
"reason": "Switch communicates a binary setting instead of free text entry."
|
|
2443
|
+
"when": "Content needs an enclosing surface and outer boundary.",
|
|
2444
|
+
"component": "component:ds-card",
|
|
2445
|
+
"reason": "Card owns container chrome, structure, and edge treatment."
|
|
2134
2446
|
},
|
|
2135
2447
|
{
|
|
2136
|
-
"when": "
|
|
2137
|
-
"component": "component:ds-
|
|
2138
|
-
"reason": "
|
|
2448
|
+
"when": "A static compact label is being used to name a group.",
|
|
2449
|
+
"component": "component:ds-text",
|
|
2450
|
+
"reason": "Text communicates hierarchy directly instead of relying on a line."
|
|
2139
2451
|
}
|
|
2140
2452
|
],
|
|
2141
2453
|
"commonlyComposedWith": [
|
|
2142
|
-
"component:ds-
|
|
2143
|
-
"component:ds-
|
|
2144
|
-
"component:ds-
|
|
2454
|
+
"component:ds-card",
|
|
2455
|
+
"component:ds-menu",
|
|
2456
|
+
"component:ds-panel-sub-nav"
|
|
2145
2457
|
],
|
|
2146
2458
|
"accessibility": [
|
|
2147
|
-
"
|
|
2148
|
-
"
|
|
2149
|
-
"
|
|
2150
|
-
"
|
|
2151
|
-
|
|
2459
|
+
"Keep purely visual dividers hidden from assistive technology.",
|
|
2460
|
+
"Expose separator semantics only when the line represents meaningful document or group structure.",
|
|
2461
|
+
"Semantic orientation must match the divider's visual orientation.",
|
|
2462
|
+
"Do not use a semantic divider as a substitute for headings, landmarks, or explicit group labels."
|
|
2463
|
+
],
|
|
2464
|
+
"states": [
|
|
2465
|
+
"Horizontal and vertical variants separate sibling groups along the parent's layout axis.",
|
|
2466
|
+
"The omitted background context is for primary and secondary surfaces. Explicit faint documents a faint surface while using the same standard divider token.",
|
|
2467
|
+
"Other background contexts select their matching divider token, including navigation where Divider is composed inside app chrome.",
|
|
2468
|
+
"Inset is symmetric along the line axis. Explicit length is reserved for layout-specific separators; otherwise the line fills the available axis."
|
|
2469
|
+
],
|
|
2470
|
+
"responsiveBehavior": [
|
|
2471
|
+
"The parent layout decides whether to change orientation, visibility, inset, or length at responsive breakpoints.",
|
|
2472
|
+
"Divider does not infer layout direction or hide itself responsively."
|
|
2473
|
+
],
|
|
2474
|
+
"frameworkCaveats": {
|
|
2475
|
+
"customElements": [
|
|
2476
|
+
"Set semantic mode only from known document structure; presentation alone should remain hidden from assistive technology."
|
|
2477
|
+
],
|
|
2478
|
+
"react": [
|
|
2479
|
+
"Derive orientation and visibility from the parent layout rather than viewport logic inside Divider."
|
|
2480
|
+
],
|
|
2481
|
+
"angular": [
|
|
2482
|
+
"Derive orientation and visibility from the parent layout rather than viewport logic inside Divider."
|
|
2483
|
+
]
|
|
2484
|
+
},
|
|
2485
|
+
"references": [
|
|
2486
|
+
{
|
|
2487
|
+
"label": "Storybook examples",
|
|
2488
|
+
"path": "src/wc/components/Divider/Divider.stories.ts"
|
|
2489
|
+
}
|
|
2490
|
+
]
|
|
2491
|
+
},
|
|
2492
|
+
"props": {
|
|
2493
|
+
"background": {
|
|
2494
|
+
"type": "DividerBackground | undefined",
|
|
2495
|
+
"required": false
|
|
2496
|
+
},
|
|
2497
|
+
"inset": {
|
|
2498
|
+
"type": "DividerInset",
|
|
2499
|
+
"required": false
|
|
2500
|
+
},
|
|
2501
|
+
"length": {
|
|
2502
|
+
"type": "DividerLength",
|
|
2503
|
+
"required": false
|
|
2504
|
+
},
|
|
2505
|
+
"orientation": {
|
|
2506
|
+
"type": "DividerOrientation",
|
|
2507
|
+
"required": false
|
|
2508
|
+
},
|
|
2509
|
+
"semantic": {
|
|
2510
|
+
"type": "boolean",
|
|
2511
|
+
"required": false
|
|
2512
|
+
}
|
|
2513
|
+
},
|
|
2514
|
+
"events": [],
|
|
2515
|
+
"slots": [],
|
|
2516
|
+
"exports": {
|
|
2517
|
+
"customElement": "ds-divider",
|
|
2518
|
+
"react": "DsDivider",
|
|
2519
|
+
"angular": "DsDivider"
|
|
2520
|
+
}
|
|
2521
|
+
},
|
|
2522
|
+
"dependencies": [
|
|
2523
|
+
"@ds-mo/ui",
|
|
2524
|
+
"@ds-mo/tokens"
|
|
2525
|
+
],
|
|
2526
|
+
"registryDependencies": []
|
|
2527
|
+
},
|
|
2528
|
+
{
|
|
2529
|
+
"name": "empty-state",
|
|
2530
|
+
"title": "EmptyState",
|
|
2531
|
+
"description": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
|
|
2532
|
+
"type": "registry:ui",
|
|
2533
|
+
"meta": {
|
|
2534
|
+
"library": "@ds-mo/ui",
|
|
2535
|
+
"distribution": "npm",
|
|
2536
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/empty-state",
|
|
2537
|
+
"source": "src/wc/components/EmptyState/EmptyState.tsx",
|
|
2538
|
+
"intentStatus": "complete",
|
|
2539
|
+
"intent": {
|
|
2540
|
+
"audience": "general",
|
|
2541
|
+
"status": "stable",
|
|
2542
|
+
"summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
|
|
2543
|
+
"useWhen": [
|
|
2544
|
+
"A bounded content area is in a first-use, no-content, filtered no-results, or no-access state and needs a calm explanatory message tailored to that cause.",
|
|
2545
|
+
"A prominent empty region benefits from a decorative icon, visual title, and supporting body copy.",
|
|
2546
|
+
"A compact owner such as a Select popup needs only centered body copy."
|
|
2547
|
+
],
|
|
2548
|
+
"avoidWhen": [
|
|
2549
|
+
"Content is still loading; use Skeleton for predictable structure or Loader for an indeterminate operation.",
|
|
2550
|
+
"The state is an error, warning, or confirmation that needs semantic intent and announcement from the owning workflow.",
|
|
2551
|
+
"The state needs a recovery action, link, or other interactive content; the current EmptyState pattern is intentionally message-only.",
|
|
2552
|
+
"A decorative illustration, arbitrary rich content, or custom layout is required."
|
|
2553
|
+
],
|
|
2554
|
+
"alternatives": [
|
|
2555
|
+
{
|
|
2556
|
+
"when": "A content region is waiting for structured data.",
|
|
2557
|
+
"component": "component:ds-skeleton",
|
|
2558
|
+
"reason": "Skeleton preserves expected geometry while content is pending."
|
|
2559
|
+
},
|
|
2560
|
+
{
|
|
2561
|
+
"when": "An operation is progressing without predictable content structure.",
|
|
2562
|
+
"component": "component:ds-loader",
|
|
2563
|
+
"reason": "Loader owns indeterminate progress rather than an empty outcome."
|
|
2564
|
+
},
|
|
2565
|
+
{
|
|
2566
|
+
"when": "Only ordinary prose is needed without empty-state layout.",
|
|
2567
|
+
"component": "component:ds-text",
|
|
2568
|
+
"reason": "Text owns typography without adding centered empty-state composition."
|
|
2569
|
+
}
|
|
2570
|
+
],
|
|
2571
|
+
"commonlyComposedWith": [
|
|
2572
|
+
"component:ds-select",
|
|
2573
|
+
"component:ds-text",
|
|
2574
|
+
"component:ds-icon"
|
|
2575
|
+
],
|
|
2576
|
+
"accessibility": [
|
|
2577
|
+
"The optional icon is decorative; the title and body provide all meaning in text.",
|
|
2578
|
+
"EmptyState does not create a live region or alert automatically. The owner decides whether a dynamic transition requires announcement.",
|
|
2579
|
+
"The visual title does not impose a document heading level because the correct hierarchy belongs to the consuming page or region.",
|
|
2580
|
+
"Keep localized body copy concise and sufficient when using the body-only variant."
|
|
2581
|
+
],
|
|
2582
|
+
"states": [
|
|
2583
|
+
"Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
|
|
2584
|
+
"The decorative icon renders at xl in the primary foreground with an 8px gap before the text group and only when a title is also provided.",
|
|
2585
|
+
"The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
|
|
2586
|
+
"All content is centered. The owner supplies container size and surrounding padding; do not compose actions into or immediately alongside the current EmptyState pattern.",
|
|
2587
|
+
"First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
|
|
2588
|
+
],
|
|
2589
|
+
"responsiveBehavior": [
|
|
2590
|
+
"The owner controls available width and height; text wraps naturally while remaining centered.",
|
|
2591
|
+
"EmptyState does not infer breakpoints or change composition automatically."
|
|
2592
|
+
],
|
|
2593
|
+
"frameworkCaveats": {
|
|
2594
|
+
"customElements": [
|
|
2595
|
+
"Pass canonical IcoMo icon names and localized heading/body strings through properties or attributes."
|
|
2596
|
+
],
|
|
2597
|
+
"react": [
|
|
2598
|
+
"Choose one supported composition by passing body with optional heading and icon props."
|
|
2599
|
+
],
|
|
2600
|
+
"angular": [
|
|
2601
|
+
"Choose one supported composition by binding body with optional heading and icon inputs."
|
|
2602
|
+
]
|
|
2603
|
+
},
|
|
2604
|
+
"references": [
|
|
2605
|
+
{
|
|
2606
|
+
"label": "Storybook examples",
|
|
2607
|
+
"path": "src/wc/components/EmptyState/EmptyState.stories.ts"
|
|
2608
|
+
}
|
|
2609
|
+
]
|
|
2610
|
+
},
|
|
2611
|
+
"props": {
|
|
2612
|
+
"body": {
|
|
2613
|
+
"type": "string",
|
|
2614
|
+
"required": false
|
|
2615
|
+
},
|
|
2616
|
+
"heading": {
|
|
2617
|
+
"type": "string | undefined",
|
|
2618
|
+
"required": false
|
|
2619
|
+
},
|
|
2620
|
+
"icon": {
|
|
2621
|
+
"type": "string | undefined",
|
|
2622
|
+
"required": false
|
|
2623
|
+
}
|
|
2624
|
+
},
|
|
2625
|
+
"events": [],
|
|
2626
|
+
"slots": [],
|
|
2627
|
+
"exports": {
|
|
2628
|
+
"customElement": "ds-empty-state",
|
|
2629
|
+
"react": "DsEmptyState",
|
|
2630
|
+
"angular": "DsEmptyState"
|
|
2631
|
+
}
|
|
2632
|
+
},
|
|
2633
|
+
"dependencies": [
|
|
2634
|
+
"@ds-mo/ui",
|
|
2635
|
+
"@ds-mo/tokens",
|
|
2636
|
+
"@ds-mo/icons"
|
|
2637
|
+
],
|
|
2638
|
+
"registryDependencies": [
|
|
2639
|
+
"icon",
|
|
2640
|
+
"text"
|
|
2641
|
+
]
|
|
2642
|
+
},
|
|
2643
|
+
{
|
|
2644
|
+
"name": "field",
|
|
2645
|
+
"title": "Field",
|
|
2646
|
+
"description": "Accessible form-field composition that gives one Input or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
|
|
2647
|
+
"type": "registry:ui",
|
|
2648
|
+
"meta": {
|
|
2649
|
+
"library": "@ds-mo/ui",
|
|
2650
|
+
"distribution": "npm",
|
|
2651
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/field",
|
|
2652
|
+
"source": "src/wc/components/Field/Field.tsx",
|
|
2653
|
+
"intentStatus": "complete",
|
|
2654
|
+
"intent": {
|
|
2655
|
+
"audience": "general",
|
|
2656
|
+
"status": "stable",
|
|
2657
|
+
"summary": "Accessible form-field composition that gives one Input or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
|
|
2658
|
+
"useWhen": [
|
|
2659
|
+
"An Input, Select, or SelectMulti needs a persistent visible label in a form.",
|
|
2660
|
+
"Help text or an error message must be programmatically associated with one control.",
|
|
2661
|
+
"A form layout needs one consistent label-control-message rhythm."
|
|
2662
|
+
],
|
|
2663
|
+
"avoidWhen": [
|
|
2664
|
+
"The component already owns its visible label and complete selection semantics, such as Checkbox, Radio, or Switch.",
|
|
2665
|
+
"Several controls belong to one question; use a semantic fieldset and legend instead.",
|
|
2666
|
+
"Text describes a region or group rather than one form control."
|
|
2667
|
+
],
|
|
2668
|
+
"alternatives": [
|
|
2669
|
+
{
|
|
2670
|
+
"when": "Several related controls answer one question.",
|
|
2671
|
+
"component": "component:ds-text",
|
|
2672
|
+
"reason": "Use native fieldset and legend semantics, then compose Text only for supporting content."
|
|
2673
|
+
}
|
|
2674
|
+
],
|
|
2675
|
+
"commonlyComposedWith": [
|
|
2676
|
+
"component:ds-input",
|
|
2677
|
+
"component:ds-select",
|
|
2678
|
+
"component:ds-select-multi",
|
|
2679
|
+
"component:ds-text"
|
|
2680
|
+
],
|
|
2681
|
+
"accessibility": [
|
|
2682
|
+
"Slot exactly one form control. Field assigns its stable control ID and connects the visible label automatically.",
|
|
2683
|
+
"The visible description or error ID is merged with any authored aria-describedby references; a rendered error replaces the description.",
|
|
2684
|
+
"The error prop forwards aria-invalid and supported design-system control error styling; put visible error text on Field, not again on the child control.",
|
|
2685
|
+
"Clicking the label focuses the slotted design-system control without opening a Select popup.",
|
|
2686
|
+
"Do not use placeholder text as the only label. Keep label text concise and put format or consequence guidance in description."
|
|
2687
|
+
],
|
|
2688
|
+
"states": [
|
|
2689
|
+
"Field exposes data-focused, data-filled, data-dirty, data-touched, data-invalid, data-disabled, and data-required hooks while the slotted control remains the source of value and interaction behavior.",
|
|
2690
|
+
"A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
|
|
2691
|
+
"Field owns validation presentation but not validation timing; the form decides when to set error and errorMessage.",
|
|
2692
|
+
"The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text."
|
|
2693
|
+
],
|
|
2694
|
+
"responsiveBehavior": [
|
|
2695
|
+
"Field fills the width supplied by its parent and makes the slotted control fill that field width.",
|
|
2696
|
+
"The form layout owns column count, wrapping, and responsive placement; Field keeps the vertical label-control-message composition intact."
|
|
2697
|
+
],
|
|
2698
|
+
"frameworkCaveats": {
|
|
2699
|
+
"customElements": [
|
|
2700
|
+
"Set fieldId only when another element must reference a predictable control ID; otherwise use the generated association.",
|
|
2701
|
+
"Assign child component values and option arrays through their normal JavaScript properties."
|
|
2702
|
+
],
|
|
2703
|
+
"react": [
|
|
2704
|
+
"Compose one DsInput, DsSelect, or DsSelectMulti child and control validation timing in the form owner."
|
|
2705
|
+
],
|
|
2706
|
+
"angular": [
|
|
2707
|
+
"Compose the generated Field adapter around the control adapter and its matching Angular value accessor."
|
|
2708
|
+
]
|
|
2709
|
+
},
|
|
2710
|
+
"references": [
|
|
2711
|
+
{
|
|
2712
|
+
"label": "Storybook examples",
|
|
2713
|
+
"path": "src/wc/components/Field/Field.stories.ts"
|
|
2714
|
+
},
|
|
2715
|
+
{
|
|
2716
|
+
"label": "Cross-browser form and accessibility coverage",
|
|
2717
|
+
"path": "tests/e2e/forms.spec.ts"
|
|
2718
|
+
}
|
|
2719
|
+
]
|
|
2720
|
+
},
|
|
2721
|
+
"props": {
|
|
2722
|
+
"description": {
|
|
2723
|
+
"type": "string | undefined",
|
|
2724
|
+
"required": false
|
|
2725
|
+
},
|
|
2726
|
+
"error": {
|
|
2727
|
+
"type": "boolean",
|
|
2728
|
+
"required": false
|
|
2729
|
+
},
|
|
2730
|
+
"errorMessage": {
|
|
2731
|
+
"type": "string | undefined",
|
|
2732
|
+
"required": false
|
|
2733
|
+
},
|
|
2734
|
+
"fieldId": {
|
|
2735
|
+
"type": "string | undefined",
|
|
2736
|
+
"required": false
|
|
2737
|
+
},
|
|
2738
|
+
"label": {
|
|
2739
|
+
"type": "string",
|
|
2740
|
+
"required": true
|
|
2741
|
+
}
|
|
2742
|
+
},
|
|
2743
|
+
"events": [],
|
|
2744
|
+
"slots": [],
|
|
2745
|
+
"exports": {
|
|
2746
|
+
"customElement": "ds-field",
|
|
2747
|
+
"react": "DsField",
|
|
2748
|
+
"angular": "DsField"
|
|
2749
|
+
}
|
|
2750
|
+
},
|
|
2751
|
+
"dependencies": [
|
|
2752
|
+
"@ds-mo/ui",
|
|
2753
|
+
"@ds-mo/tokens"
|
|
2754
|
+
],
|
|
2755
|
+
"registryDependencies": [
|
|
2756
|
+
"text"
|
|
2757
|
+
]
|
|
2758
|
+
},
|
|
2759
|
+
{
|
|
2760
|
+
"name": "icon",
|
|
2761
|
+
"title": "Icon",
|
|
2762
|
+
"description": "Secure, lazily loaded renderer for canonical IcoMo system and flag glyphs, decorative by default with optional graphic semantics.",
|
|
2763
|
+
"type": "registry:ui",
|
|
2764
|
+
"meta": {
|
|
2765
|
+
"library": "@ds-mo/ui",
|
|
2766
|
+
"distribution": "npm",
|
|
2767
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/icon",
|
|
2768
|
+
"source": "src/wc/components/Icon/Icon.tsx",
|
|
2769
|
+
"intentStatus": "complete",
|
|
2770
|
+
"intent": {
|
|
2771
|
+
"audience": "general",
|
|
2772
|
+
"status": "stable",
|
|
2773
|
+
"summary": "Secure, lazily loaded renderer for canonical IcoMo system and flag glyphs, decorative by default with optional graphic semantics.",
|
|
2774
|
+
"useWhen": [
|
|
2775
|
+
"An approved IcoMo system glyph supplements visible text or control chrome.",
|
|
2776
|
+
"A canonical flag glyph communicates a country or region with adjacent text or an explicit localized label.",
|
|
2777
|
+
"A standalone non-interactive symbol conveys meaning that is unavailable from nearby text."
|
|
2778
|
+
],
|
|
2779
|
+
"avoidWhen": [
|
|
2780
|
+
"The glyph itself must be clickable or keyboard interactive; use an appropriate button or link and compose Icon inside it.",
|
|
2781
|
+
"The visual is an illustration, logo, chart, or arbitrary SVG artwork rather than a canonical IcoMo glyph.",
|
|
2782
|
+
"An alias, guessed name, or case-insensitive lookup would be required; runtime lookup uses exact canonical export names.",
|
|
2783
|
+
"A fallback glyph would be required when loading fails; Icon intentionally preserves an empty fixed-size box."
|
|
2784
|
+
],
|
|
2785
|
+
"alternatives": [
|
|
2786
|
+
{
|
|
2787
|
+
"when": "The icon initiates an action or persistent toggle.",
|
|
2788
|
+
"component": "component:ds-button-unfilled",
|
|
2789
|
+
"reason": "ButtonUnfilled owns interaction, focus, naming, and toggle semantics."
|
|
2790
|
+
},
|
|
2791
|
+
{
|
|
2792
|
+
"when": "The visual communicates indeterminate loading progress.",
|
|
2793
|
+
"component": "component:ds-loader",
|
|
2794
|
+
"reason": "Loader owns progress status and motion behavior."
|
|
2795
|
+
},
|
|
2796
|
+
{
|
|
2797
|
+
"when": "The compact visual is an unread count or notification dot.",
|
|
2798
|
+
"component": "component:ds-badge",
|
|
2799
|
+
"reason": "Badge owns supplemental notification semantics."
|
|
2800
|
+
}
|
|
2801
|
+
],
|
|
2802
|
+
"commonlyComposedWith": [
|
|
2803
|
+
"component:ds-button-filled",
|
|
2804
|
+
"component:ds-button-unfilled",
|
|
2805
|
+
"component:ds-menu",
|
|
2806
|
+
"component:ds-panel-nav"
|
|
2807
|
+
],
|
|
2808
|
+
"accessibility": [
|
|
2809
|
+
"Icons are decorative by default and remain hidden from assistive technology when visible text or an owning control already communicates the meaning.",
|
|
2810
|
+
"The owning button, link, or composite control provides the accessible name; do not repeat that name on its nested Icon.",
|
|
2811
|
+
"Provide an explicit label only when the non-interactive icon itself communicates otherwise unavailable meaning.",
|
|
2812
|
+
"Tertiary and quaternary foregrounds are restricted to icons inside genuinely inactive or disabled UI, or to purely decorative icons; quaternary is the fainter tier, and informative icons and meaningful status graphics retain sufficient rendered contrast even when aria-hidden.",
|
|
2813
|
+
"Informative flags require an explicit localized country or region label; never derive accessible text from the export name.",
|
|
2814
|
+
"Icon never receives focus or owns interaction."
|
|
2815
|
+
],
|
|
2816
|
+
"states": [
|
|
2817
|
+
"Omitted color inherits currentColor from the owning context. Explicit semantic aliases and CSS-variable references are available when the icon has an independent color role.",
|
|
2818
|
+
"Prefer the owning control's isInactive or native disabled state over manually selecting tertiary or quaternary so visual treatment and inactive semantics remain synchronized.",
|
|
2819
|
+
"Built-in glyph lookup accepts exact canonical IcoMo export names only. Names beginning with Flag select the flag catalog automatically.",
|
|
2820
|
+
"A cache miss lazy-loads into a fixed-size box without layout shift. Unknown names, failed loads, and rejected markup leave that box empty.",
|
|
2821
|
+
"Critical first-paint glyphs may be pre-registered before rendering; all resolved glyphs share a global cache.",
|
|
2822
|
+
"Every SVG is validated at the render boundary and injected as parsed DOM nodes so app-registered markup cannot bypass executable-content or external-reference checks."
|
|
2823
|
+
],
|
|
2824
|
+
"responsiveBehavior": [
|
|
2825
|
+
"The owning component or layout chooses icon size and any responsive changes.",
|
|
2826
|
+
"Icon does not scale from viewport width or change glyphs automatically."
|
|
2827
|
+
],
|
|
2828
|
+
"frameworkCaveats": {
|
|
2829
|
+
"customElements": [
|
|
2830
|
+
"Import each canonical glyph as an SVG string and call registerIcons before first render when synchronous critical-icon paint is required."
|
|
2831
|
+
],
|
|
2832
|
+
"react": [
|
|
2833
|
+
"Keep nested control icons decorative and place the accessible name on the owning React control."
|
|
2834
|
+
],
|
|
2835
|
+
"angular": [
|
|
2836
|
+
"Keep nested control icons decorative and place the accessible name on the owning Angular control."
|
|
2837
|
+
]
|
|
2838
|
+
},
|
|
2839
|
+
"references": [
|
|
2840
|
+
{
|
|
2841
|
+
"label": "Storybook examples",
|
|
2842
|
+
"path": "src/wc/components/Icon/Icon.stories.ts"
|
|
2843
|
+
},
|
|
2844
|
+
{
|
|
2845
|
+
"label": "Preload API guidance",
|
|
2846
|
+
"path": "src/wc/components/Icon/icon-cache.ts"
|
|
2847
|
+
}
|
|
2848
|
+
]
|
|
2849
|
+
},
|
|
2850
|
+
"props": {
|
|
2851
|
+
"color": {
|
|
2852
|
+
"type": "IconColor",
|
|
2853
|
+
"required": false
|
|
2854
|
+
},
|
|
2855
|
+
"label": {
|
|
2856
|
+
"type": "string | undefined",
|
|
2857
|
+
"required": false
|
|
2858
|
+
},
|
|
2859
|
+
"name": {
|
|
2860
|
+
"type": "string",
|
|
2861
|
+
"required": false
|
|
2862
|
+
},
|
|
2863
|
+
"size": {
|
|
2864
|
+
"type": "IconSize",
|
|
2865
|
+
"required": false
|
|
2866
|
+
}
|
|
2867
|
+
},
|
|
2868
|
+
"events": [],
|
|
2869
|
+
"slots": [],
|
|
2870
|
+
"exports": {
|
|
2871
|
+
"customElement": "ds-icon",
|
|
2872
|
+
"react": "DsIcon",
|
|
2873
|
+
"angular": "DsIcon"
|
|
2874
|
+
}
|
|
2875
|
+
},
|
|
2876
|
+
"dependencies": [
|
|
2877
|
+
"@ds-mo/ui",
|
|
2878
|
+
"@ds-mo/tokens",
|
|
2879
|
+
"@ds-mo/icons"
|
|
2880
|
+
],
|
|
2881
|
+
"registryDependencies": []
|
|
2882
|
+
},
|
|
2883
|
+
{
|
|
2884
|
+
"name": "input",
|
|
2885
|
+
"title": "Input",
|
|
2886
|
+
"description": "Form-associated single-line text field for primary and secondary application backgrounds, with native text input behavior, three control densities, optional leading and trailing content, search clearing, and validation.",
|
|
2887
|
+
"type": "registry:ui",
|
|
2888
|
+
"meta": {
|
|
2889
|
+
"library": "@ds-mo/ui",
|
|
2890
|
+
"distribution": "npm",
|
|
2891
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/input",
|
|
2892
|
+
"source": "src/wc/components/Input/Input.tsx",
|
|
2893
|
+
"intentStatus": "complete",
|
|
2894
|
+
"intent": {
|
|
2895
|
+
"audience": "general",
|
|
2896
|
+
"status": "stable",
|
|
2897
|
+
"summary": "Form-associated single-line text field for primary and secondary application backgrounds, with native text input behavior, three control densities, optional leading and trailing content, search clearing, and validation.",
|
|
2898
|
+
"useWhen": [
|
|
2899
|
+
"A user must enter or edit one line of text, an email address, telephone number, URL, search query, or password.",
|
|
2900
|
+
"The value must participate in native, Angular, or React form state.",
|
|
2901
|
+
"A compact filter or toolbar needs a single-line search field that follows the shared control-density recipe."
|
|
2902
|
+
],
|
|
2903
|
+
"avoidWhen": [
|
|
2904
|
+
"The user chooses from a finite set of known values.",
|
|
2905
|
+
"The user must enter multiple paragraphs or formatted content.",
|
|
2906
|
+
"The value is adjusted primarily by dragging within a numeric range."
|
|
2907
|
+
],
|
|
2908
|
+
"alternatives": [
|
|
2909
|
+
{
|
|
2910
|
+
"when": "The value comes from a finite set of known choices.",
|
|
2911
|
+
"component": "component:ds-select",
|
|
2912
|
+
"reason": "Select exposes the available values and owns listbox selection behavior."
|
|
2913
|
+
},
|
|
2914
|
+
{
|
|
2915
|
+
"when": "The value is an immediate on/off setting.",
|
|
2916
|
+
"component": "component:ds-switch",
|
|
2917
|
+
"reason": "Switch communicates a binary setting instead of free text entry."
|
|
2918
|
+
},
|
|
2919
|
+
{
|
|
2920
|
+
"when": "The value is chosen from a bounded numeric range.",
|
|
2921
|
+
"component": "component:ds-slider",
|
|
2922
|
+
"reason": "Slider supports direct range adjustment and communicates the current position."
|
|
2923
|
+
}
|
|
2924
|
+
],
|
|
2925
|
+
"commonlyComposedWith": [
|
|
2926
|
+
"component:ds-field",
|
|
2927
|
+
"component:ds-icon",
|
|
2928
|
+
"component:ds-text"
|
|
2929
|
+
],
|
|
2930
|
+
"accessibility": [
|
|
2931
|
+
"Provide a persistent visible label through the owning field or an external native label; placeholder text is guidance and must not be the field's only label.",
|
|
2932
|
+
"Choose the native input type that matches the value so browsers and assistive technology can provide appropriate semantics and keyboards.",
|
|
2933
|
+
"Error text is associated with the native input and announced as an alert when the invalid state is rendered.",
|
|
2934
|
+
"Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission.",
|
|
2935
|
+
"Suffix content must not carry information that is otherwise absent from the field's visible label, value, or description."
|
|
2936
|
+
],
|
|
2937
|
+
"states": [
|
|
2938
|
+
"The normal field boundary uses the shared secondary inset border. Focus promotes it to the thicker bold-brand inset stroke, while error uses the thicker bold-negative inset stroke without changing geometry.",
|
|
2939
|
+
"Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins.",
|
|
2940
|
+
"Entered values use the parent surface's primary foreground; prefix icons, suffix content, and resting placeholder text use its secondary foreground.",
|
|
2941
|
+
"Search fields show a standard borderless CrossCircle icon action only while they contain a value. Clearing emits the empty value and restores focus to the native field.",
|
|
2942
|
+
"The suffix slot is for compact units or decorations. The optional leading icon is decorative and does not replace the field label.",
|
|
2943
|
+
"Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
|
|
2944
|
+
"The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
|
|
2945
|
+
"Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts."
|
|
2946
|
+
],
|
|
2947
|
+
"responsiveBehavior": [
|
|
2948
|
+
"Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
|
|
2949
|
+
"Choose density from the containing layout: md for ordinary forms, sm or xs only where the surrounding controls use the same compact recipe.",
|
|
2950
|
+
"The owner supplies layout constraints and decides when a compact field moves to its own row."
|
|
2951
|
+
],
|
|
2952
|
+
"frameworkCaveats": {
|
|
2953
|
+
"customElements": [
|
|
2954
|
+
"Listen for dsChange for user edits and dsClear for the search clear action.",
|
|
2955
|
+
"Use the form attribute on the host when associating an input rendered outside its owning form."
|
|
2956
|
+
],
|
|
2957
|
+
"react": [
|
|
2958
|
+
"Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear."
|
|
2959
|
+
],
|
|
2960
|
+
"angular": [
|
|
2961
|
+
"Import DsInput with TextValueAccessor when integrating with Angular Forms."
|
|
2962
|
+
]
|
|
2963
|
+
},
|
|
2964
|
+
"references": [
|
|
2965
|
+
{
|
|
2966
|
+
"label": "Storybook examples",
|
|
2967
|
+
"path": "src/wc/components/Input/Input.stories.ts"
|
|
2968
|
+
},
|
|
2969
|
+
{
|
|
2970
|
+
"label": "Cross-browser form and accessibility coverage",
|
|
2971
|
+
"path": "tests/e2e/forms.spec.ts"
|
|
2972
|
+
}
|
|
2973
|
+
]
|
|
2974
|
+
},
|
|
2975
|
+
"props": {
|
|
2976
|
+
"ariaDescribedby": {
|
|
2977
|
+
"type": "string | undefined",
|
|
2978
|
+
"required": false
|
|
2979
|
+
},
|
|
2980
|
+
"ariaLabel": {
|
|
2981
|
+
"type": "string | null",
|
|
2982
|
+
"required": false
|
|
2983
|
+
},
|
|
2984
|
+
"ariaLabelledby": {
|
|
2985
|
+
"type": "string | undefined",
|
|
2986
|
+
"required": false
|
|
2987
|
+
},
|
|
2988
|
+
"autoComplete": {
|
|
2989
|
+
"type": "string | undefined",
|
|
2990
|
+
"required": false
|
|
2991
|
+
},
|
|
2992
|
+
"autoFocus": {
|
|
2993
|
+
"type": "boolean",
|
|
2994
|
+
"required": false
|
|
2995
|
+
},
|
|
2996
|
+
"clearLabel": {
|
|
2997
|
+
"type": "string",
|
|
2998
|
+
"required": false
|
|
2999
|
+
},
|
|
3000
|
+
"disabled": {
|
|
3001
|
+
"type": "boolean",
|
|
3002
|
+
"required": false
|
|
3003
|
+
},
|
|
3004
|
+
"enterKeyHint": {
|
|
3005
|
+
"type": "string",
|
|
3006
|
+
"required": false
|
|
3007
|
+
},
|
|
3008
|
+
"error": {
|
|
3009
|
+
"type": "boolean",
|
|
3010
|
+
"required": false
|
|
3011
|
+
},
|
|
3012
|
+
"errorMessage": {
|
|
3013
|
+
"type": "string | undefined",
|
|
3014
|
+
"required": false
|
|
3015
|
+
},
|
|
3016
|
+
"form": {
|
|
3017
|
+
"type": "string | undefined",
|
|
3018
|
+
"required": false
|
|
3019
|
+
},
|
|
3020
|
+
"hasBorder": {
|
|
3021
|
+
"type": "boolean",
|
|
3022
|
+
"required": false
|
|
3023
|
+
},
|
|
3024
|
+
"icon": {
|
|
3025
|
+
"type": "string | undefined",
|
|
3026
|
+
"required": false
|
|
3027
|
+
},
|
|
3028
|
+
"inputId": {
|
|
3029
|
+
"type": "string | undefined",
|
|
3030
|
+
"required": false
|
|
3031
|
+
},
|
|
3032
|
+
"inputMode": {
|
|
3033
|
+
"type": "string",
|
|
3034
|
+
"required": false
|
|
3035
|
+
},
|
|
3036
|
+
"isInactive": {
|
|
3037
|
+
"type": "boolean",
|
|
3038
|
+
"required": false
|
|
3039
|
+
},
|
|
3040
|
+
"name": {
|
|
3041
|
+
"type": "string | undefined",
|
|
3042
|
+
"required": false
|
|
3043
|
+
},
|
|
3044
|
+
"placeholder": {
|
|
3045
|
+
"type": "string | undefined",
|
|
3046
|
+
"required": false
|
|
3047
|
+
},
|
|
3048
|
+
"readOnly": {
|
|
3049
|
+
"type": "boolean",
|
|
3050
|
+
"required": false
|
|
3051
|
+
},
|
|
3052
|
+
"required": {
|
|
3053
|
+
"type": "boolean",
|
|
3054
|
+
"required": false
|
|
3055
|
+
},
|
|
3056
|
+
"requiredMessage": {
|
|
3057
|
+
"type": "string",
|
|
3058
|
+
"required": false
|
|
3059
|
+
},
|
|
3060
|
+
"size": {
|
|
3061
|
+
"type": "InputSize",
|
|
3062
|
+
"required": false
|
|
3063
|
+
},
|
|
3064
|
+
"type": {
|
|
3065
|
+
"type": "InputType",
|
|
3066
|
+
"required": false
|
|
3067
|
+
},
|
|
3068
|
+
"value": {
|
|
3069
|
+
"type": "string",
|
|
3070
|
+
"required": false
|
|
3071
|
+
},
|
|
3072
|
+
"width": {
|
|
3073
|
+
"type": "InputWidth",
|
|
3074
|
+
"required": false
|
|
3075
|
+
}
|
|
3076
|
+
},
|
|
3077
|
+
"events": [
|
|
3078
|
+
{
|
|
3079
|
+
"name": "dsChange",
|
|
3080
|
+
"detail": "string"
|
|
3081
|
+
},
|
|
3082
|
+
{
|
|
3083
|
+
"name": "dsClear",
|
|
3084
|
+
"detail": "void"
|
|
3085
|
+
}
|
|
3086
|
+
],
|
|
3087
|
+
"slots": [],
|
|
3088
|
+
"exports": {
|
|
3089
|
+
"customElement": "ds-input",
|
|
3090
|
+
"react": "DsInput",
|
|
3091
|
+
"angular": "DsInput"
|
|
3092
|
+
}
|
|
3093
|
+
},
|
|
3094
|
+
"dependencies": [
|
|
3095
|
+
"@ds-mo/ui",
|
|
3096
|
+
"@ds-mo/tokens",
|
|
3097
|
+
"@ds-mo/icons"
|
|
3098
|
+
],
|
|
3099
|
+
"registryDependencies": [
|
|
3100
|
+
"button-unfilled",
|
|
3101
|
+
"icon",
|
|
3102
|
+
"text"
|
|
3103
|
+
]
|
|
3104
|
+
},
|
|
3105
|
+
{
|
|
3106
|
+
"name": "loader",
|
|
3107
|
+
"title": "Loader",
|
|
3108
|
+
"description": "Indeterminate progress glyph for ongoing operations, inheriting owner color and optionally exposing standalone polite status text.",
|
|
3109
|
+
"type": "registry:ui",
|
|
3110
|
+
"meta": {
|
|
3111
|
+
"library": "@ds-mo/ui",
|
|
3112
|
+
"distribution": "npm",
|
|
3113
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/loader",
|
|
3114
|
+
"source": "src/wc/components/Loader/Loader.tsx",
|
|
3115
|
+
"intentStatus": "complete",
|
|
3116
|
+
"intent": {
|
|
3117
|
+
"audience": "general",
|
|
3118
|
+
"status": "stable",
|
|
3119
|
+
"summary": "Indeterminate progress glyph for ongoing operations, inheriting owner color and optionally exposing standalone polite status text.",
|
|
3120
|
+
"useWhen": [
|
|
3121
|
+
"An action or operation is in progress and its remaining duration cannot be quantified.",
|
|
3122
|
+
"A button, field, or bounded workflow needs a compact visual busy indicator owned by that control or region.",
|
|
3123
|
+
"A standalone operation needs a visible spinner with contextual polite status text."
|
|
3124
|
+
],
|
|
3125
|
+
"avoidWhen": [
|
|
3126
|
+
"Pending content has a predictable structure; use Skeleton to preserve that layout.",
|
|
3127
|
+
"Progress is measurable; use an appropriate determinate progress pattern.",
|
|
3128
|
+
"The UI needs a blocking overlay or automatic centering; the owning layout must provide that structure.",
|
|
3129
|
+
"Success, failure, retry, or completion must be communicated; the owning workflow handles outcomes."
|
|
3130
|
+
],
|
|
3131
|
+
"alternatives": [
|
|
3132
|
+
{
|
|
3133
|
+
"when": "A content region is waiting for structured data.",
|
|
3134
|
+
"component": "component:ds-skeleton",
|
|
3135
|
+
"reason": "Skeleton preserves the expected content geometry while data loads."
|
|
3136
|
+
},
|
|
3137
|
+
{
|
|
3138
|
+
"when": "A static visual symbol is needed without progress semantics.",
|
|
3139
|
+
"component": "component:ds-icon",
|
|
3140
|
+
"reason": "Icon owns non-progress system and flag glyphs."
|
|
3141
|
+
}
|
|
3142
|
+
],
|
|
3143
|
+
"commonlyComposedWith": [
|
|
3144
|
+
"component:ds-button-filled",
|
|
3145
|
+
"component:ds-button-unfilled",
|
|
3146
|
+
"component:ds-input",
|
|
3147
|
+
"component:ds-select"
|
|
3148
|
+
],
|
|
3149
|
+
"accessibility": [
|
|
3150
|
+
"When Loader is nested in a busy button, field, or region, keep it unnamed and expose busy state from the owner.",
|
|
3151
|
+
"Standalone Loader requires contextual status text that explains what is loading; do not rely on a generic visual spinner alone.",
|
|
3152
|
+
"Loader is an informative progress graphic and must retain sufficient rendered contrast; tertiary and quaternary are not supported standalone or informative Loader treatments.",
|
|
3153
|
+
"Avoid duplicate announcements from both Loader and its owning busy region.",
|
|
3154
|
+
"Reduced motion stops rotation while keeping the glyph and status semantics visible."
|
|
3155
|
+
],
|
|
3156
|
+
"states": [
|
|
3157
|
+
"Loader communicates indeterminate progress only and does not emit completion or failure events.",
|
|
3158
|
+
"Omitted color inherits currentColor. Explicit semantic aliases and CSS-variable references match Icon when an independent progress color is required.",
|
|
3159
|
+
"Nested Loader inherits a readable color from its owning busy control or region rather than selecting tertiary or quaternary directly.",
|
|
3160
|
+
"The owner decides whether to delay Loader visibility for short operations and removes it when the operation settles.",
|
|
3161
|
+
"The owner reserves space and supplies centering or overlay layout so Loader never causes unexpected layout movement."
|
|
3162
|
+
],
|
|
3163
|
+
"responsiveBehavior": [
|
|
3164
|
+
"The owning component or layout chooses Loader size, placement, and any responsive changes.",
|
|
3165
|
+
"Loader does not infer container size or viewport breakpoints."
|
|
3166
|
+
],
|
|
3167
|
+
"frameworkCaveats": {
|
|
3168
|
+
"customElements": [
|
|
3169
|
+
"Use the label only for standalone status; nested usage should synchronize aria-busy on the owning element."
|
|
3170
|
+
],
|
|
3171
|
+
"react": [
|
|
3172
|
+
"Derive Loader visibility and the owner's busy state from the same operation state."
|
|
3173
|
+
],
|
|
3174
|
+
"angular": [
|
|
3175
|
+
"Derive Loader visibility and the owner's busy state from the same operation state."
|
|
3176
|
+
]
|
|
3177
|
+
},
|
|
3178
|
+
"references": [
|
|
3179
|
+
{
|
|
3180
|
+
"label": "Storybook examples",
|
|
3181
|
+
"path": "src/wc/components/Loader/Loader.stories.ts"
|
|
3182
|
+
}
|
|
3183
|
+
]
|
|
3184
|
+
},
|
|
3185
|
+
"props": {
|
|
3186
|
+
"color": {
|
|
3187
|
+
"type": "LoaderColor",
|
|
3188
|
+
"required": false
|
|
3189
|
+
},
|
|
3190
|
+
"label": {
|
|
3191
|
+
"type": "string | undefined",
|
|
3192
|
+
"required": false
|
|
3193
|
+
},
|
|
3194
|
+
"size": {
|
|
3195
|
+
"type": "LoaderSize",
|
|
3196
|
+
"required": false
|
|
3197
|
+
}
|
|
3198
|
+
},
|
|
3199
|
+
"events": [],
|
|
3200
|
+
"slots": [],
|
|
3201
|
+
"exports": {
|
|
3202
|
+
"customElement": "ds-loader",
|
|
3203
|
+
"react": "DsLoader",
|
|
3204
|
+
"angular": "DsLoader"
|
|
3205
|
+
}
|
|
3206
|
+
},
|
|
3207
|
+
"dependencies": [
|
|
3208
|
+
"@ds-mo/ui",
|
|
3209
|
+
"@ds-mo/tokens"
|
|
3210
|
+
],
|
|
3211
|
+
"registryDependencies": []
|
|
3212
|
+
},
|
|
3213
|
+
{
|
|
3214
|
+
"name": "markdown",
|
|
3215
|
+
"title": "Markdown",
|
|
3216
|
+
"description": "Safe CommonMark and GFM renderer built from parsed nodes without raw HTML injection.",
|
|
3217
|
+
"type": "registry:ui",
|
|
3218
|
+
"meta": {
|
|
3219
|
+
"library": "@ds-mo/ui",
|
|
3220
|
+
"distribution": "npm",
|
|
3221
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/markdown",
|
|
3222
|
+
"source": "src/wc/components/Markdown/Markdown.tsx",
|
|
3223
|
+
"intentStatus": "complete",
|
|
3224
|
+
"intent": {
|
|
3225
|
+
"audience": "specialized",
|
|
3226
|
+
"status": "experimental",
|
|
3227
|
+
"summary": "Safe CommonMark and GFM renderer built from parsed nodes without raw HTML injection.",
|
|
3228
|
+
"useWhen": [
|
|
3229
|
+
"Trusted or untrusted message text needs headings, lists, links, tables, tasks, quotes, and code."
|
|
3230
|
+
],
|
|
3231
|
+
"avoidWhen": [
|
|
3232
|
+
"The application needs arbitrary HTML, custom plugins, or a full document CMS renderer."
|
|
3233
|
+
],
|
|
3234
|
+
"commonlyComposedWith": [
|
|
3235
|
+
"component:ds-code-block",
|
|
3236
|
+
"component:ds-message-bubble"
|
|
3237
|
+
],
|
|
3238
|
+
"patterns": [
|
|
3239
|
+
"pattern:conversation",
|
|
3240
|
+
"pattern:agent-chat"
|
|
3241
|
+
],
|
|
3242
|
+
"accessibility": [
|
|
3243
|
+
"Semantic parsed elements preserve heading, list, table, quote, and code relationships.",
|
|
3244
|
+
"Raw HTML is ignored and unsafe link schemes are not made interactive.",
|
|
3245
|
+
"Link text must remain descriptive in authored content."
|
|
2152
3246
|
],
|
|
2153
3247
|
"states": [
|
|
2154
|
-
"
|
|
2155
|
-
"Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins.",
|
|
2156
|
-
"Entered values use the parent surface's primary foreground; prefix icons, suffix content, and resting placeholder text use its secondary foreground.",
|
|
2157
|
-
"Search fields show a standard borderless CrossCircle icon action only while they contain a value. Clearing emits the empty value and restores focus to the native field.",
|
|
2158
|
-
"The suffix slot is for compact units or decorations. The optional leading icon is decorative and does not replace the field label.",
|
|
2159
|
-
"Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
|
|
2160
|
-
"The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
|
|
2161
|
-
"Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts."
|
|
3248
|
+
"Streaming updates are coalesced to one parse and render per animation frame."
|
|
2162
3249
|
],
|
|
2163
3250
|
"responsiveBehavior": [
|
|
2164
|
-
"
|
|
2165
|
-
|
|
2166
|
-
|
|
3251
|
+
"Tables and code scroll horizontally instead of forcing the transcript wider."
|
|
3252
|
+
],
|
|
3253
|
+
"references": [
|
|
3254
|
+
{
|
|
3255
|
+
"label": "Storybook examples",
|
|
3256
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
3257
|
+
}
|
|
3258
|
+
]
|
|
3259
|
+
},
|
|
3260
|
+
"props": {
|
|
3261
|
+
"content": {
|
|
3262
|
+
"type": "string",
|
|
3263
|
+
"required": false
|
|
3264
|
+
},
|
|
3265
|
+
"streaming": {
|
|
3266
|
+
"type": "boolean",
|
|
3267
|
+
"required": false
|
|
3268
|
+
}
|
|
3269
|
+
},
|
|
3270
|
+
"events": [],
|
|
3271
|
+
"slots": [],
|
|
3272
|
+
"exports": {
|
|
3273
|
+
"customElement": "ds-markdown",
|
|
3274
|
+
"react": "DsMarkdown",
|
|
3275
|
+
"angular": "DsMarkdown"
|
|
3276
|
+
}
|
|
3277
|
+
},
|
|
3278
|
+
"dependencies": [
|
|
3279
|
+
"@ds-mo/ui",
|
|
3280
|
+
"@ds-mo/tokens"
|
|
3281
|
+
],
|
|
3282
|
+
"registryDependencies": [
|
|
3283
|
+
"code-block"
|
|
3284
|
+
]
|
|
3285
|
+
},
|
|
3286
|
+
{
|
|
3287
|
+
"name": "menu",
|
|
3288
|
+
"title": "Menu",
|
|
3289
|
+
"description": "Anchored action menu with flat commands, grouped sections, single-selection radio choices, supplemental notification dots, switches, and destructive actions.",
|
|
3290
|
+
"type": "registry:ui",
|
|
3291
|
+
"meta": {
|
|
3292
|
+
"library": "@ds-mo/ui",
|
|
3293
|
+
"distribution": "npm",
|
|
3294
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/menu",
|
|
3295
|
+
"source": "src/wc/components/Menu/Menu.tsx",
|
|
3296
|
+
"intentStatus": "complete",
|
|
3297
|
+
"intent": {
|
|
3298
|
+
"audience": "general",
|
|
3299
|
+
"status": "stable",
|
|
3300
|
+
"summary": "Anchored action menu with flat commands, grouped sections, single-selection radio choices, supplemental notification dots, switches, and destructive actions.",
|
|
3301
|
+
"useWhen": [
|
|
3302
|
+
"A trigger reveals a short contextual list of commands or state-changing actions.",
|
|
3303
|
+
"Actions need grouping, mutually exclusive selected state, supplemental notification dots, switch rows, or destructive treatment."
|
|
3304
|
+
],
|
|
3305
|
+
"avoidWhen": [
|
|
3306
|
+
"The user is selecting a value for a form field.",
|
|
3307
|
+
"The content requires rich dialog interaction or a multi-step workflow.",
|
|
3308
|
+
"The actions should remain persistently visible."
|
|
3309
|
+
],
|
|
3310
|
+
"alternatives": [
|
|
3311
|
+
{
|
|
3312
|
+
"when": "The choice is a form value with a label, validation, and submitted value.",
|
|
3313
|
+
"component": "component:ds-select",
|
|
3314
|
+
"reason": "Select provides form-control semantics and value ownership."
|
|
3315
|
+
},
|
|
3316
|
+
{
|
|
3317
|
+
"when": "Several form values may be selected.",
|
|
3318
|
+
"component": "component:ds-select-multi",
|
|
3319
|
+
"reason": "SelectMulti provides multi-select listbox semantics, array value ownership, and count presentation."
|
|
3320
|
+
},
|
|
3321
|
+
{
|
|
3322
|
+
"when": "The interaction needs substantial content, confirmation, or a form.",
|
|
3323
|
+
"component": "component:ds-modal",
|
|
3324
|
+
"reason": "Modal owns focus containment and dialog-level interaction."
|
|
3325
|
+
}
|
|
3326
|
+
],
|
|
3327
|
+
"commonlyComposedWith": [
|
|
3328
|
+
"component:ds-button-unfilled",
|
|
3329
|
+
"component:ds-panel-nav",
|
|
3330
|
+
"component:ds-switch",
|
|
3331
|
+
"component:ds-swatch-picker"
|
|
3332
|
+
],
|
|
3333
|
+
"patterns": [
|
|
3334
|
+
"pattern:menu-trigger"
|
|
3335
|
+
],
|
|
3336
|
+
"accessibility": [
|
|
3337
|
+
"Anchor the menu to the control that opens it and return focus to that control when the menu closes.",
|
|
3338
|
+
"Open with visible initial focus only when the trigger was activated from the keyboard.",
|
|
3339
|
+
"Keep disabled items discoverable only when their unavailable state is meaningful.",
|
|
3340
|
+
"Switch rows use menuitemcheckbox semantics on the row; the nested ds-switch is an aria-hidden md presentation indicator.",
|
|
3341
|
+
"Single-selection menus use menuitemradio semantics and aria-checked on each row; the leading radio mark is presentation-only.",
|
|
3342
|
+
"A swatch-picker section changes the popup to a non-modal dialog so its radio group and ordinary preference buttons keep valid nested semantics; Tab moves between its controls, then leaves and closes at the popup boundary.",
|
|
3343
|
+
"Use notification dots only as supplemental status and not as the sole indication of important information."
|
|
3344
|
+
],
|
|
3345
|
+
"states": [
|
|
3346
|
+
"The host owns open state and responds to selection and close events.",
|
|
3347
|
+
"Use either flat items or sections, not both.",
|
|
3348
|
+
"After dsSelect from a switch row, update switchValue in the items property so the controlled indicator reflects the new state.",
|
|
3349
|
+
"For selectionMode single, keep exactly one item isSelected and update the items property after dsSelect.",
|
|
3350
|
+
"Arrays, objects, and element anchors must be assigned as JavaScript properties.",
|
|
3351
|
+
"Use a swatch-picker section for a small curated visual preference and apply dsSwatchSelect immediately without closing the popup; the legacy gradient-picker section and dsGradientSelect remain compatibility-only."
|
|
3352
|
+
],
|
|
3353
|
+
"responsiveBehavior": [
|
|
3354
|
+
"Keep the default choice-cell anchor alignment so the first or last interactive row edge aligns with its trigger, matching Select; use popup-frame only for deliberate custom frame geometry.",
|
|
3355
|
+
"Choose placement relative to the trigger and allow the component to clamp the popup to the viewport.",
|
|
3356
|
+
"Avoid fixed widths that exceed narrow viewports."
|
|
2167
3357
|
],
|
|
2168
3358
|
"frameworkCaveats": {
|
|
2169
3359
|
"customElements": [
|
|
2170
|
-
"
|
|
2171
|
-
"Use the form attribute on the host when associating an input rendered outside its owning form."
|
|
3360
|
+
"Assign items, sections, and HTMLElement anchors as properties after the element is defined."
|
|
2172
3361
|
],
|
|
2173
3362
|
"react": [
|
|
2174
|
-
"
|
|
3363
|
+
"Pass arrays and objects as wrapper props and handle generated onDsSelect and onDsClose event props."
|
|
2175
3364
|
],
|
|
2176
3365
|
"angular": [
|
|
2177
|
-
"
|
|
3366
|
+
"Use property bindings for arrays, objects, and anchors and event bindings for dsSelect and dsClose."
|
|
2178
3367
|
]
|
|
2179
3368
|
},
|
|
2180
3369
|
"references": [
|
|
2181
3370
|
{
|
|
2182
3371
|
"label": "Storybook examples",
|
|
2183
|
-
"path": "src/wc/components/
|
|
3372
|
+
"path": "src/wc/components/Menu/Menu.stories.ts"
|
|
2184
3373
|
},
|
|
2185
3374
|
{
|
|
2186
|
-
"label": "
|
|
2187
|
-
"path": "
|
|
3375
|
+
"label": "Framework integration",
|
|
3376
|
+
"path": "docs/framework-integration.md"
|
|
2188
3377
|
}
|
|
2189
3378
|
]
|
|
2190
3379
|
},
|
|
2191
3380
|
"props": {
|
|
2192
|
-
"
|
|
2193
|
-
"type": "
|
|
3381
|
+
"align": {
|
|
3382
|
+
"type": "MenuAlign",
|
|
2194
3383
|
"required": false
|
|
2195
3384
|
},
|
|
2196
|
-
"
|
|
2197
|
-
"type": "
|
|
3385
|
+
"alignOffset": {
|
|
3386
|
+
"type": "number | string",
|
|
2198
3387
|
"required": false
|
|
2199
3388
|
},
|
|
2200
|
-
"
|
|
2201
|
-
"type": "
|
|
3389
|
+
"anchor": {
|
|
3390
|
+
"type": "HTMLElement | undefined",
|
|
2202
3391
|
"required": false
|
|
2203
3392
|
},
|
|
2204
|
-
"
|
|
3393
|
+
"anchorAlignment": {
|
|
3394
|
+
"type": "ChoicePopupAnchorAlignment",
|
|
3395
|
+
"required": false
|
|
3396
|
+
},
|
|
3397
|
+
"anchorId": {
|
|
2205
3398
|
"type": "string | undefined",
|
|
2206
3399
|
"required": false
|
|
2207
3400
|
},
|
|
2208
|
-
"
|
|
3401
|
+
"initialFocusVisible": {
|
|
2209
3402
|
"type": "boolean",
|
|
2210
3403
|
"required": false
|
|
2211
3404
|
},
|
|
2212
|
-
"
|
|
3405
|
+
"items": {
|
|
3406
|
+
"type": "MenuItemData[]",
|
|
3407
|
+
"required": false
|
|
3408
|
+
},
|
|
3409
|
+
"menuLabel": {
|
|
2213
3410
|
"type": "string",
|
|
2214
3411
|
"required": false
|
|
2215
3412
|
},
|
|
2216
|
-
"
|
|
2217
|
-
"type": "
|
|
3413
|
+
"menuWidth": {
|
|
3414
|
+
"type": "string | undefined",
|
|
2218
3415
|
"required": false
|
|
2219
3416
|
},
|
|
2220
|
-
"
|
|
2221
|
-
"type": "string",
|
|
3417
|
+
"minWidth": {
|
|
3418
|
+
"type": "string | undefined",
|
|
2222
3419
|
"required": false
|
|
2223
3420
|
},
|
|
2224
|
-
"
|
|
3421
|
+
"open": {
|
|
2225
3422
|
"type": "boolean",
|
|
2226
3423
|
"required": false
|
|
2227
3424
|
},
|
|
2228
|
-
"
|
|
2229
|
-
"type": "
|
|
3425
|
+
"sections": {
|
|
3426
|
+
"type": "MenuSection[]",
|
|
2230
3427
|
"required": false
|
|
2231
3428
|
},
|
|
2232
|
-
"
|
|
2233
|
-
"type": "
|
|
3429
|
+
"selectionMode": {
|
|
3430
|
+
"type": "MenuSelectionMode",
|
|
2234
3431
|
"required": false
|
|
2235
3432
|
},
|
|
2236
|
-
"
|
|
2237
|
-
"type": "
|
|
3433
|
+
"side": {
|
|
3434
|
+
"type": "MenuSide",
|
|
2238
3435
|
"required": false
|
|
2239
3436
|
},
|
|
2240
|
-
"
|
|
2241
|
-
"type": "
|
|
3437
|
+
"sideOffset": {
|
|
3438
|
+
"type": "number | string",
|
|
2242
3439
|
"required": false
|
|
3440
|
+
}
|
|
3441
|
+
},
|
|
3442
|
+
"events": [
|
|
3443
|
+
{
|
|
3444
|
+
"name": "dsClose",
|
|
3445
|
+
"detail": "void"
|
|
2243
3446
|
},
|
|
2244
|
-
|
|
2245
|
-
"
|
|
2246
|
-
"
|
|
3447
|
+
{
|
|
3448
|
+
"name": "dsGradientSelect",
|
|
3449
|
+
"detail": "ShellGradientPreset"
|
|
2247
3450
|
},
|
|
2248
|
-
|
|
3451
|
+
{
|
|
3452
|
+
"name": "dsSelect",
|
|
3453
|
+
"detail": "MenuItemData"
|
|
3454
|
+
},
|
|
3455
|
+
{
|
|
3456
|
+
"name": "dsSwatchSelect",
|
|
3457
|
+
"detail": "string"
|
|
3458
|
+
}
|
|
3459
|
+
],
|
|
3460
|
+
"slots": [],
|
|
3461
|
+
"exports": {
|
|
3462
|
+
"customElement": "ds-menu",
|
|
3463
|
+
"react": "DsMenu",
|
|
3464
|
+
"angular": "DsMenu"
|
|
3465
|
+
}
|
|
3466
|
+
},
|
|
3467
|
+
"dependencies": [
|
|
3468
|
+
"@ds-mo/ui",
|
|
3469
|
+
"@ds-mo/tokens"
|
|
3470
|
+
],
|
|
3471
|
+
"registryDependencies": [
|
|
3472
|
+
"badge",
|
|
3473
|
+
"swatch-picker",
|
|
3474
|
+
"switch",
|
|
3475
|
+
"text"
|
|
3476
|
+
]
|
|
3477
|
+
},
|
|
3478
|
+
{
|
|
3479
|
+
"name": "message",
|
|
3480
|
+
"title": "Message",
|
|
3481
|
+
"description": "Channel-neutral message row owning direction, grouping, author, time, delivery metadata, and accessory regions.",
|
|
3482
|
+
"type": "registry:ui",
|
|
3483
|
+
"meta": {
|
|
3484
|
+
"library": "@ds-mo/ui",
|
|
3485
|
+
"distribution": "npm",
|
|
3486
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/message",
|
|
3487
|
+
"source": "src/wc/components/Message/Message.tsx",
|
|
3488
|
+
"intentStatus": "complete",
|
|
3489
|
+
"intent": {
|
|
3490
|
+
"audience": "general",
|
|
3491
|
+
"status": "experimental",
|
|
3492
|
+
"summary": "Channel-neutral message row owning direction, grouping, author, time, delivery metadata, and accessory regions.",
|
|
3493
|
+
"useWhen": [
|
|
3494
|
+
"A transcript contains messages that need consistent incoming, outgoing, or system layout."
|
|
3495
|
+
],
|
|
3496
|
+
"avoidWhen": [
|
|
3497
|
+
"Content is not an authored message in a conversation."
|
|
3498
|
+
],
|
|
3499
|
+
"commonlyComposedWith": [
|
|
3500
|
+
"component:ds-message-bubble",
|
|
3501
|
+
"component:ds-message-scroller"
|
|
3502
|
+
],
|
|
3503
|
+
"patterns": [
|
|
3504
|
+
"pattern:conversation"
|
|
3505
|
+
],
|
|
3506
|
+
"accessibility": [
|
|
3507
|
+
"Author and time metadata remain textual when they are necessary to interpret the transcript.",
|
|
3508
|
+
"Delivery failure must be expressed in text rather than color alone."
|
|
3509
|
+
],
|
|
3510
|
+
"states": [
|
|
3511
|
+
"Pass an ISO timestamp. Message keeps the full value in dateTime and formats the visible value as a localized time; applications must not render a raw ISO string as visible transcript metadata.",
|
|
3512
|
+
"Grouping joins adjacent bubble corners, shows the incoming author only at the start, and shows delivery/time metadata only at the end. Outgoing author remains in the accessible message label without repeating a visible You label.",
|
|
3513
|
+
"Set showAuthor false only when the product makes participant and assistant roles visually self-evident; continue passing author so the accessible message label remains specific."
|
|
3514
|
+
],
|
|
3515
|
+
"responsiveBehavior": [
|
|
3516
|
+
"Outgoing and incoming rows adapt to available width while preserving their directional alignment."
|
|
3517
|
+
],
|
|
3518
|
+
"references": [
|
|
3519
|
+
{
|
|
3520
|
+
"label": "Storybook examples",
|
|
3521
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
3522
|
+
}
|
|
3523
|
+
]
|
|
3524
|
+
},
|
|
3525
|
+
"props": {
|
|
3526
|
+
"author": {
|
|
2249
3527
|
"type": "string",
|
|
2250
3528
|
"required": false
|
|
2251
3529
|
},
|
|
2252
|
-
"
|
|
2253
|
-
"type": "
|
|
3530
|
+
"deliveryState": {
|
|
3531
|
+
"type": "MessageDeliveryState | undefined",
|
|
2254
3532
|
"required": false
|
|
2255
3533
|
},
|
|
2256
|
-
"
|
|
2257
|
-
"type": "
|
|
3534
|
+
"direction": {
|
|
3535
|
+
"type": "MessageDirection",
|
|
2258
3536
|
"required": false
|
|
2259
3537
|
},
|
|
2260
|
-
"
|
|
2261
|
-
"type": "
|
|
3538
|
+
"groupPosition": {
|
|
3539
|
+
"type": "MessageGroupPosition",
|
|
2262
3540
|
"required": false
|
|
2263
3541
|
},
|
|
2264
|
-
"
|
|
2265
|
-
"type": "
|
|
3542
|
+
"messageId": {
|
|
3543
|
+
"type": "string",
|
|
2266
3544
|
"required": false
|
|
2267
3545
|
},
|
|
2268
|
-
"
|
|
3546
|
+
"scrollAnchor": {
|
|
2269
3547
|
"type": "boolean",
|
|
2270
3548
|
"required": false
|
|
2271
3549
|
},
|
|
2272
|
-
"
|
|
2273
|
-
"type": "
|
|
2274
|
-
"required": false
|
|
2275
|
-
},
|
|
2276
|
-
"size": {
|
|
2277
|
-
"type": "InputSize",
|
|
3550
|
+
"showAuthor": {
|
|
3551
|
+
"type": "boolean",
|
|
2278
3552
|
"required": false
|
|
2279
3553
|
},
|
|
2280
|
-
"
|
|
2281
|
-
"type": "
|
|
3554
|
+
"streaming": {
|
|
3555
|
+
"type": "boolean",
|
|
2282
3556
|
"required": false
|
|
2283
3557
|
},
|
|
2284
|
-
"
|
|
3558
|
+
"timestamp": {
|
|
2285
3559
|
"type": "string",
|
|
2286
3560
|
"required": false
|
|
2287
|
-
},
|
|
2288
|
-
"width": {
|
|
2289
|
-
"type": "InputWidth",
|
|
2290
|
-
"required": false
|
|
2291
3561
|
}
|
|
2292
3562
|
},
|
|
2293
|
-
"events": [
|
|
2294
|
-
{
|
|
2295
|
-
"name": "dsChange",
|
|
2296
|
-
"detail": "string"
|
|
2297
|
-
},
|
|
2298
|
-
{
|
|
2299
|
-
"name": "dsClear",
|
|
2300
|
-
"detail": "void"
|
|
2301
|
-
}
|
|
2302
|
-
],
|
|
3563
|
+
"events": [],
|
|
2303
3564
|
"slots": [],
|
|
2304
3565
|
"exports": {
|
|
2305
|
-
"customElement": "ds-
|
|
2306
|
-
"react": "
|
|
2307
|
-
"angular": "
|
|
3566
|
+
"customElement": "ds-message",
|
|
3567
|
+
"react": "DsMessage",
|
|
3568
|
+
"angular": "DsMessage"
|
|
2308
3569
|
}
|
|
2309
3570
|
},
|
|
2310
3571
|
"dependencies": [
|
|
2311
3572
|
"@ds-mo/ui",
|
|
2312
|
-
"@ds-mo/tokens"
|
|
2313
|
-
"@ds-mo/icons"
|
|
3573
|
+
"@ds-mo/tokens"
|
|
2314
3574
|
],
|
|
2315
3575
|
"registryDependencies": [
|
|
2316
|
-
"button-unfilled",
|
|
2317
|
-
"icon",
|
|
2318
3576
|
"text"
|
|
2319
3577
|
]
|
|
2320
3578
|
},
|
|
2321
3579
|
{
|
|
2322
|
-
"name": "
|
|
2323
|
-
"title": "
|
|
2324
|
-
"description": "
|
|
3580
|
+
"name": "message-bubble",
|
|
3581
|
+
"title": "MessageBubble",
|
|
3582
|
+
"description": "Visible message content surface with a body-medium default, separated from message-row direction and metadata.",
|
|
2325
3583
|
"type": "registry:ui",
|
|
2326
3584
|
"meta": {
|
|
2327
3585
|
"library": "@ds-mo/ui",
|
|
2328
3586
|
"distribution": "npm",
|
|
2329
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
2330
|
-
"source": "src/wc/components/
|
|
3587
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/message-bubble",
|
|
3588
|
+
"source": "src/wc/components/MessageBubble/MessageBubble.tsx",
|
|
2331
3589
|
"intentStatus": "complete",
|
|
2332
3590
|
"intent": {
|
|
2333
3591
|
"audience": "general",
|
|
2334
|
-
"status": "
|
|
2335
|
-
"summary": "
|
|
3592
|
+
"status": "experimental",
|
|
3593
|
+
"summary": "Visible message content surface with a body-medium default, separated from message-row direction and metadata.",
|
|
2336
3594
|
"useWhen": [
|
|
2337
|
-
"
|
|
2338
|
-
"
|
|
2339
|
-
"A standalone operation needs a visible spinner with contextual polite status text."
|
|
3595
|
+
"Message content needs a primary, secondary, ghost, or error surface within a Message row.",
|
|
3596
|
+
"Plain incoming or outgoing message copy should use the shared body-medium regular typography recipe without application styling."
|
|
2340
3597
|
],
|
|
2341
3598
|
"avoidWhen": [
|
|
2342
|
-
"
|
|
2343
|
-
"
|
|
2344
|
-
"The UI needs a blocking overlay or automatic centering; the owning layout must provide that structure.",
|
|
2345
|
-
"Success, failure, retry, or completion must be communicated; the owning workflow handles outcomes."
|
|
2346
|
-
],
|
|
2347
|
-
"alternatives": [
|
|
2348
|
-
{
|
|
2349
|
-
"when": "A content region is waiting for structured data.",
|
|
2350
|
-
"component": "component:ds-skeleton",
|
|
2351
|
-
"reason": "Skeleton preserves the expected content geometry while data loads."
|
|
2352
|
-
},
|
|
2353
|
-
{
|
|
2354
|
-
"when": "A static visual symbol is needed without progress semantics.",
|
|
2355
|
-
"component": "component:ds-icon",
|
|
2356
|
-
"reason": "Icon owns non-progress system and flag glyphs."
|
|
2357
|
-
}
|
|
3599
|
+
"The surface is a general card, callout, or form container.",
|
|
3600
|
+
"The application wants to promote ordinary conversation copy to body-large; message typography stays body-medium unless a distinct authored rich-content element owns its own complete type recipe."
|
|
2358
3601
|
],
|
|
2359
3602
|
"commonlyComposedWith": [
|
|
2360
|
-
"component:ds-
|
|
2361
|
-
"component:ds-
|
|
2362
|
-
"component:ds-input",
|
|
2363
|
-
"component:ds-select"
|
|
3603
|
+
"component:ds-message",
|
|
3604
|
+
"component:ds-markdown"
|
|
2364
3605
|
],
|
|
2365
|
-
"
|
|
2366
|
-
"
|
|
2367
|
-
"Standalone Loader requires contextual status text that explains what is loading; do not rely on a generic visual spinner alone.",
|
|
2368
|
-
"Loader is an informative progress graphic and must retain sufficient rendered contrast; tertiary and quaternary are not supported standalone or informative Loader treatments.",
|
|
2369
|
-
"Avoid duplicate announcements from both Loader and its owning busy region.",
|
|
2370
|
-
"Reduced motion stops rotation while keeping the glyph and status semantics visible."
|
|
3606
|
+
"patterns": [
|
|
3607
|
+
"pattern:conversation"
|
|
2371
3608
|
],
|
|
2372
|
-
"
|
|
2373
|
-
"
|
|
2374
|
-
"Omitted color inherits currentColor. Explicit semantic aliases and CSS-variable references match Icon when an independent progress color is required.",
|
|
2375
|
-
"Nested Loader inherits a readable color from its owning busy control or region rather than selecting tertiary or quaternary directly.",
|
|
2376
|
-
"The owner decides whether to delay Loader visibility for short operations and removes it when the operation settles.",
|
|
2377
|
-
"The owner reserves space and supplies centering or overlay layout so Loader never causes unexpected layout movement."
|
|
3609
|
+
"accessibility": [
|
|
3610
|
+
"Surface styling does not add semantics; meaningful error or status copy belongs in message content or metadata."
|
|
2378
3611
|
],
|
|
2379
3612
|
"responsiveBehavior": [
|
|
2380
|
-
"The
|
|
2381
|
-
"Loader does not infer container size or viewport breakpoints."
|
|
3613
|
+
"The bubble wraps content and allows wide ghost responses to use more transcript width."
|
|
2382
3614
|
],
|
|
2383
|
-
"frameworkCaveats": {
|
|
2384
|
-
"customElements": [
|
|
2385
|
-
"Use the label only for standalone status; nested usage should synchronize aria-busy on the owning element."
|
|
2386
|
-
],
|
|
2387
|
-
"react": [
|
|
2388
|
-
"Derive Loader visibility and the owner's busy state from the same operation state."
|
|
2389
|
-
],
|
|
2390
|
-
"angular": [
|
|
2391
|
-
"Derive Loader visibility and the owner's busy state from the same operation state."
|
|
2392
|
-
]
|
|
2393
|
-
},
|
|
2394
3615
|
"references": [
|
|
2395
3616
|
{
|
|
2396
3617
|
"label": "Storybook examples",
|
|
2397
|
-
"path": "src/wc/components/
|
|
3618
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
2398
3619
|
}
|
|
2399
3620
|
]
|
|
2400
3621
|
},
|
|
2401
3622
|
"props": {
|
|
2402
|
-
"
|
|
2403
|
-
"type": "
|
|
2404
|
-
"required": false
|
|
2405
|
-
},
|
|
2406
|
-
"label": {
|
|
2407
|
-
"type": "string | undefined",
|
|
2408
|
-
"required": false
|
|
2409
|
-
},
|
|
2410
|
-
"size": {
|
|
2411
|
-
"type": "LoaderSize",
|
|
3623
|
+
"variant": {
|
|
3624
|
+
"type": "MessageBubbleVariant",
|
|
2412
3625
|
"required": false
|
|
2413
3626
|
}
|
|
2414
3627
|
},
|
|
2415
3628
|
"events": [],
|
|
2416
3629
|
"slots": [],
|
|
2417
3630
|
"exports": {
|
|
2418
|
-
"customElement": "ds-
|
|
2419
|
-
"react": "
|
|
2420
|
-
"angular": "
|
|
3631
|
+
"customElement": "ds-message-bubble",
|
|
3632
|
+
"react": "DsMessageBubble",
|
|
3633
|
+
"angular": "DsMessageBubble"
|
|
2421
3634
|
}
|
|
2422
3635
|
},
|
|
2423
3636
|
"dependencies": [
|
|
@@ -2427,178 +3640,191 @@
|
|
|
2427
3640
|
"registryDependencies": []
|
|
2428
3641
|
},
|
|
2429
3642
|
{
|
|
2430
|
-
"name": "
|
|
2431
|
-
"title": "
|
|
2432
|
-
"description": "
|
|
3643
|
+
"name": "message-composer",
|
|
3644
|
+
"title": "MessageComposer",
|
|
3645
|
+
"description": "Two-line auto-growing conversation textarea with submit, stop, error, and extensible leading-tool or trailing-action regions.",
|
|
2433
3646
|
"type": "registry:ui",
|
|
2434
3647
|
"meta": {
|
|
2435
3648
|
"library": "@ds-mo/ui",
|
|
2436
3649
|
"distribution": "npm",
|
|
2437
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
2438
|
-
"source": "src/wc/components/
|
|
3650
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/message-composer",
|
|
3651
|
+
"source": "src/wc/components/MessageComposer/MessageComposer.tsx",
|
|
2439
3652
|
"intentStatus": "complete",
|
|
2440
3653
|
"intent": {
|
|
2441
3654
|
"audience": "general",
|
|
2442
|
-
"status": "
|
|
2443
|
-
"summary": "
|
|
3655
|
+
"status": "experimental",
|
|
3656
|
+
"summary": "Two-line auto-growing conversation textarea with submit, stop, error, and extensible leading-tool or trailing-action regions.",
|
|
2444
3657
|
"useWhen": [
|
|
2445
|
-
"A
|
|
2446
|
-
"Actions need grouping, selected state, supplemental notification dots, switch rows, or destructive treatment."
|
|
3658
|
+
"A conversation accepts multi-line text and needs Enter-to-submit with a streaming stop action."
|
|
2447
3659
|
],
|
|
2448
3660
|
"avoidWhen": [
|
|
2449
|
-
"The
|
|
2450
|
-
"The content requires rich dialog interaction or a multi-step workflow.",
|
|
2451
|
-
"The actions should remain persistently visible."
|
|
2452
|
-
],
|
|
2453
|
-
"alternatives": [
|
|
2454
|
-
{
|
|
2455
|
-
"when": "The choice is a form value with a label, validation, and submitted value.",
|
|
2456
|
-
"component": "component:ds-select",
|
|
2457
|
-
"reason": "Select provides form-control semantics and value ownership."
|
|
2458
|
-
},
|
|
2459
|
-
{
|
|
2460
|
-
"when": "Several form values may be selected.",
|
|
2461
|
-
"component": "component:ds-select-multi",
|
|
2462
|
-
"reason": "SelectMulti provides multi-select listbox semantics, array value ownership, and count presentation."
|
|
2463
|
-
},
|
|
2464
|
-
{
|
|
2465
|
-
"when": "The interaction needs substantial content, confirmation, or a form.",
|
|
2466
|
-
"component": "component:ds-modal",
|
|
2467
|
-
"reason": "Modal owns focus containment and dialog-level interaction."
|
|
2468
|
-
}
|
|
3661
|
+
"The text is a conventional form field submitted with unrelated fields."
|
|
2469
3662
|
],
|
|
2470
3663
|
"commonlyComposedWith": [
|
|
2471
|
-
"component:ds-
|
|
2472
|
-
"component:ds-
|
|
2473
|
-
"component:ds-
|
|
2474
|
-
"component:ds-swatch-picker"
|
|
3664
|
+
"component:ds-message-scroller",
|
|
3665
|
+
"component:ds-button-filled",
|
|
3666
|
+
"component:ds-button-unfilled"
|
|
2475
3667
|
],
|
|
2476
3668
|
"patterns": [
|
|
2477
|
-
"pattern:
|
|
3669
|
+
"pattern:conversation"
|
|
2478
3670
|
],
|
|
2479
3671
|
"accessibility": [
|
|
2480
|
-
"
|
|
2481
|
-
"
|
|
2482
|
-
"
|
|
2483
|
-
"Switch rows use menuitemcheckbox semantics on the row; the nested ds-switch is an aria-hidden md presentation indicator.",
|
|
2484
|
-
"A swatch-picker section changes the popup to a non-modal dialog so its radio group and ordinary preference buttons keep valid nested semantics; Tab moves between its controls, then leaves and closes at the popup boundary.",
|
|
2485
|
-
"Use notification dots only as supplemental status and not as the sole indication of important information."
|
|
3672
|
+
"Always provide a localized textarea label and submit or stop action names.",
|
|
3673
|
+
"Shift plus Enter inserts a newline while Enter submits non-empty content.",
|
|
3674
|
+
"Streaming and error states remain perceivable without relying on icon shape alone."
|
|
2486
3675
|
],
|
|
2487
3676
|
"states": [
|
|
2488
|
-
"The
|
|
2489
|
-
"Use
|
|
2490
|
-
"
|
|
2491
|
-
"Arrays, objects, and element anchors must be assigned as JavaScript properties.",
|
|
2492
|
-
"Use a swatch-picker section for a small curated visual preference and apply dsSwatchSelect immediately without closing the popup; the legacy gradient-picker section and dsGradientSelect remain compatibility-only."
|
|
3677
|
+
"The owner controls draft value and transport state; the composer emits intent without performing transport.",
|
|
3678
|
+
"Use the tools slot for leading actions such as add and the actions slot for trailing actions such as dictation; the built-in submit or stop action remains last.",
|
|
3679
|
+
"The submit action defaults to brand for both agent and person-to-person conversations; change submitIntent only when the action consequence has a different semantic intent."
|
|
2493
3680
|
],
|
|
2494
3681
|
"responsiveBehavior": [
|
|
2495
|
-
"
|
|
2496
|
-
"Choose placement relative to the trigger and allow the component to clamp the popup to the viewport.",
|
|
2497
|
-
"Avoid fixed widths that exceed narrow viewports."
|
|
3682
|
+
"The textarea begins at two body-medium lines, grows one line at a time through six lines, and then scrolls internally."
|
|
2498
3683
|
],
|
|
2499
|
-
"frameworkCaveats": {
|
|
2500
|
-
"customElements": [
|
|
2501
|
-
"Assign items, sections, and HTMLElement anchors as properties after the element is defined."
|
|
2502
|
-
],
|
|
2503
|
-
"react": [
|
|
2504
|
-
"Pass arrays and objects as wrapper props and handle generated onDsSelect and onDsClose event props."
|
|
2505
|
-
],
|
|
2506
|
-
"angular": [
|
|
2507
|
-
"Use property bindings for arrays, objects, and anchors and event bindings for dsSelect and dsClose."
|
|
2508
|
-
]
|
|
2509
|
-
},
|
|
2510
3684
|
"references": [
|
|
2511
3685
|
{
|
|
2512
3686
|
"label": "Storybook examples",
|
|
2513
|
-
"path": "src/wc/components/
|
|
3687
|
+
"path": "src/wc/components/MessageComposer/MessageComposer.stories.ts"
|
|
2514
3688
|
},
|
|
2515
3689
|
{
|
|
2516
|
-
"label": "
|
|
2517
|
-
"path": "
|
|
3690
|
+
"label": "Scroller overlay composition",
|
|
3691
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
2518
3692
|
}
|
|
2519
3693
|
]
|
|
2520
3694
|
},
|
|
2521
3695
|
"props": {
|
|
2522
|
-
"
|
|
2523
|
-
"type": "
|
|
3696
|
+
"isInactive": {
|
|
3697
|
+
"type": "boolean",
|
|
2524
3698
|
"required": false
|
|
2525
3699
|
},
|
|
2526
|
-
"
|
|
2527
|
-
"type": "
|
|
3700
|
+
"label": {
|
|
3701
|
+
"type": "string",
|
|
2528
3702
|
"required": false
|
|
2529
3703
|
},
|
|
2530
|
-
"
|
|
2531
|
-
"type": "
|
|
3704
|
+
"placeholder": {
|
|
3705
|
+
"type": "string",
|
|
2532
3706
|
"required": false
|
|
2533
3707
|
},
|
|
2534
|
-
"
|
|
2535
|
-
"type": "
|
|
3708
|
+
"status": {
|
|
3709
|
+
"type": "MessageComposerStatus",
|
|
2536
3710
|
"required": false
|
|
2537
3711
|
},
|
|
2538
|
-
"
|
|
2539
|
-
"type": "
|
|
3712
|
+
"submitIntent": {
|
|
3713
|
+
"type": "ButtonFilledIntent",
|
|
2540
3714
|
"required": false
|
|
2541
3715
|
},
|
|
2542
|
-
"
|
|
3716
|
+
"value": {
|
|
3717
|
+
"type": "string",
|
|
3718
|
+
"required": false
|
|
3719
|
+
}
|
|
3720
|
+
},
|
|
3721
|
+
"events": [
|
|
3722
|
+
{
|
|
3723
|
+
"name": "dsInput",
|
|
3724
|
+
"detail": "string"
|
|
3725
|
+
},
|
|
3726
|
+
{
|
|
3727
|
+
"name": "dsStop",
|
|
3728
|
+
"detail": "void"
|
|
3729
|
+
},
|
|
3730
|
+
{
|
|
3731
|
+
"name": "dsSubmit",
|
|
3732
|
+
"detail": "{ text: string }"
|
|
3733
|
+
}
|
|
3734
|
+
],
|
|
3735
|
+
"slots": [],
|
|
3736
|
+
"exports": {
|
|
3737
|
+
"customElement": "ds-message-composer",
|
|
3738
|
+
"react": "DsMessageComposer",
|
|
3739
|
+
"angular": "DsMessageComposer"
|
|
3740
|
+
}
|
|
3741
|
+
},
|
|
3742
|
+
"dependencies": [
|
|
3743
|
+
"@ds-mo/ui",
|
|
3744
|
+
"@ds-mo/tokens"
|
|
3745
|
+
],
|
|
3746
|
+
"registryDependencies": [
|
|
3747
|
+
"button-filled"
|
|
3748
|
+
]
|
|
3749
|
+
},
|
|
3750
|
+
{
|
|
3751
|
+
"name": "message-scroller",
|
|
3752
|
+
"title": "MessageScroller",
|
|
3753
|
+
"description": "Focusable transcript scroller that follows the live edge only while the reader remains there.",
|
|
3754
|
+
"type": "registry:ui",
|
|
3755
|
+
"meta": {
|
|
3756
|
+
"library": "@ds-mo/ui",
|
|
3757
|
+
"distribution": "npm",
|
|
3758
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/message-scroller",
|
|
3759
|
+
"source": "src/wc/components/MessageScroller/MessageScroller.tsx",
|
|
3760
|
+
"intentStatus": "complete",
|
|
3761
|
+
"intent": {
|
|
3762
|
+
"audience": "general",
|
|
3763
|
+
"status": "experimental",
|
|
3764
|
+
"summary": "Focusable transcript scroller that follows the live edge only while the reader remains there.",
|
|
3765
|
+
"useWhen": [
|
|
3766
|
+
"Messages can append or stream and transcript position must remain respectful of reader intent."
|
|
3767
|
+
],
|
|
3768
|
+
"avoidWhen": [
|
|
3769
|
+
"Content is static prose without message navigation or live updates."
|
|
3770
|
+
],
|
|
3771
|
+
"commonlyComposedWith": [
|
|
3772
|
+
"component:ds-message",
|
|
3773
|
+
"component:ds-message-composer"
|
|
3774
|
+
],
|
|
3775
|
+
"patterns": [
|
|
3776
|
+
"pattern:conversation"
|
|
3777
|
+
],
|
|
3778
|
+
"accessibility": [
|
|
3779
|
+
"Give each transcript a concise localized label.",
|
|
3780
|
+
"New content is exposed through log semantics without stealing focus.",
|
|
3781
|
+
"The scroll-to-latest control remains keyboard accessible when follow behavior is released."
|
|
3782
|
+
],
|
|
3783
|
+
"states": [
|
|
3784
|
+
"Selection and transcript interaction release automatic following.",
|
|
3785
|
+
"Opening saved history, message jumps, and prepended history preserve deliberate position.",
|
|
3786
|
+
"The scroll-to-latest action is absent at the live edge, appears only after the reader moves away, and disappears again after returning to the newest message.",
|
|
3787
|
+
"Place a composer container in the overlay slot so messages scroll behind it; the scroller measures its live height, reserves matching transcript clearance, and keeps scroll-to-latest above it."
|
|
3788
|
+
],
|
|
3789
|
+
"responsiveBehavior": [
|
|
3790
|
+
"Transcript width is readable while the scroll region fills available height."
|
|
3791
|
+
],
|
|
3792
|
+
"references": [
|
|
3793
|
+
{
|
|
3794
|
+
"label": "Storybook examples",
|
|
3795
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
3796
|
+
}
|
|
3797
|
+
]
|
|
3798
|
+
},
|
|
3799
|
+
"props": {
|
|
3800
|
+
"autoFollow": {
|
|
2543
3801
|
"type": "boolean",
|
|
2544
3802
|
"required": false
|
|
2545
3803
|
},
|
|
2546
|
-
"
|
|
2547
|
-
"type": "MenuItemData[]",
|
|
2548
|
-
"required": false
|
|
2549
|
-
},
|
|
2550
|
-
"menuLabel": {
|
|
2551
|
-
"type": "string",
|
|
2552
|
-
"required": false
|
|
2553
|
-
},
|
|
2554
|
-
"menuWidth": {
|
|
2555
|
-
"type": "string | undefined",
|
|
2556
|
-
"required": false
|
|
2557
|
-
},
|
|
2558
|
-
"minWidth": {
|
|
2559
|
-
"type": "string | undefined",
|
|
2560
|
-
"required": false
|
|
2561
|
-
},
|
|
2562
|
-
"open": {
|
|
3804
|
+
"busy": {
|
|
2563
3805
|
"type": "boolean",
|
|
2564
3806
|
"required": false
|
|
2565
3807
|
},
|
|
2566
|
-
"
|
|
2567
|
-
"type": "
|
|
2568
|
-
"required": false
|
|
2569
|
-
},
|
|
2570
|
-
"side": {
|
|
2571
|
-
"type": "MenuSide",
|
|
3808
|
+
"defaultPosition": {
|
|
3809
|
+
"type": "MessageScrollerPosition",
|
|
2572
3810
|
"required": false
|
|
2573
3811
|
},
|
|
2574
|
-
"
|
|
2575
|
-
"type": "
|
|
3812
|
+
"messagesLabel": {
|
|
3813
|
+
"type": "string",
|
|
2576
3814
|
"required": false
|
|
2577
3815
|
}
|
|
2578
3816
|
},
|
|
2579
3817
|
"events": [
|
|
2580
3818
|
{
|
|
2581
|
-
"name": "
|
|
3819
|
+
"name": "dsReachStart",
|
|
2582
3820
|
"detail": "void"
|
|
2583
|
-
},
|
|
2584
|
-
{
|
|
2585
|
-
"name": "dsGradientSelect",
|
|
2586
|
-
"detail": "ShellGradientPreset"
|
|
2587
|
-
},
|
|
2588
|
-
{
|
|
2589
|
-
"name": "dsSelect",
|
|
2590
|
-
"detail": "MenuItemData"
|
|
2591
|
-
},
|
|
2592
|
-
{
|
|
2593
|
-
"name": "dsSwatchSelect",
|
|
2594
|
-
"detail": "string"
|
|
2595
3821
|
}
|
|
2596
3822
|
],
|
|
2597
3823
|
"slots": [],
|
|
2598
3824
|
"exports": {
|
|
2599
|
-
"customElement": "ds-
|
|
2600
|
-
"react": "
|
|
2601
|
-
"angular": "
|
|
3825
|
+
"customElement": "ds-message-scroller",
|
|
3826
|
+
"react": "DsMessageScroller",
|
|
3827
|
+
"angular": "DsMessageScroller"
|
|
2602
3828
|
}
|
|
2603
3829
|
},
|
|
2604
3830
|
"dependencies": [
|
|
@@ -2606,10 +3832,7 @@
|
|
|
2606
3832
|
"@ds-mo/tokens"
|
|
2607
3833
|
],
|
|
2608
3834
|
"registryDependencies": [
|
|
2609
|
-
"
|
|
2610
|
-
"swatch-picker",
|
|
2611
|
-
"switch",
|
|
2612
|
-
"text"
|
|
3835
|
+
"button-unfilled"
|
|
2613
3836
|
]
|
|
2614
3837
|
},
|
|
2615
3838
|
{
|
|
@@ -3024,6 +4247,270 @@
|
|
|
3024
4247
|
"text"
|
|
3025
4248
|
]
|
|
3026
4249
|
},
|
|
4250
|
+
{
|
|
4251
|
+
"name": "panel-tool-header",
|
|
4252
|
+
"title": "PanelToolHeader",
|
|
4253
|
+
"description": "Canonical left-aligned PanelTools header with an optional leading navigation or dismiss action and application-owned trailing icon actions.",
|
|
4254
|
+
"type": "registry:ui",
|
|
4255
|
+
"meta": {
|
|
4256
|
+
"library": "@ds-mo/ui",
|
|
4257
|
+
"distribution": "npm",
|
|
4258
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/panel-tool-header",
|
|
4259
|
+
"source": "src/wc/components/PanelToolHeader/PanelToolHeader.tsx",
|
|
4260
|
+
"intentStatus": "complete",
|
|
4261
|
+
"intent": {
|
|
4262
|
+
"audience": "general",
|
|
4263
|
+
"status": "experimental",
|
|
4264
|
+
"summary": "Canonical left-aligned PanelTools header with an optional leading navigation or dismiss action and application-owned trailing icon actions.",
|
|
4265
|
+
"useWhen": [
|
|
4266
|
+
"PanelTools needs its one shared root or detail header.",
|
|
4267
|
+
"A tool header needs a title with optional Back or Close navigation, menu, fullscreen, or other compact icon actions."
|
|
4268
|
+
],
|
|
4269
|
+
"avoidWhen": [
|
|
4270
|
+
"Rendering inside a PanelTools tool body; PanelTools already composes this canonical header above the body.",
|
|
4271
|
+
"The header belongs to page content."
|
|
4272
|
+
],
|
|
4273
|
+
"commonlyComposedWith": [
|
|
4274
|
+
"component:ds-button-unfilled"
|
|
4275
|
+
],
|
|
4276
|
+
"accessibility": [
|
|
4277
|
+
"Leading navigation or dismiss actions and trailing icon actions require concise localized names.",
|
|
4278
|
+
"The visible heading names the active panel or subview."
|
|
4279
|
+
],
|
|
4280
|
+
"states": [
|
|
4281
|
+
"The title remains left aligned whether the header has no actions, Back, one trailing action, or several trailing actions.",
|
|
4282
|
+
"Leading and trailing control zones never shrink; only the title consumes and truncates within the remaining width, with a fixed 4px gap between zones.",
|
|
4283
|
+
"Header chrome text is not selectable; actions remain keyboard focusable and interactive.",
|
|
4284
|
+
"Adjacent trailing actions keep the shared 4px control gap in drawer and fullscreen presentations.",
|
|
4285
|
+
"When fullscreen and overflow actions appear together, author fullscreen before overflow so Ellipses remains the rightmost action.",
|
|
4286
|
+
"PanelTools supplies application-owned actions and relays their ids through its shared dsHeaderAction event."
|
|
4287
|
+
],
|
|
4288
|
+
"responsiveBehavior": [
|
|
4289
|
+
"The title truncates between optional leading navigation and trailing action zones."
|
|
4290
|
+
],
|
|
4291
|
+
"references": [
|
|
4292
|
+
{
|
|
4293
|
+
"label": "Standalone examples",
|
|
4294
|
+
"path": "src/wc/components/PanelToolHeader/PanelToolHeader.stories.ts"
|
|
4295
|
+
}
|
|
4296
|
+
]
|
|
4297
|
+
},
|
|
4298
|
+
"props": {
|
|
4299
|
+
"actions": {
|
|
4300
|
+
"type": "PanelToolsHeaderAction[]",
|
|
4301
|
+
"required": false
|
|
4302
|
+
},
|
|
4303
|
+
"backAriaLabel": {
|
|
4304
|
+
"type": "string",
|
|
4305
|
+
"required": false
|
|
4306
|
+
},
|
|
4307
|
+
"backIcon": {
|
|
4308
|
+
"type": "string",
|
|
4309
|
+
"required": false
|
|
4310
|
+
},
|
|
4311
|
+
"heading": {
|
|
4312
|
+
"type": "string",
|
|
4313
|
+
"required": false
|
|
4314
|
+
},
|
|
4315
|
+
"menuAriaLabel": {
|
|
4316
|
+
"type": "string",
|
|
4317
|
+
"required": false
|
|
4318
|
+
},
|
|
4319
|
+
"menuControls": {
|
|
4320
|
+
"type": "string | undefined",
|
|
4321
|
+
"required": false
|
|
4322
|
+
},
|
|
4323
|
+
"menuExpanded": {
|
|
4324
|
+
"type": "boolean",
|
|
4325
|
+
"required": false
|
|
4326
|
+
},
|
|
4327
|
+
"menuTriggerId": {
|
|
4328
|
+
"type": "string",
|
|
4329
|
+
"required": false
|
|
4330
|
+
},
|
|
4331
|
+
"showBack": {
|
|
4332
|
+
"type": "boolean",
|
|
4333
|
+
"required": false
|
|
4334
|
+
},
|
|
4335
|
+
"showMenu": {
|
|
4336
|
+
"type": "boolean",
|
|
4337
|
+
"required": false
|
|
4338
|
+
}
|
|
4339
|
+
},
|
|
4340
|
+
"events": [
|
|
4341
|
+
{
|
|
4342
|
+
"name": "dsAction",
|
|
4343
|
+
"detail": "{ id: string; originalEvent: MouseEvent }"
|
|
4344
|
+
},
|
|
4345
|
+
{
|
|
4346
|
+
"name": "dsBack",
|
|
4347
|
+
"detail": "MouseEvent"
|
|
4348
|
+
},
|
|
4349
|
+
{
|
|
4350
|
+
"name": "dsMenuToggle",
|
|
4351
|
+
"detail": "MouseEvent"
|
|
4352
|
+
}
|
|
4353
|
+
],
|
|
4354
|
+
"slots": [],
|
|
4355
|
+
"exports": {
|
|
4356
|
+
"customElement": "ds-panel-tool-header",
|
|
4357
|
+
"react": "DsPanelToolHeader",
|
|
4358
|
+
"angular": "DsPanelToolHeader"
|
|
4359
|
+
}
|
|
4360
|
+
},
|
|
4361
|
+
"dependencies": [
|
|
4362
|
+
"@ds-mo/ui",
|
|
4363
|
+
"@ds-mo/tokens"
|
|
4364
|
+
],
|
|
4365
|
+
"registryDependencies": [
|
|
4366
|
+
"button-unfilled",
|
|
4367
|
+
"text"
|
|
4368
|
+
]
|
|
4369
|
+
},
|
|
4370
|
+
{
|
|
4371
|
+
"name": "panel-tool-search",
|
|
4372
|
+
"title": "PanelToolSearch",
|
|
4373
|
+
"description": "Transparent search row for the top of a PanelTools product view, with a fixed 48px allocation around the standard md search control and an optional filter-menu trigger.",
|
|
4374
|
+
"type": "registry:ui",
|
|
4375
|
+
"meta": {
|
|
4376
|
+
"library": "@ds-mo/ui",
|
|
4377
|
+
"distribution": "npm",
|
|
4378
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/panel-tool-search",
|
|
4379
|
+
"source": "src/wc/components/PanelToolSearch/PanelToolSearch.tsx",
|
|
4380
|
+
"intentStatus": "complete",
|
|
4381
|
+
"intent": {
|
|
4382
|
+
"audience": "general",
|
|
4383
|
+
"status": "experimental",
|
|
4384
|
+
"summary": "Transparent search row for the top of a PanelTools product view, with a fixed 48px allocation around the standard md search control and an optional filter-menu trigger.",
|
|
4385
|
+
"useWhen": [
|
|
4386
|
+
"A PanelTools base view filters or searches the tool's own content.",
|
|
4387
|
+
"Several tool products need the same search-row geometry directly below the shared PanelTools header.",
|
|
4388
|
+
"The product needs a compact filter menu next to search while keeping its filter choices and matching policy application-owned."
|
|
4389
|
+
],
|
|
4390
|
+
"avoidWhen": [
|
|
4391
|
+
"The search belongs inside a Select or SelectMulti popup; use that component's searchable behavior.",
|
|
4392
|
+
"A form needs a labelled standalone field; compose ds-input inside ds-field instead."
|
|
4393
|
+
],
|
|
4394
|
+
"commonlyComposedWith": [
|
|
4395
|
+
"component:ds-panel-tools",
|
|
4396
|
+
"component:ds-conversation-list",
|
|
4397
|
+
"component:ds-input"
|
|
4398
|
+
],
|
|
4399
|
+
"accessibility": [
|
|
4400
|
+
"Provide an aria-label that names the searched domain, such as Search agent chats or Search messages.",
|
|
4401
|
+
"The standard search clear action restores focus and emits both the empty query and dsClear.",
|
|
4402
|
+
"When showFilter is enabled, provide stable filterTriggerId and filterControls values, synchronize filterExpanded with the controlled menu, and restore focus after selection."
|
|
4403
|
+
],
|
|
4404
|
+
"states": [
|
|
4405
|
+
"The row is always 48px high with 8px outer padding and a complete md search recipe: 32px control, text-body-medium at 14px/20px, and a 20px md search icon.",
|
|
4406
|
+
"The search icon stays foreground-secondary at rest, hover, focus, active, and while the query is filled.",
|
|
4407
|
+
"The row and control surface remain transparent so the AppShell chrome wash is visible behind them.",
|
|
4408
|
+
"The row divider remains the same tertiary 1px boundary while the input is focused because it belongs to the 48px container rather than the input control.",
|
|
4409
|
+
"With filtering enabled, the md search control, decorative vertical divider, and borderless md Filter action are separated by 8px; filterActive promotes only the trigger foreground without adding a selected fill."
|
|
4410
|
+
],
|
|
4411
|
+
"responsiveBehavior": [
|
|
4412
|
+
"The row fills the available drawer or fullscreen width, allows its search region to shrink inside a 300px drawer without pushing the filter trigger under the tool rail, and does not reduce its control below md density."
|
|
4413
|
+
],
|
|
4414
|
+
"frameworkCaveats": {
|
|
4415
|
+
"customElements": [
|
|
4416
|
+
"Listen for dsChange to receive the current string query and dsClear when the clear action is used.",
|
|
4417
|
+
"Listen for dsFilterToggle and pair the trigger with an externally controlled ds-menu; product-specific filter labels and filtering remain outside this component."
|
|
4418
|
+
],
|
|
4419
|
+
"react": [
|
|
4420
|
+
"Use DsPanelToolSearch, bind value for controlled state, and handle onDsChange.",
|
|
4421
|
+
"Bind the optional filter trigger state and connect onDsFilterToggle to a controlled DsMenu."
|
|
4422
|
+
],
|
|
4423
|
+
"angular": [
|
|
4424
|
+
"Import DsPanelToolSearch and bind value as a property; this search composition is not a form value accessor.",
|
|
4425
|
+
"Bind showFilter, filterExpanded, and filterActive, then connect dsFilterToggle to a product-owned ds-menu."
|
|
4426
|
+
]
|
|
4427
|
+
},
|
|
4428
|
+
"references": [
|
|
4429
|
+
{
|
|
4430
|
+
"label": "Storybook examples",
|
|
4431
|
+
"path": "src/wc/components/PanelToolSearch/PanelToolSearch.stories.ts"
|
|
4432
|
+
}
|
|
4433
|
+
]
|
|
4434
|
+
},
|
|
4435
|
+
"props": {
|
|
4436
|
+
"ariaLabel": {
|
|
4437
|
+
"type": "string",
|
|
4438
|
+
"required": false
|
|
4439
|
+
},
|
|
4440
|
+
"controls": {
|
|
4441
|
+
"type": "string | undefined",
|
|
4442
|
+
"required": false
|
|
4443
|
+
},
|
|
4444
|
+
"filterActive": {
|
|
4445
|
+
"type": "boolean",
|
|
4446
|
+
"required": false
|
|
4447
|
+
},
|
|
4448
|
+
"filterAriaLabel": {
|
|
4449
|
+
"type": "string",
|
|
4450
|
+
"required": false
|
|
4451
|
+
},
|
|
4452
|
+
"filterControls": {
|
|
4453
|
+
"type": "string | undefined",
|
|
4454
|
+
"required": false
|
|
4455
|
+
},
|
|
4456
|
+
"filterExpanded": {
|
|
4457
|
+
"type": "boolean",
|
|
4458
|
+
"required": false
|
|
4459
|
+
},
|
|
4460
|
+
"filterTriggerId": {
|
|
4461
|
+
"type": "string",
|
|
4462
|
+
"required": false
|
|
4463
|
+
},
|
|
4464
|
+
"isInactive": {
|
|
4465
|
+
"type": "boolean",
|
|
4466
|
+
"required": false
|
|
4467
|
+
},
|
|
4468
|
+
"placeholder": {
|
|
4469
|
+
"type": "string",
|
|
4470
|
+
"required": false
|
|
4471
|
+
},
|
|
4472
|
+
"showFilter": {
|
|
4473
|
+
"type": "boolean",
|
|
4474
|
+
"required": false
|
|
4475
|
+
},
|
|
4476
|
+
"value": {
|
|
4477
|
+
"type": "string",
|
|
4478
|
+
"required": false
|
|
4479
|
+
}
|
|
4480
|
+
},
|
|
4481
|
+
"events": [
|
|
4482
|
+
{
|
|
4483
|
+
"name": "dsChange",
|
|
4484
|
+
"detail": "string"
|
|
4485
|
+
},
|
|
4486
|
+
{
|
|
4487
|
+
"name": "dsClear",
|
|
4488
|
+
"detail": "void"
|
|
4489
|
+
},
|
|
4490
|
+
{
|
|
4491
|
+
"name": "dsFilterToggle",
|
|
4492
|
+
"detail": "MouseEvent"
|
|
4493
|
+
}
|
|
4494
|
+
],
|
|
4495
|
+
"slots": [],
|
|
4496
|
+
"exports": {
|
|
4497
|
+
"customElement": "ds-panel-tool-search",
|
|
4498
|
+
"react": "DsPanelToolSearch",
|
|
4499
|
+
"angular": "DsPanelToolSearch"
|
|
4500
|
+
}
|
|
4501
|
+
},
|
|
4502
|
+
"dependencies": [
|
|
4503
|
+
"@ds-mo/ui",
|
|
4504
|
+
"@ds-mo/tokens",
|
|
4505
|
+
"@ds-mo/icons"
|
|
4506
|
+
],
|
|
4507
|
+
"registryDependencies": [
|
|
4508
|
+
"button-unfilled",
|
|
4509
|
+
"divider",
|
|
4510
|
+
"icon",
|
|
4511
|
+
"text"
|
|
4512
|
+
]
|
|
4513
|
+
},
|
|
3027
4514
|
{
|
|
3028
4515
|
"name": "panel-tools",
|
|
3029
4516
|
"title": "PanelTools",
|
|
@@ -3092,21 +4579,32 @@
|
|
|
3092
4579
|
"The drawer starts closed, remains open across ordinary route changes, and retains every mounted tool's independent conversation, query, scroll, and work state.",
|
|
3093
4580
|
"When storageKey is set, persist only the last active tool in this browser and still restore the drawer closed after reload.",
|
|
3094
4581
|
"The application owns unread state; opening Messages, Agents, Stacks, or Activity does not automatically clear its notification dot.",
|
|
4582
|
+
"PanelTools owns the one visible header above every drawer tool view and above fullscreen views using the default shared header mode. Slotted tool content must not render a second header unless the conversation product explicitly opts into split fullscreen headers.",
|
|
4583
|
+
"PanelTools composes ds-panel-tool-header as its canonical left-aligned header implementation so standalone header stories and shell rendering cannot diverge.",
|
|
4584
|
+
"Each tool supplies its current header title, base-versus-detail Back state, and right-side actions through the headers property. Base views omit Back; deeper views expose Back and update the same header in place.",
|
|
4585
|
+
"Header Back and action events express intent only; the owning tool changes product navigation, menus, and data state. PanelTools keeps the final header action exactly 8px from the drawer edge.",
|
|
4586
|
+
"Menus opened from a right-side header action use PANEL_TOOLS_HEADER_MENU_PLACEMENT: bottom/end choice-cell alignment and a 12px side offset, placing the popup 4px below the 48px header while aligning the final menu item edge with the trigger.",
|
|
4587
|
+
"Tool view roots stay transparent so AppShell's chrome wash remains visible; only explicitly designed child surfaces introduce a fill.",
|
|
4588
|
+
"Tools with search compose ds-panel-tool-search immediately below the shared header. Its 48px row always contains the md search control and must not be reduced to sm or xs.",
|
|
3095
4589
|
"If an active optional tool becomes unavailable, PanelTools closes the drawer, clears activeTool, and emits its deselection.",
|
|
3096
4590
|
"Use isInactive only for a temporarily unavailable visible tool; omit tools the user is not authorized to access.",
|
|
3097
|
-
"The application owns slotted tool products and data while PanelTools owns rail ordering, drawer selection, open state, motion, and shell events."
|
|
4591
|
+
"The application owns slotted tool products and data while PanelTools owns rail ordering, drawer selection, open state, motion, and shell events.",
|
|
4592
|
+
"Opening and closing clip an already-rendered fixed-width surface. Header and tool content remain fully opaque and retained during width motion; transition completion is accepted only at the measured terminal clip width, after which the closed surface becomes inert and paint-skipped.",
|
|
4593
|
+
"Entering and exiting fullscreen snaps without borrowing the drawer open or close animation.",
|
|
4594
|
+
"When fullscreenHeaderMode is split, PanelTools suppresses only its fullscreen shared header. The application renders exactly two canonical ds-panel-tool-header instances: a tool-title/list-actions header over the 300px history pane and a chat-title/Exit-fullscreen/chat-actions header over the detail pane. The detail header omits Back because the list remains visible."
|
|
3098
4595
|
],
|
|
3099
4596
|
"responsiveBehavior": [
|
|
3100
|
-
"
|
|
3101
|
-
"
|
|
3102
|
-
"AppShell owns the responsive drawer-width variable and fixed breakpoint policy; consumers must not hardcode alternate drawer widths.",
|
|
4597
|
+
"The open drawer reduces main-content width and uses --dimension-panel-width-xs (300px) on every supported desktop and tablet viewport.",
|
|
4598
|
+
"AppShell owns the fixed drawer-width variable; consumers must not hardcode alternate drawer widths.",
|
|
3103
4599
|
"Below 768px, do not reuse desktop PanelTools: future AppShell mobile composition uses a bottom bar for Search, Agents, Notifications, and Stacks, while Help moves into mobile primary navigation.",
|
|
3104
4600
|
"Keep named-slot content mounted while tools switch or the drawer closes so users can return to in-progress global work.",
|
|
4601
|
+
"Conversation products may use fullscreenHeaderMode split for a 300px history rail beside a flexible detail pane, each with its own canonical header; the application owns that internal split layout.",
|
|
3105
4602
|
"Use fixed drawer widths for now; do not add user resizing or width persistence."
|
|
3106
4603
|
],
|
|
3107
4604
|
"frameworkCaveats": {
|
|
3108
4605
|
"customElements": [
|
|
3109
4606
|
"Assign items as a JavaScript property for structured data; items-json is the string fallback.",
|
|
4607
|
+
"Assign headers as a JavaScript property and replace its object identity whenever an active tool changes title, depth, or actions.",
|
|
3110
4608
|
"Keep PanelTools mounted at AppShell scope across route changes and provide each product through its matching named slot."
|
|
3111
4609
|
],
|
|
3112
4610
|
"react": [
|
|
@@ -3115,6 +4613,7 @@
|
|
|
3115
4613
|
],
|
|
3116
4614
|
"angular": [
|
|
3117
4615
|
"Import DsPanelTools from @ds-mo/ui/angular/ds-panel-tools and bind items as a property.",
|
|
4616
|
+
"Bind headers as a replaced object and route dsHeaderBack and dsHeaderAction to the active tool owner.",
|
|
3118
4617
|
"Keep the component in the persistent shell layout rather than recreating it in routed page components."
|
|
3119
4618
|
]
|
|
3120
4619
|
},
|
|
@@ -3138,6 +4637,18 @@
|
|
|
3138
4637
|
"type": "PanelToolsToolId | ''",
|
|
3139
4638
|
"required": false
|
|
3140
4639
|
},
|
|
4640
|
+
"fullscreenHeaderMode": {
|
|
4641
|
+
"type": "'shared' | 'split'",
|
|
4642
|
+
"required": false
|
|
4643
|
+
},
|
|
4644
|
+
"headers": {
|
|
4645
|
+
"type": "PanelToolsHeaders",
|
|
4646
|
+
"required": false
|
|
4647
|
+
},
|
|
4648
|
+
"headersJson": {
|
|
4649
|
+
"type": "string",
|
|
4650
|
+
"required": false
|
|
4651
|
+
},
|
|
3141
4652
|
"items": {
|
|
3142
4653
|
"type": "PanelToolsItem[]",
|
|
3143
4654
|
"required": false
|
|
@@ -3150,6 +4661,10 @@
|
|
|
3150
4661
|
"type": "boolean",
|
|
3151
4662
|
"required": false
|
|
3152
4663
|
},
|
|
4664
|
+
"presentation": {
|
|
4665
|
+
"type": "'drawer' | 'fullscreen'",
|
|
4666
|
+
"required": false
|
|
4667
|
+
},
|
|
3153
4668
|
"storageKey": {
|
|
3154
4669
|
"type": "string",
|
|
3155
4670
|
"required": false
|
|
@@ -3172,6 +4687,18 @@
|
|
|
3172
4687
|
"name": "dsChromeTransitionStart",
|
|
3173
4688
|
"detail": "ChromeTransitionDetail"
|
|
3174
4689
|
},
|
|
4690
|
+
{
|
|
4691
|
+
"name": "dsHeaderAction",
|
|
4692
|
+
"detail": "{\n tool: PanelToolsToolId;\n id: string;\n }"
|
|
4693
|
+
},
|
|
4694
|
+
{
|
|
4695
|
+
"name": "dsHeaderBack",
|
|
4696
|
+
"detail": "{\n tool: PanelToolsToolId;\n }"
|
|
4697
|
+
},
|
|
4698
|
+
{
|
|
4699
|
+
"name": "dsPresentationChange",
|
|
4700
|
+
"detail": "{\n presentation: 'drawer' | 'fullscreen';\n }"
|
|
4701
|
+
},
|
|
3175
4702
|
{
|
|
3176
4703
|
"name": "dsToolChange",
|
|
3177
4704
|
"detail": "{\n id: PanelToolsToolId;\n selected: boolean;\n }"
|
|
@@ -3190,7 +4717,7 @@
|
|
|
3190
4717
|
],
|
|
3191
4718
|
"registryDependencies": [
|
|
3192
4719
|
"button-unfilled",
|
|
3193
|
-
"
|
|
4720
|
+
"panel-tool-header",
|
|
3194
4721
|
"tooltip"
|
|
3195
4722
|
]
|
|
3196
4723
|
},
|