@tekton-ui/core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/README.md +758 -0
  2. package/dist/blueprint.d.ts +44 -0
  3. package/dist/blueprint.d.ts.map +1 -0
  4. package/dist/blueprint.js +163 -0
  5. package/dist/blueprint.js.map +1 -0
  6. package/dist/component-schemas.d.ts +78 -0
  7. package/dist/component-schemas.d.ts.map +1 -0
  8. package/dist/component-schemas.js +1037 -0
  9. package/dist/component-schemas.js.map +1 -0
  10. package/dist/css-generator.d.ts +42 -0
  11. package/dist/css-generator.d.ts.map +1 -0
  12. package/dist/css-generator.js +339 -0
  13. package/dist/css-generator.js.map +1 -0
  14. package/dist/icon-library.d.ts +109 -0
  15. package/dist/icon-library.d.ts.map +1 -0
  16. package/dist/icon-library.js +204 -0
  17. package/dist/icon-library.js.map +1 -0
  18. package/dist/index.d.ts +36 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +51 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/layout-css-generator.d.ts +158 -0
  23. package/dist/layout-css-generator.d.ts.map +1 -0
  24. package/dist/layout-css-generator.js +901 -0
  25. package/dist/layout-css-generator.js.map +1 -0
  26. package/dist/layout-resolver.d.ts +92 -0
  27. package/dist/layout-resolver.d.ts.map +1 -0
  28. package/dist/layout-resolver.js +275 -0
  29. package/dist/layout-resolver.js.map +1 -0
  30. package/dist/layout-tokens/index.d.ts +16 -0
  31. package/dist/layout-tokens/index.d.ts.map +1 -0
  32. package/dist/layout-tokens/index.js +16 -0
  33. package/dist/layout-tokens/index.js.map +1 -0
  34. package/dist/layout-tokens/keyboard.d.ts +254 -0
  35. package/dist/layout-tokens/keyboard.d.ts.map +1 -0
  36. package/dist/layout-tokens/keyboard.js +407 -0
  37. package/dist/layout-tokens/keyboard.js.map +1 -0
  38. package/dist/layout-tokens/mobile-shells.d.ts +78 -0
  39. package/dist/layout-tokens/mobile-shells.d.ts.map +1 -0
  40. package/dist/layout-tokens/mobile-shells.js +635 -0
  41. package/dist/layout-tokens/mobile-shells.js.map +1 -0
  42. package/dist/layout-tokens/pages.d.ts +100 -0
  43. package/dist/layout-tokens/pages.d.ts.map +1 -0
  44. package/dist/layout-tokens/pages.js +576 -0
  45. package/dist/layout-tokens/pages.js.map +1 -0
  46. package/dist/layout-tokens/responsive.d.ts +109 -0
  47. package/dist/layout-tokens/responsive.d.ts.map +1 -0
  48. package/dist/layout-tokens/responsive.js +167 -0
  49. package/dist/layout-tokens/responsive.js.map +1 -0
  50. package/dist/layout-tokens/safe-area.d.ts +156 -0
  51. package/dist/layout-tokens/safe-area.d.ts.map +1 -0
  52. package/dist/layout-tokens/safe-area.js +316 -0
  53. package/dist/layout-tokens/safe-area.js.map +1 -0
  54. package/dist/layout-tokens/sections-advanced.d.ts +277 -0
  55. package/dist/layout-tokens/sections-advanced.d.ts.map +1 -0
  56. package/dist/layout-tokens/sections-advanced.js +593 -0
  57. package/dist/layout-tokens/sections-advanced.js.map +1 -0
  58. package/dist/layout-tokens/sections.d.ts +137 -0
  59. package/dist/layout-tokens/sections.d.ts.map +1 -0
  60. package/dist/layout-tokens/sections.js +694 -0
  61. package/dist/layout-tokens/sections.js.map +1 -0
  62. package/dist/layout-tokens/shells.d.ts +77 -0
  63. package/dist/layout-tokens/shells.d.ts.map +1 -0
  64. package/dist/layout-tokens/shells.js +408 -0
  65. package/dist/layout-tokens/shells.js.map +1 -0
  66. package/dist/layout-tokens/touch-target.d.ts +119 -0
  67. package/dist/layout-tokens/touch-target.d.ts.map +1 -0
  68. package/dist/layout-tokens/touch-target.js +156 -0
  69. package/dist/layout-tokens/touch-target.js.map +1 -0
  70. package/dist/layout-tokens/types.d.ts +632 -0
  71. package/dist/layout-tokens/types.d.ts.map +1 -0
  72. package/dist/layout-tokens/types.js +49 -0
  73. package/dist/layout-tokens/types.js.map +1 -0
  74. package/dist/layout-validation.d.ts +1547 -0
  75. package/dist/layout-validation.d.ts.map +1 -0
  76. package/dist/layout-validation.js +628 -0
  77. package/dist/layout-validation.js.map +1 -0
  78. package/dist/render.d.ts +23 -0
  79. package/dist/render.d.ts.map +1 -0
  80. package/dist/render.js +244 -0
  81. package/dist/render.js.map +1 -0
  82. package/dist/schema-validation.d.ts +208 -0
  83. package/dist/schema-validation.d.ts.map +1 -0
  84. package/dist/schema-validation.js +205 -0
  85. package/dist/schema-validation.js.map +1 -0
  86. package/dist/screen-generation/generators/css-in-js-generator.d.ts +82 -0
  87. package/dist/screen-generation/generators/css-in-js-generator.d.ts.map +1 -0
  88. package/dist/screen-generation/generators/css-in-js-generator.js +335 -0
  89. package/dist/screen-generation/generators/css-in-js-generator.js.map +1 -0
  90. package/dist/screen-generation/generators/index.d.ts +13 -0
  91. package/dist/screen-generation/generators/index.d.ts.map +1 -0
  92. package/dist/screen-generation/generators/index.js +32 -0
  93. package/dist/screen-generation/generators/index.js.map +1 -0
  94. package/dist/screen-generation/generators/react-generator.d.ts +100 -0
  95. package/dist/screen-generation/generators/react-generator.d.ts.map +1 -0
  96. package/dist/screen-generation/generators/react-generator.js +379 -0
  97. package/dist/screen-generation/generators/react-generator.js.map +1 -0
  98. package/dist/screen-generation/generators/tailwind-generator.d.ts +105 -0
  99. package/dist/screen-generation/generators/tailwind-generator.d.ts.map +1 -0
  100. package/dist/screen-generation/generators/tailwind-generator.js +355 -0
  101. package/dist/screen-generation/generators/tailwind-generator.js.map +1 -0
  102. package/dist/screen-generation/generators/types.d.ts +136 -0
  103. package/dist/screen-generation/generators/types.d.ts.map +1 -0
  104. package/dist/screen-generation/generators/types.js +18 -0
  105. package/dist/screen-generation/generators/types.js.map +1 -0
  106. package/dist/screen-generation/generators/utils.d.ts +187 -0
  107. package/dist/screen-generation/generators/utils.d.ts.map +1 -0
  108. package/dist/screen-generation/generators/utils.js +312 -0
  109. package/dist/screen-generation/generators/utils.js.map +1 -0
  110. package/dist/screen-generation/index.d.ts +14 -0
  111. package/dist/screen-generation/index.d.ts.map +1 -0
  112. package/dist/screen-generation/index.js +33 -0
  113. package/dist/screen-generation/index.js.map +1 -0
  114. package/dist/screen-generation/resolver/component-resolver.d.ts +157 -0
  115. package/dist/screen-generation/resolver/component-resolver.d.ts.map +1 -0
  116. package/dist/screen-generation/resolver/component-resolver.js +295 -0
  117. package/dist/screen-generation/resolver/component-resolver.js.map +1 -0
  118. package/dist/screen-generation/resolver/index.d.ts +10 -0
  119. package/dist/screen-generation/resolver/index.d.ts.map +1 -0
  120. package/dist/screen-generation/resolver/index.js +46 -0
  121. package/dist/screen-generation/resolver/index.js.map +1 -0
  122. package/dist/screen-generation/resolver/layout-resolver.d.ts +155 -0
  123. package/dist/screen-generation/resolver/layout-resolver.d.ts.map +1 -0
  124. package/dist/screen-generation/resolver/layout-resolver.js +193 -0
  125. package/dist/screen-generation/resolver/layout-resolver.js.map +1 -0
  126. package/dist/screen-generation/resolver/screen-resolver.d.ts +174 -0
  127. package/dist/screen-generation/resolver/screen-resolver.d.ts.map +1 -0
  128. package/dist/screen-generation/resolver/screen-resolver.js +373 -0
  129. package/dist/screen-generation/resolver/screen-resolver.js.map +1 -0
  130. package/dist/screen-generation/resolver/token-resolver.d.ts +170 -0
  131. package/dist/screen-generation/resolver/token-resolver.d.ts.map +1 -0
  132. package/dist/screen-generation/resolver/token-resolver.js +260 -0
  133. package/dist/screen-generation/resolver/token-resolver.js.map +1 -0
  134. package/dist/screen-generation/types.d.ts +116 -0
  135. package/dist/screen-generation/types.d.ts.map +1 -0
  136. package/dist/screen-generation/types.js +33 -0
  137. package/dist/screen-generation/types.js.map +1 -0
  138. package/dist/screen-generation/validators.d.ts +286 -0
  139. package/dist/screen-generation/validators.d.ts.map +1 -0
  140. package/dist/screen-generation/validators.js +323 -0
  141. package/dist/screen-generation/validators.js.map +1 -0
  142. package/dist/screen-templates/__tests__/registry.test.d.ts +6 -0
  143. package/dist/screen-templates/__tests__/registry.test.d.ts.map +1 -0
  144. package/dist/screen-templates/__tests__/registry.test.js +247 -0
  145. package/dist/screen-templates/__tests__/registry.test.js.map +1 -0
  146. package/dist/screen-templates/__tests__/templates.test.d.ts +6 -0
  147. package/dist/screen-templates/__tests__/templates.test.d.ts.map +1 -0
  148. package/dist/screen-templates/__tests__/templates.test.js +179 -0
  149. package/dist/screen-templates/__tests__/templates.test.js.map +1 -0
  150. package/dist/screen-templates/index.d.ts +39 -0
  151. package/dist/screen-templates/index.d.ts.map +1 -0
  152. package/dist/screen-templates/index.js +79 -0
  153. package/dist/screen-templates/index.js.map +1 -0
  154. package/dist/screen-templates/registry.d.ts +177 -0
  155. package/dist/screen-templates/registry.d.ts.map +1 -0
  156. package/dist/screen-templates/registry.js +274 -0
  157. package/dist/screen-templates/registry.js.map +1 -0
  158. package/dist/screen-templates/templates/account/index.d.ts +6 -0
  159. package/dist/screen-templates/templates/account/index.d.ts.map +1 -0
  160. package/dist/screen-templates/templates/account/index.js +6 -0
  161. package/dist/screen-templates/templates/account/index.js.map +1 -0
  162. package/dist/screen-templates/templates/account/profile.d.ts +23 -0
  163. package/dist/screen-templates/templates/account/profile.d.ts.map +1 -0
  164. package/dist/screen-templates/templates/account/profile.js +249 -0
  165. package/dist/screen-templates/templates/account/profile.js.map +1 -0
  166. package/dist/screen-templates/templates/auth/forgot-password.d.ts +23 -0
  167. package/dist/screen-templates/templates/auth/forgot-password.d.ts.map +1 -0
  168. package/dist/screen-templates/templates/auth/forgot-password.js +203 -0
  169. package/dist/screen-templates/templates/auth/forgot-password.js.map +1 -0
  170. package/dist/screen-templates/templates/auth/index.d.ts +9 -0
  171. package/dist/screen-templates/templates/auth/index.d.ts.map +1 -0
  172. package/dist/screen-templates/templates/auth/index.js +9 -0
  173. package/dist/screen-templates/templates/auth/index.js.map +1 -0
  174. package/dist/screen-templates/templates/auth/login.d.ts +24 -0
  175. package/dist/screen-templates/templates/auth/login.d.ts.map +1 -0
  176. package/dist/screen-templates/templates/auth/login.js +254 -0
  177. package/dist/screen-templates/templates/auth/login.js.map +1 -0
  178. package/dist/screen-templates/templates/auth/signup.d.ts +24 -0
  179. package/dist/screen-templates/templates/auth/signup.d.ts.map +1 -0
  180. package/dist/screen-templates/templates/auth/signup.js +315 -0
  181. package/dist/screen-templates/templates/auth/signup.js.map +1 -0
  182. package/dist/screen-templates/templates/auth/verification.d.ts +23 -0
  183. package/dist/screen-templates/templates/auth/verification.d.ts.map +1 -0
  184. package/dist/screen-templates/templates/auth/verification.js +239 -0
  185. package/dist/screen-templates/templates/auth/verification.js.map +1 -0
  186. package/dist/screen-templates/templates/feedback/confirmation.d.ts +9 -0
  187. package/dist/screen-templates/templates/feedback/confirmation.d.ts.map +1 -0
  188. package/dist/screen-templates/templates/feedback/confirmation.js +107 -0
  189. package/dist/screen-templates/templates/feedback/confirmation.js.map +1 -0
  190. package/dist/screen-templates/templates/feedback/empty.d.ts +9 -0
  191. package/dist/screen-templates/templates/feedback/empty.d.ts.map +1 -0
  192. package/dist/screen-templates/templates/feedback/empty.js +90 -0
  193. package/dist/screen-templates/templates/feedback/empty.js.map +1 -0
  194. package/dist/screen-templates/templates/feedback/error.d.ts +9 -0
  195. package/dist/screen-templates/templates/feedback/error.d.ts.map +1 -0
  196. package/dist/screen-templates/templates/feedback/error.js +99 -0
  197. package/dist/screen-templates/templates/feedback/error.js.map +1 -0
  198. package/dist/screen-templates/templates/feedback/index.d.ts +10 -0
  199. package/dist/screen-templates/templates/feedback/index.d.ts.map +1 -0
  200. package/dist/screen-templates/templates/feedback/index.js +10 -0
  201. package/dist/screen-templates/templates/feedback/index.js.map +1 -0
  202. package/dist/screen-templates/templates/feedback/loading.d.ts +9 -0
  203. package/dist/screen-templates/templates/feedback/loading.d.ts.map +1 -0
  204. package/dist/screen-templates/templates/feedback/loading.js +77 -0
  205. package/dist/screen-templates/templates/feedback/loading.js.map +1 -0
  206. package/dist/screen-templates/templates/feedback/success.d.ts +9 -0
  207. package/dist/screen-templates/templates/feedback/success.d.ts.map +1 -0
  208. package/dist/screen-templates/templates/feedback/success.js +99 -0
  209. package/dist/screen-templates/templates/feedback/success.js.map +1 -0
  210. package/dist/screen-templates/templates/home/index.d.ts +6 -0
  211. package/dist/screen-templates/templates/home/index.d.ts.map +1 -0
  212. package/dist/screen-templates/templates/home/index.js +6 -0
  213. package/dist/screen-templates/templates/home/index.js.map +1 -0
  214. package/dist/screen-templates/templates/home/landing.d.ts +24 -0
  215. package/dist/screen-templates/templates/home/landing.d.ts.map +1 -0
  216. package/dist/screen-templates/templates/home/landing.js +197 -0
  217. package/dist/screen-templates/templates/home/landing.js.map +1 -0
  218. package/dist/screen-templates/templates/settings/index.d.ts +6 -0
  219. package/dist/screen-templates/templates/settings/index.d.ts.map +1 -0
  220. package/dist/screen-templates/templates/settings/index.js +6 -0
  221. package/dist/screen-templates/templates/settings/index.js.map +1 -0
  222. package/dist/screen-templates/templates/settings/preferences.d.ts +24 -0
  223. package/dist/screen-templates/templates/settings/preferences.d.ts.map +1 -0
  224. package/dist/screen-templates/templates/settings/preferences.js +265 -0
  225. package/dist/screen-templates/templates/settings/preferences.js.map +1 -0
  226. package/dist/screen-templates/types.d.ts +229 -0
  227. package/dist/screen-templates/types.d.ts.map +1 -0
  228. package/dist/screen-templates/types.js +7 -0
  229. package/dist/screen-templates/types.js.map +1 -0
  230. package/dist/theme-v2.d.ts +228 -0
  231. package/dist/theme-v2.d.ts.map +1 -0
  232. package/dist/theme-v2.js +158 -0
  233. package/dist/theme-v2.js.map +1 -0
  234. package/dist/theme.d.ts +60 -0
  235. package/dist/theme.d.ts.map +1 -0
  236. package/dist/theme.js +76 -0
  237. package/dist/theme.js.map +1 -0
  238. package/dist/token-resolver.d.ts +69 -0
  239. package/dist/token-resolver.d.ts.map +1 -0
  240. package/dist/token-resolver.js +122 -0
  241. package/dist/token-resolver.js.map +1 -0
  242. package/dist/token-validation.d.ts +432 -0
  243. package/dist/token-validation.d.ts.map +1 -0
  244. package/dist/token-validation.js +140 -0
  245. package/dist/token-validation.js.map +1 -0
  246. package/dist/tokens.d.ts +158 -0
  247. package/dist/tokens.d.ts.map +1 -0
  248. package/dist/tokens.js +10 -0
  249. package/dist/tokens.js.map +1 -0
  250. package/dist/types.d.ts +77 -0
  251. package/dist/types.d.ts.map +1 -0
  252. package/dist/types.js +7 -0
  253. package/dist/types.js.map +1 -0
  254. package/package.json +53 -0
