@ds-mo/ui 12.4.1 → 12.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/.build-stamp +1 -1
- package/dist/agent-patterns.json +21 -12
- package/dist/agent.json +1541 -1426
- package/dist/angular/ds-bar-workflow.d.ts +1 -1
- package/dist/angular/ds-bar-workflow.js +3 -3
- package/dist/angular/ds-mobile-bar-nav.d.ts +18 -0
- package/dist/angular/{ds-shell-mobile-bar.js → ds-mobile-bar-nav.js} +15 -15
- package/dist/angular/ds-mobile-header.d.ts +23 -0
- package/dist/angular/ds-mobile-header.js +45 -0
- package/dist/angular/ds-mobile-section-switcher.d.ts +18 -0
- package/dist/angular/{ds-shell-mobile-section-nav.js → ds-mobile-section-switcher.js} +15 -15
- package/dist/angular/ds-mobile-sheet-nav.d.ts +20 -0
- package/dist/angular/{ds-shell-mobile-nav.js → ds-mobile-sheet-nav.js} +13 -16
- package/dist/angular/ds-shell-app.d.ts +1 -1
- package/dist/angular/ds-shell-app.js +3 -3
- package/dist/angular/ds-shell-page.d.ts +1 -1
- package/dist/angular/ds-shell-page.js +3 -3
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +4 -3
- package/dist/angular/proxies.d.ts +4 -3
- package/dist/angular/proxies.js +4 -3
- package/dist/components/ds-agent-activity.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-agent-tool-call.js +1 -1
- package/dist/components/ds-avatar.js +1 -1
- package/dist/components/ds-avatar.js.map +1 -1
- package/dist/components/ds-badge.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-bar-title.js +1 -1
- package/dist/components/ds-bar-title.js.map +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-bar-workflow.js.map +1 -1
- package/dist/components/ds-breadcrumb.js +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-bar.js +1 -1
- package/dist/components/ds-card-data-viz-donut.js +1 -1
- package/dist/components/ds-card-data-viz-line.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-chart-bar.js +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-legend.js.map +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-chip.js.map +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-conversation-list-item.js +1 -1
- package/dist/components/ds-conversation-list-item.js.map +1 -1
- package/dist/components/ds-conversation-list-section.js +1 -1
- package/dist/components/ds-conversation-list.js +1 -1
- package/dist/components/ds-conversation-list.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-input.js +1 -1
- package/dist/components/ds-input.js.map +1 -1
- package/dist/components/ds-loader.js +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-composer.js.map +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-message-scroller.js.map +1 -1
- package/dist/components/ds-message.js +1 -1
- package/dist/components/{ds-shell-mobile-nav.d.ts → ds-mobile-bar-nav.d.ts} +4 -4
- package/dist/components/ds-mobile-bar-nav.js +2 -0
- package/dist/components/ds-mobile-bar-nav.js.map +1 -0
- package/dist/components/ds-mobile-header.d.ts +11 -0
- package/dist/components/ds-mobile-header.js +2 -0
- package/dist/components/ds-mobile-header.js.map +1 -0
- package/dist/components/ds-mobile-section-switcher.d.ts +11 -0
- package/dist/components/ds-mobile-section-switcher.js +2 -0
- package/dist/components/ds-mobile-section-switcher.js.map +1 -0
- package/dist/components/{ds-shell-mobile-bar.d.ts → ds-mobile-sheet-nav.d.ts} +4 -4
- package/dist/components/ds-mobile-sheet-nav.js +2 -0
- package/dist/components/ds-mobile-sheet-nav.js.map +1 -0
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-modal.js.map +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-sub-nav.js.map +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tool-search.js.map +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-radio.js +1 -1
- package/dist/components/ds-radio.js.map +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-app.js +1 -1
- package/dist/components/ds-shell-app.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-shell-page.js +1 -1
- package/dist/components/ds-shell-page.js.map +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-shell-tools.js.map +1 -1
- package/dist/components/ds-skeleton.js +1 -1
- package/dist/components/ds-skeleton.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-tag.js +1 -1
- package/dist/components/ds-tag.js.map +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-toast.js.map +1 -1
- package/dist/components/ds-tooltip-data-viz.js +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/ds-typing-indicator.js +1 -1
- package/dist/components/p--bSkr_yn.js +2 -0
- package/dist/components/p--bSkr_yn.js.map +1 -0
- package/dist/components/p-46nk9-RO.js +2 -0
- package/dist/components/p-46nk9-RO.js.map +1 -0
- package/dist/components/{p-9dQQSgwT.js → p-BHYrsGBw.js} +2 -2
- package/dist/components/p-BY0PzkUp.js +2 -0
- package/dist/components/p-BgGP65Nn.js +2 -0
- package/dist/components/p-BgGP65Nn.js.map +1 -0
- package/dist/components/p-BkAMkjIR.js +2 -0
- package/dist/components/{p-Co8hD3P-.js.map → p-BkAMkjIR.js.map} +1 -1
- package/dist/components/p-BrusnEYP.js.map +1 -1
- package/dist/components/p-C2ym_Ich.js +2 -0
- package/dist/components/{p-Biz6xo-z.js → p-CFpWrYAH.js} +2 -2
- package/dist/components/p-CICGtu7H.js +2 -0
- package/dist/components/{p-CtD24EyI.js.map → p-CICGtu7H.js.map} +1 -1
- package/dist/components/p-CLzlL3G4.js +2 -0
- package/dist/components/p-CLzlL3G4.js.map +1 -0
- package/dist/components/p-CXcjwduV.js +2 -0
- package/dist/components/{p-BhxwpOH8.js.map → p-CXcjwduV.js.map} +1 -1
- package/dist/components/p-Ca-I2UnB.js +2 -0
- package/dist/components/p-Ca-I2UnB.js.map +1 -0
- package/dist/components/p-CaRyxTMz.js +2 -0
- package/dist/components/p-CaRyxTMz.js.map +1 -0
- package/dist/components/{p-g40DTeV8.js → p-CvKKmZJj.js} +2 -2
- package/dist/components/p-D4o2D1hk.js +2 -0
- package/dist/components/p-D4o2D1hk.js.map +1 -0
- package/dist/components/{p-DXnFhmZF.js → p-D9iN80yX.js} +2 -2
- package/dist/components/p-DD1Lgs7O.js +2 -0
- package/dist/components/p-DD1Lgs7O.js.map +1 -0
- package/dist/components/{p-DjPZxzIG.js → p-DQDpDYyF.js} +2 -2
- package/dist/components/p-DTea1Du7.js +2 -0
- package/dist/components/p-DTea1Du7.js.map +1 -0
- package/dist/components/p-DWdRSOBV.js +2 -0
- package/dist/components/{p-BPS9VExm.js.map → p-DWdRSOBV.js.map} +1 -1
- package/dist/components/p-DcFfilOX.js +2 -0
- package/dist/components/p-DcFfilOX.js.map +1 -0
- package/dist/components/p-Dg3xLna0.js +2 -0
- package/dist/components/{p-C_0Q8Cnp.js.map → p-Dg3xLna0.js.map} +1 -1
- package/dist/components/p-DvVW0hxm.js +2 -0
- package/dist/components/p-DvVW0hxm.js.map +1 -0
- package/dist/components/p-YtgcuJYx.js +2 -0
- package/dist/components/{p-PZ6R_nGI.js.map → p-YtgcuJYx.js.map} +1 -1
- package/dist/components/p-loq_--ce.js +2 -0
- package/dist/components/{p-NUNsefU1.js.map → p-loq_--ce.js.map} +1 -1
- package/dist/docs/components.json +3586 -3064
- package/dist/lib/shell/index.d.ts +1 -1
- package/dist/lib/shell/index.js +2 -1
- package/dist/lib/shell/index.js.map +2 -2
- package/dist/lib/shell/shell-responsive.d.ts +3 -3
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +8 -0
- package/dist/lib/utils/index.js.map +3 -3
- package/dist/lib/utils/required-validity.d.ts +14 -0
- package/dist/mcp-data/registry/agent-activity.json +2 -2
- package/dist/mcp-data/registry/badge.json +2 -2
- package/dist/mcp-data/registry/bar-nav.json +2 -2
- package/dist/mcp-data/registry/bar-title.json +2 -2
- package/dist/mcp-data/registry/bar-workflow.json +25 -4
- package/dist/mcp-data/registry/breadcrumb.json +2 -2
- package/dist/mcp-data/registry/button-unfilled.json +3 -3
- package/dist/mcp-data/registry/chart-legend.json +1 -1
- package/dist/mcp-data/registry/checkbox.json +1 -1
- package/dist/mcp-data/registry/conversation-list-item.json +4 -3
- package/dist/mcp-data/registry/conversation-list.json +4 -3
- package/dist/mcp-data/registry/input.json +1 -1
- package/dist/mcp-data/registry/loader.json +2 -2
- package/dist/mcp-data/registry/message-scroller.json +3 -2
- package/dist/mcp-data/registry/mobile-bar-nav.json +333 -0
- package/dist/mcp-data/registry/mobile-header.json +351 -0
- package/dist/mcp-data/registry/mobile-section-switcher.json +210 -0
- package/dist/mcp-data/registry/mobile-sheet-nav.json +317 -0
- package/dist/mcp-data/registry/panel-nav.json +2 -2
- package/dist/mcp-data/registry/panel-tools.json +2 -2
- package/dist/mcp-data/registry/radio.json +1 -1
- package/dist/mcp-data/registry/registry.json +1549 -1431
- package/dist/mcp-data/registry/select-multi.json +1 -1
- package/dist/mcp-data/registry/select.json +2 -2
- package/dist/mcp-data/registry/shell-app.json +17 -17
- package/dist/mcp-data/registry/shell-page.json +26 -7
- package/dist/mcp-data/registry/shell-tools.json +10 -7
- package/dist/mcp-data/registry/switch.json +1 -1
- package/dist/mcp-data/registry/toast.json +2 -2
- package/dist/react/components.d.ts +4 -3
- package/dist/react/components.js +4 -3
- package/dist/react/ds-mobile-bar-nav.d.ts +13 -0
- package/dist/react/ds-mobile-bar-nav.js +15 -0
- package/dist/react/ds-mobile-header.d.ts +13 -0
- package/dist/react/ds-mobile-header.js +15 -0
- package/dist/react/ds-mobile-section-switcher.d.ts +12 -0
- package/dist/react/ds-mobile-section-switcher.js +12 -0
- package/dist/react/ds-mobile-sheet-nav.d.ts +14 -0
- package/dist/react/ds-mobile-sheet-nav.js +16 -0
- package/dist/styles/control-elevation.css +40 -0
- package/dist/types/components/BarWorkflow/BarWorkflow.d.ts +6 -0
- package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +1 -1
- package/dist/types/components/MobileBarNav/MobileBarNav.d.ts +26 -0
- package/dist/types/components/MobileBarNav/index.d.ts +4 -0
- package/dist/types/components/MobileBarNav/mobile-bar-nav-types.d.ts +5 -0
- package/dist/types/components/MobileHeader/MobileHeader.d.ts +39 -0
- package/dist/types/components/MobileHeader/index.d.ts +2 -0
- package/dist/types/components/MobileHeader/mobile-header-types.d.ts +5 -0
- package/dist/types/components/MobileSectionSwitcher/MobileSectionSwitcher.d.ts +35 -0
- package/dist/types/components/MobileSectionSwitcher/index.d.ts +3 -0
- package/dist/types/components/MobileSectionSwitcher/mobile-section-switcher-types.d.ts +4 -0
- package/dist/types/components/MobileSectionSwitcher/mobile-section-switcher-utils.d.ts +10 -0
- package/dist/types/components/{ShellMobileNav/ShellMobileNav.d.ts → MobileSheetNav/MobileSheetNav.d.ts} +5 -7
- package/dist/types/components/MobileSheetNav/index.d.ts +1 -0
- package/dist/types/components/ShellApp/ShellApp.d.ts +4 -4
- package/dist/types/components/ShellPage/ShellPage.d.ts +4 -0
- package/dist/types/components.d.ts +530 -381
- package/dist/types/shell/index.d.ts +1 -1
- package/dist/types/shell/shell-responsive.d.ts +3 -3
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/required-validity.d.ts +15 -0
- package/package.json +2 -1
- package/dist/angular/ds-shell-mobile-bar.d.ts +0 -18
- package/dist/angular/ds-shell-mobile-nav.d.ts +0 -23
- package/dist/angular/ds-shell-mobile-section-nav.d.ts +0 -18
- package/dist/components/ds-shell-mobile-bar.js +0 -2
- package/dist/components/ds-shell-mobile-bar.js.map +0 -1
- package/dist/components/ds-shell-mobile-nav.js +0 -2
- package/dist/components/ds-shell-mobile-nav.js.map +0 -1
- package/dist/components/ds-shell-mobile-section-nav.d.ts +0 -11
- package/dist/components/ds-shell-mobile-section-nav.js +0 -2
- package/dist/components/ds-shell-mobile-section-nav.js.map +0 -1
- package/dist/components/p-B6Vuayt6.js +0 -2
- package/dist/components/p-B6Vuayt6.js.map +0 -1
- package/dist/components/p-BPS9VExm.js +0 -2
- package/dist/components/p-BVV_rlIP.js +0 -2
- package/dist/components/p-BVV_rlIP.js.map +0 -1
- package/dist/components/p-BhxwpOH8.js +0 -2
- package/dist/components/p-BtEjlcB9.js +0 -2
- package/dist/components/p-BtEjlcB9.js.map +0 -1
- package/dist/components/p-CH6cNXXF.js +0 -2
- package/dist/components/p-CH6cNXXF.js.map +0 -1
- package/dist/components/p-C_0Q8Cnp.js +0 -2
- package/dist/components/p-Ce52yVXF.js +0 -2
- package/dist/components/p-Ce52yVXF.js.map +0 -1
- package/dist/components/p-CgHTNfC1.js +0 -2
- package/dist/components/p-CgHTNfC1.js.map +0 -1
- package/dist/components/p-Co8hD3P-.js +0 -2
- package/dist/components/p-CoYFJD-w.js +0 -2
- package/dist/components/p-CoYFJD-w.js.map +0 -1
- package/dist/components/p-Cpr3K41-.js +0 -2
- package/dist/components/p-Cpr3K41-.js.map +0 -1
- package/dist/components/p-CtD24EyI.js +0 -2
- package/dist/components/p-DYqReipj.js +0 -2
- package/dist/components/p-DYqReipj.js.map +0 -1
- package/dist/components/p-NUNsefU1.js +0 -2
- package/dist/components/p-PZ6R_nGI.js +0 -2
- package/dist/components/p-jCWtxthA.js +0 -2
- package/dist/components/p-yhj1lIPx.js +0 -2
- package/dist/mcp-data/registry/shell-mobile-bar.json +0 -314
- package/dist/mcp-data/registry/shell-mobile-nav.json +0 -348
- package/dist/mcp-data/registry/shell-mobile-section-nav.json +0 -267
- package/dist/react/ds-shell-mobile-bar.d.ts +0 -13
- package/dist/react/ds-shell-mobile-bar.js +0 -15
- package/dist/react/ds-shell-mobile-nav.d.ts +0 -15
- package/dist/react/ds-shell-mobile-nav.js +0 -17
- package/dist/react/ds-shell-mobile-section-nav.d.ts +0 -12
- package/dist/react/ds-shell-mobile-section-nav.js +0 -12
- package/dist/types/components/ShellMobileBar/ShellMobileBar.d.ts +0 -25
- package/dist/types/components/ShellMobileBar/index.d.ts +0 -4
- package/dist/types/components/ShellMobileBar/shell-mobile-bar-types.d.ts +0 -5
- package/dist/types/components/ShellMobileNav/index.d.ts +0 -2
- package/dist/types/components/ShellMobileNav/shell-mobile-nav-types.d.ts +0 -6
- package/dist/types/components/ShellMobileSectionNav/ShellMobileSectionNav.d.ts +0 -30
- package/dist/types/components/ShellMobileSectionNav/index.d.ts +0 -2
- /package/dist/components/{p-9dQQSgwT.js.map → p-BHYrsGBw.js.map} +0 -0
- /package/dist/components/{p-jCWtxthA.js.map → p-BY0PzkUp.js.map} +0 -0
- /package/dist/components/{p-yhj1lIPx.js.map → p-C2ym_Ich.js.map} +0 -0
- /package/dist/components/{p-Biz6xo-z.js.map → p-CFpWrYAH.js.map} +0 -0
- /package/dist/components/{p-g40DTeV8.js.map → p-CvKKmZJj.js.map} +0 -0
- /package/dist/components/{p-DXnFhmZF.js.map → p-D9iN80yX.js.map} +0 -0
- /package/dist/components/{p-DjPZxzIG.js.map → p-DQDpDYyF.js.map} +0 -0
package/dist/agent.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
3
|
"package": "@ds-mo/ui",
|
|
4
|
-
"packageVersion": "12.
|
|
4
|
+
"packageVersion": "12.6.0",
|
|
5
5
|
"kind": "components",
|
|
6
6
|
"entries": [
|
|
7
7
|
{
|
|
@@ -1010,6 +1010,7 @@
|
|
|
1010
1010
|
],
|
|
1011
1011
|
"commonlyComposedWith": [
|
|
1012
1012
|
"component:ds-shell-page",
|
|
1013
|
+
"component:ds-mobile-header",
|
|
1013
1014
|
"component:ds-button-filled",
|
|
1014
1015
|
"component:ds-button-unfilled",
|
|
1015
1016
|
"component:ds-text",
|
|
@@ -1024,7 +1025,7 @@
|
|
|
1024
1025
|
"Use submitAction.type=submit inside a form so the final action preserves native submission semantics."
|
|
1025
1026
|
],
|
|
1026
1027
|
"states": [
|
|
1027
|
-
"BarWorkflow always renders compact 48px bold-brand chrome
|
|
1028
|
+
"BarWorkflow always renders compact 48px bold-brand chrome; responsiveMode changes only the action geometry, never workflow state or hierarchy.",
|
|
1028
1029
|
"An unrecognized value resolves navigation from the first step without mutating the controlled value.",
|
|
1029
1030
|
"The first step omits Previous. Intermediate steps show Previous and Next. The last step replaces Next with the Check Save or Submit action.",
|
|
1030
1031
|
"The default empty steps array is a single-step flow with the plain heading, no Previous control, and the final action visible. An explicit one-step array behaves the same way.",
|
|
@@ -1032,7 +1033,8 @@
|
|
|
1032
1033
|
"submitAction owns the final label, native button type, inactive state, and loading state."
|
|
1033
1034
|
],
|
|
1034
1035
|
"responsiveBehavior": [
|
|
1035
|
-
"
|
|
1036
|
+
"Desktop and tablet keep the established left-aligned identity and trailing actions.",
|
|
1037
|
+
"Mobile uses symmetric MobileHeader geometry with Exit leading, the title and step count centered, and Previous plus Next or Submit trailing.",
|
|
1036
1038
|
"The heading truncates before Exit, Previous, and Next or Submit lose their complete hit targets.",
|
|
1037
1039
|
"When slotted into ShellPage, BarWorkflow remains compact while ShellPage continues to provide sticky placement."
|
|
1038
1040
|
],
|
|
@@ -1087,6 +1089,10 @@
|
|
|
1087
1089
|
"type": "string",
|
|
1088
1090
|
"required": false
|
|
1089
1091
|
},
|
|
1092
|
+
"responsiveMode": {
|
|
1093
|
+
"type": "ShellResponsiveMode",
|
|
1094
|
+
"required": false
|
|
1095
|
+
},
|
|
1090
1096
|
"steps": {
|
|
1091
1097
|
"type": "BarWorkflowStep[]",
|
|
1092
1098
|
"required": false
|
|
@@ -1128,6 +1134,7 @@
|
|
|
1128
1134
|
"componentDependencies": [
|
|
1129
1135
|
"button-filled",
|
|
1130
1136
|
"button-unfilled",
|
|
1137
|
+
"mobile-header",
|
|
1131
1138
|
"text",
|
|
1132
1139
|
"tooltip"
|
|
1133
1140
|
]
|
|
@@ -3196,7 +3203,8 @@
|
|
|
3196
3203
|
"The default floating action stays at the lower end corner.",
|
|
3197
3204
|
"actionLayout footer stretches a long action between 8px side and bottom insets.",
|
|
3198
3205
|
"Both action layouts share the always-active scroll-overlay fade controller, reserve measured end clearance, and begin fading 8px before the visible action.",
|
|
3199
|
-
"ConversationList paints its measured fade on a separate surface-aware layer so contextual row actions retain a real backdrop for blur; hovered, focused, and menu-open rows rise above that decorative fade."
|
|
3206
|
+
"ConversationList paints its measured fade on a separate surface-aware layer so contextual row actions retain a real backdrop for blur; hovered, focused, and menu-open rows rise above that decorative fade.",
|
|
3207
|
+
"The persistent action wrapper splits its md outer shadow from a top inset-highlight overlay so opaque filled actions keep the complete TokoMo elevation; slotted controls must disable optional resting borders."
|
|
3200
3208
|
],
|
|
3201
3209
|
"responsiveBehavior": [
|
|
3202
3210
|
"The list fills its owner, scrolls independently, and keeps its persistent action above scrolling rows."
|
|
@@ -3266,7 +3274,8 @@
|
|
|
3266
3274
|
"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.",
|
|
3267
3275
|
"Hover and press use the shared interaction hover and pressed overlays. Only the selected conversation uses the persistent active fill.",
|
|
3268
3276
|
"The title uses body-medium, not title-small, and the body-small preview truncates after one line. Unread titles use emphasis with primary foreground; read titles use regular weight with secondary foreground.",
|
|
3269
|
-
"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."
|
|
3277
|
+
"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.",
|
|
3278
|
+
"Contextual actions use the shared md control-elevation wrapper so their transparent backdrop blur is unchanged while the split inset highlight remains above the borderless slotted action."
|
|
3270
3279
|
],
|
|
3271
3280
|
"responsiveBehavior": [
|
|
3272
3281
|
"Long titles and previews truncate without displacing trailing status."
|
|
@@ -4759,6 +4768,7 @@
|
|
|
4759
4768
|
"Selection and transcript interaction release automatic following.",
|
|
4760
4769
|
"Opening saved history, message jumps, and prepended history preserve deliberate position.",
|
|
4761
4770
|
"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.",
|
|
4771
|
+
"Scroll to latest uses the shared md control-elevation wrapper with a pointer-transparent top highlight, preserving its transparent backdrop blur and borderless unfilled action.",
|
|
4762
4772
|
"Place a composer container with 8px padding on every side in the overlay slot so messages scroll behind it; the shared scroll-overlay controller tracks every composer growth step, reserves matching transcript clearance, begins the fade 8px before the visible composer, and keeps scroll-to-latest above it."
|
|
4763
4773
|
],
|
|
4764
4774
|
"responsiveBehavior": [
|
|
@@ -4815,488 +4825,303 @@
|
|
|
4815
4825
|
]
|
|
4816
4826
|
},
|
|
4817
4827
|
{
|
|
4818
|
-
"id": "component:ds-
|
|
4819
|
-
"tag": "ds-
|
|
4820
|
-
"name": "
|
|
4821
|
-
"title": "
|
|
4822
|
-
"summary": "
|
|
4828
|
+
"id": "component:ds-mobile-bar-nav",
|
|
4829
|
+
"tag": "ds-mobile-bar-nav",
|
|
4830
|
+
"name": "mobile-bar-nav",
|
|
4831
|
+
"title": "MobileBarNav",
|
|
4832
|
+
"summary": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Agents, and Inbox.",
|
|
4823
4833
|
"intentStatus": "complete",
|
|
4824
4834
|
"intent": {
|
|
4825
|
-
"audience": "
|
|
4826
|
-
"status": "
|
|
4827
|
-
"summary": "
|
|
4835
|
+
"audience": "specialized",
|
|
4836
|
+
"status": "experimental",
|
|
4837
|
+
"summary": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Agents, and Inbox.",
|
|
4828
4838
|
"useWhen": [
|
|
4829
|
-
"
|
|
4830
|
-
"A short blocking task or compact form needs dialog semantics, focus containment, and explicit completion actions.",
|
|
4831
|
-
"The content can be safely dismissed through Close, Escape, or the backdrop."
|
|
4839
|
+
"ShellApp is rendering its dedicated below-768px application composition."
|
|
4832
4840
|
],
|
|
4833
4841
|
"avoidWhen": [
|
|
4834
|
-
"
|
|
4835
|
-
"
|
|
4836
|
-
"The workflow is multi-step, long-form, or requires substantial navigation.",
|
|
4837
|
-
"Dismissal would lose work or leave an irreversible operation in an unsafe state.",
|
|
4838
|
-
"A second modal would be opened over an existing modal."
|
|
4839
|
-
],
|
|
4840
|
-
"alternatives": [
|
|
4841
|
-
{
|
|
4842
|
-
"when": "The user needs non-blocking feedback or a transient status message.",
|
|
4843
|
-
"component": "component:ds-toast",
|
|
4844
|
-
"reason": "Toast communicates transient status without trapping focus or blocking the page."
|
|
4845
|
-
},
|
|
4846
|
-
{
|
|
4847
|
-
"when": "A trigger reveals a short contextual list of commands.",
|
|
4848
|
-
"component": "component:ds-menu",
|
|
4849
|
-
"reason": "Menu provides anchored command semantics without creating a blocking dialog."
|
|
4850
|
-
},
|
|
4851
|
-
{
|
|
4852
|
-
"when": "Editable settings should remain visible without blocking the rest of the interface.",
|
|
4853
|
-
"component": "component:ds-card-setting",
|
|
4854
|
-
"reason": "CardSetting provides a persistent controlled settings workflow without modal focus containment."
|
|
4855
|
-
}
|
|
4842
|
+
"Rendering desktop or tablet shell chrome.",
|
|
4843
|
+
"An arbitrary set of product tabs is required."
|
|
4856
4844
|
],
|
|
4857
4845
|
"commonlyComposedWith": [
|
|
4858
|
-
"component:ds-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
"
|
|
4846
|
+
"component:ds-shell-app"
|
|
4847
|
+
],
|
|
4848
|
+
"patterns": [
|
|
4849
|
+
"pattern:application-shell"
|
|
4862
4850
|
],
|
|
4863
4851
|
"accessibility": [
|
|
4864
|
-
"
|
|
4865
|
-
"
|
|
4866
|
-
"Opening the native modal dialog moves focus to the header Close action, whose visible tooltip matches its accessible name, traps Tab navigation inside the top layer, and makes outside content inert.",
|
|
4867
|
-
"Close, Escape, and backdrop activation emit dsClose with close-button, escape, or backdrop reason before beginning dismissal; use the component only when every dismissal path is safe.",
|
|
4868
|
-
"After exit motion completes, the native dialog leaves the top layer, focus returns to the previously focused element, and dsAfterClose emits.",
|
|
4869
|
-
"Use visible label-only footer buttons. Keep at most two actions: one bold filled primary action followed by one bordered unfilled action, or two bordered unfilled actions.",
|
|
4870
|
-
"Use negative intent for a filled destructive action and state the irreversible consequence in the content.",
|
|
4871
|
-
"Do not open a modal from another modal; keep one blocking decision in focus at a time."
|
|
4852
|
+
"Every icon-only item keeps a localized accessible name.",
|
|
4853
|
+
"Only the active destination exposes aria-current; Menu exposes its controlled pane through aria-expanded."
|
|
4872
4854
|
],
|
|
4873
4855
|
"states": [
|
|
4874
|
-
"The
|
|
4875
|
-
"
|
|
4876
|
-
"
|
|
4877
|
-
"
|
|
4878
|
-
"The owner performs save, delete, cancel, and other product consequences before or while closing the modal."
|
|
4856
|
+
"The fixed groups are Menu plus current area, followed by Search, Inbox, and Agents.",
|
|
4857
|
+
"Selection promotes foreground to primary without painting a selected fill; unselected destinations use tertiary foreground.",
|
|
4858
|
+
"Opening Mobile Sheet Nav replaces the Menu glyph with Cross while preserving its accessible name.",
|
|
4859
|
+
"Reselecting an active destination does not reset its nested state."
|
|
4879
4860
|
],
|
|
4880
4861
|
"responsiveBehavior": [
|
|
4881
|
-
"
|
|
4882
|
-
"
|
|
4883
|
-
"Avoid layouts whose minimum content width exceeds the narrow viewport clamp.",
|
|
4884
|
-
"The native top layer escapes transformed ancestors, clipping containers, and application stacking contexts without moving slotted content."
|
|
4862
|
+
"Render only below the mobile breakpoint and preserve safe-area clearance.",
|
|
4863
|
+
"The two icon-only control groups remain centered with fixed 40px targets and a divider between Menu and current area."
|
|
4885
4864
|
],
|
|
4886
|
-
"frameworkCaveats": {
|
|
4887
|
-
"customElements": [
|
|
4888
|
-
"Set open as a JavaScript property when controlling the modal; inspect dsClose.detail.reason and use dsAfterClose for cleanup that must wait for exit motion and focus restoration.",
|
|
4889
|
-
"Connect the most relevant slotted explanatory text through aria-describedby.",
|
|
4890
|
-
"Footer actions are slotted application-owned controls and must implement their own product consequence."
|
|
4891
|
-
],
|
|
4892
|
-
"react": [
|
|
4893
|
-
"Pass open to DsModal, inspect onDsClose event detail, and use onDsAfterClose only for cleanup after exit motion and focus restoration.",
|
|
4894
|
-
"Connect the most relevant slotted explanatory text through aria-describedby.",
|
|
4895
|
-
"Assign footer controls with slot=\"footer\" and handle each action before updating open."
|
|
4896
|
-
],
|
|
4897
|
-
"angular": [
|
|
4898
|
-
"Bind [open], inspect $event.detail from (dsClose), and use (dsAfterClose) only for cleanup after exit motion and focus restoration.",
|
|
4899
|
-
"Connect the most relevant slotted explanatory text through aria-describedby.",
|
|
4900
|
-
"Assign footer controls with slot=\"footer\" and handle each action before updating open."
|
|
4901
|
-
]
|
|
4902
|
-
},
|
|
4903
4865
|
"references": [
|
|
4904
4866
|
{
|
|
4905
|
-
"label": "Storybook
|
|
4906
|
-
"path": "src/wc/components/
|
|
4907
|
-
},
|
|
4908
|
-
{
|
|
4909
|
-
"label": "Cross-browser focus, dismissal, geometry, and accessibility coverage",
|
|
4910
|
-
"path": "tests/e2e/accessibility-overlays.spec.ts"
|
|
4911
|
-
},
|
|
4912
|
-
{
|
|
4913
|
-
"label": "Reduced-motion overlay coverage",
|
|
4914
|
-
"path": "tests/e2e/reduced-motion.spec.ts"
|
|
4867
|
+
"label": "Storybook",
|
|
4868
|
+
"path": "src/wc/components/MobileBarNav/MobileBarNav.stories.ts"
|
|
4915
4869
|
}
|
|
4916
4870
|
]
|
|
4917
4871
|
},
|
|
4918
4872
|
"api": {
|
|
4919
4873
|
"props": {
|
|
4920
|
-
"
|
|
4921
|
-
"type": "
|
|
4874
|
+
"activeDestination": {
|
|
4875
|
+
"type": "MobileDestination",
|
|
4922
4876
|
"required": false
|
|
4923
4877
|
},
|
|
4924
|
-
"
|
|
4878
|
+
"agentsDot": {
|
|
4879
|
+
"type": "boolean",
|
|
4880
|
+
"required": false
|
|
4881
|
+
},
|
|
4882
|
+
"agentsLabel": {
|
|
4925
4883
|
"type": "string",
|
|
4926
4884
|
"required": false
|
|
4927
4885
|
},
|
|
4928
|
-
"
|
|
4886
|
+
"currentArea": {
|
|
4887
|
+
"type": "PanelNavItem",
|
|
4888
|
+
"required": false
|
|
4889
|
+
},
|
|
4890
|
+
"helpLabel": {
|
|
4929
4891
|
"type": "string",
|
|
4930
|
-
"required":
|
|
4892
|
+
"required": false
|
|
4931
4893
|
},
|
|
4932
|
-
"
|
|
4933
|
-
"type": "
|
|
4894
|
+
"inboxDot": {
|
|
4895
|
+
"type": "boolean",
|
|
4934
4896
|
"required": false
|
|
4935
4897
|
},
|
|
4936
|
-
"
|
|
4898
|
+
"inboxLabel": {
|
|
4899
|
+
"type": "string",
|
|
4900
|
+
"required": false
|
|
4901
|
+
},
|
|
4902
|
+
"menuLabel": {
|
|
4903
|
+
"type": "string",
|
|
4904
|
+
"required": false
|
|
4905
|
+
},
|
|
4906
|
+
"searchDot": {
|
|
4907
|
+
"type": "boolean",
|
|
4908
|
+
"required": false
|
|
4909
|
+
},
|
|
4910
|
+
"searchLabel": {
|
|
4911
|
+
"type": "string",
|
|
4912
|
+
"required": false
|
|
4913
|
+
},
|
|
4914
|
+
"sheetNavExpanded": {
|
|
4937
4915
|
"type": "boolean",
|
|
4938
4916
|
"required": false
|
|
4939
4917
|
}
|
|
4940
4918
|
},
|
|
4941
4919
|
"events": [
|
|
4942
4920
|
{
|
|
4943
|
-
"name": "
|
|
4944
|
-
"detail": "
|
|
4921
|
+
"name": "dsDestinationChange",
|
|
4922
|
+
"detail": "MobileBarNavDestinationDetail"
|
|
4945
4923
|
},
|
|
4946
4924
|
{
|
|
4947
|
-
"name": "
|
|
4948
|
-
"detail": "
|
|
4925
|
+
"name": "dsSheetNavToggle",
|
|
4926
|
+
"detail": "boolean"
|
|
4949
4927
|
}
|
|
4950
4928
|
],
|
|
4951
4929
|
"slots": []
|
|
4952
4930
|
},
|
|
4953
4931
|
"exports": {
|
|
4954
|
-
"customElement": "ds-
|
|
4955
|
-
"react": "
|
|
4956
|
-
"angular": "
|
|
4932
|
+
"customElement": "ds-mobile-bar-nav",
|
|
4933
|
+
"react": "DsMobileBarNav",
|
|
4934
|
+
"angular": "DsMobileBarNav"
|
|
4957
4935
|
},
|
|
4958
4936
|
"dependencies": [
|
|
4959
4937
|
"@ds-mo/ui",
|
|
4960
|
-
"@ds-mo/tokens"
|
|
4938
|
+
"@ds-mo/tokens",
|
|
4939
|
+
"@ds-mo/icons"
|
|
4961
4940
|
],
|
|
4962
4941
|
"componentDependencies": [
|
|
4963
|
-
"
|
|
4964
|
-
"
|
|
4965
|
-
"tooltip"
|
|
4942
|
+
"badge",
|
|
4943
|
+
"icon"
|
|
4966
4944
|
]
|
|
4967
4945
|
},
|
|
4968
4946
|
{
|
|
4969
|
-
"id": "component:ds-
|
|
4970
|
-
"tag": "ds-
|
|
4971
|
-
"name": "
|
|
4972
|
-
"title": "
|
|
4973
|
-
"summary": "
|
|
4947
|
+
"id": "component:ds-mobile-header",
|
|
4948
|
+
"tag": "ds-mobile-header",
|
|
4949
|
+
"name": "mobile-header",
|
|
4950
|
+
"title": "MobileHeader",
|
|
4951
|
+
"summary": "Consistent mobile top chrome with symmetric action lanes, a centered page identity or peer-section chooser, and an optional subordinate page-section row.",
|
|
4974
4952
|
"intentStatus": "complete",
|
|
4975
4953
|
"intent": {
|
|
4976
4954
|
"audience": "specialized",
|
|
4977
|
-
"status": "
|
|
4978
|
-
"summary": "
|
|
4955
|
+
"status": "experimental",
|
|
4956
|
+
"summary": "Consistent mobile top chrome with symmetric action lanes, a centered page identity or peer-section chooser, and an optional subordinate page-section row.",
|
|
4979
4957
|
"useWhen": [
|
|
4980
|
-
"
|
|
4981
|
-
"Top-level destinations must remain consistently available while the application's page content changes.",
|
|
4982
|
-
"Primary destinations need visual grouping, icons, notification indicators, active-route state, and expanded or collapsed presentation."
|
|
4958
|
+
"A routed page, persistent tool, account surface, or workflow needs the canonical mobile header presentation."
|
|
4983
4959
|
],
|
|
4984
4960
|
"avoidWhen": [
|
|
4985
|
-
"
|
|
4986
|
-
"
|
|
4987
|
-
"The choices switch local content without changing the application's primary destination; use TabGroup instead.",
|
|
4988
|
-
"The interaction performs a command or presents temporary contextual choices; use a button or Menu instead.",
|
|
4989
|
-
"Building navigation below the mobile breakpoint; use the application's dedicated mobile navigation component instead."
|
|
4990
|
-
],
|
|
4991
|
-
"alternatives": [
|
|
4992
|
-
{
|
|
4993
|
-
"when": "The choices represent route sections within the active primary destination.",
|
|
4994
|
-
"component": "component:ds-bar-nav",
|
|
4995
|
-
"reason": "BarNav owns secondary section navigation within the destination selected by PanelNav."
|
|
4996
|
-
},
|
|
4997
|
-
{
|
|
4998
|
-
"when": "The choices switch local content without changing the application's primary destination.",
|
|
4999
|
-
"component": "component:ds-tab-group",
|
|
5000
|
-
"reason": "TabGroup owns local view selection and tab semantics."
|
|
5001
|
-
},
|
|
5002
|
-
{
|
|
5003
|
-
"when": "The choices are commands or temporary contextual actions.",
|
|
5004
|
-
"component": "component:ds-menu",
|
|
5005
|
-
"reason": "Menu owns transient action and option collections rather than persistent destinations."
|
|
5006
|
-
}
|
|
4961
|
+
"Rendering desktop BarTitle, BarNav, or PanelToolHeader.",
|
|
4962
|
+
"Rendering the Mobile Sheet Nav utility lane."
|
|
5007
4963
|
],
|
|
5008
4964
|
"commonlyComposedWith": [
|
|
5009
|
-
"component:ds-
|
|
5010
|
-
"component:ds-
|
|
5011
|
-
"component:ds-
|
|
5012
|
-
"component:ds-menu"
|
|
4965
|
+
"component:ds-mobile-section-switcher",
|
|
4966
|
+
"component:ds-shell-page",
|
|
4967
|
+
"component:ds-shell-tools"
|
|
5013
4968
|
],
|
|
5014
4969
|
"patterns": [
|
|
5015
4970
|
"pattern:application-shell"
|
|
5016
4971
|
],
|
|
5017
4972
|
"accessibility": [
|
|
5018
|
-
"
|
|
5019
|
-
"
|
|
5020
|
-
"
|
|
5021
|
-
"
|
|
5022
|
-
"When the destination body overflows, it becomes a localized keyboard-focusable scroll region in addition to the roving destination controls.",
|
|
5023
|
-
"Keep the standard dashboard/settings switch and user/account entry available in the footer."
|
|
4973
|
+
"Static screens render a real h1 or h2 according to headingLevel.",
|
|
4974
|
+
"Section-switching screens expose an equivalent semantic heading alongside the accessible popup trigger.",
|
|
4975
|
+
"Subsections use a separately named navigation landmark and never replace the semantic page identity.",
|
|
4976
|
+
"Leading and trailing slotted icon actions retain their own accessible names and tooltips."
|
|
5024
4977
|
],
|
|
5025
4978
|
"states": [
|
|
5026
|
-
"
|
|
5027
|
-
"
|
|
5028
|
-
"
|
|
5029
|
-
"
|
|
5030
|
-
"
|
|
5031
|
-
"The standard footer switches the entire destination collection and navStyle between Dashboard and Settings and exposes the user/account entry.",
|
|
5032
|
-
"The host owns the external user menu opened from dsNavUserAction.",
|
|
5033
|
-
"Item and header controls inherit the shared md control radius while local shell geometry continues to own collapsed layout and footer animation positioning.",
|
|
5034
|
-
"On desktop, allow user-controlled expand and collapse and persist the preference with storageKey when cross-session persistence is appropriate."
|
|
4979
|
+
"Without multiple sections the center renders heading.",
|
|
4980
|
+
"With multiple sections the center renders the controlled MobileSectionSwitcher.",
|
|
4981
|
+
"Optional subsections render in a second row and emit dsSubsectionChange without changing the primary section.",
|
|
4982
|
+
"Sections represent peer destinations at the current navigation level; subsections represent local views beneath the selected page or detail identity.",
|
|
4983
|
+
"Brand tone changes surface and foreground without changing geometry or interaction ownership."
|
|
5035
4984
|
],
|
|
5036
4985
|
"responsiveBehavior": [
|
|
5037
|
-
"
|
|
5038
|
-
"
|
|
5039
|
-
"Below 768px, the consuming application replaces PanelNav with a dedicated mobile navigation component; PanelNav does not own mobile navigation.",
|
|
5040
|
-
"ShellApp permanently owns responsive composition: it determines shell mode, enforces tablet collapse, and replaces PanelNav with future mobile navigation below 768px.",
|
|
5041
|
-
"When the viewport is below breakpoint, PanelNav locks collapsed, disables its header toggle affordance, and preserves the persisted desktop collapse preference.",
|
|
5042
|
-
"Collapsed presentation must preserve destination ordering, active state, notification status, and accessible names."
|
|
4986
|
+
"The primary 48px lane is dedicated to the below-768px presentation; optional subsections add one subordinate 48px lane.",
|
|
4987
|
+
"Equal flexible side lanes keep the center mathematically aligned when actions are asymmetric."
|
|
5043
4988
|
],
|
|
5044
|
-
"frameworkCaveats": {
|
|
5045
|
-
"customElements": [
|
|
5046
|
-
"Assign groups as a JavaScript property for structured data; a JSON string attribute is also supported.",
|
|
5047
|
-
"Set nav-style before the element connects when first-paint style must match the current route."
|
|
5048
|
-
],
|
|
5049
|
-
"react": [
|
|
5050
|
-
"Pass groups as an array through the generated React wrapper and synchronize currentUrl with the host router.",
|
|
5051
|
-
"ShellApp owns mobile replacement; PanelNav enforces its configured breakpoint expansion lock."
|
|
5052
|
-
],
|
|
5053
|
-
"angular": [
|
|
5054
|
-
"Import DsPanelNav from @ds-mo/ui/angular/ds-panel-nav and bind groups as a property.",
|
|
5055
|
-
"Bind both the nav-style attribute and navStyle property when first-paint route styling must be deterministic.",
|
|
5056
|
-
"ShellApp owns mobile replacement; PanelNav enforces its configured breakpoint expansion lock."
|
|
5057
|
-
]
|
|
5058
|
-
},
|
|
5059
4989
|
"references": [
|
|
5060
4990
|
{
|
|
5061
|
-
"label": "
|
|
5062
|
-
"path": "src/wc/components/
|
|
5063
|
-
},
|
|
5064
|
-
{
|
|
5065
|
-
"label": "Framework and routing integration",
|
|
5066
|
-
"path": "docs/framework-integration.md"
|
|
5067
|
-
},
|
|
5068
|
-
{
|
|
5069
|
-
"label": "Application shell composition",
|
|
5070
|
-
"path": "agent/patterns/application-shell/pattern.agent.json"
|
|
4991
|
+
"label": "Storybook",
|
|
4992
|
+
"path": "src/wc/components/MobileHeader/MobileHeader.stories.ts"
|
|
5071
4993
|
}
|
|
5072
4994
|
]
|
|
5073
4995
|
},
|
|
5074
4996
|
"api": {
|
|
5075
4997
|
"props": {
|
|
5076
|
-
"
|
|
4998
|
+
"heading": {
|
|
5077
4999
|
"type": "string",
|
|
5078
5000
|
"required": false
|
|
5079
5001
|
},
|
|
5080
|
-
"
|
|
5081
|
-
"type": "
|
|
5002
|
+
"headingLevel": {
|
|
5003
|
+
"type": "MobileHeaderHeadingLevel",
|
|
5082
5004
|
"required": false
|
|
5083
5005
|
},
|
|
5084
|
-
"
|
|
5085
|
-
"type": "
|
|
5006
|
+
"sections": {
|
|
5007
|
+
"type": "TabItem[]",
|
|
5086
5008
|
"required": false
|
|
5087
5009
|
},
|
|
5088
|
-
"
|
|
5089
|
-
"type": "
|
|
5010
|
+
"sectionsAriaLabel": {
|
|
5011
|
+
"type": "string",
|
|
5090
5012
|
"required": false
|
|
5091
5013
|
},
|
|
5092
|
-
"
|
|
5014
|
+
"sectionsJson": {
|
|
5093
5015
|
"type": "string",
|
|
5094
5016
|
"required": false
|
|
5095
5017
|
},
|
|
5096
|
-
"
|
|
5097
|
-
"type": "
|
|
5018
|
+
"subsections": {
|
|
5019
|
+
"type": "TabItem[]",
|
|
5098
5020
|
"required": false
|
|
5099
5021
|
},
|
|
5100
|
-
"
|
|
5022
|
+
"subsectionsAriaLabel": {
|
|
5101
5023
|
"type": "string",
|
|
5102
5024
|
"required": false
|
|
5103
5025
|
},
|
|
5104
|
-
"
|
|
5026
|
+
"subsectionsJson": {
|
|
5105
5027
|
"type": "string",
|
|
5106
5028
|
"required": false
|
|
5107
5029
|
},
|
|
5108
|
-
"
|
|
5030
|
+
"subvalue": {
|
|
5109
5031
|
"type": "string",
|
|
5110
5032
|
"required": false
|
|
5111
5033
|
},
|
|
5112
|
-
"
|
|
5113
|
-
"type": "
|
|
5114
|
-
"required": false
|
|
5115
|
-
},
|
|
5116
|
-
"expandNavigationLabel": {
|
|
5117
|
-
"type": "string",
|
|
5118
|
-
"required": false
|
|
5119
|
-
},
|
|
5120
|
-
"groups": {
|
|
5121
|
-
"type": "string | PanelNavGroup[]",
|
|
5122
|
-
"required": false
|
|
5123
|
-
},
|
|
5124
|
-
"navStyle": {
|
|
5125
|
-
"type": "NavChromeStyle",
|
|
5126
|
-
"required": false
|
|
5127
|
-
},
|
|
5128
|
-
"navigationItemsLabel": {
|
|
5129
|
-
"type": "string",
|
|
5130
|
-
"required": false
|
|
5131
|
-
},
|
|
5132
|
-
"routerMode": {
|
|
5133
|
-
"type": "PanelNavRouterMode",
|
|
5134
|
-
"required": false
|
|
5135
|
-
},
|
|
5136
|
-
"settingsLabel": {
|
|
5137
|
-
"type": "string",
|
|
5138
|
-
"required": false
|
|
5139
|
-
},
|
|
5140
|
-
"settingsNavigationLabel": {
|
|
5141
|
-
"type": "string",
|
|
5142
|
-
"required": false
|
|
5143
|
-
},
|
|
5144
|
-
"storageKey": {
|
|
5145
|
-
"type": "string",
|
|
5146
|
-
"required": false
|
|
5147
|
-
},
|
|
5148
|
-
"userInitial": {
|
|
5149
|
-
"type": "string",
|
|
5034
|
+
"tone": {
|
|
5035
|
+
"type": "MobileHeaderTone",
|
|
5150
5036
|
"required": false
|
|
5151
5037
|
},
|
|
5152
|
-
"
|
|
5038
|
+
"value": {
|
|
5153
5039
|
"type": "string",
|
|
5154
5040
|
"required": false
|
|
5155
5041
|
}
|
|
5156
5042
|
},
|
|
5157
5043
|
"events": [
|
|
5158
5044
|
{
|
|
5159
|
-
"name": "
|
|
5160
|
-
"detail": "ChromeTransitionDetail"
|
|
5161
|
-
},
|
|
5162
|
-
{
|
|
5163
|
-
"name": "dsChromeTransitionStart",
|
|
5164
|
-
"detail": "ChromeTransitionDetail"
|
|
5165
|
-
},
|
|
5166
|
-
{
|
|
5167
|
-
"name": "dsNavFooterAction",
|
|
5168
|
-
"detail": "void"
|
|
5169
|
-
},
|
|
5170
|
-
{
|
|
5171
|
-
"name": "dsNavSelect",
|
|
5045
|
+
"name": "dsSectionChange",
|
|
5172
5046
|
"detail": "string"
|
|
5173
5047
|
},
|
|
5174
5048
|
{
|
|
5175
|
-
"name": "
|
|
5176
|
-
"detail": "
|
|
5177
|
-
},
|
|
5178
|
-
{
|
|
5179
|
-
"name": "dsNavUserAction",
|
|
5180
|
-
"detail": "PanelNavUserActionDetail"
|
|
5049
|
+
"name": "dsSubsectionChange",
|
|
5050
|
+
"detail": "string"
|
|
5181
5051
|
}
|
|
5182
5052
|
],
|
|
5183
5053
|
"slots": []
|
|
5184
5054
|
},
|
|
5185
5055
|
"exports": {
|
|
5186
|
-
"customElement": "ds-
|
|
5187
|
-
"react": "
|
|
5188
|
-
"angular": "
|
|
5056
|
+
"customElement": "ds-mobile-header",
|
|
5057
|
+
"react": "DsMobileHeader",
|
|
5058
|
+
"angular": "DsMobileHeader"
|
|
5189
5059
|
},
|
|
5190
5060
|
"dependencies": [
|
|
5191
5061
|
"@ds-mo/ui",
|
|
5192
|
-
"@ds-mo/tokens"
|
|
5193
|
-
"@ds-mo/icons"
|
|
5062
|
+
"@ds-mo/tokens"
|
|
5194
5063
|
],
|
|
5195
5064
|
"componentDependencies": [
|
|
5196
|
-
"
|
|
5197
|
-
"
|
|
5198
|
-
"icon",
|
|
5199
|
-
"text",
|
|
5200
|
-
"tooltip"
|
|
5065
|
+
"mobile-section-switcher",
|
|
5066
|
+
"text"
|
|
5201
5067
|
]
|
|
5202
5068
|
},
|
|
5203
5069
|
{
|
|
5204
|
-
"id": "component:ds-
|
|
5205
|
-
"tag": "ds-
|
|
5206
|
-
"name": "
|
|
5207
|
-
"title": "
|
|
5208
|
-
"summary": "
|
|
5070
|
+
"id": "component:ds-mobile-section-switcher",
|
|
5071
|
+
"tag": "ds-mobile-section-switcher",
|
|
5072
|
+
"name": "mobile-section-switcher",
|
|
5073
|
+
"title": "MobileSectionSwitcher",
|
|
5074
|
+
"summary": "Controlled mobile section chooser showing the current section, adjacent-position hints, and a complete tap menu.",
|
|
5209
5075
|
"intentStatus": "complete",
|
|
5210
5076
|
"intent": {
|
|
5211
|
-
"audience": "
|
|
5212
|
-
"status": "
|
|
5213
|
-
"summary": "
|
|
5077
|
+
"audience": "specialized",
|
|
5078
|
+
"status": "experimental",
|
|
5079
|
+
"summary": "Controlled mobile section chooser showing the current section, adjacent-position hints, and a complete tap menu.",
|
|
5214
5080
|
"useWhen": [
|
|
5215
|
-
"A
|
|
5216
|
-
"Each concise text label controls an immediately available tabpanel without changing application routes."
|
|
5081
|
+
"A mobile page or tool header must combine current-page identity with ordered peer-section navigation."
|
|
5217
5082
|
],
|
|
5218
5083
|
"avoidWhen": [
|
|
5219
|
-
"
|
|
5220
|
-
"
|
|
5221
|
-
"The choices navigate routes in application shell chrome; use PanelNav or BarNav instead.",
|
|
5222
|
-
"The choices are temporary commands or contextual options; use Menu instead.",
|
|
5223
|
-
"Rows need icons, subtext, notification dots, nested levels, or section headers."
|
|
5224
|
-
],
|
|
5225
|
-
"alternatives": [
|
|
5226
|
-
{
|
|
5227
|
-
"when": "Local panel choices fit a horizontal tab row.",
|
|
5228
|
-
"component": "component:ds-tab-group",
|
|
5229
|
-
"reason": "TabGroup is the horizontal local-view counterpart."
|
|
5230
|
-
},
|
|
5231
|
-
{
|
|
5232
|
-
"when": "The choices are primary application destinations.",
|
|
5233
|
-
"component": "component:ds-panel-nav",
|
|
5234
|
-
"reason": "PanelNav owns primary application navigation."
|
|
5235
|
-
},
|
|
5236
|
-
{
|
|
5237
|
-
"when": "The choices are secondary application routes.",
|
|
5238
|
-
"component": "component:ds-bar-nav",
|
|
5239
|
-
"reason": "BarNav owns route sections inside ShellApp."
|
|
5240
|
-
},
|
|
5241
|
-
{
|
|
5242
|
-
"when": "The choices are transient actions or options.",
|
|
5243
|
-
"component": "component:ds-menu",
|
|
5244
|
-
"reason": "Menu owns temporary popup collections."
|
|
5245
|
-
}
|
|
5084
|
+
"Rendering desktop BarNav.",
|
|
5085
|
+
"The destination collection is primary application navigation."
|
|
5246
5086
|
],
|
|
5247
5087
|
"commonlyComposedWith": [
|
|
5248
|
-
"component:ds-
|
|
5249
|
-
|
|
5088
|
+
"component:ds-mobile-header"
|
|
5089
|
+
],
|
|
5090
|
+
"patterns": [
|
|
5091
|
+
"pattern:application-shell"
|
|
5250
5092
|
],
|
|
5251
5093
|
"accessibility": [
|
|
5252
|
-
"
|
|
5253
|
-
"
|
|
5254
|
-
"
|
|
5255
|
-
"Always provide a valid selected item when enabled items exist so exactly one tab and panel are active.",
|
|
5256
|
-
"ArrowUp and ArrowDown move and activate selection; Home and End select the first and last available items.",
|
|
5257
|
-
"Do not use selected text weight as the selection cue; active fill and primary foreground communicate selection."
|
|
5094
|
+
"The trigger exposes the current section, popup relationship, and expanded state.",
|
|
5095
|
+
"Decorative previous and next position hints are hidden from assistive technology.",
|
|
5096
|
+
"The menu is always available so a future swipe gesture is never the only navigation mechanism."
|
|
5258
5097
|
],
|
|
5259
5098
|
"states": [
|
|
5260
|
-
"
|
|
5261
|
-
"
|
|
5262
|
-
"
|
|
5263
|
-
"Selection is singular and follows keyboard focus.",
|
|
5264
|
-
"The omitted default surface treatment is for primary and secondary parent surfaces and uses the brand-active selected fill; pass faint explicitly on faint surfaces to use the neutral active fill.",
|
|
5265
|
-
"Rows contain one text label only and do not express nested navigation or grouped hierarchy."
|
|
5099
|
+
"Selection is controlled and dsChange reports intent without mutating value.",
|
|
5100
|
+
"Dividers group menu items but never participate in previous or next resolution.",
|
|
5101
|
+
"The first and last selectable sections expose only the available neighboring direction."
|
|
5266
5102
|
],
|
|
5267
5103
|
"responsiveBehavior": [
|
|
5268
|
-
"
|
|
5269
|
-
"The consuming panel owns responsive adaptation and decides whether to reposition or replace the side rail."
|
|
5104
|
+
"Use only in the dedicated mobile header presentation."
|
|
5270
5105
|
],
|
|
5271
|
-
"
|
|
5272
|
-
|
|
5273
|
-
"
|
|
5274
|
-
"
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
"Pass items as an array through the generated wrapper, keep value controlled, and use onDsChange to synchronize the visible panel."
|
|
5278
|
-
],
|
|
5279
|
-
"angular": [
|
|
5280
|
-
"Bind items and a valid value as properties, and handle dsChange to synchronize the visible panel."
|
|
5281
|
-
]
|
|
5282
|
-
}
|
|
5106
|
+
"references": [
|
|
5107
|
+
{
|
|
5108
|
+
"label": "Storybook",
|
|
5109
|
+
"path": "src/wc/components/MobileSectionSwitcher/MobileSectionSwitcher.stories.ts"
|
|
5110
|
+
}
|
|
5111
|
+
]
|
|
5283
5112
|
},
|
|
5284
5113
|
"api": {
|
|
5285
5114
|
"props": {
|
|
5286
|
-
"
|
|
5287
|
-
"type": "string
|
|
5288
|
-
"required": false
|
|
5289
|
-
},
|
|
5290
|
-
"ariaLabelledby": {
|
|
5291
|
-
"type": "string | undefined",
|
|
5115
|
+
"navigationLabel": {
|
|
5116
|
+
"type": "string",
|
|
5292
5117
|
"required": false
|
|
5293
5118
|
},
|
|
5294
|
-
"
|
|
5295
|
-
"type": "
|
|
5119
|
+
"sections": {
|
|
5120
|
+
"type": "TabItem[]",
|
|
5296
5121
|
"required": false
|
|
5297
5122
|
},
|
|
5298
|
-
"
|
|
5299
|
-
"type": "
|
|
5123
|
+
"sectionsJson": {
|
|
5124
|
+
"type": "string",
|
|
5300
5125
|
"required": false
|
|
5301
5126
|
},
|
|
5302
5127
|
"value": {
|
|
@@ -5313,387 +5138,390 @@
|
|
|
5313
5138
|
"slots": []
|
|
5314
5139
|
},
|
|
5315
5140
|
"exports": {
|
|
5316
|
-
"customElement": "ds-
|
|
5317
|
-
"react": "
|
|
5318
|
-
"angular": "
|
|
5141
|
+
"customElement": "ds-mobile-section-switcher",
|
|
5142
|
+
"react": "DsMobileSectionSwitcher",
|
|
5143
|
+
"angular": "DsMobileSectionSwitcher"
|
|
5319
5144
|
},
|
|
5320
5145
|
"dependencies": [
|
|
5321
5146
|
"@ds-mo/ui",
|
|
5322
5147
|
"@ds-mo/tokens"
|
|
5323
5148
|
],
|
|
5324
5149
|
"componentDependencies": [
|
|
5150
|
+
"menu",
|
|
5325
5151
|
"text"
|
|
5326
5152
|
]
|
|
5327
5153
|
},
|
|
5328
5154
|
{
|
|
5329
|
-
"id": "component:ds-
|
|
5330
|
-
"tag": "ds-
|
|
5331
|
-
"name": "
|
|
5332
|
-
"title": "
|
|
5333
|
-
"summary": "
|
|
5155
|
+
"id": "component:ds-mobile-sheet-nav",
|
|
5156
|
+
"tag": "ds-mobile-sheet-nav",
|
|
5157
|
+
"name": "mobile-sheet-nav",
|
|
5158
|
+
"title": "MobileSheetNav",
|
|
5159
|
+
"summary": "Full-height mobile navigation sheet with a single brand, context, and utility header above large primary destinations.",
|
|
5334
5160
|
"intentStatus": "complete",
|
|
5335
5161
|
"intent": {
|
|
5336
|
-
"audience": "
|
|
5162
|
+
"audience": "specialized",
|
|
5337
5163
|
"status": "experimental",
|
|
5338
|
-
"summary": "
|
|
5164
|
+
"summary": "Full-height mobile navigation sheet with a single brand, context, and utility header above large primary destinations.",
|
|
5339
5165
|
"useWhen": [
|
|
5340
|
-
"
|
|
5341
|
-
"A tool header needs a title with optional Back or Close navigation, menu, fullscreen, or other compact icon actions."
|
|
5166
|
+
"The mobile ShellApp Menu control needs to expose the complete primary navigation collection."
|
|
5342
5167
|
],
|
|
5343
5168
|
"avoidWhen": [
|
|
5344
|
-
"Rendering
|
|
5345
|
-
"
|
|
5169
|
+
"Rendering desktop PanelNav.",
|
|
5170
|
+
"Switching local page content."
|
|
5346
5171
|
],
|
|
5347
5172
|
"commonlyComposedWith": [
|
|
5348
|
-
"component:ds-
|
|
5173
|
+
"component:ds-shell-app",
|
|
5174
|
+
"component:ds-mobile-bar-nav"
|
|
5175
|
+
],
|
|
5176
|
+
"patterns": [
|
|
5177
|
+
"pattern:application-shell"
|
|
5349
5178
|
],
|
|
5350
5179
|
"accessibility": [
|
|
5351
|
-
"
|
|
5352
|
-
"
|
|
5180
|
+
"The sheet is a named navigation landmark and retains visible labels for every primary destination.",
|
|
5181
|
+
"Dashboard and Settings use icon-only tabs with localized accessible names; Help and Account use icon-only actions with matching tooltips.",
|
|
5182
|
+
"Escape requests dismissal and opening moves focus to the selected or first available area."
|
|
5353
5183
|
],
|
|
5354
5184
|
"states": [
|
|
5355
|
-
"
|
|
5356
|
-
"
|
|
5357
|
-
"Header chrome text is not selectable; actions remain keyboard focusable and interactive.",
|
|
5358
|
-
"Adjacent trailing actions keep the shared 4px control gap in drawer and fullscreen presentations.",
|
|
5359
|
-
"When fullscreen and overflow actions appear together, author fullscreen before overflow so Ellipses remains the rightmost action.",
|
|
5360
|
-
"PanelTools supplies application-owned actions and relays their ids through its shared dsHeaderAction event."
|
|
5185
|
+
"Dashboard and Settings change only the flat destination collection being browsed.",
|
|
5186
|
+
"Area, Help, and Account events express intent while the application owns navigation and product behavior."
|
|
5361
5187
|
],
|
|
5362
5188
|
"responsiveBehavior": [
|
|
5363
|
-
"The
|
|
5189
|
+
"The pane fills the mobile content stage while the bottom bar remains available."
|
|
5364
5190
|
],
|
|
5365
5191
|
"references": [
|
|
5366
5192
|
{
|
|
5367
|
-
"label": "
|
|
5368
|
-
"path": "src/wc/components/
|
|
5193
|
+
"label": "Storybook",
|
|
5194
|
+
"path": "src/wc/components/MobileSheetNav/MobileSheetNav.stories.ts"
|
|
5369
5195
|
}
|
|
5370
5196
|
]
|
|
5371
5197
|
},
|
|
5372
5198
|
"api": {
|
|
5373
5199
|
"props": {
|
|
5374
|
-
"
|
|
5375
|
-
"type": "PanelToolsHeaderAction[]",
|
|
5376
|
-
"required": false
|
|
5377
|
-
},
|
|
5378
|
-
"backAriaLabel": {
|
|
5200
|
+
"accountLabel": {
|
|
5379
5201
|
"type": "string",
|
|
5380
5202
|
"required": false
|
|
5381
5203
|
},
|
|
5382
|
-
"
|
|
5383
|
-
"type": "
|
|
5204
|
+
"browseContext": {
|
|
5205
|
+
"type": "NavChromeStyle",
|
|
5384
5206
|
"required": false
|
|
5385
5207
|
},
|
|
5386
|
-
"
|
|
5208
|
+
"currentUrl": {
|
|
5387
5209
|
"type": "string",
|
|
5388
5210
|
"required": false
|
|
5389
5211
|
},
|
|
5390
|
-
"
|
|
5391
|
-
"type": "
|
|
5212
|
+
"dashboardGroups": {
|
|
5213
|
+
"type": "PanelNavGroup[]",
|
|
5392
5214
|
"required": false
|
|
5393
5215
|
},
|
|
5394
|
-
"
|
|
5395
|
-
"type": "string
|
|
5216
|
+
"dashboardLabel": {
|
|
5217
|
+
"type": "string",
|
|
5396
5218
|
"required": false
|
|
5397
5219
|
},
|
|
5398
|
-
"
|
|
5399
|
-
"type": "
|
|
5220
|
+
"helpLabel": {
|
|
5221
|
+
"type": "string",
|
|
5400
5222
|
"required": false
|
|
5401
5223
|
},
|
|
5402
|
-
"
|
|
5224
|
+
"navigationLabel": {
|
|
5403
5225
|
"type": "string",
|
|
5404
5226
|
"required": false
|
|
5405
5227
|
},
|
|
5406
|
-
"
|
|
5228
|
+
"open": {
|
|
5407
5229
|
"type": "boolean",
|
|
5408
5230
|
"required": false
|
|
5409
5231
|
},
|
|
5410
|
-
"
|
|
5411
|
-
"type": "
|
|
5232
|
+
"settingsGroups": {
|
|
5233
|
+
"type": "PanelNavGroup[]",
|
|
5234
|
+
"required": false
|
|
5235
|
+
},
|
|
5236
|
+
"settingsLabel": {
|
|
5237
|
+
"type": "string",
|
|
5412
5238
|
"required": false
|
|
5413
5239
|
}
|
|
5414
5240
|
},
|
|
5415
5241
|
"events": [
|
|
5416
5242
|
{
|
|
5417
|
-
"name": "
|
|
5418
|
-
"detail": "
|
|
5243
|
+
"name": "dsAreaSelect",
|
|
5244
|
+
"detail": "string"
|
|
5419
5245
|
},
|
|
5420
5246
|
{
|
|
5421
|
-
"name": "
|
|
5422
|
-
"detail": "
|
|
5247
|
+
"name": "dsBrowseContextChange",
|
|
5248
|
+
"detail": "NavChromeStyle"
|
|
5423
5249
|
},
|
|
5424
5250
|
{
|
|
5425
|
-
"name": "
|
|
5426
|
-
"detail": "
|
|
5251
|
+
"name": "dsClose",
|
|
5252
|
+
"detail": "void"
|
|
5427
5253
|
}
|
|
5428
5254
|
],
|
|
5429
5255
|
"slots": []
|
|
5430
5256
|
},
|
|
5431
5257
|
"exports": {
|
|
5432
|
-
"customElement": "ds-
|
|
5433
|
-
"react": "
|
|
5434
|
-
"angular": "
|
|
5258
|
+
"customElement": "ds-mobile-sheet-nav",
|
|
5259
|
+
"react": "DsMobileSheetNav",
|
|
5260
|
+
"angular": "DsMobileSheetNav"
|
|
5435
5261
|
},
|
|
5436
5262
|
"dependencies": [
|
|
5437
5263
|
"@ds-mo/ui",
|
|
5438
|
-
"@ds-mo/tokens"
|
|
5264
|
+
"@ds-mo/tokens",
|
|
5265
|
+
"@ds-mo/icons"
|
|
5439
5266
|
],
|
|
5440
5267
|
"componentDependencies": [
|
|
5268
|
+
"badge",
|
|
5441
5269
|
"button-unfilled",
|
|
5270
|
+
"icon",
|
|
5271
|
+
"tab-group",
|
|
5442
5272
|
"text",
|
|
5443
5273
|
"tooltip"
|
|
5444
5274
|
]
|
|
5445
5275
|
},
|
|
5446
5276
|
{
|
|
5447
|
-
"id": "component:ds-
|
|
5448
|
-
"tag": "ds-
|
|
5449
|
-
"name": "
|
|
5450
|
-
"title": "
|
|
5451
|
-
"summary": "
|
|
5277
|
+
"id": "component:ds-modal",
|
|
5278
|
+
"tag": "ds-modal",
|
|
5279
|
+
"name": "modal",
|
|
5280
|
+
"title": "Modal",
|
|
5281
|
+
"summary": "Dismissible native top-layer dialog for a focused confirmation or short blocking task, with a fixed title-and-close header, composable content, and an optional two-action footer.",
|
|
5452
5282
|
"intentStatus": "complete",
|
|
5453
5283
|
"intent": {
|
|
5454
5284
|
"audience": "general",
|
|
5455
|
-
"status": "
|
|
5456
|
-
"summary": "
|
|
5285
|
+
"status": "stable",
|
|
5286
|
+
"summary": "Dismissible native top-layer dialog for a focused confirmation or short blocking task, with a fixed title-and-close header, composable content, and an optional two-action footer.",
|
|
5457
5287
|
"useWhen": [
|
|
5458
|
-
"
|
|
5459
|
-
"
|
|
5460
|
-
"The
|
|
5288
|
+
"The user must confirm or cancel one focused decision before returning to the underlying interface.",
|
|
5289
|
+
"A short blocking task or compact form needs dialog semantics, focus containment, and explicit completion actions.",
|
|
5290
|
+
"The content can be safely dismissed through Close, Escape, or the backdrop."
|
|
5461
5291
|
],
|
|
5462
5292
|
"avoidWhen": [
|
|
5463
|
-
"The
|
|
5464
|
-
"
|
|
5293
|
+
"The message is non-blocking feedback or a transient status update.",
|
|
5294
|
+
"The interaction is a contextual list of commands anchored to a trigger.",
|
|
5295
|
+
"The workflow is multi-step, long-form, or requires substantial navigation.",
|
|
5296
|
+
"Dismissal would lose work or leave an irreversible operation in an unsafe state.",
|
|
5297
|
+
"A second modal would be opened over an existing modal."
|
|
5298
|
+
],
|
|
5299
|
+
"alternatives": [
|
|
5300
|
+
{
|
|
5301
|
+
"when": "The user needs non-blocking feedback or a transient status message.",
|
|
5302
|
+
"component": "component:ds-toast",
|
|
5303
|
+
"reason": "Toast communicates transient status without trapping focus or blocking the page."
|
|
5304
|
+
},
|
|
5305
|
+
{
|
|
5306
|
+
"when": "A trigger reveals a short contextual list of commands.",
|
|
5307
|
+
"component": "component:ds-menu",
|
|
5308
|
+
"reason": "Menu provides anchored command semantics without creating a blocking dialog."
|
|
5309
|
+
},
|
|
5310
|
+
{
|
|
5311
|
+
"when": "Editable settings should remain visible without blocking the rest of the interface.",
|
|
5312
|
+
"component": "component:ds-card-setting",
|
|
5313
|
+
"reason": "CardSetting provides a persistent controlled settings workflow without modal focus containment."
|
|
5314
|
+
}
|
|
5465
5315
|
],
|
|
5466
5316
|
"commonlyComposedWith": [
|
|
5467
|
-
"component:ds-
|
|
5468
|
-
"component:ds-
|
|
5469
|
-
"component:ds-
|
|
5317
|
+
"component:ds-button-filled",
|
|
5318
|
+
"component:ds-button-unfilled",
|
|
5319
|
+
"component:ds-field",
|
|
5320
|
+
"component:ds-text"
|
|
5470
5321
|
],
|
|
5471
5322
|
"accessibility": [
|
|
5472
|
-
"Provide
|
|
5473
|
-
"
|
|
5474
|
-
"
|
|
5323
|
+
"Provide a concise visible heading; the component uses it as the dialog's accessible name.",
|
|
5324
|
+
"Give the primary explanatory copy a stable id and pass it through aria-describedby so assistive technology receives the decision context.",
|
|
5325
|
+
"Opening the native modal dialog moves focus to the header Close action, whose visible tooltip matches its accessible name, traps Tab navigation inside the top layer, and makes outside content inert.",
|
|
5326
|
+
"Close, Escape, and backdrop activation emit dsClose with close-button, escape, or backdrop reason before beginning dismissal; use the component only when every dismissal path is safe.",
|
|
5327
|
+
"After exit motion completes, the native dialog leaves the top layer, focus returns to the previously focused element, and dsAfterClose emits.",
|
|
5328
|
+
"Use visible label-only footer buttons. Keep at most two actions: one bold filled primary action followed by one bordered unfilled action, or two bordered unfilled actions.",
|
|
5329
|
+
"Use negative intent for a filled destructive action and state the irreversible consequence in the content.",
|
|
5330
|
+
"Do not open a modal from another modal; keep one blocking decision in focus at a time."
|
|
5475
5331
|
],
|
|
5476
5332
|
"states": [
|
|
5477
|
-
"The
|
|
5478
|
-
"The
|
|
5479
|
-
"The
|
|
5480
|
-
"
|
|
5481
|
-
"
|
|
5333
|
+
"The owner opens the modal through the open property and responds to the typed dsClose detail for application state synchronization or dismissal analytics.",
|
|
5334
|
+
"The component mutates open to false for Close, Escape, and backdrop dismissal while retaining its rendered surface through exit motion.",
|
|
5335
|
+
"The default slot owns task content; the named footer slot is optional and is hidden when no actions are assigned.",
|
|
5336
|
+
"Primary actions use a bold filled button with semantic intent. Secondary and cancel actions use bordered label-only unfilled buttons.",
|
|
5337
|
+
"The owner performs save, delete, cancel, and other product consequences before or while closing the modal."
|
|
5482
5338
|
],
|
|
5483
5339
|
"responsiveBehavior": [
|
|
5484
|
-
"
|
|
5340
|
+
"Choose the smallest sm, md, or lg width that fits the focused task; the top-layer dialog clamps to the viewport with token-based outer space.",
|
|
5341
|
+
"Content scrolls independently when needed while the 64px header and optional 64px footer remain fixed.",
|
|
5342
|
+
"Avoid layouts whose minimum content width exceeds the narrow viewport clamp.",
|
|
5343
|
+
"The native top layer escapes transformed ancestors, clipping containers, and application stacking contexts without moving slotted content."
|
|
5485
5344
|
],
|
|
5486
5345
|
"frameworkCaveats": {
|
|
5487
5346
|
"customElements": [
|
|
5488
|
-
"
|
|
5489
|
-
"
|
|
5347
|
+
"Set open as a JavaScript property when controlling the modal; inspect dsClose.detail.reason and use dsAfterClose for cleanup that must wait for exit motion and focus restoration.",
|
|
5348
|
+
"Connect the most relevant slotted explanatory text through aria-describedby.",
|
|
5349
|
+
"Footer actions are slotted application-owned controls and must implement their own product consequence."
|
|
5490
5350
|
],
|
|
5491
5351
|
"react": [
|
|
5492
|
-
"
|
|
5493
|
-
"
|
|
5352
|
+
"Pass open to DsModal, inspect onDsClose event detail, and use onDsAfterClose only for cleanup after exit motion and focus restoration.",
|
|
5353
|
+
"Connect the most relevant slotted explanatory text through aria-describedby.",
|
|
5354
|
+
"Assign footer controls with slot=\"footer\" and handle each action before updating open."
|
|
5494
5355
|
],
|
|
5495
5356
|
"angular": [
|
|
5496
|
-
"
|
|
5497
|
-
"
|
|
5357
|
+
"Bind [open], inspect $event.detail from (dsClose), and use (dsAfterClose) only for cleanup after exit motion and focus restoration.",
|
|
5358
|
+
"Connect the most relevant slotted explanatory text through aria-describedby.",
|
|
5359
|
+
"Assign footer controls with slot=\"footer\" and handle each action before updating open."
|
|
5498
5360
|
]
|
|
5499
5361
|
},
|
|
5500
5362
|
"references": [
|
|
5501
5363
|
{
|
|
5502
|
-
"label": "Storybook examples",
|
|
5503
|
-
"path": "src/wc/components/
|
|
5364
|
+
"label": "Storybook confirmation and footer examples",
|
|
5365
|
+
"path": "src/wc/components/Modal/Modal.stories.ts"
|
|
5366
|
+
},
|
|
5367
|
+
{
|
|
5368
|
+
"label": "Cross-browser focus, dismissal, geometry, and accessibility coverage",
|
|
5369
|
+
"path": "tests/e2e/accessibility-overlays.spec.ts"
|
|
5370
|
+
},
|
|
5371
|
+
{
|
|
5372
|
+
"label": "Reduced-motion overlay coverage",
|
|
5373
|
+
"path": "tests/e2e/reduced-motion.spec.ts"
|
|
5504
5374
|
}
|
|
5505
5375
|
]
|
|
5506
5376
|
},
|
|
5507
5377
|
"api": {
|
|
5508
5378
|
"props": {
|
|
5509
|
-
"
|
|
5510
|
-
"type": "string",
|
|
5511
|
-
"required": false
|
|
5512
|
-
},
|
|
5513
|
-
"controls": {
|
|
5379
|
+
"ariaDescribedby": {
|
|
5514
5380
|
"type": "string | undefined",
|
|
5515
5381
|
"required": false
|
|
5516
5382
|
},
|
|
5517
|
-
"
|
|
5518
|
-
"type": "boolean",
|
|
5519
|
-
"required": false
|
|
5520
|
-
},
|
|
5521
|
-
"filterAriaLabel": {
|
|
5383
|
+
"closeAriaLabel": {
|
|
5522
5384
|
"type": "string",
|
|
5523
5385
|
"required": false
|
|
5524
5386
|
},
|
|
5525
|
-
"
|
|
5526
|
-
"type": "string | undefined",
|
|
5527
|
-
"required": false
|
|
5528
|
-
},
|
|
5529
|
-
"filterExpanded": {
|
|
5530
|
-
"type": "boolean",
|
|
5531
|
-
"required": false
|
|
5532
|
-
},
|
|
5533
|
-
"filterTriggerId": {
|
|
5387
|
+
"heading": {
|
|
5534
5388
|
"type": "string",
|
|
5535
|
-
"required":
|
|
5536
|
-
},
|
|
5537
|
-
"isInactive": {
|
|
5538
|
-
"type": "boolean",
|
|
5539
|
-
"required": false
|
|
5389
|
+
"required": true
|
|
5540
5390
|
},
|
|
5541
|
-
"
|
|
5542
|
-
"type": "string",
|
|
5391
|
+
"modalWidth": {
|
|
5392
|
+
"type": "ModalWidth | string",
|
|
5543
5393
|
"required": false
|
|
5544
5394
|
},
|
|
5545
|
-
"
|
|
5395
|
+
"open": {
|
|
5546
5396
|
"type": "boolean",
|
|
5547
5397
|
"required": false
|
|
5548
|
-
},
|
|
5549
|
-
"value": {
|
|
5550
|
-
"type": "string",
|
|
5551
|
-
"required": false
|
|
5552
5398
|
}
|
|
5553
5399
|
},
|
|
5554
5400
|
"events": [
|
|
5555
5401
|
{
|
|
5556
|
-
"name": "
|
|
5557
|
-
"detail": "string"
|
|
5558
|
-
},
|
|
5559
|
-
{
|
|
5560
|
-
"name": "dsClear",
|
|
5402
|
+
"name": "dsAfterClose",
|
|
5561
5403
|
"detail": "void"
|
|
5562
5404
|
},
|
|
5563
5405
|
{
|
|
5564
|
-
"name": "
|
|
5565
|
-
"detail": "
|
|
5406
|
+
"name": "dsClose",
|
|
5407
|
+
"detail": "ModalCloseDetail"
|
|
5566
5408
|
}
|
|
5567
5409
|
],
|
|
5568
5410
|
"slots": []
|
|
5569
5411
|
},
|
|
5570
5412
|
"exports": {
|
|
5571
|
-
"customElement": "ds-
|
|
5572
|
-
"react": "
|
|
5573
|
-
"angular": "
|
|
5413
|
+
"customElement": "ds-modal",
|
|
5414
|
+
"react": "DsModal",
|
|
5415
|
+
"angular": "DsModal"
|
|
5574
5416
|
},
|
|
5575
5417
|
"dependencies": [
|
|
5576
5418
|
"@ds-mo/ui",
|
|
5577
|
-
"@ds-mo/tokens"
|
|
5578
|
-
"@ds-mo/icons"
|
|
5419
|
+
"@ds-mo/tokens"
|
|
5579
5420
|
],
|
|
5580
5421
|
"componentDependencies": [
|
|
5581
5422
|
"button-unfilled",
|
|
5582
|
-
"divider",
|
|
5583
|
-
"icon",
|
|
5584
5423
|
"text",
|
|
5585
5424
|
"tooltip"
|
|
5586
5425
|
]
|
|
5587
5426
|
},
|
|
5588
5427
|
{
|
|
5589
|
-
"id": "component:ds-panel-
|
|
5590
|
-
"tag": "ds-panel-
|
|
5591
|
-
"name": "panel-
|
|
5592
|
-
"title": "
|
|
5593
|
-
"summary": "
|
|
5428
|
+
"id": "component:ds-panel-nav",
|
|
5429
|
+
"tag": "ds-panel-nav",
|
|
5430
|
+
"name": "panel-nav",
|
|
5431
|
+
"title": "PanelNav",
|
|
5432
|
+
"summary": "The single persistent primary navigation for an application, providing grouped top-level destinations, active-route state, standard dashboard/settings switching, user access, and collapsible desktop and tablet presentation.",
|
|
5594
5433
|
"intentStatus": "complete",
|
|
5595
5434
|
"intent": {
|
|
5596
5435
|
"audience": "specialized",
|
|
5597
5436
|
"status": "stable",
|
|
5598
|
-
"summary": "
|
|
5437
|
+
"summary": "The single persistent primary navigation for an application, providing grouped top-level destinations, active-route state, standard dashboard/settings switching, user access, and collapsible desktop and tablet presentation.",
|
|
5599
5438
|
"useWhen": [
|
|
5600
|
-
"
|
|
5601
|
-
"
|
|
5602
|
-
"
|
|
5439
|
+
"Building the one primary navigation surface for an application that uses the CompoMo system.",
|
|
5440
|
+
"Top-level destinations must remain consistently available while the application's page content changes.",
|
|
5441
|
+
"Primary destinations need visual grouping, icons, notification indicators, active-route state, and expanded or collapsed presentation."
|
|
5603
5442
|
],
|
|
5604
5443
|
"avoidWhen": [
|
|
5605
|
-
"
|
|
5606
|
-
"The
|
|
5607
|
-
"
|
|
5608
|
-
"
|
|
5609
|
-
"
|
|
5444
|
+
"A second navigation surface is needed within the same application; an application must have only one PanelNav.",
|
|
5445
|
+
"The choices represent sections within the active primary destination; use BarNav instead.",
|
|
5446
|
+
"The choices switch local content without changing the application's primary destination; use TabGroup instead.",
|
|
5447
|
+
"The interaction performs a command or presents temporary contextual choices; use a button or Menu instead.",
|
|
5448
|
+
"Building navigation below the mobile breakpoint; use the application's dedicated mobile navigation component instead."
|
|
5610
5449
|
],
|
|
5611
5450
|
"alternatives": [
|
|
5612
5451
|
{
|
|
5613
|
-
"when": "The
|
|
5614
|
-
"component": "component:ds-
|
|
5615
|
-
"reason": "
|
|
5452
|
+
"when": "The choices represent route sections within the active primary destination.",
|
|
5453
|
+
"component": "component:ds-bar-nav",
|
|
5454
|
+
"reason": "BarNav owns secondary section navigation within the destination selected by PanelNav."
|
|
5616
5455
|
},
|
|
5617
5456
|
{
|
|
5618
|
-
"when": "The
|
|
5619
|
-
"component": "component:ds-
|
|
5620
|
-
"reason": "
|
|
5457
|
+
"when": "The choices switch local content without changing the application's primary destination.",
|
|
5458
|
+
"component": "component:ds-tab-group",
|
|
5459
|
+
"reason": "TabGroup owns local view selection and tab semantics."
|
|
5621
5460
|
},
|
|
5622
5461
|
{
|
|
5623
|
-
"when": "
|
|
5462
|
+
"when": "The choices are commands or temporary contextual actions.",
|
|
5624
5463
|
"component": "component:ds-menu",
|
|
5625
|
-
"reason": "Menu owns transient
|
|
5464
|
+
"reason": "Menu owns transient action and option collections rather than persistent destinations."
|
|
5626
5465
|
}
|
|
5627
5466
|
],
|
|
5628
5467
|
"commonlyComposedWith": [
|
|
5629
5468
|
"component:ds-shell-app",
|
|
5630
|
-
"component:ds-
|
|
5631
|
-
"component:ds-
|
|
5469
|
+
"component:ds-bar-nav",
|
|
5470
|
+
"component:ds-panel-tools",
|
|
5471
|
+
"component:ds-menu"
|
|
5632
5472
|
],
|
|
5633
5473
|
"patterns": [
|
|
5634
5474
|
"pattern:application-shell"
|
|
5635
5475
|
],
|
|
5636
5476
|
"accessibility": [
|
|
5637
|
-
"
|
|
5638
|
-
"
|
|
5639
|
-
"
|
|
5640
|
-
"
|
|
5641
|
-
"
|
|
5642
|
-
"
|
|
5477
|
+
"Give every primary destination a concise visible label and an icon that supports rather than replaces that label.",
|
|
5478
|
+
"Provide localized dashboard, settings, account, navigation, collapse, and expand labels.",
|
|
5479
|
+
"Preserve accessible destination names when the panel is collapsed to icon-only presentation.",
|
|
5480
|
+
"Use notification dots as supplemental status and never as the only indication of important information.",
|
|
5481
|
+
"When the destination body overflows, it becomes a localized keyboard-focusable scroll region in addition to the roving destination controls.",
|
|
5482
|
+
"Keep the standard dashboard/settings switch and user/account entry available in the footer."
|
|
5643
5483
|
],
|
|
5644
5484
|
"states": [
|
|
5645
|
-
"
|
|
5646
|
-
"
|
|
5647
|
-
"
|
|
5648
|
-
"
|
|
5649
|
-
"
|
|
5650
|
-
"
|
|
5651
|
-
"The
|
|
5652
|
-
"
|
|
5653
|
-
"
|
|
5654
|
-
"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.",
|
|
5655
|
-
"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.",
|
|
5656
|
-
"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.",
|
|
5657
|
-
"Tool view roots stay transparent so ShellApp's chrome wash remains visible; only explicitly designed child surfaces introduce a fill.",
|
|
5658
|
-
"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.",
|
|
5659
|
-
"If an active optional tool becomes unavailable, PanelTools closes the drawer, clears activeTool, and emits its deselection.",
|
|
5660
|
-
"Use isInactive only for a temporarily unavailable visible tool; omit tools the user is not authorized to access.",
|
|
5661
|
-
"The application owns slotted tool products and data while PanelTools owns rail ordering, drawer selection, open state, motion, and shell events.",
|
|
5662
|
-
"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.",
|
|
5663
|
-
"Entering and exiting fullscreen snaps without borrowing the drawer open or close animation.",
|
|
5664
|
-
"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."
|
|
5485
|
+
"Render exactly one PanelNav per application; it owns primary application destinations and no other navigation role.",
|
|
5486
|
+
"The host router owns the current route; prefer currentUrl for active destination matching and use activeId only when route matching is unavailable.",
|
|
5487
|
+
"Use anchor mode for native links or routers that intercept anchors; use event mode when the host performs navigation from dsNavSelect.",
|
|
5488
|
+
"Groups visually organize top-level destinations only and must not be interpreted as nested or expandable navigation.",
|
|
5489
|
+
"Dashboard presents day-to-day operational destinations; Settings presents administrative and configuration destinations.",
|
|
5490
|
+
"The standard footer switches the entire destination collection and navStyle between Dashboard and Settings and exposes the user/account entry.",
|
|
5491
|
+
"The host owns the external user menu opened from dsNavUserAction.",
|
|
5492
|
+
"Item and header controls inherit the shared md control radius while local shell geometry continues to own collapsed layout and footer animation positioning.",
|
|
5493
|
+
"On desktop, allow user-controlled expand and collapse and persist the preference with storageKey when cross-session persistence is appropriate."
|
|
5665
5494
|
],
|
|
5666
5495
|
"responsiveBehavior": [
|
|
5667
|
-
"
|
|
5668
|
-
"
|
|
5669
|
-
"Below 768px,
|
|
5670
|
-
"
|
|
5671
|
-
"
|
|
5672
|
-
"
|
|
5496
|
+
"At 1200px and wider, default to expanded, allow the user to expand or collapse, and restore the locally persisted desktop preference when available.",
|
|
5497
|
+
"From 768px through 1199px, present PanelNav permanently collapsed and do not allow user expansion.",
|
|
5498
|
+
"Below 768px, the consuming application replaces PanelNav with a dedicated mobile navigation component; PanelNav does not own mobile navigation.",
|
|
5499
|
+
"ShellApp permanently owns responsive composition: it determines shell mode, enforces tablet collapse, and replaces PanelNav with future mobile navigation below 768px.",
|
|
5500
|
+
"When the viewport is below breakpoint, PanelNav locks collapsed, disables its header toggle affordance, and preserves the persisted desktop collapse preference.",
|
|
5501
|
+
"Collapsed presentation must preserve destination ordering, active state, notification status, and accessible names."
|
|
5673
5502
|
],
|
|
5674
5503
|
"frameworkCaveats": {
|
|
5675
5504
|
"customElements": [
|
|
5676
|
-
"Assign
|
|
5677
|
-
"
|
|
5678
|
-
"Keep PanelTools mounted at ShellApp scope across route changes and provide each product through its matching named slot."
|
|
5505
|
+
"Assign groups as a JavaScript property for structured data; a JSON string attribute is also supported.",
|
|
5506
|
+
"Set nav-style before the element connects when first-paint style must match the current route."
|
|
5679
5507
|
],
|
|
5680
5508
|
"react": [
|
|
5681
|
-
"Pass
|
|
5682
|
-
"
|
|
5509
|
+
"Pass groups as an array through the generated React wrapper and synchronize currentUrl with the host router.",
|
|
5510
|
+
"ShellApp owns mobile replacement; PanelNav enforces its configured breakpoint expansion lock."
|
|
5683
5511
|
],
|
|
5684
5512
|
"angular": [
|
|
5685
|
-
"Import
|
|
5686
|
-
"Bind
|
|
5687
|
-
"
|
|
5513
|
+
"Import DsPanelNav from @ds-mo/ui/angular/ds-panel-nav and bind groups as a property.",
|
|
5514
|
+
"Bind both the nav-style attribute and navStyle property when first-paint route styling must be deterministic.",
|
|
5515
|
+
"ShellApp owns mobile replacement; PanelNav enforces its configured breakpoint expansion lock."
|
|
5688
5516
|
]
|
|
5689
5517
|
},
|
|
5690
5518
|
"references": [
|
|
5691
5519
|
{
|
|
5692
5520
|
"label": "Executable Storybook examples",
|
|
5693
|
-
"path": "src/wc/components/
|
|
5521
|
+
"path": "src/wc/components/PanelNav/PanelNav.stories.ts"
|
|
5694
5522
|
},
|
|
5695
5523
|
{
|
|
5696
|
-
"label": "Framework and
|
|
5524
|
+
"label": "Framework and routing integration",
|
|
5697
5525
|
"path": "docs/framework-integration.md"
|
|
5698
5526
|
},
|
|
5699
5527
|
{
|
|
@@ -5704,47 +5532,83 @@
|
|
|
5704
5532
|
},
|
|
5705
5533
|
"api": {
|
|
5706
5534
|
"props": {
|
|
5707
|
-
"
|
|
5708
|
-
"type": "
|
|
5535
|
+
"accountLabel": {
|
|
5536
|
+
"type": "string",
|
|
5709
5537
|
"required": false
|
|
5710
5538
|
},
|
|
5711
|
-
"
|
|
5712
|
-
"type": "
|
|
5539
|
+
"accountMenuExpanded": {
|
|
5540
|
+
"type": "boolean",
|
|
5713
5541
|
"required": false
|
|
5714
5542
|
},
|
|
5715
|
-
"
|
|
5716
|
-
"type": "
|
|
5543
|
+
"activeId": {
|
|
5544
|
+
"type": "string",
|
|
5717
5545
|
"required": false
|
|
5718
5546
|
},
|
|
5719
|
-
"
|
|
5547
|
+
"breakpoint": {
|
|
5548
|
+
"type": "number",
|
|
5549
|
+
"required": false
|
|
5550
|
+
},
|
|
5551
|
+
"collapseNavigationLabel": {
|
|
5720
5552
|
"type": "string",
|
|
5721
5553
|
"required": false
|
|
5722
5554
|
},
|
|
5723
|
-
"
|
|
5724
|
-
"type": "
|
|
5555
|
+
"collapsed": {
|
|
5556
|
+
"type": "boolean",
|
|
5725
5557
|
"required": false
|
|
5726
5558
|
},
|
|
5727
|
-
"
|
|
5559
|
+
"currentUrl": {
|
|
5728
5560
|
"type": "string",
|
|
5729
5561
|
"required": false
|
|
5730
5562
|
},
|
|
5731
|
-
"
|
|
5563
|
+
"dashboardLabel": {
|
|
5564
|
+
"type": "string",
|
|
5565
|
+
"required": false
|
|
5566
|
+
},
|
|
5567
|
+
"dashboardNavigationLabel": {
|
|
5568
|
+
"type": "string",
|
|
5569
|
+
"required": false
|
|
5570
|
+
},
|
|
5571
|
+
"disableViewTransition": {
|
|
5732
5572
|
"type": "boolean",
|
|
5733
5573
|
"required": false
|
|
5734
5574
|
},
|
|
5735
|
-
"
|
|
5736
|
-
"type": "
|
|
5575
|
+
"expandNavigationLabel": {
|
|
5576
|
+
"type": "string",
|
|
5577
|
+
"required": false
|
|
5578
|
+
},
|
|
5579
|
+
"groups": {
|
|
5580
|
+
"type": "string | PanelNavGroup[]",
|
|
5581
|
+
"required": false
|
|
5582
|
+
},
|
|
5583
|
+
"navStyle": {
|
|
5584
|
+
"type": "NavChromeStyle",
|
|
5585
|
+
"required": false
|
|
5586
|
+
},
|
|
5587
|
+
"navigationItemsLabel": {
|
|
5588
|
+
"type": "string",
|
|
5589
|
+
"required": false
|
|
5590
|
+
},
|
|
5591
|
+
"routerMode": {
|
|
5592
|
+
"type": "PanelNavRouterMode",
|
|
5593
|
+
"required": false
|
|
5594
|
+
},
|
|
5595
|
+
"settingsLabel": {
|
|
5596
|
+
"type": "string",
|
|
5597
|
+
"required": false
|
|
5598
|
+
},
|
|
5599
|
+
"settingsNavigationLabel": {
|
|
5600
|
+
"type": "string",
|
|
5737
5601
|
"required": false
|
|
5738
5602
|
},
|
|
5739
5603
|
"storageKey": {
|
|
5740
5604
|
"type": "string",
|
|
5741
5605
|
"required": false
|
|
5742
5606
|
},
|
|
5743
|
-
"
|
|
5607
|
+
"userInitial": {
|
|
5744
5608
|
"type": "string",
|
|
5745
5609
|
"required": false
|
|
5746
5610
|
},
|
|
5747
|
-
"
|
|
5611
|
+
"userName": {
|
|
5748
5612
|
"type": "string",
|
|
5749
5613
|
"required": false
|
|
5750
5614
|
}
|
|
@@ -5759,119 +5623,122 @@
|
|
|
5759
5623
|
"detail": "ChromeTransitionDetail"
|
|
5760
5624
|
},
|
|
5761
5625
|
{
|
|
5762
|
-
"name": "
|
|
5763
|
-
"detail": "
|
|
5626
|
+
"name": "dsNavFooterAction",
|
|
5627
|
+
"detail": "void"
|
|
5764
5628
|
},
|
|
5765
5629
|
{
|
|
5766
|
-
"name": "
|
|
5767
|
-
"detail": "
|
|
5630
|
+
"name": "dsNavSelect",
|
|
5631
|
+
"detail": "string"
|
|
5768
5632
|
},
|
|
5769
5633
|
{
|
|
5770
|
-
"name": "
|
|
5771
|
-
"detail": "
|
|
5634
|
+
"name": "dsNavToggle",
|
|
5635
|
+
"detail": "boolean"
|
|
5772
5636
|
},
|
|
5773
5637
|
{
|
|
5774
|
-
"name": "
|
|
5775
|
-
"detail": "
|
|
5638
|
+
"name": "dsNavUserAction",
|
|
5639
|
+
"detail": "PanelNavUserActionDetail"
|
|
5776
5640
|
}
|
|
5777
5641
|
],
|
|
5778
5642
|
"slots": []
|
|
5779
5643
|
},
|
|
5780
5644
|
"exports": {
|
|
5781
|
-
"customElement": "ds-panel-
|
|
5782
|
-
"react": "
|
|
5783
|
-
"angular": "
|
|
5645
|
+
"customElement": "ds-panel-nav",
|
|
5646
|
+
"react": "DsPanelNav",
|
|
5647
|
+
"angular": "DsPanelNav"
|
|
5784
5648
|
},
|
|
5785
5649
|
"dependencies": [
|
|
5786
5650
|
"@ds-mo/ui",
|
|
5787
|
-
"@ds-mo/tokens"
|
|
5651
|
+
"@ds-mo/tokens",
|
|
5652
|
+
"@ds-mo/icons"
|
|
5788
5653
|
],
|
|
5789
5654
|
"componentDependencies": [
|
|
5655
|
+
"badge",
|
|
5790
5656
|
"button-unfilled",
|
|
5791
|
-
"
|
|
5657
|
+
"icon",
|
|
5658
|
+
"text",
|
|
5792
5659
|
"tooltip"
|
|
5793
5660
|
]
|
|
5794
5661
|
},
|
|
5795
5662
|
{
|
|
5796
|
-
"id": "component:ds-
|
|
5797
|
-
"tag": "ds-
|
|
5798
|
-
"name": "
|
|
5799
|
-
"title": "
|
|
5800
|
-
"summary": "
|
|
5663
|
+
"id": "component:ds-panel-sub-nav",
|
|
5664
|
+
"tag": "ds-panel-sub-nav",
|
|
5665
|
+
"name": "panel-sub-nav",
|
|
5666
|
+
"title": "PanelSubNav",
|
|
5667
|
+
"summary": "Persistent vertical tab navigation for a panel or card side rail, switching adjacent local content with menu-like selected fill and stable text weight.",
|
|
5801
5668
|
"intentStatus": "complete",
|
|
5802
5669
|
"intent": {
|
|
5803
5670
|
"audience": "general",
|
|
5804
5671
|
"status": "stable",
|
|
5805
|
-
"summary": "
|
|
5672
|
+
"summary": "Persistent vertical tab navigation for a panel or card side rail, switching adjacent local content with menu-like selected fill and stable text weight.",
|
|
5806
5673
|
"useWhen": [
|
|
5807
|
-
"A
|
|
5808
|
-
"
|
|
5809
|
-
"A form needs one selected string value with native validation, reset, or external form association."
|
|
5674
|
+
"A panel or card side rail needs a persistent vertical list that switches adjacent local content.",
|
|
5675
|
+
"Each concise text label controls an immediately available tabpanel without changing application routes."
|
|
5810
5676
|
],
|
|
5811
5677
|
"avoidWhen": [
|
|
5812
|
-
"
|
|
5813
|
-
"
|
|
5814
|
-
"The
|
|
5678
|
+
"The navigation is not contained in a panel or card side rail.",
|
|
5679
|
+
"Local views should be arranged horizontally; use TabGroup instead.",
|
|
5680
|
+
"The choices navigate routes in application shell chrome; use PanelNav or BarNav instead.",
|
|
5681
|
+
"The choices are temporary commands or contextual options; use Menu instead.",
|
|
5682
|
+
"Rows need icons, subtext, notification dots, nested levels, or section headers."
|
|
5815
5683
|
],
|
|
5816
5684
|
"alternatives": [
|
|
5817
5685
|
{
|
|
5818
|
-
"when": "
|
|
5819
|
-
"component": "component:ds-
|
|
5820
|
-
"reason": "
|
|
5686
|
+
"when": "Local panel choices fit a horizontal tab row.",
|
|
5687
|
+
"component": "component:ds-tab-group",
|
|
5688
|
+
"reason": "TabGroup is the horizontal local-view counterpart."
|
|
5821
5689
|
},
|
|
5822
5690
|
{
|
|
5823
|
-
"when": "
|
|
5824
|
-
"component": "component:ds-
|
|
5825
|
-
"reason": "
|
|
5691
|
+
"when": "The choices are primary application destinations.",
|
|
5692
|
+
"component": "component:ds-panel-nav",
|
|
5693
|
+
"reason": "PanelNav owns primary application navigation."
|
|
5826
5694
|
},
|
|
5827
5695
|
{
|
|
5828
|
-
"when": "The
|
|
5829
|
-
"component": "component:ds-
|
|
5830
|
-
"reason": "
|
|
5696
|
+
"when": "The choices are secondary application routes.",
|
|
5697
|
+
"component": "component:ds-bar-nav",
|
|
5698
|
+
"reason": "BarNav owns route sections inside ShellApp."
|
|
5699
|
+
},
|
|
5700
|
+
{
|
|
5701
|
+
"when": "The choices are transient actions or options.",
|
|
5702
|
+
"component": "component:ds-menu",
|
|
5703
|
+
"reason": "Menu owns temporary popup collections."
|
|
5831
5704
|
}
|
|
5832
5705
|
],
|
|
5833
5706
|
"commonlyComposedWith": [
|
|
5834
|
-
"component:ds-
|
|
5707
|
+
"component:ds-card-setting",
|
|
5835
5708
|
"component:ds-text"
|
|
5836
5709
|
],
|
|
5837
5710
|
"accessibility": [
|
|
5838
|
-
"
|
|
5839
|
-
"
|
|
5840
|
-
"
|
|
5841
|
-
"
|
|
5711
|
+
"Provide an accessible name with aria-label or aria-labelledby.",
|
|
5712
|
+
"Give every item a unique id and the id of its controlled tabpanel.",
|
|
5713
|
+
"Keep each controlled tabpanel labelled by its matching item id.",
|
|
5714
|
+
"Always provide a valid selected item when enabled items exist so exactly one tab and panel are active.",
|
|
5715
|
+
"ArrowUp and ArrowDown move and activate selection; Home and End select the first and last available items.",
|
|
5716
|
+
"Do not use selected text weight as the selection cue; active fill and primary foreground communicate selection."
|
|
5842
5717
|
],
|
|
5843
5718
|
"states": [
|
|
5844
|
-
"
|
|
5845
|
-
"
|
|
5846
|
-
"
|
|
5847
|
-
"
|
|
5719
|
+
"The parent owns the canonical selected value and panel visibility, and should update both from dsChange.",
|
|
5720
|
+
"A missing, empty, or unknown selected value is invalid when enabled items exist; the component does not choose a fallback selection.",
|
|
5721
|
+
"Inactive items remain visible but cannot be focused or selected.",
|
|
5722
|
+
"Selection is singular and follows keyboard focus.",
|
|
5723
|
+
"The omitted default surface treatment is for primary and secondary parent surfaces and uses the brand-active selected fill; pass faint explicitly on faint surfaces to use the neutral active fill.",
|
|
5724
|
+
"Rows contain one text label only and do not express nested navigation or grouped hierarchy."
|
|
5848
5725
|
],
|
|
5849
5726
|
"responsiveBehavior": [
|
|
5850
|
-
"
|
|
5851
|
-
"
|
|
5727
|
+
"The component remains vertical at every width.",
|
|
5728
|
+
"The consuming panel owns responsive adaptation and decides whether to reposition or replace the side rail."
|
|
5852
5729
|
],
|
|
5853
5730
|
"frameworkCaveats": {
|
|
5854
5731
|
"customElements": [
|
|
5855
|
-
"Assign
|
|
5856
|
-
"
|
|
5732
|
+
"Assign items as a JavaScript property because structured arrays are not represented by HTML attributes.",
|
|
5733
|
+
"Keep value synchronized to a valid enabled item and update the controlled panel from dsChange."
|
|
5857
5734
|
],
|
|
5858
5735
|
"react": [
|
|
5859
|
-
"
|
|
5736
|
+
"Pass items as an array through the generated wrapper, keep value controlled, and use onDsChange to synchronize the visible panel."
|
|
5860
5737
|
],
|
|
5861
5738
|
"angular": [
|
|
5862
|
-
"
|
|
5739
|
+
"Bind items and a valid value as properties, and handle dsChange to synchronize the visible panel."
|
|
5863
5740
|
]
|
|
5864
|
-
}
|
|
5865
|
-
"references": [
|
|
5866
|
-
{
|
|
5867
|
-
"label": "Storybook examples",
|
|
5868
|
-
"path": "src/wc/components/Radio/Radio.stories.ts"
|
|
5869
|
-
},
|
|
5870
|
-
{
|
|
5871
|
-
"label": "Cross-browser form and accessibility coverage",
|
|
5872
|
-
"path": "tests/e2e/forms.spec.ts"
|
|
5873
|
-
}
|
|
5874
|
-
]
|
|
5741
|
+
}
|
|
5875
5742
|
},
|
|
5876
5743
|
"api": {
|
|
5877
5744
|
"props": {
|
|
@@ -5883,40 +5750,12 @@
|
|
|
5883
5750
|
"type": "string | undefined",
|
|
5884
5751
|
"required": false
|
|
5885
5752
|
},
|
|
5886
|
-
"
|
|
5887
|
-
"type": "
|
|
5888
|
-
"required": false
|
|
5889
|
-
},
|
|
5890
|
-
"disabled": {
|
|
5891
|
-
"type": "boolean",
|
|
5892
|
-
"required": false
|
|
5893
|
-
},
|
|
5894
|
-
"form": {
|
|
5895
|
-
"type": "string | undefined",
|
|
5896
|
-
"required": false
|
|
5897
|
-
},
|
|
5898
|
-
"isInactive": {
|
|
5899
|
-
"type": "boolean",
|
|
5900
|
-
"required": false
|
|
5901
|
-
},
|
|
5902
|
-
"name": {
|
|
5903
|
-
"type": "string | undefined",
|
|
5904
|
-
"required": false
|
|
5905
|
-
},
|
|
5906
|
-
"options": {
|
|
5907
|
-
"type": "RadioOption[]",
|
|
5908
|
-
"required": false
|
|
5909
|
-
},
|
|
5910
|
-
"required": {
|
|
5911
|
-
"type": "boolean",
|
|
5912
|
-
"required": false
|
|
5913
|
-
},
|
|
5914
|
-
"requiredMessage": {
|
|
5915
|
-
"type": "string",
|
|
5753
|
+
"background": {
|
|
5754
|
+
"type": "PanelSubNavBackground | undefined",
|
|
5916
5755
|
"required": false
|
|
5917
5756
|
},
|
|
5918
|
-
"
|
|
5919
|
-
"type": "
|
|
5757
|
+
"items": {
|
|
5758
|
+
"type": "PanelSubNavItem[]",
|
|
5920
5759
|
"required": false
|
|
5921
5760
|
},
|
|
5922
5761
|
"value": {
|
|
@@ -5933,9 +5772,9 @@
|
|
|
5933
5772
|
"slots": []
|
|
5934
5773
|
},
|
|
5935
5774
|
"exports": {
|
|
5936
|
-
"customElement": "ds-
|
|
5937
|
-
"react": "
|
|
5938
|
-
"angular": "
|
|
5775
|
+
"customElement": "ds-panel-sub-nav",
|
|
5776
|
+
"react": "DsPanelSubNav",
|
|
5777
|
+
"angular": "DsPanelSubNav"
|
|
5939
5778
|
},
|
|
5940
5779
|
"dependencies": [
|
|
5941
5780
|
"@ds-mo/ui",
|
|
@@ -5946,305 +5785,229 @@
|
|
|
5946
5785
|
]
|
|
5947
5786
|
},
|
|
5948
5787
|
{
|
|
5949
|
-
"id": "component:ds-
|
|
5950
|
-
"tag": "ds-
|
|
5951
|
-
"name": "
|
|
5952
|
-
"title": "
|
|
5953
|
-
"summary": "
|
|
5788
|
+
"id": "component:ds-panel-tool-header",
|
|
5789
|
+
"tag": "ds-panel-tool-header",
|
|
5790
|
+
"name": "panel-tool-header",
|
|
5791
|
+
"title": "PanelToolHeader",
|
|
5792
|
+
"summary": "Canonical left-aligned PanelTools header with an optional leading navigation or dismiss action and application-owned trailing icon actions.",
|
|
5954
5793
|
"intentStatus": "complete",
|
|
5955
5794
|
"intent": {
|
|
5956
5795
|
"audience": "general",
|
|
5957
5796
|
"status": "experimental",
|
|
5958
|
-
"summary": "
|
|
5797
|
+
"summary": "Canonical left-aligned PanelTools header with an optional leading navigation or dismiss action and application-owned trailing icon actions.",
|
|
5959
5798
|
"useWhen": [
|
|
5960
|
-
"
|
|
5961
|
-
"
|
|
5799
|
+
"PanelTools needs its one shared root or detail header.",
|
|
5800
|
+
"A tool header needs a title with optional Back or Close navigation, menu, fullscreen, or other compact icon actions."
|
|
5962
5801
|
],
|
|
5963
5802
|
"avoidWhen": [
|
|
5964
|
-
"
|
|
5965
|
-
"
|
|
5803
|
+
"Rendering inside a PanelTools tool body; PanelTools already composes this canonical header above the body.",
|
|
5804
|
+
"The header belongs to page content."
|
|
5966
5805
|
],
|
|
5967
5806
|
"commonlyComposedWith": [
|
|
5968
|
-
"component:ds-button-
|
|
5969
|
-
"component:ds-message-composer"
|
|
5807
|
+
"component:ds-button-unfilled"
|
|
5970
5808
|
],
|
|
5971
5809
|
"accessibility": [
|
|
5972
|
-
"
|
|
5973
|
-
"
|
|
5810
|
+
"Leading navigation or dismiss actions and trailing icon actions require concise localized names; the header reuses each name as the action tooltip.",
|
|
5811
|
+
"The visible heading names the active panel or subview."
|
|
5974
5812
|
],
|
|
5975
5813
|
"states": [
|
|
5976
|
-
"The
|
|
5977
|
-
"
|
|
5978
|
-
"
|
|
5814
|
+
"The title remains left aligned whether the header has no actions, Back, one trailing action, or several trailing actions.",
|
|
5815
|
+
"Leading and trailing control zones never shrink; only the title consumes and truncates within the remaining width, with a fixed 4px gap between zones.",
|
|
5816
|
+
"Header chrome text is not selectable; actions remain keyboard focusable and interactive.",
|
|
5817
|
+
"Adjacent trailing actions keep the shared 4px control gap in drawer and fullscreen presentations.",
|
|
5818
|
+
"When fullscreen and overflow actions appear together, author fullscreen before overflow so Ellipses remains the rightmost action.",
|
|
5819
|
+
"PanelTools supplies application-owned actions and relays their ids through its shared dsHeaderAction event."
|
|
5979
5820
|
],
|
|
5980
5821
|
"responsiveBehavior": [
|
|
5981
|
-
"The
|
|
5822
|
+
"The title truncates between optional leading navigation and trailing action zones."
|
|
5982
5823
|
],
|
|
5983
|
-
"frameworkCaveats": {
|
|
5984
|
-
"customElements": [
|
|
5985
|
-
"Place scrollable content in the default slot and one footer wrapper in the overlay slot; use dsScroll only when the application needs position data."
|
|
5986
|
-
],
|
|
5987
|
-
"react": [
|
|
5988
|
-
"Use DsScrollOverlay with ordinary children plus an element carrying slot=\"overlay\"."
|
|
5989
|
-
],
|
|
5990
|
-
"angular": [
|
|
5991
|
-
"Import DsScrollOverlay and project the persistent footer wrapper with slot=\"overlay\"."
|
|
5992
|
-
]
|
|
5993
|
-
},
|
|
5994
5824
|
"references": [
|
|
5995
5825
|
{
|
|
5996
|
-
"label": "
|
|
5997
|
-
"path": "src/wc/components/
|
|
5826
|
+
"label": "Standalone examples",
|
|
5827
|
+
"path": "src/wc/components/PanelToolHeader/PanelToolHeader.stories.ts"
|
|
5998
5828
|
}
|
|
5999
5829
|
]
|
|
6000
5830
|
},
|
|
6001
5831
|
"api": {
|
|
6002
5832
|
"props": {
|
|
6003
|
-
"
|
|
5833
|
+
"actions": {
|
|
5834
|
+
"type": "PanelToolsHeaderAction[]",
|
|
5835
|
+
"required": false
|
|
5836
|
+
},
|
|
5837
|
+
"backAriaLabel": {
|
|
5838
|
+
"type": "string",
|
|
5839
|
+
"required": false
|
|
5840
|
+
},
|
|
5841
|
+
"backIcon": {
|
|
5842
|
+
"type": "string",
|
|
5843
|
+
"required": false
|
|
5844
|
+
},
|
|
5845
|
+
"heading": {
|
|
5846
|
+
"type": "string",
|
|
5847
|
+
"required": false
|
|
5848
|
+
},
|
|
5849
|
+
"menuAriaLabel": {
|
|
5850
|
+
"type": "string",
|
|
5851
|
+
"required": false
|
|
5852
|
+
},
|
|
5853
|
+
"menuControls": {
|
|
6004
5854
|
"type": "string | undefined",
|
|
6005
5855
|
"required": false
|
|
5856
|
+
},
|
|
5857
|
+
"menuExpanded": {
|
|
5858
|
+
"type": "boolean",
|
|
5859
|
+
"required": false
|
|
5860
|
+
},
|
|
5861
|
+
"menuTriggerId": {
|
|
5862
|
+
"type": "string",
|
|
5863
|
+
"required": false
|
|
5864
|
+
},
|
|
5865
|
+
"showBack": {
|
|
5866
|
+
"type": "boolean",
|
|
5867
|
+
"required": false
|
|
5868
|
+
},
|
|
5869
|
+
"showMenu": {
|
|
5870
|
+
"type": "boolean",
|
|
5871
|
+
"required": false
|
|
6006
5872
|
}
|
|
6007
5873
|
},
|
|
6008
5874
|
"events": [
|
|
6009
5875
|
{
|
|
6010
|
-
"name": "
|
|
6011
|
-
"detail": "
|
|
5876
|
+
"name": "dsAction",
|
|
5877
|
+
"detail": "{ id: string; originalEvent: MouseEvent }"
|
|
5878
|
+
},
|
|
5879
|
+
{
|
|
5880
|
+
"name": "dsBack",
|
|
5881
|
+
"detail": "MouseEvent"
|
|
5882
|
+
},
|
|
5883
|
+
{
|
|
5884
|
+
"name": "dsMenuToggle",
|
|
5885
|
+
"detail": "MouseEvent"
|
|
6012
5886
|
}
|
|
6013
5887
|
],
|
|
6014
5888
|
"slots": []
|
|
6015
5889
|
},
|
|
6016
5890
|
"exports": {
|
|
6017
|
-
"customElement": "ds-
|
|
6018
|
-
"react": "
|
|
6019
|
-
"angular": "
|
|
5891
|
+
"customElement": "ds-panel-tool-header",
|
|
5892
|
+
"react": "DsPanelToolHeader",
|
|
5893
|
+
"angular": "DsPanelToolHeader"
|
|
6020
5894
|
},
|
|
6021
5895
|
"dependencies": [
|
|
6022
5896
|
"@ds-mo/ui",
|
|
6023
5897
|
"@ds-mo/tokens"
|
|
6024
5898
|
],
|
|
6025
|
-
"componentDependencies": [
|
|
5899
|
+
"componentDependencies": [
|
|
5900
|
+
"button-unfilled",
|
|
5901
|
+
"text",
|
|
5902
|
+
"tooltip"
|
|
5903
|
+
]
|
|
6026
5904
|
},
|
|
6027
5905
|
{
|
|
6028
|
-
"id": "component:ds-
|
|
6029
|
-
"tag": "ds-
|
|
6030
|
-
"name": "
|
|
6031
|
-
"title": "
|
|
6032
|
-
"summary": "
|
|
5906
|
+
"id": "component:ds-panel-tool-search",
|
|
5907
|
+
"tag": "ds-panel-tool-search",
|
|
5908
|
+
"name": "panel-tool-search",
|
|
5909
|
+
"title": "PanelToolSearch",
|
|
5910
|
+
"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.",
|
|
6033
5911
|
"intentStatus": "complete",
|
|
6034
5912
|
"intent": {
|
|
6035
5913
|
"audience": "general",
|
|
6036
|
-
"status": "
|
|
6037
|
-
"summary": "
|
|
5914
|
+
"status": "experimental",
|
|
5915
|
+
"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.",
|
|
6038
5916
|
"useWhen": [
|
|
6039
|
-
"
|
|
6040
|
-
"
|
|
6041
|
-
"The
|
|
6042
|
-
"The selected value must participate in native, Angular, or React form state."
|
|
5917
|
+
"A PanelTools base view filters or searches the tool's own content.",
|
|
5918
|
+
"Several tool products need the same search-row geometry directly below the shared PanelTools header.",
|
|
5919
|
+
"The product needs a compact filter menu next to search while keeping its filter choices and matching policy application-owned."
|
|
6043
5920
|
],
|
|
6044
5921
|
"avoidWhen": [
|
|
6045
|
-
"
|
|
6046
|
-
"
|
|
6047
|
-
"The choices form a hierarchy with expandable parents."
|
|
6048
|
-
],
|
|
6049
|
-
"alternatives": [
|
|
6050
|
-
{
|
|
6051
|
-
"when": "Several independent values may be selected.",
|
|
6052
|
-
"component": "component:ds-select-multi",
|
|
6053
|
-
"reason": "SelectMulti owns array values, multi-selection semantics, and count presentation."
|
|
6054
|
-
},
|
|
6055
|
-
{
|
|
6056
|
-
"when": "The popup contains commands or state-changing actions.",
|
|
6057
|
-
"component": "component:ds-menu",
|
|
6058
|
-
"reason": "Menu uses action-menu roles and command-focused keyboard behavior."
|
|
6059
|
-
},
|
|
6060
|
-
{
|
|
6061
|
-
"when": "A small set of choices should remain visible.",
|
|
6062
|
-
"component": "component:ds-radio",
|
|
6063
|
-
"reason": "Prefer Radio for roughly two to five mutually exclusive choices when the available space allows all choices to remain visible."
|
|
6064
|
-
}
|
|
5922
|
+
"The search belongs inside a Select or SelectMulti popup; use that component's searchable behavior.",
|
|
5923
|
+
"A form needs a labelled standalone field; compose ds-input inside ds-field instead."
|
|
6065
5924
|
],
|
|
6066
5925
|
"commonlyComposedWith": [
|
|
6067
|
-
"component:ds-
|
|
6068
|
-
"component:ds-
|
|
6069
|
-
"component:ds-
|
|
6070
|
-
"component:ds-loader"
|
|
5926
|
+
"component:ds-panel-tools",
|
|
5927
|
+
"component:ds-conversation-list",
|
|
5928
|
+
"component:ds-input"
|
|
6071
5929
|
],
|
|
6072
5930
|
"accessibility": [
|
|
6073
|
-
"
|
|
6074
|
-
"The
|
|
6075
|
-
"
|
|
6076
|
-
"Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
|
|
6077
|
-
"Selected options rely on active fill and foreground treatment without a redundant trailing check icon.",
|
|
6078
|
-
"Local search moves focus into the search field while preserving the active option through aria-activedescendant.",
|
|
6079
|
-
"Use errorMessage with error so the trigger is described by the rendered alert."
|
|
5931
|
+
"Provide an aria-label that names the searched domain, such as Search agent chats or Search messages.",
|
|
5932
|
+
"The standard search clear action restores focus, uses the concise localized clearLabel by itself for both its tooltip and accessible name, and emits both the empty query and dsClear.",
|
|
5933
|
+
"When showFilter is enabled, provide stable filterTriggerId and filterControls values, synchronize filterExpanded with the controlled menu, and restore focus after selection; filterAriaLabel also labels its tooltip."
|
|
6080
5934
|
],
|
|
6081
5935
|
"states": [
|
|
6082
|
-
"
|
|
6083
|
-
"
|
|
6084
|
-
"
|
|
6085
|
-
"
|
|
6086
|
-
"
|
|
6087
|
-
"The trigger label stays left-aligned at every width. The default size is md in both forms and filter bars; smaller sizes require an explicit density need.",
|
|
6088
|
-
"Use option icons only when they help users differentiate choices. Icons render only when every option in the complete list provides one; mixed icon data falls back to the text-only row layout.",
|
|
6089
|
-
"Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
|
|
6090
|
-
"When any option supplies subtext, every row uses the same subtext structure and missing values render an em dash. Subtext should disambiguate or add decision-helpful information.",
|
|
6091
|
-
"Option labels and the selected trigger label stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
|
|
6092
|
-
"The optional prefix icon and chevron always use the parent surface's secondary foreground color, including when a selected value promotes the label to primary.",
|
|
6093
|
-
"The shared popup search control stays md at every trigger size, using body-medium text, a 20px icon, and the same internal spacing as a borderless Select trigger. Its container uses menu-item padding on every side and owns a 1px bottom divider that becomes a 1.5px bold-brand stroke while search has focus. Search placeholder text is secondary at rest and quaternary while focused because it becomes decorative once the editable field is active.",
|
|
6094
|
-
"When search contains text, the shared control shows a rounded sm icon-only ButtonUnfilled with the CrossCircle icon and no border. It clears the local term, stays hidden for an empty term, and returns focus to search.",
|
|
6095
|
-
"The shared clear footer mirrors the search region's sizing: menu-item padding surrounds an md-height borderless row, and the Clear label uses the same row and label insets as option text. The outer footer owns a 1px top divider.",
|
|
6096
|
-
"An empty filtered list composes the message-only body variant of EmptyState. Keep the default neutral no-results message unless localized product guidance makes the outcome clearer.",
|
|
6097
|
-
"Enable searchable for more than roughly 20 options, user-managed listings, large domains such as addresses, or sets users cannot efficiently scan. Local matching includes option labels, subtext, and section headings; the owner resolves remote data before assigning options.",
|
|
6098
|
-
"Validation timing belongs to the form owner and may be immediate or deferred until blur or submit; the Select exposes validity and error presentation without imposing that policy.",
|
|
6099
|
-
"The error trigger uses a 1.5px bold-negative inset stroke so invalid state remains distinguishable from the normal 1px border without changing control geometry.",
|
|
6100
|
-
"An initially empty option set is not an expected Select use case. The no-results state describes a search with no matches, not a source with no choices.",
|
|
6101
|
-
"Use options for a flat list or sections for grouped choices; when sections are present they take precedence.",
|
|
6102
|
-
"The background prop describes the actual parent surface and uses the same surface set as ButtonUnfilled."
|
|
5936
|
+
"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.",
|
|
5937
|
+
"The search icon stays foreground-secondary at rest, hover, focus, active, and while the query is filled.",
|
|
5938
|
+
"The row and control surface remain transparent so the ShellApp chrome wash is visible behind them.",
|
|
5939
|
+
"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.",
|
|
5940
|
+
"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."
|
|
6103
5941
|
],
|
|
6104
5942
|
"responsiveBehavior": [
|
|
6105
|
-
"
|
|
6106
|
-
"The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
|
|
6107
|
-
"Long option collections scroll inside the popup; virtualization and remote search are not part of this component."
|
|
5943
|
+
"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."
|
|
6108
5944
|
],
|
|
6109
5945
|
"frameworkCaveats": {
|
|
6110
5946
|
"customElements": [
|
|
6111
|
-
"
|
|
5947
|
+
"Listen for dsChange to receive the current string query and dsClear when the clear action is used.",
|
|
5948
|
+
"Listen for dsFilterToggle and pair the trigger with an externally controlled ds-menu; product-specific filter labels and filtering remain outside this component."
|
|
6112
5949
|
],
|
|
6113
5950
|
"react": [
|
|
6114
|
-
"
|
|
5951
|
+
"Use DsPanelToolSearch, bind value for controlled state, and handle onDsChange.",
|
|
5952
|
+
"Bind the optional filter trigger state and connect onDsFilterToggle to a controlled DsMenu."
|
|
6115
5953
|
],
|
|
6116
5954
|
"angular": [
|
|
6117
|
-
"Import
|
|
5955
|
+
"Import DsPanelToolSearch and bind value as a property; this search composition is not a form value accessor.",
|
|
5956
|
+
"Bind showFilter, filterExpanded, and filterActive, then connect dsFilterToggle to a product-owned ds-menu."
|
|
6118
5957
|
]
|
|
6119
5958
|
},
|
|
6120
5959
|
"references": [
|
|
6121
5960
|
{
|
|
6122
5961
|
"label": "Storybook examples",
|
|
6123
|
-
"path": "src/wc/components/
|
|
6124
|
-
},
|
|
6125
|
-
{
|
|
6126
|
-
"label": "Selection patterns",
|
|
6127
|
-
"path": "src/docs/SelectionPatterns.mdx"
|
|
5962
|
+
"path": "src/wc/components/PanelToolSearch/PanelToolSearch.stories.ts"
|
|
6128
5963
|
}
|
|
6129
5964
|
]
|
|
6130
5965
|
},
|
|
6131
5966
|
"api": {
|
|
6132
5967
|
"props": {
|
|
6133
|
-
"
|
|
6134
|
-
"type": "
|
|
5968
|
+
"ariaLabel": {
|
|
5969
|
+
"type": "string",
|
|
6135
5970
|
"required": false
|
|
6136
5971
|
},
|
|
6137
|
-
"
|
|
6138
|
-
"type": "
|
|
5972
|
+
"controls": {
|
|
5973
|
+
"type": "string | undefined",
|
|
6139
5974
|
"required": false
|
|
6140
5975
|
},
|
|
6141
|
-
"
|
|
6142
|
-
"type": "
|
|
5976
|
+
"filterActive": {
|
|
5977
|
+
"type": "boolean",
|
|
6143
5978
|
"required": false
|
|
6144
5979
|
},
|
|
6145
|
-
"
|
|
6146
|
-
"type": "string
|
|
5980
|
+
"filterAriaLabel": {
|
|
5981
|
+
"type": "string",
|
|
6147
5982
|
"required": false
|
|
6148
5983
|
},
|
|
6149
|
-
"
|
|
5984
|
+
"filterControls": {
|
|
6150
5985
|
"type": "string | undefined",
|
|
6151
5986
|
"required": false
|
|
6152
5987
|
},
|
|
6153
|
-
"
|
|
6154
|
-
"type": "
|
|
5988
|
+
"filterExpanded": {
|
|
5989
|
+
"type": "boolean",
|
|
6155
5990
|
"required": false
|
|
6156
5991
|
},
|
|
6157
|
-
"
|
|
5992
|
+
"filterTriggerId": {
|
|
6158
5993
|
"type": "string",
|
|
6159
5994
|
"required": false
|
|
6160
5995
|
},
|
|
6161
|
-
"
|
|
5996
|
+
"isInactive": {
|
|
6162
5997
|
"type": "boolean",
|
|
6163
5998
|
"required": false
|
|
6164
5999
|
},
|
|
6165
|
-
"
|
|
6166
|
-
"type": "
|
|
6000
|
+
"placeholder": {
|
|
6001
|
+
"type": "string",
|
|
6167
6002
|
"required": false
|
|
6168
6003
|
},
|
|
6169
|
-
"
|
|
6170
|
-
"type": "string | undefined",
|
|
6171
|
-
"required": false
|
|
6172
|
-
},
|
|
6173
|
-
"hasBorder": {
|
|
6174
|
-
"type": "boolean",
|
|
6175
|
-
"required": false
|
|
6176
|
-
},
|
|
6177
|
-
"icon": {
|
|
6178
|
-
"type": "string | undefined",
|
|
6179
|
-
"required": false
|
|
6180
|
-
},
|
|
6181
|
-
"inputId": {
|
|
6182
|
-
"type": "string | undefined",
|
|
6183
|
-
"required": false
|
|
6184
|
-
},
|
|
6185
|
-
"isInactive": {
|
|
6186
|
-
"type": "boolean",
|
|
6187
|
-
"required": false
|
|
6188
|
-
},
|
|
6189
|
-
"isLoading": {
|
|
6190
|
-
"type": "boolean",
|
|
6191
|
-
"required": false
|
|
6192
|
-
},
|
|
6193
|
-
"loadingLabel": {
|
|
6194
|
-
"type": "string",
|
|
6195
|
-
"required": false
|
|
6196
|
-
},
|
|
6197
|
-
"name": {
|
|
6198
|
-
"type": "string | undefined",
|
|
6199
|
-
"required": false
|
|
6200
|
-
},
|
|
6201
|
-
"noResultsText": {
|
|
6202
|
-
"type": "string",
|
|
6203
|
-
"required": false
|
|
6204
|
-
},
|
|
6205
|
-
"open": {
|
|
6206
|
-
"type": "boolean",
|
|
6207
|
-
"required": false
|
|
6208
|
-
},
|
|
6209
|
-
"options": {
|
|
6210
|
-
"type": "SelectOption[]",
|
|
6211
|
-
"required": false
|
|
6212
|
-
},
|
|
6213
|
-
"placeholder": {
|
|
6214
|
-
"type": "string",
|
|
6215
|
-
"required": false
|
|
6216
|
-
},
|
|
6217
|
-
"required": {
|
|
6218
|
-
"type": "boolean",
|
|
6219
|
-
"required": false
|
|
6220
|
-
},
|
|
6221
|
-
"requiredMessage": {
|
|
6222
|
-
"type": "string",
|
|
6223
|
-
"required": false
|
|
6224
|
-
},
|
|
6225
|
-
"searchPlaceholder": {
|
|
6226
|
-
"type": "string",
|
|
6227
|
-
"required": false
|
|
6228
|
-
},
|
|
6229
|
-
"searchable": {
|
|
6004
|
+
"showFilter": {
|
|
6230
6005
|
"type": "boolean",
|
|
6231
6006
|
"required": false
|
|
6232
6007
|
},
|
|
6233
|
-
"sections": {
|
|
6234
|
-
"type": "SelectSection[]",
|
|
6235
|
-
"required": false
|
|
6236
|
-
},
|
|
6237
|
-
"size": {
|
|
6238
|
-
"type": "SelectSize",
|
|
6239
|
-
"required": false
|
|
6240
|
-
},
|
|
6241
6008
|
"value": {
|
|
6242
6009
|
"type": "string",
|
|
6243
6010
|
"required": false
|
|
6244
|
-
},
|
|
6245
|
-
"width": {
|
|
6246
|
-
"type": "SelectWidth",
|
|
6247
|
-
"required": false
|
|
6248
6011
|
}
|
|
6249
6012
|
},
|
|
6250
6013
|
"events": [
|
|
@@ -6257,16 +6020,16 @@
|
|
|
6257
6020
|
"detail": "void"
|
|
6258
6021
|
},
|
|
6259
6022
|
{
|
|
6260
|
-
"name": "
|
|
6261
|
-
"detail": "
|
|
6023
|
+
"name": "dsFilterToggle",
|
|
6024
|
+
"detail": "MouseEvent"
|
|
6262
6025
|
}
|
|
6263
6026
|
],
|
|
6264
6027
|
"slots": []
|
|
6265
6028
|
},
|
|
6266
6029
|
"exports": {
|
|
6267
|
-
"customElement": "ds-
|
|
6268
|
-
"react": "
|
|
6269
|
-
"angular": "
|
|
6030
|
+
"customElement": "ds-panel-tool-search",
|
|
6031
|
+
"react": "DsPanelToolSearch",
|
|
6032
|
+
"angular": "DsPanelToolSearch"
|
|
6270
6033
|
},
|
|
6271
6034
|
"dependencies": [
|
|
6272
6035
|
"@ds-mo/ui",
|
|
@@ -6275,186 +6038,152 @@
|
|
|
6275
6038
|
],
|
|
6276
6039
|
"componentDependencies": [
|
|
6277
6040
|
"button-unfilled",
|
|
6278
|
-
"
|
|
6041
|
+
"divider",
|
|
6279
6042
|
"icon",
|
|
6280
|
-
"loader",
|
|
6281
6043
|
"text",
|
|
6282
6044
|
"tooltip"
|
|
6283
6045
|
]
|
|
6284
6046
|
},
|
|
6285
6047
|
{
|
|
6286
|
-
"id": "component:ds-
|
|
6287
|
-
"tag": "ds-
|
|
6288
|
-
"name": "
|
|
6289
|
-
"title": "
|
|
6290
|
-
"summary": "
|
|
6048
|
+
"id": "component:ds-panel-tools",
|
|
6049
|
+
"tag": "ds-panel-tools",
|
|
6050
|
+
"name": "panel-tools",
|
|
6051
|
+
"title": "PanelTools",
|
|
6052
|
+
"summary": "Required ShellApp utility rail and persistent drawer host for the fixed set of global Search, Agents, Messages, Stacks, Activity, and Help products.",
|
|
6291
6053
|
"intentStatus": "complete",
|
|
6292
6054
|
"intent": {
|
|
6293
|
-
"audience": "
|
|
6055
|
+
"audience": "specialized",
|
|
6294
6056
|
"status": "stable",
|
|
6295
|
-
"summary": "
|
|
6057
|
+
"summary": "Required ShellApp utility rail and persistent drawer host for the fixed set of global Search, Agents, Messages, Stacks, Activity, and Help products.",
|
|
6296
6058
|
"useWhen": [
|
|
6297
|
-
"
|
|
6298
|
-
"
|
|
6299
|
-
"
|
|
6300
|
-
"The choice set has more than roughly 20 options, comes from a user-managed listing, or represents a large domain where search materially improves retrieval."
|
|
6059
|
+
"Composing the required global tools region inside the application's single ShellApp.",
|
|
6060
|
+
"Users need to move between application-wide utilities without losing each tool's in-progress state.",
|
|
6061
|
+
"Search, AI conversations, user messages, review stacks, notifications, or help content must remain available alongside route content."
|
|
6301
6062
|
],
|
|
6302
6063
|
"avoidWhen": [
|
|
6303
|
-
"
|
|
6304
|
-
"
|
|
6305
|
-
"
|
|
6306
|
-
"
|
|
6064
|
+
"The action is specific to the current page or selected content rather than globally available across the application.",
|
|
6065
|
+
"The item navigates to a primary or secondary route; use PanelNav or BarNav instead.",
|
|
6066
|
+
"A consumer wants to add arbitrary tools, reorder fixed tools, or repurpose a semantic tool id.",
|
|
6067
|
+
"Building the mobile tools experience; future mobile ShellApp composition uses a different bottom-bar and panel pattern.",
|
|
6068
|
+
"PanelTools would be mounted outside the application's single ShellApp."
|
|
6307
6069
|
],
|
|
6308
6070
|
"alternatives": [
|
|
6309
6071
|
{
|
|
6310
|
-
"when": "
|
|
6311
|
-
"component": "component:ds-
|
|
6312
|
-
"reason": "
|
|
6072
|
+
"when": "The action navigates to a top-level application destination.",
|
|
6073
|
+
"component": "component:ds-panel-nav",
|
|
6074
|
+
"reason": "PanelNav exclusively owns primary application navigation."
|
|
6313
6075
|
},
|
|
6314
6076
|
{
|
|
6315
|
-
"when": "The
|
|
6077
|
+
"when": "The action navigates between route sections of the active destination.",
|
|
6078
|
+
"component": "component:ds-bar-nav",
|
|
6079
|
+
"reason": "BarNav exclusively owns secondary route navigation."
|
|
6080
|
+
},
|
|
6081
|
+
{
|
|
6082
|
+
"when": "Temporary contextual actions or options are needed.",
|
|
6316
6083
|
"component": "component:ds-menu",
|
|
6317
|
-
"reason": "Menu
|
|
6084
|
+
"reason": "Menu owns transient contextual choices rather than persistent global products."
|
|
6318
6085
|
}
|
|
6319
6086
|
],
|
|
6320
6087
|
"commonlyComposedWith": [
|
|
6321
|
-
"component:ds-
|
|
6322
|
-
"component:ds-
|
|
6323
|
-
"component:ds-
|
|
6324
|
-
|
|
6088
|
+
"component:ds-shell-app",
|
|
6089
|
+
"component:ds-panel-nav",
|
|
6090
|
+
"component:ds-bar-nav"
|
|
6091
|
+
],
|
|
6092
|
+
"patterns": [
|
|
6093
|
+
"pattern:application-shell"
|
|
6325
6094
|
],
|
|
6326
6095
|
"accessibility": [
|
|
6327
|
-
"
|
|
6328
|
-
"
|
|
6329
|
-
"
|
|
6330
|
-
"
|
|
6331
|
-
"
|
|
6332
|
-
"
|
|
6333
|
-
"Use errorMessage with error so the trigger is described by the rendered alert."
|
|
6096
|
+
"Provide localized accessible labels for the rail, shortcut group, and every rendered tool.",
|
|
6097
|
+
"Keep Search first in the rail header and Help last in the rail footer so keyboard and visual order remain predictable.",
|
|
6098
|
+
"Keep focus on the selected rail action when opening a drawer and allow normal Tab navigation into its content.",
|
|
6099
|
+
"Do not trigger global shortcuts while focus is in an editable control.",
|
|
6100
|
+
"Use notification dots only as supplemental unread or new-content status and never as the sole status indication.",
|
|
6101
|
+
"Explain temporarily inactive tools through an accessible label or adjacent product guidance; omit unauthorized tools entirely."
|
|
6334
6102
|
],
|
|
6335
6103
|
"states": [
|
|
6336
|
-
"
|
|
6337
|
-
"
|
|
6338
|
-
"
|
|
6339
|
-
"
|
|
6340
|
-
"The
|
|
6341
|
-
"
|
|
6342
|
-
"
|
|
6343
|
-
"
|
|
6344
|
-
"
|
|
6345
|
-
"
|
|
6346
|
-
"
|
|
6347
|
-
"
|
|
6348
|
-
"
|
|
6349
|
-
"
|
|
6350
|
-
"
|
|
6351
|
-
"
|
|
6352
|
-
"
|
|
6353
|
-
"
|
|
6354
|
-
"
|
|
6355
|
-
"
|
|
6356
|
-
"An initially empty option set is not an expected SelectMulti use case. The no-results state describes a search with no matches, not a source with no choices.",
|
|
6357
|
-
"Native form submission emits one entry per selected value under the component name.",
|
|
6358
|
-
"Use options for a flat list or sections for grouped choices. Multi-select option contracts intentionally exclude icons because the leading checkbox owns that row zone; hierarchical parent selection is deferred."
|
|
6104
|
+
"Search and Help are required; optional Agents, Messages, Stacks, and Activity tools are filtered by the application for authorization and entitlement.",
|
|
6105
|
+
"Use only the fixed semantic tool ids and canonical order: Search, Agents, Messages, Stacks, Activity, Help; do not reorder, duplicate, or repurpose them.",
|
|
6106
|
+
"Search is application-wide; Agents is user-to-AI chat; Messages is user-to-user chat; Stacks is a specialized inbox of grouped application events for review; Activity is the notification center; Help is drawer content that may link to external resources.",
|
|
6107
|
+
"Only one drawer is open at a time; selecting another tool switches directly and selecting the active tool closes to rail-only mode.",
|
|
6108
|
+
"The drawer starts closed, remains open across ordinary route changes, and retains every mounted tool's independent conversation, query, scroll, and work state.",
|
|
6109
|
+
"When storageKey is set, persist only the last active tool in this browser and still restore the drawer closed after reload.",
|
|
6110
|
+
"The application owns unread state; opening Messages, Agents, Stacks, or Activity does not automatically clear its notification dot.",
|
|
6111
|
+
"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.",
|
|
6112
|
+
"PanelTools composes ds-panel-tool-header as its canonical left-aligned header implementation so standalone header stories and shell rendering cannot diverge.",
|
|
6113
|
+
"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.",
|
|
6114
|
+
"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.",
|
|
6115
|
+
"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.",
|
|
6116
|
+
"Tool view roots stay transparent so ShellApp's chrome wash remains visible; only explicitly designed child surfaces introduce a fill.",
|
|
6117
|
+
"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.",
|
|
6118
|
+
"If an active optional tool becomes unavailable, PanelTools closes the drawer, clears activeTool, and emits its deselection.",
|
|
6119
|
+
"Use isInactive only for a temporarily unavailable visible tool; omit tools the user is not authorized to access.",
|
|
6120
|
+
"The application owns slotted tool products and data while PanelTools owns rail ordering, drawer selection, open state, motion, and shell events.",
|
|
6121
|
+
"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.",
|
|
6122
|
+
"Entering and exiting fullscreen snaps without borrowing the drawer open or close animation.",
|
|
6123
|
+
"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."
|
|
6359
6124
|
],
|
|
6360
6125
|
"responsiveBehavior": [
|
|
6361
|
-
"
|
|
6362
|
-
"
|
|
6363
|
-
"
|
|
6126
|
+
"The open drawer reduces main-content width and uses --dimension-panel-width-xs (300px) on every supported desktop and tablet viewport.",
|
|
6127
|
+
"ShellApp owns the fixed drawer-width variable; consumers must not hardcode alternate drawer widths.",
|
|
6128
|
+
"Below 768px, do not reuse desktop PanelTools: future ShellApp mobile composition uses a bottom bar for Search, Agents, Notifications, and Stacks, while Help moves into mobile primary navigation.",
|
|
6129
|
+
"Keep named-slot content mounted while tools switch or the drawer closes so users can return to in-progress global work.",
|
|
6130
|
+
"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.",
|
|
6131
|
+
"Use fixed drawer widths for now; do not add user resizing or width persistence."
|
|
6364
6132
|
],
|
|
6365
6133
|
"frameworkCaveats": {
|
|
6366
6134
|
"customElements": [
|
|
6367
|
-
"Assign
|
|
6135
|
+
"Assign items as a JavaScript property for structured data; items-json is the string fallback.",
|
|
6136
|
+
"Assign headers as a JavaScript property and replace its object identity whenever an active tool changes title, depth, or actions.",
|
|
6137
|
+
"Keep PanelTools mounted at ShellApp scope across route changes and provide each product through its matching named slot."
|
|
6368
6138
|
],
|
|
6369
6139
|
"react": [
|
|
6370
|
-
"Pass
|
|
6140
|
+
"Pass the fixed item collection through the generated React wrapper and keep named-slot product content mounted at ShellApp scope.",
|
|
6141
|
+
"Use storageKey only for same-browser last-tool continuity; do not persist the open drawer."
|
|
6371
6142
|
],
|
|
6372
6143
|
"angular": [
|
|
6373
|
-
"Import
|
|
6144
|
+
"Import DsPanelTools from @ds-mo/ui/angular/ds-panel-tools and bind items as a property.",
|
|
6145
|
+
"Bind headers as a replaced object and route dsHeaderBack and dsHeaderAction to the active tool owner.",
|
|
6146
|
+
"Keep the component in the persistent shell layout rather than recreating it in routed page components."
|
|
6374
6147
|
]
|
|
6375
6148
|
},
|
|
6376
6149
|
"references": [
|
|
6377
6150
|
{
|
|
6378
|
-
"label": "Storybook examples",
|
|
6379
|
-
"path": "src/wc/components/
|
|
6151
|
+
"label": "Executable Storybook examples",
|
|
6152
|
+
"path": "src/wc/components/PanelTools/PanelTools.stories.ts"
|
|
6380
6153
|
},
|
|
6381
6154
|
{
|
|
6382
|
-
"label": "
|
|
6383
|
-
"path": "
|
|
6155
|
+
"label": "Framework and shell integration",
|
|
6156
|
+
"path": "docs/framework-integration.md"
|
|
6157
|
+
},
|
|
6158
|
+
{
|
|
6159
|
+
"label": "Application shell composition",
|
|
6160
|
+
"path": "agent/patterns/application-shell/pattern.agent.json"
|
|
6384
6161
|
}
|
|
6385
6162
|
]
|
|
6386
6163
|
},
|
|
6387
6164
|
"api": {
|
|
6388
6165
|
"props": {
|
|
6389
|
-
"
|
|
6390
|
-
"type": "
|
|
6391
|
-
"required": false
|
|
6392
|
-
},
|
|
6393
|
-
"allowClear": {
|
|
6394
|
-
"type": "boolean",
|
|
6166
|
+
"activeTool": {
|
|
6167
|
+
"type": "PanelToolsToolId | ''",
|
|
6395
6168
|
"required": false
|
|
6396
6169
|
},
|
|
6397
|
-
"
|
|
6398
|
-
"type": "
|
|
6170
|
+
"fullscreenHeaderMode": {
|
|
6171
|
+
"type": "'shared' | 'split'",
|
|
6399
6172
|
"required": false
|
|
6400
6173
|
},
|
|
6401
|
-
"
|
|
6402
|
-
"type": "
|
|
6174
|
+
"headers": {
|
|
6175
|
+
"type": "PanelToolsHeaders",
|
|
6403
6176
|
"required": false
|
|
6404
6177
|
},
|
|
6405
|
-
"
|
|
6406
|
-
"type": "string
|
|
6178
|
+
"headersJson": {
|
|
6179
|
+
"type": "string",
|
|
6407
6180
|
"required": false
|
|
6408
6181
|
},
|
|
6409
|
-
"
|
|
6410
|
-
"type": "
|
|
6182
|
+
"items": {
|
|
6183
|
+
"type": "PanelToolsItem[]",
|
|
6411
6184
|
"required": false
|
|
6412
6185
|
},
|
|
6413
|
-
"
|
|
6414
|
-
"type": "string",
|
|
6415
|
-
"required": false
|
|
6416
|
-
},
|
|
6417
|
-
"disabled": {
|
|
6418
|
-
"type": "boolean",
|
|
6419
|
-
"required": false
|
|
6420
|
-
},
|
|
6421
|
-
"error": {
|
|
6422
|
-
"type": "boolean",
|
|
6423
|
-
"required": false
|
|
6424
|
-
},
|
|
6425
|
-
"errorMessage": {
|
|
6426
|
-
"type": "string | undefined",
|
|
6427
|
-
"required": false
|
|
6428
|
-
},
|
|
6429
|
-
"hasBorder": {
|
|
6430
|
-
"type": "boolean",
|
|
6431
|
-
"required": false
|
|
6432
|
-
},
|
|
6433
|
-
"icon": {
|
|
6434
|
-
"type": "string | undefined",
|
|
6435
|
-
"required": false
|
|
6436
|
-
},
|
|
6437
|
-
"inputId": {
|
|
6438
|
-
"type": "string | undefined",
|
|
6439
|
-
"required": false
|
|
6440
|
-
},
|
|
6441
|
-
"isInactive": {
|
|
6442
|
-
"type": "boolean",
|
|
6443
|
-
"required": false
|
|
6444
|
-
},
|
|
6445
|
-
"isLoading": {
|
|
6446
|
-
"type": "boolean",
|
|
6447
|
-
"required": false
|
|
6448
|
-
},
|
|
6449
|
-
"loadingLabel": {
|
|
6450
|
-
"type": "string",
|
|
6451
|
-
"required": false
|
|
6452
|
-
},
|
|
6453
|
-
"name": {
|
|
6454
|
-
"type": "string | undefined",
|
|
6455
|
-
"required": false
|
|
6456
|
-
},
|
|
6457
|
-
"noResultsText": {
|
|
6186
|
+
"itemsJson": {
|
|
6458
6187
|
"type": "string",
|
|
6459
6188
|
"required": false
|
|
6460
6189
|
},
|
|
@@ -6462,792 +6191,1170 @@
|
|
|
6462
6191
|
"type": "boolean",
|
|
6463
6192
|
"required": false
|
|
6464
6193
|
},
|
|
6465
|
-
"
|
|
6466
|
-
"type": "
|
|
6467
|
-
"required": false
|
|
6468
|
-
},
|
|
6469
|
-
"placeholder": {
|
|
6470
|
-
"type": "string",
|
|
6471
|
-
"required": false
|
|
6472
|
-
},
|
|
6473
|
-
"required": {
|
|
6474
|
-
"type": "boolean",
|
|
6194
|
+
"presentation": {
|
|
6195
|
+
"type": "'drawer' | 'fullscreen'",
|
|
6475
6196
|
"required": false
|
|
6476
6197
|
},
|
|
6477
|
-
"
|
|
6198
|
+
"storageKey": {
|
|
6478
6199
|
"type": "string",
|
|
6479
6200
|
"required": false
|
|
6480
6201
|
},
|
|
6481
|
-
"
|
|
6202
|
+
"toolShortcutsLabel": {
|
|
6482
6203
|
"type": "string",
|
|
6483
6204
|
"required": false
|
|
6484
6205
|
},
|
|
6485
|
-
"
|
|
6486
|
-
"type": "boolean",
|
|
6487
|
-
"required": false
|
|
6488
|
-
},
|
|
6489
|
-
"sections": {
|
|
6490
|
-
"type": "SelectMultiSection[]",
|
|
6491
|
-
"required": false
|
|
6492
|
-
},
|
|
6493
|
-
"selectedLabel": {
|
|
6206
|
+
"toolsLabel": {
|
|
6494
6207
|
"type": "string",
|
|
6495
6208
|
"required": false
|
|
6496
|
-
},
|
|
6497
|
-
"size": {
|
|
6498
|
-
"type": "SelectMultiSize",
|
|
6499
|
-
"required": false
|
|
6500
|
-
},
|
|
6501
|
-
"values": {
|
|
6502
|
-
"type": "string[]",
|
|
6503
|
-
"required": false
|
|
6504
|
-
},
|
|
6505
|
-
"width": {
|
|
6506
|
-
"type": "SelectMultiWidth",
|
|
6507
|
-
"required": false
|
|
6508
6209
|
}
|
|
6509
6210
|
},
|
|
6510
6211
|
"events": [
|
|
6511
6212
|
{
|
|
6512
|
-
"name": "
|
|
6513
|
-
"detail": "
|
|
6213
|
+
"name": "dsChromeTransitionEnd",
|
|
6214
|
+
"detail": "ChromeTransitionDetail"
|
|
6514
6215
|
},
|
|
6515
6216
|
{
|
|
6516
|
-
"name": "
|
|
6517
|
-
"detail": "
|
|
6217
|
+
"name": "dsChromeTransitionStart",
|
|
6218
|
+
"detail": "ChromeTransitionDetail"
|
|
6518
6219
|
},
|
|
6519
6220
|
{
|
|
6520
|
-
"name": "
|
|
6521
|
-
"detail": "
|
|
6221
|
+
"name": "dsHeaderAction",
|
|
6222
|
+
"detail": "{\n tool: PanelToolsToolId;\n id: string;\n }"
|
|
6223
|
+
},
|
|
6224
|
+
{
|
|
6225
|
+
"name": "dsHeaderBack",
|
|
6226
|
+
"detail": "{\n tool: PanelToolsToolId;\n }"
|
|
6227
|
+
},
|
|
6228
|
+
{
|
|
6229
|
+
"name": "dsPresentationChange",
|
|
6230
|
+
"detail": "{\n presentation: 'drawer' | 'fullscreen';\n }"
|
|
6231
|
+
},
|
|
6232
|
+
{
|
|
6233
|
+
"name": "dsToolChange",
|
|
6234
|
+
"detail": "{\n id: PanelToolsToolId;\n selected: boolean;\n }"
|
|
6522
6235
|
}
|
|
6523
6236
|
],
|
|
6524
6237
|
"slots": []
|
|
6525
6238
|
},
|
|
6526
6239
|
"exports": {
|
|
6527
|
-
"customElement": "ds-
|
|
6528
|
-
"react": "
|
|
6529
|
-
"angular": "
|
|
6240
|
+
"customElement": "ds-panel-tools",
|
|
6241
|
+
"react": "DsPanelTools",
|
|
6242
|
+
"angular": "DsPanelTools"
|
|
6530
6243
|
},
|
|
6531
6244
|
"dependencies": [
|
|
6532
6245
|
"@ds-mo/ui",
|
|
6533
|
-
"@ds-mo/tokens"
|
|
6534
|
-
"@ds-mo/icons"
|
|
6246
|
+
"@ds-mo/tokens"
|
|
6535
6247
|
],
|
|
6536
6248
|
"componentDependencies": [
|
|
6537
6249
|
"button-unfilled",
|
|
6538
|
-
"
|
|
6539
|
-
"empty-state",
|
|
6540
|
-
"icon",
|
|
6541
|
-
"loader",
|
|
6542
|
-
"text",
|
|
6250
|
+
"panel-tool-header",
|
|
6543
6251
|
"tooltip"
|
|
6544
6252
|
]
|
|
6545
6253
|
},
|
|
6546
6254
|
{
|
|
6547
|
-
"id": "component:ds-
|
|
6548
|
-
"tag": "ds-
|
|
6549
|
-
"name": "
|
|
6550
|
-
"title": "
|
|
6551
|
-
"summary": "
|
|
6255
|
+
"id": "component:ds-radio",
|
|
6256
|
+
"tag": "ds-radio",
|
|
6257
|
+
"name": "radio",
|
|
6258
|
+
"title": "Radio",
|
|
6259
|
+
"summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, three densities, per-option inactive state, and roving keyboard focus.",
|
|
6552
6260
|
"intentStatus": "complete",
|
|
6553
6261
|
"intent": {
|
|
6554
|
-
"audience": "
|
|
6262
|
+
"audience": "general",
|
|
6555
6263
|
"status": "stable",
|
|
6556
|
-
"summary": "
|
|
6264
|
+
"summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, three densities, per-option inactive state, and roving keyboard focus.",
|
|
6557
6265
|
"useWhen": [
|
|
6558
|
-
"
|
|
6559
|
-
"
|
|
6560
|
-
"
|
|
6266
|
+
"A user must select exactly one visible option from a small set.",
|
|
6267
|
+
"All available choices should remain visible for comparison.",
|
|
6268
|
+
"A form needs one selected string value with native validation, reset, or external form association."
|
|
6561
6269
|
],
|
|
6562
6270
|
"avoidWhen": [
|
|
6563
|
-
"
|
|
6564
|
-
"
|
|
6565
|
-
"
|
|
6271
|
+
"A user may select zero or multiple independent choices.",
|
|
6272
|
+
"A binary setting applies immediately rather than selecting from a set.",
|
|
6273
|
+
"The option list is too long or space-constrained to remain visible."
|
|
6566
6274
|
],
|
|
6567
|
-
"
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
|
|
6576
|
-
|
|
6275
|
+
"alternatives": [
|
|
6276
|
+
{
|
|
6277
|
+
"when": "A user may select zero or multiple independent choices.",
|
|
6278
|
+
"component": "component:ds-checkbox",
|
|
6279
|
+
"reason": "Checkbox communicates independent selection rather than one-of-many choice."
|
|
6280
|
+
},
|
|
6281
|
+
{
|
|
6282
|
+
"when": "A binary setting applies immediately.",
|
|
6283
|
+
"component": "component:ds-switch",
|
|
6284
|
+
"reason": "Switch communicates an immediately applied on/off setting."
|
|
6285
|
+
},
|
|
6286
|
+
{
|
|
6287
|
+
"when": "The option list is long or the available space is constrained.",
|
|
6288
|
+
"component": "component:ds-select",
|
|
6289
|
+
"reason": "Select keeps a larger one-of-many choice set compact."
|
|
6290
|
+
}
|
|
6577
6291
|
],
|
|
6578
|
-
"
|
|
6579
|
-
"
|
|
6580
|
-
"
|
|
6292
|
+
"commonlyComposedWith": [
|
|
6293
|
+
"component:ds-field",
|
|
6294
|
+
"component:ds-text"
|
|
6581
6295
|
],
|
|
6582
6296
|
"accessibility": [
|
|
6583
|
-
"
|
|
6584
|
-
"
|
|
6585
|
-
"
|
|
6586
|
-
"
|
|
6587
|
-
"Require Search and Help as the minimum PanelTools actions and provide accessible labels for every tool.",
|
|
6588
|
-
"Preserve focus and accessible names across navigation, collapse, overflow, and responsive presentation changes."
|
|
6297
|
+
"The host exposes radiogroup semantics and requires an accessible group name from aria-label or aria-labelledby.",
|
|
6298
|
+
"Each visible option exposes radio semantics, its checked state, its label text, and any inactive state.",
|
|
6299
|
+
"Arrow keys move and select through active options; Home and End select the first and last active options; Space and Enter select the focused option.",
|
|
6300
|
+
"Roving tabindex keeps one active option in the tab order, preferring the selected option."
|
|
6589
6301
|
],
|
|
6590
6302
|
"states": [
|
|
6591
|
-
"
|
|
6592
|
-
"
|
|
6593
|
-
"
|
|
6594
|
-
"
|
|
6595
|
-
"The application controls mobileDestination and mobileNavigationOpen and keeps router state independent from global tool-surface changes.",
|
|
6596
|
-
"Set gradientPreset to the single resolved global chrome preference: neutral by default, none for solid chrome, or cool, neutral, warm, and fresh for token-based washes.",
|
|
6597
|
-
"The application owns gradient preference persistence, cross-tab synchronization, and server or account precedence; ShellApp owns rendering the resolved preset across authenticated routes.",
|
|
6598
|
-
"Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
|
|
6599
|
-
"Update PanelNav groups, BarNav tabs and heading, navStyle, basePath, and currentUrl atomically from one resolved route state.",
|
|
6600
|
-
"BarNav remains present: it shows route-section tabs when available and the active PanelNav destination label as heading otherwise.",
|
|
6601
|
-
"Render one ShellPage as the default-slot child for each standard routed page; ShellApp owns the content scroller while ShellPage owns page header stickiness and content inset.",
|
|
6602
|
-
"The application filters unauthorized destinations, sections, and tools before passing them into shell components."
|
|
6303
|
+
"Unchecked circles use a tertiary-foreground inset stroke: 1.25px at md, 1px at sm, and 0.75px at xs.",
|
|
6304
|
+
"Selected circles remove the border, use a brand fill, and draw a centered on-bold foreground dot sized 8px at md, 6px at sm, and 4px at xs.",
|
|
6305
|
+
"Sizes are md with a 16px circle in a 20px placement, sm with a 12px circle in a 16px placement, and xs with an 8px circle in a 12px placement.",
|
|
6306
|
+
"The initial value is restored by native form reset; the selected value submits under name and a required set is invalid until one active option is selected."
|
|
6603
6307
|
],
|
|
6604
6308
|
"responsiveBehavior": [
|
|
6605
|
-
"
|
|
6606
|
-
"
|
|
6607
|
-
"On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
|
|
6608
|
-
"On mobile, ShellApp hides and inerts PanelNav and BarNav, uses a solid primary stage, and composes MobileNav, MobileSectionNav, ShellTools, and the persistent five-item MobileBar.",
|
|
6609
|
-
"Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
|
|
6610
|
-
"Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
|
|
6611
|
-
"The bottom bar remains visible at all route and tool depths in the foundation release."
|
|
6309
|
+
"Choose size from the density of the containing form or settings row.",
|
|
6310
|
+
"Prefer vertical layout when labels may wrap or horizontal space is constrained; horizontal layout is appropriate for short labels in a small set."
|
|
6612
6311
|
],
|
|
6613
6312
|
"frameworkCaveats": {
|
|
6614
6313
|
"customElements": [
|
|
6615
|
-
"Assign
|
|
6616
|
-
"
|
|
6314
|
+
"Assign options as a JavaScript property, set value as a property for application state updates, and listen for dsChange.",
|
|
6315
|
+
"Use the form attribute on the host when associating a radio set rendered outside its owning form."
|
|
6617
6316
|
],
|
|
6618
6317
|
"react": [
|
|
6619
|
-
"Use
|
|
6620
|
-
"Resolve all shell inputs from one router state before rendering the composition."
|
|
6318
|
+
"Use DsRadio, pass options as an array, and handle onDsChange; value is mutable and updates after user selection."
|
|
6621
6319
|
],
|
|
6622
6320
|
"angular": [
|
|
6623
|
-
"Use
|
|
6624
|
-
"Bind complex inputs as properties and update navigation inputs atomically from one resolved router state.",
|
|
6625
|
-
"Bind both nav-style attributes and properties when deterministic first paint is required."
|
|
6321
|
+
"Use DsRadio with options and value bindings plus dsChange, or import the generated radio value accessor with the component adapter."
|
|
6626
6322
|
]
|
|
6627
6323
|
},
|
|
6628
6324
|
"references": [
|
|
6629
6325
|
{
|
|
6630
|
-
"label": "
|
|
6631
|
-
"path": "src/wc/components/
|
|
6632
|
-
},
|
|
6633
|
-
{
|
|
6634
|
-
"label": "Executable Storybook composition",
|
|
6635
|
-
"path": "src/wc/components/ShellApp/ShellApp.stories.ts"
|
|
6636
|
-
},
|
|
6637
|
-
{
|
|
6638
|
-
"label": "Framework integration",
|
|
6639
|
-
"path": "docs/framework-integration.md"
|
|
6326
|
+
"label": "Storybook examples",
|
|
6327
|
+
"path": "src/wc/components/Radio/Radio.stories.ts"
|
|
6640
6328
|
},
|
|
6641
6329
|
{
|
|
6642
|
-
"label": "
|
|
6643
|
-
"path": "
|
|
6330
|
+
"label": "Cross-browser form and accessibility coverage",
|
|
6331
|
+
"path": "tests/e2e/forms.spec.ts"
|
|
6644
6332
|
}
|
|
6645
6333
|
]
|
|
6646
6334
|
},
|
|
6647
6335
|
"api": {
|
|
6648
6336
|
"props": {
|
|
6649
|
-
"
|
|
6650
|
-
"type": "
|
|
6337
|
+
"ariaLabel": {
|
|
6338
|
+
"type": "string | null",
|
|
6651
6339
|
"required": false
|
|
6652
6340
|
},
|
|
6653
|
-
"
|
|
6654
|
-
"type": "
|
|
6341
|
+
"ariaLabelledby": {
|
|
6342
|
+
"type": "string | undefined",
|
|
6343
|
+
"required": false
|
|
6344
|
+
},
|
|
6345
|
+
"direction": {
|
|
6346
|
+
"type": "'vertical' | 'horizontal'",
|
|
6655
6347
|
"required": false
|
|
6656
6348
|
},
|
|
6657
|
-
"
|
|
6349
|
+
"disabled": {
|
|
6658
6350
|
"type": "boolean",
|
|
6659
6351
|
"required": false
|
|
6660
6352
|
},
|
|
6661
|
-
"
|
|
6662
|
-
"type": "
|
|
6353
|
+
"form": {
|
|
6354
|
+
"type": "string | undefined",
|
|
6663
6355
|
"required": false
|
|
6664
6356
|
},
|
|
6665
|
-
"
|
|
6357
|
+
"isInactive": {
|
|
6666
6358
|
"type": "boolean",
|
|
6667
6359
|
"required": false
|
|
6668
|
-
}
|
|
6669
|
-
|
|
6670
|
-
|
|
6360
|
+
},
|
|
6361
|
+
"name": {
|
|
6362
|
+
"type": "string | undefined",
|
|
6363
|
+
"required": false
|
|
6364
|
+
},
|
|
6365
|
+
"options": {
|
|
6366
|
+
"type": "RadioOption[]",
|
|
6367
|
+
"required": false
|
|
6368
|
+
},
|
|
6369
|
+
"required": {
|
|
6370
|
+
"type": "boolean",
|
|
6371
|
+
"required": false
|
|
6372
|
+
},
|
|
6373
|
+
"requiredMessage": {
|
|
6374
|
+
"type": "string",
|
|
6375
|
+
"required": false
|
|
6376
|
+
},
|
|
6377
|
+
"size": {
|
|
6378
|
+
"type": "RadioSize",
|
|
6379
|
+
"required": false
|
|
6380
|
+
},
|
|
6381
|
+
"value": {
|
|
6382
|
+
"type": "string",
|
|
6383
|
+
"required": false
|
|
6384
|
+
}
|
|
6385
|
+
},
|
|
6386
|
+
"events": [
|
|
6671
6387
|
{
|
|
6672
|
-
"name": "
|
|
6673
|
-
"detail": "
|
|
6388
|
+
"name": "dsChange",
|
|
6389
|
+
"detail": "string"
|
|
6674
6390
|
}
|
|
6675
6391
|
],
|
|
6676
6392
|
"slots": []
|
|
6677
6393
|
},
|
|
6678
6394
|
"exports": {
|
|
6679
|
-
"customElement": "ds-
|
|
6680
|
-
"react": "
|
|
6681
|
-
"angular": "
|
|
6395
|
+
"customElement": "ds-radio",
|
|
6396
|
+
"react": "DsRadio",
|
|
6397
|
+
"angular": "DsRadio"
|
|
6682
6398
|
},
|
|
6683
6399
|
"dependencies": [
|
|
6684
6400
|
"@ds-mo/ui",
|
|
6685
6401
|
"@ds-mo/tokens"
|
|
6686
6402
|
],
|
|
6687
|
-
"componentDependencies": [
|
|
6403
|
+
"componentDependencies": [
|
|
6404
|
+
"text"
|
|
6405
|
+
]
|
|
6688
6406
|
},
|
|
6689
6407
|
{
|
|
6690
|
-
"id": "component:ds-
|
|
6691
|
-
"tag": "ds-
|
|
6692
|
-
"name": "
|
|
6693
|
-
"title": "
|
|
6694
|
-
"summary": "
|
|
6408
|
+
"id": "component:ds-scroll-overlay",
|
|
6409
|
+
"tag": "ds-scroll-overlay",
|
|
6410
|
+
"name": "scroll-overlay",
|
|
6411
|
+
"title": "ScrollOverlay",
|
|
6412
|
+
"summary": "Generic scroll owner for content that moves behind a persistent footer action or composer with an always-active alpha fade.",
|
|
6695
6413
|
"intentStatus": "complete",
|
|
6696
6414
|
"intent": {
|
|
6697
|
-
"audience": "
|
|
6698
|
-
"status": "
|
|
6699
|
-
"
|
|
6700
|
-
"replacementReason": "SwatchPicker now owns the same accessible interaction with a generic option model that supports both flat colors and gradients.",
|
|
6701
|
-
"summary": "Deprecated compatibility wrapper that maps the fixed ShellApp wash presets into SwatchPicker.",
|
|
6415
|
+
"audience": "general",
|
|
6416
|
+
"status": "experimental",
|
|
6417
|
+
"summary": "Generic scroll owner for content that moves behind a persistent footer action or composer with an always-active alpha fade.",
|
|
6702
6418
|
"useWhen": [
|
|
6703
|
-
"
|
|
6704
|
-
"
|
|
6419
|
+
"A bounded region owns scrolling while footer actions remain overlaid and continuously visible.",
|
|
6420
|
+
"The final content must clear a live-height footer while earlier content can move behind it."
|
|
6705
6421
|
],
|
|
6706
6422
|
"avoidWhen": [
|
|
6707
|
-
"
|
|
6708
|
-
"
|
|
6709
|
-
"A picker already exists for the application; provide exactly one canonical preference location.",
|
|
6710
|
-
"Rendering an individual swatch outside the complete picker."
|
|
6711
|
-
],
|
|
6712
|
-
"alternatives": [
|
|
6713
|
-
{
|
|
6714
|
-
"when": "The user is selecting the application light, dark, or system color mode.",
|
|
6715
|
-
"component": "component:ds-menu",
|
|
6716
|
-
"reason": "Color mode is a separate appearance preference and should use ordinary menu selection rows."
|
|
6717
|
-
}
|
|
6423
|
+
"The footer belongs in normal document flow rather than overlaying content.",
|
|
6424
|
+
"Another component already owns scrolling and cannot delegate its scrollport to this component."
|
|
6718
6425
|
],
|
|
6719
6426
|
"commonlyComposedWith": [
|
|
6720
|
-
"component:ds-
|
|
6721
|
-
"component:ds-
|
|
6722
|
-
],
|
|
6723
|
-
"patterns": [
|
|
6724
|
-
"pattern:application-shell"
|
|
6427
|
+
"component:ds-button-filled",
|
|
6428
|
+
"component:ds-message-composer"
|
|
6725
6429
|
],
|
|
6726
6430
|
"accessibility": [
|
|
6727
|
-
"Provide
|
|
6728
|
-
"
|
|
6729
|
-
"Keep the visible compact swatches and their accessible preset names; do not rely on color alone for assistive technology."
|
|
6431
|
+
"Provide scrollLabel when the scrollport needs its own named, keyboard-focusable region.",
|
|
6432
|
+
"Keep footer actions keyboard accessible and explicitly named; the fade is decorative and never intercepts pointer input."
|
|
6730
6433
|
],
|
|
6731
6434
|
"states": [
|
|
6732
|
-
"
|
|
6733
|
-
"
|
|
6734
|
-
"
|
|
6735
|
-
"The application owns local persistence, cross-tab synchronization, and server or account preference precedence; the picker owns only selection UI and events.",
|
|
6736
|
-
"Treat the fixed preset union as the only supported values and do not construct custom gradients."
|
|
6435
|
+
"The alpha mask remains active at every scroll position and moves in content coordinates so it stays pinned behind the footer without masking native scrollbars.",
|
|
6436
|
+
"The component measures the complete overlay for end clearance, measures its visible child for fade depth, and begins the fade 8px before that visible content.",
|
|
6437
|
+
"An md 32px footer action with 8px bottom inset therefore produces a 48px fade; variable-height composers produce a correspondingly taller measured fade."
|
|
6737
6438
|
],
|
|
6738
6439
|
"responsiveBehavior": [
|
|
6739
|
-
"
|
|
6740
|
-
"The future mobile account surface may present the same preference differently."
|
|
6440
|
+
"The scrollport and overlay fill the available width and height; the owner supplies responsive sizing and overlay insets."
|
|
6741
6441
|
],
|
|
6742
6442
|
"frameworkCaveats": {
|
|
6743
6443
|
"customElements": [
|
|
6744
|
-
"
|
|
6444
|
+
"Place scrollable content in the default slot and one footer wrapper in the overlay slot; use dsScroll only when the application needs position data."
|
|
6745
6445
|
],
|
|
6746
6446
|
"react": [
|
|
6747
|
-
"Use
|
|
6447
|
+
"Use DsScrollOverlay with ordinary children plus an element carrying slot=\"overlay\"."
|
|
6748
6448
|
],
|
|
6749
6449
|
"angular": [
|
|
6750
|
-
"
|
|
6450
|
+
"Import DsScrollOverlay and project the persistent footer wrapper with slot=\"overlay\"."
|
|
6751
6451
|
]
|
|
6752
6452
|
},
|
|
6753
6453
|
"references": [
|
|
6754
6454
|
{
|
|
6755
|
-
"label": "
|
|
6756
|
-
"path": "src/wc/components/
|
|
6757
|
-
},
|
|
6758
|
-
{
|
|
6759
|
-
"label": "ShellApp gradient contract",
|
|
6760
|
-
"path": "src/wc/components/ShellApp/ShellApp.mdx"
|
|
6761
|
-
},
|
|
6762
|
-
{
|
|
6763
|
-
"label": "Application shell composition",
|
|
6764
|
-
"path": "agent/patterns/application-shell/pattern.agent.json"
|
|
6455
|
+
"label": "Storybook examples",
|
|
6456
|
+
"path": "src/wc/components/ScrollOverlay/ScrollOverlay.stories.ts"
|
|
6765
6457
|
}
|
|
6766
6458
|
]
|
|
6767
6459
|
},
|
|
6768
6460
|
"api": {
|
|
6769
6461
|
"props": {
|
|
6770
|
-
"
|
|
6771
|
-
"type": "string",
|
|
6772
|
-
"required": false
|
|
6773
|
-
},
|
|
6774
|
-
"value": {
|
|
6775
|
-
"type": "ShellGradientPreset",
|
|
6462
|
+
"scrollLabel": {
|
|
6463
|
+
"type": "string | undefined",
|
|
6776
6464
|
"required": false
|
|
6777
6465
|
}
|
|
6778
6466
|
},
|
|
6779
6467
|
"events": [
|
|
6780
6468
|
{
|
|
6781
|
-
"name": "
|
|
6782
|
-
"detail": "
|
|
6469
|
+
"name": "dsScroll",
|
|
6470
|
+
"detail": "ScrollOverlayScrollDetail"
|
|
6783
6471
|
}
|
|
6784
6472
|
],
|
|
6785
6473
|
"slots": []
|
|
6786
6474
|
},
|
|
6787
6475
|
"exports": {
|
|
6788
|
-
"customElement": "ds-
|
|
6789
|
-
"react": "
|
|
6790
|
-
"angular": "
|
|
6476
|
+
"customElement": "ds-scroll-overlay",
|
|
6477
|
+
"react": "DsScrollOverlay",
|
|
6478
|
+
"angular": "DsScrollOverlay"
|
|
6791
6479
|
},
|
|
6792
6480
|
"dependencies": [
|
|
6793
6481
|
"@ds-mo/ui",
|
|
6794
6482
|
"@ds-mo/tokens"
|
|
6795
6483
|
],
|
|
6796
|
-
"componentDependencies": [
|
|
6797
|
-
"swatch-picker"
|
|
6798
|
-
]
|
|
6484
|
+
"componentDependencies": []
|
|
6799
6485
|
},
|
|
6800
6486
|
{
|
|
6801
|
-
"id": "component:ds-
|
|
6802
|
-
"tag": "ds-
|
|
6803
|
-
"name": "
|
|
6804
|
-
"title": "
|
|
6805
|
-
"summary": "
|
|
6487
|
+
"id": "component:ds-select",
|
|
6488
|
+
"tag": "ds-select",
|
|
6489
|
+
"name": "select",
|
|
6490
|
+
"title": "Select",
|
|
6491
|
+
"summary": "Form-associated single-value select with listbox semantics, local search, rich flat options, grouped sections, loading, clearing, and surface-aware trigger chrome.",
|
|
6806
6492
|
"intentStatus": "complete",
|
|
6807
6493
|
"intent": {
|
|
6808
|
-
"audience": "
|
|
6809
|
-
"status": "
|
|
6810
|
-
"
|
|
6811
|
-
"replacementReason": "SwatchPicker renders its option buttons internally so an individually published radio swatch is no longer needed.",
|
|
6812
|
-
"summary": "Deprecated internal compatibility component for one legacy ShellApp gradient swatch.",
|
|
6494
|
+
"audience": "general",
|
|
6495
|
+
"status": "stable",
|
|
6496
|
+
"summary": "Form-associated single-value select with listbox semantics, local search, rich flat options, grouped sections, loading, clearing, and surface-aware trigger chrome.",
|
|
6813
6497
|
"useWhen": [
|
|
6814
|
-
"
|
|
6498
|
+
"The user must choose one value from a finite set.",
|
|
6499
|
+
"The option set benefits from local search, subtext, prefix icons, grouping, or disabled choices.",
|
|
6500
|
+
"The choice set has more than roughly 20 options, comes from a user-managed listing, or represents a large domain such as addresses where search materially improves retrieval.",
|
|
6501
|
+
"The selected value must participate in native, Angular, or React form state."
|
|
6815
6502
|
],
|
|
6816
6503
|
"avoidWhen": [
|
|
6817
|
-
"
|
|
6818
|
-
"
|
|
6819
|
-
"
|
|
6504
|
+
"Several values may be selected at once.",
|
|
6505
|
+
"The rows perform commands rather than choosing a form value.",
|
|
6506
|
+
"The choices form a hierarchy with expandable parents."
|
|
6820
6507
|
],
|
|
6821
6508
|
"alternatives": [
|
|
6822
6509
|
{
|
|
6823
|
-
"when": "
|
|
6824
|
-
"component": "component:ds-
|
|
6825
|
-
"reason": "
|
|
6510
|
+
"when": "Several independent values may be selected.",
|
|
6511
|
+
"component": "component:ds-select-multi",
|
|
6512
|
+
"reason": "SelectMulti owns array values, multi-selection semantics, and count presentation."
|
|
6513
|
+
},
|
|
6514
|
+
{
|
|
6515
|
+
"when": "The popup contains commands or state-changing actions.",
|
|
6516
|
+
"component": "component:ds-menu",
|
|
6517
|
+
"reason": "Menu uses action-menu roles and command-focused keyboard behavior."
|
|
6518
|
+
},
|
|
6519
|
+
{
|
|
6520
|
+
"when": "A small set of choices should remain visible.",
|
|
6521
|
+
"component": "component:ds-radio",
|
|
6522
|
+
"reason": "Prefer Radio for roughly two to five mutually exclusive choices when the available space allows all choices to remain visible."
|
|
6826
6523
|
}
|
|
6827
6524
|
],
|
|
6828
6525
|
"commonlyComposedWith": [
|
|
6829
|
-
"component:ds-
|
|
6526
|
+
"component:ds-text",
|
|
6527
|
+
"component:ds-icon",
|
|
6528
|
+
"component:ds-empty-state",
|
|
6529
|
+
"component:ds-loader"
|
|
6830
6530
|
],
|
|
6831
6531
|
"accessibility": [
|
|
6832
|
-
"
|
|
6833
|
-
"
|
|
6834
|
-
"
|
|
6532
|
+
"In forms, provide a persistent visible external field label; placeholder text is guidance and must not be the field's only label. In a compact filter bar, the trigger's visible text may supply the accessible name.",
|
|
6533
|
+
"The trigger uses combobox semantics and the popup uses listbox and option semantics; do not replace them with menu roles.",
|
|
6534
|
+
"Disabled options remain visible, expose aria-disabled, and are skipped by keyboard navigation and typeahead.",
|
|
6535
|
+
"Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
|
|
6536
|
+
"Selected options rely on active fill and foreground treatment without a redundant trailing check icon.",
|
|
6537
|
+
"Local search moves focus into the search field while preserving the active option through aria-activedescendant.",
|
|
6538
|
+
"Use errorMessage with error so the trigger is described by the rendered alert."
|
|
6835
6539
|
],
|
|
6836
6540
|
"states": [
|
|
6837
|
-
"
|
|
6838
|
-
"
|
|
6839
|
-
"
|
|
6541
|
+
"Value is controlled through the mutable value property; dsChange reports user selection and clearing.",
|
|
6542
|
+
"Required Selects begin without an automatic selection and require the user to make an explicit choice; do not preselect the first option merely to satisfy validity.",
|
|
6543
|
+
"When allowClear is enabled, the clear affordance appears only after a value exists. Clearing is valid for optional and required fields; a required field becomes invalid until the user selects again.",
|
|
6544
|
+
"Clearing emits dsChange with an empty string and dsClear, keeps the popup open, and restores useful focus.",
|
|
6545
|
+
"Loading keeps the trigger visible, replaces its prefix icon, marks the control busy, and makes selection interaction temporarily unavailable without presenting the control as inactive.",
|
|
6546
|
+
"The trigger label stays left-aligned at every width. The default size is md in both forms and filter bars; smaller sizes require an explicit density need.",
|
|
6547
|
+
"Use option icons only when they help users differentiate choices. Icons render only when every option in the complete list provides one; mixed icon data falls back to the text-only row layout.",
|
|
6548
|
+
"Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
|
|
6549
|
+
"When any option supplies subtext, every row uses the same subtext structure and missing values render an em dash. Subtext should disambiguate or add decision-helpful information.",
|
|
6550
|
+
"Option labels and the selected trigger label stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
|
|
6551
|
+
"The optional prefix icon and chevron always use the parent surface's secondary foreground color, including when a selected value promotes the label to primary.",
|
|
6552
|
+
"The shared popup search control stays md at every trigger size, using body-medium text, a 20px icon, and the same internal spacing as a borderless Select trigger. Its container uses menu-item padding on every side and owns a 1px bottom divider that becomes a 1.5px bold-brand stroke while search has focus. Search placeholder text is secondary at rest and quaternary while focused because it becomes decorative once the editable field is active.",
|
|
6553
|
+
"When search contains text, the shared control shows a rounded sm icon-only ButtonUnfilled with the CrossCircle icon and no border. It clears the local term, stays hidden for an empty term, and returns focus to search.",
|
|
6554
|
+
"The shared clear footer mirrors the search region's sizing: menu-item padding surrounds an md-height borderless row, and the Clear label uses the same row and label insets as option text. The outer footer owns a 1px top divider.",
|
|
6555
|
+
"An empty filtered list composes the message-only body variant of EmptyState. Keep the default neutral no-results message unless localized product guidance makes the outcome clearer.",
|
|
6556
|
+
"Enable searchable for more than roughly 20 options, user-managed listings, large domains such as addresses, or sets users cannot efficiently scan. Local matching includes option labels, subtext, and section headings; the owner resolves remote data before assigning options.",
|
|
6557
|
+
"Validation timing belongs to the form owner and may be immediate or deferred until blur or submit; the Select exposes validity and error presentation without imposing that policy.",
|
|
6558
|
+
"The error trigger uses a 1.5px bold-negative inset stroke so invalid state remains distinguishable from the normal 1px border without changing control geometry.",
|
|
6559
|
+
"An initially empty option set is not an expected Select use case. The no-results state describes a search with no matches, not a source with no choices.",
|
|
6560
|
+
"Use options for a flat list or sections for grouped choices; when sections are present they take precedence.",
|
|
6561
|
+
"The background prop describes the actual parent surface and uses the same surface set as ButtonUnfilled."
|
|
6840
6562
|
],
|
|
6841
6563
|
"responsiveBehavior": [
|
|
6842
|
-
"
|
|
6564
|
+
"Use width fill for form fields and width hug for compact filter bars. Override those defaults only when the owning layout has a clear constraint.",
|
|
6565
|
+
"The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
|
|
6566
|
+
"Long option collections scroll inside the popup; virtualization and remote search are not part of this component."
|
|
6843
6567
|
],
|
|
6844
6568
|
"frameworkCaveats": {
|
|
6845
6569
|
"customElements": [
|
|
6846
|
-
"
|
|
6570
|
+
"Assign options and sections through JavaScript properties because arrays and objects cannot be represented safely as attributes."
|
|
6847
6571
|
],
|
|
6848
6572
|
"react": [
|
|
6849
|
-
"
|
|
6573
|
+
"Pass options or sections as wrapper props and handle onDsChange, onDsClear, and onDsOpenChange."
|
|
6850
6574
|
],
|
|
6851
6575
|
"angular": [
|
|
6852
|
-
"
|
|
6576
|
+
"Import DsSelect and SelectValueAccessor when integrating with Angular Forms; bind options and sections as properties."
|
|
6853
6577
|
]
|
|
6854
6578
|
},
|
|
6855
6579
|
"references": [
|
|
6856
6580
|
{
|
|
6857
|
-
"label": "
|
|
6858
|
-
"path": "src/wc/components/
|
|
6581
|
+
"label": "Storybook examples",
|
|
6582
|
+
"path": "src/wc/components/Select/Select.stories.ts"
|
|
6583
|
+
},
|
|
6584
|
+
{
|
|
6585
|
+
"label": "Selection patterns",
|
|
6586
|
+
"path": "src/docs/SelectionPatterns.mdx"
|
|
6859
6587
|
}
|
|
6860
6588
|
]
|
|
6861
6589
|
},
|
|
6862
6590
|
"api": {
|
|
6863
6591
|
"props": {
|
|
6864
|
-
"
|
|
6865
|
-
"type": "
|
|
6592
|
+
"activeFill": {
|
|
6593
|
+
"type": "boolean",
|
|
6866
6594
|
"required": false
|
|
6867
6595
|
},
|
|
6868
|
-
"
|
|
6596
|
+
"allowClear": {
|
|
6869
6597
|
"type": "boolean",
|
|
6870
6598
|
"required": false
|
|
6871
6599
|
},
|
|
6872
|
-
"
|
|
6873
|
-
"type": "
|
|
6600
|
+
"ariaDescribedby": {
|
|
6601
|
+
"type": "string | undefined",
|
|
6874
6602
|
"required": false
|
|
6875
6603
|
},
|
|
6876
|
-
"
|
|
6877
|
-
"type": "
|
|
6604
|
+
"ariaLabel": {
|
|
6605
|
+
"type": "string | null",
|
|
6878
6606
|
"required": false
|
|
6879
|
-
}
|
|
6607
|
+
},
|
|
6608
|
+
"ariaLabelledby": {
|
|
6609
|
+
"type": "string | undefined",
|
|
6610
|
+
"required": false
|
|
6611
|
+
},
|
|
6612
|
+
"background": {
|
|
6613
|
+
"type": "SelectBackground | undefined",
|
|
6614
|
+
"required": false
|
|
6615
|
+
},
|
|
6616
|
+
"clearLabel": {
|
|
6617
|
+
"type": "string",
|
|
6618
|
+
"required": false
|
|
6619
|
+
},
|
|
6620
|
+
"disabled": {
|
|
6621
|
+
"type": "boolean",
|
|
6622
|
+
"required": false
|
|
6623
|
+
},
|
|
6624
|
+
"error": {
|
|
6625
|
+
"type": "boolean",
|
|
6626
|
+
"required": false
|
|
6627
|
+
},
|
|
6628
|
+
"errorMessage": {
|
|
6629
|
+
"type": "string | undefined",
|
|
6630
|
+
"required": false
|
|
6631
|
+
},
|
|
6632
|
+
"hasBorder": {
|
|
6633
|
+
"type": "boolean",
|
|
6634
|
+
"required": false
|
|
6635
|
+
},
|
|
6636
|
+
"icon": {
|
|
6637
|
+
"type": "string | undefined",
|
|
6638
|
+
"required": false
|
|
6639
|
+
},
|
|
6640
|
+
"inputId": {
|
|
6641
|
+
"type": "string | undefined",
|
|
6642
|
+
"required": false
|
|
6643
|
+
},
|
|
6644
|
+
"isInactive": {
|
|
6645
|
+
"type": "boolean",
|
|
6646
|
+
"required": false
|
|
6647
|
+
},
|
|
6648
|
+
"isLoading": {
|
|
6649
|
+
"type": "boolean",
|
|
6650
|
+
"required": false
|
|
6651
|
+
},
|
|
6652
|
+
"loadingLabel": {
|
|
6653
|
+
"type": "string",
|
|
6654
|
+
"required": false
|
|
6655
|
+
},
|
|
6656
|
+
"name": {
|
|
6657
|
+
"type": "string | undefined",
|
|
6658
|
+
"required": false
|
|
6659
|
+
},
|
|
6660
|
+
"noResultsText": {
|
|
6661
|
+
"type": "string",
|
|
6662
|
+
"required": false
|
|
6663
|
+
},
|
|
6664
|
+
"open": {
|
|
6665
|
+
"type": "boolean",
|
|
6666
|
+
"required": false
|
|
6667
|
+
},
|
|
6668
|
+
"options": {
|
|
6669
|
+
"type": "SelectOption[]",
|
|
6670
|
+
"required": false
|
|
6671
|
+
},
|
|
6672
|
+
"placeholder": {
|
|
6673
|
+
"type": "string",
|
|
6674
|
+
"required": false
|
|
6675
|
+
},
|
|
6676
|
+
"required": {
|
|
6677
|
+
"type": "boolean",
|
|
6678
|
+
"required": false
|
|
6679
|
+
},
|
|
6680
|
+
"requiredMessage": {
|
|
6681
|
+
"type": "string",
|
|
6682
|
+
"required": false
|
|
6683
|
+
},
|
|
6684
|
+
"searchPlaceholder": {
|
|
6685
|
+
"type": "string",
|
|
6686
|
+
"required": false
|
|
6687
|
+
},
|
|
6688
|
+
"searchable": {
|
|
6689
|
+
"type": "boolean",
|
|
6690
|
+
"required": false
|
|
6691
|
+
},
|
|
6692
|
+
"sections": {
|
|
6693
|
+
"type": "SelectSection[]",
|
|
6694
|
+
"required": false
|
|
6695
|
+
},
|
|
6696
|
+
"size": {
|
|
6697
|
+
"type": "SelectSize",
|
|
6698
|
+
"required": false
|
|
6699
|
+
},
|
|
6700
|
+
"value": {
|
|
6701
|
+
"type": "string",
|
|
6702
|
+
"required": false
|
|
6703
|
+
},
|
|
6704
|
+
"width": {
|
|
6705
|
+
"type": "SelectWidth",
|
|
6706
|
+
"required": false
|
|
6707
|
+
}
|
|
6880
6708
|
},
|
|
6881
6709
|
"events": [
|
|
6882
6710
|
{
|
|
6883
|
-
"name": "
|
|
6884
|
-
"detail": "
|
|
6711
|
+
"name": "dsChange",
|
|
6712
|
+
"detail": "string"
|
|
6713
|
+
},
|
|
6714
|
+
{
|
|
6715
|
+
"name": "dsClear",
|
|
6716
|
+
"detail": "void"
|
|
6717
|
+
},
|
|
6718
|
+
{
|
|
6719
|
+
"name": "dsOpenChange",
|
|
6720
|
+
"detail": "boolean"
|
|
6885
6721
|
}
|
|
6886
6722
|
],
|
|
6887
6723
|
"slots": []
|
|
6888
6724
|
},
|
|
6889
6725
|
"exports": {
|
|
6890
|
-
"customElement": "ds-
|
|
6891
|
-
"react": "
|
|
6892
|
-
"angular": "
|
|
6726
|
+
"customElement": "ds-select",
|
|
6727
|
+
"react": "DsSelect",
|
|
6728
|
+
"angular": "DsSelect"
|
|
6893
6729
|
},
|
|
6894
6730
|
"dependencies": [
|
|
6895
6731
|
"@ds-mo/ui",
|
|
6896
|
-
"@ds-mo/tokens"
|
|
6732
|
+
"@ds-mo/tokens",
|
|
6733
|
+
"@ds-mo/icons"
|
|
6897
6734
|
],
|
|
6898
|
-
"componentDependencies": [
|
|
6735
|
+
"componentDependencies": [
|
|
6736
|
+
"button-unfilled",
|
|
6737
|
+
"empty-state",
|
|
6738
|
+
"icon",
|
|
6739
|
+
"loader",
|
|
6740
|
+
"text",
|
|
6741
|
+
"tooltip"
|
|
6742
|
+
]
|
|
6899
6743
|
},
|
|
6900
6744
|
{
|
|
6901
|
-
"id": "component:ds-
|
|
6902
|
-
"tag": "ds-
|
|
6903
|
-
"name": "
|
|
6904
|
-
"title": "
|
|
6905
|
-
"summary": "
|
|
6745
|
+
"id": "component:ds-select-multi",
|
|
6746
|
+
"tag": "ds-select-multi",
|
|
6747
|
+
"name": "select-multi",
|
|
6748
|
+
"title": "SelectMulti",
|
|
6749
|
+
"summary": "Form-associated multi-value select with a persistent trigger label, inline selected count, local search, rich flat options, grouped sections, loading, and clear-all behavior.",
|
|
6906
6750
|
"intentStatus": "complete",
|
|
6907
6751
|
"intent": {
|
|
6908
|
-
"audience": "
|
|
6909
|
-
"status": "
|
|
6910
|
-
"summary": "
|
|
6752
|
+
"audience": "general",
|
|
6753
|
+
"status": "stable",
|
|
6754
|
+
"summary": "Form-associated multi-value select with a persistent trigger label, inline selected count, local search, rich flat options, grouped sections, loading, and clear-all behavior.",
|
|
6911
6755
|
"useWhen": [
|
|
6912
|
-
"
|
|
6756
|
+
"The user may choose several independent values from one finite set.",
|
|
6757
|
+
"A compact trigger should summarize selection with the field label and a count.",
|
|
6758
|
+
"The option set benefits from local search, subtext, grouping, or disabled choices.",
|
|
6759
|
+
"The choice set has more than roughly 20 options, comes from a user-managed listing, or represents a large domain where search materially improves retrieval."
|
|
6913
6760
|
],
|
|
6914
6761
|
"avoidWhen": [
|
|
6915
|
-
"
|
|
6916
|
-
"
|
|
6762
|
+
"Exactly one value may be selected.",
|
|
6763
|
+
"Selected values must remain individually removable as persistent tags outside the popup.",
|
|
6764
|
+
"The choices form a hierarchy with cascading parent selection.",
|
|
6765
|
+
"The customer task benefits more from keeping every choice and checkbox directly visible; choose between SelectMulti and a visible checkbox list from the use-case context rather than a fixed option-count threshold."
|
|
6917
6766
|
],
|
|
6918
|
-
"
|
|
6919
|
-
|
|
6767
|
+
"alternatives": [
|
|
6768
|
+
{
|
|
6769
|
+
"when": "Exactly one value may be selected.",
|
|
6770
|
+
"component": "component:ds-select",
|
|
6771
|
+
"reason": "Select owns scalar form value and single-select listbox behavior."
|
|
6772
|
+
},
|
|
6773
|
+
{
|
|
6774
|
+
"when": "The popup contains actions rather than values.",
|
|
6775
|
+
"component": "component:ds-menu",
|
|
6776
|
+
"reason": "Menu uses command semantics and closes according to action-menu expectations."
|
|
6777
|
+
}
|
|
6920
6778
|
],
|
|
6921
|
-
"
|
|
6922
|
-
"
|
|
6779
|
+
"commonlyComposedWith": [
|
|
6780
|
+
"component:ds-text",
|
|
6781
|
+
"component:ds-checkbox",
|
|
6782
|
+
"component:ds-empty-state",
|
|
6783
|
+
"component:ds-loader"
|
|
6923
6784
|
],
|
|
6924
6785
|
"accessibility": [
|
|
6925
|
-
"
|
|
6926
|
-
"
|
|
6786
|
+
"In forms, provide a persistent visible external field label. In a compact filter bar, the trigger's visible persistent label and count may supply the accessible name.",
|
|
6787
|
+
"The popup is a listbox with aria-multiselectable and every option exposes its independent aria-selected state.",
|
|
6788
|
+
"Disabled options expose aria-disabled and are skipped by keyboard navigation and typeahead.",
|
|
6789
|
+
"Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
|
|
6790
|
+
"Each row uses a medium-size presentation-only ds-checkbox indicator; multi-select option rows never add a prefix icon alongside it, and the option remains the sole selection semantic and interaction target.",
|
|
6791
|
+
"The trigger keeps its field label visible and appends the current selected count; an explicit aria-label or aria-labelledby remains the authoritative accessible name when supplied.",
|
|
6792
|
+
"Use errorMessage with error so the trigger is described by the rendered alert."
|
|
6927
6793
|
],
|
|
6928
6794
|
"states": [
|
|
6929
|
-
"
|
|
6930
|
-
"
|
|
6795
|
+
"Values is a controlled JavaScript array; dsChange emits a new array after each user toggle.",
|
|
6796
|
+
"Required SelectMulti controls begin without an automatic selection and require the user to make an explicit choice.",
|
|
6797
|
+
"Selecting an option keeps the popup open so additional values can be toggled.",
|
|
6798
|
+
"The trigger label stays left-aligned at every width; every option row uses the same leading medium Checkbox indicator. The default control size is md in both forms and filter bars.",
|
|
6799
|
+
"The selected count always follows the persistent label as plain text separated by a centered dot, including for one selection, and counts every selected value even when search or grouping hides it. Never replace the count with selected option names.",
|
|
6800
|
+
"Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
|
|
6801
|
+
"When any option supplies subtext, every row uses the same subtext structure and missing values render an em dash. Subtext should disambiguate or add decision-helpful information.",
|
|
6802
|
+
"Option labels stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
|
|
6803
|
+
"The optional prefix icon and chevron always use the parent surface's secondary foreground color, including when selection promotes the label and count to primary.",
|
|
6804
|
+
"The shared popup search control stays md at every trigger size, using body-medium text, a 20px icon, and the same internal spacing as a borderless Select trigger. Its container uses menu-item padding on every side and owns a 1px bottom divider that becomes a 1.5px bold-brand stroke while search has focus. Search placeholder text is secondary at rest and quaternary while focused because it becomes decorative once the editable field is active.",
|
|
6805
|
+
"When search contains text, the shared control shows a rounded sm icon-only ButtonUnfilled with the Cross icon and no border. It clears the local term, stays hidden for an empty term, and returns focus to search.",
|
|
6806
|
+
"The shared summary-and-clear footer mirrors the search region's sizing: menu-item padding surrounds an md-height borderless row, and both texts use the same row and label insets as option text. The outer footer owns a 1px top divider.",
|
|
6807
|
+
"An empty filtered list composes the message-only body variant of EmptyState. Keep the default neutral no-results message unless localized product guidance makes the outcome clearer.",
|
|
6808
|
+
"Enable searchable for more than roughly 20 options, user-managed listings, large domains such as addresses, or sets users cannot efficiently scan. Local matching includes option labels, subtext, and section headings; the owner resolves remote data before assigning options.",
|
|
6809
|
+
"When allowClear is enabled, clear-all appears only after at least one value exists. Clearing is valid for optional and required fields; a required field becomes invalid until the user selects again.",
|
|
6810
|
+
"Clear-all emits an empty dsChange and dsClear while preserving useful popup or search focus.",
|
|
6811
|
+
"Loading keeps the trigger visible, marks the control busy, and makes selection interaction temporarily unavailable without presenting the control as inactive.",
|
|
6812
|
+
"SelectMulti has no maximum-selection behavior; every available non-inactive option may be selected.",
|
|
6813
|
+
"Validation timing belongs to the form owner and may be immediate or deferred until blur or submit; the component exposes validity and error presentation without imposing that policy.",
|
|
6814
|
+
"The error trigger uses a 1.5px bold-negative inset stroke so invalid state remains distinguishable from the normal 1px border without changing control geometry.",
|
|
6815
|
+
"An initially empty option set is not an expected SelectMulti use case. The no-results state describes a search with no matches, not a source with no choices.",
|
|
6816
|
+
"Native form submission emits one entry per selected value under the component name.",
|
|
6817
|
+
"Use options for a flat list or sections for grouped choices. Multi-select option contracts intentionally exclude icons because the leading checkbox owns that row zone; hierarchical parent selection is deferred."
|
|
6931
6818
|
],
|
|
6932
6819
|
"responsiveBehavior": [
|
|
6933
|
-
"
|
|
6820
|
+
"Use width fill for form fields and width hug for compact filter bars; the persistent trigger label avoids variable-width selected labels.",
|
|
6821
|
+
"The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
|
|
6822
|
+
"Long option collections scroll inside the popup; virtualization and remote search are not part of this version."
|
|
6934
6823
|
],
|
|
6824
|
+
"frameworkCaveats": {
|
|
6825
|
+
"customElements": [
|
|
6826
|
+
"Assign values, options, and sections through JavaScript properties; array values cannot be represented safely as attributes."
|
|
6827
|
+
],
|
|
6828
|
+
"react": [
|
|
6829
|
+
"Pass values, options, and sections as wrapper props and handle onDsChange, onDsClear, and onDsOpenChange."
|
|
6830
|
+
],
|
|
6831
|
+
"angular": [
|
|
6832
|
+
"Import DsSelectMulti and SelectMultiValueAccessor when integrating with Angular Forms."
|
|
6833
|
+
]
|
|
6834
|
+
},
|
|
6935
6835
|
"references": [
|
|
6936
6836
|
{
|
|
6937
|
-
"label": "Storybook",
|
|
6938
|
-
"path": "src/wc/components/
|
|
6837
|
+
"label": "Storybook examples",
|
|
6838
|
+
"path": "src/wc/components/SelectMulti/SelectMulti.stories.ts"
|
|
6839
|
+
},
|
|
6840
|
+
{
|
|
6841
|
+
"label": "Selection patterns",
|
|
6842
|
+
"path": "src/docs/SelectionPatterns.mdx"
|
|
6939
6843
|
}
|
|
6940
6844
|
]
|
|
6941
6845
|
},
|
|
6942
6846
|
"api": {
|
|
6943
6847
|
"props": {
|
|
6944
|
-
"
|
|
6945
|
-
"type": "
|
|
6848
|
+
"activeFill": {
|
|
6849
|
+
"type": "boolean",
|
|
6946
6850
|
"required": false
|
|
6947
6851
|
},
|
|
6948
|
-
"
|
|
6852
|
+
"allowClear": {
|
|
6949
6853
|
"type": "boolean",
|
|
6950
6854
|
"required": false
|
|
6951
6855
|
},
|
|
6952
|
-
"
|
|
6856
|
+
"ariaDescribedby": {
|
|
6857
|
+
"type": "string | undefined",
|
|
6858
|
+
"required": false
|
|
6859
|
+
},
|
|
6860
|
+
"ariaLabel": {
|
|
6861
|
+
"type": "string | null",
|
|
6862
|
+
"required": false
|
|
6863
|
+
},
|
|
6864
|
+
"ariaLabelledby": {
|
|
6865
|
+
"type": "string | undefined",
|
|
6866
|
+
"required": false
|
|
6867
|
+
},
|
|
6868
|
+
"background": {
|
|
6869
|
+
"type": "SelectMultiBackground | undefined",
|
|
6870
|
+
"required": false
|
|
6871
|
+
},
|
|
6872
|
+
"clearLabel": {
|
|
6953
6873
|
"type": "string",
|
|
6954
6874
|
"required": false
|
|
6955
6875
|
},
|
|
6956
|
-
"
|
|
6957
|
-
"type": "
|
|
6876
|
+
"disabled": {
|
|
6877
|
+
"type": "boolean",
|
|
6958
6878
|
"required": false
|
|
6959
6879
|
},
|
|
6960
|
-
"
|
|
6880
|
+
"error": {
|
|
6881
|
+
"type": "boolean",
|
|
6882
|
+
"required": false
|
|
6883
|
+
},
|
|
6884
|
+
"errorMessage": {
|
|
6885
|
+
"type": "string | undefined",
|
|
6886
|
+
"required": false
|
|
6887
|
+
},
|
|
6888
|
+
"hasBorder": {
|
|
6889
|
+
"type": "boolean",
|
|
6890
|
+
"required": false
|
|
6891
|
+
},
|
|
6892
|
+
"icon": {
|
|
6893
|
+
"type": "string | undefined",
|
|
6894
|
+
"required": false
|
|
6895
|
+
},
|
|
6896
|
+
"inputId": {
|
|
6897
|
+
"type": "string | undefined",
|
|
6898
|
+
"required": false
|
|
6899
|
+
},
|
|
6900
|
+
"isInactive": {
|
|
6901
|
+
"type": "boolean",
|
|
6902
|
+
"required": false
|
|
6903
|
+
},
|
|
6904
|
+
"isLoading": {
|
|
6905
|
+
"type": "boolean",
|
|
6906
|
+
"required": false
|
|
6907
|
+
},
|
|
6908
|
+
"loadingLabel": {
|
|
6909
|
+
"type": "string",
|
|
6910
|
+
"required": false
|
|
6911
|
+
},
|
|
6912
|
+
"name": {
|
|
6913
|
+
"type": "string | undefined",
|
|
6914
|
+
"required": false
|
|
6915
|
+
},
|
|
6916
|
+
"noResultsText": {
|
|
6917
|
+
"type": "string",
|
|
6918
|
+
"required": false
|
|
6919
|
+
},
|
|
6920
|
+
"open": {
|
|
6921
|
+
"type": "boolean",
|
|
6922
|
+
"required": false
|
|
6923
|
+
},
|
|
6924
|
+
"options": {
|
|
6925
|
+
"type": "SelectMultiOption[]",
|
|
6926
|
+
"required": false
|
|
6927
|
+
},
|
|
6928
|
+
"placeholder": {
|
|
6929
|
+
"type": "string",
|
|
6930
|
+
"required": false
|
|
6931
|
+
},
|
|
6932
|
+
"required": {
|
|
6933
|
+
"type": "boolean",
|
|
6934
|
+
"required": false
|
|
6935
|
+
},
|
|
6936
|
+
"requiredMessage": {
|
|
6937
|
+
"type": "string",
|
|
6938
|
+
"required": false
|
|
6939
|
+
},
|
|
6940
|
+
"searchPlaceholder": {
|
|
6941
|
+
"type": "string",
|
|
6942
|
+
"required": false
|
|
6943
|
+
},
|
|
6944
|
+
"searchable": {
|
|
6961
6945
|
"type": "boolean",
|
|
6962
6946
|
"required": false
|
|
6963
6947
|
},
|
|
6964
|
-
"
|
|
6965
|
-
"type": "
|
|
6948
|
+
"sections": {
|
|
6949
|
+
"type": "SelectMultiSection[]",
|
|
6950
|
+
"required": false
|
|
6951
|
+
},
|
|
6952
|
+
"selectedLabel": {
|
|
6953
|
+
"type": "string",
|
|
6954
|
+
"required": false
|
|
6955
|
+
},
|
|
6956
|
+
"size": {
|
|
6957
|
+
"type": "SelectMultiSize",
|
|
6958
|
+
"required": false
|
|
6959
|
+
},
|
|
6960
|
+
"values": {
|
|
6961
|
+
"type": "string[]",
|
|
6962
|
+
"required": false
|
|
6963
|
+
},
|
|
6964
|
+
"width": {
|
|
6965
|
+
"type": "SelectMultiWidth",
|
|
6966
|
+
"required": false
|
|
6967
|
+
}
|
|
6968
|
+
},
|
|
6969
|
+
"events": [
|
|
6970
|
+
{
|
|
6971
|
+
"name": "dsChange",
|
|
6972
|
+
"detail": "string[]"
|
|
6973
|
+
},
|
|
6974
|
+
{
|
|
6975
|
+
"name": "dsClear",
|
|
6976
|
+
"detail": "void"
|
|
6977
|
+
},
|
|
6978
|
+
{
|
|
6979
|
+
"name": "dsOpenChange",
|
|
6980
|
+
"detail": "boolean"
|
|
6981
|
+
}
|
|
6982
|
+
],
|
|
6983
|
+
"slots": []
|
|
6984
|
+
},
|
|
6985
|
+
"exports": {
|
|
6986
|
+
"customElement": "ds-select-multi",
|
|
6987
|
+
"react": "DsSelectMulti",
|
|
6988
|
+
"angular": "DsSelectMulti"
|
|
6989
|
+
},
|
|
6990
|
+
"dependencies": [
|
|
6991
|
+
"@ds-mo/ui",
|
|
6992
|
+
"@ds-mo/tokens",
|
|
6993
|
+
"@ds-mo/icons"
|
|
6994
|
+
],
|
|
6995
|
+
"componentDependencies": [
|
|
6996
|
+
"button-unfilled",
|
|
6997
|
+
"checkbox",
|
|
6998
|
+
"empty-state",
|
|
6999
|
+
"icon",
|
|
7000
|
+
"loader",
|
|
7001
|
+
"text",
|
|
7002
|
+
"tooltip"
|
|
7003
|
+
]
|
|
7004
|
+
},
|
|
7005
|
+
{
|
|
7006
|
+
"id": "component:ds-shell-app",
|
|
7007
|
+
"tag": "ds-shell-app",
|
|
7008
|
+
"name": "shell-app",
|
|
7009
|
+
"title": "ShellApp",
|
|
7010
|
+
"summary": "The single required workspace root for standard authenticated application pages, coordinating primary and secondary navigation, tools chrome, responsive composition, content geometry, shared styling, and shell behavior.",
|
|
7011
|
+
"intentStatus": "complete",
|
|
7012
|
+
"intent": {
|
|
7013
|
+
"audience": "specialized",
|
|
7014
|
+
"status": "stable",
|
|
7015
|
+
"summary": "The single required workspace root for standard authenticated application pages, coordinating primary and secondary navigation, tools chrome, responsive composition, content geometry, shared styling, and shell behavior.",
|
|
7016
|
+
"useWhen": [
|
|
7017
|
+
"Building any standard authenticated product or workspace page with CompoMo.",
|
|
7018
|
+
"PanelNav, BarNav, ShellTools, mobile navigation, page content, shared chrome, responsive behavior, and shell shortcuts must be composed as one application frame.",
|
|
7019
|
+
"Future application templates need the supported base-page composition boundary."
|
|
7020
|
+
],
|
|
7021
|
+
"avoidWhen": [
|
|
7022
|
+
"Building authentication, onboarding, public, marketing, print, error, or intentionally focused full-screen experiences that require a different layout.",
|
|
7023
|
+
"Another ShellApp already exists in the page; applications must render exactly one and must never nest ShellApps.",
|
|
7024
|
+
"Building content inside an existing ShellApp; render the page content rather than another shell."
|
|
7025
|
+
],
|
|
7026
|
+
"commonlyComposedWith": [
|
|
7027
|
+
"component:ds-panel-nav",
|
|
7028
|
+
"component:ds-bar-nav",
|
|
7029
|
+
"component:ds-panel-tools",
|
|
7030
|
+
"component:ds-shell-tools",
|
|
7031
|
+
"component:ds-mobile-sheet-nav",
|
|
7032
|
+
"component:ds-mobile-header",
|
|
7033
|
+
"component:ds-mobile-bar-nav",
|
|
7034
|
+
"component:ds-shell-page",
|
|
7035
|
+
"component:ds-swatch-picker"
|
|
7036
|
+
],
|
|
7037
|
+
"patterns": [
|
|
7038
|
+
"pattern:application-shell",
|
|
7039
|
+
"pattern:shell-page"
|
|
7040
|
+
],
|
|
7041
|
+
"accessibility": [
|
|
7042
|
+
"Keep primary destinations in PanelNav and secondary route sections in BarNav.",
|
|
7043
|
+
"Ensure the default content region contains the page's single main landmark.",
|
|
7044
|
+
"Keep PanelNav, BarNav, and PanelTools-compatible chrome available in desktop and tablet compositions and the persistent mobile bar available below 768px.",
|
|
7045
|
+
"Do not override browser keyboard chords when enabling shell shortcuts.",
|
|
7046
|
+
"Require Search and Help as the minimum PanelTools actions and provide accessible labels for every tool.",
|
|
7047
|
+
"Preserve focus and accessible names across navigation, collapse, overflow, and responsive presentation changes."
|
|
7048
|
+
],
|
|
7049
|
+
"states": [
|
|
7050
|
+
"Render exactly one ShellApp as the workspace root and never nest it.",
|
|
7051
|
+
"PanelNav, BarNav, and ShellTools are the responsive shell regions; ShellTools contains at least Search and Help even when no additional product tools apply.",
|
|
7052
|
+
"The application router owns the current route, authorization filtering, Dashboard or Settings context, destination collections, section collections, and localized content labels.",
|
|
7053
|
+
"ShellApp propagates navStyle and resolved responsive mode and coordinates layout, gradient alignment, transitions, metrics, shortcuts, and mobile-stage visibility.",
|
|
7054
|
+
"The application controls mobileDestination and mobileSheetNavOpen and keeps router state independent from global tool-surface changes.",
|
|
7055
|
+
"Set gradientPreset to the single resolved global chrome preference: neutral by default, none for solid chrome, or cool, neutral, warm, and fresh for token-based washes.",
|
|
7056
|
+
"The application owns gradient preference persistence, cross-tab synchronization, and server or account precedence; ShellApp owns rendering the resolved preset across authenticated routes.",
|
|
7057
|
+
"Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
|
|
7058
|
+
"Update PanelNav groups, BarNav tabs and heading, navStyle, basePath, and currentUrl atomically from one resolved route state.",
|
|
7059
|
+
"BarNav remains present: it shows route-section tabs when available and the active PanelNav destination label as heading otherwise.",
|
|
7060
|
+
"Render one ShellPage as the default-slot child for each standard routed page; ShellApp owns the content scroller while ShellPage owns page header stickiness and content inset.",
|
|
7061
|
+
"The application filters unauthorized destinations, sections, and tools before passing them into shell components."
|
|
7062
|
+
],
|
|
7063
|
+
"responsiveBehavior": [
|
|
7064
|
+
"ShellApp owns the fixed system breakpoints and resolves desktop at 1200px and wider, tablet from 768px through 1199px, and mobile below 768px.",
|
|
7065
|
+
"On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
|
|
7066
|
+
"On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
|
|
7067
|
+
"On mobile, ShellApp hides and inerts PanelNav and BarNav, uses a solid primary stage, and composes routed ShellPage MobileHeader presentations, MobileSheetNav, ShellTools, and the persistent five-item MobileBarNav.",
|
|
7068
|
+
"Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
|
|
7069
|
+
"Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
|
|
7070
|
+
"The bottom bar remains visible at all route and tool depths in the foundation release."
|
|
7071
|
+
],
|
|
7072
|
+
"frameworkCaveats": {
|
|
7073
|
+
"customElements": [
|
|
7074
|
+
"Assign complex navigation and tool collections as JavaScript properties on the slotted components.",
|
|
7075
|
+
"Stamp route-derived nav-style before components connect when deterministic first paint is required."
|
|
7076
|
+
],
|
|
7077
|
+
"react": [
|
|
7078
|
+
"Use generated wrappers and preserve native slot names for desktop navigation, responsive tools, mobile navigation, and main content.",
|
|
7079
|
+
"Resolve all shell inputs from one router state before rendering the composition."
|
|
7080
|
+
],
|
|
7081
|
+
"angular": [
|
|
7082
|
+
"Use generated standalone adapters and preserve slot attributes in templates.",
|
|
7083
|
+
"Bind complex inputs as properties and update navigation inputs atomically from one resolved router state.",
|
|
7084
|
+
"Bind both nav-style attributes and properties when deterministic first paint is required."
|
|
7085
|
+
]
|
|
7086
|
+
},
|
|
7087
|
+
"references": [
|
|
7088
|
+
{
|
|
7089
|
+
"label": "Component guide",
|
|
7090
|
+
"path": "src/wc/components/ShellApp/ShellApp.mdx"
|
|
7091
|
+
},
|
|
7092
|
+
{
|
|
7093
|
+
"label": "Executable Storybook composition",
|
|
7094
|
+
"path": "src/wc/components/ShellApp/ShellApp.stories.ts"
|
|
7095
|
+
},
|
|
7096
|
+
{
|
|
7097
|
+
"label": "Framework integration",
|
|
7098
|
+
"path": "docs/framework-integration.md"
|
|
7099
|
+
},
|
|
7100
|
+
{
|
|
7101
|
+
"label": "Application shell contract",
|
|
7102
|
+
"path": "agent/patterns/application-shell/pattern.agent.json"
|
|
7103
|
+
}
|
|
7104
|
+
]
|
|
7105
|
+
},
|
|
7106
|
+
"api": {
|
|
7107
|
+
"props": {
|
|
7108
|
+
"gradientPreset": {
|
|
7109
|
+
"type": "ShellGradientPreset",
|
|
6966
7110
|
"required": false
|
|
6967
7111
|
},
|
|
6968
|
-
"
|
|
6969
|
-
"type": "
|
|
7112
|
+
"mobileDestination": {
|
|
7113
|
+
"type": "MobileDestination",
|
|
6970
7114
|
"required": false
|
|
6971
7115
|
},
|
|
6972
|
-
"
|
|
7116
|
+
"mobileSheetNavOpen": {
|
|
6973
7117
|
"type": "boolean",
|
|
6974
7118
|
"required": false
|
|
6975
7119
|
},
|
|
6976
|
-
"
|
|
6977
|
-
"type": "
|
|
7120
|
+
"navStyle": {
|
|
7121
|
+
"type": "NavChromeStyle",
|
|
6978
7122
|
"required": false
|
|
6979
7123
|
},
|
|
6980
|
-
"
|
|
6981
|
-
"type": "
|
|
7124
|
+
"shortcutsEnabled": {
|
|
7125
|
+
"type": "boolean",
|
|
6982
7126
|
"required": false
|
|
6983
7127
|
}
|
|
6984
7128
|
},
|
|
6985
7129
|
"events": [
|
|
6986
7130
|
{
|
|
6987
|
-
"name": "
|
|
6988
|
-
"detail": "
|
|
6989
|
-
},
|
|
6990
|
-
{
|
|
6991
|
-
"name": "dsNavigationToggle",
|
|
6992
|
-
"detail": "boolean"
|
|
7131
|
+
"name": "dsResponsiveModeChange",
|
|
7132
|
+
"detail": "{ mode: ShellResponsiveMode }"
|
|
6993
7133
|
}
|
|
6994
7134
|
],
|
|
6995
7135
|
"slots": []
|
|
6996
7136
|
},
|
|
6997
7137
|
"exports": {
|
|
6998
|
-
"customElement": "ds-shell-
|
|
6999
|
-
"react": "
|
|
7000
|
-
"angular": "
|
|
7138
|
+
"customElement": "ds-shell-app",
|
|
7139
|
+
"react": "DsShellApp",
|
|
7140
|
+
"angular": "DsShellApp"
|
|
7001
7141
|
},
|
|
7002
7142
|
"dependencies": [
|
|
7003
7143
|
"@ds-mo/ui",
|
|
7004
|
-
"@ds-mo/tokens"
|
|
7005
|
-
"@ds-mo/icons"
|
|
7144
|
+
"@ds-mo/tokens"
|
|
7006
7145
|
],
|
|
7007
|
-
"componentDependencies": [
|
|
7008
|
-
"icon",
|
|
7009
|
-
"text"
|
|
7010
|
-
]
|
|
7146
|
+
"componentDependencies": []
|
|
7011
7147
|
},
|
|
7012
7148
|
{
|
|
7013
|
-
"id": "component:ds-shell-
|
|
7014
|
-
"tag": "ds-shell-
|
|
7015
|
-
"name": "shell-
|
|
7016
|
-
"title": "
|
|
7017
|
-
"summary": "
|
|
7149
|
+
"id": "component:ds-shell-gradient-picker",
|
|
7150
|
+
"tag": "ds-shell-gradient-picker",
|
|
7151
|
+
"name": "shell-gradient-picker",
|
|
7152
|
+
"title": "ShellGradientPicker",
|
|
7153
|
+
"summary": "Deprecated compatibility wrapper that maps the fixed ShellApp wash presets into SwatchPicker.",
|
|
7018
7154
|
"intentStatus": "complete",
|
|
7019
7155
|
"intent": {
|
|
7020
7156
|
"audience": "specialized",
|
|
7021
|
-
"status": "
|
|
7022
|
-
"
|
|
7157
|
+
"status": "deprecated",
|
|
7158
|
+
"replacedBy": "component:ds-swatch-picker",
|
|
7159
|
+
"replacementReason": "SwatchPicker now owns the same accessible interaction with a generic option model that supports both flat colors and gradients.",
|
|
7160
|
+
"summary": "Deprecated compatibility wrapper that maps the fixed ShellApp wash presets into SwatchPicker.",
|
|
7023
7161
|
"useWhen": [
|
|
7024
|
-
"
|
|
7162
|
+
"Adding the Appearance or Theme section to the application's user or account menu.",
|
|
7163
|
+
"Users must choose the global ShellApp chrome treatment from none, cool, neutral, warm, or fresh."
|
|
7025
7164
|
],
|
|
7026
7165
|
"avoidWhen": [
|
|
7027
|
-
"
|
|
7028
|
-
"
|
|
7166
|
+
"Choosing semantic intent, page background, chart, content, or brand colors.",
|
|
7167
|
+
"Building an arbitrary gradient editor or allowing custom gradient values.",
|
|
7168
|
+
"A picker already exists for the application; provide exactly one canonical preference location.",
|
|
7169
|
+
"Rendering an individual swatch outside the complete picker."
|
|
7170
|
+
],
|
|
7171
|
+
"alternatives": [
|
|
7172
|
+
{
|
|
7173
|
+
"when": "The user is selecting the application light, dark, or system color mode.",
|
|
7174
|
+
"component": "component:ds-menu",
|
|
7175
|
+
"reason": "Color mode is a separate appearance preference and should use ordinary menu selection rows."
|
|
7176
|
+
}
|
|
7029
7177
|
],
|
|
7030
7178
|
"commonlyComposedWith": [
|
|
7031
7179
|
"component:ds-shell-app",
|
|
7032
|
-
"component:ds-
|
|
7180
|
+
"component:ds-menu"
|
|
7033
7181
|
],
|
|
7034
7182
|
"patterns": [
|
|
7035
7183
|
"pattern:application-shell"
|
|
7036
7184
|
],
|
|
7037
7185
|
"accessibility": [
|
|
7038
|
-
"
|
|
7039
|
-
"
|
|
7186
|
+
"Provide a localized groupLabel that describes the shell appearance choice.",
|
|
7187
|
+
"Treat the presets as one radio group with one Tab stop; Arrow keys, Home, and End move and select within the group.",
|
|
7188
|
+
"Keep the visible compact swatches and their accessible preset names; do not rely on color alone for assistive technology."
|
|
7040
7189
|
],
|
|
7041
7190
|
"states": [
|
|
7042
|
-
"
|
|
7043
|
-
"
|
|
7191
|
+
"Neutral is the default preset; none renders solid shell chrome without a wash.",
|
|
7192
|
+
"Cool, neutral, warm, and fresh use design tokens and automatically adapt to the active light or dark color theme.",
|
|
7193
|
+
"Apply dsChange immediately to ShellApp.gradientPreset and keep the containing account menu open.",
|
|
7194
|
+
"The application owns local persistence, cross-tab synchronization, and server or account preference precedence; the picker owns only selection UI and events.",
|
|
7195
|
+
"Treat the fixed preset union as the only supported values and do not construct custom gradients."
|
|
7044
7196
|
],
|
|
7045
7197
|
"responsiveBehavior": [
|
|
7046
|
-
"
|
|
7198
|
+
"Keep the compact picker in the user or account appearance menu on supported desktop and tablet shell compositions.",
|
|
7199
|
+
"The future mobile account surface may present the same preference differently."
|
|
7047
7200
|
],
|
|
7201
|
+
"frameworkCaveats": {
|
|
7202
|
+
"customElements": [
|
|
7203
|
+
"Listen for dsChange, resolve application preference precedence, and assign the result to the single ShellApp gradientPreset property."
|
|
7204
|
+
],
|
|
7205
|
+
"react": [
|
|
7206
|
+
"Use the generated wrapper and handle onDsChange without closing the containing account menu."
|
|
7207
|
+
],
|
|
7208
|
+
"angular": [
|
|
7209
|
+
"Bind value to the resolved preference and handle dsChange to update application state."
|
|
7210
|
+
]
|
|
7211
|
+
},
|
|
7048
7212
|
"references": [
|
|
7049
7213
|
{
|
|
7050
|
-
"label": "
|
|
7051
|
-
"path": "src/wc/components/
|
|
7214
|
+
"label": "Replacement stories",
|
|
7215
|
+
"path": "src/wc/components/SwatchPicker/SwatchPicker.stories.ts"
|
|
7216
|
+
},
|
|
7217
|
+
{
|
|
7218
|
+
"label": "ShellApp gradient contract",
|
|
7219
|
+
"path": "src/wc/components/ShellApp/ShellApp.mdx"
|
|
7220
|
+
},
|
|
7221
|
+
{
|
|
7222
|
+
"label": "Application shell composition",
|
|
7223
|
+
"path": "agent/patterns/application-shell/pattern.agent.json"
|
|
7052
7224
|
}
|
|
7053
7225
|
]
|
|
7054
7226
|
},
|
|
7055
7227
|
"api": {
|
|
7056
7228
|
"props": {
|
|
7057
|
-
"
|
|
7058
|
-
"type": "string",
|
|
7059
|
-
"required": false
|
|
7060
|
-
},
|
|
7061
|
-
"browseContext": {
|
|
7062
|
-
"type": "NavChromeStyle",
|
|
7063
|
-
"required": false
|
|
7064
|
-
},
|
|
7065
|
-
"currentUrl": {
|
|
7066
|
-
"type": "string",
|
|
7067
|
-
"required": false
|
|
7068
|
-
},
|
|
7069
|
-
"dashboardGroups": {
|
|
7070
|
-
"type": "PanelNavGroup[]",
|
|
7071
|
-
"required": false
|
|
7072
|
-
},
|
|
7073
|
-
"dashboardLabel": {
|
|
7074
|
-
"type": "string",
|
|
7075
|
-
"required": false
|
|
7076
|
-
},
|
|
7077
|
-
"heading": {
|
|
7078
|
-
"type": "string",
|
|
7079
|
-
"required": false
|
|
7080
|
-
},
|
|
7081
|
-
"helpLabel": {
|
|
7082
|
-
"type": "string",
|
|
7083
|
-
"required": false
|
|
7084
|
-
},
|
|
7085
|
-
"navigationLabel": {
|
|
7229
|
+
"groupLabel": {
|
|
7086
7230
|
"type": "string",
|
|
7087
7231
|
"required": false
|
|
7088
7232
|
},
|
|
7089
|
-
"
|
|
7090
|
-
"type": "
|
|
7091
|
-
"required": false
|
|
7092
|
-
},
|
|
7093
|
-
"settingsGroups": {
|
|
7094
|
-
"type": "PanelNavGroup[]",
|
|
7095
|
-
"required": false
|
|
7096
|
-
},
|
|
7097
|
-
"settingsLabel": {
|
|
7098
|
-
"type": "string",
|
|
7233
|
+
"value": {
|
|
7234
|
+
"type": "ShellGradientPreset",
|
|
7099
7235
|
"required": false
|
|
7100
7236
|
}
|
|
7101
7237
|
},
|
|
7102
7238
|
"events": [
|
|
7103
7239
|
{
|
|
7104
|
-
"name": "
|
|
7105
|
-
"detail": "
|
|
7106
|
-
},
|
|
7107
|
-
{
|
|
7108
|
-
"name": "dsAuxiliarySelect",
|
|
7109
|
-
"detail": "ShellMobileNavAuxiliaryDetail"
|
|
7110
|
-
},
|
|
7111
|
-
{
|
|
7112
|
-
"name": "dsBrowseContextChange",
|
|
7113
|
-
"detail": "NavChromeStyle"
|
|
7114
|
-
},
|
|
7115
|
-
{
|
|
7116
|
-
"name": "dsClose",
|
|
7117
|
-
"detail": "void"
|
|
7240
|
+
"name": "dsChange",
|
|
7241
|
+
"detail": "ShellGradientPreset"
|
|
7118
7242
|
}
|
|
7119
7243
|
],
|
|
7120
7244
|
"slots": []
|
|
7121
7245
|
},
|
|
7122
7246
|
"exports": {
|
|
7123
|
-
"customElement": "ds-shell-
|
|
7124
|
-
"react": "
|
|
7125
|
-
"angular": "
|
|
7247
|
+
"customElement": "ds-shell-gradient-picker",
|
|
7248
|
+
"react": "DsShellGradientPicker",
|
|
7249
|
+
"angular": "DsShellGradientPicker"
|
|
7126
7250
|
},
|
|
7127
7251
|
"dependencies": [
|
|
7128
7252
|
"@ds-mo/ui",
|
|
7129
|
-
"@ds-mo/tokens"
|
|
7130
|
-
"@ds-mo/icons"
|
|
7253
|
+
"@ds-mo/tokens"
|
|
7131
7254
|
],
|
|
7132
7255
|
"componentDependencies": [
|
|
7133
|
-
"
|
|
7134
|
-
"tab-group",
|
|
7135
|
-
"text"
|
|
7256
|
+
"swatch-picker"
|
|
7136
7257
|
]
|
|
7137
7258
|
},
|
|
7138
7259
|
{
|
|
7139
|
-
"id": "component:ds-shell-
|
|
7140
|
-
"tag": "ds-shell-
|
|
7141
|
-
"name": "shell-
|
|
7142
|
-
"title": "
|
|
7143
|
-
"summary": "
|
|
7260
|
+
"id": "component:ds-shell-gradient-swatch",
|
|
7261
|
+
"tag": "ds-shell-gradient-swatch",
|
|
7262
|
+
"name": "shell-gradient-swatch",
|
|
7263
|
+
"title": "ShellGradientSwatch",
|
|
7264
|
+
"summary": "Deprecated internal compatibility component for one legacy ShellApp gradient swatch.",
|
|
7144
7265
|
"intentStatus": "complete",
|
|
7145
7266
|
"intent": {
|
|
7146
|
-
"audience": "
|
|
7147
|
-
"status": "
|
|
7148
|
-
"
|
|
7267
|
+
"audience": "internal",
|
|
7268
|
+
"status": "deprecated",
|
|
7269
|
+
"replacedBy": "component:ds-swatch-picker",
|
|
7270
|
+
"replacementReason": "SwatchPicker renders its option buttons internally so an individually published radio swatch is no longer needed.",
|
|
7271
|
+
"summary": "Deprecated internal compatibility component for one legacy ShellApp gradient swatch.",
|
|
7149
7272
|
"useWhen": [
|
|
7150
|
-
"
|
|
7273
|
+
"Maintaining or extending ShellGradientPicker inside CompoMo."
|
|
7151
7274
|
],
|
|
7152
7275
|
"avoidWhen": [
|
|
7153
|
-
"
|
|
7154
|
-
"
|
|
7276
|
+
"Building application UI directly; use ShellGradientPicker instead.",
|
|
7277
|
+
"Selecting semantic, brand, chart, page, or arbitrary gradient colors.",
|
|
7278
|
+
"Creating a partial or custom set of shell gradient choices."
|
|
7155
7279
|
],
|
|
7156
7280
|
"alternatives": [
|
|
7157
7281
|
{
|
|
7158
|
-
"when": "
|
|
7159
|
-
"component": "component:ds-
|
|
7160
|
-
"reason": "
|
|
7282
|
+
"when": "An application needs the supported global shell appearance control.",
|
|
7283
|
+
"component": "component:ds-swatch-picker",
|
|
7284
|
+
"reason": "SwatchPicker provides the complete radio-group semantics, keyboard behavior, generic previews, and selection event."
|
|
7161
7285
|
}
|
|
7162
7286
|
],
|
|
7163
7287
|
"commonlyComposedWith": [
|
|
7164
|
-
"component:ds-
|
|
7165
|
-
"component:ds-shell-mobile-bar",
|
|
7166
|
-
"component:ds-bar-nav"
|
|
7167
|
-
],
|
|
7168
|
-
"patterns": [
|
|
7169
|
-
"pattern:application-shell"
|
|
7288
|
+
"component:ds-swatch-picker"
|
|
7170
7289
|
],
|
|
7171
7290
|
"accessibility": [
|
|
7172
|
-
"
|
|
7173
|
-
"
|
|
7291
|
+
"Keep radio semantics, aria-checked state, and a preset-specific accessible name on the internal button.",
|
|
7292
|
+
"Let ShellGradientPicker manage the roving tab stop and group keyboard navigation.",
|
|
7293
|
+
"Do not expose an unlabeled color-only choice."
|
|
7174
7294
|
],
|
|
7175
7295
|
"states": [
|
|
7176
|
-
"
|
|
7177
|
-
"
|
|
7296
|
+
"Preset determines the token-based preview; selected determines radio state and selected visuals.",
|
|
7297
|
+
"The selected swatch owns the radio group's single tab stop while ShellGradientPicker coordinates selection and focus movement.",
|
|
7298
|
+
"isInactive disables interaction but does not remove the accessible name."
|
|
7178
7299
|
],
|
|
7179
7300
|
"responsiveBehavior": [
|
|
7180
|
-
"
|
|
7301
|
+
"Preserve the fixed compact swatch geometry and let ShellGradientPicker own layout."
|
|
7181
7302
|
],
|
|
7182
7303
|
"frameworkCaveats": {
|
|
7183
7304
|
"customElements": [
|
|
7184
|
-
"
|
|
7305
|
+
"Do not instantiate this internal primitive in consuming applications."
|
|
7185
7306
|
],
|
|
7186
7307
|
"react": [
|
|
7187
|
-
"
|
|
7308
|
+
"Use DsShellGradientPicker rather than the generated swatch wrapper."
|
|
7188
7309
|
],
|
|
7189
7310
|
"angular": [
|
|
7190
|
-
"
|
|
7311
|
+
"Use DsShellGradientPicker rather than importing DsShellGradientSwatch."
|
|
7191
7312
|
]
|
|
7192
7313
|
},
|
|
7193
7314
|
"references": [
|
|
7194
7315
|
{
|
|
7195
|
-
"label": "
|
|
7196
|
-
"path": "src/wc/components/
|
|
7316
|
+
"label": "Parent picker",
|
|
7317
|
+
"path": "src/wc/components/ShellGradientPicker/ShellGradientPicker.tsx"
|
|
7197
7318
|
}
|
|
7198
7319
|
]
|
|
7199
7320
|
},
|
|
7200
7321
|
"api": {
|
|
7201
7322
|
"props": {
|
|
7202
|
-
"
|
|
7203
|
-
"type": "string",
|
|
7204
|
-
"required": false
|
|
7205
|
-
},
|
|
7206
|
-
"currentUrl": {
|
|
7207
|
-
"type": "string",
|
|
7208
|
-
"required": false
|
|
7209
|
-
},
|
|
7210
|
-
"heading": {
|
|
7211
|
-
"type": "string | undefined",
|
|
7212
|
-
"required": false
|
|
7213
|
-
},
|
|
7214
|
-
"navigationLabel": {
|
|
7215
|
-
"type": "string",
|
|
7323
|
+
"ariaLabel": {
|
|
7324
|
+
"type": "string | null",
|
|
7216
7325
|
"required": false
|
|
7217
7326
|
},
|
|
7218
|
-
"
|
|
7219
|
-
"type": "
|
|
7327
|
+
"isInactive": {
|
|
7328
|
+
"type": "boolean",
|
|
7220
7329
|
"required": false
|
|
7221
7330
|
},
|
|
7222
|
-
"
|
|
7223
|
-
"type": "
|
|
7331
|
+
"preset": {
|
|
7332
|
+
"type": "ShellGradientPreset",
|
|
7224
7333
|
"required": false
|
|
7225
7334
|
},
|
|
7226
|
-
"
|
|
7227
|
-
"type": "
|
|
7335
|
+
"selected": {
|
|
7336
|
+
"type": "boolean",
|
|
7228
7337
|
"required": false
|
|
7229
7338
|
}
|
|
7230
7339
|
},
|
|
7231
7340
|
"events": [
|
|
7232
7341
|
{
|
|
7233
|
-
"name": "
|
|
7234
|
-
"detail": "
|
|
7342
|
+
"name": "dsSelect",
|
|
7343
|
+
"detail": "ShellGradientPreset"
|
|
7235
7344
|
}
|
|
7236
7345
|
],
|
|
7237
7346
|
"slots": []
|
|
7238
7347
|
},
|
|
7239
7348
|
"exports": {
|
|
7240
|
-
"customElement": "ds-shell-
|
|
7241
|
-
"react": "
|
|
7242
|
-
"angular": "
|
|
7349
|
+
"customElement": "ds-shell-gradient-swatch",
|
|
7350
|
+
"react": "DsShellGradientSwatch",
|
|
7351
|
+
"angular": "DsShellGradientSwatch"
|
|
7243
7352
|
},
|
|
7244
7353
|
"dependencies": [
|
|
7245
7354
|
"@ds-mo/ui",
|
|
7246
7355
|
"@ds-mo/tokens"
|
|
7247
7356
|
],
|
|
7248
|
-
"componentDependencies": [
|
|
7249
|
-
"text"
|
|
7250
|
-
]
|
|
7357
|
+
"componentDependencies": []
|
|
7251
7358
|
},
|
|
7252
7359
|
{
|
|
7253
7360
|
"id": "component:ds-shell-page",
|
|
@@ -7294,7 +7401,7 @@
|
|
|
7294
7401
|
],
|
|
7295
7402
|
"accessibility": [
|
|
7296
7403
|
"ShellPage exposes the routed page as the main landmark; render exactly one active ShellPage inside ShellApp.",
|
|
7297
|
-
"Provide
|
|
7404
|
+
"Provide one BarTitle or BarWorkflow through the desktop header slot and one MobileHeader through mobile-header when the page participates in the mobile shell.",
|
|
7298
7405
|
"Keep loading, empty, validation, error, progress, success, and failure communication in the default product-content slot.",
|
|
7299
7406
|
"Responsive variant changes preserve the same heading, controls, accessible names, and keyboard focus targets."
|
|
7300
7407
|
],
|
|
@@ -7303,12 +7410,13 @@
|
|
|
7303
7410
|
"headerPresentation=auto selects the matching header variant from headerCapacity and scroll position.",
|
|
7304
7411
|
"expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
|
|
7305
7412
|
"contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
|
|
7306
|
-
"The
|
|
7413
|
+
"The header slot accepts one desktop BarTitle or BarWorkflow; mobile-header accepts the corresponding MobileHeader presentation. The default slot owns router output and all page product content."
|
|
7307
7414
|
],
|
|
7308
7415
|
"responsiveBehavior": [
|
|
7309
7416
|
"The owning application shell resolves viewport and persistent-chrome state into the explicit headerCapacity prop; ShellPage never guesses the cause of reduced width from its own rendered size.",
|
|
7310
7417
|
"Roomy capacity expands at the top and compacts after scroll; compact capacity stays compact; constrained capacity uses the constrained action layout.",
|
|
7311
7418
|
"A ShellPage-managed BarTitle remains concealed until headerCapacity is available and its rendered variant matches the resolved presentation, preventing a default-variant flash during route activation.",
|
|
7419
|
+
"responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
|
|
7312
7420
|
"Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
|
|
7313
7421
|
"On roomy pages, the expanded header scrolls upward until its title and action row reaches the compact row position, then snaps variants without moving that shared visual anchor.",
|
|
7314
7422
|
"Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
|
|
@@ -7317,15 +7425,15 @@
|
|
|
7317
7425
|
],
|
|
7318
7426
|
"frameworkCaveats": {
|
|
7319
7427
|
"customElements": [
|
|
7320
|
-
"Import ShellPage with BarTitle or BarWorkflow
|
|
7428
|
+
"Import ShellPage with BarTitle or BarWorkflow in slot=header and MobileHeader in slot=mobile-header, then render route content as default children.",
|
|
7321
7429
|
"Do not set BarTitle.variant while ShellPage owns headerPresentation."
|
|
7322
7430
|
],
|
|
7323
7431
|
"react": [
|
|
7324
|
-
"Render
|
|
7432
|
+
"Render the desktop header with slot=header and DsMobileHeader with slot=mobile-header inside DsShellPage.",
|
|
7325
7433
|
"Use contentInset none only for deliberately full-bleed page products."
|
|
7326
7434
|
],
|
|
7327
7435
|
"angular": [
|
|
7328
|
-
"Import the generated standalone DsShellPage adapter with
|
|
7436
|
+
"Import the generated standalone DsShellPage adapter with the desktop header and DsMobileHeader, preserve both header slots, and place router-outlet in the default slot.",
|
|
7329
7437
|
"Do not add another overflow auto wrapper around the routed page."
|
|
7330
7438
|
]
|
|
7331
7439
|
},
|
|
@@ -7357,6 +7465,10 @@
|
|
|
7357
7465
|
"headerPresentation": {
|
|
7358
7466
|
"type": "ShellPageHeaderPresentation",
|
|
7359
7467
|
"required": false
|
|
7468
|
+
},
|
|
7469
|
+
"responsiveMode": {
|
|
7470
|
+
"type": "ShellResponsiveMode",
|
|
7471
|
+
"required": false
|
|
7360
7472
|
}
|
|
7361
7473
|
},
|
|
7362
7474
|
"events": [],
|
|
@@ -7401,7 +7513,9 @@
|
|
|
7401
7513
|
"commonlyComposedWith": [
|
|
7402
7514
|
"component:ds-shell-app",
|
|
7403
7515
|
"component:ds-panel-tool-header",
|
|
7404
|
-
"component:ds-
|
|
7516
|
+
"component:ds-mobile-header",
|
|
7517
|
+
"component:ds-mobile-section-switcher",
|
|
7518
|
+
"component:ds-mobile-bar-nav"
|
|
7405
7519
|
],
|
|
7406
7520
|
"patterns": [
|
|
7407
7521
|
"pattern:application-shell"
|
|
@@ -7409,7 +7523,7 @@
|
|
|
7409
7523
|
"accessibility": [
|
|
7410
7524
|
"Only the active mobile tool view participates in focus or the accessibility tree.",
|
|
7411
7525
|
"Header Back and application-owned header actions preserve the PanelTools event contract.",
|
|
7412
|
-
"Inbox uses
|
|
7526
|
+
"Inbox uses the MobileSectionSwitcher popup trigger for Messages, Stacks, and Activity and never relies on a gesture-only interaction."
|
|
7413
7527
|
],
|
|
7414
7528
|
"states": [
|
|
7415
7529
|
"The application owns open and activeTool and replaces headers when tool depth changes.",
|
|
@@ -7418,7 +7532,7 @@
|
|
|
7418
7532
|
],
|
|
7419
7533
|
"responsiveBehavior": [
|
|
7420
7534
|
"Desktop and tablet compose PanelTools-compatible rail and drawer chrome.",
|
|
7421
|
-
"Mobile renders
|
|
7535
|
+
"Mobile renders one centered MobileHeader for every tool and presents Messages, Stacks, and Activity directly as peer section titles without an additional Inbox heading."
|
|
7422
7536
|
],
|
|
7423
7537
|
"frameworkCaveats": {
|
|
7424
7538
|
"customElements": [
|
|
@@ -7531,9 +7645,10 @@
|
|
|
7531
7645
|
"@ds-mo/tokens"
|
|
7532
7646
|
],
|
|
7533
7647
|
"componentDependencies": [
|
|
7534
|
-
"
|
|
7648
|
+
"button-unfilled",
|
|
7649
|
+
"mobile-header",
|
|
7535
7650
|
"panel-tools",
|
|
7536
|
-
"
|
|
7651
|
+
"tooltip"
|
|
7537
7652
|
]
|
|
7538
7653
|
},
|
|
7539
7654
|
{
|