@open-mercato/core 0.7.1-develop.7203.1.9396450b78 → 0.8.1-develop.7204.1.83330e271e

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 (416) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/build.mjs +11 -0
  3. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +23 -0
  4. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  5. package/dist/modules/customers/backend/customers/companies/[id]/page.js +2 -1
  6. package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
  7. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -1
  8. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  9. package/dist/modules/customers/backend/customers/people/[id]/page.js +2 -2
  10. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  11. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -1
  12. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  13. package/dist/modules/customers/lib/detailHelpers.js +4 -0
  14. package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
  15. package/dist/modules/customers/lib/todoCompatibility.js +5 -0
  16. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  17. package/dist/modules/design_system/backend/design-system/page.meta.js +3 -2
  18. package/dist/modules/design_system/backend/design-system/page.meta.js.map +2 -2
  19. package/dist/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
  20. package/dist/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
  21. package/dist/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
  22. package/dist/modules/design_system/gallery/assets/avatar-photo.png +0 -0
  23. package/dist/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
  24. package/dist/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
  25. package/dist/modules/design_system/gallery/assets/crypto-ada.png +0 -0
  26. package/dist/modules/design_system/gallery/assets/crypto-avax.png +0 -0
  27. package/dist/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
  28. package/dist/modules/design_system/gallery/assets/crypto-brand.png +0 -0
  29. package/dist/modules/design_system/gallery/assets/crypto-btc.png +0 -0
  30. package/dist/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
  31. package/dist/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
  32. package/dist/modules/design_system/gallery/assets/crypto-dot.png +0 -0
  33. package/dist/modules/design_system/gallery/assets/crypto-eth.png +0 -0
  34. package/dist/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
  35. package/dist/modules/design_system/gallery/assets/crypto-history.svg +3 -0
  36. package/dist/modules/design_system/gallery/assets/crypto-link.svg +3 -0
  37. package/dist/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
  38. package/dist/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
  39. package/dist/modules/design_system/gallery/assets/crypto-more.svg +3 -0
  40. package/dist/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
  41. package/dist/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
  42. package/dist/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
  43. package/dist/modules/design_system/gallery/assets/crypto-sol.png +0 -0
  44. package/dist/modules/design_system/gallery/assets/crypto-star.svg +3 -0
  45. package/dist/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
  46. package/dist/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
  47. package/dist/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
  48. package/dist/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
  49. package/dist/modules/design_system/gallery/assets/crypto-trx.png +0 -0
  50. package/dist/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
  51. package/dist/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
  52. package/dist/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
  53. package/dist/modules/design_system/gallery/assets/crypto-wei.png +0 -0
  54. package/dist/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
  55. package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js +67 -0
  56. package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js.map +7 -0
  57. package/dist/modules/design_system/gallery/assets/github-logo.png +0 -0
  58. package/dist/modules/design_system/gallery/assets/images.d.js +1 -0
  59. package/dist/modules/design_system/gallery/assets/images.d.js.map +7 -0
  60. package/dist/modules/design_system/gallery/assets/input-european-union.svg +18 -0
  61. package/dist/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
  62. package/dist/modules/design_system/gallery/assets/marketing-artwork.js +83 -0
  63. package/dist/modules/design_system/gallery/assets/marketing-artwork.js.map +7 -0
  64. package/dist/modules/design_system/gallery/assets/menu-apex.svg +18 -0
  65. package/dist/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
  66. package/dist/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
  67. package/dist/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
  68. package/dist/modules/design_system/gallery/assets/select-google.png +0 -0
  69. package/dist/modules/design_system/gallery/assets/select-poland.png +0 -0
  70. package/dist/modules/design_system/gallery/assets/selection-artwork.js +5 -0
  71. package/dist/modules/design_system/gallery/assets/selection-artwork.js.map +7 -0
  72. package/dist/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
  73. package/dist/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
  74. package/dist/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
  75. package/dist/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
  76. package/dist/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
  77. package/dist/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
  78. package/dist/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
  79. package/dist/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
  80. package/dist/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
  81. package/dist/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
  82. package/dist/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
  83. package/dist/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
  84. package/dist/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
  85. package/dist/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
  86. package/dist/modules/design_system/gallery/assets/style-studio-product.png +0 -0
  87. package/dist/modules/design_system/gallery/assets/upload-images.js +8 -0
  88. package/dist/modules/design_system/gallery/assets/upload-images.js.map +7 -0
  89. package/dist/modules/design_system/gallery/components/BrandStylePreview.js +74 -0
  90. package/dist/modules/design_system/gallery/components/BrandStylePreview.js.map +7 -0
  91. package/dist/modules/design_system/gallery/components/CodeSnippet.js +31 -31
  92. package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +2 -2
  93. package/dist/modules/design_system/gallery/components/ColorPlayground.js +408 -0
  94. package/dist/modules/design_system/gallery/components/ColorPlayground.js.map +7 -0
  95. package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js +166 -0
  96. package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js.map +7 -0
  97. package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js +182 -0
  98. package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js.map +7 -0
  99. package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js +80 -0
  100. package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js.map +7 -0
  101. package/dist/modules/design_system/gallery/components/ComponentIndex.js +42 -0
  102. package/dist/modules/design_system/gallery/components/ComponentIndex.js.map +7 -0
  103. package/dist/modules/design_system/gallery/components/DesignSystemHome.js +69 -0
  104. package/dist/modules/design_system/gallery/components/DesignSystemHome.js.map +7 -0
  105. package/dist/modules/design_system/gallery/components/EntryCard.js +47 -41
  106. package/dist/modules/design_system/gallery/components/EntryCard.js.map +2 -2
  107. package/dist/modules/design_system/gallery/components/EntryHeader.js +68 -0
  108. package/dist/modules/design_system/gallery/components/EntryHeader.js.map +7 -0
  109. package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js +19 -0
  110. package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js.map +7 -0
  111. package/dist/modules/design_system/gallery/components/FoundationGuide.js +46 -0
  112. package/dist/modules/design_system/gallery/components/FoundationGuide.js.map +7 -0
  113. package/dist/modules/design_system/gallery/components/GalleryLink.js +21 -0
  114. package/dist/modules/design_system/gallery/components/GalleryLink.js.map +7 -0
  115. package/dist/modules/design_system/gallery/components/GalleryNavigation.js +82 -0
  116. package/dist/modules/design_system/gallery/components/GalleryNavigation.js.map +7 -0
  117. package/dist/modules/design_system/gallery/components/GalleryShell.js +147 -67
  118. package/dist/modules/design_system/gallery/components/GalleryShell.js.map +3 -3
  119. package/dist/modules/design_system/gallery/components/IconsBrowser.js +33 -0
  120. package/dist/modules/design_system/gallery/components/IconsBrowser.js.map +7 -0
  121. package/dist/modules/design_system/gallery/components/SourceLibrary.js +93 -0
  122. package/dist/modules/design_system/gallery/components/SourceLibrary.js.map +7 -0
  123. package/dist/modules/design_system/gallery/components/StyleAgents.js +139 -0
  124. package/dist/modules/design_system/gallery/components/StyleAgents.js.map +7 -0
  125. package/dist/modules/design_system/gallery/components/ThemeTokenReference.js +101 -0
  126. package/dist/modules/design_system/gallery/components/ThemeTokenReference.js.map +7 -0
  127. package/dist/modules/design_system/gallery/components/VariantPreview.js +2 -2
  128. package/dist/modules/design_system/gallery/components/VariantPreview.js.map +2 -2
  129. package/dist/modules/design_system/gallery/components/colorPreview.js +58 -0
  130. package/dist/modules/design_system/gallery/components/colorPreview.js.map +7 -0
  131. package/dist/modules/design_system/gallery/components/colorStudio.js +218 -0
  132. package/dist/modules/design_system/gallery/components/colorStudio.js.map +7 -0
  133. package/dist/modules/design_system/gallery/components/styleAgentBranding.js +46 -0
  134. package/dist/modules/design_system/gallery/components/styleAgentBranding.js.map +7 -0
  135. package/dist/modules/design_system/gallery/components/themeTokens.js +32 -0
  136. package/dist/modules/design_system/gallery/components/themeTokens.js.map +7 -0
  137. package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js +194 -0
  138. package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js.map +7 -0
  139. package/dist/modules/design_system/gallery/demos/ai-product.js +423 -0
  140. package/dist/modules/design_system/gallery/demos/ai-product.js.map +7 -0
  141. package/dist/modules/design_system/gallery/demos/buttons.js +289 -0
  142. package/dist/modules/design_system/gallery/demos/buttons.js.map +7 -0
  143. package/dist/modules/design_system/gallery/demos/cryptocurrency.js +1708 -0
  144. package/dist/modules/design_system/gallery/demos/cryptocurrency.js.map +7 -0
  145. package/dist/modules/design_system/gallery/demos/feeds-code.generated.js +92 -0
  146. package/dist/modules/design_system/gallery/demos/feeds-code.generated.js.map +7 -0
  147. package/dist/modules/design_system/gallery/demos/feeds.js +148 -0
  148. package/dist/modules/design_system/gallery/demos/feeds.js.map +7 -0
  149. package/dist/modules/design_system/gallery/demos/file-upload.js +72 -0
  150. package/dist/modules/design_system/gallery/demos/file-upload.js.map +7 -0
  151. package/dist/modules/design_system/gallery/demos/foundation-reference-data.js +4875 -0
  152. package/dist/modules/design_system/gallery/demos/foundation-reference-data.js.map +7 -0
  153. package/dist/modules/design_system/gallery/demos/foundation-references.js +188 -0
  154. package/dist/modules/design_system/gallery/demos/foundation-references.js.map +7 -0
  155. package/dist/modules/design_system/gallery/demos/key-components-code.generated.js +6 -0
  156. package/dist/modules/design_system/gallery/demos/key-components-code.generated.js.map +7 -0
  157. package/dist/modules/design_system/gallery/demos/key-components.js +127 -0
  158. package/dist/modules/design_system/gallery/demos/key-components.js.map +7 -0
  159. package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js +98 -0
  160. package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js.map +7 -0
  161. package/dist/modules/design_system/gallery/demos/marketing-controls.js +134 -0
  162. package/dist/modules/design_system/gallery/demos/marketing-controls.js.map +7 -0
  163. package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js +195 -0
  164. package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js.map +7 -0
  165. package/dist/modules/design_system/gallery/demos/marketing-widgets.js +586 -0
  166. package/dist/modules/design_system/gallery/demos/marketing-widgets.js.map +7 -0
  167. package/dist/modules/design_system/gallery/demos/menu-fixtures.js +40 -0
  168. package/dist/modules/design_system/gallery/demos/menu-fixtures.js.map +7 -0
  169. package/dist/modules/design_system/gallery/demos/menu-sources.js +295 -0
  170. package/dist/modules/design_system/gallery/demos/menu-sources.js.map +7 -0
  171. package/dist/modules/design_system/gallery/demos/menus.js +150 -0
  172. package/dist/modules/design_system/gallery/demos/menus.js.map +7 -0
  173. package/dist/modules/design_system/gallery/demos/rating-reviews.js +53 -0
  174. package/dist/modules/design_system/gallery/demos/rating-reviews.js.map +7 -0
  175. package/dist/modules/design_system/gallery/demos/registered-icons.js +104 -0
  176. package/dist/modules/design_system/gallery/demos/registered-icons.js.map +7 -0
  177. package/dist/modules/design_system/gallery/demos/selection-cards.js +99 -0
  178. package/dist/modules/design_system/gallery/demos/selection-cards.js.map +7 -0
  179. package/dist/modules/design_system/gallery/demos/shell-code.generated.js +189 -0
  180. package/dist/modules/design_system/gallery/demos/shell-code.generated.js.map +7 -0
  181. package/dist/modules/design_system/gallery/demos/shell.js +330 -0
  182. package/dist/modules/design_system/gallery/demos/shell.js.map +7 -0
  183. package/dist/modules/design_system/gallery/demos/source-artwork.js +120 -0
  184. package/dist/modules/design_system/gallery/demos/source-artwork.js.map +7 -0
  185. package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js +125 -0
  186. package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js.map +7 -0
  187. package/dist/modules/design_system/gallery/demos/source-filters.js +185 -0
  188. package/dist/modules/design_system/gallery/demos/source-filters.js.map +7 -0
  189. package/dist/modules/design_system/gallery/demos/source-icons.js +69 -0
  190. package/dist/modules/design_system/gallery/demos/source-icons.js.map +7 -0
  191. package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js +150 -0
  192. package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js.map +7 -0
  193. package/dist/modules/design_system/gallery/demos/table-cells.js +181 -0
  194. package/dist/modules/design_system/gallery/demos/table-cells.js.map +7 -0
  195. package/dist/modules/design_system/gallery/demos/text-inputs.js +113 -0
  196. package/dist/modules/design_system/gallery/demos/text-inputs.js.map +7 -0
  197. package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js +41 -0
  198. package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js.map +7 -0
  199. package/dist/modules/design_system/gallery/demos/time-picker.js +41 -0
  200. package/dist/modules/design_system/gallery/demos/time-picker.js.map +7 -0
  201. package/dist/modules/design_system/gallery/entries/banners.js +123 -60
  202. package/dist/modules/design_system/gallery/entries/banners.js.map +2 -2
  203. package/dist/modules/design_system/gallery/entries/buttons-snippets.js +433 -0
  204. package/dist/modules/design_system/gallery/entries/buttons-snippets.js.map +7 -0
  205. package/dist/modules/design_system/gallery/entries/buttons.js +127 -148
  206. package/dist/modules/design_system/gallery/entries/buttons.js.map +2 -2
  207. package/dist/modules/design_system/gallery/entries/charts.js +532 -186
  208. package/dist/modules/design_system/gallery/entries/charts.js.map +2 -2
  209. package/dist/modules/design_system/gallery/entries/dates.js +191 -3
  210. package/dist/modules/design_system/gallery/entries/dates.js.map +2 -2
  211. package/dist/modules/design_system/gallery/entries/detail.js +118 -77
  212. package/dist/modules/design_system/gallery/entries/detail.js.map +2 -2
  213. package/dist/modules/design_system/gallery/entries/display.js +1449 -240
  214. package/dist/modules/design_system/gallery/entries/display.js.map +2 -2
  215. package/dist/modules/design_system/gallery/entries/feedback.js +1058 -132
  216. package/dist/modules/design_system/gallery/entries/feedback.js.map +2 -2
  217. package/dist/modules/design_system/gallery/entries/filters.js +231 -103
  218. package/dist/modules/design_system/gallery/entries/filters.js.map +2 -2
  219. package/dist/modules/design_system/gallery/entries/foundations.js +368 -57
  220. package/dist/modules/design_system/gallery/entries/foundations.js.map +2 -2
  221. package/dist/modules/design_system/gallery/entries/icons.js +29 -91
  222. package/dist/modules/design_system/gallery/entries/icons.js.map +2 -2
  223. package/dist/modules/design_system/gallery/entries/inputs-snippets.js +154 -0
  224. package/dist/modules/design_system/gallery/entries/inputs-snippets.js.map +7 -0
  225. package/dist/modules/design_system/gallery/entries/inputs.js +2043 -306
  226. package/dist/modules/design_system/gallery/entries/inputs.js.map +2 -2
  227. package/dist/modules/design_system/gallery/entries/library.js +20 -0
  228. package/dist/modules/design_system/gallery/entries/library.js.map +7 -0
  229. package/dist/modules/design_system/gallery/entries/messages.js +121 -103
  230. package/dist/modules/design_system/gallery/entries/messages.js.map +2 -2
  231. package/dist/modules/design_system/gallery/entries/navigation.js +676 -103
  232. package/dist/modules/design_system/gallery/entries/navigation.js.map +2 -2
  233. package/dist/modules/design_system/gallery/entries/notifications.js +131 -78
  234. package/dist/modules/design_system/gallery/entries/notifications.js.map +2 -2
  235. package/dist/modules/design_system/gallery/entries/overlays.js +611 -203
  236. package/dist/modules/design_system/gallery/entries/overlays.js.map +2 -2
  237. package/dist/modules/design_system/gallery/entries/scaffolding.js +1175 -120
  238. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +2 -2
  239. package/dist/modules/design_system/gallery/entries/schedule.js +79 -54
  240. package/dist/modules/design_system/gallery/entries/schedule.js.map +2 -2
  241. package/dist/modules/design_system/gallery/presentation.js +108 -0
  242. package/dist/modules/design_system/gallery/presentation.js.map +7 -0
  243. package/dist/modules/design_system/gallery/registry.js +8 -5
  244. package/dist/modules/design_system/gallery/registry.js.map +2 -2
  245. package/dist/modules/design_system/gallery/source-library.generated.js +5 -0
  246. package/dist/modules/design_system/gallery/source-library.generated.js.map +7 -0
  247. package/dist/modules/design_system/i18n/de.json +7167 -0
  248. package/dist/modules/design_system/i18n/en.json +7167 -0
  249. package/dist/modules/design_system/i18n/es.json +7167 -0
  250. package/dist/modules/design_system/i18n/ko.json +7167 -0
  251. package/dist/modules/design_system/i18n/pl.json +7167 -0
  252. package/dist/modules/push_notifications/lib/queue.js +1 -31
  253. package/dist/modules/push_notifications/lib/queue.js.map +2 -2
  254. package/jest.config.cjs +1 -0
  255. package/jest.mocks/image.js +1 -0
  256. package/package.json +8 -8
  257. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +50 -0
  258. package/src/modules/customers/backend/customers/companies/[id]/page.tsx +2 -1
  259. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +2 -1
  260. package/src/modules/customers/backend/customers/people/[id]/page.tsx +2 -2
  261. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +2 -1
  262. package/src/modules/customers/lib/detailHelpers.ts +4 -0
  263. package/src/modules/customers/lib/todoCompatibility.ts +10 -0
  264. package/src/modules/design_system/backend/design-system/page.meta.ts +3 -2
  265. package/src/modules/design_system/gallery/assets/README.md +30 -0
  266. package/src/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
  267. package/src/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
  268. package/src/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
  269. package/src/modules/design_system/gallery/assets/avatar-photo.png +0 -0
  270. package/src/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
  271. package/src/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
  272. package/src/modules/design_system/gallery/assets/crypto-ada.png +0 -0
  273. package/src/modules/design_system/gallery/assets/crypto-avax.png +0 -0
  274. package/src/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
  275. package/src/modules/design_system/gallery/assets/crypto-brand.png +0 -0
  276. package/src/modules/design_system/gallery/assets/crypto-btc.png +0 -0
  277. package/src/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
  278. package/src/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
  279. package/src/modules/design_system/gallery/assets/crypto-dot.png +0 -0
  280. package/src/modules/design_system/gallery/assets/crypto-eth.png +0 -0
  281. package/src/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
  282. package/src/modules/design_system/gallery/assets/crypto-history.svg +3 -0
  283. package/src/modules/design_system/gallery/assets/crypto-link.svg +3 -0
  284. package/src/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
  285. package/src/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
  286. package/src/modules/design_system/gallery/assets/crypto-more.svg +3 -0
  287. package/src/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
  288. package/src/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
  289. package/src/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
  290. package/src/modules/design_system/gallery/assets/crypto-sol.png +0 -0
  291. package/src/modules/design_system/gallery/assets/crypto-star.svg +3 -0
  292. package/src/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
  293. package/src/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
  294. package/src/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
  295. package/src/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
  296. package/src/modules/design_system/gallery/assets/crypto-trx.png +0 -0
  297. package/src/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
  298. package/src/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
  299. package/src/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
  300. package/src/modules/design_system/gallery/assets/crypto-wei.png +0 -0
  301. package/src/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
  302. package/src/modules/design_system/gallery/assets/cryptocurrency-artwork.ts +63 -0
  303. package/src/modules/design_system/gallery/assets/github-logo.png +0 -0
  304. package/src/modules/design_system/gallery/assets/images.d.ts +9 -0
  305. package/src/modules/design_system/gallery/assets/input-european-union.svg +18 -0
  306. package/src/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
  307. package/src/modules/design_system/gallery/assets/marketing-artwork.ts +79 -0
  308. package/src/modules/design_system/gallery/assets/menu-apex.svg +18 -0
  309. package/src/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
  310. package/src/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
  311. package/src/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
  312. package/src/modules/design_system/gallery/assets/select-google.png +0 -0
  313. package/src/modules/design_system/gallery/assets/select-poland.png +0 -0
  314. package/src/modules/design_system/gallery/assets/selection-artwork.ts +1 -0
  315. package/src/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
  316. package/src/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
  317. package/src/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
  318. package/src/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
  319. package/src/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
  320. package/src/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
  321. package/src/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
  322. package/src/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
  323. package/src/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
  324. package/src/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
  325. package/src/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
  326. package/src/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
  327. package/src/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
  328. package/src/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
  329. package/src/modules/design_system/gallery/assets/style-studio-product.png +0 -0
  330. package/src/modules/design_system/gallery/assets/upload-images.ts +5 -0
  331. package/src/modules/design_system/gallery/components/BrandStylePreview.tsx +94 -0
  332. package/src/modules/design_system/gallery/components/CodeSnippet.tsx +34 -34
  333. package/src/modules/design_system/gallery/components/ColorPlayground.tsx +324 -0
  334. package/src/modules/design_system/gallery/components/ColorStudioCompositions.tsx +96 -0
  335. package/src/modules/design_system/gallery/components/ColorStudioSpecimen.tsx +164 -0
  336. package/src/modules/design_system/gallery/components/CompactEntrySpecimen.tsx +65 -0
  337. package/src/modules/design_system/gallery/components/ComponentIndex.tsx +47 -0
  338. package/src/modules/design_system/gallery/components/DesignSystemHome.tsx +66 -0
  339. package/src/modules/design_system/gallery/components/EntryCard.tsx +52 -37
  340. package/src/modules/design_system/gallery/components/EntryHeader.tsx +80 -0
  341. package/src/modules/design_system/gallery/components/FamilyEntryPreview.tsx +22 -0
  342. package/src/modules/design_system/gallery/components/FoundationGuide.tsx +43 -0
  343. package/src/modules/design_system/gallery/components/GalleryLink.tsx +19 -0
  344. package/src/modules/design_system/gallery/components/GalleryNavigation.tsx +86 -0
  345. package/src/modules/design_system/gallery/components/GalleryShell.tsx +149 -63
  346. package/src/modules/design_system/gallery/components/IconsBrowser.tsx +40 -0
  347. package/src/modules/design_system/gallery/components/SourceLibrary.tsx +90 -0
  348. package/src/modules/design_system/gallery/components/StyleAgents.tsx +115 -0
  349. package/src/modules/design_system/gallery/components/ThemeTokenReference.tsx +76 -0
  350. package/src/modules/design_system/gallery/components/VariantPreview.tsx +2 -2
  351. package/src/modules/design_system/gallery/components/colorPreview.ts +63 -0
  352. package/src/modules/design_system/gallery/components/colorStudio.ts +260 -0
  353. package/src/modules/design_system/gallery/components/styleAgentBranding.ts +42 -0
  354. package/src/modules/design_system/gallery/components/themeTokens.ts +26 -0
  355. package/src/modules/design_system/gallery/demos/ai-product-code.generated.ts +3 -0
  356. package/src/modules/design_system/gallery/demos/ai-product.tsx +188 -0
  357. package/src/modules/design_system/gallery/demos/buttons.tsx +331 -0
  358. package/src/modules/design_system/gallery/demos/cryptocurrency.tsx +1943 -0
  359. package/src/modules/design_system/gallery/demos/feeds-code.generated.ts +4 -0
  360. package/src/modules/design_system/gallery/demos/feeds.tsx +82 -0
  361. package/src/modules/design_system/gallery/demos/file-upload.tsx +61 -0
  362. package/src/modules/design_system/gallery/demos/foundation-reference-data.ts +4872 -0
  363. package/src/modules/design_system/gallery/demos/foundation-references.tsx +140 -0
  364. package/src/modules/design_system/gallery/demos/key-components-code.generated.ts +3 -0
  365. package/src/modules/design_system/gallery/demos/key-components.tsx +106 -0
  366. package/src/modules/design_system/gallery/demos/marketing-controls-code.generated.ts +3 -0
  367. package/src/modules/design_system/gallery/demos/marketing-controls.tsx +92 -0
  368. package/src/modules/design_system/gallery/demos/marketing-widgets-code.generated.ts +3 -0
  369. package/src/modules/design_system/gallery/demos/marketing-widgets.tsx +189 -0
  370. package/src/modules/design_system/gallery/demos/menu-fixtures.tsx +48 -0
  371. package/src/modules/design_system/gallery/demos/menu-sources.ts +5 -0
  372. package/src/modules/design_system/gallery/demos/menus.tsx +122 -0
  373. package/src/modules/design_system/gallery/demos/rating-reviews.tsx +44 -0
  374. package/src/modules/design_system/gallery/demos/registered-icons.tsx +117 -0
  375. package/src/modules/design_system/gallery/demos/selection-cards.tsx +97 -0
  376. package/src/modules/design_system/gallery/demos/shell-code.generated.ts +3 -0
  377. package/src/modules/design_system/gallery/demos/shell.tsx +183 -0
  378. package/src/modules/design_system/gallery/demos/source-artwork.tsx +88 -0
  379. package/src/modules/design_system/gallery/demos/source-filters-code.generated.ts +3 -0
  380. package/src/modules/design_system/gallery/demos/source-filters.tsx +119 -0
  381. package/src/modules/design_system/gallery/demos/source-icons.tsx +62 -0
  382. package/src/modules/design_system/gallery/demos/table-cells-code.generated.ts +3 -0
  383. package/src/modules/design_system/gallery/demos/table-cells.tsx +144 -0
  384. package/src/modules/design_system/gallery/demos/text-inputs.tsx +90 -0
  385. package/src/modules/design_system/gallery/demos/time-picker-code.generated.ts +5 -0
  386. package/src/modules/design_system/gallery/demos/time-picker.tsx +31 -0
  387. package/src/modules/design_system/gallery/entries/banners.tsx +143 -94
  388. package/src/modules/design_system/gallery/entries/buttons-snippets.ts +432 -0
  389. package/src/modules/design_system/gallery/entries/buttons.tsx +125 -196
  390. package/src/modules/design_system/gallery/entries/charts.tsx +545 -233
  391. package/src/modules/design_system/gallery/entries/dates.tsx +171 -3
  392. package/src/modules/design_system/gallery/entries/detail.tsx +142 -115
  393. package/src/modules/design_system/gallery/entries/display.tsx +1691 -319
  394. package/src/modules/design_system/gallery/entries/feedback.tsx +1082 -169
  395. package/src/modules/design_system/gallery/entries/filters.tsx +238 -143
  396. package/src/modules/design_system/gallery/entries/foundations.tsx +404 -61
  397. package/src/modules/design_system/gallery/entries/icons.tsx +31 -117
  398. package/src/modules/design_system/gallery/entries/inputs-snippets.ts +156 -0
  399. package/src/modules/design_system/gallery/entries/inputs.tsx +2146 -503
  400. package/src/modules/design_system/gallery/entries/library.tsx +16 -0
  401. package/src/modules/design_system/gallery/entries/messages.tsx +114 -106
  402. package/src/modules/design_system/gallery/entries/navigation.tsx +782 -192
  403. package/src/modules/design_system/gallery/entries/notifications.tsx +145 -120
  404. package/src/modules/design_system/gallery/entries/overlays.tsx +696 -280
  405. package/src/modules/design_system/gallery/entries/scaffolding.tsx +1192 -158
  406. package/src/modules/design_system/gallery/entries/schedule.tsx +72 -58
  407. package/src/modules/design_system/gallery/presentation.ts +106 -0
  408. package/src/modules/design_system/gallery/registry.ts +8 -6
  409. package/src/modules/design_system/gallery/source-library.generated.ts +2 -0
  410. package/src/modules/design_system/i18n/de.json +7112 -3
  411. package/src/modules/design_system/i18n/en.json +7112 -3
  412. package/src/modules/design_system/i18n/es.json +7112 -3
  413. package/src/modules/design_system/i18n/ko.json +7112 -3
  414. package/src/modules/design_system/i18n/pl.json +7112 -3
  415. package/src/modules/push_notifications/AGENTS.md +9 -5
  416. package/src/modules/push_notifications/lib/queue.ts +15 -44
