@boostdev/design-system-components 2.7.0 → 2.8.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 (87) hide show
  1. package/AGENTS.md +102 -2
  2. package/dist/client.cjs +52 -52
  3. package/dist/client.css +548 -548
  4. package/dist/client.js +52 -52
  5. package/dist/index.cjs +52 -52
  6. package/dist/index.css +548 -548
  7. package/dist/index.js +52 -52
  8. package/dist/web-components/{chunk-T6AETZRP.js → chunk-3GFWLSLS.js} +1 -1
  9. package/dist/web-components/{chunk-N6IMUOY4.js → chunk-65JXQOBA.js} +3 -3
  10. package/dist/web-components/{chunk-7FMR53BW.js → chunk-7YURXHTS.js} +35 -15
  11. package/dist/web-components/{chunk-5TFWOPLH.js → chunk-A3RLT3AS.js} +3 -3
  12. package/dist/web-components/{chunk-X3FKVHLK.js → chunk-ARMKC4BQ.js} +2 -2
  13. package/dist/web-components/{chunk-ZTC6GRP7.js → chunk-BKIHQYJR.js} +1 -0
  14. package/dist/web-components/{chunk-EBJM3VD4.js → chunk-DZOEPVFT.js} +2 -2
  15. package/dist/web-components/{chunk-57TRNCWQ.js → chunk-FSZRP43R.js} +1 -1
  16. package/dist/web-components/{chunk-UFFCKVZE.js → chunk-FXURM6D5.js} +1 -1
  17. package/dist/web-components/{chunk-HHHRF2PS.js → chunk-JYYRJS2D.js} +3 -3
  18. package/dist/web-components/{chunk-OCODKRVZ.js → chunk-KUI55GFB.js} +2 -2
  19. package/dist/web-components/{chunk-ZNKEZIYE.js → chunk-NCPQ7AF3.js} +3 -2
  20. package/dist/web-components/chunk-OF6FFGOT.js +167 -0
  21. package/dist/web-components/{chunk-GER5UJOF.js → chunk-ORC56MDY.js} +6 -8
  22. package/dist/web-components/{chunk-RTOS7LLG.js → chunk-PC3IOQAH.js} +3 -8
  23. package/dist/web-components/{chunk-JUKB3BUP.js → chunk-PXZWYO6Z.js} +1 -1
  24. package/dist/web-components/{chunk-5R6IFELV.js → chunk-QLT6MTZF.js} +1 -1
  25. package/dist/web-components/{chunk-ECW3HHWA.js → chunk-TQ7IQ4GZ.js} +7 -2
  26. package/dist/web-components/{chunk-QLZ2362S.js → chunk-UUKSDCYS.js} +2 -2
  27. package/dist/web-components/{chunk-ITHLKR7Q.js → chunk-X3NQMBAQ.js} +2 -2
  28. package/dist/web-components/{chunk-AJSXNDAP.js → chunk-X46KL5BK.js} +19 -18
  29. package/dist/web-components/{chunk-HGBNDR22.js → chunk-Y7V7LM6R.js} +1 -1
  30. package/dist/web-components/index.js +35 -31
  31. package/dist/web-components/interaction/bds-accordion-item.js +1 -1
  32. package/dist/web-components/interaction/bds-accordion.js +1 -1
  33. package/dist/web-components/interaction/bds-button.js +1 -1
  34. package/dist/web-components/interaction/bds-dialog.js +1 -1
  35. package/dist/web-components/interaction/bds-drawer.js +1 -1
  36. package/dist/web-components/interaction/bds-popover.js +1 -1
  37. package/dist/web-components/interaction/bds-tooltip.js +1 -1
  38. package/dist/web-components/interaction/form/bds-checkbox.js +1 -1
  39. package/dist/web-components/interaction/form/bds-combobox.js +1 -1
  40. package/dist/web-components/interaction/form/bds-number-input.js +1 -1
  41. package/dist/web-components/interaction/form/bds-radio.js +1 -1
  42. package/dist/web-components/interaction/form/bds-select.js +1 -1
  43. package/dist/web-components/interaction/form/bds-slider.js +1 -1
  44. package/dist/web-components/interaction/form/bds-switch.js +1 -1
  45. package/dist/web-components/interaction/form/bds-textarea.js +1 -1
  46. package/dist/web-components/ui/bds-alert.js +1 -1
  47. package/dist/web-components/ui/bds-avatar.js +1 -1
  48. package/dist/web-components/ui/bds-card.d.ts +3 -9
  49. package/dist/web-components/ui/bds-card.js +1 -1
  50. package/dist/web-components/ui/bds-icon-wrapper.js +1 -1
  51. package/dist/web-components/ui/bds-loading.js +1 -1
  52. package/dist/web-components/ui/bds-notification-banner.js +1 -1
  53. package/dist/web-components/ui/bds-progress.js +1 -1
  54. package/package.json +2 -1
  55. package/src/components/layout/IconWrapper/IconWrapper.module.css +2 -2
  56. package/src/test/token-contract.spec.ts +86 -0
  57. package/src/web-components/interaction/bds-accordion-item.ts +1 -1
  58. package/src/web-components/interaction/bds-accordion.ts +1 -0
  59. package/src/web-components/interaction/bds-button.ts +6 -8
  60. package/src/web-components/interaction/bds-dialog.ts +3 -3
  61. package/src/web-components/interaction/bds-drawer.ts +2 -2
  62. package/src/web-components/interaction/bds-popover.ts +7 -2
  63. package/src/web-components/interaction/bds-tooltip.ts +1 -1
  64. package/src/web-components/interaction/form/bds-checkbox.ts +1 -1
  65. package/src/web-components/interaction/form/bds-combobox.ts +2 -2
  66. package/src/web-components/interaction/form/bds-form-input.ts +1 -1
  67. package/src/web-components/interaction/form/bds-number-input.ts +1 -1
  68. package/src/web-components/interaction/form/bds-radio.ts +3 -3
  69. package/src/web-components/interaction/form/bds-select.ts +2 -2
  70. package/src/web-components/interaction/form/bds-slider.ts +35 -15
  71. package/src/web-components/interaction/form/bds-switch.ts +73 -39
  72. package/src/web-components/interaction/form/bds-textarea.ts +2 -2
  73. package/src/web-components/ui/BdsCard.mdx +4 -3
  74. package/src/web-components/ui/BdsCard.stories.tsx +7 -11
  75. package/src/web-components/ui/BdsSkeleton.stories.tsx +4 -4
  76. package/src/web-components/ui/bds-alert.ts +3 -2
  77. package/src/web-components/ui/bds-avatar.ts +1 -1
  78. package/src/web-components/ui/bds-card.spec.ts +3 -5
  79. package/src/web-components/ui/bds-card.ts +5 -12
  80. package/src/web-components/ui/bds-carousel.ts +7 -7
  81. package/src/web-components/ui/bds-icon-wrapper.ts +3 -3
  82. package/src/web-components/ui/bds-loading.ts +1 -1
  83. package/src/web-components/ui/bds-notification-banner.ts +19 -18
  84. package/src/web-components/ui/bds-pagination.ts +1 -1
  85. package/src/web-components/ui/bds-progress.ts +2 -2
  86. package/src/web-components/ui/bds-table.ts +4 -0
  87. package/dist/web-components/chunk-XNA6WTXG.js +0 -133
