@open-mercato/core 0.7.1-develop.7202.1.a52dc6707c → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/build.mjs +11 -0
  3. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +23 -0
  4. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  5. package/dist/modules/customers/backend/customers/companies/[id]/page.js +2 -1
  6. package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
  7. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -1
  8. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  9. package/dist/modules/customers/backend/customers/people/[id]/page.js +2 -2
  10. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  11. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -1
  12. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  13. package/dist/modules/customers/lib/detailHelpers.js +4 -0
  14. package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
  15. package/dist/modules/customers/lib/todoCompatibility.js +5 -0
  16. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  17. package/dist/modules/design_system/backend/design-system/page.meta.js +3 -2
  18. package/dist/modules/design_system/backend/design-system/page.meta.js.map +2 -2
  19. package/dist/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
  20. package/dist/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
  21. package/dist/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
  22. package/dist/modules/design_system/gallery/assets/avatar-photo.png +0 -0
  23. package/dist/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
  24. package/dist/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
  25. package/dist/modules/design_system/gallery/assets/crypto-ada.png +0 -0
  26. package/dist/modules/design_system/gallery/assets/crypto-avax.png +0 -0
  27. package/dist/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
  28. package/dist/modules/design_system/gallery/assets/crypto-brand.png +0 -0
  29. package/dist/modules/design_system/gallery/assets/crypto-btc.png +0 -0
  30. package/dist/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
  31. package/dist/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
  32. package/dist/modules/design_system/gallery/assets/crypto-dot.png +0 -0
  33. package/dist/modules/design_system/gallery/assets/crypto-eth.png +0 -0
  34. package/dist/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
  35. package/dist/modules/design_system/gallery/assets/crypto-history.svg +3 -0
  36. package/dist/modules/design_system/gallery/assets/crypto-link.svg +3 -0
  37. package/dist/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
  38. package/dist/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
  39. package/dist/modules/design_system/gallery/assets/crypto-more.svg +3 -0
  40. package/dist/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
  41. package/dist/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
  42. package/dist/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
  43. package/dist/modules/design_system/gallery/assets/crypto-sol.png +0 -0
  44. package/dist/modules/design_system/gallery/assets/crypto-star.svg +3 -0
  45. package/dist/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
  46. package/dist/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
  47. package/dist/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
  48. package/dist/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
  49. package/dist/modules/design_system/gallery/assets/crypto-trx.png +0 -0
  50. package/dist/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
  51. package/dist/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
  52. package/dist/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
  53. package/dist/modules/design_system/gallery/assets/crypto-wei.png +0 -0
  54. package/dist/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
  55. package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js +67 -0
  56. package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js.map +7 -0
  57. package/dist/modules/design_system/gallery/assets/github-logo.png +0 -0
  58. package/dist/modules/design_system/gallery/assets/images.d.js +1 -0
  59. package/dist/modules/design_system/gallery/assets/images.d.js.map +7 -0
  60. package/dist/modules/design_system/gallery/assets/input-european-union.svg +18 -0
  61. package/dist/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
  62. package/dist/modules/design_system/gallery/assets/marketing-artwork.js +83 -0
  63. package/dist/modules/design_system/gallery/assets/marketing-artwork.js.map +7 -0
  64. package/dist/modules/design_system/gallery/assets/menu-apex.svg +18 -0
  65. package/dist/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
  66. package/dist/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
  67. package/dist/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
  68. package/dist/modules/design_system/gallery/assets/select-google.png +0 -0
  69. package/dist/modules/design_system/gallery/assets/select-poland.png +0 -0
  70. package/dist/modules/design_system/gallery/assets/selection-artwork.js +5 -0
  71. package/dist/modules/design_system/gallery/assets/selection-artwork.js.map +7 -0
  72. package/dist/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
  73. package/dist/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
  74. package/dist/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
  75. package/dist/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
  76. package/dist/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
  77. package/dist/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
  78. package/dist/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
  79. package/dist/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
  80. package/dist/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
  81. package/dist/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
  82. package/dist/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
  83. package/dist/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
  84. package/dist/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
  85. package/dist/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
  86. package/dist/modules/design_system/gallery/assets/style-studio-product.png +0 -0
  87. package/dist/modules/design_system/gallery/assets/upload-images.js +8 -0
  88. package/dist/modules/design_system/gallery/assets/upload-images.js.map +7 -0
  89. package/dist/modules/design_system/gallery/components/BrandStylePreview.js +74 -0
  90. package/dist/modules/design_system/gallery/components/BrandStylePreview.js.map +7 -0
  91. package/dist/modules/design_system/gallery/components/CodeSnippet.js +31 -31
  92. package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +2 -2
  93. package/dist/modules/design_system/gallery/components/ColorPlayground.js +408 -0
  94. package/dist/modules/design_system/gallery/components/ColorPlayground.js.map +7 -0
  95. package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js +166 -0
  96. package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js.map +7 -0
  97. package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js +182 -0
  98. package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js.map +7 -0
  99. package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js +80 -0
  100. package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js.map +7 -0
  101. package/dist/modules/design_system/gallery/components/ComponentIndex.js +42 -0
  102. package/dist/modules/design_system/gallery/components/ComponentIndex.js.map +7 -0
  103. package/dist/modules/design_system/gallery/components/DesignSystemHome.js +69 -0
  104. package/dist/modules/design_system/gallery/components/DesignSystemHome.js.map +7 -0
  105. package/dist/modules/design_system/gallery/components/EntryCard.js +47 -41
  106. package/dist/modules/design_system/gallery/components/EntryCard.js.map +2 -2
  107. package/dist/modules/design_system/gallery/components/EntryHeader.js +68 -0
  108. package/dist/modules/design_system/gallery/components/EntryHeader.js.map +7 -0
  109. package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js +19 -0
  110. package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js.map +7 -0
  111. package/dist/modules/design_system/gallery/components/FoundationGuide.js +46 -0
  112. package/dist/modules/design_system/gallery/components/FoundationGuide.js.map +7 -0
  113. package/dist/modules/design_system/gallery/components/GalleryLink.js +21 -0
  114. package/dist/modules/design_system/gallery/components/GalleryLink.js.map +7 -0
  115. package/dist/modules/design_system/gallery/components/GalleryNavigation.js +82 -0
  116. package/dist/modules/design_system/gallery/components/GalleryNavigation.js.map +7 -0
  117. package/dist/modules/design_system/gallery/components/GalleryShell.js +147 -67
  118. package/dist/modules/design_system/gallery/components/GalleryShell.js.map +3 -3
  119. package/dist/modules/design_system/gallery/components/IconsBrowser.js +33 -0
  120. package/dist/modules/design_system/gallery/components/IconsBrowser.js.map +7 -0
  121. package/dist/modules/design_system/gallery/components/SourceLibrary.js +93 -0
  122. package/dist/modules/design_system/gallery/components/SourceLibrary.js.map +7 -0
  123. package/dist/modules/design_system/gallery/components/StyleAgents.js +139 -0
  124. package/dist/modules/design_system/gallery/components/StyleAgents.js.map +7 -0
  125. package/dist/modules/design_system/gallery/components/ThemeTokenReference.js +101 -0
  126. package/dist/modules/design_system/gallery/components/ThemeTokenReference.js.map +7 -0
  127. package/dist/modules/design_system/gallery/components/VariantPreview.js +2 -2
  128. package/dist/modules/design_system/gallery/components/VariantPreview.js.map +2 -2
  129. package/dist/modules/design_system/gallery/components/colorPreview.js +58 -0
  130. package/dist/modules/design_system/gallery/components/colorPreview.js.map +7 -0
  131. package/dist/modules/design_system/gallery/components/colorStudio.js +218 -0
  132. package/dist/modules/design_system/gallery/components/colorStudio.js.map +7 -0
  133. package/dist/modules/design_system/gallery/components/styleAgentBranding.js +46 -0
  134. package/dist/modules/design_system/gallery/components/styleAgentBranding.js.map +7 -0
  135. package/dist/modules/design_system/gallery/components/themeTokens.js +32 -0
  136. package/dist/modules/design_system/gallery/components/themeTokens.js.map +7 -0
  137. package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js +194 -0
  138. package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js.map +7 -0
  139. package/dist/modules/design_system/gallery/demos/ai-product.js +423 -0
  140. package/dist/modules/design_system/gallery/demos/ai-product.js.map +7 -0
  141. package/dist/modules/design_system/gallery/demos/buttons.js +289 -0
  142. package/dist/modules/design_system/gallery/demos/buttons.js.map +7 -0
  143. package/dist/modules/design_system/gallery/demos/cryptocurrency.js +1708 -0
  144. package/dist/modules/design_system/gallery/demos/cryptocurrency.js.map +7 -0
  145. package/dist/modules/design_system/gallery/demos/feeds-code.generated.js +92 -0
  146. package/dist/modules/design_system/gallery/demos/feeds-code.generated.js.map +7 -0
  147. package/dist/modules/design_system/gallery/demos/feeds.js +148 -0
  148. package/dist/modules/design_system/gallery/demos/feeds.js.map +7 -0
  149. package/dist/modules/design_system/gallery/demos/file-upload.js +72 -0
  150. package/dist/modules/design_system/gallery/demos/file-upload.js.map +7 -0
  151. package/dist/modules/design_system/gallery/demos/foundation-reference-data.js +4875 -0
  152. package/dist/modules/design_system/gallery/demos/foundation-reference-data.js.map +7 -0
  153. package/dist/modules/design_system/gallery/demos/foundation-references.js +188 -0
  154. package/dist/modules/design_system/gallery/demos/foundation-references.js.map +7 -0
  155. package/dist/modules/design_system/gallery/demos/key-components-code.generated.js +6 -0
  156. package/dist/modules/design_system/gallery/demos/key-components-code.generated.js.map +7 -0
  157. package/dist/modules/design_system/gallery/demos/key-components.js +127 -0
  158. package/dist/modules/design_system/gallery/demos/key-components.js.map +7 -0
  159. package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js +98 -0
  160. package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js.map +7 -0
  161. package/dist/modules/design_system/gallery/demos/marketing-controls.js +134 -0
  162. package/dist/modules/design_system/gallery/demos/marketing-controls.js.map +7 -0
  163. package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js +195 -0
  164. package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js.map +7 -0
  165. package/dist/modules/design_system/gallery/demos/marketing-widgets.js +586 -0
  166. package/dist/modules/design_system/gallery/demos/marketing-widgets.js.map +7 -0
  167. package/dist/modules/design_system/gallery/demos/menu-fixtures.js +40 -0
  168. package/dist/modules/design_system/gallery/demos/menu-fixtures.js.map +7 -0
  169. package/dist/modules/design_system/gallery/demos/menu-sources.js +295 -0
  170. package/dist/modules/design_system/gallery/demos/menu-sources.js.map +7 -0
  171. package/dist/modules/design_system/gallery/demos/menus.js +150 -0
  172. package/dist/modules/design_system/gallery/demos/menus.js.map +7 -0
  173. package/dist/modules/design_system/gallery/demos/rating-reviews.js +53 -0
  174. package/dist/modules/design_system/gallery/demos/rating-reviews.js.map +7 -0
  175. package/dist/modules/design_system/gallery/demos/registered-icons.js +104 -0
  176. package/dist/modules/design_system/gallery/demos/registered-icons.js.map +7 -0
  177. package/dist/modules/design_system/gallery/demos/selection-cards.js +99 -0
  178. package/dist/modules/design_system/gallery/demos/selection-cards.js.map +7 -0
  179. package/dist/modules/design_system/gallery/demos/shell-code.generated.js +189 -0
  180. package/dist/modules/design_system/gallery/demos/shell-code.generated.js.map +7 -0
  181. package/dist/modules/design_system/gallery/demos/shell.js +330 -0
  182. package/dist/modules/design_system/gallery/demos/shell.js.map +7 -0
  183. package/dist/modules/design_system/gallery/demos/source-artwork.js +120 -0
  184. package/dist/modules/design_system/gallery/demos/source-artwork.js.map +7 -0
  185. package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js +125 -0
  186. package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js.map +7 -0
  187. package/dist/modules/design_system/gallery/demos/source-filters.js +185 -0
  188. package/dist/modules/design_system/gallery/demos/source-filters.js.map +7 -0
  189. package/dist/modules/design_system/gallery/demos/source-icons.js +69 -0
  190. package/dist/modules/design_system/gallery/demos/source-icons.js.map +7 -0
  191. package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js +150 -0
  192. package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js.map +7 -0
  193. package/dist/modules/design_system/gallery/demos/table-cells.js +181 -0
  194. package/dist/modules/design_system/gallery/demos/table-cells.js.map +7 -0
  195. package/dist/modules/design_system/gallery/demos/text-inputs.js +113 -0
  196. package/dist/modules/design_system/gallery/demos/text-inputs.js.map +7 -0
  197. package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js +41 -0
  198. package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js.map +7 -0
  199. package/dist/modules/design_system/gallery/demos/time-picker.js +41 -0
  200. package/dist/modules/design_system/gallery/demos/time-picker.js.map +7 -0
  201. package/dist/modules/design_system/gallery/entries/banners.js +123 -60
  202. package/dist/modules/design_system/gallery/entries/banners.js.map +2 -2
  203. package/dist/modules/design_system/gallery/entries/buttons-snippets.js +433 -0
  204. package/dist/modules/design_system/gallery/entries/buttons-snippets.js.map +7 -0
  205. package/dist/modules/design_system/gallery/entries/buttons.js +127 -148
  206. package/dist/modules/design_system/gallery/entries/buttons.js.map +2 -2
  207. package/dist/modules/design_system/gallery/entries/charts.js +532 -186
  208. package/dist/modules/design_system/gallery/entries/charts.js.map +2 -2
  209. package/dist/modules/design_system/gallery/entries/dates.js +191 -3
  210. package/dist/modules/design_system/gallery/entries/dates.js.map +2 -2
  211. package/dist/modules/design_system/gallery/entries/detail.js +118 -77
  212. package/dist/modules/design_system/gallery/entries/detail.js.map +2 -2
  213. package/dist/modules/design_system/gallery/entries/display.js +1449 -240
  214. package/dist/modules/design_system/gallery/entries/display.js.map +2 -2
  215. package/dist/modules/design_system/gallery/entries/feedback.js +1058 -132
  216. package/dist/modules/design_system/gallery/entries/feedback.js.map +2 -2
  217. package/dist/modules/design_system/gallery/entries/filters.js +231 -103
  218. package/dist/modules/design_system/gallery/entries/filters.js.map +2 -2
  219. package/dist/modules/design_system/gallery/entries/foundations.js +368 -57
  220. package/dist/modules/design_system/gallery/entries/foundations.js.map +2 -2
  221. package/dist/modules/design_system/gallery/entries/icons.js +29 -91
  222. package/dist/modules/design_system/gallery/entries/icons.js.map +2 -2
  223. package/dist/modules/design_system/gallery/entries/inputs-snippets.js +154 -0
  224. package/dist/modules/design_system/gallery/entries/inputs-snippets.js.map +7 -0
  225. package/dist/modules/design_system/gallery/entries/inputs.js +2043 -306
  226. package/dist/modules/design_system/gallery/entries/inputs.js.map +2 -2
  227. package/dist/modules/design_system/gallery/entries/library.js +20 -0
  228. package/dist/modules/design_system/gallery/entries/library.js.map +7 -0
  229. package/dist/modules/design_system/gallery/entries/messages.js +121 -103
  230. package/dist/modules/design_system/gallery/entries/messages.js.map +2 -2
  231. package/dist/modules/design_system/gallery/entries/navigation.js +676 -103
  232. package/dist/modules/design_system/gallery/entries/navigation.js.map +2 -2
  233. package/dist/modules/design_system/gallery/entries/notifications.js +131 -78
  234. package/dist/modules/design_system/gallery/entries/notifications.js.map +2 -2
  235. package/dist/modules/design_system/gallery/entries/overlays.js +611 -203
  236. package/dist/modules/design_system/gallery/entries/overlays.js.map +2 -2
  237. package/dist/modules/design_system/gallery/entries/scaffolding.js +1175 -120
  238. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +2 -2
  239. package/dist/modules/design_system/gallery/entries/schedule.js +79 -54
  240. package/dist/modules/design_system/gallery/entries/schedule.js.map +2 -2
  241. package/dist/modules/design_system/gallery/presentation.js +108 -0
  242. package/dist/modules/design_system/gallery/presentation.js.map +7 -0
  243. package/dist/modules/design_system/gallery/registry.js +8 -5
  244. package/dist/modules/design_system/gallery/registry.js.map +2 -2
  245. package/dist/modules/design_system/gallery/source-library.generated.js +5 -0
  246. package/dist/modules/design_system/gallery/source-library.generated.js.map +7 -0
  247. package/dist/modules/design_system/i18n/de.json +7167 -0
  248. package/dist/modules/design_system/i18n/en.json +7167 -0
  249. package/dist/modules/design_system/i18n/es.json +7167 -0
  250. package/dist/modules/design_system/i18n/ko.json +7167 -0
  251. package/dist/modules/design_system/i18n/pl.json +7167 -0
  252. package/dist/modules/push_notifications/lib/queue.js +1 -31
  253. package/dist/modules/push_notifications/lib/queue.js.map +2 -2
  254. package/jest.config.cjs +1 -0
  255. package/jest.mocks/image.js +1 -0
  256. package/package.json +8 -9
  257. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +50 -0
  258. package/src/modules/customers/backend/customers/companies/[id]/page.tsx +2 -1
  259. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +2 -1
  260. package/src/modules/customers/backend/customers/people/[id]/page.tsx +2 -2
  261. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +2 -1
  262. package/src/modules/customers/lib/detailHelpers.ts +4 -0
  263. package/src/modules/customers/lib/todoCompatibility.ts +10 -0
  264. package/src/modules/design_system/backend/design-system/page.meta.ts +3 -2
  265. package/src/modules/design_system/gallery/assets/README.md +30 -0
  266. package/src/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
  267. package/src/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
  268. package/src/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
  269. package/src/modules/design_system/gallery/assets/avatar-photo.png +0 -0
  270. package/src/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
  271. package/src/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
  272. package/src/modules/design_system/gallery/assets/crypto-ada.png +0 -0
  273. package/src/modules/design_system/gallery/assets/crypto-avax.png +0 -0
  274. package/src/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
  275. package/src/modules/design_system/gallery/assets/crypto-brand.png +0 -0
  276. package/src/modules/design_system/gallery/assets/crypto-btc.png +0 -0
  277. package/src/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
  278. package/src/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
  279. package/src/modules/design_system/gallery/assets/crypto-dot.png +0 -0
  280. package/src/modules/design_system/gallery/assets/crypto-eth.png +0 -0
  281. package/src/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
  282. package/src/modules/design_system/gallery/assets/crypto-history.svg +3 -0
  283. package/src/modules/design_system/gallery/assets/crypto-link.svg +3 -0
  284. package/src/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
  285. package/src/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
  286. package/src/modules/design_system/gallery/assets/crypto-more.svg +3 -0
  287. package/src/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
  288. package/src/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
  289. package/src/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
  290. package/src/modules/design_system/gallery/assets/crypto-sol.png +0 -0
  291. package/src/modules/design_system/gallery/assets/crypto-star.svg +3 -0
  292. package/src/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
  293. package/src/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
  294. package/src/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
  295. package/src/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
  296. package/src/modules/design_system/gallery/assets/crypto-trx.png +0 -0
  297. package/src/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
  298. package/src/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
  299. package/src/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
  300. package/src/modules/design_system/gallery/assets/crypto-wei.png +0 -0
  301. package/src/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
  302. package/src/modules/design_system/gallery/assets/cryptocurrency-artwork.ts +63 -0
  303. package/src/modules/design_system/gallery/assets/github-logo.png +0 -0
  304. package/src/modules/design_system/gallery/assets/images.d.ts +9 -0
  305. package/src/modules/design_system/gallery/assets/input-european-union.svg +18 -0
  306. package/src/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
  307. package/src/modules/design_system/gallery/assets/marketing-artwork.ts +79 -0
  308. package/src/modules/design_system/gallery/assets/menu-apex.svg +18 -0
  309. package/src/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
  310. package/src/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
  311. package/src/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
  312. package/src/modules/design_system/gallery/assets/select-google.png +0 -0
  313. package/src/modules/design_system/gallery/assets/select-poland.png +0 -0
  314. package/src/modules/design_system/gallery/assets/selection-artwork.ts +1 -0
  315. package/src/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
  316. package/src/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
  317. package/src/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
  318. package/src/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
  319. package/src/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
  320. package/src/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
  321. package/src/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
  322. package/src/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
  323. package/src/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
  324. package/src/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
  325. package/src/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
  326. package/src/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
  327. package/src/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
  328. package/src/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
  329. package/src/modules/design_system/gallery/assets/style-studio-product.png +0 -0
  330. package/src/modules/design_system/gallery/assets/upload-images.ts +5 -0
  331. package/src/modules/design_system/gallery/components/BrandStylePreview.tsx +94 -0
  332. package/src/modules/design_system/gallery/components/CodeSnippet.tsx +34 -34
  333. package/src/modules/design_system/gallery/components/ColorPlayground.tsx +324 -0
  334. package/src/modules/design_system/gallery/components/ColorStudioCompositions.tsx +96 -0
  335. package/src/modules/design_system/gallery/components/ColorStudioSpecimen.tsx +164 -0
  336. package/src/modules/design_system/gallery/components/CompactEntrySpecimen.tsx +65 -0
  337. package/src/modules/design_system/gallery/components/ComponentIndex.tsx +47 -0
  338. package/src/modules/design_system/gallery/components/DesignSystemHome.tsx +66 -0
  339. package/src/modules/design_system/gallery/components/EntryCard.tsx +52 -37
  340. package/src/modules/design_system/gallery/components/EntryHeader.tsx +80 -0
  341. package/src/modules/design_system/gallery/components/FamilyEntryPreview.tsx +22 -0
  342. package/src/modules/design_system/gallery/components/FoundationGuide.tsx +43 -0
  343. package/src/modules/design_system/gallery/components/GalleryLink.tsx +19 -0
  344. package/src/modules/design_system/gallery/components/GalleryNavigation.tsx +86 -0
  345. package/src/modules/design_system/gallery/components/GalleryShell.tsx +149 -63
  346. package/src/modules/design_system/gallery/components/IconsBrowser.tsx +40 -0
  347. package/src/modules/design_system/gallery/components/SourceLibrary.tsx +90 -0
  348. package/src/modules/design_system/gallery/components/StyleAgents.tsx +115 -0
  349. package/src/modules/design_system/gallery/components/ThemeTokenReference.tsx +76 -0
  350. package/src/modules/design_system/gallery/components/VariantPreview.tsx +2 -2
  351. package/src/modules/design_system/gallery/components/colorPreview.ts +63 -0
  352. package/src/modules/design_system/gallery/components/colorStudio.ts +260 -0
  353. package/src/modules/design_system/gallery/components/styleAgentBranding.ts +42 -0
  354. package/src/modules/design_system/gallery/components/themeTokens.ts +26 -0
  355. package/src/modules/design_system/gallery/demos/ai-product-code.generated.ts +3 -0
  356. package/src/modules/design_system/gallery/demos/ai-product.tsx +188 -0
  357. package/src/modules/design_system/gallery/demos/buttons.tsx +331 -0
  358. package/src/modules/design_system/gallery/demos/cryptocurrency.tsx +1943 -0
  359. package/src/modules/design_system/gallery/demos/feeds-code.generated.ts +4 -0
  360. package/src/modules/design_system/gallery/demos/feeds.tsx +82 -0
  361. package/src/modules/design_system/gallery/demos/file-upload.tsx +61 -0
  362. package/src/modules/design_system/gallery/demos/foundation-reference-data.ts +4872 -0
  363. package/src/modules/design_system/gallery/demos/foundation-references.tsx +140 -0
  364. package/src/modules/design_system/gallery/demos/key-components-code.generated.ts +3 -0
  365. package/src/modules/design_system/gallery/demos/key-components.tsx +106 -0
  366. package/src/modules/design_system/gallery/demos/marketing-controls-code.generated.ts +3 -0
  367. package/src/modules/design_system/gallery/demos/marketing-controls.tsx +92 -0
  368. package/src/modules/design_system/gallery/demos/marketing-widgets-code.generated.ts +3 -0
  369. package/src/modules/design_system/gallery/demos/marketing-widgets.tsx +189 -0
  370. package/src/modules/design_system/gallery/demos/menu-fixtures.tsx +48 -0
  371. package/src/modules/design_system/gallery/demos/menu-sources.ts +5 -0
  372. package/src/modules/design_system/gallery/demos/menus.tsx +122 -0
  373. package/src/modules/design_system/gallery/demos/rating-reviews.tsx +44 -0
  374. package/src/modules/design_system/gallery/demos/registered-icons.tsx +117 -0
  375. package/src/modules/design_system/gallery/demos/selection-cards.tsx +97 -0
  376. package/src/modules/design_system/gallery/demos/shell-code.generated.ts +3 -0
  377. package/src/modules/design_system/gallery/demos/shell.tsx +183 -0
  378. package/src/modules/design_system/gallery/demos/source-artwork.tsx +88 -0
  379. package/src/modules/design_system/gallery/demos/source-filters-code.generated.ts +3 -0
  380. package/src/modules/design_system/gallery/demos/source-filters.tsx +119 -0
  381. package/src/modules/design_system/gallery/demos/source-icons.tsx +62 -0
  382. package/src/modules/design_system/gallery/demos/table-cells-code.generated.ts +3 -0
  383. package/src/modules/design_system/gallery/demos/table-cells.tsx +144 -0
  384. package/src/modules/design_system/gallery/demos/text-inputs.tsx +90 -0
  385. package/src/modules/design_system/gallery/demos/time-picker-code.generated.ts +5 -0
  386. package/src/modules/design_system/gallery/demos/time-picker.tsx +31 -0
  387. package/src/modules/design_system/gallery/entries/banners.tsx +143 -94
  388. package/src/modules/design_system/gallery/entries/buttons-snippets.ts +432 -0
  389. package/src/modules/design_system/gallery/entries/buttons.tsx +125 -196
  390. package/src/modules/design_system/gallery/entries/charts.tsx +545 -233
  391. package/src/modules/design_system/gallery/entries/dates.tsx +171 -3
  392. package/src/modules/design_system/gallery/entries/detail.tsx +142 -115
  393. package/src/modules/design_system/gallery/entries/display.tsx +1691 -319
  394. package/src/modules/design_system/gallery/entries/feedback.tsx +1082 -169
  395. package/src/modules/design_system/gallery/entries/filters.tsx +238 -143
  396. package/src/modules/design_system/gallery/entries/foundations.tsx +404 -61
  397. package/src/modules/design_system/gallery/entries/icons.tsx +31 -117
  398. package/src/modules/design_system/gallery/entries/inputs-snippets.ts +156 -0
  399. package/src/modules/design_system/gallery/entries/inputs.tsx +2146 -503
  400. package/src/modules/design_system/gallery/entries/library.tsx +16 -0
  401. package/src/modules/design_system/gallery/entries/messages.tsx +114 -106
  402. package/src/modules/design_system/gallery/entries/navigation.tsx +782 -192
  403. package/src/modules/design_system/gallery/entries/notifications.tsx +145 -120
  404. package/src/modules/design_system/gallery/entries/overlays.tsx +696 -280
  405. package/src/modules/design_system/gallery/entries/scaffolding.tsx +1192 -158
  406. package/src/modules/design_system/gallery/entries/schedule.tsx +72 -58
  407. package/src/modules/design_system/gallery/presentation.ts +106 -0
  408. package/src/modules/design_system/gallery/registry.ts +8 -6
  409. package/src/modules/design_system/gallery/source-library.generated.ts +2 -0
  410. package/src/modules/design_system/i18n/de.json +7112 -3
  411. package/src/modules/design_system/i18n/en.json +7112 -3
  412. package/src/modules/design_system/i18n/es.json +7112 -3
  413. package/src/modules/design_system/i18n/ko.json +7112 -3
  414. package/src/modules/design_system/i18n/pl.json +7112 -3
  415. package/src/modules/push_notifications/AGENTS.md +9 -5
  416. package/src/modules/push_notifications/lib/queue.ts +15 -44
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/demos/menu-sources.ts"],
4
+ "sourcesContent": ["export const selectSourceCode = \"import * as React from 'react'\\nimport { Globe, UserRound } from 'lucide-react'\\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\\nimport { Avatar } from '@open-mercato/ui/primitives/avatar'\\nimport mastercard from '@open-mercato/core/modules/design_system/gallery/assets/menu-mastercard.svg'\\nimport apex from '@open-mercato/core/modules/design_system/gallery/assets/menu-apex.svg'\\nimport spotify from '@open-mercato/core/modules/design_system/gallery/assets/menu-spotify.svg'\\nimport unitedStates from '@open-mercato/core/modules/design_system/gallery/assets/menu-united-states.svg'\\nimport google from '@open-mercato/core/modules/design_system/gallery/assets/select-google.png'\\nimport poland from '@open-mercato/core/modules/design_system/gallery/assets/select-poland.png'\\nimport avatar from '@open-mercato/core/modules/design_system/gallery/assets/avatar-illustration.png'\\n\\nexport type MenuKind = 'basic' | 'country' | 'avatar' | 'provider' | 'brand' | 'company' | 'icon'\\nexport const selectKinds: MenuKind[] = ['basic', 'country', 'avatar', 'provider', 'brand', 'company']\\nexport const commandKinds: MenuKind[] = ['basic', 'avatar', 'icon', 'brand', 'company', 'country']\\n\\nconst imageSource = (asset: string | { readonly src: string }) => typeof asset === 'string' ? asset : asset.src\\n\\nexport function useMenuChoices(kind: MenuKind) {\\n const t = useT()\\n return [0, 1, 2].map((index) => ({\\n value: `${kind}-${index}`,\\n label: t(`design_system.gallery.samples.menu.${kind}.${index}`),\\n description: t('design_system.gallery.samples.menu.description'),\\n disabled: index === 2,\\n alternative: index !== 0,\\n }))\\n}\\n\\nexport function MenuVisual({ kind, large = false, alternative = false, providerSize = 'row' }: {\\n kind: MenuKind\\n large?: boolean\\n alternative?: boolean\\n providerSize?: 'row' | 'select'\\n}) {\\n if (kind === 'avatar') {\\n return <Avatar size={large ? 40 : 20} label={alternative ? 'Sophia Williams' : 'James Brown'} src={alternative ? undefined : imageSource(avatar)} />\\n }\\n const asset = kind === 'country' ? alternative ? poland : unitedStates\\n : kind === 'provider' ? mastercard\\n : kind === 'brand' ? alternative ? google : spotify\\n : kind === 'company' ? apex : undefined\\n const Icon = kind === 'icon' ? UserRound : Globe\\n const content = asset\\n ? <img src={imageSource(asset)} alt=\\\"\\\" className={kind === 'provider' ? providerSize === 'select' ? 'h-6 w-8 object-contain' : 'h-5 w-6.5 object-contain' : large ? 'size-6 object-contain' : 'size-5 object-contain'} />\\n : <Icon aria-hidden=\\\"true\\\" className={large ? 'size-6' : 'size-5'} />\\n return <span aria-hidden=\\\"true\\\" className={large ? 'flex size-10 shrink-0 items-center justify-center rounded-full border border-input bg-background text-muted-foreground' : 'inline-flex shrink-0 items-center justify-center text-muted-foreground'}>{content}</span>\\n}\\n\\nimport { Info, Plus } from 'lucide-react'\\nimport { Button } from '@open-mercato/ui/primitives/button'\\nimport { Badge } from '@open-mercato/ui/primitives/badge'\\nimport { Kbd } from '@open-mercato/ui/primitives/kbd'\\nimport { FormField } from '@open-mercato/ui/primitives/form-field'\\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectTriggerLeading, SelectValue } from '@open-mercato/ui/primitives/select'\\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownInput, DropdownList, DropdownEmpty, DropdownItem, DropdownFooter, DropdownCaption } from '@open-mercato/ui/primitives/dropdown'\\nimport { CommandMenu, CommandMenuTrigger, CommandMenuContent, CommandMenuInput, CommandMenuList, CommandMenuEmpty, CommandMenuItem, CommandMenuGroup, CommandMenuSeparator, CommandMenuFooter } from '@open-mercato/ui/primitives/command-menu'\\n\\nexport function SelectSourceExample({ kind, size = 36, state = 'filled' }: {\\n kind: MenuKind\\n size?: 32 | 36 | 40\\n state?: 'default' | 'filled' | 'disabled' | 'error'\\n}) {\\n const t = useT()\\n const choices = useMenuChoices(kind)\\n const [value, setValue] = React.useState(state === 'default' || state === 'error' ? '' : choices[0].value)\\n const selected = choices.find((choice) => choice.value === value)\\n const disabled = state === 'disabled'\\n const label = t(`design_system.gallery.samples.menu.kind.${kind}`)\\n const providerPadding = kind !== 'provider' ? undefined : size === 40 ? 'p-2' : size === 36 ? 'p-1.5' : 'p-1'\\n return (\\n <Select value={value} onValueChange={setValue} disabled={disabled}>\\n <FormField label={label} disabled={disabled} description={t('design_system.gallery.samples.menu.hint')} error={state === 'error' ? t('design_system.gallery.samples.menu.required') : undefined}>\\n <SelectTrigger size={size} className={providerPadding}>\\n {kind !== 'basic' && <SelectTriggerLeading><MenuVisual kind={kind} alternative={selected?.alternative} providerSize=\\\"select\\\" /></SelectTriggerLeading>}\\n <SelectValue className=\\\"min-w-0 flex-1 text-left\\\" placeholder={t('design_system.gallery.samples.menu.placeholder')} />\\n </SelectTrigger>\\n </FormField>\\n <SelectContent>\\n {choices.map((choice) => <SelectItem key={choice.value} value={choice.value} disabled={choice.disabled} leading={kind === 'basic' ? undefined : <MenuVisual kind={kind} alternative={choice.alternative} />}>\\n {choice.label}\\n </SelectItem>)}\\n </SelectContent>\\n </Select>\\n )\\n}\\n\\nexport function SelectSourceMatrix({ size = 36, state = 'filled' }: { size?: 32 | 36 | 40; state?: 'default' | 'filled' | 'disabled' | 'error' }) {\\n return <div className=\\\"grid w-full gap-6 sm:grid-cols-2 xl:grid-cols-3\\\">{selectKinds.map((kind) => <SelectSourceExample key={kind} kind={kind} size={size} state={state} />)}</div>\\n}\\n\\n\"\n\nexport const dropdownSourceCode = \"import * as React from 'react'\\nimport { Globe, UserRound } from 'lucide-react'\\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\\nimport { Avatar } from '@open-mercato/ui/primitives/avatar'\\nimport mastercard from '@open-mercato/core/modules/design_system/gallery/assets/menu-mastercard.svg'\\nimport apex from '@open-mercato/core/modules/design_system/gallery/assets/menu-apex.svg'\\nimport spotify from '@open-mercato/core/modules/design_system/gallery/assets/menu-spotify.svg'\\nimport unitedStates from '@open-mercato/core/modules/design_system/gallery/assets/menu-united-states.svg'\\nimport google from '@open-mercato/core/modules/design_system/gallery/assets/select-google.png'\\nimport poland from '@open-mercato/core/modules/design_system/gallery/assets/select-poland.png'\\nimport avatar from '@open-mercato/core/modules/design_system/gallery/assets/avatar-illustration.png'\\n\\nexport type MenuKind = 'basic' | 'country' | 'avatar' | 'provider' | 'brand' | 'company' | 'icon'\\nexport const selectKinds: MenuKind[] = ['basic', 'country', 'avatar', 'provider', 'brand', 'company']\\nexport const commandKinds: MenuKind[] = ['basic', 'avatar', 'icon', 'brand', 'company', 'country']\\n\\nconst imageSource = (asset: string | { readonly src: string }) => typeof asset === 'string' ? asset : asset.src\\n\\nexport function useMenuChoices(kind: MenuKind) {\\n const t = useT()\\n return [0, 1, 2].map((index) => ({\\n value: `${kind}-${index}`,\\n label: t(`design_system.gallery.samples.menu.${kind}.${index}`),\\n description: t('design_system.gallery.samples.menu.description'),\\n disabled: index === 2,\\n alternative: index !== 0,\\n }))\\n}\\n\\nexport function MenuVisual({ kind, large = false, alternative = false, providerSize = 'row' }: {\\n kind: MenuKind\\n large?: boolean\\n alternative?: boolean\\n providerSize?: 'row' | 'select'\\n}) {\\n if (kind === 'avatar') {\\n return <Avatar size={large ? 40 : 20} label={alternative ? 'Sophia Williams' : 'James Brown'} src={alternative ? undefined : imageSource(avatar)} />\\n }\\n const asset = kind === 'country' ? alternative ? poland : unitedStates\\n : kind === 'provider' ? mastercard\\n : kind === 'brand' ? alternative ? google : spotify\\n : kind === 'company' ? apex : undefined\\n const Icon = kind === 'icon' ? UserRound : Globe\\n const content = asset\\n ? <img src={imageSource(asset)} alt=\\\"\\\" className={kind === 'provider' ? providerSize === 'select' ? 'h-6 w-8 object-contain' : 'h-5 w-6.5 object-contain' : large ? 'size-6 object-contain' : 'size-5 object-contain'} />\\n : <Icon aria-hidden=\\\"true\\\" className={large ? 'size-6' : 'size-5'} />\\n return <span aria-hidden=\\\"true\\\" className={large ? 'flex size-10 shrink-0 items-center justify-center rounded-full border border-input bg-background text-muted-foreground' : 'inline-flex shrink-0 items-center justify-center text-muted-foreground'}>{content}</span>\\n}\\n\\nimport { Info, Plus } from 'lucide-react'\\nimport { Button } from '@open-mercato/ui/primitives/button'\\nimport { Badge } from '@open-mercato/ui/primitives/badge'\\nimport { Kbd } from '@open-mercato/ui/primitives/kbd'\\nimport { FormField } from '@open-mercato/ui/primitives/form-field'\\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectTriggerLeading, SelectValue } from '@open-mercato/ui/primitives/select'\\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownInput, DropdownList, DropdownEmpty, DropdownItem, DropdownFooter, DropdownCaption } from '@open-mercato/ui/primitives/dropdown'\\nimport { CommandMenu, CommandMenuTrigger, CommandMenuContent, CommandMenuInput, CommandMenuList, CommandMenuEmpty, CommandMenuItem, CommandMenuGroup, CommandMenuSeparator, CommandMenuFooter } from '@open-mercato/ui/primitives/command-menu'\\n\\nexport function DropdownSourceExample({ size = 36, empty = false }: { size?: 36 | 56; empty?: boolean }) {\\n const t = useT()\\n const [open, setOpen] = React.useState(false)\\n const [value, setValue] = React.useState('basic')\\n const [query, setQuery] = React.useState(empty ? 'zzzz' : '')\\n const [workspaceCount, setWorkspaceCount] = React.useState(0)\\n return (\\n <div className=\\\"flex w-full flex-col items-start gap-3\\\">\\n <Dropdown open={open} onOpenChange={setOpen}>\\n <DropdownTrigger asChild><Button variant=\\\"outline\\\">{t('design_system.gallery.samples.menu.openDropdown')}</Button></DropdownTrigger>\\n <DropdownContent className=\\\"w-96 max-w-full\\\" aria-label={t('design_system.gallery.samples.menu.openDropdown')} commandProps={{ label: t('design_system.gallery.samples.menu.options') }}>\\n <DropdownInput value={query} onValueChange={setQuery} aria-label={t('design_system.gallery.samples.menu.search')} placeholder={t('design_system.gallery.samples.menu.search')} />\\n <DropdownList>\\n <DropdownEmpty>{t('design_system.gallery.samples.menu.noResults')}</DropdownEmpty>\\n {selectKinds.map((kind) => {\\n const label = t(`design_system.gallery.samples.menu.${kind}.0`)\\n return <DropdownItem key={kind} value={label} size={size} checked={value === kind} leading={<MenuVisual kind={kind} large={size === 56} />}\\n description={size === 56 ? t('design_system.gallery.samples.menu.description') : undefined}\\n sublabel={kind === 'basic' ? t('design_system.gallery.samples.menu.sublabel') : undefined}\\n badge={kind === 'brand' ? <Badge appearance=\\\"lighter\\\" tone=\\\"info\\\" size={20}>{t('design_system.gallery.samples.menu.new')}</Badge> : undefined}\\n shortcut={kind === 'company' ? <Kbd>\\u23181</Kbd> : undefined}\\n onSelect={() => { setValue(kind); setOpen(false) }}>\\n {label}\\n </DropdownItem>\\n })}\\n <DropdownItem value={t('design_system.gallery.samples.menu.unavailable')} size={size} disabled leading={<MenuVisual kind=\\\"basic\\\" large={size === 56} />}>{t('design_system.gallery.samples.menu.unavailable')}</DropdownItem>\\n </DropdownList>\\n <DropdownFooter><Button variant=\\\"outline\\\" size=\\\"sm\\\" className=\\\"w-full\\\" onClick={() => { setWorkspaceCount((count) => count + 1); setOpen(false) }}><Plus className=\\\"size-5\\\" />{t('design_system.gallery.samples.menu.addWorkspace')}</Button></DropdownFooter>\\n <DropdownCaption>{t('design_system.gallery.samples.menu.localCaption')}</DropdownCaption>\\n </DropdownContent>\\n </Dropdown>\\n <output aria-live=\\\"polite\\\" className=\\\"text-sm text-muted-foreground\\\">{t('design_system.gallery.samples.menu.selected', { value: t(`design_system.gallery.samples.menu.${value}.0`) })}</output>\\n {workspaceCount > 0 && <output aria-live=\\\"polite\\\" className=\\\"text-sm text-muted-foreground\\\">{t('design_system.gallery.samples.menu.created', { count: workspaceCount })}</output>}\\n </div>\\n )\\n}\\n\\n\"\n\nexport const commandSourceCode = \"import * as React from 'react'\\nimport { Globe, UserRound } from 'lucide-react'\\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\\nimport { Avatar } from '@open-mercato/ui/primitives/avatar'\\nimport mastercard from '@open-mercato/core/modules/design_system/gallery/assets/menu-mastercard.svg'\\nimport apex from '@open-mercato/core/modules/design_system/gallery/assets/menu-apex.svg'\\nimport spotify from '@open-mercato/core/modules/design_system/gallery/assets/menu-spotify.svg'\\nimport unitedStates from '@open-mercato/core/modules/design_system/gallery/assets/menu-united-states.svg'\\nimport google from '@open-mercato/core/modules/design_system/gallery/assets/select-google.png'\\nimport poland from '@open-mercato/core/modules/design_system/gallery/assets/select-poland.png'\\nimport avatar from '@open-mercato/core/modules/design_system/gallery/assets/avatar-illustration.png'\\n\\nexport type MenuKind = 'basic' | 'country' | 'avatar' | 'provider' | 'brand' | 'company' | 'icon'\\nexport const selectKinds: MenuKind[] = ['basic', 'country', 'avatar', 'provider', 'brand', 'company']\\nexport const commandKinds: MenuKind[] = ['basic', 'avatar', 'icon', 'brand', 'company', 'country']\\n\\nconst imageSource = (asset: string | { readonly src: string }) => typeof asset === 'string' ? asset : asset.src\\n\\nexport function useMenuChoices(kind: MenuKind) {\\n const t = useT()\\n return [0, 1, 2].map((index) => ({\\n value: `${kind}-${index}`,\\n label: t(`design_system.gallery.samples.menu.${kind}.${index}`),\\n description: t('design_system.gallery.samples.menu.description'),\\n disabled: index === 2,\\n alternative: index !== 0,\\n }))\\n}\\n\\nexport function MenuVisual({ kind, large = false, alternative = false, providerSize = 'row' }: {\\n kind: MenuKind\\n large?: boolean\\n alternative?: boolean\\n providerSize?: 'row' | 'select'\\n}) {\\n if (kind === 'avatar') {\\n return <Avatar size={large ? 40 : 20} label={alternative ? 'Sophia Williams' : 'James Brown'} src={alternative ? undefined : imageSource(avatar)} />\\n }\\n const asset = kind === 'country' ? alternative ? poland : unitedStates\\n : kind === 'provider' ? mastercard\\n : kind === 'brand' ? alternative ? google : spotify\\n : kind === 'company' ? apex : undefined\\n const Icon = kind === 'icon' ? UserRound : Globe\\n const content = asset\\n ? <img src={imageSource(asset)} alt=\\\"\\\" className={kind === 'provider' ? providerSize === 'select' ? 'h-6 w-8 object-contain' : 'h-5 w-6.5 object-contain' : large ? 'size-6 object-contain' : 'size-5 object-contain'} />\\n : <Icon aria-hidden=\\\"true\\\" className={large ? 'size-6' : 'size-5'} />\\n return <span aria-hidden=\\\"true\\\" className={large ? 'flex size-10 shrink-0 items-center justify-center rounded-full border border-input bg-background text-muted-foreground' : 'inline-flex shrink-0 items-center justify-center text-muted-foreground'}>{content}</span>\\n}\\n\\nimport { Info, Plus } from 'lucide-react'\\nimport { Button } from '@open-mercato/ui/primitives/button'\\nimport { Badge } from '@open-mercato/ui/primitives/badge'\\nimport { Kbd } from '@open-mercato/ui/primitives/kbd'\\nimport { FormField } from '@open-mercato/ui/primitives/form-field'\\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectTriggerLeading, SelectValue } from '@open-mercato/ui/primitives/select'\\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownInput, DropdownList, DropdownEmpty, DropdownItem, DropdownFooter, DropdownCaption } from '@open-mercato/ui/primitives/dropdown'\\nimport { CommandMenu, CommandMenuTrigger, CommandMenuContent, CommandMenuInput, CommandMenuList, CommandMenuEmpty, CommandMenuItem, CommandMenuGroup, CommandMenuSeparator, CommandMenuFooter } from '@open-mercato/ui/primitives/command-menu'\\n\\nfunction CommandSourceRows({ size, onSelect }: { size: 40 | 64; onSelect: (value: string) => void }) {\\n const t = useT()\\n return <>{commandKinds.map((kind) => {\\n const label = t(`design_system.gallery.samples.menu.${kind}.0`)\\n return <CommandMenuItem key={kind} value={label} size={size} leading={kind === 'basic' ? undefined : <MenuVisual kind={kind} large={size === 64} />}\\n description={size === 64 ? t('design_system.gallery.samples.menu.description') : undefined}\\n sublabel={kind === 'basic' ? t('design_system.gallery.samples.menu.sublabel') : undefined}\\n badge={kind === 'brand' ? <Badge appearance=\\\"lighter\\\" tone=\\\"info\\\" size={20}>{t('design_system.gallery.samples.menu.new')}</Badge> : undefined}\\n shortcut={kind === 'company' ? <Kbd>\\u2318K</Kbd> : undefined}\\n onSelect={() => onSelect(label)}>{label}</CommandMenuItem>\\n })}</>\\n}\\n\\nexport function CommandSourceExample({ size = 40, empty = false, withGroups = false }: { size?: 40 | 64; empty?: boolean; withGroups?: boolean }) {\\n const t = useT()\\n const [open, setOpen] = React.useState(false)\\n const [query, setQuery] = React.useState(empty ? 'zzzz' : '')\\n const [result, setResult] = React.useState('')\\n const onSelect = (label: string) => { setResult(label); setOpen(false) }\\n const rows = <CommandSourceRows size={size} onSelect={onSelect} />\\n return (\\n <div className=\\\"flex flex-col items-start gap-3\\\">\\n <CommandMenu open={open} onOpenChange={setOpen}>\\n <CommandMenuTrigger asChild><Button variant=\\\"outline\\\">{t('design_system.gallery.samples.menu.openCommand')}</Button></CommandMenuTrigger>\\n <CommandMenuContent title={t('design_system.gallery.samples.menu.openCommand')} commandProps={{ loop: true }}>\\n <CommandMenuInput appearance=\\\"source\\\" value={query} onValueChange={setQuery} aria-label={t('design_system.gallery.samples.menu.search')} placeholder={t('design_system.gallery.samples.menu.search')}\\n trailing={<SimpleTooltip content={t('design_system.gallery.samples.menu.hint')}><Button variant=\\\"ghost\\\" size=\\\"2xs\\\" aria-label={t('design_system.gallery.samples.menu.help')}><Info className=\\\"size-5\\\" /></Button></SimpleTooltip>} />\\n <CommandMenuList>\\n <CommandMenuEmpty>{t('design_system.gallery.samples.menu.noResults')}</CommandMenuEmpty>\\n {withGroups ? <CommandMenuGroup heading={t('design_system.gallery.samples.menu.caption')} actionLabel={t('design_system.gallery.samples.menu.seeAll')} onAction={() => setQuery('')}>{rows}</CommandMenuGroup> : rows}\\n {withGroups && <><CommandMenuSeparator /><CommandMenuGroup heading={t('design_system.gallery.samples.menu.unavailable')}><CommandMenuItem value=\\\"unavailable\\\" disabled size={size}>{t('design_system.gallery.samples.menu.unavailable')}</CommandMenuItem></CommandMenuGroup></>}\\n </CommandMenuList>\\n <CommandMenuFooter className=\\\"min-h-12 flex-wrap px-5 py-3.5\\\" helpSlot={<Button variant=\\\"link\\\" size=\\\"2xs\\\" onClick={() => setResult(t('design_system.gallery.samples.menu.hint'))}>{t('design_system.gallery.samples.menu.help')}</Button>} />\\n </CommandMenuContent>\\n </CommandMenu>\\n {result && <output aria-live=\\\"polite\\\" className=\\\"text-sm text-muted-foreground\\\">{t('design_system.gallery.samples.menu.selected', { value: result })}</output>}\\n </div>\\n )\\n}\\n\"\n"],
5
+ "mappings": "AAAO,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEzB,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAE3B,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,150 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Info, Plus } from "lucide-react";
4
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
5
+ import { Button } from "@open-mercato/ui/primitives/button";
6
+ import { Badge } from "@open-mercato/ui/primitives/badge";
7
+ import { Kbd } from "@open-mercato/ui/primitives/kbd";
8
+ import { FormField } from "@open-mercato/ui/primitives/form-field";
9
+ import { SimpleTooltip } from "@open-mercato/ui/primitives/tooltip";
10
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectTriggerLeading, SelectValue } from "@open-mercato/ui/primitives/select";
11
+ import { Dropdown, DropdownTrigger, DropdownContent, DropdownInput, DropdownList, DropdownEmpty, DropdownItem, DropdownFooter, DropdownCaption } from "@open-mercato/ui/primitives/dropdown";
12
+ import { CommandMenu, CommandMenuTrigger, CommandMenuContent, CommandMenuInput, CommandMenuList, CommandMenuEmpty, CommandMenuItem, CommandMenuGroup, CommandMenuSeparator, CommandMenuFooter } from "@open-mercato/ui/primitives/command-menu";
13
+ import { MenuVisual, useMenuChoices, selectKinds, commandKinds } from "./menu-fixtures.js";
14
+ function SelectSourceExample({ kind, size = 36, state = "filled" }) {
15
+ const t = useT();
16
+ const choices = useMenuChoices(kind);
17
+ const [value, setValue] = React.useState(state === "default" || state === "error" ? "" : choices[0].value);
18
+ const selected = choices.find((choice) => choice.value === value);
19
+ const disabled = state === "disabled";
20
+ const label = t(`design_system.gallery.samples.menu.kind.${kind}`);
21
+ const providerPadding = kind !== "provider" ? void 0 : size === 40 ? "p-2" : size === 36 ? "p-1.5" : "p-1";
22
+ return /* @__PURE__ */ jsxs(Select, { value, onValueChange: setValue, disabled, children: [
23
+ /* @__PURE__ */ jsx(FormField, { label, disabled, description: t("design_system.gallery.samples.menu.hint"), error: state === "error" ? t("design_system.gallery.samples.menu.required") : void 0, children: /* @__PURE__ */ jsxs(SelectTrigger, { size, className: providerPadding, children: [
24
+ kind !== "basic" && /* @__PURE__ */ jsx(SelectTriggerLeading, { children: /* @__PURE__ */ jsx(MenuVisual, { kind, alternative: selected?.alternative, providerSize: "select" }) }),
25
+ /* @__PURE__ */ jsx(SelectValue, { className: "min-w-0 flex-1 text-left", placeholder: t("design_system.gallery.samples.menu.placeholder") })
26
+ ] }) }),
27
+ /* @__PURE__ */ jsx(SelectContent, { children: choices.map((choice) => /* @__PURE__ */ jsx(SelectItem, { value: choice.value, disabled: choice.disabled, leading: kind === "basic" ? void 0 : /* @__PURE__ */ jsx(MenuVisual, { kind, alternative: choice.alternative }), children: choice.label }, choice.value)) })
28
+ ] });
29
+ }
30
+ function SelectSourceMatrix({ size = 36, state = "filled" }) {
31
+ return /* @__PURE__ */ jsx("div", { className: "grid w-full gap-6 sm:grid-cols-2 xl:grid-cols-3", children: selectKinds.map((kind) => /* @__PURE__ */ jsx(SelectSourceExample, { kind, size, state }, kind)) });
32
+ }
33
+ function DropdownSourceExample({ size = 36, empty = false }) {
34
+ const t = useT();
35
+ const [open, setOpen] = React.useState(false);
36
+ const [value, setValue] = React.useState("basic");
37
+ const [query, setQuery] = React.useState(empty ? "zzzz" : "");
38
+ const [workspaceCount, setWorkspaceCount] = React.useState(0);
39
+ return /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col items-start gap-3", children: [
40
+ /* @__PURE__ */ jsxs(Dropdown, { open, onOpenChange: setOpen, children: [
41
+ /* @__PURE__ */ jsx(DropdownTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "outline", children: t("design_system.gallery.samples.menu.openDropdown") }) }),
42
+ /* @__PURE__ */ jsxs(DropdownContent, { className: "w-96 max-w-full", "aria-label": t("design_system.gallery.samples.menu.openDropdown"), commandProps: { label: t("design_system.gallery.samples.menu.options") }, children: [
43
+ /* @__PURE__ */ jsx(DropdownInput, { value: query, onValueChange: setQuery, "aria-label": t("design_system.gallery.samples.menu.search"), placeholder: t("design_system.gallery.samples.menu.search") }),
44
+ /* @__PURE__ */ jsxs(DropdownList, { children: [
45
+ /* @__PURE__ */ jsx(DropdownEmpty, { children: t("design_system.gallery.samples.menu.noResults") }),
46
+ selectKinds.map((kind) => {
47
+ const label = t(`design_system.gallery.samples.menu.${kind}.0`);
48
+ return /* @__PURE__ */ jsx(
49
+ DropdownItem,
50
+ {
51
+ value: label,
52
+ size,
53
+ checked: value === kind,
54
+ leading: /* @__PURE__ */ jsx(MenuVisual, { kind, large: size === 56 }),
55
+ description: size === 56 ? t("design_system.gallery.samples.menu.description") : void 0,
56
+ sublabel: kind === "basic" ? t("design_system.gallery.samples.menu.sublabel") : void 0,
57
+ badge: kind === "brand" ? /* @__PURE__ */ jsx(Badge, { appearance: "lighter", tone: "info", size: 20, children: t("design_system.gallery.samples.menu.new") }) : void 0,
58
+ shortcut: kind === "company" ? /* @__PURE__ */ jsx(Kbd, { children: "\u23181" }) : void 0,
59
+ onSelect: () => {
60
+ setValue(kind);
61
+ setOpen(false);
62
+ },
63
+ children: label
64
+ },
65
+ kind
66
+ );
67
+ }),
68
+ /* @__PURE__ */ jsx(DropdownItem, { value: t("design_system.gallery.samples.menu.unavailable"), size, disabled: true, leading: /* @__PURE__ */ jsx(MenuVisual, { kind: "basic", large: size === 56 }), children: t("design_system.gallery.samples.menu.unavailable") })
69
+ ] }),
70
+ /* @__PURE__ */ jsx(DropdownFooter, { children: /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", className: "w-full", onClick: () => {
71
+ setWorkspaceCount((count) => count + 1);
72
+ setOpen(false);
73
+ }, children: [
74
+ /* @__PURE__ */ jsx(Plus, { className: "size-5" }),
75
+ t("design_system.gallery.samples.menu.addWorkspace")
76
+ ] }) }),
77
+ /* @__PURE__ */ jsx(DropdownCaption, { children: t("design_system.gallery.samples.menu.localCaption") })
78
+ ] })
79
+ ] }),
80
+ /* @__PURE__ */ jsx("output", { "aria-live": "polite", className: "text-sm text-muted-foreground", children: t("design_system.gallery.samples.menu.selected", { value: t(`design_system.gallery.samples.menu.${value}.0`) }) }),
81
+ workspaceCount > 0 && /* @__PURE__ */ jsx("output", { "aria-live": "polite", className: "text-sm text-muted-foreground", children: t("design_system.gallery.samples.menu.created", { count: workspaceCount }) })
82
+ ] });
83
+ }
84
+ function CommandSourceRows({ size, onSelect }) {
85
+ const t = useT();
86
+ return /* @__PURE__ */ jsx(Fragment, { children: commandKinds.map((kind) => {
87
+ const label = t(`design_system.gallery.samples.menu.${kind}.0`);
88
+ return /* @__PURE__ */ jsx(
89
+ CommandMenuItem,
90
+ {
91
+ value: label,
92
+ size,
93
+ leading: kind === "basic" ? void 0 : /* @__PURE__ */ jsx(MenuVisual, { kind, large: size === 64 }),
94
+ description: size === 64 ? t("design_system.gallery.samples.menu.description") : void 0,
95
+ sublabel: kind === "basic" ? t("design_system.gallery.samples.menu.sublabel") : void 0,
96
+ badge: kind === "brand" ? /* @__PURE__ */ jsx(Badge, { appearance: "lighter", tone: "info", size: 20, children: t("design_system.gallery.samples.menu.new") }) : void 0,
97
+ shortcut: kind === "company" ? /* @__PURE__ */ jsx(Kbd, { children: "\u2318K" }) : void 0,
98
+ onSelect: () => onSelect(label),
99
+ children: label
100
+ },
101
+ kind
102
+ );
103
+ }) });
104
+ }
105
+ function CommandSourceExample({ size = 40, empty = false, withGroups = false }) {
106
+ const t = useT();
107
+ const [open, setOpen] = React.useState(false);
108
+ const [query, setQuery] = React.useState(empty ? "zzzz" : "");
109
+ const [result, setResult] = React.useState("");
110
+ const onSelect = (label) => {
111
+ setResult(label);
112
+ setOpen(false);
113
+ };
114
+ const rows = /* @__PURE__ */ jsx(CommandSourceRows, { size, onSelect });
115
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start gap-3", children: [
116
+ /* @__PURE__ */ jsxs(CommandMenu, { open, onOpenChange: setOpen, children: [
117
+ /* @__PURE__ */ jsx(CommandMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "outline", children: t("design_system.gallery.samples.menu.openCommand") }) }),
118
+ /* @__PURE__ */ jsxs(CommandMenuContent, { title: t("design_system.gallery.samples.menu.openCommand"), commandProps: { loop: true }, children: [
119
+ /* @__PURE__ */ jsx(
120
+ CommandMenuInput,
121
+ {
122
+ appearance: "source",
123
+ value: query,
124
+ onValueChange: setQuery,
125
+ "aria-label": t("design_system.gallery.samples.menu.search"),
126
+ placeholder: t("design_system.gallery.samples.menu.search"),
127
+ trailing: /* @__PURE__ */ jsx(SimpleTooltip, { content: t("design_system.gallery.samples.menu.hint"), children: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "2xs", "aria-label": t("design_system.gallery.samples.menu.help"), children: /* @__PURE__ */ jsx(Info, { className: "size-5" }) }) })
128
+ }
129
+ ),
130
+ /* @__PURE__ */ jsxs(CommandMenuList, { children: [
131
+ /* @__PURE__ */ jsx(CommandMenuEmpty, { children: t("design_system.gallery.samples.menu.noResults") }),
132
+ withGroups ? /* @__PURE__ */ jsx(CommandMenuGroup, { heading: t("design_system.gallery.samples.menu.caption"), actionLabel: t("design_system.gallery.samples.menu.seeAll"), onAction: () => setQuery(""), children: rows }) : rows,
133
+ withGroups && /* @__PURE__ */ jsxs(Fragment, { children: [
134
+ /* @__PURE__ */ jsx(CommandMenuSeparator, {}),
135
+ /* @__PURE__ */ jsx(CommandMenuGroup, { heading: t("design_system.gallery.samples.menu.unavailable"), children: /* @__PURE__ */ jsx(CommandMenuItem, { value: "unavailable", disabled: true, size, children: t("design_system.gallery.samples.menu.unavailable") }) })
136
+ ] })
137
+ ] }),
138
+ /* @__PURE__ */ jsx(CommandMenuFooter, { className: "min-h-12 flex-wrap px-5 py-3.5", helpSlot: /* @__PURE__ */ jsx(Button, { variant: "link", size: "2xs", onClick: () => setResult(t("design_system.gallery.samples.menu.hint")), children: t("design_system.gallery.samples.menu.help") }) })
139
+ ] })
140
+ ] }),
141
+ result && /* @__PURE__ */ jsx("output", { "aria-live": "polite", className: "text-sm text-muted-foreground", children: t("design_system.gallery.samples.menu.selected", { value: result }) })
142
+ ] });
143
+ }
144
+ export {
145
+ CommandSourceExample,
146
+ DropdownSourceExample,
147
+ SelectSourceExample,
148
+ SelectSourceMatrix
149
+ };
150
+ //# sourceMappingURL=menus.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/demos/menus.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { Info, Plus } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Kbd } from '@open-mercato/ui/primitives/kbd'\nimport { FormField } from '@open-mercato/ui/primitives/form-field'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectTriggerLeading, SelectValue } from '@open-mercato/ui/primitives/select'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownInput, DropdownList, DropdownEmpty, DropdownItem, DropdownFooter, DropdownCaption } from '@open-mercato/ui/primitives/dropdown'\nimport { CommandMenu, CommandMenuTrigger, CommandMenuContent, CommandMenuInput, CommandMenuList, CommandMenuEmpty, CommandMenuItem, CommandMenuGroup, CommandMenuSeparator, CommandMenuFooter } from '@open-mercato/ui/primitives/command-menu'\nimport { MenuVisual, useMenuChoices, selectKinds, commandKinds, type MenuKind } from './menu-fixtures'\n\nexport function SelectSourceExample({ kind, size = 36, state = 'filled' }: {\n kind: MenuKind\n size?: 32 | 36 | 40\n state?: 'default' | 'filled' | 'disabled' | 'error'\n}) {\n const t = useT()\n const choices = useMenuChoices(kind)\n const [value, setValue] = React.useState(state === 'default' || state === 'error' ? '' : choices[0].value)\n const selected = choices.find((choice) => choice.value === value)\n const disabled = state === 'disabled'\n const label = t(`design_system.gallery.samples.menu.kind.${kind}`)\n const providerPadding = kind !== 'provider' ? undefined : size === 40 ? 'p-2' : size === 36 ? 'p-1.5' : 'p-1'\n return (\n <Select value={value} onValueChange={setValue} disabled={disabled}>\n <FormField label={label} disabled={disabled} description={t('design_system.gallery.samples.menu.hint')} error={state === 'error' ? t('design_system.gallery.samples.menu.required') : undefined}>\n <SelectTrigger size={size} className={providerPadding}>\n {kind !== 'basic' && <SelectTriggerLeading><MenuVisual kind={kind} alternative={selected?.alternative} providerSize=\"select\" /></SelectTriggerLeading>}\n <SelectValue className=\"min-w-0 flex-1 text-left\" placeholder={t('design_system.gallery.samples.menu.placeholder')} />\n </SelectTrigger>\n </FormField>\n <SelectContent>\n {choices.map((choice) => <SelectItem key={choice.value} value={choice.value} disabled={choice.disabled} leading={kind === 'basic' ? undefined : <MenuVisual kind={kind} alternative={choice.alternative} />}>\n {choice.label}\n </SelectItem>)}\n </SelectContent>\n </Select>\n )\n}\n\nexport function SelectSourceMatrix({ size = 36, state = 'filled' }: { size?: 32 | 36 | 40; state?: 'default' | 'filled' | 'disabled' | 'error' }) {\n return <div className=\"grid w-full gap-6 sm:grid-cols-2 xl:grid-cols-3\">{selectKinds.map((kind) => <SelectSourceExample key={kind} kind={kind} size={size} state={state} />)}</div>\n}\n\nexport function DropdownSourceExample({ size = 36, empty = false }: { size?: 36 | 56; empty?: boolean }) {\n const t = useT()\n const [open, setOpen] = React.useState(false)\n const [value, setValue] = React.useState('basic')\n const [query, setQuery] = React.useState(empty ? 'zzzz' : '')\n const [workspaceCount, setWorkspaceCount] = React.useState(0)\n return (\n <div className=\"flex w-full flex-col items-start gap-3\">\n <Dropdown open={open} onOpenChange={setOpen}>\n <DropdownTrigger asChild><Button variant=\"outline\">{t('design_system.gallery.samples.menu.openDropdown')}</Button></DropdownTrigger>\n <DropdownContent className=\"w-96 max-w-full\" aria-label={t('design_system.gallery.samples.menu.openDropdown')} commandProps={{ label: t('design_system.gallery.samples.menu.options') }}>\n <DropdownInput value={query} onValueChange={setQuery} aria-label={t('design_system.gallery.samples.menu.search')} placeholder={t('design_system.gallery.samples.menu.search')} />\n <DropdownList>\n <DropdownEmpty>{t('design_system.gallery.samples.menu.noResults')}</DropdownEmpty>\n {selectKinds.map((kind) => {\n const label = t(`design_system.gallery.samples.menu.${kind}.0`)\n return <DropdownItem key={kind} value={label} size={size} checked={value === kind} leading={<MenuVisual kind={kind} large={size === 56} />}\n description={size === 56 ? t('design_system.gallery.samples.menu.description') : undefined}\n sublabel={kind === 'basic' ? t('design_system.gallery.samples.menu.sublabel') : undefined}\n badge={kind === 'brand' ? <Badge appearance=\"lighter\" tone=\"info\" size={20}>{t('design_system.gallery.samples.menu.new')}</Badge> : undefined}\n shortcut={kind === 'company' ? <Kbd>\u23181</Kbd> : undefined}\n onSelect={() => { setValue(kind); setOpen(false) }}>\n {label}\n </DropdownItem>\n })}\n <DropdownItem value={t('design_system.gallery.samples.menu.unavailable')} size={size} disabled leading={<MenuVisual kind=\"basic\" large={size === 56} />}>{t('design_system.gallery.samples.menu.unavailable')}</DropdownItem>\n </DropdownList>\n <DropdownFooter><Button variant=\"outline\" size=\"sm\" className=\"w-full\" onClick={() => { setWorkspaceCount((count) => count + 1); setOpen(false) }}><Plus className=\"size-5\" />{t('design_system.gallery.samples.menu.addWorkspace')}</Button></DropdownFooter>\n <DropdownCaption>{t('design_system.gallery.samples.menu.localCaption')}</DropdownCaption>\n </DropdownContent>\n </Dropdown>\n <output aria-live=\"polite\" className=\"text-sm text-muted-foreground\">{t('design_system.gallery.samples.menu.selected', { value: t(`design_system.gallery.samples.menu.${value}.0`) })}</output>\n {workspaceCount > 0 && <output aria-live=\"polite\" className=\"text-sm text-muted-foreground\">{t('design_system.gallery.samples.menu.created', { count: workspaceCount })}</output>}\n </div>\n )\n}\n\nfunction CommandSourceRows({ size, onSelect }: { size: 40 | 64; onSelect: (value: string) => void }) {\n const t = useT()\n return <>{commandKinds.map((kind) => {\n const label = t(`design_system.gallery.samples.menu.${kind}.0`)\n return <CommandMenuItem key={kind} value={label} size={size} leading={kind === 'basic' ? undefined : <MenuVisual kind={kind} large={size === 64} />}\n description={size === 64 ? t('design_system.gallery.samples.menu.description') : undefined}\n sublabel={kind === 'basic' ? t('design_system.gallery.samples.menu.sublabel') : undefined}\n badge={kind === 'brand' ? <Badge appearance=\"lighter\" tone=\"info\" size={20}>{t('design_system.gallery.samples.menu.new')}</Badge> : undefined}\n shortcut={kind === 'company' ? <Kbd>\u2318K</Kbd> : undefined}\n onSelect={() => onSelect(label)}>{label}</CommandMenuItem>\n })}</>\n}\n\nexport function CommandSourceExample({ size = 40, empty = false, withGroups = false }: { size?: 40 | 64; empty?: boolean; withGroups?: boolean }) {\n const t = useT()\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState(empty ? 'zzzz' : '')\n const [result, setResult] = React.useState('')\n const onSelect = (label: string) => { setResult(label); setOpen(false) }\n const rows = <CommandSourceRows size={size} onSelect={onSelect} />\n return (\n <div className=\"flex flex-col items-start gap-3\">\n <CommandMenu open={open} onOpenChange={setOpen}>\n <CommandMenuTrigger asChild><Button variant=\"outline\">{t('design_system.gallery.samples.menu.openCommand')}</Button></CommandMenuTrigger>\n <CommandMenuContent title={t('design_system.gallery.samples.menu.openCommand')} commandProps={{ loop: true }}>\n <CommandMenuInput appearance=\"source\" value={query} onValueChange={setQuery} aria-label={t('design_system.gallery.samples.menu.search')} placeholder={t('design_system.gallery.samples.menu.search')}\n trailing={<SimpleTooltip content={t('design_system.gallery.samples.menu.hint')}><Button variant=\"ghost\" size=\"2xs\" aria-label={t('design_system.gallery.samples.menu.help')}><Info className=\"size-5\" /></Button></SimpleTooltip>} />\n <CommandMenuList>\n <CommandMenuEmpty>{t('design_system.gallery.samples.menu.noResults')}</CommandMenuEmpty>\n {withGroups ? <CommandMenuGroup heading={t('design_system.gallery.samples.menu.caption')} actionLabel={t('design_system.gallery.samples.menu.seeAll')} onAction={() => setQuery('')}>{rows}</CommandMenuGroup> : rows}\n {withGroups && <><CommandMenuSeparator /><CommandMenuGroup heading={t('design_system.gallery.samples.menu.unavailable')}><CommandMenuItem value=\"unavailable\" disabled size={size}>{t('design_system.gallery.samples.menu.unavailable')}</CommandMenuItem></CommandMenuGroup></>}\n </CommandMenuList>\n <CommandMenuFooter className=\"min-h-12 flex-wrap px-5 py-3.5\" helpSlot={<Button variant=\"link\" size=\"2xs\" onClick={() => setResult(t('design_system.gallery.samples.menu.hint'))}>{t('design_system.gallery.samples.menu.help')}</Button>} />\n </CommandMenuContent>\n </CommandMenu>\n {result && <output aria-live=\"polite\" className=\"text-sm text-muted-foreground\">{t('design_system.gallery.samples.menu.selected', { value: result })}</output>}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "@open-mercato/shared/lib/utils";
4
+ import { useLocale, useT } from "@open-mercato/shared/lib/i18n/context";
5
+ import { Rating } from "@open-mercato/ui/primitives/rating";
6
+ import { LinkButton } from "@open-mercato/ui/primitives/link-button";
7
+ import { Button } from "@open-mercato/ui/primitives/button";
8
+ import { ScrollArea } from "@open-mercato/ui/primitives/scroll-area";
9
+ import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@open-mercato/ui/primitives/dialog";
10
+ function RatingCellDemo({ icon, initialValue = 0, max = 1, disabled = false }) {
11
+ const t = useT();
12
+ const [value, setValue] = React.useState(initialValue);
13
+ return /* @__PURE__ */ jsx(Rating, { value, onChange: setValue, max, icon, appearance: "cell", disabled, "aria-label": t("design_system.gallery.samples.rating.label") });
14
+ }
15
+ function RatingReviewDemo({ icon, alignment }) {
16
+ const t = useT();
17
+ const locale = useLocale();
18
+ const [open, setOpen] = React.useState(false);
19
+ const value = new Intl.NumberFormat(locale).format(4.5);
20
+ const count = new Intl.NumberFormat(locale, { notation: "compact", maximumFractionDigits: 1 }).format(5200);
21
+ const summary = t("design_system.gallery.samples.rating.summary", "{value} \u2219 {count} Ratings", { value, count });
22
+ const reviews = t("design_system.gallery.samples.rating.reviews", "{count} reviews", { count: 18 });
23
+ return /* @__PURE__ */ jsxs(Dialog, { open, onOpenChange: setOpen, children: [
24
+ /* @__PURE__ */ jsxs("div", { "data-slot": "rating-review", "data-alignment": alignment, className: cn("inline-flex max-w-full items-start gap-2", alignment === "vertical" ? "flex-col" : "flex-wrap"), children: [
25
+ /* @__PURE__ */ jsx(Rating, { value: 4.5, allowHalf: true, icon }),
26
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start gap-1 text-sm leading-5", children: [
27
+ /* @__PURE__ */ jsx("span", { children: summary }),
28
+ /* @__PURE__ */ jsx(LinkButton, { asChild: true, variant: "gray", underline: "always", children: /* @__PURE__ */ jsx(DialogTrigger, { children: reviews }) })
29
+ ] })
30
+ ] }),
31
+ /* @__PURE__ */ jsxs(DialogContent, { onKeyDownCapture: (event) => {
32
+ if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
33
+ event.preventDefault();
34
+ setOpen(false);
35
+ }
36
+ }, children: [
37
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
38
+ /* @__PURE__ */ jsx(DialogTitle, { children: reviews }),
39
+ /* @__PURE__ */ jsx(DialogDescription, { children: summary })
40
+ ] }),
41
+ /* @__PURE__ */ jsx(ScrollArea, { className: "h-72", scrollbarSize: "md", children: /* @__PURE__ */ jsx("ol", { className: "flex flex-col gap-3 pr-6", children: Array.from({ length: 18 }, (_, index) => /* @__PURE__ */ jsxs("li", { className: "flex items-center justify-between gap-3 text-sm", children: [
42
+ /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.samples.rating.reviewNumber", "Review {number}", { number: index + 1 }) }),
43
+ /* @__PURE__ */ jsx(Rating, { value: index < 9 ? 5 : 4, icon })
44
+ ] }, index)) }) }),
45
+ /* @__PURE__ */ jsx(DialogFooter, { children: /* @__PURE__ */ jsx(Button, { asChild: true, variant: "outline", children: /* @__PURE__ */ jsx(DialogClose, { children: t("common.close") }) }) })
46
+ ] })
47
+ ] });
48
+ }
49
+ export {
50
+ RatingCellDemo,
51
+ RatingReviewDemo
52
+ };
53
+ //# sourceMappingURL=rating-reviews.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/demos/rating-reviews.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Rating } from '@open-mercato/ui/primitives/rating'\nimport { LinkButton } from '@open-mercato/ui/primitives/link-button'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ScrollArea } from '@open-mercato/ui/primitives/scroll-area'\nimport { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@open-mercato/ui/primitives/dialog'\n\nexport function RatingCellDemo({ icon, initialValue = 0, max = 1, disabled = false }: { icon: 'star' | 'heart'; initialValue?: number; max?: number; disabled?: boolean }) {\n const t = useT()\n const [value, setValue] = React.useState(initialValue)\n return <Rating value={value} onChange={setValue} max={max} icon={icon} appearance=\"cell\" disabled={disabled} aria-label={t('design_system.gallery.samples.rating.label')} />\n}\n\nexport function RatingReviewDemo({ icon, alignment }: { icon: 'star' | 'heart'; alignment: 'vertical' | 'horizontal' }) {\n const t = useT()\n const locale = useLocale()\n const [open, setOpen] = React.useState(false)\n const value = new Intl.NumberFormat(locale).format(4.5)\n const count = new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: 1 }).format(5200)\n const summary = t('design_system.gallery.samples.rating.summary', '{value} \u2219 {count} Ratings', { value, count })\n const reviews = t('design_system.gallery.samples.rating.reviews', '{count} reviews', { count: 18 })\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <div data-slot=\"rating-review\" data-alignment={alignment} className={cn('inline-flex max-w-full items-start gap-2', alignment === 'vertical' ? 'flex-col' : 'flex-wrap')}>\n <Rating value={4.5} allowHalf icon={icon} />\n <div className=\"flex flex-wrap items-start gap-1 text-sm leading-5\">\n <span>{summary}</span>\n <LinkButton asChild variant=\"gray\" underline=\"always\"><DialogTrigger>{reviews}</DialogTrigger></LinkButton>\n </div>\n </div>\n <DialogContent onKeyDownCapture={event => { if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) { event.preventDefault(); setOpen(false) } }}>\n <DialogHeader><DialogTitle>{reviews}</DialogTitle><DialogDescription>{summary}</DialogDescription></DialogHeader>\n <ScrollArea className=\"h-72\" scrollbarSize=\"md\">\n <ol className=\"flex flex-col gap-3 pr-6\">\n {Array.from({ length: 18 }, (_, index) => <li key={index} className=\"flex items-center justify-between gap-3 text-sm\"><span>{t('design_system.gallery.samples.rating.reviewNumber', 'Review {number}', { number: index + 1 })}</span><Rating value={index < 9 ? 5 : 4} icon={icon} /></li>)}\n </ol>\n </ScrollArea>\n <DialogFooter><Button asChild variant=\"outline\"><DialogClose>{t('common.close')}</DialogClose></Button></DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
+ "mappings": "AAYS,cAeD,YAfC;AAZT,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,WAAW,YAAY;AAChC,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,QAAQ,aAAa,eAAe,mBAAmB,cAAc,cAAc,aAAa,qBAAqB;AAEvH,SAAS,eAAe,EAAE,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,MAAM,GAAwF;AACzK,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,YAAY;AACrD,SAAO,oBAAC,UAAO,OAAc,UAAU,UAAU,KAAU,MAAY,YAAW,QAAO,UAAoB,cAAY,EAAE,4CAA4C,GAAG;AAC5K;AAEO,SAAS,iBAAiB,EAAE,MAAM,UAAU,GAAqE;AACtH,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAC5C,QAAM,QAAQ,IAAI,KAAK,aAAa,MAAM,EAAE,OAAO,GAAG;AACtD,QAAM,QAAQ,IAAI,KAAK,aAAa,QAAQ,EAAE,UAAU,WAAW,uBAAuB,EAAE,CAAC,EAAE,OAAO,IAAI;AAC1G,QAAM,UAAU,EAAE,gDAAgD,kCAA6B,EAAE,OAAO,MAAM,CAAC;AAC/G,QAAM,UAAU,EAAE,gDAAgD,mBAAmB,EAAE,OAAO,GAAG,CAAC;AAClG,SACE,qBAAC,UAAO,MAAY,cAAc,SAChC;AAAA,yBAAC,SAAI,aAAU,iBAAgB,kBAAgB,WAAW,WAAW,GAAG,4CAA4C,cAAc,aAAa,aAAa,WAAW,GACrK;AAAA,0BAAC,UAAO,OAAO,KAAK,WAAS,MAAC,MAAY;AAAA,MAC1C,qBAAC,SAAI,WAAU,sDACb;AAAA,4BAAC,UAAM,mBAAQ;AAAA,QACf,oBAAC,cAAW,SAAO,MAAC,SAAQ,QAAO,WAAU,UAAS,8BAAC,iBAAe,mBAAQ,GAAgB;AAAA,SAChG;AAAA,OACF;AAAA,IACA,qBAAC,iBAAc,kBAAkB,WAAS;AAAE,UAAI,MAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,UAAU;AAAE,cAAM,eAAe;AAAG,gBAAQ,KAAK;AAAA,MAAE;AAAA,IAAE,GACpJ;AAAA,2BAAC,gBAAa;AAAA,4BAAC,eAAa,mBAAQ;AAAA,QAAc,oBAAC,qBAAmB,mBAAQ;AAAA,SAAoB;AAAA,MAClG,oBAAC,cAAW,WAAU,QAAO,eAAc,MACzC,8BAAC,QAAG,WAAU,4BACX,gBAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,UAAU,qBAAC,QAAe,WAAU,mDAAkD;AAAA,4BAAC,UAAM,YAAE,qDAAqD,mBAAmB,EAAE,QAAQ,QAAQ,EAAE,CAAC,GAAE;AAAA,QAAO,oBAAC,UAAO,OAAO,QAAQ,IAAI,IAAI,GAAG,MAAY;AAAA,WAAhO,KAAkO,CAAK,GAC5R,GACF;AAAA,MACA,oBAAC,gBAAa,8BAAC,UAAO,SAAO,MAAC,SAAQ,WAAU,8BAAC,eAAa,YAAE,cAAc,GAAE,GAAc,GAAS;AAAA,OACzG;AAAA,KACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,104 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
4
+ import { LUCIDE_ICON_REGISTRY } from "@open-mercato/ui/backend/icons/lucideRegistry";
5
+ import { SearchInput } from "@open-mercato/ui/primitives/search-input";
6
+ import { Button } from "@open-mercato/ui/primitives/button";
7
+ import { Pagination } from "@open-mercato/ui/primitives/pagination";
8
+ import { EmptyState } from "@open-mercato/ui/primitives/empty-state";
9
+ import { Popover, PopoverClose, PopoverContent, PopoverTrigger } from "@open-mercato/ui/primitives/popover";
10
+ import { flash } from "@open-mercato/ui/backend/FlashMessages";
11
+ function pascalCase(registryName) {
12
+ return registryName.split(/[-_]/).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
13
+ }
14
+ function IconTile({ name }) {
15
+ const t = useT();
16
+ const Icon = LUCIDE_ICON_REGISTRY[name];
17
+ const jsxSnippet = `<${pascalCase(name)} aria-hidden className="size-4" />`;
18
+ const copy = React.useCallback(async (payload) => {
19
+ try {
20
+ await navigator.clipboard.writeText(payload);
21
+ flash(t("design_system.gallery.iconCopied", "Copied: {snippet}", { snippet: payload }), "success");
22
+ } catch {
23
+ flash(t("design_system.gallery.copyFailed", "Could not copy the snippet"), "error");
24
+ }
25
+ }, [t]);
26
+ return /* @__PURE__ */ jsxs(Popover, { children: [
27
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
28
+ Button,
29
+ {
30
+ type: "button",
31
+ variant: "ghost",
32
+ className: "h-auto min-h-28 min-w-0 flex-col gap-3 whitespace-normal rounded-lg border border-border bg-background p-3",
33
+ children: [
34
+ /* @__PURE__ */ jsx(Icon, { "aria-hidden": true, className: "size-7 text-foreground", strokeWidth: 1.75 }),
35
+ /* @__PURE__ */ jsx("code", { className: "max-w-full break-words text-xs leading-4 text-muted-foreground", children: name })
36
+ ]
37
+ }
38
+ ) }),
39
+ /* @__PURE__ */ jsx(PopoverContent, { align: "center", className: "w-auto max-w-xs p-2", children: /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
40
+ /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsxs(
41
+ Button,
42
+ {
43
+ type: "button",
44
+ variant: "ghost",
45
+ onClick: () => copy(name),
46
+ className: "h-auto 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",
47
+ children: [
48
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: t("design_system.gallery.iconCopyMeta", "Copy name for page.meta icon") }),
49
+ /* @__PURE__ */ jsx("code", { className: "text-xs text-muted-foreground", children: name })
50
+ ]
51
+ }
52
+ ) }),
53
+ /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsxs(
54
+ Button,
55
+ {
56
+ type: "button",
57
+ variant: "ghost",
58
+ onClick: () => copy(jsxSnippet),
59
+ className: "h-auto 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-xs text-muted-foreground", children: jsxSnippet })
63
+ ]
64
+ }
65
+ ) })
66
+ ] }) })
67
+ ] });
68
+ }
69
+ function IconGrid({ collectionControl } = {}) {
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 [page, setPage] = React.useState(1);
74
+ const needle = query.trim().toLowerCase();
75
+ const filtered = needle ? names.filter((name) => name.toLowerCase().includes(needle)) : names;
76
+ const visible = filtered.slice((page - 1) * 48, page * 48);
77
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
78
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
79
+ collectionControl,
80
+ /* @__PURE__ */ jsx("div", { className: "max-w-sm flex-1", children: /* @__PURE__ */ jsx(
81
+ SearchInput,
82
+ {
83
+ value: query,
84
+ onChange: (value) => {
85
+ setQuery(value);
86
+ setPage(1);
87
+ },
88
+ placeholder: t("design_system.gallery.iconSearchPlaceholder", "Filter icons\u2026"),
89
+ "aria-label": t("design_system.gallery.iconSearchPlaceholder", "Filter icons\u2026")
90
+ }
91
+ ) }),
92
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: needle ? t("design_system.gallery.iconCountFiltered", "{visible} of {total} icons", {
93
+ visible: filtered.length,
94
+ total: names.length
95
+ }) : t("design_system.gallery.iconCountAll", "{total} icons", { total: names.length }) })
96
+ ] }),
97
+ visible.length ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4 lg:grid-cols-6", children: visible.map((name) => /* @__PURE__ */ jsx(IconTile, { name }, name)) }) : /* @__PURE__ */ jsx(EmptyState, { title: t("design_system.gallery.noResults") }),
98
+ filtered.length > 48 ? /* @__PURE__ */ jsx(Pagination, { page, pageSize: 48, total: filtered.length, showPageSize: false, onPageChange: setPage, "aria-label": t("design_system.gallery.sourceIcons.pages") }) : null
99
+ ] });
100
+ }
101
+ export {
102
+ IconGrid
103
+ };
104
+ //# sourceMappingURL=registered-icons.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/demos/registered-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 { Button } from '@open-mercato/ui/primitives/button'\nimport { Pagination } from '@open-mercato/ui/primitives/pagination'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Popover, PopoverClose, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\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\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 variant=\"ghost\"\n className=\"h-auto min-h-28 min-w-0 flex-col gap-3 whitespace-normal rounded-lg border border-border bg-background p-3\"\n >\n <Icon aria-hidden className=\"size-7 text-foreground\" strokeWidth={1.75} />\n <code className=\"max-w-full break-words text-xs leading-4 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 variant=\"ghost\"\n onClick={() => copy(name)}\n className=\"h-auto 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-xs text-muted-foreground\">{name}</code>\n </Button>\n </PopoverClose>\n <PopoverClose asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => copy(jsxSnippet)}\n className=\"h-auto 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-xs text-muted-foreground\">{jsxSnippet}</code>\n </Button>\n </PopoverClose>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport function IconGrid({ collectionControl }: { collectionControl?: React.ReactNode } = {}) {\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 [page, setPage] = React.useState(1)\n const needle = query.trim().toLowerCase()\n const filtered = needle ? names.filter((name) => name.toLowerCase().includes(needle)) : names\n const visible = filtered.slice((page - 1) * 48, page * 48)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n {collectionControl}\n <div className=\"max-w-sm flex-1\">\n <SearchInput\n value={query}\n onChange={value => { setQuery(value); setPage(1) }}\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: filtered.length,\n total: names.length,\n })\n : t('design_system.gallery.iconCountAll', '{total} icons', { total: names.length })}\n </p>\n </div>\n {visible.length ? <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4 lg:grid-cols-6\">\n {visible.map((name) => (\n <IconTile key={name} name={name} />\n ))}\n </div> : <EmptyState title={t('design_system.gallery.noResults')} />}\n {filtered.length > 48 ? <Pagination page={page} pageSize={48} total={filtered.length} showPageSize={false} onPageChange={setPage} aria-label={t('design_system.gallery.sourceIcons.pages')} /> : null}\n </div>\n )\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,99 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Settings } from "lucide-react";
4
+ import { cn } from "@open-mercato/shared/lib/utils";
5
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
6
+ import { Avatar } from "@open-mercato/ui/primitives/avatar";
7
+ import { Badge } from "@open-mercato/ui/primitives/badge";
8
+ import { Button } from "@open-mercato/ui/primitives/button";
9
+ import { CheckboxField } from "@open-mercato/ui/primitives/checkbox-field";
10
+ import { RadioGroup } from "@open-mercato/ui/primitives/radio";
11
+ import { RadioField } from "@open-mercato/ui/primitives/radio-field";
12
+ import { Switch } from "@open-mercato/ui/primitives/switch";
13
+ import { SwitchField } from "@open-mercato/ui/primitives/switch-field";
14
+ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@open-mercato/ui/primitives/dialog";
15
+ import avatar from "../assets/avatar-photo.png";
16
+ import mastercard from "../assets/menu-mastercard.svg";
17
+ import spotify from "../assets/menu-spotify.svg";
18
+ import company from "../assets/menu-apex.svg";
19
+ import { selectionArtwork } from "../assets/selection-artwork.js";
20
+ const imageSource = (asset) => typeof asset === "string" ? asset : asset.src;
21
+ const selectionSourceCardClassName = "relative flex w-90 max-w-full items-start gap-3.5 rounded-selection-card bg-background p-4 ring-1 ring-inset ring-border shadow-xs transition-colors hover:bg-muted hover:shadow-none has-[[data-state=checked]]:ring-accent-indigo has-[[data-state=checked]]:shadow-none has-[:focus-visible]:shadow-focus [&_label]:after:absolute [&_label]:after:inset-0 [&_label]:after:rounded-selection-card [&_button]:relative [&_button]:z-10";
22
+ function SelectionLeading({ kind }) {
23
+ if (kind === "avatar") return /* @__PURE__ */ jsx(Avatar, { label: "James Brown", size: 40, src: imageSource(avatar), "aria-hidden": "true" });
24
+ const source = kind === "icon" ? selectionArtwork.keyIcon : imageSource(kind === "provider" ? mastercard : kind === "brand" ? spotify : company);
25
+ return /* @__PURE__ */ jsx("img", { src: source, alt: "", "aria-hidden": "true", className: kind === "provider" ? "h-6 w-8 shrink-0 object-contain" : "size-10 shrink-0 object-contain" });
26
+ }
27
+ function SourceSelectionCard({ control, kind, state }) {
28
+ const t = useT();
29
+ const disabled = state === "disabled";
30
+ const fields = {
31
+ label: t("design_system.gallery.samples.selection.label"),
32
+ sublabel: t("design_system.gallery.samples.selection.sublabel"),
33
+ description: t("design_system.gallery.samples.selection.description"),
34
+ badge: /* @__PURE__ */ jsx(Badge, { size: 16, appearance: disabled ? "stroke" : "light", tone: disabled ? "neutral" : "info", className: disabled ? "border-border text-text-disabled" : void 0, children: t("design_system.gallery.samples.selection.new") }),
35
+ disabled,
36
+ containerClassName: "min-w-0 flex-1 gap-3.5",
37
+ contentClassName: disabled ? "[&_label]:text-text-disabled [&_label]:opacity-100 [&_p]:text-text-disabled [&_span]:text-text-disabled" : void 0,
38
+ className: cn("mt-0", disabled && control !== "switch" && "disabled:opacity-100 disabled:data-[state=checked]:bg-bg-disabled disabled:data-[state=checked]:border-border-disabled disabled:data-[state=checked]:text-background")
39
+ };
40
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "selection-source-card", "data-kind": kind, "data-disabled": disabled, className: cn(selectionSourceCardClassName, disabled && "shadow-none hover:bg-background has-[[data-state=checked]]:ring-border"), children: [
41
+ /* @__PURE__ */ jsx(SelectionLeading, { kind }),
42
+ control === "radio" ? /* @__PURE__ */ jsx(RadioField, { value: state, flip: true, ...fields }) : control === "switch" ? /* @__PURE__ */ jsx(SwitchField, { defaultChecked: state === "active", ...fields }) : /* @__PURE__ */ jsx(CheckboxField, { defaultChecked: state !== "default", flip: true, ...fields })
43
+ ] });
44
+ }
45
+ function SelectionSourceCardsDemo({ control, kind }) {
46
+ const t = useT();
47
+ if (control === "radio") return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
48
+ /* @__PURE__ */ jsxs(RadioGroup, { defaultValue: "active", "aria-label": t("design_system.gallery.samples.selection.preferences"), className: "gap-3", children: [
49
+ /* @__PURE__ */ jsx(SourceSelectionCard, { control, kind, state: "default" }),
50
+ /* @__PURE__ */ jsx(SourceSelectionCard, { control, kind, state: "active" })
51
+ ] }),
52
+ /* @__PURE__ */ jsx(RadioGroup, { value: "disabled", disabled: true, "aria-label": t("design_system.gallery.samples.selection.preferences"), children: /* @__PURE__ */ jsx(SourceSelectionCard, { control, kind, state: "disabled" }) })
53
+ ] });
54
+ return /* @__PURE__ */ jsx("div", { className: "grid gap-3", children: ["default", "active", "disabled"].map((state) => /* @__PURE__ */ jsx(SourceSelectionCard, { control, kind, state }, state)) });
55
+ }
56
+ function IntegrationSwitchDemo({ alignment, appearance }) {
57
+ const t = useT();
58
+ const id = React.useId();
59
+ const [checked, setChecked] = React.useState(false);
60
+ const [open, setOpen] = React.useState(false);
61
+ const horizontal = alignment === "horizontal";
62
+ const card = appearance === "card";
63
+ return /* @__PURE__ */ jsxs(Dialog, { open, onOpenChange: setOpen, children: [
64
+ /* @__PURE__ */ jsxs("div", { "data-slot": "integration-switch", "data-alignment": alignment, "data-appearance": appearance, className: cn("relative flex max-w-full gap-3.5", horizontal ? "w-154 flex-wrap items-center sm:flex-nowrap" : "w-95 flex-col items-start", card && "rounded-selection-card bg-background p-4 ring-1 ring-inset ring-border shadow-xs"), children: [
65
+ /* @__PURE__ */ jsx("img", { src: card ? selectionArtwork.officeCard : selectionArtwork.officeList, alt: "", className: cn("shrink-0", card ? "size-10" : "size-12") }),
66
+ /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-col gap-1", horizontal && "min-w-40 flex-1"), children: [
67
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
68
+ /* @__PURE__ */ jsx("span", { id, className: cn("font-medium text-foreground", card ? "text-sm leading-5" : "text-base leading-6"), children: "Microsoft Office 365" }),
69
+ /* @__PURE__ */ jsx(Badge, { size: 16, appearance: "light", tone: "info", children: t("design_system.gallery.samples.selection.new") })
70
+ ] }),
71
+ /* @__PURE__ */ jsx("p", { className: cn("text-muted-foreground", card ? "text-xs leading-4" : "text-sm leading-5"), children: t("design_system.gallery.samples.selection.integrationDescription") })
72
+ ] }),
73
+ /* @__PURE__ */ jsx(Button, { asChild: true, variant: "outline", size: "default", className: horizontal ? void 0 : "w-full", children: /* @__PURE__ */ jsxs(DialogTrigger, { children: [
74
+ /* @__PURE__ */ jsx(Settings, { "aria-hidden": "true" }),
75
+ t("design_system.gallery.samples.selection.integrationManage")
76
+ ] }) }),
77
+ /* @__PURE__ */ jsx(Switch, { "aria-labelledby": id, checked, onCheckedChange: setChecked, className: horizontal ? void 0 : card ? "absolute top-5 right-5" : "absolute top-3 right-3" })
78
+ ] }),
79
+ /* @__PURE__ */ jsxs(DialogContent, { onKeyDownCapture: (event) => {
80
+ if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
81
+ event.preventDefault();
82
+ setOpen(false);
83
+ }
84
+ }, children: [
85
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
86
+ /* @__PURE__ */ jsx(DialogTitle, { children: t("design_system.gallery.samples.selection.integrationDialog") }),
87
+ /* @__PURE__ */ jsx(DialogDescription, { children: t("design_system.gallery.samples.selection.integrationDescription") })
88
+ ] }),
89
+ /* @__PURE__ */ jsx(SwitchField, { label: t("design_system.gallery.samples.selection.integrationEnabled"), checked, onCheckedChange: setChecked }),
90
+ /* @__PURE__ */ jsx(DialogFooter, { children: /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => setOpen(false), children: t("common.close") }) })
91
+ ] })
92
+ ] });
93
+ }
94
+ export {
95
+ IntegrationSwitchDemo,
96
+ SelectionSourceCardsDemo,
97
+ selectionSourceCardClassName
98
+ };
99
+ //# sourceMappingURL=selection-cards.js.map