@ds-mo/ui 2.12.0 → 2.13.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.
Files changed (145) hide show
  1. package/README.md +1 -1
  2. package/dist/.build-stamp +1 -1
  3. package/dist/components/ds-app-shell.js +1 -1
  4. package/dist/components/ds-banner.js +1 -1
  5. package/dist/components/ds-bar-nav.js +1 -1
  6. package/dist/components/ds-bar-nav.js.map +1 -1
  7. package/dist/components/ds-button-filled.js +1 -1
  8. package/dist/components/ds-button-unfilled.js +1 -1
  9. package/dist/components/{ds-card-data-viz.d.ts → ds-card-data-viz-donut.d.ts} +4 -4
  10. package/dist/components/ds-card-data-viz-donut.js +2 -0
  11. package/dist/components/ds-card-data-viz-donut.js.map +1 -0
  12. package/dist/components/ds-card-setting.js +1 -1
  13. package/dist/components/ds-card-setting.js.map +1 -1
  14. package/dist/components/{ds-header.d.ts → ds-card.d.ts} +4 -4
  15. package/dist/components/ds-card.js +2 -0
  16. package/dist/components/ds-card.js.map +1 -0
  17. package/dist/components/ds-chart-bar.js +1 -1
  18. package/dist/components/ds-chart-bar.js.map +1 -1
  19. package/dist/components/ds-chart-donut.js +1 -1
  20. package/dist/components/ds-chart-donut.js.map +1 -1
  21. package/dist/components/ds-chart-legend.js +1 -1
  22. package/dist/components/ds-chart-line.js +1 -1
  23. package/dist/components/ds-checkbox.js +1 -1
  24. package/dist/components/ds-chip.js +1 -1
  25. package/dist/components/ds-divider.js +1 -1
  26. package/dist/components/ds-empty-state.js +1 -1
  27. package/dist/components/ds-empty-state.js.map +1 -1
  28. package/dist/components/ds-field.js +1 -1
  29. package/dist/components/ds-field.js.map +1 -1
  30. package/dist/components/ds-icon.js +1 -1
  31. package/dist/components/ds-input.js +1 -1
  32. package/dist/components/ds-input.js.map +1 -1
  33. package/dist/components/ds-loader.js +1 -1
  34. package/dist/components/ds-menu.js +1 -1
  35. package/dist/components/ds-modal.js +1 -1
  36. package/dist/components/ds-panel-nav.js +1 -1
  37. package/dist/components/ds-panel-tools.js +1 -1
  38. package/dist/components/ds-panel-tools.js.map +1 -1
  39. package/dist/components/ds-radio-group.js +1 -1
  40. package/dist/components/ds-select.js +1 -1
  41. package/dist/components/ds-select.js.map +1 -1
  42. package/dist/components/ds-shell-gradient-picker.js +1 -1
  43. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  44. package/dist/components/ds-slider.js +1 -1
  45. package/dist/components/ds-tab-group-nav.js +1 -1
  46. package/dist/components/ds-tab-group.js +1 -1
  47. package/dist/components/ds-table.js +1 -1
  48. package/dist/components/ds-tag.js +1 -1
  49. package/dist/components/ds-text.js +1 -1
  50. package/dist/components/ds-toggle.js +1 -1
  51. package/dist/components/ds-tooltip-data-viz.js +1 -1
  52. package/dist/components/ds-tooltip.js +1 -1
  53. package/dist/components/{p-BPK76IsW.js → p-1m8r0wFg.js} +2 -2
  54. package/dist/components/{p-BZIOTcnM.js → p-3FLHei19.js} +2 -2
  55. package/dist/components/p-B2_D4IDN.js +2 -0
  56. package/dist/components/p-B2_D4IDN.js.map +1 -0
  57. package/dist/components/p-B5NcWtpp.js +2 -0
  58. package/dist/components/p-B5NcWtpp.js.map +1 -0
  59. package/dist/components/{p-CyFVn2Sc.js → p-B82KZX9D.js} +2 -2
  60. package/dist/components/p-B_g8X0eh.js +2 -0
  61. package/dist/components/p-B_g8X0eh.js.map +1 -0
  62. package/dist/components/{p-C3ORQUOp.js → p-Be3PHv34.js} +2 -2
  63. package/dist/components/{p-DkcH8mRl.js → p-CQmf2CeW.js} +2 -2
  64. package/dist/components/{p-DRqxVEye.js → p-CtwNUCnp.js} +2 -2
  65. package/dist/components/p-CuRjYmBk.js +2 -0
  66. package/dist/components/p-CuRjYmBk.js.map +1 -0
  67. package/dist/components/{p-DKdI8T8v.js → p-CwARVsZQ.js} +2 -2
  68. package/dist/components/{p-DKdI8T8v.js.map → p-CwARVsZQ.js.map} +1 -1
  69. package/dist/components/{p-UbKTMQjv.js → p-DohXlNCJ.js} +2 -2
  70. package/dist/components/p-DuFm-ieS.js +2 -0
  71. package/dist/components/p-DuFm-ieS.js.map +1 -0
  72. package/dist/lib/nav/index.js.map +2 -2
  73. package/dist/lib/utils/control-width.d.ts +4 -0
  74. package/dist/lib/utils/index.d.ts +2 -0
  75. package/dist/lib/utils/index.js +14 -1
  76. package/dist/lib/utils/index.js.map +3 -3
  77. package/dist/lib/utils/token-defaults.d.ts +4 -0
  78. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +4 -0
  79. package/dist/types/components/ButtonFilled/index.d.ts +1 -1
  80. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +7 -3
  81. package/dist/types/components/ButtonUnfilled/index.d.ts +1 -1
  82. package/dist/types/components/Card/Card.d.ts +20 -0
  83. package/dist/types/components/Card/index.d.ts +2 -0
  84. package/dist/types/components/CardDataVizDonut/CardDataVizDonut.d.ts +26 -0
  85. package/dist/types/components/CardDataVizDonut/index.d.ts +2 -0
  86. package/dist/types/components/CardSetting/CardSetting.d.ts +7 -2
  87. package/dist/types/components/ChartDonut/ChartDonut.d.ts +24 -1
  88. package/dist/types/components/Select/Select.d.ts +32 -0
  89. package/dist/types/components/Select/index.d.ts +2 -0
  90. package/dist/types/components.d.ts +207 -110
  91. package/dist/types/utils/control-width.d.ts +5 -0
  92. package/dist/types/utils/index.d.ts +2 -0
  93. package/dist/types/utils/token-defaults.d.ts +4 -0
  94. package/package.json +2 -2
  95. package/src/angular/index.ts +2 -3
  96. package/src/angular/proxies.ts +40 -56
  97. package/src/react/components.ts +2 -3
  98. package/src/react/ds-card-data-viz-donut.ts +27 -0
  99. package/src/react/{ds-header.ts → ds-card.ts} +7 -7
  100. package/src/wc/components/ButtonFilled/ButtonFilled.tsx +7 -0
  101. package/src/wc/components/ButtonFilled/index.ts +1 -0
  102. package/src/wc/components/ButtonUnfilled/ButtonUnfilled.tsx +10 -3
  103. package/src/wc/components/ButtonUnfilled/index.ts +1 -0
  104. package/src/wc/components/Card/Card.tsx +79 -0
  105. package/src/wc/components/Card/index.ts +1 -0
  106. package/src/wc/components/{CardDataViz/CardDataViz.tsx → CardDataVizDonut/CardDataVizDonut.tsx} +47 -40
  107. package/src/wc/components/CardDataVizDonut/index.ts +1 -0
  108. package/src/wc/components/CardSetting/CardSetting.tsx +22 -35
  109. package/src/wc/components/ChartDonut/ChartDonut.tsx +112 -11
  110. package/src/wc/components/Select/Select.tsx +141 -60
  111. package/src/wc/components/Select/index.ts +1 -0
  112. package/src/wc/components.d.ts +207 -113
  113. package/src/wc/utils/control-width.css +28 -0
  114. package/src/wc/utils/control-width.ts +10 -0
  115. package/src/wc/utils/index.ts +2 -0
  116. package/src/wc/utils/token-defaults.ts +4 -0
  117. package/dist/components/ds-card-data-viz.js +0 -2
  118. package/dist/components/ds-card-data-viz.js.map +0 -1
  119. package/dist/components/ds-header.js +0 -2
  120. package/dist/components/ds-header.js.map +0 -1
  121. package/dist/components/ds-scrollbar.d.ts +0 -11
  122. package/dist/components/ds-scrollbar.js +0 -2
  123. package/dist/components/ds-scrollbar.js.map +0 -1
  124. package/dist/components/p-B9dHCgY-.js +0 -2
  125. package/dist/components/p-B9dHCgY-.js.map +0 -1
  126. package/dist/components/p-BTC9Njj6.js +0 -2
  127. package/dist/components/p-BTC9Njj6.js.map +0 -1
  128. package/dist/components/p-DusYu-if.js +0 -2
  129. package/dist/components/p-DusYu-if.js.map +0 -1
  130. package/dist/types/components/CardDataViz/CardDataViz.d.ts +0 -22
  131. package/dist/types/components/CardDataViz/index.d.ts +0 -2
  132. package/dist/types/components/Header/Header.d.ts +0 -7
  133. package/dist/types/components/Scrollbar/Scrollbar.d.ts +0 -27
  134. package/src/react/ds-card-data-viz.ts +0 -26
  135. package/src/react/ds-scrollbar.ts +0 -26
  136. package/src/wc/components/CardDataViz/index.ts +0 -1
  137. package/src/wc/components/Header/Header.tsx +0 -33
  138. package/src/wc/components/Scrollbar/Scrollbar.tsx +0 -189
  139. /package/dist/components/{p-BPK76IsW.js.map → p-1m8r0wFg.js.map} +0 -0
  140. /package/dist/components/{p-BZIOTcnM.js.map → p-3FLHei19.js.map} +0 -0
  141. /package/dist/components/{p-CyFVn2Sc.js.map → p-B82KZX9D.js.map} +0 -0
  142. /package/dist/components/{p-C3ORQUOp.js.map → p-Be3PHv34.js.map} +0 -0
  143. /package/dist/components/{p-DkcH8mRl.js.map → p-CQmf2CeW.js.map} +0 -0
  144. /package/dist/components/{p-DRqxVEye.js.map → p-CtwNUCnp.js.map} +0 -0
  145. /package/dist/components/{p-UbKTMQjv.js.map → p-DohXlNCJ.js.map} +0 -0