@@ -119,7 +119,7 @@ export class BdsDrawer extends LitElement {
119
119
  justify-content: center;
120
120
  inline-size: 2rem;
121
121
  block-size: 2rem;
122
- border-radius: 50%;
122
+ border-radius: var(--drawer_close-radius, var(--bds-border_radius--circle));
123
123
  cursor: pointer;
124
124
  transition: var(--bds-animation_transition);
125
125
  }
@@ -136,7 +136,7 @@ export class BdsDrawer extends LitElement {
136
136
 
137
137
  @media (hover: hover) and (pointer: fine) {
138
138
  .close-button:hover {
139
- background-color: var(--bds-color_bg--subtle);
139
+ background-color: var(--drawer_close-bg--hover, var(--bds-color_bg--subtle));
140
140
  }
141
141
  }
142
142
 
@@ -50,10 +50,15 @@ export class BdsPopover extends LitElement {
50
50
  overflow-y: auto;
51
51
  z-index: var(--popover_z-index, 100);
52
52
  min-width: 12rem;
53
+ max-width: var(--popover_max-width, 20rem);
54
+ max-height: var(--popover_max-height, 80dvh);
53
55
  padding: var(--bds-space_m);
54
- border-radius: var(--bds-border_radius--s);
56
+ border: var(--popover_border, none);
57
+ --bdc_color: currentcolor;
58
+ --bdc-outline_radius: var(--bds-border_radius--s);
59
+ border-radius: var(--popover_radius, var(--bdc-outline_radius));
55
60
  background-color: var(--popover_color, var(--bds-color_bg));
56
- box-shadow: var(--popover_shadow, var(--bds-shadow_m));
61
+ box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--popover_shadow, var(--bds-shadow_m));
57
62
  color: var(--popover_on-color, var(--bds-color_on-bg));
58
63
  font-size: var(--bds-font_size--body);
59
64
  }
