@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,82 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { GalleryLink as Link } from "./GalleryLink.js";
5
+ import { ChevronRight, Menu, X } from "lucide-react";
6
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
7
+ import { cn } from "@open-mercato/shared/lib/utils";
8
+ import { Button } from "@open-mercato/ui/primitives/button";
9
+ import { IconButton } from "@open-mercato/ui/primitives/icon-button";
10
+ import { Skeleton } from "@open-mercato/ui/primitives/skeleton";
11
+ import { useInjectedMenuItems } from "@open-mercato/ui/backend/injection/useInjectedMenuItems";
12
+ import { mergeMenuItems } from "@open-mercato/ui/backend/injection/mergeMenuItems";
13
+ import { resolveInjectedIcon } from "@open-mercato/ui/backend/injection/resolveInjectedIcon";
14
+ function GalleryNavigation({ sections, activePath, activeFamilyId, onExpand, onNavigate, failed, onRetry }) {
15
+ const t = useT();
16
+ const prefix = React.useId();
17
+ const [mobileOpen, setMobileOpen] = React.useState(false);
18
+ const [expanded, setExpanded] = React.useState({});
19
+ const { items: injectedItems } = useInjectedMenuItems("menu:sidebar:settings:design_system");
20
+ React.useEffect(() => {
21
+ if (activeFamilyId) setExpanded((previous) => ({ ...previous, [activeFamilyId]: true }));
22
+ setMobileOpen(false);
23
+ }, [activeFamilyId, activePath]);
24
+ const navigate = () => {
25
+ setMobileOpen(false);
26
+ onNavigate();
27
+ };
28
+ const itemLabel = (item) => t(item.labelKey ?? item.label, item.label);
29
+ const renderLink = (item, nested = false) => {
30
+ const active = activePath === item.href;
31
+ return /* @__PURE__ */ jsx(Button, { asChild: true, variant: "ghost", size: "sm", className: cn("w-full min-w-0 justify-start gap-2 rounded-md px-3 text-left text-sm font-normal text-muted-foreground", !nested && "w-0 flex-1", active && "bg-accent font-semibold text-accent-foreground", nested && "border-l-2 rounded-l-none", nested && (active ? "border-foreground" : "border-transparent")), children: /* @__PURE__ */ jsxs(Link, { href: item.href, "aria-current": active ? "page" : void 0, onClick: navigate, children: [
32
+ !nested && item.icon ? /* @__PURE__ */ jsx("span", { className: "shrink-0", "aria-hidden": true, children: item.icon }) : null,
33
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: itemLabel(item) })
34
+ ] }) });
35
+ };
36
+ const renderItem = (item) => {
37
+ const expandable = item.children !== void 0;
38
+ const open = expanded[item.id] ?? false;
39
+ const label = itemLabel(item);
40
+ const contentId = `${prefix}-${item.id}`;
41
+ return /* @__PURE__ */ jsxs("li", { className: "min-w-0", children: [
42
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [
43
+ renderLink(item),
44
+ expandable ? /* @__PURE__ */ jsx(IconButton, { type: "button", variant: "ghost", size: "sm", className: "shrink-0 text-muted-foreground", "aria-label": t(open ? "design_system.gallery.navigation.collapse" : "design_system.gallery.navigation.expand", { category: label }), "aria-expanded": open, "aria-controls": contentId, onClick: () => {
45
+ setExpanded((previous) => ({ ...previous, [item.id]: !open }));
46
+ if (!open) onExpand(item.id);
47
+ }, children: /* @__PURE__ */ jsx(ChevronRight, { className: cn("size-4 transition-transform", open && "rotate-90") }) }) : null
48
+ ] }),
49
+ expandable && open ? /* @__PURE__ */ jsx("div", { id: contentId, className: "mb-2 ml-5 mt-1 border-l border-border pl-2", children: failed[item.id] ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onRetry(item.id), children: t("design_system.gallery.retry") }) : item.children?.length ? /* @__PURE__ */ jsx("ul", { className: "space-y-0.5", children: item.children.map((child) => /* @__PURE__ */ jsx("li", { children: renderLink(child, true) }, child.id)) }) : /* @__PURE__ */ jsxs("div", { className: "space-y-2 p-2", role: "status", "aria-label": t("common.loading", "Loading\u2026"), children: [
50
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-5 w-3/4" }),
51
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-5 w-1/2" })
52
+ ] }) }) : null
53
+ ] }, item.id);
54
+ };
55
+ return /* @__PURE__ */ jsxs("aside", { className: "sticky top-16 z-20 min-w-0 bg-background lg:top-20 lg:w-60 lg:shrink-0 lg:self-start lg:border-r lg:border-border", children: [
56
+ /* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", className: "my-2 w-full justify-between lg:hidden", "aria-expanded": mobileOpen, "aria-controls": `${prefix}-navigation`, onClick: () => setMobileOpen((value) => !value), children: [
57
+ t("design_system.gallery.navigation.browse"),
58
+ mobileOpen ? /* @__PURE__ */ jsx(X, { "aria-hidden": true }) : /* @__PURE__ */ jsx(Menu, { "aria-hidden": true })
59
+ ] }),
60
+ /* @__PURE__ */ jsxs("nav", { id: `${prefix}-navigation`, "aria-label": t("design_system.gallery.navigation.label"), className: cn("max-h-screen overflow-y-auto overscroll-contain py-4 pr-3 pb-24 lg:block", !mobileOpen && "hidden"), children: [
61
+ /* @__PURE__ */ jsx(Link, { href: "/backend/design-system", onClick: navigate, className: "mb-5 block px-3 text-base font-semibold tracking-tight", children: t("design_system.nav.title") }),
62
+ /* @__PURE__ */ jsx("div", { className: "space-y-5", children: sections.map((section) => {
63
+ const additions = injectedItems.filter((item) => (item.groupId ?? section.id) === section.id);
64
+ const items = mergeMenuItems(section.items.map((item) => ({ id: item.id, item })), additions).flatMap((item) => {
65
+ if (item.source === "built-in") {
66
+ const original = section.items.find((candidate) => candidate.id === item.id);
67
+ return original ? [original] : [];
68
+ }
69
+ return item.href ? [{ id: item.id, label: item.label ?? item.id, labelKey: item.labelKey, href: item.href, icon: resolveInjectedIcon(item.icon) }] : [];
70
+ });
71
+ return /* @__PURE__ */ jsxs("section", { children: [
72
+ section.label ? /* @__PURE__ */ jsx("p", { className: "mb-2 px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground", children: t(section.labelKey ?? section.label, section.label) }) : null,
73
+ /* @__PURE__ */ jsx("ul", { className: "space-y-1", children: items.map((item) => renderItem(item)) })
74
+ ] }, section.id);
75
+ }) })
76
+ ] })
77
+ ] });
78
+ }
79
+ export {
80
+ GalleryNavigation
81
+ };
82
+ //# sourceMappingURL=GalleryNavigation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/components/GalleryNavigation.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { GalleryLink as Link } from './GalleryLink'\nimport { ChevronRight, Menu, X } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Skeleton } from '@open-mercato/ui/primitives/skeleton'\nimport type { SectionNavGroup, SectionNavItem } from '@open-mercato/ui/backend/section-page'\nimport { useInjectedMenuItems } from '@open-mercato/ui/backend/injection/useInjectedMenuItems'\nimport { mergeMenuItems } from '@open-mercato/ui/backend/injection/mergeMenuItems'\nimport { resolveInjectedIcon } from '@open-mercato/ui/backend/injection/resolveInjectedIcon'\n\nexport function GalleryNavigation({ sections, activePath, activeFamilyId, onExpand, onNavigate, failed, onRetry }: {\n sections: SectionNavGroup[]\n activePath: string\n activeFamilyId: string | null\n onExpand: (id: string) => void\n onNavigate: () => void\n failed: Record<string, boolean>\n onRetry: (id: string) => void\n}) {\n const t = useT()\n const prefix = React.useId()\n const [mobileOpen, setMobileOpen] = React.useState(false)\n const [expanded, setExpanded] = React.useState<Record<string, boolean>>({})\n const { items: injectedItems } = useInjectedMenuItems('menu:sidebar:settings:design_system')\n React.useEffect(() => {\n if (activeFamilyId) setExpanded(previous => ({ ...previous, [activeFamilyId]: true }))\n setMobileOpen(false)\n }, [activeFamilyId, activePath])\n\n const navigate = () => { setMobileOpen(false); onNavigate() }\n const itemLabel = (item: SectionNavItem) => t(item.labelKey ?? item.label, item.label)\n const renderLink = (item: SectionNavItem, nested = false) => {\n const active = activePath === item.href\n return <Button asChild variant=\"ghost\" size=\"sm\" className={cn('w-full min-w-0 justify-start gap-2 rounded-md px-3 text-left text-sm font-normal text-muted-foreground', !nested && 'w-0 flex-1', active && 'bg-accent font-semibold text-accent-foreground', nested && 'border-l-2 rounded-l-none', nested && (active ? 'border-foreground' : 'border-transparent'))}>\n <Link href={item.href} aria-current={active ? 'page' : undefined} onClick={navigate}>\n {!nested && item.icon ? <span className=\"shrink-0\" aria-hidden>{item.icon}</span> : null}\n <span className=\"min-w-0 truncate\">{itemLabel(item)}</span>\n </Link>\n </Button>\n }\n const renderItem = (item: SectionNavItem) => {\n const expandable = item.children !== undefined\n const open = expanded[item.id] ?? false\n const label = itemLabel(item)\n const contentId = `${prefix}-${item.id}`\n return <li key={item.id} className=\"min-w-0\">\n <div className=\"flex min-w-0 items-center gap-1\">\n {renderLink(item)}\n {expandable ? <IconButton type=\"button\" variant=\"ghost\" size=\"sm\" className=\"shrink-0 text-muted-foreground\" aria-label={t(open ? 'design_system.gallery.navigation.collapse' : 'design_system.gallery.navigation.expand', { category: label })} aria-expanded={open} aria-controls={contentId} onClick={() => {\n setExpanded(previous => ({ ...previous, [item.id]: !open }))\n if (!open) onExpand(item.id)\n }}><ChevronRight className={cn('size-4 transition-transform', open && 'rotate-90')} /></IconButton> : null}\n </div>\n {expandable && open ? <div id={contentId} className=\"mb-2 ml-5 mt-1 border-l border-border pl-2\">\n {failed[item.id] ? <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => onRetry(item.id)}>{t('design_system.gallery.retry')}</Button> : item.children?.length ? <ul className=\"space-y-0.5\">{item.children.map(child => <li key={child.id}>{renderLink(child, true)}</li>)}</ul> : <div className=\"space-y-2 p-2\" role=\"status\" aria-label={t('common.loading', 'Loading\u2026')}><Skeleton className=\"h-5 w-3/4\" /><Skeleton className=\"h-5 w-1/2\" /></div>}\n </div> : null}\n </li>\n }\n return <aside className=\"sticky top-16 z-20 min-w-0 bg-background lg:top-20 lg:w-60 lg:shrink-0 lg:self-start lg:border-r lg:border-border\">\n <Button type=\"button\" variant=\"outline\" className=\"my-2 w-full justify-between lg:hidden\" aria-expanded={mobileOpen} aria-controls={`${prefix}-navigation`} onClick={() => setMobileOpen(value => !value)}>\n {t('design_system.gallery.navigation.browse')}{mobileOpen ? <X aria-hidden /> : <Menu aria-hidden />}\n </Button>\n <nav id={`${prefix}-navigation`} aria-label={t('design_system.gallery.navigation.label')} className={cn('max-h-screen overflow-y-auto overscroll-contain py-4 pr-3 pb-24 lg:block', !mobileOpen && 'hidden')}>\n <Link href=\"/backend/design-system\" onClick={navigate} className=\"mb-5 block px-3 text-base font-semibold tracking-tight\">{t('design_system.nav.title')}</Link>\n <div className=\"space-y-5\">{sections.map(section => {\n const additions = injectedItems.filter(item => (item.groupId ?? section.id) === section.id)\n const items = mergeMenuItems(section.items.map(item => ({ id: item.id, item })), additions).flatMap(item => {\n if (item.source === 'built-in') {\n const original = section.items.find(candidate => candidate.id === item.id)\n return original ? [original] : []\n }\n return item.href ? [{ id: item.id, label: item.label ?? item.id, labelKey: item.labelKey, href: item.href, icon: resolveInjectedIcon(item.icon) }] : []\n })\n return <section key={section.id}>\n {section.label ? <p className=\"mb-2 px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\">{t(section.labelKey ?? section.label, section.label)}</p> : null}\n <ul className=\"space-y-1\">{items.map(item => renderItem(item))}</ul>\n </section>\n })}</div>\n </nav>\n </aside>\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,9 +1,11 @@
1
1
  "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { useSearchParams } from "next/navigation";
