@ankhorage/zora 1.3.0 → 1.4.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 (339) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +135 -0
  3. package/dist/components/app-bar/meta.d.ts +9 -0
  4. package/dist/components/app-bar/meta.d.ts.map +1 -0
  5. package/dist/components/app-bar/meta.js +9 -0
  6. package/dist/components/app-bar/meta.js.map +1 -0
  7. package/dist/components/avatar/meta.d.ts +9 -0
  8. package/dist/components/avatar/meta.d.ts.map +1 -0
  9. package/dist/components/avatar/meta.js +9 -0
  10. package/dist/components/avatar/meta.js.map +1 -0
  11. package/dist/components/avatar-group/meta.d.ts +9 -0
  12. package/dist/components/avatar-group/meta.d.ts.map +1 -0
  13. package/dist/components/avatar-group/meta.js +9 -0
  14. package/dist/components/avatar-group/meta.js.map +1 -0
  15. package/dist/components/badge/meta.d.ts +9 -0
  16. package/dist/components/badge/meta.d.ts.map +1 -0
  17. package/dist/components/badge/meta.js +9 -0
  18. package/dist/components/badge/meta.js.map +1 -0
  19. package/dist/components/button/meta.d.ts +45 -0
  20. package/dist/components/button/meta.d.ts.map +1 -0
  21. package/dist/components/button/meta.js +45 -0
  22. package/dist/components/button/meta.js.map +1 -0
  23. package/dist/components/card/meta.d.ts +44 -0
  24. package/dist/components/card/meta.d.ts.map +1 -0
  25. package/dist/components/card/meta.js +45 -0
  26. package/dist/components/card/meta.js.map +1 -0
  27. package/dist/components/checkbox/meta.d.ts +17 -0
  28. package/dist/components/checkbox/meta.d.ts.map +1 -0
  29. package/dist/components/checkbox/meta.js +17 -0
  30. package/dist/components/checkbox/meta.js.map +1 -0
  31. package/dist/components/chip/meta.d.ts +9 -0
  32. package/dist/components/chip/meta.d.ts.map +1 -0
  33. package/dist/components/chip/meta.js +9 -0
  34. package/dist/components/chip/meta.js.map +1 -0
  35. package/dist/components/chip-group/meta.d.ts +9 -0
  36. package/dist/components/chip-group/meta.d.ts.map +1 -0
  37. package/dist/components/chip-group/meta.js +9 -0
  38. package/dist/components/chip-group/meta.js.map +1 -0
  39. package/dist/components/drawer/meta.d.ts +9 -0
  40. package/dist/components/drawer/meta.d.ts.map +1 -0
  41. package/dist/components/drawer/meta.js +9 -0
  42. package/dist/components/drawer/meta.js.map +1 -0
  43. package/dist/components/form/meta.d.ts +79 -0
  44. package/dist/components/form/meta.d.ts.map +1 -0
  45. package/dist/components/form/meta.js +79 -0
  46. package/dist/components/form/meta.js.map +1 -0
  47. package/dist/components/heading/meta.d.ts +69 -0
  48. package/dist/components/heading/meta.d.ts.map +1 -0
  49. package/dist/components/heading/meta.js +66 -0
  50. package/dist/components/heading/meta.js.map +1 -0
  51. package/dist/components/icon/meta.d.ts +9 -0
  52. package/dist/components/icon/meta.d.ts.map +1 -0
  53. package/dist/components/icon/meta.js +9 -0
  54. package/dist/components/icon/meta.js.map +1 -0
  55. package/dist/components/icon-button/meta.d.ts +9 -0
  56. package/dist/components/icon-button/meta.d.ts.map +1 -0
  57. package/dist/components/icon-button/meta.js +9 -0
  58. package/dist/components/icon-button/meta.js.map +1 -0
  59. package/dist/components/image/meta.d.ts +9 -0
  60. package/dist/components/image/meta.d.ts.map +1 -0
  61. package/dist/components/image/meta.js +9 -0
  62. package/dist/components/image/meta.js.map +1 -0
  63. package/dist/components/input/meta.d.ts +45 -0
  64. package/dist/components/input/meta.d.ts.map +1 -0
  65. package/dist/components/input/meta.js +45 -0
  66. package/dist/components/input/meta.js.map +1 -0
  67. package/dist/components/media-card/meta.d.ts +9 -0
  68. package/dist/components/media-card/meta.d.ts.map +1 -0
  69. package/dist/components/media-card/meta.js +9 -0
  70. package/dist/components/media-card/meta.js.map +1 -0
  71. package/dist/components/metric-card/meta.d.ts +9 -0
  72. package/dist/components/metric-card/meta.d.ts.map +1 -0
  73. package/dist/components/metric-card/meta.js +9 -0
  74. package/dist/components/metric-card/meta.js.map +1 -0
  75. package/dist/components/modal/meta.d.ts +9 -0
  76. package/dist/components/modal/meta.d.ts.map +1 -0
  77. package/dist/components/modal/meta.js +9 -0
  78. package/dist/components/modal/meta.js.map +1 -0
  79. package/dist/components/navigation-item/meta.d.ts +9 -0
  80. package/dist/components/navigation-item/meta.d.ts.map +1 -0
  81. package/dist/components/navigation-item/meta.js +9 -0
  82. package/dist/components/navigation-item/meta.js.map +1 -0
  83. package/dist/components/navigation-list/meta.d.ts +9 -0
  84. package/dist/components/navigation-list/meta.d.ts.map +1 -0
  85. package/dist/components/navigation-list/meta.js +9 -0
  86. package/dist/components/navigation-list/meta.js.map +1 -0
  87. package/dist/components/progress/meta.d.ts +9 -0
  88. package/dist/components/progress/meta.d.ts.map +1 -0
  89. package/dist/components/progress/meta.js +9 -0
  90. package/dist/components/progress/meta.js.map +1 -0
  91. package/dist/components/radio/meta.d.ts +17 -0
  92. package/dist/components/radio/meta.d.ts.map +1 -0
  93. package/dist/components/radio/meta.js +17 -0
  94. package/dist/components/radio/meta.js.map +1 -0
  95. package/dist/components/rating/meta.d.ts +9 -0
  96. package/dist/components/rating/meta.d.ts.map +1 -0
  97. package/dist/components/rating/meta.js +9 -0
  98. package/dist/components/rating/meta.js.map +1 -0
  99. package/dist/components/search-bar/meta.d.ts +9 -0
  100. package/dist/components/search-bar/meta.d.ts.map +1 -0
  101. package/dist/components/search-bar/meta.js +9 -0
  102. package/dist/components/search-bar/meta.js.map +1 -0
  103. package/dist/components/select/meta.d.ts +9 -0
  104. package/dist/components/select/meta.d.ts.map +1 -0
  105. package/dist/components/select/meta.js +9 -0
  106. package/dist/components/select/meta.js.map +1 -0
  107. package/dist/components/tabs/meta.d.ts +9 -0
  108. package/dist/components/tabs/meta.d.ts.map +1 -0
  109. package/dist/components/tabs/meta.js +9 -0
  110. package/dist/components/tabs/meta.js.map +1 -0
  111. package/dist/components/text/meta.d.ts +71 -0
  112. package/dist/components/text/meta.d.ts.map +1 -0
  113. package/dist/components/text/meta.js +68 -0
  114. package/dist/components/text/meta.js.map +1 -0
  115. package/dist/components/textarea/meta.d.ts +45 -0
  116. package/dist/components/textarea/meta.d.ts.map +1 -0
  117. package/dist/components/textarea/meta.js +45 -0
  118. package/dist/components/textarea/meta.js.map +1 -0
  119. package/dist/components/toolbar/meta.d.ts +17 -0
  120. package/dist/components/toolbar/meta.d.ts.map +1 -0
  121. package/dist/components/toolbar/meta.js +17 -0
  122. package/dist/components/toolbar/meta.js.map +1 -0
  123. package/dist/foundation/meta.d.ts +93 -0
  124. package/dist/foundation/meta.d.ts.map +1 -0
  125. package/dist/foundation/meta.js +84 -0
  126. package/dist/foundation/meta.js.map +1 -0
  127. package/dist/index.d.ts +2 -0
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +1 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/layout/app-shell/meta.d.ts +9 -0
  132. package/dist/layout/app-shell/meta.d.ts.map +1 -0
  133. package/dist/layout/app-shell/meta.js +9 -0
  134. package/dist/layout/app-shell/meta.js.map +1 -0
  135. package/dist/layout/auth-layout/meta.d.ts +33 -0
  136. package/dist/layout/auth-layout/meta.d.ts.map +1 -0
  137. package/dist/layout/auth-layout/meta.js +34 -0
  138. package/dist/layout/auth-layout/meta.js.map +1 -0
  139. package/dist/layout/page/meta.d.ts +19 -0
  140. package/dist/layout/page/meta.d.ts.map +1 -0
  141. package/dist/layout/page/meta.js +20 -0
  142. package/dist/layout/page/meta.js.map +1 -0
  143. package/dist/layout/page-header/meta.d.ts +38 -0
  144. package/dist/layout/page-header/meta.d.ts.map +1 -0
  145. package/dist/layout/page-header/meta.js +38 -0
  146. package/dist/layout/page-header/meta.js.map +1 -0
  147. package/dist/layout/page-section/meta.d.ts +28 -0
  148. package/dist/layout/page-section/meta.d.ts.map +1 -0
  149. package/dist/layout/page-section/meta.js +29 -0
  150. package/dist/layout/page-section/meta.js.map +1 -0
  151. package/dist/layout/settings-layout/meta.d.ts +9 -0
  152. package/dist/layout/settings-layout/meta.d.ts.map +1 -0
  153. package/dist/layout/settings-layout/meta.js +9 -0
  154. package/dist/layout/settings-layout/meta.js.map +1 -0
  155. package/dist/layout/sidebar-layout/meta.d.ts +9 -0
  156. package/dist/layout/sidebar-layout/meta.d.ts.map +1 -0
  157. package/dist/layout/sidebar-layout/meta.js +9 -0
  158. package/dist/layout/sidebar-layout/meta.js.map +1 -0
  159. package/dist/layout/topbar-layout/meta.d.ts +9 -0
  160. package/dist/layout/topbar-layout/meta.d.ts.map +1 -0
  161. package/dist/layout/topbar-layout/meta.js +9 -0
  162. package/dist/layout/topbar-layout/meta.js.map +1 -0
  163. package/dist/metadata/allowedChildren.d.ts +4 -0
  164. package/dist/metadata/allowedChildren.d.ts.map +1 -0
  165. package/dist/metadata/allowedChildren.js +26 -0
  166. package/dist/metadata/allowedChildren.js.map +1 -0
  167. package/dist/metadata/componentMeta.d.ts +3 -0
  168. package/dist/metadata/componentMeta.d.ts.map +1 -0
  169. package/dist/metadata/componentMeta.js +141 -0
  170. package/dist/metadata/componentMeta.js.map +1 -0
  171. package/dist/metadata/index.d.ts +3 -0
  172. package/dist/metadata/index.d.ts.map +1 -0
  173. package/dist/metadata/index.js +2 -0
  174. package/dist/metadata/index.js.map +1 -0
  175. package/dist/metadata/types.d.ts +49 -0
  176. package/dist/metadata/types.d.ts.map +1 -0
  177. package/dist/metadata/types.js +2 -0
  178. package/dist/metadata/types.js.map +1 -0
  179. package/dist/patterns/auth/meta.d.ts +33 -0
  180. package/dist/patterns/auth/meta.d.ts.map +1 -0
  181. package/dist/patterns/auth/meta.js +34 -0
  182. package/dist/patterns/auth/meta.js.map +1 -0
  183. package/dist/patterns/collection-editor/meta.d.ts +9 -0
  184. package/dist/patterns/collection-editor/meta.d.ts.map +1 -0
  185. package/dist/patterns/collection-editor/meta.js +9 -0
  186. package/dist/patterns/collection-editor/meta.js.map +1 -0
  187. package/dist/patterns/confirm-dialog/meta.d.ts +9 -0
  188. package/dist/patterns/confirm-dialog/meta.d.ts.map +1 -0
  189. package/dist/patterns/confirm-dialog/meta.js +9 -0
  190. package/dist/patterns/confirm-dialog/meta.js.map +1 -0
  191. package/dist/patterns/disclosure-section/meta.d.ts +9 -0
  192. package/dist/patterns/disclosure-section/meta.d.ts.map +1 -0
  193. package/dist/patterns/disclosure-section/meta.js +9 -0
  194. package/dist/patterns/disclosure-section/meta.js.map +1 -0
  195. package/dist/patterns/empty-state/meta.d.ts +33 -0
  196. package/dist/patterns/empty-state/meta.d.ts.map +1 -0
  197. package/dist/patterns/empty-state/meta.js +33 -0
  198. package/dist/patterns/empty-state/meta.js.map +1 -0
  199. package/dist/patterns/filter-bar/meta.d.ts +9 -0
  200. package/dist/patterns/filter-bar/meta.d.ts.map +1 -0
  201. package/dist/patterns/filter-bar/meta.js +9 -0
  202. package/dist/patterns/filter-bar/meta.js.map +1 -0
  203. package/dist/patterns/image-preview/meta.d.ts +9 -0
  204. package/dist/patterns/image-preview/meta.d.ts.map +1 -0
  205. package/dist/patterns/image-preview/meta.js +9 -0
  206. package/dist/patterns/image-preview/meta.js.map +1 -0
  207. package/dist/patterns/image-upload-field/meta.d.ts +9 -0
  208. package/dist/patterns/image-upload-field/meta.d.ts.map +1 -0
  209. package/dist/patterns/image-upload-field/meta.js +9 -0
  210. package/dist/patterns/image-upload-field/meta.js.map +1 -0
  211. package/dist/patterns/inspector-field/meta.d.ts +9 -0
  212. package/dist/patterns/inspector-field/meta.d.ts.map +1 -0
  213. package/dist/patterns/inspector-field/meta.js +9 -0
  214. package/dist/patterns/inspector-field/meta.js.map +1 -0
  215. package/dist/patterns/list/meta.d.ts +25 -0
  216. package/dist/patterns/list/meta.d.ts.map +1 -0
  217. package/dist/patterns/list/meta.js +26 -0
  218. package/dist/patterns/list/meta.js.map +1 -0
  219. package/dist/patterns/notice/meta.d.ts +34 -0
  220. package/dist/patterns/notice/meta.d.ts.map +1 -0
  221. package/dist/patterns/notice/meta.js +35 -0
  222. package/dist/patterns/notice/meta.js.map +1 -0
  223. package/dist/patterns/panel/meta.d.ts +44 -0
  224. package/dist/patterns/panel/meta.d.ts.map +1 -0
  225. package/dist/patterns/panel/meta.js +45 -0
  226. package/dist/patterns/panel/meta.js.map +1 -0
  227. package/dist/patterns/responsive-panel/meta.d.ts +9 -0
  228. package/dist/patterns/responsive-panel/meta.d.ts.map +1 -0
  229. package/dist/patterns/responsive-panel/meta.js +9 -0
  230. package/dist/patterns/responsive-panel/meta.js.map +1 -0
  231. package/dist/patterns/section-header/meta.d.ts +33 -0
  232. package/dist/patterns/section-header/meta.d.ts.map +1 -0
  233. package/dist/patterns/section-header/meta.js +33 -0
  234. package/dist/patterns/section-header/meta.js.map +1 -0
  235. package/dist/patterns/selection/meta.d.ts +17 -0
  236. package/dist/patterns/selection/meta.d.ts.map +1 -0
  237. package/dist/patterns/selection/meta.js +18 -0
  238. package/dist/patterns/selection/meta.js.map +1 -0
  239. package/dist/patterns/settings-row/meta.d.ts +39 -0
  240. package/dist/patterns/settings-row/meta.d.ts.map +1 -0
  241. package/dist/patterns/settings-row/meta.js +39 -0
  242. package/dist/patterns/settings-row/meta.js.map +1 -0
  243. package/dist/patterns/switch-field/meta.d.ts +9 -0
  244. package/dist/patterns/switch-field/meta.d.ts.map +1 -0
  245. package/dist/patterns/switch-field/meta.js +9 -0
  246. package/dist/patterns/switch-field/meta.js.map +1 -0
  247. package/dist/patterns/theme-composer/meta.d.ts +9 -0
  248. package/dist/patterns/theme-composer/meta.d.ts.map +1 -0
  249. package/dist/patterns/theme-composer/meta.js +9 -0
  250. package/dist/patterns/theme-composer/meta.js.map +1 -0
  251. package/dist/patterns/tile-grid/meta.d.ts +17 -0
  252. package/dist/patterns/tile-grid/meta.d.ts.map +1 -0
  253. package/dist/patterns/tile-grid/meta.js +18 -0
  254. package/dist/patterns/tile-grid/meta.js.map +1 -0
  255. package/dist/patterns/timeline/meta.d.ts +9 -0
  256. package/dist/patterns/timeline/meta.d.ts.map +1 -0
  257. package/dist/patterns/timeline/meta.js +9 -0
  258. package/dist/patterns/timeline/meta.js.map +1 -0
  259. package/dist/patterns/tree-view/meta.d.ts +17 -0
  260. package/dist/patterns/tree-view/meta.d.ts.map +1 -0
  261. package/dist/patterns/tree-view/meta.js +18 -0
  262. package/dist/patterns/tree-view/meta.js.map +1 -0
  263. package/dist/patterns/zora-drawer-content/meta.d.ts +9 -0
  264. package/dist/patterns/zora-drawer-content/meta.d.ts.map +1 -0
  265. package/dist/patterns/zora-drawer-content/meta.js +9 -0
  266. package/dist/patterns/zora-drawer-content/meta.js.map +1 -0
  267. package/dist/patterns/zora-tab-bar/meta.d.ts +9 -0
  268. package/dist/patterns/zora-tab-bar/meta.d.ts.map +1 -0
  269. package/dist/patterns/zora-tab-bar/meta.js +9 -0
  270. package/dist/patterns/zora-tab-bar/meta.js.map +1 -0
  271. package/package.json +1 -1
  272. package/src/components/app-bar/meta.ts +10 -0
  273. package/src/components/avatar/meta.ts +10 -0
  274. package/src/components/avatar-group/meta.ts +10 -0
  275. package/src/components/badge/meta.ts +10 -0
  276. package/src/components/button/meta.ts +46 -0
  277. package/src/components/card/meta.ts +46 -0
  278. package/src/components/checkbox/meta.ts +19 -0
  279. package/src/components/chip/meta.ts +10 -0
  280. package/src/components/chip-group/meta.ts +10 -0
  281. package/src/components/drawer/meta.ts +10 -0
  282. package/src/components/form/meta.ts +83 -0
  283. package/src/components/heading/meta.ts +67 -0
  284. package/src/components/icon/meta.ts +10 -0
  285. package/src/components/icon-button/meta.ts +10 -0
  286. package/src/components/image/meta.ts +10 -0
  287. package/src/components/input/meta.ts +46 -0
  288. package/src/components/media-card/meta.ts +10 -0
  289. package/src/components/metric-card/meta.ts +10 -0
  290. package/src/components/modal/meta.ts +10 -0
  291. package/src/components/navigation-item/meta.ts +10 -0
  292. package/src/components/navigation-list/meta.ts +10 -0
  293. package/src/components/progress/meta.ts +10 -0
  294. package/src/components/radio/meta.ts +19 -0
  295. package/src/components/rating/meta.ts +10 -0
  296. package/src/components/search-bar/meta.ts +10 -0
  297. package/src/components/select/meta.ts +10 -0
  298. package/src/components/tabs/meta.ts +10 -0
  299. package/src/components/text/meta.ts +69 -0
  300. package/src/components/textarea/meta.ts +46 -0
  301. package/src/components/toolbar/meta.ts +19 -0
  302. package/src/foundation/meta.ts +85 -0
  303. package/src/index.ts +13 -0
  304. package/src/layout/app-shell/meta.ts +10 -0
  305. package/src/layout/auth-layout/meta.ts +35 -0
  306. package/src/layout/page/meta.ts +21 -0
  307. package/src/layout/page-header/meta.ts +39 -0
  308. package/src/layout/page-section/meta.ts +30 -0
  309. package/src/layout/settings-layout/meta.ts +10 -0
  310. package/src/layout/sidebar-layout/meta.ts +10 -0
  311. package/src/layout/topbar-layout/meta.ts +10 -0
  312. package/src/metadata/allowedChildren.ts +27 -0
  313. package/src/metadata/componentMeta.test.ts +204 -0
  314. package/src/metadata/componentMeta.ts +147 -0
  315. package/src/metadata/index.ts +13 -0
  316. package/src/metadata/types.ts +74 -0
  317. package/src/patterns/auth/meta.ts +39 -0
  318. package/src/patterns/collection-editor/meta.ts +10 -0
  319. package/src/patterns/confirm-dialog/meta.ts +10 -0
  320. package/src/patterns/disclosure-section/meta.ts +10 -0
  321. package/src/patterns/empty-state/meta.ts +34 -0
  322. package/src/patterns/filter-bar/meta.ts +10 -0
  323. package/src/patterns/image-preview/meta.ts +10 -0
  324. package/src/patterns/image-upload-field/meta.ts +10 -0
  325. package/src/patterns/inspector-field/meta.ts +10 -0
  326. package/src/patterns/list/meta.ts +30 -0
  327. package/src/patterns/notice/meta.ts +36 -0
  328. package/src/patterns/panel/meta.ts +46 -0
  329. package/src/patterns/responsive-panel/meta.ts +10 -0
  330. package/src/patterns/section-header/meta.ts +34 -0
  331. package/src/patterns/selection/meta.ts +21 -0
  332. package/src/patterns/settings-row/meta.ts +40 -0
  333. package/src/patterns/switch-field/meta.ts +10 -0
  334. package/src/patterns/theme-composer/meta.ts +10 -0
  335. package/src/patterns/tile-grid/meta.ts +21 -0
  336. package/src/patterns/timeline/meta.ts +10 -0
  337. package/src/patterns/tree-view/meta.ts +21 -0
  338. package/src/patterns/zora-drawer-content/meta.ts +10 -0
  339. package/src/patterns/zora-tab-bar/meta.ts +10 -0