@@ -1,7 +1,11 @@
1
1
  import * as React from 'react'
2
- import { Circle } from 'lucide-react'
2
+ import { ArrowRight, Circle } from 'lucide-react'
3
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
3
4
  import { flash } from '@open-mercato/ui/backend/FlashMessages'
5
+ import { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'
6
+ import { Button } from '@open-mercato/ui/primitives/button'
4
7
  import type { GalleryEntry } from '../types'
8
+ import { SourceColors, SourceGrids, SourceRadius, SourceShadows, SourceTypography } from '../demos/foundation-references'
5
9
 
6
10
  // Token names are proper nouns from the codebase and are deliberately not
7
11
  // translated. Structure mirrors the DS Figma color-system sheet (node
@@ -12,32 +16,40 @@ import type { GalleryEntry } from '../types'
12
16
  const TOKENS_IMPORT = 'apps/mercato/src/app/globals.css'
13
17
  const FIGMA_COLORS_NODE = '553:14956'
14
18
 
15
- function SwatchCard({ copyText, label, children }: { copyText: string; label: string; children: React.ReactNode }) {
19
+ function useCopyToken(copyText: string) {
20
+ const t = useT()
16
21
  const onCopy = React.useCallback(async () => {
17
22
  try {
18
23
  await navigator.clipboard.writeText(copyText)
19
- flash(`${copyText} copied`, 'success')
24
+ flash(t('design_system.gallery.tokenCopied', { token: copyText }), 'success')
20
25
  } catch {
21
- flash('Could not copy the token', 'error')
26
+ flash(t('design_system.gallery.tokenCopyFailed'), 'error')
22
27
  }
23
- }, [copyText])
28
+ }, [copyText, t])
29
+ return { onCopy, copyLabel: t('design_system.gallery.copyToken', { token: copyText }) }
30
+ }
31
+
32
+ function SwatchCard({ copyText, label, children }: { copyText: string; label: string; children: React.ReactNode }) {
33
+ const { onCopy, copyLabel } = useCopyToken(copyText)
24
34
  return (
25
- <button
35
+ <Button
26
36
  type="button"
37
+ variant="ghost"
27
38
  onClick={onCopy}
28
- className="flex w-36 flex-col items-start gap-1 rounded-md border border-border bg-background p-2 text-left transition-colors hover:bg-muted/40 focus-visible:outline-none focus-visible:shadow-focus"
29
- title={`Copy ${copyText}`}
39
+ className="h-auto w-44 max-w-full flex-col items-start gap-3 whitespace-normal border border-border bg-background p-3 text-left hover:bg-muted/50"
40
+ title={copyLabel}
41
+ aria-label={copyLabel}
30
42
  >
31
43
  {children}
32
- <code className="break-all text-[11px] leading-tight text-muted-foreground">{label}</code>
33
- </button>
44
+ <code className="break-all text-xs text-muted-foreground">{label}</code>
45
+ </Button>
34
46
  )
35
47
  }
