@ankhorage/zora 1.5.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +125 -123
  3. package/dist/components/app-bar/AppBar.js +4 -4
  4. package/dist/components/app-bar/AppBar.js.map +1 -1
  5. package/dist/components/avatar/Avatar.d.ts.map +1 -1
  6. package/dist/components/avatar/Avatar.js +19 -9
  7. package/dist/components/avatar/Avatar.js.map +1 -1
  8. package/dist/components/avatar/types.d.ts +2 -2
  9. package/dist/components/avatar/types.d.ts.map +1 -1
  10. package/dist/components/avatar/types.js.map +1 -1
  11. package/dist/components/avatar-group/AvatarGroup.js +2 -2
  12. package/dist/components/avatar-group/AvatarGroup.js.map +1 -1
  13. package/dist/components/avatar-group/types.d.ts +2 -2
  14. package/dist/components/avatar-group/types.d.ts.map +1 -1
  15. package/dist/components/avatar-group/types.js.map +1 -1
  16. package/dist/components/badge/Badge.js +3 -3
  17. package/dist/components/badge/Badge.js.map +1 -1
  18. package/dist/components/badge/types.d.ts +4 -4
  19. package/dist/components/badge/types.d.ts.map +1 -1
  20. package/dist/components/badge/types.js.map +1 -1
  21. package/dist/components/button/Button.js +3 -3
  22. package/dist/components/button/Button.js.map +1 -1
  23. package/dist/components/button/meta.d.ts +15 -7
  24. package/dist/components/button/meta.d.ts.map +1 -1
  25. package/dist/components/button/meta.js +16 -7
  26. package/dist/components/button/meta.js.map +1 -1
  27. package/dist/components/button/types.d.ts +4 -4
  28. package/dist/components/button/types.d.ts.map +1 -1
  29. package/dist/components/button/types.js.map +1 -1
  30. package/dist/components/card/Card.js +2 -2
  31. package/dist/components/card/Card.js.map +1 -1
  32. package/dist/components/checkbox/CheckboxGroup.js +5 -5
  33. package/dist/components/checkbox/CheckboxGroup.js.map +1 -1
  34. package/dist/components/checkbox/types.d.ts +1 -1
  35. package/dist/components/checkbox/types.d.ts.map +1 -1
  36. package/dist/components/checkbox/types.js.map +1 -1
  37. package/dist/components/chip/Chip.d.ts.map +1 -1
  38. package/dist/components/chip/Chip.js +9 -10
  39. package/dist/components/chip/Chip.js.map +1 -1
  40. package/dist/components/chip/resolveChipColors.d.ts +3 -3
  41. package/dist/components/chip/resolveChipColors.d.ts.map +1 -1
  42. package/dist/components/chip/resolveChipColors.js +14 -4
  43. package/dist/components/chip/resolveChipColors.js.map +1 -1
  44. package/dist/components/chip/types.d.ts +2 -2
  45. package/dist/components/chip/types.d.ts.map +1 -1
  46. package/dist/components/chip/types.js.map +1 -1
  47. package/dist/components/chip-group/ChipGroup.js +2 -2
  48. package/dist/components/chip-group/ChipGroup.js.map +1 -1
  49. package/dist/components/chip-group/types.d.ts +2 -2
  50. package/dist/components/chip-group/types.d.ts.map +1 -1
  51. package/dist/components/chip-group/types.js.map +1 -1
  52. package/dist/components/drawer/Drawer.js +1 -1
  53. package/dist/components/drawer/Drawer.js.map +1 -1
  54. package/dist/components/form/FormError.js +1 -1
  55. package/dist/components/form/FormError.js.map +1 -1
  56. package/dist/components/form/FormField.js +1 -1
  57. package/dist/components/form/FormField.js.map +1 -1
  58. package/dist/components/form/meta.d.ts +13 -0
  59. package/dist/components/form/meta.d.ts.map +1 -1
  60. package/dist/components/form/meta.js +15 -0
  61. package/dist/components/form/meta.js.map +1 -1
  62. package/dist/components/heading/Heading.d.ts.map +1 -1
  63. package/dist/components/heading/Heading.js +5 -3
  64. package/dist/components/heading/Heading.js.map +1 -1
  65. package/dist/components/heading/index.d.ts +1 -1
  66. package/dist/components/heading/index.d.ts.map +1 -1
  67. package/dist/components/heading/index.js.map +1 -1
  68. package/dist/components/heading/meta.d.ts +9 -3
  69. package/dist/components/heading/meta.d.ts.map +1 -1
  70. package/dist/components/heading/meta.js +10 -3
  71. package/dist/components/heading/meta.js.map +1 -1
  72. package/dist/components/heading/resolveHeadingRecipe.d.ts +4 -3
  73. package/dist/components/heading/resolveHeadingRecipe.d.ts.map +1 -1
  74. package/dist/components/heading/resolveHeadingRecipe.js +33 -12
  75. package/dist/components/heading/resolveHeadingRecipe.js.map +1 -1
  76. package/dist/components/heading/types.d.ts +5 -2
  77. package/dist/components/heading/types.d.ts.map +1 -1
  78. package/dist/components/heading/types.js.map +1 -1
  79. package/dist/components/icon-button/IconButton.js +3 -3
  80. package/dist/components/icon-button/IconButton.js.map +1 -1
  81. package/dist/components/icon-button/types.d.ts +3 -3
  82. package/dist/components/icon-button/types.d.ts.map +1 -1
  83. package/dist/components/icon-button/types.js.map +1 -1
  84. package/dist/components/input/Input.js +1 -1
  85. package/dist/components/input/Input.js.map +1 -1
  86. package/dist/components/media-card/MediaCard.js +2 -2
  87. package/dist/components/media-card/MediaCard.js.map +1 -1
  88. package/dist/components/metric-card/MetricCard.js +5 -5
  89. package/dist/components/metric-card/MetricCard.js.map +1 -1
  90. package/dist/components/metric-card/types.d.ts +2 -2
  91. package/dist/components/metric-card/types.d.ts.map +1 -1
  92. package/dist/components/metric-card/types.js.map +1 -1
  93. package/dist/components/modal/Modal.js +1 -1
  94. package/dist/components/modal/Modal.js.map +1 -1
  95. package/dist/components/progress/Progress.js +2 -2
  96. package/dist/components/progress/Progress.js.map +1 -1
  97. package/dist/components/progress/types.d.ts +3 -3
  98. package/dist/components/progress/types.d.ts.map +1 -1
  99. package/dist/components/progress/types.js +12 -2
  100. package/dist/components/progress/types.js.map +1 -1
  101. package/dist/components/radio/RadioGroup.js +5 -5
  102. package/dist/components/radio/RadioGroup.js.map +1 -1
  103. package/dist/components/radio/types.d.ts +1 -1
  104. package/dist/components/radio/types.d.ts.map +1 -1
  105. package/dist/components/radio/types.js.map +1 -1
  106. package/dist/components/rating/Rating.js +2 -2
  107. package/dist/components/rating/Rating.js.map +1 -1
  108. package/dist/components/rating/types.d.ts +3 -3
  109. package/dist/components/rating/types.d.ts.map +1 -1
  110. package/dist/components/rating/types.js +12 -2
  111. package/dist/components/rating/types.js.map +1 -1
  112. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  113. package/dist/components/tabs/Tabs.js +4 -4
  114. package/dist/components/tabs/Tabs.js.map +1 -1
  115. package/dist/components/text/Text.d.ts.map +1 -1
  116. package/dist/components/text/Text.js +3 -2
  117. package/dist/components/text/Text.js.map +1 -1
  118. package/dist/components/text/index.d.ts +1 -1
  119. package/dist/components/text/index.d.ts.map +1 -1
  120. package/dist/components/text/index.js.map +1 -1
  121. package/dist/components/text/meta.d.ts +10 -4
  122. package/dist/components/text/meta.d.ts.map +1 -1
  123. package/dist/components/text/meta.js +11 -4
  124. package/dist/components/text/meta.js.map +1 -1
  125. package/dist/components/text/resolveTextRecipe.d.ts +4 -3
  126. package/dist/components/text/resolveTextRecipe.d.ts.map +1 -1
  127. package/dist/components/text/resolveTextRecipe.js +35 -13
  128. package/dist/components/text/resolveTextRecipe.js.map +1 -1
  129. package/dist/components/text/types.d.ts +5 -2
  130. package/dist/components/text/types.d.ts.map +1 -1
  131. package/dist/components/text/types.js.map +1 -1
  132. package/dist/components/toolbar/ToolbarAction.js +1 -1
  133. package/dist/components/toolbar/ToolbarAction.js.map +1 -1
  134. package/dist/index.d.ts +5 -3
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +1 -0
  137. package/dist/index.js.map +1 -1
  138. package/dist/internal/colorModel.d.ts +10 -0
  139. package/dist/internal/colorModel.d.ts.map +1 -0
  140. package/dist/internal/colorModel.js +25 -0
  141. package/dist/internal/colorModel.js.map +1 -0
  142. package/dist/internal/recipes.d.ts +12 -11
  143. package/dist/internal/recipes.d.ts.map +1 -1
  144. package/dist/internal/recipes.js +6 -6
  145. package/dist/internal/recipes.js.map +1 -1
  146. package/dist/metadata/index.d.ts +1 -1
  147. package/dist/metadata/index.d.ts.map +1 -1
  148. package/dist/metadata/index.js.map +1 -1
  149. package/dist/metadata/types.d.ts +16 -0
  150. package/dist/metadata/types.d.ts.map +1 -1
  151. package/dist/metadata/types.js.map +1 -1
  152. package/dist/patterns/auth/ForgotPasswordForm.js +2 -2
  153. package/dist/patterns/auth/ForgotPasswordForm.js.map +1 -1
  154. package/dist/patterns/auth/OtpForm.js +2 -2
  155. package/dist/patterns/auth/OtpForm.js.map +1 -1
  156. package/dist/patterns/auth/SignInForm.js +4 -4
  157. package/dist/patterns/auth/SignInForm.js.map +1 -1
  158. package/dist/patterns/auth/SignUpForm.js +2 -2
  159. package/dist/patterns/auth/SignUpForm.js.map +1 -1
  160. package/dist/patterns/chat-list-item/ChatListItem.d.ts.map +1 -1
  161. package/dist/patterns/chat-list-item/ChatListItem.js +6 -6
  162. package/dist/patterns/chat-list-item/ChatListItem.js.map +1 -1
  163. package/dist/patterns/chat-list-item/types.d.ts +2 -2
  164. package/dist/patterns/chat-list-item/types.d.ts.map +1 -1
  165. package/dist/patterns/chat-list-item/types.js.map +1 -1
  166. package/dist/patterns/collection-editor/CollectionEditor.js +5 -5
  167. package/dist/patterns/collection-editor/CollectionEditor.js.map +1 -1
  168. package/dist/patterns/confirm-dialog/ConfirmDialog.js +3 -3
  169. package/dist/patterns/confirm-dialog/ConfirmDialog.js.map +1 -1
  170. package/dist/patterns/confirm-dialog/types.d.ts +3 -3
  171. package/dist/patterns/confirm-dialog/types.d.ts.map +1 -1
  172. package/dist/patterns/confirm-dialog/types.js.map +1 -1
  173. package/dist/patterns/disclosure-section/DisclosureSection.js +1 -1
  174. package/dist/patterns/disclosure-section/DisclosureSection.js.map +1 -1
  175. package/dist/patterns/empty-state/EmptyState.js +2 -2
  176. package/dist/patterns/empty-state/EmptyState.js.map +1 -1
  177. package/dist/patterns/empty-state/types.d.ts +3 -3
  178. package/dist/patterns/empty-state/types.d.ts.map +1 -1
  179. package/dist/patterns/empty-state/types.js.map +1 -1
  180. package/dist/patterns/form-field/FormField.js +1 -1
  181. package/dist/patterns/form-field/FormField.js.map +1 -1
  182. package/dist/patterns/hero/Hero.js +3 -3
  183. package/dist/patterns/hero/Hero.js.map +1 -1
  184. package/dist/patterns/hero/types.d.ts +3 -3
  185. package/dist/patterns/hero/types.d.ts.map +1 -1
  186. package/dist/patterns/hero/types.js.map +1 -1
  187. package/dist/patterns/image-preview/ImagePreview.js +1 -1
  188. package/dist/patterns/image-preview/ImagePreview.js.map +1 -1
  189. package/dist/patterns/image-upload-field/ImageUploadField.js +7 -7
  190. package/dist/patterns/image-upload-field/ImageUploadField.js.map +1 -1
  191. package/dist/patterns/list/ListRow.js +2 -2
  192. package/dist/patterns/list/ListRow.js.map +1 -1
  193. package/dist/patterns/list/meta.d.ts +16 -0
  194. package/dist/patterns/list/meta.d.ts.map +1 -1
  195. package/dist/patterns/list/meta.js +19 -0
  196. package/dist/patterns/list/meta.js.map +1 -1
  197. package/dist/patterns/message-bubble/MessageBubble.d.ts.map +1 -1
  198. package/dist/patterns/message-bubble/MessageBubble.js +6 -6
  199. package/dist/patterns/message-bubble/MessageBubble.js.map +1 -1
  200. package/dist/patterns/message-bubble/types.d.ts +2 -2
  201. package/dist/patterns/message-bubble/types.d.ts.map +1 -1
  202. package/dist/patterns/message-bubble/types.js.map +1 -1
  203. package/dist/patterns/notice/Notice.js +2 -2
  204. package/dist/patterns/notice/Notice.js.map +1 -1
  205. package/dist/patterns/notice/types.d.ts +2 -2
  206. package/dist/patterns/notice/types.d.ts.map +1 -1
  207. package/dist/patterns/notice/types.js.map +1 -1
  208. package/dist/patterns/post-card/PostCard.js +4 -4
  209. package/dist/patterns/post-card/PostCard.js.map +1 -1
  210. package/dist/patterns/post-card/types.d.ts +2 -2
  211. package/dist/patterns/post-card/types.d.ts.map +1 -1
  212. package/dist/patterns/post-card/types.js.map +1 -1
  213. package/dist/patterns/section-header/SectionHeader.js +2 -2
  214. package/dist/patterns/section-header/SectionHeader.js.map +1 -1
  215. package/dist/patterns/settings-row/SettingsRow.js +1 -1
  216. package/dist/patterns/settings-row/SettingsRow.js.map +1 -1
  217. package/dist/patterns/theme-composer/ThemeComposer.js +14 -14
  218. package/dist/patterns/theme-composer/ThemeComposer.js.map +1 -1
  219. package/dist/patterns/tile-grid/PaletteItem.js +1 -1
  220. package/dist/patterns/tile-grid/PaletteItem.js.map +1 -1
  221. package/dist/patterns/timeline/Timeline.d.ts.map +1 -1
  222. package/dist/patterns/timeline/Timeline.js +14 -4
  223. package/dist/patterns/timeline/Timeline.js.map +1 -1
  224. package/dist/patterns/timeline/types.d.ts +2 -2
  225. package/dist/patterns/timeline/types.d.ts.map +1 -1
  226. package/dist/patterns/timeline/types.js.map +1 -1
  227. package/dist/patterns/tree-view/TreeItem.js +1 -1
  228. package/dist/patterns/tree-view/TreeItem.js.map +1 -1
  229. package/dist/theme/useZoraTheme.d.ts +1 -1
  230. package/package.json +3 -3
  231. package/src/components/app-bar/AppBar.tsx +6 -6
  232. package/src/components/avatar/Avatar.tsx +21 -11
  233. package/src/components/avatar/types.ts +2 -2
  234. package/src/components/avatar-group/AvatarGroup.tsx +2 -2
  235. package/src/components/avatar-group/types.ts +2 -2
  236. package/src/components/badge/Badge.tsx +4 -4
  237. package/src/components/badge/types.ts +4 -4
  238. package/src/components/button/Button.tsx +4 -4
  239. package/src/components/button/meta.ts +16 -7
  240. package/src/components/button/types.ts +4 -4
  241. package/src/components/card/Card.tsx +2 -2
  242. package/src/components/checkbox/CheckboxGroup.tsx +6 -6
  243. package/src/components/checkbox/types.ts +1 -1
  244. package/src/components/chip/Chip.tsx +9 -10
  245. package/src/components/chip/resolveChipColors.ts +16 -6
  246. package/src/components/chip/types.ts +2 -2
  247. package/src/components/chip-group/ChipGroup.tsx +2 -2
  248. package/src/components/chip-group/types.ts +2 -2
  249. package/src/components/drawer/Drawer.tsx +1 -1
  250. package/src/components/form/FormError.tsx +1 -1
  251. package/src/components/form/FormField.tsx +1 -1
  252. package/src/components/form/meta.ts +15 -0
  253. package/src/components/heading/Heading.tsx +6 -3
  254. package/src/components/heading/index.ts +2 -1
  255. package/src/components/heading/meta.ts +10 -3
  256. package/src/components/heading/resolveHeadingRecipe.test.ts +13 -10
  257. package/src/components/heading/resolveHeadingRecipe.ts +58 -15
  258. package/src/components/heading/types.ts +5 -10
  259. package/src/components/icon-button/IconButton.tsx +4 -4
  260. package/src/components/icon-button/types.ts +3 -3
  261. package/src/components/input/Input.tsx +2 -2
  262. package/src/components/media-card/MediaCard.tsx +2 -2
  263. package/src/components/metric-card/MetricCard.tsx +6 -6
  264. package/src/components/metric-card/types.ts +2 -2
  265. package/src/components/modal/Modal.tsx +1 -1
  266. package/src/components/progress/Progress.tsx +2 -2
  267. package/src/components/progress/types.ts +14 -4
  268. package/src/components/radio/RadioGroup.tsx +6 -6
  269. package/src/components/radio/types.ts +1 -1
  270. package/src/components/rating/Rating.tsx +2 -2
  271. package/src/components/rating/types.ts +14 -4
  272. package/src/components/tabs/Tabs.tsx +11 -7
  273. package/src/components/text/Text.tsx +4 -2
  274. package/src/components/text/index.ts +8 -1
  275. package/src/components/text/meta.ts +11 -4
  276. package/src/components/text/resolveTextRecipe.test.ts +18 -14
  277. package/src/components/text/resolveTextRecipe.ts +42 -15
  278. package/src/components/text/types.ts +5 -10
  279. package/src/components/toolbar/ToolbarAction.tsx +2 -2
  280. package/src/index.ts +26 -2
  281. package/src/internal/colorModel.ts +39 -0
  282. package/src/internal/recipes.test.ts +2 -2
  283. package/src/internal/recipes.ts +18 -18
  284. package/src/metadata/componentMeta.test.ts +36 -0
  285. package/src/metadata/index.ts +4 -0
  286. package/src/metadata/types.ts +27 -0
  287. package/src/patterns/auth/ForgotPasswordForm.tsx +2 -2
  288. package/src/patterns/auth/OtpForm.tsx +2 -2
  289. package/src/patterns/auth/SignInForm.tsx +4 -4
  290. package/src/patterns/auth/SignUpForm.tsx +2 -2
  291. package/src/patterns/chat-list-item/ChatListItem.tsx +7 -6
  292. package/src/patterns/chat-list-item/types.ts +2 -2
  293. package/src/patterns/collection-editor/CollectionEditor.tsx +6 -6
  294. package/src/patterns/confirm-dialog/ConfirmDialog.tsx +4 -4
  295. package/src/patterns/confirm-dialog/types.ts +3 -3
  296. package/src/patterns/disclosure-section/DisclosureSection.tsx +2 -2
  297. package/src/patterns/empty-state/EmptyState.tsx +4 -4
  298. package/src/patterns/empty-state/types.ts +3 -3
  299. package/src/patterns/form-field/FormField.tsx +1 -1
  300. package/src/patterns/hero/Hero.tsx +4 -4
  301. package/src/patterns/hero/types.ts +3 -3
  302. package/src/patterns/image-preview/ImagePreview.tsx +1 -1
  303. package/src/patterns/image-upload-field/ImageUploadField.tsx +8 -8
  304. package/src/patterns/list/ListRow.tsx +2 -2
  305. package/src/patterns/list/meta.ts +19 -0
  306. package/src/patterns/message-bubble/MessageBubble.tsx +10 -6
  307. package/src/patterns/message-bubble/types.ts +2 -2
  308. package/src/patterns/notice/Notice.tsx +2 -2
  309. package/src/patterns/notice/types.ts +2 -2
  310. package/src/patterns/post-card/PostCard.tsx +5 -5
  311. package/src/patterns/post-card/types.ts +2 -2
  312. package/src/patterns/section-header/SectionHeader.tsx +2 -2
  313. package/src/patterns/settings-row/SettingsRow.tsx +1 -1
  314. package/src/patterns/theme-composer/ThemeComposer.tsx +15 -15
  315. package/src/patterns/tile-grid/PaletteItem.tsx +1 -1
  316. package/src/patterns/timeline/Timeline.tsx +15 -5
  317. package/src/patterns/timeline/types.ts +2 -2
  318. package/src/patterns/tree-view/TreeItem.tsx +1 -1