@@ -0,0 +1,5 @@
1
+ /** Shared width fit for interactive controls (buttons, select, …). */
2
+ export type ControlWidth = 'hug' | 'fill';
3
+ /** Host / control class map for `width="hug" | "fill"`. */
4
+ export declare function controlWidthClass(width: ControlWidth): Record<string, boolean>;
5
+ //# sourceMappingURL=control-width.d.ts.map
@@ -7,4 +7,6 @@ export { SCROLL_EDGE_FADE_DEFAULT_SIZE, SCROLL_EDGE_FADE_SIZE_VAR, isScrollAtEdg
7
7
  export type { ScrollEdgeFadeEdge, ScrollEdgeFadeOptions, ScrollEdgeFadeSize, ScrollEdgeFadeSizeToken, } from './scroll-edge-fade';
8
8
  export { TOKEN_DEFAULTS, TOKEN_CSS_LENGTHS } from './token-defaults';
9
9
  export type { TokenDefaultKey } from './token-defaults';
10
+ export { controlWidthClass } from './control-width';
11
+ export type { ControlWidth } from './control-width';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -33,6 +33,10 @@ export declare const TOKEN_DEFAULTS: {
33
33
  readonly menuFallbackHeight: "calc(var(--dimension-size-base) * 20)";
34
34
  /** Unmeasured tooltip width fallback: size-800 + size-200 (80px). */
35
35
  readonly tooltipFallbackWidth: "calc(var(--dimension-size-800) + var(--dimension-size-200))";
36
+ /** Fill-mode donut diameter floor: 16× size-base (128px). */
37
+ readonly donutFillMin: "calc(var(--dimension-size-base) * 16)";
38
+ /** Fill-mode donut diameter ceiling: 24× size-base (192px). */
39
+ readonly donutFillMax: "calc(var(--dimension-size-base) * 24)";
36
40
  };
37
41
  export type TokenDefaultKey = keyof typeof TOKEN_DEFAULTS;
38
42
  /** Valid CSS length strings for overlay offset props — bind on `sideOffset` / `alignOffset` in hosts. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ds-mo/ui",
3
- "version": "2.12.0",
3
+ "version": "2.13.0",
4
4
  "description": "CompoMo — composable web components styled with TokoMo design tokens",
5
5
  "keywords": [
6
6
  "web-components",
@@ -67,7 +67,7 @@
67
67
  "prebuild": "node scripts/generate-icon-catalog.mjs",
68
68
  "pretypecheck": "node scripts/generate-icon-catalog.mjs",
69
69
  "pretest": "node scripts/generate-icon-catalog.mjs",
70
- "build": "stencil build && node scripts/patch-index-types.mjs && node scripts/patch-components-d-exports.mjs && node scripts/verify-icons-externalized.mjs && node scripts/write-build-stamp.mjs && node scripts/build-lib-exports.mjs",
70
+ "build": "stencil build && node scripts/patch-index-types.mjs && node scripts/verify-icons-externalized.mjs && node scripts/write-build-stamp.mjs && node scripts/build-lib-exports.mjs",
71
71
  "verify:pack": "node scripts/verify-npm-pack.mjs && node scripts/verify-nav-import.mjs",
72
72
  "test": "node --import tsx/esm --test tests/panel-nav-utils.test.ts tests/panel-tools.test.ts tests/shell-shortcuts.test.ts tests/shell-gradient-presets.test.ts tests/shell-view-transition.test.ts tests/shell-gradient.test.ts tests/shell-chrome-metrics.test.ts tests/shell-chrome-layer.test.ts tests/chrome-transition.test.ts tests/bar-nav-overflow-hysteresis.test.ts tests/badge-gradient-ring.test.ts tests/scroll-edge-fade.test.ts tests/resolve-css-length-px.test.ts tests/resolve-css-time-ms.test.ts tests/overlay-positioning.test.ts tests/menu-position.test.ts tests/menu-placement.test.ts tests/bar-nav-utils.test.ts tests/bar-nav-tabs-menu-utils.test.ts tests/bar-nav-dom-utils.test.ts tests/icon-catalog.test.ts tests/icon-cache.test.ts tests/icon-svg.test.ts",
73
73
  "test:e2e": "npm run build && playwright test",
@@ -8,7 +8,8 @@ export const DIRECTIVES = [
8
8
  d.DsBarNav,
9
9
  d.DsButtonFilled,
10
10
  d.DsButtonUnfilled,
11
- d.DsCardDataViz,
11
+ d.DsCard,
12
+ d.DsCardDataVizDonut,
12
13
  d.DsCardSetting,
13
14
  d.DsChartBar,
14
15
  d.DsChartDonut,
@@ -19,7 +20,6 @@ export const DIRECTIVES = [
19
20
  d.DsDivider,
20
21
  d.DsEmptyState,
21
22
  d.DsField,
22
- d.DsHeader,
23
23
  d.DsIcon,
24
24
  d.DsInput,
25
25
  d.DsLoader,
@@ -29,7 +29,6 @@ export const DIRECTIVES = [
29
29
  d.DsPanelNav,
30
30
  d.DsPanelTools,
31
31
  d.DsRadioGroup,
32
- d.DsScrollbar,
33
32
  d.DsSelect,
34
33
  d.DsShellGradientPicker,
35
34
  d.DsShellGradientSwatch,
@@ -112,7 +112,7 @@ export declare interface DsBarNav extends Components.DsBarNav {
112
112
 
113
113
 
114
114
  @ProxyCmp({
115
- inputs: ['ariaLabel', 'contrast', 'icon', 'intent', 'isInactive', 'label', 'size', 'type', 'variant'],
115
+ inputs: ['ariaLabel', 'contrast', 'icon', 'intent', 'isInactive', 'label', 'size', 'type', 'variant', 'width'],
116
116
  methods: ['setFocus']
117
117
  })
118
118
  @Component({
@@ -120,7 +120,7 @@ export declare interface DsBarNav extends Components.DsBarNav {
120
120
  changeDetection: ChangeDetectionStrategy.OnPush,
121
121
  template: '<ng-content></ng-content>',
122
122
  // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
123
- inputs: ['ariaLabel', 'contrast', 'icon', 'intent', 'isInactive', 'label', 'size', 'type', 'variant'],
123
+ inputs: ['ariaLabel', 'contrast', 'icon', 'intent', 'isInactive', 'label', 'size', 'type', 'variant', 'width'],
124
124
  outputs: ['dsClick'],
125
125
  standalone: false
126
126
  })
@@ -141,7 +141,7 @@ export declare interface DsButtonFilled extends Components.DsButtonFilled {
141
141
 
142
142
 
143
143
  @ProxyCmp({
144
- inputs: ['activeFill', 'ariaLabel', 'background', 'backgroundContrast', 'controls', 'dot', 'expanded', 'focusTabIndex', 'hasBorder', 'haspopup', 'icon', 'isActive', 'isInactive', 'label', 'pressed', 'size', 'type', 'variant'],
144
+ inputs: ['activeFill', 'ariaLabel', 'background', 'backgroundContrast', 'controls', 'dot', 'expanded', 'focusTabIndex', 'hasBorder', 'haspopup', 'icon', 'isActive', 'isInactive', 'label', 'pressed', 'size', 'type', 'variant', 'width'],
145
145
  methods: ['setFocus']
146
146
  })
147
147
  @Component({
@@ -149,7 +149,7 @@ export declare interface DsButtonFilled extends Components.DsButtonFilled {
149
149
  changeDetection: ChangeDetectionStrategy.OnPush,
150
150
  template: '<ng-content></ng-content>',
151
151
  // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
152
- inputs: ['activeFill', 'ariaLabel', 'background', 'backgroundContrast', 'controls', 'dot', 'expanded', 'focusTabIndex', 'hasBorder', 'haspopup', 'icon', 'isActive', 'isInactive', 'label', 'pressed', 'size', 'type', 'variant'],
152
+ inputs: ['activeFill', 'ariaLabel', 'background', 'backgroundContrast', 'controls', 'dot', 'expanded', 'focusTabIndex', 'hasBorder', 'haspopup', 'icon', 'isActive', 'isInactive', 'label', 'pressed', 'size', 'type', 'variant', 'width'],
153
153
  outputs: ['dsClick', 'dsChange'],
154
154
  standalone: false
155
155
  })
@@ -172,19 +172,44 @@ export declare interface DsButtonUnfilled extends Components.DsButtonUnfilled {
172
172
  }
173
173
 
174
174
 
175
+ @ProxyCmp({
176
+ inputs: ['appearance', 'cardWidth', 'heading']
177
+ })
178
+ @Component({
179
+ selector: 'ds-card',
180
+ changeDetection: ChangeDetectionStrategy.OnPush,
181
+ template: '<ng-content></ng-content>',
182
+ // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
183
+ inputs: ['appearance', 'cardWidth', { name: 'heading', required: true }],
184
+ standalone: false
185
+ })
186
+ export class DsCard {
187
+ protected el: HTMLDsCardElement;
188
+ constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
189
+ c.detach();
190
+ this.el = r.nativeElement;
191
+ }
192
+ }
193
+
194
+
195
+ export declare interface DsCard extends Components.DsCard {}
196
+
197
+
175
198
  @ProxyCmp({
176
199
  inputs: ['cardWidth', 'heading']
177
200
  })
178
201
  @Component({
179
- selector: 'ds-card-data-viz',
202
+ selector: 'ds-card-data-viz-donut',
180
203
  changeDetection: ChangeDetectionStrategy.OnPush,
181
204
  template: '<ng-content></ng-content>',
182
205
  // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
183
206
  inputs: ['cardWidth', { name: 'heading', required: true }],
207
+ outputs: ['dsFilterClick'],
184
208
  standalone: false
185
209
  })
186
- export class DsCardDataViz {
187
- protected el: HTMLDsCardDataVizElement;
210
+ export class DsCardDataVizDonut {
211
+ protected el: HTMLDsCardDataVizDonutElement;
212
+ @Output() dsFilterClick = new EventEmitter<CustomEvent<void>>();
188
213
  constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
189
214
  c.detach();
190
215
  this.el = r.nativeElement;
@@ -192,7 +217,12 @@ export class DsCardDataViz {
192
217
  }
193
218
 
194
219
 
195
- export declare interface DsCardDataViz extends Components.DsCardDataViz {}
220
+ export declare interface DsCardDataVizDonut extends Components.DsCardDataVizDonut {
221
+ /**
222
+ * Emits when the header filter control is activated.
223
+ */
224
+ dsFilterClick: EventEmitter<CustomEvent<void>>;
225
+ }
196
226
 