@@ -37,7 +37,7 @@ export class BdsTooltip extends LitElement {
37
37
  position: absolute;
38
38
  z-index: var(--bds-z-index_popover, 200);
39
39
  padding: var(--bds-space_xxs) var(--bds-space_xs);
40
- border-radius: var(--bds-border_radius--xs);
40
+ border-radius: var(--tooltip_radius, var(--bds-border_radius--full));
41
41
  background-color: var(--tooltip_bg, var(--bds-color_on-bg));
42
42
  color: var(--tooltip_text, var(--bds-color_bg));
43
43
  font-size: var(--bds-font_size--body--s);
@@ -49,7 +49,7 @@ export class BdsCheckbox extends LitElement {
49
49
  inline-size: var(--inputSize);
50
50
  block-size: var(--inputSize);
51
51
  flex-shrink: 0;
52
- --bdc_color: currentcolor;
52
+ --bdc_color: var(--checkbox_border-color, currentcolor);
53
53
  --bdc-outline_radius: var(--bds-border_radius--xs);
54
54
 
55
55
  border-radius: var(--checkbox_radius, var(--bdc-outline_radius));
@@ -54,8 +54,8 @@ export class BdsCombobox extends LitElement {
54
54
  padding: var(--bds-space_s);
55
55
  padding-inline-end: var(--bds-space_xl);
56
56
  border: none;
57
- --bdc_color: currentcolor;
58
- --bdc-outline_radius: var(--bds-border_radius--xs);
57
+ --bdc_color: var(--combobox_border-color, currentcolor);
58
+ --bdc-outline_radius: var(--bds-border_radius--full);
59
59
 
60
60
  border-radius: var(--combobox_radius, var(--bdc-outline_radius));
61
61
  box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--combobox_shadow, var(--bdc-outline_shadow));
@@ -58,7 +58,7 @@ export class BdsFormInput extends LitElement {
58
58
  position: relative;
59
59
  display: flex;
60
60
  align-items: center;
61
- --bdc_color: currentcolor;
61
+ --bdc_color: var(--formInput_border-color, currentcolor);
62
62
  --bdc-outline_radius: var(--bds-border_radius--xs);
63
63
 
64
64
  border-radius: var(--formInput_radius, var(--bdc-outline_radius));
@@ -42,7 +42,7 @@ export class BdsNumberInput extends LitElement {
42
42
  font-size: var(--bds-font_size--body);
43
43
  padding: var(--bds-space_s);
44
44
  border: none;
45
- --bdc_color: currentcolor;
45
+ --bdc_color: var(--number-input_border-color, currentcolor);
46
46
  --bdc-outline_radius: var(--bds-border_radius--xs);
47
47
 
48
48
  border-radius: var(--number-input_radius, var(--bdc-outline_radius));
@@ -47,10 +47,10 @@ export class BdsRadio extends LitElement {
47
47
  inline-size: var(--inputSize);
48
48
  block-size: var(--inputSize);
49
49
  flex-shrink: 0;
50
- --bdc_color: currentcolor;
51
- --bdc-outline_radius: 50%;
50
+ --bdc_color: var(--radio_border-color, currentcolor);
51
+ --bdc-outline_radius: var(--bds-border_radius--circle);
52
52
 
53
- border-radius: 50%;
53
+ border-radius: var(--radio_radius, var(--bds-border_radius--circle));
54
54
  box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--radio_shadow, var(--bdc-outline_shadow));
55
55
  border: none;
56
56
  appearance: none;
@@ -55,8 +55,8 @@ export class BdsSelect extends LitElement {
55
55
  padding: var(--bds-space_s);
56
56
  padding-inline-end: var(--bds-space_xl);
57
57
  border: none;
58
- --bdc_color: currentcolor;
59
- --bdc-outline_radius: var(--bds-border_radius--xs);
58
+ --bdc_color: var(--select_border-color, currentcolor);
59
+ --bdc-outline_radius: var(--bds-border_radius--full);
60
60
 
61
61
  border-radius: var(--select_radius, var(--bdc-outline_radius));
62
62
  box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--select_shadow, var(--bdc-outline_shadow));
@@ -41,44 +41,64 @@ export class BdsSlider extends LitElement {
41
41
  }
42
42
 
43
43
  .input {
44
+ --slider_track-height: var(--bds-space_xxs);
45
+ --slider_thumb-size: calc(var(--bds-space_s) * 2);
46
+
47
+ color: var(--slider_color, var(--bds-color_on-bg));
44
48
  inline-size: 100%;
45
49
  appearance: none;
46
- block-size: 0.25rem;
47
- border-radius: 999px;
50
+ block-size: var(--slider_track-height);
51
+ border-radius: var(--slider_track-radius, var(--bds-border_radius--full));
48
52
  background: linear-gradient(
49
53
  to right,
50
- var(--slider_fill-color, var(--bds-color_interactive)) var(--slider_fill, 0%),
51
- var(--slider_track-color, var(--bds-color_bg--subtle)) var(--slider_fill, 0%)
54
+ var(--slider_color-active, var(--bdc-color_active)) 0%,
55
+ var(--slider_color-active, var(--bdc-color_active)) var(--slider_fill, 0%),
56
+ var(--slider_track-bg, var(--bds-color_bg--subtle)) var(--slider_fill, 0%),
57
+ var(--slider_track-bg, var(--bds-color_bg--subtle)) 100%
52
58
  );
53
59
  outline: none;
54
60
  cursor: pointer;
61
+ transition: var(--bds-animation_transition);
55
62
  }
56
63
 
57
64
  .input::-webkit-slider-thumb {
58
65
  appearance: none;
59
- inline-size: 1.25rem;
60
- block-size: 1.25rem;
61
- border-radius: 50%;
62
- background-color: var(--slider_thumb-color, var(--bds-color_interactive));
63
- box-shadow: var(--bds-shadow_m);
66
+ inline-size: var(--slider_thumb-size);
67
+ block-size: var(--slider_thumb-size);
68
+ border-radius: var(--slider_thumb-radius, var(--bds-border_radius--circle));
69
+ background-color: var(--slider_color-active, var(--bdc-color_active));
70
+ box-shadow: var(--bds-shadow_s);
64
71
  cursor: pointer;
65
72
  transition: var(--bds-animation_transition);
66
73
  }
67
74
 
68
75
  .input::-moz-range-thumb {
69
- inline-size: 1.25rem;
70
- block-size: 1.25rem;
71
- border-radius: 50%;
76
+ inline-size: var(--slider_thumb-size);
77
+ block-size: var(--slider_thumb-size);
72
78
  border: none;
73
- background-color: var(--slider_thumb-color, var(--bds-color_interactive));
74
- box-shadow: var(--bds-shadow_m);
79
+ border-radius: var(--slider_thumb-radius, var(--bds-border_radius--circle));
80
+ background-color: var(--slider_color-active, var(--bdc-color_active));
81
+ box-shadow: var(--bds-shadow_s);
75
82
  cursor: pointer;
76
83
  }
77
84
 
85
+ .input:disabled {
86
+ opacity: 0.4;
87
+ cursor: not-allowed;
88
+ }
89
+
78
90
  .input:focus-visible {
79
91
  outline: var(--bds-outline_default);
80
92
  outline-offset: var(--bds-outline_offset);
81
- border-radius: 999px;
93
+ border-radius: var(--slider_track-radius, var(--bds-border_radius--full));
94
+ }
95
+
96
+ @media (prefers-reduced-motion: reduce) {
97
+ .input,
98
+ .input::-webkit-slider-thumb,
99
+ .input::-moz-range-thumb {
100
+ transition: none;
101
+ }
82
102
  }
83
103
  `;
84
104
 
@@ -31,7 +31,7 @@ export class BdsSwitch extends LitElement {
31
31
  cursor: pointer;
32
32
  font-size: var(--bds-font_size--body);
33
33
  font-family: var(--bds-font_family--body);
34
- color: var(--bds-color_on-bg);
34
+ color: var(--switch_color, var(--bds-color_on-bg));
35
35
  }
36
36
 
37
37
  :host([disabled]) {
@@ -40,53 +40,87 @@ export class BdsSwitch extends LitElement {
40
40
  pointer-events: none;
41
41
  }
42
42
 
43
- .track {
44
- position: relative;
45
- inline-size: 2.75rem;
46
- block-size: 1.5rem;
47
- border-radius: 999px;
48
- background-color: var(--switch_color_bg, var(--bds-color_bg--subtle));
49
- --bdc_color: currentcolor;
50
-
51
- box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color);
52
- transition: background-color 0.2s ease;
53
- flex-shrink: 0;
54
- }
55
-
56
- .thumb {
57
- position: absolute;
58
- inset-block-start: 0.2rem;
59
- inset-inline-start: 0.2rem;
60
- inline-size: 1.1rem;
61
- block-size: 1.1rem;
62
- border-radius: 50%;
63
- background-color: var(--switch_thumb_color, var(--bds-color_interactive));
64
- transition: inset-inline-start 0.2s ease;
43
+ label {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ gap: var(--bds-space_xs);
47
+ cursor: pointer;
65
48
  }
66
49
 
67
50
  .input {
68
51
  position: absolute;
52
+ inset: 0;
53
+ appearance: none;
69
54
  opacity: 0;
70
- inline-size: 0;
71
- block-size: 0;
55
+ inline-size: 100%;
56
+ block-size: 100%;
72
57
  margin: 0;
58
+ cursor: pointer;
59
+ z-index: 1;
60
+ }
61
+
62
+ .input:disabled {
63
+ cursor: not-allowed;
64
+ }
65
+
66
+ .track {
67
+ --switch_thumb-size: 1.25em;
68
+ --switch_track-pad: var(--bds-space_xxxs);
69
+ --switch_track-height: calc(var(--switch_thumb-size) + var(--switch_track-pad) * 2);
70
+ --switch_track-width: calc(var(--switch_thumb-size) * 2 + var(--switch_track-pad) * 2);
71
+
72
+ position: relative;
73
+ display: inline-flex;
74
+ align-items: center;
75
+ inline-size: var(--switch_track-width);
76
+ block-size: var(--switch_track-height);
77
+ border-radius: var(--switch_track-radius, var(--bds-border_radius--full));
78
+ background-color: var(--switch_track-bg, var(--bds-color_grey--subtle));
79
+ padding-inline: var(--switch_track-pad);
80
+ --bdc_color: var(--switch_thumb-bg, var(--bds-color_interactive));
81
+ box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--switch_shadow, var(--bdc-outline_shadow));
82
+ transition: --bdc_color var(--bds-animation_transition-duration) var(--bds-animation_easing),
83
+ background-color var(--bds-animation_transition-duration) var(--bds-animation_easing);
84
+ flex-shrink: 0;
85
+ pointer-events: none;
86
+ }
87
+
88
+ .thumb {
89
+ display: block;
90
+ inline-size: var(--switch_thumb-size);
91
+ block-size: var(--switch_thumb-size);
92
+ border-radius: var(--switch_thumb-radius, var(--bds-border_radius--circle));
93
+ background-color: var(--switch_thumb-bg, var(--bds-color_interactive));
94
+ box-shadow: var(--bds-shadow_s);
95
+ transition: var(--bds-animation_transition);
96
+ transform: translateX(0);
73
97
  }
74
98
 
75
99
  .input:checked + .track {
76
- background-color: var(--switch_color-active, var(--bdc-color_active--subtle));
100
+ background-color: var(--switch_track-bg--active, var(--bdc-color_active--subtle));
101
+ --bdc_color: var(--switch_thumb-bg--active, var(--bds-color_interactive));
77
102
  }
78
103
 
79
104
  .input:checked + .track .thumb {
80
- inset-inline-start: calc(100% - 1.3rem);
105
+ background-color: var(--switch_thumb-bg--active, var(--bds-color_interactive));
106
+ transform: translateX(var(--switch_thumb-size));
81
107
  }
82
108
 
83
109
  .input:focus-visible + .track {
84
110
  outline: var(--bds-outline_default);
85
111
  outline-offset: var(--bds-outline_offset);
112
+ border-radius: var(--switch_track-radius, var(--bds-border_radius--full));
86
113
  }
87
114
 
88
- label {
89
- cursor: pointer;
115
+ .input:disabled + .track {
116
+ opacity: 0.4;
117
+ }
118
+
119
+ @media (prefers-reduced-motion: reduce) {
120
+ .track,
121
+ .thumb {
122
+ transition: none;
123
+ }
90
124
  }
91
125
  `;
92
126
 
@@ -136,17 +170,17 @@ export class BdsSwitch extends LitElement {
136
170
  render() {
137
171
  const id = `bds-switch-${this._uid}`;
138
172
  return html`
139
- <input
140
- id=${id}
141
- type="checkbox"
142
- role="switch"
143
- class="input"
144
- .checked=${this.checked}
145
- ?required=${this.required}
146
- ?disabled=${this.disabled}
147
- @change=${this._handleChange}
148
- />
149
173
  <label for=${id}>
174
+ <input
175
+ id=${id}
176
+ type="checkbox"
177
+ role="switch"
178
+ class="input"
179
+ .checked=${this.checked}
180
+ ?required=${this.required}
181
+ ?disabled=${this.disabled}
182
+ @change=${this._handleChange}
183
+ />
150
184
  <span class="track">
151
185
  <span class="thumb"></span>
152
186
  </span>
@@ -41,8 +41,8 @@ export class BdsTextarea extends LitElement {
41
41
  line-height: var(--bds-font_line-height--body);
42
42
  padding: var(--bds-space_s);
43
43
  border: none;
44
- --bdc_color: currentcolor;
45
- --bdc-outline_radius: var(--bds-border_radius--xs);
44
+ --bdc_color: var(--textarea_border-color, currentcolor);
45
+ --bdc-outline_radius: var(--bdc-outline_radius--l);
46
46
 
47
47
  border-radius: var(--textarea_radius, var(--bdc-outline_radius));
48
48
  box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--textarea_shadow, var(--bdc-outline_shadow));
@@ -5,7 +5,7 @@ import * as Stories from './BdsCard.stories';
5
5
 
6
6
  # &lt;bds-card&gt;
7
7
 
8
- Framework-agnostic Card layout custom element. A versatile container with three visual variants, configurable padding, text alignment, and an optional clickable mode.
8
+ Framework-agnostic Card layout custom element. A versatile container with three visual variants, text alignment, and an optional clickable mode. Padding is controlled via the `--card_padding` CSS custom property.
9
9
 
10
10
  > **Status: experimental** — API may change before stable release.
11
11
 
@@ -46,7 +46,6 @@ import '@boostdev/design-system-components/web-components';
46
46
  | Attribute | Type | Default | Description |
47
47
  |-----------|------|---------|-------------|
48
48
  | `variant` | `"default" \| "elevated" \| "outlined"` | `"default"` | Shadow and border style |
49
- | `padding` | `"none" \| "small" \| "medium" \| "large"` | `"medium"` | Inner padding |
50
49
  | `text-align` | `"start" \| "center" \| "end"` | `"start"` | Text alignment |
51
50
  | `clickable` | boolean | `false` | Renders the card as a `<button>` with hover/active effects |
52
51
  | `aria-label` | string | — | Accessible label (recommended when `clickable` is set) |
@@ -67,13 +66,15 @@ import '@boostdev/design-system-components/web-components';
67
66
 
68
67
  | Property | Description |
69
68
  |----------|-------------|
69
+ | `--card_padding` | Inner padding (default: `var(--bds-space_m)`) |
70
70
  | `--card_color` | Card background colour |
71
71
  | `--card_on-color` | Card text/foreground colour |
72
+ | `--card_border` | Border on outlined variant (default: `none`) |
72
73
 
73
74
  ## Usage in plain HTML
74
75
 
75
76
  ```html
76
- <bds-card variant="elevated" padding="large">
77
+ <bds-card variant="elevated" style="--card_padding: var(--bds-space_l)">
77
78
  <p>Card content</p>
78
79
  </bds-card>
79
80
 
@@ -1,18 +1,16 @@
1
1
  import React from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react';
3
- import type { CardVariant, CardPadding, CardTextAlign } from './bds-card';
3
+ import type { CardVariant, CardTextAlign } from './bds-card';
4
4
  import '../index'; // auto-registers all custom elements
5
5
 
6
6
  function BdsCard({
7
7
  variant = 'default',
8
- padding = 'medium',
9
8
  textAlign = 'start',
10
9
  clickable,
11
10
  ariaLabel,
12
11
  children,
13
12
  }: {
14
13
  variant?: CardVariant;
15
- padding?: CardPadding;
16
14
  textAlign?: CardTextAlign;
17
15
  clickable?: boolean;
18
16
  ariaLabel?: string;
@@ -22,7 +20,6 @@ function BdsCard({
22
20
  'bds-card',
23
21
  {
24
22
  variant,
25
- padding,
26
23
  'text-align': textAlign,
27
24
  clickable: clickable || undefined,
28
25
  'aria-label': ariaLabel,
@@ -38,7 +35,6 @@ const meta = {
38
35
  parameters: { layout: 'centered' },
39
36
  argTypes: {
40
37
  variant: { control: 'select', options: ['default', 'elevated', 'outlined'] },
41
- padding: { control: 'select', options: ['none', 'small', 'medium', 'large'] },
42
38
  textAlign: { control: 'select', options: ['start', 'center', 'end'] },
43
39
  clickable: { control: 'boolean' },
44
40
  },
@@ -47,19 +43,19 @@ const meta = {
47
43
  export default meta;
48
44
  type Story = StoryObj<typeof meta>;
49
45
 
50
- export const Default: Story = { args: { variant: 'default', padding: 'medium', children: 'Card content goes here.' } };
51
- export const Elevated: Story = { args: { variant: 'elevated', padding: 'medium', children: 'Elevated card.' } };
52
- export const Outlined: Story = { args: { variant: 'outlined', padding: 'medium', children: 'Outlined card.' } };
46
+ export const Default: Story = { args: { variant: 'default', children: 'Card content goes here.' } };
47
+ export const Elevated: Story = { args: { variant: 'elevated', children: 'Elevated card.' } };
48
+ export const Outlined: Story = { args: { variant: 'outlined', children: 'Outlined card.' } };
53
49
  export const Clickable: Story = {
54
- args: { variant: 'default', padding: 'medium', clickable: true, ariaLabel: 'Open details', children: 'Clickable card — hover me.' },
50
+ args: { variant: 'default', clickable: true, ariaLabel: 'Open details', children: 'Clickable card — hover me.' },
55
51
  };
56
52
 
57
53
  export const AllVariants: Story = {
58
54
  render: () => (
59
55
  <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap', maxWidth: 600 }}>
60
56
  {(['default', 'elevated', 'outlined'] as const).map(v =>
61
- React.createElement('bds-card', { key: v, variant: v, padding: 'medium', style: 'width: 160px' },
62
- React.createElement('p', { style: 'margin: 0' }, v),
57
+ React.createElement('bds-card', { key: v, variant: v, style: { width: 160 } },
58
+ React.createElement('p', { style: { margin: 0 } }, v),
63
59
  ),
64
60
  )}
65
61
  </div>
@@ -41,10 +41,10 @@ export const Avatar: Story = {
41
41
  export const ContentBlock: Story = {
42
42
  render: () => (
43
43
  <div style={{ display: 'flex', flexDirection: 'column', gap: 8, width: 300 }}>
44
- {React.createElement('bds-skeleton', { style: 'width: 100%; height: 1.5rem;' })}
45
- {React.createElement('bds-skeleton', { style: 'width: 80%; height: 1rem;' })}
46
- {React.createElement('bds-skeleton', { style: 'width: 90%; height: 1rem;' })}
47
- {React.createElement('bds-skeleton', { style: 'width: 60%; height: 1rem;' })}
44
+ {React.createElement('bds-skeleton', { style: { width: '100%', height: '1.5rem' } })}
45
+ {React.createElement('bds-skeleton', { style: { width: '80%', height: '1rem' } })}
46
+ {React.createElement('bds-skeleton', { style: { width: '90%', height: '1rem' } })}
47
+ {React.createElement('bds-skeleton', { style: { width: '60%', height: '1rem' } })}
48
48
  </div>
49
49
  ),
50
50
  };
@@ -112,7 +112,8 @@ export class BdsAlert extends LitElement {
112
112
  cursor: pointer;
113
113
  color: currentcolor;
114
114
  transition: var(--bds-animation_transition);
115
- border-radius: 50%;
115
+ border: var(--alert_dismiss-border, none);
116
+ border-radius: var(--alert_dismiss-radius, var(--bds-border_radius--circle));
116
117
  --bdc_color: currentcolor;
117
118
  box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color);
118
119
  }
@@ -129,7 +130,7 @@ export class BdsAlert extends LitElement {
129
130
 
130
131
  @media (hover: hover) and (pointer: fine) {
131
132
  .dismiss:hover {
132
- opacity: 0.7;
133
+ opacity: var(--alert_dismiss-opacity--hover, 0.7);
133
134
  }
134
135
  }
135
136
  `;
@@ -23,7 +23,7 @@ export class BdsAvatar extends LitElement {
23
23
  justify-content: center;
24
24
  inline-size: var(--avatar_size, 3em);
25
25
  block-size: var(--avatar_size, 3em);
26
- border-radius: 50%;
26
+ border-radius: var(--avatar_radius, var(--bds-border_radius--circle));
27
27
  overflow: hidden;
28
28
  flex-shrink: 0;
29
29
  }
@@ -6,10 +6,9 @@ describe('bds-card', () => {
6
6
  expect(customElements.get('bds-card')).toBe(BdsCard);
7
7
  });
8
8
 
9
- it('defaults to variant="default", padding="medium", text-align="start"', async () => {
9
+ it('defaults to variant="default", text-align="start"', async () => {
10
10
  const el = await fixture('<bds-card>Content</bds-card>') as BdsCard;
11
11
  expect(el.getAttribute('variant')).toBe('default');
12
- expect(el.getAttribute('padding')).toBe('medium');
13
12
  expect(el.getAttribute('text-align')).toBe('start');
14
13
  cleanup(el);
15
14
  });
@@ -45,11 +44,10 @@ describe('bds-card', () => {
45
44
  cleanup(el);
46
45
  });
47
46
 
48
- it('applies variant, padding and text-align classes to the card element', async () => {
49
- const el = await fixture('<bds-card variant="elevated" padding="large" text-align="center">Content</bds-card>');
47
+ it('applies variant and text-align classes to the card element', async () => {
48
+ const el = await fixture('<bds-card variant="elevated" text-align="center">Content</bds-card>');
50
49
  const card = el.shadowRoot!.querySelector('.card')!;
51
50
  expect(card.classList.contains('--elevated')).toBe(true);
52
- expect(card.classList.contains('--padding-large')).toBe(true);
53
51
  expect(card.classList.contains('--text-center')).toBe(true);
54
52
  cleanup(el);
55
53
  });
@@ -1,7 +1,6 @@
1
1
  import { LitElement, css, html, nothing } from 'lit';
2
2
 
3
3
  export type CardVariant = 'default' | 'elevated' | 'outlined';
4
- export type CardPadding = 'none' | 'small' | 'medium' | 'large';
5
4
  export type CardTextAlign = 'start' | 'center' | 'end';
6
5
 
7
6
  /**
@@ -9,7 +8,7 @@ export type CardTextAlign = 'start' | 'center' | 'end';
9
8
  *
10
9
  * Attributes:
11
10
  * variant — "default" (default) | "elevated" | "outlined"
12
- * padding "none" | "small" | "medium" (default) | "large"
11
+ * --card_padding CSS custom property to override padding (default: var(--bds-space_m))
13
12
  * text-align — "start" (default) | "center" | "end"
14
13
  * clickable — boolean; renders as a <button> with hover/active effects
15
14
  * aria-label — accessible label (useful when clickable)
@@ -21,7 +20,7 @@ export type CardTextAlign = 'start' | 'center' | 'end';
21
20
  * bds-click — fired (bubbles, composed) when the card button is clicked
22
21
  *
23
22
  * @example
24
- * <bds-card variant="elevated" padding="large">
23
+ * <bds-card variant="elevated" style="--card_padding: var(--bds-space_l)">
25
24
  * <p>Card content</p>
26
25
  * </bds-card>
27
26
  *
@@ -43,9 +42,11 @@ export class BdsCard extends LitElement {
43
42
  position: relative;
44
43
  box-sizing: border-box;
45
44
  inline-size: 100%;
45
+ block-size: 100%;
46
46
  text-align: inherit;
47
47
  font: inherit;
48
48
  border: none;
49
+ padding: var(--card_padding, var(--bds-space_m));
49
50
  }
50
51
 
51
52
  /* Resting shadows — consumers can override per-variant via
@@ -54,15 +55,11 @@ export class BdsCard extends LitElement {
54
55
  .card.--elevated { box-shadow: var(--card_shadow--elevated, var(--bds-shadow_m)); }
55
56
 
56
57
  .card.--outlined {
58
+ border: var(--card_border, none);
57
59
  --bdc_color: currentcolor;
58
60
  box-shadow: var(--card_shadow--outlined, inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--bds-shadow_s));
59
61
  }
60
62
 
61
- .card.--padding-none { padding: 0; }
62
- .card.--padding-small { padding: var(--bds-space_s); }
63
- .card.--padding-medium { padding: var(--bds-space_m); }
64
- .card.--padding-large { padding: var(--bds-space_l); }
65
-
66
63
  .card.--text-start { text-align: start; }
67
64
  .card.--text-center { text-align: center; }
68
65
  .card.--text-end { text-align: end; }
@@ -96,14 +93,12 @@ export class BdsCard extends LitElement {
96
93
 
97
94
  static properties = {
98
95
  variant: { type: String, reflect: true },
99
- padding: { type: String, reflect: true },
100
96
  textAlign: { type: String, attribute: 'text-align', reflect: true },
101
97
  clickable: { type: Boolean, reflect: true },
102
98
  ariaLabel: { type: String, attribute: 'aria-label' },
103
99
  };
104
100
 
105
101
  declare variant: CardVariant;
106
- declare padding: CardPadding;
107
102
  declare textAlign: CardTextAlign;
108
103
  declare clickable: boolean;
109
104
  declare ariaLabel: string;
@@ -111,7 +106,6 @@ export class BdsCard extends LitElement {
111
106
  constructor() {
112
107
  super();
113
108
  this.variant = 'default';
114
- this.padding = 'medium';
115
109
  this.textAlign = 'start';
116
110
  this.clickable = false;
117
111
  this.ariaLabel = '';
@@ -125,7 +119,6 @@ export class BdsCard extends LitElement {
125
119
  const classes = [
126
120
  'card',
127
121
  `--${this.variant}`,
128
- `--padding-${this.padding}`,
129
122
  `--text-${this.textAlign}`,
130
123
  this.clickable ? '--clickable' : '',
131
124
  ].filter(Boolean).join(' ');
@@ -63,8 +63,8 @@ export class BdsCarousel extends LitElement {
63
63
  inline-size: 2.5rem;
64
64
  block-size: 2.5rem;
65
65
  border: none;
66
- border-radius: var(--bds-border_radius--full, 9999px);
67
- background-color: var(--bds-color_bg--subtle);
66
+ border-radius: var(--carousel_navBtn-radius, var(--bds-border_radius--circle));
67
+ background-color: var(--carousel_navBtn-bg, var(--bds-color_bg--subtle));
68
68
  color: var(--bds-color_on-bg);
69
69
  cursor: pointer;
70
70
  transition: var(--bds-animation_transition);
@@ -77,7 +77,7 @@ export class BdsCarousel extends LitElement {
77
77
 
78
78
  @media (hover: hover) and (pointer: fine) {
79
79
  .nav-btn:hover {
80
- background-color: var(--bds-color_bg--strong);
80
+ background-color: var(--carousel_navBtn-bg--hover, var(--bds-color_bg--strong));
81
81
  }
82
82
  }
83
83
 
@@ -102,18 +102,18 @@ export class BdsCarousel extends LitElement {
102
102
  .dot {
103
103
  inline-size: 0.5rem;
104
104
  block-size: 0.5rem;
105
- border-radius: 50%;
105
+ border-radius: var(--carousel_indicator-radius, var(--bds-border_radius--circle));
106
106
  border: none;
107
107
  padding: 0;
108
- background-color: var(--bds-color_bg--strong);
108
+ background-color: var(--carousel_indicator-bg, var(--bds-color_bg--strong));
109
109
  cursor: pointer;
110
110
  transition: var(--bds-animation_transition);
111
111
  }
112
112
 
113
113
  .dot.--active {
114
- background-color: var(--bds-color_interactive);
114
+ background-color: var(--carousel_indicator-bg--active, var(--bds-color_interactive));
115
115
  inline-size: 1rem;
116
- border-radius: 0.25rem;
116
+ border-radius: var(--carousel_indicator-radius--active, var(--bds-border_radius--full));
117
117
  }
118
118
 
119
119
  .dot:focus-visible {