@digiko-npm/designsystem 0.5.0 → 0.7.2

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 (55) hide show
  1. package/README.md +7 -7
  2. package/dist/designsystem.css +1284 -474
  3. package/dist/designsystem.min.css +2 -2
  4. package/package.json +6 -1
  5. package/src/base/typography.css +8 -8
  6. package/src/components/accordion.css +21 -14
  7. package/src/components/alert.css +25 -19
  8. package/src/components/avatar.css +16 -16
  9. package/src/components/bottom-nav.css +27 -21
  10. package/src/components/breadcrumb.css +7 -0
  11. package/src/components/button.css +10 -2
  12. package/src/components/card.css +6 -42
  13. package/src/components/chip.css +10 -3
  14. package/src/components/collapsible.css +116 -0
  15. package/src/components/command.css +17 -7
  16. package/src/components/custom-select.css +123 -7
  17. package/src/components/datepicker.css +9 -9
  18. package/src/components/description-list.css +98 -0
  19. package/src/components/divider.css +1 -1
  20. package/src/components/drawer.css +28 -19
  21. package/src/components/drop-zone.css +10 -3
  22. package/src/components/dropdown.css +17 -8
  23. package/src/components/empty-state.css +3 -3
  24. package/src/components/field.css +77 -0
  25. package/src/components/icon-btn.css +12 -6
  26. package/src/components/index.css +5 -0
  27. package/src/components/input.css +26 -16
  28. package/src/components/kbd.css +1 -1
  29. package/src/components/modal.css +13 -4
  30. package/src/components/nav.css +22 -11
  31. package/src/components/pagination.css +9 -0
  32. package/src/components/popover.css +10 -10
  33. package/src/components/progress.css +2 -2
  34. package/src/components/result.css +84 -0
  35. package/src/components/search.css +24 -26
  36. package/src/components/skeleton.css +4 -4
  37. package/src/components/slider.css +13 -6
  38. package/src/components/sortable.css +9 -0
  39. package/src/components/stat-card.css +41 -0
  40. package/src/components/table.css +3 -3
  41. package/src/components/tabs.css +26 -18
  42. package/src/components/tag.css +11 -3
  43. package/src/components/timeline.css +14 -14
  44. package/src/components/toast.css +19 -7
  45. package/src/components/toggle.css +10 -2
  46. package/src/components/toolbar.css +1 -1
  47. package/src/components/tooltip.css +34 -28
  48. package/src/index.css +6 -4
  49. package/src/tokens/colors.css +18 -6
  50. package/src/tokens/spacing.css +7 -0
  51. package/src/utilities/a11y.css +102 -0
  52. package/src/utilities/index.css +1 -0
  53. package/src/utilities/layout.css +26 -26
  54. package/src/utilities/spacing.css +52 -52
  55. package/src/utilities/text.css +8 -8
@@ -4,6 +4,12 @@
4
4
  A toggle (switch) control for binary on/off states.
5
5
  Supports aria-checked attribute and modifier-class driven states.
6
6
 
7
+ ARIA requirements (consumer responsibility):
8
+ - Element: <button role="switch" aria-checked="false|true">
9
+ - Label: pair with visible label via aria-labelledby or wrap in <label>
10
+ - Keyboard: Space toggles state (native <button> handles this)
11
+ - State: update aria-checked on toggle
12
+
7
13
  Usage:
8
14
  <button class="ds-toggle" role="switch" aria-checked="false"></button>
9
15
 
@@ -40,8 +46,8 @@
40
46
  .ds-toggle::after {
41
47
  content: "";
42
48
  position: absolute;
43
- left: 2px;
44
- top: 50%;
49
+ inset-inline-start: 2px;
50
+ inset-block-start: 50%;
45
51
  width: 1.25rem;
46
52
  height: 1.25rem;
47
53
  border-radius: var(--ds-radius-full);
@@ -85,6 +91,7 @@
85
91
  .ds-toggle:focus-visible {
86
92
  outline: none;
87
93
  box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
94
+ scroll-margin-block: var(--ds-space-16, 4rem);
88
95
  }
89
96
 
90
97
  /* ---------------------------------------------------------------------------
@@ -105,6 +112,7 @@
105
112
  .ds-toggle--sm {
106
113
  width: 2rem;
107
114
  height: 1.125rem;
115
+ min-height: 1.5rem; /* WCAG 2.5.8: minimum 24px target */
108
116
  }
109
117
 