4
+ import { GalleryLink as Link, navigateGallery } from "./GalleryLink.js";
5
+ import { ArrowLeft, Home, BookOpen, Grid2X2, Palette } from "lucide-react";
6
+ import { useRouter, useSearchParams } from "next/navigation";
5
7
  import { useT } from "@open-mercato/shared/lib/i18n/context";
6
- import { SectionPage } from "@open-mercato/ui/backend/section-page";
8
+ import { GalleryNavigation } from "./GalleryNavigation.js";
7
9
  import { SearchInput } from "@open-mercato/ui/primitives/search-input";
8
10
  import { Skeleton } from "@open-mercato/ui/primitives/skeleton";
9
11
  import { EmptyState } from "@open-mercato/ui/primitives/empty-state";
@@ -11,6 +13,12 @@ import { Button } from "@open-mercato/ui/primitives/button";
11
13
  import { ErrorMessage } from "@open-mercato/ui/backend/detail";
12
14
  import { GALLERY_BASE_PATH, galleryFamilies } from "../registry.js";
13
15
  import { EntryCard } from "./EntryCard.js";
16
+ import { DesignSystemHome, DesignSystemPrinciples } from "./DesignSystemHome.js";
17
+ import { StyleAgents } from "./StyleAgents.js";
18
+ import { ComponentIndex } from "./ComponentIndex.js";
19
+ import { FoundationGuide } from "./FoundationGuide.js";
20
+ import { IconsBrowser } from "./IconsBrowser.js";
21
+ import { fullWidthEntryIds } from "../presentation.js";
14
22
  function familyLabelFallback(id) {
15
23
  return id.charAt(0).toUpperCase() + id.slice(1).replace(/[-_]/g, " ");
16
24
  }
@@ -21,20 +29,62 @@ function matchesQuery(entry, query) {
21
29
  if (entry.keywords?.some((keyword) => keyword.toLowerCase().includes(needle))) return true;
22
30
  return needle.includes(entry.id.toLowerCase()) || needle.includes(entry.title.toLowerCase());
23
31
  }
