@ds-mo/ui 8.0.1 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp +1 -1
- package/dist/agent.json +633 -29
- package/dist/angular/ds-badge.d.ts +1 -1
- package/dist/angular/ds-badge.js +3 -3
- package/dist/angular/ds-button-filled.d.ts +1 -1
- package/dist/angular/ds-button-filled.js +3 -3
- package/dist/angular/ds-button-unfilled.d.ts +1 -1
- package/dist/angular/ds-button-unfilled.js +3 -3
- package/dist/angular/ds-checkbox.d.ts +4 -1
- package/dist/angular/ds-checkbox.js +3 -3
- package/dist/angular/ds-empty-state.d.ts +1 -1
- package/dist/angular/ds-empty-state.js +3 -3
- package/dist/angular/ds-select-multi.d.ts +28 -0
- package/dist/angular/ds-select-multi.js +49 -0
- package/dist/angular/ds-select.d.ts +12 -2
- package/dist/angular/ds-select.js +11 -4
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +1 -0
- package/dist/angular/proxies.d.ts +1 -0
- package/dist/angular/proxies.js +1 -0
- package/dist/components/ds-app-shell.js +1 -1
- package/dist/components/ds-badge.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-nav.js.map +1 -1
- package/dist/components/ds-button-filled.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-card-data-viz-donut.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-card.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-line.js +1 -1
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-checkbox.js.map +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-divider.js +1 -1
- package/dist/components/ds-empty-state.js +1 -1
- package/dist/components/ds-empty-state.js.map +1 -1
- package/dist/components/ds-field.js +1 -1
- package/dist/components/ds-icon.js +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-pagination.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-nav.js.map +1 -1
- package/dist/components/ds-panel-sub-nav.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-radio-group.js +1 -1
- package/dist/components/ds-select-multi.d.ts +11 -0
- package/dist/components/ds-select-multi.js +2 -0
- package/dist/components/ds-select-multi.js.map +1 -0
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-select.js.map +1 -1
- package/dist/components/ds-shell-gradient-picker.js +1 -1
- package/dist/components/ds-shell-gradient-swatch.js +1 -1
- package/dist/components/ds-skeleton.js +1 -1
- package/dist/components/ds-slider.js +1 -1
- package/dist/components/ds-slider.js.map +1 -1
- package/dist/components/ds-switch.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-tab-group.js.map +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-text.js +1 -1
- package/dist/components/ds-tooltip-data-viz.js +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/{p-CPD_mML6.js → p-B2FhhQba.js} +2 -2
- package/dist/components/p-BEmVLLnN.js +2 -0
- package/dist/components/p-BEmVLLnN.js.map +1 -0
- package/dist/components/{p-DoZU8RH0.js → p-BMbadvZo.js} +2 -2
- package/dist/components/{p-B8ERbwc9.js → p-BcB-zkOx.js} +2 -2
- package/dist/components/p-COzps7J4.js +2 -0
- package/dist/components/p-COzps7J4.js.map +1 -0
- package/dist/components/p-CTmsQjsE.js +2 -0
- package/dist/components/p-CTmsQjsE.js.map +1 -0
- package/dist/components/p-C_cu-HIT.js +2 -0
- package/dist/components/p-C_cu-HIT.js.map +1 -0
- package/dist/components/{p-DavEAOUa.js → p-Ckiwpsgw.js} +2 -2
- package/dist/components/{p-Dt0XnMxc.js → p-CwaC4wLu.js} +2 -2
- package/dist/components/{p-Dt0XnMxc.js.map → p-CwaC4wLu.js.map} +1 -1
- package/dist/components/{p-clDpFcdU.js → p-DDBLO7bY.js} +2 -2
- package/dist/components/p-Du9UUSJ5.js +2 -0
- package/dist/components/p-Du9UUSJ5.js.map +1 -0
- package/dist/components/p-JsVSx7ZR.js +2 -0
- package/dist/components/p-JsVSx7ZR.js.map +1 -0
- package/dist/components/{p-3bRWSqaN.js → p-WdtWRvVr.js} +2 -2
- package/dist/components/{p-Mx6VFEQc.js → p-_zP4v-Al.js} +2 -2
- package/dist/components/p-_zP4v-Al.js.map +1 -0
- package/dist/components/{p-DsiueSMI.js → p-auwU64d8.js} +2 -2
- package/dist/components/p-f0a1l4Uc.js +2 -0
- package/dist/components/p-f0a1l4Uc.js.map +1 -0
- package/dist/docs/components.json +1974 -237
- package/dist/framework/angular.d.ts +1 -0
- package/dist/framework/angular.js +1 -0
- package/dist/framework/select-multi-value-accessor.d.ts +9 -0
- package/dist/framework/select-multi-value-accessor.js +40 -0
- package/dist/lib/components/Menu/menu-position.d.ts +6 -19
- package/dist/lib/utils/anchored-popup.d.ts +19 -0
- package/dist/react/components.d.ts +1 -0
- package/dist/react/components.js +1 -0
- package/dist/react/ds-select-multi.d.ts +14 -0
- package/dist/react/ds-select-multi.js +16 -0
- package/dist/react/ds-select.d.ts +2 -0
- package/dist/react/ds-select.js +5 -1
- package/dist/types/components/Badge/Badge.d.ts +2 -0
- package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +2 -0
- package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +2 -0
- package/dist/types/components/Checkbox/Checkbox.d.ts +16 -0
- package/dist/types/components/Checkbox/index.d.ts +1 -1
- package/dist/types/components/EmptyState/EmptyState.d.ts +6 -5
- package/dist/types/components/Menu/menu-position.d.ts +6 -19
- package/dist/types/components/Select/Select.d.ts +94 -48
- package/dist/types/components/Select/index.d.ts +1 -1
- package/dist/types/components/SelectMulti/SelectMulti.d.ts +131 -0
- package/dist/types/components/SelectMulti/index.d.ts +2 -0
- package/dist/types/components/Text/Text.d.ts +1 -0
- package/dist/types/components.d.ts +683 -55
- package/dist/types/utils/anchored-popup.d.ts +20 -0
- package/dist/types/utils/choice-list-parts.d.ts +33 -0
- package/dist/types/utils/choice-list.d.ts +26 -0
- package/package.json +2 -2
- package/dist/components/p-Ca1H1HPf.js +0 -2
- package/dist/components/p-Ca1H1HPf.js.map +0 -1
- package/dist/components/p-CpX87AQy.js +0 -2
- package/dist/components/p-CpX87AQy.js.map +0 -1
- package/dist/components/p-CyMmsNCF.js +0 -2
- package/dist/components/p-CyMmsNCF.js.map +0 -1
- package/dist/components/p-Mx6VFEQc.js.map +0 -1
- /package/dist/components/{p-CPD_mML6.js.map → p-B2FhhQba.js.map} +0 -0
- /package/dist/components/{p-DoZU8RH0.js.map → p-BMbadvZo.js.map} +0 -0
- /package/dist/components/{p-B8ERbwc9.js.map → p-BcB-zkOx.js.map} +0 -0
- /package/dist/components/{p-DavEAOUa.js.map → p-Ckiwpsgw.js.map} +0 -0
- /package/dist/components/{p-clDpFcdU.js.map → p-DDBLO7bY.js.map} +0 -0
- /package/dist/components/{p-3bRWSqaN.js.map → p-WdtWRvVr.js.map} +0 -0
- /package/dist/components/{p-DsiueSMI.js.map → p-auwU64d8.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": "8.0
|
|
4
|
+
"packageVersion": "8.1.0",
|
|
5
5
|
"kind": "components",
|
|
6
6
|
"entries": [
|
|
7
7
|
{
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
"useWhen": [
|
|
140
140
|
"An existing control, navigation item, or label needs a compact unread notification count.",
|
|
141
141
|
"An owning element needs a small visual dot indicating that supplemental notification information exists.",
|
|
142
|
-
"
|
|
142
|
+
"When the badge overlaps an icon or content, the immediate backing surface can be identified so its separation ring matches."
|
|
143
143
|
],
|
|
144
144
|
"avoidWhen": [
|
|
145
145
|
"The status must stand alone without an owning label or control.",
|
|
@@ -182,8 +182,9 @@
|
|
|
182
182
|
"Non-positive counter values hide the badge.",
|
|
183
183
|
"Counts above the configured compact limit display the limit with a plus suffix while accessible text retains meaningful context.",
|
|
184
184
|
"Badge keeps one brand treatment; semantic severity belongs to another component or adjacent content.",
|
|
185
|
-
"
|
|
186
|
-
"
|
|
185
|
+
"Use the ring only when Badge overlaps an icon or other content. Disable it in a reserved safe-area slot.",
|
|
186
|
+
"When enabled, the ring matches the immediate backing surface for both variants. Use a direct ring override only for a component-local fill that no surface preset represents.",
|
|
187
|
+
"Enabled shell gradient rings align automatically inside active AppShell gradient chrome and may be explicitly enabled or disabled when composition requires it."
|
|
187
188
|
],
|
|
188
189
|
"responsiveBehavior": [
|
|
189
190
|
"The owning control or layout positions Badge and decides whether notification indicators remain visible, condense, or move at responsive breakpoints.",
|
|
@@ -221,6 +222,10 @@
|
|
|
221
222
|
"type": "boolean",
|
|
222
223
|
"required": false
|
|
223
224
|
},
|
|
225
|
+
"hasRing": {
|
|
226
|
+
"type": "boolean",
|
|
227
|
+
"required": false
|
|
228
|
+
},
|
|
224
229
|
"label": {
|
|
225
230
|
"type": "string | undefined",
|
|
226
231
|
"required": false
|
|
@@ -523,6 +528,7 @@
|
|
|
523
528
|
"Use only one filled action per local decision area; render all secondary actions with ButtonUnfilled.",
|
|
524
529
|
"Choose brand or neutral for general commands. Reserve positive, negative, warning, and caution for matching action consequences, and AI, guide, or walkthrough for actions that enter those feature experiences.",
|
|
525
530
|
"Contrast serves both surface adaptation and hierarchy, but never permits a second filled action in the same decision area.",
|
|
531
|
+
"Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, intent, or interaction semantics.",
|
|
526
532
|
"Loading prevents duplicate activation without applying inactive opacity.",
|
|
527
533
|
"Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width."
|
|
528
534
|
],
|
|
@@ -577,6 +583,10 @@
|
|
|
577
583
|
"type": "string",
|
|
578
584
|
"required": false
|
|
579
585
|
},
|
|
586
|
+
"rounded": {
|
|
587
|
+
"type": "boolean",
|
|
588
|
+
"required": false
|
|
589
|
+
},
|
|
580
590
|
"size": {
|
|
581
591
|
"type": "ButtonFilledSize",
|
|
582
592
|
"required": false
|
|
@@ -676,6 +686,7 @@
|
|
|
676
686
|
"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.",
|
|
677
687
|
"Surface context must match the actual parent surface; translucent, inverted, media, and always-dark treatments are reserved for those surfaces.",
|
|
678
688
|
"Loading prevents duplicate activation without applying inactive opacity.",
|
|
689
|
+
"Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, or interaction semantics.",
|
|
679
690
|
"Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width."
|
|
680
691
|
],
|
|
681
692
|
"responsiveBehavior": [
|
|
@@ -763,6 +774,10 @@
|
|
|
763
774
|
"type": "boolean | undefined",
|
|
764
775
|
"required": false
|
|
765
776
|
},
|
|
777
|
+
"rounded": {
|
|
778
|
+
"type": "boolean",
|
|
779
|
+
"required": false
|
|
780
|
+
},
|
|
766
781
|
"size": {
|
|
767
782
|
"type": "ButtonUnfilledSize",
|
|
768
783
|
"required": false
|
|
@@ -1164,9 +1179,84 @@
|
|
|
1164
1179
|
"tag": "ds-checkbox",
|
|
1165
1180
|
"name": "checkbox",
|
|
1166
1181
|
"title": "Checkbox",
|
|
1167
|
-
"summary": "
|
|
1168
|
-
"intentStatus": "
|
|
1169
|
-
"intent":
|
|
1182
|
+
"summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and three density states.",
|
|
1183
|
+
"intentStatus": "complete",
|
|
1184
|
+
"intent": {
|
|
1185
|
+
"audience": "general",
|
|
1186
|
+
"status": "stable",
|
|
1187
|
+
"summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and three density states.",
|
|
1188
|
+
"useWhen": [
|
|
1189
|
+
"A user may independently select zero or more choices.",
|
|
1190
|
+
"A form requires acknowledgment, consent, or an opt-in value before submission.",
|
|
1191
|
+
"A composite multi-select option needs a presentation-only checkbox indicator."
|
|
1192
|
+
],
|
|
1193
|
+
"avoidWhen": [
|
|
1194
|
+
"Exactly one option must be chosen from a mutually exclusive set.",
|
|
1195
|
+
"A binary setting takes effect immediately rather than being submitted or confirmed.",
|
|
1196
|
+
"The control triggers a one-time command instead of maintaining selection state."
|
|
1197
|
+
],
|
|
1198
|
+
"alternatives": [
|
|
1199
|
+
{
|
|
1200
|
+
"when": "Exactly one option must be chosen from a mutually exclusive set.",
|
|
1201
|
+
"component": "component:ds-radio-group",
|
|
1202
|
+
"reason": "RadioGroup communicates one-of-many selection."
|
|
1203
|
+
},
|
|
1204
|
+
{
|
|
1205
|
+
"when": "A binary setting takes effect immediately.",
|
|
1206
|
+
"component": "component:ds-switch",
|
|
1207
|
+
"reason": "Switch communicates an immediately applied on/off setting."
|
|
1208
|
+
},
|
|
1209
|
+
{
|
|
1210
|
+
"when": "The interaction triggers a one-time command.",
|
|
1211
|
+
"component": "component:ds-button-filled",
|
|
1212
|
+
"reason": "Button semantics communicate an action rather than persistent selection."
|
|
1213
|
+
}
|
|
1214
|
+
],
|
|
1215
|
+
"commonlyComposedWith": [
|
|
1216
|
+
"component:ds-field",
|
|
1217
|
+
"component:ds-select-multi",
|
|
1218
|
+
"component:ds-text"
|
|
1219
|
+
],
|
|
1220
|
+
"accessibility": [
|
|
1221
|
+
"Every interactive checkbox requires a visible label that provides its accessible name.",
|
|
1222
|
+
"Enter and Space activate the checkbox; checked and mixed state are exposed through aria-checked.",
|
|
1223
|
+
"Disabled and inactive checkboxes leave the tab order and are omitted from form submission.",
|
|
1224
|
+
"Use presentation mode only inside a composite option that owns selection semantics, focus, and interaction."
|
|
1225
|
+
],
|
|
1226
|
+
"states": [
|
|
1227
|
+
"Every box keeps a 1px inset secondary border and 2px radius, including when selected. Checked renders the box-sized Check icon and indeterminate renders the box-sized Subtract icon on a brand fill.",
|
|
1228
|
+
"Activating an indeterminate checkbox clears the mixed state, toggles checked, and emits dsChange with the resulting boolean.",
|
|
1229
|
+
"The initial checked and indeterminate values are restored by native form reset; checked values submit under name and unchecked values submit nothing.",
|
|
1230
|
+
"Sizes are md with a 16px box in a 20px placement, sm with a 12px box in a 16px placement, and xs with an 8px box in a 12px placement.",
|
|
1231
|
+
"Presentation mode removes checkbox semantics, focus, interaction, label rendering, and form submission while preserving the visual state."
|
|
1232
|
+
],
|
|
1233
|
+
"responsiveBehavior": [
|
|
1234
|
+
"Choose size from the density of the containing row; labels may wrap while the placement box stays fixed.",
|
|
1235
|
+
"Use the md indicator centered by the shared 20px option icon zone in multi-select rows."
|
|
1236
|
+
],
|
|
1237
|
+
"frameworkCaveats": {
|
|
1238
|
+
"customElements": [
|
|
1239
|
+
"Bind checked and indeterminate as properties for application state updates and listen for dsChange.",
|
|
1240
|
+
"Use the form attribute on the host when associating a checkbox rendered outside its owning form."
|
|
1241
|
+
],
|
|
1242
|
+
"react": [
|
|
1243
|
+
"Use DsCheckbox and handle onDsChange; checked and indeterminate are mutable and update after user activation."
|
|
1244
|
+
],
|
|
1245
|
+
"angular": [
|
|
1246
|
+
"Use DsCheckbox with checked binding and dsChange, or the generated boolean value accessor in Angular forms."
|
|
1247
|
+
]
|
|
1248
|
+
},
|
|
1249
|
+
"references": [
|
|
1250
|
+
{
|
|
1251
|
+
"label": "Storybook examples",
|
|
1252
|
+
"path": "src/wc/components/Checkbox/Checkbox.stories.ts"
|
|
1253
|
+
},
|
|
1254
|
+
{
|
|
1255
|
+
"label": "Cross-browser form and accessibility coverage",
|
|
1256
|
+
"path": "tests/e2e/forms.spec.ts"
|
|
1257
|
+
}
|
|
1258
|
+
]
|
|
1259
|
+
},
|
|
1170
1260
|
"api": {
|
|
1171
1261
|
"props": {
|
|
1172
1262
|
"checked": {
|
|
@@ -1193,6 +1283,10 @@
|
|
|
1193
1283
|
"type": "string | undefined",
|
|
1194
1284
|
"required": false
|
|
1195
1285
|
},
|
|
1286
|
+
"presentation": {
|
|
1287
|
+
"type": "boolean",
|
|
1288
|
+
"required": false
|
|
1289
|
+
},
|
|
1196
1290
|
"required": {
|
|
1197
1291
|
"type": "boolean",
|
|
1198
1292
|
"required": false
|
|
@@ -1201,6 +1295,10 @@
|
|
|
1201
1295
|
"type": "string",
|
|
1202
1296
|
"required": false
|
|
1203
1297
|
},
|
|
1298
|
+
"size": {
|
|
1299
|
+
"type": "CheckboxSize",
|
|
1300
|
+
"required": false
|
|
1301
|
+
},
|
|
1204
1302
|
"value": {
|
|
1205
1303
|
"type": "string",
|
|
1206
1304
|
"required": false
|
|
@@ -1221,9 +1319,11 @@
|
|
|
1221
1319
|
},
|
|
1222
1320
|
"dependencies": [
|
|
1223
1321
|
"@ds-mo/ui",
|
|
1224
|
-
"@ds-mo/tokens"
|
|
1322
|
+
"@ds-mo/tokens",
|
|
1323
|
+
"@ds-mo/icons"
|
|
1225
1324
|
],
|
|
1226
1325
|
"componentDependencies": [
|
|
1326
|
+
"icon",
|
|
1227
1327
|
"text"
|
|
1228
1328
|
]
|
|
1229
1329
|
},
|
|
@@ -1474,21 +1574,92 @@
|
|
|
1474
1574
|
"tag": "ds-empty-state",
|
|
1475
1575
|
"name": "empty-state",
|
|
1476
1576
|
"title": "EmptyState",
|
|
1477
|
-
"summary": "Centered
|
|
1478
|
-
"intentStatus": "
|
|
1479
|
-
"intent":
|
|
1577
|
+
"summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
|
|
1578
|
+
"intentStatus": "complete",
|
|
1579
|
+
"intent": {
|
|
1580
|
+
"audience": "general",
|
|
1581
|
+
"status": "stable",
|
|
1582
|
+
"summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
|
|
1583
|
+
"useWhen": [
|
|
1584
|
+
"A bounded content area is in a first-use, no-content, filtered no-results, or no-access state and needs a calm explanatory message tailored to that cause.",
|
|
1585
|
+
"A prominent empty region benefits from a decorative icon, visual title, and supporting body copy.",
|
|
1586
|
+
"A compact owner such as a Select popup needs only centered body copy."
|
|
1587
|
+
],
|
|
1588
|
+
"avoidWhen": [
|
|
1589
|
+
"Content is still loading; use Skeleton for predictable structure or Loader for an indeterminate operation.",
|
|
1590
|
+
"The state is an error, warning, or confirmation that needs semantic intent and announcement from the owning workflow.",
|
|
1591
|
+
"The state needs a recovery action, link, or other interactive content; the current EmptyState pattern is intentionally message-only.",
|
|
1592
|
+
"A decorative illustration, arbitrary rich content, or custom layout is required."
|
|
1593
|
+
],
|
|
1594
|
+
"alternatives": [
|
|
1595
|
+
{
|
|
1596
|
+
"when": "A content region is waiting for structured data.",
|
|
1597
|
+
"component": "component:ds-skeleton",
|
|
1598
|
+
"reason": "Skeleton preserves expected geometry while content is pending."
|
|
1599
|
+
},
|
|
1600
|
+
{
|
|
1601
|
+
"when": "An operation is progressing without predictable content structure.",
|
|
1602
|
+
"component": "component:ds-loader",
|
|
1603
|
+
"reason": "Loader owns indeterminate progress rather than an empty outcome."
|
|
1604
|
+
},
|
|
1605
|
+
{
|
|
1606
|
+
"when": "Only ordinary prose is needed without empty-state layout.",
|
|
1607
|
+
"component": "component:ds-text",
|
|
1608
|
+
"reason": "Text owns typography without adding centered empty-state composition."
|
|
1609
|
+
}
|
|
1610
|
+
],
|
|
1611
|
+
"commonlyComposedWith": [
|
|
1612
|
+
"component:ds-select",
|
|
1613
|
+
"component:ds-text",
|
|
1614
|
+
"component:ds-icon"
|
|
1615
|
+
],
|
|
1616
|
+
"accessibility": [
|
|
1617
|
+
"The optional icon is decorative; the title and body provide all meaning in text.",
|
|
1618
|
+
"EmptyState does not create a live region or alert automatically. The owner decides whether a dynamic transition requires announcement.",
|
|
1619
|
+
"The visual title does not impose a document heading level because the correct hierarchy belongs to the consuming page or region.",
|
|
1620
|
+
"Keep localized body copy concise and sufficient when using the body-only variant."
|
|
1621
|
+
],
|
|
1622
|
+
"states": [
|
|
1623
|
+
"Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
|
|
1624
|
+
"The decorative icon renders at xl in the primary foreground with an 8px gap before the text group and only when a title is also provided.",
|
|
1625
|
+
"The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
|
|
1626
|
+
"All content is centered. The owner supplies container size and surrounding padding; do not compose actions into or immediately alongside the current EmptyState pattern.",
|
|
1627
|
+
"First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
|
|
1628
|
+
],
|
|
1629
|
+
"responsiveBehavior": [
|
|
1630
|
+
"The owner controls available width and height; text wraps naturally while remaining centered.",
|
|
1631
|
+
"EmptyState does not infer breakpoints or change composition automatically."
|
|
1632
|
+
],
|
|
1633
|
+
"frameworkCaveats": {
|
|
1634
|
+
"customElements": [
|
|
1635
|
+
"Pass canonical IcoMo icon names and localized heading/body strings through properties or attributes."
|
|
1636
|
+
],
|
|
1637
|
+
"react": [
|
|
1638
|
+
"Choose one supported composition by passing body with optional heading and icon props."
|
|
1639
|
+
],
|
|
1640
|
+
"angular": [
|
|
1641
|
+
"Choose one supported composition by binding body with optional heading and icon inputs."
|
|
1642
|
+
]
|
|
1643
|
+
},
|
|
1644
|
+
"references": [
|
|
1645
|
+
{
|
|
1646
|
+
"label": "Storybook examples",
|
|
1647
|
+
"path": "src/wc/components/EmptyState/EmptyState.stories.ts"
|
|
1648
|
+
}
|
|
1649
|
+
]
|
|
1650
|
+
},
|
|
1480
1651
|
"api": {
|
|
1481
1652
|
"props": {
|
|
1482
|
-
"
|
|
1483
|
-
"type": "string
|
|
1653
|
+
"body": {
|
|
1654
|
+
"type": "string",
|
|
1484
1655
|
"required": false
|
|
1485
1656
|
},
|
|
1486
|
-
"
|
|
1487
|
-
"type": "
|
|
1657
|
+
"heading": {
|
|
1658
|
+
"type": "string | undefined",
|
|
1488
1659
|
"required": false
|
|
1489
1660
|
},
|
|
1490
|
-
"
|
|
1491
|
-
"type": "
|
|
1661
|
+
"icon": {
|
|
1662
|
+
"type": "string | undefined",
|
|
1492
1663
|
"required": false
|
|
1493
1664
|
}
|
|
1494
1665
|
},
|
|
@@ -1502,9 +1673,11 @@
|
|
|
1502
1673
|
},
|
|
1503
1674
|
"dependencies": [
|
|
1504
1675
|
"@ds-mo/ui",
|
|
1505
|
-
"@ds-mo/tokens"
|
|
1676
|
+
"@ds-mo/tokens",
|
|
1677
|
+
"@ds-mo/icons"
|
|
1506
1678
|
],
|
|
1507
1679
|
"componentDependencies": [
|
|
1680
|
+
"icon",
|
|
1508
1681
|
"text"
|
|
1509
1682
|
]
|
|
1510
1683
|
},
|
|
@@ -1870,15 +2043,15 @@
|
|
|
1870
2043
|
"tag": "ds-menu",
|
|
1871
2044
|
"name": "menu",
|
|
1872
2045
|
"title": "Menu",
|
|
1873
|
-
"summary": "Anchored action
|
|
2046
|
+
"summary": "Anchored action menu with flat commands, grouped sections, selected command state, supplemental notification dots, switches, and destructive actions.",
|
|
1874
2047
|
"intentStatus": "complete",
|
|
1875
2048
|
"intent": {
|
|
1876
2049
|
"audience": "general",
|
|
1877
2050
|
"status": "stable",
|
|
1878
|
-
"summary": "Anchored action
|
|
2051
|
+
"summary": "Anchored action menu with flat commands, grouped sections, selected command state, supplemental notification dots, switches, and destructive actions.",
|
|
1879
2052
|
"useWhen": [
|
|
1880
|
-
"A trigger reveals a short contextual list of commands or
|
|
1881
|
-
"
|
|
2053
|
+
"A trigger reveals a short contextual list of commands or state-changing actions.",
|
|
2054
|
+
"Actions need grouping, selected state, supplemental notification dots, switch rows, or destructive treatment."
|
|
1882
2055
|
],
|
|
1883
2056
|
"avoidWhen": [
|
|
1884
2057
|
"The user is selecting a value for a form field.",
|
|
@@ -1891,6 +2064,11 @@
|
|
|
1891
2064
|
"component": "component:ds-select",
|
|
1892
2065
|
"reason": "Select provides form-control semantics and value ownership."
|
|
1893
2066
|
},
|
|
2067
|
+
{
|
|
2068
|
+
"when": "Several form values may be selected.",
|
|
2069
|
+
"component": "component:ds-select-multi",
|
|
2070
|
+
"reason": "SelectMulti provides multi-select listbox semantics, array value ownership, and count presentation."
|
|
2071
|
+
},
|
|
1894
2072
|
{
|
|
1895
2073
|
"when": "The interaction needs substantial content, confirmation, or a form.",
|
|
1896
2074
|
"component": "component:ds-modal",
|
|
@@ -2732,15 +2910,119 @@
|
|
|
2732
2910
|
"tag": "ds-select",
|
|
2733
2911
|
"name": "select",
|
|
2734
2912
|
"title": "Select",
|
|
2735
|
-
"summary": "
|
|
2736
|
-
"intentStatus": "
|
|
2737
|
-
"intent":
|
|
2913
|
+
"summary": "Form-associated single-value select with listbox semantics, local search, rich flat options, grouped sections, loading, clearing, and surface-aware trigger chrome.",
|
|
2914
|
+
"intentStatus": "complete",
|
|
2915
|
+
"intent": {
|
|
2916
|
+
"audience": "general",
|
|
2917
|
+
"status": "stable",
|
|
2918
|
+
"summary": "Form-associated single-value select with listbox semantics, local search, rich flat options, grouped sections, loading, clearing, and surface-aware trigger chrome.",
|
|
2919
|
+
"useWhen": [
|
|
2920
|
+
"The user must choose one value from a finite set.",
|
|
2921
|
+
"The option set benefits from local search, subtext, prefix icons, grouping, or disabled choices.",
|
|
2922
|
+
"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.",
|
|
2923
|
+
"The selected value must participate in native, Angular, or React form state."
|
|
2924
|
+
],
|
|
2925
|
+
"avoidWhen": [
|
|
2926
|
+
"Several values may be selected at once.",
|
|
2927
|
+
"The rows perform commands rather than choosing a form value.",
|
|
2928
|
+
"The choices form a hierarchy with expandable parents."
|
|
2929
|
+
],
|
|
2930
|
+
"alternatives": [
|
|
2931
|
+
{
|
|
2932
|
+
"when": "Several independent values may be selected.",
|
|
2933
|
+
"component": "component:ds-select-multi",
|
|
2934
|
+
"reason": "SelectMulti owns array values, multi-selection semantics, and count presentation."
|
|
2935
|
+
},
|
|
2936
|
+
{
|
|
2937
|
+
"when": "The popup contains commands or state-changing actions.",
|
|
2938
|
+
"component": "component:ds-menu",
|
|
2939
|
+
"reason": "Menu uses action-menu roles and command-focused keyboard behavior."
|
|
2940
|
+
},
|
|
2941
|
+
{
|
|
2942
|
+
"when": "A small set of choices should remain visible.",
|
|
2943
|
+
"component": "component:ds-radio-group",
|
|
2944
|
+
"reason": "Prefer RadioGroup for roughly two to five mutually exclusive choices when the available space allows all choices to remain visible."
|
|
2945
|
+
}
|
|
2946
|
+
],
|
|
2947
|
+
"commonlyComposedWith": [
|
|
2948
|
+
"component:ds-text",
|
|
2949
|
+
"component:ds-icon",
|
|
2950
|
+
"component:ds-empty-state",
|
|
2951
|
+
"component:ds-loader"
|
|
2952
|
+
],
|
|
2953
|
+
"accessibility": [
|
|
2954
|
+
"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.",
|
|
2955
|
+
"The trigger uses combobox semantics and the popup uses listbox and option semantics; do not replace them with menu roles.",
|
|
2956
|
+
"Disabled options remain visible, expose aria-disabled, and are skipped by keyboard navigation and typeahead.",
|
|
2957
|
+
"Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
|
|
2958
|
+
"Selected options rely on active fill and foreground treatment without a redundant trailing check icon.",
|
|
2959
|
+
"Local search moves focus into the search field while preserving the active option through aria-activedescendant.",
|
|
2960
|
+
"Use errorMessage with error so the trigger is described by the rendered alert."
|
|
2961
|
+
],
|
|
2962
|
+
"states": [
|
|
2963
|
+
"Value is controlled through the mutable value property; dsChange reports user selection and clearing.",
|
|
2964
|
+
"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.",
|
|
2965
|
+
"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.",
|
|
2966
|
+
"Clearing emits dsChange with an empty string and dsClear, keeps the popup open, and restores useful focus.",
|
|
2967
|
+
"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.",
|
|
2968
|
+
"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.",
|
|
2969
|
+
"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.",
|
|
2970
|
+
"Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
|
|
2971
|
+
"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.",
|
|
2972
|
+
"Option labels and the selected trigger label stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
|
|
2973
|
+
"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.",
|
|
2974
|
+
"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.",
|
|
2975
|
+
"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.",
|
|
2976
|
+
"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.",
|
|
2977
|
+
"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.",
|
|
2978
|
+
"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.",
|
|
2979
|
+
"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.",
|
|
2980
|
+
"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.",
|
|
2981
|
+
"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.",
|
|
2982
|
+
"Use options for a flat list or sections for grouped choices; when sections are present they take precedence.",
|
|
2983
|
+
"The background prop describes the actual parent surface and uses the same surface set as ButtonUnfilled."
|
|
2984
|
+
],
|
|
2985
|
+
"responsiveBehavior": [
|
|
2986
|
+
"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.",
|
|
2987
|
+
"The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
|
|
2988
|
+
"Long option collections scroll inside the popup; virtualization and remote search are not part of this component."
|
|
2989
|
+
],
|
|
2990
|
+
"frameworkCaveats": {
|
|
2991
|
+
"customElements": [
|
|
2992
|
+
"Assign options and sections through JavaScript properties because arrays and objects cannot be represented safely as attributes."
|
|
2993
|
+
],
|
|
2994
|
+
"react": [
|
|
2995
|
+
"Pass options or sections as wrapper props and handle onDsChange, onDsClear, and onDsOpenChange."
|
|
2996
|
+
],
|
|
2997
|
+
"angular": [
|
|
2998
|
+
"Import DsSelect and SelectValueAccessor when integrating with Angular Forms; bind options and sections as properties."
|
|
2999
|
+
]
|
|
3000
|
+
},
|
|
3001
|
+
"references": [
|
|
3002
|
+
{
|
|
3003
|
+
"label": "Storybook examples",
|
|
3004
|
+
"path": "src/wc/components/Select/Select.stories.ts"
|
|
3005
|
+
},
|
|
3006
|
+
{
|
|
3007
|
+
"label": "Selection patterns",
|
|
3008
|
+
"path": "src/docs/SelectionPatterns.mdx"
|
|
3009
|
+
}
|
|
3010
|
+
]
|
|
3011
|
+
},
|
|
2738
3012
|
"api": {
|
|
2739
3013
|
"props": {
|
|
2740
3014
|
"activeFill": {
|
|
2741
3015
|
"type": "boolean",
|
|
2742
3016
|
"required": false
|
|
2743
3017
|
},
|
|
3018
|
+
"allowClear": {
|
|
3019
|
+
"type": "boolean",
|
|
3020
|
+
"required": false
|
|
3021
|
+
},
|
|
3022
|
+
"ariaDescribedby": {
|
|
3023
|
+
"type": "string | undefined",
|
|
3024
|
+
"required": false
|
|
3025
|
+
},
|
|
2744
3026
|
"ariaLabel": {
|
|
2745
3027
|
"type": "string | null",
|
|
2746
3028
|
"required": false
|
|
@@ -2749,22 +3031,62 @@
|
|
|
2749
3031
|
"type": "string | undefined",
|
|
2750
3032
|
"required": false
|
|
2751
3033
|
},
|
|
3034
|
+
"background": {
|
|
3035
|
+
"type": "SelectBackground | undefined",
|
|
3036
|
+
"required": false
|
|
3037
|
+
},
|
|
3038
|
+
"clearLabel": {
|
|
3039
|
+
"type": "string",
|
|
3040
|
+
"required": false
|
|
3041
|
+
},
|
|
2752
3042
|
"disabled": {
|
|
2753
3043
|
"type": "boolean",
|
|
2754
3044
|
"required": false
|
|
2755
3045
|
},
|
|
3046
|
+
"error": {
|
|
3047
|
+
"type": "boolean",
|
|
3048
|
+
"required": false
|
|
3049
|
+
},
|
|
3050
|
+
"errorMessage": {
|
|
3051
|
+
"type": "string | undefined",
|
|
3052
|
+
"required": false
|
|
3053
|
+
},
|
|
2756
3054
|
"hasBorder": {
|
|
2757
3055
|
"type": "boolean",
|
|
2758
3056
|
"required": false
|
|
2759
3057
|
},
|
|
3058
|
+
"icon": {
|
|
3059
|
+
"type": "string | undefined",
|
|
3060
|
+
"required": false
|
|
3061
|
+
},
|
|
3062
|
+
"inputId": {
|
|
3063
|
+
"type": "string | undefined",
|
|
3064
|
+
"required": false
|
|
3065
|
+
},
|
|
2760
3066
|
"isInactive": {
|
|
2761
3067
|
"type": "boolean",
|
|
2762
3068
|
"required": false
|
|
2763
3069
|
},
|
|
3070
|
+
"isLoading": {
|
|
3071
|
+
"type": "boolean",
|
|
3072
|
+
"required": false
|
|
3073
|
+
},
|
|
3074
|
+
"loadingLabel": {
|
|
3075
|
+
"type": "string",
|
|
3076
|
+
"required": false
|
|
3077
|
+
},
|
|
2764
3078
|
"name": {
|
|
2765
3079
|
"type": "string | undefined",
|
|
2766
3080
|
"required": false
|
|
2767
3081
|
},
|
|
3082
|
+
"noResultsText": {
|
|
3083
|
+
"type": "string",
|
|
3084
|
+
"required": false
|
|
3085
|
+
},
|
|
3086
|
+
"open": {
|
|
3087
|
+
"type": "boolean",
|
|
3088
|
+
"required": false
|
|
3089
|
+
},
|
|
2768
3090
|
"options": {
|
|
2769
3091
|
"type": "SelectOption[]",
|
|
2770
3092
|
"required": false
|
|
@@ -2781,6 +3103,18 @@
|
|
|
2781
3103
|
"type": "string",
|
|
2782
3104
|
"required": false
|
|
2783
3105
|
},
|
|
3106
|
+
"searchPlaceholder": {
|
|
3107
|
+
"type": "string",
|
|
3108
|
+
"required": false
|
|
3109
|
+
},
|
|
3110
|
+
"searchable": {
|
|
3111
|
+
"type": "boolean",
|
|
3112
|
+
"required": false
|
|
3113
|
+
},
|
|
3114
|
+
"sections": {
|
|
3115
|
+
"type": "SelectSection[]",
|
|
3116
|
+
"required": false
|
|
3117
|
+
},
|
|
2784
3118
|
"size": {
|
|
2785
3119
|
"type": "SelectSize",
|
|
2786
3120
|
"required": false
|
|
@@ -2798,6 +3132,14 @@
|
|
|
2798
3132
|
{
|
|
2799
3133
|
"name": "dsChange",
|
|
2800
3134
|
"detail": "string"
|
|
3135
|
+
},
|
|
3136
|
+
{
|
|
3137
|
+
"name": "dsClear",
|
|
3138
|
+
"detail": "void"
|
|
3139
|
+
},
|
|
3140
|
+
{
|
|
3141
|
+
"name": "dsOpenChange",
|
|
3142
|
+
"detail": "boolean"
|
|
2801
3143
|
}
|
|
2802
3144
|
],
|
|
2803
3145
|
"slots": []
|
|
@@ -2813,8 +3155,270 @@
|
|
|
2813
3155
|
"@ds-mo/icons"
|
|
2814
3156
|
],
|
|
2815
3157
|
"componentDependencies": [
|
|
3158
|
+
"button-unfilled",
|
|
3159
|
+
"empty-state",
|
|
2816
3160
|
"icon",
|
|
2817
|
-
"
|
|
3161
|
+
"loader",
|
|
3162
|
+
"text"
|
|
3163
|
+
]
|
|
3164
|
+
},
|
|
3165
|
+
{
|
|
3166
|
+
"id": "component:ds-select-multi",
|
|
3167
|
+
"tag": "ds-select-multi",
|
|
3168
|
+
"name": "select-multi",
|
|
3169
|
+
"title": "SelectMulti",
|
|
3170
|
+
"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.",
|
|
3171
|
+
"intentStatus": "complete",
|
|
3172
|
+
"intent": {
|
|
3173
|
+
"audience": "general",
|
|
3174
|
+
"status": "stable",
|
|
3175
|
+
"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.",
|
|
3176
|
+
"useWhen": [
|
|
3177
|
+
"The user may choose several independent values from one finite set.",
|
|
3178
|
+
"A compact trigger should summarize selection with the field label and a count.",
|
|
3179
|
+
"The option set benefits from local search, subtext, grouping, or disabled choices.",
|
|
3180
|
+
"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."
|
|
3181
|
+
],
|
|
3182
|
+
"avoidWhen": [
|
|
3183
|
+
"Exactly one value may be selected.",
|
|
3184
|
+
"Selected values must remain individually removable as persistent tags outside the popup.",
|
|
3185
|
+
"The choices form a hierarchy with cascading parent selection.",
|
|
3186
|
+
"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."
|
|
3187
|
+
],
|
|
3188
|
+
"alternatives": [
|
|
3189
|
+
{
|
|
3190
|
+
"when": "Exactly one value may be selected.",
|
|
3191
|
+
"component": "component:ds-select",
|
|
3192
|
+
"reason": "Select owns scalar form value and single-select listbox behavior."
|
|
3193
|
+
},
|
|
3194
|
+
{
|
|
3195
|
+
"when": "The popup contains actions rather than values.",
|
|
3196
|
+
"component": "component:ds-menu",
|
|
3197
|
+
"reason": "Menu uses command semantics and closes according to action-menu expectations."
|
|
3198
|
+
}
|
|
3199
|
+
],
|
|
3200
|
+
"commonlyComposedWith": [
|
|
3201
|
+
"component:ds-text",
|
|
3202
|
+
"component:ds-checkbox",
|
|
3203
|
+
"component:ds-empty-state",
|
|
3204
|
+
"component:ds-loader"
|
|
3205
|
+
],
|
|
3206
|
+
"accessibility": [
|
|
3207
|
+
"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.",
|
|
3208
|
+
"The popup is a listbox with aria-multiselectable and every option exposes its independent aria-selected state.",
|
|
3209
|
+
"Disabled options expose aria-disabled and are skipped by keyboard navigation and typeahead.",
|
|
3210
|
+
"Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
|
|
3211
|
+
"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.",
|
|
3212
|
+
"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.",
|
|
3213
|
+
"Use errorMessage with error so the trigger is described by the rendered alert."
|
|
3214
|
+
],
|
|
3215
|
+
"states": [
|
|
3216
|
+
"Values is a controlled JavaScript array; dsChange emits a new array after each user toggle.",
|
|
3217
|
+
"Required SelectMulti controls begin without an automatic selection and require the user to make an explicit choice.",
|
|
3218
|
+
"Selecting an option keeps the popup open so additional values can be toggled.",
|
|
3219
|
+
"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.",
|
|
3220
|
+
"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.",
|
|
3221
|
+
"Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
|
|
3222
|
+
"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.",
|
|
3223
|
+
"Option labels stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
|
|
3224
|
+
"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.",
|
|
3225
|
+
"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.",
|
|
3226
|
+
"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.",
|
|
3227
|
+
"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.",
|
|
3228
|
+
"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.",
|
|
3229
|
+
"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.",
|
|
3230
|
+
"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.",
|
|
3231
|
+
"Clear-all emits an empty dsChange and dsClear while preserving useful popup or search focus.",
|
|
3232
|
+
"Loading keeps the trigger visible, marks the control busy, and makes selection interaction temporarily unavailable without presenting the control as inactive.",
|
|
3233
|
+
"SelectMulti has no maximum-selection behavior; every available non-inactive option may be selected.",
|
|
3234
|
+
"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.",
|
|
3235
|
+
"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.",
|
|
3236
|
+
"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.",
|
|
3237
|
+
"Native form submission emits one entry per selected value under the component name.",
|
|
3238
|
+
"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."
|
|
3239
|
+
],
|
|
3240
|
+
"responsiveBehavior": [
|
|
3241
|
+
"Use width fill for form fields and width hug for compact filter bars; the persistent trigger label avoids variable-width selected labels.",
|
|
3242
|
+
"The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
|
|
3243
|
+
"Long option collections scroll inside the popup; virtualization and remote search are not part of this version."
|
|
3244
|
+
],
|
|
3245
|
+
"frameworkCaveats": {
|
|
3246
|
+
"customElements": [
|
|
3247
|
+
"Assign values, options, and sections through JavaScript properties; array values cannot be represented safely as attributes."
|
|
3248
|
+
],
|
|
3249
|
+
"react": [
|
|
3250
|
+
"Pass values, options, and sections as wrapper props and handle onDsChange, onDsClear, and onDsOpenChange."
|
|
3251
|
+
],
|
|
3252
|
+
"angular": [
|
|
3253
|
+
"Import DsSelectMulti and SelectMultiValueAccessor when integrating with Angular Forms."
|
|
3254
|
+
]
|
|
3255
|
+
},
|
|
3256
|
+
"references": [
|
|
3257
|
+
{
|
|
3258
|
+
"label": "Storybook examples",
|
|
3259
|
+
"path": "src/wc/components/SelectMulti/SelectMulti.stories.ts"
|
|
3260
|
+
},
|
|
3261
|
+
{
|
|
3262
|
+
"label": "Selection patterns",
|
|
3263
|
+
"path": "src/docs/SelectionPatterns.mdx"
|
|
3264
|
+
}
|
|
3265
|
+
]
|
|
3266
|
+
},
|
|
3267
|
+
"api": {
|
|
3268
|
+
"props": {
|
|
3269
|
+
"activeFill": {
|
|
3270
|
+
"type": "boolean",
|
|
3271
|
+
"required": false
|
|
3272
|
+
},
|
|
3273
|
+
"allowClear": {
|
|
3274
|
+
"type": "boolean",
|
|
3275
|
+
"required": false
|
|
3276
|
+
},
|
|
3277
|
+
"ariaDescribedby": {
|
|
3278
|
+
"type": "string | undefined",
|
|
3279
|
+
"required": false
|
|
3280
|
+
},
|
|
3281
|
+
"ariaLabel": {
|
|
3282
|
+
"type": "string | null",
|
|
3283
|
+
"required": false
|
|
3284
|
+
},
|
|
3285
|
+
"ariaLabelledby": {
|
|
3286
|
+
"type": "string | undefined",
|
|
3287
|
+
"required": false
|
|
3288
|
+
},
|
|
3289
|
+
"background": {
|
|
3290
|
+
"type": "SelectMultiBackground | undefined",
|
|
3291
|
+
"required": false
|
|
3292
|
+
},
|
|
3293
|
+
"clearLabel": {
|
|
3294
|
+
"type": "string",
|
|
3295
|
+
"required": false
|
|
3296
|
+
},
|
|
3297
|
+
"disabled": {
|
|
3298
|
+
"type": "boolean",
|
|
3299
|
+
"required": false
|
|
3300
|
+
},
|
|
3301
|
+
"error": {
|
|
3302
|
+
"type": "boolean",
|
|
3303
|
+
"required": false
|
|
3304
|
+
},
|
|
3305
|
+
"errorMessage": {
|
|
3306
|
+
"type": "string | undefined",
|
|
3307
|
+
"required": false
|
|
3308
|
+
},
|
|
3309
|
+
"hasBorder": {
|
|
3310
|
+
"type": "boolean",
|
|
3311
|
+
"required": false
|
|
3312
|
+
},
|
|
3313
|
+
"icon": {
|
|
3314
|
+
"type": "string | undefined",
|
|
3315
|
+
"required": false
|
|
3316
|
+
},
|
|
3317
|
+
"inputId": {
|
|
3318
|
+
"type": "string | undefined",
|
|
3319
|
+
"required": false
|
|
3320
|
+
},
|
|
3321
|
+
"isInactive": {
|
|
3322
|
+
"type": "boolean",
|
|
3323
|
+
"required": false
|
|
3324
|
+
},
|
|
3325
|
+
"isLoading": {
|
|
3326
|
+
"type": "boolean",
|
|
3327
|
+
"required": false
|
|
3328
|
+
},
|
|
3329
|
+
"loadingLabel": {
|
|
3330
|
+
"type": "string",
|
|
3331
|
+
"required": false
|
|
3332
|
+
},
|
|
3333
|
+
"name": {
|
|
3334
|
+
"type": "string | undefined",
|
|
3335
|
+
"required": false
|
|
3336
|
+
},
|
|
3337
|
+
"noResultsText": {
|
|
3338
|
+
"type": "string",
|
|
3339
|
+
"required": false
|
|
3340
|
+
},
|
|
3341
|
+
"open": {
|
|
3342
|
+
"type": "boolean",
|
|
3343
|
+
"required": false
|
|
3344
|
+
},
|
|
3345
|
+
"options": {
|
|
3346
|
+
"type": "SelectMultiOption[]",
|
|
3347
|
+
"required": false
|
|
3348
|
+
},
|
|
3349
|
+
"placeholder": {
|
|
3350
|
+
"type": "string",
|
|
3351
|
+
"required": false
|
|
3352
|
+
},
|
|
3353
|
+
"required": {
|
|
3354
|
+
"type": "boolean",
|
|
3355
|
+
"required": false
|
|
3356
|
+
},
|
|
3357
|
+
"requiredMessage": {
|
|
3358
|
+
"type": "string",
|
|
3359
|
+
"required": false
|
|
3360
|
+
},
|
|
3361
|
+
"searchPlaceholder": {
|
|
3362
|
+
"type": "string",
|
|
3363
|
+
"required": false
|
|
3364
|
+
},
|
|
3365
|
+
"searchable": {
|
|
3366
|
+
"type": "boolean",
|
|
3367
|
+
"required": false
|
|
3368
|
+
},
|
|
3369
|
+
"sections": {
|
|
3370
|
+
"type": "SelectMultiSection[]",
|
|
3371
|
+
"required": false
|
|
3372
|
+
},
|
|
3373
|
+
"selectedLabel": {
|
|
3374
|
+
"type": "string",
|
|
3375
|
+
"required": false
|
|
3376
|
+
},
|
|
3377
|
+
"size": {
|
|
3378
|
+
"type": "SelectMultiSize",
|
|
3379
|
+
"required": false
|
|
3380
|
+
},
|
|
3381
|
+
"values": {
|
|
3382
|
+
"type": "string[]",
|
|
3383
|
+
"required": false
|
|
3384
|
+
},
|
|
3385
|
+
"width": {
|
|
3386
|
+
"type": "SelectMultiWidth",
|
|
3387
|
+
"required": false
|
|
3388
|
+
}
|
|
3389
|
+
},
|
|
3390
|
+
"events": [
|
|
3391
|
+
{
|
|
3392
|
+
"name": "dsChange",
|
|
3393
|
+
"detail": "string[]"
|
|
3394
|
+
},
|
|
3395
|
+
{
|
|
3396
|
+
"name": "dsClear",
|
|
3397
|
+
"detail": "void"
|
|
3398
|
+
},
|
|
3399
|
+
{
|
|
3400
|
+
"name": "dsOpenChange",
|
|
3401
|
+
"detail": "boolean"
|
|
3402
|
+
}
|
|
3403
|
+
],
|
|
3404
|
+
"slots": []
|
|
3405
|
+
},
|
|
3406
|
+
"exports": {
|
|
3407
|
+
"customElement": "ds-select-multi",
|
|
3408
|
+
"react": "DsSelectMulti",
|
|
3409
|
+
"angular": "DsSelectMulti"
|
|
3410
|
+
},
|
|
3411
|
+
"dependencies": [
|
|
3412
|
+
"@ds-mo/ui",
|
|
3413
|
+
"@ds-mo/tokens",
|
|
3414
|
+
"@ds-mo/icons"
|
|
3415
|
+
],
|
|
3416
|
+
"componentDependencies": [
|
|
3417
|
+
"button-unfilled",
|
|
3418
|
+
"checkbox",
|
|
3419
|
+
"empty-state",
|
|
3420
|
+
"icon",
|
|
3421
|
+
"loader",
|
|
2818
3422
|
"text"
|
|
2819
3423
|
]
|
|
2820
3424
|
},
|
|
@@ -3804,15 +4408,15 @@
|
|
|
3804
4408
|
"Visible content and the selected native element provide accessible meaning; avoid redundant roles and labels.",
|
|
3805
4409
|
"Use label semantics and its for association only for a real form control.",
|
|
3806
4410
|
"When truncating essential content, the owner provides an accessible way to obtain the omitted text.",
|
|
3807
|
-
"
|
|
3808
|
-
"Use dotted underline
|
|
4411
|
+
"Underline link text by default. Brand-blue links may omit the resting underline when color already supplies the affordance.",
|
|
4412
|
+
"Use dotted underline for hidden or supplemental interaction such as a tooltip; the owning trigger must provide focus, keyboard interaction, and accessible tooltip semantics."
|
|
3809
4413
|
],
|
|
3810
4414
|
"states": [
|
|
3811
4415
|
"A variant is atomic: font size, line height, weight, and letter spacing stay together and are not overridden by consumers.",
|
|
3812
4416
|
"Emphasis selects the supported stronger recipe for local hierarchy; it does not independently mean selected or active.",
|
|
3813
4417
|
"Omitted color inherits currentColor. Explicit semantic aliases or CSS-variable references are used only when Text has an independent color role.",
|
|
3814
4418
|
"Line truncation and wrapping require an owner-supplied width constraint and content-aware composition decision.",
|
|
3815
|
-
"Solid underline
|
|
4419
|
+
"Solid underline is the default link affordance; brand-blue links may omit it at rest. Dotted underline communicates hidden or supplemental interaction such as a tooltip. Decoration does not make Text interactive by itself.",
|
|
3816
4420
|
"Tabular numbers are for changing numeric values or aligned numeric columns where stable glyph width matters.",
|
|
3817
4421
|
"Shimmer is reserved for visible generating/loading status text whose owner provides status semantics; reduced motion keeps static readable text."
|
|
3818
4422
|
],
|