@@ -0,0 +1,1037 @@
1
+ /**
2
+ * @tekton-ui/core - Component Schema Definitions
3
+ * Platform-agnostic component interface specifications with token bindings
4
+ * [SPEC-COMPONENT-001-B] [TAG-001] [TAG-002] [TAG-003]
5
+ */
6
+ // ============================================================================
7
+ // Primitive Components [TAG-002]
8
+ // ============================================================================
9
+ /**
10
+ * Button Component Schema
11
+ */
12
+ const ButtonSchema = {
13
+ type: 'Button',
14
+ category: 'primitive',
15
+ description: 'Interactive button element for user actions',
16
+ props: [
17
+ {
18
+ name: 'variant',
19
+ type: 'string',
20
+ required: false,
21
+ description: 'Visual style variant',
22
+ defaultValue: 'primary',
23
+ options: ['primary', 'secondary', 'outline', 'ghost', 'danger'],
24
+ },
25
+ {
26
+ name: 'size',
27
+ type: 'string',
28
+ required: false,
29
+ description: 'Button size',
30
+ defaultValue: 'medium',
31
+ options: ['small', 'medium', 'large'],
32
+ },
33
+ {
34
+ name: 'disabled',
35
+ type: 'boolean',
36
+ required: false,
37
+ description: 'Whether the button is disabled',
38
+ defaultValue: false,
39
+ },
40
+ {
41
+ name: 'children',
42
+ type: 'ReactNode',
43
+ required: true,
44
+ description: 'Button content',
45
+ },
46
+ ],
47
+ tokenBindings: {
48
+ background: 'component.button.{variant}.background',
49
+ foreground: 'component.button.{variant}.foreground',
50
+ border: 'component.button.{variant}.border',
51
+ borderRadius: 'atomic.radius.md',
52
+ paddingX: 'atomic.spacing.{size}',
53
+ paddingY: 'atomic.spacing.2',
54
+ fontSize: 'atomic.typography.{size}.fontSize',
55
+ fontWeight: 'atomic.typography.{size}.fontWeight',
56
+ hoverBackground: 'component.button.{variant}.hover.background',
57
+ activeBackground: 'component.button.{variant}.active.background',
58
+ disabledBackground: 'component.button.{variant}.disabled.background',
59
+ disabledForeground: 'component.button.{variant}.disabled.foreground',
60
+ },
61
+ a11y: {
62
+ role: 'button',
63
+ wcag: 'WCAG 2.1 AA',
64
+ ariaAttributes: ['aria-label', 'aria-disabled', 'aria-pressed'],
65
+ keyboard: ['Enter', 'Space'],
66
+ focus: 'Visible focus indicator with semantic.border.focus',
67
+ screenReader: 'Announces button label and state',
68
+ },
69
+ };
70
+ /**
71
+ * Input Component Schema
72
+ */
73
+ const InputSchema = {
74
+ type: 'Input',
75
+ category: 'primitive',
76
+ description: 'Text input field for user data entry',
77
+ props: [
78
+ {
79
+ name: 'type',
80
+ type: 'string',
81
+ required: false,
82
+ description: 'Input type',
83
+ defaultValue: 'text',
84
+ options: ['text', 'email', 'password', 'number', 'tel', 'url'],
85
+ },
86
+ {
87
+ name: 'size',
88
+ type: 'string',
89
+ required: false,
90
+ description: 'Input size',
91
+ defaultValue: 'medium',
92
+ options: ['small', 'medium', 'large'],
93
+ },
94
+ {
95
+ name: 'placeholder',
96
+ type: 'string',
97
+ required: false,
98
+ description: 'Placeholder text',
99
+ },
100
+ {
101
+ name: 'disabled',
102
+ type: 'boolean',
103
+ required: false,
104
+ description: 'Whether the input is disabled',
105
+ defaultValue: false,
106
+ },
107
+ {
108
+ name: 'error',
109
+ type: 'boolean',
110
+ required: false,
111
+ description: 'Whether the input has an error',
112
+ defaultValue: false,
113
+ },
114
+ {
115
+ name: 'value',
116
+ type: 'string',
117
+ required: false,
118
+ description: 'Input value',
119
+ },
120
+ ],
121
+ tokenBindings: {
122
+ background: 'component.input.background',
123
+ foreground: 'component.input.foreground',
124
+ border: 'component.input.border',
125
+ borderRadius: 'atomic.radius.md',
126
+ padding: 'atomic.spacing.3',
127
+ fontSize: 'atomic.typography.body.fontSize',
128
+ placeholderColor: 'component.input.placeholder',
129
+ focusBorder: 'component.input.focus.border',
130
+ focusRing: 'component.input.focus.ring',
131
+ errorBorder: 'component.input.error.border',
132
+ errorRing: 'component.input.error.ring',
133
+ disabledBackground: 'component.input.disabled.background',
134
+ disabledForeground: 'component.input.disabled.foreground',
135
+ },
136
+ a11y: {
137
+ role: 'textbox',
138
+ wcag: 'WCAG 2.1 AA',
139
+ ariaAttributes: ['aria-label', 'aria-describedby', 'aria-invalid', 'aria-required'],
140
+ keyboard: ['Tab', 'Shift+Tab', 'Escape'],
141
+ focus: 'Visible focus ring with component.input.focus.ring',
142
+ screenReader: 'Announces label, value, and error state',
143
+ },
144
+ };
145
+ /**
146
+ * Text Component Schema
147
+ */
148
+ const TextSchema = {
149
+ type: 'Text',
150
+ category: 'primitive',
151
+ description: 'Text display component with semantic styling',
152
+ props: [
153
+ {
154
+ name: 'variant',
155
+ type: 'string',
156
+ required: false,
157
+ description: 'Text semantic variant',
158
+ defaultValue: 'body',
159
+ options: ['body', 'caption', 'label', 'code'],
160
+ },
161
+ {
162
+ name: 'size',
163
+ type: 'string',
164
+ required: false,
165
+ description: 'Text size',
166
+ defaultValue: 'medium',
167
+ options: ['small', 'medium', 'large'],
168
+ },
169
+ {
170
+ name: 'color',
171
+ type: 'string',
172
+ required: false,
173
+ description: 'Text color semantic',
174
+ defaultValue: 'primary',
175
+ options: ['primary', 'secondary', 'muted', 'accent', 'inverse'],
176
+ },
177
+ {
178
+ name: 'children',
179
+ type: 'ReactNode',
180
+ required: true,
181
+ description: 'Text content',
182
+ },
183
+ ],
184
+ tokenBindings: {
185
+ color: 'semantic.foreground.{color}',
186
+ fontSize: 'atomic.typography.{variant}.fontSize',
187
+ lineHeight: 'atomic.typography.{variant}.lineHeight',
188
+ fontWeight: 'atomic.typography.{variant}.fontWeight',
189
+ },
190
+ a11y: {
191
+ role: 'text',
192
+ wcag: 'WCAG 2.1 AA',
193
+ ariaAttributes: ['aria-label'],
194
+ focus: 'Not focusable unless interactive',
195
+ screenReader: 'Reads text content naturally',
196
+ },
197
+ };
198
+ /**
199
+ * Heading Component Schema
200
+ */
201
+ const HeadingSchema = {
202
+ type: 'Heading',
203
+ category: 'primitive',
204
+ description: 'Heading component for hierarchical text structure',
205
+ props: [
206
+ {
207
+ name: 'level',
208
+ type: 'number',
209
+ required: false,
210
+ description: 'Heading level (h1-h6)',
211
+ defaultValue: 1,
212
+ options: ['1', '2', '3', '4', '5', '6'],
213
+ },
214
+ {
215
+ name: 'size',
216
+ type: 'string',
217
+ required: false,
218
+ description: 'Visual size (can differ from semantic level)',
219
+ defaultValue: 'xl',
220
+ options: ['sm', 'md', 'lg', 'xl', '2xl', '3xl'],
221
+ },
222
+ {
223
+ name: 'children',
224
+ type: 'ReactNode',
225
+ required: true,
226
+ description: 'Heading content',
227
+ },
228
+ ],
229
+ tokenBindings: {
230
+ color: 'semantic.foreground.primary',
231
+ fontSize: 'atomic.typography.heading{size}.fontSize',
232
+ lineHeight: 'atomic.typography.heading{size}.lineHeight',
233
+ fontWeight: 'atomic.typography.heading{size}.fontWeight',
234
+ marginBottom: 'atomic.spacing.4',
235
+ },
236
+ a11y: {
237
+ role: 'heading',
238
+ wcag: 'WCAG 2.1 AA',
239
+ ariaAttributes: ['aria-level'],
240
+ focus: 'Not focusable',
241
+ screenReader: 'Announces as heading with level',
242
+ },
243
+ };
244
+ /**
245
+ * Checkbox Component Schema
246
+ */
247
+ const CheckboxSchema = {
248
+ type: 'Checkbox',
249
+ category: 'primitive',
250
+ description: 'Checkbox input for boolean selections',
251
+ props: [
252
+ {
253
+ name: 'checked',
254
+ type: 'boolean',
255
+ required: false,
256
+ description: 'Checked state',
257
+ defaultValue: false,
258
+ },
259
+ {
260
+ name: 'disabled',
261
+ type: 'boolean',
262
+ required: false,
263
+ description: 'Disabled state',
264
+ defaultValue: false,
265
+ },
266
+ {
267
+ name: 'label',
268
+ type: 'string',
269
+ required: false,
270
+ description: 'Checkbox label',
271
+ },
272
+ ],
273
+ tokenBindings: {
274
+ background: 'semantic.surface.primary',
275
+ border: 'semantic.border.default',
276
+ checkedBackground: 'semantic.foreground.accent',
277
+ checkedBorder: 'semantic.foreground.accent',
278
+ checkmarkColor: 'semantic.foreground.inverse',
279
+ focusRing: 'semantic.border.focus',
280
+ disabledBackground: 'semantic.background.muted',
281
+ disabledBorder: 'semantic.border.muted',
282
+ },
283
+ a11y: {
284
+ role: 'checkbox',
285
+ wcag: 'WCAG 2.1 AA',
286
+ ariaAttributes: ['aria-checked', 'aria-disabled', 'aria-labelledby'],
287
+ keyboard: ['Space', 'Tab'],
288
+ focus: 'Visible focus ring with semantic.border.focus',
289
+ screenReader: 'Announces label and checked state',
290
+ },
291
+ };
292
+ /**
293
+ * Radio Component Schema
294
+ */
295
+ const RadioSchema = {
296
+ type: 'Radio',
297
+ category: 'primitive',
298
+ description: 'Radio input for mutually exclusive selections',
299
+ props: [
300
+ {
301
+ name: 'checked',
302
+ type: 'boolean',
303
+ required: false,
304
+ description: 'Checked state',
305
+ defaultValue: false,
306
+ },
307
+ {
308
+ name: 'disabled',
309
+ type: 'boolean',
310
+ required: false,
311
+ description: 'Disabled state',
312
+ defaultValue: false,
313
+ },
314
+ {
315
+ name: 'label',
316
+ type: 'string',
317
+ required: false,
318
+ description: 'Radio label',
319
+ },
320
+ {
321
+ name: 'name',
322
+ type: 'string',
323
+ required: true,
324
+ description: 'Radio group name',
325
+ },
326
+ ],
327
+ tokenBindings: {
328
+ background: 'semantic.surface.primary',
329
+ border: 'semantic.border.default',
330
+ checkedBackground: 'semantic.foreground.accent',
331
+ checkedBorder: 'semantic.foreground.accent',
332
+ dotColor: 'semantic.foreground.inverse',
333
+ focusRing: 'semantic.border.focus',
334
+ disabledBackground: 'semantic.background.muted',
335
+ disabledBorder: 'semantic.border.muted',
336
+ },
337
+ a11y: {
338
+ role: 'radio',
339
+ wcag: 'WCAG 2.1 AA',
340
+ ariaAttributes: ['aria-checked', 'aria-disabled', 'aria-labelledby'],
341
+ keyboard: ['Space', 'Arrow keys', 'Tab'],
342
+ focus: 'Visible focus ring, keyboard navigation within group',
343
+ screenReader: 'Announces label, checked state, and position in group',
344
+ },
345
+ };
346
+ /**
347
+ * Switch Component Schema
348
+ */
349
+ const SwitchSchema = {
350
+ type: 'Switch',
351
+ category: 'primitive',
352
+ description: 'Toggle switch for boolean settings',
353
+ props: [
354
+ {
355
+ name: 'checked',
356
+ type: 'boolean',
357
+ required: false,
358
+ description: 'Checked state',
359
+ defaultValue: false,
360
+ },
361
+ {
362
+ name: 'disabled',
363
+ type: 'boolean',
364
+ required: false,
365
+ description: 'Disabled state',
366
+ defaultValue: false,
367
+ },
368
+ {
369
+ name: 'label',
370
+ type: 'string',
371
+ required: false,
372
+ description: 'Switch label',
373
+ },
374
+ ],
375
+ tokenBindings: {
376
+ trackBackground: 'semantic.background.muted',
377
+ trackCheckedBackground: 'semantic.foreground.accent',
378
+ thumbBackground: 'semantic.surface.primary',
379
+ thumbShadow: 'atomic.shadow.sm',
380
+ focusRing: 'semantic.border.focus',
381
+ disabledTrackBackground: 'semantic.background.muted',
382
+ disabledThumbBackground: 'semantic.surface.secondary',
383
+ },
384
+ a11y: {
385
+ role: 'switch',
386
+ wcag: 'WCAG 2.1 AA',
387
+ ariaAttributes: ['aria-checked', 'aria-disabled', 'aria-labelledby'],
388
+ keyboard: ['Space', 'Tab'],
389
+ focus: 'Visible focus ring with semantic.border.focus',
390
+ screenReader: 'Announces as switch with on/off state',
391
+ },
392
+ };
393
+ /**
394
+ * Slider Component Schema
395
+ */
396
+ const SliderSchema = {
397
+ type: 'Slider',
398
+ category: 'primitive',
399
+ description: 'Slider input for selecting a value from a range',
400
+ props: [
401
+ {
402
+ name: 'value',
403
+ type: 'number',
404
+ required: false,
405
+ description: 'Current value',
406
+ defaultValue: 0,
407
+ },
408
+ {
409
+ name: 'min',
410
+ type: 'number',
411
+ required: false,
412
+ description: 'Minimum value',
413
+ defaultValue: 0,
414
+ },
415
+ {
416
+ name: 'max',
417
+ type: 'number',
418
+ required: false,
419
+ description: 'Maximum value',
420
+ defaultValue: 100,
421
+ },
422
+ {
423
+ name: 'step',
424
+ type: 'number',
425
+ required: false,
426
+ description: 'Step increment',
427
+ defaultValue: 1,
428
+ },
429
+ {
430
+ name: 'disabled',
431
+ type: 'boolean',
432
+ required: false,
433
+ description: 'Disabled state',
434
+ defaultValue: false,
435
+ },
436
+ ],
437
+ tokenBindings: {
438
+ trackBackground: 'semantic.background.muted',
439
+ trackFillBackground: 'semantic.foreground.accent',
440
+ thumbBackground: 'semantic.surface.primary',
441
+ thumbBorder: 'semantic.border.default',
442
+ thumbShadow: 'atomic.shadow.md',
443
+ focusRing: 'semantic.border.focus',
444
+ disabledTrackBackground: 'semantic.background.muted',
445
+ disabledThumbBackground: 'semantic.surface.secondary',
446
+ },
447
+ a11y: {
448
+ role: 'slider',
449
+ wcag: 'WCAG 2.1 AA',
450
+ ariaAttributes: ['aria-valuenow', 'aria-valuemin', 'aria-valuemax', 'aria-disabled'],
451
+ keyboard: ['Arrow keys', 'Home', 'End', 'Page Up', 'Page Down'],
452
+ focus: 'Visible focus ring on thumb',
453
+ screenReader: 'Announces current value, min, max, and step',
454
+ },
455
+ };
456
+ /**
457
+ * Badge Component Schema
458
+ */
459
+ const BadgeSchema = {
460
+ type: 'Badge',
461
+ category: 'primitive',
462
+ description: 'Small status or label indicator',
463
+ props: [
464
+ {
465
+ name: 'variant',
466
+ type: 'string',
467
+ required: false,
468
+ description: 'Badge style variant',
469
+ defaultValue: 'default',
470
+ options: ['default', 'success', 'warning', 'error', 'info'],
471
+ },
472
+ {
473
+ name: 'size',
474
+ type: 'string',
475
+ required: false,
476
+ description: 'Badge size',
477
+ defaultValue: 'medium',
478
+ options: ['small', 'medium', 'large'],
479
+ },
480
+ {
481
+ name: 'children',
482
+ type: 'ReactNode',
483
+ required: true,
484
+ description: 'Badge content',
485
+ },
486
+ ],
487
+ tokenBindings: {
488
+ background: 'semantic.foreground.{variant}',
489
+ foreground: 'semantic.foreground.inverse',
490
+ borderRadius: 'atomic.radius.full',
491
+ paddingX: 'atomic.spacing.{size}',
492
+ paddingY: 'atomic.spacing.1',
493
+ fontSize: 'atomic.typography.caption.fontSize',
494
+ fontWeight: 'atomic.typography.caption.fontWeight',
495
+ },
496
+ a11y: {
497
+ role: 'status',
498
+ wcag: 'WCAG 2.1 AA',
499
+ ariaAttributes: ['aria-label'],
500
+ focus: 'Not focusable',
501
+ screenReader: 'Announces badge content and variant',
502
+ },
503
+ };
504
+ /**
505
+ * Avatar Component Schema
506
+ */
507
+ const AvatarSchema = {
508
+ type: 'Avatar',
509
+ category: 'primitive',
510
+ description: 'User profile image or initials display',
511
+ props: [
512
+ {
513
+ name: 'src',
514
+ type: 'string',
515
+ required: false,
516
+ description: 'Image source URL',
517
+ },
518
+ {
519
+ name: 'alt',
520
+ type: 'string',
521
+ required: true,
522
+ description: 'Alternative text',
523
+ },
524
+ {
525
+ name: 'size',
526
+ type: 'string',
527
+ required: false,
528
+ description: 'Avatar size',
529
+ defaultValue: 'medium',
530
+ options: ['small', 'medium', 'large', 'xl'],
531
+ },
532
+ {
533
+ name: 'fallback',
534
+ type: 'string',
535
+ required: false,
536
+ description: 'Fallback text (initials)',
537
+ },
538
+ ],
539
+ tokenBindings: {
540
+ background: 'semantic.background.muted',
541
+ foreground: 'semantic.foreground.secondary',
542
+ borderRadius: 'atomic.radius.full',
543
+ width: 'atomic.spacing.{size}',
544
+ height: 'atomic.spacing.{size}',
545
+ fontSize: 'atomic.typography.{size}.fontSize',
546
+ },
547
+ a11y: {
548
+ role: 'img',
549
+ wcag: 'WCAG 2.1 AA',
550
+ ariaAttributes: ['aria-label', 'alt'],
551
+ focus: 'Not focusable unless interactive',
552
+ screenReader: 'Announces alt text or fallback',
553
+ },
554
+ };
555
+ // ============================================================================
556
+ // Composed Components [TAG-003]
557
+ // ============================================================================
558
+ /**
559
+ * Card Component Schema
560
+ */
561
+ const CardSchema = {
562
+ type: 'Card',
563
+ category: 'composed',
564
+ description: 'Container for grouped content',
565
+ props: [
566
+ {
567
+ name: 'variant',
568
+ type: 'string',
569
+ required: false,
570
+ description: 'Card style variant',
571
+ defaultValue: 'default',
572
+ options: ['default', 'outlined', 'elevated'],
573
+ },
574
+ {
575
+ name: 'children',
576
+ type: 'ReactNode',
577
+ required: true,
578
+ description: 'Card content',
579
+ },
580
+ ],
581
+ tokenBindings: {
582
+ background: 'component.card.background',
583
+ foreground: 'component.card.foreground',
584
+ border: 'component.card.border',
585
+ borderRadius: 'atomic.radius.lg',
586
+ padding: 'atomic.spacing.4',
587
+ shadow: 'component.card.shadow',
588
+ },
589
+ a11y: {
590
+ role: 'article',
591
+ wcag: 'WCAG 2.1 AA',
592
+ ariaAttributes: ['aria-label'],
593
+ focus: 'Not focusable unless interactive',
594
+ screenReader: 'Announces as card with content',
595
+ },
596
+ };
597
+ /**
598
+ * Modal Component Schema
599
+ */
600
+ const ModalSchema = {
601
+ type: 'Modal',
602
+ category: 'composed',
603
+ description: 'Overlay dialog for focused content',
604
+ props: [
605
+ {
606
+ name: 'open',
607
+ type: 'boolean',
608
+ required: true,
609
+ description: 'Whether modal is open',
610
+ },
611
+ {
612
+ name: 'onClose',
613
+ type: 'function',
614
+ required: true,
615
+ description: 'Close handler',
616
+ },
617
+ {
618
+ name: 'title',
619
+ type: 'string',
620
+ required: false,
621
+ description: 'Modal title',
622
+ },
623
+ {
624
+ name: 'children',
625
+ type: 'ReactNode',
626
+ required: true,
627
+ description: 'Modal content',
628
+ },
629
+ ],
630
+ tokenBindings: {
631
+ overlayBackground: 'semantic.surface.inverse',
632
+ background: 'semantic.surface.primary',
633
+ foreground: 'semantic.foreground.primary',
634
+ border: 'semantic.border.default',
635
+ borderRadius: 'atomic.radius.lg',
636
+ padding: 'atomic.spacing.6',
637
+ shadow: 'atomic.shadow.xl',
638
+ },
639
+ a11y: {
640
+ role: 'dialog',
641
+ wcag: 'WCAG 2.1 AA',
642
+ ariaAttributes: ['aria-modal', 'aria-labelledby', 'aria-describedby'],
643
+ keyboard: ['Escape to close', 'Tab for focus trap'],
644
+ focus: 'Focus trap within modal, returns focus on close',
645
+ screenReader: 'Announces as dialog, reads title and content',
646
+ },
647
+ };
648
+ /**
649
+ * Dropdown Component Schema
650
+ */
651
+ const DropdownSchema = {
652
+ type: 'Dropdown',
653
+ category: 'composed',
654
+ description: 'Contextual menu with selectable options',
655
+ props: [
656
+ {
657
+ name: 'trigger',
658
+ type: 'ReactNode',
659
+ required: true,
660
+ description: 'Trigger element',
661
+ },
662
+ {
663
+ name: 'items',
664
+ type: 'array',
665
+ required: true,
666
+ description: 'Menu items',
667
+ },
668
+ {
669
+ name: 'placement',
670
+ type: 'string',
671
+ required: false,
672
+ description: 'Menu placement',
673
+ defaultValue: 'bottom-start',
674
+ options: ['top', 'bottom', 'left', 'right'],
675
+ },
676
+ ],
677
+ tokenBindings: {
678
+ menuBackground: 'semantic.surface.elevated',
679
+ menuForeground: 'semantic.foreground.primary',
680
+ menuBorder: 'semantic.border.default',
681
+ menuBorderRadius: 'atomic.radius.md',
682
+ menuShadow: 'atomic.shadow.lg',
683
+ itemHoverBackground: 'semantic.background.muted',
684
+ itemActiveBackground: 'semantic.foreground.accent',
685
+ itemPadding: 'atomic.spacing.3',
686
+ },
687
+ a11y: {
688
+ role: 'menu',
689
+ wcag: 'WCAG 2.1 AA',
690
+ ariaAttributes: ['aria-haspopup', 'aria-expanded', 'aria-controls'],
691
+ keyboard: ['Arrow keys', 'Enter', 'Escape', 'Tab'],
692
+ focus: 'Focus management within menu',
693
+ screenReader: 'Announces menu with item count and selection',
694
+ },
695
+ };
696
+ /**
697
+ * Tabs Component Schema
698
+ */
699
+ const TabsSchema = {
700
+ type: 'Tabs',
701
+ category: 'composed',
702
+ description: 'Tabbed content navigation',
703
+ props: [
704
+ {
705
+ name: 'tabs',
706
+ type: 'array',
707
+ required: true,
708
+ description: 'Tab items',
709
+ },
710
+ {
711
+ name: 'defaultTab',
712
+ type: 'string',
713
+ required: false,
714
+ description: 'Default active tab',
715
+ },
716
+ ],
717
+ tokenBindings: {
718
+ tabListBackground: 'semantic.surface.secondary',
719
+ tabListBorder: 'semantic.border.default',
720
+ tabBackground: 'semantic.surface.secondary',
721
+ tabForeground: 'semantic.foreground.secondary',
722
+ tabActiveBackground: 'semantic.surface.primary',
723
+ tabActiveForeground: 'semantic.foreground.primary',
724
+ tabActiveBorder: 'semantic.foreground.accent',
725
+ tabHoverBackground: 'semantic.background.muted',
726
+ tabPadding: 'atomic.spacing.3',
727
+ tabBorderRadius: 'atomic.radius.md',
728
+ },
729
+ a11y: {
730
+ role: 'tablist',
731
+ wcag: 'WCAG 2.1 AA',
732
+ ariaAttributes: ['aria-selected', 'aria-controls', 'aria-labelledby'],
733
+ keyboard: ['Arrow keys', 'Home', 'End', 'Tab'],
734
+ focus: 'Roving tabindex for tab navigation',
735
+ screenReader: 'Announces tab name, selection state, and position',
736
+ },
737
+ };
738
+ /**
739
+ * Link Component Schema
740
+ */
741
+ const LinkSchema = {
742
+ type: 'Link',
743
+ category: 'composed',
744
+ description: 'Hyperlink for navigation',
745
+ props: [
746
+ {
747
+ name: 'href',
748
+ type: 'string',
749
+ required: true,
750
+ description: 'Link destination',
751
+ },
752
+ {
753
+ name: 'external',
754
+ type: 'boolean',
755
+ required: false,
756
+ description: 'Whether link is external',
757
+ defaultValue: false,
758
+ },
759
+ {
760
+ name: 'children',
761
+ type: 'ReactNode',
762
+ required: true,
763
+ description: 'Link content',
764
+ },
765
+ ],
766
+ tokenBindings: {
767
+ color: 'semantic.foreground.accent',
768
+ hoverColor: 'semantic.foreground.primary',
769
+ textDecoration: 'atomic.typography.body.textDecoration',
770
+ focusRing: 'semantic.border.focus',
771
+ },
772
+ a11y: {
773
+ role: 'link',
774
+ wcag: 'WCAG 2.1 AA',
775
+ ariaAttributes: ['aria-label', 'aria-current'],
776
+ keyboard: ['Enter', 'Tab'],
777
+ focus: 'Visible focus ring',
778
+ screenReader: 'Announces as link with destination',
779
+ },
780
+ };
781
+ /**
782
+ * Table Component Schema
783
+ */
784
+ const TableSchema = {
785
+ type: 'Table',
786
+ category: 'composed',
787
+ description: 'Data table for structured information',
788
+ props: [
789
+ {
790
+ name: 'columns',
791
+ type: 'array',
792
+ required: true,
793
+ description: 'Table columns',
794
+ },
795
+ {
796
+ name: 'data',
797
+ type: 'array',
798
+ required: true,
799
+ description: 'Table data',
800
+ },
801
+ {
802
+ name: 'striped',
803
+ type: 'boolean',
804
+ required: false,
805
+ description: 'Striped rows',
806
+ defaultValue: false,
807
+ },
808
+ ],
809
+ tokenBindings: {
810
+ background: 'semantic.surface.primary',
811
+ border: 'semantic.border.default',
812
+ headerBackground: 'semantic.surface.secondary',
813
+ headerForeground: 'semantic.foreground.primary',
814
+ cellForeground: 'semantic.foreground.primary',
815
+ cellPadding: 'atomic.spacing.3',
816
+ stripedBackground: 'semantic.surface.tertiary',
817
+ hoverBackground: 'semantic.background.muted',
818
+ },
819
+ a11y: {
820
+ role: 'table',
821
+ wcag: 'WCAG 2.1 AA',
822
+ ariaAttributes: ['aria-label', 'aria-describedby'],
823
+ keyboard: ['Tab for navigation'],
824
+ focus: 'Focusable cells for interactive content',
825
+ screenReader: 'Announces table with row and column headers',
826
+ },
827
+ };
828
+ /**
829
+ * List Component Schema
830
+ */
831
+ const ListSchema = {
832
+ type: 'List',
833
+ category: 'composed',
834
+ description: 'Ordered or unordered list',
835
+ props: [
836
+ {
837
+ name: 'items',
838
+ type: 'array',
839
+ required: true,
840
+ description: 'List items',
841
+ },
842
+ {
843
+ name: 'ordered',
844
+ type: 'boolean',
845
+ required: false,
846
+ description: 'Whether list is ordered',
847
+ defaultValue: false,
848
+ },
849
+ ],
850
+ tokenBindings: {
851
+ color: 'semantic.foreground.primary',
852
+ markerColor: 'semantic.foreground.secondary',
853
+ spacing: 'atomic.spacing.2',
854
+ fontSize: 'atomic.typography.body.fontSize',
855
+ lineHeight: 'atomic.typography.body.lineHeight',
856
+ },
857
+ a11y: {
858
+ role: 'list',
859
+ wcag: 'WCAG 2.1 AA',
860
+ ariaAttributes: ['aria-label'],
861
+ focus: 'Not focusable unless items are interactive',
862
+ screenReader: 'Announces list with item count',
863
+ },
864
+ };
865
+ /**
866
+ * Image Component Schema
867
+ */
868
+ const ImageSchema = {
869
+ type: 'Image',
870
+ category: 'composed',
871
+ description: 'Image display with loading states',
872
+ props: [
873
+ {
874
+ name: 'src',
875
+ type: 'string',
876
+ required: true,
877
+ description: 'Image source URL',
878
+ },
879
+ {
880
+ name: 'alt',
881
+ type: 'string',
882
+ required: true,
883
+ description: 'Alternative text',
884
+ },
885
+ {
886
+ name: 'aspectRatio',
887
+ type: 'string',
888
+ required: false,
889
+ description: 'Aspect ratio',
890
+ defaultValue: '16/9',
891
+ },
892
+ {
893
+ name: 'loading',
894
+ type: 'string',
895
+ required: false,
896
+ description: 'Loading strategy',
897
+ defaultValue: 'lazy',
898
+ options: ['lazy', 'eager'],
899
+ },
900
+ ],
901
+ tokenBindings: {
902
+ borderRadius: 'atomic.radius.md',
903
+ background: 'semantic.background.muted',
904
+ placeholderBackground: 'semantic.background.muted',
905
+ },
906
+ a11y: {
907
+ role: 'img',
908
+ wcag: 'WCAG 2.1 AA',
909
+ ariaAttributes: ['alt', 'aria-label'],
910
+ focus: 'Not focusable',
911
+ screenReader: 'Announces image with alt text',
912
+ },
913
+ };
914
+ /**
915
+ * Form Component Schema
916
+ */
917
+ const FormSchema = {
918
+ type: 'Form',
919
+ category: 'composed',
920
+ description: 'Form container with validation',
921
+ props: [
922
+ {
923
+ name: 'onSubmit',
924
+ type: 'function',
925
+ required: true,
926
+ description: 'Submit handler',
927
+ },
928
+ {
929
+ name: 'children',
930
+ type: 'ReactNode',
931
+ required: true,
932
+ description: 'Form fields',
933
+ },
934
+ ],
935
+ tokenBindings: {
936
+ spacing: 'atomic.spacing.4',
937
+ labelColor: 'semantic.foreground.primary',
938
+ errorColor: 'semantic.border.error',
939
+ helperColor: 'semantic.foreground.muted',
940
+ },
941
+ a11y: {
942
+ role: 'form',
943
+ wcag: 'WCAG 2.1 AA',
944
+ ariaAttributes: ['aria-label', 'aria-describedby'],
945
+ keyboard: ['Tab', 'Enter for submit'],
946
+ focus: 'Focus management for validation errors',
947
+ screenReader: 'Announces form with labels and errors',
948
+ },
949
+ };
950
+ /**
951
+ * Progress Component Schema
952
+ */
953
+ const ProgressSchema = {
954
+ type: 'Progress',
955
+ category: 'composed',
956
+ description: 'Progress indicator for loading states',
957
+ props: [
958
+ {
959
+ name: 'value',
960
+ type: 'number',
961
+ required: false,
962
+ description: 'Progress value (0-100)',
963
+ },
964
+ {
965
+ name: 'indeterminate',
966
+ type: 'boolean',
967
+ required: false,
968
+ description: 'Indeterminate loading state',
969
+ defaultValue: false,
970
+ },
971
+ {
972
+ name: 'size',
973
+ type: 'string',
974
+ required: false,
975
+ description: 'Progress bar size',
976
+ defaultValue: 'medium',
977
+ options: ['small', 'medium', 'large'],
978
+ },
979
+ ],
980
+ tokenBindings: {
981
+ trackBackground: 'semantic.background.muted',
982
+ fillBackground: 'semantic.foreground.accent',
983
+ height: 'atomic.spacing.{size}',
984
+ borderRadius: 'atomic.radius.full',
985
+ },
986
+ a11y: {
987
+ role: 'progressbar',
988
+ wcag: 'WCAG 2.1 AA',
989
+ ariaAttributes: ['aria-valuenow', 'aria-valuemin', 'aria-valuemax', 'aria-label'],
990
+ focus: 'Not focusable',
991
+ screenReader: 'Announces progress percentage or indeterminate state',
992
+ },
993
+ };
994
+ // ============================================================================
995
+ // Component Registry
996
+ // ============================================================================
997
+ /**
998
+ * All primitive components (10)
999
+ */
1000
+ export const PRIMITIVE_COMPONENTS = [
1001
+ ButtonSchema,
1002
+ InputSchema,
1003
+ TextSchema,
1004
+ HeadingSchema,
1005
+ CheckboxSchema,
1006
+ RadioSchema,
1007
+ SwitchSchema,
1008
+ SliderSchema,
1009
+ BadgeSchema,
1010
+ AvatarSchema,
1011
+ ];
1012
+ /**
1013
+ * All composed components (10)
1014
+ */
1015
+ export const COMPOSED_COMPONENTS = [
1016
+ CardSchema,
1017
+ ModalSchema,
1018
+ DropdownSchema,
1019
+ TabsSchema,
1020
+ LinkSchema,
1021
+ TableSchema,
1022
+ ListSchema,
1023
+ ImageSchema,
1024
+ FormSchema,
1025
+ ProgressSchema,
1026
+ ];
1027
+ /**
1028
+ * All components registry (20 total)
1029
+ */
1030
+ export const ALL_COMPONENTS = [...PRIMITIVE_COMPONENTS, ...COMPOSED_COMPONENTS];
1031
+ /**
1032
+ * Get component schema by type
1033
+ */
1034
+ export function getComponentSchema(type) {
1035
+ return ALL_COMPONENTS.find(c => c.type === type);
1036
+ }
1037
+ //# sourceMappingURL=component-schemas.js.map