32
+ function resolveFullWidthIds(entryIds, fullWidthIds) {
33
+ const resolved = new Set(entryIds.filter((id) => fullWidthIds.has(id)));
34
+ let unpaired = null;
35
+ for (const id of entryIds) {
36
+ if (resolved.has(id)) {
37
+ if (unpaired) resolved.add(unpaired);
38
+ unpaired = null;
39
+ } else {
40
+ unpaired = unpaired ? null : id;
41
+ }
42
+ }
43
+ if (unpaired) resolved.add(unpaired);
44
+ return resolved;
45
+ }
46
+ function useShellDockOffset(rootRef) {
47
+ const [offset, setOffset] = React.useState(0);
48
+ React.useLayoutEffect(() => {
49
+ const main = rootRef.current?.closest("main");
50
+ const column = main?.parentElement;
51
+ if (!main || !column || typeof ResizeObserver === "undefined") return;
52
+ const measure = () => setOffset(Math.max(0, Math.round(main.getBoundingClientRect().left - column.getBoundingClientRect().left)));
53
+ measure();
54
+ const observer = new ResizeObserver(measure);
55
+ observer.observe(column);
56
+ return () => observer.disconnect();
57
+ }, [rootRef]);
58
+ return offset;
59
+ }
60
+ const componentFamilies = galleryFamilies.filter((family) => !["foundations", "library"].includes(family.id));
24
61
  function GalleryShell() {
25
62
  const t = useT();
63
+ const router = useRouter();
26
64
  const searchParams = useSearchParams();
27
65
  const [loaded, setLoaded] = React.useState({});
28
66
  const [failed, setFailed] = React.useState({});
29
67
  const [search, setSearch] = React.useState("");
30
68
  const pendingRef = React.useRef(/* @__PURE__ */ new Set());
69
+ const rootRef = React.useRef(null);
70
+ const dockOffset = useShellDockOffset(rootRef);
31
71
  const familyParam = searchParams?.get("family") ?? null;
32
72
  const entryParam = searchParams?.get("entry") ?? null;
73
+ const variantParam = searchParams?.get("variant") ?? null;
74
+ const showingPrinciples = searchParams?.get("view") === "principles" && !familyParam;
75
+ const showingComponents = searchParams?.get("view") === "components" && !familyParam;
76
+ const showingStyleAgents = searchParams?.get("view") === "style-agents" && !familyParam;
77
+ const showingHome = !familyParam && !showingPrinciples && !showingComponents && !showingStyleAgents;
78
+ const showingFoundations = familyParam === "foundations";
79
+ const showingAssets = familyParam === "icons";
80
+ const showingInventory = familyParam === "library";
81
+ const showingEntry = Boolean(entryParam) && !showingFoundations && !showingAssets && !showingInventory;
33
82
  React.useEffect(() => {
34
83
  setSearch("");
35
- }, [familyParam]);
84
+ }, [familyParam, entryParam, showingPrinciples, showingComponents, showingStyleAgents]);
36
85
  const activeFamily = galleryFamilies.find((family) => family.id === familyParam) ?? galleryFamilies[0];
37
86
  const activeFamilyId = activeFamily?.id ?? null;
87
+ const activeNavigationPath = showingStyleAgents ? `${GALLERY_BASE_PATH}?view=style-agents` : showingHome ? GALLERY_BASE_PATH : showingPrinciples ? `${GALLERY_BASE_PATH}?view=principles` : showingComponents ? `${GALLERY_BASE_PATH}?view=components` : `${GALLERY_BASE_PATH}?family=${activeFamilyId}${(showingFoundations || showingEntry) && entryParam ? `&entry=${entryParam}` : ""}`;
38
88
  const loadFamily = React.useCallback((family) => {
39
89
  if (pendingRef.current.has(family.id)) return;
40
90
  pendingRef.current.add(family.id);
@@ -50,33 +100,53 @@ function GalleryShell() {
50
100
  React.useEffect(() => {
51
101
  if (searching) {
52
102
  for (const family of galleryFamilies) loadFamily(family);
53
- } else if (activeFamily) {
103
+ } else if (showingComponents) {
104
+ for (const family of componentFamilies) loadFamily(family);
105
+ } else if (activeFamily && !showingHome && !showingPrinciples && !showingStyleAgents) {
54
106
  loadFamily(activeFamily);
55
107
  }
56
- }, [searching, activeFamily, loadFamily]);
108
+ }, [searching, activeFamily, loadFamily, showingHome, showingPrinciples, showingComponents, showingStyleAgents]);
57
109
  const activeEntries = activeFamilyId ? loaded[activeFamilyId] : void 0;
58
110
  React.useEffect(() => {
59
- if (!entryParam || searching || !activeEntries) return;
60
- const node = document.getElementById(`gallery-entry-${entryParam}`);
111
+ if (searching || showingFoundations && entryParam && !activeEntries) return;
112
+ const variantId = entryParam === "file-upload" && variantParam === "drag-and-drop" ? "default" : variantParam;
113
+ const targetId = showingFoundations && entryParam ? `gallery-entry-${entryParam}` : entryParam && variantId && variantId !== "__all" ? `gallery-variant-${entryParam}-${variantId}` : "gallery-page-heading";
114
+ const node = document.getElementById(targetId) ?? document.getElementById("gallery-page-heading");
61
115
  node?.scrollIntoView({ block: "start" });
62
- }, [entryParam, searching, activeEntries]);
63
- const sections = React.useMemo(
64
- () => [
65
- {
66
- id: "families",
67
- label: "Families",
68
- labelKey: "design_system.gallery.familiesGroup",
69
- items: galleryFamilies.map((family) => ({
70
- id: family.id,
71
- label: familyLabelFallback(family.id),
72
- labelKey: family.labelKey,
73
- icon: family.icon,
74
- href: `${GALLERY_BASE_PATH}?family=${family.id}`
75
- }))
76
- }
77
- ],
78
- []
79
- );
116
+ }, [familyParam, entryParam, variantParam, searching, activeEntries, showingFoundations, showingHome, showingPrinciples, showingComponents, showingStyleAgents]);
117
+ const sections = React.useMemo(() => {
118
+ const familyItem = (family) => ({
119
+ id: family.id,
120
+ label: familyLabelFallback(family.id),
121
+ labelKey: family.labelKey,
122
+ icon: family.icon,
123
+ href: `${GALLERY_BASE_PATH}?family=${family.id}`,
124
+ ...!["library", "icons"].includes(family.id) ? { children: (loaded[family.id] ?? []).map((entry) => ({
125
+ id: `entry:${entry.id}`,
126
+ label: entry.title,
127
+ ...family.id === "foundations" ? { labelKey: `design_system.foundations.${entry.id}.title` } : {},
128
+ href: `${GALLERY_BASE_PATH}?family=${family.id}&entry=${entry.id}`
129
+ })) } : {}
130
+ });
131
+ return [
132
+ { id: "guide", label: "", items: [
133
+ { id: "__home", label: "Start", labelKey: "design_system.portal.nav.home", icon: /* @__PURE__ */ jsx(Home, { className: "size-4" }), href: GALLERY_BASE_PATH },
134
+ { id: "__style-agents", label: "Style agents", labelKey: "design_system.styleAgents.title", icon: /* @__PURE__ */ jsx(Palette, { className: "size-4" }), href: `${GALLERY_BASE_PATH}?view=style-agents` },
135
+ ...galleryFamilies.filter((family) => family.id === "foundations").map(familyItem)
136
+ ] },
137
+ { id: "families", label: "Components", labelKey: "design_system.portal.nav.components", items: [
138
+ { id: "__components", label: "All components", labelKey: "design_system.gallery.navigation.allComponents", icon: /* @__PURE__ */ jsx(Grid2X2, { className: "size-4" }), href: `${GALLERY_BASE_PATH}?view=components` },
139
+ ...componentFamilies.map(familyItem)
140
+ ] },
141
+ { id: "resources", label: "Resources", labelKey: "design_system.gallery.navigation.resources", items: [
142
+ { id: "__principles", label: "Guidelines", labelKey: "design_system.portal.nav.principles", icon: /* @__PURE__ */ jsx(BookOpen, { className: "size-4" }), href: `${GALLERY_BASE_PATH}?view=principles` },
143
+ ...galleryFamilies.filter((family) => family.id === "library").map(familyItem)
144
+ ] }
145
+ ];
146
+ }, [loaded]);
147
+ const selectedEntry = entryParam ? activeEntries?.find((entry) => entry.id === entryParam) : void 0;
148
+ const familyTitle = activeFamily ? t(activeFamily.labelKey, familyLabelFallback(activeFamily.id)) : t("design_system.nav.title");
149
+ const pageTitle = showingComponents ? t("design_system.portal.nav.components") : showingEntry && selectedEntry ? selectedEntry.title : familyTitle;
80
150
  const renderFamilySkeleton = () => /* @__PURE__ */ jsxs("div", { className: "space-y-4", "data-testid": "gallery-family-skeleton", children: [
81
151
  /* @__PURE__ */ jsx(Skeleton, { className: "h-40 w-full" }),
82
152
  /* @__PURE__ */ jsx(Skeleton, { className: "h-40 w-full" })
@@ -98,7 +168,7 @@ function GalleryShell() {
98
168
  }
99
169
  return /* @__PURE__ */ jsx("div", { className: "space-y-8", children: groups.map(({ family, entries }) => /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
100
170
  /* @__PURE__ */ jsx("h2", { className: "text-sm font-medium uppercase tracking-wider text-muted-foreground", children: t(family.labelKey, familyLabelFallback(family.id)) }),
101
- entries.map((entry) => /* @__PURE__ */ jsx(EntryCard, { entry }, entry.id))
171
+ entries.map((entry) => /* @__PURE__ */ jsx(EntryCard, { entry, summary: true, href: `${GALLERY_BASE_PATH}?family=${family.id}&entry=${entry.id}`, onNavigate: () => setSearch("") }, entry.id))
102
172
  ] }, family.id)) });
