@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/design_system/gallery/entries/foundations.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport { Circle } from 'lucide-react'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport type { GalleryEntry } from '../types'\n\n// Token names are proper nouns from the codebase and are deliberately not\n// translated. Structure mirrors the DS Figma color-system sheet (node\n// 553:14956): Brand Colors \u2192 Color Tokens by role \u2192 State Color Tokens.\n// Figma state names map to code tokens per the contract documented in\n// globals.css: state/{x}/base\u2192icon, /light\u2192border, /lighter\u2192bg.\n\nconst TOKENS_IMPORT = 'apps/mercato/src/app/globals.css'\nconst FIGMA_COLORS_NODE = '553:14956'\n\nfunction SwatchCard({ copyText, label, children }: { copyText: string; label: string; children: React.ReactNode }) {\n const onCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(copyText)\n flash(`${copyText} copied`, 'success')\n } catch {\n flash('Could not copy the token', 'error')\n }\n }, [copyText])\n return (\n <button\n type=\"button\"\n onClick={onCopy}\n 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\"\n title={`Copy ${copyText}`}\n >\n {children}\n <code className=\"break-all text-[11px] leading-tight text-muted-foreground\">{label}</code>\n </button>\n )\n}\n\nfunction TokenSwatch({ tokenClass, label }: { tokenClass: string; label: string }) {\n return (\n <SwatchCard copyText={label} label={label}>\n <span aria-hidden className={`h-10 w-full rounded-sm border border-border ${tokenClass}`} />\n </SwatchCard>\n )\n}\n\n// A text-color token shown in its actual role \u2014 as type, not as a fill.\nfunction TextSwatch({ textClass, label }: { textClass: string; label: string }) {\n return (\n <SwatchCard copyText={textClass} label={label}>\n <span aria-hidden className=\"flex h-10 w-full items-center justify-center rounded-sm border border-border bg-background\">\n <span className={`text-xl font-semibold leading-none ${textClass}`}>Aa</span>\n </span>\n </SwatchCard>\n )\n}\n\n// A border-color token shown as a 2px outline on the neutral surface.\nfunction BorderSwatch({ borderClass, label }: { borderClass: string; label: string }) {\n return (\n <SwatchCard copyText={borderClass} label={label}>\n <span aria-hidden className={`h-10 w-full rounded-sm border-2 bg-background ${borderClass}`} />\n </SwatchCard>\n )\n}\n\n// An icon-color token shown on a real glyph.\nfunction IconSwatch({ iconClass, label }: { iconClass: string; label: string }) {\n return (\n <SwatchCard copyText={iconClass} label={label}>\n <span aria-hidden className=\"flex h-10 w-full items-center justify-center rounded-sm border border-border bg-background\">\n <Circle className={`size-4 fill-current ${iconClass}`} />\n </span>\n </SwatchCard>\n )\n}\n\nfunction SwatchRow({ items }: { items: Array<{ tokenClass: string; label: string }> }) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {items.map((item) => (\n <TokenSwatch key={item.label} tokenClass={item.tokenClass} label={item.label} />\n ))}\n </div>\n )\n}\n\nconst brandColorsEntry: GalleryEntry = {\n id: 'brand-colors',\n title: 'Brand colors',\n importPath: TOKENS_IMPORT,\n usage: {\n do: ['brand-violet 10/30/100 pattern (bg/border/text) for proposed and feature accents.'],\n dont: ['Never theme or repurpose accent-indigo \u2014 it is the selection-control contract.'],\n },\n figmaNodeId: FIGMA_COLORS_NODE,\n variants: [\n {\n id: 'gradient',\n title: 'gradient 135\u00B0',\n render: () => (\n <div className=\"space-y-2\">\n <div\n aria-hidden\n 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%\"\n />\n <code className=\"text-xs text-muted-foreground\">brand-lime 0%, brand-yellow 35%, brand-violet 70%</code>\n </div>\n ),\n code: `<div className=\"bg-linear-135 from-brand-lime from-0% via-brand-yellow via-35% to-brand-violet to-70%\" />`,\n },\n {\n id: 'identity',\n title: 'identity',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-brand-lime', label: 'brand-lime' },\n { tokenClass: 'bg-brand-yellow', label: 'brand-yellow' },\n { tokenClass: 'bg-brand-violet', label: 'brand-violet' },\n { tokenClass: 'bg-brand-violet-foreground', label: 'brand-violet-foreground' },\n { tokenClass: 'bg-accent-indigo', label: 'accent-indigo' },\n ]}\n />\n ),\n code: `<span className=\"bg-brand-violet/10 border-brand-violet/30 text-brand-violet\" />`,\n },\n {\n id: 'social',\n title: 'social',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-brand-apple', label: 'brand-apple' },\n { tokenClass: 'bg-brand-github', label: 'brand-github' },\n { tokenClass: 'bg-brand-facebook', label: 'brand-facebook' },\n { tokenClass: 'bg-brand-dropbox', label: 'brand-dropbox' },\n { tokenClass: 'bg-brand-linkedin', label: 'brand-linkedin' },\n { tokenClass: 'bg-brand-x', label: 'brand-x' },\n ]}\n />\n ),\n code: `<SocialButton provider=\"github\" />`,\n },\n ],\n}\n\nconst colorTokensEntry: GalleryEntry = {\n id: 'color-tokens',\n title: 'Color tokens',\n importPath: TOKENS_IMPORT,\n usage: {\n do: ['Pair every surface with its -foreground counterpart.', 'Borders come from border-border / border-input \u2014 nothing else.'],\n dont: ['Never border-gray-* or any raw palette shade.'],\n },\n figmaNodeId: FIGMA_COLORS_NODE,\n variants: [\n {\n id: 'primary',\n title: 'primary',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-primary', label: 'primary' },\n { tokenClass: 'bg-primary-foreground', label: 'primary-foreground' },\n { tokenClass: 'bg-primary-hover', label: 'primary-hover' },\n { tokenClass: 'bg-destructive', label: 'destructive' },\n ]}\n />\n ),\n code: `<div className=\"bg-primary text-primary-foreground hover:bg-primary-hover\" />`,\n },\n {\n id: 'background',\n title: 'background (bg)',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-background', label: 'background' },\n { tokenClass: 'bg-card', label: 'card' },\n { tokenClass: 'bg-popover', label: 'popover' },\n { tokenClass: 'bg-muted', label: 'muted' },\n { tokenClass: 'bg-accent', label: 'accent' },\n { tokenClass: 'bg-sidebar', label: 'sidebar' },\n { tokenClass: 'bg-bg-disabled', label: 'bg-disabled' },\n ]}\n />\n ),\n code: `<div className=\"bg-card text-card-foreground\" />`,\n },\n {\n id: 'text',\n title: 'text',\n render: () => (\n <div className=\"flex flex-wrap gap-2\">\n <TextSwatch textClass=\"text-foreground\" label=\"text-foreground\" />\n <TextSwatch textClass=\"text-muted-foreground\" label=\"text-muted-foreground\" />\n <TextSwatch textClass=\"text-card-foreground\" label=\"text-card-foreground\" />\n <TextSwatch textClass=\"text-accent-foreground\" label=\"text-accent-foreground\" />\n <TextSwatch textClass=\"text-text-disabled\" label=\"text-text-disabled\" />\n </div>\n ),\n code: `<p className=\"text-muted-foreground\">Secondary copy</p>`,\n },\n {\n id: 'stroke',\n title: 'stroke',\n render: () => (\n <div className=\"flex flex-wrap gap-2\">\n <BorderSwatch borderClass=\"border-border\" label=\"border-border\" />\n <BorderSwatch borderClass=\"border-input\" label=\"border-input\" />\n <BorderSwatch borderClass=\"border-ring\" label=\"border-ring\" />\n <BorderSwatch borderClass=\"border-border-disabled\" label=\"border-border-disabled\" />\n </div>\n ),\n code: `<div className=\"border-border focus-visible:ring-ring\" />`,\n },\n ],\n}\n\n// Literal class strings on purpose: the Tailwind scanner only sees complete\n// literals, so `bg-status-${x}` variants would silently never be generated.\ntype StatusFamily = {\n figma: string\n status: string\n chipLabel: string\n bg: string\n text: string\n border: string\n icon: string\n dot: string\n}\n\nconst FIGMA_STATE_TO_CODE: StatusFamily[] = [\n { figma: 'Faded', status: 'neutral', chipLabel: 'Neutral', bg: 'bg-status-neutral-bg', text: 'text-status-neutral-text', border: 'border-status-neutral-border', icon: 'text-status-neutral-icon', dot: 'bg-status-neutral-icon' },\n { figma: 'Information', status: 'info', chipLabel: 'Info', bg: 'bg-status-info-bg', text: 'text-status-info-text', border: 'border-status-info-border', icon: 'text-status-info-icon', dot: 'bg-status-info-icon' },\n { figma: 'Warning', status: 'warning', chipLabel: 'Warning', bg: 'bg-status-warning-bg', text: 'text-status-warning-text', border: 'border-status-warning-border', icon: 'text-status-warning-icon', dot: 'bg-status-warning-icon' },\n { figma: 'Error', status: 'error', chipLabel: 'Error', bg: 'bg-status-error-bg', text: 'text-status-error-text', border: 'border-status-error-border', icon: 'text-status-error-icon', dot: 'bg-status-error-icon' },\n { figma: 'Success', status: 'success', chipLabel: 'Success', bg: 'bg-status-success-bg', text: 'text-status-success-text', border: 'border-status-success-border', icon: 'text-status-success-icon', dot: 'bg-status-success-icon' },\n { figma: 'Highlighted', status: 'pink', chipLabel: 'Highlighted', bg: 'bg-status-pink-bg', text: 'text-status-pink-text', border: 'border-status-pink-border', icon: 'text-status-pink-icon', dot: 'bg-status-pink-icon' },\n]\n\n// One status family: the composed chip first (how the roles work together),\n// then each token presented in its actual role.\nfunction StatusFamilyPreview({ family }: { family: StatusFamily }) {\n return (\n <div className=\"space-y-3\">\n <span\n className={`inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-sm font-medium ${family.bg} ${family.text} ${family.border}`}\n >\n <span aria-hidden className={`size-2 rounded-full ${family.dot}`} />\n {family.chipLabel}\n </span>\n <div className=\"flex flex-wrap gap-2\">\n <TokenSwatch tokenClass={family.bg} label={family.bg} />\n <TextSwatch textClass={family.text} label={family.text} />\n <BorderSwatch borderClass={family.border} label={family.border} />\n <IconSwatch iconClass={family.icon} label={family.icon} />\n </div>\n </div>\n )\n}\n\nconst stateTokensEntry: GalleryEntry = {\n id: 'state-tokens',\n title: 'State color tokens',\n importPath: TOKENS_IMPORT,\n usage: {\n do: [\n 'Pair -bg with -text of the same family \u2014 the shades are contrast-tested together.',\n '-icon for glyphs and dots, -border for outlines; both handle dark mode themselves.',\n ],\n dont: [\n 'Never hardcode Tailwind status colors (text-red-*, bg-green-*, text-amber-*).',\n 'No dark: overrides on status tokens \u2014 they already theme.',\n ],\n },\n figmaNodeId: FIGMA_COLORS_NODE,\n variants: [\n ...FIGMA_STATE_TO_CODE.map((family) => ({\n id: family.status,\n title: `${family.figma} \u2192 status-${family.status}`,\n render: () => <StatusFamilyPreview family={family} />,\n code: `<span className=\"${family.bg} ${family.text} ${family.border}\" />`,\n })),\n {\n id: 'feature',\n title: 'Feature \u2192 brand-violet pattern',\n render: () => (\n <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\">\n Feature state uses the brand-violet 10/30/100 pattern, not a status family.\n </div>\n ),\n code: `<Alert status=\"feature\" />`,\n },\n ],\n}\n\nconst chartPaletteEntry: GalleryEntry = {\n id: 'chart-palette',\n title: 'Chart palette',\n importPath: TOKENS_IMPORT,\n usage: {\n dont: [\n 'Never build token class names dynamically (`bg-chart-${n}`) \u2014 the Tailwind scanner only sees complete literals, so the class is silently never generated.',\n ],\n },\n variants: [\n {\n id: 'numbered',\n title: 'numbered',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-chart-1', label: 'chart-1' },\n { tokenClass: 'bg-chart-2', label: 'chart-2' },\n { tokenClass: 'bg-chart-3', label: 'chart-3' },\n { tokenClass: 'bg-chart-4', label: 'chart-4' },\n { tokenClass: 'bg-chart-5', label: 'chart-5' },\n ]}\n />\n ),\n code: `<BarChart data={data} />`,\n },\n {\n id: 'named',\n title: 'named',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-chart-blue', label: 'chart-blue' },\n { tokenClass: 'bg-chart-emerald', label: 'chart-emerald' },\n { tokenClass: 'bg-chart-amber', label: 'chart-amber' },\n { tokenClass: 'bg-chart-rose', label: 'chart-rose' },\n { tokenClass: 'bg-chart-violet', label: 'chart-violet' },\n { tokenClass: 'bg-chart-cyan', label: 'chart-cyan' },\n { tokenClass: 'bg-chart-indigo', label: 'chart-indigo' },\n { tokenClass: 'bg-chart-pink', label: 'chart-pink' },\n { tokenClass: 'bg-chart-teal', label: 'chart-teal' },\n { tokenClass: 'bg-chart-orange', label: 'chart-orange' },\n ]}\n />\n ),\n code: `<Sparkline className=\"text-chart-blue\" data={points} />`,\n },\n ],\n}\n\ntype ColorRole = {\n surface: string\n onSurface: string\n surfaceCls: string\n onSurfaceCls: string\n borderCls?: string\n}\n\nfunction RoleCard({ role }: { role: ColorRole }) {\n const label = `${role.surface} / ${role.onSurface}`\n const onCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(`${role.surfaceCls} ${role.onSurfaceCls}`)\n flash(`${role.surfaceCls} ${role.onSurfaceCls} copied`, 'success')\n } catch {\n flash('Could not copy the classes', 'error')\n }\n }, [role])\n return (\n <button\n type=\"button\"\n onClick={onCopy}\n title={`Copy ${role.surfaceCls} ${role.onSurfaceCls}`}\n 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'}`}\n >\n <span className=\"text-sm font-medium leading-tight\">{role.surface}</span>\n <code className=\"text-xs opacity-80\">{role.onSurface}</code>\n </button>\n )\n}\n\nfunction RoleGrid({ roles }: { roles: ColorRole[] }) {\n return (\n <div className=\"grid w-full gap-2 sm:grid-cols-2 lg:grid-cols-3\">\n {roles.map((role) => (\n <RoleCard key={role.surface + role.onSurface} role={role} />\n ))}\n </div>\n )\n}\n\nconst colorRolesEntry: GalleryEntry = {\n id: 'color-roles',\n title: 'Color roles',\n importPath: TOKENS_IMPORT,\n figmaNodeId: FIGMA_COLORS_NODE,\n keywords: ['roles', 'pairs', 'on-color', 'material'],\n usage: {\n do: [\n 'A role is a surface paired with its content color \u2014 always use them together, never mix pairs.',\n 'Click a card to copy both classes of the pair.',\n ],\n dont: [\n 'Never put foreground on a surface from a different pair \u2014 contrast is only tested within a pair.',\n 'Never use a -foreground token as a standalone accent color.',\n ],\n },\n variants: [\n {\n id: 'action',\n title: 'action',\n render: () => (\n <RoleGrid\n roles={[\n { surface: 'primary', onSurface: 'primary-foreground', surfaceCls: 'bg-primary', onSurfaceCls: 'text-primary-foreground' },\n { surface: 'destructive', onSurface: 'white', surfaceCls: 'bg-destructive', onSurfaceCls: 'text-white' },\n { surface: 'brand-violet', onSurface: 'brand-violet-foreground', surfaceCls: 'bg-brand-violet', onSurfaceCls: 'text-brand-violet-foreground' },\n { surface: 'accent-indigo', onSurface: 'accent-indigo-foreground', surfaceCls: 'bg-accent-indigo', onSurfaceCls: 'text-accent-indigo-foreground' },\n ]}\n />\n ),\n code: `<button className=\"bg-primary text-primary-foreground\" />`,\n },\n {\n id: 'surfaces',\n title: 'surfaces',\n render: () => (\n <RoleGrid\n roles={[\n { surface: 'background', onSurface: 'foreground', surfaceCls: 'bg-background', onSurfaceCls: 'text-foreground' },\n { surface: 'card', onSurface: 'card-foreground', surfaceCls: 'bg-card', onSurfaceCls: 'text-card-foreground' },\n { surface: 'popover', onSurface: 'popover-foreground', surfaceCls: 'bg-popover', onSurfaceCls: 'text-popover-foreground' },\n { surface: 'muted', onSurface: 'muted-foreground', surfaceCls: 'bg-muted', onSurfaceCls: 'text-muted-foreground' },\n { surface: 'accent', onSurface: 'accent-foreground', surfaceCls: 'bg-accent', onSurfaceCls: 'text-accent-foreground' },\n { surface: 'sidebar', onSurface: 'sidebar-foreground', surfaceCls: 'bg-sidebar', onSurfaceCls: 'text-sidebar-foreground' },\n ]}\n />\n ),\n code: `<div className=\"bg-card text-card-foreground\" />`,\n },\n {\n id: 'status',\n title: 'status',\n render: () => (\n <RoleGrid\n roles={['error', 'success', 'warning', 'info', 'neutral', 'pink'].map((status) => ({\n surface: `status-${status}-bg`,\n onSurface: `status-${status}-text`,\n surfaceCls: `bg-status-${status}-bg`,\n onSurfaceCls: `text-status-${status}-text`,\n borderCls: `border-status-${status}-border`,\n }))}\n />\n ),\n code: `<span className=\"bg-status-error-bg text-status-error-text border-status-error-border\" />`,\n },\n ],\n}\n\nconst RADIUS_SCALE: Array<{ cls: string; label: string; px: string }> = [\n { cls: 'rounded-none', label: 'rounded-none', px: '0px' },\n { cls: 'rounded-sm', label: 'rounded-sm', px: '6px' },\n { cls: 'rounded-md', label: 'rounded-md', px: '8px' },\n { cls: 'rounded-lg', label: 'rounded-lg', px: '10px' },\n { cls: 'rounded-xl', label: 'rounded-xl', px: '16px' },\n { cls: 'rounded-full', label: 'rounded-full', px: '999px' },\n]\n\nfunction RadiusCard({ cls, label, px }: { cls: string; label: string; px: string }) {\n const onCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(label)\n flash(`${label} copied`, 'success')\n } catch {\n flash('Could not copy the class', 'error')\n }\n }, [label])\n return (\n <button\n type=\"button\"\n onClick={onCopy}\n title={`Copy ${label}`}\n 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\"\n >\n <span aria-hidden className={`h-14 w-full border-2 border-dashed border-status-pink-icon bg-status-pink-bg ${cls}`} />\n <span className=\"space-y-0.5\">\n <code className=\"block text-xs text-foreground\">{label}</code>\n <span className=\"block text-xs text-muted-foreground\">{px}</span>\n </span>\n </button>\n )\n}\n\nconst radiusEntry: GalleryEntry = {\n id: 'corner-radius',\n title: 'Corner radius',\n importPath: TOKENS_IMPORT,\n keywords: ['radius', 'rounded', 'border-radius', 'corners'],\n usage: {\n do: [\n 'The scale derives from the --radius base token (10px): sm 6px, md 8px, lg 10px, xl 16px.',\n 'Cards and panels use rounded-lg; controls, chips and filter buttons use rounded-md.',\n 'rounded-full is reserved for Badge, Tag, SegmentedControl, Avatar and status dots.',\n ],\n dont: [\n 'No arbitrary values (rounded-[24px]) \u2014 pick from the scale.',\n 'No full-pill radii on filter chips or custom controls outside the reserved primitives.',\n ],\n },\n variants: [\n {\n id: 'scale',\n title: 'scale',\n render: () => (\n <div className=\"flex flex-wrap gap-2\">\n {RADIUS_SCALE.map((item) => (\n <RadiusCard key={item.cls} {...item} />\n ))}\n </div>\n ),\n code: `<div className=\"rounded-lg border border-border\" />`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n brandColorsEntry,\n colorRolesEntry,\n colorTokensEntry,\n stateTokensEntry,\n chartPaletteEntry,\n radiusEntry,\n]\n"],
5
- "mappings": "AAwBI,SAOE,KAPF;AAxBJ,YAAY,WAAW;AACvB,SAAS,cAAc;AACvB,SAAS,aAAa;AAStB,MAAM,gBAAgB;AACtB,MAAM,oBAAoB;AAE1B,SAAS,WAAW,EAAE,UAAU,OAAO,SAAS,GAAmE;AACjH,QAAM,SAAS,MAAM,YAAY,YAAY;AAC3C,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,QAAQ;AAC5C,YAAM,GAAG,QAAQ,WAAW,SAAS;AAAA,IACvC,QAAQ;AACN,YAAM,4BAA4B,OAAO;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AACb,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAU;AAAA,MACV,OAAO,QAAQ,QAAQ;AAAA,MAEtB;AAAA;AAAA,QACD,oBAAC,UAAK,WAAU,6DAA6D,iBAAM;AAAA;AAAA;AAAA,EACrF;AAEJ;AAEA,SAAS,YAAY,EAAE,YAAY,MAAM,GAA0C;AACjF,SACE,oBAAC,cAAW,UAAU,OAAO,OAC3B,8BAAC,UAAK,eAAW,MAAC,WAAW,+CAA+C,UAAU,IAAI,GAC5F;AAEJ;AAGA,SAAS,WAAW,EAAE,WAAW,MAAM,GAAyC;AAC9E,SACE,oBAAC,cAAW,UAAU,WAAW,OAC/B,8BAAC,UAAK,eAAW,MAAC,WAAU,8FAC1B,8BAAC,UAAK,WAAW,sCAAsC,SAAS,IAAI,gBAAE,GACxE,GACF;AAEJ;AAGA,SAAS,aAAa,EAAE,aAAa,MAAM,GAA2C;AACpF,SACE,oBAAC,cAAW,UAAU,aAAa,OACjC,8BAAC,UAAK,eAAW,MAAC,WAAW,iDAAiD,WAAW,IAAI,GAC/F;AAEJ;AAGA,SAAS,WAAW,EAAE,WAAW,MAAM,GAAyC;AAC9E,SACE,oBAAC,cAAW,UAAU,WAAW,OAC/B,8BAAC,UAAK,eAAW,MAAC,WAAU,8FAC1B,8BAAC,UAAO,WAAW,uBAAuB,SAAS,IAAI,GACzD,GACF;AAEJ;AAEA,SAAS,UAAU,EAAE,MAAM,GAA4D;AACrF,SACE,oBAAC,SAAI,WAAU,wBACZ,gBAAM,IAAI,CAAC,SACV,oBAAC,eAA6B,YAAY,KAAK,YAAY,OAAO,KAAK,SAArD,KAAK,KAAuD,CAC/E,GACH;AAEJ;AAEA,MAAM,mBAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,IACL,IAAI,CAAC,mFAAmF;AAAA,IACxF,MAAM,CAAC,qFAAgF;AAAA,EACzF;AAAA,EACA,aAAa;AAAA,EACb,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,oBAAC,UAAK,WAAU,iCAAgC,+DAAiD;AAAA,SACnG;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,YAAY,iBAAiB,OAAO,aAAa;AAAA,YACnD,EAAE,YAAY,mBAAmB,OAAO,eAAe;AAAA,YACvD,EAAE,YAAY,mBAAmB,OAAO,eAAe;AAAA,YACvD,EAAE,YAAY,8BAA8B,OAAO,0BAA0B;AAAA,YAC7E,EAAE,YAAY,oBAAoB,OAAO,gBAAgB;AAAA,UAC3D;AAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,YAAY,kBAAkB,OAAO,cAAc;AAAA,YACrD,EAAE,YAAY,mBAAmB,OAAO,eAAe;AAAA,YACvD,EAAE,YAAY,qBAAqB,OAAO,iBAAiB;AAAA,YAC3D,EAAE,YAAY,oBAAoB,OAAO,gBAAgB;AAAA,YACzD,EAAE,YAAY,qBAAqB,OAAO,iBAAiB;AAAA,YAC3D,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,UAC/C;AAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,MAAM,mBAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,IACL,IAAI,CAAC,wDAAwD,qEAAgE;AAAA,IAC7H,MAAM,CAAC,+CAA+C;AAAA,EACxD;AAAA,EACA,aAAa;AAAA,EACb,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,YAC7C,EAAE,YAAY,yBAAyB,OAAO,qBAAqB;AAAA,YACnE,EAAE,YAAY,oBAAoB,OAAO,gBAAgB;AAAA,YACzD,EAAE,YAAY,kBAAkB,OAAO,cAAc;AAAA,UACvD;AAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,YAAY,iBAAiB,OAAO,aAAa;AAAA,YACnD,EAAE,YAAY,WAAW,OAAO,OAAO;AAAA,YACvC,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,YAC7C,EAAE,YAAY,YAAY,OAAO,QAAQ;AAAA,YACzC,EAAE,YAAY,aAAa,OAAO,SAAS;AAAA,YAC3C,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,YAC7C,EAAE,YAAY,kBAAkB,OAAO,cAAc;AAAA,UACvD;AAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,qBAAC,SAAI,WAAU,wBACb;AAAA,4BAAC,cAAW,WAAU,mBAAkB,OAAM,mBAAkB;AAAA,QAChE,oBAAC,cAAW,WAAU,yBAAwB,OAAM,yBAAwB;AAAA,QAC5E,oBAAC,cAAW,WAAU,wBAAuB,OAAM,wBAAuB;AAAA,QAC1E,oBAAC,cAAW,WAAU,0BAAyB,OAAM,0BAAyB;AAAA,QAC9E,oBAAC,cAAW,WAAU,sBAAqB,OAAM,sBAAqB;AAAA,SACxE;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,qBAAC,SAAI,WAAU,wBACb;AAAA,4BAAC,gBAAa,aAAY,iBAAgB,OAAM,iBAAgB;AAAA,QAChE,oBAAC,gBAAa,aAAY,gBAAe,OAAM,gBAAe;AAAA,QAC9D,oBAAC,gBAAa,aAAY,eAAc,OAAM,eAAc;AAAA,QAC5D,oBAAC,gBAAa,aAAY,0BAAyB,OAAM,0BAAyB;AAAA,SACpF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAeA,MAAM,sBAAsC;AAAA,EAC1C,EAAE,OAAO,SAAS,QAAQ,WAAW,WAAW,WAAW,IAAI,wBAAwB,MAAM,4BAA4B,QAAQ,gCAAgC,MAAM,4BAA4B,KAAK,yBAAyB;AAAA,EACjO,EAAE,OAAO,eAAe,QAAQ,QAAQ,WAAW,QAAQ,IAAI,qBAAqB,MAAM,yBAAyB,QAAQ,6BAA6B,MAAM,yBAAyB,KAAK,sBAAsB;AAAA,EAClN,EAAE,OAAO,WAAW,QAAQ,WAAW,WAAW,WAAW,IAAI,wBAAwB,MAAM,4BAA4B,QAAQ,gCAAgC,MAAM,4BAA4B,KAAK,yBAAyB;AAAA,EACnO,EAAE,OAAO,SAAS,QAAQ,SAAS,WAAW,SAAS,IAAI,sBAAsB,MAAM,0BAA0B,QAAQ,8BAA8B,MAAM,0BAA0B,KAAK,uBAAuB;AAAA,EACnN,EAAE,OAAO,WAAW,QAAQ,WAAW,WAAW,WAAW,IAAI,wBAAwB,MAAM,4BAA4B,QAAQ,gCAAgC,MAAM,4BAA4B,KAAK,yBAAyB;AAAA,EACnO,EAAE,OAAO,eAAe,QAAQ,QAAQ,WAAW,eAAe,IAAI,qBAAqB,MAAM,yBAAyB,QAAQ,6BAA6B,MAAM,yBAAyB,KAAK,sBAAsB;AAC3N;AAIA,SAAS,oBAAoB,EAAE,OAAO,GAA6B;AACjE,SACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,sFAAsF,OAAO,EAAE,IAAI,OAAO,IAAI,IAAI,OAAO,MAAM;AAAA,QAE1I;AAAA,8BAAC,UAAK,eAAW,MAAC,WAAW,uBAAuB,OAAO,GAAG,IAAI;AAAA,UACjE,OAAO;AAAA;AAAA;AAAA,IACV;AAAA,IACA,qBAAC,SAAI,WAAU,wBACb;AAAA,0BAAC,eAAY,YAAY,OAAO,IAAI,OAAO,OAAO,IAAI;AAAA,MACtD,oBAAC,cAAW,WAAW,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,MACxD,oBAAC,gBAAa,aAAa,OAAO,QAAQ,OAAO,OAAO,QAAQ;AAAA,MAChE,oBAAC,cAAW,WAAW,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,OAC1D;AAAA,KACF;AAEJ;AAEA,MAAM,mBAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,IACL,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,aAAa;AAAA,EACb,UAAU;AAAA,IACR,GAAG,oBAAoB,IAAI,CAAC,YAAY;AAAA,MACtC,IAAI,OAAO;AAAA,MACX,OAAO,GAAG,OAAO,KAAK,kBAAa,OAAO,MAAM;AAAA,MAChD,QAAQ,MAAM,oBAAC,uBAAoB,QAAgB;AAAA,MACnD,MAAM,oBAAoB,OAAO,EAAE,IAAI,OAAO,IAAI,IAAI,OAAO,MAAM;AAAA,IACrE,EAAE;AAAA,IACF;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,8HAA6H,yFAE5I;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,MAAM,oBAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,YAC7C,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,YAC7C,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,YAC7C,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,YAC7C,EAAE,YAAY,cAAc,OAAO,UAAU;AAAA,UAC/C;AAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,YAAY,iBAAiB,OAAO,aAAa;AAAA,YACnD,EAAE,YAAY,oBAAoB,OAAO,gBAAgB;AAAA,YACzD,EAAE,YAAY,kBAAkB,OAAO,cAAc;AAAA,YACrD,EAAE,YAAY,iBAAiB,OAAO,aAAa;AAAA,YACnD,EAAE,YAAY,mBAAmB,OAAO,eAAe;AAAA,YACvD,EAAE,YAAY,iBAAiB,OAAO,aAAa;AAAA,YACnD,EAAE,YAAY,mBAAmB,OAAO,eAAe;AAAA,YACvD,EAAE,YAAY,iBAAiB,OAAO,aAAa;AAAA,YACnD,EAAE,YAAY,iBAAiB,OAAO,aAAa;AAAA,YACnD,EAAE,YAAY,mBAAmB,OAAO,eAAe;AAAA,UACzD;AAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAUA,SAAS,SAAS,EAAE,KAAK,GAAwB;AAC/C,QAAM,QAAQ,GAAG,KAAK,OAAO,MAAM,KAAK,SAAS;AACjD,QAAM,SAAS,MAAM,YAAY,YAAY;AAC3C,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,GAAG,KAAK,UAAU,IAAI,KAAK,YAAY,EAAE;AAC7E,YAAM,GAAG,KAAK,UAAU,IAAI,KAAK,YAAY,WAAW,SAAS;AAAA,IACnE,QAAQ;AACN,YAAM,8BAA8B,OAAO;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AACT,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,OAAO,QAAQ,KAAK,UAAU,IAAI,KAAK,YAAY;AAAA,MACnD,WAAW,uKAAuK,KAAK,UAAU,IAAI,KAAK,YAAY,IAAI,KAAK,aAAa,eAAe;AAAA,MAE3P;AAAA,4BAAC,UAAK,WAAU,qCAAqC,eAAK,SAAQ;AAAA,QAClE,oBAAC,UAAK,WAAU,sBAAsB,eAAK,WAAU;AAAA;AAAA;AAAA,EACvD;AAEJ;AAEA,SAAS,SAAS,EAAE,MAAM,GAA2B;AACnD,SACE,oBAAC,SAAI,WAAU,mDACZ,gBAAM,IAAI,CAAC,SACV,oBAAC,YAA6C,QAA/B,KAAK,UAAU,KAAK,SAAuB,CAC3D,GACH;AAEJ;AAEA,MAAM,kBAAgC;AAAA,EACpC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU,CAAC,SAAS,SAAS,YAAY,UAAU;AAAA,EACnD,OAAO;AAAA,IACL,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,SAAS,WAAW,WAAW,sBAAsB,YAAY,cAAc,cAAc,0BAA0B;AAAA,YACzH,EAAE,SAAS,eAAe,WAAW,SAAS,YAAY,kBAAkB,cAAc,aAAa;AAAA,YACvG,EAAE,SAAS,gBAAgB,WAAW,2BAA2B,YAAY,mBAAmB,cAAc,+BAA+B;AAAA,YAC7I,EAAE,SAAS,iBAAiB,WAAW,4BAA4B,YAAY,oBAAoB,cAAc,gCAAgC;AAAA,UACnJ;AAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,SAAS,cAAc,WAAW,cAAc,YAAY,iBAAiB,cAAc,kBAAkB;AAAA,YAC/G,EAAE,SAAS,QAAQ,WAAW,mBAAmB,YAAY,WAAW,cAAc,uBAAuB;AAAA,YAC7G,EAAE,SAAS,WAAW,WAAW,sBAAsB,YAAY,cAAc,cAAc,0BAA0B;AAAA,YACzH,EAAE,SAAS,SAAS,WAAW,oBAAoB,YAAY,YAAY,cAAc,wBAAwB;AAAA,YACjH,EAAE,SAAS,UAAU,WAAW,qBAAqB,YAAY,aAAa,cAAc,yBAAyB;AAAA,YACrH,EAAE,SAAS,WAAW,WAAW,sBAAsB,YAAY,cAAc,cAAc,0BAA0B;AAAA,UAC3H;AAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,CAAC,SAAS,WAAW,WAAW,QAAQ,WAAW,MAAM,EAAE,IAAI,CAAC,YAAY;AAAA,YACjF,SAAS,UAAU,MAAM;AAAA,YACzB,WAAW,UAAU,MAAM;AAAA,YAC3B,YAAY,aAAa,MAAM;AAAA,YAC/B,cAAc,eAAe,MAAM;AAAA,YACnC,WAAW,iBAAiB,MAAM;AAAA,UACpC,EAAE;AAAA;AAAA,MACJ;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,MAAM,eAAkE;AAAA,EACtE,EAAE,KAAK,gBAAgB,OAAO,gBAAgB,IAAI,MAAM;AAAA,EACxD,EAAE,KAAK,cAAc,OAAO,cAAc,IAAI,MAAM;AAAA,EACpD,EAAE,KAAK,cAAc,OAAO,cAAc,IAAI,MAAM;AAAA,EACpD,EAAE,KAAK,cAAc,OAAO,cAAc,IAAI,OAAO;AAAA,EACrD,EAAE,KAAK,cAAc,OAAO,cAAc,IAAI,OAAO;AAAA,EACrD,EAAE,KAAK,gBAAgB,OAAO,gBAAgB,IAAI,QAAQ;AAC5D;AAEA,SAAS,WAAW,EAAE,KAAK,OAAO,GAAG,GAA+C;AAClF,QAAM,SAAS,MAAM,YAAY,YAAY;AAC3C,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK;AACzC,YAAM,GAAG,KAAK,WAAW,SAAS;AAAA,IACpC,QAAQ;AACN,YAAM,4BAA4B,OAAO;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AACV,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,OAAO,QAAQ,KAAK;AAAA,MACpB,WAAU;AAAA,MAEV;AAAA,4BAAC,UAAK,eAAW,MAAC,WAAW,gFAAgF,GAAG,IAAI;AAAA,QACpH,qBAAC,UAAK,WAAU,eACd;AAAA,8BAAC,UAAK,WAAU,iCAAiC,iBAAM;AAAA,UACvD,oBAAC,UAAK,WAAU,uCAAuC,cAAG;AAAA,WAC5D;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,MAAM,cAA4B;AAAA,EAChC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU,CAAC,UAAU,WAAW,iBAAiB,SAAS;AAAA,EAC1D,OAAO;AAAA,IACL,IAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,wBACZ,uBAAa,IAAI,CAAC,SACjB,oBAAC,cAA2B,GAAG,QAAd,KAAK,GAAe,CACtC,GACH;AAAA,MAEF,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,MAAM,UAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
4
+ "sourcesContent": ["import * as React from 'react'\nimport { ArrowRight, Circle } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport type { GalleryEntry } from '../types'\nimport { SourceColors, SourceGrids, SourceRadius, SourceShadows, SourceTypography } from '../demos/foundation-references'\n\n// Token names are proper nouns from the codebase and are deliberately not\n// translated. Structure mirrors the DS Figma color-system sheet (node\n// 553:14956): Brand Colors \u2192 Color Tokens by role \u2192 State Color Tokens.\n// Figma state names map to code tokens per the contract documented in\n// globals.css: state/{x}/base\u2192icon, /light\u2192border, /lighter\u2192bg.\n\nconst TOKENS_IMPORT = 'apps/mercato/src/app/globals.css'\nconst FIGMA_COLORS_NODE = '553:14956'\n\nfunction useCopyToken(copyText: string) {\n const t = useT()\n const onCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(copyText)\n flash(t('design_system.gallery.tokenCopied', { token: copyText }), 'success')\n } catch {\n flash(t('design_system.gallery.tokenCopyFailed'), 'error')\n }\n }, [copyText, t])\n return { onCopy, copyLabel: t('design_system.gallery.copyToken', { token: copyText }) }\n}\n\nfunction SwatchCard({ copyText, label, children }: { copyText: string; label: string; children: React.ReactNode }) {\n const { onCopy, copyLabel } = useCopyToken(copyText)\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onCopy}\n 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\"\n title={copyLabel}\n aria-label={copyLabel}\n >\n {children}\n <code className=\"break-all text-xs text-muted-foreground\">{label}</code>\n </Button>\n )\n}\n\nfunction TokenSwatch({ tokenClass, label }: { tokenClass: string; label: string }) {\n return (\n <SwatchCard copyText={label} label={label}>\n <span aria-hidden className={`h-20 w-full rounded-sm border border-border ${tokenClass}`} />\n </SwatchCard>\n )\n}\n\n// A text-color token shown in its actual role \u2014 as type, not as a fill.\nfunction TextSwatch({ textClass, label }: { textClass: string; label: string }) {\n return (\n <SwatchCard copyText={textClass} label={label}>\n <span aria-hidden className=\"flex h-20 w-full items-center justify-center rounded-sm border border-border bg-background\">\n <span className={`text-3xl font-medium leading-none ${textClass}`}>Aa</span>\n </span>\n </SwatchCard>\n )\n}\n\n// A border-color token shown as a 2px outline on the neutral surface.\nfunction BorderSwatch({ borderClass, label }: { borderClass: string; label: string }) {\n return (\n <SwatchCard copyText={borderClass} label={label}>\n <span aria-hidden className={`h-20 w-full rounded-sm border-2 bg-background ${borderClass}`} />\n </SwatchCard>\n )\n}\n\n// An icon-color token shown on a real glyph.\nfunction IconSwatch({ iconClass, label }: { iconClass: string; label: string }) {\n return (\n <SwatchCard copyText={iconClass} label={label}>\n <span aria-hidden className=\"flex h-20 w-full items-center justify-center rounded-sm border border-border bg-background\">\n <Circle className={`size-4 fill-current ${iconClass}`} />\n </span>\n </SwatchCard>\n )\n}\n\nfunction SwatchRow({ items }: { items: Array<{ tokenClass: string; label: string }> }) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {items.map((item) => (\n <TokenSwatch key={item.label} tokenClass={item.tokenClass} label={item.label} />\n ))}\n </div>\n )\n}\n\nconst brandColorsEntry: GalleryEntry = {\n id: 'brand-colors',\n title: 'Brand colors',\n importPath: TOKENS_IMPORT,\n usage: {\n do: ['Use the brand-violet 10/30/100 pattern (bg/border/text) for AI features and user-saved views.'],\n dont: ['Do not substitute brand colors for semantic status tokens.', 'Do not repurpose accent-indigo \u2014 it is the selection-control contract.'],\n },\n figmaNodeId: FIGMA_COLORS_NODE,\n variants: [\n {\n id: 'gradient',\n title: 'gradient 135\u00B0',\n render: () => (\n <div className=\"space-y-2\">\n <div\n aria-hidden\n 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%\"\n />\n <code className=\"text-xs text-muted-foreground\">brand-lime 0%, brand-yellow 35%, brand-violet 70%</code>\n </div>\n ),\n code: `<div className=\"bg-linear-135 from-brand-lime from-0% via-brand-yellow via-35% to-brand-violet to-70%\" />`,\n },\n {\n id: 'identity',\n title: 'identity',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-brand-lime', label: 'brand-lime' },\n { tokenClass: 'bg-brand-yellow', label: 'brand-yellow' },\n { tokenClass: 'bg-brand-violet', label: 'brand-violet' },\n { tokenClass: 'bg-brand-violet-foreground', label: 'brand-violet-foreground' },\n { tokenClass: 'bg-accent-indigo', label: 'accent-indigo' },\n ]}\n />\n ),\n code: `<span className=\"bg-brand-violet/10 border-brand-violet/30 text-brand-violet\" />`,\n },\n {\n id: 'social',\n title: 'social',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-brand-apple', label: 'brand-apple' },\n { tokenClass: 'bg-brand-github', label: 'brand-github' },\n { tokenClass: 'bg-brand-facebook', label: 'brand-facebook' },\n { tokenClass: 'bg-brand-dropbox', label: 'brand-dropbox' },\n { tokenClass: 'bg-brand-linkedin', label: 'brand-linkedin' },\n { tokenClass: 'bg-brand-x', label: 'brand-x' },\n ]}\n />\n ),\n code: `<SocialButton provider=\"github\" />`,\n },\n ],\n}\n\nconst colorTokensEntry: GalleryEntry = {\n id: 'color-tokens',\n title: 'Color tokens',\n importPath: TOKENS_IMPORT,\n usage: {\n do: ['Pair every surface with its -foreground counterpart.', 'Borders come from border-border / border-input \u2014 nothing else.'],\n dont: ['Never border-gray-* or any raw palette shade.'],\n },\n figmaNodeId: FIGMA_COLORS_NODE,\n variants: [\n {\n id: 'source-palette',\n title: 'Complete source palette',\n render: () => <SourceColors />,\n code: `import { SourceColors } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'\n\n<SourceColors />`,\n },\n {\n id: 'primary',\n title: 'primary',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-primary', label: 'primary' },\n { tokenClass: 'bg-primary-foreground', label: 'primary-foreground' },\n { tokenClass: 'bg-primary-hover', label: 'primary-hover' },\n { tokenClass: 'bg-destructive', label: 'destructive' },\n ]}\n />\n ),\n code: `<div className=\"bg-primary text-primary-foreground hover:bg-primary-hover\" />`,\n },\n {\n id: 'background',\n title: 'background (bg)',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-background', label: 'background' },\n { tokenClass: 'bg-card', label: 'card' },\n { tokenClass: 'bg-popover', label: 'popover' },\n { tokenClass: 'bg-muted', label: 'muted' },\n { tokenClass: 'bg-accent', label: 'accent' },\n { tokenClass: 'bg-sidebar', label: 'sidebar' },\n { tokenClass: 'bg-bg-disabled', label: 'bg-disabled' },\n ]}\n />\n ),\n code: `<div className=\"bg-card text-card-foreground\" />`,\n },\n {\n id: 'text',\n title: 'text',\n render: () => (\n <div className=\"flex flex-wrap gap-2\">\n <TextSwatch textClass=\"text-foreground\" label=\"text-foreground\" />\n <TextSwatch textClass=\"text-muted-foreground\" label=\"text-muted-foreground\" />\n <TextSwatch textClass=\"text-card-foreground\" label=\"text-card-foreground\" />\n <TextSwatch textClass=\"text-accent-foreground\" label=\"text-accent-foreground\" />\n <TextSwatch textClass=\"text-text-disabled\" label=\"text-text-disabled\" />\n </div>\n ),\n code: `<p className=\"text-muted-foreground\">{t('design_system.gallery.samples.typeBody')}</p>`,\n },\n {\n id: 'stroke',\n title: 'stroke',\n render: () => (\n <div className=\"flex flex-wrap gap-2\">\n <BorderSwatch borderClass=\"border-border\" label=\"border-border\" />\n <BorderSwatch borderClass=\"border-input\" label=\"border-input\" />\n <BorderSwatch borderClass=\"border-ring\" label=\"border-ring\" />\n <BorderSwatch borderClass=\"border-border-disabled\" label=\"border-border-disabled\" />\n </div>\n ),\n code: `<div className=\"border-border focus-visible:ring-ring\" />`,\n },\n ],\n}\n\n// Literal class strings on purpose: the Tailwind scanner only sees complete\n// literals, so `bg-status-${x}` variants would silently never be generated.\ntype StatusFamily = {\n figma: string\n status: string\n chipLabel: string\n bg: string\n text: string\n border: string\n icon: string\n dot: string\n}\n\nconst FIGMA_STATE_TO_CODE: StatusFamily[] = [\n { figma: 'Faded', status: 'neutral', chipLabel: 'Neutral', bg: 'bg-status-neutral-bg', text: 'text-status-neutral-text', border: 'border-status-neutral-border', icon: 'text-status-neutral-icon', dot: 'bg-status-neutral-icon' },\n { figma: 'Information', status: 'info', chipLabel: 'Info', bg: 'bg-status-info-bg', text: 'text-status-info-text', border: 'border-status-info-border', icon: 'text-status-info-icon', dot: 'bg-status-info-icon' },\n { figma: 'Warning', status: 'warning', chipLabel: 'Warning', bg: 'bg-status-warning-bg', text: 'text-status-warning-text', border: 'border-status-warning-border', icon: 'text-status-warning-icon', dot: 'bg-status-warning-icon' },\n { figma: 'Error', status: 'error', chipLabel: 'Error', bg: 'bg-status-error-bg', text: 'text-status-error-text', border: 'border-status-error-border', icon: 'text-status-error-icon', dot: 'bg-status-error-icon' },\n { figma: 'Success', status: 'success', chipLabel: 'Success', bg: 'bg-status-success-bg', text: 'text-status-success-text', border: 'border-status-success-border', icon: 'text-status-success-icon', dot: 'bg-status-success-icon' },\n { figma: 'Highlighted', status: 'pink', chipLabel: 'Highlighted', bg: 'bg-status-pink-bg', text: 'text-status-pink-text', border: 'border-status-pink-border', icon: 'text-status-pink-icon', dot: 'bg-status-pink-icon' },\n]\n\n// One status family: the composed chip first (how the roles work together),\n// then each token presented in its actual role.\nfunction StatusFamilyPreview({ family }: { family: StatusFamily }) {\n return (\n <div className=\"space-y-3\">\n <span\n className={`inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-sm font-medium ${family.bg} ${family.text} ${family.border}`}\n >\n <span aria-hidden className={`size-2 rounded-full ${family.dot}`} />\n {family.chipLabel}\n </span>\n <div className=\"flex flex-wrap gap-2\">\n <TokenSwatch tokenClass={family.bg} label={family.bg} />\n <TextSwatch textClass={family.text} label={family.text} />\n <BorderSwatch borderClass={family.border} label={family.border} />\n <IconSwatch iconClass={family.icon} label={family.icon} />\n </div>\n </div>\n )\n}\n\nfunction FeatureStatePreview() {\n const t = useT()\n return (\n <Alert status=\"feature\" className=\"max-w-md\">\n <AlertDescription>{t('design_system.gallery.samples.featureState')}</AlertDescription>\n </Alert>\n )\n}\n\nconst stateTokensEntry: GalleryEntry = {\n id: 'state-tokens',\n title: 'State color tokens',\n importPath: TOKENS_IMPORT,\n usage: {\n do: [\n 'Pair -bg with -text of the same family \u2014 the shades are contrast-tested together.',\n '-icon for glyphs and dots, -border for outlines; both handle dark mode themselves.',\n 'Alert status=\"feature\" uses the neutral token family; brand-violet is reserved for AI and saved-view accents.',\n ],\n dont: [\n 'Never hardcode Tailwind status colors (text-red-*, bg-green-*, text-amber-*).',\n 'No dark: overrides on status tokens \u2014 they already theme.',\n ],\n },\n figmaNodeId: FIGMA_COLORS_NODE,\n variants: [\n ...FIGMA_STATE_TO_CODE.map((family) => ({\n id: family.status,\n title: `${family.figma} \u2192 status-${family.status}`,\n render: () => <StatusFamilyPreview family={family} />,\n code: `<span className=\"${family.bg} ${family.text} ${family.border}\" />`,\n })),\n {\n id: 'feature',\n title: 'Feature \u2192 status-neutral',\n render: () => <FeatureStatePreview />,\n code: `import { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\n\n<Alert status=\"feature\" className=\"max-w-md\">\n <AlertDescription>{t('design_system.gallery.samples.featureState')}</AlertDescription>\n</Alert>`,\n },\n ],\n}\n\nconst chartPaletteEntry: GalleryEntry = {\n id: 'chart-palette',\n title: 'Chart palette',\n importPath: TOKENS_IMPORT,\n usage: {\n dont: [\n 'Never build token class names dynamically (`bg-chart-${n}`) \u2014 the Tailwind scanner only sees complete literals, so the class is silently never generated.',\n ],\n },\n variants: [\n {\n id: 'numbered',\n title: 'numbered',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-chart-1', label: 'chart-1' },\n { tokenClass: 'bg-chart-2', label: 'chart-2' },\n { tokenClass: 'bg-chart-3', label: 'chart-3' },\n { tokenClass: 'bg-chart-4', label: 'chart-4' },\n { tokenClass: 'bg-chart-5', label: 'chart-5' },\n ]}\n />\n ),\n code: `<BarChart data={data} />`,\n },\n {\n id: 'named',\n title: 'named',\n render: () => (\n <SwatchRow\n items={[\n { tokenClass: 'bg-chart-blue', label: 'chart-blue' },\n { tokenClass: 'bg-chart-emerald', label: 'chart-emerald' },\n { tokenClass: 'bg-chart-amber', label: 'chart-amber' },\n { tokenClass: 'bg-chart-rose', label: 'chart-rose' },\n { tokenClass: 'bg-chart-violet', label: 'chart-violet' },\n { tokenClass: 'bg-chart-cyan', label: 'chart-cyan' },\n { tokenClass: 'bg-chart-indigo', label: 'chart-indigo' },\n { tokenClass: 'bg-chart-pink', label: 'chart-pink' },\n { tokenClass: 'bg-chart-teal', label: 'chart-teal' },\n { tokenClass: 'bg-chart-orange', label: 'chart-orange' },\n ]}\n />\n ),\n code: `<Sparkline className=\"text-chart-blue\" data={points} />`,\n },\n ],\n}\n\ntype ColorRole = {\n surface: string\n onSurface: string\n surfaceCls: string\n onSurfaceCls: string\n borderCls?: string\n}\n\nfunction RoleCard({ role }: { role: ColorRole }) {\n const { onCopy, copyLabel } = useCopyToken(`${role.surfaceCls} ${role.onSurfaceCls}`)\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onCopy}\n title={copyLabel}\n aria-label={copyLabel}\n className=\"h-auto w-full whitespace-normal p-0 text-left transition-opacity hover:bg-transparent hover:opacity-90\"\n >\n <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'}`}>\n <span className=\"text-base font-medium leading-tight\">{role.surface}</span>\n <code className=\"text-xs opacity-80\">{role.onSurface}</code>\n </span>\n </Button>\n )\n}\n\nfunction RoleGrid({ roles }: { roles: ColorRole[] }) {\n return (\n <div className=\"grid w-full gap-4 sm:grid-cols-2 xl:grid-cols-3\">\n {roles.map((role) => (\n <RoleCard key={role.surface + role.onSurface} role={role} />\n ))}\n </div>\n )\n}\n\nconst colorRolesEntry: GalleryEntry = {\n id: 'color-roles',\n title: 'Color roles',\n importPath: TOKENS_IMPORT,\n figmaNodeId: FIGMA_COLORS_NODE,\n keywords: ['roles', 'pairs', 'on-color', 'material'],\n usage: {\n do: [\n 'A role is a surface paired with its content color \u2014 always use them together, never mix pairs.',\n 'Click a card to copy both classes of the pair.',\n ],\n dont: [\n 'Never put foreground on a surface from a different pair \u2014 contrast is only tested within a pair.',\n 'Never use a -foreground token as a standalone accent color.',\n ],\n },\n variants: [\n {\n id: 'action',\n title: 'action',\n render: () => (\n <RoleGrid\n roles={[\n { surface: 'primary', onSurface: 'primary-foreground', surfaceCls: 'bg-primary', onSurfaceCls: 'text-primary-foreground' },\n { surface: 'destructive', onSurface: 'white', surfaceCls: 'bg-destructive', onSurfaceCls: 'text-white' },\n { surface: 'brand-violet', onSurface: 'brand-violet-foreground', surfaceCls: 'bg-brand-violet', onSurfaceCls: 'text-brand-violet-foreground' },\n { surface: 'accent-indigo', onSurface: 'accent-indigo-foreground', surfaceCls: 'bg-accent-indigo', onSurfaceCls: 'text-accent-indigo-foreground' },\n ]}\n />\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\n\n<Button type=\"button\">{t('design_system.gallery.samples.primaryAction')}</Button>`,\n },\n {\n id: 'surfaces',\n title: 'surfaces',\n render: () => (\n <RoleGrid\n roles={[\n { surface: 'background', onSurface: 'foreground', surfaceCls: 'bg-background', onSurfaceCls: 'text-foreground' },\n { surface: 'card', onSurface: 'card-foreground', surfaceCls: 'bg-card', onSurfaceCls: 'text-card-foreground' },\n { surface: 'popover', onSurface: 'popover-foreground', surfaceCls: 'bg-popover', onSurfaceCls: 'text-popover-foreground' },\n { surface: 'muted', onSurface: 'muted-foreground', surfaceCls: 'bg-muted', onSurfaceCls: 'text-muted-foreground' },\n { surface: 'accent', onSurface: 'accent-foreground', surfaceCls: 'bg-accent', onSurfaceCls: 'text-accent-foreground' },\n { surface: 'sidebar', onSurface: 'sidebar-foreground', surfaceCls: 'bg-sidebar', onSurfaceCls: 'text-sidebar-foreground' },\n ]}\n />\n ),\n code: `<div className=\"bg-card text-card-foreground\" />`,\n },\n {\n id: 'status',\n title: 'status',\n render: () => (\n <RoleGrid\n roles={FIGMA_STATE_TO_CODE.map((family) => ({\n surface: `status-${family.status}-bg`,\n onSurface: `status-${family.status}-text`,\n surfaceCls: family.bg,\n onSurfaceCls: family.text,\n borderCls: family.border,\n }))}\n />\n ),\n code: `<span className=\"bg-status-error-bg text-status-error-text border-status-error-border\" />`,\n },\n ],\n}\n\nconst RADIUS_SCALE: Array<{ cls: string; label: string; px: string }> = [\n { cls: 'rounded-none', label: 'rounded-none', px: '0px' },\n { cls: 'rounded-sm', label: 'rounded-sm', px: '6px' },\n { cls: 'rounded-md', label: 'rounded-md', px: '8px' },\n { cls: 'rounded-lg', label: 'rounded-lg', px: '10px' },\n { cls: 'rounded-xl', label: 'rounded-xl', px: '16px' },\n { cls: 'rounded-full', label: 'rounded-full', px: '999px' },\n]\n\nfunction RadiusCard({ cls, label, px }: { cls: string; label: string; px: string }) {\n const { onCopy, copyLabel } = useCopyToken(label)\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onCopy}\n title={copyLabel}\n aria-label={copyLabel}\n className=\"h-auto w-36 flex-col items-start gap-2 border border-border bg-background p-2 text-left hover:bg-muted/50\"\n >\n <span aria-hidden className={`h-14 w-full border-2 border-dashed border-status-pink-icon bg-status-pink-bg ${cls}`} />\n <span className=\"space-y-0.5\">\n <code className=\"block text-xs text-foreground\">{label}</code>\n <span className=\"block text-xs text-muted-foreground\">{px}</span>\n </span>\n </Button>\n )\n}\n\nconst radiusEntry: GalleryEntry = {\n id: 'corner-radius',\n title: 'Corner radius',\n importPath: TOKENS_IMPORT,\n figmaNodeId: '553:14961',\n keywords: ['radius', 'rounded', 'border-radius', 'corners'],\n usage: {\n do: [\n 'The scale derives from the --radius base token (10px): sm 6px, md 8px, lg 10px, xl 16px.',\n 'Cards and panels use rounded-lg; controls, chips and filter buttons use rounded-md.',\n 'rounded-full is reserved for Badge, Tag, SegmentedControl, Avatar and status dots.',\n ],\n dont: [\n 'No arbitrary values (rounded-[24px]) \u2014 pick from the scale.',\n 'No full-pill radii on filter chips or custom controls outside the reserved primitives.',\n ],\n },\n variants: [\n {\n id: 'source-radius',\n title: 'Complete radius scale',\n render: () => <SourceRadius />,\n code: `import { SourceRadius } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'\n\n<SourceRadius />`,\n },\n {\n id: 'scale',\n title: 'scale',\n render: () => (\n <div className=\"flex flex-wrap gap-2\">\n {RADIUS_SCALE.map((item) => (\n <RadiusCard key={item.cls} {...item} />\n ))}\n </div>\n ),\n code: `<div className=\"rounded-lg border border-border\" />`,\n },\n ],\n}\n\nconst TYPOGRAPHY_ROLES = [\n { id: 'page', className: 'text-2xl font-bold tracking-tight', metrics: '24 / 32 px' },\n { id: 'section', className: 'text-xl font-semibold', metrics: '20 / 28 px' },\n { id: 'body', className: 'text-sm', metrics: '14 / 20 px' },\n { id: 'label', className: 'text-sm font-medium', metrics: '14 / 20 px' },\n { id: 'helper', className: 'text-xs text-muted-foreground', metrics: '12 / 16 px' },\n] as const\n\nfunction TypographyRolesPreview() {\n const t = useT()\n return <div className=\"space-y-6\">\n <p className=\"max-w-3xl text-sm leading-relaxed text-muted-foreground\">{t('design_system.foundations.typography.guide.intro')}</p>\n <div className=\"divide-y divide-border border-y border-border\">\n {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}>\n <div className=\"space-y-2\">\n <h4 className=\"text-sm font-medium\">{t(`design_system.foundations.typography.guide.${role.id}.title`)}</h4>\n <p className=\"text-xs text-muted-foreground\">{role.metrics}</p>\n </div>\n <div className=\"min-w-0 space-y-3 md:col-span-2\">\n <p className={`${role.className} break-words`}>{t(`design_system.foundations.typography.guide.${role.id}.example`)}</p>\n <p className=\"max-w-prose text-sm leading-relaxed text-muted-foreground\">{t(`design_system.foundations.typography.guide.${role.id}.usage`)}</p>\n </div>\n </article>)}\n </div>\n <p className=\"max-w-3xl text-sm leading-relaxed text-muted-foreground\">{t('design_system.foundations.typography.guide.fonts')}</p>\n </div>\n}\n\nfunction TypographyReferencePreview() {\n const t = useT()\n return <section className=\"rounded-lg border border-border\">\n <h3 className=\"p-4 text-sm font-medium\">{t('design_system.foundations.typography.guide.reference')}</h3>\n <div className=\"space-y-8 border-t border-border p-4 sm:p-6\">\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-medium\">{t('design_system.foundations.typography.guide.classes')}</h4>\n <dl className=\"divide-y divide-border\">\n {TYPOGRAPHY_ROLES.map(role => <div key={role.id} className=\"flex flex-wrap justify-between gap-2 py-3 text-sm\">\n <dt>{t(`design_system.foundations.typography.guide.${role.id}.title`)}</dt>\n <dd><code className=\"break-words text-xs text-muted-foreground\">{role.className}</code></dd>\n </div>)}\n </dl>\n </div>\n <SourceTypography />\n </div>\n </section>\n}\n\nconst typographyEntry: GalleryEntry = {\n id: 'typography',\n title: 'Typography',\n importPath: TOKENS_IMPORT,\n figmaNodeId: '553:14957',\n keywords: ['font', 'type', 'heading', 'body', 'line-height', 'Geist', 'Inter'],\n usage: {\n do: [\n '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.',\n 'Use text-2xl for backend page titles and text-sm for body text. Scale measurements assume a 16px root font size.',\n 'The Figma reference uses Inter / Inter Display; these specimens show the shipped font tokens rather than claiming font parity.',\n ],\n dont: ['Do not copy marketing display sizes into dense backend pages.', 'Do not set inline font families or arbitrary text sizes.'],\n },\n variants: [\n {\n id: 'roles',\n title: 'Text hierarchy',\n render: () => <TypographyRolesPreview />,\n code: `import { Label } from '@open-mercato/ui/primitives/label'\nimport { Input } from '@open-mercato/ui/primitives/input'\n\n<h1 className=\"text-2xl font-bold tracking-tight\">{t('design_system.foundations.typography.guide.page.example')}</h1>\n<h2 className=\"text-xl font-semibold\">{t('design_system.foundations.typography.guide.section.example')}</h2>\n<p className=\"text-sm\">{t('design_system.foundations.typography.guide.body.example')}</p>\n<Label htmlFor=\"name\">{t('design_system.foundations.typography.guide.label.example')}</Label>\n<Input id=\"name\" aria-describedby=\"name-hint\" />\n<p id=\"name-hint\" className=\"text-xs text-muted-foreground\">{t('design_system.foundations.typography.guide.helper.example')}</p>`,\n },\n {\n id: 'source-typography',\n title: 'Complete typography scale',\n render: () => <TypographyReferencePreview />,\n code: `import { SourceTypography } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'\n\n<SourceTypography />`,\n },\n ],\n}\n\nconst SPACING_SCALE = [\n { token: '1', className: 'w-1', pixels: 4 },\n { token: '2', className: 'w-2', pixels: 8 },\n { token: '3', className: 'w-3', pixels: 12 },\n { token: '4', className: 'w-4', pixels: 16 },\n { token: '6', className: 'w-6', pixels: 24 },\n { token: '8', className: 'w-8', pixels: 32 },\n { token: '12', className: 'w-12', pixels: 48 },\n]\n\nfunction SpacingScalePreview() {\n const t = useT()\n return (\n <div className=\"w-full space-y-6\">\n <p className=\"text-sm text-muted-foreground\">{t('design_system.foundations.spacing.scaleHint')}</p>\n {SPACING_SCALE.map((item) => (\n <div key={item.token} className=\"flex items-center gap-4 py-2\">\n <code className=\"w-12 shrink-0 text-sm text-muted-foreground\">p-{item.token}</code>\n <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>\n <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>\n </div>\n ))}\n </div>\n )\n}\n\nfunction SpacingRhythmPreview() {\n return (\n <div className=\"grid w-full gap-6 md:grid-cols-2\">\n {[\n { padding: 'p-4', gap: 'gap-2' },\n { padding: 'p-6', gap: 'gap-4' },\n ].map((item) => (\n <div key={item.padding} className={`space-y-4 rounded-lg border border-border bg-muted/30 ${item.padding}`}>\n <code className=\"text-xs text-muted-foreground\">{item.padding} / {item.gap}</code>\n <div aria-hidden className={`flex ${item.gap}`}>\n <span className=\"h-12 flex-1 rounded-md border border-border bg-background\" />\n <span className=\"h-12 flex-1 rounded-md border border-border bg-background\" />\n <span className=\"h-12 flex-1 rounded-md border border-border bg-background\" />\n </div>\n </div>\n ))}\n </div>\n )\n}\n\nconst spacingEntry: GalleryEntry = {\n id: 'spacing',\n title: 'Spacing',\n importPath: TOKENS_IMPORT,\n figmaNodeId: '553:14958',\n keywords: ['padding', 'gap', 'margin', 'grid', 'rhythm'],\n usage: {\n do: ['Use the 4px spacing grid. Start with gap-2 between controls, p-4 within containers and p-6 for larger panels.'],\n dont: ['Do not invent arbitrary spacing values or compensate for layout problems with negative margins.'],\n },\n variants: [\n {\n id: 'source-grids',\n title: 'Layout grids',\n render: () => <SourceGrids />,\n code: `import { SourceGrids } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'\n\n<SourceGrids />`,\n },\n {\n id: 'scale',\n title: 'Spacing scale',\n render: () => <SpacingScalePreview />,\n code: `<div className=\"flex gap-2 p-4\">{children}</div>\n<section className=\"space-y-6 p-6\">{children}</section>`,\n },\n {\n id: 'rhythm',\n title: 'Container rhythm',\n render: () => <SpacingRhythmPreview />,\n code: `<div className=\"p-4\">\n <div className=\"flex gap-2\">{children}</div>\n</div>\n<div className=\"p-6\">\n <div className=\"flex gap-4\">{children}</div>\n</div>`,\n },\n ],\n}\n\nconst SHADOW_SCALE = ['shadow-none', 'shadow-xs', 'shadow-sm', 'shadow-md', 'shadow-lg', 'shadow-xl', 'shadow-2xl']\n\nfunction ShadowScalePreview() {\n return (\n <div className=\"grid w-full grid-cols-2 gap-6 p-4 md:grid-cols-3 lg:grid-cols-4\">\n {SHADOW_SCALE.map((className) => (\n <div key={className} className={`flex h-24 items-center justify-center rounded-lg border border-border bg-card p-4 ${className}`}>\n <code className=\"text-xs text-card-foreground\">{className}</code>\n </div>\n ))}\n </div>\n )\n}\n\nfunction FocusPreview() {\n const t = useT()\n return (\n <div className=\"space-y-4 p-2\">\n <p className=\"text-sm text-muted-foreground\">{t('design_system.gallery.samples.focusHint')}</p>\n <div className=\"flex flex-wrap items-center gap-6\">\n <Button type=\"button\" variant=\"outline\">{t('design_system.gallery.samples.focusAction')}</Button>\n <span aria-hidden className=\"rounded-md border border-border bg-background px-4 py-2 text-sm shadow-focus\">shadow-focus</span>\n </div>\n </div>\n )\n}\n\nconst shadowsEntry: GalleryEntry = {\n id: 'shadows',\n title: 'Shadows & focus',\n importPath: TOKENS_IMPORT,\n figmaNodeId: '553:14959',\n keywords: ['elevation', 'depth', 'focus', 'keyboard'],\n usage: {\n 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.'],\n dont: ['Do not draw custom colored glows or arbitrary box shadows.', 'Do not remove focus feedback without an equivalent visible indicator.'],\n },\n variants: [\n {\n id: 'source-shadows',\n title: 'Complete shadow collection',\n render: () => <SourceShadows />,\n code: `import { SourceShadows } from '@open-mercato/core/modules/design_system/gallery/demos/foundation-references'\n\n<SourceShadows />`,\n },\n {\n id: 'elevation',\n title: 'Elevation scale',\n render: () => <ShadowScalePreview />,\n code: `<div className=\"rounded-lg border border-border bg-card p-4 shadow-sm\">{children}</div>\n<div className=\"rounded-lg border border-border bg-popover p-4 shadow-lg\">{children}</div>`,\n },\n {\n id: 'focus',\n title: 'Keyboard focus',\n render: () => <FocusPreview />,\n code: `import { Button } from '@open-mercato/ui/primitives/button'\n\n<Button type=\"button\" variant=\"outline\">{t('design_system.gallery.samples.focusAction')}</Button>`,\n },\n ],\n}\n\nfunction MotionPreview() {\n const t = useT()\n const [active, setActive] = React.useState(false)\n return (\n <div className=\"w-full space-y-4\">\n <Button type=\"button\" variant=\"outline\" aria-pressed={active} onClick={() => setActive((value) => !value)}>\n {t('design_system.gallery.samples.toggleMotion')}\n </Button>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-3 rounded-lg border border-border p-4\">\n <code className=\"text-xs text-muted-foreground\">transition-colors / 150 ms</code>\n <div aria-hidden className={`h-12 rounded-md transition-colors duration-150 motion-reduce:transition-none ${active ? 'bg-primary' : 'bg-muted'}`} />\n </div>\n <div className=\"space-y-3 rounded-lg border border-border p-4\">\n <code className=\"text-xs text-muted-foreground\">transition-opacity / 200 ms</code>\n <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'}`} />\n </div>\n <div className=\"space-y-3 rounded-lg border border-border p-4\">\n <code className=\"text-xs text-muted-foreground\">transition-transform / 300 ms</code>\n <div aria-hidden className=\"flex h-12 items-center\">\n <ArrowRight className={`size-6 text-foreground transition-transform duration-300 ease-out motion-reduce:transition-none ${active ? 'translate-x-8' : 'translate-x-0'}`} />\n </div>\n </div>\n <div className=\"space-y-3 rounded-lg border border-border p-4\">\n <code className=\"text-xs text-muted-foreground\">transition-opacity / 400 ms</code>\n <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'}`} />\n </div>\n <div className=\"space-y-3 rounded-lg border border-border p-4\">\n <code className=\"text-xs text-muted-foreground\">transition-opacity / 500 ms</code>\n <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'}`} />\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">{t('design_system.gallery.samples.reducedMotion')}</p>\n </div>\n )\n}\n\nconst motionEntry: GalleryEntry = {\n id: 'motion',\n title: 'Motion',\n importPath: TOKENS_IMPORT,\n figmaNodeId: '553:14960',\n keywords: ['animation', 'transition', 'duration', 'reduced-motion'],\n usage: {\n 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.'],\n dont: ['Do not use animation as the only feedback for a state change.', 'Do not use transition-all when only one property changes.'],\n },\n variants: [\n {\n id: 'durations',\n title: 'Interactive duration scale',\n render: () => <MotionPreview />,\n code: `import * as React from 'react'\nimport { ArrowRight } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\nconst [active, setActive] = React.useState(false)\n\n<Button type=\"button\" variant=\"outline\" aria-pressed={active} onClick={() => setActive((value) => !value)}>\n {t('design_system.gallery.samples.toggleMotion')}\n</Button>\n<div aria-hidden className={['h-12 rounded-md transition-colors duration-150 motion-reduce:transition-none', active ? 'bg-primary' : 'bg-muted'].join(' ')} />\n<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(' ')} />\n<ArrowRight aria-hidden className={['size-6 transition-transform duration-300 ease-out motion-reduce:transition-none', active ? 'translate-x-8' : 'translate-x-0'].join(' ')} />\n<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(' ')} />\n<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(' ')} />`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n brandColorsEntry,\n colorRolesEntry,\n colorTokensEntry,\n stateTokensEntry,\n chartPaletteEntry,\n radiusEntry,\n typographyEntry,\n spacingEntry,\n shadowsEntry,\n motionEntry,\n]\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,96 +1,9 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import * as React from "react";
3
- import { useT } from "@open-mercato/shared/lib/i18n/context";
2
+ import { SourceIconCatalogue, sourceIconCatalogueCode } from "../demos/source-icons.js";
3
+ import { SourceArtworkCatalogue, sourceArtworkCode } from "../demos/source-artwork.js";
4
+ import { IconGrid } from "../demos/registered-icons.js";
4
5
  import { LUCIDE_ICON_REGISTRY } from "@open-mercato/ui/backend/icons/lucideRegistry";
5
- import { SearchInput } from "@open-mercato/ui/primitives/search-input";
6
- import {
7
- Popover,
8
- PopoverClose,
9
- PopoverContent,
10
- PopoverTrigger
11
- } from "@open-mercato/ui/primitives/popover";
12
- import { flash } from "@open-mercato/ui/backend/FlashMessages";
13
6
  const FIGMA_ICONS_NODE = "2716:25504";
14
- function pascalCase(registryName) {
15
- return registryName.split(/[-_]/).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
16
- }
17
- function IconTile({ name }) {
18
- const t = useT();
19
- const Icon = LUCIDE_ICON_REGISTRY[name];
20
- const jsxSnippet = `<${pascalCase(name)} aria-hidden className="size-4" />`;
21
- const copy = React.useCallback(async (payload) => {
22
- try {
23
- await navigator.clipboard.writeText(payload);
24
- flash(t("design_system.gallery.iconCopied", "Copied: {snippet}", { snippet: payload }), "success");
25
- } catch {
26
- flash(t("design_system.gallery.copyFailed", "Could not copy the snippet"), "error");
27
- }
28
- }, [t]);
29
- return /* @__PURE__ */ jsxs(Popover, { children: [
30
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
31
- "button",
32
- {
33
- type: "button",
34
- className: "flex flex-col items-center gap-1.5 rounded-md border border-transparent p-2 transition-colors hover:border-border hover:bg-muted/40 focus-visible:outline-none focus-visible:shadow-focus",
35
- children: [
36
- /* @__PURE__ */ jsx(Icon, { "aria-hidden": true, className: "size-5 text-foreground", strokeWidth: 1.75 }),
37
- /* @__PURE__ */ jsx("code", { className: "max-w-full truncate text-[10px] leading-tight text-muted-foreground", children: name })
38
- ]
39
- }
40
- ) }),
41
- /* @__PURE__ */ jsx(PopoverContent, { align: "center", className: "w-auto max-w-xs p-2", children: /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
42
- /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsxs(
43
- "button",
44
- {
45
- type: "button",
46
- onClick: () => copy(name),
47
- className: "flex w-full flex-col items-start gap-0.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus",
48
- children: [
49
- /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: t("design_system.gallery.iconCopyMeta", "Copy name for page.meta icon") }),
50
- /* @__PURE__ */ jsx("code", { className: "text-[11px] text-muted-foreground", children: name })
51
- ]
52
- }
53
- ) }),
54
- /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsxs(
55
- "button",
56
- {
57
- type: "button",
58
- onClick: () => copy(jsxSnippet),
59
- className: "flex w-full flex-col items-start gap-0.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus",
60
- children: [
61
- /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: t("design_system.gallery.iconCopyJsx", "Copy JSX (lucide-react)") }),
62
- /* @__PURE__ */ jsx("code", { className: "max-w-full truncate text-[11px] text-muted-foreground", children: jsxSnippet })
63
- ]
64
- }
65
- ) })
66
- ] }) })
67
- ] });
68
- }
69
- function IconGrid() {
70
- const t = useT();
71
- const [query, setQuery] = React.useState("");
72
- const names = React.useMemo(() => Object.keys(LUCIDE_ICON_REGISTRY).sort((a, b) => a.localeCompare(b)), []);
73
- const needle = query.trim().toLowerCase();
74
- const visible = needle ? names.filter((name) => name.toLowerCase().includes(needle)) : names;
75
- return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
76
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
77
- /* @__PURE__ */ jsx("div", { className: "max-w-sm flex-1", children: /* @__PURE__ */ jsx(
78
- SearchInput,
79
- {
80
- value: query,
81
- onChange: setQuery,
82
- placeholder: t("design_system.gallery.iconSearchPlaceholder", "Filter icons\u2026"),
83
- "aria-label": t("design_system.gallery.iconSearchPlaceholder", "Filter icons\u2026")
84
- }
85
- ) }),
86
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: needle ? t("design_system.gallery.iconCountFiltered", "{visible} of {total} icons", {
87
- visible: visible.length,
88
- total: names.length
89
- }) : t("design_system.gallery.iconCountAll", "{total} icons", { total: names.length }) })
90
- ] }),
91
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 gap-1 sm:grid-cols-6 lg:grid-cols-8", children: visible.map((name) => /* @__PURE__ */ jsx(IconTile, { name }, name)) })
92
- ] });
93
- }
94
7
  const iconRegistryEntry = {
95
8
  id: "icon-registry",
96
9
  title: "Icon registry",
@@ -133,7 +46,32 @@ const iconRegistryEntry = {
133
46
  }
134
47
  ]
