@birdapi/velinstyle 1.2.1 → 1.3.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 (156) hide show
  1. package/README.de.md +148 -11
  2. package/README.md +174 -16
  3. package/cli/__fixtures__/atelier-library/showcases/01-login/app.css +1 -0
  4. package/cli/__fixtures__/atelier-library/showcases/01-login/app.js +2 -0
  5. package/cli/__fixtures__/atelier-library/showcases/01-login/index.html +5 -0
  6. package/cli/__fixtures__/atelier-library/showcases/04-pricing/app.css +1 -0
  7. package/cli/__fixtures__/atelier-library/showcases/04-pricing/app.js +2 -0
  8. package/cli/__fixtures__/atelier-library/showcases/04-pricing/index.html +5 -0
  9. package/cli/__fixtures__/atelier-library/showcases/36-calendar/app.css +1 -0
  10. package/cli/__fixtures__/atelier-library/showcases/36-calendar/app.js +2 -0
  11. package/cli/__fixtures__/atelier-library/showcases/36-calendar/index.html +5 -0
  12. package/cli/atelier-catalog.json +1267 -0
  13. package/cli/atelier-formats.js +159 -0
  14. package/cli/atelier.js +382 -0
  15. package/cli/blueprints/empty-state.html +3 -5
  16. package/cli/cli-manifest.json +441 -161
  17. package/cli/docgen/extract-cli.js +2 -1
  18. package/cli/docs-generate.js +9 -0
  19. package/cli/experience.js +173 -0
  20. package/cli/index.js +1384 -361
  21. package/cli/motion.js +738 -0
  22. package/cli/production/component-graph.json +166 -0
  23. package/cli/production/explain.js +52 -0
  24. package/cli/production/extract.js +278 -0
  25. package/cli/production/graph.js +102 -0
  26. package/cli/production/report.js +168 -0
  27. package/cli/production/run.js +355 -0
  28. package/cli/production/trim-css.js +177 -0
  29. package/cli/production/trim-fonts.js +23 -0
  30. package/cli/production/trim-icons.js +38 -0
  31. package/cli/production/trim-js.js +48 -0
  32. package/cli/production/trim-motion.js +22 -0
  33. package/cli/production/trim-themes.js +50 -0
  34. package/cli/production/watch.js +38 -0
  35. package/cli/review.js +48 -1
  36. package/cli/scripts/write-atelier-fixtures.mjs +33 -0
  37. package/cli/security.js +190 -0
  38. package/cli/skills.js +53 -10
  39. package/cli/transparency.js +140 -41
  40. package/cli/workflow.js +32 -17
  41. package/components/index.js +3 -0
  42. package/components/runtime/component-loaders.js +3 -0
  43. package/components/velin-drawer.js +43 -4
  44. package/components/velin-empty-state.js +83 -0
  45. package/components/velin-modal.js +76 -15
  46. package/components/velin-otp-input.js +220 -0
  47. package/components/velin-password-strength.js +147 -0
  48. package/components/velin-sheet.js +49 -4
  49. package/components/velin-theme-toggle.js +15 -1
  50. package/core/a11y/component-contracts.json +391 -255
  51. package/core/attributes/registry.js +1 -1
  52. package/core/meta/knowledge/components.json +75 -3
  53. package/core/motion/analyze.js +38 -0
  54. package/core/motion/blueprint.js +51 -0
  55. package/core/motion/composer.js +114 -0
  56. package/core/motion/data/registry.json +352 -0
  57. package/core/motion/effects.js +17 -1
  58. package/core/motion/index.js +112 -9
  59. package/core/motion/optimize.js +44 -0
  60. package/core/motion/policy.js +77 -0
  61. package/core/motion/registry.js +131 -0
  62. package/core/motion/review.js +59 -0
  63. package/core/motion/scan.js +150 -0
  64. package/core/motion/timeline.js +68 -0
  65. package/core/motion/transitions.js +49 -0
  66. package/core/motion/triggers.js +168 -0
  67. package/core/security/checks/fs.js +92 -0
  68. package/core/security/detect.js +35 -0
  69. package/core/security/engine.js +116 -0
  70. package/core/security/index.js +18 -0
  71. package/core/security/registry.js +85 -0
  72. package/core/security/report/report.js +113 -0
  73. package/core/security/rules/ci/index.js +146 -0
  74. package/core/security/rules/consumer/index.js +174 -0
  75. package/core/security/rules/deps/index.js +182 -0
  76. package/core/security/rules/index.js +24 -0
  77. package/core/security/rules/publish/index.js +230 -0
  78. package/core/security/rules/repo/index.js +143 -0
  79. package/core/security/rules/secrets/index.js +133 -0
  80. package/core/security/score/dependency-health.js +53 -0
  81. package/core/security/score/release-health.js +66 -0
  82. package/core/security/score/score.js +102 -0
  83. package/core/security/timeline/timeline.js +76 -0
  84. package/dist/chunks/attributes-2ORR27KA.js +404 -0
  85. package/dist/chunks/attributes-HK7VIOLA.js +1080 -0
  86. package/dist/chunks/attributes-VRHHVNDO.js +1080 -0
  87. package/dist/chunks/chunk-MYKUI364.js +116 -0
  88. package/dist/chunks/chunk-NEVBPD5T.js +116 -0
  89. package/dist/chunks/chunk-Y6HN7HWX.js +116 -0
  90. package/dist/chunks/runtime-entry.js +1 -1
  91. package/dist/chunks/velin-drawer-A7Q7EBOS.js +162 -0
  92. package/dist/chunks/velin-empty-state-3NTUH2RF.js +81 -0
  93. package/dist/chunks/velin-modal-3MV4FYBK.js +231 -0
  94. package/dist/chunks/velin-otp-input-PSK42MM6.js +207 -0
  95. package/dist/chunks/velin-password-strength-TAXMLSED.js +136 -0
  96. package/dist/chunks/velin-sheet-N2VVYXFP.js +157 -0
  97. package/dist/chunks/velin-theme-toggle-J2NHC7IM.js +304 -0
  98. package/dist/llms.txt +4 -4
  99. package/dist/search-index.json +232 -5
  100. package/dist/velin-agent.json +433 -46
  101. package/dist/velinstyle-components.iife.js +3695 -2272
  102. package/dist/velinstyle-components.js +3698 -2271
  103. package/dist/velinstyle-components.min.js +262 -120
  104. package/dist/velinstyle.css +96 -13
  105. package/dist/velinstyle.d.ts +3 -0
  106. package/dist/velinstyle.min.css +1 -1
  107. package/package.json +19 -4
  108. package/packages/velinstyle-cli-core/package.json +11 -0
  109. package/packages/velinstyle-cli-core/src/config.js +84 -0
  110. package/packages/velinstyle-cli-core/src/contract.js +56 -0
  111. package/packages/velinstyle-cli-core/src/event-bus.js +50 -0
  112. package/packages/velinstyle-cli-core/src/index.js +18 -0
  113. package/packages/velinstyle-cli-core/src/lifecycle.js +33 -0
  114. package/packages/velinstyle-cli-core/src/runner.js +129 -0
  115. package/packages/velinstyle-cli-registry/data/commands.json +1216 -0
  116. package/packages/velinstyle-cli-registry/data/layouts.json +33 -0
  117. package/packages/velinstyle-cli-registry/data/widgets.json +35 -0
  118. package/packages/velinstyle-cli-registry/package.json +13 -0
  119. package/packages/velinstyle-cli-registry/src/index.js +88 -0
  120. package/packages/velinstyle-cli-renderer/package.json +8 -0
  121. package/packages/velinstyle-cli-renderer/src/index.js +286 -0
  122. package/packages/velinstyle-cli-theme/package.json +8 -0
  123. package/packages/velinstyle-cli-theme/src/index.js +84 -0
  124. package/packages/velinstyle-cli-ui/package.json +8 -0
  125. package/packages/velinstyle-cli-ui/src/index.js +34 -0
  126. package/packages/velinstyle-motion/README.md +81 -0
  127. package/packages/velinstyle-motion/package.json +37 -0
  128. package/packages/velinstyle-motion/src/ai/mini-prompt.js +119 -0
  129. package/packages/velinstyle-motion/src/ai/provider.js +59 -0
  130. package/packages/velinstyle-motion/src/ai/providers/pixverse-setup.js +402 -0
  131. package/packages/velinstyle-motion/src/ai/providers/pixverse.js +245 -0
  132. package/packages/velinstyle-motion/src/config.js +257 -0
  133. package/packages/velinstyle-motion/src/export/html-clip.js +141 -0
  134. package/packages/velinstyle-motion/src/index.js +304 -0
  135. package/packages/velinstyle-motion/src/jobs/cache.js +30 -0
  136. package/packages/velinstyle-motion/src/jobs/queue.js +69 -0
  137. package/packages/velinstyle-motion/src/jobs/usage.js +53 -0
  138. package/packages/velinstyle-motion/src/local/effects.js +139 -0
  139. package/packages/velinstyle-motion/src/local/engine.js +96 -0
  140. package/packages/velinstyle-motion/src/providers-catalog.js +44 -0
  141. package/packages/velinstyle-motion/src/registry/presets.js +25 -0
  142. package/packages/velinstyle-motion/src/registry/presets.json +85 -0
  143. package/packages/velinstyle-motion/src/ux/cost-gate.js +37 -0
  144. package/packages/velinstyle-motion/src/ux/pixverse-gate.js +153 -0
  145. package/packages/velinstyle-motion/src/ux/wizard.js +171 -0
  146. package/packages/velinstyle-motion/src/validate-image.js +91 -0
  147. package/packages/velinstyle-skills/catalog.json +1 -1
  148. package/packages/velinstyle-skills/registry.json +1 -142
  149. package/packages/velinstyle-skills/skills/velin-motion-reduced-safe/SKILL.md +1 -1
  150. package/packages/velinstyle-skills/skills/velin-motion-reveal-feedback/SKILL.md +1 -1
  151. package/src/components/data-table.css +19 -0
  152. package/src/components/empty-auth.css +33 -0
  153. package/src/components/table.css +16 -6
  154. package/src/tokens/motion.css +7 -0
  155. package/src/utilities/scroll-animation.css +66 -0
  156. package/src/velinstyle.css +1 -0