103
173
  };
104
174
  const renderActiveFamily = () => {
@@ -114,50 +184,60 @@ function GalleryShell() {
114
184
  );
115
185
  }
116
186
  if (!entries) return renderFamilySkeleton();
117
- return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
118
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: t(activeFamily.labelKey, familyLabelFallback(activeFamily.id)) }),
119
- entries.length > 1 ? /* @__PURE__ */ jsx(
120
- "nav",
187
+ if (activeFamily.id === "icons") return /* @__PURE__ */ jsx(IconsBrowser, { entryId: entryParam ?? void 0, variantId: variantParam ?? void 0, onNavigate: (entryId, variantId) => {
188
+ const href = `${GALLERY_BASE_PATH}?family=icons&entry=${entryId}${variantId ? `&variant=${variantId}` : ""}`;
189
+ if (!navigateGallery(href)) router.push(href, { scroll: false });
190
+ } });
191
+ if (activeFamily.id === "foundations") return /* @__PURE__ */ jsx(FoundationGuide, { entries });
192
+ const sourceLibraryRender = activeFamily.id === "library" && entries.length === 1 && !entryParam ? entries[0]?.variants[0]?.render : void 0;
193
+ if (sourceLibraryRender) {
194
+ const SourceLibraryRender = sourceLibraryRender;
195
+ return /* @__PURE__ */ jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsx(SourceLibraryRender, {}) });
196
+ }
197
+ const selectedEntry2 = entries.find((entry) => entry.id === entryParam) ?? (entries.length === 1 ? entries[0] : void 0);
198
+ const familyFullWidthIds = resolveFullWidthIds(entries.map((entry) => entry.id), fullWidthEntryIds);
199
+ return /* @__PURE__ */ jsx("div", { className: "space-y-4", children: selectedEntry2 ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(EntryCard, { entry: selectedEntry2, hideTitle: true, fullWidth: fullWidthEntryIds.has(selectedEntry2.id) }, selectedEntry2.id) }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 @3xl:grid-cols-2", children: entries.map((entry) => /* @__PURE__ */ jsx(EntryCard, { entry, summary: true, summaryPreview: true, fullWidth: familyFullWidthIds.has(entry.id), href: `${GALLERY_BASE_PATH}?family=${activeFamily.id}&entry=${entry.id}` }, entry.id)) }) });
200
+ };
201
+ return /* @__PURE__ */ jsxs("div", { ref: rootRef, className: "flex min-w-0 flex-col lg:flex-row", style: dockOffset ? { marginLeft: -dockOffset, width: `calc(100% + ${dockOffset}px)` } : void 0, children: [
202
+ /* @__PURE__ */ jsx(GalleryNavigation, { sections, activePath: activeNavigationPath, activeFamilyId: familyParam, onNavigate: () => setSearch(""), failed, onExpand: (id) => {
203
+ const family = galleryFamilies.find((family2) => family2.id === id);
204
+ if (family) loadFamily(family);
205
+ }, onRetry: (id) => {
206
+ const family = galleryFamilies.find((family2) => family2.id === id);
207
+ if (family) loadFamily(family);
208
+ } }),
209
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1 py-4 lg:pl-6", children: /* @__PURE__ */ jsx("div", { className: "@container mx-auto w-full max-w-6xl space-y-6", children: showingStyleAgents ? /* @__PURE__ */ jsx(StyleAgents, {}) : showingHome ? /* @__PURE__ */ jsx(DesignSystemHome, {}) : showingPrinciples ? /* @__PURE__ */ jsxs("div", { id: "gallery-page-heading", className: "scroll-mt-36 lg:scroll-mt-24 space-y-8 py-8", children: [
210
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl font-medium tracking-tight", children: t("design_system.portal.nav.principles") }),
211
+ /* @__PURE__ */ jsx(DesignSystemPrinciples, {})
212
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
213
+ /* @__PURE__ */ jsxs("header", { id: "gallery-page-heading", className: "scroll-mt-36 lg:scroll-mt-24 space-y-3", children: [
214
+ selectedEntry && showingEntry ? /* @__PURE__ */ jsx(Button, { asChild: true, variant: "outline", size: "sm", children: /* @__PURE__ */ jsxs(Link, { href: `${GALLERY_BASE_PATH}?family=${activeFamilyId}`, children: [
215
+ /* @__PURE__ */ jsx(ArrowLeft, { "aria-hidden": true }),
216
+ t("design_system.gallery.backToNamedFamily", { family: familyTitle })
217
+ ] }) }) : null,
218
+ !showingComponents && (!selectedEntry || !showingEntry) ? /* @__PURE__ */ jsx(Button, { asChild: true, variant: "outline", size: "sm", children: /* @__PURE__ */ jsxs(Link, { href: `${GALLERY_BASE_PATH}?view=components`, children: [
219
+ /* @__PURE__ */ jsx(ArrowLeft, { "aria-hidden": true }),
220
+ t("design_system.gallery.backToNamedFamily", { family: t("design_system.portal.nav.components") })
221
+ ] }) }) : null,
222
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl font-semibold tracking-tight", children: pageTitle }),
223
+ showingEntry && selectedEntry?.descriptionKey ? /* @__PURE__ */ jsx("p", { className: "max-w-prose text-sm leading-relaxed text-muted-foreground", children: t(selectedEntry.descriptionKey) }) : null,
224
+ showingComponents ? /* @__PURE__ */ jsx("p", { className: "text-base text-muted-foreground", children: t("design_system.portal.componentsDescription") }) : null
225
+ ] }),
226
+ !showingAssets && !showingInventory && !showingEntry ? /* @__PURE__ */ jsx(
227
+ SearchInput,
121
228
  {
122
- "aria-label": t("design_system.gallery.familyContents", "Components in this family"),
123
- className: "flex flex-wrap items-center gap-1.5 rounded-md border border-border bg-muted/30 p-2",
124
- children: entries.map((entry) => /* @__PURE__ */ jsx(
125
- "a",
126
- {
127
- href: `#gallery-entry-${entry.id}`,
128
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus",
129
- children: entry.title
130
- },
131
- entry.id
132
- ))
229
+ value: search,
230
+ onChange: setSearch,
231
+ placeholder: t("design_system.gallery.searchPlaceholder", "Search components\u2026"),
232
+ "aria-label": t("design_system.gallery.searchPlaceholder", "Search components\u2026")
133
233
  }
134
234
  ) : null,
135
- entries.map((entry) => /* @__PURE__ */ jsx(EntryCard, { entry }, entry.id))
136
- ] });
137
- };
138
- return /* @__PURE__ */ jsx(
139
- SectionPage,
140
- {
141
- title: "Design system",
142
- titleKey: "design_system.nav.title",
143
- sections,
144
- activePath: activeFamilyId ? `${GALLERY_BASE_PATH}?family=${activeFamilyId}` : GALLERY_BASE_PATH,
145
- children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-5xl space-y-6", children: [
146
- /* @__PURE__ */ jsx(
147
- SearchInput,
148
- {
149
- value: search,
150
- onChange: setSearch,
151
- placeholder: t("design_system.gallery.searchPlaceholder", "Search components\u2026"),
152
- "aria-label": t("design_system.gallery.searchPlaceholder", "Search components\u2026")
153
- }
154
- ),
155
- searching ? renderSearchResults() : renderActiveFamily()
156
- ] })
157
- }
158
- );
235
+ searching ? renderSearchResults() : showingComponents ? /* @__PURE__ */ jsx(ComponentIndex, { families: componentFamilies, loaded, failed, onRetry: loadFamily }) : renderActiveFamily()
236
+ ] }) }) })
237
+ ] });
159
238
  }