@@ -0,0 +1,204 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+
4
+ import { describe, expect, test } from 'bun:test';
5
+
6
+ import { ZORA_COMPONENT_META } from './componentMeta';
7
+
8
+ const ROOT = process.cwd();
9
+ const SRC_ROOT = join(ROOT, 'src');
10
+
11
+ const INDEX_PATH = join(SRC_ROOT, 'index.ts');
12
+ const THEME_INDEX_PATH = join(SRC_ROOT, 'theme', 'index.ts');
13
+
14
+ function parseReexportBlocks(source: string): { names: string[]; from: string; isType: boolean }[] {
15
+ const pattern = /\bexport\s+(type\s+)?\{([\s\S]*?)\}\s*from\s*['"]([^'"]+)['"]/g;
16
+ const blocks: { names: string[]; from: string; isType: boolean }[] = [];
17
+
18
+ for (const match of source.matchAll(pattern)) {
19
+ const isType = match[1] !== undefined;
20
+ const rawNames = match[2] ?? '';
21
+ const from = match[3] ?? '';
22
+
23
+ const names = rawNames
24
+ .split(',')
25
+ .map((item) => item.trim())
26
+ .filter(Boolean)
27
+ .map((item) =>
28
+ item
29
+ .replace(/^type\s+/, '')
30
+ .split(/\s+as\s+/)[0]
31
+ ?.trim(),
32
+ )
33
+ .filter((item): item is string => Boolean(item));
34
+
35
+ blocks.push({ names, from, isType });
36
+ }
37
+
38
+ return blocks;
39
+ }
40
+
41
+ function readSource(filePath: string): string {
42
+ return readFileSync(filePath, 'utf8');
43
+ }
44
+
45
+ function isComponentExportName(name: string): boolean {
46
+ return /^[A-Z][A-Za-z0-9]*$/.test(name);
47
+ }
48
+
49
+ function isJsonSerializable(value: unknown): boolean {
50
+ if (value === null) return true;
51
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')
52
+ return true;
53
+ if (Array.isArray(value)) return value.every((item) => isJsonSerializable(item));
54
+ if (typeof value !== 'object') return false;
55
+
56
+ const record = value as Record<string, unknown>;
57
+ return Object.values(record).every((item) => isJsonSerializable(item));
58
+ }
59
+
60
+ describe('ZORA_COMPONENT_META public API', () => {
61
+ test('src/index.ts re-exports ZORA_COMPONENT_META', () => {
62
+ const indexSource = readSource(INDEX_PATH);
63
+ expect(indexSource).toContain('ZORA_COMPONENT_META');
64
+ });
65
+ });
66
+
67
+ describe('ZORA_COMPONENT_META registry coverage', () => {
68
+ test('covers every public UI React component export (foundation/components/patterns/layout)', () => {
69
+ // Avoid importing the full src/index.ts barrel here; Bun has been observed to crash when executing
70
+ // module graphs that touch react-native. We do drift checks via static source parsing instead.
71
+ const indexSource = readSource(INDEX_PATH);
72
+ const blocks = parseReexportBlocks(indexSource).filter((block) => !block.isType);
73
+
74
+ const uiComponentNames = new Set(
75
+ blocks
76
+ .filter((block) => {
77
+ return (
78
+ block.from.startsWith('./foundation') ||
79
+ block.from.startsWith('./components') ||
80
+ block.from.startsWith('./patterns') ||
81
+ block.from.startsWith('./layout')
82
+ );
83
+ })
84
+ .flatMap((block) => block.names)
85
+ .filter(isComponentExportName),
86
+ );
87
+
88
+ const registryKeys = new Set(Object.keys(ZORA_COMPONENT_META));
89
+ expect([...uiComponentNames].sort()).toEqual([...registryKeys].sort());
90
+ });
91
+
92
+ test('does not treat providers/scopes as UI component registry entries', () => {
93
+ const indexSource = readSource(INDEX_PATH);
94
+ expect(indexSource).toContain("export * from './theme';");
95
+
96
+ const themeSource = readSource(THEME_INDEX_PATH);
97
+ const themeBlocks = parseReexportBlocks(themeSource).filter((block) => !block.isType);
98
+ const themeValueExports = new Set(
99
+ themeBlocks.flatMap((block) => block.names).filter(isComponentExportName),
100
+ );
101
+
102
+ const providerExports = new Set(['ZoraProvider', 'ZoraThemeScope']);
103
+
104
+ for (const providerExport of providerExports) {
105
+ expect(themeValueExports.has(providerExport)).toBe(true);
106
+ expect(Object.prototype.hasOwnProperty.call(ZORA_COMPONENT_META, providerExport)).toBe(false);
107
+ }
108
+ });
109
+ });
110
+
111
+ describe('ZORA_COMPONENT_META invariants', () => {
112
+ test('every key matches meta.name', () => {
113
+ for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
114
+ expect(meta.name).toBe(key);
115
+ }
116
+ });
117
+
118
+ test('allowedChildren always points to a known direct manifest node', () => {
119
+ for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
120
+ for (const child of meta.allowedChildren) {
121
+ const childMeta = ZORA_COMPONENT_META[child];
122
+ expect(childMeta, `${key} allowedChildren includes unknown key '${child}'`).toBeDefined();
123
+ expect(
124
+ childMeta.directManifestNode,
125
+ `${key} allowedChildren includes non-directManifestNode key '${child}'`,
126
+ ).toBe(true);
127
+ }
128
+ }
129
+ });
130
+
131
+ test('direct manifest node leaf/container rules', () => {
132
+ const expectedLeafNodes = new Set([
133
+ 'PageHeader',
134
+ 'SectionHeader',
135
+ 'SettingsRow',
136
+ 'EmptyState',
137
+ 'Button',
138
+ 'Input',
139
+ 'Textarea',
140
+ 'Text',
141
+ 'Heading',
142
+ 'Divider',
143
+ ]);
144
+
145
+ const expectedContainerNodes = new Set([
146
+ 'FormField',
147
+ 'Page',
148
+ 'PageSection',
149
+ 'AuthLayout',
150
+ 'Card',
151
+ 'Panel',
152
+ 'Notice',
153
+ 'Box',
154
+ 'Stack',
155
+ 'Grid',
156
+ 'Container',
157
+ ]);
158
+
159
+ for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
160
+ if (!meta.directManifestNode) continue;
161
+
162
+ if (expectedLeafNodes.has(key)) {
163
+ expect(meta.allowedChildren.length, `${key} should be a leaf manifest node`).toBe(0);
164
+ continue;
165
+ }
166
+
167
+ if (expectedContainerNodes.has(key)) {
168
+ expect(
169
+ meta.allowedChildren.length,
170
+ `${key} should be a container manifest node`,
171
+ ).toBeGreaterThan(0);
172
+ continue;
173
+ }
174
+
175
+ throw new Error(
176
+ `Direct manifest node '${key}' must be categorized as leaf or container in the test.`,
177
+ );
178
+ }
179
+ });
180
+
181
+ test('non-direct manifest nodes include an explicit note', () => {
182
+ for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
183
+ if (meta.directManifestNode) continue;
184
+
185
+ expect(
186
+ typeof meta.note === 'string' && meta.note.trim().length > 0,
187
+ `${key} must include a note when directManifestNode is false`,
188
+ ).toBe(true);
189
+ }
190
+ });
191
+
192
+ test('registry and blueprints are JSON serializable', () => {
193
+ expect(() => JSON.stringify(ZORA_COMPONENT_META)).not.toThrow();
194
+
195
+ for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
196
+ if (!meta.blueprint?.defaultProps) continue;
197
+
198
+ expect(
199
+ isJsonSerializable(meta.blueprint.defaultProps),
200
+ `${key} blueprint.defaultProps contains a non-serializable value`,
201
+ ).toBe(true);
202
+ }
203
+ });
204
+ });
@@ -0,0 +1,147 @@
1
+ import { appBarMeta } from '../components/app-bar/meta';
2
+ import { avatarMeta } from '../components/avatar/meta';
3
+ import { avatarGroupMeta } from '../components/avatar-group/meta';
4
+ import { badgeMeta } from '../components/badge/meta';
5
+ import { buttonMeta } from '../components/button/meta';
6
+ import { cardMeta } from '../components/card/meta';
7
+ import { checkboxGroupMeta, checkboxMeta } from '../components/checkbox/meta';
8
+ import { chipMeta } from '../components/chip/meta';
9
+ import { chipGroupMeta } from '../components/chip-group/meta';
10
+ import { drawerMeta } from '../components/drawer/meta';
11
+ import { formActionsMeta, formErrorMeta, formFieldMeta, formMeta } from '../components/form/meta';
12
+ import { headingMeta } from '../components/heading/meta';
13
+ import { iconMeta } from '../components/icon/meta';
14
+ import { iconButtonMeta } from '../components/icon-button/meta';
15
+ import { imageMeta } from '../components/image/meta';
16
+ import { inputMeta } from '../components/input/meta';
17
+ import { mediaCardMeta } from '../components/media-card/meta';
18
+ import { metricCardMeta } from '../components/metric-card/meta';
19
+ import { modalMeta } from '../components/modal/meta';
20
+ import { navigationItemMeta } from '../components/navigation-item/meta';
21
+ import { navigationListMeta } from '../components/navigation-list/meta';
22
+ import { progressMeta } from '../components/progress/meta';
23
+ import { radioGroupMeta, radioMeta } from '../components/radio/meta';
24
+ import { ratingMeta } from '../components/rating/meta';
25
+ import { searchBarMeta } from '../components/search-bar/meta';
26
+ import { selectMeta } from '../components/select/meta';
27
+ import { tabsMeta } from '../components/tabs/meta';
28
+ import { textMeta } from '../components/text/meta';
29
+ import { textareaMeta } from '../components/textarea/meta';
30
+ import { toolbarActionMeta, toolbarMeta } from '../components/toolbar/meta';
31
+ import { foundationMetas } from '../foundation/meta';
32
+ import { appShellMeta } from '../layout/app-shell/meta';
33
+ import { authLayoutMeta } from '../layout/auth-layout/meta';
34
+ import { pageMeta } from '../layout/page/meta';
35
+ import { pageHeaderMeta } from '../layout/page-header/meta';
36
+ import { pageSectionMeta } from '../layout/page-section/meta';
37
+ import { settingsLayoutMeta } from '../layout/settings-layout/meta';
38
+ import { sidebarLayoutMeta } from '../layout/sidebar-layout/meta';
39
+ import { topbarLayoutMeta } from '../layout/topbar-layout/meta';
40
+ import {
41
+ forgotPasswordFormMeta,
42
+ otpFormMeta,
43
+ signInFormMeta,
44
+ signUpFormMeta,
45
+ } from '../patterns/auth/meta';
46
+ import { collectionEditorMeta } from '../patterns/collection-editor/meta';
47
+ import { confirmDialogMeta } from '../patterns/confirm-dialog/meta';
48
+ import { disclosureSectionMeta } from '../patterns/disclosure-section/meta';
49
+ import { emptyStateMeta } from '../patterns/empty-state/meta';
50
+ import { filterBarMeta } from '../patterns/filter-bar/meta';
51
+ import { imagePreviewMeta } from '../patterns/image-preview/meta';
52
+ import { imageUploadFieldMeta } from '../patterns/image-upload-field/meta';
53
+ import { inspectorFieldMeta } from '../patterns/inspector-field/meta';
54
+ import { listMeta, listRowMeta, listSectionMeta } from '../patterns/list/meta';
55
+ import { noticeMeta } from '../patterns/notice/meta';
56
+ import { panelMeta } from '../patterns/panel/meta';
57
+ import { responsivePanelMeta } from '../patterns/responsive-panel/meta';
58
+ import { sectionHeaderMeta } from '../patterns/section-header/meta';
59
+ import { selectableItemMeta, selectionProviderMeta } from '../patterns/selection/meta';
60
+ import { settingsRowMeta } from '../patterns/settings-row/meta';
61
+ import { switchFieldMeta } from '../patterns/switch-field/meta';
62
+ import { themeComposerMeta } from '../patterns/theme-composer/meta';
63
+ import { paletteItemMeta, tileGridMeta } from '../patterns/tile-grid/meta';
64
+ import { timelineMeta } from '../patterns/timeline/meta';
65
+ import { treeItemMeta, treeViewMeta } from '../patterns/tree-view/meta';
66
+ import { zoraDrawerContentMeta } from '../patterns/zora-drawer-content/meta';
67
+ import { zoraTabBarMeta } from '../patterns/zora-tab-bar/meta';
68
+ import type { ZoraComponentMetaRegistry } from './types';
69
+
70
+ export const ZORA_COMPONENT_META: ZoraComponentMetaRegistry = {
71
+ ...foundationMetas,
72
+ AppBar: appBarMeta,
73
+ Avatar: avatarMeta,
74
+ AvatarGroup: avatarGroupMeta,
75
+ Badge: badgeMeta,
76
+ Button: buttonMeta,
77
+ Card: cardMeta,
78
+ Checkbox: checkboxMeta,
79
+ CheckboxGroup: checkboxGroupMeta,
80
+ Chip: chipMeta,
81
+ ChipGroup: chipGroupMeta,
82
+ Drawer: drawerMeta,
83
+ Form: formMeta,
84
+ FormActions: formActionsMeta,
85
+ FormError: formErrorMeta,
86
+ FormField: formFieldMeta,
87
+ Heading: headingMeta,
88
+ Icon: iconMeta,
89
+ IconButton: iconButtonMeta,
90
+ Image: imageMeta,
91
+ Input: inputMeta,
92
+ MediaCard: mediaCardMeta,
93
+ MetricCard: metricCardMeta,
94
+ Modal: modalMeta,
95
+ NavigationItem: navigationItemMeta,
96
+ NavigationList: navigationListMeta,
97
+ Progress: progressMeta,
98
+ Radio: radioMeta,
99
+ RadioGroup: radioGroupMeta,
100
+ Rating: ratingMeta,
101
+ SearchBar: searchBarMeta,
102
+ Select: selectMeta,
103
+ Tabs: tabsMeta,
104
+ Text: textMeta,
105
+ Textarea: textareaMeta,
106
+ Toolbar: toolbarMeta,
107
+ ToolbarAction: toolbarActionMeta,
108
+ AppShell: appShellMeta,
109
+ AuthLayout: authLayoutMeta,
110
+ Page: pageMeta,
111
+ PageHeader: pageHeaderMeta,
112
+ PageSection: pageSectionMeta,
113
+ SettingsLayout: settingsLayoutMeta,
114
+ SidebarLayout: sidebarLayoutMeta,
115
+ TopbarLayout: topbarLayoutMeta,
116
+ ForgotPasswordForm: forgotPasswordFormMeta,
117
+ OtpForm: otpFormMeta,
118
+ SignInForm: signInFormMeta,
119
+ SignUpForm: signUpFormMeta,
120
+ CollectionEditor: collectionEditorMeta,
121
+ ConfirmDialog: confirmDialogMeta,
122
+ DisclosureSection: disclosureSectionMeta,
123
+ EmptyState: emptyStateMeta,
124
+ FilterBar: filterBarMeta,
125
+ ImagePreview: imagePreviewMeta,
126
+ ImageUploadField: imageUploadFieldMeta,
127
+ InspectorField: inspectorFieldMeta,
128
+ List: listMeta,
129
+ ListRow: listRowMeta,
130
+ ListSection: listSectionMeta,
131
+ Notice: noticeMeta,
132
+ Panel: panelMeta,
133
+ ResponsivePanel: responsivePanelMeta,
134
+ SectionHeader: sectionHeaderMeta,
135
+ SelectableItem: selectableItemMeta,
136
+ SelectionProvider: selectionProviderMeta,
137
+ SettingsRow: settingsRowMeta,
138
+ SwitchField: switchFieldMeta,
139
+ ThemeComposer: themeComposerMeta,
140
+ PaletteItem: paletteItemMeta,
141
+ TileGrid: tileGridMeta,
142
+ Timeline: timelineMeta,
143
+ TreeItem: treeItemMeta,
144
+ TreeView: treeViewMeta,
145
+ ZoraDrawerContent: zoraDrawerContentMeta,
146
+ ZoraTabBar: zoraTabBarMeta,
147
+ };
@@ -0,0 +1,13 @@
1
+ export { ZORA_COMPONENT_META } from './componentMeta';
2
+ export type {
3
+ ZoraComponentBlueprint,
4
+ ZoraComponentCategory,
5
+ ZoraComponentI18nMeta,
6
+ ZoraComponentMeta,
7
+ ZoraComponentMetaRegistry,
8
+ ZoraComponentPropArrayItemSchema,
9
+ ZoraComponentPropSchema,
10
+ ZoraComponentPropType,
11
+ ZoraComponentPropValue,
12
+ ZoraComponentSlotMeta,
13
+ } from './types';
@@ -0,0 +1,74 @@
1
+ export type ZoraComponentCategory = 'foundation' | 'component' | 'pattern' | 'layout';
2
+
3
+ export type ZoraComponentPropType =
4
+ | 'string'
5
+ | 'number'
6
+ | 'boolean'
7
+ | 'enum'
8
+ | 'color'
9
+ | 'spacing'
10
+ | 'radius'
11
+ | 'shadow'
12
+ | 'typographySize'
13
+ | 'typographyWeight'
14
+ | 'action'
15
+ | 'imageAsset'
16
+ | 'array';
17
+
18
+ export type ZoraComponentPropValue =
19
+ | string
20
+ | number
21
+ | boolean
22
+ | null
23
+ | readonly ZoraComponentPropValue[]
24
+ | { readonly [key: string]: ZoraComponentPropValue };
25
+
26
+ export interface ZoraComponentPropArrayItemSchema {
27
+ key: string;
28
+ schema: ZoraComponentPropSchema;
29
+ }
30
+
31
+ export interface ZoraComponentPropSchema {
32
+ type: ZoraComponentPropType;
33
+ category: string;
34
+ label?: string;
35
+ enum?: readonly (string | number)[];
36
+ default?: ZoraComponentPropValue;
37
+ itemSchema?: readonly ZoraComponentPropArrayItemSchema[];
38
+ }
39
+
40
+ export interface ZoraComponentBlueprint {
41
+ label: string;
42
+ icon?: {
43
+ name: string;
44
+ provider?: string;
45
+ };
46
+ defaultProps?: Readonly<Record<string, ZoraComponentPropValue>>;
47
+ }
48
+
49
+ export interface ZoraComponentI18nMeta {
50
+ fields: readonly {
51
+ keyProp: string;
52
+ defaultTextProp: string;
53
+ }[];
54
+ }
55
+
56
+ export interface ZoraComponentSlotMeta {
57
+ label?: string;
58
+ allowedChildren?: readonly string[];
59
+ }
60
+
61
+ export interface ZoraComponentMeta {
62
+ name: string;
63
+ category: ZoraComponentCategory;
64
+ description?: string;
65
+ directManifestNode: boolean;
66
+ allowedChildren: readonly string[];
67
+ blueprint?: ZoraComponentBlueprint;
68
+ i18n?: ZoraComponentI18nMeta;
69
+ slots?: Readonly<Record<string, ZoraComponentSlotMeta>>;
70
+ note?: string;
71
+ props: Readonly<Record<string, ZoraComponentPropSchema>>;
72
+ }
73
+
74
+ export type ZoraComponentMetaRegistry = Readonly<Record<string, ZoraComponentMeta>>;
@@ -0,0 +1,39 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ const AUTH_NOTE = 'Auth pattern component; not represented as a manifest node in v1.';
4
+
5
+ export const forgotPasswordFormMeta = {
6
+ name: 'ForgotPasswordForm',
7
+ category: 'pattern',
8
+ directManifestNode: false,
9
+ allowedChildren: [],
10
+ note: AUTH_NOTE,
11
+ props: {},
12
+ } as const satisfies ZoraComponentMeta;
13
+
14
+ export const otpFormMeta = {
15
+ name: 'OtpForm',
16
+ category: 'pattern',
17
+ directManifestNode: false,
18
+ allowedChildren: [],
19
+ note: AUTH_NOTE,
20
+ props: {},
21
+ } as const satisfies ZoraComponentMeta;
22
+
23
+ export const signInFormMeta = {
24
+ name: 'SignInForm',
25
+ category: 'pattern',
26
+ directManifestNode: false,
27
+ allowedChildren: [],
28
+ note: AUTH_NOTE,
29
+ props: {},
30
+ } as const satisfies ZoraComponentMeta;
31
+
32
+ export const signUpFormMeta = {
33
+ name: 'SignUpForm',
34
+ category: 'pattern',
35
+ directManifestNode: false,
36
+ allowedChildren: [],
37
+ note: AUTH_NOTE,
38
+ props: {},
39
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,10 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ export const collectionEditorMeta = {
4
+ name: 'CollectionEditor',
5
+ category: 'pattern',
6
+ directManifestNode: false,
7
+ allowedChildren: [],
8
+ note: 'Specialized editing pattern; not represented as a manifest node in v1.',
9
+ props: {},
10
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,10 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ export const confirmDialogMeta = {
4
+ name: 'ConfirmDialog',
5
+ category: 'pattern',
6
+ directManifestNode: false,
7
+ allowedChildren: [],
8
+ note: 'Dialog pattern; not represented as a manifest node in v1.',
9
+ props: {},
10
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,10 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ export const disclosureSectionMeta = {
4
+ name: 'DisclosureSection',
5
+ category: 'pattern',
6
+ directManifestNode: false,
7
+ allowedChildren: [],
8
+ note: 'Disclosure pattern; not represented as a manifest node in v1.',
9
+ props: {},
10
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,34 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ export const emptyStateMeta = {
4
+ name: 'EmptyState',
5
+ category: 'pattern',
6
+ directManifestNode: true,
7
+ allowedChildren: [],
8
+ blueprint: {
9
+ label: 'Empty state',
10
+ defaultProps: {
11
+ title: 'Nothing here yet',
12
+ description: 'Try adding your first item.',
13
+ },
14
+ },
15
+ props: {
16
+ title: {
17
+ type: 'string',
18
+ category: 'Content',
19
+ label: 'Title',
20
+ default: 'Nothing here yet',
21
+ },
22
+ description: {
23
+ type: 'string',
24
+ category: 'Content',
25
+ label: 'Description',
26
+ default: 'Try adding your first item.',
27
+ },
28
+ eyebrow: {
29
+ type: 'string',
30
+ category: 'Content',
31
+ label: 'Eyebrow',
32
+ },
33
+ },
34
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,10 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ export const filterBarMeta = {
4
+ name: 'FilterBar',
5
+ category: 'pattern',
6
+ directManifestNode: false,
7
+ allowedChildren: [],
8
+ note: 'Filtering pattern; not represented as a manifest node in v1.',
9
+ props: {},
10
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,10 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ export const imagePreviewMeta = {
4
+ name: 'ImagePreview',
5
+ category: 'pattern',
6
+ directManifestNode: false,
7
+ allowedChildren: [],
8
+ note: 'Media pattern; not represented as a manifest node in v1.',
9
+ props: {},
10
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,10 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ export const imageUploadFieldMeta = {
4
+ name: 'ImageUploadField',
5
+ category: 'pattern',
6
+ directManifestNode: false,
7
+ allowedChildren: [],
8
+ note: 'Media upload pattern; not represented as a manifest node in v1.',
9
+ props: {},
10
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,10 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ export const inspectorFieldMeta = {
4
+ name: 'InspectorField',
5
+ category: 'pattern',
6
+ directManifestNode: false,
7
+ allowedChildren: [],
8
+ note: 'Inspector pattern; not represented as a manifest node in v1.',
9
+ props: {},
10
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,30 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+
3
+ const LIST_NOTE = 'List pattern component; not represented as a manifest node in v1.';
4
+
5
+ export const listMeta = {
6
+ name: 'List',
7
+ category: 'pattern',
8
+ directManifestNode: false,
9
+ allowedChildren: [],
10
+ note: LIST_NOTE,
11
+ props: {},
12
+ } as const satisfies ZoraComponentMeta;
13
+
14
+ export const listRowMeta = {
15
+ name: 'ListRow',
16
+ category: 'pattern',
17
+ directManifestNode: false,
18
+ allowedChildren: [],
19
+ note: LIST_NOTE,
20
+ props: {},
21
+ } as const satisfies ZoraComponentMeta;
22
+
23
+ export const listSectionMeta = {
24
+ name: 'ListSection',
25
+ category: 'pattern',
26
+ directManifestNode: false,
27
+ allowedChildren: [],
28
+ note: LIST_NOTE,
29
+ props: {},
30
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,36 @@
1
+ import type { ZoraComponentMeta } from '../../metadata';
2
+ import { CONTAINER_ALLOWED_CHILDREN } from '../../metadata/allowedChildren';
3
+
4
+ export const noticeMeta = {
5
+ name: 'Notice',
6
+ category: 'pattern',
7
+ directManifestNode: true,
8
+ allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],
9
+ blueprint: {
10
+ label: 'Notice',
11
+ defaultProps: {
12
+ title: 'Notice',
13
+ tone: 'primary',
14
+ },
15
+ },
16
+ props: {
17
+ title: {
18
+ type: 'string',
19
+ category: 'Content',
20
+ label: 'Title',
21
+ default: 'Notice',
22
+ },
23
+ description: {
24
+ type: 'string',
25
+ category: 'Content',
26
+ label: 'Description',
27
+ },
28
+ tone: {
29
+ type: 'enum',
30
+ category: 'Style',
31
+ label: 'Tone',
32
+ enum: ['primary', 'neutral', 'danger', 'success', 'warning'],
33
+ default: 'primary',
34
+ },
35
+ },
36
+ } as const satisfies ZoraComponentMeta;