36
48
 
37
49
  function TokenSwatch({ tokenClass, label }: { tokenClass: string; label: string }) {
38
50
  return (
39
51
  <SwatchCard copyText={label} label={label}>
40
- <span aria-hidden className={`h-10 w-full rounded-sm border border-border ${tokenClass}`} />
52
+ <span aria-hidden className={`h-20 w-full rounded-sm border border-border ${tokenClass}`} />
41
53
  </SwatchCard>
42
54
  )
43
55
  }
@@ -46,8 +58,8 @@ function TokenSwatch({ tokenClass, label }: { tokenClass: string; label: string
46
58
  function TextSwatch({ textClass, label }: { textClass: string; label: string }) {
47
59
  return (
48
60
  <SwatchCard copyText={textClass} label={label}>
49
- <span aria-hidden className="flex h-10 w-full items-center justify-center rounded-sm border border-border bg-background">
50
- <span className={`text-xl font-semibold leading-none ${textClass}`}>Aa</span>
61
+ <span aria-hidden className="flex h-20 w-full items-center justify-center rounded-sm border border-border bg-background">
62
+ <span className={`text-3xl font-medium leading-none ${textClass}`}>Aa</span>
51
63
  </span>
52
64
  </SwatchCard>
53
65
  )
@@ -57,7 +69,7 @@ function TextSwatch({ textClass, label }: { textClass: string; label: string })
57
69
  function BorderSwatch({ borderClass, label }: { borderClass: string; label: string }) {
58
70
  return (
59
71
  <SwatchCard copyText={borderClass} label={label}>
60
- <span aria-hidden className={`h-10 w-full rounded-sm border-2 bg-background ${borderClass}`} />
72
+ <span aria-hidden className={`h-20 w-full rounded-sm border-2 bg-background ${borderClass}`} />
61
73
  </SwatchCard>
62
74
  )
63
75
  }
@@ -66,7 +78,7 @@ function BorderSwatch({ borderClass, label }: { borderClass: string; label: stri
66
78
  function IconSwatch({ iconClass, label }: { iconClass: string; label: string }) {
67
79
  return (
68
80
  <SwatchCard copyText={iconClass} label={label}>
69
- <span aria-hidden className="flex h-10 w-full items-center justify-center rounded-sm border border-border bg-background">
81
+ <span aria-hidden className="flex h-20 w-full items-center justify-center rounded-sm border border-border bg-background">
70
82
  <Circle className={`size-4 fill-current ${iconClass}`} />
71
83
  </span>
72
84
  </SwatchCard>
@@ -88,8 +100,8 @@ const brandColorsEntry: GalleryEntry = {
88
100
  title: 'Brand colors',
89
101
  importPath: TOKENS_IMPORT,
90
102
  usage: {
91
- do: ['brand-violet 10/30/100 pattern (bg/border/text) for proposed and feature accents.'],
92
- dont: ['Never theme or repurpose accent-indigo — it is the selection-control contract.'],
103
+ do: ['Use the brand-violet 10/30/100 pattern (bg/border/text) for AI features and user-saved views.'],
104
+ dont: ['Do not substitute brand colors for semantic status tokens.', 'Do not repurpose accent-indigo — it is the selection-control contract.'],
93
105
  },
94
106
  figmaNodeId: FIGMA_COLORS_NODE,
95
107
  variants: [
@@ -100,7 +112,7 @@ const brandColorsEntry: GalleryEntry = {
100
112
  <div className="space-y-2">
101
113
  <div
102
114
  aria-hidden
103
- className="h-16 w-full max-w-md rounded-md border border-border bg-linear-135 from-brand-lime from-0% via-brand-yellow via-35% to-brand-violet to-70%"
115
+ className="h-32 w-full rounded-lg border border-border bg-linear-135 from-brand-lime from-0% via-brand-yellow via-35% to-brand-violet to-70%"
104
116
  />
105
117
  <code className="text-xs text-muted-foreground">brand-lime 0%, brand-yellow 35%, brand-violet 70%</code>
106
118
  </div>
@@ -153,6 +165,14 @@ const colorTokensEntry: GalleryEntry = {
153
165
  },
154
166
  figmaNodeId: FIGMA_COLORS_NODE,
155
167
  variants: [
168
+ {
169
+ id: 'source-palette',
170
+ title: 'Complete source palette',
171
+ render: () => <SourceColors />,
172
+ code: `import { SourceColors } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'
173
+
174
+ <SourceColors />`,
175
+ },
156
176
  {
157
177
  id: 'primary',
158
178
  title: 'primary',
@@ -198,7 +218,7 @@ const colorTokensEntry: GalleryEntry = {
198
218
  <TextSwatch textClass="text-text-disabled" label="text-text-disabled" />
199
219
  </div>
200
220
  ),
201
- code: `<p className="text-muted-foreground">Secondary copy</p>`,
221
+ code: `<p className="text-muted-foreground">{t('design_system.gallery.samples.typeBody')}</p>`,
202
222
  },
203
223
  {
204
224
  id: 'stroke',
@@ -259,6 +279,15 @@ function StatusFamilyPreview({ family }: { family: StatusFamily }) {
259
279
  )
260
280
  }
261
281
 
282
+ function FeatureStatePreview() {
283
+ const t = useT()
284
+ return (
285
+ <Alert status="feature" className="max-w-md">
286
+ <AlertDescription>{t('design_system.gallery.samples.featureState')}</AlertDescription>
287
+ </Alert>
288
+ )
289
+ }
290
+
262
291
  const stateTokensEntry: GalleryEntry = {
263
292
  id: 'state-tokens',
264
293
  title: 'State color tokens',
@@ -267,6 +296,7 @@ const stateTokensEntry: GalleryEntry = {
267
296
  do: [
268
297
  'Pair -bg with -text of the same family — the shades are contrast-tested together.',
269
298
  '-icon for glyphs and dots, -border for outlines; both handle dark mode themselves.',
299
+ 'Alert status="feature" uses the neutral token family; brand-violet is reserved for AI and saved-view accents.',
270
300
  ],
271
301
  dont: [
272
302
  'Never hardcode Tailwind status colors (text-red-*, bg-green-*, text-amber-*).',
@@ -283,13 +313,13 @@ const stateTokensEntry: GalleryEntry = {
283
313
  })),
284
314
  {
285
315
  id: 'feature',
286
- title: 'Feature → brand-violet pattern',
287
- render: () => (
288
- <div className="flex max-w-md items-center gap-2 rounded-md border border-brand-violet/30 bg-brand-violet/10 p-3 text-sm text-brand-violet">
289
- Feature state uses the brand-violet 10/30/100 pattern, not a status family.
290
- </div>
291
- ),
292
- code: `<Alert status="feature" />`,
316
+ title: 'Feature → status-neutral',
317
+ render: () => <FeatureStatePreview />,
318
+ code: `import { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'
319
+
320
+ <Alert status="feature" className="max-w-md">
321
+ <AlertDescription>{t('design_system.gallery.samples.featureState')}</AlertDescription>
322
+ </Alert>`,
293
323
  },
294
324
  ],
295
325
  }
@@ -353,31 +383,27 @@ type ColorRole = {
353
383
  }
354
384
 
355
385
  function RoleCard({ role }: { role: ColorRole }) {
356
- const label = `${role.surface} / ${role.onSurface}`
357
- const onCopy = React.useCallback(async () => {
358
- try {
359
- await navigator.clipboard.writeText(`${role.surfaceCls} ${role.onSurfaceCls}`)
360
- flash(`${role.surfaceCls} ${role.onSurfaceCls} copied`, 'success')
361
- } catch {
362
- flash('Could not copy the classes', 'error')
363
- }
364
- }, [role])
386
+ const { onCopy, copyLabel } = useCopyToken(`${role.surfaceCls} ${role.onSurfaceCls}`)
365
387
  return (
366
- <button
388
+ <Button
367
389
  type="button"
390
+ variant="ghost"
368
391
  onClick={onCopy}
369
- title={`Copy ${role.surfaceCls} ${role.onSurfaceCls}`}
370
- className={`flex h-24 w-full flex-col justify-between rounded-md border p-3 text-left transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:shadow-focus ${role.surfaceCls} ${role.onSurfaceCls} ${role.borderCls ?? 'border-border'}`}
392
+ title={copyLabel}
393
+ aria-label={copyLabel}
394
+ className="h-auto w-full whitespace-normal p-0 text-left transition-opacity hover:bg-transparent hover:opacity-90"
371
395
  >
372
- <span className="text-sm font-medium leading-tight">{role.surface}</span>
373
- <code className="text-xs opacity-80">{role.onSurface}</code>
374
- </button>
396
+ <span className={`flex h-36 w-full flex-col items-start justify-between rounded-lg border p-4 ${role.surfaceCls} ${role.onSurfaceCls} ${role.borderCls ?? 'border-border'}`}>
397
+ <span className="text-base font-medium leading-tight">{role.surface}</span>
398
+ <code className="text-xs opacity-80">{role.onSurface}</code>
399
+ </span>
400
+ </Button>
375
401
  )
376
402
  }
377
403
 
378
404
  function RoleGrid({ roles }: { roles: ColorRole[] }) {
379
405
  return (
380
- <div className="grid w-full gap-2 sm:grid-cols-2 lg:grid-cols-3">
406
+ <div className="grid w-full gap-4 sm:grid-cols-2 xl:grid-cols-3">
381
407
  {roles.map((role) => (
382
408
  <RoleCard key={role.surface + role.onSurface} role={role} />
383
409
  ))}
@@ -415,7 +441,9 @@ const colorRolesEntry: GalleryEntry = {
415
441
  ]}
416
442
  />
417
443
  ),
418
- code: `<button className="bg-primary text-primary-foreground" />`,
444
+ code: `import { Button } from '@open-mercato/ui/primitives/button'
445
+
446
+ <Button type="button">{t('design_system.gallery.samples.primaryAction')}</Button>`,
419
447
  },
420
448
  {
421
449
  id: 'surfaces',
@@ -439,12 +467,12 @@ const colorRolesEntry: GalleryEntry = {
439
467
  title: 'status',
440
468
  render: () => (
441
469
  <RoleGrid
442
- roles={['error', 'success', 'warning', 'info', 'neutral', 'pink'].map((status) => ({
443
- surface: `status-${status}-bg`,
444
- onSurface: `status-${status}-text`,
445
- surfaceCls: `bg-status-${status}-bg`,
446
- onSurfaceCls: `text-status-${status}-text`,
447
- borderCls: `border-status-${status}-border`,
470
+ roles={FIGMA_STATE_TO_CODE.map((family) => ({
471
+ surface: `status-${family.status}-bg`,
472
+ onSurface: `status-${family.status}-text`,
473
+ surfaceCls: family.bg,
474
+ onSurfaceCls: family.text,
475
+ borderCls: family.border,
448
476
  }))}
449
477
  />
450
478
  ),
@@ -463,27 +491,22 @@ const RADIUS_SCALE: Array<{ cls: string; label: string; px: string }> = [
463
491
  ]
464
492
 
465
493
  function RadiusCard({ cls, label, px }: { cls: string; label: string; px: string }) {
466
- const onCopy = React.useCallback(async () => {
467
- try {
468
- await navigator.clipboard.writeText(label)
469
- flash(`${label} copied`, 'success')
470
- } catch {
471
- flash('Could not copy the class', 'error')
472
- }
473
- }, [label])
494
+ const { onCopy, copyLabel } = useCopyToken(label)
474
495
  return (
475
- <button
496
+ <Button
476
497
  type="button"
498
+ variant="ghost"
477
499
  onClick={onCopy}
478
- title={`Copy ${label}`}
479
- className="flex w-36 flex-col items-start gap-2 rounded-md border border-border bg-background p-2 text-left transition-colors hover:bg-muted/40"
500
+ title={copyLabel}
501
+ aria-label={copyLabel}
502
+ className="h-auto w-36 flex-col items-start gap-2 border border-border bg-background p-2 text-left hover:bg-muted/50"
480
503
  >
481
504
  <span aria-hidden className={`h-14 w-full border-2 border-dashed border-status-pink-icon bg-status-pink-bg ${cls}`} />
482
505
  <span className="space-y-0.5">
483
506
  <code className="block text-xs text-foreground">{label}</code>
484
507
  <span className="block text-xs text-muted-foreground">{px}</span>
485
508
  </span>
486
- </button>
509
+ </Button>
487
510
  )
488
511
  }
489
512
 
@@ -491,6 +514,7 @@ const radiusEntry: GalleryEntry = {
491
514
  id: 'corner-radius',
492
515
  title: 'Corner radius',
493
516
  importPath: TOKENS_IMPORT,
517
+ figmaNodeId: '553:14961',
494
518
  keywords: ['radius', 'rounded', 'border-radius', 'corners'],
495
519
  usage: {
496
520
  do: [
@@ -504,6 +528,14 @@ const radiusEntry: GalleryEntry = {
504
528
  ],
505
529
  },
506
530
  variants: [
531
+ {
532
+ id: 'source-radius',
533
+ title: 'Complete radius scale',
534
+ render: () => <SourceRadius />,
535
+ code: `import { SourceRadius } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'
536
+
537
+ <SourceRadius />`,
538
+ },
507
539
  {
508
540
  id: 'scale',
509
541
  title: 'scale',
@@ -519,6 +551,313 @@ const radiusEntry: GalleryEntry = {
519
551
  ],
520
552
  }
521
553
 
554
+ const TYPOGRAPHY_ROLES = [
555
+ { id: 'page', className: 'text-2xl font-bold tracking-tight', metrics: '24 / 32 px' },
556
+ { id: 'section', className: 'text-xl font-semibold', metrics: '20 / 28 px' },
557
+ { id: 'body', className: 'text-sm', metrics: '14 / 20 px' },
558
+ { id: 'label', className: 'text-sm font-medium', metrics: '14 / 20 px' },
559
+ { id: 'helper', className: 'text-xs text-muted-foreground', metrics: '12 / 16 px' },
560
+ ] as const
561
+
562
+ function TypographyRolesPreview() {
563
+ const t = useT()
564
+ return <div className="space-y-6">
565
+ <p className="max-w-3xl text-sm leading-relaxed text-muted-foreground">{t('design_system.foundations.typography.guide.intro')}</p>
566
+ <div className="divide-y divide-border border-y border-border">
567
+ {TYPOGRAPHY_ROLES.map(role => <article key={role.id} className="grid min-w-0 gap-4 py-6 md:grid-cols-3 md:gap-8" data-typography-role={role.id}>
568
+ <div className="space-y-2">
569
+ <h4 className="text-sm font-medium">{t(`design_system.foundations.typography.guide.${role.id}.title`)}</h4>
570
+ <p className="text-xs text-muted-foreground">{role.metrics}</p>
571
+ </div>
572
+ <div className="min-w-0 space-y-3 md:col-span-2">
573
+ <p className={`${role.className} break-words`}>{t(`design_system.foundations.typography.guide.${role.id}.example`)}</p>
574
+ <p className="max-w-prose text-sm leading-relaxed text-muted-foreground">{t(`design_system.foundations.typography.guide.${role.id}.usage`)}</p>
575
+ </div>
576
+ </article>)}
577
+ </div>
578
+ <p className="max-w-3xl text-sm leading-relaxed text-muted-foreground">{t('design_system.foundations.typography.guide.fonts')}</p>
579
+ </div>
580
+ }
581
+
582
+ function TypographyReferencePreview() {
583
+ const t = useT()
584
+ return <section className="rounded-lg border border-border">
585
+ <h3 className="p-4 text-sm font-medium">{t('design_system.foundations.typography.guide.reference')}</h3>
586
+ <div className="space-y-8 border-t border-border p-4 sm:p-6">
587
+ <div className="space-y-3">
588
+ <h4 className="text-sm font-medium">{t('design_system.foundations.typography.guide.classes')}</h4>
589
+ <dl className="divide-y divide-border">
590
+ {TYPOGRAPHY_ROLES.map(role => <div key={role.id} className="flex flex-wrap justify-between gap-2 py-3 text-sm">
591
+ <dt>{t(`design_system.foundations.typography.guide.${role.id}.title`)}</dt>
592
+ <dd><code className="break-words text-xs text-muted-foreground">{role.className}</code></dd>
593
+ </div>)}
594
+ </dl>
595
+ </div>
596
+ <SourceTypography />
597
+ </div>
598
+ </section>
599
+ }
600
+
601
+ const typographyEntry: GalleryEntry = {
602
+ id: 'typography',
603
+ title: 'Typography',
604
+ importPath: TOKENS_IMPORT,
605
+ figmaNodeId: '553:14957',
606
+ keywords: ['font', 'type', 'heading', 'body', 'line-height', 'Geist', 'Inter'],
607
+ usage: {
608
+ do: [
609
+ 'Use font-sans for the interface and font-mono for code and identifiers. Both resolve through the host application font tokens, with system fallbacks in globals.css.',
610
+ 'Use text-2xl for backend page titles and text-sm for body text. Scale measurements assume a 16px root font size.',
611
+ 'The Figma reference uses Inter / Inter Display; these specimens show the shipped font tokens rather than claiming font parity.',
612
+ ],
613
+ dont: ['Do not copy marketing display sizes into dense backend pages.', 'Do not set inline font families or arbitrary text sizes.'],
614
+ },
615
+ variants: [
616
+ {
617
+ id: 'roles',
618
+ title: 'Text hierarchy',
619
+ render: () => <TypographyRolesPreview />,
620
+ code: `import { Label } from '@open-mercato/ui/primitives/label'
621
+ import { Input } from '@open-mercato/ui/primitives/input'
622
+
623
+ <h1 className="text-2xl font-bold tracking-tight">{t('design_system.foundations.typography.guide.page.example')}</h1>
624
+ <h2 className="text-xl font-semibold">{t('design_system.foundations.typography.guide.section.example')}</h2>
625
+ <p className="text-sm">{t('design_system.foundations.typography.guide.body.example')}</p>
626
+ <Label htmlFor="name">{t('design_system.foundations.typography.guide.label.example')}</Label>
627
+ <Input id="name" aria-describedby="name-hint" />
628
+ <p id="name-hint" className="text-xs text-muted-foreground">{t('design_system.foundations.typography.guide.helper.example')}</p>`,
629
+ },
630
+ {
631
+ id: 'source-typography',
632
+ title: 'Complete typography scale',
633
+ render: () => <TypographyReferencePreview />,
634
+ code: `import { SourceTypography } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'
635
+
636
+ <SourceTypography />`,
637
+ },
638
+ ],
639
+ }
640
+
641
+ const SPACING_SCALE = [
642
+ { token: '1', className: 'w-1', pixels: 4 },
643
+ { token: '2', className: 'w-2', pixels: 8 },
644
+ { token: '3', className: 'w-3', pixels: 12 },
645
+ { token: '4', className: 'w-4', pixels: 16 },
646
+ { token: '6', className: 'w-6', pixels: 24 },
647
+ { token: '8', className: 'w-8', pixels: 32 },
648
+ { token: '12', className: 'w-12', pixels: 48 },
649
+ ]
650
+
651
+ function SpacingScalePreview() {
652
+ const t = useT()
653
+ return (
654
+ <div className="w-full space-y-6">
655
+ <p className="text-sm text-muted-foreground">{t('design_system.foundations.spacing.scaleHint')}</p>
656
+ {SPACING_SCALE.map((item) => (
657
+ <div key={item.token} className="flex items-center gap-4 py-2">
658
+ <code className="w-12 shrink-0 text-sm text-muted-foreground">p-{item.token}</code>
659
+ <div className="min-w-0 flex-1"><span aria-hidden className="block h-8 rounded-sm border-l-4 border-primary bg-muted" style={{ width: `${item.pixels / 48 * 100}%` }} /></div>
660
+ <span className="w-28 shrink-0 font-mono text-xs"><span>{item.pixels / 16} rem</span><span className="ml-3 text-muted-foreground">{item.pixels} px</span></span>
661
+ </div>
662
+ ))}
663
+ </div>
664
+ )
665
+ }
666
+
667
+ function SpacingRhythmPreview() {
668
+ return (
669
+ <div className="grid w-full gap-6 md:grid-cols-2">
670
+ {[
671
+ { padding: 'p-4', gap: 'gap-2' },
672
+ { padding: 'p-6', gap: 'gap-4' },
673
+ ].map((item) => (
674
+ <div key={item.padding} className={`space-y-4 rounded-lg border border-border bg-muted/30 ${item.padding}`}>
675
+ <code className="text-xs text-muted-foreground">{item.padding} / {item.gap}</code>
676
+ <div aria-hidden className={`flex ${item.gap}`}>
677
+ <span className="h-12 flex-1 rounded-md border border-border bg-background" />
678
+ <span className="h-12 flex-1 rounded-md border border-border bg-background" />
679
+ <span className="h-12 flex-1 rounded-md border border-border bg-background" />
680
+ </div>
681
+ </div>
682
+ ))}
683
+ </div>
684
+ )
685
+ }
686
+
687
+ const spacingEntry: GalleryEntry = {
688
+ id: 'spacing',
689
+ title: 'Spacing',
690
+ importPath: TOKENS_IMPORT,
691
+ figmaNodeId: '553:14958',
692
+ keywords: ['padding', 'gap', 'margin', 'grid', 'rhythm'],
693
+ usage: {
694
+ do: ['Use the 4px spacing grid. Start with gap-2 between controls, p-4 within containers and p-6 for larger panels.'],
695
+ dont: ['Do not invent arbitrary spacing values or compensate for layout problems with negative margins.'],
696
+ },
697
+ variants: [
698
+ {
699
+ id: 'source-grids',
700
+ title: 'Layout grids',
701
+ render: () => <SourceGrids />,
702
+ code: `import { SourceGrids } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'
703
+
704
+ <SourceGrids />`,
705
+ },
706
+ {
707
+ id: 'scale',
708
+ title: 'Spacing scale',
709
+ render: () => <SpacingScalePreview />,
710
+ code: `<div className="flex gap-2 p-4">{children}</div>
711
+ <section className="space-y-6 p-6">{children}</section>`,
712
+ },
713
+ {
714
+ id: 'rhythm',
715
+ title: 'Container rhythm',
716
+ render: () => <SpacingRhythmPreview />,
717
+ code: `<div className="p-4">
718
+ <div className="flex gap-2">{children}</div>
719
+ </div>
720
+ <div className="p-6">
721
+ <div className="flex gap-4">{children}</div>
722
+ </div>`,
723
+ },
724
+ ],
725
+ }
726
+
727
+ const SHADOW_SCALE = ['shadow-none', 'shadow-xs', 'shadow-sm', 'shadow-md', 'shadow-lg', 'shadow-xl', 'shadow-2xl']
728
+
729
+ function ShadowScalePreview() {
730
+ return (
731
+ <div className="grid w-full grid-cols-2 gap-6 p-4 md:grid-cols-3 lg:grid-cols-4">
732
+ {SHADOW_SCALE.map((className) => (
733
+ <div key={className} className={`flex h-24 items-center justify-center rounded-lg border border-border bg-card p-4 ${className}`}>
734
+ <code className="text-xs text-card-foreground">{className}</code>
735
+ </div>
736
+ ))}
737
+ </div>
738
+ )
739
+ }
740
+
741
+ function FocusPreview() {
742
+ const t = useT()
743
+ return (
744
+ <div className="space-y-4 p-2">
745
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.samples.focusHint')}</p>
746
+ <div className="flex flex-wrap items-center gap-6">
747
+ <Button type="button" variant="outline">{t('design_system.gallery.samples.focusAction')}</Button>
748
+ <span aria-hidden className="rounded-md border border-border bg-background px-4 py-2 text-sm shadow-focus">shadow-focus</span>
749
+ </div>
750
+ </div>
751
+ )
752
+ }
753
+
754
+ const shadowsEntry: GalleryEntry = {
755
+ id: 'shadows',
756
+ title: 'Shadows & focus',
757
+ importPath: TOKENS_IMPORT,
758
+ figmaNodeId: '553:14959',
759
+ keywords: ['elevation', 'depth', 'focus', 'keyboard'],
760
+ usage: {
761
+ do: ['Use shadow-xs for controls, shadow-sm for cards and higher elevations for overlays.', 'Keep the visible keyboard focus supplied by DS primitives. Shadow tokens adapt to the active theme.'],
762
+ dont: ['Do not draw custom colored glows or arbitrary box shadows.', 'Do not remove focus feedback without an equivalent visible indicator.'],
763
+ },
764
+ variants: [
765
+ {
766
+ id: 'source-shadows',
767
+ title: 'Complete shadow collection',
768
+ render: () => <SourceShadows />,
769
+ code: `import { SourceShadows } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'
770
+
771
+ <SourceShadows />`,
772
+ },
773
+ {
774
+ id: 'elevation',
775
+ title: 'Elevation scale',
776
+ render: () => <ShadowScalePreview />,
777
+ code: `<div className="rounded-lg border border-border bg-card p-4 shadow-sm">{children}</div>
778
+ <div className="rounded-lg border border-border bg-popover p-4 shadow-lg">{children}</div>`,
779
+ },
780
+ {
781
+ id: 'focus',
782
+ title: 'Keyboard focus',
783
+ render: () => <FocusPreview />,
784
+ code: `import { Button } from '@open-mercato/ui/primitives/button'
785
+
786
+ <Button type="button" variant="outline">{t('design_system.gallery.samples.focusAction')}</Button>`,
787
+ },
788
+ ],
789
+ }
790
+
791
+ function MotionPreview() {
792
+ const t = useT()
793
+ const [active, setActive] = React.useState(false)
794
+ return (
795
+ <div className="w-full space-y-4">
796
+ <Button type="button" variant="outline" aria-pressed={active} onClick={() => setActive((value) => !value)}>
797
+ {t('design_system.gallery.samples.toggleMotion')}
798
+ </Button>
799
+ <div className="grid gap-4 md:grid-cols-3">
800
+ <div className="space-y-3 rounded-lg border border-border p-4">
801
+ <code className="text-xs text-muted-foreground">transition-colors / 150 ms</code>
802
+ <div aria-hidden className={`h-12 rounded-md transition-colors duration-150 motion-reduce:transition-none ${active ? 'bg-primary' : 'bg-muted'}`} />
803
+ </div>
804
+ <div className="space-y-3 rounded-lg border border-border p-4">
805
+ <code className="text-xs text-muted-foreground">transition-opacity / 200 ms</code>
806
+ <div aria-hidden className={`h-12 rounded-md bg-primary transition-opacity duration-200 ease-out motion-reduce:transition-none ${active ? 'opacity-100' : 'opacity-30'}`} />
807
+ </div>
808
+ <div className="space-y-3 rounded-lg border border-border p-4">
809
+ <code className="text-xs text-muted-foreground">transition-transform / 300 ms</code>
810
+ <div aria-hidden className="flex h-12 items-center">
811
+ <ArrowRight className={`size-6 text-foreground transition-transform duration-300 ease-out motion-reduce:transition-none ${active ? 'translate-x-8' : 'translate-x-0'}`} />
812
+ </div>
813
+ </div>
814
+ <div className="space-y-3 rounded-lg border border-border p-4">
815
+ <code className="text-xs text-muted-foreground">transition-opacity / 400 ms</code>
816
+ <div aria-hidden className={`h-12 rounded-md bg-primary transition-opacity duration-400 ease-out motion-reduce:transition-none ${active ? 'opacity-100' : 'opacity-30'}`} />
817
+ </div>
818
+ <div className="space-y-3 rounded-lg border border-border p-4">
819
+ <code className="text-xs text-muted-foreground">transition-opacity / 500 ms</code>
820
+ <div aria-hidden className={`h-12 rounded-md bg-primary transition-opacity duration-500 ease-out motion-reduce:transition-none ${active ? 'opacity-100' : 'opacity-30'}`} />
821
+ </div>
822
+ </div>
823
+ <p className="text-xs text-muted-foreground">{t('design_system.gallery.samples.reducedMotion')}</p>
824
+ </div>
825
+ )
826
+ }
827
+
828
+ const motionEntry: GalleryEntry = {
829
+ id: 'motion',
830
+ title: 'Motion',
831
+ importPath: TOKENS_IMPORT,
832
+ figmaNodeId: '553:14960',
833
+ keywords: ['animation', 'transition', 'duration', 'reduced-motion'],
834
+ usage: {
835
+ do: ['The Figma duration scale is 150, 200, 300, 400 and 500ms; choose timing according to content size and travel distance.', 'Name the changing property and respect reduced-motion preferences.'],
836
+ dont: ['Do not use animation as the only feedback for a state change.', 'Do not use transition-all when only one property changes.'],
837
+ },
838
+ variants: [
839
+ {
840
+ id: 'durations',
841
+ title: 'Interactive duration scale',
842
+ render: () => <MotionPreview />,
843
+ code: `import * as React from 'react'
844
+ import { ArrowRight } from 'lucide-react'
845
+ import { Button } from '@open-mercato/ui/primitives/button'
846
+
847
+ const [active, setActive] = React.useState(false)
848
+
849
+ <Button type="button" variant="outline" aria-pressed={active} onClick={() => setActive((value) => !value)}>
850
+ {t('design_system.gallery.samples.toggleMotion')}
851
+ </Button>
852
+ <div aria-hidden className={['h-12 rounded-md transition-colors duration-150 motion-reduce:transition-none', active ? 'bg-primary' : 'bg-muted'].join(' ')} />
853
+ <div aria-hidden className={['h-12 rounded-md bg-primary transition-opacity duration-200 ease-out motion-reduce:transition-none', active ? 'opacity-100' : 'opacity-30'].join(' ')} />
854
+ <ArrowRight aria-hidden className={['size-6 transition-transform duration-300 ease-out motion-reduce:transition-none', active ? 'translate-x-8' : 'translate-x-0'].join(' ')} />
855
+ <div aria-hidden className={['h-12 rounded-md bg-primary transition-opacity duration-400 ease-out motion-reduce:transition-none', active ? 'opacity-100' : 'opacity-30'].join(' ')} />
856
+ <div aria-hidden className={['h-12 rounded-md bg-primary transition-opacity duration-500 ease-out motion-reduce:transition-none', active ? 'opacity-100' : 'opacity-30'].join(' ')} />`,
857
+ },
858
+ ],
859
+ }
860
+
522
861
  export const entries: GalleryEntry[] = [
523
862
  brandColorsEntry,
524
863
  colorRolesEntry,
@@ -526,4 +865,8 @@ export const entries: GalleryEntry[] = [
526
865
  stateTokensEntry,
527
866
  chartPaletteEntry,
528
867
  radiusEntry,
868
+ typographyEntry,
869
+ spacingEntry,
870
+ shadowsEntry,
871
+ motionEntry,
529
872
  ]