@adamarant/designsystem 0.11.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 (84) hide show
  1. package/README.md +101 -0
  2. package/dist/designsystem.css +13494 -0
  3. package/dist/designsystem.js +67 -0
  4. package/dist/designsystem.min.css +2 -0
  5. package/package.json +111 -0
  6. package/src/base/index.css +2 -0
  7. package/src/base/reset.css +119 -0
  8. package/src/base/typography.css +172 -0
  9. package/src/components/accordion.css +166 -0
  10. package/src/components/admin-layout.css +371 -0
  11. package/src/components/alert.css +159 -0
  12. package/src/components/avatar.css +109 -0
  13. package/src/components/badge.css +80 -0
  14. package/src/components/bottom-nav.css +125 -0
  15. package/src/components/bottom-sheet.css +146 -0
  16. package/src/components/breadcrumb.css +102 -0
  17. package/src/components/button.css +250 -0
  18. package/src/components/card.css +117 -0
  19. package/src/components/chip.css +79 -0
  20. package/src/components/collapsible.css +112 -0
  21. package/src/components/color-picker.css +82 -0
  22. package/src/components/combobox.css +420 -0
  23. package/src/components/command.css +210 -0
  24. package/src/components/context-menu.css +162 -0
  25. package/src/components/copy-button.css +106 -0
  26. package/src/components/custom-select.css +446 -0
  27. package/src/components/datepicker.css +301 -0
  28. package/src/components/description-list.css +100 -0
  29. package/src/components/divider.css +66 -0
  30. package/src/components/drawer.css +234 -0
  31. package/src/components/drop-zone.css +166 -0
  32. package/src/components/dropdown.css +169 -0
  33. package/src/components/empty-state.css +75 -0
  34. package/src/components/field.css +112 -0
  35. package/src/components/gallery.css +257 -0
  36. package/src/components/hero.css +111 -0
  37. package/src/components/icon-btn.css +103 -0
  38. package/src/components/index.css +74 -0
  39. package/src/components/input.css +311 -0
  40. package/src/components/kbd.css +54 -0
  41. package/src/components/media-library.css +230 -0
  42. package/src/components/modal.css +136 -0
  43. package/src/components/nav.css +198 -0
  44. package/src/components/number-input.css +163 -0
  45. package/src/components/pagination.css +175 -0
  46. package/src/components/pin-input.css +136 -0
  47. package/src/components/popover.css +111 -0
  48. package/src/components/progress.css +217 -0
  49. package/src/components/prose.css +337 -0
  50. package/src/components/result.css +80 -0
  51. package/src/components/scroll-area.css +73 -0
  52. package/src/components/search.css +311 -0
  53. package/src/components/segmented-control.css +94 -0
  54. package/src/components/skeleton.css +100 -0
  55. package/src/components/slider.css +133 -0
  56. package/src/components/sortable.css +70 -0
  57. package/src/components/spinner.css +60 -0
  58. package/src/components/star-rating.css +121 -0
  59. package/src/components/stat-card.css +44 -0
  60. package/src/components/table.css +359 -0
  61. package/src/components/tabs.css +215 -0
  62. package/src/components/tag.css +188 -0
  63. package/src/components/timeline.css +130 -0
  64. package/src/components/toast.css +90 -0
  65. package/src/components/toggle.css +173 -0
  66. package/src/components/toolbar.css +206 -0
  67. package/src/components/tooltip.css +167 -0
  68. package/src/components/truncated-text.css +75 -0
  69. package/src/index.css +21 -0
  70. package/src/js/theme.js +67 -0
  71. package/src/tokens/colors.css +256 -0
  72. package/src/tokens/index.css +11 -0
  73. package/src/tokens/shadows.css +55 -0
  74. package/src/tokens/spacing.css +82 -0
  75. package/src/tokens/tokens.json +413 -0
  76. package/src/tokens/typography.css +90 -0
  77. package/src/utilities/a11y.css +102 -0
  78. package/src/utilities/index.css +7 -0
  79. package/src/utilities/interactive.css +121 -0
  80. package/src/utilities/layout.css +273 -0
  81. package/src/utilities/sizing.css +85 -0
  82. package/src/utilities/spacing.css +204 -0
  83. package/src/utilities/states.css +182 -0
  84. package/src/utilities/text.css +381 -0
