@ds-mo/ui 9.1.0 → 9.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -79
- package/dist/.build-stamp +1 -1
- package/dist/agent-patterns.json +165 -1
- package/dist/agent.json +2131 -639
- 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 +6 -1
- package/dist/angular/ds-menu.js +7 -4
- 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-nav.d.ts +1 -1
- package/dist/angular/ds-panel-nav.js +3 -3
- 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-tag.js.map +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-HBIxvS5C.js → p-B1pWGQn1.js} +2 -2
- package/dist/components/p-BBu_Svz7.js +2 -0
- package/dist/components/p-BBu_Svz7.js.map +1 -0
- package/dist/components/p-BHpWYKtP.js +2 -0
- package/dist/components/p-BHpWYKtP.js.map +1 -0
- package/dist/components/{p-KRGBGTu5.js → p-BO6C8abO.js} +2 -2
- package/dist/components/p-BRfOCc_h.js +2 -0
- package/dist/components/p-BRfOCc_h.js.map +1 -0
- 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-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-CBYuvZKM.js +2 -0
- package/dist/components/p-CBYuvZKM.js.map +1 -0
- package/dist/components/{p-CZ9wemOA.js → p-CJlgONwR.js} +2 -2
- package/dist/components/p-CKaJx0IX.js +2 -0
- package/dist/components/p-CKaJx0IX.js.map +1 -0
- package/dist/components/p-CWNdl52Y.js +2 -0
- package/dist/components/p-CWNdl52Y.js.map +1 -0
- package/dist/components/{p-DT2MK8Kt.js → p-CblAABEo.js} +2 -2
- package/dist/components/p-CeFBA7Dx.js +2 -0
- package/dist/components/p-CeFBA7Dx.js.map +1 -0
- package/dist/components/p-CiKGqsA2.js +2 -0
- package/dist/components/{p-BLzivrE3.js.map → p-CiKGqsA2.js.map} +1 -1
- package/dist/components/p-Ci_nVk5P.js +2 -0
- package/dist/components/p-Ci_nVk5P.js.map +1 -0
- package/dist/components/p-Cijzn3YQ.js +2 -0
- package/dist/components/p-Cijzn3YQ.js.map +1 -0
- package/dist/components/{p-BbV68F23.js → p-CiwdnKKp.js} +2 -2
- package/dist/components/p-DFxqk71w.js +2 -0
- package/dist/components/p-DFxqk71w.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-DaQ0ZE_V.js +2 -0
- package/dist/components/p-DaQ0ZE_V.js.map +1 -0
- package/dist/components/p-DiooIO2B.js +2 -0
- package/dist/components/p-DiooIO2B.js.map +1 -0
- package/dist/components/p-Dj5MejHv.js +2 -0
- package/dist/components/p-Dj5MejHv.js.map +1 -0
- package/dist/components/{p-B-zhgAvL.js → p-DnMCRAwx.js} +2 -2
- package/dist/components/{p-DyZj3k9S.js → p-Dst-OliP.js} +2 -2
- package/dist/components/p-Dst-OliP.js.map +1 -0
- package/dist/components/p-T0Mzhv3-.js +2 -0
- package/dist/components/p-T0Mzhv3-.js.map +1 -0
- 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-kezp2_Xu.js +2 -0
- package/dist/components/p-kezp2_Xu.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-C7RObioO.js → p-xB0GPG3-.js} +2 -2
- package/dist/docs/components.json +8294 -4079
- 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 +154 -0
- package/dist/mcp-data/registry/bar-nav.json +2 -2
- package/dist/mcp-data/registry/button-unfilled.json +2 -2
- package/dist/mcp-data/registry/code-block.json +150 -0
- package/dist/mcp-data/registry/conversation-list-item.json +283 -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 +43 -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 +20 -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 +2159 -616
- package/dist/mcp-data/registry/select.json +1 -1
- package/dist/mcp-data/registry/slider.json +4 -4
- package/dist/mcp-data/registry/switch.json +1 -1
- package/dist/mcp-data/registry/tab-group.json +2 -2
- package/dist/mcp-data/registry/tag.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-menu.d.ts +1 -0
- package/dist/react/ds-menu.js +1 -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 +11 -0
- package/dist/types/components/BarNav/BarNav.d.ts +2 -0
- package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +2 -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 +24 -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 +9 -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 +41 -0
- package/dist/types/components/PanelNav/PanelNav.d.ts +5 -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 +1229 -14
- package/dist/types/shell/index.d.ts +1 -1
- package/dist/types/utils/choice-list-parts.d.ts +4 -1
- package/package.json +11 -11
- package/dist/components/p-BLzivrE3.js +0 -2
- package/dist/components/p-C7UFYvsO.js +0 -2
- package/dist/components/p-C7UFYvsO.js.map +0 -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-DyZj3k9S.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-KRGBGTu5.js.map → p-BO6C8abO.js.map} +0 -0
- /package/dist/components/{p-CZ9wemOA.js.map → p-CJlgONwR.js.map} +0 -0
- /package/dist/components/{p-DT2MK8Kt.js.map → p-CblAABEo.js.map} +0 -0
- /package/dist/components/{p-BbV68F23.js.map → p-CiwdnKKp.js.map} +0 -0
- /package/dist/components/{p-B-zhgAvL.js.map → p-DnMCRAwx.js.map} +0 -0
- /package/dist/components/{p-C7RObioO.js.map → p-xB0GPG3-.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,167 @@
|
|
|
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
|
+
"iconColor": {
|
|
605
|
+
"type": "IconColor",
|
|
606
|
+
"required": false
|
|
607
|
+
},
|
|
608
|
+
"label": {
|
|
609
|
+
"type": "string | undefined",
|
|
610
|
+
"required": false
|
|
611
|
+
}
|
|
612
|
+
},
|
|
613
|
+
"events": [],
|
|
614
|
+
"slots": [],
|
|
615
|
+
"exports": {
|
|
616
|
+
"customElement": "ds-avatar",
|
|
617
|
+
"react": "DsAvatar",
|
|
618
|
+
"angular": "DsAvatar"
|
|
619
|
+
}
|
|
620
|
+
},
|
|
621
|
+
"dependencies": [
|
|
622
|
+
"@ds-mo/ui",
|
|
623
|
+
"@ds-mo/tokens",
|
|
624
|
+
"@ds-mo/icons"
|
|
625
|
+
],
|
|
626
|
+
"registryDependencies": [
|
|
627
|
+
"icon"
|
|
628
|
+
]
|
|
629
|
+
},
|
|
630
|
+
{
|
|
631
|
+
"name": "badge",
|
|
632
|
+
"title": "Badge",
|
|
633
|
+
"description": "Non-interactive brand counter or dot that supplements an owning control or label with unread notification information.",
|
|
634
|
+
"type": "registry:ui",
|
|
635
|
+
"meta": {
|
|
636
|
+
"library": "@ds-mo/ui",
|
|
637
|
+
"distribution": "npm",
|
|
638
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/badge",
|
|
639
|
+
"source": "src/wc/components/Badge/Badge.tsx",
|
|
640
|
+
"intentStatus": "complete",
|
|
641
|
+
"intent": {
|
|
642
|
+
"audience": "general",
|
|
643
|
+
"status": "stable",
|
|
644
|
+
"summary": "Non-interactive brand counter or dot that supplements an owning control or label with unread notification information.",
|
|
645
|
+
"useWhen": [
|
|
646
|
+
"An existing control, navigation item, or label needs a compact unread notification count.",
|
|
647
|
+
"An owning element needs a small visual dot indicating that supplemental notification information exists.",
|
|
648
|
+
"When the badge overlaps an icon or content, the immediate backing surface can be identified so its separation ring matches."
|
|
649
|
+
],
|
|
650
|
+
"avoidWhen": [
|
|
651
|
+
"The status must stand alone without an owning label or control.",
|
|
169
652
|
"The mark needs semantic positive, caution, negative, or neutral color; Badge intentionally uses one brand treatment.",
|
|
170
653
|
"The compact content is metadata or taxonomy; use Tag or Chip according to whether it is removable.",
|
|
171
654
|
"The badge itself would receive pointer or keyboard interaction; put interaction on the owning control."
|
|
@@ -1629,339 +2112,235 @@
|
|
|
1629
2112
|
]
|
|
1630
2113
|
},
|
|
1631
2114
|
{
|
|
1632
|
-
"name": "
|
|
1633
|
-
"title": "
|
|
1634
|
-
"description": "
|
|
2115
|
+
"name": "code-block",
|
|
2116
|
+
"title": "CodeBlock",
|
|
2117
|
+
"description": "Scrollable monospace code surface with optional language or filename context and copy action.",
|
|
1635
2118
|
"type": "registry:ui",
|
|
1636
2119
|
"meta": {
|
|
1637
2120
|
"library": "@ds-mo/ui",
|
|
1638
2121
|
"distribution": "npm",
|
|
1639
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
1640
|
-
"source": "src/wc/components/
|
|
2122
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/code-block",
|
|
2123
|
+
"source": "src/wc/components/CodeBlock/CodeBlock.tsx",
|
|
1641
2124
|
"intentStatus": "complete",
|
|
1642
2125
|
"intent": {
|
|
1643
2126
|
"audience": "general",
|
|
1644
|
-
"status": "
|
|
1645
|
-
"summary": "
|
|
2127
|
+
"status": "experimental",
|
|
2128
|
+
"summary": "Scrollable monospace code surface with optional language or filename context and copy action.",
|
|
1646
2129
|
"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."
|
|
2130
|
+
"A message or document displays fenced code that readers may copy."
|
|
1650
2131
|
],
|
|
1651
2132
|
"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
|
-
}
|
|
2133
|
+
"A live editor, terminal, diff viewer, or syntax-highlighting environment is required."
|
|
1668
2134
|
],
|
|
1669
2135
|
"commonlyComposedWith": [
|
|
1670
|
-
"component:ds-
|
|
1671
|
-
"component:ds-
|
|
1672
|
-
"component:ds-panel-sub-nav"
|
|
2136
|
+
"component:ds-markdown",
|
|
2137
|
+
"component:ds-button-unfilled"
|
|
1673
2138
|
],
|
|
1674
2139
|
"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."
|
|
2140
|
+
"The copy action has explicit status wording and the code remains selectable text.",
|
|
2141
|
+
"Language and filename labels supplement rather than replace the code content."
|
|
1685
2142
|
],
|
|
1686
2143
|
"responsiveBehavior": [
|
|
1687
|
-
"
|
|
1688
|
-
"Divider does not infer layout direction or hide itself responsively."
|
|
2144
|
+
"Long lines scroll horizontally and do not widen the owning transcript."
|
|
1689
2145
|
],
|
|
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
2146
|
"references": [
|
|
1702
2147
|
{
|
|
1703
2148
|
"label": "Storybook examples",
|
|
1704
|
-
"path": "src/wc/components/
|
|
2149
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
1705
2150
|
}
|
|
1706
2151
|
]
|
|
1707
2152
|
},
|
|
1708
2153
|
"props": {
|
|
1709
|
-
"
|
|
1710
|
-
"type": "
|
|
1711
|
-
"required": false
|
|
1712
|
-
},
|
|
1713
|
-
"inset": {
|
|
1714
|
-
"type": "DividerInset",
|
|
1715
|
-
"required": false
|
|
1716
|
-
},
|
|
1717
|
-
"length": {
|
|
1718
|
-
"type": "DividerLength",
|
|
2154
|
+
"code": {
|
|
2155
|
+
"type": "string",
|
|
1719
2156
|
"required": false
|
|
1720
2157
|
},
|
|
1721
|
-
"
|
|
1722
|
-
"type": "
|
|
2158
|
+
"filename": {
|
|
2159
|
+
"type": "string",
|
|
1723
2160
|
"required": false
|
|
1724
2161
|
},
|
|
1725
|
-
"
|
|
1726
|
-
"type": "
|
|
2162
|
+
"language": {
|
|
2163
|
+
"type": "string",
|
|
1727
2164
|
"required": false
|
|
1728
2165
|
}
|
|
1729
2166
|
},
|
|
1730
2167
|
"events": [],
|
|
1731
2168
|
"slots": [],
|
|
1732
2169
|
"exports": {
|
|
1733
|
-
"customElement": "ds-
|
|
1734
|
-
"react": "
|
|
1735
|
-
"angular": "
|
|
2170
|
+
"customElement": "ds-code-block",
|
|
2171
|
+
"react": "DsCodeBlock",
|
|
2172
|
+
"angular": "DsCodeBlock"
|
|
1736
2173
|
}
|
|
1737
2174
|
},
|
|
1738
2175
|
"dependencies": [
|
|
1739
2176
|
"@ds-mo/ui",
|
|
1740
2177
|
"@ds-mo/tokens"
|
|
1741
2178
|
],
|
|
1742
|
-
"registryDependencies": [
|
|
2179
|
+
"registryDependencies": [
|
|
2180
|
+
"button-unfilled",
|
|
2181
|
+
"text"
|
|
2182
|
+
]
|
|
1743
2183
|
},
|
|
1744
2184
|
{
|
|
1745
|
-
"name": "
|
|
1746
|
-
"title": "
|
|
1747
|
-
"description": "
|
|
2185
|
+
"name": "conversation-list",
|
|
2186
|
+
"title": "ConversationList",
|
|
2187
|
+
"description": "Scrollable conversation-list region with dedicated empty and floating-action placement.",
|
|
1748
2188
|
"type": "registry:ui",
|
|
1749
2189
|
"meta": {
|
|
1750
2190
|
"library": "@ds-mo/ui",
|
|
1751
2191
|
"distribution": "npm",
|
|
1752
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
1753
|
-
"source": "src/wc/components/
|
|
2192
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/conversation-list",
|
|
2193
|
+
"source": "src/wc/components/ConversationList/ConversationList.tsx",
|
|
1754
2194
|
"intentStatus": "complete",
|
|
1755
2195
|
"intent": {
|
|
1756
2196
|
"audience": "general",
|
|
1757
|
-
"status": "
|
|
1758
|
-
"summary": "
|
|
2197
|
+
"status": "experimental",
|
|
2198
|
+
"summary": "Scrollable conversation-list region with dedicated empty and floating-action placement.",
|
|
1759
2199
|
"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."
|
|
2200
|
+
"A messaging-like surface needs a reusable history list with empty and action regions."
|
|
1763
2201
|
],
|
|
1764
2202
|
"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
|
-
}
|
|
2203
|
+
"The content is not a collection of conversations or threads."
|
|
1786
2204
|
],
|
|
1787
2205
|
"commonlyComposedWith": [
|
|
1788
|
-
"component:ds-
|
|
1789
|
-
"component:ds-
|
|
1790
|
-
"component:ds-
|
|
2206
|
+
"component:ds-conversation-list-section",
|
|
2207
|
+
"component:ds-conversation-list-item",
|
|
2208
|
+
"component:ds-empty-state"
|
|
1791
2209
|
],
|
|
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."
|
|
2210
|
+
"patterns": [
|
|
2211
|
+
"pattern:conversation"
|
|
1797
2212
|
],
|
|
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."
|
|
2213
|
+
"accessibility": [
|
|
2214
|
+
"Provide an accessible list label through the surrounding heading or region.",
|
|
2215
|
+
"Keep the empty message descriptive and the floating action explicitly named."
|
|
1804
2216
|
],
|
|
1805
2217
|
"responsiveBehavior": [
|
|
1806
|
-
"The owner
|
|
1807
|
-
"EmptyState does not infer breakpoints or change composition automatically."
|
|
2218
|
+
"The list fills its owner, scrolls independently, and keeps its action at the lower end corner."
|
|
1808
2219
|
],
|
|
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
2220
|
"references": [
|
|
1821
2221
|
{
|
|
1822
2222
|
"label": "Storybook examples",
|
|
1823
|
-
"path": "src/wc/components/
|
|
2223
|
+
"path": "src/wc/components/ConversationList/ConversationList.stories.ts"
|
|
1824
2224
|
}
|
|
1825
2225
|
]
|
|
1826
2226
|
},
|
|
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
|
-
},
|
|
2227
|
+
"props": {},
|
|
1841
2228
|
"events": [],
|
|
1842
2229
|
"slots": [],
|
|
1843
2230
|
"exports": {
|
|
1844
|
-
"customElement": "ds-
|
|
1845
|
-
"react": "
|
|
1846
|
-
"angular": "
|
|
2231
|
+
"customElement": "ds-conversation-list",
|
|
2232
|
+
"react": "DsConversationList",
|
|
2233
|
+
"angular": "DsConversationList"
|
|
1847
2234
|
}
|
|
1848
2235
|
},
|
|
1849
2236
|
"dependencies": [
|
|
1850
2237
|
"@ds-mo/ui",
|
|
1851
|
-
"@ds-mo/tokens"
|
|
1852
|
-
"@ds-mo/icons"
|
|
2238
|
+
"@ds-mo/tokens"
|
|
1853
2239
|
],
|
|
1854
|
-
"registryDependencies": [
|
|
1855
|
-
"icon",
|
|
1856
|
-
"text"
|
|
1857
|
-
]
|
|
2240
|
+
"registryDependencies": []
|
|
1858
2241
|
},
|
|
1859
2242
|
{
|
|
1860
|
-
"name": "
|
|
1861
|
-
"title": "
|
|
1862
|
-
"description": "
|
|
2243
|
+
"name": "conversation-list-item",
|
|
2244
|
+
"title": "ConversationListItem",
|
|
2245
|
+
"description": "Selectable conversation row with one-line preview, recency, unread presence, generic busy or error status, and channel-owned accessory slots.",
|
|
1863
2246
|
"type": "registry:ui",
|
|
1864
2247
|
"meta": {
|
|
1865
2248
|
"library": "@ds-mo/ui",
|
|
1866
2249
|
"distribution": "npm",
|
|
1867
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
1868
|
-
"source": "src/wc/components/
|
|
2250
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/conversation-list-item",
|
|
2251
|
+
"source": "src/wc/components/ConversationListItem/ConversationListItem.tsx",
|
|
1869
2252
|
"intentStatus": "complete",
|
|
1870
2253
|
"intent": {
|
|
1871
2254
|
"audience": "general",
|
|
1872
|
-
"status": "
|
|
1873
|
-
"summary": "
|
|
2255
|
+
"status": "experimental",
|
|
2256
|
+
"summary": "Selectable conversation row with one-line preview, recency, unread presence, generic busy or error status, and channel-owned accessory slots.",
|
|
1874
2257
|
"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."
|
|
2258
|
+
"A conversation history needs a compact row that opens one thread."
|
|
1878
2259
|
],
|
|
1879
2260
|
"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
|
-
}
|
|
2261
|
+
"The row represents a command rather than a persisted conversation."
|
|
1890
2262
|
],
|
|
1891
2263
|
"commonlyComposedWith": [
|
|
1892
|
-
"component:ds-
|
|
1893
|
-
"component:ds-
|
|
1894
|
-
"component:ds-
|
|
1895
|
-
"component:ds-
|
|
2264
|
+
"component:ds-conversation-list-section",
|
|
2265
|
+
"component:ds-avatar",
|
|
2266
|
+
"component:ds-badge",
|
|
2267
|
+
"component:ds-loader"
|
|
2268
|
+
],
|
|
2269
|
+
"patterns": [
|
|
2270
|
+
"pattern:conversation"
|
|
1896
2271
|
],
|
|
1897
2272
|
"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."
|
|
2273
|
+
"The conversation surface is one button with its title as the primary accessible name; actions are sibling controls so buttons are never nested.",
|
|
2274
|
+
"An action in the actions slot remains keyboard-focusable and appears on row focus as well as pointer hover; touch layouts keep it visible.",
|
|
2275
|
+
"Status copy must make busy or error meaning available without relying on motion or color."
|
|
1903
2276
|
],
|
|
1904
2277
|
"states": [
|
|
1905
|
-
"
|
|
1906
|
-
"
|
|
1907
|
-
"
|
|
1908
|
-
"
|
|
2278
|
+
"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.",
|
|
2279
|
+
"Busy and error are generic channel-neutral states; the owning product supplies suitable status wording.",
|
|
2280
|
+
"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.",
|
|
2281
|
+
"Hover and press use the shared interaction hover and pressed overlays. Only the selected conversation uses the persistent active fill.",
|
|
2282
|
+
"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.",
|
|
2283
|
+
"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
2284
|
],
|
|
1910
2285
|
"responsiveBehavior": [
|
|
1911
|
-
"
|
|
1912
|
-
"The form layout owns column count, wrapping, and responsive placement; Field keeps the vertical label-control-message composition intact."
|
|
2286
|
+
"Long titles and previews truncate without displacing trailing status."
|
|
1913
2287
|
],
|
|
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
2288
|
"references": [
|
|
1927
2289
|
{
|
|
1928
2290
|
"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"
|
|
2291
|
+
"path": "src/wc/components/ConversationList/ConversationList.stories.ts"
|
|
1934
2292
|
}
|
|
1935
2293
|
]
|
|
1936
2294
|
},
|
|
1937
2295
|
"props": {
|
|
1938
|
-
"
|
|
1939
|
-
"type": "
|
|
2296
|
+
"actionsOpen": {
|
|
2297
|
+
"type": "boolean",
|
|
1940
2298
|
"required": false
|
|
1941
2299
|
},
|
|
1942
|
-
"
|
|
2300
|
+
"conversationId": {
|
|
2301
|
+
"type": "string",
|
|
2302
|
+
"required": false
|
|
2303
|
+
},
|
|
2304
|
+
"conversationTitle": {
|
|
2305
|
+
"type": "string",
|
|
2306
|
+
"required": false
|
|
2307
|
+
},
|
|
2308
|
+
"preview": {
|
|
2309
|
+
"type": "string",
|
|
2310
|
+
"required": false
|
|
2311
|
+
},
|
|
2312
|
+
"selected": {
|
|
1943
2313
|
"type": "boolean",
|
|
1944
2314
|
"required": false
|
|
1945
2315
|
},
|
|
1946
|
-
"
|
|
1947
|
-
"type": "
|
|
2316
|
+
"state": {
|
|
2317
|
+
"type": "ConversationItemState",
|
|
1948
2318
|
"required": false
|
|
1949
2319
|
},
|
|
1950
|
-
"
|
|
1951
|
-
"type": "string
|
|
2320
|
+
"statusLabel": {
|
|
2321
|
+
"type": "string",
|
|
1952
2322
|
"required": false
|
|
1953
2323
|
},
|
|
1954
|
-
"
|
|
2324
|
+
"unreadCount": {
|
|
2325
|
+
"type": "number",
|
|
2326
|
+
"required": false
|
|
2327
|
+
},
|
|
2328
|
+
"updatedAt": {
|
|
1955
2329
|
"type": "string",
|
|
1956
|
-
"required":
|
|
2330
|
+
"required": false
|
|
1957
2331
|
}
|
|
1958
2332
|
},
|
|
1959
|
-
"events": [
|
|
2333
|
+
"events": [
|
|
2334
|
+
{
|
|
2335
|
+
"name": "dsSelect",
|
|
2336
|
+
"detail": "{ id: string }"
|
|
2337
|
+
}
|
|
2338
|
+
],
|
|
1960
2339
|
"slots": [],
|
|
1961
2340
|
"exports": {
|
|
1962
|
-
"customElement": "ds-
|
|
1963
|
-
"react": "
|
|
1964
|
-
"angular": "
|
|
2341
|
+
"customElement": "ds-conversation-list-item",
|
|
2342
|
+
"react": "DsConversationListItem",
|
|
2343
|
+
"angular": "DsConversationListItem"
|
|
1965
2344
|
}
|
|
1966
2345
|
},
|
|
1967
2346
|
"dependencies": [
|
|
@@ -1969,181 +2348,594 @@
|
|
|
1969
2348
|
"@ds-mo/tokens"
|
|
1970
2349
|
],
|
|
1971
2350
|
"registryDependencies": [
|
|
2351
|
+
"badge",
|
|
2352
|
+
"loader",
|
|
1972
2353
|
"text"
|
|
1973
2354
|
]
|
|
1974
2355
|
},
|
|
1975
2356
|
{
|
|
1976
|
-
"name": "
|
|
1977
|
-
"title": "
|
|
1978
|
-
"description": "
|
|
2357
|
+
"name": "conversation-list-section",
|
|
2358
|
+
"title": "ConversationListSection",
|
|
2359
|
+
"description": "Semantically labelled section for grouping conversation rows by meaningful chronology or category.",
|
|
1979
2360
|
"type": "registry:ui",
|
|
1980
2361
|
"meta": {
|
|
1981
2362
|
"library": "@ds-mo/ui",
|
|
1982
2363
|
"distribution": "npm",
|
|
1983
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
1984
|
-
"source": "src/wc/components/
|
|
2364
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/conversation-list-section",
|
|
2365
|
+
"source": "src/wc/components/ConversationListSection/ConversationListSection.tsx",
|
|
1985
2366
|
"intentStatus": "complete",
|
|
1986
2367
|
"intent": {
|
|
1987
2368
|
"audience": "general",
|
|
1988
|
-
"status": "
|
|
1989
|
-
"summary": "
|
|
2369
|
+
"status": "experimental",
|
|
2370
|
+
"summary": "Semantically labelled section for grouping conversation rows by meaningful chronology or category.",
|
|
1990
2371
|
"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."
|
|
2372
|
+
"A conversation list needs visible groups such as Today, Yesterday, or Older."
|
|
1994
2373
|
],
|
|
1995
2374
|
"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
|
-
}
|
|
2375
|
+
"A flat list is clearer or the proposed grouping has no meaning to readers."
|
|
2017
2376
|
],
|
|
2018
2377
|
"commonlyComposedWith": [
|
|
2019
|
-
"component:ds-
|
|
2020
|
-
"component:ds-
|
|
2021
|
-
"component:ds-menu",
|
|
2022
|
-
"component:ds-panel-nav"
|
|
2378
|
+
"component:ds-conversation-list",
|
|
2379
|
+
"component:ds-conversation-list-item"
|
|
2023
2380
|
],
|
|
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."
|
|
2381
|
+
"patterns": [
|
|
2382
|
+
"pattern:conversation"
|
|
2031
2383
|
],
|
|
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."
|
|
2384
|
+
"accessibility": [
|
|
2385
|
+
"The visible heading labels the section and must describe the relationship shared by its rows."
|
|
2039
2386
|
],
|
|
2040
2387
|
"responsiveBehavior": [
|
|
2041
|
-
"
|
|
2042
|
-
"Icon does not scale from viewport width or change glyphs automatically."
|
|
2388
|
+
"Rows remain full width while the heading stays visible in document order."
|
|
2043
2389
|
],
|
|
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
2390
|
"references": [
|
|
2056
2391
|
{
|
|
2057
2392
|
"label": "Storybook examples",
|
|
2058
|
-
"path": "src/wc/components/
|
|
2059
|
-
},
|
|
2060
|
-
{
|
|
2061
|
-
"label": "Preload API guidance",
|
|
2062
|
-
"path": "src/wc/components/Icon/icon-cache.ts"
|
|
2393
|
+
"path": "src/wc/components/ConversationList/ConversationList.stories.ts"
|
|
2063
2394
|
}
|
|
2064
2395
|
]
|
|
2065
2396
|
},
|
|
2066
2397
|
"props": {
|
|
2067
|
-
"
|
|
2068
|
-
"type": "IconColor",
|
|
2069
|
-
"required": false
|
|
2070
|
-
},
|
|
2071
|
-
"label": {
|
|
2072
|
-
"type": "string | undefined",
|
|
2073
|
-
"required": false
|
|
2074
|
-
},
|
|
2075
|
-
"name": {
|
|
2398
|
+
"heading": {
|
|
2076
2399
|
"type": "string",
|
|
2077
2400
|
"required": false
|
|
2078
2401
|
},
|
|
2079
|
-
"
|
|
2080
|
-
"type": "
|
|
2402
|
+
"sectionId": {
|
|
2403
|
+
"type": "string",
|
|
2081
2404
|
"required": false
|
|
2082
2405
|
}
|
|
2083
2406
|
},
|
|
2084
2407
|
"events": [],
|
|
2085
2408
|
"slots": [],
|
|
2086
2409
|
"exports": {
|
|
2087
|
-
"customElement": "ds-
|
|
2088
|
-
"react": "
|
|
2089
|
-
"angular": "
|
|
2410
|
+
"customElement": "ds-conversation-list-section",
|
|
2411
|
+
"react": "DsConversationListSection",
|
|
2412
|
+
"angular": "DsConversationListSection"
|
|
2090
2413
|
}
|
|
2091
2414
|
},
|
|
2092
2415
|
"dependencies": [
|
|
2093
2416
|
"@ds-mo/ui",
|
|
2094
|
-
"@ds-mo/tokens"
|
|
2095
|
-
"@ds-mo/icons"
|
|
2417
|
+
"@ds-mo/tokens"
|
|
2096
2418
|
],
|
|
2097
|
-
"registryDependencies": [
|
|
2419
|
+
"registryDependencies": [
|
|
2420
|
+
"text"
|
|
2421
|
+
]
|
|
2098
2422
|
},
|
|
2099
2423
|
{
|
|
2100
|
-
"name": "
|
|
2101
|
-
"title": "
|
|
2102
|
-
"description": "
|
|
2424
|
+
"name": "divider",
|
|
2425
|
+
"title": "Divider",
|
|
2426
|
+
"description": "Horizontal or vertical separator between sibling content groups, decorative by default with optional structural semantics.",
|
|
2103
2427
|
"type": "registry:ui",
|
|
2104
2428
|
"meta": {
|
|
2105
2429
|
"library": "@ds-mo/ui",
|
|
2106
2430
|
"distribution": "npm",
|
|
2107
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
2108
|
-
"source": "src/wc/components/
|
|
2431
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/divider",
|
|
2432
|
+
"source": "src/wc/components/Divider/Divider.tsx",
|
|
2109
2433
|
"intentStatus": "complete",
|
|
2110
2434
|
"intent": {
|
|
2111
2435
|
"audience": "general",
|
|
2112
2436
|
"status": "stable",
|
|
2113
|
-
"summary": "
|
|
2437
|
+
"summary": "Horizontal or vertical separator between sibling content groups, decorative by default with optional structural semantics.",
|
|
2114
2438
|
"useWhen": [
|
|
2115
|
-
"
|
|
2116
|
-
"
|
|
2117
|
-
"
|
|
2439
|
+
"Related sibling content groups on one surface need stronger visual separation than spacing alone provides.",
|
|
2440
|
+
"A list or panel needs an inset separator that does not define the outer edge of its container.",
|
|
2441
|
+
"Meaningful document or group structure requires an explicit horizontal or vertical separator."
|
|
2118
2442
|
],
|
|
2119
2443
|
"avoidWhen": [
|
|
2120
|
-
"
|
|
2121
|
-
"The
|
|
2122
|
-
"The
|
|
2444
|
+
"Spacing alone communicates the grouping clearly.",
|
|
2445
|
+
"The line defines a container edge, control outline, or selected state; use the owning component's border treatment.",
|
|
2446
|
+
"The divider would compensate for weak headings or unclear information hierarchy.",
|
|
2447
|
+
"A decorative flourish does not clarify grouping."
|
|
2123
2448
|
],
|
|
2124
2449
|
"alternatives": [
|
|
2125
2450
|
{
|
|
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."
|
|
2451
|
+
"when": "Content needs an enclosing surface and outer boundary.",
|
|
2452
|
+
"component": "component:ds-card",
|
|
2453
|
+
"reason": "Card owns container chrome, structure, and edge treatment."
|
|
2134
2454
|
},
|
|
2135
2455
|
{
|
|
2136
|
-
"when": "
|
|
2137
|
-
"component": "component:ds-
|
|
2138
|
-
"reason": "
|
|
2456
|
+
"when": "A static compact label is being used to name a group.",
|
|
2457
|
+
"component": "component:ds-text",
|
|
2458
|
+
"reason": "Text communicates hierarchy directly instead of relying on a line."
|
|
2139
2459
|
}
|
|
2140
2460
|
],
|
|
2141
2461
|
"commonlyComposedWith": [
|
|
2142
|
-
"component:ds-
|
|
2143
|
-
"component:ds-
|
|
2144
|
-
"component:ds-
|
|
2145
|
-
],
|
|
2146
|
-
"accessibility": [
|
|
2462
|
+
"component:ds-card",
|
|
2463
|
+
"component:ds-menu",
|
|
2464
|
+
"component:ds-panel-sub-nav"
|
|
2465
|
+
],
|
|
2466
|
+
"accessibility": [
|
|
2467
|
+
"Keep purely visual dividers hidden from assistive technology.",
|
|
2468
|
+
"Expose separator semantics only when the line represents meaningful document or group structure.",
|
|
2469
|
+
"Semantic orientation must match the divider's visual orientation.",
|
|
2470
|
+
"Do not use a semantic divider as a substitute for headings, landmarks, or explicit group labels."
|
|
2471
|
+
],
|
|
2472
|
+
"states": [
|
|
2473
|
+
"Horizontal and vertical variants separate sibling groups along the parent's layout axis.",
|
|
2474
|
+
"The omitted background context is for primary and secondary surfaces. Explicit faint documents a faint surface while using the same standard divider token.",
|
|
2475
|
+
"Other background contexts select their matching divider token, including navigation where Divider is composed inside app chrome.",
|
|
2476
|
+
"Inset is symmetric along the line axis. Explicit length is reserved for layout-specific separators; otherwise the line fills the available axis."
|
|
2477
|
+
],
|
|
2478
|
+
"responsiveBehavior": [
|
|
2479
|
+
"The parent layout decides whether to change orientation, visibility, inset, or length at responsive breakpoints.",
|
|
2480
|
+
"Divider does not infer layout direction or hide itself responsively."
|
|
2481
|
+
],
|
|
2482
|
+
"frameworkCaveats": {
|
|
2483
|
+
"customElements": [
|
|
2484
|
+
"Set semantic mode only from known document structure; presentation alone should remain hidden from assistive technology."
|
|
2485
|
+
],
|
|
2486
|
+
"react": [
|
|
2487
|
+
"Derive orientation and visibility from the parent layout rather than viewport logic inside Divider."
|
|
2488
|
+
],
|
|
2489
|
+
"angular": [
|
|
2490
|
+
"Derive orientation and visibility from the parent layout rather than viewport logic inside Divider."
|
|
2491
|
+
]
|
|
2492
|
+
},
|
|
2493
|
+
"references": [
|
|
2494
|
+
{
|
|
2495
|
+
"label": "Storybook examples",
|
|
2496
|
+
"path": "src/wc/components/Divider/Divider.stories.ts"
|
|
2497
|
+
}
|
|
2498
|
+
]
|
|
2499
|
+
},
|
|
2500
|
+
"props": {
|
|
2501
|
+
"background": {
|
|
2502
|
+
"type": "DividerBackground | undefined",
|
|
2503
|
+
"required": false
|
|
2504
|
+
},
|
|
2505
|
+
"inset": {
|
|
2506
|
+
"type": "DividerInset",
|
|
2507
|
+
"required": false
|
|
2508
|
+
},
|
|
2509
|
+
"length": {
|
|
2510
|
+
"type": "DividerLength",
|
|
2511
|
+
"required": false
|
|
2512
|
+
},
|
|
2513
|
+
"orientation": {
|
|
2514
|
+
"type": "DividerOrientation",
|
|
2515
|
+
"required": false
|
|
2516
|
+
},
|
|
2517
|
+
"semantic": {
|
|
2518
|
+
"type": "boolean",
|
|
2519
|
+
"required": false
|
|
2520
|
+
}
|
|
2521
|
+
},
|
|
2522
|
+
"events": [],
|
|
2523
|
+
"slots": [],
|
|
2524
|
+
"exports": {
|
|
2525
|
+
"customElement": "ds-divider",
|
|
2526
|
+
"react": "DsDivider",
|
|
2527
|
+
"angular": "DsDivider"
|
|
2528
|
+
}
|
|
2529
|
+
},
|
|
2530
|
+
"dependencies": [
|
|
2531
|
+
"@ds-mo/ui",
|
|
2532
|
+
"@ds-mo/tokens"
|
|
2533
|
+
],
|
|
2534
|
+
"registryDependencies": []
|
|
2535
|
+
},
|
|
2536
|
+
{
|
|
2537
|
+
"name": "empty-state",
|
|
2538
|
+
"title": "EmptyState",
|
|
2539
|
+
"description": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
|
|
2540
|
+
"type": "registry:ui",
|
|
2541
|
+
"meta": {
|
|
2542
|
+
"library": "@ds-mo/ui",
|
|
2543
|
+
"distribution": "npm",
|
|
2544
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/empty-state",
|
|
2545
|
+
"source": "src/wc/components/EmptyState/EmptyState.tsx",
|
|
2546
|
+
"intentStatus": "complete",
|
|
2547
|
+
"intent": {
|
|
2548
|
+
"audience": "general",
|
|
2549
|
+
"status": "stable",
|
|
2550
|
+
"summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
|
|
2551
|
+
"useWhen": [
|
|
2552
|
+
"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.",
|
|
2553
|
+
"A prominent empty region benefits from a decorative icon, visual title, and supporting body copy.",
|
|
2554
|
+
"A compact owner such as a Select popup needs only centered body copy."
|
|
2555
|
+
],
|
|
2556
|
+
"avoidWhen": [
|
|
2557
|
+
"Content is still loading; use Skeleton for predictable structure or Loader for an indeterminate operation.",
|
|
2558
|
+
"The state is an error, warning, or confirmation that needs semantic intent and announcement from the owning workflow.",
|
|
2559
|
+
"The state needs a recovery action, link, or other interactive content; the current EmptyState pattern is intentionally message-only.",
|
|
2560
|
+
"A decorative illustration, arbitrary rich content, or custom layout is required."
|
|
2561
|
+
],
|
|
2562
|
+
"alternatives": [
|
|
2563
|
+
{
|
|
2564
|
+
"when": "A content region is waiting for structured data.",
|
|
2565
|
+
"component": "component:ds-skeleton",
|
|
2566
|
+
"reason": "Skeleton preserves expected geometry while content is pending."
|
|
2567
|
+
},
|
|
2568
|
+
{
|
|
2569
|
+
"when": "An operation is progressing without predictable content structure.",
|
|
2570
|
+
"component": "component:ds-loader",
|
|
2571
|
+
"reason": "Loader owns indeterminate progress rather than an empty outcome."
|
|
2572
|
+
},
|
|
2573
|
+
{
|
|
2574
|
+
"when": "Only ordinary prose is needed without empty-state layout.",
|
|
2575
|
+
"component": "component:ds-text",
|
|
2576
|
+
"reason": "Text owns typography without adding centered empty-state composition."
|
|
2577
|
+
}
|
|
2578
|
+
],
|
|
2579
|
+
"commonlyComposedWith": [
|
|
2580
|
+
"component:ds-select",
|
|
2581
|
+
"component:ds-text",
|
|
2582
|
+
"component:ds-icon"
|
|
2583
|
+
],
|
|
2584
|
+
"accessibility": [
|
|
2585
|
+
"The optional icon is decorative; the title and body provide all meaning in text.",
|
|
2586
|
+
"EmptyState does not create a live region or alert automatically. The owner decides whether a dynamic transition requires announcement.",
|
|
2587
|
+
"The visual title does not impose a document heading level because the correct hierarchy belongs to the consuming page or region.",
|
|
2588
|
+
"Keep localized body copy concise and sufficient when using the body-only variant."
|
|
2589
|
+
],
|
|
2590
|
+
"states": [
|
|
2591
|
+
"Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
|
|
2592
|
+
"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.",
|
|
2593
|
+
"The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
|
|
2594
|
+
"All content is centered. The owner supplies container size and surrounding padding; do not compose actions into or immediately alongside the current EmptyState pattern.",
|
|
2595
|
+
"First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
|
|
2596
|
+
],
|
|
2597
|
+
"responsiveBehavior": [
|
|
2598
|
+
"The owner controls available width and height; text wraps naturally while remaining centered.",
|
|
2599
|
+
"EmptyState does not infer breakpoints or change composition automatically."
|
|
2600
|
+
],
|
|
2601
|
+
"frameworkCaveats": {
|
|
2602
|
+
"customElements": [
|
|
2603
|
+
"Pass canonical IcoMo icon names and localized heading/body strings through properties or attributes."
|
|
2604
|
+
],
|
|
2605
|
+
"react": [
|
|
2606
|
+
"Choose one supported composition by passing body with optional heading and icon props."
|
|
2607
|
+
],
|
|
2608
|
+
"angular": [
|
|
2609
|
+
"Choose one supported composition by binding body with optional heading and icon inputs."
|
|
2610
|
+
]
|
|
2611
|
+
},
|
|
2612
|
+
"references": [
|
|
2613
|
+
{
|
|
2614
|
+
"label": "Storybook examples",
|
|
2615
|
+
"path": "src/wc/components/EmptyState/EmptyState.stories.ts"
|
|
2616
|
+
}
|
|
2617
|
+
]
|
|
2618
|
+
},
|
|
2619
|
+
"props": {
|
|
2620
|
+
"body": {
|
|
2621
|
+
"type": "string",
|
|
2622
|
+
"required": false
|
|
2623
|
+
},
|
|
2624
|
+
"heading": {
|
|
2625
|
+
"type": "string | undefined",
|
|
2626
|
+
"required": false
|
|
2627
|
+
},
|
|
2628
|
+
"icon": {
|
|
2629
|
+
"type": "string | undefined",
|
|
2630
|
+
"required": false
|
|
2631
|
+
}
|
|
2632
|
+
},
|
|
2633
|
+
"events": [],
|
|
2634
|
+
"slots": [],
|
|
2635
|
+
"exports": {
|
|
2636
|
+
"customElement": "ds-empty-state",
|
|
2637
|
+
"react": "DsEmptyState",
|
|
2638
|
+
"angular": "DsEmptyState"
|
|
2639
|
+
}
|
|
2640
|
+
},
|
|
2641
|
+
"dependencies": [
|
|
2642
|
+
"@ds-mo/ui",
|
|
2643
|
+
"@ds-mo/tokens",
|
|
2644
|
+
"@ds-mo/icons"
|
|
2645
|
+
],
|
|
2646
|
+
"registryDependencies": [
|
|
2647
|
+
"icon",
|
|
2648
|
+
"text"
|
|
2649
|
+
]
|
|
2650
|
+
},
|
|
2651
|
+
{
|
|
2652
|
+
"name": "field",
|
|
2653
|
+
"title": "Field",
|
|
2654
|
+
"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.",
|
|
2655
|
+
"type": "registry:ui",
|
|
2656
|
+
"meta": {
|
|
2657
|
+
"library": "@ds-mo/ui",
|
|
2658
|
+
"distribution": "npm",
|
|
2659
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/field",
|
|
2660
|
+
"source": "src/wc/components/Field/Field.tsx",
|
|
2661
|
+
"intentStatus": "complete",
|
|
2662
|
+
"intent": {
|
|
2663
|
+
"audience": "general",
|
|
2664
|
+
"status": "stable",
|
|
2665
|
+
"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.",
|
|
2666
|
+
"useWhen": [
|
|
2667
|
+
"An Input, Select, or SelectMulti needs a persistent visible label in a form.",
|
|
2668
|
+
"Help text or an error message must be programmatically associated with one control.",
|
|
2669
|
+
"A form layout needs one consistent label-control-message rhythm."
|
|
2670
|
+
],
|
|
2671
|
+
"avoidWhen": [
|
|
2672
|
+
"The component already owns its visible label and complete selection semantics, such as Checkbox, Radio, or Switch.",
|
|
2673
|
+
"Several controls belong to one question; use a semantic fieldset and legend instead.",
|
|
2674
|
+
"Text describes a region or group rather than one form control."
|
|
2675
|
+
],
|
|
2676
|
+
"alternatives": [
|
|
2677
|
+
{
|
|
2678
|
+
"when": "Several related controls answer one question.",
|
|
2679
|
+
"component": "component:ds-text",
|
|
2680
|
+
"reason": "Use native fieldset and legend semantics, then compose Text only for supporting content."
|
|
2681
|
+
}
|
|
2682
|
+
],
|
|
2683
|
+
"commonlyComposedWith": [
|
|
2684
|
+
"component:ds-input",
|
|
2685
|
+
"component:ds-select",
|
|
2686
|
+
"component:ds-select-multi",
|
|
2687
|
+
"component:ds-text"
|
|
2688
|
+
],
|
|
2689
|
+
"accessibility": [
|
|
2690
|
+
"Slot exactly one form control. Field assigns its stable control ID and connects the visible label automatically.",
|
|
2691
|
+
"The visible description or error ID is merged with any authored aria-describedby references; a rendered error replaces the description.",
|
|
2692
|
+
"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.",
|
|
2693
|
+
"Clicking the label focuses the slotted design-system control without opening a Select popup.",
|
|
2694
|
+
"Do not use placeholder text as the only label. Keep label text concise and put format or consequence guidance in description."
|
|
2695
|
+
],
|
|
2696
|
+
"states": [
|
|
2697
|
+
"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.",
|
|
2698
|
+
"A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
|
|
2699
|
+
"Field owns validation presentation but not validation timing; the form decides when to set error and errorMessage.",
|
|
2700
|
+
"The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text."
|
|
2701
|
+
],
|
|
2702
|
+
"responsiveBehavior": [
|
|
2703
|
+
"Field fills the width supplied by its parent and makes the slotted control fill that field width.",
|
|
2704
|
+
"The form layout owns column count, wrapping, and responsive placement; Field keeps the vertical label-control-message composition intact."
|
|
2705
|
+
],
|
|
2706
|
+
"frameworkCaveats": {
|
|
2707
|
+
"customElements": [
|
|
2708
|
+
"Set fieldId only when another element must reference a predictable control ID; otherwise use the generated association.",
|
|
2709
|
+
"Assign child component values and option arrays through their normal JavaScript properties."
|
|
2710
|
+
],
|
|
2711
|
+
"react": [
|
|
2712
|
+
"Compose one DsInput, DsSelect, or DsSelectMulti child and control validation timing in the form owner."
|
|
2713
|
+
],
|
|
2714
|
+
"angular": [
|
|
2715
|
+
"Compose the generated Field adapter around the control adapter and its matching Angular value accessor."
|
|
2716
|
+
]
|
|
2717
|
+
},
|
|
2718
|
+
"references": [
|
|
2719
|
+
{
|
|
2720
|
+
"label": "Storybook examples",
|
|
2721
|
+
"path": "src/wc/components/Field/Field.stories.ts"
|
|
2722
|
+
},
|
|
2723
|
+
{
|
|
2724
|
+
"label": "Cross-browser form and accessibility coverage",
|
|
2725
|
+
"path": "tests/e2e/forms.spec.ts"
|
|
2726
|
+
}
|
|
2727
|
+
]
|
|
2728
|
+
},
|
|
2729
|
+
"props": {
|
|
2730
|
+
"description": {
|
|
2731
|
+
"type": "string | undefined",
|
|
2732
|
+
"required": false
|
|
2733
|
+
},
|
|
2734
|
+
"error": {
|
|
2735
|
+
"type": "boolean",
|
|
2736
|
+
"required": false
|
|
2737
|
+
},
|
|
2738
|
+
"errorMessage": {
|
|
2739
|
+
"type": "string | undefined",
|
|
2740
|
+
"required": false
|
|
2741
|
+
},
|
|
2742
|
+
"fieldId": {
|
|
2743
|
+
"type": "string | undefined",
|
|
2744
|
+
"required": false
|
|
2745
|
+
},
|
|
2746
|
+
"label": {
|
|
2747
|
+
"type": "string",
|
|
2748
|
+
"required": true
|
|
2749
|
+
}
|
|
2750
|
+
},
|
|
2751
|
+
"events": [],
|
|
2752
|
+
"slots": [],
|
|
2753
|
+
"exports": {
|
|
2754
|
+
"customElement": "ds-field",
|
|
2755
|
+
"react": "DsField",
|
|
2756
|
+
"angular": "DsField"
|
|
2757
|
+
}
|
|
2758
|
+
},
|
|
2759
|
+
"dependencies": [
|
|
2760
|
+
"@ds-mo/ui",
|
|
2761
|
+
"@ds-mo/tokens"
|
|
2762
|
+
],
|
|
2763
|
+
"registryDependencies": [
|
|
2764
|
+
"text"
|
|
2765
|
+
]
|
|
2766
|
+
},
|
|
2767
|
+
{
|
|
2768
|
+
"name": "icon",
|
|
2769
|
+
"title": "Icon",
|
|
2770
|
+
"description": "Secure, lazily loaded renderer for canonical IcoMo system and flag glyphs, decorative by default with optional graphic semantics.",
|
|
2771
|
+
"type": "registry:ui",
|
|
2772
|
+
"meta": {
|
|
2773
|
+
"library": "@ds-mo/ui",
|
|
2774
|
+
"distribution": "npm",
|
|
2775
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/icon",
|
|
2776
|
+
"source": "src/wc/components/Icon/Icon.tsx",
|
|
2777
|
+
"intentStatus": "complete",
|
|
2778
|
+
"intent": {
|
|
2779
|
+
"audience": "general",
|
|
2780
|
+
"status": "stable",
|
|
2781
|
+
"summary": "Secure, lazily loaded renderer for canonical IcoMo system and flag glyphs, decorative by default with optional graphic semantics.",
|
|
2782
|
+
"useWhen": [
|
|
2783
|
+
"An approved IcoMo system glyph supplements visible text or control chrome.",
|
|
2784
|
+
"A canonical flag glyph communicates a country or region with adjacent text or an explicit localized label.",
|
|
2785
|
+
"A standalone non-interactive symbol conveys meaning that is unavailable from nearby text."
|
|
2786
|
+
],
|
|
2787
|
+
"avoidWhen": [
|
|
2788
|
+
"The glyph itself must be clickable or keyboard interactive; use an appropriate button or link and compose Icon inside it.",
|
|
2789
|
+
"The visual is an illustration, logo, chart, or arbitrary SVG artwork rather than a canonical IcoMo glyph.",
|
|
2790
|
+
"An alias, guessed name, or case-insensitive lookup would be required; runtime lookup uses exact canonical export names.",
|
|
2791
|
+
"A fallback glyph would be required when loading fails; Icon intentionally preserves an empty fixed-size box."
|
|
2792
|
+
],
|
|
2793
|
+
"alternatives": [
|
|
2794
|
+
{
|
|
2795
|
+
"when": "The icon initiates an action or persistent toggle.",
|
|
2796
|
+
"component": "component:ds-button-unfilled",
|
|
2797
|
+
"reason": "ButtonUnfilled owns interaction, focus, naming, and toggle semantics."
|
|
2798
|
+
},
|
|
2799
|
+
{
|
|
2800
|
+
"when": "The visual communicates indeterminate loading progress.",
|
|
2801
|
+
"component": "component:ds-loader",
|
|
2802
|
+
"reason": "Loader owns progress status and motion behavior."
|
|
2803
|
+
},
|
|
2804
|
+
{
|
|
2805
|
+
"when": "The compact visual is an unread count or notification dot.",
|
|
2806
|
+
"component": "component:ds-badge",
|
|
2807
|
+
"reason": "Badge owns supplemental notification semantics."
|
|
2808
|
+
}
|
|
2809
|
+
],
|
|
2810
|
+
"commonlyComposedWith": [
|
|
2811
|
+
"component:ds-button-filled",
|
|
2812
|
+
"component:ds-button-unfilled",
|
|
2813
|
+
"component:ds-menu",
|
|
2814
|
+
"component:ds-panel-nav"
|
|
2815
|
+
],
|
|
2816
|
+
"accessibility": [
|
|
2817
|
+
"Icons are decorative by default and remain hidden from assistive technology when visible text or an owning control already communicates the meaning.",
|
|
2818
|
+
"The owning button, link, or composite control provides the accessible name; do not repeat that name on its nested Icon.",
|
|
2819
|
+
"Provide an explicit label only when the non-interactive icon itself communicates otherwise unavailable meaning.",
|
|
2820
|
+
"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.",
|
|
2821
|
+
"Informative flags require an explicit localized country or region label; never derive accessible text from the export name.",
|
|
2822
|
+
"Icon never receives focus or owns interaction."
|
|
2823
|
+
],
|
|
2824
|
+
"states": [
|
|
2825
|
+
"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.",
|
|
2826
|
+
"Prefer the owning control's isInactive or native disabled state over manually selecting tertiary or quaternary so visual treatment and inactive semantics remain synchronized.",
|
|
2827
|
+
"Built-in glyph lookup accepts exact canonical IcoMo export names only. Names beginning with Flag select the flag catalog automatically.",
|
|
2828
|
+
"A cache miss lazy-loads into a fixed-size box without layout shift. Unknown names, failed loads, and rejected markup leave that box empty.",
|
|
2829
|
+
"Critical first-paint glyphs may be pre-registered before rendering; all resolved glyphs share a global cache.",
|
|
2830
|
+
"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."
|
|
2831
|
+
],
|
|
2832
|
+
"responsiveBehavior": [
|
|
2833
|
+
"The owning component or layout chooses icon size and any responsive changes.",
|
|
2834
|
+
"Icon does not scale from viewport width or change glyphs automatically."
|
|
2835
|
+
],
|
|
2836
|
+
"frameworkCaveats": {
|
|
2837
|
+
"customElements": [
|
|
2838
|
+
"Import each canonical glyph as an SVG string and call registerIcons before first render when synchronous critical-icon paint is required."
|
|
2839
|
+
],
|
|
2840
|
+
"react": [
|
|
2841
|
+
"Keep nested control icons decorative and place the accessible name on the owning React control."
|
|
2842
|
+
],
|
|
2843
|
+
"angular": [
|
|
2844
|
+
"Keep nested control icons decorative and place the accessible name on the owning Angular control."
|
|
2845
|
+
]
|
|
2846
|
+
},
|
|
2847
|
+
"references": [
|
|
2848
|
+
{
|
|
2849
|
+
"label": "Storybook examples",
|
|
2850
|
+
"path": "src/wc/components/Icon/Icon.stories.ts"
|
|
2851
|
+
},
|
|
2852
|
+
{
|
|
2853
|
+
"label": "Preload API guidance",
|
|
2854
|
+
"path": "src/wc/components/Icon/icon-cache.ts"
|
|
2855
|
+
}
|
|
2856
|
+
]
|
|
2857
|
+
},
|
|
2858
|
+
"props": {
|
|
2859
|
+
"color": {
|
|
2860
|
+
"type": "IconColor",
|
|
2861
|
+
"required": false
|
|
2862
|
+
},
|
|
2863
|
+
"label": {
|
|
2864
|
+
"type": "string | undefined",
|
|
2865
|
+
"required": false
|
|
2866
|
+
},
|
|
2867
|
+
"name": {
|
|
2868
|
+
"type": "string",
|
|
2869
|
+
"required": false
|
|
2870
|
+
},
|
|
2871
|
+
"size": {
|
|
2872
|
+
"type": "IconSize",
|
|
2873
|
+
"required": false
|
|
2874
|
+
}
|
|
2875
|
+
},
|
|
2876
|
+
"events": [],
|
|
2877
|
+
"slots": [],
|
|
2878
|
+
"exports": {
|
|
2879
|
+
"customElement": "ds-icon",
|
|
2880
|
+
"react": "DsIcon",
|
|
2881
|
+
"angular": "DsIcon"
|
|
2882
|
+
}
|
|
2883
|
+
},
|
|
2884
|
+
"dependencies": [
|
|
2885
|
+
"@ds-mo/ui",
|
|
2886
|
+
"@ds-mo/tokens",
|
|
2887
|
+
"@ds-mo/icons"
|
|
2888
|
+
],
|
|
2889
|
+
"registryDependencies": []
|
|
2890
|
+
},
|
|
2891
|
+
{
|
|
2892
|
+
"name": "input",
|
|
2893
|
+
"title": "Input",
|
|
2894
|
+
"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.",
|
|
2895
|
+
"type": "registry:ui",
|
|
2896
|
+
"meta": {
|
|
2897
|
+
"library": "@ds-mo/ui",
|
|
2898
|
+
"distribution": "npm",
|
|
2899
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/input",
|
|
2900
|
+
"source": "src/wc/components/Input/Input.tsx",
|
|
2901
|
+
"intentStatus": "complete",
|
|
2902
|
+
"intent": {
|
|
2903
|
+
"audience": "general",
|
|
2904
|
+
"status": "stable",
|
|
2905
|
+
"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.",
|
|
2906
|
+
"useWhen": [
|
|
2907
|
+
"A user must enter or edit one line of text, an email address, telephone number, URL, search query, or password.",
|
|
2908
|
+
"The value must participate in native, Angular, or React form state.",
|
|
2909
|
+
"A compact filter or toolbar needs a single-line search field that follows the shared control-density recipe."
|
|
2910
|
+
],
|
|
2911
|
+
"avoidWhen": [
|
|
2912
|
+
"The user chooses from a finite set of known values.",
|
|
2913
|
+
"The user must enter multiple paragraphs or formatted content.",
|
|
2914
|
+
"The value is adjusted primarily by dragging within a numeric range."
|
|
2915
|
+
],
|
|
2916
|
+
"alternatives": [
|
|
2917
|
+
{
|
|
2918
|
+
"when": "The value comes from a finite set of known choices.",
|
|
2919
|
+
"component": "component:ds-select",
|
|
2920
|
+
"reason": "Select exposes the available values and owns listbox selection behavior."
|
|
2921
|
+
},
|
|
2922
|
+
{
|
|
2923
|
+
"when": "The value is an immediate on/off setting.",
|
|
2924
|
+
"component": "component:ds-switch",
|
|
2925
|
+
"reason": "Switch communicates a binary setting instead of free text entry."
|
|
2926
|
+
},
|
|
2927
|
+
{
|
|
2928
|
+
"when": "The value is chosen from a bounded numeric range.",
|
|
2929
|
+
"component": "component:ds-slider",
|
|
2930
|
+
"reason": "Slider supports direct range adjustment and communicates the current position."
|
|
2931
|
+
}
|
|
2932
|
+
],
|
|
2933
|
+
"commonlyComposedWith": [
|
|
2934
|
+
"component:ds-field",
|
|
2935
|
+
"component:ds-icon",
|
|
2936
|
+
"component:ds-text"
|
|
2937
|
+
],
|
|
2938
|
+
"accessibility": [
|
|
2147
2939
|
"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.",
|
|
2148
2940
|
"Choose the native input type that matches the value so browsers and assistive technology can provide appropriate semantics and keyboards.",
|
|
2149
2941
|
"Error text is associated with the native input and announced as an alert when the invalid state is rendered.",
|
|
@@ -2151,273 +2943,706 @@
|
|
|
2151
2943
|
"Suffix content must not carry information that is otherwise absent from the field's visible label, value, or description."
|
|
2152
2944
|
],
|
|
2153
2945
|
"states": [
|
|
2154
|
-
"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.",
|
|
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."
|
|
2946
|
+
"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.",
|
|
2947
|
+
"Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins.",
|
|
2948
|
+
"Entered values use the parent surface's primary foreground; prefix icons, suffix content, and resting placeholder text use its secondary foreground.",
|
|
2949
|
+
"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.",
|
|
2950
|
+
"The suffix slot is for compact units or decorations. The optional leading icon is decorative and does not replace the field label.",
|
|
2951
|
+
"Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
|
|
2952
|
+
"The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
|
|
2953
|
+
"Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts."
|
|
2954
|
+
],
|
|
2955
|
+
"responsiveBehavior": [
|
|
2956
|
+
"Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
|
|
2957
|
+
"Choose density from the containing layout: md for ordinary forms, sm or xs only where the surrounding controls use the same compact recipe.",
|
|
2958
|
+
"The owner supplies layout constraints and decides when a compact field moves to its own row."
|
|
2959
|
+
],
|
|
2960
|
+
"frameworkCaveats": {
|
|
2961
|
+
"customElements": [
|
|
2962
|
+
"Listen for dsChange for user edits and dsClear for the search clear action.",
|
|
2963
|
+
"Use the form attribute on the host when associating an input rendered outside its owning form."
|
|
2964
|
+
],
|
|
2965
|
+
"react": [
|
|
2966
|
+
"Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear."
|
|
2967
|
+
],
|
|
2968
|
+
"angular": [
|
|
2969
|
+
"Import DsInput with TextValueAccessor when integrating with Angular Forms."
|
|
2970
|
+
]
|
|
2971
|
+
},
|
|
2972
|
+
"references": [
|
|
2973
|
+
{
|
|
2974
|
+
"label": "Storybook examples",
|
|
2975
|
+
"path": "src/wc/components/Input/Input.stories.ts"
|
|
2976
|
+
},
|
|
2977
|
+
{
|
|
2978
|
+
"label": "Cross-browser form and accessibility coverage",
|
|
2979
|
+
"path": "tests/e2e/forms.spec.ts"
|
|
2980
|
+
}
|
|
2981
|
+
]
|
|
2982
|
+
},
|
|
2983
|
+
"props": {
|
|
2984
|
+
"ariaDescribedby": {
|
|
2985
|
+
"type": "string | undefined",
|
|
2986
|
+
"required": false
|
|
2987
|
+
},
|
|
2988
|
+
"ariaLabel": {
|
|
2989
|
+
"type": "string | null",
|
|
2990
|
+
"required": false
|
|
2991
|
+
},
|
|
2992
|
+
"ariaLabelledby": {
|
|
2993
|
+
"type": "string | undefined",
|
|
2994
|
+
"required": false
|
|
2995
|
+
},
|
|
2996
|
+
"autoComplete": {
|
|
2997
|
+
"type": "string | undefined",
|
|
2998
|
+
"required": false
|
|
2999
|
+
},
|
|
3000
|
+
"autoFocus": {
|
|
3001
|
+
"type": "boolean",
|
|
3002
|
+
"required": false
|
|
3003
|
+
},
|
|
3004
|
+
"clearLabel": {
|
|
3005
|
+
"type": "string",
|
|
3006
|
+
"required": false
|
|
3007
|
+
},
|
|
3008
|
+
"disabled": {
|
|
3009
|
+
"type": "boolean",
|
|
3010
|
+
"required": false
|
|
3011
|
+
},
|
|
3012
|
+
"enterKeyHint": {
|
|
3013
|
+
"type": "string",
|
|
3014
|
+
"required": false
|
|
3015
|
+
},
|
|
3016
|
+
"error": {
|
|
3017
|
+
"type": "boolean",
|
|
3018
|
+
"required": false
|
|
3019
|
+
},
|
|
3020
|
+
"errorMessage": {
|
|
3021
|
+
"type": "string | undefined",
|
|
3022
|
+
"required": false
|
|
3023
|
+
},
|
|
3024
|
+
"form": {
|
|
3025
|
+
"type": "string | undefined",
|
|
3026
|
+
"required": false
|
|
3027
|
+
},
|
|
3028
|
+
"hasBorder": {
|
|
3029
|
+
"type": "boolean",
|
|
3030
|
+
"required": false
|
|
3031
|
+
},
|
|
3032
|
+
"icon": {
|
|
3033
|
+
"type": "string | undefined",
|
|
3034
|
+
"required": false
|
|
3035
|
+
},
|
|
3036
|
+
"inputId": {
|
|
3037
|
+
"type": "string | undefined",
|
|
3038
|
+
"required": false
|
|
3039
|
+
},
|
|
3040
|
+
"inputMode": {
|
|
3041
|
+
"type": "string",
|
|
3042
|
+
"required": false
|
|
3043
|
+
},
|
|
3044
|
+
"isInactive": {
|
|
3045
|
+
"type": "boolean",
|
|
3046
|
+
"required": false
|
|
3047
|
+
},
|
|
3048
|
+
"name": {
|
|
3049
|
+
"type": "string | undefined",
|
|
3050
|
+
"required": false
|
|
3051
|
+
},
|
|
3052
|
+
"placeholder": {
|
|
3053
|
+
"type": "string | undefined",
|
|
3054
|
+
"required": false
|
|
3055
|
+
},
|
|
3056
|
+
"readOnly": {
|
|
3057
|
+
"type": "boolean",
|
|
3058
|
+
"required": false
|
|
3059
|
+
},
|
|
3060
|
+
"required": {
|
|
3061
|
+
"type": "boolean",
|
|
3062
|
+
"required": false
|
|
3063
|
+
},
|
|
3064
|
+
"requiredMessage": {
|
|
3065
|
+
"type": "string",
|
|
3066
|
+
"required": false
|
|
3067
|
+
},
|
|
3068
|
+
"size": {
|
|
3069
|
+
"type": "InputSize",
|
|
3070
|
+
"required": false
|
|
3071
|
+
},
|
|
3072
|
+
"type": {
|
|
3073
|
+
"type": "InputType",
|
|
3074
|
+
"required": false
|
|
3075
|
+
},
|
|
3076
|
+
"value": {
|
|
3077
|
+
"type": "string",
|
|
3078
|
+
"required": false
|
|
3079
|
+
},
|
|
3080
|
+
"width": {
|
|
3081
|
+
"type": "InputWidth",
|
|
3082
|
+
"required": false
|
|
3083
|
+
}
|
|
3084
|
+
},
|
|
3085
|
+
"events": [
|
|
3086
|
+
{
|
|
3087
|
+
"name": "dsChange",
|
|
3088
|
+
"detail": "string"
|
|
3089
|
+
},
|
|
3090
|
+
{
|
|
3091
|
+
"name": "dsClear",
|
|
3092
|
+
"detail": "void"
|
|
3093
|
+
}
|
|
3094
|
+
],
|
|
3095
|
+
"slots": [],
|
|
3096
|
+
"exports": {
|
|
3097
|
+
"customElement": "ds-input",
|
|
3098
|
+
"react": "DsInput",
|
|
3099
|
+
"angular": "DsInput"
|
|
3100
|
+
}
|
|
3101
|
+
},
|
|
3102
|
+
"dependencies": [
|
|
3103
|
+
"@ds-mo/ui",
|
|
3104
|
+
"@ds-mo/tokens",
|
|
3105
|
+
"@ds-mo/icons"
|
|
3106
|
+
],
|
|
3107
|
+
"registryDependencies": [
|
|
3108
|
+
"button-unfilled",
|
|
3109
|
+
"icon",
|
|
3110
|
+
"text"
|
|
3111
|
+
]
|
|
3112
|
+
},
|
|
3113
|
+
{
|
|
3114
|
+
"name": "loader",
|
|
3115
|
+
"title": "Loader",
|
|
3116
|
+
"description": "Indeterminate progress glyph for ongoing operations, inheriting owner color and optionally exposing standalone polite status text.",
|
|
3117
|
+
"type": "registry:ui",
|
|
3118
|
+
"meta": {
|
|
3119
|
+
"library": "@ds-mo/ui",
|
|
3120
|
+
"distribution": "npm",
|
|
3121
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/loader",
|
|
3122
|
+
"source": "src/wc/components/Loader/Loader.tsx",
|
|
3123
|
+
"intentStatus": "complete",
|
|
3124
|
+
"intent": {
|
|
3125
|
+
"audience": "general",
|
|
3126
|
+
"status": "stable",
|
|
3127
|
+
"summary": "Indeterminate progress glyph for ongoing operations, inheriting owner color and optionally exposing standalone polite status text.",
|
|
3128
|
+
"useWhen": [
|
|
3129
|
+
"An action or operation is in progress and its remaining duration cannot be quantified.",
|
|
3130
|
+
"A button, field, or bounded workflow needs a compact visual busy indicator owned by that control or region.",
|
|
3131
|
+
"A standalone operation needs a visible spinner with contextual polite status text."
|
|
3132
|
+
],
|
|
3133
|
+
"avoidWhen": [
|
|
3134
|
+
"Pending content has a predictable structure; use Skeleton to preserve that layout.",
|
|
3135
|
+
"Progress is measurable; use an appropriate determinate progress pattern.",
|
|
3136
|
+
"The UI needs a blocking overlay or automatic centering; the owning layout must provide that structure.",
|
|
3137
|
+
"Success, failure, retry, or completion must be communicated; the owning workflow handles outcomes."
|
|
3138
|
+
],
|
|
3139
|
+
"alternatives": [
|
|
3140
|
+
{
|
|
3141
|
+
"when": "A content region is waiting for structured data.",
|
|
3142
|
+
"component": "component:ds-skeleton",
|
|
3143
|
+
"reason": "Skeleton preserves the expected content geometry while data loads."
|
|
3144
|
+
},
|
|
3145
|
+
{
|
|
3146
|
+
"when": "A static visual symbol is needed without progress semantics.",
|
|
3147
|
+
"component": "component:ds-icon",
|
|
3148
|
+
"reason": "Icon owns non-progress system and flag glyphs."
|
|
3149
|
+
}
|
|
3150
|
+
],
|
|
3151
|
+
"commonlyComposedWith": [
|
|
3152
|
+
"component:ds-button-filled",
|
|
3153
|
+
"component:ds-button-unfilled",
|
|
3154
|
+
"component:ds-input",
|
|
3155
|
+
"component:ds-select"
|
|
3156
|
+
],
|
|
3157
|
+
"accessibility": [
|
|
3158
|
+
"When Loader is nested in a busy button, field, or region, keep it unnamed and expose busy state from the owner.",
|
|
3159
|
+
"Standalone Loader requires contextual status text that explains what is loading; do not rely on a generic visual spinner alone.",
|
|
3160
|
+
"Loader is an informative progress graphic and must retain sufficient rendered contrast; tertiary and quaternary are not supported standalone or informative Loader treatments.",
|
|
3161
|
+
"Avoid duplicate announcements from both Loader and its owning busy region.",
|
|
3162
|
+
"Reduced motion stops rotation while keeping the glyph and status semantics visible."
|
|
3163
|
+
],
|
|
3164
|
+
"states": [
|
|
3165
|
+
"Loader communicates indeterminate progress only and does not emit completion or failure events.",
|
|
3166
|
+
"Omitted color inherits currentColor. Explicit semantic aliases and CSS-variable references match Icon when an independent progress color is required.",
|
|
3167
|
+
"Nested Loader inherits a readable color from its owning busy control or region rather than selecting tertiary or quaternary directly.",
|
|
3168
|
+
"The owner decides whether to delay Loader visibility for short operations and removes it when the operation settles.",
|
|
3169
|
+
"The owner reserves space and supplies centering or overlay layout so Loader never causes unexpected layout movement."
|
|
3170
|
+
],
|
|
3171
|
+
"responsiveBehavior": [
|
|
3172
|
+
"The owning component or layout chooses Loader size, placement, and any responsive changes.",
|
|
3173
|
+
"Loader does not infer container size or viewport breakpoints."
|
|
3174
|
+
],
|
|
3175
|
+
"frameworkCaveats": {
|
|
3176
|
+
"customElements": [
|
|
3177
|
+
"Use the label only for standalone status; nested usage should synchronize aria-busy on the owning element."
|
|
3178
|
+
],
|
|
3179
|
+
"react": [
|
|
3180
|
+
"Derive Loader visibility and the owner's busy state from the same operation state."
|
|
3181
|
+
],
|
|
3182
|
+
"angular": [
|
|
3183
|
+
"Derive Loader visibility and the owner's busy state from the same operation state."
|
|
3184
|
+
]
|
|
3185
|
+
},
|
|
3186
|
+
"references": [
|
|
3187
|
+
{
|
|
3188
|
+
"label": "Storybook examples",
|
|
3189
|
+
"path": "src/wc/components/Loader/Loader.stories.ts"
|
|
3190
|
+
}
|
|
3191
|
+
]
|
|
3192
|
+
},
|
|
3193
|
+
"props": {
|
|
3194
|
+
"color": {
|
|
3195
|
+
"type": "LoaderColor",
|
|
3196
|
+
"required": false
|
|
3197
|
+
},
|
|
3198
|
+
"label": {
|
|
3199
|
+
"type": "string | undefined",
|
|
3200
|
+
"required": false
|
|
3201
|
+
},
|
|
3202
|
+
"size": {
|
|
3203
|
+
"type": "LoaderSize",
|
|
3204
|
+
"required": false
|
|
3205
|
+
}
|
|
3206
|
+
},
|
|
3207
|
+
"events": [],
|
|
3208
|
+
"slots": [],
|
|
3209
|
+
"exports": {
|
|
3210
|
+
"customElement": "ds-loader",
|
|
3211
|
+
"react": "DsLoader",
|
|
3212
|
+
"angular": "DsLoader"
|
|
3213
|
+
}
|
|
3214
|
+
},
|
|
3215
|
+
"dependencies": [
|
|
3216
|
+
"@ds-mo/ui",
|
|
3217
|
+
"@ds-mo/tokens"
|
|
3218
|
+
],
|
|
3219
|
+
"registryDependencies": []
|
|
3220
|
+
},
|
|
3221
|
+
{
|
|
3222
|
+
"name": "markdown",
|
|
3223
|
+
"title": "Markdown",
|
|
3224
|
+
"description": "Safe CommonMark and GFM renderer built from parsed nodes without raw HTML injection.",
|
|
3225
|
+
"type": "registry:ui",
|
|
3226
|
+
"meta": {
|
|
3227
|
+
"library": "@ds-mo/ui",
|
|
3228
|
+
"distribution": "npm",
|
|
3229
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/markdown",
|
|
3230
|
+
"source": "src/wc/components/Markdown/Markdown.tsx",
|
|
3231
|
+
"intentStatus": "complete",
|
|
3232
|
+
"intent": {
|
|
3233
|
+
"audience": "specialized",
|
|
3234
|
+
"status": "experimental",
|
|
3235
|
+
"summary": "Safe CommonMark and GFM renderer built from parsed nodes without raw HTML injection.",
|
|
3236
|
+
"useWhen": [
|
|
3237
|
+
"Trusted or untrusted message text needs headings, lists, links, tables, tasks, quotes, and code."
|
|
3238
|
+
],
|
|
3239
|
+
"avoidWhen": [
|
|
3240
|
+
"The application needs arbitrary HTML, custom plugins, or a full document CMS renderer."
|
|
3241
|
+
],
|
|
3242
|
+
"commonlyComposedWith": [
|
|
3243
|
+
"component:ds-code-block",
|
|
3244
|
+
"component:ds-message-bubble"
|
|
3245
|
+
],
|
|
3246
|
+
"patterns": [
|
|
3247
|
+
"pattern:conversation",
|
|
3248
|
+
"pattern:agent-chat"
|
|
3249
|
+
],
|
|
3250
|
+
"accessibility": [
|
|
3251
|
+
"Semantic parsed elements preserve heading, list, table, quote, and code relationships.",
|
|
3252
|
+
"Raw HTML is ignored and unsafe link schemes are not made interactive.",
|
|
3253
|
+
"Link text must remain descriptive in authored content."
|
|
3254
|
+
],
|
|
3255
|
+
"states": [
|
|
3256
|
+
"Streaming updates are coalesced to one parse and render per animation frame."
|
|
2162
3257
|
],
|
|
2163
3258
|
"responsiveBehavior": [
|
|
2164
|
-
"
|
|
2165
|
-
|
|
2166
|
-
|
|
3259
|
+
"Tables and code scroll horizontally instead of forcing the transcript wider."
|
|
3260
|
+
],
|
|
3261
|
+
"references": [
|
|
3262
|
+
{
|
|
3263
|
+
"label": "Storybook examples",
|
|
3264
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
3265
|
+
}
|
|
3266
|
+
]
|
|
3267
|
+
},
|
|
3268
|
+
"props": {
|
|
3269
|
+
"content": {
|
|
3270
|
+
"type": "string",
|
|
3271
|
+
"required": false
|
|
3272
|
+
},
|
|
3273
|
+
"streaming": {
|
|
3274
|
+
"type": "boolean",
|
|
3275
|
+
"required": false
|
|
3276
|
+
}
|
|
3277
|
+
},
|
|
3278
|
+
"events": [],
|
|
3279
|
+
"slots": [],
|
|
3280
|
+
"exports": {
|
|
3281
|
+
"customElement": "ds-markdown",
|
|
3282
|
+
"react": "DsMarkdown",
|
|
3283
|
+
"angular": "DsMarkdown"
|
|
3284
|
+
}
|
|
3285
|
+
},
|
|
3286
|
+
"dependencies": [
|
|
3287
|
+
"@ds-mo/ui",
|
|
3288
|
+
"@ds-mo/tokens"
|
|
3289
|
+
],
|
|
3290
|
+
"registryDependencies": [
|
|
3291
|
+
"code-block"
|
|
3292
|
+
]
|
|
3293
|
+
},
|
|
3294
|
+
{
|
|
3295
|
+
"name": "menu",
|
|
3296
|
+
"title": "Menu",
|
|
3297
|
+
"description": "Anchored action menu with flat commands, grouped sections, single-selection radio choices, supplemental notification dots, switches, and destructive actions.",
|
|
3298
|
+
"type": "registry:ui",
|
|
3299
|
+
"meta": {
|
|
3300
|
+
"library": "@ds-mo/ui",
|
|
3301
|
+
"distribution": "npm",
|
|
3302
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/menu",
|
|
3303
|
+
"source": "src/wc/components/Menu/Menu.tsx",
|
|
3304
|
+
"intentStatus": "complete",
|
|
3305
|
+
"intent": {
|
|
3306
|
+
"audience": "general",
|
|
3307
|
+
"status": "stable",
|
|
3308
|
+
"summary": "Anchored action menu with flat commands, grouped sections, single-selection radio choices, supplemental notification dots, switches, and destructive actions.",
|
|
3309
|
+
"useWhen": [
|
|
3310
|
+
"A trigger reveals a short contextual list of commands or state-changing actions.",
|
|
3311
|
+
"Actions need grouping, mutually exclusive selected state, supplemental notification dots, switch rows, or destructive treatment."
|
|
3312
|
+
],
|
|
3313
|
+
"avoidWhen": [
|
|
3314
|
+
"The user is selecting a value for a form field.",
|
|
3315
|
+
"The content requires rich dialog interaction or a multi-step workflow.",
|
|
3316
|
+
"The actions should remain persistently visible."
|
|
3317
|
+
],
|
|
3318
|
+
"alternatives": [
|
|
3319
|
+
{
|
|
3320
|
+
"when": "The choice is a form value with a label, validation, and submitted value.",
|
|
3321
|
+
"component": "component:ds-select",
|
|
3322
|
+
"reason": "Select provides form-control semantics and value ownership."
|
|
3323
|
+
},
|
|
3324
|
+
{
|
|
3325
|
+
"when": "Several form values may be selected.",
|
|
3326
|
+
"component": "component:ds-select-multi",
|
|
3327
|
+
"reason": "SelectMulti provides multi-select listbox semantics, array value ownership, and count presentation."
|
|
3328
|
+
},
|
|
3329
|
+
{
|
|
3330
|
+
"when": "The interaction needs substantial content, confirmation, or a form.",
|
|
3331
|
+
"component": "component:ds-modal",
|
|
3332
|
+
"reason": "Modal owns focus containment and dialog-level interaction."
|
|
3333
|
+
}
|
|
3334
|
+
],
|
|
3335
|
+
"commonlyComposedWith": [
|
|
3336
|
+
"component:ds-button-unfilled",
|
|
3337
|
+
"component:ds-panel-nav",
|
|
3338
|
+
"component:ds-switch",
|
|
3339
|
+
"component:ds-swatch-picker"
|
|
3340
|
+
],
|
|
3341
|
+
"patterns": [
|
|
3342
|
+
"pattern:menu-trigger"
|
|
3343
|
+
],
|
|
3344
|
+
"accessibility": [
|
|
3345
|
+
"Anchor the menu to the control that opens it and return focus to that control when the menu closes.",
|
|
3346
|
+
"Open with visible initial focus only when the trigger was activated from the keyboard.",
|
|
3347
|
+
"Keep disabled items discoverable only when their unavailable state is meaningful.",
|
|
3348
|
+
"Switch rows use menuitemcheckbox semantics on the row; the nested ds-switch is an aria-hidden md presentation indicator.",
|
|
3349
|
+
"Single-selection menus use menuitemradio semantics and aria-checked on each row; the leading radio mark is presentation-only.",
|
|
3350
|
+
"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.",
|
|
3351
|
+
"Use notification dots only as supplemental status and not as the sole indication of important information."
|
|
3352
|
+
],
|
|
3353
|
+
"states": [
|
|
3354
|
+
"The host owns open state and responds to selection and close events.",
|
|
3355
|
+
"Use either flat items or sections, not both.",
|
|
3356
|
+
"After dsSelect from a switch row, update switchValue in the items property so the controlled indicator reflects the new state.",
|
|
3357
|
+
"For selectionMode single, keep exactly one item isSelected and update the items property after dsSelect.",
|
|
3358
|
+
"Arrays, objects, and element anchors must be assigned as JavaScript properties.",
|
|
3359
|
+
"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."
|
|
3360
|
+
],
|
|
3361
|
+
"responsiveBehavior": [
|
|
3362
|
+
"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.",
|
|
3363
|
+
"Choose placement relative to the trigger and allow the component to clamp the popup to the viewport.",
|
|
3364
|
+
"Avoid fixed widths that exceed narrow viewports."
|
|
2167
3365
|
],
|
|
2168
3366
|
"frameworkCaveats": {
|
|
2169
3367
|
"customElements": [
|
|
2170
|
-
"
|
|
2171
|
-
"Use the form attribute on the host when associating an input rendered outside its owning form."
|
|
3368
|
+
"Assign items, sections, and HTMLElement anchors as properties after the element is defined."
|
|
2172
3369
|
],
|
|
2173
3370
|
"react": [
|
|
2174
|
-
"
|
|
3371
|
+
"Pass arrays and objects as wrapper props and handle generated onDsSelect and onDsClose event props."
|
|
2175
3372
|
],
|
|
2176
3373
|
"angular": [
|
|
2177
|
-
"
|
|
3374
|
+
"Use property bindings for arrays, objects, and anchors and event bindings for dsSelect and dsClose."
|
|
2178
3375
|
]
|
|
2179
3376
|
},
|
|
2180
3377
|
"references": [
|
|
2181
3378
|
{
|
|
2182
3379
|
"label": "Storybook examples",
|
|
2183
|
-
"path": "src/wc/components/
|
|
3380
|
+
"path": "src/wc/components/Menu/Menu.stories.ts"
|
|
2184
3381
|
},
|
|
2185
3382
|
{
|
|
2186
|
-
"label": "
|
|
2187
|
-
"path": "
|
|
3383
|
+
"label": "Framework integration",
|
|
3384
|
+
"path": "docs/framework-integration.md"
|
|
2188
3385
|
}
|
|
2189
3386
|
]
|
|
2190
3387
|
},
|
|
2191
3388
|
"props": {
|
|
2192
|
-
"
|
|
2193
|
-
"type": "
|
|
3389
|
+
"align": {
|
|
3390
|
+
"type": "MenuAlign",
|
|
2194
3391
|
"required": false
|
|
2195
3392
|
},
|
|
2196
|
-
"
|
|
2197
|
-
"type": "
|
|
3393
|
+
"alignOffset": {
|
|
3394
|
+
"type": "number | string",
|
|
2198
3395
|
"required": false
|
|
2199
3396
|
},
|
|
2200
|
-
"
|
|
2201
|
-
"type": "
|
|
3397
|
+
"anchor": {
|
|
3398
|
+
"type": "HTMLElement | undefined",
|
|
2202
3399
|
"required": false
|
|
2203
3400
|
},
|
|
2204
|
-
"
|
|
3401
|
+
"anchorAlignment": {
|
|
3402
|
+
"type": "ChoicePopupAnchorAlignment",
|
|
3403
|
+
"required": false
|
|
3404
|
+
},
|
|
3405
|
+
"anchorId": {
|
|
2205
3406
|
"type": "string | undefined",
|
|
2206
3407
|
"required": false
|
|
2207
3408
|
},
|
|
2208
|
-
"
|
|
3409
|
+
"initialFocusVisible": {
|
|
2209
3410
|
"type": "boolean",
|
|
2210
3411
|
"required": false
|
|
2211
3412
|
},
|
|
2212
|
-
"
|
|
3413
|
+
"items": {
|
|
3414
|
+
"type": "MenuItemData[]",
|
|
3415
|
+
"required": false
|
|
3416
|
+
},
|
|
3417
|
+
"menuLabel": {
|
|
2213
3418
|
"type": "string",
|
|
2214
3419
|
"required": false
|
|
2215
3420
|
},
|
|
2216
|
-
"
|
|
2217
|
-
"type": "
|
|
3421
|
+
"menuWidth": {
|
|
3422
|
+
"type": "string | undefined",
|
|
2218
3423
|
"required": false
|
|
2219
3424
|
},
|
|
2220
|
-
"
|
|
2221
|
-
"type": "string",
|
|
3425
|
+
"minWidth": {
|
|
3426
|
+
"type": "string | undefined",
|
|
2222
3427
|
"required": false
|
|
2223
3428
|
},
|
|
2224
|
-
"
|
|
3429
|
+
"open": {
|
|
2225
3430
|
"type": "boolean",
|
|
2226
3431
|
"required": false
|
|
2227
3432
|
},
|
|
2228
|
-
"
|
|
2229
|
-
"type": "
|
|
3433
|
+
"sections": {
|
|
3434
|
+
"type": "MenuSection[]",
|
|
2230
3435
|
"required": false
|
|
2231
3436
|
},
|
|
2232
|
-
"
|
|
2233
|
-
"type": "
|
|
3437
|
+
"selectionMode": {
|
|
3438
|
+
"type": "MenuSelectionMode",
|
|
2234
3439
|
"required": false
|
|
2235
3440
|
},
|
|
2236
|
-
"
|
|
2237
|
-
"type": "
|
|
3441
|
+
"side": {
|
|
3442
|
+
"type": "MenuSide",
|
|
2238
3443
|
"required": false
|
|
2239
3444
|
},
|
|
2240
|
-
"
|
|
2241
|
-
"type": "
|
|
3445
|
+
"sideOffset": {
|
|
3446
|
+
"type": "number | string",
|
|
2242
3447
|
"required": false
|
|
3448
|
+
}
|
|
3449
|
+
},
|
|
3450
|
+
"events": [
|
|
3451
|
+
{
|
|
3452
|
+
"name": "dsAfterClose",
|
|
3453
|
+
"detail": "void"
|
|
2243
3454
|
},
|
|
2244
|
-
|
|
2245
|
-
"
|
|
2246
|
-
"
|
|
3455
|
+
{
|
|
3456
|
+
"name": "dsClose",
|
|
3457
|
+
"detail": "void"
|
|
2247
3458
|
},
|
|
2248
|
-
|
|
3459
|
+
{
|
|
3460
|
+
"name": "dsGradientSelect",
|
|
3461
|
+
"detail": "ShellGradientPreset"
|
|
3462
|
+
},
|
|
3463
|
+
{
|
|
3464
|
+
"name": "dsSelect",
|
|
3465
|
+
"detail": "MenuItemData"
|
|
3466
|
+
},
|
|
3467
|
+
{
|
|
3468
|
+
"name": "dsSwatchSelect",
|
|
3469
|
+
"detail": "string"
|
|
3470
|
+
}
|
|
3471
|
+
],
|
|
3472
|
+
"slots": [],
|
|
3473
|
+
"exports": {
|
|
3474
|
+
"customElement": "ds-menu",
|
|
3475
|
+
"react": "DsMenu",
|
|
3476
|
+
"angular": "DsMenu"
|
|
3477
|
+
}
|
|
3478
|
+
},
|
|
3479
|
+
"dependencies": [
|
|
3480
|
+
"@ds-mo/ui",
|
|
3481
|
+
"@ds-mo/tokens"
|
|
3482
|
+
],
|
|
3483
|
+
"registryDependencies": [
|
|
3484
|
+
"badge",
|
|
3485
|
+
"swatch-picker",
|
|
3486
|
+
"switch",
|
|
3487
|
+
"text"
|
|
3488
|
+
]
|
|
3489
|
+
},
|
|
3490
|
+
{
|
|
3491
|
+
"name": "message",
|
|
3492
|
+
"title": "Message",
|
|
3493
|
+
"description": "Channel-neutral message row owning direction, grouping, author, time, delivery metadata, and accessory regions.",
|
|
3494
|
+
"type": "registry:ui",
|
|
3495
|
+
"meta": {
|
|
3496
|
+
"library": "@ds-mo/ui",
|
|
3497
|
+
"distribution": "npm",
|
|
3498
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/message",
|
|
3499
|
+
"source": "src/wc/components/Message/Message.tsx",
|
|
3500
|
+
"intentStatus": "complete",
|
|
3501
|
+
"intent": {
|
|
3502
|
+
"audience": "general",
|
|
3503
|
+
"status": "experimental",
|
|
3504
|
+
"summary": "Channel-neutral message row owning direction, grouping, author, time, delivery metadata, and accessory regions.",
|
|
3505
|
+
"useWhen": [
|
|
3506
|
+
"A transcript contains messages that need consistent incoming, outgoing, or system layout."
|
|
3507
|
+
],
|
|
3508
|
+
"avoidWhen": [
|
|
3509
|
+
"Content is not an authored message in a conversation."
|
|
3510
|
+
],
|
|
3511
|
+
"commonlyComposedWith": [
|
|
3512
|
+
"component:ds-message-bubble",
|
|
3513
|
+
"component:ds-message-scroller"
|
|
3514
|
+
],
|
|
3515
|
+
"patterns": [
|
|
3516
|
+
"pattern:conversation"
|
|
3517
|
+
],
|
|
3518
|
+
"accessibility": [
|
|
3519
|
+
"Author and time metadata remain textual when they are necessary to interpret the transcript.",
|
|
3520
|
+
"Delivery failure must be expressed in text rather than color alone."
|
|
3521
|
+
],
|
|
3522
|
+
"states": [
|
|
3523
|
+
"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.",
|
|
3524
|
+
"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.",
|
|
3525
|
+
"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."
|
|
3526
|
+
],
|
|
3527
|
+
"responsiveBehavior": [
|
|
3528
|
+
"Outgoing and incoming rows adapt to available width while preserving their directional alignment."
|
|
3529
|
+
],
|
|
3530
|
+
"references": [
|
|
3531
|
+
{
|
|
3532
|
+
"label": "Storybook examples",
|
|
3533
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
3534
|
+
}
|
|
3535
|
+
]
|
|
3536
|
+
},
|
|
3537
|
+
"props": {
|
|
3538
|
+
"author": {
|
|
2249
3539
|
"type": "string",
|
|
2250
3540
|
"required": false
|
|
2251
3541
|
},
|
|
2252
|
-
"
|
|
2253
|
-
"type": "
|
|
3542
|
+
"deliveryState": {
|
|
3543
|
+
"type": "MessageDeliveryState | undefined",
|
|
2254
3544
|
"required": false
|
|
2255
3545
|
},
|
|
2256
|
-
"
|
|
2257
|
-
"type": "
|
|
3546
|
+
"direction": {
|
|
3547
|
+
"type": "MessageDirection",
|
|
2258
3548
|
"required": false
|
|
2259
3549
|
},
|
|
2260
|
-
"
|
|
2261
|
-
"type": "
|
|
3550
|
+
"groupPosition": {
|
|
3551
|
+
"type": "MessageGroupPosition",
|
|
2262
3552
|
"required": false
|
|
2263
3553
|
},
|
|
2264
|
-
"
|
|
2265
|
-
"type": "
|
|
3554
|
+
"messageId": {
|
|
3555
|
+
"type": "string",
|
|
2266
3556
|
"required": false
|
|
2267
3557
|
},
|
|
2268
|
-
"
|
|
3558
|
+
"scrollAnchor": {
|
|
2269
3559
|
"type": "boolean",
|
|
2270
3560
|
"required": false
|
|
2271
3561
|
},
|
|
2272
|
-
"
|
|
2273
|
-
"type": "
|
|
2274
|
-
"required": false
|
|
2275
|
-
},
|
|
2276
|
-
"size": {
|
|
2277
|
-
"type": "InputSize",
|
|
3562
|
+
"showAuthor": {
|
|
3563
|
+
"type": "boolean",
|
|
2278
3564
|
"required": false
|
|
2279
3565
|
},
|
|
2280
|
-
"
|
|
2281
|
-
"type": "
|
|
3566
|
+
"streaming": {
|
|
3567
|
+
"type": "boolean",
|
|
2282
3568
|
"required": false
|
|
2283
3569
|
},
|
|
2284
|
-
"
|
|
3570
|
+
"timestamp": {
|
|
2285
3571
|
"type": "string",
|
|
2286
3572
|
"required": false
|
|
2287
|
-
},
|
|
2288
|
-
"width": {
|
|
2289
|
-
"type": "InputWidth",
|
|
2290
|
-
"required": false
|
|
2291
3573
|
}
|
|
2292
3574
|
},
|
|
2293
|
-
"events": [
|
|
2294
|
-
{
|
|
2295
|
-
"name": "dsChange",
|
|
2296
|
-
"detail": "string"
|
|
2297
|
-
},
|
|
2298
|
-
{
|
|
2299
|
-
"name": "dsClear",
|
|
2300
|
-
"detail": "void"
|
|
2301
|
-
}
|
|
2302
|
-
],
|
|
3575
|
+
"events": [],
|
|
2303
3576
|
"slots": [],
|
|
2304
3577
|
"exports": {
|
|
2305
|
-
"customElement": "ds-
|
|
2306
|
-
"react": "
|
|
2307
|
-
"angular": "
|
|
3578
|
+
"customElement": "ds-message",
|
|
3579
|
+
"react": "DsMessage",
|
|
3580
|
+
"angular": "DsMessage"
|
|
2308
3581
|
}
|
|
2309
3582
|
},
|
|
2310
3583
|
"dependencies": [
|
|
2311
3584
|
"@ds-mo/ui",
|
|
2312
|
-
"@ds-mo/tokens"
|
|
2313
|
-
"@ds-mo/icons"
|
|
3585
|
+
"@ds-mo/tokens"
|
|
2314
3586
|
],
|
|
2315
3587
|
"registryDependencies": [
|
|
2316
|
-
"button-unfilled",
|
|
2317
|
-
"icon",
|
|
2318
3588
|
"text"
|
|
2319
3589
|
]
|
|
2320
3590
|
},
|
|
2321
3591
|
{
|
|
2322
|
-
"name": "
|
|
2323
|
-
"title": "
|
|
2324
|
-
"description": "
|
|
3592
|
+
"name": "message-bubble",
|
|
3593
|
+
"title": "MessageBubble",
|
|
3594
|
+
"description": "Visible message content surface with a body-medium default, separated from message-row direction and metadata.",
|
|
2325
3595
|
"type": "registry:ui",
|
|
2326
3596
|
"meta": {
|
|
2327
3597
|
"library": "@ds-mo/ui",
|
|
2328
3598
|
"distribution": "npm",
|
|
2329
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
2330
|
-
"source": "src/wc/components/
|
|
3599
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/message-bubble",
|
|
3600
|
+
"source": "src/wc/components/MessageBubble/MessageBubble.tsx",
|
|
2331
3601
|
"intentStatus": "complete",
|
|
2332
3602
|
"intent": {
|
|
2333
3603
|
"audience": "general",
|
|
2334
|
-
"status": "
|
|
2335
|
-
"summary": "
|
|
3604
|
+
"status": "experimental",
|
|
3605
|
+
"summary": "Visible message content surface with a body-medium default, separated from message-row direction and metadata.",
|
|
2336
3606
|
"useWhen": [
|
|
2337
|
-
"
|
|
2338
|
-
"
|
|
2339
|
-
"A standalone operation needs a visible spinner with contextual polite status text."
|
|
3607
|
+
"Message content needs a primary, secondary, ghost, or error surface within a Message row.",
|
|
3608
|
+
"Plain incoming or outgoing message copy should use the shared body-medium regular typography recipe without application styling."
|
|
2340
3609
|
],
|
|
2341
3610
|
"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
|
-
}
|
|
3611
|
+
"The surface is a general card, callout, or form container.",
|
|
3612
|
+
"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
3613
|
],
|
|
2359
3614
|
"commonlyComposedWith": [
|
|
2360
|
-
"component:ds-
|
|
2361
|
-
"component:ds-
|
|
2362
|
-
"component:ds-input",
|
|
2363
|
-
"component:ds-select"
|
|
3615
|
+
"component:ds-message",
|
|
3616
|
+
"component:ds-markdown"
|
|
2364
3617
|
],
|
|
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."
|
|
3618
|
+
"patterns": [
|
|
3619
|
+
"pattern:conversation"
|
|
2371
3620
|
],
|
|
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."
|
|
3621
|
+
"accessibility": [
|
|
3622
|
+
"Surface styling does not add semantics; meaningful error or status copy belongs in message content or metadata."
|
|
2378
3623
|
],
|
|
2379
3624
|
"responsiveBehavior": [
|
|
2380
|
-
"The
|
|
2381
|
-
"Loader does not infer container size or viewport breakpoints."
|
|
3625
|
+
"The bubble wraps content and allows wide ghost responses to use more transcript width."
|
|
2382
3626
|
],
|
|
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
3627
|
"references": [
|
|
2395
3628
|
{
|
|
2396
3629
|
"label": "Storybook examples",
|
|
2397
|
-
"path": "src/wc/components/
|
|
3630
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
2398
3631
|
}
|
|
2399
3632
|
]
|
|
2400
3633
|
},
|
|
2401
3634
|
"props": {
|
|
2402
|
-
"
|
|
2403
|
-
"type": "
|
|
2404
|
-
"required": false
|
|
2405
|
-
},
|
|
2406
|
-
"label": {
|
|
2407
|
-
"type": "string | undefined",
|
|
2408
|
-
"required": false
|
|
2409
|
-
},
|
|
2410
|
-
"size": {
|
|
2411
|
-
"type": "LoaderSize",
|
|
3635
|
+
"variant": {
|
|
3636
|
+
"type": "MessageBubbleVariant",
|
|
2412
3637
|
"required": false
|
|
2413
3638
|
}
|
|
2414
3639
|
},
|
|
2415
3640
|
"events": [],
|
|
2416
3641
|
"slots": [],
|
|
2417
3642
|
"exports": {
|
|
2418
|
-
"customElement": "ds-
|
|
2419
|
-
"react": "
|
|
2420
|
-
"angular": "
|
|
3643
|
+
"customElement": "ds-message-bubble",
|
|
3644
|
+
"react": "DsMessageBubble",
|
|
3645
|
+
"angular": "DsMessageBubble"
|
|
2421
3646
|
}
|
|
2422
3647
|
},
|
|
2423
3648
|
"dependencies": [
|
|
@@ -2427,178 +3652,191 @@
|
|
|
2427
3652
|
"registryDependencies": []
|
|
2428
3653
|
},
|
|
2429
3654
|
{
|
|
2430
|
-
"name": "
|
|
2431
|
-
"title": "
|
|
2432
|
-
"description": "
|
|
3655
|
+
"name": "message-composer",
|
|
3656
|
+
"title": "MessageComposer",
|
|
3657
|
+
"description": "Two-line auto-growing conversation textarea with submit, stop, error, and extensible leading-tool or trailing-action regions.",
|
|
2433
3658
|
"type": "registry:ui",
|
|
2434
3659
|
"meta": {
|
|
2435
3660
|
"library": "@ds-mo/ui",
|
|
2436
3661
|
"distribution": "npm",
|
|
2437
|
-
"storybook": "https://zainadeel.github.io/compomo/?path=/story/
|
|
2438
|
-
"source": "src/wc/components/
|
|
3662
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/message-composer",
|
|
3663
|
+
"source": "src/wc/components/MessageComposer/MessageComposer.tsx",
|
|
2439
3664
|
"intentStatus": "complete",
|
|
2440
3665
|
"intent": {
|
|
2441
3666
|
"audience": "general",
|
|
2442
|
-
"status": "
|
|
2443
|
-
"summary": "
|
|
3667
|
+
"status": "experimental",
|
|
3668
|
+
"summary": "Two-line auto-growing conversation textarea with submit, stop, error, and extensible leading-tool or trailing-action regions.",
|
|
2444
3669
|
"useWhen": [
|
|
2445
|
-
"A
|
|
2446
|
-
"Actions need grouping, selected state, supplemental notification dots, switch rows, or destructive treatment."
|
|
3670
|
+
"A conversation accepts multi-line text and needs Enter-to-submit with a streaming stop action."
|
|
2447
3671
|
],
|
|
2448
3672
|
"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
|
-
}
|
|
3673
|
+
"The text is a conventional form field submitted with unrelated fields."
|
|
2469
3674
|
],
|
|
2470
3675
|
"commonlyComposedWith": [
|
|
2471
|
-
"component:ds-
|
|
2472
|
-
"component:ds-
|
|
2473
|
-
"component:ds-
|
|
2474
|
-
"component:ds-swatch-picker"
|
|
3676
|
+
"component:ds-message-scroller",
|
|
3677
|
+
"component:ds-button-filled",
|
|
3678
|
+
"component:ds-button-unfilled"
|
|
2475
3679
|
],
|
|
2476
3680
|
"patterns": [
|
|
2477
|
-
"pattern:
|
|
3681
|
+
"pattern:conversation"
|
|
2478
3682
|
],
|
|
2479
3683
|
"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."
|
|
3684
|
+
"Always provide a localized textarea label and submit or stop action names.",
|
|
3685
|
+
"Shift plus Enter inserts a newline while Enter submits non-empty content.",
|
|
3686
|
+
"Streaming and error states remain perceivable without relying on icon shape alone."
|
|
2486
3687
|
],
|
|
2487
3688
|
"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."
|
|
3689
|
+
"The owner controls draft value and transport state; the composer emits intent without performing transport.",
|
|
3690
|
+
"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.",
|
|
3691
|
+
"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
3692
|
],
|
|
2494
3693
|
"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."
|
|
3694
|
+
"The textarea begins at two body-medium lines, grows one line at a time through six lines, and then scrolls internally."
|
|
2498
3695
|
],
|
|
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
3696
|
"references": [
|
|
2511
3697
|
{
|
|
2512
3698
|
"label": "Storybook examples",
|
|
2513
|
-
"path": "src/wc/components/
|
|
3699
|
+
"path": "src/wc/components/MessageComposer/MessageComposer.stories.ts"
|
|
2514
3700
|
},
|
|
2515
3701
|
{
|
|
2516
|
-
"label": "
|
|
2517
|
-
"path": "
|
|
3702
|
+
"label": "Scroller overlay composition",
|
|
3703
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
2518
3704
|
}
|
|
2519
3705
|
]
|
|
2520
3706
|
},
|
|
2521
3707
|
"props": {
|
|
2522
|
-
"
|
|
2523
|
-
"type": "
|
|
3708
|
+
"isInactive": {
|
|
3709
|
+
"type": "boolean",
|
|
2524
3710
|
"required": false
|
|
2525
3711
|
},
|
|
2526
|
-
"
|
|
2527
|
-
"type": "
|
|
3712
|
+
"label": {
|
|
3713
|
+
"type": "string",
|
|
2528
3714
|
"required": false
|
|
2529
3715
|
},
|
|
2530
|
-
"
|
|
2531
|
-
"type": "
|
|
3716
|
+
"placeholder": {
|
|
3717
|
+
"type": "string",
|
|
2532
3718
|
"required": false
|
|
2533
3719
|
},
|
|
2534
|
-
"
|
|
2535
|
-
"type": "
|
|
3720
|
+
"status": {
|
|
3721
|
+
"type": "MessageComposerStatus",
|
|
2536
3722
|
"required": false
|
|
2537
3723
|
},
|
|
2538
|
-
"
|
|
2539
|
-
"type": "
|
|
3724
|
+
"submitIntent": {
|
|
3725
|
+
"type": "ButtonFilledIntent",
|
|
2540
3726
|
"required": false
|
|
2541
3727
|
},
|
|
2542
|
-
"
|
|
3728
|
+
"value": {
|
|
3729
|
+
"type": "string",
|
|
3730
|
+
"required": false
|
|
3731
|
+
}
|
|
3732
|
+
},
|
|
3733
|
+
"events": [
|
|
3734
|
+
{
|
|
3735
|
+
"name": "dsInput",
|
|
3736
|
+
"detail": "string"
|
|
3737
|
+
},
|
|
3738
|
+
{
|
|
3739
|
+
"name": "dsStop",
|
|
3740
|
+
"detail": "void"
|
|
3741
|
+
},
|
|
3742
|
+
{
|
|
3743
|
+
"name": "dsSubmit",
|
|
3744
|
+
"detail": "{ text: string }"
|
|
3745
|
+
}
|
|
3746
|
+
],
|
|
3747
|
+
"slots": [],
|
|
3748
|
+
"exports": {
|
|
3749
|
+
"customElement": "ds-message-composer",
|
|
3750
|
+
"react": "DsMessageComposer",
|
|
3751
|
+
"angular": "DsMessageComposer"
|
|
3752
|
+
}
|
|
3753
|
+
},
|
|
3754
|
+
"dependencies": [
|
|
3755
|
+
"@ds-mo/ui",
|
|
3756
|
+
"@ds-mo/tokens"
|
|
3757
|
+
],
|
|
3758
|
+
"registryDependencies": [
|
|
3759
|
+
"button-filled"
|
|
3760
|
+
]
|
|
3761
|
+
},
|
|
3762
|
+
{
|
|
3763
|
+
"name": "message-scroller",
|
|
3764
|
+
"title": "MessageScroller",
|
|
3765
|
+
"description": "Focusable transcript scroller that follows the live edge only while the reader remains there.",
|
|
3766
|
+
"type": "registry:ui",
|
|
3767
|
+
"meta": {
|
|
3768
|
+
"library": "@ds-mo/ui",
|
|
3769
|
+
"distribution": "npm",
|
|
3770
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/message-scroller",
|
|
3771
|
+
"source": "src/wc/components/MessageScroller/MessageScroller.tsx",
|
|
3772
|
+
"intentStatus": "complete",
|
|
3773
|
+
"intent": {
|
|
3774
|
+
"audience": "general",
|
|
3775
|
+
"status": "experimental",
|
|
3776
|
+
"summary": "Focusable transcript scroller that follows the live edge only while the reader remains there.",
|
|
3777
|
+
"useWhen": [
|
|
3778
|
+
"Messages can append or stream and transcript position must remain respectful of reader intent."
|
|
3779
|
+
],
|
|
3780
|
+
"avoidWhen": [
|
|
3781
|
+
"Content is static prose without message navigation or live updates."
|
|
3782
|
+
],
|
|
3783
|
+
"commonlyComposedWith": [
|
|
3784
|
+
"component:ds-message",
|
|
3785
|
+
"component:ds-message-composer"
|
|
3786
|
+
],
|
|
3787
|
+
"patterns": [
|
|
3788
|
+
"pattern:conversation"
|
|
3789
|
+
],
|
|
3790
|
+
"accessibility": [
|
|
3791
|
+
"Give each transcript a concise localized label.",
|
|
3792
|
+
"New content is exposed through log semantics without stealing focus.",
|
|
3793
|
+
"The scroll-to-latest control remains keyboard accessible when follow behavior is released."
|
|
3794
|
+
],
|
|
3795
|
+
"states": [
|
|
3796
|
+
"Selection and transcript interaction release automatic following.",
|
|
3797
|
+
"Opening saved history, message jumps, and prepended history preserve deliberate position.",
|
|
3798
|
+
"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.",
|
|
3799
|
+
"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."
|
|
3800
|
+
],
|
|
3801
|
+
"responsiveBehavior": [
|
|
3802
|
+
"Transcript width is readable while the scroll region fills available height."
|
|
3803
|
+
],
|
|
3804
|
+
"references": [
|
|
3805
|
+
{
|
|
3806
|
+
"label": "Storybook examples",
|
|
3807
|
+
"path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
|
|
3808
|
+
}
|
|
3809
|
+
]
|
|
3810
|
+
},
|
|
3811
|
+
"props": {
|
|
3812
|
+
"autoFollow": {
|
|
2543
3813
|
"type": "boolean",
|
|
2544
3814
|
"required": false
|
|
2545
3815
|
},
|
|
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": {
|
|
3816
|
+
"busy": {
|
|
2563
3817
|
"type": "boolean",
|
|
2564
3818
|
"required": false
|
|
2565
3819
|
},
|
|
2566
|
-
"
|
|
2567
|
-
"type": "
|
|
2568
|
-
"required": false
|
|
2569
|
-
},
|
|
2570
|
-
"side": {
|
|
2571
|
-
"type": "MenuSide",
|
|
3820
|
+
"defaultPosition": {
|
|
3821
|
+
"type": "MessageScrollerPosition",
|
|
2572
3822
|
"required": false
|
|
2573
3823
|
},
|
|
2574
|
-
"
|
|
2575
|
-
"type": "
|
|
3824
|
+
"messagesLabel": {
|
|
3825
|
+
"type": "string",
|
|
2576
3826
|
"required": false
|
|
2577
3827
|
}
|
|
2578
3828
|
},
|
|
2579
3829
|
"events": [
|
|
2580
3830
|
{
|
|
2581
|
-
"name": "
|
|
3831
|
+
"name": "dsReachStart",
|
|
2582
3832
|
"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
3833
|
}
|
|
2596
3834
|
],
|
|
2597
3835
|
"slots": [],
|
|
2598
3836
|
"exports": {
|
|
2599
|
-
"customElement": "ds-
|
|
2600
|
-
"react": "
|
|
2601
|
-
"angular": "
|
|
3837
|
+
"customElement": "ds-message-scroller",
|
|
3838
|
+
"react": "DsMessageScroller",
|
|
3839
|
+
"angular": "DsMessageScroller"
|
|
2602
3840
|
}
|
|
2603
3841
|
},
|
|
2604
3842
|
"dependencies": [
|
|
@@ -2606,10 +3844,7 @@
|
|
|
2606
3844
|
"@ds-mo/tokens"
|
|
2607
3845
|
],
|
|
2608
3846
|
"registryDependencies": [
|
|
2609
|
-
"
|
|
2610
|
-
"swatch-picker",
|
|
2611
|
-
"switch",
|
|
2612
|
-
"text"
|
|
3847
|
+
"button-unfilled"
|
|
2613
3848
|
]
|
|
2614
3849
|
},
|
|
2615
3850
|
{
|
|
@@ -2777,6 +4012,10 @@
|
|
|
2777
4012
|
"type": "string",
|
|
2778
4013
|
"required": false
|
|
2779
4014
|
},
|
|
4015
|
+
"accountMenuExpanded": {
|
|
4016
|
+
"type": "boolean",
|
|
4017
|
+
"required": false
|
|
4018
|
+
},
|
|
2780
4019
|
"activeId": {
|
|
2781
4020
|
"type": "string",
|
|
2782
4021
|
"required": false
|
|
@@ -3024,6 +4263,270 @@
|
|
|
3024
4263
|
"text"
|
|
3025
4264
|
]
|
|
3026
4265
|
},
|
|
4266
|
+
{
|
|
4267
|
+
"name": "panel-tool-header",
|
|
4268
|
+
"title": "PanelToolHeader",
|
|
4269
|
+
"description": "Canonical left-aligned PanelTools header with an optional leading navigation or dismiss action and application-owned trailing icon actions.",
|
|
4270
|
+
"type": "registry:ui",
|
|
4271
|
+
"meta": {
|
|
4272
|
+
"library": "@ds-mo/ui",
|
|
4273
|
+
"distribution": "npm",
|
|
4274
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/panel-tool-header",
|
|
4275
|
+
"source": "src/wc/components/PanelToolHeader/PanelToolHeader.tsx",
|
|
4276
|
+
"intentStatus": "complete",
|
|
4277
|
+
"intent": {
|
|
4278
|
+
"audience": "general",
|
|
4279
|
+
"status": "experimental",
|
|
4280
|
+
"summary": "Canonical left-aligned PanelTools header with an optional leading navigation or dismiss action and application-owned trailing icon actions.",
|
|
4281
|
+
"useWhen": [
|
|
4282
|
+
"PanelTools needs its one shared root or detail header.",
|
|
4283
|
+
"A tool header needs a title with optional Back or Close navigation, menu, fullscreen, or other compact icon actions."
|
|
4284
|
+
],
|
|
4285
|
+
"avoidWhen": [
|
|
4286
|
+
"Rendering inside a PanelTools tool body; PanelTools already composes this canonical header above the body.",
|
|
4287
|
+
"The header belongs to page content."
|
|
4288
|
+
],
|
|
4289
|
+
"commonlyComposedWith": [
|
|
4290
|
+
"component:ds-button-unfilled"
|
|
4291
|
+
],
|
|
4292
|
+
"accessibility": [
|
|
4293
|
+
"Leading navigation or dismiss actions and trailing icon actions require concise localized names.",
|
|
4294
|
+
"The visible heading names the active panel or subview."
|
|
4295
|
+
],
|
|
4296
|
+
"states": [
|
|
4297
|
+
"The title remains left aligned whether the header has no actions, Back, one trailing action, or several trailing actions.",
|
|
4298
|
+
"Leading and trailing control zones never shrink; only the title consumes and truncates within the remaining width, with a fixed 4px gap between zones.",
|
|
4299
|
+
"Header chrome text is not selectable; actions remain keyboard focusable and interactive.",
|
|
4300
|
+
"Adjacent trailing actions keep the shared 4px control gap in drawer and fullscreen presentations.",
|
|
4301
|
+
"When fullscreen and overflow actions appear together, author fullscreen before overflow so Ellipses remains the rightmost action.",
|
|
4302
|
+
"PanelTools supplies application-owned actions and relays their ids through its shared dsHeaderAction event."
|
|
4303
|
+
],
|
|
4304
|
+
"responsiveBehavior": [
|
|
4305
|
+
"The title truncates between optional leading navigation and trailing action zones."
|
|
4306
|
+
],
|
|
4307
|
+
"references": [
|
|
4308
|
+
{
|
|
4309
|
+
"label": "Standalone examples",
|
|
4310
|
+
"path": "src/wc/components/PanelToolHeader/PanelToolHeader.stories.ts"
|
|
4311
|
+
}
|
|
4312
|
+
]
|
|
4313
|
+
},
|
|
4314
|
+
"props": {
|
|
4315
|
+
"actions": {
|
|
4316
|
+
"type": "PanelToolsHeaderAction[]",
|
|
4317
|
+
"required": false
|
|
4318
|
+
},
|
|
4319
|
+
"backAriaLabel": {
|
|
4320
|
+
"type": "string",
|
|
4321
|
+
"required": false
|
|
4322
|
+
},
|
|
4323
|
+
"backIcon": {
|
|
4324
|
+
"type": "string",
|
|
4325
|
+
"required": false
|
|
4326
|
+
},
|
|
4327
|
+
"heading": {
|
|
4328
|
+
"type": "string",
|
|
4329
|
+
"required": false
|
|
4330
|
+
},
|
|
4331
|
+
"menuAriaLabel": {
|
|
4332
|
+
"type": "string",
|
|
4333
|
+
"required": false
|
|
4334
|
+
},
|
|
4335
|
+
"menuControls": {
|
|
4336
|
+
"type": "string | undefined",
|
|
4337
|
+
"required": false
|
|
4338
|
+
},
|
|
4339
|
+
"menuExpanded": {
|
|
4340
|
+
"type": "boolean",
|
|
4341
|
+
"required": false
|
|
4342
|
+
},
|
|
4343
|
+
"menuTriggerId": {
|
|
4344
|
+
"type": "string",
|
|
4345
|
+
"required": false
|
|
4346
|
+
},
|
|
4347
|
+
"showBack": {
|
|
4348
|
+
"type": "boolean",
|
|
4349
|
+
"required": false
|
|
4350
|
+
},
|
|
4351
|
+
"showMenu": {
|
|
4352
|
+
"type": "boolean",
|
|
4353
|
+
"required": false
|
|
4354
|
+
}
|
|
4355
|
+
},
|
|
4356
|
+
"events": [
|
|
4357
|
+
{
|
|
4358
|
+
"name": "dsAction",
|
|
4359
|
+
"detail": "{ id: string; originalEvent: MouseEvent }"
|
|
4360
|
+
},
|
|
4361
|
+
{
|
|
4362
|
+
"name": "dsBack",
|
|
4363
|
+
"detail": "MouseEvent"
|
|
4364
|
+
},
|
|
4365
|
+
{
|
|
4366
|
+
"name": "dsMenuToggle",
|
|
4367
|
+
"detail": "MouseEvent"
|
|
4368
|
+
}
|
|
4369
|
+
],
|
|
4370
|
+
"slots": [],
|
|
4371
|
+
"exports": {
|
|
4372
|
+
"customElement": "ds-panel-tool-header",
|
|
4373
|
+
"react": "DsPanelToolHeader",
|
|
4374
|
+
"angular": "DsPanelToolHeader"
|
|
4375
|
+
}
|
|
4376
|
+
},
|
|
4377
|
+
"dependencies": [
|
|
4378
|
+
"@ds-mo/ui",
|
|
4379
|
+
"@ds-mo/tokens"
|
|
4380
|
+
],
|
|
4381
|
+
"registryDependencies": [
|
|
4382
|
+
"button-unfilled",
|
|
4383
|
+
"text"
|
|
4384
|
+
]
|
|
4385
|
+
},
|
|
4386
|
+
{
|
|
4387
|
+
"name": "panel-tool-search",
|
|
4388
|
+
"title": "PanelToolSearch",
|
|
4389
|
+
"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.",
|
|
4390
|
+
"type": "registry:ui",
|
|
4391
|
+
"meta": {
|
|
4392
|
+
"library": "@ds-mo/ui",
|
|
4393
|
+
"distribution": "npm",
|
|
4394
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/panel-tool-search",
|
|
4395
|
+
"source": "src/wc/components/PanelToolSearch/PanelToolSearch.tsx",
|
|
4396
|
+
"intentStatus": "complete",
|
|
4397
|
+
"intent": {
|
|
4398
|
+
"audience": "general",
|
|
4399
|
+
"status": "experimental",
|
|
4400
|
+
"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.",
|
|
4401
|
+
"useWhen": [
|
|
4402
|
+
"A PanelTools base view filters or searches the tool's own content.",
|
|
4403
|
+
"Several tool products need the same search-row geometry directly below the shared PanelTools header.",
|
|
4404
|
+
"The product needs a compact filter menu next to search while keeping its filter choices and matching policy application-owned."
|
|
4405
|
+
],
|
|
4406
|
+
"avoidWhen": [
|
|
4407
|
+
"The search belongs inside a Select or SelectMulti popup; use that component's searchable behavior.",
|
|
4408
|
+
"A form needs a labelled standalone field; compose ds-input inside ds-field instead."
|
|
4409
|
+
],
|
|
4410
|
+
"commonlyComposedWith": [
|
|
4411
|
+
"component:ds-panel-tools",
|
|
4412
|
+
"component:ds-conversation-list",
|
|
4413
|
+
"component:ds-input"
|
|
4414
|
+
],
|
|
4415
|
+
"accessibility": [
|
|
4416
|
+
"Provide an aria-label that names the searched domain, such as Search agent chats or Search messages.",
|
|
4417
|
+
"The standard search clear action restores focus and emits both the empty query and dsClear.",
|
|
4418
|
+
"When showFilter is enabled, provide stable filterTriggerId and filterControls values, synchronize filterExpanded with the controlled menu, and restore focus after selection."
|
|
4419
|
+
],
|
|
4420
|
+
"states": [
|
|
4421
|
+
"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.",
|
|
4422
|
+
"The search icon stays foreground-secondary at rest, hover, focus, active, and while the query is filled.",
|
|
4423
|
+
"The row and control surface remain transparent so the AppShell chrome wash is visible behind them.",
|
|
4424
|
+
"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.",
|
|
4425
|
+
"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."
|
|
4426
|
+
],
|
|
4427
|
+
"responsiveBehavior": [
|
|
4428
|
+
"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."
|
|
4429
|
+
],
|
|
4430
|
+
"frameworkCaveats": {
|
|
4431
|
+
"customElements": [
|
|
4432
|
+
"Listen for dsChange to receive the current string query and dsClear when the clear action is used.",
|
|
4433
|
+
"Listen for dsFilterToggle and pair the trigger with an externally controlled ds-menu; product-specific filter labels and filtering remain outside this component."
|
|
4434
|
+
],
|
|
4435
|
+
"react": [
|
|
4436
|
+
"Use DsPanelToolSearch, bind value for controlled state, and handle onDsChange.",
|
|
4437
|
+
"Bind the optional filter trigger state and connect onDsFilterToggle to a controlled DsMenu."
|
|
4438
|
+
],
|
|
4439
|
+
"angular": [
|
|
4440
|
+
"Import DsPanelToolSearch and bind value as a property; this search composition is not a form value accessor.",
|
|
4441
|
+
"Bind showFilter, filterExpanded, and filterActive, then connect dsFilterToggle to a product-owned ds-menu."
|
|
4442
|
+
]
|
|
4443
|
+
},
|
|
4444
|
+
"references": [
|
|
4445
|
+
{
|
|
4446
|
+
"label": "Storybook examples",
|
|
4447
|
+
"path": "src/wc/components/PanelToolSearch/PanelToolSearch.stories.ts"
|
|
4448
|
+
}
|
|
4449
|
+
]
|
|
4450
|
+
},
|
|
4451
|
+
"props": {
|
|
4452
|
+
"ariaLabel": {
|
|
4453
|
+
"type": "string",
|
|
4454
|
+
"required": false
|
|
4455
|
+
},
|
|
4456
|
+
"controls": {
|
|
4457
|
+
"type": "string | undefined",
|
|
4458
|
+
"required": false
|
|
4459
|
+
},
|
|
4460
|
+
"filterActive": {
|
|
4461
|
+
"type": "boolean",
|
|
4462
|
+
"required": false
|
|
4463
|
+
},
|
|
4464
|
+
"filterAriaLabel": {
|
|
4465
|
+
"type": "string",
|
|
4466
|
+
"required": false
|
|
4467
|
+
},
|
|
4468
|
+
"filterControls": {
|
|
4469
|
+
"type": "string | undefined",
|
|
4470
|
+
"required": false
|
|
4471
|
+
},
|
|
4472
|
+
"filterExpanded": {
|
|
4473
|
+
"type": "boolean",
|
|
4474
|
+
"required": false
|
|
4475
|
+
},
|
|
4476
|
+
"filterTriggerId": {
|
|
4477
|
+
"type": "string",
|
|
4478
|
+
"required": false
|
|
4479
|
+
},
|
|
4480
|
+
"isInactive": {
|
|
4481
|
+
"type": "boolean",
|
|
4482
|
+
"required": false
|
|
4483
|
+
},
|
|
4484
|
+
"placeholder": {
|
|
4485
|
+
"type": "string",
|
|
4486
|
+
"required": false
|
|
4487
|
+
},
|
|
4488
|
+
"showFilter": {
|
|
4489
|
+
"type": "boolean",
|
|
4490
|
+
"required": false
|
|
4491
|
+
},
|
|
4492
|
+
"value": {
|
|
4493
|
+
"type": "string",
|
|
4494
|
+
"required": false
|
|
4495
|
+
}
|
|
4496
|
+
},
|
|
4497
|
+
"events": [
|
|
4498
|
+
{
|
|
4499
|
+
"name": "dsChange",
|
|
4500
|
+
"detail": "string"
|
|
4501
|
+
},
|
|
4502
|
+
{
|
|
4503
|
+
"name": "dsClear",
|
|
4504
|
+
"detail": "void"
|
|
4505
|
+
},
|
|
4506
|
+
{
|
|
4507
|
+
"name": "dsFilterToggle",
|
|
4508
|
+
"detail": "MouseEvent"
|
|
4509
|
+
}
|
|
4510
|
+
],
|
|
4511
|
+
"slots": [],
|
|
4512
|
+
"exports": {
|
|
4513
|
+
"customElement": "ds-panel-tool-search",
|
|
4514
|
+
"react": "DsPanelToolSearch",
|
|
4515
|
+
"angular": "DsPanelToolSearch"
|
|
4516
|
+
}
|
|
4517
|
+
},
|
|
4518
|
+
"dependencies": [
|
|
4519
|
+
"@ds-mo/ui",
|
|
4520
|
+
"@ds-mo/tokens",
|
|
4521
|
+
"@ds-mo/icons"
|
|
4522
|
+
],
|
|
4523
|
+
"registryDependencies": [
|
|
4524
|
+
"button-unfilled",
|
|
4525
|
+
"divider",
|
|
4526
|
+
"icon",
|
|
4527
|
+
"text"
|
|
4528
|
+
]
|
|
4529
|
+
},
|
|
3027
4530
|
{
|
|
3028
4531
|
"name": "panel-tools",
|
|
3029
4532
|
"title": "PanelTools",
|
|
@@ -3092,21 +4595,32 @@
|
|
|
3092
4595
|
"The drawer starts closed, remains open across ordinary route changes, and retains every mounted tool's independent conversation, query, scroll, and work state.",
|
|
3093
4596
|
"When storageKey is set, persist only the last active tool in this browser and still restore the drawer closed after reload.",
|
|
3094
4597
|
"The application owns unread state; opening Messages, Agents, Stacks, or Activity does not automatically clear its notification dot.",
|
|
4598
|
+
"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.",
|
|
4599
|
+
"PanelTools composes ds-panel-tool-header as its canonical left-aligned header implementation so standalone header stories and shell rendering cannot diverge.",
|
|
4600
|
+
"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.",
|
|
4601
|
+
"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.",
|
|
4602
|
+
"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.",
|
|
4603
|
+
"Tool view roots stay transparent so AppShell's chrome wash remains visible; only explicitly designed child surfaces introduce a fill.",
|
|
4604
|
+
"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
4605
|
"If an active optional tool becomes unavailable, PanelTools closes the drawer, clears activeTool, and emits its deselection.",
|
|
3096
4606
|
"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."
|
|
4607
|
+
"The application owns slotted tool products and data while PanelTools owns rail ordering, drawer selection, open state, motion, and shell events.",
|
|
4608
|
+
"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.",
|
|
4609
|
+
"Entering and exiting fullscreen snaps without borrowing the drawer open or close animation.",
|
|
4610
|
+
"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
4611
|
],
|
|
3099
4612
|
"responsiveBehavior": [
|
|
3100
|
-
"
|
|
3101
|
-
"
|
|
3102
|
-
"AppShell owns the responsive drawer-width variable and fixed breakpoint policy; consumers must not hardcode alternate drawer widths.",
|
|
4613
|
+
"The open drawer reduces main-content width and uses --dimension-panel-width-xs (300px) on every supported desktop and tablet viewport.",
|
|
4614
|
+
"AppShell owns the fixed drawer-width variable; consumers must not hardcode alternate drawer widths.",
|
|
3103
4615
|
"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
4616
|
"Keep named-slot content mounted while tools switch or the drawer closes so users can return to in-progress global work.",
|
|
4617
|
+
"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
4618
|
"Use fixed drawer widths for now; do not add user resizing or width persistence."
|
|
3106
4619
|
],
|
|
3107
4620
|
"frameworkCaveats": {
|
|
3108
4621
|
"customElements": [
|
|
3109
4622
|
"Assign items as a JavaScript property for structured data; items-json is the string fallback.",
|
|
4623
|
+
"Assign headers as a JavaScript property and replace its object identity whenever an active tool changes title, depth, or actions.",
|
|
3110
4624
|
"Keep PanelTools mounted at AppShell scope across route changes and provide each product through its matching named slot."
|
|
3111
4625
|
],
|
|
3112
4626
|
"react": [
|
|
@@ -3115,6 +4629,7 @@
|
|
|
3115
4629
|
],
|
|
3116
4630
|
"angular": [
|
|
3117
4631
|
"Import DsPanelTools from @ds-mo/ui/angular/ds-panel-tools and bind items as a property.",
|
|
4632
|
+
"Bind headers as a replaced object and route dsHeaderBack and dsHeaderAction to the active tool owner.",
|
|
3118
4633
|
"Keep the component in the persistent shell layout rather than recreating it in routed page components."
|
|
3119
4634
|
]
|
|
3120
4635
|
},
|
|
@@ -3138,6 +4653,18 @@
|
|
|
3138
4653
|
"type": "PanelToolsToolId | ''",
|
|
3139
4654
|
"required": false
|
|
3140
4655
|
},
|
|
4656
|
+
"fullscreenHeaderMode": {
|
|
4657
|
+
"type": "'shared' | 'split'",
|
|
4658
|
+
"required": false
|
|
4659
|
+
},
|
|
4660
|
+
"headers": {
|
|
4661
|
+
"type": "PanelToolsHeaders",
|
|
4662
|
+
"required": false
|
|
4663
|
+
},
|
|
4664
|
+
"headersJson": {
|
|
4665
|
+
"type": "string",
|
|
4666
|
+
"required": false
|
|
4667
|
+
},
|
|
3141
4668
|
"items": {
|
|
3142
4669
|
"type": "PanelToolsItem[]",
|
|
3143
4670
|
"required": false
|
|
@@ -3150,6 +4677,10 @@
|
|
|
3150
4677
|
"type": "boolean",
|
|
3151
4678
|
"required": false
|
|
3152
4679
|
},
|
|
4680
|
+
"presentation": {
|
|
4681
|
+
"type": "'drawer' | 'fullscreen'",
|
|
4682
|
+
"required": false
|
|
4683
|
+
},
|
|
3153
4684
|
"storageKey": {
|
|
3154
4685
|
"type": "string",
|
|
3155
4686
|
"required": false
|
|
@@ -3172,6 +4703,18 @@
|
|
|
3172
4703
|
"name": "dsChromeTransitionStart",
|
|
3173
4704
|
"detail": "ChromeTransitionDetail"
|
|
3174
4705
|
},
|
|
4706
|
+
{
|
|
4707
|
+
"name": "dsHeaderAction",
|
|
4708
|
+
"detail": "{\n tool: PanelToolsToolId;\n id: string;\n }"
|
|
4709
|
+
},
|
|
4710
|
+
{
|
|
4711
|
+
"name": "dsHeaderBack",
|
|
4712
|
+
"detail": "{\n tool: PanelToolsToolId;\n }"
|
|
4713
|
+
},
|
|
4714
|
+
{
|
|
4715
|
+
"name": "dsPresentationChange",
|
|
4716
|
+
"detail": "{\n presentation: 'drawer' | 'fullscreen';\n }"
|
|
4717
|
+
},
|
|
3175
4718
|
{
|
|
3176
4719
|
"name": "dsToolChange",
|
|
3177
4720
|
"detail": "{\n id: PanelToolsToolId;\n selected: boolean;\n }"
|
|
@@ -3190,7 +4733,7 @@
|
|
|
3190
4733
|
],
|
|
3191
4734
|
"registryDependencies": [
|
|
3192
4735
|
"button-unfilled",
|
|
3193
|
-
"
|
|
4736
|
+
"panel-tool-header",
|
|
3194
4737
|
"tooltip"
|
|
3195
4738
|
]
|
|
3196
4739
|
},
|