@24vlh/vds 0.1.3 → 0.1.5

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.
@@ -0,0 +1,1228 @@
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Inbox List Component
3
+ *
4
+ * File: vds-inbox.css
5
+ *
6
+ * Responsibilities:
7
+ * - Row-based list pattern for inbox workflows:
8
+ * title, glance, badges, labels, status icons, actions
9
+ * - Responsive action reflow (right -> below on small screens)
10
+ * - Row variants: minimal / normal / rich / mega
11
+ * - Flag colors (5 options) for fast scanning
12
+ * - Expandable-row helpers (open state only; no JS)
13
+ * - Top navigation bar (search + tabs + optional left/right action slots)
14
+ * - Flat list variant (table-like separators) + rounded card variant
15
+ * - Action style variants (flat vs rich) using tokens only
16
+ ************************************************************/
17
+
18
+ /* ---------------------------------------------------------
19
+ 0. ROOT (tokens + component defaults)
20
+ --------------------------------------------------------- */
21
+
22
+ [data-vds-inbox],
23
+ .vds-inbox {
24
+ --inbox-row-radius: var(--radius-lg, var(--radius-md));
25
+ --inbox-row-border: var(--color-border-subtle);
26
+ --inbox-row-bg: var(--color-surface);
27
+ --inbox-row-bg-hover: var(--color-surface-subtle, var(--color-surface-hover));
28
+ --inbox-row-shadow: none;
29
+
30
+ --inbox-title-size: var(--text-sm);
31
+ --inbox-desc-size: var(--text-xs);
32
+
33
+ --inbox-icon-size: var(--icon-sm);
34
+ --inbox-icon-muted: var(--color-icon-muted, var(--color-text-soft));
35
+ --inbox-icon-strong: var(--color-icon-strong, var(--color-text));
36
+
37
+ --inbox-action-gap: var(--space-2);
38
+ --inbox-badge-gap: var(--space-2);
39
+
40
+ --inbox-row-pad-x: var(--space-4);
41
+ --inbox-row-pad-y: var(--space-4);
42
+
43
+ --inbox-actions-min-width: 0;
44
+ --inbox-actions-justify: flex-end; /* right rail on wide screens */
45
+
46
+ width: 100%;
47
+ }
48
+
49
+ /* Optional: make the whole surface slightly denser */
50
+
51
+ .vds-inbox--dense {
52
+ --inbox-row-pad-x: var(--space-3);
53
+ --inbox-row-pad-y: var(--space-3);
54
+ --inbox-title-size: var(--text-xs);
55
+ --inbox-desc-size: var(--text-xxs, var(--text-xs));
56
+ }
57
+
58
+ /* ---------------------------------------------------------
59
+ 1. TOP NAV (search + tabs + actions)
60
+ --------------------------------------------------------- */
61
+
62
+ .vds-inbox-nav {
63
+ display: flex;
64
+ flex-direction: column;
65
+ gap: var(--space-3);
66
+ margin-bottom: var(--space-4);
67
+ }
68
+
69
+ .vds-inbox-nav__bar {
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: space-between;
73
+ gap: var(--space-4);
74
+
75
+ padding: var(--space-3) var(--space-4);
76
+ border: 1px solid var(--color-border-subtle);
77
+ border-radius: var(--radius-lg);
78
+ background: var(--color-surface);
79
+ }
80
+
81
+ /* left / right rails */
82
+
83
+ .vds-inbox-nav__left,
84
+ .vds-inbox-nav__right {
85
+ display: inline-flex;
86
+ align-items: center;
87
+ gap: var(--space-2);
88
+ flex: 0 0 auto;
89
+ }
90
+
91
+ /* bottom rail (optional helper row under tabs/search) */
92
+
93
+ .vds-inbox-nav__bottom {
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: space-between;
97
+ gap: var(--space-3);
98
+ }
99
+
100
+ .vds-inbox-nav__bottom-left,
101
+ .vds-inbox-nav__bottom-right {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ gap: var(--space-2);
105
+ }
106
+
107
+ .vds-inbox-nav__bottom-left:empty,
108
+ .vds-inbox-nav__bottom-right:empty {
109
+ display: none;
110
+ }
111
+
112
+ /* bottom alignment helpers */
113
+
114
+ .vds-inbox-nav__bottom--left {
115
+ justify-content: flex-start;
116
+ }
117
+
118
+ .vds-inbox-nav__bottom--center {
119
+ justify-content: center;
120
+ }
121
+
122
+ .vds-inbox-nav__bottom--right {
123
+ justify-content: flex-end;
124
+ }
125
+
126
+ .vds-inbox-nav__bottom--split {
127
+ justify-content: space-between;
128
+ }
129
+
130
+ /* Tabs */
131
+
132
+ .vds-inbox-tabs {
133
+ display: inline-flex;
134
+ align-items: center;
135
+ gap: var(--space-1);
136
+ padding: var(--space-1);
137
+ border-radius: var(--radius-lg);
138
+ border: 1px solid var(--color-border-subtle);
139
+ background: var(--color-surface-subtle);
140
+ flex: 1 1 auto;
141
+ min-width: 0;
142
+ justify-content: center;
143
+ }
144
+
145
+ .vds-inbox-tab {
146
+ -webkit-appearance: none;
147
+ -moz-appearance: none;
148
+ appearance: none;
149
+ border: 0;
150
+ background: transparent;
151
+ color: var(--color-text-muted);
152
+ font-weight: var(--font-weight-semibold);
153
+ font-size: var(--text-sm);
154
+ line-height: 1;
155
+
156
+ padding: var(--space-2) var(--space-3);
157
+ border-radius: var(--radius-md);
158
+
159
+ display: inline-flex;
160
+ align-items: center;
161
+ gap: var(--space-2);
162
+ cursor: pointer;
163
+ -webkit-user-select: none;
164
+ -moz-user-select: none;
165
+ user-select: none;
166
+ white-space: nowrap;
167
+ }
168
+
169
+ .vds-inbox-tab:hover {
170
+ background: var(--color-surface);
171
+ color: var(--color-text);
172
+ }
173
+
174
+ .vds-inbox-tab[aria-selected="true"],
175
+ .vds-inbox-tab.is-active {
176
+ background: var(--color-surface);
177
+ color: var(--color-text);
178
+ border: 1px solid var(--color-border-subtle);
179
+ }
180
+
181
+ .vds-inbox-tab:focus-visible {
182
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
183
+ outline-offset: var(--focus-ring-offset);
184
+ }
185
+
186
+ /* Optional tab badge */
187
+
188
+ .vds-inbox-tab__count {
189
+ display: inline-flex;
190
+ align-items: center;
191
+ justify-content: center;
192
+ min-width: 1.5rem;
193
+ height: 1.5rem;
194
+ padding: 0 var(--space-2);
195
+
196
+ border-radius: var(--radius-pill);
197
+ border: 1px solid var(--color-border-subtle);
198
+ background: var(--color-surface-subtle);
199
+ color: var(--color-text-muted);
200
+
201
+ font-size: var(--text-xs);
202
+ font-weight: var(--font-weight-semibold);
203
+ }
204
+
205
+ /* --- Search (icon -> expanding field) --- */
206
+
207
+ .vds-inbox-search {
208
+ display: inline-flex;
209
+ align-items: center;
210
+ gap: var(--space-2);
211
+ min-width: 0;
212
+ }
213
+
214
+ .vds-inbox-search__toggle {
215
+ display: inline-flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+
219
+ width: 2.25rem;
220
+
221
+ width: var(--icon-container-md, 2.25rem);
222
+ height: 2.25rem;
223
+ height: var(--icon-container-md, 2.25rem);
224
+
225
+ border-radius: var(--radius-md);
226
+ border: 1px solid var(--color-border-subtle);
227
+ background: var(--color-surface);
228
+
229
+ color: var(--color-text);
230
+ transition: background-color var(--transition-fast), border-color var(--transition-fast);
231
+ }
232
+
233
+ .vds-inbox-search__toggle:hover {
234
+ background: var(--color-surface-subtle, var(--color-surface-hover));
235
+ border-color: var(--color-border-strong, var(--color-border-subtle));
236
+ }
237
+
238
+ .vds-inbox-search__toggle svg {
239
+ width: 1rem;
240
+ width: var(--icon-xs, 1rem);
241
+ height: 1rem;
242
+ height: var(--icon-xs, 1rem);
243
+ color: currentColor;
244
+ }
245
+
246
+ /* Field wrapper starts collapsed */
247
+
248
+ .vds-inbox-search__field {
249
+ display: inline-flex;
250
+ align-items: center;
251
+ gap: var(--space-2);
252
+
253
+ width: 0;
254
+ opacity: 0;
255
+ overflow: hidden;
256
+ pointer-events: none;
257
+
258
+ transition: width var(--transition-normal), opacity var(--transition-fast);
259
+ }
260
+
261
+ .vds-inbox-search__input {
262
+ width: 100%;
263
+ min-width: 10rem;
264
+ max-width: 32rem;
265
+
266
+ padding: var(--space-2) var(--space-3);
267
+ border-radius: var(--radius-md);
268
+ border: 1px solid var(--color-border-subtle);
269
+ background: var(--color-surface);
270
+ color: var(--color-text);
271
+
272
+ font-size: var(--text-sm);
273
+ line-height: var(--line-height-normal);
274
+ }
275
+
276
+ /* Open state: set on .vds-inbox-search or on toggle via aria-expanded */
277
+
278
+ .vds-inbox-search.is-open .vds-inbox-search__field,
279
+ .vds-inbox-search__toggle[aria-expanded="true"] + .vds-inbox-search__field {
280
+ width: min(36rem, 52vw);
281
+ opacity: 1;
282
+ pointer-events: auto;
283
+ }
284
+
285
+ /* Full-width search helper (mobile or on demand) */
286
+
287
+ .vds-inbox-search--full {
288
+ width: 100%;
289
+ }
290
+
291
+ .vds-inbox-search--full .vds-inbox-search__field {
292
+ width: 100%;
293
+ opacity: 1;
294
+ pointer-events: auto;
295
+ }
296
+
297
+ /* ---------------------------------------------------------
298
+ 2. LIST (rounded vs flat)
299
+ --------------------------------------------------------- */
300
+
301
+ .vds-inbox__list {
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: var(--space-2);
305
+ }
306
+
307
+ /* Flat list: separators + list border, no side borders on rows */
308
+
309
+ .vds-inbox--flat .vds-inbox__list {
310
+ gap: 0;
311
+ border-top: 1px solid var(--color-border-subtle);
312
+ border-bottom: 1px solid var(--color-border-subtle);
313
+ }
314
+
315
+ .vds-inbox--flat .vds-inbox-row {
316
+ border-left: 0;
317
+ border-right: 0;
318
+ border-top: 0;
319
+ border-radius: 0;
320
+ }
321
+
322
+ .vds-inbox--flat .vds-inbox-row + .vds-inbox-row {
323
+ border-top: 1px solid var(--color-border-subtle);
324
+ }
325
+
326
+ /* ---------------------------------------------------------
327
+ 3. ROW BASE
328
+ --------------------------------------------------------- */
329
+
330
+ .vds-inbox-row {
331
+ position: relative;
332
+ width: 100%;
333
+ background: var(--inbox-row-bg);
334
+ border: 1px solid var(--inbox-row-border);
335
+ border-radius: var(--inbox-row-radius);
336
+ box-shadow: var(--inbox-row-shadow);
337
+ overflow: clip;
338
+
339
+ transition: background-color var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
340
+ }
341
+
342
+ .vds-inbox-row:hover {
343
+ background: var(--inbox-row-bg-hover);
344
+ border-color: var(--color-border-strong, var(--color-border-subtle));
345
+ }
346
+
347
+ .vds-inbox-row:focus-visible {
348
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
349
+ outline-offset: var(--focus-ring-offset);
350
+ }
351
+
352
+ /* Recommended clickable wrapper: <button> or <a> */
353
+
354
+ .vds-inbox-row__main {
355
+ width: 100%;
356
+ border: 0;
357
+ background: transparent;
358
+ padding: 0;
359
+ text-align: left;
360
+ color: inherit;
361
+ display: grid;
362
+ grid-template-columns: 1fr;
363
+ grid-template-rows: auto auto;
364
+ }
365
+
366
+ /* Core grid: meta left + actions right */
367
+
368
+ .vds-inbox-row__inner {
369
+ display: grid;
370
+ grid-template-columns: 1fr auto;
371
+ grid-gap: var(--space-4);
372
+ gap: var(--space-4);
373
+ align-items: start;
374
+ padding: var(--inbox-row-pad-y) var(--inbox-row-pad-x);
375
+ grid-column: 1 / -1;
376
+ grid-row: 1;
377
+ }
378
+
379
+ /* ---------------------------------------------------------
380
+ ROW GRID REFACTOR: meta | actions, then data full-width
381
+ (glance + details + metafoot live under __data)
382
+ --------------------------------------------------------- */
383
+
384
+ /* Replace the simple 2-col grid with explicit areas */
385
+
386
+ .vds-inbox-row__inner {
387
+ grid-template-columns: 1fr auto; /* keep the intent:contentReference[oaicite:2]{index=2} */
388
+ grid-template-areas:
389
+ "badges badges"
390
+ "meta actions"
391
+ "data data";
392
+ }
393
+
394
+ /* Existing badges row is already full width:contentReference[oaicite:3]{index=3}.
395
+ We map it into the grid areas as well (harmless if not present). */
396
+
397
+ .vds-inbox-row__badges {
398
+ grid-area: badges;
399
+ }
400
+
401
+ .vds-inbox-row__meta {
402
+ grid-area: meta;
403
+ min-width: 0;
404
+ }
405
+
406
+ .vds-inbox-row__actions {
407
+ grid-area: actions;
408
+ }
409
+
410
+ /* NEW: one container for all “row data” blocks */
411
+
412
+ .vds-inbox-row__data {
413
+ grid-area: data;
414
+ min-width: 0;
415
+ display: flex;
416
+ flex-direction: column;
417
+ gap: var(--space-2);
418
+ }
419
+
420
+ /* Keep existing styling for these blocks; they now simply sit inside __data.
421
+ (These selectors already exist in your file.):contentReference[oaicite:4]{index=4}:contentReference[oaicite:5]{index=5}:contentReference[oaicite:6]{index=6} */
422
+
423
+ /* --- Mobile / narrow screens: actions must be last, full width, aligned right --- */
424
+
425
+ @media (max-width: 768px) {
426
+ .vds-inbox-row__inner {
427
+ grid-template-columns: 1fr;
428
+ grid-template-areas:
429
+ "badges"
430
+ "meta"
431
+ "data"
432
+ "actions";
433
+ }
434
+
435
+ /* Ensure actions take full width and stay right-aligned (your default is token-driven):contentReference[oaicite:7]{index=7} */
436
+ .vds-inbox-row__actions {
437
+ min-width: 0;
438
+ justify-content: flex-end;
439
+ padding-top: 0;
440
+ }
441
+ }
442
+
443
+ /* --- Actions “full row” helper should still work; now it just reinforces the layout --- */
444
+
445
+ .vds-inbox-row--actions-full .vds-inbox-row__actions {
446
+ grid-column: 1 / -1; /* already in file:contentReference[oaicite:8]{index=8} */
447
+ }
448
+
449
+ /* ---------------------------------------------------------
450
+ LABEL ALIGNMENT FIX
451
+ --------------------------------------------------------- */
452
+
453
+ /* The symptoms you described usually happen when labels are pushed right
454
+ (commonly via margin-left:auto or justify-content:flex-end).
455
+ Force labels to align left and wrap cleanly. */
456
+
457
+ .vds-inbox-row__labels {
458
+ justify-content: flex-start;
459
+ align-items: center;
460
+ text-align: left;
461
+ margin-left: 0;
462
+ }
463
+
464
+ /* If your title-line uses flex and previously relied on labels being “right side”,
465
+ keep that behaviour by controlling the title-line instead (recommended pattern):
466
+ - title grows
467
+ - labels sit after title but do NOT right-align internally
468
+ */
469
+
470
+ .vds-inbox-row__title {
471
+ min-width: 0;
472
+ flex: 1 1 auto;
473
+ }
474
+
475
+ /* ---------------------------------------------------------
476
+ 4. ROW VARIANTS (minimal / normal / rich / mega)
477
+ --------------------------------------------------------- */
478
+
479
+ /* Minimalistic: title + status + tiny actions (no extra vertical air) */
480
+
481
+ .vds-inbox-row--minimal .vds-inbox-row__inner {
482
+ gap: var(--space-3);
483
+ padding: var(--space-3) var(--space-3);
484
+ }
485
+
486
+ .vds-inbox-row--minimal {
487
+ --inbox-title-size: var(--text-xs);
488
+ --inbox-desc-size: var(--text-xxs, var(--text-xs));
489
+ }
490
+
491
+ /* Normal: default */
492
+
493
+ .vds-inbox-row--normal .vds-inbox-row__inner {
494
+ padding: var(--space-4) var(--space-4);
495
+ gap: var(--space-4);
496
+ }
497
+
498
+ /* Rich: more air + larger typography */
499
+
500
+ .vds-inbox-row--rich .vds-inbox-row__inner {
501
+ padding: var(--space-5) var(--space-5);
502
+ gap: var(--space-5);
503
+ }
504
+
505
+ .vds-inbox-row--rich {
506
+ --inbox-title-size: var(--text-md, var(--text-sm));
507
+ --inbox-desc-size: var(--text-sm);
508
+ }
509
+
510
+ /* Mega: “data-heavy” row */
511
+
512
+ .vds-inbox-row--mega .vds-inbox-row__inner {
513
+ padding: var(--space-6) var(--space-6);
514
+ gap: var(--space-6);
515
+ }
516
+
517
+ .vds-inbox-row--mega {
518
+ --inbox-title-size: var(--text-lg, var(--text-md, var(--text-sm)));
519
+ --inbox-desc-size: var(--text-sm);
520
+ }
521
+
522
+ /* ---------------------------------------------------------
523
+ 5. BADGES ROW (FULL WIDTH)
524
+ --------------------------------------------------------- */
525
+
526
+ .vds-inbox-row__badges {
527
+ grid-column: 1 / -1;
528
+ display: flex;
529
+ flex-wrap: wrap;
530
+ align-items: center;
531
+ gap: var(--inbox-badge-gap);
532
+ margin-bottom: var(--space-3);
533
+ }
534
+
535
+ .vds-inbox-badge {
536
+ display: inline-flex;
537
+ align-items: center;
538
+ gap: var(--space-1_5);
539
+ padding: var(--space-1) var(--space-2_5);
540
+
541
+ border-radius: var(--radius-pill);
542
+ border: 1px solid var(--color-border-subtle);
543
+
544
+ font-size: var(--text-xxs);
545
+ font-weight: var(--font-weight-semibold);
546
+ letter-spacing: 0.02em;
547
+ line-height: 1.1;
548
+
549
+ background: var(--color-surface-subtle);
550
+ color: var(--color-text);
551
+ white-space: nowrap;
552
+ }
553
+
554
+ .vds-inbox-badge svg {
555
+ width: var(--icon-xxs);
556
+ height: var(--icon-xxs);
557
+ color: currentColor;
558
+ }
559
+
560
+ .vds-inbox-badge--accent {
561
+ background: var(--color-accent-soft);
562
+ border-color: var(--color-accent);
563
+ color: var(--color-text);
564
+ }
565
+
566
+ .vds-inbox-badge--info {
567
+ background: var(--semantic-info-bg, var(--color-info-soft));
568
+ border-color: var(--semantic-info-border, var(--color-info));
569
+ color: var(--semantic-info-text, var(--color-text));
570
+ }
571
+
572
+ .vds-inbox-badge--success {
573
+ background: var(--semantic-success-bg, var(--color-success-soft));
574
+ border-color: var(--semantic-success-border, var(--color-success));
575
+ color: var(--semantic-success-text, var(--color-text));
576
+ }
577
+
578
+ .vds-inbox-badge--warning {
579
+ background: var(--semantic-warning-bg, var(--color-warning-soft));
580
+ border-color: var(--semantic-warning-border, var(--color-warning));
581
+ color: var(--semantic-warning-text, var(--color-text));
582
+ }
583
+
584
+ .vds-inbox-badge--danger {
585
+ background: var(--semantic-danger-bg, var(--color-danger-soft));
586
+ border-color: var(--semantic-danger-border, var(--color-danger));
587
+ color: var(--semantic-danger-text, var(--color-text));
588
+ }
589
+
590
+ /* ---------------------------------------------------------
591
+ 6. META AREA
592
+ --------------------------------------------------------- */
593
+
594
+ .vds-inbox-row__meta {
595
+ display: flex;
596
+ flex-direction: column;
597
+ gap: var(--space-2);
598
+ min-width: 0;
599
+ }
600
+
601
+ .vds-inbox-row__titleline {
602
+ display: flex;
603
+ align-items: center;
604
+ gap: var(--space-2);
605
+ min-width: 0;
606
+ }
607
+
608
+ /* Status icons cluster (bookmark/star/flag) */
609
+
610
+ .vds-inbox-row__status {
611
+ display: inline-flex;
612
+ align-items: center;
613
+ gap: var(--space-1_5);
614
+ flex: 0 0 auto;
615
+ }
616
+
617
+ .vds-inbox-row__status-icon {
618
+ width: var(--inbox-icon-size);
619
+ height: var(--inbox-icon-size);
620
+ display: inline-flex;
621
+ align-items: center;
622
+ justify-content: center;
623
+ color: var(--inbox-icon-muted);
624
+ }
625
+
626
+ .vds-inbox-row__status-icon svg {
627
+ width: 100%;
628
+ height: 100%;
629
+ }
630
+
631
+ /* state toggles (apply on row) */
632
+
633
+ .vds-inbox-row.is-bookmarked .vds-inbox-row__status-icon--bookmark,
634
+ .vds-inbox-row.is-starred .vds-inbox-row__status-icon--star {
635
+ color: var(--color-accent);
636
+ }
637
+
638
+ .vds-inbox-row.is-flagged .vds-inbox-row__status-icon--flag {
639
+ color: var(--color-danger-strong, var(--color-danger));
640
+ }
641
+
642
+ .vds-inbox-row__title {
643
+ font-size: var(--inbox-title-size);
644
+ font-weight: var(--font-weight-semibold);
645
+ line-height: var(--line-height-snug);
646
+ color: var(--color-text);
647
+ letter-spacing: 0;
648
+ letter-spacing: var(--letter-tight, 0);
649
+
650
+ overflow: hidden;
651
+ text-overflow: ellipsis;
652
+ white-space: nowrap;
653
+
654
+ flex: 1 1 auto; /* take leftover width, shrink when needed */
655
+ min-width: 16ch; /* hard floor so it never disappears */
656
+ max-width: 100%; /* prevents weird overflow interactions */
657
+ }
658
+
659
+ /* Inline labels next to title (wide); reflow rules below */
660
+
661
+ .vds-inbox-row__labels {
662
+ display: inline-flex;
663
+ align-items: center;
664
+ gap: var(--space-1_5);
665
+ flex: 0 0 auto;
666
+ min-width: 0;
667
+ }
668
+
669
+ .vds-inbox-label {
670
+ display: inline-flex;
671
+ align-items: center;
672
+ padding: 0 var(--space-2);
673
+ height: 1.4rem;
674
+
675
+ border-radius: var(--radius-pill);
676
+ border: 1px solid var(--color-border-subtle);
677
+
678
+ font-size: var(--text-xxs);
679
+ font-weight: var(--font-weight-semibold);
680
+ color: var(--color-text-muted);
681
+ background: transparent;
682
+ white-space: nowrap;
683
+ }
684
+
685
+ .vds-inbox-label--accent {
686
+ color: var(--color-text);
687
+ border-color: var(--color-accent);
688
+ background: var(--color-accent-soft);
689
+ }
690
+
691
+ .vds-inbox-label--muted {
692
+ color: var(--color-text-muted);
693
+ border-color: var(--color-border-subtle);
694
+ background: var(--color-surface-subtle);
695
+ }
696
+
697
+ /* Glance / description (clamped by default) */
698
+
699
+ .vds-inbox-row__glance {
700
+ font-size: var(--inbox-desc-size);
701
+ line-height: var(--line-height-relaxed);
702
+ color: var(--color-text-muted);
703
+ min-width: 0;
704
+
705
+ display: -webkit-box;
706
+ -webkit-box-orient: vertical;
707
+ -webkit-line-clamp: 2;
708
+ overflow: hidden;
709
+ }
710
+
711
+ /* Rich/mega can show more lines (still clamped unless row open) */
712
+
713
+ .vds-inbox-row--rich .vds-inbox-row__glance {
714
+ -webkit-line-clamp: 3;
715
+ }
716
+
717
+ .vds-inbox-row--mega .vds-inbox-row__glance {
718
+ -webkit-line-clamp: 4;
719
+ }
720
+
721
+ /* Optional metadata footer */
722
+
723
+ .vds-inbox-row__metafoot {
724
+ display: flex;
725
+ flex-wrap: wrap;
726
+ align-items: center;
727
+ gap: var(--space-2) var(--space-4);
728
+ font-size: var(--text-xxs, var(--text-xs));
729
+ color: var(--color-text-soft, var(--color-text-muted));
730
+ }
731
+
732
+ .vds-inbox-row__metafoot strong {
733
+ font-weight: var(--font-weight-semibold);
734
+ color: var(--color-text-muted);
735
+ }
736
+
737
+ /* Optional “detail chips row” (horizontal list of small metadata items) */
738
+
739
+ .vds-inbox-row__details {
740
+ display: flex;
741
+ flex-wrap: wrap;
742
+ gap: var(--space-2) var(--space-3);
743
+ font-size: var(--text-xs);
744
+ color: var(--color-text-muted);
745
+ }
746
+
747
+ .vds-inbox-row__details-item {
748
+ display: inline-flex;
749
+ align-items: center;
750
+ gap: var(--space-1_5);
751
+ padding: var(--space-1) var(--space-2);
752
+
753
+ border-radius: var(--radius-pill);
754
+ border: 1px solid var(--color-border-subtle);
755
+ background: var(--color-surface-subtle);
756
+
757
+ line-height: 1.1;
758
+ }
759
+
760
+ .vds-inbox-row__details-item svg {
761
+ width: var(--icon-xxs);
762
+ height: var(--icon-xxs);
763
+ color: currentColor;
764
+ }
765
+
766
+ /* ---------------------------------------------------------
767
+ 7. ACTIONS (right rail; can reflow below)
768
+ --------------------------------------------------------- */
769
+
770
+ .vds-inbox-row__actions {
771
+ display: flex;
772
+ align-items: flex-start;
773
+ justify-content: var(--inbox-actions-justify);
774
+ gap: var(--inbox-action-gap);
775
+ flex-wrap: wrap;
776
+ padding-top: var(--space-0_5);
777
+ min-width: var(--inbox-actions-min-width);
778
+ }
779
+
780
+ /* Force actions below even on wide screens */
781
+
782
+ .vds-inbox-row--actions-below .vds-inbox-row__inner {
783
+ grid-template-columns: 1fr;
784
+ grid-template-areas:
785
+ "badges"
786
+ "meta"
787
+ "data"
788
+ "actions";
789
+ }
790
+
791
+ .vds-inbox-row--actions-below .vds-inbox-row__actions {
792
+ justify-content: flex-start;
793
+ padding-top: 0;
794
+ }
795
+
796
+ /* Force actions to occupy a full row (even when grid is 2 cols) */
797
+
798
+ .vds-inbox-row--actions-full .vds-inbox-row__actions {
799
+ grid-column: 1 / -1;
800
+ justify-content: flex-start;
801
+ padding-top: 0;
802
+ }
803
+
804
+ /* Actions alignment helpers (useful on mobile / below layout) */
805
+
806
+ .vds-inbox-row__actions--left {
807
+ justify-content: flex-start;
808
+ }
809
+
810
+ .vds-inbox-row__actions--center {
811
+ justify-content: center;
812
+ }
813
+
814
+ .vds-inbox-row__actions--right {
815
+ justify-content: flex-end;
816
+ }
817
+
818
+ /* Action button */
819
+
820
+ .vds-inbox-action {
821
+ display: inline-flex;
822
+ align-items: center;
823
+ justify-content: center;
824
+ gap: var(--space-1_5);
825
+
826
+ padding: var(--space-1_5) var(--space-2_5);
827
+ border-radius: var(--radius-sm);
828
+ border: 1px solid var(--color-border-subtle);
829
+
830
+ font-size: var(--text-xs);
831
+ font-weight: var(--font-weight-semibold);
832
+
833
+ color: var(--color-text);
834
+ background: var(--color-surface);
835
+
836
+ transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast), transform var(--transition-fast);
837
+ }
838
+
839
+ a.vds-inbox-action {
840
+ -webkit-text-decoration: none;
841
+ text-decoration: none;
842
+ }
843
+
844
+ .vds-inbox-action svg {
845
+ width: var(--icon-xxs);
846
+ height: var(--icon-xxs);
847
+ color: currentColor;
848
+ }
849
+
850
+ .vds-inbox-action:hover {
851
+ background: var(--color-surface-subtle, var(--color-surface-hover));
852
+ border-color: var(--color-border-strong, var(--color-border-subtle));
853
+ transform: translateY(-1px);
854
+ }
855
+
856
+ .vds-inbox-action:active {
857
+ transform: translateY(0);
858
+ }
859
+
860
+ .vds-inbox-action--danger {
861
+ color: var(--color-danger-strong, var(--color-danger));
862
+ border-color: var(--color-danger, var(--color-border-strong));
863
+ }
864
+
865
+ .vds-inbox-action--accent {
866
+ color: var(--color-text);
867
+ border-color: var(--color-accent);
868
+ background: var(--color-accent-soft);
869
+ }
870
+
871
+ /* icon-only action */
872
+
873
+ .vds-inbox-action--icon {
874
+ width: 2.25rem;
875
+ width: var(--icon-container-md, 2.25rem);
876
+ height: 2.25rem;
877
+ height: var(--icon-container-md, 2.25rem);
878
+ padding: 0;
879
+ }
880
+
881
+ /* “Flat” action style (no border, lighter affordance) */
882
+
883
+ .vds-inbox-action--flat {
884
+ border-color: transparent;
885
+ background: transparent;
886
+ color: var(--color-text-muted);
887
+ }
888
+
889
+ .vds-inbox-action--flat:hover {
890
+ background: var(--color-surface-subtle);
891
+ border-color: transparent;
892
+ color: var(--color-text);
893
+ transform: none;
894
+ }
895
+
896
+ /* Global switch: make all actions flat within an inbox */
897
+
898
+ .vds-inbox--actions-flat .vds-inbox-action {
899
+ border-color: transparent;
900
+ background: transparent;
901
+ color: var(--color-text-muted);
902
+ transform: none;
903
+ }
904
+
905
+ .vds-inbox--actions-flat .vds-inbox-action:hover {
906
+ background: var(--color-surface-subtle);
907
+ border-color: transparent;
908
+ color: var(--color-text);
909
+ }
910
+
911
+ /* ---------------------------------------------------------
912
+ 8. EXPANDED CONTENT (OPEN STATE HELPERS)
913
+ --------------------------------------------------------- */
914
+
915
+ .vds-inbox-row__expanded {
916
+ grid-column: 1 / -1;
917
+ grid-row: 2;
918
+ border-top: 1px solid var(--color-border-subtle);
919
+ padding: var(--space-4);
920
+ background: var(--color-bg-soft, var(--color-surface-subtle));
921
+ color: var(--color-text);
922
+ display: none;
923
+ }
924
+
925
+ .vds-inbox-row--open .vds-inbox-row__expanded {
926
+ display: block;
927
+ }
928
+
929
+ .vds-inbox-row--open .vds-inbox-row__glance {
930
+ -webkit-line-clamp: initial;
931
+ overflow: visible;
932
+ }
933
+
934
+ /* Expanded content can be made “flush” in flat list mode */
935
+
936
+ .vds-inbox--flat .vds-inbox-row__expanded {
937
+ background: var(--color-surface-subtle);
938
+ }
939
+
940
+ .vds-inbox-row__expanded.vds-is-hidden {
941
+ display: none !important;
942
+ }
943
+
944
+ .vds-inbox-row__expanded.vds-is-visible {
945
+ display: block !important;
946
+ }
947
+
948
+ /* ---------------------------------------------------------
949
+ 9. FLAGS (5 COLORS)
950
+ --------------------------------------------------------- */
951
+
952
+ .vds-inbox-row.is-flagged::before {
953
+ content: "";
954
+ position: absolute;
955
+ top: 0;
956
+ right: auto;
957
+ bottom: 0;
958
+ left: 0;
959
+ width: 6px;
960
+ background: var(--inbox-flag-color, var(--color-danger));
961
+ }
962
+
963
+ .vds-inbox-row--flag-1 { /* danger / red */
964
+ --inbox-flag-color: var(--color-danger);
965
+ --inbox-flag-surface: var(--semantic-danger-bg, var(--color-danger-soft));
966
+ }
967
+
968
+ .vds-icon-flag--1 {
969
+ color: var(--color-danger);
970
+ }
971
+
972
+ .vds-inbox-row--flag-2 { /* warning / amber */
973
+ --inbox-flag-color: var(--color-warning);
974
+ --inbox-flag-surface: var(--semantic-warning-bg, var(--color-warning-soft));
975
+ }
976
+
977
+ .vds-icon-flag--2 {
978
+ color: var(--color-warning);
979
+ }
980
+
981
+ .vds-inbox-row--flag-3 { /* info / blue */
982
+ --inbox-flag-color: var(--color-info);
983
+ --inbox-flag-surface: var(--semantic-info-bg, var(--color-info-soft));
984
+ }
985
+
986
+ .vds-icon-flag--3 {
987
+ color: var(--color-info);
988
+ }
989
+
990
+ .vds-inbox-row--flag-4 { /* success / green */
991
+ --inbox-flag-color: var(--color-success);
992
+ --inbox-flag-surface: var(--semantic-success-bg, var(--color-success-soft));
993
+ }
994
+
995
+ .vds-icon-flag--4 {
996
+ color: var(--color-success);
997
+ }
998
+
999
+ .vds-inbox-row--flag-5 { /* accent */
1000
+ --inbox-flag-color: var(--color-accent);
1001
+ --inbox-flag-surface: var(--color-accent-soft);
1002
+ }
1003
+
1004
+ .vds-icon-flag--5 {
1005
+ color: var(--color-accent);
1006
+ }
1007
+
1008
+ /* ---------------------------------------------------------
1009
+ 10. FILTER TEMPLATE (lightweight)
1010
+ --------------------------------------------------------- */
1011
+
1012
+ .vds-inbox-filter {
1013
+ display: flex;
1014
+ flex-wrap: wrap;
1015
+ align-items: center;
1016
+ gap: var(--space-2) var(--space-3);
1017
+
1018
+ padding: var(--space-3) var(--space-4);
1019
+ border: 1px solid var(--color-border-subtle);
1020
+ border-radius: var(--radius-lg);
1021
+ background: var(--color-surface);
1022
+ }
1023
+
1024
+ .vds-inbox-filter__group {
1025
+ display: inline-flex;
1026
+ align-items: center;
1027
+ gap: var(--space-2);
1028
+ min-width: 0;
1029
+ }
1030
+
1031
+ .vds-inbox-filter__label {
1032
+ font-size: var(--text-xs);
1033
+ font-weight: var(--font-weight-semibold);
1034
+ color: var(--color-text-muted);
1035
+ white-space: nowrap;
1036
+ }
1037
+
1038
+ .vds-inbox-filter__chip {
1039
+ display: inline-flex;
1040
+ align-items: center;
1041
+ gap: var(--space-1_5);
1042
+ padding: var(--space-1_5) var(--space-2_5);
1043
+
1044
+ border-radius: var(--radius-pill);
1045
+ border: 1px solid var(--color-border-subtle);
1046
+ background: var(--color-surface-subtle);
1047
+ color: var(--color-text);
1048
+
1049
+ font-size: var(--text-xs);
1050
+ font-weight: var(--font-weight-semibold);
1051
+ line-height: 1.1;
1052
+ white-space: nowrap;
1053
+ }
1054
+
1055
+ .vds-inbox-filter__chip--active {
1056
+ border-color: var(--color-accent);
1057
+ background: var(--color-accent-soft);
1058
+ }
1059
+
1060
+ .vds-inbox-filter__actions {
1061
+ margin-left: auto;
1062
+ display: inline-flex;
1063
+ align-items: center;
1064
+ gap: var(--space-2);
1065
+ }
1066
+
1067
+ /* ---------------------------------------------------------
1068
+ 11. BOTTOM CORNER ACTION BAR (one/two buttons)
1069
+ --------------------------------------------------------- */
1070
+
1071
+ .vds-inbox-cornerbar {
1072
+ position: fixed;
1073
+ top: auto;
1074
+ right: var(--space-6);
1075
+ bottom: var(--space-6);
1076
+ left: auto;
1077
+ z-index: 40;
1078
+
1079
+ display: inline-flex;
1080
+ align-items: center;
1081
+ gap: var(--space-2);
1082
+
1083
+ pointer-events: none; /* buttons re-enable */
1084
+ }
1085
+
1086
+ .vds-inbox-cornerbar--left {
1087
+ top: auto;
1088
+ right: auto;
1089
+ bottom: var(--space-6);
1090
+ left: var(--space-6);
1091
+ }
1092
+
1093
+ .vds-inbox-cornerbar__inner {
1094
+ pointer-events: auto;
1095
+ display: inline-flex;
1096
+ align-items: center;
1097
+ gap: var(--space-2);
1098
+
1099
+ padding: var(--space-2);
1100
+ border-radius: var(--radius-xl, var(--radius-lg));
1101
+ border: 1px solid var(--color-border-subtle);
1102
+ background: var(--color-surface);
1103
+ box-shadow: none;
1104
+ box-shadow: var(--shadow-md, none);
1105
+ }
1106
+
1107
+ /* ---------------------------------------------------------
1108
+ 12. RESPONSIVE
1109
+ --------------------------------------------------------- */
1110
+
1111
+ @media (max-width: 768px) {
1112
+ .vds-inbox-row__inner {
1113
+ grid-template-columns: 1fr;
1114
+ gap: var(--space-3);
1115
+ }
1116
+
1117
+ /* Actions move below by default */
1118
+ .vds-inbox-row__actions {
1119
+ justify-content: flex-start;
1120
+ padding-top: 0;
1121
+ }
1122
+
1123
+ /* Title wraps; labels become their own row on the left */
1124
+ .vds-inbox-row__titleline {
1125
+ flex-wrap: wrap;
1126
+ row-gap: var(--space-1_5);
1127
+ }
1128
+
1129
+ .vds-inbox-row__title {
1130
+ white-space: normal;
1131
+ overflow: visible;
1132
+ text-overflow: clip;
1133
+ flex-basis: 100%;
1134
+ }
1135
+
1136
+ .vds-inbox-row__labels {
1137
+ flex-basis: 100%;
1138
+ justify-content: flex-start;
1139
+ }
1140
+
1141
+ /* Nav bar: stack into multiple rows */
1142
+ .vds-inbox-nav__bar {
1143
+ flex-wrap: wrap;
1144
+ justify-content: center;
1145
+ gap: var(--space-3);
1146
+ }
1147
+
1148
+ .vds-inbox-tabs {
1149
+ order: 1;
1150
+ width: 100%;
1151
+ justify-content: center;
1152
+ }
1153
+
1154
+ .vds-inbox-nav__left {
1155
+ order: 0;
1156
+ }
1157
+
1158
+ .vds-inbox-nav__right {
1159
+ order: 2;
1160
+ }
1161
+
1162
+ .vds-inbox-nav__bottom {
1163
+ flex-direction: column;
1164
+ align-items: stretch;
1165
+ }
1166
+
1167
+ .vds-inbox-nav__bottom-left,
1168
+ .vds-inbox-nav__bottom-right {
1169
+ justify-content: flex-start;
1170
+ }
1171
+
1172
+ /* Search: expand wider on small screens */
1173
+ .vds-inbox-search.is-open .vds-inbox-search__field,
1174
+ .vds-inbox-search__toggle[aria-expanded="true"] + .vds-inbox-search__field {
1175
+ width: min(100%, 40rem);
1176
+ }
1177
+ }
1178
+
1179
+ /* ---------------------------------------------------------
1180
+ 13. RESPONSIVE VISIBILITY HELPERS (COMPONENT-LOCAL)
1181
+ (useful for hiding icons/actions/labels by breakpoint)
1182
+ --------------------------------------------------------- */
1183
+
1184
+ @media (max-width: 768px) {
1185
+ .vds-inbox__hide-sm {
1186
+ display: none !important;
1187
+ }
1188
+ }
1189
+
1190
+ @media (min-width: 769px) {
1191
+ .vds-inbox__show-sm {
1192
+ display: none !important;
1193
+ }
1194
+ }
1195
+
1196
+ @media (max-width: 1024px) {
1197
+ .vds-inbox__hide-md {
1198
+ display: none !important;
1199
+ }
1200
+ }
1201
+
1202
+ @media (min-width: 1025px) {
1203
+ .vds-inbox__show-md {
1204
+ display: none !important;
1205
+ }
1206
+ }
1207
+
1208
+ /* ---------------------------------------------------------
1209
+ 14. SMALL UTILITIES (COMPONENT-LOCAL)
1210
+ --------------------------------------------------------- */
1211
+
1212
+ .vds-inbox__truncate {
1213
+ overflow: hidden;
1214
+ text-overflow: ellipsis;
1215
+ white-space: nowrap;
1216
+ }
1217
+
1218
+ .vds-inbox__sr-only {
1219
+ position: absolute !important;
1220
+ width: 1px !important;
1221
+ height: 1px !important;
1222
+ padding: 0 !important;
1223
+ margin: -1px !important;
1224
+ overflow: hidden !important;
1225
+ clip: rect(0, 0, 0, 0) !important;
1226
+ white-space: nowrap !important;
1227
+ border: 0 !important;
1228
+ }