197
227
 
198
228
  @ProxyCmp({
@@ -467,29 +497,6 @@ export class DsField {
467
497
  export declare interface DsField extends Components.DsField {}
468
498
 
469
499
 
470
- @ProxyCmp({
471
- inputs: ['background', 'heading']
472
- })
473
- @Component({
474
- selector: 'ds-header',
475
- changeDetection: ChangeDetectionStrategy.OnPush,
476
- template: '<ng-content></ng-content>',
477
- // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
478
- inputs: ['background', 'heading'],
479
- standalone: false
480
- })
481
- export class DsHeader {
482
- protected el: HTMLDsHeaderElement;
483
- constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
484
- c.detach();
485
- this.el = r.nativeElement;
486
- }
487
- }
488
-
489
-
490
- export declare interface DsHeader extends Components.DsHeader {}
491
-
492
-
493
500
  @ProxyCmp({
494
501
  inputs: ['color', 'flag', 'label', 'name', 'size']
495
502
  })
@@ -791,37 +798,14 @@ export declare interface DsRadioGroup extends Components.DsRadioGroup {
791
798
 
792
799
 
793
800
  @ProxyCmp({
794
- inputs: ['showTrackOnHover', 'variant']
795
- })
796
- @Component({
797
- selector: 'ds-scrollbar',
798
- changeDetection: ChangeDetectionStrategy.OnPush,
799
- template: '<ng-content></ng-content>',
800
- // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
801
- inputs: ['showTrackOnHover', 'variant'],
802
- standalone: false
803
- })
804
- export class DsScrollbar {
805
- protected el: HTMLDsScrollbarElement;
806
- constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
807
- c.detach();
808
- this.el = r.nativeElement;
809
- }
810
- }
811
-
812
-
813
- export declare interface DsScrollbar extends Components.DsScrollbar {}
814
-
815
-
816
- @ProxyCmp({
817
- inputs: ['ariaLabel', 'ariaLabelledby', 'isInactive', 'options', 'placeholder', 'value']
801
+ inputs: ['activeFill', 'ariaLabel', 'ariaLabelledby', 'hasBorder', 'isInactive', 'options', 'placeholder', 'size', 'value', 'width']
818
802
  })
819
803
  @Component({
820
804
  selector: 'ds-select',
821
805
  changeDetection: ChangeDetectionStrategy.OnPush,
822
806
  template: '<ng-content></ng-content>',
823
807
  // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
824
- inputs: ['ariaLabel', 'ariaLabelledby', 'isInactive', 'options', 'placeholder', 'value'],
808
+ inputs: ['activeFill', 'ariaLabel', 'ariaLabelledby', 'hasBorder', 'isInactive', 'options', 'placeholder', 'size', 'value', 'width'],
825
809
  outputs: ['dsChange'],
826
810
  standalone: false
827
811
  })
@@ -10,8 +10,9 @@ export { DsBanner } from "./ds-banner.js";
10
10
  export { DsBarNav } from "./ds-bar-nav.js";
11
11
  export { DsButtonFilled } from "./ds-button-filled.js";
12
12
  export { DsButtonUnfilled } from "./ds-button-unfilled.js";
13
- export { DsCardDataViz } from "./ds-card-data-viz.js";
13
+ export { DsCardDataVizDonut } from "./ds-card-data-viz-donut.js";
14
14
  export { DsCardSetting } from "./ds-card-setting.js";
15
+ export { DsCard } from "./ds-card.js";
15
16
  export { DsChartBar } from "./ds-chart-bar.js";
16
17
  export { DsChartDonut } from "./ds-chart-donut.js";
17
18
  export { DsChartLegend } from "./ds-chart-legend.js";
@@ -21,7 +22,6 @@ export { DsChip } from "./ds-chip.js";
21
22
  export { DsDivider } from "./ds-divider.js";
22
23
  export { DsEmptyState } from "./ds-empty-state.js";
23
24
  export { DsField } from "./ds-field.js";
24
- export { DsHeader } from "./ds-header.js";
25
25
  export { DsIcon } from "./ds-icon.js";
26
26
  export { DsInput } from "./ds-input.js";
27
27
  export { DsLoader } from "./ds-loader.js";
@@ -31,7 +31,6 @@ export { DsPagination } from "./ds-pagination.js";
31
31
  export { DsPanelNav } from "./ds-panel-nav.js";
32
32
  export { DsPanelTools } from "./ds-panel-tools.js";
33
33
  export { DsRadioGroup } from "./ds-radio-group.js";
34
- export { DsScrollbar } from "./ds-scrollbar.js";
35
34
  export { DsSelect } from "./ds-select.js";
36
35
  export { DsShellGradientPicker } from "./ds-shell-gradient-picker.js";
37
36
  export { DsShellGradientSwatch } from "./ds-shell-gradient-swatch.js";
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * This file was automatically generated by the Stencil React Output Target.
5
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
6
+ */
7
+
8
+ /* eslint-disable */
9
+
10
+ import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
11
+ import { createComponent } from '@stencil/react-output-target/runtime';
12
+ import React from 'react';
13
+
14
+ import { type DsCardDataVizDonutCustomEvent } from "@ds-mo/ui";
15
+ import type { Components } from "@ds-mo/ui/dist/components";
16
+ import { DsCardDataVizDonut as DsCardDataVizDonutElement, defineCustomElement as defineDsCardDataVizDonut } from "@ds-mo/ui/dist/components/ds-card-data-viz-donut.js";
17
+
18
+ export type DsCardDataVizDonutEvents = { onDsFilterClick: EventName<DsCardDataVizDonutCustomEvent<void>> };
19
+
20
+ export const DsCardDataVizDonut: StencilReactComponent<DsCardDataVizDonutElement, DsCardDataVizDonutEvents, Components.DsCardDataVizDonut> = /*@__PURE__*/ createComponent<DsCardDataVizDonutElement, DsCardDataVizDonutEvents, Components.DsCardDataVizDonut>({
21
+ tagName: 'ds-card-data-viz-donut',
22
+ elementClass: DsCardDataVizDonutElement,
23
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
24
+ react: React,
25
+ events: { onDsFilterClick: 'dsFilterClick' } as DsCardDataVizDonutEvents,
26
+ defineCustomElement: defineDsCardDataVizDonut
27
+ });
@@ -12,15 +12,15 @@ import { createComponent } from '@stencil/react-output-target/runtime';
12
12
  import React from 'react';
13
13
 
14
14
  import type { Components } from "@ds-mo/ui/dist/components";
15
- import { DsHeader as DsHeaderElement, defineCustomElement as defineDsHeader } from "@ds-mo/ui/dist/components/ds-header.js";
15
+ import { DsCard as DsCardElement, defineCustomElement as defineDsCard } from "@ds-mo/ui/dist/components/ds-card.js";
16
16
 
17
- export type DsHeaderEvents = NonNullable<unknown>;
17
+ export type DsCardEvents = NonNullable<unknown>;
18
18
 
19
- export const DsHeader: StencilReactComponent<DsHeaderElement, DsHeaderEvents, Components.DsHeader> = /*@__PURE__*/ createComponent<DsHeaderElement, DsHeaderEvents, Components.DsHeader>({
20
- tagName: 'ds-header',
21
- elementClass: DsHeaderElement,
19
+ export const DsCard: StencilReactComponent<DsCardElement, DsCardEvents, Components.DsCard> = /*@__PURE__*/ createComponent<DsCardElement, DsCardEvents, Components.DsCard>({
20
+ tagName: 'ds-card',
21
+ elementClass: DsCardElement,
22
22
  // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
23
23
  react: React,
24
- events: {} as DsHeaderEvents,
25
- defineCustomElement: defineDsHeader
24
+ events: {} as DsCardEvents,
25
+ defineCustomElement: defineDsCard
26
26
  });
@@ -1,4 +1,5 @@
1
1
  import { Component, Element, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';
2
+ import { controlWidthClass, type ControlWidth } from '../../utils/control-width';
2
3
 
3
4
  export type ButtonFilledIntent =
4
5
  | 'neutral'
@@ -17,6 +18,8 @@ export type ButtonFilledVariant = 'icon' | 'label' | 'icon-label';
17
18
 
18
19
  export type ButtonFilledSize = 'md' | 'sm' | 'xs';
19
20
 
21
+ export type ButtonFilledWidth = ControlWidth;
22
+
20
23
  /** Emphasis text per control-density size (buttons use emphasis, unlike Tag). */
21
24
  const TEXT_VARIANT: Record<ButtonFilledSize, string> = {
22
25
  md: 'text-body-medium-emphasis',
@@ -51,6 +54,9 @@ export class ButtonFilled {
51
54
  /** Control density (height, padding, icon, type). */
52
55
  @Prop() size: ButtonFilledSize = 'md';
53
56
 
57
+ /** Width fit — hug content (default) or fill the parent. */
58
+ @Prop() width: ButtonFilledWidth = 'hug';
59
+
54
60
  /** Visible text for `label` / `icon-label` variants. */
55
61
  @Prop() label: string = '';
56
62
 
@@ -135,6 +141,7 @@ export class ButtonFilled {
135
141
  'ds-control--md': this.size === 'md',
136
142
  'ds-control--sm': this.size === 'sm',
137
143
  'ds-control--xs': this.size === 'xs',
144
+ ...controlWidthClass(this.width),
138
145
  }}
139
146
  tabIndex={-1}
140
147
  >
@@ -3,4 +3,5 @@ export type {
3
3
  ButtonFilledIntent,
4
4
  ButtonFilledSize,
5
5
  ButtonFilledVariant,
6
+ ButtonFilledWidth,
6
7
  } from './ButtonFilled';
@@ -1,4 +1,5 @@
1
1
  import { Component, Element, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';
2
+ import { controlWidthClass, type ControlWidth } from '../../utils/control-width';
2
3
 
3
4
  export type ButtonUnfilledOnBackgroundContrast = 'default' | 'medium' | 'bold' | 'strong';
4
5
 
@@ -8,6 +9,8 @@ export type ButtonUnfilledVariant = 'icon' | 'label' | 'icon-label';
8
9
 
9
10
  export type ButtonUnfilledSize = 'md' | 'sm' | 'xs';
10
11
 
12
+ export type ButtonUnfilledWidth = ControlWidth;
13
+
11
14
  /** Emphasis text per control-density size (buttons use emphasis, unlike Tag). */
12
15
  const TEXT_VARIANT: Record<ButtonUnfilledSize, string> = {
13
16
  md: 'text-body-medium-emphasis',
@@ -42,23 +45,26 @@ export class ButtonUnfilled {
42
45
  /** Control density (height, padding, icon, type). */
43
46
  @Prop() size: ButtonUnfilledSize = 'md';
44
47
 
48
+ /** Width fit — hug content (default) or fill the parent. */
49
+ @Prop() width: ButtonUnfilledWidth = 'hug';
50
+
45
51
  /** Visible text for `label` / `icon-label` variants. */
46
52
  @Prop() label: string = '';
47
53
 
48
54
  /** Icon name passed to <ds-icon> for `icon` / `icon-label` variants. */
49
55
  @Prop() icon: string = '';
50
56
 
51
- /** Active/selected visual state. */
57
+ /** Active/selected visual state. Always promotes foreground to primary. */
52
58
  @Prop() isActive: boolean = false;
53
59
 
54
60
  /**
55
61
  * When active, render the selected interaction fill.
56
62
  * Default `true` for general UI. Shell chrome (nav / tool rails) should pass
57
- * `false` so selection is foreground-only.
63
+ * `false` so selection is foreground-only (primary color, no fill).
58
64
  */
59
65
  @Prop() activeFill: boolean = true;
60
66
 
61
- /** Show a 1px tertiary inset border. Default on; shell chrome can pass `false`. */
67
+ /** Show a 1px secondary inset border. Default on; shell chrome can pass `false`. */
62
68
  @Prop() hasBorder: boolean = true;
63
69
 
64
70
  /** Show a notification dot at the top-right of the icon zone (icon variant only). */
@@ -179,6 +185,7 @@ export class ButtonUnfilled {
179
185
  'ds-control--md': this.size === 'md',
180
186
  'ds-control--sm': this.size === 'sm',
181
187
  'ds-control--xs': this.size === 'xs',
188
+ ...controlWidthClass(this.width),
182
189
  }}
183
190
  tabIndex={-1}
184
191
  >
@@ -3,4 +3,5 @@ export type {
3
3
  ButtonUnfilledOnBackgroundContrast,
4
4
  ButtonUnfilledSize,
5
5
  ButtonUnfilledVariant,
6
+ ButtonUnfilledWidth,
6
7
  } from './ButtonUnfilled';
@@ -0,0 +1,79 @@
1
+ import { Component, h, Host, Prop } from '@stencil/core';
2
+
3
+ export type CardWidth = 'sm' | 'md' | 'lg';
4
+
5
+ /** Visual chrome recipe — default app surface, or settings edit wash. */
6
+ export type CardAppearance = 'default' | 'editing';
7
+
8
+ const CARD_WIDTH_VARS: Record<CardWidth, string> = {
9
+ sm: 'var(--dimension-card-width-sm)',
10
+ md: 'var(--dimension-card-width-md)',
11
+ lg: 'var(--dimension-card-width-lg)',
12
+ };
13
+
14
+ const CARD_HEIGHT_VARS: Record<CardWidth, string> = {
15
+ sm: 'var(--dimension-card-height-sm)',
16
+ md: 'var(--dimension-card-height-md)',
17
+ lg: 'var(--dimension-card-height-lg)',
18
+ };
19
+
20
+ const FAINT_BRAND_TITLE_COLOR = 'var(--color-foreground-faint-brand)';
21
+
22
+ /**
23
+ * Shared card chrome — width + matching min-height tokens, header (title + actions),
24
+ * and a flex body that fills leftover space. Compose this from settings / data-viz cards.
25
+ */
26
+ @Component({
27
+ tag: 'ds-card',
28
+ styleUrl: 'Card.css',
29
+ scoped: true,
30
+ })
31
+ export class Card {
32
+ /** Section heading shown in the card header. */
33
+ @Prop() heading!: string;
34
+
35
+ /**
36
+ * Card width token (`sm` / `md` / `lg`). Also sets host `min-height` to the
37
+ * matching `--dimension-card-height-*` so empty bodies still fill the card.
38
+ */
39
+ @Prop() cardWidth: CardWidth = 'md';
40
+
41
+ /** Chrome recipe — `editing` applies the settings edit wash. */
42
+ @Prop() appearance: CardAppearance = 'default';
43
+
44
+ render() {
45
+ const editing = this.appearance === 'editing';
46
+
47
+ return (
48
+ <Host
49
+ class={{
50
+ card: true,
51
+ 'card--editing': editing,
52
+ }}
53
+ style={{
54
+ '--_card-width': CARD_WIDTH_VARS[this.cardWidth],
55
+ '--_card-min-height': CARD_HEIGHT_VARS[this.cardWidth],
56
+ }}
57
+ >
58
+ <header class="card__header">
59
+ <div class="card__title-wrap">
60
+ <ds-text
61
+ class="card__title"
62
+ variant="text-title-small"
63
+ color={editing ? FAINT_BRAND_TITLE_COLOR : 'primary'}
64
+ as="h2"
65
+ >
66
+ {this.heading}
67
+ </ds-text>
68
+ </div>
69
+ <div class="card__actions">
70
+ <slot name="actions" />
71
+ </div>
72
+ </header>
73
+ <div class="card__body">
74
+ <slot />
75
+ </div>
76
+ </Host>
77
+ );
78
+ }
79
+ }
@@ -0,0 +1 @@
1
+ export type { CardWidth, CardAppearance } from './Card';
@@ -1,6 +1,7 @@
1
- import { Component, Element, State, h, Host, Prop } from '@stencil/core';
1
+ import { Component, Element, Event, EventEmitter, State, h, Host, Prop } from '@stencil/core';
2
+ import type { CardWidth } from '../Card/Card';
2
3
 
3
- export type CardDataVizWidth = 'sm' | 'md' | 'lg';
4
+ export type CardDataVizDonutWidth = CardWidth;
4
5
 
5
6
  /** Matches the `dsSliceHover`/`dsItemHover` detail shape emitted by `ds-chart-*` and `ds-chart-legend`. */
6
7
  type HoveredDatum = { label: string } | null;
@@ -8,30 +9,26 @@ type HoveredDatum = { label: string } | null;
8
9
  /** A slotted chart/legend that opts into hover sync by exposing an `activeLabel` prop. */
9
10
  type SyncableSlot = HTMLElement & { activeLabel?: string | null };
10
11
 
11
- const CARD_WIDTH_VARS: Record<CardDataVizWidth, string> = {
12
- sm: 'var(--dimension-card-width-sm)',
13
- md: 'var(--dimension-card-width-md)',
14
- lg: 'var(--dimension-card-width-lg)',
15
- };
16
-
17
12
  /**
18
- * Copied from CardSetting as a starting scaffold header edit affordance removed for now
19
- * (data-viz widgets don't have an obvious "edit" action the way settings fields do); revisit
20
- * once the data-viz card's real header actions (menu, caption, footer stat) are designed.
13
+ * Donut data-viz card shared `ds-card` chrome with a fill chart region and
14
+ * content-sized legend. Hover sync between chart and legend stays here.
21
15
  */
22
16
  @Component({
23
- tag: 'ds-card-data-viz',
24
- styleUrl: 'CardDataViz.css',
17
+ tag: 'ds-card-data-viz-donut',
18
+ styleUrl: 'CardDataVizDonut.css',
25
19
  scoped: true,
26
20
  })
27
- export class CardDataViz {
21
+ export class CardDataVizDonut {
28
22
  @Element() el!: HTMLElement;
29
23
 
30
24
  /** Widget heading shown in the card header. */
31
25
  @Prop() heading!: string;
32
26
 
33
- /** Card width token. */
34
- @Prop() cardWidth: CardDataVizWidth = 'md';
27
+ /** Card width token — also sets matching min-height. */
28
+ @Prop() cardWidth: CardDataVizDonutWidth = 'md';
29
+
30
+ /** Emits when the header filter control is activated. */
31
+ @Event() dsFilterClick!: EventEmitter<void>;
35
32
 
36
33
  // Scoped (light-DOM) components have no native slot projection to detect emptiness from CSS —
37
34
  // check the actual children so an unused region (e.g. no legend) doesn't render a dangling
@@ -40,13 +37,16 @@ export class CardDataViz {
40
37
  @State() private hasLegendSlot = false;
41
38
 
42
39
  componentWillRender() {
43
- this.hasChartSlot = !!this.el.querySelector(':scope > [slot="chart"]');
44
- this.hasLegendSlot = !!this.el.querySelector(':scope > [slot="legend"]');
40
+ // Not `:scope >` — Stencil's scoped slot polyfill relocates slotted children into
41
+ // region wrappers (and here into nested `ds-card`), so they may not stay direct
42
+ // host children across renders.
43
+ this.hasChartSlot = !!this.el.querySelector('[slot="chart"]');
44
+ this.hasLegendSlot = !!this.el.querySelector('[slot="legend"]');
45
45
  }
46
46
 
47
47
  componentDidLoad() {
48
48
  // Sync the chart's and legend's `activeLabel` from each other's hover events, so any
49
- // ds-chart-* + ds-chart-legend pair cross-highlights without every consumer having to
49
+ // ds-chart-donut + ds-chart-legend pair cross-highlights without every consumer having to
50
50
  // wire it up by hand. Delegated on the host (rather than bound to the specific slotted
51
51
  // elements) since Stencil events bubble and the slot content can be swapped at runtime.
52
52
  this.el.addEventListener('dsSliceHover', this.handleChartHover);
@@ -60,8 +60,8 @@ export class CardDataViz {
60
60
 
61
61
  private handleChartHover = (e: Event) => {
62
62
  // Not `:scope >` — Stencil's slot polyfill for scoped (non-shadow) components relocates
63
- // slotted children into an inner `.chart-region`/`.legend-region` wrapper on render, so
64
- // they're no longer direct children of the host by the time this fires.
63
+ // slotted children into an inner region wrapper on render, so they're no longer direct
64
+ // children of the host by the time this fires.
65
65
  const legend = this.el.querySelector('[slot="legend"]') as SyncableSlot | null;
66
66
  if (!legend || !('activeLabel' in legend)) return;
67
67
  legend.activeLabel = (e as CustomEvent<HoveredDatum>).detail?.label ?? null;
@@ -73,28 +73,35 @@ export class CardDataViz {
73
73
  chart.activeLabel = (e as CustomEvent<HoveredDatum>).detail?.label ?? null;
74
74
  };
75
75
 
76
+ private handleFilterClick = () => {
77
+ this.dsFilterClick.emit();
78
+ };
79
+
76
80
  render() {
77
81
  return (
78
- <Host class="card-data-viz" style={{ '--_card-data-viz-width': CARD_WIDTH_VARS[this.cardWidth] }}>
79
- <header class="card-data-viz__header">
80
- <div class="card-data-viz__title-wrap">
81
- <ds-text class="card-data-viz__title" variant="text-title-small" color="primary" as="h2">
82
- {this.heading}
83
- </ds-text>
82
+ <Host class="card-data-viz-donut">
83
+ <ds-card heading={this.heading} cardWidth={this.cardWidth}>
84
+ <ds-button-unfilled
85
+ slot="actions"
86
+ variant="icon"
87
+ type="button"
88
+ icon="Filters"
89
+ aria-label="Filter"
90
+ onDsClick={this.handleFilterClick}
91
+ />
92
+ <div class="card-data-viz-donut__layout">
93
+ {this.hasChartSlot && (
94
+ <div class="card-data-viz-donut__chart-region">
95
+ <slot name="chart" />
96
+ </div>
97
+ )}
98
+ {this.hasLegendSlot && (
99
+ <div class="card-data-viz-donut__legend-region">
100
+ <slot name="legend" />
101
+ </div>
102
+ )}
84
103
  </div>
85
- </header>
86
- <div class="card-data-viz__body">
87
- {this.hasChartSlot && (
88
- <div class="card-data-viz__chart-region">
89
- <slot name="chart" />
90
- </div>
91
- )}
92
- {this.hasLegendSlot && (
93
- <div class="card-data-viz__legend-region">
94
- <slot name="legend" />
95
- </div>
96
- )}
97
- </div>
104
+ </ds-card>
98
105
  </Host>
99
106
  );
100
107
  }
@@ -0,0 +1 @@
1
+ export type { CardDataVizDonutWidth } from './CardDataVizDonut';