@24vlh/vds 0.1.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 (65) hide show
  1. package/LICENSE.txt +201 -0
  2. package/README.md +147 -0
  3. package/dist/components/accordion.css +170 -0
  4. package/dist/components/accordion.min.css +1 -0
  5. package/dist/components/authoring.css +332 -0
  6. package/dist/components/authoring.min.css +1 -0
  7. package/dist/components/buttons.css +683 -0
  8. package/dist/components/buttons.min.css +1 -0
  9. package/dist/components/charts.css +502 -0
  10. package/dist/components/charts.min.css +1 -0
  11. package/dist/components/command.css +521 -0
  12. package/dist/components/command.min.css +1 -0
  13. package/dist/components/content-blocks.css +944 -0
  14. package/dist/components/content-blocks.min.css +1 -0
  15. package/dist/components/doc-block.css +782 -0
  16. package/dist/components/doc-block.min.css +1 -0
  17. package/dist/components/feedback.css +657 -0
  18. package/dist/components/feedback.min.css +1 -0
  19. package/dist/components/flows.css +1101 -0
  20. package/dist/components/flows.min.css +1 -0
  21. package/dist/components/forms-advanced.css +462 -0
  22. package/dist/components/forms-advanced.min.css +1 -0
  23. package/dist/components/forms.css +1831 -0
  24. package/dist/components/forms.min.css +1 -0
  25. package/dist/components/header-footer.css +348 -0
  26. package/dist/components/header-footer.min.css +1 -0
  27. package/dist/components/hero.css +498 -0
  28. package/dist/components/hero.min.css +1 -0
  29. package/dist/components/icons.css +937 -0
  30. package/dist/components/icons.min.css +1 -0
  31. package/dist/components/navigation.css +900 -0
  32. package/dist/components/navigation.min.css +1 -0
  33. package/dist/components/overlays.css +498 -0
  34. package/dist/components/overlays.min.css +1 -0
  35. package/dist/components/sections.css +450 -0
  36. package/dist/components/sections.min.css +1 -0
  37. package/dist/components/skeleton.css +385 -0
  38. package/dist/components/skeleton.min.css +1 -0
  39. package/dist/components/tables.css +591 -0
  40. package/dist/components/tables.min.css +1 -0
  41. package/dist/components/tabs.css +307 -0
  42. package/dist/components/tabs.min.css +1 -0
  43. package/dist/components/toasts.css +421 -0
  44. package/dist/components/toasts.min.css +1 -0
  45. package/dist/components/tooltips-popovers.css +447 -0
  46. package/dist/components/tooltips-popovers.min.css +1 -0
  47. package/dist/components/typography.css +250 -0
  48. package/dist/components/typography.min.css +1 -0
  49. package/dist/components/utilities.css +3434 -0
  50. package/dist/components/utilities.min.css +1 -0
  51. package/dist/core.css +866 -0
  52. package/dist/core.min.css +1 -0
  53. package/dist/identity.css +266 -0
  54. package/dist/identity.min.css +1 -0
  55. package/dist/themes/carbon.css +658 -0
  56. package/dist/themes/carbon.min.css +1 -0
  57. package/dist/themes/graphite.css +658 -0
  58. package/dist/themes/graphite.min.css +1 -0
  59. package/dist/themes/navy.css +657 -0
  60. package/dist/themes/navy.min.css +1 -0
  61. package/dist/themes/slate.css +659 -0
  62. package/dist/themes/slate.min.css +1 -0
  63. package/dist/vds.css +20313 -0
  64. package/dist/vds.min.css +1 -0
  65. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ .vds-dock-block,[data-vds-dock-block]{--doc-block-border:var(--color-border-subtle);--doc-block-highlight-border-width:var(--border-width-strong);--doc-block-highlight-pad:var(--space-6)}.doc-block{border-bottom:1px solid var(--color-border-subtle);display:flex;flex-direction:column;gap:var(--space-12);padding-bottom:var(--space-14);padding-top:var(--space-14)}.doc-block:last-child{border-bottom:none}.doc-block--surface{background-color:var(--color-surface-subtle)}.doc-block--elevated,.doc-block--surface{border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);padding:var(--space-12)}.doc-block--elevated{background-color:var(--color-surface);box-shadow:var(--shadow-1)}.doc-block--contrast{background-color:var(--color-bg-soft);border-left:var(--border-width-strong) solid var(--color-accent);border-radius:var(--radius-lg);padding:var(--space-14)}.doc-block__header{display:flex;flex-direction:column;gap:var(--space-3)}.doc-block__title{font-size:var(--text-xl)}.doc-block__subtitle,.doc-block__title{color:var(--color-text);font-weight:var(--font-weight-semibold);margin:0}.doc-block__subtitle{font-size:var(--text-md)}.doc-block__summary{color:var(--color-text-muted);font-size:var(--text-sm);line-height:var(--line-height-normal)}.doc-block__section{display:flex;flex-direction:column;gap:var(--space-3);margin-bottom:var(--space-4);margin-top:var(--space-4)}.doc-block__subsection{display:flex;flex-direction:column;gap:var(--space-2);margin-bottom:var(--space-2);margin-top:var(--space-2)}.doc-block__subsection--compact{gap:var(--space-1);margin-bottom:var(--space-1_5);margin-top:var(--space-1_5)}.doc-block__description{color:var(--color-text-muted);font-size:var(--text-sm);line-height:var(--line-height-normal);margin:0}.doc-block__body{display:flex;flex-direction:column;gap:var(--space-6)}.doc-block__body--tight{gap:var(--space-3)}.doc-block__body--compact{gap:var(--space-2)}.doc-block__preview{background-color:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);padding:var(--space-8);position:relative}.doc-block__preview .card__body{align-items:flex-start;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--space-3)}.doc-block__preview--transparent{background-color:transparent}.doc-block__preview--inline{align-items:center;display:inline-flex;gap:var(--space-4);padding:var(--space-4)}.doc-block__preview code:not(pre code){background:var(--code-inline-bg);border:1px solid var(--code-inline-border);border-radius:var(--radius-sm);color:var(--color-text);font-size:var(--text-sm);font-weight:500;padding:.04em .3em}.doc-block--split{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:1fr 1fr}.doc-block--split-left{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:2fr 1fr}.doc-block--split-right{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:1fr 2fr}@media (max-width:1024px){.doc-block--split,.doc-block--split-left,.doc-block--split-right{grid-template-columns:1fr}}.doc-block__code{-webkit-overflow-scrolling:touch;background:var(--code-block-bg);border:1px solid var(--doc-block-border);border-radius:var(--radius-lg);color:var(--color-text);font-family:var(--font-family-mono),monospace;font-size:var(--text-sm);line-height:var(--line-height-relaxed);overflow-x:auto;overflow-y:visible;padding:var(--space-8);padding-top:calc(var(--space-12) + var(--space-4));position:relative}.doc-block__code code,.doc-block__code pre{background:none;border:none;padding:0}.doc-block__toolbar{align-items:center;display:flex;justify-content:space-between;left:0;padding-left:var(--space-4);padding-right:var(--space-4);pointer-events:none;position:absolute;right:0;top:var(--space-2)}.doc-block__lang{background-color:var(--color-surface-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);color:var(--color-text-muted);font-size:var(--text-xxs);font-weight:600;letter-spacing:.04em;padding:var(--space-1) var(--space-3);pointer-events:auto;text-transform:uppercase}.doc-block__actions{display:flex;gap:var(--space-2);pointer-events:auto}.doc-block__action{background-color:var(--color-surface-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--text-xxs);font-weight:600;line-height:1;padding:var(--space-1) var(--space-3);transition:background-color var(--transition-fast);-webkit-user-select:none;-moz-user-select:none;user-select:none}.doc-block__action:hover{background-color:var(--doc-block-action-hover-bg);border-color:var(--doc-block-action-hover-border);color:var(--doc-block-action-hover-text)}.doc-block__action--active{background-color:var(--color-accent-soft);border-color:var(--color-accent)}.doc-block--collapsed .doc-block__code{max-height:12rem;overflow:hidden}.doc-block--collapsed .doc-block__code:after{background:linear-gradient(to bottom,transparent 0,transparent 60%,var(--code-block-bg) 100%);bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.doc-block__meta{color:var(--color-text-muted);font-size:var(--text-xs);margin-top:var(--space-3)}.doc-block__note--danger{color:var(--color-danger-strong)}.doc-block__note--warning{color:var(--color-warning-strong)}.doc-block__note--info{color:var(--color-info-strong)}@media (max-width:768px){.doc-block{gap:var(--space-10);padding-bottom:var(--space-12);padding-top:var(--space-12)}.doc-block__title{font-size:var(--text-lg)}.doc-block__code,.doc-block__preview{padding:var(--space-6)}.doc-block__code{padding-top:calc(var(--space-10) + var(--space-2))}}.doc-block__code .token.keyword{color:var(--code-syntax-keyword)}.doc-block__code .token.string{color:var(--code-syntax-string)}.doc-block__code .token.number{color:var(--code-syntax-number)}.doc-block__code .token.operator{color:var(--code-syntax-operator)}.doc-block__code .token.comment{color:var(--code-syntax-comment);font-style:italic}.doc-block__code .token.constant{color:var(--code-syntax-constant)}.doc-block__code .token.func{color:var(--code-syntax-function)}.doc-block__code .token.var{color:var(--code-syntax-variable)}.doc-block__code--numbered{position:relative}.doc-block__code--numbered code{counter-reset:line;padding-left:calc(var(--space-2) + 2ch)}.doc-block__code--numbered code>*{counter-increment:line;padding-left:var(--space-2);position:relative}.doc-block__code--numbered code>:before{color:var(--color-text-soft,var(--color-text-muted));content:counter(line);font-size:var(--text-xxs,var(--text-xs));left:calc((var(--space-6) + 2ch)*-1);padding-right:var(--space-2);position:absolute;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:calc(var(--space-6) + 2ch)}.doc-block--compact{gap:var(--space-6);padding-bottom:var(--space-8);padding-top:var(--space-8)}.doc-block--compact .doc-block__title{font-size:var(--text-lg)}.doc-block--compact .doc-block__summary{font-size:var(--text-xs)}.doc-block--compact .doc-block__code{font-size:var(--text-xs);line-height:var(--line-height-snug);padding:var(--space-5);padding-top:calc(var(--space-8) + var(--space-2))}.doc-block--diff{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:1fr 1fr}.doc-block--diff-added{background-color:var(--semantic-success-bg)}.doc-block--diff-removed{background-color:var(--semantic-danger-bg)}.doc-block--diff .doc-block__code{border-radius:var(--radius-lg);padding:var(--space-6)}.doc-block--diff-line-add{background-color:var(--semantic-success-bg);border-left:3px solid var(--semantic-success-border)}.doc-block--diff-line-remove{background-color:var(--semantic-danger-bg);border-left:3px solid var(--semantic-danger-border)}@media (max-width:1024px){.doc-block--diff{grid-template-columns:1fr}}.doc-block__code.is-copied{outline:2px solid var(--color-accent);outline-offset:2px;transition:outline var(--transition-fast)}.doc-block__eyebrow{color:var(--color-text-soft);font-size:var(--text-xxs);font-weight:var(--font-weight-semibold);letter-spacing:.05em;margin-bottom:var(--space-2);text-transform:uppercase}.doc-block__pills{display:flex;gap:var(--space-2);margin-top:var(--space-2)}.doc-block__pill{background:var(--color-surface-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-pill);color:var(--color-text-muted);font-size:var(--text-xxs);font-weight:var(--font-weight-semibold);line-height:var(--space-4);padding:0 var(--space-2)}.doc-block__stack-sm{display:flex;flex-direction:column;gap:var(--space-3)}.doc-block__stack-md{display:flex;flex-direction:column;gap:var(--space-6)}.doc-block__stack-lg{display:flex;flex-direction:column;gap:var(--space-10)}.doc-block__columns-2{grid-gap:var(--space-6);display:grid;gap:var(--space-6);grid-template-columns:repeat(2,1fr)}.doc-block__columns-3{grid-gap:var(--space-6);display:grid;gap:var(--space-6);grid-template-columns:repeat(3,1fr)}@media (max-width:1024px){.doc-block__columns-2,.doc-block__columns-3{grid-template-columns:1fr}}.doc-block__steps{counter-reset:step-counter;display:flex;flex-direction:column;gap:var(--space-6)}.doc-block__steps>li{counter-increment:step-counter;list-style:none;padding-left:var(--space-8);position:relative}.doc-block__steps>li:before{align-items:center;background:var(--color-accent-soft);border-radius:var(--radius-full);color:var(--color-on-accent);content:counter(step-counter);display:flex;font-size:var(--text-xs);font-weight:var(--font-weight-semibold);height:var(--space-6);justify-content:center;left:0;position:absolute;top:.1em;width:var(--space-6)}.doc-block__highlight{background:var(--color-surface-subtle);border-left:var(--doc-block-highlight-border-width) solid var(--color-accent);border-radius:var(--radius-md);color:var(--color-text);margin-bottom:var(--space-3);margin-top:var(--space-3);padding:var(--doc-block-highlight-pad)}.doc-block__do-dont{grid-gap:var(--space-6);display:grid;gap:var(--space-6);grid-template-columns:1fr 1fr}.doc-block__do,.doc-block__dont{border:1px solid var(--color-border-subtle);border-radius:var(--radius-lg);padding:var(--space-6)}.doc-block__do{background:var(--semantic-success-bg);border-color:var(--semantic-success-border);color:var(--semantic-success-text)}.doc-block__dont{background:var(--semantic-danger-bg);border-color:var(--semantic-danger-border);color:var(--semantic-danger-text)}@media (max-width:1024px){.doc-block__do-dont{grid-template-columns:1fr}}.doc-block--concept .doc-block__body{gap:var(--space-10)}.doc-block--pattern .doc-block__preview{border-left:var(--border-width-strong) solid var(--color-accent)}.doc-block--api .doc-block__body{gap:var(--space-8)}.doc-block--example{grid-gap:var(--space-12);display:grid;gap:var(--space-12);grid-template-columns:1fr 1fr}@media (max-width:1024px){.doc-block--example{grid-template-columns:1fr}}.doc-block__code--numbered-soft code{counter-reset:line;padding-left:calc(var(--space-2) + 1.5ch)}.doc-block__code--numbered-soft code>*{counter-increment:line;padding-left:var(--space-2);position:relative}.doc-block__code--numbered-soft code>:before{color:var(--color-text-soft);content:counter(line);font-size:var(--text-xxs);left:calc((var(--space-5) + 1.5ch)*-1);padding-right:var(--space-2);position:absolute;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:calc(var(--space-5) + 1.5ch)}.doc-block--expanded .doc-block__code{max-height:none}.doc-block--expanded .doc-block__code:after{display:none}.doc-block__code-toggle{color:var(--color-text-muted);cursor:pointer;font-size:var(--text-xs)}@media (prefers-reduced-motion:reduce){.doc-block__action,.doc-block__code.is-copied{transition:none!important}}
@@ -0,0 +1,657 @@
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Feedback System
3
+ *
4
+ * Responsibilities:
5
+ * - Define the full semantic feedback engine: alerts, banners, toasts,
6
+ * inline form states, status labels, info/result blocks, and progress bars
7
+ * - Provide variant mapping (info/success/warning/danger/error/neutral/accent)
8
+ * via token-driven background, border, and text variables
9
+ * - Support density modes, responsiveness, stacking logic, and animation
10
+ * - Expose structural primitives and containers for feedback across app surfaces
11
+ *
12
+ * System Notes:
13
+ * - Pure CSS; animations (toast enter, striped progress, sheen) are CSS-based
14
+ * - Fully token-driven: colour, spacing, radii, shadows, motion, semantic lanes
15
+ * - Namespaced and internally consistent with VDS interaction & focus systems
16
+ ************************************************************/
17
+
18
+ /* ---------------------------------------------------------
19
+ 1. FEEDBACK TOKEN DEFINITIONS
20
+ --------------------------------------------------------- */
21
+
22
+ [data-vds-feedback],
23
+ .vds-feedback {
24
+ --feedback-padding-sm: var(--space-3);
25
+ --feedback-padding-md: var(--space-4);
26
+ --feedback-padding-lg: var(--space-6);
27
+
28
+ --feedback-gap: var(--space-3);
29
+
30
+ --feedback-info-block-border-width: var(--border-width-strong);
31
+ }
32
+
33
+ /* ---------------------------------------------------------
34
+ 2. SEMANTIC FEEDBACK VARIABLE LAYER
35
+ --------------------------------------------------------- */
36
+
37
+ .feedback[data-variant="info"],
38
+ [data-variant="info"] {
39
+ --feedback-bg: var(--semantic-info-bg-strong, var(--color-info-soft));
40
+ --feedback-border: var(--semantic-info-border-strong, var(--color-info));
41
+ --feedback-text: var(--semantic-info-text-strong, var(--color-info-strong));
42
+ }
43
+
44
+ .feedback[data-variant="success"],
45
+ [data-variant="success"] {
46
+ --feedback-bg: var(--semantic-success-bg-strong, var(--color-success-soft));
47
+ --feedback-border: var(--semantic-success-border-strong, var(--color-success));
48
+ --feedback-text: var(--semantic-success-text-strong, var(--color-success-strong));
49
+ }
50
+
51
+ .feedback[data-variant="warning"],
52
+ [data-variant="warning"] {
53
+ --feedback-bg: var(--semantic-warning-bg-strong, var(--color-warning-soft));
54
+ --feedback-border: var(--semantic-warning-border-strong, var(--color-warning));
55
+ --feedback-text: var(--semantic-warning-text-strong, var(--color-warning-strong));
56
+ }
57
+
58
+ [data-variant="danger"] {
59
+ --feedback-bg: var(--color-danger-soft);
60
+ --feedback-border: var(--color-danger);
61
+ --feedback-text: var(--color-danger-strong);
62
+ }
63
+
64
+ .feedback[data-variant="error"],
65
+ [data-variant="error"] {
66
+ --feedback-bg: var(--semantic-error-bg-strong, var(--color-danger-soft));
67
+ --feedback-border: var(--semantic-error-border-strong, var(--color-danger));
68
+ --feedback-text: var(--semantic-error-text-strong, var(--color-danger-strong));
69
+ }
70
+
71
+ [data-variant="neutral"] {
72
+ --feedback-bg: var(--color-surface-subtle);
73
+ --feedback-border: var(--color-border-subtle);
74
+ --feedback-text: var(--color-text);
75
+ }
76
+
77
+ [data-variant="accent"] {
78
+ --feedback-bg: var(--color-accent-soft);
79
+ --feedback-border: var(--color-accent);
80
+ --feedback-text: var(--color-on-accent);
81
+ }
82
+
83
+ /* ---------------------------------------------------------
84
+ 3. ALERTS
85
+ --------------------------------------------------------- */
86
+
87
+ .alert {
88
+ display: flex;
89
+ align-items: flex-start;
90
+ gap: var(--feedback-gap);
91
+
92
+ padding: var(--feedback-padding-lg);
93
+ border: var(--border-width) solid var(--color-border-subtle);
94
+ border-radius: var(--radius-md);
95
+
96
+ background-color: var(--color-muted-bg);
97
+ color: var(--color-text);
98
+ font-size: var(--text-sm);
99
+ }
100
+
101
+ .alert[data-variant] {
102
+ background-color: var(--feedback-bg) !important;
103
+ border-color: var(--feedback-border) !important;
104
+ color: var(--feedback-text) !important;
105
+ }
106
+
107
+ .alert__icon {
108
+ width: var(--space-5);
109
+ height: var(--space-5);
110
+ flex-shrink: 0;
111
+
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ }
116
+
117
+ .alert__icon > * {
118
+ display: block;
119
+ width: 100%;
120
+ height: 100%;
121
+ }
122
+
123
+ .alert__content {
124
+ display: flex;
125
+ flex-direction: column;
126
+ gap: var(--space-2);
127
+ }
128
+
129
+ .alert__title {
130
+ font-weight: 600;
131
+ font-size: var(--text-sm);
132
+ }
133
+
134
+ .alert__message {
135
+ font-size: var(--text-sm);
136
+ opacity: 0.95;
137
+ }
138
+
139
+ .alert__close {
140
+ margin-left: auto;
141
+ font-size: var(--text-sm);
142
+ cursor: pointer;
143
+ opacity: 0.6;
144
+ }
145
+
146
+ .alert__close:hover {
147
+ opacity: 1;
148
+ }
149
+
150
+ .alert__close:focus-visible {
151
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
152
+ outline-offset: var(--focus-ring-offset);
153
+ }
154
+
155
+ .alert--outline {
156
+ background-color: transparent !important;
157
+ border-color: var(--feedback-border) !important;
158
+ color: var(--feedback-border) !important;
159
+ }
160
+
161
+ /* ---------------------------------------------------------
162
+ 4. BANNERS (SOLID + STICKY + CLOSEABLE)
163
+ --------------------------------------------------------- */
164
+
165
+ .banner {
166
+ width: 100%;
167
+ padding: var(--feedback-padding-md) 0;
168
+
169
+ border-bottom: var(--border-width) solid var(--color-border-subtle);
170
+ background-color: var(--color-surface-subtle);
171
+ color: var(--color-text);
172
+ }
173
+
174
+ .banner[data-variant] {
175
+ background-color: var(--feedback-bg) !important;
176
+ color: var(--feedback-text) !important;
177
+ border-color: var(--feedback-border) !important;
178
+ }
179
+
180
+ .banner__inner {
181
+ max-width: var(--layout-max-width);
182
+ margin: 0 auto;
183
+ padding: 0 var(--space-6);
184
+
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: space-between;
188
+ gap: var(--feedback-gap);
189
+ }
190
+
191
+ .banner__text {
192
+ font-size: var(--text-sm);
193
+ }
194
+
195
+ .banner__close {
196
+ font-size: var(--text-sm);
197
+ cursor: pointer;
198
+ opacity: 0.6;
199
+ }
200
+
201
+ .banner__close:hover {
202
+ opacity: 1;
203
+ }
204
+
205
+ .banner__close:focus-visible {
206
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
207
+ outline-offset: var(--focus-ring-offset);
208
+ }
209
+
210
+ .banner--sticky {
211
+ position: sticky;
212
+ top: 0;
213
+ z-index: var(--z-sticky);
214
+ }
215
+
216
+ /* ---------------------------------------------------------
217
+ 5. TOASTS (ANIMATED + STACK)
218
+ --------------------------------------------------------- */
219
+
220
+ .feedback-toast {
221
+ display: flex;
222
+ align-items: center;
223
+ gap: var(--feedback-gap);
224
+
225
+ padding: var(--feedback-padding-md) var(--feedback-padding-lg);
226
+
227
+ border-radius: var(--radius-md);
228
+ background-color: var(--color-surface);
229
+ border: var(--border-width) solid var(--color-border-subtle);
230
+ box-shadow: var(--shadow-2);
231
+
232
+ font-size: var(--text-sm);
233
+
234
+ opacity: 0;
235
+ transform: translateY(6px);
236
+ animation: toast-enter var(--transition-normal) forwards;
237
+ }
238
+
239
+ .feedback-toast[data-variant] {
240
+ background-color: var(--feedback-bg) !important;
241
+ border-color: var(--feedback-border) !important;
242
+ color: var(--feedback-text) !important;
243
+ }
244
+
245
+ .feedback-toast__icon {
246
+ flex-shrink: 0;
247
+ width: var(--space-5);
248
+ height: var(--space-5);
249
+ display: inline-block;
250
+ stroke: currentColor;
251
+ fill: none;
252
+ }
253
+
254
+ .feedback-toast__text {
255
+ flex: 1 1 auto;
256
+ min-width: 0;
257
+ }
258
+
259
+ .feedback-toast__close {
260
+ position: absolute;
261
+ top: var(--space-1);
262
+ right: var(--space-1);
263
+
264
+ width: var(--space-5);
265
+ height: var(--space-5);
266
+
267
+ cursor: pointer;
268
+ opacity: 0.6;
269
+ flex-shrink: 0;
270
+ }
271
+
272
+ .feedback-toast__close:hover {
273
+ opacity: 1;
274
+ }
275
+
276
+ .feedback-toast__close:focus-visible {
277
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
278
+ outline-offset: var(--focus-ring-offset);
279
+ }
280
+
281
+ .feedback-toast__close::before {
282
+ content: "×";
283
+ position: absolute;
284
+ top: 0;
285
+ right: 0;
286
+ bottom: 0;
287
+ left: 0;
288
+
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+
293
+ font-size: var(--text-md);
294
+ line-height: 1;
295
+ color: currentColor;
296
+ }
297
+
298
+ .feedback-toast-stack {
299
+ position: fixed;
300
+ top: var(--space-8);
301
+ right: var(--space-8);
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: var(--space-4);
305
+ z-index: var(--z-toast);
306
+ }
307
+
308
+ .feedback-toast-stack.is-top-right {
309
+ top: var(--space-8);
310
+ right: var(--space-8);
311
+ bottom: auto;
312
+ left: auto;
313
+ }
314
+
315
+ .feedback-toast-stack.is-top-left {
316
+ top: var(--space-8);
317
+ left: var(--space-8);
318
+ bottom: auto;
319
+ right: auto;
320
+ }
321
+
322
+ .feedback-toast-stack.is-bottom-right {
323
+ bottom: var(--space-8);
324
+ right: var(--space-8);
325
+ top: auto;
326
+ left: auto;
327
+ }
328
+
329
+ .feedback-toast-stack.is-bottom-left {
330
+ bottom: var(--space-8);
331
+ left: var(--space-8);
332
+ top: auto;
333
+ right: auto;
334
+ }
335
+
336
+ @keyframes toast-enter {
337
+ from {
338
+ opacity: 0;
339
+ transform: translateY(6px);
340
+ }
341
+ to {
342
+ opacity: 1;
343
+ transform: translateY(0);
344
+ }
345
+ }
346
+
347
+ /* ---------------------------------------------------------
348
+ 6. INLINE FORM FEEDBACK
349
+ --------------------------------------------------------- */
350
+
351
+ .form-feedback {
352
+ display: flex;
353
+ align-items: center;
354
+ gap: var(--space-2);
355
+
356
+ font-size: var(--text-xs);
357
+ color: var(--color-text-muted);
358
+ }
359
+
360
+ .form-feedback--error {
361
+ color: var(--color-error);
362
+ }
363
+
364
+ .form-feedback--warning {
365
+ color: var(--color-warning);
366
+ }
367
+
368
+ .form-feedback--success {
369
+ color: var(--color-success);
370
+ }
371
+
372
+ .form-feedback--info {
373
+ color: var(--color-info);
374
+ }
375
+
376
+ .input-feedback--error {
377
+ border-color: var(--color-error) !important;
378
+ }
379
+
380
+ .input-feedback--warning {
381
+ border-color: var(--color-warning) !important;
382
+ }
383
+
384
+ .input-feedback--success {
385
+ border-color: var(--color-success) !important;
386
+ }
387
+
388
+ .input-feedback--info {
389
+ border-color: var(--color-info) !important;
390
+ }
391
+
392
+ /* ---------------------------------------------------------
393
+ 7. STATUS LABELS (SOLID + OUTLINE + DOT MODE)
394
+ --------------------------------------------------------- */
395
+
396
+ .status {
397
+ display: inline-flex;
398
+ align-items: center;
399
+ gap: var(--space-1);
400
+
401
+ padding: var(--space-1) var(--space-3);
402
+ font-size: var(--text-xs);
403
+
404
+ border-radius: 999px;
405
+ white-space: nowrap;
406
+
407
+ background-color: var(--color-muted-bg);
408
+ color: var(--color-text);
409
+
410
+ align-self: flex-start;
411
+ width: -moz-max-content;
412
+ width: max-content;
413
+ }
414
+
415
+ .status[data-variant] {
416
+ background-color: var(--feedback-bg) !important;
417
+ color: var(--feedback-text) !important;
418
+ }
419
+
420
+ .status--outline {
421
+ background-color: transparent !important;
422
+ border: var(--border-width) solid var(--feedback-border) !important;
423
+ color: var(--feedback-border) !important;
424
+ }
425
+
426
+ .status--dot::before {
427
+ content: "";
428
+ width: var(--space-2);
429
+ height: var(--space-2);
430
+ border-radius: 999px;
431
+ background-color: var(--feedback-border);
432
+ }
433
+
434
+ /* ---------------------------------------------------------
435
+ 8. PROGRESS (SOLID + STRIPED + ANIMATED)
436
+ --------------------------------------------------------- */
437
+
438
+ .progress {
439
+ width: 100%;
440
+ height: var(--space-2);
441
+ background-color: var(--color-muted-bg);
442
+ border-radius: var(--radius-sm);
443
+ overflow: hidden;
444
+ }
445
+
446
+ .progress__bar {
447
+ height: 100%;
448
+ width: 0;
449
+ background-color: var(--color-accent);
450
+ transition: width var(--transition-normal);
451
+ }
452
+
453
+ .progress--striped .progress__bar {
454
+ background-image: linear-gradient(
455
+ 45deg,
456
+ var(--color-accent-soft) 25%,
457
+ var(--color-accent) 25%,
458
+ var(--color-accent) 50%,
459
+ var(--color-accent-soft) 50%,
460
+ var(--color-accent-soft) 75%,
461
+ var(--color-accent) 75%,
462
+ var(--color-accent)
463
+ );
464
+ background-size: 16px 16px;
465
+ }
466
+
467
+ .progress--striped.progress--striped__relaxed .progress__bar {
468
+ background-size: 24px 24px;
469
+ }
470
+
471
+ .progress--animated.progress--striped .progress__bar {
472
+ animation: progress-stripes 0.3s linear infinite;
473
+ will-change: background-position;
474
+ }
475
+
476
+ .progress--animated.progress--striped__relaxed .progress__bar {
477
+ animation: progress-stripes-relaxed 0.3s linear infinite;
478
+ will-change: background-position;
479
+ }
480
+
481
+ @keyframes progress-stripes {
482
+ 0% {
483
+ background-position: 0 0;
484
+ }
485
+ 100% {
486
+ background-position: 16px 0;
487
+ }
488
+ }
489
+
490
+ @keyframes progress-stripes-relaxed {
491
+ 0% {
492
+ background-position: 0 0;
493
+ }
494
+ 100% {
495
+ background-position: 24px 0;
496
+ }
497
+ }
498
+
499
+ .progress--animated:not(.progress--striped) .progress__bar {
500
+ position: relative;
501
+ overflow: hidden;
502
+ }
503
+
504
+ .progress--animated:not(.progress--striped) .progress__bar::after {
505
+ content: "";
506
+ position: absolute;
507
+ top: 0;
508
+ left: -40%;
509
+ width: 40%;
510
+ height: 100%;
511
+ background: linear-gradient(
512
+ 90deg,
513
+ rgba(255, 255, 255, 0) 0%,
514
+ rgba(255, 255, 255, 0.4) 50%,
515
+ rgba(255, 255, 255, 0) 100%
516
+ );
517
+ animation: progress-sheen 1.2s linear infinite;
518
+ pointer-events: none;
519
+ }
520
+
521
+ @keyframes progress-sheen {
522
+ from {
523
+ transform: translateX(0);
524
+ }
525
+ to {
526
+ transform: translateX(250%);
527
+ }
528
+ }
529
+
530
+ /* ---------------------------------------------------------
531
+ 9. INFO BLOCK (SEMANTIC SUPPORT)
532
+ --------------------------------------------------------- */
533
+
534
+ .info-block {
535
+ padding: var(--feedback-padding-md) var(--feedback-padding-lg);
536
+ border-left: var(--feedback-info-block-border-width) solid var(--color-accent);
537
+ border-radius: var(--radius-sm);
538
+ font-size: var(--text-sm);
539
+
540
+ background-color: var(--color-surface-subtle);
541
+ color: var(--color-text);
542
+ }
543
+
544
+ .info-block[data-variant] {
545
+ background-color: var(--feedback-bg) !important;
546
+ border-color: var(--feedback-border) !important;
547
+ color: var(--feedback-text) !important;
548
+ }
549
+
550
+ /* ---------------------------------------------------------
551
+ 10. RESULT BLOCK (SEMANTIC SUPPORT)
552
+ --------------------------------------------------------- */
553
+
554
+ .result {
555
+ padding: var(--feedback-padding-lg);
556
+ border-radius: var(--radius-md);
557
+ border: var(--border-width) solid var(--color-border-subtle);
558
+ text-align: center;
559
+
560
+ background-color: var(--color-surface);
561
+ }
562
+
563
+ .result__icon {
564
+ width: var(--space-12);
565
+ height: var(--space-12);
566
+ margin: 0 auto var(--space-4);
567
+ stroke: currentColor;
568
+ fill: none;
569
+ }
570
+
571
+ .result__title {
572
+ font-size: var(--text-xl);
573
+ font-weight: 600;
574
+ }
575
+
576
+ .result__subtitle {
577
+ font-size: var(--text-sm);
578
+ color: var(--color-text-muted);
579
+ margin-top: var(--space-2);
580
+ }
581
+
582
+ .result__actions {
583
+ margin-top: var(--space-6);
584
+ display: flex;
585
+ justify-content: center;
586
+ gap: var(--space-4);
587
+ }
588
+
589
+ .result[data-variant] {
590
+ border-color: var(--feedback-border) !important;
591
+ color: var(--feedback-text) !important;
592
+ }
593
+
594
+ /* ---------------------------------------------------------
595
+ 11. DENSITY MODES
596
+ --------------------------------------------------------- */
597
+
598
+ [data-density="compact"] .alert,
599
+ [data-density="compact"] .feedback-toast,
600
+ [data-density="compact"] .banner,
601
+ [data-density="compact"] .result,
602
+ [data-density="compact"] .info-block {
603
+ padding: var(--feedback-padding-md) !important;
604
+ }
605
+
606
+ [data-density="compact"] .status {
607
+ padding: 0 var(--space-2);
608
+ }
609
+
610
+ [data-density="compact"] .progress {
611
+ height: var(--space-1);
612
+ }
613
+
614
+ [data-density="compact"] .form-feedback {
615
+ gap: var(--space-1);
616
+ }
617
+
618
+ /* ---------------------------------------------------------
619
+ 12. RESPONSIVE TIGHTENING
620
+ --------------------------------------------------------- */
621
+
622
+ @media (max-width: 640px) {
623
+ .alert,
624
+ .feedback-toast,
625
+ .banner,
626
+ .result,
627
+ .info-block {
628
+ padding: var(--feedback-padding-md);
629
+ }
630
+
631
+ .feedback-toast-stack {
632
+ right: var(--space-4);
633
+ top: var(--space-4);
634
+ }
635
+ }
636
+
637
+ /* ---------------------------------------------------------
638
+ 13. STATIC TOAST (Documentation / In-Flow Demo Only)
639
+ Does not float to viewport. Does not autohide.
640
+ --------------------------------------------------------- */
641
+
642
+ .feedback-toast--static {
643
+ position: relative !important;
644
+ transform: none !important;
645
+ top: auto !important;
646
+ right: auto !important;
647
+ bottom: auto !important;
648
+ left: auto !important;
649
+ opacity: 1 !important;
650
+ animation: none !important;
651
+ }
652
+
653
+ .feedback-toast--static {
654
+ width: -moz-max-content;
655
+ width: max-content;
656
+ max-width: 100%;
657
+ }
@@ -0,0 +1 @@
1
+ .vds-feedback,[data-vds-feedback]{--feedback-padding-sm:var(--space-3);--feedback-padding-md:var(--space-4);--feedback-padding-lg:var(--space-6);--feedback-gap:var(--space-3);--feedback-info-block-border-width:var(--border-width-strong)}.feedback[data-variant=info],[data-variant=info]{--feedback-bg:var(--semantic-info-bg-strong,var(--color-info-soft));--feedback-border:var(--semantic-info-border-strong,var(--color-info));--feedback-text:var(--semantic-info-text-strong,var(--color-info-strong))}.feedback[data-variant=success],[data-variant=success]{--feedback-bg:var(--semantic-success-bg-strong,var(--color-success-soft));--feedback-border:var(--semantic-success-border-strong,var(--color-success));--feedback-text:var(--semantic-success-text-strong,var(--color-success-strong))}.feedback[data-variant=warning],[data-variant=warning]{--feedback-bg:var(--semantic-warning-bg-strong,var(--color-warning-soft));--feedback-border:var(--semantic-warning-border-strong,var(--color-warning));--feedback-text:var(--semantic-warning-text-strong,var(--color-warning-strong))}[data-variant=danger]{--feedback-bg:var(--color-danger-soft);--feedback-border:var(--color-danger);--feedback-text:var(--color-danger-strong)}.feedback[data-variant=error],[data-variant=error]{--feedback-bg:var(--semantic-error-bg-strong,var(--color-danger-soft));--feedback-border:var(--semantic-error-border-strong,var(--color-danger));--feedback-text:var(--semantic-error-text-strong,var(--color-danger-strong))}[data-variant=neutral]{--feedback-bg:var(--color-surface-subtle);--feedback-border:var(--color-border-subtle);--feedback-text:var(--color-text)}[data-variant=accent]{--feedback-bg:var(--color-accent-soft);--feedback-border:var(--color-accent);--feedback-text:var(--color-on-accent)}.alert{align-items:flex-start;background-color:var(--color-muted-bg);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text);display:flex;font-size:var(--text-sm);gap:var(--feedback-gap);padding:var(--feedback-padding-lg)}.alert[data-variant]{background-color:var(--feedback-bg)!important;border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}.alert__icon{align-items:center;display:flex;flex-shrink:0;height:var(--space-5);justify-content:center;width:var(--space-5)}.alert__icon>*{display:block;height:100%;width:100%}.alert__content{display:flex;flex-direction:column;gap:var(--space-2)}.alert__title{font-size:var(--text-sm);font-weight:600}.alert__message{font-size:var(--text-sm);opacity:.95}.alert__close{cursor:pointer;font-size:var(--text-sm);margin-left:auto;opacity:.6}.alert__close:hover{opacity:1}.alert__close:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.alert--outline{background-color:transparent!important;border-color:var(--feedback-border)!important;color:var(--feedback-border)!important}.banner{background-color:var(--color-surface-subtle);border-bottom:var(--border-width) solid var(--color-border-subtle);color:var(--color-text);padding:var(--feedback-padding-md) 0;width:100%}.banner[data-variant]{background-color:var(--feedback-bg)!important;border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}.banner__inner{align-items:center;display:flex;gap:var(--feedback-gap);justify-content:space-between;margin:0 auto;max-width:var(--layout-max-width);padding:0 var(--space-6)}.banner__close,.banner__text{font-size:var(--text-sm)}.banner__close{cursor:pointer;opacity:.6}.banner__close:hover{opacity:1}.banner__close:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.banner--sticky{position:sticky;top:0;z-index:var(--z-sticky)}.feedback-toast{align-items:center;animation:toast-enter var(--transition-normal) forwards;background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-2);display:flex;font-size:var(--text-sm);gap:var(--feedback-gap);opacity:0;padding:var(--feedback-padding-md) var(--feedback-padding-lg);transform:translateY(6px)}.feedback-toast[data-variant]{background-color:var(--feedback-bg)!important;border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}.feedback-toast__icon{stroke:currentColor;fill:none;display:inline-block;flex-shrink:0;height:var(--space-5);width:var(--space-5)}.feedback-toast__text{flex:1 1 auto;min-width:0}.feedback-toast__close{cursor:pointer;flex-shrink:0;height:var(--space-5);opacity:.6;position:absolute;right:var(--space-1);top:var(--space-1);width:var(--space-5)}.feedback-toast__close:hover{opacity:1}.feedback-toast__close:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.feedback-toast__close:before{align-items:center;bottom:0;color:currentColor;content:"×";display:flex;font-size:var(--text-md);justify-content:center;left:0;line-height:1;position:absolute;right:0;top:0}.feedback-toast-stack{display:flex;flex-direction:column;gap:var(--space-4);position:fixed;right:var(--space-8);top:var(--space-8);z-index:var(--z-toast)}.feedback-toast-stack.is-top-right{bottom:auto;left:auto;right:var(--space-8);top:var(--space-8)}.feedback-toast-stack.is-top-left{bottom:auto;left:var(--space-8);right:auto;top:var(--space-8)}.feedback-toast-stack.is-bottom-right{bottom:var(--space-8);left:auto;right:var(--space-8);top:auto}.feedback-toast-stack.is-bottom-left{bottom:var(--space-8);left:var(--space-8);right:auto;top:auto}@keyframes toast-enter{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.form-feedback{align-items:center;color:var(--color-text-muted);display:flex;font-size:var(--text-xs);gap:var(--space-2)}.form-feedback--error{color:var(--color-error)}.form-feedback--warning{color:var(--color-warning)}.form-feedback--success{color:var(--color-success)}.form-feedback--info{color:var(--color-info)}.input-feedback--error{border-color:var(--color-error)!important}.input-feedback--warning{border-color:var(--color-warning)!important}.input-feedback--success{border-color:var(--color-success)!important}.input-feedback--info{border-color:var(--color-info)!important}.status{align-items:center;align-self:flex-start;background-color:var(--color-muted-bg);border-radius:999px;color:var(--color-text);display:inline-flex;font-size:var(--text-xs);gap:var(--space-1);padding:var(--space-1) var(--space-3);white-space:nowrap;width:-moz-max-content;width:max-content}.status[data-variant]{background-color:var(--feedback-bg)!important;color:var(--feedback-text)!important}.status--outline{background-color:transparent!important;border:var(--border-width) solid var(--feedback-border)!important;color:var(--feedback-border)!important}.status--dot:before{background-color:var(--feedback-border);border-radius:999px;content:"";height:var(--space-2);width:var(--space-2)}.progress{background-color:var(--color-muted-bg);border-radius:var(--radius-sm);height:var(--space-2);overflow:hidden;width:100%}.progress__bar{background-color:var(--color-accent);height:100%;transition:width var(--transition-normal);width:0}.progress--striped .progress__bar{background-image:linear-gradient(45deg,var(--color-accent-soft) 25%,var(--color-accent) 25%,var(--color-accent) 50%,var(--color-accent-soft) 50%,var(--color-accent-soft) 75%,var(--color-accent) 75%,var(--color-accent));background-size:16px 16px}.progress--striped.progress--striped__relaxed .progress__bar{background-size:24px 24px}.progress--animated.progress--striped .progress__bar{animation:progress-stripes .3s linear infinite;will-change:background-position}.progress--animated.progress--striped__relaxed .progress__bar{animation:progress-stripes-relaxed .3s linear infinite;will-change:background-position}@keyframes progress-stripes{0%{background-position:0 0}to{background-position:16px 0}}@keyframes progress-stripes-relaxed{0%{background-position:0 0}to{background-position:24px 0}}.progress--animated:not(.progress--striped) .progress__bar{overflow:hidden;position:relative}.progress--animated:not(.progress--striped) .progress__bar:after{animation:progress-sheen 1.2s linear infinite;background:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.4) 50%,hsla(0,0%,100%,0));content:"";height:100%;left:-40%;pointer-events:none;position:absolute;top:0;width:40%}@keyframes progress-sheen{0%{transform:translateX(0)}to{transform:translateX(250%)}}.info-block{background-color:var(--color-surface-subtle);border-left:var(--feedback-info-block-border-width) solid var(--color-accent);border-radius:var(--radius-sm);color:var(--color-text);font-size:var(--text-sm);padding:var(--feedback-padding-md) var(--feedback-padding-lg)}.info-block[data-variant]{background-color:var(--feedback-bg)!important;border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}.result{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--feedback-padding-lg);text-align:center}.result__icon{stroke:currentColor;fill:none;height:var(--space-12);margin:0 auto var(--space-4);width:var(--space-12)}.result__title{font-size:var(--text-xl);font-weight:600}.result__subtitle{color:var(--color-text-muted);font-size:var(--text-sm);margin-top:var(--space-2)}.result__actions{display:flex;gap:var(--space-4);justify-content:center;margin-top:var(--space-6)}.result[data-variant]{border-color:var(--feedback-border)!important;color:var(--feedback-text)!important}[data-density=compact] .alert,[data-density=compact] .banner,[data-density=compact] .feedback-toast,[data-density=compact] .info-block,[data-density=compact] .result{padding:var(--feedback-padding-md)!important}[data-density=compact] .status{padding:0 var(--space-2)}[data-density=compact] .progress{height:var(--space-1)}[data-density=compact] .form-feedback{gap:var(--space-1)}@media (max-width:640px){.alert,.banner,.feedback-toast,.info-block,.result{padding:var(--feedback-padding-md)}.feedback-toast-stack{right:var(--space-4);top:var(--space-4)}}.feedback-toast--static{animation:none!important;bottom:auto!important;left:auto!important;max-width:100%;opacity:1!important;position:relative!important;right:auto!important;top:auto!important;transform:none!important;width:-moz-max-content;width:max-content}