@@ -0,0 +1,182 @@
1
+ /* ==========================================================================
2
+ Utilities: State Variants
3
+ Comprehensive hover, focus, active, disabled, focus-within, placeholder,
4
+ and group-hover modifiers for DS utility classes.
5
+
6
+ Pattern: {state}\:ds-{utility}:{pseudo} { property: value; }
7
+ Usage: <div class="ds-bg-surface hover:ds-bg-hover">
8
+
9
+ Only semantic DS tokens are used — no hardcoded values.
10
+ ========================================================================== */
11
+
12
+ /* --- Group Marker (enables group-hover on descendants) ---
13
+ Supports both .group and .ds-group for compatibility. */
14
+ .ds-group { /* marker — no styles */ }
15
+
16
+ /* ==========================================================================
17
+ HOVER
18
+ ========================================================================== */
19
+
20
+ /* --- Hover: Background --- */
21
+ .hover\:ds-bg-base:hover { background-color: var(--ds-color-bg); }
22
+ .hover\:ds-bg-subtle:hover { background-color: var(--ds-color-surface); }
23
+ .hover\:ds-bg-muted:hover { background-color: var(--ds-color-surface-muted); }
24
+ .hover\:ds-bg-elevated:hover { background-color: var(--ds-color-surface-elevated); }
25
+ .hover\:ds-bg-surface:hover { background-color: var(--ds-color-surface); }
26
+ .hover\:ds-bg-hover:hover { background-color: var(--ds-color-surface-hover); }
27
+ .hover\:ds-bg-inverted:hover { background-color: var(--ds-color-inverted); }
28
+ .hover\:ds-bg-overlay:hover { background-color: var(--ds-color-overlay-hover); }
29
+ .hover\:ds-bg-success:hover { background-color: var(--ds-color-success); }
30
+ .hover\:ds-bg-success-subtle:hover { background-color: var(--ds-color-success-subtle); }
31
+ .hover\:ds-bg-error:hover { background-color: var(--ds-color-error); }
32
+ .hover\:ds-bg-error-subtle:hover { background-color: var(--ds-color-error-subtle); }
33
+ .hover\:ds-bg-warning:hover { background-color: var(--ds-color-warning); }
34
+ .hover\:ds-bg-warning-subtle:hover { background-color: var(--ds-color-warning-subtle); }
35
+ .hover\:ds-bg-info:hover { background-color: var(--ds-color-info); }
36
+ .hover\:ds-bg-info-subtle:hover { background-color: var(--ds-color-info-subtle); }
37
+ .hover\:ds-bg-accent-blue:hover { background-color: var(--ds-color-accent-blue); }
38
+ .hover\:ds-bg-accent-blue-subtle:hover { background-color: var(--ds-color-accent-blue-subtle); }
39
+ .hover\:ds-bg-accent-purple:hover { background-color: var(--ds-color-accent-purple); }
40
+ .hover\:ds-bg-accent-purple-subtle:hover { background-color: var(--ds-color-accent-purple-subtle); }
41
+
42
+ /* --- Hover: Text --- */
43
+ .hover\:ds-text-primary:hover { color: var(--ds-color-text); }
44
+ .hover\:ds-text-secondary:hover { color: var(--ds-color-text-secondary); }
45
+ .hover\:ds-text-tertiary:hover { color: var(--ds-color-text-tertiary); }
46
+ .hover\:ds-text-on-inverted:hover { color: var(--ds-color-on-inverted); }
47
+ .hover\:ds-text-interactive:hover { color: var(--ds-color-interactive-hover); }
48
+ .hover\:ds-text-success:hover { color: var(--ds-color-success); }
49
+ .hover\:ds-text-error:hover { color: var(--ds-color-error); }
50
+ .hover\:ds-text-warning:hover { color: var(--ds-color-warning); }
51
+ .hover\:ds-text-info:hover { color: var(--ds-color-info); }
52
+
53
+ /* --- Hover: Border --- */
54
+ .hover\:ds-border-default:hover { border-color: var(--ds-color-border); }
55
+ .hover\:ds-border-hover:hover { border-color: var(--ds-color-border-hover); }
56
+ .hover\:ds-border-active:hover { border-color: var(--ds-color-border-active); }
57
+ .hover\:ds-border-interactive:hover { border-color: var(--ds-color-interactive); }
58
+ .hover\:ds-border-success:hover { border-color: var(--ds-color-success); }
59
+ .hover\:ds-border-error:hover { border-color: var(--ds-color-error); }
60
+ .hover\:ds-border-info:hover { border-color: var(--ds-color-info); }
61
+
62
+ /* --- Hover: Opacity --- */
63
+ .hover\:ds-opacity-0:hover { opacity: 0; }
64
+ .hover\:ds-opacity-50:hover { opacity: 0.5; }
65
+ .hover\:ds-opacity-75:hover { opacity: 0.75; }
66
+ .hover\:ds-opacity-100:hover { opacity: 1; }
67
+
68
+ /* --- Hover: Transform --- */
69
+ .hover\:ds-scale-105:hover { transform: scale(1.05); }
70
+ .hover\:ds-scale-110:hover { transform: scale(1.10); }
71
+
72
+ /* --- Hover: Decoration --- */
73
+ .hover\:ds-underline:hover { text-decoration: underline; text-underline-offset: 2px; }
74
+ .hover\:ds-no-underline:hover { text-decoration: none; }
75
+
76
+ /* --- Hover: Shadow --- */
77
+ .hover\:ds-shadow:hover { box-shadow: var(--ds-shadow-md); }
78
+ .hover\:ds-shadow-lg:hover { box-shadow: var(--ds-shadow-lg); }
79
+ .hover\:ds-shadow-none:hover { box-shadow: none; }
80
+
81
+ /* ==========================================================================
82
+ FOCUS
83
+ ========================================================================== */
84
+
85
+ .focus\:ds-outline-none:focus { outline: none; }
86
+ .focus\:ds-ring-0:focus { box-shadow: none; }
87
+ .focus\:ds-ring-2:focus { box-shadow: 0 0 0 var(--ds-ring-width, 2px) var(--ds-color-interactive); }
88
+ .focus\:ds-border-interactive:focus { border-color: var(--ds-color-interactive); }
89
+
90
+ /* --- Focus-Visible (keyboard only) --- */
91
+ .focus-visible\:ds-outline-none:focus-visible { outline: none; }
92
+ .focus-visible\:ds-ring-2:focus-visible { box-shadow: 0 0 0 var(--ds-ring-width, 2px) var(--ds-color-interactive); }
93
+
94
+ /* --- Focus-Within --- */
95
+ .focus-within\:ds-border-interactive:focus-within { border-color: var(--ds-color-interactive); }
96
+ .focus-within\:ds-border-error:focus-within { border-color: var(--ds-color-error); }
97
+
98
+ /* ==========================================================================
99
+ ACTIVE
100
+ ========================================================================== */
101
+
102
+ .active\:ds-bg-hover:active { background-color: var(--ds-color-surface-hover); }
103
+ .active\:ds-bg-muted:active { background-color: var(--ds-color-surface-muted); }
104
+ .active\:ds-bg-elevated:active { background-color: var(--ds-color-surface-elevated); }
105
+ .active\:ds-scale-95:active { transform: scale(0.95); }
106
+ .active\:ds-scale-98:active { transform: scale(0.98); }
107
+
108
+ /* ==========================================================================
109
+ DISABLED
110
+ ========================================================================== */
111
+
112
+ .disabled\:ds-opacity-30:disabled,
113
+ .disabled\:ds-opacity-30[aria-disabled="true"] { opacity: 0.3; }
114
+
115
+ .disabled\:ds-opacity-50:disabled,
116
+ .disabled\:ds-opacity-50[aria-disabled="true"] { opacity: 0.5; }
117
+
118
+ .disabled\:ds-cursor-not-allowed:disabled,
119
+ .disabled\:ds-cursor-not-allowed[aria-disabled="true"] { cursor: not-allowed; }
120
+
121
+ .disabled\:ds-bg-subtle:disabled,
122
+ .disabled\:ds-bg-subtle[aria-disabled="true"] { background-color: var(--ds-color-surface); }
123
+
124
+ .disabled\:ds-pointer-events-none:disabled,
125
+ .disabled\:ds-pointer-events-none[aria-disabled="true"] { pointer-events: none; }
126
+
127
+ /* ==========================================================================
128
+ PLACEHOLDER
129
+ ========================================================================== */
130
+
131
+ .placeholder\:ds-text-tertiary::placeholder { color: var(--ds-color-text-tertiary); }
132
+ .placeholder\:ds-text-secondary::placeholder { color: var(--ds-color-text-secondary); }
133
+
134
+ /* ==========================================================================
135
+ GROUP-HOVER
136
+ Descendants of .group or .ds-group, activated on parent hover.
137
+ Uses both direct-child and any-descendant for flexibility.
138
+ ========================================================================== */
139
+
140
+ /* Text */
141
+ .group:hover .group-hover\:ds-text-primary,
142
+ .ds-group:hover .group-hover\:ds-text-primary { color: var(--ds-color-text); }
143
+
144
+ .group:hover .group-hover\:ds-text-secondary,
145
+ .ds-group:hover .group-hover\:ds-text-secondary { color: var(--ds-color-text-secondary); }
146
+
147
+ .group:hover .group-hover\:ds-text-interactive,
148
+ .ds-group:hover .group-hover\:ds-text-interactive { color: var(--ds-color-interactive-hover); }
149
+
150
+ .group:hover .group-hover\:ds-text-success,
151
+ .ds-group:hover .group-hover\:ds-text-success { color: var(--ds-color-success); }
152
+
153
+ .group:hover .group-hover\:ds-text-info,
154
+ .ds-group:hover .group-hover\:ds-text-info { color: var(--ds-color-info); }
155
+
156
+ /* Opacity */
157
+ .group:hover .group-hover\:ds-opacity-100,
158
+ .ds-group:hover .group-hover\:ds-opacity-100 { opacity: 1; }
159
+
160
+ .group:hover .group-hover\:ds-opacity-0,
161
+ .ds-group:hover .group-hover\:ds-opacity-0 { opacity: 0; }
162
+
163
+ /* Transform */
164
+ .group:hover .group-hover\:ds-scale-105,
165
+ .ds-group:hover .group-hover\:ds-scale-105 { transform: scale(1.05); }
166
+
167
+ .group:hover .group-hover\:ds-scale-110,
168
+ .ds-group:hover .group-hover\:ds-scale-110 { transform: scale(1.10); }
169
+
170
+ .group:hover .group-hover\:ds-translate-x-1,
171
+ .ds-group:hover .group-hover\:ds-translate-x-1 { transform: translateX(0.25rem); }
172
+
173
+ .group:hover .group-hover\:ds-translate-y-0,
174
+ .ds-group:hover .group-hover\:ds-translate-y-0 { transform: translateY(0); }
175
+
176
+ /* Border */
177
+ .group:hover .group-hover\:ds-border-active,
178
+ .ds-group:hover .group-hover\:ds-border-active { border-color: var(--ds-color-border-active); }
179
+
180
+ /* Visibility */
181
+ .group:hover .group-hover\:ds-visible,
182
+ .ds-group:hover .group-hover\:ds-visible { visibility: visible; }
@@ -0,0 +1,381 @@
1
+ /* ==========================================================================
2
+ Utilities: Text, Visual & style helpers
3
+ ========================================================================== */
4
+
5
+ /* --- Text Size --- */
6
+ .ds-text-xs { font-size: var(--ds-text-xs); }
7
+ .ds-text-sm { font-size: var(--ds-text-sm); }
8
+ .ds-text-base { font-size: var(--ds-text-base); }
9
+ .ds-text-lg { font-size: var(--ds-text-lg); }
10
+ .ds-text-xl { font-size: var(--ds-text-xl); }
11
+ .ds-text-2xl { font-size: var(--ds-text-2xl); }
12
+ .ds-text-3xl { font-size: var(--ds-text-3xl); }
13
+ .ds-text-4xl { font-size: var(--ds-text-4xl); }
14
+ .ds-text-5xl { font-size: var(--ds-text-5xl); }
15
+ .ds-text-6xl { font-size: var(--ds-text-6xl); }
16
+ .ds-text-7xl { font-size: var(--ds-text-7xl); }
17
+
18
+ /* --- Text Size (responsive) --- */
19
+ @media (min-width: 640px) {
20
+ .ds-sm\:text-4xl { font-size: var(--ds-text-4xl); }
21
+ .ds-sm\:text-5xl { font-size: var(--ds-text-5xl); }
22
+ }
23
+ @media (min-width: 768px) {
24
+ .ds-md\:text-lg { font-size: var(--ds-text-lg); }
25
+ .ds-md\:text-xl { font-size: var(--ds-text-xl); }
26
+ .ds-md\:text-2xl { font-size: var(--ds-text-2xl); }
27
+ .ds-md\:text-3xl { font-size: var(--ds-text-3xl); }
28
+ .ds-md\:text-4xl { font-size: var(--ds-text-4xl); }
29
+ .ds-md\:text-6xl { font-size: var(--ds-text-6xl); }
30
+ }
31
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
32
+ .ds-lg\:text-xl { font-size: var(--ds-text-xl); }
33
+ .ds-lg\:text-2xl { font-size: var(--ds-text-2xl); }
34
+ .ds-lg\:text-3xl { font-size: var(--ds-text-3xl); }
35
+ .ds-lg\:text-4xl { font-size: var(--ds-text-4xl); }
36
+ .ds-lg\:text-5xl { font-size: var(--ds-text-5xl); }
37
+ .ds-lg\:text-7xl { font-size: var(--ds-text-7xl); }
38
+ }
39
+
40
+ /* --- Text Weight --- */
41
+ .ds-font-light { font-weight: var(--ds-weight-light); }
42
+ .ds-font-normal { font-weight: var(--ds-weight-normal); }
43
+ .ds-font-medium { font-weight: var(--ds-weight-medium); }
44
+ .ds-font-semibold { font-weight: var(--ds-weight-semibold); }
45
+ .ds-font-bold { font-weight: var(--ds-weight-bold); }
46
+
47
+ /* --- Text Alignment --- */
48
+ .ds-text-left { text-align: start; }
49
+ .ds-text-center { text-align: center; }
50
+ .ds-text-right { text-align: end; }
51
+ .ds-text-balance { text-wrap: balance; }
52
+
53
+ /* --- Text Color --- */
54
+ .ds-text-primary { color: var(--ds-color-text); }
55
+ .ds-text-secondary { color: var(--ds-color-text-secondary); }
56
+ .ds-text-tertiary { color: var(--ds-color-text-tertiary); }
57
+ .ds-text-success { color: var(--ds-color-success); }
58
+ .ds-text-warning { color: var(--ds-color-warning); }
59
+ .ds-text-error { color: var(--ds-color-error); }
60
+ .ds-text-info { color: var(--ds-color-info); }
61
+
62
+ /* --- Text Color (extended) --- */
63
+ .ds-text-interactive { color: var(--ds-color-interactive); }
64
+ .ds-text-on-inverted { color: var(--ds-color-on-inverted); }
65
+
66
+ /* --- Theme-independent colors (ignore light/dark toggle) --- */
67
+ .ds-text-always-white { color: var(--ds-color-static-white); }
68
+ .ds-text-always-black { color: var(--ds-color-static-black); }
69
+
70
+ /* --- Background Color --- */
71
+ .ds-bg-base { background-color: var(--ds-color-bg); }
72
+ .ds-bg-surface { background-color: var(--ds-color-surface); }
73
+ .ds-bg-subtle { background-color: var(--ds-color-surface); }
74
+ .ds-bg-elevated { background-color: var(--ds-color-surface-elevated); }
75
+ .ds-bg-inverted { background-color: var(--ds-color-inverted); color: var(--ds-color-on-inverted); }
76
+ .ds-bg-hover { background-color: var(--ds-color-surface-hover); }
77
+ .ds-bg-muted { background-color: var(--ds-color-surface-muted); }
78
+ .ds-bg-overlay { background-color: var(--ds-color-overlay); }
79
+ .ds-bg-nav { background-color: var(--ds-color-nav-bg); }
80
+
81
+ /* Status backgrounds */
82
+ .ds-bg-error { background-color: var(--ds-color-error); }
83
+ .ds-bg-success { background-color: var(--ds-color-success); }
84
+ .ds-bg-warning { background-color: var(--ds-color-warning); }
85
+ .ds-bg-info { background-color: var(--ds-color-info); }
86
+ .ds-bg-error-subtle { background-color: var(--ds-color-error-subtle); }
87
+ .ds-bg-success-subtle { background-color: var(--ds-color-success-subtle); }
88
+ .ds-bg-warning-subtle { background-color: var(--ds-color-warning-subtle); }
89
+ .ds-bg-info-subtle { background-color: var(--ds-color-info-subtle); }
90
+
91
+ /* Accent backgrounds */
92
+ .ds-bg-accent-blue { background-color: var(--ds-color-accent-blue); }
93
+ .ds-bg-accent-purple { background-color: var(--ds-color-accent-purple); }
94
+ .ds-bg-accent-green { background-color: var(--ds-color-accent-green); }
95
+ .ds-bg-accent-orange { background-color: var(--ds-color-accent-orange); }
96
+ .ds-bg-accent-blue-subtle { background-color: var(--ds-color-accent-blue-subtle); }
97
+ .ds-bg-accent-purple-subtle { background-color: var(--ds-color-accent-purple-subtle); }
98
+ .ds-bg-accent-green-subtle { background-color: var(--ds-color-accent-green-subtle); }
99
+ .ds-bg-accent-orange-subtle { background-color: var(--ds-color-accent-orange-subtle); }
100
+
101
+ /* Accent text */
102
+ .ds-text-accent-blue { color: var(--ds-color-accent-blue); }
103
+ .ds-text-accent-purple { color: var(--ds-color-accent-purple); }
104
+ .ds-text-accent-green { color: var(--ds-color-accent-green); }
105
+ .ds-text-accent-orange { color: var(--ds-color-accent-orange); }
106
+
107
+ /* --- Surface Card --- */
108
+ .ds-surface {
109
+ background-color: var(--ds-color-surface);
110
+ border: 1px solid var(--ds-color-border);
111
+ }
112
+
113
+ .ds-surface--hover {
114
+ transition:
115
+ background-color var(--ds-duration-normal) var(--ds-ease-default),
116
+ border-color var(--ds-duration-normal) var(--ds-ease-default);
117
+ }
118
+ .ds-surface--hover:hover {
119
+ border-color: var(--ds-color-border-hover);
120
+ }
121
+
122
+ /* --- Text Decoration --- */
123
+ .ds-underline { text-decoration: underline; text-underline-offset: 2px; }
124
+ .ds-no-underline { text-decoration: none; }
125
+
126
+ /* --- Text Transform --- */
127
+ .ds-uppercase { text-transform: uppercase; letter-spacing: var(--ds-tracking-wide); }
128
+ .ds-lowercase { text-transform: lowercase; }
129
+ .ds-capitalize { text-transform: capitalize; }
130
+
131
+ /* --- Line Height --- */
132
+ .ds-leading-tight { line-height: var(--ds-leading-tight); }
133
+ .ds-leading-snug { line-height: var(--ds-leading-snug); }
134
+ .ds-leading-normal { line-height: var(--ds-leading-normal); }
135
+ .ds-leading-relaxed { line-height: var(--ds-leading-relaxed); }
136
+
137
+ /* --- Tracking --- */
138
+ .ds-tracking-tighter { letter-spacing: var(--ds-tracking-tighter); }
139
+ .ds-tracking-tight { letter-spacing: var(--ds-tracking-tight); }
140
+ .ds-tracking-normal { letter-spacing: var(--ds-tracking-normal); }
141
+ .ds-tracking-wide { letter-spacing: var(--ds-tracking-wide); }
142
+ .ds-tracking-wider { letter-spacing: var(--ds-tracking-wider); }
143
+
144
+ /* --- Truncation --- */
145
+ .ds-truncate {
146
+ overflow: hidden;
147
+ text-overflow: ellipsis;
148
+ white-space: nowrap;
149
+ }
150
+
151
+ .ds-line-clamp-2 {
152
+ display: -webkit-box;
153
+ -webkit-line-clamp: 2;
154
+ -webkit-box-orient: vertical;
155
+ overflow: hidden;
156
+ }
157
+
158
+ .ds-line-clamp-1 {
159
+ display: -webkit-box;
160
+ -webkit-line-clamp: 1;
161
+ -webkit-box-orient: vertical;
162
+ overflow: hidden;
163
+ }
164
+
165
+ .ds-line-clamp-3 {
166
+ display: -webkit-box;
167
+ -webkit-line-clamp: 3;
168
+ -webkit-box-orient: vertical;
169
+ overflow: hidden;
170
+ }
171
+
172
+ /* --- Text Extras --- */
173
+ .ds-line-through { text-decoration: line-through; }
174
+ .ds-break-all { word-break: break-all; }
175
+ .ds-list-disc { list-style-type: disc; }
176
+ .ds-list-inside { list-style-position: inside; }
177
+
178
+ /* --- Font Family --- */
179
+ .ds-font-mono { font-family: var(--ds-font-mono); }
180
+ .ds-font-sans { font-family: var(--ds-font-sans); }
181
+
182
+ /* --- Border --- */
183
+ .ds-border { border: 1px solid var(--ds-color-border); }
184
+ .ds-border-t { border-block-start: 1px solid var(--ds-color-border); }
185
+ .ds-border-b { border-block-end: 1px solid var(--ds-color-border); }
186
+ .ds-border-l { border-inline-start: 1px solid var(--ds-color-border); }
187
+ .ds-border-r { border-inline-end: 1px solid var(--ds-color-border); }
188
+ .ds-border-y { border-block-start: 1px solid var(--ds-color-border); border-block-end: 1px solid var(--ds-color-border); }
189
+ .ds-border-none { border: none; }
190
+
191
+ /* --- Border Color --- */
192
+ .ds-border-error { border-color: var(--ds-color-error); }
193
+ .ds-border-success { border-color: var(--ds-color-success); }
194
+ .ds-border-interactive { border-color: var(--ds-color-interactive); }
195
+ .ds-border-hover { border-color: var(--ds-color-border-hover); }
196
+ .ds-border-active { border-color: var(--ds-color-border-active); }
197
+ .ds-border-nav { border-color: var(--ds-color-nav-border); }
198
+
199
+ /* --- Divide --- */
200
+ .ds-divide-y > * + * { border-block-start: 1px solid var(--ds-color-border); }
201
+
202
+ /* --- Border Radius --- */
203
+ .ds-rounded-none { border-radius: var(--ds-radius-none); }
204
+ .ds-rounded-sm { border-radius: var(--ds-radius-sm); }
205
+ .ds-rounded { border-radius: var(--ds-radius-md); }
206
+ .ds-rounded-lg { border-radius: var(--ds-radius-lg); }
207
+ .ds-rounded-xl { border-radius: var(--ds-radius-xl); }
208
+ .ds-rounded-2xl { border-radius: var(--ds-radius-2xl); }
209
+ .ds-rounded-3xl { border-radius: 1.5rem; }
210
+ .ds-rounded-full { border-radius: var(--ds-radius-full); }
211
+
212
+ /* --- Border Radius (directional) --- */
213
+ .ds-rounded-t { border-start-start-radius: var(--ds-radius-md); border-start-end-radius: var(--ds-radius-md); }
214
+ .ds-rounded-b { border-end-start-radius: var(--ds-radius-md); border-end-end-radius: var(--ds-radius-md); }
215
+ .ds-rounded-t-2xl { border-start-start-radius: var(--ds-radius-2xl); border-start-end-radius: var(--ds-radius-2xl); }
216
+ .ds-rounded-b-2xl { border-end-start-radius: var(--ds-radius-2xl); border-end-end-radius: var(--ds-radius-2xl); }
217
+
218
+ /* --- Shadow --- */
219
+ .ds-shadow-sm { box-shadow: var(--ds-shadow-sm); }
220
+ .ds-shadow { box-shadow: var(--ds-shadow-md); }
221
+ .ds-shadow-lg { box-shadow: var(--ds-shadow-lg); }
222
+ .ds-shadow-none { box-shadow: none; }
223
+
224
+ /* --- Opacity --- */
225
+ .ds-opacity-0 { opacity: 0; }
226
+ .ds-opacity-25 { opacity: 0.25; }
227
+ .ds-opacity-50 { opacity: 0.5; }
228
+ .ds-opacity-60 { opacity: 0.6; }
229
+ .ds-opacity-70 { opacity: 0.7; }
230
+ .ds-opacity-75 { opacity: 0.75; }
231
+ .ds-opacity-100 { opacity: 1; }
232
+
233
+ /* --- Cursor --- */
234
+ .ds-cursor-pointer { cursor: pointer; }
235
+ .ds-cursor-default { cursor: default; }
236
+ .ds-cursor-not-allowed { cursor: not-allowed; }
237
+ .ds-cursor-grab { cursor: grab; }
238
+ .ds-cursor-grabbing { cursor: grabbing; }
239
+
240
+ /* --- Interaction --- */
241
+ .ds-pointer-events-none { pointer-events: none; }
242
+ .ds-select-none { user-select: none; }
243
+ .ds-whitespace-nowrap { white-space: nowrap; }
244
+ .ds-whitespace-pre-wrap { white-space: pre-wrap; }
245
+
246
+ /* --- Backdrop --- */
247
+ .ds-backdrop-blur {
248
+ backdrop-filter: blur(20px) saturate(1.5);
249
+ -webkit-backdrop-filter: blur(20px) saturate(1.5);
250
+ }
251
+
252
+ .ds-backdrop-blur-sm {
253
+ backdrop-filter: blur(4px);
254
+ -webkit-backdrop-filter: blur(4px);
255
+ }
256
+
257
+ /* --- Outline --- */
258
+ .ds-outline-none { outline: none; }
259
+
260
+ /* --- Transform --- */
261
+ .-ds-translate-y-1\/2 { transform: translateY(-50%); }
262
+ .-ds-translate-x-1\/2 { transform: translateX(-50%); }
263
+ .ds-translate-y-full { transform: translateY(100%); }
264
+ .ds-scale-105 { transform: scale(1.05); }
265
+ .ds-rotate-180 { transform: rotate(180deg); }
266
+
267
+ /* --- Placeholder --- */
268
+ .ds-placeholder-tertiary::placeholder { color: var(--ds-color-text-tertiary); }
269
+
270
+ /* --- Transitions --- */
271
+ .ds-tr-colors {
272
+ transition:
273
+ color var(--ds-duration-normal) var(--ds-ease-default),
274
+ background-color var(--ds-duration-normal) var(--ds-ease-default),
275
+ border-color var(--ds-duration-normal) var(--ds-ease-default);
276
+ }
277
+
278
+ .ds-tr-all {
279
+ transition: all var(--ds-duration-normal) var(--ds-ease-default);
280
+ }
281
+
282
+ .ds-tr-opacity {
283
+ transition: opacity var(--ds-duration-normal) var(--ds-ease-default);
284
+ }
285
+
286
+ .ds-tr-transform {
287
+ transition: transform var(--ds-duration-normal) var(--ds-ease-default);
288
+ }
289
+
290
+ /* --- Duration --- */
291
+ .ds-duration-fast { transition-duration: var(--ds-duration-fast); }
292
+ .ds-duration-normal { transition-duration: var(--ds-duration-normal); }
293
+ .ds-duration-slow { transition-duration: var(--ds-duration-slow); }
294
+ .ds-duration-slower { transition-duration: var(--ds-duration-slower); }
295
+
296
+ /* --- Easing --- */
297
+ .ds-ease-default { transition-timing-function: var(--ds-ease-default); }
298
+ .ds-ease-out { transition-timing-function: var(--ds-ease-out); }
299
+ .ds-ease-out-expo { transition-timing-function: var(--ds-ease-out-expo); }
300
+
301
+ /* --- Animations --- */
302
+ @keyframes ds-fade-in {
303
+ from { opacity: 0; }
304
+ to { opacity: 1; }
305
+ }
306
+
307
+ @keyframes ds-slide-up {
308
+ from { opacity: 0; transform: translateY(8px); }
309
+ to { opacity: 1; transform: translateY(0); }
310
+ }
311
+
312
+ @keyframes ds-scale-in {
313
+ from { opacity: 0; transform: scale(0.96); }
314
+ to { opacity: 1; transform: scale(1); }
315
+ }
316
+
317
+ @keyframes ds-spin {
318
+ to { transform: rotate(360deg); }
319
+ }
320
+
321
+ @keyframes ds-pulse {
322
+ 0%, 100% { opacity: 1; }
323
+ 50% { opacity: 0.5; }
324
+ }
325
+
326
+ .ds-animate-fade-in { animation: ds-fade-in var(--ds-duration-fast) ease; }
327
+ .ds-animate-slide-up { animation: ds-slide-up var(--ds-duration-normal) var(--ds-ease-out-expo); }
328
+ .ds-animate-scale-in { animation: ds-scale-in var(--ds-duration-normal) var(--ds-ease-out-expo); }
329
+ .ds-animate-spin { animation: ds-spin 1s linear infinite; }
330
+ .ds-animate-pulse { animation: ds-pulse 2s ease-in-out infinite; }
331
+
332
+ /* --- Scroll Reveal --- */
333
+ .ds-reveal {
334
+ opacity: 0;
335
+ transform: translateY(32px);
336
+ transition:
337
+ opacity var(--ds-duration-slower) var(--ds-ease-out-expo),
338
+ transform var(--ds-duration-slower) var(--ds-ease-out-expo);
339
+ }
340
+
341
+ .ds-reveal.ds-visible {
342
+ opacity: 1;
343
+ transform: translateY(0);
344
+ }
345
+
346
+ .ds-reveal-delay-1 { transition-delay: 100ms; }
347
+ .ds-reveal-delay-2 { transition-delay: 200ms; }
348
+ .ds-reveal-delay-3 { transition-delay: 300ms; }
349
+ .ds-reveal-delay-4 { transition-delay: 400ms; }
350
+
351
+ /* --- Grain Overlay (optional) --- */
352
+ .ds-grain::before {
353
+ content: "";
354
+ position: fixed;
355
+ inset: 0;
356
+ z-index: 9999;
357
+ pointer-events: none;
358
+ opacity: 0.03;
359
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
360
+ }
361
+
362
+ /* --- Accessibility --- */
363
+ .ds-sr-only {
364
+ position: absolute;
365
+ width: 1px;
366
+ height: 1px;
367
+ padding: 0;
368
+ margin: -1px;
369
+ overflow: hidden;
370
+ clip: rect(0, 0, 0, 0);
371
+ white-space: nowrap;
372
+ border-width: 0;
373
+ }
374
+
375
+ /* --- Responsive: md (768px) — small text sizes --- */
376
+ @media (min-width: 768px) {
377
+ .ds-md\:text-xs { font-size: var(--ds-text-xs); }
378
+ .ds-md\:text-sm { font-size: var(--ds-text-sm); }
379
+ .ds-md\:text-base { font-size: var(--ds-text-base); }
380
+ .ds-md\:text-5xl { font-size: var(--ds-text-5xl); }
381
+ }