@@ -1,255 +1,391 @@
1
- {
2
- "wcagLevel": "AAA",
3
- "version": "1.2.1",
4
- "components": {
5
- "velin-accordion": {
6
- "status": "pass",
7
- "roles": ["group"],
8
- "keyboard": "Arrow/Home/End between summaries",
9
- "reducedMotion": true,
10
- "requiredAttributes": [],
11
- "notes": "Wires aria-controls on summary elements."
12
- },
13
- "velin-announcer": {
14
- "status": "pass",
15
- "roles": ["status"],
16
- "liveRegion": "polite|assertive",
17
- "keyboard": "N/A",
18
- "reducedMotion": true
19
- },
20
- "velin-bottom-nav": {
21
- "status": "pass",
22
- "roles": ["navigation"],
23
- "requiredAttributes": ["aria-label"],
24
- "keyboard": "Native links or buttons in slot",
25
- "notes": "Host aria-label; slotchange syncs aria-current and infers item labels from data-nav/title."
26
- },
27
- "velin-carousel": {
28
- "status": "pass",
29
- "roles": ["group", "button"],
30
- "keyboard": "Arrows, Home, End, dots",
31
- "reducedMotion": true
32
- },
33
- "velin-code-block": {
34
- "status": "pass",
35
- "roles": ["button"],
36
- "requiredAttributes": [],
37
- "keyboard": "Expand toggle keyboard",
38
- "notes": "Expand uses aria-expanded and aria-controls."
39
- },
40
- "velin-collapse": {
41
- "status": "pass",
42
- "roles": ["button"],
43
- "keyboard": "Enter/Space on trigger",
44
- "requiredAttributes": []
45
- },
46
- "velin-combobox": {
47
- "status": "pass",
48
- "roles": ["combobox", "listbox"],
49
- "keyboard": "Roving, Escape, Enter",
50
- "requiredAttributes": ["aria-label"]
51
- },
52
- "velin-command": {
53
- "status": "pass",
54
- "roles": ["dialog"],
55
- "keyboard": "Escape, arrows in results, Tab trap",
56
- "requiredAttributes": []
57
- },
58
- "velin-copy": {
59
- "status": "pass",
60
- "roles": ["button"],
61
- "requiredAttributes": ["aria-label"],
62
- "keyboard": "Native button"
63
- },
64
- "velin-countdown": {
65
- "status": "pass",
66
- "roles": ["timer"],
67
- "liveRegion": "polite",
68
- "keyboard": "N/A"
69
- },
70
- "velin-counter": {
71
- "status": "pass",
72
- "roles": ["status"],
73
- "liveRegion": "polite",
74
- "keyboard": "N/A",
75
- "reducedMotion": true
76
- },
77
- "velin-data-table": {
78
- "status": "pass",
79
- "roles": ["button"],
80
- "keyboard": "Sort buttons; editable cells: Enter/F2 edit, Escape cancel; pagination",
81
- "liveRegion": "polite",
82
- "reducedMotion": true,
83
- "requiredAttributes": [],
84
- "notes": "Enhances a light-DOM table. Optional editable attribute or data-editable cells for inline edit (velin-data-table-edit). No virtualization in v1."
85
- },
86
- "velin-calendar": {
87
- "status": "pass",
88
- "roles": ["group", "grid", "button"],
89
- "keyboard": "Arrows, Home/End, PageUp/Down, Enter/Space",
90
- "reducedMotion": true,
91
- "requiredAttributes": [],
92
- "notes": "Month calendar. value ISO date; velin-change event. Optional min/max."
93
- },
94
- "velin-file-dropzone": {
95
- "status": "pass",
96
- "roles": ["group"],
97
- "keyboard": "Browse button + native file input",
98
- "liveRegion": "polite",
99
- "reducedMotion": true,
100
- "requiredAttributes": [],
101
- "notes": "Client-side dropzone. Events velin-files / velin-error. Does not upload to a server."
102
- },
103
- "velin-dialog": {
104
- "status": "pass",
105
- "roles": ["dialog"],
106
- "keyboard": "Native dialog, Escape",
107
- "requiredAttributes": [],
108
- "notes": "aria-labelledby on dialog, aria-modal true."
109
- },
110
- "velin-drawer": {
111
- "status": "pass",
112
- "roles": ["dialog"],
113
- "keyboard": "Escape, Tab trap",
114
- "requiredAttributes": []
115
- },
116
- "velin-dropdown": {
117
- "status": "pass",
118
- "roles": ["menu", "button"],
119
- "keyboard": "Roving, typeahead, Escape"
120
- },
121
- "velin-email": {
122
- "status": "pass",
123
- "roles": ["button"],
124
- "requiredAttributes": ["aria-label"]
125
- },
126
- "velin-form-summary": {
127
- "status": "pass",
128
- "roles": ["alert", "link"],
129
- "keyboard": "Summary links move focus to the offending field",
130
- "liveRegion": "assertive",
131
- "requiredAttributes": [],
132
- "notes": "Disables native validation bubbles and renders a focusable role=alert summary. Sets aria-invalid and wires aria-describedby to per-field messages (WCAG 3.3.1, 3.3.3, 4.1.2). Field errors clear as soon as the field becomes valid."
133
- },
134
- "velin-icon": {
135
- "status": "pass",
136
- "roles": ["img", "presentation"],
137
- "requiredAttributes": ["label"],
138
- "notes": "Decorative when no label; SVG aria-hidden. Do not set aria-hidden on host in JS."
139
- },
140
- "velin-lightbox": {
141
- "status": "pass",
142
- "roles": ["dialog"],
143
- "keyboard": "Escape, arrows, Tab trap",
144
- "liveRegion": "polite"
145
- },
146
- "velin-live-dot": {
147
- "status": "pass",
148
- "roles": ["status"],
149
- "requiredAttributes": [],
150
- "notes": "Status exposed via aria-label on host, not color alone."
151
- },
152
- "velin-menubar": {
153
- "status": "pass",
154
- "roles": ["menubar", "menu"],
155
- "requiredAttributes": ["aria-label"],
156
- "keyboard": "Roving arrows"
157
- },
158
- "velin-modal": {
159
- "status": "pass",
160
- "roles": ["dialog"],
161
- "keyboard": "Escape, Tab trap",
162
- "requiredAttributes": []
163
- },
164
- "velin-persist": {
165
- "status": "pass",
166
- "keyboard": "N/A",
167
- "notes": "display:contents; auto-saves form field values (WCAG 3.3.7 Redundant Entry helper). Clears on form submit."
168
- },
169
- "velin-popover": {
170
- "status": "pass",
171
- "roles": ["dialog", "tooltip"],
172
- "keyboard": "Escape, Enter/Space on trigger; focus opens hover mode",
173
- "notes": "aria-labelledby or default aria-label; non-button triggers get role=button."
174
- },
175
- "velin-progress-ring": {
176
- "status": "pass",
177
- "roles": ["progressbar"],
178
- "requiredAttributes": []
179
- },
180
- "velin-rating": {
181
- "status": "pass",
182
- "roles": ["radiogroup"],
183
- "keyboard": "Roving, arrows"
184
- },
185
- "velin-scroll-top": {
186
- "status": "pass",
187
- "roles": ["button"],
188
- "requiredAttributes": ["aria-label"],
189
- "reducedMotion": true
190
- },
191
- "velin-scrollspy": {
192
- "status": "pass",
193
- "keyboard": "Native nav links",
194
- "notes": "Sets aria-current on active link."
195
- },
196
- "velin-search": {
197
- "status": "pass",
198
- "roles": ["combobox", "listbox"],
199
- "requiredAttributes": ["aria-label"],
200
- "keyboard": "Arrows, Enter, Escape",
201
- "notes": "Default aria-label Search when unset."
202
- },
203
- "velin-secure-field": {
204
- "status": "pass",
205
- "roles": ["textbox"],
206
- "requiredAttributes": [],
207
- "notes": "Native label association."
208
- },
209
- "velin-segmented-control": {
210
- "status": "pass",
211
- "roles": ["group"],
212
- "requiredAttributes": ["aria-label"],
213
- "keyboard": "Roving"
214
- },
215
- "velin-sheet": {
216
- "status": "pass",
217
- "roles": ["dialog"],
218
- "keyboard": "Escape, Tab trap"
219
- },
220
- "velin-sparkline": {
221
- "status": "pass",
222
- "roles": ["img", "presentation"],
223
- "requiredAttributes": ["label"],
224
- "notes": "Uses label, aria-label, or figcaption aria-labelledby."
225
- },
226
- "velin-stepper": {
227
- "status": "pass",
228
- "roles": ["list"],
229
- "keyboard": "N/A (display); pair with buttons calling next()/prev()",
230
- "notes": "aria-label per step (completed/current/upcoming); sr-only Completed text; aria-current on active step."
231
- },
232
- "velin-tabs": {
233
- "status": "pass",
234
- "roles": ["tablist", "tab", "tabpanel"],
235
- "keyboard": "Roving, auto-select arrows"
236
- },
237
- "velin-theme-toggle": {
238
- "status": "pass",
239
- "roles": ["button", "menu"],
240
- "keyboard": "Menu arrows, Escape",
241
- "notes": "aria-pressed on theme toggle."
242
- },
243
- "velin-toast": {
244
- "status": "pass",
245
- "roles": ["status", "alert"],
246
- "liveRegion": "polite|assertive",
247
- "keyboard": "Close button"
248
- },
249
- "velin-tooltip": {
250
- "status": "pass",
251
- "roles": ["tooltip"],
252
- "keyboard": "Escape, focusin"
253
- }
254
- }
255
- }
1
+ {
2
+ "wcagLevel": "AAA",
3
+ "version": "1.3.0",
4
+ "components": {
5
+ "velin-accordion": {
6
+ "status": "pass",
7
+ "roles": [
8
+ "group"
9
+ ],
10
+ "keyboard": "Arrow/Home/End between summaries",
11
+ "reducedMotion": true,
12
+ "requiredAttributes": [],
13
+ "notes": "Wires aria-controls on summary elements."
14
+ },
15
+ "velin-announcer": {
16
+ "status": "pass",
17
+ "roles": [
18
+ "status"
19
+ ],
20
+ "liveRegion": "polite|assertive",
21
+ "keyboard": "N/A",
22
+ "reducedMotion": true
23
+ },
24
+ "velin-bottom-nav": {
25
+ "status": "pass",
26
+ "roles": [
27
+ "navigation"
28
+ ],
29
+ "requiredAttributes": [
30
+ "aria-label"
31
+ ],
32
+ "keyboard": "Native links or buttons in slot",
33
+ "notes": "Host aria-label; slotchange syncs aria-current and infers item labels from data-nav/title."
34
+ },
35
+ "velin-carousel": {
36
+ "status": "pass",
37
+ "roles": [
38
+ "group",
39
+ "button"
40
+ ],
41
+ "keyboard": "Arrows, Home, End, dots",
42
+ "reducedMotion": true
43
+ },
44
+ "velin-code-block": {
45
+ "status": "pass",
46
+ "roles": [
47
+ "button"
48
+ ],
49
+ "requiredAttributes": [],
50
+ "keyboard": "Expand toggle keyboard",
51
+ "notes": "Expand uses aria-expanded and aria-controls."
52
+ },
53
+ "velin-collapse": {
54
+ "status": "pass",
55
+ "roles": [
56
+ "button"
57
+ ],
58
+ "keyboard": "Enter/Space on trigger",
59
+ "requiredAttributes": []
60
+ },
61
+ "velin-combobox": {
62
+ "status": "pass",
63
+ "roles": [
64
+ "combobox",
65
+ "listbox"
66
+ ],
67
+ "keyboard": "Roving, Escape, Enter",
68
+ "requiredAttributes": [
69
+ "aria-label"
70
+ ]
71
+ },
72
+ "velin-command": {
73
+ "status": "pass",
74
+ "roles": [
75
+ "dialog"
76
+ ],
77
+ "keyboard": "Escape, arrows in results, Tab trap",
78
+ "requiredAttributes": []
79
+ },
80
+ "velin-copy": {
81
+ "status": "pass",
82
+ "roles": [
83
+ "button"
84
+ ],
85
+ "requiredAttributes": [
86
+ "aria-label"
87
+ ],
88
+ "keyboard": "Native button"
89
+ },
90
+ "velin-countdown": {
91
+ "status": "pass",
92
+ "roles": [
93
+ "timer"
94
+ ],
95
+ "liveRegion": "polite",
96
+ "keyboard": "N/A"
97
+ },
98
+ "velin-counter": {
99
+ "status": "pass",
100
+ "roles": [
101
+ "status"
102
+ ],
103
+ "liveRegion": "polite",
104
+ "keyboard": "N/A",
105
+ "reducedMotion": true
106
+ },
107
+ "velin-data-table": {
108
+ "status": "pass",
109
+ "roles": [
110
+ "button"
111
+ ],
112
+ "keyboard": "Sort buttons; editable cells: Enter/F2 edit, Escape cancel; pagination",
113
+ "liveRegion": "polite",
114
+ "reducedMotion": true,
115
+ "requiredAttributes": [],
116
+ "notes": "Enhances a light-DOM table. Optional editable attribute or data-editable cells for inline edit (velin-data-table-edit). No virtualization in v1."
117
+ },
118
+ "velin-calendar": {
119
+ "status": "pass",
120
+ "roles": [
121
+ "group",
122
+ "grid",
123
+ "button"
124
+ ],
125
+ "keyboard": "Arrows, Home/End, PageUp/Down, Enter/Space",
126
+ "reducedMotion": true,
127
+ "requiredAttributes": [],
128
+ "notes": "Month calendar. value ISO date; velin-change event. Optional min/max."
129
+ },
130
+ "velin-file-dropzone": {
131
+ "status": "pass",
132
+ "roles": [
133
+ "group"
134
+ ],
135
+ "keyboard": "Browse button + native file input",
136
+ "liveRegion": "polite",
137
+ "reducedMotion": true,
138
+ "requiredAttributes": [],
139
+ "notes": "Client-side dropzone. Events velin-files / velin-error. Does not upload to a server."
140
+ },
141
+ "velin-dialog": {
142
+ "status": "pass",
143
+ "roles": [
144
+ "dialog"
145
+ ],
146
+ "keyboard": "Native dialog, Escape",
147
+ "requiredAttributes": [],
148
+ "notes": "aria-labelledby on dialog, aria-modal true."
149
+ },
150
+ "velin-drawer": {
151
+ "status": "pass",
152
+ "roles": [
153
+ "dialog"
154
+ ],
155
+ "keyboard": "Escape, Tab trap",
156
+ "requiredAttributes": [],
157
+ "notes": "Reactive title attribute + slot=title."
158
+ },
159
+ "velin-dropdown": {
160
+ "status": "pass",
161
+ "roles": [
162
+ "menu",
163
+ "button"
164
+ ],
165
+ "keyboard": "Roving, typeahead, Escape"
166
+ },
167
+ "velin-email": {
168
+ "status": "pass",
169
+ "roles": [
170
+ "button"
171
+ ],
172
+ "requiredAttributes": [
173
+ "aria-label"
174
+ ]
175
+ },
176
+ "velin-empty-state": {
177
+ "status": "pass",
178
+ "roles": [
179
+ "status"
180
+ ],
181
+ "notes": "heading/description attributes or slots; actions slot for CTAs."
182
+ },
183
+ "velin-form-summary": {
184
+ "status": "pass",
185
+ "roles": [
186
+ "alert",
187
+ "link"
188
+ ],
189
+ "keyboard": "Summary links move focus to the offending field",
190
+ "liveRegion": "assertive",
191
+ "requiredAttributes": [],
192
+ "notes": "Disables native validation bubbles and renders a focusable role=alert summary. Sets aria-invalid and wires aria-describedby to per-field messages (WCAG 3.3.1, 3.3.3, 4.1.2). Field errors clear as soon as the field becomes valid."
193
+ },
194
+ "velin-icon": {
195
+ "status": "pass",
196
+ "roles": [
197
+ "img",
198
+ "presentation"
199
+ ],
200
+ "requiredAttributes": [
201
+ "label"
202
+ ],
203
+ "notes": "Decorative when no label; SVG aria-hidden. Do not set aria-hidden on host in JS."
204
+ },
205
+ "velin-lightbox": {
206
+ "status": "pass",
207
+ "roles": [
208
+ "dialog"
209
+ ],
210
+ "keyboard": "Escape, arrows, Tab trap",
211
+ "liveRegion": "polite"
212
+ },
213
+ "velin-live-dot": {
214
+ "status": "pass",
215
+ "roles": [
216
+ "status"
217
+ ],
218
+ "requiredAttributes": [],
219
+ "notes": "Status exposed via aria-label on host, not color alone."
220
+ },
221
+ "velin-menubar": {
222
+ "status": "pass",
223
+ "roles": [
224
+ "menubar",
225
+ "menu"
226
+ ],
227
+ "requiredAttributes": [
228
+ "aria-label"
229
+ ],
230
+ "keyboard": "Roving arrows"
231
+ },
232
+ "velin-modal": {
233
+ "status": "pass",
234
+ "roles": [
235
+ "dialog"
236
+ ],
237
+ "keyboard": "Escape, Tab trap",
238
+ "requiredAttributes": [],
239
+ "notes": "Reactive title attribute + slot=title; footer slot."
240
+ },
241
+ "velin-otp-input": {
242
+ "status": "pass",
243
+ "roles": [
244
+ "group"
245
+ ],
246
+ "keyboard": "Digits, arrows, backspace, paste",
247
+ "notes": "autocomplete one-time-code on first digit."
248
+ },
249
+ "velin-password-strength": {
250
+ "status": "pass",
251
+ "roles": [
252
+ "progressbar"
253
+ ],
254
+ "notes": "Heuristic meter; aria-live label; for= links to password input."
255
+ },
256
+ "velin-persist": {
257
+ "status": "pass",
258
+ "keyboard": "N/A",
259
+ "notes": "display:contents; auto-saves form field values (WCAG 3.3.7 Redundant Entry helper). Clears on form submit."
260
+ },
261
+ "velin-popover": {
262
+ "status": "pass",
263
+ "roles": [
264
+ "dialog",
265
+ "tooltip"
266
+ ],
267
+ "keyboard": "Escape, Enter/Space on trigger; focus opens hover mode",
268
+ "notes": "aria-labelledby or default aria-label; non-button triggers get role=button."
269
+ },
270
+ "velin-progress-ring": {
271
+ "status": "pass",
272
+ "roles": [
273
+ "progressbar"
274
+ ],
275
+ "requiredAttributes": []
276
+ },
277
+ "velin-rating": {
278
+ "status": "pass",
279
+ "roles": [
280
+ "radiogroup"
281
+ ],
282
+ "keyboard": "Roving, arrows"
283
+ },
284
+ "velin-scroll-top": {
285
+ "status": "pass",
286
+ "roles": [
287
+ "button"
288
+ ],
289
+ "requiredAttributes": [
290
+ "aria-label"
291
+ ],
292
+ "reducedMotion": true
293
+ },
294
+ "velin-scrollspy": {
295
+ "status": "pass",
296
+ "keyboard": "Native nav links",
297
+ "notes": "Sets aria-current on active link."
298
+ },
299
+ "velin-search": {
300
+ "status": "pass",
301
+ "roles": [
302
+ "combobox",
303
+ "listbox"
304
+ ],
305
+ "requiredAttributes": [
306
+ "aria-label"
307
+ ],
308
+ "keyboard": "Arrows, Enter, Escape",
309
+ "notes": "Default aria-label Search when unset."
310
+ },
311
+ "velin-secure-field": {
312
+ "status": "pass",
313
+ "roles": [
314
+ "textbox"
315
+ ],
316
+ "requiredAttributes": [],
317
+ "notes": "Native label association."
318
+ },
319
+ "velin-segmented-control": {
320
+ "status": "pass",
321
+ "roles": [
322
+ "group"
323
+ ],
324
+ "requiredAttributes": [
325
+ "aria-label"
326
+ ],
327
+ "keyboard": "Roving"
328
+ },
329
+ "velin-sheet": {
330
+ "status": "pass",
331
+ "roles": [
332
+ "dialog"
333
+ ],
334
+ "keyboard": "Escape, Tab trap",
335
+ "notes": "Reactive title/label + slot=title."
336
+ },
337
+ "velin-sparkline": {
338
+ "status": "pass",
339
+ "roles": [
340
+ "img",
341
+ "presentation"
342
+ ],
343
+ "requiredAttributes": [
344
+ "label"
345
+ ],
346
+ "notes": "Uses label, aria-label, or figcaption aria-labelledby."
347
+ },
348
+ "velin-stepper": {
349
+ "status": "pass",
350
+ "roles": [
351
+ "list"
352
+ ],
353
+ "keyboard": "N/A (display); pair with buttons calling next()/prev()",
354
+ "notes": "aria-label per step (completed/current/upcoming); sr-only Completed text; aria-current on active step."
355
+ },
356
+ "velin-tabs": {
357
+ "status": "pass",
358
+ "roles": [
359
+ "tablist",
360
+ "tab",
361
+ "tabpanel"
362
+ ],
363
+ "keyboard": "Roving, auto-select arrows"
364
+ },
365
+ "velin-theme-toggle": {
366
+ "status": "pass",
367
+ "roles": [
368
+ "button",
369
+ "menu"
370
+ ],
371
+ "keyboard": "Menu arrows, Escape",
372
+ "notes": "aria-pressed on theme toggle."
373
+ },
374
+ "velin-toast": {
375
+ "status": "pass",
376
+ "roles": [
377
+ "status",
378
+ "alert"
379
+ ],
380
+ "liveRegion": "polite|assertive",
381
+ "keyboard": "Close button"
382
+ },
383
+ "velin-tooltip": {
384
+ "status": "pass",
385
+ "roles": [
386
+ "tooltip"
387
+ ],
388
+ "keyboard": "Escape, focusin"
389
+ }
390
+ }
391
+ }