110
118
  .ds-toggle--sm::after {
@@ -166,7 +166,7 @@
166
166
  }
167
167
 
168
168
  /* Responsive: mobile */
169
- @media (max-width: 1023px) {
169
+ @media (max-width: 1023px) /* below --ds-breakpoint-lg */ {
170
170
  .ds-toolbar__row {
171
171
  padding-inline: var(--ds-space-3);
172
172
  gap: var(--ds-space-2);
@@ -2,6 +2,12 @@
2
2
  Component: Tooltip
3
3
  Inverted bubble with arrow, positioned via modifier classes.
4
4
  Default placement: top.
5
+
6
+ ARIA requirements (consumer responsibility):
7
+ - Tooltip content: role="tooltip", id="[tooltip-id]"
8
+ - Trigger element: aria-describedby="[tooltip-id]"
9
+ - Keyboard: tooltip should show on focus as well as hover (CSS handles this via :hover)
10
+ - For focus support: also add :focus-within show logic if trigger is focusable
5
11
  ========================================================================== */
6
12
 
7
13
  .ds-tooltip {
@@ -62,8 +68,8 @@
62
68
 
63
69
  .ds-tooltip .ds-tooltip__content,
64
70
  .ds-tooltip--top .ds-tooltip__content {
65
- bottom: calc(100% + var(--ds-offset-md));
66
- left: 50%;
71
+ inset-block-end: calc(100% + var(--ds-offset-md));
72
+ inset-inline-start: 50%;
67
73
  transform: translateX(-50%) translateY(4px);
68
74
  }
69
75
 
@@ -75,8 +81,8 @@
75
81
  /* Arrow — points down */
76
82
  .ds-tooltip .ds-tooltip__content::after,
77
83
  .ds-tooltip--top .ds-tooltip__content::after {
78
- top: 100%;
79
- left: 50%;
84
+ inset-block-start: 100%;
85
+ inset-inline-start: 50%;
80
86
  transform: translateX(-50%);
81
87
  border-top-color: var(--ds-color-inverted);
82
88
  }
@@ -86,9 +92,9 @@
86
92
  ============================================= */
87
93
 
88
94
  .ds-tooltip--bottom .ds-tooltip__content {
89
- top: calc(100% + var(--ds-offset-md));
90
- bottom: auto;
91
- left: 50%;
95
+ inset-block-start: calc(100% + var(--ds-offset-md));
96
+ inset-block-end: auto;
97
+ inset-inline-start: 50%;
92
98
  transform: translateX(-50%) translateY(-4px);
93
99
  }
94
100
 
@@ -98,9 +104,9 @@
98
104
 
99
105
  /* Arrow — points up */
100
106
  .ds-tooltip--bottom .ds-tooltip__content::after {
101
- bottom: 100%;
102
- top: auto;
103
- left: 50%;
107
+ inset-block-end: 100%;
108
+ inset-block-start: auto;
109
+ inset-inline-start: 50%;
104
110
  transform: translateX(-50%);
105
111
  border-top-color: transparent;
106
112
  border-bottom-color: var(--ds-color-inverted);
@@ -111,10 +117,10 @@
111
117
  ============================================= */
112
118
 
113
119
  .ds-tooltip--left .ds-tooltip__content {
114
- right: calc(100% + var(--ds-offset-md));
115
- left: auto;
116
- bottom: auto;
117
- top: 50%;
120
+ inset-inline-end: calc(100% + var(--ds-offset-md));
121
+ inset-inline-start: auto;
122
+ inset-block-end: auto;
123
+ inset-block-start: 50%;
118
124
  transform: translateY(-50%) translateX(4px);
119
125
  }
120
126
 
@@ -124,13 +130,13 @@
124
130
 
125
131
  /* Arrow — points right */
126
132
  .ds-tooltip--left .ds-tooltip__content::after {
127
- left: 100%;
128
- top: 50%;
129
- bottom: auto;
130
- right: auto;
133
+ inset-inline-start: 100%;
134
+ inset-block-start: 50%;
135
+ inset-block-end: auto;
136
+ inset-inline-end: auto;
131
137
  transform: translateY(-50%);
132
138
  border-top-color: transparent;
133
- border-left-color: var(--ds-color-inverted);
139
+ border-inline-start-color: var(--ds-color-inverted);
134
140
  }
135
141
 
136
142
  /* =============================================
@@ -138,10 +144,10 @@
138
144
  ============================================= */
139
145
 
140
146
  .ds-tooltip--right .ds-tooltip__content {
141
- left: calc(100% + var(--ds-offset-md));
142
- right: auto;
143
- bottom: auto;
144
- top: 50%;
147
+ inset-inline-start: calc(100% + var(--ds-offset-md));
148
+ inset-inline-end: auto;
149
+ inset-block-end: auto;
150
+ inset-block-start: 50%;
145
151
  transform: translateY(-50%) translateX(-4px);
146
152
  }
147
153
 
@@ -151,11 +157,11 @@
151
157
 
152
158
  /* Arrow — points left */
153
159
  .ds-tooltip--right .ds-tooltip__content::after {
154
- right: 100%;
155
- left: auto;
156
- top: 50%;
157
- bottom: auto;
160
+ inset-inline-end: 100%;
161
+ inset-inline-start: auto;
162
+ inset-block-start: 50%;
163
+ inset-block-end: auto;
158
164
  transform: translateY(-50%);
159
165
  border-top-color: transparent;
160
- border-right-color: var(--ds-color-inverted);
166
+ border-inline-end-color: var(--ds-color-inverted);
161
167
  }
package/src/index.css CHANGED
@@ -13,7 +13,9 @@
13
13
  Your values always win. Nothing breaks.
14
14
  ========================================================================== */
15
15
 
16
- @import './tokens/index.css';
17
- @import './base/index.css';
18
- @import './components/index.css';
19
- @import './utilities/index.css';
16
+ @layer tokens, base, components, utilities;
17
+
18
+ @import './tokens/index.css' layer(tokens);
19
+ @import './base/index.css' layer(base);
20
+ @import './components/index.css' layer(components);
21
+ @import './utilities/index.css' layer(utilities);
@@ -17,7 +17,13 @@
17
17
  --ds-color-surface-hover: #fafafa;
18
18
  --ds-color-surface-active: #f4f4f5;
19
19
 
20
- /* --- Text — zinc hierarchy --- */
20
+ /* --- Text — zinc hierarchy ---
21
+ Contrast ratios on --ds-color-bg (#fafafa):
22
+ --text: #09090b → ~19.3:1 ✅ WCAG AAA
23
+ --text-secondary: #52525b → ~7.6:1 ✅ WCAG AAA
24
+ --text-tertiary: #a1a1aa → ~2.5:1 ⚠ Decorative/non-essential only (does not meet 4.5:1)
25
+ --text-disabled: #d4d4d8 → ~1.5:1 ⚠ Disabled state (exempt per WCAG 1.4.3)
26
+ --- */
21
27
  --ds-color-text: #09090b;
22
28
  --ds-color-text-secondary: #52525b;
23
29
  --ds-color-text-tertiary: #a1a1aa;
@@ -64,18 +70,24 @@
64
70
  }
65
71
 
66
72
  /* Dark theme */
67
- [data-theme="dark"], .dark {
73
+ [data-theme="dark"] {
68
74
  /* --- Backgrounds — deep, refined zinc-900 palette --- */
69
75
  --ds-color-bg: #09090b;
70
76
  --ds-color-bg-subtle: #0f0f11;
71
- --ds-color-bg-muted: #27272a;
72
- --ds-color-bg-elevated: #18181b;
77
+ --ds-color-bg-muted: #18181b;
78
+ --ds-color-bg-elevated: #1c1c20;
73
79
 
74
80
  --ds-color-surface: #0f0f11;
75
81
  --ds-color-surface-hover: #18181b;
76
82
  --ds-color-surface-active: #27272a;
77
83
 
78
- /* --- Text --- */
84
+ /* --- Text ---
85
+ Contrast ratios on --ds-color-bg (#09090b):
86
+ --text: #fafafa → ~19.3:1 ✅ WCAG AAA
87
+ --text-secondary: #a1a1aa → ~7.6:1 ✅ WCAG AAA
88
+ --text-tertiary: #71717a → ~3.8:1 ⚠ Decorative/non-essential only (does not meet 4.5:1)
89
+ --text-disabled: #3f3f46 → ~2.0:1 ⚠ Disabled state (exempt per WCAG 1.4.3)
90
+ --- */
79
91
  --ds-color-text: #fafafa;
80
92
  --ds-color-text-secondary: #a1a1aa;
81
93
  --ds-color-text-tertiary: #71717a;
@@ -162,7 +174,7 @@
162
174
  }
163
175
 
164
176
  /* Dark overrides for status/accent (brighter for contrast) */
165
- [data-theme="dark"], .dark {
177
+ [data-theme="dark"] {
166
178
  --ds-color-success: #4ade80;
167
179
  --ds-color-success-subtle: rgba(74, 222, 128, 0.1);
168
180
  --ds-color-success-border: rgba(74, 222, 128, 0.2);
@@ -3,6 +3,13 @@
3
3
  Generous whitespace, responsive sections.
4
4
  ========================================================================== */
5
5
 
6
+ /* Breakpoints (reference only — CSS cannot use vars in @media)
7
+ --ds-breakpoint-sm: 640px
8
+ --ds-breakpoint-md: 768px
9
+ --ds-breakpoint-lg: 1024px
10
+ --ds-breakpoint-xl: 1280px
11
+ */
12
+
6
13
  :root {
7
14
  /* --- Spacing Scale --- */
8
15
  --ds-space-0: 0;
@@ -0,0 +1,102 @@
1
+ /* ==========================================================================
2
+ Utilities: Accessibility
3
+ Screen-reader helpers, skip links, focus utilities, and motion control.
4
+ ========================================================================== */
5
+
6
+ /* ---------------------------------------------------------------------------
7
+ Screen Reader Only — visually hidden, available to assistive technology
8
+ --------------------------------------------------------------------------- */
9
+
10
+ .ds-sr-only {
11
+ position: absolute;
12
+ width: 1px;
13
+ height: 1px;
14
+ padding: 0;
15
+ margin: -1px;
16
+ overflow: hidden;
17
+ clip: rect(0, 0, 0, 0);
18
+ white-space: nowrap;
19
+ border-width: 0;
20
+ }
21
+
22
+ /* ---------------------------------------------------------------------------
23
+ Not Screen Reader Only — reset ds-sr-only when needed (e.g., responsive)
24
+ --------------------------------------------------------------------------- */
25
+
26
+ .ds-not-sr-only {
27
+ position: static;
28
+ width: auto;
29
+ height: auto;
30
+ padding: 0;
31
+ margin: 0;
32
+ overflow: visible;
33
+ clip: auto;
34
+ white-space: normal;
35
+ }
36
+
37
+ /* ---------------------------------------------------------------------------
38
+ Focus Visible Only — invisible by default, shown on keyboard focus
39
+ --------------------------------------------------------------------------- */
40
+
41
+ .ds-focus-visible-only {
42
+ opacity: 0;
43
+ pointer-events: none;
44
+ }
45
+
46
+ .ds-focus-visible-only:focus-visible {
47
+ opacity: 1;
48
+ pointer-events: auto;
49
+ }
50
+
51
+ /* ---------------------------------------------------------------------------
52
+ Skip Link — skip to main content, visible only on focus
53
+ --------------------------------------------------------------------------- */
54
+
55
+ .ds-skip-link {
56
+ position: absolute;
57
+ width: 1px;
58
+ height: 1px;
59
+ padding: 0;
60
+ margin: -1px;
61
+ overflow: hidden;
62
+ clip: rect(0, 0, 0, 0);
63
+ white-space: nowrap;
64
+ border-width: 0;
65
+ }
66
+
67
+ .ds-skip-link:focus-visible {
68
+ position: fixed;
69
+ inset-block-start: 0;
70
+ inset-inline-start: 0;
71
+ z-index: var(--ds-z-tooltip, 200);
72
+ width: auto;
73
+ height: auto;
74
+ padding: var(--ds-space-3) var(--ds-space-5);
75
+ margin: 0;
76
+ overflow: visible;
77
+ clip: auto;
78
+ white-space: normal;
79
+ background-color: var(--ds-color-inverted);
80
+ color: var(--ds-color-on-inverted);
81
+ font-family: var(--ds-font-sans);
82
+ font-size: var(--ds-text-sm);
83
+ font-weight: var(--ds-weight-medium);
84
+ border-radius: 0 0 var(--ds-radius-lg) 0;
85
+ box-shadow: var(--ds-shadow-lg);
86
+ text-decoration: none;
87
+ outline: none;
88
+ }
89
+
90
+ /* ---------------------------------------------------------------------------
91
+ Reduce Motion — force reduced motion on a specific element
92
+ --------------------------------------------------------------------------- */
93
+
94
+ .ds-reduce-motion,
95
+ .ds-reduce-motion *,
96
+ .ds-reduce-motion *::before,
97
+ .ds-reduce-motion *::after {
98
+ animation-duration: 0.01ms !important;
99
+ animation-iteration-count: 1 !important;
100
+ transition-duration: 0.01ms !important;
101
+ scroll-behavior: auto !important;
102
+ }
@@ -2,3 +2,4 @@
2
2
  @import './spacing.css';
3
3
  @import './text.css';
4
4
  @import './interactive.css';
5
+ @import './a11y.css';
@@ -78,7 +78,7 @@
78
78
  .ds-md\:flex-row { flex-direction: row; }
79
79
  }
80
80
 
81
- @media (min-width: 1024px) {
81
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
82
82
  .ds-lg\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
83
83
  .ds-lg\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
84
84
  .ds-lg\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
@@ -117,7 +117,7 @@
117
117
  .ds-relative { position: relative; }
118
118
  .ds-absolute { position: absolute; }
119
119
  .ds-fixed { position: fixed; }
120
- .ds-sticky { position: sticky; top: 0; }
120
+ .ds-sticky { position: sticky; inset-block-start: 0; }
121
121
 
122
122
  /* --- Overflow --- */
123
123
  .ds-overflow-hidden { overflow: hidden; }
@@ -133,14 +133,14 @@
133
133
  /* --- Stack (vertical spacing) ---
134
134
  :where() lowers specificity so ds-mt-* can override individual children. */
135
135
  :where(.ds-stack) > * + * {
136
- margin-top: var(--ds-space-4);
136
+ margin-block-start: var(--ds-space-4);
137
137
  }
138
138
 
139
- :where(.ds-stack--sm) > * + * { margin-top: var(--ds-space-2); }
140
- :where(.ds-stack--lg) > * + * { margin-top: var(--ds-space-8); }
141
- :where(.ds-stack--xl) > * + * { margin-top: var(--ds-space-12); }
142
- :where(.ds-stack--2xl) > * + * { margin-top: var(--ds-space-16); }
143
- :where(.ds-stack--3xl) > * + * { margin-top: var(--ds-space-24); }
139
+ :where(.ds-stack--sm) > * + * { margin-block-start: var(--ds-space-2); }
140
+ :where(.ds-stack--lg) > * + * { margin-block-start: var(--ds-space-8); }
141
+ :where(.ds-stack--xl) > * + * { margin-block-start: var(--ds-space-12); }
142
+ :where(.ds-stack--2xl) > * + * { margin-block-start: var(--ds-space-16); }
143
+ :where(.ds-stack--3xl) > * + * { margin-block-start: var(--ds-space-24); }
144
144
 
145
145
  /* --- Center content --- */
146
146
  .ds-center {
@@ -193,22 +193,22 @@
193
193
 
194
194
  /* --- Inset / Position Values --- */
195
195
  .ds-inset-0 { inset: 0; }
196
- .ds-inset-x-0 { left: 0; right: 0; }
197
- .ds-inset-y-0 { top: 0; bottom: 0; }
198
- .ds-top-0 { top: 0; }
199
- .ds-top-full { top: 100%; }
200
- .ds-right-0 { right: 0; }
201
- .ds-bottom-0 { bottom: 0; }
202
- .ds-bottom-full { bottom: 100%; }
203
- .ds-left-0 { left: 0; }
204
- .ds-top-2 { top: var(--ds-space-2); }
205
- .ds-right-2 { right: var(--ds-space-2); }
206
- .ds-left-2 { left: var(--ds-space-2); }
207
- .ds-top-3 { top: var(--ds-space-3); }
208
- .ds-right-3 { right: var(--ds-space-3); }
209
- .ds-left-3 { left: var(--ds-space-3); }
210
- .ds-top-1\/2 { top: 50%; }
211
- .ds-left-1\/2 { left: 50%; }
196
+ .ds-inset-x-0 { inset-inline-start: 0; inset-inline-end: 0; }
197
+ .ds-inset-y-0 { inset-block-start: 0; inset-block-end: 0; }
198
+ .ds-top-0 { inset-block-start: 0; }
199
+ .ds-top-full { inset-block-start: 100%; }
200
+ .ds-right-0 { inset-inline-end: 0; }
201
+ .ds-bottom-0 { inset-block-end: 0; }
202
+ .ds-bottom-full { inset-block-end: 100%; }
203
+ .ds-left-0 { inset-inline-start: 0; }
204
+ .ds-top-2 { inset-block-start: var(--ds-space-2); }
205
+ .ds-right-2 { inset-inline-end: var(--ds-space-2); }
206
+ .ds-left-2 { inset-inline-start: var(--ds-space-2); }
207
+ .ds-top-3 { inset-block-start: var(--ds-space-3); }
208
+ .ds-right-3 { inset-inline-end: var(--ds-space-3); }
209
+ .ds-left-3 { inset-inline-start: var(--ds-space-3); }
210
+ .ds-top-1\/2 { inset-block-start: 50%; }
211
+ .ds-left-1\/2 { inset-inline-start: 50%; }
212
212
 
213
213
  /* --- Object Fit --- */
214
214
  .ds-object-cover { object-fit: cover; }
@@ -226,7 +226,7 @@
226
226
  .ds-sm\:table-cell { display: table-cell; }
227
227
  }
228
228
 
229
- @media (min-width: 1024px) {
229
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
230
230
  .ds-lg\:hidden { display: none; }
231
231
  .ds-lg\:block { display: block; }
232
232
  .ds-lg\:flex { display: flex; }
@@ -237,7 +237,7 @@
237
237
  .ds-sm\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
238
238
  }
239
239
 
240
- @media (min-width: 1024px) {
240
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
241
241
  .ds-lg\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
242
242
  .ds-lg\:grid-cols-5 { grid-template-columns: repeat(5, 1fr); }
243
243
  }
@@ -36,15 +36,15 @@
36
36
  .ds-py-20 { padding-block: var(--ds-space-20); }
37
37
  .ds-py-24 { padding-block: var(--ds-space-24); }
38
38
 
39
- .ds-pt-2 { padding-top: var(--ds-space-2); }
40
- .ds-pt-4 { padding-top: var(--ds-space-4); }
41
- .ds-pt-6 { padding-top: var(--ds-space-6); }
42
- .ds-pt-8 { padding-top: var(--ds-space-8); }
43
- .ds-pt-12 { padding-top: var(--ds-space-12); }
44
- .ds-pt-16 { padding-top: var(--ds-space-16); }
39
+ .ds-pt-2 { padding-block-start: var(--ds-space-2); }
40
+ .ds-pt-4 { padding-block-start: var(--ds-space-4); }
41
+ .ds-pt-6 { padding-block-start: var(--ds-space-6); }
42
+ .ds-pt-8 { padding-block-start: var(--ds-space-8); }
43
+ .ds-pt-12 { padding-block-start: var(--ds-space-12); }
44
+ .ds-pt-16 { padding-block-start: var(--ds-space-16); }
45
45
 
46
- .ds-pb-4 { padding-bottom: var(--ds-space-4); }
47
- .ds-pb-8 { padding-bottom: var(--ds-space-8); }
46
+ .ds-pb-4 { padding-block-end: var(--ds-space-4); }
47
+ .ds-pb-8 { padding-block-end: var(--ds-space-8); }
48
48
 
49
49
  /* --- Margin --- */
50
50
  .ds-m-0 { margin: var(--ds-space-0); }
@@ -60,33 +60,33 @@
60
60
  .ds-my-6 { margin-block: var(--ds-space-6); }
61
61
  .ds-my-8 { margin-block: var(--ds-space-8); }
62
62
 
63
- .ds-mt-0 { margin-top: var(--ds-space-0); }
64
- .ds-mt-1 { margin-top: var(--ds-space-1); }
65
- .ds-mt-2 { margin-top: var(--ds-space-2); }
66
- .ds-mt-4 { margin-top: var(--ds-space-4); }
67
- .ds-mt-6 { margin-top: var(--ds-space-6); }
68
- .ds-mt-8 { margin-top: var(--ds-space-8); }
69
-
70
- .ds-mb-0 { margin-bottom: var(--ds-space-0); }
71
- .ds-mb-1 { margin-bottom: var(--ds-space-1); }
72
- .ds-mb-2 { margin-bottom: var(--ds-space-2); }
73
- .ds-mb-4 { margin-bottom: var(--ds-space-4); }
74
- .ds-mb-6 { margin-bottom: var(--ds-space-6); }
75
- .ds-mb-8 { margin-bottom: var(--ds-space-8); }
76
-
77
- .ds-mt-auto { margin-top: auto; }
78
- .ds-mb-auto { margin-bottom: auto; }
79
- .ds-ml-auto { margin-left: auto; }
80
- .ds-mr-auto { margin-right: auto; }
81
- .ds-ml-2 { margin-left: var(--ds-space-2); }
82
- .ds-ml-4 { margin-left: var(--ds-space-4); }
83
- .ds-mr-2 { margin-right: var(--ds-space-2); }
84
- .ds-mr-4 { margin-right: var(--ds-space-4); }
85
-
86
- .ds-mt-0\.5 { margin-top: var(--ds-space-0-5); }
87
- .ds-mt-3 { margin-top: var(--ds-space-3); }
88
- .ds-mb-0\.5 { margin-bottom: var(--ds-space-0-5); }
89
- .ds-mb-3 { margin-bottom: var(--ds-space-3); }
63
+ .ds-mt-0 { margin-block-start: var(--ds-space-0); }
64
+ .ds-mt-1 { margin-block-start: var(--ds-space-1); }
65
+ .ds-mt-2 { margin-block-start: var(--ds-space-2); }
66
+ .ds-mt-4 { margin-block-start: var(--ds-space-4); }
67
+ .ds-mt-6 { margin-block-start: var(--ds-space-6); }
68
+ .ds-mt-8 { margin-block-start: var(--ds-space-8); }
69
+
70
+ .ds-mb-0 { margin-block-end: var(--ds-space-0); }
71
+ .ds-mb-1 { margin-block-end: var(--ds-space-1); }
72
+ .ds-mb-2 { margin-block-end: var(--ds-space-2); }
73
+ .ds-mb-4 { margin-block-end: var(--ds-space-4); }
74
+ .ds-mb-6 { margin-block-end: var(--ds-space-6); }
75
+ .ds-mb-8 { margin-block-end: var(--ds-space-8); }
76
+
77
+ .ds-mt-auto { margin-block-start: auto; }
78
+ .ds-mb-auto { margin-block-end: auto; }
79
+ .ds-ml-auto { margin-inline-start: auto; }
80
+ .ds-mr-auto { margin-inline-end: auto; }
81
+ .ds-ml-2 { margin-inline-start: var(--ds-space-2); }
82
+ .ds-ml-4 { margin-inline-start: var(--ds-space-4); }
83
+ .ds-mr-2 { margin-inline-end: var(--ds-space-2); }
84
+ .ds-mr-4 { margin-inline-end: var(--ds-space-4); }
85
+
86
+ .ds-mt-0\.5 { margin-block-start: var(--ds-space-0-5); }
87
+ .ds-mt-3 { margin-block-start: var(--ds-space-3); }
88
+ .ds-mb-0\.5 { margin-block-end: var(--ds-space-0-5); }
89
+ .ds-mb-3 { margin-block-end: var(--ds-space-3); }
90
90
 
91
91
  /* --- Padding (granular) --- */
92
92
  .ds-p-0\.5 { padding: var(--ds-space-0-5); }
@@ -99,29 +99,29 @@
99
99
  .ds-py-1 { padding-block: var(--ds-space-1); }
100
100
  .ds-py-1\.5 { padding-block: var(--ds-space-1-5); }
101
101
 
102
- .ds-pb-2 { padding-bottom: var(--ds-space-2); }
103
- .ds-pb-6 { padding-bottom: var(--ds-space-6); }
102
+ .ds-pb-2 { padding-block-end: var(--ds-space-2); }
103
+ .ds-pb-6 { padding-block-end: var(--ds-space-6); }
104
104
 
105
- .ds-pl-2 { padding-left: var(--ds-space-2); }
106
- .ds-pl-3 { padding-left: var(--ds-space-3); }
107
- .ds-pl-4 { padding-left: var(--ds-space-4); }
108
- .ds-pr-2 { padding-right: var(--ds-space-2); }
109
- .ds-pr-3 { padding-right: var(--ds-space-3); }
110
- .ds-pr-4 { padding-right: var(--ds-space-4); }
111
- .ds-pr-7 { padding-right: 1.75rem; }
112
- .ds-pr-10 { padding-right: var(--ds-space-10); }
105
+ .ds-pl-2 { padding-inline-start: var(--ds-space-2); }
106
+ .ds-pl-3 { padding-inline-start: var(--ds-space-3); }
107
+ .ds-pl-4 { padding-inline-start: var(--ds-space-4); }
108
+ .ds-pr-2 { padding-inline-end: var(--ds-space-2); }
109
+ .ds-pr-3 { padding-inline-end: var(--ds-space-3); }
110
+ .ds-pr-4 { padding-inline-end: var(--ds-space-4); }
111
+ .ds-pr-7 { padding-inline-end: 1.75rem; }
112
+ .ds-pr-10 { padding-inline-end: var(--ds-space-10); }
113
113
 
114
114
  /* --- Gap (fractional) --- */
115
115
  .ds-gap-0\.5 { gap: var(--ds-space-0-5); }
116
116
  .ds-gap-1\.5 { gap: var(--ds-space-1-5); }
117
117
 
118
118
  /* --- Space-Y (owl selector) --- */
119
- .ds-space-y-1 > * + * { margin-top: var(--ds-space-1); }
120
- .ds-space-y-2 > * + * { margin-top: var(--ds-space-2); }
121
- .ds-space-y-3 > * + * { margin-top: var(--ds-space-3); }
122
- .ds-space-y-4 > * + * { margin-top: var(--ds-space-4); }
123
- .ds-space-y-6 > * + * { margin-top: var(--ds-space-6); }
124
- .ds-space-y-8 > * + * { margin-top: var(--ds-space-8); }
119
+ .ds-space-y-1 > * + * { margin-block-start: var(--ds-space-1); }
120
+ .ds-space-y-2 > * + * { margin-block-start: var(--ds-space-2); }
121
+ .ds-space-y-3 > * + * { margin-block-start: var(--ds-space-3); }
122
+ .ds-space-y-4 > * + * { margin-block-start: var(--ds-space-4); }
123
+ .ds-space-y-6 > * + * { margin-block-start: var(--ds-space-6); }
124
+ .ds-space-y-8 > * + * { margin-block-start: var(--ds-space-8); }
125
125
 
126
126
  /* --- Responsive: Padding --- */
127
127
  @media (min-width: 768px) {
@@ -133,7 +133,7 @@
133
133
  .ds-md\:py-16 { padding-block: var(--ds-space-16); }
134
134
  }
135
135
 
136
- @media (min-width: 1024px) {
136
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
137
137
  .ds-lg\:px-6 { padding-inline: var(--ds-space-6); }
138
138
  .ds-lg\:px-8 { padding-inline: var(--ds-space-8); }
139
139
  .ds-lg\:py-16 { padding-block: var(--ds-space-16); }
@@ -28,7 +28,7 @@
28
28
  .ds-md\:text-4xl { font-size: var(--ds-text-4xl); }
29
29
  .ds-md\:text-6xl { font-size: var(--ds-text-6xl); }
30
30
  }
31
- @media (min-width: 1024px) {
31
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
32
32
  .ds-lg\:text-xl { font-size: var(--ds-text-xl); }
33
33
  .ds-lg\:text-2xl { font-size: var(--ds-text-2xl); }
34
34
  .ds-lg\:text-3xl { font-size: var(--ds-text-3xl); }
@@ -45,9 +45,9 @@
45
45
  .ds-font-bold { font-weight: var(--ds-weight-bold); }
46
46
 
47
47
  /* --- Text Alignment --- */
48
- .ds-text-left { text-align: left; }
48
+ .ds-text-left { text-align: start; }
49
49
  .ds-text-center { text-align: center; }
50
- .ds-text-right { text-align: right; }
50
+ .ds-text-right { text-align: end; }
51
51
  .ds-text-balance { text-wrap: balance; }
52
52
 
53
53
  /* --- Text Color --- */
@@ -164,10 +164,10 @@
164
164
 
165
165
  /* --- Border --- */
166
166
  .ds-border { border: 1px solid var(--ds-color-border); }
167
- .ds-border-t { border-top: 1px solid var(--ds-color-border); }
168
- .ds-border-b { border-bottom: 1px solid var(--ds-color-border); }
169
- .ds-border-l { border-left: 1px solid var(--ds-color-border); }
170
- .ds-border-r { border-right: 1px solid var(--ds-color-border); }
167
+ .ds-border-t { border-block-start: 1px solid var(--ds-color-border); }
168
+ .ds-border-b { border-block-end: 1px solid var(--ds-color-border); }
169
+ .ds-border-l { border-inline-start: 1px solid var(--ds-color-border); }
170
+ .ds-border-r { border-inline-end: 1px solid var(--ds-color-border); }
171
171
  .ds-border-none { border: none; }
172
172
 
173
173
  /* --- Border Color --- */
@@ -179,7 +179,7 @@
179
179
  .ds-border-nav { border-color: var(--ds-color-nav-border); }
180
180
 
181
181
  /* --- Divide --- */
182
- .ds-divide-y > * + * { border-top: 1px solid var(--ds-color-border); }
182
+ .ds-divide-y > * + * { border-block-start: 1px solid var(--ds-color-border); }
183
183
 
184
184
  /* --- Border Radius --- */
185
185
  .ds-rounded-none { border-radius: var(--ds-radius-none); }