160
239
  export {
161
- GalleryShell
240
+ GalleryShell,
241
+ resolveFullWidthIds
162
242
  };
163
243
  //# sourceMappingURL=GalleryShell.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/design_system/gallery/components/GalleryShell.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { useSearchParams } from 'next/navigation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { SectionPage } from '@open-mercato/ui/backend/section-page'\nimport type { SectionNavGroup } from '@open-mercato/ui/backend/section-page'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { Skeleton } from '@open-mercato/ui/primitives/skeleton'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport type { GalleryEntry, GalleryFamily } from '../types'\nimport { GALLERY_BASE_PATH, galleryFamilies } from '../registry'\nimport { EntryCard } from './EntryCard'\n\n/** 'buttons' \u2192 'Buttons' \u2014 untranslated fallback when a family labelKey has no message. */\nfunction familyLabelFallback(id: string): string {\n return id.charAt(0).toUpperCase() + id.slice(1).replace(/[-_]/g, ' ')\n}\n\nfunction matchesQuery(entry: GalleryEntry, query: string): boolean {\n const needle = query.trim().toLowerCase()\n if (!needle) return true\n if (entry.id.toLowerCase().includes(needle) || entry.title.toLowerCase().includes(needle)) return true\n if (entry.keywords?.some((keyword) => keyword.toLowerCase().includes(needle))) return true\n // 'radiobutton' should still find 'radio' \u2014 match when the query CONTAINS the id/title too.\n return needle.includes(entry.id.toLowerCase()) || needle.includes(entry.title.toLowerCase())\n}\n\ntype LoadedEntries = Record<string, GalleryEntry[]>\n\nexport function GalleryShell() {\n const t = useT()\n const searchParams = useSearchParams()\n const [loaded, setLoaded] = React.useState<LoadedEntries>({})\n const [failed, setFailed] = React.useState<Record<string, boolean>>({})\n const [search, setSearch] = React.useState('')\n const pendingRef = React.useRef(new Set<string>())\n\n const familyParam = searchParams?.get('family') ?? null\n const entryParam = searchParams?.get('entry') ?? null\n\n // Clicking a family in the section nav exits search mode \u2014 otherwise the\n // query keeps precedence and family navigation appears dead.\n React.useEffect(() => {\n setSearch('')\n }, [familyParam])\n const activeFamily: GalleryFamily | undefined =\n galleryFamilies.find((family) => family.id === familyParam) ?? galleryFamilies[0]\n const activeFamilyId = activeFamily?.id ?? null\n\n const loadFamily = React.useCallback((family: GalleryFamily) => {\n if (pendingRef.current.has(family.id)) return\n pendingRef.current.add(family.id)\n setFailed((prev) => (prev[family.id] ? { ...prev, [family.id]: false } : prev))\n family\n .load()\n .then((mod) => {\n setLoaded((prev) => (prev[family.id] ? prev : { ...prev, [family.id]: mod.entries }))\n })\n .catch(() => {\n pendingRef.current.delete(family.id)\n setFailed((prev) => ({ ...prev, [family.id]: true }))\n })\n }, [])\n\n // Lazy-load the active family; when searching, load every family so results\n // span the whole gallery.\n const searching = search.trim().length > 0\n React.useEffect(() => {\n if (searching) {\n for (const family of galleryFamilies) loadFamily(family)\n } else if (activeFamily) {\n loadFamily(activeFamily)\n }\n }, [searching, activeFamily, loadFamily])\n\n // Deep link: ?entry=<id> scrolls the entry into view once its family loaded.\n const activeEntries = activeFamilyId ? loaded[activeFamilyId] : undefined\n React.useEffect(() => {\n if (!entryParam || searching || !activeEntries) return\n const node = document.getElementById(`gallery-entry-${entryParam}`)\n node?.scrollIntoView({ block: 'start' })\n }, [entryParam, searching, activeEntries])\n\n const sections: SectionNavGroup[] = React.useMemo(\n () => [\n {\n id: 'families',\n label: 'Families',\n labelKey: 'design_system.gallery.familiesGroup',\n items: galleryFamilies.map((family) => ({\n id: family.id,\n label: familyLabelFallback(family.id),\n labelKey: family.labelKey,\n icon: family.icon,\n href: `${GALLERY_BASE_PATH}?family=${family.id}`,\n })),\n },\n ],\n [],\n )\n\n const renderFamilySkeleton = () => (\n <div className=\"space-y-4\" data-testid=\"gallery-family-skeleton\">\n <Skeleton className=\"h-40 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n </div>\n )\n\n const renderSearchResults = () => {\n const groups = galleryFamilies\n .map((family) => ({\n family,\n entries: (loaded[family.id] ?? []).filter((entry) => matchesQuery(entry, search)),\n }))\n .filter((group) => group.entries.length > 0)\n const stillLoading = galleryFamilies.some((family) => !loaded[family.id] && !failed[family.id])\n if (groups.length === 0 && stillLoading) return renderFamilySkeleton()\n if (groups.length === 0) {\n return (\n <EmptyState\n title={t('design_system.gallery.noResults', 'No components match your search')}\n />\n )\n }\n return (\n <div className=\"space-y-8\">\n {groups.map(({ family, entries }) => (\n <div key={family.id} className=\"space-y-4\">\n <h2 className=\"text-sm font-medium uppercase tracking-wider text-muted-foreground\">\n {t(family.labelKey, familyLabelFallback(family.id))}\n </h2>\n {entries.map((entry) => (\n <EntryCard key={entry.id} entry={entry} />\n ))}\n </div>\n ))}\n </div>\n )\n }\n\n const renderActiveFamily = () => {\n if (!activeFamily) return null\n const entries = loaded[activeFamily.id]\n if (!entries && failed[activeFamily.id]) {\n return (\n <ErrorMessage\n label={t('design_system.gallery.loadFailed', 'Could not load this family')}\n action={\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => loadFamily(activeFamily)}>\n {t('design_system.gallery.retry', 'Retry')}\n </Button>\n }\n />\n )\n }\n if (!entries) return renderFamilySkeleton()\n return (\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-semibold\">\n {t(activeFamily.labelKey, familyLabelFallback(activeFamily.id))}\n </h2>\n {entries.length > 1 ? (\n <nav\n aria-label={t('design_system.gallery.familyContents', 'Components in this family')}\n className=\"flex flex-wrap items-center gap-1.5 rounded-md border border-border bg-muted/30 p-2\"\n >\n {entries.map((entry) => (\n <a\n key={entry.id}\n href={`#gallery-entry-${entry.id}`}\n className=\"rounded-md border border-border bg-background px-2 py-1 text-xs text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:shadow-focus\"\n >\n {entry.title}\n </a>\n ))}\n </nav>\n ) : null}\n {entries.map((entry) => (\n <EntryCard key={entry.id} entry={entry} />\n ))}\n </div>\n )\n }\n\n return (\n <SectionPage\n title=\"Design system\"\n titleKey=\"design_system.nav.title\"\n sections={sections}\n activePath={activeFamilyId ? `${GALLERY_BASE_PATH}?family=${activeFamilyId}` : GALLERY_BASE_PATH}\n >\n <div className=\"mx-auto w-full max-w-5xl space-y-6\">\n <SearchInput\n value={search}\n onChange={setSearch}\n placeholder={t('design_system.gallery.searchPlaceholder', 'Search components\u2026')}\n aria-label={t('design_system.gallery.searchPlaceholder', 'Search components\u2026')}\n />\n {searching ? renderSearchResults() : renderActiveFamily()}\n </div>\n </SectionPage>\n )\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { GalleryLink as Link, navigateGallery } from './GalleryLink'\nimport { ArrowLeft, Home, BookOpen, Grid2X2, Palette } from 'lucide-react'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { GalleryNavigation } from './GalleryNavigation'\nimport type { SectionNavGroup } from '@open-mercato/ui/backend/section-page'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { Skeleton } from '@open-mercato/ui/primitives/skeleton'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport type { GalleryEntry, GalleryFamily } from '../types'\nimport { GALLERY_BASE_PATH, galleryFamilies } from '../registry'\nimport { EntryCard } from './EntryCard'\nimport { DesignSystemHome, DesignSystemPrinciples } from './DesignSystemHome'\nimport { StyleAgents } from './StyleAgents'\nimport { ComponentIndex } from './ComponentIndex'\nimport { FoundationGuide } from './FoundationGuide'\nimport { IconsBrowser } from './IconsBrowser'\nimport { fullWidthEntryIds } from '../presentation'\n\n/** 'buttons' \u2192 'Buttons' \u2014 untranslated fallback when a family labelKey has no message. */\nfunction familyLabelFallback(id: string): string {\n return id.charAt(0).toUpperCase() + id.slice(1).replace(/[-_]/g, ' ')\n}\n\nfunction matchesQuery(entry: GalleryEntry, query: string): boolean {\n const needle = query.trim().toLowerCase()\n if (!needle) return true\n if (entry.id.toLowerCase().includes(needle) || entry.title.toLowerCase().includes(needle)) return true\n if (entry.keywords?.some((keyword) => keyword.toLowerCase().includes(needle))) return true\n // 'radiobutton' should still find 'radio' \u2014 match when the query CONTAINS the id/title too.\n return needle.includes(entry.id.toLowerCase()) || needle.includes(entry.title.toLowerCase())\n}\n\n/** A half-width card with no neighbour before the next full-width card would leave a hole, so it spans the row too. */\nexport function resolveFullWidthIds(entryIds: string[], fullWidthIds: ReadonlySet<string>): Set<string> {\n const resolved = new Set(entryIds.filter(id => fullWidthIds.has(id)))\n let unpaired: string | null = null\n for (const id of entryIds) {\n if (resolved.has(id)) {\n if (unpaired) resolved.add(unpaired)\n unpaired = null\n } else {\n unpaired = unpaired ? null : id\n }\n }\n if (unpaired) resolved.add(unpaired)\n return resolved\n}\n\n/**\n * The backend shell centres `main` once the viewport outgrows its max width, which would leave the\n * library navigation floating mid-screen. Pull the gallery back by that centring margin so the\n * navigation stays docked next to the application sidebar at every width.\n */\nfunction useShellDockOffset(rootRef: React.RefObject<HTMLElement | null>): number {\n const [offset, setOffset] = React.useState(0)\n React.useLayoutEffect(() => {\n const main = rootRef.current?.closest('main')\n const column = main?.parentElement\n if (!main || !column || typeof ResizeObserver === 'undefined') return\n const measure = () => setOffset(Math.max(0, Math.round(main.getBoundingClientRect().left - column.getBoundingClientRect().left)))\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(column)\n return () => observer.disconnect()\n }, [rootRef])\n return offset\n}\n\ntype LoadedEntries = Record<string, GalleryEntry[]>\n\nconst componentFamilies = galleryFamilies.filter(family => !['foundations', 'library'].includes(family.id))\n\nexport function GalleryShell() {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const [loaded, setLoaded] = React.useState<LoadedEntries>({})\n const [failed, setFailed] = React.useState<Record<string, boolean>>({})\n const [search, setSearch] = React.useState('')\n const pendingRef = React.useRef(new Set<string>())\n const rootRef = React.useRef<HTMLDivElement>(null)\n const dockOffset = useShellDockOffset(rootRef)\n\n const familyParam = searchParams?.get('family') ?? null\n const entryParam = searchParams?.get('entry') ?? null\n const variantParam = searchParams?.get('variant') ?? null\n const showingPrinciples = searchParams?.get('view') === 'principles' && !familyParam\n const showingComponents = searchParams?.get('view') === 'components' && !familyParam\n const showingStyleAgents = searchParams?.get('view') === 'style-agents' && !familyParam\n const showingHome = !familyParam && !showingPrinciples && !showingComponents && !showingStyleAgents\n const showingFoundations = familyParam === 'foundations'\n const showingAssets = familyParam === 'icons'\n const showingInventory = familyParam === 'library'\n const showingEntry = Boolean(entryParam) && !showingFoundations && !showingAssets && !showingInventory\n\n\n React.useEffect(() => {\n setSearch('')\n }, [familyParam, entryParam, showingPrinciples, showingComponents, showingStyleAgents])\n const activeFamily: GalleryFamily | undefined =\n galleryFamilies.find((family) => family.id === familyParam) ?? galleryFamilies[0]\n const activeFamilyId = activeFamily?.id ?? null\n const activeNavigationPath = showingStyleAgents ? `${GALLERY_BASE_PATH}?view=style-agents` : showingHome ? GALLERY_BASE_PATH : showingPrinciples ? `${GALLERY_BASE_PATH}?view=principles` : showingComponents ? `${GALLERY_BASE_PATH}?view=components` : `${GALLERY_BASE_PATH}?family=${activeFamilyId}${(showingFoundations || showingEntry) && entryParam ? `&entry=${entryParam}` : ''}`\n\n const loadFamily = React.useCallback((family: GalleryFamily) => {\n if (pendingRef.current.has(family.id)) return\n pendingRef.current.add(family.id)\n setFailed((prev) => (prev[family.id] ? { ...prev, [family.id]: false } : prev))\n family\n .load()\n .then((mod) => {\n setLoaded((prev) => (prev[family.id] ? prev : { ...prev, [family.id]: mod.entries }))\n })\n .catch(() => {\n pendingRef.current.delete(family.id)\n setFailed((prev) => ({ ...prev, [family.id]: true }))\n })\n }, [])\n\n // Lazy-load the active family; when searching, load every family so results\n // span the whole gallery.\n const searching = search.trim().length > 0\n React.useEffect(() => {\n if (searching) {\n for (const family of galleryFamilies) loadFamily(family)\n } else if (showingComponents) {\n for (const family of componentFamilies) loadFamily(family)\n } else if (activeFamily && !showingHome && !showingPrinciples && !showingStyleAgents) {\n loadFamily(activeFamily)\n }\n }, [searching, activeFamily, loadFamily, showingHome, showingPrinciples, showingComponents, showingStyleAgents])\n\n const activeEntries = activeFamilyId ? loaded[activeFamilyId] : undefined\n React.useEffect(() => {\n if (searching || (showingFoundations && entryParam && !activeEntries)) return\n const variantId = entryParam === 'file-upload' && variantParam === 'drag-and-drop' ? 'default' : variantParam\n const targetId = showingFoundations && entryParam ? `gallery-entry-${entryParam}` : entryParam && variantId && variantId !== '__all' ? `gallery-variant-${entryParam}-${variantId}` : 'gallery-page-heading'\n const node = document.getElementById(targetId) ?? document.getElementById('gallery-page-heading')\n node?.scrollIntoView({ block: 'start' })\n }, [familyParam, entryParam, variantParam, searching, activeEntries, showingFoundations, showingHome, showingPrinciples, showingComponents, showingStyleAgents])\n\n const sections: SectionNavGroup[] = React.useMemo(() => {\n const familyItem = (family: GalleryFamily) => ({\n id: family.id,\n label: familyLabelFallback(family.id),\n labelKey: family.labelKey,\n icon: family.icon,\n href: `${GALLERY_BASE_PATH}?family=${family.id}`,\n ...(!['library', 'icons'].includes(family.id) ? { children: (loaded[family.id] ?? []).map(entry => ({\n id: `entry:${entry.id}`, label: entry.title,\n ...(family.id === 'foundations' ? { labelKey: `design_system.foundations.${entry.id}.title` } : {}),\n href: `${GALLERY_BASE_PATH}?family=${family.id}&entry=${entry.id}`,\n })) } : {}),\n })\n return [\n { id: 'guide', label: '', items: [\n { id: '__home', label: 'Start', labelKey: 'design_system.portal.nav.home', icon: <Home className=\"size-4\" />, href: GALLERY_BASE_PATH },\n { id: '__style-agents', label: 'Style agents', labelKey: 'design_system.styleAgents.title', icon: <Palette className=\"size-4\" />, href: `${GALLERY_BASE_PATH}?view=style-agents` },\n ...galleryFamilies.filter(family => family.id === 'foundations').map(familyItem),\n ] },\n { id: 'families', label: 'Components', labelKey: 'design_system.portal.nav.components', items: [\n { id: '__components', label: 'All components', labelKey: 'design_system.gallery.navigation.allComponents', icon: <Grid2X2 className=\"size-4\" />, href: `${GALLERY_BASE_PATH}?view=components` },\n ...componentFamilies.map(familyItem),\n ] },\n { id: 'resources', label: 'Resources', labelKey: 'design_system.gallery.navigation.resources', items: [\n { id: '__principles', label: 'Guidelines', labelKey: 'design_system.portal.nav.principles', icon: <BookOpen className=\"size-4\" />, href: `${GALLERY_BASE_PATH}?view=principles` },\n ...galleryFamilies.filter(family => family.id === 'library').map(familyItem),\n ] },\n ]\n }, [loaded])\n const selectedEntry = entryParam ? activeEntries?.find(entry => entry.id === entryParam) : undefined\n const familyTitle = activeFamily ? t(activeFamily.labelKey, familyLabelFallback(activeFamily.id)) : t('design_system.nav.title')\n const pageTitle = showingComponents ? t('design_system.portal.nav.components') : showingEntry && selectedEntry ? selectedEntry.title : familyTitle\n\n const renderFamilySkeleton = () => (\n <div className=\"space-y-4\" data-testid=\"gallery-family-skeleton\">\n <Skeleton className=\"h-40 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n </div>\n )\n\n const renderSearchResults = () => {\n const groups = galleryFamilies\n .map((family) => ({\n family,\n entries: (loaded[family.id] ?? []).filter((entry) => matchesQuery(entry, search)),\n }))\n .filter((group) => group.entries.length > 0)\n const stillLoading = galleryFamilies.some((family) => !loaded[family.id] && !failed[family.id])\n if (groups.length === 0 && stillLoading) return renderFamilySkeleton()\n if (groups.length === 0) {\n return (\n <EmptyState\n title={t('design_system.gallery.noResults', 'No components match your search')}\n />\n )\n }\n return (\n <div className=\"space-y-8\">\n {groups.map(({ family, entries }) => (\n <div key={family.id} className=\"space-y-4\">\n <h2 className=\"text-sm font-medium uppercase tracking-wider text-muted-foreground\">\n {t(family.labelKey, familyLabelFallback(family.id))}\n </h2>\n {entries.map((entry) => (\n <EntryCard key={entry.id} entry={entry} summary href={`${GALLERY_BASE_PATH}?family=${family.id}&entry=${entry.id}`} onNavigate={() => setSearch('')} />\n ))}\n </div>\n ))}\n </div>\n )\n }\n\n const renderActiveFamily = () => {\n if (!activeFamily) return null\n const entries = loaded[activeFamily.id]\n if (!entries && failed[activeFamily.id]) {\n return (\n <ErrorMessage\n label={t('design_system.gallery.loadFailed', 'Could not load this family')}\n action={\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => loadFamily(activeFamily)}>\n {t('design_system.gallery.retry', 'Retry')}\n </Button>\n }\n />\n )\n }\n if (!entries) return renderFamilySkeleton()\n if (activeFamily.id === 'icons') return <IconsBrowser entryId={entryParam ?? undefined} variantId={variantParam ?? undefined} onNavigate={(entryId, variantId) => {\n const href = `${GALLERY_BASE_PATH}?family=icons&entry=${entryId}${variantId ? `&variant=${variantId}` : ''}`\n if (!navigateGallery(href)) router.push(href, { scroll: false })\n }} />\n if (activeFamily.id === 'foundations') return <FoundationGuide entries={entries} />\n const sourceLibraryRender = activeFamily.id === 'library' && entries.length === 1 && !entryParam\n ? entries[0]?.variants[0]?.render\n : undefined\n if (sourceLibraryRender) {\n const SourceLibraryRender = sourceLibraryRender\n return <div className=\"space-y-4\">\n <SourceLibraryRender />\n </div>\n }\n const selectedEntry = entries.find(entry => entry.id === entryParam) ?? (entries.length === 1 ? entries[0] : undefined)\n const familyFullWidthIds = resolveFullWidthIds(entries.map(entry => entry.id), fullWidthEntryIds)\n return (\n <div className=\"space-y-4\">\n {selectedEntry ? <>\n <EntryCard key={selectedEntry.id} entry={selectedEntry} hideTitle fullWidth={fullWidthEntryIds.has(selectedEntry.id)} />\n </> : <div className=\"grid grid-cols-1 gap-4 @3xl:grid-cols-2\">{entries.map(entry => <EntryCard key={entry.id} entry={entry} summary summaryPreview fullWidth={familyFullWidthIds.has(entry.id)} href={`${GALLERY_BASE_PATH}?family=${activeFamily.id}&entry=${entry.id}`} />)}</div>}\n </div>\n )\n }\n\n return (\n <div ref={rootRef} className=\"flex min-w-0 flex-col lg:flex-row\" style={dockOffset ? { marginLeft: -dockOffset, width: `calc(100% + ${dockOffset}px)` } : undefined}>\n <GalleryNavigation sections={sections} activePath={activeNavigationPath} activeFamilyId={familyParam} onNavigate={() => setSearch('')} failed={failed} onExpand={id => {\n const family = galleryFamilies.find(family => family.id === id)\n if (family) loadFamily(family)\n }} onRetry={id => {\n const family = galleryFamilies.find(family => family.id === id)\n if (family) loadFamily(family)\n }} />\n <div className=\"min-w-0 flex-1 py-4 lg:pl-6\">\n <div className=\"@container mx-auto w-full max-w-6xl space-y-6\">\n {showingStyleAgents ? <StyleAgents /> : showingHome ? <DesignSystemHome /> : showingPrinciples ? <div id=\"gallery-page-heading\" className=\"scroll-mt-36 lg:scroll-mt-24 space-y-8 py-8\"><h1 className=\"text-3xl font-medium tracking-tight\">{t('design_system.portal.nav.principles')}</h1><DesignSystemPrinciples /></div> : <>\n <header id=\"gallery-page-heading\" className=\"scroll-mt-36 lg:scroll-mt-24 space-y-3\">\n {selectedEntry && showingEntry ? <Button asChild variant=\"outline\" size=\"sm\"><Link href={`${GALLERY_BASE_PATH}?family=${activeFamilyId}`}><ArrowLeft aria-hidden />{t('design_system.gallery.backToNamedFamily', { family: familyTitle })}</Link></Button> : null}\n {!showingComponents && (!selectedEntry || !showingEntry) ? <Button asChild variant=\"outline\" size=\"sm\"><Link href={`${GALLERY_BASE_PATH}?view=components`}><ArrowLeft aria-hidden />{t('design_system.gallery.backToNamedFamily', { family: t('design_system.portal.nav.components') })}</Link></Button> : null}\n <h1 className=\"text-3xl font-semibold tracking-tight\">{pageTitle}</h1>\n {showingEntry && selectedEntry?.descriptionKey ? <p className=\"max-w-prose text-sm leading-relaxed text-muted-foreground\">{t(selectedEntry.descriptionKey)}</p> : null}\n {showingComponents ? <p className=\"text-base text-muted-foreground\">{t('design_system.portal.componentsDescription')}</p> : null}\n </header>\n {!showingAssets && !showingInventory && !showingEntry ? <SearchInput\n value={search}\n onChange={setSearch}\n placeholder={t('design_system.gallery.searchPlaceholder', 'Search components\u2026')}\n aria-label={t('design_system.gallery.searchPlaceholder', 'Search components\u2026')}\n /> : null}\n {searching ? renderSearchResults() : showingComponents ? <ComponentIndex families={componentFamilies} loaded={loaded} failed={failed} onRetry={loadFamily} /> : renderActiveFamily()}\n </>}\n </div>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["selectedEntry", "family"]