@@ -286,31 +286,34 @@ describe('resolveTextStyle', () => {
286
286
  );
287
287
  });
288
288
 
289
- test('maps tones to semantic colors', () => {
290
- expect(resolveTextStyle({ theme, breakpoint: 'base', tone: 'default' }).color).toBe(
289
+ test('maps emphasis and color to semantic colors', () => {
290
+ expect(resolveTextStyle({ theme, breakpoint: 'base', emphasis: 'default' }).color).toBe(
291
291
  theme.semantics.content.default,
292
292
  );
293
- expect(resolveTextStyle({ theme, breakpoint: 'base', tone: 'muted' }).color).toBe(
293
+ expect(resolveTextStyle({ theme, breakpoint: 'base', emphasis: 'muted' }).color).toBe(
294
294
  theme.semantics.content.muted,
295
295
  );
296
- expect(resolveTextStyle({ theme, breakpoint: 'base', tone: 'subtle' }).color).toBe(
296
+ expect(resolveTextStyle({ theme, breakpoint: 'base', emphasis: 'subtle' }).color).toBe(
297
297
  theme.semantics.content.subtle,
298
298
  );
299
- expect(resolveTextStyle({ theme, breakpoint: 'base', tone: 'inverse' }).color).toBe(
299
+ expect(resolveTextStyle({ theme, breakpoint: 'base', emphasis: 'inverse' }).color).toBe(
300
300
  theme.semantics.content.inverse,
301
301
  );
302
- expect(resolveTextStyle({ theme, breakpoint: 'base', tone: 'primary' }).color).toBe(
303
- theme.semantics.brand.base,
302
+ expect(resolveTextStyle({ theme, breakpoint: 'base', color: 'primary' }).color).toBe(
303
+ theme.semantics.action.primary.base,
304
304
  );
305
- expect(resolveTextStyle({ theme, breakpoint: 'base', tone: 'danger' }).color).toBe(
306
- theme.semantics.danger.base,
305
+ expect(resolveTextStyle({ theme, breakpoint: 'base', color: 'danger' }).color).toBe(
306
+ theme.semantics.action.danger.base,
307
307
  );
308
- expect(resolveTextStyle({ theme, breakpoint: 'base', tone: 'success' }).color).toBe(
308
+ expect(resolveTextStyle({ theme, breakpoint: 'base', color: 'success' }).color).toBe(
309
309
  theme.semantics.success.base,
310
310
  );
311
- expect(resolveTextStyle({ theme, breakpoint: 'base', tone: 'warning' }).color).toBe(
311
+ expect(resolveTextStyle({ theme, breakpoint: 'base', color: 'warning' }).color).toBe(
312
312
  theme.semantics.warning.base,
313
313
  );
314
+ expect(
315
+ resolveTextStyle({ theme, breakpoint: 'base', color: 'primary', emphasis: 'inverse' }).color,
316
+ ).toBe(theme.semantics.action.primary.onSolidText);
314
317
  });
315
318
 
316
319
  test('allows explicit weight to override the recipe weight', () => {
@@ -339,19 +342,20 @@ describe('resolveTextStyle', () => {
339
342
  expect(style.fontFamily).toBe('ZoraMediumItalic');
340
343
  });
341
344
 
342
- test('resolves responsive variant, tone, align, and weight values', () => {
345
+ test('resolves responsive variant, color, emphasis, align, and weight values', () => {
343
346
  const style = resolveTextStyle({
344
347
  theme,
345
348
  breakpoint: 'md',
346
349
  variant: { base: 'bodySmall', md: 'lead' },
347
- tone: { base: 'muted', md: 'primary' },
350
+ emphasis: { base: 'muted', md: 'default' },
351
+ color: { base: 'neutral', md: 'primary' },
348
352
  align: { base: 'center', md: 'left' },
349
353
  weight: { base: 'regular', md: 'semiBold' },
350
354
  });
351
355
 
352
356
  expect(style.fontSize).toBe(theme.typography.sizes.l);
353
357
  expect(style.lineHeight).toBe(28);
354
- expect(style.color).toBe(theme.semantics.brand.base);
358
+ expect(style.color).toBe(theme.semantics.action.primary.base);
355
359
  expect(style.textAlign).toBe('left');
356
360
  expect(style.fontWeight).toBe(theme.typography.weights.semiBold);
357
361
  });
@@ -3,11 +3,12 @@ import {
3
3
  type FontWeight,
4
4
  resolveResponsive,
5
5
  type Responsive,
6
+ type RoleSemantics,
6
7
  type SurfaceTheme,
7
8
  } from '@ankhorage/surface';
8
9
  import type { TextStyle } from 'react-native';
9
10
 
10
- import type { TextAlign, TextTone, TextVariant, TextWeight } from './types';
11
+ import type { TextAlign, TextColor, TextEmphasis, TextVariant, TextWeight } from './types';
11
12
 
12
13
  interface VariantRecipe {
13
14
  fontSize: number;
@@ -21,7 +22,8 @@ interface ResolveTextStyleOptions {
21
22
  theme: SurfaceTheme;
22
23
  breakpoint: Breakpoint;
23
24
  variant?: Responsive<TextVariant>;
24
- tone?: Responsive<TextTone>;
25
+ color?: Responsive<TextColor>;
26
+ emphasis?: Responsive<TextEmphasis>;
25
27
  weight?: Responsive<TextWeight>;
26
28
  align?: Responsive<TextAlign>;
27
29
  italic?: boolean;
@@ -109,22 +111,45 @@ function resolveVariantRecipe(
109
111
  }
110
112
  }
111
113
 
112
- function resolveToneColor(theme: SurfaceTheme, tone: TextTone): string {
113
- switch (tone) {
114
+ function resolveRoleSemantics(theme: SurfaceTheme, color: TextColor): RoleSemantics {
115
+ switch (color) {
116
+ case 'secondary':
117
+ return theme.semantics.secondary;
118
+ case 'tertiary':
119
+ return theme.semantics.accent;
120
+ case 'quaternary':
121
+ return theme.semantics.highlight;
122
+ case 'neutral':
123
+ return theme.semantics.action.neutral;
124
+ case 'error':
125
+ return theme.semantics.error;
126
+ case 'info':
127
+ return theme.semantics.info;
128
+ case 'danger':
129
+ return theme.semantics.action.danger;
130
+ case 'success':
131
+ return theme.semantics.success;
132
+ case 'warning':
133
+ return theme.semantics.warning;
134
+ case 'primary':
135
+ default:
136
+ return theme.semantics.action.primary;
137
+ }
138
+ }
139
+
140
+ function resolveTextColor(theme: SurfaceTheme, emphasis: TextEmphasis, color?: TextColor): string {
141
+ if (color) {
142
+ const role = resolveRoleSemantics(theme, color);
143
+ return emphasis === 'inverse' ? role.onSolidText : role.base;
144
+ }
145
+
146
+ switch (emphasis) {
114
147
  case 'muted':
115
148
  return theme.semantics.content.muted;
116
149
  case 'subtle':
117
150
  return theme.semantics.content.subtle;
118
151
  case 'inverse':
119
152
  return theme.semantics.content.inverse;
120
- case 'primary':
121
- return theme.semantics.brand.base;
122
- case 'danger':
123
- return theme.semantics.danger.base;
124
- case 'success':
125
- return theme.semantics.success.base;
126
- case 'warning':
127
- return theme.semantics.warning.base;
128
153
  case 'default':
129
154
  default:
130
155
  return theme.semantics.content.default;
@@ -135,13 +160,15 @@ export function resolveTextStyle({
135
160
  theme,
136
161
  breakpoint,
137
162
  variant,
138
- tone,
163
+ color,
164
+ emphasis,
139
165
  weight,
140
166
  align,
141
167
  italic = false,
142
168
  }: ResolveTextStyleOptions): TextStyle {
143
169
  const resolvedVariant = resolveResponsive(variant, breakpoint) ?? 'body';
144
- const resolvedTone = resolveResponsive(tone, breakpoint) ?? 'default';
170
+ const resolvedEmphasis = resolveResponsive(emphasis, breakpoint) ?? 'default';
171
+ const resolvedColor = resolveResponsive(color, breakpoint);
145
172
  const resolvedAlign = resolveResponsive(align, breakpoint);
146
173
  const recipe = resolveVariantRecipe(theme, resolvedVariant, breakpoint);
147
174
  const resolvedWeight = resolveWeight(
@@ -150,7 +177,7 @@ export function resolveTextStyle({
150
177
  );
151
178
 
152
179
  return {
153
- color: resolveToneColor(theme, resolvedTone),
180
+ color: resolveTextColor(theme, resolvedEmphasis, resolvedColor),
154
181
  elevation: 0,
155
182
  fontFamily: resolveFontFamily({
156
183
  theme,
@@ -2,19 +2,13 @@ import type { Responsive } from '@ankhorage/surface';
2
2
  import type React from 'react';
3
3
  import type { AccessibilityRole, TextStyle } from 'react-native';
4
4
 
5
+ import type { ZoraColor, ZoraEmphasis } from '../../internal/recipes';
5
6
  import type { ZoraBaseProps } from '../../theme/ZoraBaseProps';
6
7
 
7
8
  export type TextVariant = 'body' | 'lead' | 'bodySmall' | 'caption' | 'label' | 'eyebrow' | 'code';
8
9
 
9
- export type TextTone =
10
- | 'default'
11
- | 'muted'
12
- | 'subtle'
13
- | 'inverse'
14
- | 'primary'
15
- | 'danger'
16
- | 'success'
17
- | 'warning';
10
+ export type TextColor = ZoraColor;
11
+ export type TextEmphasis = ZoraEmphasis;
18
12
 
19
13
  export type TextWeight = 'regular' | 'medium' | 'semiBold' | 'bold';
20
14
 
@@ -25,7 +19,8 @@ export interface TextProps extends ZoraBaseProps {
25
19
  text?: string;
26
20
  i18nKey?: string;
27
21
  variant?: Responsive<TextVariant>;
28
- tone?: Responsive<TextTone>;
22
+ color?: Responsive<TextColor>;
23
+ emphasis?: Responsive<TextEmphasis>;
29
24
  align?: Responsive<TextAlign>;
30
25
  weight?: Responsive<TextWeight>;
31
26
  italic?: boolean;
@@ -13,8 +13,8 @@ function ToolbarActionInner({
13
13
  return (
14
14
  <IconButton
15
15
  {...props}
16
- emphasis={active ? 'soft' : 'ghost'}
17
- tone={active ? 'primary' : 'neutral'}
16
+ variant={active ? 'soft' : 'ghost'}
17
+ color={active ? 'primary' : 'neutral'}
18
18
  size="m"
19
19
  />
20
20
  );
package/src/index.ts CHANGED
@@ -48,10 +48,11 @@ export {
48
48
  } from './components/form';
49
49
  export type {
50
50
  HeadingAlign,
51
+ HeadingColor,
52
+ HeadingEmphasis,
51
53
  HeadingLevel,
52
54
  HeadingProps,
53
55
  HeadingSize,
54
- HeadingTone,
55
56
  HeadingWeight,
56
57
  } from './components/heading';
57
58
  export { Heading } from './components/heading';
@@ -89,7 +90,14 @@ export type { SelectOption, SelectProps } from './components/select';
89
90
  export { Select } from './components/select';
90
91
  export type { TabItem, TabsProps, TabsVariant } from './components/tabs';
91
92
  export { Tabs } from './components/tabs';
92
- export type { TextAlign, TextProps, TextTone, TextVariant, TextWeight } from './components/text';
93
+ export type {
94
+ TextAlign,
95
+ TextColor,
96
+ TextEmphasis,
97
+ TextProps,
98
+ TextVariant,
99
+ TextWeight,
100
+ } from './components/text';
93
101
  export { Text } from './components/text';
94
102
  export type { TextareaProps } from './components/textarea';
95
103
  export { Textarea } from './components/textarea';
@@ -120,6 +128,18 @@ export {
120
128
  Stack,
121
129
  Surface,
122
130
  } from './foundation';
131
+ export type {
132
+ ZoraColor,
133
+ ZoraEmphasis,
134
+ ZoraPaletteColor,
135
+ ZoraStatusColor,
136
+ } from './internal/colorModel';
137
+ export {
138
+ ZORA_COLORS,
139
+ ZORA_EMPHASES,
140
+ ZORA_PALETTE_COLORS,
141
+ ZORA_STATUS_COLORS,
142
+ } from './internal/colorModel';
123
143
  export type { AppShellProps } from './layout/app-shell';
124
144
  export { AppShell } from './layout/app-shell';
125
145
  export type { AuthLayoutProps } from './layout/auth-layout';
@@ -137,6 +157,10 @@ export { TopbarLayout } from './layout/topbar-layout';
137
157
  export type {
138
158
  ZoraComponentBlueprint,
139
159
  ZoraComponentCategory,
160
+ ZoraComponentEventMeta,
161
+ ZoraComponentEventPayloadFieldMeta,
162
+ ZoraComponentEventPayloadFieldType,
163
+ ZoraComponentEventPayloadKind,
140
164
  ZoraComponentI18nMeta,
141
165
  ZoraComponentMeta,
142
166
  ZoraComponentMetaRegistry,
@@ -0,0 +1,39 @@
1
+ import type {
2
+ SurfaceColor,
3
+ SurfaceEmphasis,
4
+ SurfacePaletteColor,
5
+ SurfaceStatusColor,
6
+ } from '@ankhorage/surface';
7
+
8
+ export type ZoraPaletteColor = SurfacePaletteColor;
9
+ export type ZoraStatusColor = SurfaceStatusColor;
10
+ export type ZoraColor = SurfaceColor;
11
+ export type ZoraEmphasis = SurfaceEmphasis;
12
+
13
+ export const ZORA_PALETTE_COLORS = [
14
+ 'primary',
15
+ 'secondary',
16
+ 'tertiary',
17
+ 'quaternary',
18
+ 'neutral',
19
+ ] as const satisfies readonly SurfacePaletteColor[];
20
+
21
+ export const ZORA_STATUS_COLORS = [
22
+ 'success',
23
+ 'warning',
24
+ 'error',
25
+ 'info',
26
+ ] as const satisfies readonly SurfaceStatusColor[];
27
+
28
+ export const ZORA_COLORS = [
29
+ ...ZORA_PALETTE_COLORS,
30
+ ...ZORA_STATUS_COLORS,
31
+ 'danger',
32
+ ] as const satisfies readonly SurfaceColor[];
33
+
34
+ export const ZORA_EMPHASES = [
35
+ 'default',
36
+ 'muted',
37
+ 'subtle',
38
+ 'inverse',
39
+ ] as const satisfies readonly SurfaceEmphasis[];
@@ -13,7 +13,7 @@ describe('recipes', () => {
13
13
  test('maps button defaults to a more opinionated large solid primary button', () => {
14
14
  expect(resolveButtonRecipe({})).toEqual({
15
15
  size: 'l',
16
- tone: 'primary',
16
+ color: 'primary',
17
17
  variant: 'solid',
18
18
  });
19
19
  });
@@ -21,7 +21,7 @@ describe('recipes', () => {
21
21
  test('maps badge defaults to a soft medium primary badge', () => {
22
22
  expect(resolveBadgeRecipe({})).toEqual({
23
23
  size: 'm',
24
- tone: 'primary',
24
+ color: 'primary',
25
25
  variant: 'soft',
26
26
  });
27
27
  });
@@ -3,43 +3,43 @@ import type {
3
3
  ButtonProps as SurfaceButtonProps,
4
4
  CardProps as SurfaceCardProps,
5
5
  } from '@ankhorage/surface';
6
-
7
- export type ZoraTone = NonNullable<SurfaceButtonProps['tone']>;
8
- export type ZoraEmphasis = NonNullable<SurfaceButtonProps['variant']>;
6
+ export type { ZoraColor, ZoraEmphasis } from './colorModel';
7
+ import type { ZoraColor } from './colorModel';
8
+ export type ZoraButtonVariant = NonNullable<SurfaceButtonProps['variant']>;
9
9
  export type ZoraControlSize = NonNullable<SurfaceButtonProps['size']>;
10
- export type ZoraBadgeEmphasis = NonNullable<SurfaceBadgeProps['variant']>;
10
+ export type ZoraBadgeVariant = NonNullable<SurfaceBadgeProps['variant']>;
11
11
  export type ZoraCardTone = 'default' | 'subtle' | 'outline';
12
12
  export type ZoraContentWidth = 'narrow' | 'default' | 'wide';
13
13
 
14
14
  export function resolveButtonRecipe({
15
- tone = 'primary',
16
- emphasis = 'solid',
15
+ color = 'primary',
16
+ variant = 'solid',
17
17
  size = 'l',
18
18
  }: {
19
- tone?: ZoraTone;
20
- emphasis?: ZoraEmphasis;
19
+ color?: ZoraColor;
20
+ variant?: ZoraButtonVariant;
21
21
  size?: ZoraControlSize;
22
- }): Pick<SurfaceButtonProps, 'size' | 'tone' | 'variant'> {
22
+ }): Pick<SurfaceButtonProps, 'size' | 'color' | 'variant'> {
23
23
  return {
24
24
  size,
25
- tone,
26
- variant: emphasis,
25
+ color,
26
+ variant,
27
27
  };
28
28
  }
29
29
 
30
30
  export function resolveBadgeRecipe({
31
- tone = 'primary',
32
- emphasis = 'soft',
31
+ color = 'primary',
32
+ variant = 'soft',
33
33
  size = 'm',
34
34
  }: {
35
- tone?: ZoraTone;
36
- emphasis?: ZoraBadgeEmphasis;
35
+ color?: ZoraColor;
36
+ variant?: ZoraBadgeVariant;
37
37
  size?: ZoraControlSize;
38
- }): Pick<SurfaceBadgeProps, 'size' | 'tone' | 'variant'> {
38
+ }): Pick<SurfaceBadgeProps, 'size' | 'color' | 'variant'> {
39
39
  return {
40
40
  size,
41
- tone,
42
- variant: emphasis,
41
+ color,
42
+ variant,
43
43
  };
44
44
  }
45
45
 
@@ -4,6 +4,7 @@ import { join } from 'node:path';
4
4
  import { describe, expect, test } from 'bun:test';
5
5
 
6
6
  import { ZORA_COMPONENT_META } from './componentMeta';
7
+ import type { ZoraComponentEventPayloadKind } from './types';
7
8
 
8
9
  const ROOT = process.cwd();
9
10
  const SRC_ROOT = join(ROOT, 'src');
@@ -62,6 +63,12 @@ describe('ZORA_COMPONENT_META public API', () => {
62
63
  const indexSource = readSource(INDEX_PATH);
63
64
  expect(indexSource).toContain('ZORA_COMPONENT_META');
64
65
  });
66
+
67
+ test('src/index.ts re-exports component event metadata types', () => {
68
+ const indexSource = readSource(INDEX_PATH);
69
+ expect(indexSource).toContain('ZoraComponentEventMeta');
70
+ expect(indexSource).toContain('ZoraComponentEventPayloadKind');
71
+ });
65
72
  });
66
73
 
67
74
  describe('ZORA_COMPONENT_META registry coverage', () => {
@@ -108,6 +115,35 @@ describe('ZORA_COMPONENT_META registry coverage', () => {
108
115
  });
109
116
  });
110
117
 
118
+ describe('ZORA_COMPONENT_META event metadata', () => {
119
+ test('declares form submit metadata', () => {
120
+ const event = ZORA_COMPONENT_META.Form.events?.submit;
121
+ const eventType: ZoraComponentEventPayloadKind = event?.eventType ?? 'form.submit';
122
+
123
+ expect(eventType).toBe('form.submit');
124
+ expect(event?.payloadFields?.map((field) => field.path)).toEqual(['payload.values']);
125
+ });
126
+
127
+ test('declares button event metadata', () => {
128
+ const event = ZORA_COMPONENT_META.Button.events?.press;
129
+ const eventType: ZoraComponentEventPayloadKind = event?.eventType ?? 'button.press';
130
+
131
+ expect(eventType).toBe('button.press');
132
+ expect(event?.payloadFields).toEqual([]);
133
+ });
134
+
135
+ test('declares collection item metadata for list rows', () => {
136
+ const event = ZORA_COMPONENT_META.ListRow.events?.itemPress;
137
+ const eventType: ZoraComponentEventPayloadKind = event?.eventType ?? 'collection.itemPress';
138
+
139
+ expect(eventType).toBe('collection.itemPress');
140
+ expect(event?.payloadFields?.map((field) => field.path)).toEqual([
141
+ 'payload.itemId',
142
+ 'payload.item',
143
+ ]);
144
+ });
145
+ });
146
+
111
147
  describe('ZORA_COMPONENT_META invariants', () => {
112
148
  test('every key matches meta.name', () => {
113
149
  for (const [key, meta] of Object.entries(ZORA_COMPONENT_META)) {
@@ -2,6 +2,10 @@ export { ZORA_COMPONENT_META } from './componentMeta';
2
2
  export type {
3
3
  ZoraComponentBlueprint,
4
4
  ZoraComponentCategory,
5
+ ZoraComponentEventMeta,
6
+ ZoraComponentEventPayloadFieldMeta,
7
+ ZoraComponentEventPayloadFieldType,
8
+ ZoraComponentEventPayloadKind,
5
9
  ZoraComponentI18nMeta,
6
10
  ZoraComponentMeta,
7
11
  ZoraComponentMetaRegistry,
@@ -1,3 +1,5 @@
1
+ import type { ComponentEventDtoKind } from '@ankhorage/contracts';
2
+
1
3
  export type ZoraComponentCategory = 'foundation' | 'component' | 'pattern' | 'layout';
2
4
 
3
5
  export type ZoraComponentPropType =
@@ -53,6 +55,30 @@ export interface ZoraComponentI18nMeta {
53
55
  }[];
54
56
  }
55
57
 
58
+ export type ZoraComponentEventPayloadKind = ComponentEventDtoKind | (string & {});
59
+
60
+ export type ZoraComponentEventPayloadFieldType =
61
+ | 'boolean'
62
+ | 'number'
63
+ | 'object'
64
+ | 'record'
65
+ | 'string'
66
+ | 'unknown';
67
+
68
+ export interface ZoraComponentEventPayloadFieldMeta {
69
+ readonly path: string;
70
+ readonly type: ZoraComponentEventPayloadFieldType;
71
+ readonly label?: string;
72
+ readonly description?: string;
73
+ }
74
+
75
+ export interface ZoraComponentEventMeta {
76
+ readonly label: string;
77
+ readonly eventType: ZoraComponentEventPayloadKind;
78
+ readonly description?: string;
79
+ readonly payloadFields?: readonly ZoraComponentEventPayloadFieldMeta[];
80
+ }
81
+
56
82
  export interface ZoraComponentSlotMeta {
57
83
  label?: string;
58
84
  allowedChildren?: readonly string[];
@@ -65,6 +91,7 @@ export interface ZoraComponentMeta {
65
91
  directManifestNode: boolean;
66
92
  allowedChildren: readonly string[];
67
93
  blueprint?: ZoraComponentBlueprint;
94
+ events?: Readonly<Record<string, ZoraComponentEventMeta>>;
68
95
  i18n?: ZoraComponentI18nMeta;
69
96
  slots?: Readonly<Record<string, ZoraComponentSlotMeta>>;
70
97
  note?: string;
@@ -61,12 +61,12 @@ function ForgotPasswordFormInner({
61
61
  <Stack direction="row" gap="s" wrap="wrap">
62
62
  <Button
63
63
  disabled={disabled || loading}
64
- emphasis="ghost"
64
+ variant="ghost"
65
65
  onPress={() => {
66
66
  void onSignIn();
67
67
  }}
68
68
  size="s"
69
- tone="neutral"
69
+ color="neutral"
70
70
  >
71
71
  {signInLabel}
72
72
  </Button>
@@ -56,13 +56,13 @@ function OtpFormInner({
56
56
  <Stack direction="row" gap="s" wrap="wrap">
57
57
  <Button
58
58
  disabled={disabled || loading || resendDisabled}
59
- emphasis="ghost"
59
+ variant="ghost"
60
60
  loading={resendLoading}
61
61
  onPress={() => {
62
62
  void onResend();
63
63
  }}
64
64
  size="s"
65
- tone="neutral"
65
+ color="neutral"
66
66
  >
67
67
  {resendLabel}
68
68
  </Button>
@@ -74,12 +74,12 @@ function SignInFormInner({
74
74
  {onForgotPassword ? (
75
75
  <Button
76
76
  disabled={disabled || loading}
77
- emphasis="ghost"
77
+ variant="ghost"
78
78
  onPress={() => {
79
79
  void onForgotPassword();
80
80
  }}
81
81
  size="s"
82
- tone="neutral"
82
+ color="neutral"
83
83
  >
84
84
  {forgotPasswordLabel}
85
85
  </Button>
@@ -87,12 +87,12 @@ function SignInFormInner({
87
87
  {onSignUp ? (
88
88
  <Button
89
89
  disabled={disabled || loading}
90
- emphasis="ghost"
90
+ variant="ghost"
91
91
  onPress={() => {
92
92
  void onSignUp();
93
93
  }}
94
94
  size="s"
95
- tone="neutral"
95
+ color="neutral"
96
96
  >
97
97
  {signUpLabel}
98
98
  </Button>
@@ -53,12 +53,12 @@ function SignUpFormInner({
53
53
  <Stack direction="row" gap="s" wrap="wrap">
54
54
  <Button
55
55
  disabled={disabled || loading}
56
- emphasis="ghost"
56
+ variant="ghost"
57
57
  onPress={() => {
58
58
  void onSignIn();
59
59
  }}
60
60
  size="s"
61
- tone="neutral"
61
+ color="neutral"
62
62
  >
63
63
  {signInLabel}
64
64
  </Button>
@@ -62,7 +62,7 @@ function renderUnreadCount(unreadCount: React.ReactNode) {
62
62
  }
63
63
 
64
64
  return (
65
- <Badge size="s" tone="primary">
65
+ <Badge size="s" color="primary">
66
66
  {unreadCount}
67
67
  </Badge>
68
68
  );
@@ -126,7 +126,7 @@ function ChatListItemInner({
126
126
  shape={avatar?.shape}
127
127
  size={avatar?.size ?? (compact ? 's' : 'm')}
128
128
  source={avatar?.source}
129
- tone={avatar?.tone}
129
+ color={avatar?.color}
130
130
  />
131
131
  )}
132
132
 
@@ -136,7 +136,7 @@ function ChatListItemInner({
136
136
  <Box flex={1}>
137
137
  <Text
138
138
  numberOfLines={1}
139
- tone={disabled ? 'muted' : 'default'}
139
+ emphasis={disabled ? 'muted' : 'default'}
140
140
  variant="bodySmall"
141
141
  weight={unread || selected ? 'semiBold' : 'medium'}
142
142
  >
@@ -146,7 +146,8 @@ function ChatListItemInner({
146
146
  {hasTimestamp ? (
147
147
  <Text
148
148
  numberOfLines={1}
149
- tone={unread ? 'primary' : 'subtle'}
149
+ color={unread ? 'primary' : undefined}
150
+ emphasis={unread ? 'default' : 'subtle'}
150
151
  variant="caption"
151
152
  weight={unread ? 'semiBold' : 'regular'}
152
153
  >
@@ -162,7 +163,7 @@ function ChatListItemInner({
162
163
  {hasPreview ? (
163
164
  <Text
164
165
  numberOfLines={1}
165
- tone={unread ? 'default' : 'muted'}
166
+ emphasis={unread ? 'default' : 'muted'}
166
167
  variant="bodySmall"
167
168
  weight={unread ? 'medium' : 'regular'}
168
169
  >
@@ -170,7 +171,7 @@ function ChatListItemInner({
170
171
  </Text>
171
172
  ) : null}
172
173
  {hasMeta ? (
173
- <Text numberOfLines={1} tone="subtle" variant="caption">
174
+ <Text numberOfLines={1} emphasis="subtle" variant="caption">
174
175
  {meta}
175
176
  </Text>
176
177
  ) : null}
@@ -2,7 +2,7 @@ import type React from 'react';
2
2
  import type { ImageSourcePropType } from 'react-native';
3
3
 
4
4
  import type { AvatarShape, AvatarSize } from '../../components/avatar';
5
- import type { ZoraTone } from '../../internal/recipes';
5
+ import type { ZoraColor } from '../../internal/recipes';
6
6
  import type { ZoraBaseProps } from '../../theme/ZoraBaseProps';
7
7
 
8
8
  export interface ChatListAvatar {
@@ -12,7 +12,7 @@ export interface ChatListAvatar {
12
12
  label?: string;
13
13
  size?: AvatarSize;
14
14
  shape?: AvatarShape;
15
- tone?: ZoraTone;
15
+ color?: ZoraColor;
16
16
  }
17
17
 
18
18
  export interface ChatListItemProps extends ZoraBaseProps {