135
48
  };
136
- const entries = [iconRegistryEntry];
49
+ const sourceIconsEntry = {
50
+ id: "source-icons",
51
+ title: "Source icon library",
52
+ importPath: "@open-mercato/ui/assets/source-icons",
53
+ figmaNodeId: "199678:19375",
54
+ descriptionKey: "design_system.entries.sourceIcons.description",
55
+ variants: [
56
+ { id: "catalogue", title: "All 1667 source icons / search and copy", render: () => /* @__PURE__ */ jsx(SourceIconCatalogue, {}), code: sourceIconCatalogueCode }
57
+ ]
58
+ };
59
+ const sourceArtworkEntry = {
60
+ id: "source-artwork",
61
+ title: "Source artwork library",
62
+ importPath: "@open-mercato/ui/assets/source-artwork",
63
+ figmaNodeId: "2771:1469",
64
+ descriptionKey: "design_system.gallery.sourceArtwork.description",
65
+ variants: [
66
+ { id: "brands", title: "Brands / 439 original logos and styles", render: () => /* @__PURE__ */ jsx(SourceArtworkCatalogue, { group: "brand" }), code: sourceArtworkCode("brand") },
67
+ { id: "flags", title: "Country flags / 263 original assets", render: () => /* @__PURE__ */ jsx(SourceArtworkCatalogue, { group: "country-flags" }), code: sourceArtworkCode("country-flags") },
68
+ { id: "emoji", title: "Emoji / 607 original assets", render: () => /* @__PURE__ */ jsx(SourceArtworkCatalogue, { group: "emojies" }), code: sourceArtworkCode("emojies") },
69
+ { id: "store-badges", title: "Store badges / 16 original variants", render: () => /* @__PURE__ */ jsx(SourceArtworkCatalogue, { group: "appstore-badges" }), code: sourceArtworkCode("appstore-badges") },
70
+ { id: "thumbnails", title: "Thumbnails / 78 component and landing illustrations", render: () => /* @__PURE__ */ jsx(SourceArtworkCatalogue, { group: "thumbnails" }), code: sourceArtworkCode("thumbnails") },
71
+ { id: "cursors", title: "Cursors / 10 original assets", render: () => /* @__PURE__ */ jsx(SourceArtworkCatalogue, { group: "others" }), code: sourceArtworkCode("others") }
72
+ ]
73
+ };
74
+ const entries = [iconRegistryEntry, sourceIconsEntry, sourceArtworkEntry];
137
75
  export {
138
76
  entries
139
77
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/design_system/gallery/entries/icons.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { LUCIDE_ICON_REGISTRY } from '@open-mercato/ui/backend/icons/lucideRegistry'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport {\n Popover,\n PopoverClose,\n PopoverContent,\n PopoverTrigger,\n} from '@open-mercato/ui/primitives/popover'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport type { GalleryEntry } from '../types'\n\n// Mirrors the DS Figma icon sheet (node 2716:25504, \"Lucide icons\"): a plain\n// grid of outline icons with the name beneath each. The gallery shows the\n// icons REGISTERED in the string-icon registry \u2014 the set page.meta.ts `icon`\n// accepts; components import from lucide-react directly.\n\nconst FIGMA_ICONS_NODE = '2716:25504'\n\nfunction pascalCase(registryName: string): string {\n return registryName\n .split(/[-_]/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n}\n\n// Clicking a tile opens an explicit two-option menu instead of a hidden\n// copy-mode: each option shows exactly what will land in the clipboard.\nfunction IconTile({ name }: { name: string }) {\n const t = useT()\n const Icon = LUCIDE_ICON_REGISTRY[name]\n const jsxSnippet = `<${pascalCase(name)} aria-hidden className=\"size-4\" />`\n\n const copy = React.useCallback(async (payload: string) => {\n try {\n await navigator.clipboard.writeText(payload)\n flash(t('design_system.gallery.iconCopied', 'Copied: {snippet}', { snippet: payload }), 'success')\n } catch {\n flash(t('design_system.gallery.copyFailed', 'Could not copy the snippet'), 'error')\n }\n }, [t])\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex flex-col items-center gap-1.5 rounded-md border border-transparent p-2 transition-colors hover:border-border hover:bg-muted/40 focus-visible:outline-none focus-visible:shadow-focus\"\n >\n <Icon aria-hidden className=\"size-5 text-foreground\" strokeWidth={1.75} />\n <code className=\"max-w-full truncate text-[10px] leading-tight text-muted-foreground\">{name}</code>\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"center\" className=\"w-auto max-w-xs p-2\">\n <div className=\"space-y-1\">\n <PopoverClose asChild>\n <button\n type=\"button\"\n onClick={() => copy(name)}\n className=\"flex w-full flex-col items-start gap-0.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus\"\n >\n <span className=\"text-xs font-medium text-foreground\">\n {t('design_system.gallery.iconCopyMeta', 'Copy name for page.meta icon')}\n </span>\n <code className=\"text-[11px] text-muted-foreground\">{name}</code>\n </button>\n </PopoverClose>\n <PopoverClose asChild>\n <button\n type=\"button\"\n onClick={() => copy(jsxSnippet)}\n className=\"flex w-full flex-col items-start gap-0.5 rounded-md px-2 py-1.5 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus\"\n >\n <span className=\"text-xs font-medium text-foreground\">\n {t('design_system.gallery.iconCopyJsx', 'Copy JSX (lucide-react)')}\n </span>\n <code className=\"max-w-full truncate text-[11px] text-muted-foreground\">{jsxSnippet}</code>\n </button>\n </PopoverClose>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nfunction IconGrid() {\n const t = useT()\n const [query, setQuery] = React.useState('')\n const names = React.useMemo(() => Object.keys(LUCIDE_ICON_REGISTRY).sort((a, b) => a.localeCompare(b)), [])\n const needle = query.trim().toLowerCase()\n const visible = needle ? names.filter((name) => name.toLowerCase().includes(needle)) : names\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"max-w-sm flex-1\">\n <SearchInput\n value={query}\n onChange={setQuery}\n placeholder={t('design_system.gallery.iconSearchPlaceholder', 'Filter icons\u2026')}\n aria-label={t('design_system.gallery.iconSearchPlaceholder', 'Filter icons\u2026')}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {needle\n ? t('design_system.gallery.iconCountFiltered', '{visible} of {total} icons', {\n visible: visible.length,\n total: names.length,\n })\n : t('design_system.gallery.iconCountAll', '{total} icons', { total: names.length })}\n </p>\n </div>\n <div className=\"grid grid-cols-4 gap-1 sm:grid-cols-6 lg:grid-cols-8\">\n {visible.map((name) => (\n <IconTile key={name} name={name} />\n ))}\n </div>\n </div>\n )\n}\n\nconst iconRegistryEntry: GalleryEntry = {\n id: 'icon-registry',\n title: 'Icon registry',\n importPath: 'lucide-react',\n usage: {\n do: [\n 'size-4 inside buttons, menus and inline text; size-5 in section navs and toolbars.',\n 'Always aria-hidden next to a visible label, or aria-label on icon-only controls.',\n 'Color with semantic tokens only (text-muted-foreground, text-status-*-icon).',\n 'Icon-only actions use IconButton \u2014 it ships the focus ring, sizing and the aria-label contract.',\n ],\n dont: [\n 'No emoji or font glyphs as icons \u2014 Lucide only.',\n 'Never convey status by icon color alone; pair with text or a label.',\n 'No hand-drawn SVGs when a Lucide icon exists.',\n ],\n },\n figmaNodeId: FIGMA_ICONS_NODE,\n variants: [\n {\n id: 'registry',\n title: 'registered icons',\n render: () => <IconGrid />,\n code: `export const metadata = { icon: 'shapes' }`,\n },\n {\n id: 'component-usage',\n title: 'usage in components',\n render: () => {\n const Sample = LUCIDE_ICON_REGISTRY.search ?? Object.values(LUCIDE_ICON_REGISTRY)[0]\n return (\n <div className=\"flex items-center gap-4\">\n <Sample aria-hidden className=\"size-4 text-muted-foreground\" />\n <Sample aria-hidden className=\"size-5 text-foreground\" />\n <Sample aria-hidden className=\"size-6 text-status-info-icon\" />\n </div>\n )\n },\n code: `import { Search } from 'lucide-react'\n\n<Search aria-hidden className=\"size-4 text-muted-foreground\" />`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [iconRegistryEntry]\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as React from 'react'\nimport { SourceIconCatalogue, sourceIconCatalogueCode } from '../demos/source-icons'\nimport { SourceArtworkCatalogue, sourceArtworkCode } from '../demos/source-artwork'\nimport { IconGrid } from '../demos/registered-icons'\nimport { LUCIDE_ICON_REGISTRY } from '@open-mercato/ui/backend/icons/lucideRegistry'\nimport type { GalleryEntry } from '../types'\n\nconst FIGMA_ICONS_NODE = '2716:25504'\n\nconst iconRegistryEntry: GalleryEntry = {\n id: 'icon-registry',\n title: 'Icon registry',\n importPath: 'lucide-react',\n usage: {\n do: [\n 'size-4 inside buttons, menus and inline text; size-5 in section navs and toolbars.',\n 'Always aria-hidden next to a visible label, or aria-label on icon-only controls.',\n 'Color with semantic tokens only (text-muted-foreground, text-status-*-icon).',\n 'Icon-only actions use IconButton \u2014 it ships the focus ring, sizing and the aria-label contract.',\n ],\n dont: [\n 'No emoji or font glyphs as icons \u2014 Lucide only.',\n 'Never convey status by icon color alone; pair with text or a label.',\n 'No hand-drawn SVGs when a Lucide icon exists.',\n ],\n },\n figmaNodeId: FIGMA_ICONS_NODE,\n variants: [\n {\n id: 'registry',\n title: 'registered icons',\n render: () => <IconGrid />,\n code: `export const metadata = { icon: 'shapes' }`,\n },\n {\n id: 'component-usage',\n title: 'usage in components',\n render: () => {\n const Sample = LUCIDE_ICON_REGISTRY.search ?? Object.values(LUCIDE_ICON_REGISTRY)[0]\n return (\n <div className=\"flex items-center gap-4\">\n <Sample aria-hidden className=\"size-4 text-muted-foreground\" />\n <Sample aria-hidden className=\"size-5 text-foreground\" />\n <Sample aria-hidden className=\"size-6 text-status-info-icon\" />\n </div>\n )\n },\n code: `import { Search } from 'lucide-react'\n\n<Search aria-hidden className=\"size-4 text-muted-foreground\" />`,\n },\n ],\n}\n\nconst sourceIconsEntry: GalleryEntry = {\n id: 'source-icons',\n title: 'Source icon library',\n importPath: '@open-mercato/ui/assets/source-icons',\n figmaNodeId: '199678:19375',\n descriptionKey: 'design_system.entries.sourceIcons.description',\n variants: [\n { id: 'catalogue', title: 'All 1667 source icons / search and copy', render: () => <SourceIconCatalogue />, code: sourceIconCatalogueCode },\n ],\n}\n\nconst sourceArtworkEntry: GalleryEntry = {\n id: 'source-artwork',\n title: 'Source artwork library',\n importPath: '@open-mercato/ui/assets/source-artwork',\n figmaNodeId: '2771:1469',\n descriptionKey: 'design_system.gallery.sourceArtwork.description',\n variants: [\n { id: 'brands', title: 'Brands / 439 original logos and styles', render: () => <SourceArtworkCatalogue group=\"brand\" />, code: sourceArtworkCode('brand') },\n { id: 'flags', title: 'Country flags / 263 original assets', render: () => <SourceArtworkCatalogue group=\"country-flags\" />, code: sourceArtworkCode('country-flags') },\n { id: 'emoji', title: 'Emoji / 607 original assets', render: () => <SourceArtworkCatalogue group=\"emojies\" />, code: sourceArtworkCode('emojies') },\n { id: 'store-badges', title: 'Store badges / 16 original variants', render: () => <SourceArtworkCatalogue group=\"appstore-badges\" />, code: sourceArtworkCode('appstore-badges') },\n { id: 'thumbnails', title: 'Thumbnails / 78 component and landing illustrations', render: () => <SourceArtworkCatalogue group=\"thumbnails\" />, code: sourceArtworkCode('thumbnails') },\n { id: 'cursors', title: 'Cursors / 10 original assets', render: () => <SourceArtworkCatalogue group=\"others\" />, code: sourceArtworkCode('others') },\n ],\n}\n\nexport const entries: GalleryEntry[] = [iconRegistryEntry, sourceIconsEntry, sourceArtworkEntry]\n"],
5
+ "mappings": "AA+BoB,cASV,YATU;AA9BpB,SAAS,qBAAqB,+BAA+B;AAC7D,SAAS,wBAAwB,yBAAyB;AAC1D,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AAGrC,MAAM,mBAAmB;AAEzB,MAAM,oBAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,IACL,IAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,aAAa;AAAA,EACb,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MAAM,oBAAC,YAAS;AAAA,MACxB,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MAAM;AACZ,cAAM,SAAS,qBAAqB,UAAU,OAAO,OAAO,oBAAoB,EAAE,CAAC;AACnF,eACE,qBAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,UAAO,eAAW,MAAC,WAAU,gCAA+B;AAAA,UAC7D,oBAAC,UAAO,eAAW,MAAC,WAAU,0BAAyB;AAAA,UACvD,oBAAC,UAAO,eAAW,MAAC,WAAU,gCAA+B;AAAA,WAC/D;AAAA,MAEJ;AAAA,MACA,MAAM;AAAA;AAAA;AAAA,IAGR;AAAA,EACF;AACF;AAEA,MAAM,mBAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,UAAU;AAAA,IACR,EAAE,IAAI,aAAa,OAAO,2CAA2C,QAAQ,MAAM,oBAAC,uBAAoB,GAAI,MAAM,wBAAwB;AAAA,EAC5I;AACF;AAEA,MAAM,qBAAmC;AAAA,EACvC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,UAAU;AAAA,IACR,EAAE,IAAI,UAAU,OAAO,0CAA0C,QAAQ,MAAM,oBAAC,0BAAuB,OAAM,SAAQ,GAAI,MAAM,kBAAkB,OAAO,EAAE;AAAA,IAC1J,EAAE,IAAI,SAAS,OAAO,uCAAuC,QAAQ,MAAM,oBAAC,0BAAuB,OAAM,iBAAgB,GAAI,MAAM,kBAAkB,eAAe,EAAE;AAAA,IACtK,EAAE,IAAI,SAAS,OAAO,+BAA+B,QAAQ,MAAM,oBAAC,0BAAuB,OAAM,WAAU,GAAI,MAAM,kBAAkB,SAAS,EAAE;AAAA,IAClJ,EAAE,IAAI,gBAAgB,OAAO,uCAAuC,QAAQ,MAAM,oBAAC,0BAAuB,OAAM,mBAAkB,GAAI,MAAM,kBAAkB,iBAAiB,EAAE;AAAA,IACjL,EAAE,IAAI,cAAc,OAAO,uDAAuD,QAAQ,MAAM,oBAAC,0BAAuB,OAAM,cAAa,GAAI,MAAM,kBAAkB,YAAY,EAAE;AAAA,IACrL,EAAE,IAAI,WAAW,OAAO,gCAAgC,QAAQ,MAAM,oBAAC,0BAAuB,OAAM,UAAS,GAAI,MAAM,kBAAkB,QAAQ,EAAE;AAAA,EACrJ;AACF;AAEO,MAAM,UAA0B,CAAC,mBAAmB,kBAAkB,kBAAkB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,154 @@
1
+ const SPECIALISED_INPUTS_NOTE = `// Email, phone, card, website, amount, search and password have dedicated primitives:
2
+ // EmailInput, PhoneNumberField, CardInput, WebsiteInput, AmountInput, SearchInput, PasswordInput.`;
3
+ function inputFieldCode({ inputProps = "", fieldProps = "" } = {}) {
4
+ return `import { User } from 'lucide-react'
5
+ import { Input } from '@open-mercato/ui/primitives/input'
6
+ import { FormField } from '@open-mercato/ui/primitives/form-field'
7
+
8
+ <FormField label="Full name" description="Shown on invoices"${fieldProps}>
9
+ <Input${inputProps} leftIcon={<User />} placeholder="Alex Morgan" />
10
+ </FormField>
11
+
12
+ ${SPECIALISED_INPUTS_NOTE}`;
13
+ }
14
+ const textareaFieldCode = `import { Textarea } from '@open-mercato/ui/primitives/textarea'
15
+ import { FormField } from '@open-mercato/ui/primitives/form-field'
16
+
17
+ <FormField label="Note" description="Visible to your team">
18
+ <Textarea appearance="source" showCount maxLength={200} placeholder="Add a note" />
19
+ </FormField>
20
+
21
+ // States: pass error="..." or disabled to FormField, and disabled to Textarea.`;
22
+ function phoneNumberFieldCode(extraProps = "") {
23
+ return `import * as React from 'react'
24
+ import { PhoneNumberField, type PhoneCountry } from '@open-mercato/ui/backend/inputs/PhoneNumberField'
25
+
26
+ const countries: PhoneCountry[] = [
27
+ { iso2: 'US', dialCode: '+1', label: 'United States', flag: '\u{1F1FA}\u{1F1F8}' },
28
+ { iso2: 'PL', dialCode: '+48', label: 'Poland', flag: '\u{1F1F5}\u{1F1F1}' },
29
+ ]
30
+
31
+ function PhoneExample() {
32
+ const [phone, setPhone] = React.useState<string | undefined>()
33
+ return (
34
+ <PhoneNumberField size={36} ariaLabel="Phone number" countryLabel="Country"
35
+ value={phone} onValueChange={setPhone} countries={countries}${extraProps} />
36
+ )
37
+ }`;
38
+ }
39
+ function selectFieldCode({ size = 36, leading = false, selectProps = "", fieldProps = "", initialValue = "warsaw" } = {}) {
40
+ const leadingImport = leading ? `import { Building2 } from 'lucide-react'
41
+ ` : "";
42
+ const triggerImports = leading ? "Select, SelectContent, SelectItem, SelectTrigger, SelectTriggerLeading, SelectValue" : "Select, SelectContent, SelectItem, SelectTrigger, SelectValue";
43
+ const triggerLeading = leading ? `
44
+ <SelectTriggerLeading><Building2 aria-hidden="true" className="size-5" /></SelectTriggerLeading>` : "";
45
+ const itemLeading = leading ? ` leading={<Building2 aria-hidden="true" className="size-5" />}` : "";
46
+ return `import * as React from 'react'
47
+ ${leadingImport}import { FormField } from '@open-mercato/ui/primitives/form-field'
48
+ import { ${triggerImports} } from '@open-mercato/ui/primitives/select'
49
+
50
+ function SelectExample() {
51
+ const [value, setValue] = React.useState('${initialValue}')
52
+ return (
53
+ <Select value={value} onValueChange={setValue}${selectProps}>
54
+ <FormField label="Office" description="You can change it later"${fieldProps}>
55
+ <SelectTrigger size={${size}}>${triggerLeading}
56
+ <SelectValue placeholder="Choose an office" />
57
+ </SelectTrigger>
58
+ </FormField>
59
+ <SelectContent>
60
+ <SelectItem value="warsaw"${itemLeading}>Warsaw</SelectItem>
61
+ <SelectItem value="berlin"${itemLeading}>Berlin</SelectItem>
62
+ <SelectItem value="archive" disabled${itemLeading}>Archive</SelectItem>
63
+ </SelectContent>
64
+ </Select>
65
+ )
66
+ }`;
67
+ }
68
+ function dropdownCode({ size = 36, initialQuery = "" } = {}) {
69
+ const description = size === 56 ? ` description="12 members"` : "";
70
+ return `import * as React from 'react'
71
+ import { Building2, Plus } from 'lucide-react'
72
+ import { Button } from '@open-mercato/ui/primitives/button'
73
+ import { Dropdown, DropdownTrigger, DropdownContent, DropdownInput, DropdownList, DropdownEmpty, DropdownItem, DropdownFooter } from '@open-mercato/ui/primitives/dropdown'
74
+
75
+ const workspaces = ['Warsaw', 'Berlin', 'Lisbon']
76
+
77
+ function DropdownExample() {
78
+ const [open, setOpen] = React.useState(false)
79
+ const [value, setValue] = React.useState('Warsaw')
80
+ const [query, setQuery] = React.useState('${initialQuery}')
81
+ return (
82
+ <Dropdown open={open} onOpenChange={setOpen}>
83
+ <DropdownTrigger asChild><Button variant="outline">{value}</Button></DropdownTrigger>
84
+ <DropdownContent className="w-96 max-w-full" aria-label="Choose a workspace" commandProps={{ label: 'Workspaces' }}>
85
+ <DropdownInput value={query} onValueChange={setQuery} aria-label="Search workspaces" placeholder="Search workspaces" />
86
+ <DropdownList>
87
+ <DropdownEmpty>No workspaces match your search</DropdownEmpty>
88
+ {workspaces.map((workspace) => (
89
+ <DropdownItem key={workspace} value={workspace} size={${size}} checked={value === workspace}${description}
90
+ leading={<Building2 aria-hidden="true" className="size-5" />}
91
+ onSelect={() => { setValue(workspace); setOpen(false) }}>
92
+ {workspace}
93
+ </DropdownItem>
94
+ ))}
95
+ </DropdownList>
96
+ <DropdownFooter>
97
+ <Button variant="outline" size="sm" className="w-full"><Plus className="size-5" />Add workspace</Button>
98
+ </DropdownFooter>
99
+ </DropdownContent>
100
+ </Dropdown>
101
+ )
102
+ }`;
103
+ }
104
+ function fieldLabelCode(labelProps = "", imports = "") {
105
+ return `import { FieldLabel } from '@open-mercato/ui/primitives/label'
106
+ import { Input } from '@open-mercato/ui/primitives/input'
107
+ ${imports}
108
+ <FieldLabel htmlFor="company-name"${labelProps}>Company name</FieldLabel>
109
+ <Input id="company-name" />`;
110
+ }
111
+ const fieldLabelInformationCode = fieldLabelCode(
112
+ `
113
+ information={<SimpleTooltip content="Used on invoices and quotes"><CompactButton size={20} appearance="ghost" aria-label="More information"><KeyIconGlyph name="labelInformation" /></CompactButton></SimpleTooltip>}`,
114
+ `import { CompactButton } from '@open-mercato/ui/primitives/compact-button'
115
+ import { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'
116
+ import { KeyIconGlyph } from '@open-mercato/ui/primitives/key-icon'
117
+ `
118
+ );
119
+ const fieldLabelActionCode = fieldLabelCode(
120
+ `
121
+ action={<LinkButton type="button" size="sm" variant="gray" onClick={openHelp}>Help</LinkButton>}`,
122
+ `import { LinkButton } from '@open-mercato/ui/primitives/link-button'
123
+ `
124
+ );
125
+ const formFieldLabelCode = `import { FieldLabel } from '@open-mercato/ui/primitives/label'
126
+ import { FormField } from '@open-mercato/ui/primitives/form-field'
127
+ import { Input } from '@open-mercato/ui/primitives/input'
128
+
129
+ // FormField renders FieldLabel for you: sourceLabel switches to the source layout.
130
+ <FormField sourceLabel label="Company name" labelSublabel="(optional)" description="Used on invoices and quotes">
131
+ <Input />
132
+ </FormField>`;
133
+ function hintTextCode({ state, icon = true } = {}) {
134
+ const stateProp = state ? ` state="${state}"` : "";
135
+ const iconImport = icon ? `import { KeyIconGlyph } from '@open-mercato/ui/primitives/key-icon'
136
+ ` : "";
137
+ const leading = icon ? ` leading={<KeyIconGlyph name="information" />}` : "";
138
+ return `import { HintText } from '@open-mercato/ui/primitives/hint-text'
139
+ ${iconImport}
140
+ <HintText${stateProp}${leading}>Used on invoices and quotes</HintText>`;
141
+ }
142
+ export {
143
+ dropdownCode,
144
+ fieldLabelActionCode,
145
+ fieldLabelCode,
146
+ fieldLabelInformationCode,
147
+ formFieldLabelCode,
148
+ hintTextCode,
149
+ inputFieldCode,
150
+ phoneNumberFieldCode,
151
+ selectFieldCode,
152
+ textareaFieldCode
153
+ };
154
+ //# sourceMappingURL=inputs-snippets.js.map