7
7
  }
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
4
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@open-mercato/ui/primitives/select";
5
+ import { SourceIconCatalogue } from "../demos/source-icons.js";
6
+ import { SourceArtworkCatalogue } from "../demos/source-artwork.js";
7
+ import { IconGrid } from "../demos/registered-icons.js";
8
+ const collections = [
9
+ { id: "icons", entryId: "source-icons", variantId: "catalogue" },
10
+ { id: "brands", entryId: "source-artwork", variantId: "brands", group: "brand" },
11
+ { id: "flags", entryId: "source-artwork", variantId: "flags", group: "country-flags" },
12
+ { id: "emoji", entryId: "source-artwork", variantId: "emoji", group: "emojies" },
13
+ { id: "badges", entryId: "source-artwork", variantId: "store-badges", group: "appstore-badges" },
14
+ { id: "thumbnails", entryId: "source-artwork", variantId: "thumbnails", group: "thumbnails" },
15
+ { id: "cursors", entryId: "source-artwork", variantId: "cursors", group: "others" },
16
+ { id: "registered", entryId: "icon-registry", variantId: "registry" }
17
+ ];
18
+ function IconsBrowser({ entryId, variantId, onNavigate }) {
19
+ const t = useT();
20
+ const collection = collections.find((item) => item.entryId === entryId && item.variantId === variantId) ?? collections.find((item) => item.entryId === entryId) ?? collections[0];
21
+ const collectionControl = /* @__PURE__ */ jsxs(Select, { value: collection.id, onValueChange: (value) => {
22
+ const next = collections.find((item) => item.id === value);
23
+ if (next) onNavigate(next.entryId, next.variantId);
24
+ }, children: [
25
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "w-64 max-w-full", "aria-label": t("design_system.gallery.assets.collection"), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
26
+ /* @__PURE__ */ jsx(SelectContent, { children: collections.map((item) => /* @__PURE__ */ jsx(SelectItem, { value: item.id, children: t(`design_system.gallery.assets.${item.id}`) }, item.id)) })
27
+ ] });
28
+ return collection.group ? /* @__PURE__ */ jsx(SourceArtworkCatalogue, { group: collection.group, collectionControl }, collection.id) : collection.id === "registered" ? /* @__PURE__ */ jsx(IconGrid, { collectionControl }) : /* @__PURE__ */ jsx(SourceIconCatalogue, { collectionControl });
29
+ }
30
+ export {
31
+ IconsBrowser
32
+ };
33
+ //# sourceMappingURL=IconsBrowser.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/components/IconsBrowser.tsx"],
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'\nimport { SourceIconCatalogue } from '../demos/source-icons'\nimport { SourceArtworkCatalogue } from '../demos/source-artwork'\nimport { IconGrid } from '../demos/registered-icons'\nimport type { SourceArtworkGroup } from '@open-mercato/ui/assets/source-artwork'\n\nconst collections: { id: string; entryId: string; variantId: string; group?: SourceArtworkGroup }[] = [\n { id: 'icons', entryId: 'source-icons', variantId: 'catalogue' },\n { id: 'brands', entryId: 'source-artwork', variantId: 'brands', group: 'brand' },\n { id: 'flags', entryId: 'source-artwork', variantId: 'flags', group: 'country-flags' },\n { id: 'emoji', entryId: 'source-artwork', variantId: 'emoji', group: 'emojies' },\n { id: 'badges', entryId: 'source-artwork', variantId: 'store-badges', group: 'appstore-badges' },\n { id: 'thumbnails', entryId: 'source-artwork', variantId: 'thumbnails', group: 'thumbnails' },\n { id: 'cursors', entryId: 'source-artwork', variantId: 'cursors', group: 'others' },\n { id: 'registered', entryId: 'icon-registry', variantId: 'registry' },\n]\n\nexport function IconsBrowser({ entryId, variantId, onNavigate }: {\n entryId?: string\n variantId?: string\n onNavigate: (entryId: string, variantId?: string) => void\n}) {\n const t = useT()\n const collection = collections.find(item => item.entryId === entryId && item.variantId === variantId)\n ?? collections.find(item => item.entryId === entryId)\n ?? collections[0]\n const collectionControl = <Select value={collection.id} onValueChange={value => {\n const next = collections.find(item => item.id === value)\n if (next) onNavigate(next.entryId, next.variantId)\n }}>\n <SelectTrigger className=\"w-64 max-w-full\" aria-label={t('design_system.gallery.assets.collection')}><SelectValue /></SelectTrigger>\n <SelectContent>{collections.map(item => <SelectItem key={item.id} value={item.id}>{t(`design_system.gallery.assets.${item.id}`)}</SelectItem>)}</SelectContent>\n </Select>\n return collection.group ? <SourceArtworkCatalogue key={collection.id} group={collection.group} collectionControl={collectionControl} />\n : collection.id === 'registered' ? <IconGrid collectionControl={collectionControl} /> : <SourceIconCatalogue collectionControl={collectionControl} />\n}\n"],
5
+ "mappings": ";AA8B4B,SAI+E,KAJ/E;AA3B5B,SAAS,YAAY;AACrB,SAAS,QAAQ,eAAe,YAAY,eAAe,mBAAmB;AAC9E,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,gBAAgB;AAGzB,MAAM,cAAgG;AAAA,EACpG,EAAE,IAAI,SAAS,SAAS,gBAAgB,WAAW,YAAY;AAAA,EAC/D,EAAE,IAAI,UAAU,SAAS,kBAAkB,WAAW,UAAU,OAAO,QAAQ;AAAA,EAC/E,EAAE,IAAI,SAAS,SAAS,kBAAkB,WAAW,SAAS,OAAO,gBAAgB;AAAA,EACrF,EAAE,IAAI,SAAS,SAAS,kBAAkB,WAAW,SAAS,OAAO,UAAU;AAAA,EAC/E,EAAE,IAAI,UAAU,SAAS,kBAAkB,WAAW,gBAAgB,OAAO,kBAAkB;AAAA,EAC/F,EAAE,IAAI,cAAc,SAAS,kBAAkB,WAAW,cAAc,OAAO,aAAa;AAAA,EAC5F,EAAE,IAAI,WAAW,SAAS,kBAAkB,WAAW,WAAW,OAAO,SAAS;AAAA,EAClF,EAAE,IAAI,cAAc,SAAS,iBAAiB,WAAW,WAAW;AACtE;AAEO,SAAS,aAAa,EAAE,SAAS,WAAW,WAAW,GAI3D;AACD,QAAM,IAAI,KAAK;AACf,QAAM,aAAa,YAAY,KAAK,UAAQ,KAAK,YAAY,WAAW,KAAK,cAAc,SAAS,KAC/F,YAAY,KAAK,UAAQ,KAAK,YAAY,OAAO,KACjD,YAAY,CAAC;AAClB,QAAM,oBAAoB,qBAAC,UAAO,OAAO,WAAW,IAAI,eAAe,WAAS;AAC5E,UAAM,OAAO,YAAY,KAAK,UAAQ,KAAK,OAAO,KAAK;AACvD,QAAI,KAAM,YAAW,KAAK,SAAS,KAAK,SAAS;AAAA,EACnD,GACE;AAAA,wBAAC,iBAAc,WAAU,mBAAkB,cAAY,EAAE,yCAAyC,GAAG,8BAAC,eAAY,GAAE;AAAA,IACpH,oBAAC,iBAAe,sBAAY,IAAI,UAAQ,oBAAC,cAAyB,OAAO,KAAK,IAAK,YAAE,gCAAgC,KAAK,EAAE,EAAE,KAArE,KAAK,EAAkE,CAAa,GAAE;AAAA,KACjJ;AACF,SAAO,WAAW,QAAQ,oBAAC,0BAA2C,OAAO,WAAW,OAAO,qBAAxC,WAAW,EAAmE,IACjI,WAAW,OAAO,eAAe,oBAAC,YAAS,mBAAsC,IAAK,oBAAC,uBAAoB,mBAAsC;AACvJ;",
6
+ "names": []
7
+ }