@open-mercato/core 0.7.1-develop.7203.1.9396450b78 → 0.8.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 (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 -9
  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
@@ -0,0 +1,93 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { GalleryLink as Link } from "./GalleryLink.js";
5
+ import { ArrowRight } from "lucide-react";
6
+ import { LinkButton } from "@open-mercato/ui/primitives/link-button";
7
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
8
+ import { EmptyState } from "@open-mercato/ui/primitives/empty-state";
9
+ import { Pagination } from "@open-mercato/ui/primitives/pagination";
10
+ import { SearchInput } from "@open-mercato/ui/primitives/search-input";
11
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@open-mercato/ui/primitives/select";
12
+ import { GALLERY_BASE_PATH } from "../registry.js";
13
+ import { sourceLibrary } from "../source-library.generated.js";
14
+ const pageSize = 12;
15
+ const allGroups = "__all";
16
+ const groupTranslationKey = (group) => `design_system.gallery.sourceLibrary.groups.${group.toLowerCase().replace(/\s+/g, "-")}`;
17
+ function SourceLibrary() {
18
+ const t = useT();
19
+ const storyTitle = (story) => story.family === "foundations" ? t(`design_system.foundations.${story.entryId}.title`, story.title) : story.title;
20
+ const [query, setQuery] = React.useState("");
21
+ const [group, setGroup] = React.useState(allGroups);
22
+ const [page, setPage] = React.useState(1);
23
+ const groups = React.useMemo(() => Array.from(new Set(sourceLibrary.pages.map((item) => item.group))), []);
24
+ const needle = query.trim().toLowerCase();
25
+ const filtered = sourceLibrary.pages.filter((item) => {
26
+ const matchesGroup = group === allGroups || item.group === group;
27
+ const translatedName = t(`design_system.gallery.sourceLibrary.names.${item.id}`, item.name);
28
+ const translatedGroup = t(groupTranslationKey(item.group), item.group);
29
+ const searchTerms = t(`design_system.gallery.sourceLibrary.searchTerms.${item.id}`, "");
30
+ const searchable = `${item.name} ${translatedName} ${item.group} ${translatedGroup} ${searchTerms} ${item.stories.map((story) => `${story.title} ${storyTitle(story)}`).join(" ")} ${item.sets.map((set) => `${set.name} ${Object.values(set.axes).flat().join(" ")}`).join(" ")} ${item.standalone.map((asset) => asset.name).join(" ")}`;
31
+ return matchesGroup && searchable.toLowerCase().includes(needle);
32
+ });
33
+ const visible = filtered.slice((page - 1) * pageSize, page * pageSize);
34
+ return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 space-y-4", "data-example": "native-source-library", children: [
35
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("design_system.gallery.sourceLibrary.boundary") }),
36
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row", children: [
37
+ /* @__PURE__ */ jsx(SearchInput, { className: "sm:flex-1", value: query, onChange: (value) => {
38
+ setQuery(value);
39
+ setPage(1);
40
+ }, "aria-label": t("design_system.gallery.sourceLibrary.search"), placeholder: t("design_system.gallery.sourceLibrary.search") }),
41
+ /* @__PURE__ */ jsxs(Select, { value: group, onValueChange: (value) => {
42
+ setGroup(value);
43
+ setPage(1);
44
+ }, children: [
45
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "w-full sm:w-64", "aria-label": t("design_system.gallery.sourceLibrary.group"), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
46
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
47
+ /* @__PURE__ */ jsx(SelectItem, { value: allGroups, children: t("design_system.gallery.sourceLibrary.allGroups") }),
48
+ groups.map((value) => /* @__PURE__ */ jsx(SelectItem, { value, children: t(groupTranslationKey(value), value) }, value))
49
+ ] })
50
+ ] })
51
+ ] }),
52
+ /* @__PURE__ */ jsx("p", { role: "status", className: "text-sm text-muted-foreground", children: t("design_system.gallery.sourceLibrary.count", { visible: filtered.length, total: sourceLibrary.pages.length }) }),
53
+ visible.length ? /* @__PURE__ */ jsx("div", { className: "divide-y divide-border rounded-lg border border-border bg-card", children: visible.map((item) => {
54
+ const variantCount = item.sets.reduce((total, set) => total + set.count, 0);
55
+ const hasInventory = item.sets.length > 0 || item.standaloneCount > 0 || item.frameCount > 0;
56
+ return /* @__PURE__ */ jsxs("article", { className: "grid min-w-0 gap-4 p-5 lg:grid-cols-3", children: [
57
+ /* @__PURE__ */ jsxs("header", { className: "space-y-1", children: [
58
+ /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold leading-tight", children: t(`design_system.gallery.sourceLibrary.names.${item.id}`, item.name) }),
59
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t(groupTranslationKey(item.group), item.group) })
60
+ ] }),
61
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-3 lg:col-span-2", children: [
62
+ item.stories.length ? /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-6 gap-y-3", "aria-label": t("design_system.gallery.sourceLibrary.examples"), children: item.stories.map((story) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(LinkButton, { asChild: true, variant: "black", children: /* @__PURE__ */ jsxs(Link, { href: `${GALLERY_BASE_PATH}?family=${story.family}&entry=${story.entryId}`, children: [
63
+ storyTitle(story),
64
+ /* @__PURE__ */ jsx(ArrowRight, { className: "size-4 text-muted-foreground", "aria-hidden": "true" })
65
+ ] }) }) }, `${story.family}:${story.entryId}`)) }) : /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("design_system.gallery.sourceLibrary.referenceOnly") }),
66
+ hasInventory ? /* @__PURE__ */ jsxs("section", { className: "text-sm", children: [
67
+ /* @__PURE__ */ jsx("h4", { className: "text-xs font-medium text-muted-foreground", children: t("design_system.gallery.sourceLibrary.details") }),
68
+ /* @__PURE__ */ jsxs("div", { className: "mt-3 space-y-4 border-l border-border pl-4", children: [
69
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground", children: [
70
+ item.sets.length ? /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.sourceLibrary.componentSets", { count: item.sets.length }) }) : null,
71
+ variantCount ? /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.sourceLibrary.variants", { count: variantCount }) }) : null,
72
+ item.frameCount ? /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.sourceLibrary.frames", { count: item.frameCount }) }) : null,
73
+ item.standaloneCount ? /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.sourceLibrary.assets", { count: item.standaloneCount }) }) : null
74
+ ] }),
75
+ item.sets.map((set) => /* @__PURE__ */ jsxs("section", { className: "space-y-2", children: [
76
+ /* @__PURE__ */ jsx("h4", { className: "text-sm font-medium", children: set.name }),
77
+ /* @__PURE__ */ jsx("dl", { className: "space-y-2", children: Object.entries(set.axes).map(([axis, values]) => /* @__PURE__ */ jsxs("div", { className: "text-xs", children: [
78
+ /* @__PURE__ */ jsx("dt", { className: "font-medium", children: axis }),
79
+ /* @__PURE__ */ jsx("dd", { className: "break-words text-muted-foreground", children: values.join(" \xB7 ") })
80
+ ] }, axis)) })
81
+ ] }, set.id))
82
+ ] })
83
+ ] }) : null
84
+ ] })
85
+ ] }, item.id);
86
+ }) }) : /* @__PURE__ */ jsx(EmptyState, { title: t("design_system.gallery.noResults") }),
87
+ filtered.length > pageSize ? /* @__PURE__ */ jsx(Pagination, { page, pageSize, total: filtered.length, showPageSize: false, onPageChange: setPage, "aria-label": t("design_system.gallery.sourceLibrary.pages") }) : null
88
+ ] });
89
+ }
90
+ export {
91
+ SourceLibrary
92
+ };
93
+ //# sourceMappingURL=SourceLibrary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/components/SourceLibrary.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { GalleryLink as Link } from './GalleryLink'\nimport { ArrowRight } from 'lucide-react'\nimport { LinkButton } from '@open-mercato/ui/primitives/link-button'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Pagination } from '@open-mercato/ui/primitives/pagination'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'\nimport { GALLERY_BASE_PATH } from '../registry'\nimport { sourceLibrary } from '../source-library.generated'\n\nconst pageSize = 12\nconst allGroups = '__all'\nconst groupTranslationKey = (group: string) => `design_system.gallery.sourceLibrary.groups.${group.toLowerCase().replace(/\\s+/g, '-')}`\n\nexport function SourceLibrary() {\n const t = useT()\n const storyTitle = (story: { family: string; entryId: string; title: string }) => story.family === 'foundations'\n ? t(`design_system.foundations.${story.entryId}.title`, story.title)\n : story.title\n const [query, setQuery] = React.useState('')\n const [group, setGroup] = React.useState(allGroups)\n const [page, setPage] = React.useState(1)\n const groups = React.useMemo(() => Array.from(new Set(sourceLibrary.pages.map(item => item.group))), [])\n const needle = query.trim().toLowerCase()\n const filtered = sourceLibrary.pages.filter(item => {\n const matchesGroup = group === allGroups || item.group === group\n const translatedName = t(`design_system.gallery.sourceLibrary.names.${item.id}`, item.name)\n const translatedGroup = t(groupTranslationKey(item.group), item.group)\n const searchTerms = t(`design_system.gallery.sourceLibrary.searchTerms.${item.id}`, '')\n const searchable = `${item.name} ${translatedName} ${item.group} ${translatedGroup} ${searchTerms} ${item.stories.map(story => `${story.title} ${storyTitle(story)}`).join(' ')} ${item.sets.map(set => `${set.name} ${Object.values(set.axes).flat().join(' ')}`).join(' ')} ${item.standalone.map(asset => asset.name).join(' ')}`\n return matchesGroup && searchable.toLowerCase().includes(needle)\n })\n const visible = filtered.slice((page - 1) * pageSize, page * pageSize)\n\n return <div className=\"w-full min-w-0 space-y-4\" data-example=\"native-source-library\">\n <p className=\"text-sm text-muted-foreground\">{t('design_system.gallery.sourceLibrary.boundary')}</p>\n <div className=\"flex flex-col gap-3 sm:flex-row\">\n <SearchInput className=\"sm:flex-1\" value={query} onChange={value => { setQuery(value); setPage(1) }} aria-label={t('design_system.gallery.sourceLibrary.search')} placeholder={t('design_system.gallery.sourceLibrary.search')} />\n <Select value={group} onValueChange={value => { setGroup(value); setPage(1) }}>\n <SelectTrigger className=\"w-full sm:w-64\" aria-label={t('design_system.gallery.sourceLibrary.group')}><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={allGroups}>{t('design_system.gallery.sourceLibrary.allGroups')}</SelectItem>\n {groups.map(value => <SelectItem key={value} value={value}>{t(groupTranslationKey(value), value)}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <p role=\"status\" className=\"text-sm text-muted-foreground\">{t('design_system.gallery.sourceLibrary.count', { visible: filtered.length, total: sourceLibrary.pages.length })}</p>\n {visible.length ? <div className=\"divide-y divide-border rounded-lg border border-border bg-card\">{visible.map(item => {\n const variantCount = item.sets.reduce((total, set) => total + set.count, 0)\n const hasInventory = item.sets.length > 0 || item.standaloneCount > 0 || item.frameCount > 0\n return <article key={item.id} className=\"grid min-w-0 gap-4 p-5 lg:grid-cols-3\">\n <header className=\"space-y-1\">\n <h3 className=\"text-base font-semibold leading-tight\">{t(`design_system.gallery.sourceLibrary.names.${item.id}`, item.name)}</h3>\n <p className=\"text-xs text-muted-foreground\">{t(groupTranslationKey(item.group), item.group)}</p>\n </header>\n <div className=\"min-w-0 space-y-3 lg:col-span-2\">\n {item.stories.length ? <ul className=\"flex flex-wrap gap-x-6 gap-y-3\" aria-label={t('design_system.gallery.sourceLibrary.examples')}>\n {item.stories.map(story => <li key={`${story.family}:${story.entryId}`}>\n <LinkButton asChild variant=\"black\">\n <Link href={`${GALLERY_BASE_PATH}?family=${story.family}&entry=${story.entryId}`}>\n {storyTitle(story)}<ArrowRight className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </Link>\n </LinkButton>\n </li>)}\n </ul> : <p className=\"text-sm text-muted-foreground\">{t('design_system.gallery.sourceLibrary.referenceOnly')}</p>}\n {hasInventory ? <section className=\"text-sm\">\n <h4 className=\"text-xs font-medium text-muted-foreground\">{t('design_system.gallery.sourceLibrary.details')}</h4>\n <div className=\"mt-3 space-y-4 border-l border-border pl-4\">\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {item.sets.length ? <span>{t('design_system.gallery.sourceLibrary.componentSets', { count: item.sets.length })}</span> : null}\n {variantCount ? <span>{t('design_system.gallery.sourceLibrary.variants', { count: variantCount })}</span> : null}\n {item.frameCount ? <span>{t('design_system.gallery.sourceLibrary.frames', { count: item.frameCount })}</span> : null}\n {item.standaloneCount ? <span>{t('design_system.gallery.sourceLibrary.assets', { count: item.standaloneCount })}</span> : null}\n </div>\n {item.sets.map(set => <section key={set.id} className=\"space-y-2\">\n <h4 className=\"text-sm font-medium\">{set.name}</h4>\n <dl className=\"space-y-2\">{Object.entries(set.axes).map(([axis, values]) => <div key={axis} className=\"text-xs\"><dt className=\"font-medium\">{axis}</dt><dd className=\"break-words text-muted-foreground\">{(values as string[]).join(' \u00B7 ')}</dd></div>)}</dl>\n </section>)}\n </div>\n </section> : null}\n </div>\n </article>\n })}</div> : <EmptyState title={t('design_system.gallery.noResults')} />}\n {filtered.length > pageSize ? <Pagination page={page} pageSize={pageSize} total={filtered.length} showPageSize={false} onPageChange={setPage} aria-label={t('design_system.gallery.sourceLibrary.pages')} /> : null}\n </div>\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,139 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Check, ImagePlus, RotateCcw, Upload, X } from "lucide-react";
5
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
6
+ import { Button } from "@open-mercato/ui/primitives/button";
7
+ import { SimpleTooltip } from "@open-mercato/ui/primitives/tooltip";
8
+ import { getBrandStyle, saveBrandStyle } from "@open-mercato/ui/theme/brand-style";
9
+ import { ColorPlayground } from "./ColorPlayground.js";
10
+ import { BrandStylePreview } from "./BrandStylePreview.js";
11
+ import { readThemeTokens } from "./themeTokens.js";
12
+ import { readBrandLogo, studioBrandStyle } from "./styleAgentBranding.js";
13
+ function brandPreview(studio, logo) {
14
+ const style = studioBrandStyle(studio, logo);
15
+ return { light: style.light, dark: style.dark };
16
+ }
17
+ function StyleAgents() {
18
+ const t = useT();
19
+ const input = React.useRef(null);
20
+ const uploadVersion = React.useRef(0);
21
+ const [initial, setInitial] = React.useState(void 0);
22
+ const [hostTokens, setHostTokens] = React.useState(null);
23
+ const [logo, setLogo] = React.useState(null);
24
+ const [draft, setDraft] = React.useState(null);
25
+ const [uploading, setUploading] = React.useState(false);
26
+ const [notice, setNotice] = React.useState("");
27
+ const [error, setError] = React.useState("");
28
+ React.useEffect(() => {
29
+ setHostTokens(readThemeTokens(document.styleSheets));
30
+ const applied = getBrandStyle();
31
+ setInitial(applied);
32
+ setLogo(applied?.logo ?? null);
33
+ return () => {
34
+ uploadVersion.current += 1;
35
+ };
36
+ }, []);
37
+ const updateStudio = React.useCallback((studio, valid) => {
38
+ setDraft({ studio, valid });
39
+ setNotice("");
40
+ }, []);
41
+ async function upload(file) {
42
+ if (!file) return;
43
+ const version = ++uploadVersion.current;
44
+ setUploading(true);
45
+ setError("");
46
+ setNotice("");
47
+ try {
48
+ const data = await readBrandLogo(file);
49
+ if (uploadVersion.current === version) setLogo(data);
50
+ } catch (failure) {
51
+ if (uploadVersion.current === version) setError(failure instanceof Error ? failure.message : "fileDecode");
52
+ } finally {
53
+ if (uploadVersion.current === version) setUploading(false);
54
+ }
55
+ }
56
+ function apply() {
57
+ if (!draft?.valid || uploading) return;
58
+ try {
59
+ saveBrandStyle(studioBrandStyle(draft.studio, logo));
60
+ setError("");
61
+ setNotice("applied");
62
+ } catch {
63
+ setError("saveFailed");
64
+ setNotice("");
65
+ }
66
+ }
67
+ function restore() {
68
+ try {
69
+ saveBrandStyle(null);
70
+ setError("");
71
+ setNotice("restored");
72
+ } catch {
73
+ setError("saveFailed");
74
+ setNotice("");
75
+ }
76
+ }
77
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-8 pb-8", "data-example": "style-agents", children: [
78
+ /* @__PURE__ */ jsxs("header", { id: "gallery-page-heading", className: "scroll-mt-36 space-y-3 lg:scroll-mt-24", children: [
79
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
80
+ /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
81
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl font-medium tracking-tight", children: t("design_system.styleAgents.title") }),
82
+ /* @__PURE__ */ jsx("p", { className: "max-w-3xl text-sm leading-relaxed text-muted-foreground", children: t("design_system.styleAgents.description") })
83
+ ] }),
84
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
85
+ /* @__PURE__ */ jsx(SimpleTooltip, { content: t("design_system.styleAgents.restoreHint"), children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", onClick: restore, children: [
86
+ /* @__PURE__ */ jsx(RotateCcw, { "aria-hidden": true }),
87
+ t("design_system.styleAgents.restore")
88
+ ] }) }),
89
+ /* @__PURE__ */ jsxs(Button, { type: "button", onClick: apply, disabled: !draft?.valid || uploading, children: [
90
+ /* @__PURE__ */ jsx(Check, { "aria-hidden": true }),
91
+ t("design_system.styleAgents.apply")
92
+ ] })
93
+ ] })
94
+ ] }),
95
+ notice ? /* @__PURE__ */ jsx("p", { role: "status", className: "text-sm text-status-success-text", children: t(`design_system.styleAgents.${notice}`) }) : null,
96
+ error ? /* @__PURE__ */ jsx("p", { role: "alert", className: "text-sm text-status-error-text", children: t(`design_system.styleAgents.${error}`) }) : null
97
+ ] }),
98
+ /* @__PURE__ */ jsxs("section", { className: "grid gap-6 rounded-xl border border-border bg-card p-5 sm:p-6 lg:grid-cols-2", "aria-label": t("design_system.styleAgents.identity"), children: [
99
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
100
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
101
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-medium", children: t("design_system.styleAgents.logo") }),
102
+ /* @__PURE__ */ jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: t("design_system.styleAgents.logoHint") })
103
+ ] }),
104
+ /* @__PURE__ */ jsx("div", { className: "flex min-h-28 items-center justify-center rounded-lg border border-dashed border-border bg-background p-6", children: logo ? /* @__PURE__ */ jsx("img", { src: logo, alt: t("design_system.styleAgents.logoPreview"), className: "max-h-20 max-w-full object-contain" }) : /* @__PURE__ */ jsx(ImagePlus, { className: "size-8 text-muted-foreground", "aria-hidden": true }) }),
105
+ /* @__PURE__ */ jsx("input", { ref: input, type: "file", accept: "image/png,image/jpeg,image/webp", className: "sr-only", "aria-label": t("design_system.styleAgents.upload"), onChange: (event) => {
106
+ void upload(event.target.files?.[0]);
107
+ event.target.value = "";
108
+ } }),
109
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
110
+ /* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", onClick: () => input.current?.click(), children: [
111
+ /* @__PURE__ */ jsx(Upload, { "aria-hidden": true }),
112
+ t(`design_system.styleAgents.${uploading ? "uploading" : "upload"}`)
113
+ ] }),
114
+ logo ? /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", onClick: () => {
115
+ uploadVersion.current += 1;
116
+ setUploading(false);
117
+ setLogo(null);
118
+ setNotice("");
119
+ setError("");
120
+ }, children: [
121
+ /* @__PURE__ */ jsx(X, { "aria-hidden": true }),
122
+ t("design_system.styleAgents.removeLogo")
123
+ ] }) : null
124
+ ] })
125
+ ] }),
126
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col justify-between gap-5", children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
127
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-medium", children: t("design_system.styleAgents.applyTitle") }),
128
+ /* @__PURE__ */ jsx("p", { className: "text-sm leading-relaxed text-muted-foreground", children: t("design_system.styleAgents.scope") }),
129
+ /* @__PURE__ */ jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: t("design_system.styleAgents.tokenScope") })
130
+ ] }) })
131
+ ] }),
132
+ draft ? /* @__PURE__ */ jsx(BrandStylePreview, { ...brandPreview(draft.studio, logo), hostTokens, logo }) : null,
133
+ initial !== void 0 ? /* @__PURE__ */ jsx(ColorPlayground, { initialView: "light", initialSeeds: initial?.seeds, initialActionShades: initial?.actionShades, logo, onStudioChange: updateStudio }) : null
134
+ ] });
135
+ }
136
+ export {
137
+ StyleAgents
138
+ };
139
+ //# sourceMappingURL=StyleAgents.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/components/StyleAgents.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { Check, ImagePlus, RotateCcw, Upload, X } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { getBrandStyle, saveBrandStyle, type BrandStyle } from '@open-mercato/ui/theme/brand-style'\nimport { ColorPlayground } from './ColorPlayground'\nimport { BrandStylePreview } from './BrandStylePreview'\nimport { readThemeTokens, type ThemeTokens } from './themeTokens'\nimport type { Shade } from './colorStudio'\nimport type { ColorStudio } from './colorStudio'\nimport { readBrandLogo, studioBrandStyle } from './styleAgentBranding'\n\nfunction brandPreview(studio: ColorStudio, logo: string | null) {\n const style = studioBrandStyle(studio, logo)\n return { light: style.light, dark: style.dark }\n}\n\nexport function StyleAgents() {\n const t = useT()\n const input = React.useRef<HTMLInputElement>(null)\n const uploadVersion = React.useRef(0)\n const [initial, setInitial] = React.useState<BrandStyle | null | undefined>(undefined)\n const [hostTokens, setHostTokens] = React.useState<ThemeTokens | null>(null)\n const [logo, setLogo] = React.useState<string | null>(null)\n const [draft, setDraft] = React.useState<{ studio: ColorStudio; valid: boolean } | null>(null)\n const [uploading, setUploading] = React.useState(false)\n const [notice, setNotice] = React.useState('')\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n setHostTokens(readThemeTokens(document.styleSheets))\n const applied = getBrandStyle()\n setInitial(applied)\n setLogo(applied?.logo ?? null)\n return () => { uploadVersion.current += 1 }\n }, [])\n const updateStudio = React.useCallback((studio: ColorStudio, valid: boolean) => {\n setDraft({ studio, valid })\n setNotice('')\n }, [])\n\n async function upload(file: File | undefined) {\n if (!file) return\n const version = ++uploadVersion.current\n setUploading(true)\n setError('')\n setNotice('')\n try {\n const data = await readBrandLogo(file)\n if (uploadVersion.current === version) setLogo(data)\n } catch (failure) {\n if (uploadVersion.current === version) setError(failure instanceof Error ? failure.message : 'fileDecode')\n } finally {\n if (uploadVersion.current === version) setUploading(false)\n }\n }\n\n function apply() {\n if (!draft?.valid || uploading) return\n try {\n saveBrandStyle(studioBrandStyle(draft.studio, logo))\n setError('')\n setNotice('applied')\n } catch { setError('saveFailed'); setNotice('') }\n }\n\n function restore() {\n try {\n saveBrandStyle(null)\n setError('')\n setNotice('restored')\n } catch { setError('saveFailed'); setNotice('') }\n }\n\n return <div className=\"space-y-8 pb-8\" data-example=\"style-agents\">\n <header id=\"gallery-page-heading\" className=\"scroll-mt-36 space-y-3 lg:scroll-mt-24\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"space-y-3\">\n <h1 className=\"text-3xl font-medium tracking-tight\">{t('design_system.styleAgents.title')}</h1>\n <p className=\"max-w-3xl text-sm leading-relaxed text-muted-foreground\">{t('design_system.styleAgents.description')}</p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <SimpleTooltip content={t('design_system.styleAgents.restoreHint')}>\n <Button type=\"button\" variant=\"ghost\" onClick={restore}><RotateCcw aria-hidden />{t('design_system.styleAgents.restore')}</Button>\n </SimpleTooltip>\n <Button type=\"button\" onClick={apply} disabled={!draft?.valid || uploading}><Check aria-hidden />{t('design_system.styleAgents.apply')}</Button>\n </div>\n </div>\n {notice ? <p role=\"status\" className=\"text-sm text-status-success-text\">{t(`design_system.styleAgents.${notice}`)}</p> : null}\n {error ? <p role=\"alert\" className=\"text-sm text-status-error-text\">{t(`design_system.styleAgents.${error}`)}</p> : null}\n </header>\n <section className=\"grid gap-6 rounded-xl border border-border bg-card p-5 sm:p-6 lg:grid-cols-2\" aria-label={t('design_system.styleAgents.identity')}>\n <div className=\"space-y-4\">\n <div className=\"space-y-1\"><h2 className=\"text-lg font-medium\">{t('design_system.styleAgents.logo')}</h2><p className=\"text-xs leading-relaxed text-muted-foreground\">{t('design_system.styleAgents.logoHint')}</p></div>\n <div className=\"flex min-h-28 items-center justify-center rounded-lg border border-dashed border-border bg-background p-6\">\n {logo ? <img src={logo} alt={t('design_system.styleAgents.logoPreview')} className=\"max-h-20 max-w-full object-contain\" /> : <ImagePlus className=\"size-8 text-muted-foreground\" aria-hidden />}\n </div>\n <input ref={input} type=\"file\" accept=\"image/png,image/jpeg,image/webp\" className=\"sr-only\" aria-label={t('design_system.styleAgents.upload')} onChange={event => { void upload(event.target.files?.[0]); event.target.value = '' }} />\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => input.current?.click()}><Upload aria-hidden />{t(`design_system.styleAgents.${uploading ? 'uploading' : 'upload'}`)}</Button>\n {logo ? <Button type=\"button\" variant=\"ghost\" onClick={() => { uploadVersion.current += 1; setUploading(false); setLogo(null); setNotice(''); setError('') }}><X aria-hidden />{t('design_system.styleAgents.removeLogo')}</Button> : null}\n </div>\n </div>\n <div className=\"flex flex-col justify-between gap-5\">\n <div className=\"space-y-3\"><h2 className=\"text-lg font-medium\">{t('design_system.styleAgents.applyTitle')}</h2><p className=\"text-sm leading-relaxed text-muted-foreground\">{t('design_system.styleAgents.scope')}</p><p className=\"text-xs leading-relaxed text-muted-foreground\">{t('design_system.styleAgents.tokenScope')}</p></div>\n\n </div>\n </section>\n {draft ? <BrandStylePreview {...brandPreview(draft.studio, logo)} hostTokens={hostTokens} logo={logo} /> : null}\n {initial !== undefined ? <ColorPlayground initialView=\"light\" initialSeeds={initial?.seeds} initialActionShades={initial?.actionShades as { light?: Shade; dark?: Shade } | undefined} logo={logo} onStudioChange={updateStudio} /> : null}\n\n </div>\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,101 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
5
+ import { DataTable } from "@open-mercato/ui/backend/DataTable";
6
+ import { Button } from "@open-mercato/ui/primitives/button";
7
+ import { flash } from "@open-mercato/ui/backend/FlashMessages";
8
+ import { readThemeTokens } from "./themeTokens.js";
9
+ const referenceTokens = [
10
+ "brand-lime",
11
+ "brand-yellow",
12
+ "brand-violet",
13
+ "background",
14
+ "foreground",
15
+ "card",
16
+ "card-foreground",
17
+ "muted",
18
+ "muted-foreground",
19
+ "primary",
20
+ "primary-foreground",
21
+ "primary-hover",
22
+ "border",
23
+ "input",
24
+ "ring",
25
+ "destructive",
26
+ "status-info-bg",
27
+ "status-info-text",
28
+ "status-success-bg",
29
+ "status-success-text",
30
+ "status-warning-bg",
31
+ "status-warning-text",
32
+ "status-error-bg",
33
+ "status-error-text"
34
+ ];
35
+ function displayColor(value, context) {
36
+ if (!context || !CSS.supports("color", value)) return value;
37
+ context.clearRect(0, 0, 1, 1);
38
+ context.fillStyle = value;
39
+ context.fillRect(0, 0, 1, 1);
40
+ const [red, green, blue, alpha] = context.getImageData(0, 0, 1, 1).data;
41
+ return "#" + [red, green, blue, ...alpha === 255 ? [] : [alpha]].map((channel) => channel.toString(16).padStart(2, "0")).join("").toUpperCase();
42
+ }
43
+ function ThemeTokenReference() {
44
+ const t = useT();
45
+ const [tokens, setTokens] = React.useState(null);
46
+ React.useEffect(() => {
47
+ const values = readThemeTokens(document.styleSheets);
48
+ const canvas = document.createElement("canvas");
49
+ canvas.width = 1;
50
+ canvas.height = 1;
51
+ const context = canvas.getContext("2d", { willReadFrequently: true });
52
+ for (const theme of ["light", "dark"]) {
53
+ for (const token of referenceTokens) {
54
+ const value = values[theme][`--${token}`];
55
+ if (value) values[theme][`--${token}`] = displayColor(value, context);
56
+ }
57
+ }
58
+ setTokens(values);
59
+ }, []);
60
+ const rows = referenceTokens.map((token) => ({ token: `--${token}`, light: tokens?.light[`--${token}`] ?? "\u2014", dark: tokens?.dark[`--${token}`] ?? "\u2014" }));
61
+ async function copyToken(token) {
62
+ try {
63
+ await navigator.clipboard.writeText(token);
64
+ flash(t("design_system.gallery.tokenCopied", { token }), "success");
65
+ } catch {
66
+ flash(t("design_system.gallery.tokenCopyFailed"), "error");
67
+ }
68
+ }
69
+ const columns = [
70
+ { accessorKey: "token", header: t("design_system.foundations.token"), cell: ({ row }) => /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", className: "h-auto justify-start px-0 py-2 font-mono text-xs", "aria-label": t("design_system.gallery.copyToken", { token: row.original.token }), onClick: () => copyToken(row.original.token), children: row.original.token }) },
71
+ ...["light", "dark"].map((theme) => ({
72
+ accessorKey: theme,
73
+ header: t(`design_system.foundations.${theme}`),
74
+ cell: ({ row }) => /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-3 py-2", children: [
75
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "size-6 shrink-0 rounded-full border border-border", style: { backgroundColor: row.original[theme] === "\u2014" ? void 0 : row.original[theme] } }),
76
+ /* @__PURE__ */ jsx("code", { className: "text-xs text-muted-foreground", children: row.original[theme] })
77
+ ] })
78
+ }))
79
+ ];
80
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
81
+ /* @__PURE__ */ jsx("h3", { className: "text-xl font-medium", children: t("design_system.foundations.themeReference") }),
82
+ /* @__PURE__ */ jsx("p", { className: "max-w-prose text-sm leading-relaxed text-muted-foreground", children: t("design_system.foundations.themeDescription") }),
83
+ tokens ? /* @__PURE__ */ jsx("div", { className: "grid gap-4 sm:grid-cols-2", children: ["light", "dark"].map((theme) => /* @__PURE__ */ jsxs("div", { className: "space-y-6 rounded-lg border p-6", style: { backgroundColor: tokens[theme]["--background"], color: tokens[theme]["--foreground"], borderColor: tokens[theme]["--border"] }, children: [
84
+ /* @__PURE__ */ jsx("p", { className: "text-base font-medium", children: t(`design_system.foundations.${theme}`) }),
85
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
86
+ /* @__PURE__ */ jsx(Button, { type: "button", style: { backgroundColor: tokens[theme]["--primary"], color: tokens[theme]["--primary-foreground"] }, children: t("design_system.gallery.samples.primaryAction") }),
87
+ /* @__PURE__ */ jsx("span", { className: "inline-flex h-9 items-center rounded-md border px-4 text-sm", style: { borderColor: tokens[theme]["--border"] }, children: "Aa" })
88
+ ] }),
89
+ /* @__PURE__ */ jsxs("code", { className: "text-xs", style: { color: tokens[theme]["--muted-foreground"] }, children: [
90
+ tokens[theme]["--background"],
91
+ " / ",
92
+ tokens[theme]["--foreground"]
93
+ ] })
94
+ ] }, theme)) }) : null,
95
+ /* @__PURE__ */ jsx(DataTable, { columns, data: rows, isLoading: !tokens })
96
+ ] });
97
+ }
98
+ export {
99
+ ThemeTokenReference
100
+ };
101
+ //# sourceMappingURL=ThemeTokenReference.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/components/ThemeTokenReference.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { readThemeTokens, type ThemeTokens } from './themeTokens'\n\nconst referenceTokens = [\n 'brand-lime', 'brand-yellow', 'brand-violet', 'background', 'foreground',\n 'card', 'card-foreground', 'muted', 'muted-foreground', 'primary', 'primary-foreground',\n 'primary-hover', 'border', 'input', 'ring', 'destructive',\n 'status-info-bg', 'status-info-text', 'status-success-bg', 'status-success-text',\n 'status-warning-bg', 'status-warning-text', 'status-error-bg', 'status-error-text',\n]\ntype TokenRow = { token: string; light: string; dark: string }\n\nfunction displayColor(value: string, context: CanvasRenderingContext2D | null) {\n if (!context || !CSS.supports('color', value)) return value\n context.clearRect(0, 0, 1, 1)\n context.fillStyle = value\n context.fillRect(0, 0, 1, 1)\n const [red, green, blue, alpha] = context.getImageData(0, 0, 1, 1).data\n return '#' + [red, green, blue, ...(alpha === 255 ? [] : [alpha])].map(channel => channel.toString(16).padStart(2, '0')).join('').toUpperCase()\n}\n\nexport function ThemeTokenReference() {\n const t = useT()\n const [tokens, setTokens] = React.useState<ThemeTokens | null>(null)\n React.useEffect(() => {\n const values = readThemeTokens(document.styleSheets)\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = 1\n const context = canvas.getContext('2d', { willReadFrequently: true })\n for (const theme of ['light', 'dark'] as const) {\n for (const token of referenceTokens) {\n const value = values[theme][`--${token}`]\n if (value) values[theme][`--${token}`] = displayColor(value, context)\n }\n }\n setTokens(values)\n }, [])\n const rows = referenceTokens.map(token => ({ token: `--${token}`, light: tokens?.light[`--${token}`] ?? '\u2014', dark: tokens?.dark[`--${token}`] ?? '\u2014' }))\n async function copyToken(token: string) {\n try {\n await navigator.clipboard.writeText(token)\n flash(t('design_system.gallery.tokenCopied', { token }), 'success')\n } catch { flash(t('design_system.gallery.tokenCopyFailed'), 'error') }\n }\n const columns: ColumnDef<TokenRow, unknown>[] = [\n { accessorKey: 'token', header: t('design_system.foundations.token'), cell: ({ row }) => <Button type=\"button\" variant=\"ghost\" className=\"h-auto justify-start px-0 py-2 font-mono text-xs\" aria-label={t('design_system.gallery.copyToken', { token: row.original.token })} onClick={() => copyToken(row.original.token)}>{row.original.token}</Button> },\n ...(['light', 'dark'] as const).map(theme => ({\n accessorKey: theme,\n header: t(`design_system.foundations.${theme}`),\n cell: ({ row }: { row: { original: TokenRow } }) => <span className=\"flex items-center gap-3 py-2\"><span aria-hidden className=\"size-6 shrink-0 rounded-full border border-border\" style={{ backgroundColor: row.original[theme] === '\u2014' ? undefined : row.original[theme] }} /><code className=\"text-xs text-muted-foreground\">{row.original[theme]}</code></span>,\n })),\n ]\n return <div className=\"space-y-4\">\n <h3 className=\"text-xl font-medium\">{t('design_system.foundations.themeReference')}</h3>\n <p className=\"max-w-prose text-sm leading-relaxed text-muted-foreground\">{t('design_system.foundations.themeDescription')}</p>\n {tokens ? <div className=\"grid gap-4 sm:grid-cols-2\">\n {(['light', 'dark'] as const).map(theme => <div key={theme} className=\"space-y-6 rounded-lg border p-6\" style={{ backgroundColor: tokens[theme]['--background'], color: tokens[theme]['--foreground'], borderColor: tokens[theme]['--border'] }}>\n <p className=\"text-base font-medium\">{t(`design_system.foundations.${theme}`)}</p>\n <div className=\"flex flex-wrap items-center gap-3\">\n <Button type=\"button\" style={{ backgroundColor: tokens[theme]['--primary'], color: tokens[theme]['--primary-foreground'] }}>{t('design_system.gallery.samples.primaryAction')}</Button>\n <span className=\"inline-flex h-9 items-center rounded-md border px-4 text-sm\" style={{ borderColor: tokens[theme]['--border'] }}>Aa</span>\n </div>\n <code className=\"text-xs\" style={{ color: tokens[theme]['--muted-foreground'] }}>{tokens[theme]['--background']} / {tokens[theme]['--foreground']}</code>\n </div>)}\n </div> : null}\n <DataTable columns={columns} data={rows} isLoading={!tokens} />\n </div>\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
- function VariantPreview({ children }) {
4
- return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-3 rounded-md border border-border bg-background p-4", children });
3
+ function VariantPreview({ children, framed = true }) {
4
+ return /* @__PURE__ */ jsx("div", { className: framed ? "flex min-w-0 flex-wrap items-start gap-4 rounded-lg border border-border bg-background p-4 sm:p-6 [&>*]:min-w-0" : "min-w-0 [&>*]:min-w-0", children });
5
5
  }
6
6
  export {
7
7
  VariantPreview
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/design_system/gallery/components/VariantPreview.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\n\n/**\n * Bordered stage a variant renders inside. Chrome uses semantic tokens only \u2014\n * the stage must never impose colors of its own on the previewed component.\n */\nexport function VariantPreview({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex flex-wrap items-center gap-3 rounded-md border border-border bg-background p-4\">\n {children}\n </div>\n )\n}\n"],
5
- "mappings": ";AAUI;AAFG,SAAS,eAAe,EAAE,SAAS,GAAkC;AAC1E,SACE,oBAAC,SAAI,WAAU,uFACZ,UACH;AAEJ;",
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\n\n/**\n * Bordered stage a variant renders inside. Chrome uses semantic tokens only \u2014\n * the stage must never impose colors of its own on the previewed component.\n */\nexport function VariantPreview({ children, framed = true }: { children: React.ReactNode; framed?: boolean }) {\n return (\n <div className={framed ? 'flex min-w-0 flex-wrap items-start gap-4 rounded-lg border border-border bg-background p-4 sm:p-6 [&>*]:min-w-0' : 'min-w-0 [&>*]:min-w-0'}>\n {children}\n </div>\n )\n}\n"],
5
+ "mappings": ";AAUI;AAFG,SAAS,eAAe,EAAE,UAAU,SAAS,KAAK,GAAoD;AAC3G,SACE,oBAAC,SAAI,WAAW,SAAS,oHAAoH,yBAC1I,UACH;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,58 @@
1
+ function normalizeHex(input) {
2
+ const value = input.trim().replace(/^#/, "");
3
+ if (/^[\da-f]{3}$/i.test(value)) {
4
+ return `#${[...value].map((digit) => digit.repeat(2)).join("").toUpperCase()}`;
5
+ }
6
+ return /^[\da-f]{6}$/i.test(value) ? `#${value.toUpperCase()}` : null;
7
+ }
8
+ function channels(hex) {
9
+ return [
10
+ Number.parseInt(hex.slice(1, 3), 16),
11
+ Number.parseInt(hex.slice(3, 5), 16),
12
+ Number.parseInt(hex.slice(5, 7), 16)
13
+ ];
14
+ }
15
+ function luminance(hex) {
16
+ const linear = channels(hex).map((channel) => {
17
+ const normalized = channel / 255;
18
+ return normalized <= 0.04045 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;
19
+ });
20
+ return linear[0] * 0.2126 + linear[1] * 0.7152 + linear[2] * 0.0722;
21
+ }
22
+ function contrastRatio(first, second) {
23
+ const normalizedFirst = normalizeHex(first);
24
+ const normalizedSecond = normalizeHex(second);
25
+ if (!normalizedFirst || !normalizedSecond) return 1;
26
+ const firstLuminance = luminance(normalizedFirst);
27
+ const secondLuminance = luminance(normalizedSecond);
28
+ return (Math.max(firstLuminance, secondLuminance) + 0.05) / (Math.min(firstLuminance, secondLuminance) + 0.05);
29
+ }
30
+ function mix(color, target, amount) {
31
+ const targetChannels = channels(target);
32
+ return `#${channels(color).map((channel, index) => Math.round(channel + (targetChannels[index] - channel) * amount).toString(16).padStart(2, "0")).join("").toUpperCase()}`;
33
+ }
34
+ function readableForeground(background) {
35
+ return contrastRatio(background, "#000000") >= contrastRatio(background, "#FFFFFF") ? "#000000" : "#FFFFFF";
36
+ }
37
+ function readableAccent(color, surface) {
38
+ const target = readableForeground(surface);
39
+ for (let step = 0; step <= 20; step += 1) {
40
+ const candidate = mix(color, target, step / 20);
41
+ if (contrastRatio(candidate, surface) >= 4.5) return candidate;
42
+ }
43
+ return target;
44
+ }
45
+ function createAccentPalette(hex, surface) {
46
+ const color = normalizeHex(hex) ?? "#000000";
47
+ const normalizedSurface = normalizeHex(surface) ?? "#FFFFFF";
48
+ const foreground = readableForeground(color);
49
+ const hover = mix(color, foreground === "#FFFFFF" ? "#000000" : "#FFFFFF", 0.08);
50
+ const soft = mix(normalizedSurface, color, 0.1);
51
+ return { color, foreground, hover, soft, softForeground: readableAccent(color, soft) };
52
+ }
53
+ export {
54
+ contrastRatio,
55
+ createAccentPalette,
56
+ normalizeHex
57
+ };
58
+ //# sourceMappingURL=colorPreview.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/components/colorPreview.ts"],
4
+ "sourcesContent": ["type Rgb = [number, number, number]\n\nexport function normalizeHex(input: string): string | null {\n const value = input.trim().replace(/^#/, '')\n if (/^[\\da-f]{3}$/i.test(value)) {\n return `#${[...value].map((digit) => digit.repeat(2)).join('').toUpperCase()}`\n }\n return /^[\\da-f]{6}$/i.test(value) ? `#${value.toUpperCase()}` : null\n}\n\nfunction channels(hex: string): Rgb {\n return [\n Number.parseInt(hex.slice(1, 3), 16),\n Number.parseInt(hex.slice(3, 5), 16),\n Number.parseInt(hex.slice(5, 7), 16),\n ]\n}\n\nfunction luminance(hex: string): number {\n const linear = channels(hex).map((channel) => {\n const normalized = channel / 255\n return normalized <= 0.04045 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4\n })\n return linear[0] * 0.2126 + linear[1] * 0.7152 + linear[2] * 0.0722\n}\n\nexport function contrastRatio(first: string, second: string): number {\n const normalizedFirst = normalizeHex(first)\n const normalizedSecond = normalizeHex(second)\n if (!normalizedFirst || !normalizedSecond) return 1\n const firstLuminance = luminance(normalizedFirst)\n const secondLuminance = luminance(normalizedSecond)\n return (Math.max(firstLuminance, secondLuminance) + 0.05) / (Math.min(firstLuminance, secondLuminance) + 0.05)\n}\n\nfunction mix(color: string, target: string, amount: number): string {\n const targetChannels = channels(target)\n return `#${channels(color).map((channel, index) => (\n Math.round(channel + (targetChannels[index] - channel) * amount).toString(16).padStart(2, '0')\n )).join('').toUpperCase()}`\n}\n\nfunction readableForeground(background: string): string {\n return contrastRatio(background, '#000000') >= contrastRatio(background, '#FFFFFF') ? '#000000' : '#FFFFFF'\n}\n\nfunction readableAccent(color: string, surface: string): string {\n const target = readableForeground(surface)\n for (let step = 0; step <= 20; step += 1) {\n const candidate = mix(color, target, step / 20)\n if (contrastRatio(candidate, surface) >= 4.5) return candidate\n }\n return target\n}\n\nexport function createAccentPalette(hex: string, surface: string) {\n const color = normalizeHex(hex) ?? '#000000'\n const normalizedSurface = normalizeHex(surface) ?? '#FFFFFF'\n const foreground = readableForeground(color)\n const hover = mix(color, foreground === '#FFFFFF' ? '#000000' : '#FFFFFF', 0.08)\n const soft = mix(normalizedSurface, color, 0.1)\n return { color, foreground, hover, soft, softForeground: readableAccent(color, soft) }\n}\n"],
5
+ "mappings": "AAEO,SAAS,aAAa,OAA8B;AACzD,QAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,EAAE;AAC3C,MAAI,gBAAgB,KAAK,KAAK,GAAG;AAC/B,WAAO,IAAI,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC;AAAA,EAC9E;AACA,SAAO,gBAAgB,KAAK,KAAK,IAAI,IAAI,MAAM,YAAY,CAAC,KAAK;AACnE;AAEA,SAAS,SAAS,KAAkB;AAClC,SAAO;AAAA,IACL,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IACnC,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IACnC,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EACrC;AACF;AAEA,SAAS,UAAU,KAAqB;AACtC,QAAM,SAAS,SAAS,GAAG,EAAE,IAAI,CAAC,YAAY;AAC5C,UAAM,aAAa,UAAU;AAC7B,WAAO,cAAc,UAAU,aAAa,UAAU,aAAa,SAAS,UAAU;AAAA,EACxF,CAAC;AACD,SAAO,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI;AAC/D;AAEO,SAAS,cAAc,OAAe,QAAwB;AACnE,QAAM,kBAAkB,aAAa,KAAK;AAC1C,QAAM,mBAAmB,aAAa,MAAM;AAC5C,MAAI,CAAC,mBAAmB,CAAC,iBAAkB,QAAO;AAClD,QAAM,iBAAiB,UAAU,eAAe;AAChD,QAAM,kBAAkB,UAAU,gBAAgB;AAClD,UAAQ,KAAK,IAAI,gBAAgB,eAAe,IAAI,SAAS,KAAK,IAAI,gBAAgB,eAAe,IAAI;AAC3G;AAEA,SAAS,IAAI,OAAe,QAAgB,QAAwB;AAClE,QAAM,iBAAiB,SAAS,MAAM;AACtC,SAAO,IAAI,SAAS,KAAK,EAAE,IAAI,CAAC,SAAS,UACvC,KAAK,MAAM,WAAW,eAAe,KAAK,IAAI,WAAW,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAC9F,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC;AAC3B;AAEA,SAAS,mBAAmB,YAA4B;AACtD,SAAO,cAAc,YAAY,SAAS,KAAK,cAAc,YAAY,SAAS,IAAI,YAAY;AACpG;AAEA,SAAS,eAAe,OAAe,SAAyB;AAC9D,QAAM,SAAS,mBAAmB,OAAO;AACzC,WAAS,OAAO,GAAG,QAAQ,IAAI,QAAQ,GAAG;AACxC,UAAM,YAAY,IAAI,OAAO,QAAQ,OAAO,EAAE;AAC9C,QAAI,cAAc,WAAW,OAAO,KAAK,IAAK,QAAO;AAAA,EACvD;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,KAAa,SAAiB;AAChE,QAAM,QAAQ,aAAa,GAAG,KAAK;AACnC,QAAM,oBAAoB,aAAa,OAAO,KAAK;AACnD,QAAM,aAAa,mBAAmB,KAAK;AAC3C,QAAM,QAAQ,IAAI,OAAO,eAAe,YAAY,YAAY,WAAW,IAAI;AAC/E,QAAM,OAAO,IAAI,mBAAmB,OAAO,GAAG;AAC9C,SAAO,EAAE,OAAO,YAAY,OAAO,MAAM,gBAAgB,eAAe,OAAO,IAAI,EAAE;AACvF;",
6
+ "names": []
7
+ }