@24vlh/vds 0.1.10 → 0.2.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 (51) hide show
  1. package/dist/components/action-bar.css +111 -0
  2. package/dist/components/action-bar.min.css +1 -0
  3. package/dist/components/authoring.css +262 -42
  4. package/dist/components/authoring.min.css +1 -1
  5. package/dist/components/avatar.css +229 -0
  6. package/dist/components/avatar.min.css +1 -0
  7. package/dist/components/badge-tag.css +235 -0
  8. package/dist/components/badge-tag.min.css +1 -0
  9. package/dist/components/buttons.css +90 -98
  10. package/dist/components/buttons.min.css +1 -1
  11. package/dist/components/command.css +846 -2
  12. package/dist/components/command.min.css +1 -1
  13. package/dist/components/content-blocks.css +328 -6
  14. package/dist/components/content-blocks.min.css +1 -1
  15. package/dist/components/description-list.css +117 -0
  16. package/dist/components/description-list.min.css +1 -0
  17. package/dist/components/flows.css +60 -47
  18. package/dist/components/flows.min.css +1 -1
  19. package/dist/components/header-footer.css +178 -18
  20. package/dist/components/header-footer.min.css +1 -1
  21. package/dist/components/hero.css +148 -14
  22. package/dist/components/hero.min.css +1 -1
  23. package/dist/components/icons.css +23 -11
  24. package/dist/components/icons.min.css +1 -1
  25. package/dist/components/navigation.css +67 -7
  26. package/dist/components/navigation.min.css +1 -1
  27. package/dist/components/overlays.css +121 -19
  28. package/dist/components/overlays.min.css +1 -1
  29. package/dist/components/progress.css +322 -0
  30. package/dist/components/progress.min.css +1 -0
  31. package/dist/components/skeleton.css +22 -3
  32. package/dist/components/skeleton.min.css +1 -1
  33. package/dist/components/state.css +172 -0
  34. package/dist/components/state.min.css +1 -0
  35. package/dist/components/tables.css +93 -15
  36. package/dist/components/tables.min.css +1 -1
  37. package/dist/components/tabs.css +116 -4
  38. package/dist/components/tabs.min.css +1 -1
  39. package/dist/components/toasts.css +115 -41
  40. package/dist/components/toasts.min.css +1 -1
  41. package/dist/components/tooltips-popovers.css +135 -93
  42. package/dist/components/tooltips-popovers.min.css +1 -1
  43. package/dist/components/utilities.css +33 -3
  44. package/dist/components/utilities.min.css +1 -1
  45. package/dist/core.css +43 -21
  46. package/dist/core.min.css +1 -1
  47. package/dist/identity.css +107 -1
  48. package/dist/identity.min.css +1 -1
  49. package/dist/vds.css +4952 -1304
  50. package/dist/vds.min.css +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,322 @@
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Progress & Stepper Indicators
3
+ *
4
+ * Responsibilities:
5
+ * - Provide linear progress bars (determinate + indeterminate)
6
+ * - Support semantic states and density variants
7
+ * - Offer stepper indicators for multi-step flows
8
+ *
9
+ * System Notes:
10
+ * - Pure CSS; JS only updates width or active states
11
+ * - Fully token-driven for sizing and colour
12
+ ************************************************************/
13
+
14
+ /* ---------------------------------------------------------
15
+ 1. PROGRESS TOKENS
16
+ --------------------------------------------------------- */
17
+
18
+ [data-vds-progress],
19
+ .vds-progress {
20
+ --progress-height-sm: 0.35rem;
21
+ --progress-height-md: var(--space-2);
22
+ --progress-height-lg: 0.9rem;
23
+ --progress-radius: var(--radius-sm);
24
+ --progress-track-bg: var(--color-muted-bg);
25
+ --progress-track-border: transparent;
26
+ --progress-fill: var(--color-accent);
27
+ --progress-label-color: var(--color-text-muted);
28
+ --progress-value-color: var(--color-text);
29
+ --progress-meta-color: var(--color-text-muted);
30
+
31
+ --stepper-gap: var(--space-6);
32
+ --stepper-marker-size: var(--space-6);
33
+ --stepper-line-size: 2px;
34
+ --stepper-line: var(--color-border-subtle);
35
+ --stepper-marker-bg: var(--color-surface);
36
+ --stepper-marker-border: var(--color-border-subtle);
37
+ --stepper-marker-text: var(--color-text);
38
+ --stepper-active: var(--color-accent);
39
+ --stepper-title-bg: var(--color-surface);
40
+ }
41
+
42
+ /* ---------------------------------------------------------
43
+ 2. LINEAR PROGRESS
44
+ --------------------------------------------------------- */
45
+
46
+ .progress-stack {
47
+ display: grid;
48
+ grid-gap: var(--space-2);
49
+ gap: var(--space-2);
50
+ width: 100%;
51
+ }
52
+
53
+ .progress-stack--compact {
54
+ gap: var(--space-1_5);
55
+ }
56
+
57
+ .progress__header {
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: space-between;
61
+ gap: var(--space-3);
62
+ }
63
+
64
+ .progress__label {
65
+ font-size: var(--text-xs);
66
+ color: var(--progress-label-color);
67
+ }
68
+
69
+ .progress__value {
70
+ font-size: var(--text-xs);
71
+ font-weight: 600;
72
+ color: var(--progress-value-color);
73
+ }
74
+
75
+ .progress__meta {
76
+ font-size: var(--text-xs);
77
+ color: var(--progress-meta-color);
78
+ }
79
+
80
+ .progress,
81
+ .progress__track {
82
+ position: relative;
83
+ width: 100%;
84
+ height: var(--progress-height-md);
85
+ border-radius: var(--progress-radius);
86
+ background: var(--progress-track-bg);
87
+ border: 1px solid var(--progress-track-border);
88
+ overflow: hidden;
89
+ }
90
+
91
+ .progress__bar {
92
+ height: 100%;
93
+ width: 0%;
94
+ width: var(--progress-value, 0%);
95
+ border-radius: inherit;
96
+ background: var(--progress-fill);
97
+ transition: width var(--transition-normal);
98
+ }
99
+
100
+ [data-vds-progress] .progress--sm, .vds-progress .progress--sm, [data-vds-progress] .progress--sm .progress__track, .vds-progress .progress--sm .progress__track {
101
+ height: var(--progress-height-sm);
102
+ }
103
+
104
+ [data-vds-progress] .progress--lg, .vds-progress .progress--lg, [data-vds-progress] .progress--lg .progress__track, .vds-progress .progress--lg .progress__track {
105
+ height: var(--progress-height-lg);
106
+ }
107
+
108
+ [data-vds-progress] .progress--outlined, .vds-progress .progress--outlined {
109
+ --progress-track-border: var(--color-border-subtle);
110
+ }
111
+
112
+ [data-vds-progress] .progress--pill, .vds-progress .progress--pill {
113
+ --progress-radius: var(--radius-full);
114
+ }
115
+
116
+ [data-vds-progress] .progress--striped .progress__bar, .vds-progress .progress--striped .progress__bar {
117
+ background-image: linear-gradient(
118
+ 45deg,
119
+ rgba(255, 255, 255, 0.2) 25%,
120
+ rgba(255, 255, 255, 0) 25%,
121
+ rgba(255, 255, 255, 0) 50%,
122
+ rgba(255, 255, 255, 0.2) 50%,
123
+ rgba(255, 255, 255, 0.2) 75%,
124
+ rgba(255, 255, 255, 0) 75%,
125
+ rgba(255, 255, 255, 0)
126
+ );
127
+ background-size: 1.2rem 1.2rem;
128
+ }
129
+
130
+ [data-vds-progress] .progress--animated .progress__bar, .vds-progress .progress--animated .progress__bar {
131
+ animation: vds-progress-stripes 0.9s linear infinite;
132
+ }
133
+
134
+ [data-vds-progress] .progress--indeterminate .progress__bar, .vds-progress .progress--indeterminate .progress__bar {
135
+ width: 35%;
136
+ animation: progress-indeterminate 1.4s ease infinite;
137
+ }
138
+
139
+ @keyframes vds-progress-stripes {
140
+ 0% {
141
+ background-position: 1.2rem 0;
142
+ }
143
+ 100% {
144
+ background-position: 0 0;
145
+ }
146
+ }
147
+
148
+ @keyframes progress-indeterminate {
149
+ 0% {
150
+ transform: translateX(-120%);
151
+ }
152
+ 100% {
153
+ transform: translateX(260%);
154
+ }
155
+ }
156
+
157
+ /* ---------------------------------------------------------
158
+ 3. PROGRESS SEMANTICS
159
+ --------------------------------------------------------- */
160
+
161
+ [data-vds-progress] .progress--success, .vds-progress .progress--success {
162
+ --progress-fill: var(--color-success);
163
+ }
164
+
165
+ [data-vds-progress] .progress--info, .vds-progress .progress--info {
166
+ --progress-fill: var(--color-info);
167
+ }
168
+
169
+ [data-vds-progress] .progress--warning, .vds-progress .progress--warning {
170
+ --progress-fill: var(--color-warning);
171
+ }
172
+
173
+ [data-vds-progress] .progress--danger, .vds-progress .progress--danger {
174
+ --progress-fill: var(--color-danger);
175
+ }
176
+
177
+ /* ---------------------------------------------------------
178
+ 4. STEPPER
179
+ --------------------------------------------------------- */
180
+
181
+ .stepper {
182
+ display: flex;
183
+ gap: var(--stepper-gap);
184
+ align-items: flex-start;
185
+ padding: var(--space-5);
186
+ }
187
+
188
+ .stepper__item {
189
+ position: relative;
190
+ display: flex;
191
+ gap: var(--space-3);
192
+ flex: 1 1 0;
193
+ min-width: 0;
194
+ }
195
+
196
+ .stepper__item:not(:last-child)::after {
197
+ content: "";
198
+ position: absolute;
199
+ top: calc(var(--stepper-marker-size) / 2);
200
+ left: calc(var(--stepper-marker-size) + var(--space-3));
201
+ right: calc(-1 * var(--stepper-gap) + (var(--stepper-marker-size) / 2));
202
+ height: var(--stepper-line-size);
203
+ background: var(--stepper-line);
204
+ z-index: 0;
205
+ }
206
+
207
+ .stepper__marker {
208
+ width: var(--stepper-marker-size);
209
+ height: var(--stepper-marker-size);
210
+ border-radius: 999px;
211
+ display: inline-flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ border: 1px solid var(--stepper-marker-border);
215
+ background: var(--stepper-marker-bg);
216
+ color: var(--stepper-marker-text);
217
+ font-size: var(--text-xs);
218
+ font-weight: 600;
219
+ flex-shrink: 0;
220
+ z-index: 1;
221
+ }
222
+
223
+ .stepper__content {
224
+ display: flex;
225
+ flex-direction: column;
226
+ gap: var(--space-1);
227
+ position: relative;
228
+ z-index: 1;
229
+ }
230
+
231
+ .stepper__title {
232
+ padding-right: var(--space-2);
233
+ font-size: var(--text-sm);
234
+ font-weight: 600;
235
+ color: var(--color-text);
236
+ align-self: flex-start;
237
+ background: var(--stepper-title-bg);
238
+ -webkit-box-decoration-break: clone;
239
+ box-decoration-break: clone;
240
+ }
241
+
242
+ .stepper__desc {
243
+ font-size: var(--text-xs);
244
+ color: var(--color-text-muted);
245
+ }
246
+
247
+ .stepper__item--active .stepper__marker {
248
+ border-color: var(--stepper-active);
249
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--stepper-active) 30%, transparent);
250
+ color: var(--stepper-active);
251
+ }
252
+
253
+ .stepper__item--complete .stepper__marker {
254
+ border-color: var(--color-success);
255
+ background: var(--color-success);
256
+ color: var(--color-on-success);
257
+ }
258
+
259
+ .stepper__item--disabled .stepper__content {
260
+ opacity: 0.5;
261
+ pointer-events: none;
262
+ }
263
+
264
+ .stepper__item--disabled .stepper__marker {
265
+ pointer-events: none;
266
+ }
267
+
268
+ .stepper--compact {
269
+ --stepper-gap: var(--space-4);
270
+ --stepper-marker-size: var(--space-5);
271
+ }
272
+
273
+ /* ---------------------------------------------------------
274
+ 5. VERTICAL STEPPER
275
+ --------------------------------------------------------- */
276
+
277
+ .stepper--vertical {
278
+ flex-direction: column;
279
+ gap: var(--space-4);
280
+ }
281
+
282
+ .stepper--vertical .stepper__item {
283
+ padding-left: calc(var(--stepper-marker-size) + var(--space-3));
284
+ }
285
+
286
+ .stepper--vertical .stepper__marker {
287
+ position: absolute;
288
+ left: 0;
289
+ top: 0;
290
+ }
291
+
292
+ .stepper--vertical .stepper__item:not(:last-child)::after {
293
+ left: calc(var(--stepper-marker-size) / 2);
294
+ top: var(--stepper-marker-size);
295
+ right: auto;
296
+ width: var(--stepper-line-size);
297
+ height: calc(100% + var(--space-4));
298
+ }
299
+
300
+ @media (max-width: 768px) {
301
+ .stepper {
302
+ flex-direction: column;
303
+ }
304
+
305
+ .stepper__item {
306
+ padding-left: calc(var(--stepper-marker-size) + var(--space-3));
307
+ }
308
+
309
+ .stepper__marker {
310
+ position: absolute;
311
+ left: 0;
312
+ top: 0;
313
+ }
314
+
315
+ .stepper__item:not(:last-child)::after {
316
+ left: calc(var(--stepper-marker-size) / 2);
317
+ top: var(--stepper-marker-size);
318
+ right: auto;
319
+ width: var(--stepper-line-size);
320
+ height: calc(100% + var(--space-4));
321
+ }
322
+ }
@@ -0,0 +1 @@
1
+ .vds-progress,[data-vds-progress]{--progress-height-sm:0.35rem;--progress-height-md:var(--space-2);--progress-height-lg:0.9rem;--progress-radius:var(--radius-sm);--progress-track-bg:var(--color-muted-bg);--progress-track-border:transparent;--progress-fill:var(--color-accent);--progress-label-color:var(--color-text-muted);--progress-value-color:var(--color-text);--progress-meta-color:var(--color-text-muted);--stepper-gap:var(--space-6);--stepper-marker-size:var(--space-6);--stepper-line-size:2px;--stepper-line:var(--color-border-subtle);--stepper-marker-bg:var(--color-surface);--stepper-marker-border:var(--color-border-subtle);--stepper-marker-text:var(--color-text);--stepper-active:var(--color-accent);--stepper-title-bg:var(--color-surface)}.progress-stack{grid-gap:var(--space-2);display:grid;gap:var(--space-2);width:100%}.progress-stack--compact{gap:var(--space-1_5)}.progress__header{align-items:center;display:flex;gap:var(--space-3);justify-content:space-between}.progress__label{color:var(--progress-label-color);font-size:var(--text-xs)}.progress__value{color:var(--progress-value-color);font-size:var(--text-xs);font-weight:600}.progress__meta{color:var(--progress-meta-color);font-size:var(--text-xs)}.progress,.progress__track{background:var(--progress-track-bg);border:1px solid var(--progress-track-border);border-radius:var(--progress-radius);height:var(--progress-height-md);overflow:hidden;position:relative;width:100%}.progress__bar{background:var(--progress-fill);border-radius:inherit;height:100%;transition:width var(--transition-normal);width:0;width:var(--progress-value,0)}.vds-progress .progress--sm,.vds-progress .progress--sm .progress__track,[data-vds-progress] .progress--sm,[data-vds-progress] .progress--sm .progress__track{height:var(--progress-height-sm)}.vds-progress .progress--lg,.vds-progress .progress--lg .progress__track,[data-vds-progress] .progress--lg,[data-vds-progress] .progress--lg .progress__track{height:var(--progress-height-lg)}.vds-progress .progress--outlined,[data-vds-progress] .progress--outlined{--progress-track-border:var(--color-border-subtle)}.vds-progress .progress--pill,[data-vds-progress] .progress--pill{--progress-radius:var(--radius-full)}.vds-progress .progress--striped .progress__bar,[data-vds-progress] .progress--striped .progress__bar{background-image:linear-gradient(45deg,hsla(0,0%,100%,.2) 25%,hsla(0,0%,100%,0) 0,hsla(0,0%,100%,0) 50%,hsla(0,0%,100%,.2) 0,hsla(0,0%,100%,.2) 75%,hsla(0,0%,100%,0) 0,hsla(0,0%,100%,0));background-size:1.2rem 1.2rem}.vds-progress .progress--animated .progress__bar,[data-vds-progress] .progress--animated .progress__bar{animation:vds-progress-stripes .9s linear infinite}.vds-progress .progress--indeterminate .progress__bar,[data-vds-progress] .progress--indeterminate .progress__bar{animation:progress-indeterminate 1.4s ease infinite;width:35%}@keyframes vds-progress-stripes{0%{background-position:1.2rem 0}to{background-position:0 0}}@keyframes progress-indeterminate{0%{transform:translateX(-120%)}to{transform:translateX(260%)}}.vds-progress .progress--success,[data-vds-progress] .progress--success{--progress-fill:var(--color-success)}.vds-progress .progress--info,[data-vds-progress] .progress--info{--progress-fill:var(--color-info)}.vds-progress .progress--warning,[data-vds-progress] .progress--warning{--progress-fill:var(--color-warning)}.vds-progress .progress--danger,[data-vds-progress] .progress--danger{--progress-fill:var(--color-danger)}.stepper{align-items:flex-start;display:flex;gap:var(--stepper-gap);padding:var(--space-5)}.stepper__item{display:flex;flex:1 1 0;gap:var(--space-3);min-width:0;position:relative}.stepper__item:not(:last-child):after{background:var(--stepper-line);content:"";height:var(--stepper-line-size);left:calc(var(--stepper-marker-size) + var(--space-3));position:absolute;right:calc(var(--stepper-gap)*-1 + var(--stepper-marker-size)/2);top:calc(var(--stepper-marker-size)/2);z-index:0}.stepper__marker{align-items:center;background:var(--stepper-marker-bg);border:1px solid var(--stepper-marker-border);border-radius:999px;color:var(--stepper-marker-text);display:inline-flex;flex-shrink:0;font-size:var(--text-xs);font-weight:600;height:var(--stepper-marker-size);justify-content:center;width:var(--stepper-marker-size);z-index:1}.stepper__content{display:flex;flex-direction:column;gap:var(--space-1);position:relative;z-index:1}.stepper__title{align-self:flex-start;background:var(--stepper-title-bg);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--color-text);font-size:var(--text-sm);font-weight:600;padding-right:var(--space-2)}.stepper__desc{color:var(--color-text-muted);font-size:var(--text-xs)}.stepper__item--active .stepper__marker{border-color:var(--stepper-active);box-shadow:0 0 0 2px color-mix(in srgb,var(--stepper-active) 30%,transparent);color:var(--stepper-active)}.stepper__item--complete .stepper__marker{background:var(--color-success);border-color:var(--color-success);color:var(--color-on-success)}.stepper__item--disabled .stepper__content{opacity:.5;pointer-events:none}.stepper__item--disabled .stepper__marker{pointer-events:none}.stepper--compact{--stepper-gap:var(--space-4);--stepper-marker-size:var(--space-5)}.stepper--vertical{flex-direction:column;gap:var(--space-4)}.stepper--vertical .stepper__item{padding-left:calc(var(--stepper-marker-size) + var(--space-3))}.stepper--vertical .stepper__marker{left:0;position:absolute;top:0}.stepper--vertical .stepper__item:not(:last-child):after{height:calc(100% + var(--space-4));left:calc(var(--stepper-marker-size)/2);right:auto;top:var(--stepper-marker-size);width:var(--stepper-line-size)}@media (max-width:768px){.stepper{flex-direction:column}.stepper__item{padding-left:calc(var(--stepper-marker-size) + var(--space-3))}.stepper__marker{left:0;position:absolute;top:0}.stepper__item:not(:last-child):after{height:calc(100% + var(--space-4));left:calc(var(--stepper-marker-size)/2);right:auto;top:var(--stepper-marker-size);width:var(--stepper-line-size)}}
@@ -22,6 +22,8 @@
22
22
  [data-vds-skeleton],
23
23
  .vds-skeleton {
24
24
  --skeleton-line-height: 1rem;
25
+ --skeleton-radius: var(--radius-md);
26
+ --skeleton-shimmer-duration: 1.6s;
25
27
  }
26
28
 
27
29
  /* ---------------------------------------------------------
@@ -48,7 +50,7 @@
48
50
  width: 100%;
49
51
  height: var(--skeleton-line-height);
50
52
 
51
- border-radius: var(--radius-md);
53
+ border-radius: var(--skeleton-radius, var(--radius-md));
52
54
  background-color: var(--color-muted-bg);
53
55
 
54
56
  overflow: hidden;
@@ -71,6 +73,8 @@
71
73
  );
72
74
 
73
75
  animation: vds-skeleton-shimmer 1.6s infinite;
76
+
77
+ animation: vds-skeleton-shimmer var(--skeleton-shimmer-duration, 1.6s) infinite;
74
78
  }
75
79
 
76
80
  .skeleton--sm {
@@ -97,6 +101,14 @@
97
101
  background-color: var(--color-muted-border);
98
102
  }
99
103
 
104
+ .skeleton--pill {
105
+ --skeleton-radius: var(--radius-full);
106
+ }
107
+
108
+ .skeleton--square {
109
+ --skeleton-radius: var(--radius-none);
110
+ }
111
+
100
112
  .skeleton--static::after {
101
113
  animation: none !important;
102
114
  display: none !important;
@@ -112,7 +124,7 @@
112
124
  height: var(--skeleton-line-height);
113
125
 
114
126
  margin-bottom: var(--space-2);
115
- border-radius: var(--radius-md);
127
+ border-radius: var(--skeleton-radius, var(--radius-md));
116
128
  background-color: var(--color-muted-bg);
117
129
 
118
130
  position: relative;
@@ -134,6 +146,7 @@
134
146
  transparent
135
147
  );
136
148
  animation: vds-skeleton-shimmer 1.6s infinite;
149
+ animation: vds-skeleton-shimmer var(--skeleton-shimmer-duration, 1.6s) infinite;
137
150
  }
138
151
 
139
152
  .skeleton-line--short {
@@ -212,6 +225,7 @@
212
225
  transparent
213
226
  );
214
227
  animation: vds-skeleton-shimmer 1.6s infinite;
228
+ animation: vds-skeleton-shimmer var(--skeleton-shimmer-duration, 1.6s) infinite;
215
229
  }
216
230
 
217
231
  /* ---------------------------------------------------------
@@ -221,7 +235,7 @@
221
235
  .skeleton-block {
222
236
  width: 100%;
223
237
  background-color: var(--color-muted-bg);
224
- border-radius: var(--radius-md);
238
+ border-radius: var(--skeleton-radius, var(--radius-md));
225
239
  position: relative;
226
240
  overflow: hidden;
227
241
  }
@@ -269,6 +283,7 @@
269
283
  transparent
270
284
  );
271
285
  animation: vds-skeleton-shimmer 1.6s infinite;
286
+ animation: vds-skeleton-shimmer var(--skeleton-shimmer-duration, 1.6s) infinite;
272
287
  }
273
288
 
274
289
  /* ---------------------------------------------------------
@@ -357,6 +372,10 @@
357
372
  gap: var(--space-3);
358
373
  }
359
374
 
375
+ .skeleton-stack .skeleton-line {
376
+ margin-bottom: 0;
377
+ }
378
+
360
379
  .skeleton-inline {
361
380
  display: flex;
362
381
  align-items: center;
@@ -1 +1 @@
1
- .vds-skeleton,[data-vds-skeleton]{--skeleton-line-height:1rem}@keyframes vds-skeleton-shimmer{0%{transform:translateX(-150%)}to{transform:translateX(150%)}}.skeleton{background-color:var(--color-muted-bg);border-radius:var(--radius-md);display:block;height:var(--skeleton-line-height);overflow:hidden;position:relative;width:100%}.skeleton:after{animation:vds-skeleton-shimmer 1.6s infinite;background:linear-gradient(90deg,transparent,var(--color-surface-subtle),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}.skeleton--sm{height:calc(var(--skeleton-line-height)*.75)}.skeleton--md{height:var(--skeleton-line-height)}.skeleton--lg{height:calc(var(--skeleton-line-height)*1.25)}.skeleton--xl{height:calc(var(--skeleton-line-height)*1.75)}.skeleton--subtle{background-color:var(--color-surface-subtle)}.skeleton--strong{background-color:var(--color-muted-border)}.skeleton--static:after{animation:none!important;display:none!important}.skeleton-line{background-color:var(--color-muted-bg);border-radius:var(--radius-md);display:block;height:var(--skeleton-line-height);margin-bottom:var(--space-2);overflow:hidden;position:relative;width:100%}.skeleton-line:after{animation:vds-skeleton-shimmer 1.6s infinite;background:linear-gradient(90deg,transparent,var(--color-surface-subtle),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}.skeleton-line--short{width:40%}.skeleton-line--medium{width:60%}.skeleton-line--long{width:80%}.skeleton-line--full{width:100%}.skeleton-line--xs{height:calc(var(--skeleton-line-height)*.6)}.skeleton-line--sm{height:calc(var(--skeleton-line-height)*.8)}.skeleton-line--lg{height:calc(var(--skeleton-line-height)*1.3)}.skeleton-avatar{background-color:var(--color-muted-bg);border-radius:var(--radius-full);display:inline-block;overflow:hidden;position:relative}.skeleton-avatar--sm{height:var(--avatar-size-sm);width:var(--avatar-size-sm)}.skeleton-avatar--md{height:var(--avatar-size-md);width:var(--avatar-size-md)}.skeleton-avatar--lg{height:var(--avatar-size-lg);width:var(--avatar-size-lg)}.skeleton-avatar--square{border-radius:var(--radius-md)}.skeleton-avatar:after{animation:vds-skeleton-shimmer 1.6s infinite;background:linear-gradient(90deg,transparent,var(--color-surface-subtle),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}.skeleton-block{background-color:var(--color-muted-bg);border-radius:var(--radius-md);overflow:hidden;position:relative;width:100%}.skeleton-block--1-1{aspect-ratio:1/1}.skeleton-block--4-3{aspect-ratio:4/3}.skeleton-block--16-9{aspect-ratio:16/9}.skeleton-block--21-9{aspect-ratio:21/9}.skeleton-block--sm{height:6rem}.skeleton-block--md{height:12rem}.skeleton-block--lg{height:18rem}.skeleton-block:after{animation:vds-skeleton-shimmer 1.6s infinite;background:linear-gradient(90deg,transparent,var(--color-surface-subtle),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}.skeleton-card{background-color:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-6)}.skeleton-card--dense{padding:var(--space-4)}.skeleton-card--relaxed{padding:var(--space-8)}.skeleton-card--list{align-items:center;flex-direction:row;gap:var(--space-4)}.skeleton-card--media .skeleton-block{margin-bottom:var(--space-4)}.skeleton-card--stat .skeleton-line{height:calc(var(--skeleton-line-height)*1.6);width:50%}.skeleton-row td{padding:var(--space-3) var(--space-4)}.skeleton-row--a td{padding:var(--space-4) var(--space-5)}.skeleton-row--c td{padding:var(--space-2) var(--space-3)}.skeleton-item{align-items:center;display:flex;gap:var(--space-3);padding:var(--space-3) 0}.skeleton-item--compact{gap:var(--space-2);padding:var(--space-2) 0}.skeleton-item--spacious{gap:var(--space-4);padding:var(--space-4) 0}.skeleton-stack{display:flex;flex-direction:column;gap:var(--space-3)}.skeleton-inline{align-items:center;display:flex;gap:var(--space-3)}.skeleton-gap-sm{gap:var(--space-2)}.skeleton-gap-lg{gap:var(--space-6)}@media (prefers-reduced-motion:reduce){.skeleton-avatar:after,.skeleton-block:after,.skeleton-line:after,.skeleton:after{animation:none!important}}
1
+ .vds-skeleton,[data-vds-skeleton]{--skeleton-line-height:1rem;--skeleton-radius:var(--radius-md);--skeleton-shimmer-duration:1.6s}@keyframes vds-skeleton-shimmer{0%{transform:translateX(-150%)}to{transform:translateX(150%)}}.skeleton{background-color:var(--color-muted-bg);border-radius:var(--skeleton-radius,var(--radius-md));display:block;height:var(--skeleton-line-height);overflow:hidden;position:relative;width:100%}.skeleton:after{animation:vds-skeleton-shimmer 1.6s infinite;animation:vds-skeleton-shimmer var(--skeleton-shimmer-duration,1.6s) infinite;background:linear-gradient(90deg,transparent,var(--color-surface-subtle),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}.skeleton--sm{height:calc(var(--skeleton-line-height)*.75)}.skeleton--md{height:var(--skeleton-line-height)}.skeleton--lg{height:calc(var(--skeleton-line-height)*1.25)}.skeleton--xl{height:calc(var(--skeleton-line-height)*1.75)}.skeleton--subtle{background-color:var(--color-surface-subtle)}.skeleton--strong{background-color:var(--color-muted-border)}.skeleton--pill{--skeleton-radius:var(--radius-full)}.skeleton--square{--skeleton-radius:var(--radius-none)}.skeleton--static:after{animation:none!important;display:none!important}.skeleton-line{background-color:var(--color-muted-bg);border-radius:var(--skeleton-radius,var(--radius-md));display:block;height:var(--skeleton-line-height);margin-bottom:var(--space-2);overflow:hidden;position:relative;width:100%}.skeleton-line:after{animation:vds-skeleton-shimmer 1.6s infinite;animation:vds-skeleton-shimmer var(--skeleton-shimmer-duration,1.6s) infinite;background:linear-gradient(90deg,transparent,var(--color-surface-subtle),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}.skeleton-line--short{width:40%}.skeleton-line--medium{width:60%}.skeleton-line--long{width:80%}.skeleton-line--full{width:100%}.skeleton-line--xs{height:calc(var(--skeleton-line-height)*.6)}.skeleton-line--sm{height:calc(var(--skeleton-line-height)*.8)}.skeleton-line--lg{height:calc(var(--skeleton-line-height)*1.3)}.skeleton-avatar{background-color:var(--color-muted-bg);border-radius:var(--radius-full);display:inline-block;overflow:hidden;position:relative}.skeleton-avatar--sm{height:var(--avatar-size-sm);width:var(--avatar-size-sm)}.skeleton-avatar--md{height:var(--avatar-size-md);width:var(--avatar-size-md)}.skeleton-avatar--lg{height:var(--avatar-size-lg);width:var(--avatar-size-lg)}.skeleton-avatar--square{border-radius:var(--radius-md)}.skeleton-avatar:after{animation:vds-skeleton-shimmer 1.6s infinite;animation:vds-skeleton-shimmer var(--skeleton-shimmer-duration,1.6s) infinite;background:linear-gradient(90deg,transparent,var(--color-surface-subtle),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}.skeleton-block{background-color:var(--color-muted-bg);border-radius:var(--skeleton-radius,var(--radius-md));overflow:hidden;position:relative;width:100%}.skeleton-block--1-1{aspect-ratio:1/1}.skeleton-block--4-3{aspect-ratio:4/3}.skeleton-block--16-9{aspect-ratio:16/9}.skeleton-block--21-9{aspect-ratio:21/9}.skeleton-block--sm{height:6rem}.skeleton-block--md{height:12rem}.skeleton-block--lg{height:18rem}.skeleton-block:after{animation:vds-skeleton-shimmer 1.6s infinite;animation:vds-skeleton-shimmer var(--skeleton-shimmer-duration,1.6s) infinite;background:linear-gradient(90deg,transparent,var(--color-surface-subtle),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}.skeleton-card{background-color:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-6)}.skeleton-card--dense{padding:var(--space-4)}.skeleton-card--relaxed{padding:var(--space-8)}.skeleton-card--list{align-items:center;flex-direction:row;gap:var(--space-4)}.skeleton-card--media .skeleton-block{margin-bottom:var(--space-4)}.skeleton-card--stat .skeleton-line{height:calc(var(--skeleton-line-height)*1.6);width:50%}.skeleton-row td{padding:var(--space-3) var(--space-4)}.skeleton-row--a td{padding:var(--space-4) var(--space-5)}.skeleton-row--c td{padding:var(--space-2) var(--space-3)}.skeleton-item{align-items:center;display:flex;gap:var(--space-3);padding:var(--space-3) 0}.skeleton-item--compact{gap:var(--space-2);padding:var(--space-2) 0}.skeleton-item--spacious{gap:var(--space-4);padding:var(--space-4) 0}.skeleton-stack{display:flex;flex-direction:column;gap:var(--space-3)}.skeleton-stack .skeleton-line{margin-bottom:0}.skeleton-inline{align-items:center;display:flex;gap:var(--space-3)}.skeleton-gap-sm{gap:var(--space-2)}.skeleton-gap-lg{gap:var(--space-6)}@media (prefers-reduced-motion:reduce){.skeleton-avatar:after,.skeleton-block:after,.skeleton-line:after,.skeleton:after{animation:none!important}}
@@ -0,0 +1,172 @@
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Empty / Zero States
3
+ *
4
+ * Responsibilities:
5
+ * - Provide empty-state shells for lists, dashboards, and setups
6
+ * - Support inline, centered, and compact presentations
7
+ * - Provide consistent icon, title, body, and action slots
8
+ *
9
+ * System Notes:
10
+ * - Pure CSS; use buttons and links for actions
11
+ * - Token-driven spacing, surfaces, and typography
12
+ ************************************************************/
13
+
14
+ /* ---------------------------------------------------------
15
+ 1. STATE TOKENS
16
+ --------------------------------------------------------- */
17
+
18
+ [data-vds-state],
19
+ .vds-state {
20
+ --state-gap: var(--space-4);
21
+ --state-padding: var(--space-8);
22
+ --state-radius: var(--radius-lg);
23
+ --state-surface: var(--color-surface);
24
+ --state-border: var(--color-border-subtle);
25
+ --state-icon-size: 2.75rem;
26
+ --state-icon-bg: var(--color-surface-subtle);
27
+ --state-icon-color: var(--color-accent);
28
+ --state-title-size: var(--text-md);
29
+ --state-eyebrow-color: var(--color-text-muted);
30
+ --state-media-size: 3.5rem;
31
+ --state-media-bg: var(--color-surface-subtle);
32
+ --state-media-color: var(--color-text);
33
+ --state-border-style: dashed;
34
+ }
35
+
36
+ /* ---------------------------------------------------------
37
+ 2. BASE STATE
38
+ --------------------------------------------------------- */
39
+
40
+ .state {
41
+ display: flex;
42
+ flex-direction: column;
43
+ align-items: center;
44
+ gap: var(--state-gap);
45
+ padding: var(--state-padding);
46
+ border-radius: var(--state-radius);
47
+ border: 1px var(--state-border-style) var(--state-border);
48
+ background: var(--state-surface);
49
+ text-align: center;
50
+ }
51
+
52
+ .state__eyebrow {
53
+ font-size: var(--text-xxs);
54
+ letter-spacing: 0.12em;
55
+ text-transform: uppercase;
56
+ color: var(--state-eyebrow-color);
57
+ }
58
+
59
+ .state__icon {
60
+ width: var(--state-icon-size);
61
+ height: var(--state-icon-size);
62
+ border-radius: var(--radius-md);
63
+ background: var(--state-icon-bg);
64
+ color: var(--state-icon-color);
65
+ display: inline-flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ font-size: var(--text-md);
69
+ }
70
+
71
+ .state__media {
72
+ width: var(--state-media-size);
73
+ height: var(--state-media-size);
74
+ border-radius: var(--radius-lg);
75
+ background: var(--state-media-bg);
76
+ color: var(--state-media-color);
77
+ display: inline-flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ font-size: var(--text-lg);
81
+ }
82
+
83
+ .state__content {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: var(--space-2);
87
+ }
88
+
89
+ .state__title {
90
+ font-size: var(--state-title-size);
91
+ font-weight: 600;
92
+ color: var(--color-text);
93
+ }
94
+
95
+ .state__text {
96
+ font-size: var(--text-sm);
97
+ color: var(--color-text-muted);
98
+ }
99
+
100
+ .state__actions {
101
+ display: flex;
102
+ flex-wrap: wrap;
103
+ gap: var(--space-3);
104
+ justify-content: center;
105
+ }
106
+
107
+ .state__meta {
108
+ font-size: var(--text-xs);
109
+ color: var(--color-text-muted);
110
+ }
111
+
112
+ /* ---------------------------------------------------------
113
+ 3. VARIANTS
114
+ --------------------------------------------------------- */
115
+
116
+ .state--left {
117
+ align-items: flex-start;
118
+ text-align: left;
119
+ }
120
+
121
+ .state--soft {
122
+ --state-surface: var(--color-surface-subtle);
123
+ --state-border-style: solid;
124
+ }
125
+
126
+ .state--inline {
127
+ flex-direction: row;
128
+ align-items: flex-start;
129
+ text-align: left;
130
+ }
131
+
132
+ .state--split {
133
+ flex-direction: row;
134
+ align-items: center;
135
+ text-align: left;
136
+ }
137
+
138
+ .state--left .state__actions,
139
+ .state--inline .state__actions,
140
+ .state--split .state__actions {
141
+ justify-content: flex-start;
142
+ }
143
+
144
+ .state--compact {
145
+ --state-padding: var(--space-5);
146
+ --state-gap: var(--space-3);
147
+ }
148
+
149
+ .state--plain {
150
+ padding: 0;
151
+ border: none;
152
+ background: transparent;
153
+ }
154
+
155
+ .state--center {
156
+ align-items: center;
157
+ text-align: center;
158
+ }
159
+
160
+ @media (max-width: 768px) {
161
+ .state--inline {
162
+ flex-direction: column;
163
+ align-items: center;
164
+ text-align: center;
165
+ }
166
+
167
+ .state--split {
168
+ flex-direction: column;
169
+ align-items: center;
170
+ text-align: center;
171
+ }
172
+ }
@@ -0,0 +1 @@
1
+ .vds-state,[data-vds-state]{--state-gap:var(--space-4);--state-padding:var(--space-8);--state-radius:var(--radius-lg);--state-surface:var(--color-surface);--state-border:var(--color-border-subtle);--state-icon-size:2.75rem;--state-icon-bg:var(--color-surface-subtle);--state-icon-color:var(--color-accent);--state-title-size:var(--text-md);--state-eyebrow-color:var(--color-text-muted);--state-media-size:3.5rem;--state-media-bg:var(--color-surface-subtle);--state-media-color:var(--color-text);--state-border-style:dashed}.state{align-items:center;background:var(--state-surface);border:1px var(--state-border-style) var(--state-border);border-radius:var(--state-radius);display:flex;flex-direction:column;gap:var(--state-gap);padding:var(--state-padding);text-align:center}.state__eyebrow{color:var(--state-eyebrow-color);font-size:var(--text-xxs);letter-spacing:.12em;text-transform:uppercase}.state__icon{background:var(--state-icon-bg);border-radius:var(--radius-md);color:var(--state-icon-color);font-size:var(--text-md);height:var(--state-icon-size);width:var(--state-icon-size)}.state__icon,.state__media{align-items:center;display:inline-flex;justify-content:center}.state__media{background:var(--state-media-bg);border-radius:var(--radius-lg);color:var(--state-media-color);font-size:var(--text-lg);height:var(--state-media-size);width:var(--state-media-size)}.state__content{display:flex;flex-direction:column;gap:var(--space-2)}.state__title{color:var(--color-text);font-size:var(--state-title-size);font-weight:600}.state__text{color:var(--color-text-muted);font-size:var(--text-sm)}.state__actions{display:flex;flex-wrap:wrap;gap:var(--space-3);justify-content:center}.state__meta{color:var(--color-text-muted);font-size:var(--text-xs)}.state--left{align-items:flex-start;text-align:left}.state--soft{--state-surface:var(--color-surface-subtle);--state-border-style:solid}.state--inline{align-items:flex-start}.state--inline,.state--split{flex-direction:row;text-align:left}.state--split{align-items:center}.state--inline .state__actions,.state--left .state__actions,.state--split .state__actions{justify-content:flex-start}.state--compact{--state-padding:var(--space-5);--state-gap:var(--space-3)}.state--plain{background:transparent;border:none;padding:0}.state--center{align-items:center;text-align:center}@media (max-width:768px){.state--inline,.state--split{align-items:center;flex-direction:column;text-align:center}}