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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/build.mjs +11 -0
  3. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +23 -0
  4. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  5. package/dist/modules/customers/backend/customers/companies/[id]/page.js +2 -1
  6. package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
  7. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -1
  8. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  9. package/dist/modules/customers/backend/customers/people/[id]/page.js +2 -2
  10. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  11. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -1
  12. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  13. package/dist/modules/customers/lib/detailHelpers.js +4 -0
  14. package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
  15. package/dist/modules/customers/lib/todoCompatibility.js +5 -0
  16. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  17. package/dist/modules/design_system/backend/design-system/page.meta.js +3 -2
  18. package/dist/modules/design_system/backend/design-system/page.meta.js.map +2 -2
  19. package/dist/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
  20. package/dist/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
  21. package/dist/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
  22. package/dist/modules/design_system/gallery/assets/avatar-photo.png +0 -0
  23. package/dist/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
  24. package/dist/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
  25. package/dist/modules/design_system/gallery/assets/crypto-ada.png +0 -0
  26. package/dist/modules/design_system/gallery/assets/crypto-avax.png +0 -0
  27. package/dist/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
  28. package/dist/modules/design_system/gallery/assets/crypto-brand.png +0 -0
  29. package/dist/modules/design_system/gallery/assets/crypto-btc.png +0 -0
  30. package/dist/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
  31. package/dist/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
  32. package/dist/modules/design_system/gallery/assets/crypto-dot.png +0 -0
  33. package/dist/modules/design_system/gallery/assets/crypto-eth.png +0 -0
  34. package/dist/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
  35. package/dist/modules/design_system/gallery/assets/crypto-history.svg +3 -0
  36. package/dist/modules/design_system/gallery/assets/crypto-link.svg +3 -0
  37. package/dist/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
  38. package/dist/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
  39. package/dist/modules/design_system/gallery/assets/crypto-more.svg +3 -0
  40. package/dist/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
  41. package/dist/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
  42. package/dist/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
  43. package/dist/modules/design_system/gallery/assets/crypto-sol.png +0 -0
  44. package/dist/modules/design_system/gallery/assets/crypto-star.svg +3 -0
  45. package/dist/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
  46. package/dist/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
  47. package/dist/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
  48. package/dist/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
  49. package/dist/modules/design_system/gallery/assets/crypto-trx.png +0 -0
  50. package/dist/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
  51. package/dist/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
  52. package/dist/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
  53. package/dist/modules/design_system/gallery/assets/crypto-wei.png +0 -0
  54. package/dist/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
  55. package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js +67 -0
  56. package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js.map +7 -0
  57. package/dist/modules/design_system/gallery/assets/github-logo.png +0 -0
  58. package/dist/modules/design_system/gallery/assets/images.d.js +1 -0
  59. package/dist/modules/design_system/gallery/assets/images.d.js.map +7 -0
  60. package/dist/modules/design_system/gallery/assets/input-european-union.svg +18 -0
  61. package/dist/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
  62. package/dist/modules/design_system/gallery/assets/marketing-artwork.js +83 -0
  63. package/dist/modules/design_system/gallery/assets/marketing-artwork.js.map +7 -0
  64. package/dist/modules/design_system/gallery/assets/menu-apex.svg +18 -0
  65. package/dist/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
  66. package/dist/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
  67. package/dist/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
  68. package/dist/modules/design_system/gallery/assets/select-google.png +0 -0
  69. package/dist/modules/design_system/gallery/assets/select-poland.png +0 -0
  70. package/dist/modules/design_system/gallery/assets/selection-artwork.js +5 -0
  71. package/dist/modules/design_system/gallery/assets/selection-artwork.js.map +7 -0
  72. package/dist/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
  73. package/dist/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
  74. package/dist/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
  75. package/dist/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
  76. package/dist/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
  77. package/dist/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
  78. package/dist/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
  79. package/dist/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
  80. package/dist/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
  81. package/dist/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
  82. package/dist/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
  83. package/dist/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
  84. package/dist/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
  85. package/dist/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
  86. package/dist/modules/design_system/gallery/assets/style-studio-product.png +0 -0
  87. package/dist/modules/design_system/gallery/assets/upload-images.js +8 -0
  88. package/dist/modules/design_system/gallery/assets/upload-images.js.map +7 -0
  89. package/dist/modules/design_system/gallery/components/BrandStylePreview.js +74 -0
  90. package/dist/modules/design_system/gallery/components/BrandStylePreview.js.map +7 -0
  91. package/dist/modules/design_system/gallery/components/CodeSnippet.js +31 -31
  92. package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +2 -2
  93. package/dist/modules/design_system/gallery/components/ColorPlayground.js +408 -0
  94. package/dist/modules/design_system/gallery/components/ColorPlayground.js.map +7 -0
  95. package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js +166 -0
  96. package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js.map +7 -0
  97. package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js +182 -0
  98. package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js.map +7 -0
  99. package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js +80 -0
  100. package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js.map +7 -0
  101. package/dist/modules/design_system/gallery/components/ComponentIndex.js +42 -0
  102. package/dist/modules/design_system/gallery/components/ComponentIndex.js.map +7 -0
  103. package/dist/modules/design_system/gallery/components/DesignSystemHome.js +69 -0
  104. package/dist/modules/design_system/gallery/components/DesignSystemHome.js.map +7 -0
  105. package/dist/modules/design_system/gallery/components/EntryCard.js +47 -41
  106. package/dist/modules/design_system/gallery/components/EntryCard.js.map +2 -2
  107. package/dist/modules/design_system/gallery/components/EntryHeader.js +68 -0
  108. package/dist/modules/design_system/gallery/components/EntryHeader.js.map +7 -0
  109. package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js +19 -0
  110. package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js.map +7 -0
  111. package/dist/modules/design_system/gallery/components/FoundationGuide.js +46 -0
  112. package/dist/modules/design_system/gallery/components/FoundationGuide.js.map +7 -0
  113. package/dist/modules/design_system/gallery/components/GalleryLink.js +21 -0
  114. package/dist/modules/design_system/gallery/components/GalleryLink.js.map +7 -0
  115. package/dist/modules/design_system/gallery/components/GalleryNavigation.js +82 -0
  116. package/dist/modules/design_system/gallery/components/GalleryNavigation.js.map +7 -0
  117. package/dist/modules/design_system/gallery/components/GalleryShell.js +147 -67
  118. package/dist/modules/design_system/gallery/components/GalleryShell.js.map +3 -3
  119. package/dist/modules/design_system/gallery/components/IconsBrowser.js +33 -0
  120. package/dist/modules/design_system/gallery/components/IconsBrowser.js.map +7 -0
  121. package/dist/modules/design_system/gallery/components/SourceLibrary.js +93 -0
  122. package/dist/modules/design_system/gallery/components/SourceLibrary.js.map +7 -0
  123. package/dist/modules/design_system/gallery/components/StyleAgents.js +139 -0
  124. package/dist/modules/design_system/gallery/components/StyleAgents.js.map +7 -0
  125. package/dist/modules/design_system/gallery/components/ThemeTokenReference.js +101 -0
  126. package/dist/modules/design_system/gallery/components/ThemeTokenReference.js.map +7 -0
  127. package/dist/modules/design_system/gallery/components/VariantPreview.js +2 -2
  128. package/dist/modules/design_system/gallery/components/VariantPreview.js.map +2 -2
  129. package/dist/modules/design_system/gallery/components/colorPreview.js +58 -0
  130. package/dist/modules/design_system/gallery/components/colorPreview.js.map +7 -0
  131. package/dist/modules/design_system/gallery/components/colorStudio.js +218 -0
  132. package/dist/modules/design_system/gallery/components/colorStudio.js.map +7 -0
  133. package/dist/modules/design_system/gallery/components/styleAgentBranding.js +46 -0
  134. package/dist/modules/design_system/gallery/components/styleAgentBranding.js.map +7 -0
  135. package/dist/modules/design_system/gallery/components/themeTokens.js +32 -0
  136. package/dist/modules/design_system/gallery/components/themeTokens.js.map +7 -0
  137. package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js +194 -0
  138. package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js.map +7 -0
  139. package/dist/modules/design_system/gallery/demos/ai-product.js +423 -0
  140. package/dist/modules/design_system/gallery/demos/ai-product.js.map +7 -0
  141. package/dist/modules/design_system/gallery/demos/buttons.js +289 -0
  142. package/dist/modules/design_system/gallery/demos/buttons.js.map +7 -0
  143. package/dist/modules/design_system/gallery/demos/cryptocurrency.js +1708 -0
  144. package/dist/modules/design_system/gallery/demos/cryptocurrency.js.map +7 -0
  145. package/dist/modules/design_system/gallery/demos/feeds-code.generated.js +92 -0
  146. package/dist/modules/design_system/gallery/demos/feeds-code.generated.js.map +7 -0
  147. package/dist/modules/design_system/gallery/demos/feeds.js +148 -0
  148. package/dist/modules/design_system/gallery/demos/feeds.js.map +7 -0
  149. package/dist/modules/design_system/gallery/demos/file-upload.js +72 -0
  150. package/dist/modules/design_system/gallery/demos/file-upload.js.map +7 -0
  151. package/dist/modules/design_system/gallery/demos/foundation-reference-data.js +4875 -0
  152. package/dist/modules/design_system/gallery/demos/foundation-reference-data.js.map +7 -0
  153. package/dist/modules/design_system/gallery/demos/foundation-references.js +188 -0
  154. package/dist/modules/design_system/gallery/demos/foundation-references.js.map +7 -0
  155. package/dist/modules/design_system/gallery/demos/key-components-code.generated.js +6 -0
  156. package/dist/modules/design_system/gallery/demos/key-components-code.generated.js.map +7 -0
  157. package/dist/modules/design_system/gallery/demos/key-components.js +127 -0
  158. package/dist/modules/design_system/gallery/demos/key-components.js.map +7 -0
  159. package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js +98 -0
  160. package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js.map +7 -0
  161. package/dist/modules/design_system/gallery/demos/marketing-controls.js +134 -0
  162. package/dist/modules/design_system/gallery/demos/marketing-controls.js.map +7 -0
  163. package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js +195 -0
  164. package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js.map +7 -0
  165. package/dist/modules/design_system/gallery/demos/marketing-widgets.js +586 -0
  166. package/dist/modules/design_system/gallery/demos/marketing-widgets.js.map +7 -0
  167. package/dist/modules/design_system/gallery/demos/menu-fixtures.js +40 -0
  168. package/dist/modules/design_system/gallery/demos/menu-fixtures.js.map +7 -0
  169. package/dist/modules/design_system/gallery/demos/menu-sources.js +295 -0
  170. package/dist/modules/design_system/gallery/demos/menu-sources.js.map +7 -0
  171. package/dist/modules/design_system/gallery/demos/menus.js +150 -0
  172. package/dist/modules/design_system/gallery/demos/menus.js.map +7 -0
  173. package/dist/modules/design_system/gallery/demos/rating-reviews.js +53 -0
  174. package/dist/modules/design_system/gallery/demos/rating-reviews.js.map +7 -0
  175. package/dist/modules/design_system/gallery/demos/registered-icons.js +104 -0
  176. package/dist/modules/design_system/gallery/demos/registered-icons.js.map +7 -0
  177. package/dist/modules/design_system/gallery/demos/selection-cards.js +99 -0
  178. package/dist/modules/design_system/gallery/demos/selection-cards.js.map +7 -0
  179. package/dist/modules/design_system/gallery/demos/shell-code.generated.js +189 -0
  180. package/dist/modules/design_system/gallery/demos/shell-code.generated.js.map +7 -0
  181. package/dist/modules/design_system/gallery/demos/shell.js +330 -0
  182. package/dist/modules/design_system/gallery/demos/shell.js.map +7 -0
  183. package/dist/modules/design_system/gallery/demos/source-artwork.js +120 -0
  184. package/dist/modules/design_system/gallery/demos/source-artwork.js.map +7 -0
  185. package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js +125 -0
  186. package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js.map +7 -0
  187. package/dist/modules/design_system/gallery/demos/source-filters.js +185 -0
  188. package/dist/modules/design_system/gallery/demos/source-filters.js.map +7 -0
  189. package/dist/modules/design_system/gallery/demos/source-icons.js +69 -0
  190. package/dist/modules/design_system/gallery/demos/source-icons.js.map +7 -0
  191. package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js +150 -0
  192. package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js.map +7 -0
  193. package/dist/modules/design_system/gallery/demos/table-cells.js +181 -0
  194. package/dist/modules/design_system/gallery/demos/table-cells.js.map +7 -0
  195. package/dist/modules/design_system/gallery/demos/text-inputs.js +113 -0
  196. package/dist/modules/design_system/gallery/demos/text-inputs.js.map +7 -0
  197. package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js +41 -0
  198. package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js.map +7 -0
  199. package/dist/modules/design_system/gallery/demos/time-picker.js +41 -0
  200. package/dist/modules/design_system/gallery/demos/time-picker.js.map +7 -0
  201. package/dist/modules/design_system/gallery/entries/banners.js +123 -60
  202. package/dist/modules/design_system/gallery/entries/banners.js.map +2 -2
  203. package/dist/modules/design_system/gallery/entries/buttons-snippets.js +433 -0
  204. package/dist/modules/design_system/gallery/entries/buttons-snippets.js.map +7 -0
  205. package/dist/modules/design_system/gallery/entries/buttons.js +127 -148
  206. package/dist/modules/design_system/gallery/entries/buttons.js.map +2 -2
  207. package/dist/modules/design_system/gallery/entries/charts.js +532 -186
  208. package/dist/modules/design_system/gallery/entries/charts.js.map +2 -2
  209. package/dist/modules/design_system/gallery/entries/dates.js +191 -3
  210. package/dist/modules/design_system/gallery/entries/dates.js.map +2 -2
  211. package/dist/modules/design_system/gallery/entries/detail.js +118 -77
  212. package/dist/modules/design_system/gallery/entries/detail.js.map +2 -2
  213. package/dist/modules/design_system/gallery/entries/display.js +1449 -240
  214. package/dist/modules/design_system/gallery/entries/display.js.map +2 -2
  215. package/dist/modules/design_system/gallery/entries/feedback.js +1058 -132
  216. package/dist/modules/design_system/gallery/entries/feedback.js.map +2 -2
  217. package/dist/modules/design_system/gallery/entries/filters.js +231 -103
  218. package/dist/modules/design_system/gallery/entries/filters.js.map +2 -2
  219. package/dist/modules/design_system/gallery/entries/foundations.js +368 -57
  220. package/dist/modules/design_system/gallery/entries/foundations.js.map +2 -2
  221. package/dist/modules/design_system/gallery/entries/icons.js +29 -91
  222. package/dist/modules/design_system/gallery/entries/icons.js.map +2 -2
  223. package/dist/modules/design_system/gallery/entries/inputs-snippets.js +154 -0
  224. package/dist/modules/design_system/gallery/entries/inputs-snippets.js.map +7 -0
  225. package/dist/modules/design_system/gallery/entries/inputs.js +2043 -306
  226. package/dist/modules/design_system/gallery/entries/inputs.js.map +2 -2
  227. package/dist/modules/design_system/gallery/entries/library.js +20 -0
  228. package/dist/modules/design_system/gallery/entries/library.js.map +7 -0
  229. package/dist/modules/design_system/gallery/entries/messages.js +121 -103
  230. package/dist/modules/design_system/gallery/entries/messages.js.map +2 -2
  231. package/dist/modules/design_system/gallery/entries/navigation.js +676 -103
  232. package/dist/modules/design_system/gallery/entries/navigation.js.map +2 -2
  233. package/dist/modules/design_system/gallery/entries/notifications.js +131 -78
  234. package/dist/modules/design_system/gallery/entries/notifications.js.map +2 -2
  235. package/dist/modules/design_system/gallery/entries/overlays.js +611 -203
  236. package/dist/modules/design_system/gallery/entries/overlays.js.map +2 -2
  237. package/dist/modules/design_system/gallery/entries/scaffolding.js +1175 -120
  238. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +2 -2
  239. package/dist/modules/design_system/gallery/entries/schedule.js +79 -54
  240. package/dist/modules/design_system/gallery/entries/schedule.js.map +2 -2
  241. package/dist/modules/design_system/gallery/presentation.js +108 -0
  242. package/dist/modules/design_system/gallery/presentation.js.map +7 -0
  243. package/dist/modules/design_system/gallery/registry.js +8 -5
  244. package/dist/modules/design_system/gallery/registry.js.map +2 -2
  245. package/dist/modules/design_system/gallery/source-library.generated.js +5 -0
  246. package/dist/modules/design_system/gallery/source-library.generated.js.map +7 -0
  247. package/dist/modules/design_system/i18n/de.json +7167 -0
  248. package/dist/modules/design_system/i18n/en.json +7167 -0
  249. package/dist/modules/design_system/i18n/es.json +7167 -0
  250. package/dist/modules/design_system/i18n/ko.json +7167 -0
  251. package/dist/modules/design_system/i18n/pl.json +7167 -0
  252. package/dist/modules/push_notifications/lib/queue.js +1 -31
  253. package/dist/modules/push_notifications/lib/queue.js.map +2 -2
  254. package/jest.config.cjs +1 -0
  255. package/jest.mocks/image.js +1 -0
  256. package/package.json +8 -8
  257. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +50 -0
  258. package/src/modules/customers/backend/customers/companies/[id]/page.tsx +2 -1
  259. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +2 -1
  260. package/src/modules/customers/backend/customers/people/[id]/page.tsx +2 -2
  261. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +2 -1
  262. package/src/modules/customers/lib/detailHelpers.ts +4 -0
  263. package/src/modules/customers/lib/todoCompatibility.ts +10 -0
  264. package/src/modules/design_system/backend/design-system/page.meta.ts +3 -2
  265. package/src/modules/design_system/gallery/assets/README.md +30 -0
  266. package/src/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
  267. package/src/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
  268. package/src/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
  269. package/src/modules/design_system/gallery/assets/avatar-photo.png +0 -0
  270. package/src/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
  271. package/src/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
  272. package/src/modules/design_system/gallery/assets/crypto-ada.png +0 -0
  273. package/src/modules/design_system/gallery/assets/crypto-avax.png +0 -0
  274. package/src/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
  275. package/src/modules/design_system/gallery/assets/crypto-brand.png +0 -0
  276. package/src/modules/design_system/gallery/assets/crypto-btc.png +0 -0
  277. package/src/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
  278. package/src/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
  279. package/src/modules/design_system/gallery/assets/crypto-dot.png +0 -0
  280. package/src/modules/design_system/gallery/assets/crypto-eth.png +0 -0
  281. package/src/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
  282. package/src/modules/design_system/gallery/assets/crypto-history.svg +3 -0
  283. package/src/modules/design_system/gallery/assets/crypto-link.svg +3 -0
  284. package/src/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
  285. package/src/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
  286. package/src/modules/design_system/gallery/assets/crypto-more.svg +3 -0
  287. package/src/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
  288. package/src/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
  289. package/src/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
  290. package/src/modules/design_system/gallery/assets/crypto-sol.png +0 -0
  291. package/src/modules/design_system/gallery/assets/crypto-star.svg +3 -0
  292. package/src/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
  293. package/src/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
  294. package/src/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
  295. package/src/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
  296. package/src/modules/design_system/gallery/assets/crypto-trx.png +0 -0
  297. package/src/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
  298. package/src/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
  299. package/src/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
  300. package/src/modules/design_system/gallery/assets/crypto-wei.png +0 -0
  301. package/src/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
  302. package/src/modules/design_system/gallery/assets/cryptocurrency-artwork.ts +63 -0
  303. package/src/modules/design_system/gallery/assets/github-logo.png +0 -0
  304. package/src/modules/design_system/gallery/assets/images.d.ts +9 -0
  305. package/src/modules/design_system/gallery/assets/input-european-union.svg +18 -0
  306. package/src/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
  307. package/src/modules/design_system/gallery/assets/marketing-artwork.ts +79 -0
  308. package/src/modules/design_system/gallery/assets/menu-apex.svg +18 -0
  309. package/src/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
  310. package/src/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
  311. package/src/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
  312. package/src/modules/design_system/gallery/assets/select-google.png +0 -0
  313. package/src/modules/design_system/gallery/assets/select-poland.png +0 -0
  314. package/src/modules/design_system/gallery/assets/selection-artwork.ts +1 -0
  315. package/src/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
  316. package/src/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
  317. package/src/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
  318. package/src/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
  319. package/src/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
  320. package/src/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
  321. package/src/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
  322. package/src/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
  323. package/src/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
  324. package/src/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
  325. package/src/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
  326. package/src/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
  327. package/src/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
  328. package/src/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
  329. package/src/modules/design_system/gallery/assets/style-studio-product.png +0 -0
  330. package/src/modules/design_system/gallery/assets/upload-images.ts +5 -0
  331. package/src/modules/design_system/gallery/components/BrandStylePreview.tsx +94 -0
  332. package/src/modules/design_system/gallery/components/CodeSnippet.tsx +34 -34
  333. package/src/modules/design_system/gallery/components/ColorPlayground.tsx +324 -0
  334. package/src/modules/design_system/gallery/components/ColorStudioCompositions.tsx +96 -0
  335. package/src/modules/design_system/gallery/components/ColorStudioSpecimen.tsx +164 -0
  336. package/src/modules/design_system/gallery/components/CompactEntrySpecimen.tsx +65 -0
  337. package/src/modules/design_system/gallery/components/ComponentIndex.tsx +47 -0
  338. package/src/modules/design_system/gallery/components/DesignSystemHome.tsx +66 -0
  339. package/src/modules/design_system/gallery/components/EntryCard.tsx +52 -37
  340. package/src/modules/design_system/gallery/components/EntryHeader.tsx +80 -0
  341. package/src/modules/design_system/gallery/components/FamilyEntryPreview.tsx +22 -0
  342. package/src/modules/design_system/gallery/components/FoundationGuide.tsx +43 -0
  343. package/src/modules/design_system/gallery/components/GalleryLink.tsx +19 -0
  344. package/src/modules/design_system/gallery/components/GalleryNavigation.tsx +86 -0
  345. package/src/modules/design_system/gallery/components/GalleryShell.tsx +149 -63
  346. package/src/modules/design_system/gallery/components/IconsBrowser.tsx +40 -0
  347. package/src/modules/design_system/gallery/components/SourceLibrary.tsx +90 -0
  348. package/src/modules/design_system/gallery/components/StyleAgents.tsx +115 -0
  349. package/src/modules/design_system/gallery/components/ThemeTokenReference.tsx +76 -0
  350. package/src/modules/design_system/gallery/components/VariantPreview.tsx +2 -2
  351. package/src/modules/design_system/gallery/components/colorPreview.ts +63 -0
  352. package/src/modules/design_system/gallery/components/colorStudio.ts +260 -0
  353. package/src/modules/design_system/gallery/components/styleAgentBranding.ts +42 -0
  354. package/src/modules/design_system/gallery/components/themeTokens.ts +26 -0
  355. package/src/modules/design_system/gallery/demos/ai-product-code.generated.ts +3 -0
  356. package/src/modules/design_system/gallery/demos/ai-product.tsx +188 -0
  357. package/src/modules/design_system/gallery/demos/buttons.tsx +331 -0
  358. package/src/modules/design_system/gallery/demos/cryptocurrency.tsx +1943 -0
  359. package/src/modules/design_system/gallery/demos/feeds-code.generated.ts +4 -0
  360. package/src/modules/design_system/gallery/demos/feeds.tsx +82 -0
  361. package/src/modules/design_system/gallery/demos/file-upload.tsx +61 -0
  362. package/src/modules/design_system/gallery/demos/foundation-reference-data.ts +4872 -0
  363. package/src/modules/design_system/gallery/demos/foundation-references.tsx +140 -0
  364. package/src/modules/design_system/gallery/demos/key-components-code.generated.ts +3 -0
  365. package/src/modules/design_system/gallery/demos/key-components.tsx +106 -0
  366. package/src/modules/design_system/gallery/demos/marketing-controls-code.generated.ts +3 -0
  367. package/src/modules/design_system/gallery/demos/marketing-controls.tsx +92 -0
  368. package/src/modules/design_system/gallery/demos/marketing-widgets-code.generated.ts +3 -0
  369. package/src/modules/design_system/gallery/demos/marketing-widgets.tsx +189 -0
  370. package/src/modules/design_system/gallery/demos/menu-fixtures.tsx +48 -0
  371. package/src/modules/design_system/gallery/demos/menu-sources.ts +5 -0
  372. package/src/modules/design_system/gallery/demos/menus.tsx +122 -0
  373. package/src/modules/design_system/gallery/demos/rating-reviews.tsx +44 -0
  374. package/src/modules/design_system/gallery/demos/registered-icons.tsx +117 -0
  375. package/src/modules/design_system/gallery/demos/selection-cards.tsx +97 -0
  376. package/src/modules/design_system/gallery/demos/shell-code.generated.ts +3 -0
  377. package/src/modules/design_system/gallery/demos/shell.tsx +183 -0
  378. package/src/modules/design_system/gallery/demos/source-artwork.tsx +88 -0
  379. package/src/modules/design_system/gallery/demos/source-filters-code.generated.ts +3 -0
  380. package/src/modules/design_system/gallery/demos/source-filters.tsx +119 -0
  381. package/src/modules/design_system/gallery/demos/source-icons.tsx +62 -0
  382. package/src/modules/design_system/gallery/demos/table-cells-code.generated.ts +3 -0
  383. package/src/modules/design_system/gallery/demos/table-cells.tsx +144 -0
  384. package/src/modules/design_system/gallery/demos/text-inputs.tsx +90 -0
  385. package/src/modules/design_system/gallery/demos/time-picker-code.generated.ts +5 -0
  386. package/src/modules/design_system/gallery/demos/time-picker.tsx +31 -0
  387. package/src/modules/design_system/gallery/entries/banners.tsx +143 -94
  388. package/src/modules/design_system/gallery/entries/buttons-snippets.ts +432 -0
  389. package/src/modules/design_system/gallery/entries/buttons.tsx +125 -196
  390. package/src/modules/design_system/gallery/entries/charts.tsx +545 -233
  391. package/src/modules/design_system/gallery/entries/dates.tsx +171 -3
  392. package/src/modules/design_system/gallery/entries/detail.tsx +142 -115
  393. package/src/modules/design_system/gallery/entries/display.tsx +1691 -319
  394. package/src/modules/design_system/gallery/entries/feedback.tsx +1082 -169
  395. package/src/modules/design_system/gallery/entries/filters.tsx +238 -143
  396. package/src/modules/design_system/gallery/entries/foundations.tsx +404 -61
  397. package/src/modules/design_system/gallery/entries/icons.tsx +31 -117
  398. package/src/modules/design_system/gallery/entries/inputs-snippets.ts +156 -0
  399. package/src/modules/design_system/gallery/entries/inputs.tsx +2146 -503
  400. package/src/modules/design_system/gallery/entries/library.tsx +16 -0
  401. package/src/modules/design_system/gallery/entries/messages.tsx +114 -106
  402. package/src/modules/design_system/gallery/entries/navigation.tsx +782 -192
  403. package/src/modules/design_system/gallery/entries/notifications.tsx +145 -120
  404. package/src/modules/design_system/gallery/entries/overlays.tsx +696 -280
  405. package/src/modules/design_system/gallery/entries/scaffolding.tsx +1192 -158
  406. package/src/modules/design_system/gallery/entries/schedule.tsx +72 -58
  407. package/src/modules/design_system/gallery/presentation.ts +106 -0
  408. package/src/modules/design_system/gallery/registry.ts +8 -6
  409. package/src/modules/design_system/gallery/source-library.generated.ts +2 -0
  410. package/src/modules/design_system/i18n/de.json +7112 -3
  411. package/src/modules/design_system/i18n/en.json +7112 -3
  412. package/src/modules/design_system/i18n/es.json +7112 -3
  413. package/src/modules/design_system/i18n/ko.json +7112 -3
  414. package/src/modules/design_system/i18n/pl.json +7112 -3
  415. package/src/modules/push_notifications/AGENTS.md +9 -5
  416. package/src/modules/push_notifications/lib/queue.ts +15 -44
@@ -0,0 +1,125 @@
1
+ const source = `import * as React from 'react'
2
+ import { CalendarDays, Check, Filter, Settings2 } from 'lucide-react'
3
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
4
+ import { Button } from '@open-mercato/ui/primitives/button'
5
+ import { ButtonGroup } from '@open-mercato/ui/primitives/button-group'
6
+ import { Calendar } from '@open-mercato/ui/primitives/calendar'
7
+ import { CheckboxField } from '@open-mercato/ui/primitives/checkbox-field'
8
+ import { FilterToolbar, FilterPanelItem, FilterPanelHeader, FilterPanelFooter } from '@open-mercato/ui/primitives/filter-toolbar'
9
+ import { IconButton } from '@open-mercato/ui/primitives/icon-button'
10
+ import { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'
11
+ import { SearchInput } from '@open-mercato/ui/primitives/search-input'
12
+ import { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'
13
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'
14
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@open-mercato/ui/primitives/table'
15
+
16
+ type Filters = { date?: Date; statuses: string[] }
17
+ const transactionRows = [
18
+ { name: 'Apex', type: 'income', date: new Date(2023, 7, 11), amount: 1240, status: 'completed' },
19
+ { name: 'Spotify', type: 'expense', date: new Date(2023, 7, 10), amount: -12, status: 'completed' },
20
+ { name: 'Synergy', type: 'income', date: new Date(2023, 7, 9), amount: 680, status: 'pending' },
21
+ { name: 'Loom', type: 'expense', date: new Date(2023, 7, 11), amount: -18, status: 'pending' },
22
+ ]
23
+ const emptyFilters = (): Filters => ({ statuses: [] })
24
+
25
+ function useFilterCopy() {
26
+ const t = useT()
27
+ return (key: string, values?: Record<string, string | number>) => t(\`design_system.gallery.examples.sourceFilters.\${key}\`, values)
28
+ }
29
+
30
+ export function SourceFilterPanel({ value, onApply }: { value?: Filters; onApply?: (value: Filters) => void }) {
31
+ const copy = useFilterCopy()
32
+ const [draft, setDraft] = React.useState<Filters>(() => value ?? emptyFilters())
33
+ const [section, setSection] = React.useState('date')
34
+ const [applied, setApplied] = React.useState(false)
35
+ const panelId = React.useId()
36
+ function clear() { setDraft(emptyFilters()); setApplied(false) }
37
+ return <div className="w-full min-w-0 bg-background" data-example="filter-panel">
38
+ <div className="flex flex-col sm:flex-row">
39
+ <div className="flex shrink-0 flex-wrap gap-1 border-b border-border p-3 sm:w-[224px] sm:flex-col sm:border-b-0 sm:border-r" role="group" aria-label={copy('categories')}>
40
+ <FilterPanelItem active={section === 'date'} leading={<CalendarDays />} aria-controls={panelId} onClick={() => setSection('date')}>{copy('date')}</FilterPanelItem>
41
+ <FilterPanelItem active={section === 'status'} leading={<Check />} aria-controls={panelId} onClick={() => setSection('status')}>{copy('status')}</FilterPanelItem>
42
+ </div>
43
+ <section id={panelId} aria-label={copy(section)} className="min-w-0 flex-1">
44
+ <FilterPanelHeader title={copy(section)} leading={section === 'date' ? <CalendarDays /> : <Check />} action={<Button variant="link" className="h-auto p-0 text-sm leading-5 text-muted-foreground" onClick={clear}>{copy('clear')}</Button>} />
45
+ <div className="flex min-h-80 justify-center px-5 pb-5">
46
+ {section === 'date'
47
+ ? <Calendar mode="single" defaultMonth={draft.date ?? new Date(2023, 7, 1)} selected={draft.date} onSelect={date => { setDraft(previous => ({ ...previous, date })); setApplied(false) }} />
48
+ : <div className="w-full space-y-4 pt-2">{['completed', 'pending'].map(status => <CheckboxField key={status} label={copy(status)} checked={draft.statuses.includes(status)} onCheckedChange={checked => { setDraft(previous => ({ ...previous, statuses: checked ? [...previous.statuses, status] : previous.statuses.filter(item => item !== status) })); setApplied(false) }} />)}</div>}
49
+ </div>
50
+ </section>
51
+ </div>
52
+ <FilterPanelFooter><Button variant="outline" onClick={clear}>{copy('clear')}</Button><Button variant="primary-filled" onClick={() => { onApply?.(draft); setApplied(true) }}>{copy('apply')}</Button></FilterPanelFooter>
53
+ {applied ? <p role="status" className="px-5 pb-4 text-sm text-muted-foreground">{copy('applied')}</p> : null}
54
+ </div>
55
+ }
56
+
57
+ export function SourceFilterParts() {
58
+ const copy = useFilterCopy()
59
+ const [active, setActive] = React.useState(2)
60
+ const [notice, setNotice] = React.useState('')
61
+ return <div className="grid w-full gap-6">
62
+ <div className="grid grid-cols-1 gap-4 sm:grid-cols-3">
63
+ {['Default', 'Hover', 'Active'].map((state, index) => <div key={state} className="w-[200px] max-w-full space-y-2">
64
+ <p className="text-xs text-muted-foreground">{state}</p>
65
+ <FilterPanelItem active={active === index} leading={<CalendarDays />} onClick={() => setActive(index)}>{copy('date')}</FilterPanelItem>
66
+ </div>)}
67
+ </div>
68
+ <div className="w-[400px] max-w-full rounded-md border border-border"><FilterPanelHeader title={copy('date')} leading={<CalendarDays />} action={<Button variant="link" className="h-auto p-0 text-sm leading-5 text-muted-foreground" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button>} /></div>
69
+ <div className="w-[472px] max-w-full"><FilterPanelFooter><Button variant="outline" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button><Button variant="primary-filled" onClick={() => setNotice(copy('applied'))}>{copy('apply')}</Button></FilterPanelFooter></div>
70
+ <p role="status" className="min-h-5 text-sm text-muted-foreground">{notice}</p>
71
+ </div>
72
+ }
73
+
74
+ export function SourceFilterToolbar({ type }: { type: 'table' | 'calendar' }) {
75
+ const copy = useFilterCopy()
76
+ const [query, setQuery] = React.useState('')
77
+ const [category, setCategory] = React.useState('all')
78
+ const [sort, setSort] = React.useState('recent')
79
+ const [period, setPeriod] = React.useState('7')
80
+ const [endDate, setEndDate] = React.useState(new Date(2023, 7, 11))
81
+ const [filters, setFilters] = React.useState<Filters>(emptyFilters)
82
+ const [filterOpen, setFilterOpen] = React.useState(false)
83
+ const [showAmount, setShowAmount] = React.useState(true)
84
+ const [dateOpen, setDateOpen] = React.useState(false)
85
+ const periodStart = new Date(endDate)
86
+ periodStart.setDate(endDate.getDate() - Number(period))
87
+ const rows = transactionRows.filter(row => {
88
+ if (category !== 'all' && row.type !== category) return false
89
+ if (query && !row.name.toLowerCase().includes(query.trim().toLowerCase())) return false
90
+ if (filters.statuses.length && !filters.statuses.includes(row.status)) return false
91
+ if (filters.date && row.date.toDateString() !== filters.date.toDateString()) return false
92
+ return type !== 'calendar' || (row.date >= periodStart && row.date <= endDate)
93
+ }).sort((a, b) => sort === 'amount' ? b.amount - a.amount : b.date.getTime() - a.date.getTime())
94
+ const dateText = \`\${periodStart.toLocaleDateString()} \u2013 \${endDate.toLocaleDateString()}\`
95
+ return <div className="w-full min-w-0 space-y-4" data-example={\`filter-toolbar-\${type}\`}>
96
+ <FilterToolbar className="max-w-[1104px]" leading={type === 'table'
97
+ ? <SegmentedControl value={category} onValueChange={setCategory} aria-label={copy('transactionType')} className="h-9 w-80 max-w-full rounded-md border-0 p-1">
98
+ {['all', 'income', 'expense'].map(item => <SegmentedControlItem key={item} value={item} className="flex-1 rounded-sm">{copy(item)}</SegmentedControlItem>)}
99
+ </SegmentedControl>
100
+ : <><Button variant="outline" onClick={() => { setEndDate(new Date()); setPeriod('0') }}>{copy('today')}</Button>
101
+ <ButtonGroup size={36} aria-label={copy('dateRange')} className="max-w-full flex-wrap">
102
+ <Select value={period} onValueChange={setPeriod}><SelectTrigger className="w-auto" aria-label={copy('period')}><SelectValue /></SelectTrigger><SelectContent>{['0', '7', '30'].map(item => <SelectItem key={item} value={item}>{copy(\`period\${item}\`)}</SelectItem>)}</SelectContent></Select>
103
+ <Popover open={dateOpen} onOpenChange={setDateOpen}><PopoverTrigger asChild><Button variant="outline" aria-label={copy('dateRange')}><CalendarDays className="size-5" aria-hidden="true" /><span className="truncate">{dateText}</span></Button></PopoverTrigger><PopoverContent className="w-auto p-3" align="start"><Calendar mode="single" selected={endDate} defaultMonth={endDate} onSelect={date => { if (date) { setEndDate(date); setDateOpen(false) } }} /></PopoverContent></Popover>
104
+ </ButtonGroup></>}>
105
+ <SearchInput value={query} onChange={setQuery} aria-label={copy('search')} placeholder={copy('search')} className="w-[300px] max-w-full [&>svg]:size-5" />
106
+ <Popover open={filterOpen} onOpenChange={setFilterOpen}><PopoverTrigger asChild><Button variant="outline"><Filter className="size-5" aria-hidden="true" />{copy('filter')}</Button></PopoverTrigger>
107
+ <PopoverContent className="w-[640px] max-w-[calc(100vw-24px)] overflow-hidden p-0" align="end"><SourceFilterPanel value={filters} onApply={value => { setFilters(value); setFilterOpen(false) }} /></PopoverContent>
108
+ </Popover>
109
+ <Popover><PopoverTrigger asChild><IconButton variant="outline" aria-label={copy('settings')}><Settings2 className="size-5" /></IconButton></PopoverTrigger><PopoverContent className="w-60"><CheckboxField checked={showAmount} onCheckedChange={checked => setShowAmount(checked === true)} label={copy('showAmount')} /></PopoverContent></Popover>
110
+ {type === 'table' ? <Select value={sort} onValueChange={setSort}><SelectTrigger className="w-40" aria-label={copy('sort')}><SelectValue /></SelectTrigger><SelectContent><SelectItem value="recent">{copy('recent')}</SelectItem><SelectItem value="amount">{copy('amount')}</SelectItem></SelectContent></Select> : null}
111
+ </FilterToolbar>
112
+ <p role="status" className="text-sm text-muted-foreground">{copy('results', { count: rows.length })}</p>
113
+ <div className="overflow-x-auto rounded-md border border-border"><Table className="min-w-[440px]">
114
+ <TableHeader><TableRow><TableHead>{copy('name')}</TableHead><TableHead>{copy('status')}</TableHead>{showAmount ? <TableHead className="text-right">{copy('amount')}</TableHead> : null}</TableRow></TableHeader>
115
+ <TableBody>{rows.map(row => <TableRow key={row.name}><TableCell className="font-medium">{row.name}</TableCell><TableCell>{copy(row.status)}</TableCell>{showAmount ? <TableCell className="text-right tabular-nums">{row.amount.toLocaleString(undefined, { style: 'currency', currency: 'USD' })}</TableCell> : null}</TableRow>)}</TableBody>
116
+ </Table></div>
117
+ <Button size="sm" variant="ghost" onClick={() => { setQuery(''); setCategory('all'); setFilters(emptyFilters()); setPeriod('7'); setEndDate(new Date(2023, 7, 11)); setSort('recent'); setShowAmount(true) }}>{copy('reset')}</Button>
118
+ </div>
119
+ }
120
+ `;
121
+ const sourceFilterExampleCode = (expression) => source + "\n" + expression + "\n";
122
+ export {
123
+ sourceFilterExampleCode
124
+ };
125
+ //# sourceMappingURL=source-filters-code.generated.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/demos/source-filters-code.generated.ts"],
4
+ "sourcesContent": ["// Generated by yarn storybook:generate from source-filters.tsx.\nconst source = \"import * as React from 'react'\\nimport { CalendarDays, Check, Filter, Settings2 } from 'lucide-react'\\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\\nimport { Button } from '@open-mercato/ui/primitives/button'\\nimport { ButtonGroup } from '@open-mercato/ui/primitives/button-group'\\nimport { Calendar } from '@open-mercato/ui/primitives/calendar'\\nimport { CheckboxField } from '@open-mercato/ui/primitives/checkbox-field'\\nimport { FilterToolbar, FilterPanelItem, FilterPanelHeader, FilterPanelFooter } from '@open-mercato/ui/primitives/filter-toolbar'\\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\\nimport { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\\nimport { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'\\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'\\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@open-mercato/ui/primitives/table'\\n\\ntype Filters = { date?: Date; statuses: string[] }\\nconst transactionRows = [\\n { name: 'Apex', type: 'income', date: new Date(2023, 7, 11), amount: 1240, status: 'completed' },\\n { name: 'Spotify', type: 'expense', date: new Date(2023, 7, 10), amount: -12, status: 'completed' },\\n { name: 'Synergy', type: 'income', date: new Date(2023, 7, 9), amount: 680, status: 'pending' },\\n { name: 'Loom', type: 'expense', date: new Date(2023, 7, 11), amount: -18, status: 'pending' },\\n]\\nconst emptyFilters = (): Filters => ({ statuses: [] })\\n\\nfunction useFilterCopy() {\\n const t = useT()\\n return (key: string, values?: Record<string, string | number>) => t(`design_system.gallery.examples.sourceFilters.${key}`, values)\\n}\\n\\nexport function SourceFilterPanel({ value, onApply }: { value?: Filters; onApply?: (value: Filters) => void }) {\\n const copy = useFilterCopy()\\n const [draft, setDraft] = React.useState<Filters>(() => value ?? emptyFilters())\\n const [section, setSection] = React.useState('date')\\n const [applied, setApplied] = React.useState(false)\\n const panelId = React.useId()\\n function clear() { setDraft(emptyFilters()); setApplied(false) }\\n return <div className=\\\"w-full min-w-0 bg-background\\\" data-example=\\\"filter-panel\\\">\\n <div className=\\\"flex flex-col sm:flex-row\\\">\\n <div className=\\\"flex shrink-0 flex-wrap gap-1 border-b border-border p-3 sm:w-[224px] sm:flex-col sm:border-b-0 sm:border-r\\\" role=\\\"group\\\" aria-label={copy('categories')}>\\n <FilterPanelItem active={section === 'date'} leading={<CalendarDays />} aria-controls={panelId} onClick={() => setSection('date')}>{copy('date')}</FilterPanelItem>\\n <FilterPanelItem active={section === 'status'} leading={<Check />} aria-controls={panelId} onClick={() => setSection('status')}>{copy('status')}</FilterPanelItem>\\n </div>\\n <section id={panelId} aria-label={copy(section)} className=\\\"min-w-0 flex-1\\\">\\n <FilterPanelHeader title={copy(section)} leading={section === 'date' ? <CalendarDays /> : <Check />} action={<Button variant=\\\"link\\\" className=\\\"h-auto p-0 text-sm leading-5 text-muted-foreground\\\" onClick={clear}>{copy('clear')}</Button>} />\\n <div className=\\\"flex min-h-80 justify-center px-5 pb-5\\\">\\n {section === 'date'\\n ? <Calendar mode=\\\"single\\\" defaultMonth={draft.date ?? new Date(2023, 7, 1)} selected={draft.date} onSelect={date => { setDraft(previous => ({ ...previous, date })); setApplied(false) }} />\\n : <div className=\\\"w-full space-y-4 pt-2\\\">{['completed', 'pending'].map(status => <CheckboxField key={status} label={copy(status)} checked={draft.statuses.includes(status)} onCheckedChange={checked => { setDraft(previous => ({ ...previous, statuses: checked ? [...previous.statuses, status] : previous.statuses.filter(item => item !== status) })); setApplied(false) }} />)}</div>}\\n </div>\\n </section>\\n </div>\\n <FilterPanelFooter><Button variant=\\\"outline\\\" onClick={clear}>{copy('clear')}</Button><Button variant=\\\"primary-filled\\\" onClick={() => { onApply?.(draft); setApplied(true) }}>{copy('apply')}</Button></FilterPanelFooter>\\n {applied ? <p role=\\\"status\\\" className=\\\"px-5 pb-4 text-sm text-muted-foreground\\\">{copy('applied')}</p> : null}\\n </div>\\n}\\n\\nexport function SourceFilterParts() {\\n const copy = useFilterCopy()\\n const [active, setActive] = React.useState(2)\\n const [notice, setNotice] = React.useState('')\\n return <div className=\\\"grid w-full gap-6\\\">\\n <div className=\\\"grid grid-cols-1 gap-4 sm:grid-cols-3\\\">\\n {['Default', 'Hover', 'Active'].map((state, index) => <div key={state} className=\\\"w-[200px] max-w-full space-y-2\\\">\\n <p className=\\\"text-xs text-muted-foreground\\\">{state}</p>\\n <FilterPanelItem active={active === index} leading={<CalendarDays />} onClick={() => setActive(index)}>{copy('date')}</FilterPanelItem>\\n </div>)}\\n </div>\\n <div className=\\\"w-[400px] max-w-full rounded-md border border-border\\\"><FilterPanelHeader title={copy('date')} leading={<CalendarDays />} action={<Button variant=\\\"link\\\" className=\\\"h-auto p-0 text-sm leading-5 text-muted-foreground\\\" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button>} /></div>\\n <div className=\\\"w-[472px] max-w-full\\\"><FilterPanelFooter><Button variant=\\\"outline\\\" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button><Button variant=\\\"primary-filled\\\" onClick={() => setNotice(copy('applied'))}>{copy('apply')}</Button></FilterPanelFooter></div>\\n <p role=\\\"status\\\" className=\\\"min-h-5 text-sm text-muted-foreground\\\">{notice}</p>\\n </div>\\n}\\n\\nexport function SourceFilterToolbar({ type }: { type: 'table' | 'calendar' }) {\\n const copy = useFilterCopy()\\n const [query, setQuery] = React.useState('')\\n const [category, setCategory] = React.useState('all')\\n const [sort, setSort] = React.useState('recent')\\n const [period, setPeriod] = React.useState('7')\\n const [endDate, setEndDate] = React.useState(new Date(2023, 7, 11))\\n const [filters, setFilters] = React.useState<Filters>(emptyFilters)\\n const [filterOpen, setFilterOpen] = React.useState(false)\\n const [showAmount, setShowAmount] = React.useState(true)\\n const [dateOpen, setDateOpen] = React.useState(false)\\n const periodStart = new Date(endDate)\\n periodStart.setDate(endDate.getDate() - Number(period))\\n const rows = transactionRows.filter(row => {\\n if (category !== 'all' && row.type !== category) return false\\n if (query && !row.name.toLowerCase().includes(query.trim().toLowerCase())) return false\\n if (filters.statuses.length && !filters.statuses.includes(row.status)) return false\\n if (filters.date && row.date.toDateString() !== filters.date.toDateString()) return false\\n return type !== 'calendar' || (row.date >= periodStart && row.date <= endDate)\\n }).sort((a, b) => sort === 'amount' ? b.amount - a.amount : b.date.getTime() - a.date.getTime())\\n const dateText = `${periodStart.toLocaleDateString()} \u2013 ${endDate.toLocaleDateString()}`\\n return <div className=\\\"w-full min-w-0 space-y-4\\\" data-example={`filter-toolbar-${type}`}>\\n <FilterToolbar className=\\\"max-w-[1104px]\\\" leading={type === 'table'\\n ? <SegmentedControl value={category} onValueChange={setCategory} aria-label={copy('transactionType')} className=\\\"h-9 w-80 max-w-full rounded-md border-0 p-1\\\">\\n {['all', 'income', 'expense'].map(item => <SegmentedControlItem key={item} value={item} className=\\\"flex-1 rounded-sm\\\">{copy(item)}</SegmentedControlItem>)}\\n </SegmentedControl>\\n : <><Button variant=\\\"outline\\\" onClick={() => { setEndDate(new Date()); setPeriod('0') }}>{copy('today')}</Button>\\n <ButtonGroup size={36} aria-label={copy('dateRange')} className=\\\"max-w-full flex-wrap\\\">\\n <Select value={period} onValueChange={setPeriod}><SelectTrigger className=\\\"w-auto\\\" aria-label={copy('period')}><SelectValue /></SelectTrigger><SelectContent>{['0', '7', '30'].map(item => <SelectItem key={item} value={item}>{copy(`period${item}`)}</SelectItem>)}</SelectContent></Select>\\n <Popover open={dateOpen} onOpenChange={setDateOpen}><PopoverTrigger asChild><Button variant=\\\"outline\\\" aria-label={copy('dateRange')}><CalendarDays className=\\\"size-5\\\" aria-hidden=\\\"true\\\" /><span className=\\\"truncate\\\">{dateText}</span></Button></PopoverTrigger><PopoverContent className=\\\"w-auto p-3\\\" align=\\\"start\\\"><Calendar mode=\\\"single\\\" selected={endDate} defaultMonth={endDate} onSelect={date => { if (date) { setEndDate(date); setDateOpen(false) } }} /></PopoverContent></Popover>\\n </ButtonGroup></>}>\\n <SearchInput value={query} onChange={setQuery} aria-label={copy('search')} placeholder={copy('search')} className=\\\"w-[300px] max-w-full [&>svg]:size-5\\\" />\\n <Popover open={filterOpen} onOpenChange={setFilterOpen}><PopoverTrigger asChild><Button variant=\\\"outline\\\"><Filter className=\\\"size-5\\\" aria-hidden=\\\"true\\\" />{copy('filter')}</Button></PopoverTrigger>\\n <PopoverContent className=\\\"w-[640px] max-w-[calc(100vw-24px)] overflow-hidden p-0\\\" align=\\\"end\\\"><SourceFilterPanel value={filters} onApply={value => { setFilters(value); setFilterOpen(false) }} /></PopoverContent>\\n </Popover>\\n <Popover><PopoverTrigger asChild><IconButton variant=\\\"outline\\\" aria-label={copy('settings')}><Settings2 className=\\\"size-5\\\" /></IconButton></PopoverTrigger><PopoverContent className=\\\"w-60\\\"><CheckboxField checked={showAmount} onCheckedChange={checked => setShowAmount(checked === true)} label={copy('showAmount')} /></PopoverContent></Popover>\\n {type === 'table' ? <Select value={sort} onValueChange={setSort}><SelectTrigger className=\\\"w-40\\\" aria-label={copy('sort')}><SelectValue /></SelectTrigger><SelectContent><SelectItem value=\\\"recent\\\">{copy('recent')}</SelectItem><SelectItem value=\\\"amount\\\">{copy('amount')}</SelectItem></SelectContent></Select> : null}\\n </FilterToolbar>\\n <p role=\\\"status\\\" className=\\\"text-sm text-muted-foreground\\\">{copy('results', { count: rows.length })}</p>\\n <div className=\\\"overflow-x-auto rounded-md border border-border\\\"><Table className=\\\"min-w-[440px]\\\">\\n <TableHeader><TableRow><TableHead>{copy('name')}</TableHead><TableHead>{copy('status')}</TableHead>{showAmount ? <TableHead className=\\\"text-right\\\">{copy('amount')}</TableHead> : null}</TableRow></TableHeader>\\n <TableBody>{rows.map(row => <TableRow key={row.name}><TableCell className=\\\"font-medium\\\">{row.name}</TableCell><TableCell>{copy(row.status)}</TableCell>{showAmount ? <TableCell className=\\\"text-right tabular-nums\\\">{row.amount.toLocaleString(undefined, { style: 'currency', currency: 'USD' })}</TableCell> : null}</TableRow>)}</TableBody>\\n </Table></div>\\n <Button size=\\\"sm\\\" variant=\\\"ghost\\\" onClick={() => { setQuery(''); setCategory('all'); setFilters(emptyFilters()); setPeriod('7'); setEndDate(new Date(2023, 7, 11)); setSort('recent'); setShowAmount(true) }}>{copy('reset')}</Button>\\n </div>\\n}\\n\"\nexport const sourceFilterExampleCode = (expression: string) => source + \"\\n\" + expression + \"\\n\"\n"],
5
+ "mappings": "AACA,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACR,MAAM,0BAA0B,CAAC,eAAuB,SAAS,OAAO,aAAa;",
6
+ "names": []
7
+ }
@@ -0,0 +1,185 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { CalendarDays, Check, Filter, Settings2 } from "lucide-react";
4
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
5
+ import { Button } from "@open-mercato/ui/primitives/button";
6
+ import { ButtonGroup } from "@open-mercato/ui/primitives/button-group";
7
+ import { Calendar } from "@open-mercato/ui/primitives/calendar";
8
+ import { CheckboxField } from "@open-mercato/ui/primitives/checkbox-field";
9
+ import { FilterToolbar, FilterPanelItem, FilterPanelHeader, FilterPanelFooter } from "@open-mercato/ui/primitives/filter-toolbar";
10
+ import { IconButton } from "@open-mercato/ui/primitives/icon-button";
11
+ import { Popover, PopoverContent, PopoverTrigger } from "@open-mercato/ui/primitives/popover";
12
+ import { SearchInput } from "@open-mercato/ui/primitives/search-input";
13
+ import { SegmentedControl, SegmentedControlItem } from "@open-mercato/ui/primitives/segmented-control";
14
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@open-mercato/ui/primitives/select";
15
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@open-mercato/ui/primitives/table";
16
+ const transactionRows = [
17
+ { name: "Apex", type: "income", date: new Date(2023, 7, 11), amount: 1240, status: "completed" },
18
+ { name: "Spotify", type: "expense", date: new Date(2023, 7, 10), amount: -12, status: "completed" },
19
+ { name: "Synergy", type: "income", date: new Date(2023, 7, 9), amount: 680, status: "pending" },
20
+ { name: "Loom", type: "expense", date: new Date(2023, 7, 11), amount: -18, status: "pending" }
21
+ ];
22
+ const emptyFilters = () => ({ statuses: [] });
23
+ function useFilterCopy() {
24
+ const t = useT();
25
+ return (key, values) => t(`design_system.gallery.examples.sourceFilters.${key}`, values);
26
+ }
27
+ function SourceFilterPanel({ value, onApply }) {
28
+ const copy = useFilterCopy();
29
+ const [draft, setDraft] = React.useState(() => value ?? emptyFilters());
30
+ const [section, setSection] = React.useState("date");
31
+ const [applied, setApplied] = React.useState(false);
32
+ const panelId = React.useId();
33
+ function clear() {
34
+ setDraft(emptyFilters());
35
+ setApplied(false);
36
+ }
37
+ return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 bg-background", "data-example": "filter-panel", children: [
38
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row", children: [
39
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 flex-wrap gap-1 border-b border-border p-3 sm:w-[224px] sm:flex-col sm:border-b-0 sm:border-r", role: "group", "aria-label": copy("categories"), children: [
40
+ /* @__PURE__ */ jsx(FilterPanelItem, { active: section === "date", leading: /* @__PURE__ */ jsx(CalendarDays, {}), "aria-controls": panelId, onClick: () => setSection("date"), children: copy("date") }),
41
+ /* @__PURE__ */ jsx(FilterPanelItem, { active: section === "status", leading: /* @__PURE__ */ jsx(Check, {}), "aria-controls": panelId, onClick: () => setSection("status"), children: copy("status") })
42
+ ] }),
43
+ /* @__PURE__ */ jsxs("section", { id: panelId, "aria-label": copy(section), className: "min-w-0 flex-1", children: [
44
+ /* @__PURE__ */ jsx(FilterPanelHeader, { title: copy(section), leading: section === "date" ? /* @__PURE__ */ jsx(CalendarDays, {}) : /* @__PURE__ */ jsx(Check, {}), action: /* @__PURE__ */ jsx(Button, { variant: "link", className: "h-auto p-0 text-sm leading-5 text-muted-foreground", onClick: clear, children: copy("clear") }) }),
45
+ /* @__PURE__ */ jsx("div", { className: "flex min-h-80 justify-center px-5 pb-5", children: section === "date" ? /* @__PURE__ */ jsx(Calendar, { mode: "single", defaultMonth: draft.date ?? new Date(2023, 7, 1), selected: draft.date, onSelect: (date) => {
46
+ setDraft((previous) => ({ ...previous, date }));
47
+ setApplied(false);
48
+ } }) : /* @__PURE__ */ jsx("div", { className: "w-full space-y-4 pt-2", children: ["completed", "pending"].map((status) => /* @__PURE__ */ jsx(CheckboxField, { label: copy(status), checked: draft.statuses.includes(status), onCheckedChange: (checked) => {
49
+ setDraft((previous) => ({ ...previous, statuses: checked ? [...previous.statuses, status] : previous.statuses.filter((item) => item !== status) }));
50
+ setApplied(false);
51
+ } }, status)) }) })
52
+ ] })
53
+ ] }),
54
+ /* @__PURE__ */ jsxs(FilterPanelFooter, { children: [
55
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: clear, children: copy("clear") }),
56
+ /* @__PURE__ */ jsx(Button, { variant: "primary-filled", onClick: () => {
57
+ onApply?.(draft);
58
+ setApplied(true);
59
+ }, children: copy("apply") })
60
+ ] }),
61
+ applied ? /* @__PURE__ */ jsx("p", { role: "status", className: "px-5 pb-4 text-sm text-muted-foreground", children: copy("applied") }) : null
62
+ ] });
63
+ }
64
+ function SourceFilterParts() {
65
+ const copy = useFilterCopy();
66
+ const [active, setActive] = React.useState(2);
67
+ const [notice, setNotice] = React.useState("");
68
+ return /* @__PURE__ */ jsxs("div", { className: "grid w-full gap-6", children: [
69
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-3", children: ["Default", "Hover", "Active"].map((state, index) => /* @__PURE__ */ jsxs("div", { className: "w-[200px] max-w-full space-y-2", children: [
70
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: state }),
71
+ /* @__PURE__ */ jsx(FilterPanelItem, { active: active === index, leading: /* @__PURE__ */ jsx(CalendarDays, {}), onClick: () => setActive(index), children: copy("date") })
72
+ ] }, state)) }),
73
+ /* @__PURE__ */ jsx("div", { className: "w-[400px] max-w-full rounded-md border border-border", children: /* @__PURE__ */ jsx(FilterPanelHeader, { title: copy("date"), leading: /* @__PURE__ */ jsx(CalendarDays, {}), action: /* @__PURE__ */ jsx(Button, { variant: "link", className: "h-auto p-0 text-sm leading-5 text-muted-foreground", onClick: () => {
74
+ setActive(-1);
75
+ setNotice(copy("cleared"));
76
+ }, children: copy("clear") }) }) }),
77
+ /* @__PURE__ */ jsx("div", { className: "w-[472px] max-w-full", children: /* @__PURE__ */ jsxs(FilterPanelFooter, { children: [
78
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => {
79
+ setActive(-1);
80
+ setNotice(copy("cleared"));
81
+ }, children: copy("clear") }),
82
+ /* @__PURE__ */ jsx(Button, { variant: "primary-filled", onClick: () => setNotice(copy("applied")), children: copy("apply") })
83
+ ] }) }),
84
+ /* @__PURE__ */ jsx("p", { role: "status", className: "min-h-5 text-sm text-muted-foreground", children: notice })
85
+ ] });
86
+ }
87
+ function SourceFilterToolbar({ type }) {
88
+ const copy = useFilterCopy();
89
+ const [query, setQuery] = React.useState("");
90
+ const [category, setCategory] = React.useState("all");
91
+ const [sort, setSort] = React.useState("recent");
92
+ const [period, setPeriod] = React.useState("7");
93
+ const [endDate, setEndDate] = React.useState(new Date(2023, 7, 11));
94
+ const [filters, setFilters] = React.useState(emptyFilters);
95
+ const [filterOpen, setFilterOpen] = React.useState(false);
96
+ const [showAmount, setShowAmount] = React.useState(true);
97
+ const [dateOpen, setDateOpen] = React.useState(false);
98
+ const periodStart = new Date(endDate);
99
+ periodStart.setDate(endDate.getDate() - Number(period));
100
+ const rows = transactionRows.filter((row) => {
101
+ if (category !== "all" && row.type !== category) return false;
102
+ if (query && !row.name.toLowerCase().includes(query.trim().toLowerCase())) return false;
103
+ if (filters.statuses.length && !filters.statuses.includes(row.status)) return false;
104
+ if (filters.date && row.date.toDateString() !== filters.date.toDateString()) return false;
105
+ return type !== "calendar" || row.date >= periodStart && row.date <= endDate;
106
+ }).sort((a, b) => sort === "amount" ? b.amount - a.amount : b.date.getTime() - a.date.getTime());
107
+ const dateText = `${periodStart.toLocaleDateString()} \u2013 ${endDate.toLocaleDateString()}`;
108
+ return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 space-y-4", "data-example": `filter-toolbar-${type}`, children: [
109
+ /* @__PURE__ */ jsxs(FilterToolbar, { className: "max-w-[1104px]", leading: type === "table" ? /* @__PURE__ */ jsx(SegmentedControl, { value: category, onValueChange: setCategory, "aria-label": copy("transactionType"), className: "h-9 w-80 max-w-full rounded-md border-0 p-1", children: ["all", "income", "expense"].map((item) => /* @__PURE__ */ jsx(SegmentedControlItem, { value: item, className: "flex-1 rounded-sm", children: copy(item) }, item)) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
110
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => {
111
+ setEndDate(/* @__PURE__ */ new Date());
112
+ setPeriod("0");
113
+ }, children: copy("today") }),
114
+ /* @__PURE__ */ jsxs(ButtonGroup, { size: 36, "aria-label": copy("dateRange"), className: "max-w-full flex-wrap", children: [
115
+ /* @__PURE__ */ jsxs(Select, { value: period, onValueChange: setPeriod, children: [
116
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "w-auto", "aria-label": copy("period"), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
117
+ /* @__PURE__ */ jsx(SelectContent, { children: ["0", "7", "30"].map((item) => /* @__PURE__ */ jsx(SelectItem, { value: item, children: copy(`period${item}`) }, item)) })
118
+ ] }),
119
+ /* @__PURE__ */ jsxs(Popover, { open: dateOpen, onOpenChange: setDateOpen, children: [
120
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", "aria-label": copy("dateRange"), children: [
121
+ /* @__PURE__ */ jsx(CalendarDays, { className: "size-5", "aria-hidden": "true" }),
122
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: dateText })
123
+ ] }) }),
124
+ /* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-3", align: "start", children: /* @__PURE__ */ jsx(Calendar, { mode: "single", selected: endDate, defaultMonth: endDate, onSelect: (date) => {
125
+ if (date) {
126
+ setEndDate(date);
127
+ setDateOpen(false);
128
+ }
129
+ } }) })
130
+ ] })
131
+ ] })
132
+ ] }), children: [
133
+ /* @__PURE__ */ jsx(SearchInput, { value: query, onChange: setQuery, "aria-label": copy("search"), placeholder: copy("search"), className: "w-[300px] max-w-full [&>svg]:size-5" }),
134
+ /* @__PURE__ */ jsxs(Popover, { open: filterOpen, onOpenChange: setFilterOpen, children: [
135
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", children: [
136
+ /* @__PURE__ */ jsx(Filter, { className: "size-5", "aria-hidden": "true" }),
137
+ copy("filter")
138
+ ] }) }),
139
+ /* @__PURE__ */ jsx(PopoverContent, { className: "w-[640px] max-w-[calc(100vw-24px)] overflow-hidden p-0", align: "end", children: /* @__PURE__ */ jsx(SourceFilterPanel, { value: filters, onApply: (value) => {
140
+ setFilters(value);
141
+ setFilterOpen(false);
142
+ } }) })
143
+ ] }),
144
+ /* @__PURE__ */ jsxs(Popover, { children: [
145
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { variant: "outline", "aria-label": copy("settings"), children: /* @__PURE__ */ jsx(Settings2, { className: "size-5" }) }) }),
146
+ /* @__PURE__ */ jsx(PopoverContent, { className: "w-60", children: /* @__PURE__ */ jsx(CheckboxField, { checked: showAmount, onCheckedChange: (checked) => setShowAmount(checked === true), label: copy("showAmount") }) })
147
+ ] }),
148
+ type === "table" ? /* @__PURE__ */ jsxs(Select, { value: sort, onValueChange: setSort, children: [
149
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "w-40", "aria-label": copy("sort"), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
150
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
151
+ /* @__PURE__ */ jsx(SelectItem, { value: "recent", children: copy("recent") }),
152
+ /* @__PURE__ */ jsx(SelectItem, { value: "amount", children: copy("amount") })
153
+ ] })
154
+ ] }) : null
155
+ ] }),
156
+ /* @__PURE__ */ jsx("p", { role: "status", className: "text-sm text-muted-foreground", children: copy("results", { count: rows.length }) }),
157
+ /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded-md border border-border", children: /* @__PURE__ */ jsxs(Table, { className: "min-w-[440px]", children: [
158
+ /* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
159
+ /* @__PURE__ */ jsx(TableHead, { children: copy("name") }),
160
+ /* @__PURE__ */ jsx(TableHead, { children: copy("status") }),
161
+ showAmount ? /* @__PURE__ */ jsx(TableHead, { className: "text-right", children: copy("amount") }) : null
162
+ ] }) }),
163
+ /* @__PURE__ */ jsx(TableBody, { children: rows.map((row) => /* @__PURE__ */ jsxs(TableRow, { children: [
164
+ /* @__PURE__ */ jsx(TableCell, { className: "font-medium", children: row.name }),
165
+ /* @__PURE__ */ jsx(TableCell, { children: copy(row.status) }),
166
+ showAmount ? /* @__PURE__ */ jsx(TableCell, { className: "text-right tabular-nums", children: row.amount.toLocaleString(void 0, { style: "currency", currency: "USD" }) }) : null
167
+ ] }, row.name)) })
168
+ ] }) }),
169
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", onClick: () => {
170
+ setQuery("");
171
+ setCategory("all");
172
+ setFilters(emptyFilters());
173
+ setPeriod("7");
174
+ setEndDate(new Date(2023, 7, 11));
175
+ setSort("recent");
176
+ setShowAmount(true);
177
+ }, children: copy("reset") })
178
+ ] });
179
+ }
180
+ export {
181
+ SourceFilterPanel,
182
+ SourceFilterParts,
183
+ SourceFilterToolbar
184
+ };
185
+ //# sourceMappingURL=source-filters.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/demos/source-filters.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { CalendarDays, Check, Filter, Settings2 } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ButtonGroup } from '@open-mercato/ui/primitives/button-group'\nimport { Calendar } from '@open-mercato/ui/primitives/calendar'\nimport { CheckboxField } from '@open-mercato/ui/primitives/checkbox-field'\nimport { FilterToolbar, FilterPanelItem, FilterPanelHeader, FilterPanelFooter } from '@open-mercato/ui/primitives/filter-toolbar'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@open-mercato/ui/primitives/table'\n\ntype Filters = { date?: Date; statuses: string[] }\nconst transactionRows = [\n { name: 'Apex', type: 'income', date: new Date(2023, 7, 11), amount: 1240, status: 'completed' },\n { name: 'Spotify', type: 'expense', date: new Date(2023, 7, 10), amount: -12, status: 'completed' },\n { name: 'Synergy', type: 'income', date: new Date(2023, 7, 9), amount: 680, status: 'pending' },\n { name: 'Loom', type: 'expense', date: new Date(2023, 7, 11), amount: -18, status: 'pending' },\n]\nconst emptyFilters = (): Filters => ({ statuses: [] })\n\nfunction useFilterCopy() {\n const t = useT()\n return (key: string, values?: Record<string, string | number>) => t(`design_system.gallery.examples.sourceFilters.${key}`, values)\n}\n\nexport function SourceFilterPanel({ value, onApply }: { value?: Filters; onApply?: (value: Filters) => void }) {\n const copy = useFilterCopy()\n const [draft, setDraft] = React.useState<Filters>(() => value ?? emptyFilters())\n const [section, setSection] = React.useState('date')\n const [applied, setApplied] = React.useState(false)\n const panelId = React.useId()\n function clear() { setDraft(emptyFilters()); setApplied(false) }\n return <div className=\"w-full min-w-0 bg-background\" data-example=\"filter-panel\">\n <div className=\"flex flex-col sm:flex-row\">\n <div className=\"flex shrink-0 flex-wrap gap-1 border-b border-border p-3 sm:w-[224px] sm:flex-col sm:border-b-0 sm:border-r\" role=\"group\" aria-label={copy('categories')}>\n <FilterPanelItem active={section === 'date'} leading={<CalendarDays />} aria-controls={panelId} onClick={() => setSection('date')}>{copy('date')}</FilterPanelItem>\n <FilterPanelItem active={section === 'status'} leading={<Check />} aria-controls={panelId} onClick={() => setSection('status')}>{copy('status')}</FilterPanelItem>\n </div>\n <section id={panelId} aria-label={copy(section)} className=\"min-w-0 flex-1\">\n <FilterPanelHeader title={copy(section)} leading={section === 'date' ? <CalendarDays /> : <Check />} action={<Button variant=\"link\" className=\"h-auto p-0 text-sm leading-5 text-muted-foreground\" onClick={clear}>{copy('clear')}</Button>} />\n <div className=\"flex min-h-80 justify-center px-5 pb-5\">\n {section === 'date'\n ? <Calendar mode=\"single\" defaultMonth={draft.date ?? new Date(2023, 7, 1)} selected={draft.date} onSelect={date => { setDraft(previous => ({ ...previous, date })); setApplied(false) }} />\n : <div className=\"w-full space-y-4 pt-2\">{['completed', 'pending'].map(status => <CheckboxField key={status} label={copy(status)} checked={draft.statuses.includes(status)} onCheckedChange={checked => { setDraft(previous => ({ ...previous, statuses: checked ? [...previous.statuses, status] : previous.statuses.filter(item => item !== status) })); setApplied(false) }} />)}</div>}\n </div>\n </section>\n </div>\n <FilterPanelFooter><Button variant=\"outline\" onClick={clear}>{copy('clear')}</Button><Button variant=\"primary-filled\" onClick={() => { onApply?.(draft); setApplied(true) }}>{copy('apply')}</Button></FilterPanelFooter>\n {applied ? <p role=\"status\" className=\"px-5 pb-4 text-sm text-muted-foreground\">{copy('applied')}</p> : null}\n </div>\n}\n\nexport function SourceFilterParts() {\n const copy = useFilterCopy()\n const [active, setActive] = React.useState(2)\n const [notice, setNotice] = React.useState('')\n return <div className=\"grid w-full gap-6\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n {['Default', 'Hover', 'Active'].map((state, index) => <div key={state} className=\"w-[200px] max-w-full space-y-2\">\n <p className=\"text-xs text-muted-foreground\">{state}</p>\n <FilterPanelItem active={active === index} leading={<CalendarDays />} onClick={() => setActive(index)}>{copy('date')}</FilterPanelItem>\n </div>)}\n </div>\n <div className=\"w-[400px] max-w-full rounded-md border border-border\"><FilterPanelHeader title={copy('date')} leading={<CalendarDays />} action={<Button variant=\"link\" className=\"h-auto p-0 text-sm leading-5 text-muted-foreground\" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button>} /></div>\n <div className=\"w-[472px] max-w-full\"><FilterPanelFooter><Button variant=\"outline\" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button><Button variant=\"primary-filled\" onClick={() => setNotice(copy('applied'))}>{copy('apply')}</Button></FilterPanelFooter></div>\n <p role=\"status\" className=\"min-h-5 text-sm text-muted-foreground\">{notice}</p>\n </div>\n}\n\nexport function SourceFilterToolbar({ type }: { type: 'table' | 'calendar' }) {\n const copy = useFilterCopy()\n const [query, setQuery] = React.useState('')\n const [category, setCategory] = React.useState('all')\n const [sort, setSort] = React.useState('recent')\n const [period, setPeriod] = React.useState('7')\n const [endDate, setEndDate] = React.useState(new Date(2023, 7, 11))\n const [filters, setFilters] = React.useState<Filters>(emptyFilters)\n const [filterOpen, setFilterOpen] = React.useState(false)\n const [showAmount, setShowAmount] = React.useState(true)\n const [dateOpen, setDateOpen] = React.useState(false)\n const periodStart = new Date(endDate)\n periodStart.setDate(endDate.getDate() - Number(period))\n const rows = transactionRows.filter(row => {\n if (category !== 'all' && row.type !== category) return false\n if (query && !row.name.toLowerCase().includes(query.trim().toLowerCase())) return false\n if (filters.statuses.length && !filters.statuses.includes(row.status)) return false\n if (filters.date && row.date.toDateString() !== filters.date.toDateString()) return false\n return type !== 'calendar' || (row.date >= periodStart && row.date <= endDate)\n }).sort((a, b) => sort === 'amount' ? b.amount - a.amount : b.date.getTime() - a.date.getTime())\n const dateText = `${periodStart.toLocaleDateString()} \u2013 ${endDate.toLocaleDateString()}`\n return <div className=\"w-full min-w-0 space-y-4\" data-example={`filter-toolbar-${type}`}>\n <FilterToolbar className=\"max-w-[1104px]\" leading={type === 'table'\n ? <SegmentedControl value={category} onValueChange={setCategory} aria-label={copy('transactionType')} className=\"h-9 w-80 max-w-full rounded-md border-0 p-1\">\n {['all', 'income', 'expense'].map(item => <SegmentedControlItem key={item} value={item} className=\"flex-1 rounded-sm\">{copy(item)}</SegmentedControlItem>)}\n </SegmentedControl>\n : <><Button variant=\"outline\" onClick={() => { setEndDate(new Date()); setPeriod('0') }}>{copy('today')}</Button>\n <ButtonGroup size={36} aria-label={copy('dateRange')} className=\"max-w-full flex-wrap\">\n <Select value={period} onValueChange={setPeriod}><SelectTrigger className=\"w-auto\" aria-label={copy('period')}><SelectValue /></SelectTrigger><SelectContent>{['0', '7', '30'].map(item => <SelectItem key={item} value={item}>{copy(`period${item}`)}</SelectItem>)}</SelectContent></Select>\n <Popover open={dateOpen} onOpenChange={setDateOpen}><PopoverTrigger asChild><Button variant=\"outline\" aria-label={copy('dateRange')}><CalendarDays className=\"size-5\" aria-hidden=\"true\" /><span className=\"truncate\">{dateText}</span></Button></PopoverTrigger><PopoverContent className=\"w-auto p-3\" align=\"start\"><Calendar mode=\"single\" selected={endDate} defaultMonth={endDate} onSelect={date => { if (date) { setEndDate(date); setDateOpen(false) } }} /></PopoverContent></Popover>\n </ButtonGroup></>}>\n <SearchInput value={query} onChange={setQuery} aria-label={copy('search')} placeholder={copy('search')} className=\"w-[300px] max-w-full [&>svg]:size-5\" />\n <Popover open={filterOpen} onOpenChange={setFilterOpen}><PopoverTrigger asChild><Button variant=\"outline\"><Filter className=\"size-5\" aria-hidden=\"true\" />{copy('filter')}</Button></PopoverTrigger>\n <PopoverContent className=\"w-[640px] max-w-[calc(100vw-24px)] overflow-hidden p-0\" align=\"end\"><SourceFilterPanel value={filters} onApply={value => { setFilters(value); setFilterOpen(false) }} /></PopoverContent>\n </Popover>\n <Popover><PopoverTrigger asChild><IconButton variant=\"outline\" aria-label={copy('settings')}><Settings2 className=\"size-5\" /></IconButton></PopoverTrigger><PopoverContent className=\"w-60\"><CheckboxField checked={showAmount} onCheckedChange={checked => setShowAmount(checked === true)} label={copy('showAmount')} /></PopoverContent></Popover>\n {type === 'table' ? <Select value={sort} onValueChange={setSort}><SelectTrigger className=\"w-40\" aria-label={copy('sort')}><SelectValue /></SelectTrigger><SelectContent><SelectItem value=\"recent\">{copy('recent')}</SelectItem><SelectItem value=\"amount\">{copy('amount')}</SelectItem></SelectContent></Select> : null}\n </FilterToolbar>\n <p role=\"status\" className=\"text-sm text-muted-foreground\">{copy('results', { count: rows.length })}</p>\n <div className=\"overflow-x-auto rounded-md border border-border\"><Table className=\"min-w-[440px]\">\n <TableHeader><TableRow><TableHead>{copy('name')}</TableHead><TableHead>{copy('status')}</TableHead>{showAmount ? <TableHead className=\"text-right\">{copy('amount')}</TableHead> : null}</TableRow></TableHeader>\n <TableBody>{rows.map(row => <TableRow key={row.name}><TableCell className=\"font-medium\">{row.name}</TableCell><TableCell>{copy(row.status)}</TableCell>{showAmount ? <TableCell className=\"text-right tabular-nums\">{row.amount.toLocaleString(undefined, { style: 'currency', currency: 'USD' })}</TableCell> : null}</TableRow>)}</TableBody>\n </Table></div>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setQuery(''); setCategory('all'); setFilters(emptyFilters()); setPeriod('7'); setEndDate(new Date(2023, 7, 11)); setSort('recent'); setShowAmount(true) }}>{copy('reset')}</Button>\n </div>\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,69 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
4
+ import { SourceIcon, sourceIconNames } from "@open-mercato/ui/assets/source-icons";
5
+ import { Button } from "@open-mercato/ui/primitives/button";
6
+ import { Pagination } from "@open-mercato/ui/primitives/pagination";
7
+ import { SearchInput } from "@open-mercato/ui/primitives/search-input";
8
+ import { EmptyState } from "@open-mercato/ui/primitives/empty-state";
9
+ import { Popover, PopoverContent, PopoverTrigger } from "@open-mercato/ui/primitives/popover";
10
+ const pageSize = 48;
11
+ function SourceIconTile({ name }) {
12
+ const t = useT();
13
+ const [notice, setNotice] = React.useState("");
14
+ const code = `import { SourceIcon } from '@open-mercato/ui/assets/source-icons'
15
+
16
+ <SourceIcon name="${name}" aria-hidden="true" className="size-6" />`;
17
+ async function copy() {
18
+ try {
19
+ await navigator.clipboard.writeText(code);
20
+ setNotice(t("design_system.gallery.sourceIcons.copied"));
21
+ } catch {
22
+ setNotice(t("design_system.gallery.copyFailed"));
23
+ }
24
+ }
25
+ return /* @__PURE__ */ jsxs(Popover, { onOpenChange: () => setNotice(""), children: [
26
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", "aria-label": name, className: "h-auto min-h-28 min-w-0 flex-col gap-3 whitespace-normal rounded-lg border border-border bg-background p-3", children: [
27
+ /* @__PURE__ */ jsx(SourceIcon, { name, "aria-hidden": "true", className: "size-7" }),
28
+ /* @__PURE__ */ jsx("span", { className: "max-w-full break-words text-center text-xs font-normal leading-4 text-muted-foreground", children: name })
29
+ ] }) }),
30
+ /* @__PURE__ */ jsxs(PopoverContent, { className: "w-72 space-y-4 p-4", "aria-label": name, children: [
31
+ /* @__PURE__ */ jsx("div", { className: "flex h-24 items-center justify-center rounded-md bg-muted", children: /* @__PURE__ */ jsx(SourceIcon, { name, "aria-hidden": "true", className: "size-10" }) }),
32
+ /* @__PURE__ */ jsx("p", { className: "break-words font-medium", children: name }),
33
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: copy, children: t("design_system.gallery.sourceIcons.copy") }),
34
+ notice ? /* @__PURE__ */ jsx("p", { role: "status", className: "text-xs text-muted-foreground", children: notice }) : null
35
+ ] })
36
+ ] });
37
+ }
38
+ function SourceIconCatalogue({ collectionControl } = {}) {
39
+ const t = useT();
40
+ const [query, setQuery] = React.useState("");
41
+ const [page, setPage] = React.useState(1);
42
+ const filtered = sourceIconNames.filter((name) => name.includes(query.trim().toLowerCase()));
43
+ const visible = filtered.slice((page - 1) * pageSize, page * pageSize);
44
+ return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 space-y-5", "data-example": "source-icon-catalogue", children: [
45
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-4", children: [
46
+ collectionControl,
47
+ /* @__PURE__ */ jsx(SearchInput, { value: query, onChange: (value) => {
48
+ setQuery(value);
49
+ setPage(1);
50
+ }, "aria-label": t("design_system.gallery.iconSearchPlaceholder"), placeholder: t("design_system.gallery.iconSearchPlaceholder"), className: "w-80 max-w-full" }),
51
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", role: "status", children: t("design_system.gallery.iconCountFiltered", { visible: filtered.length, total: sourceIconNames.length }) })
52
+ ] }),
53
+ visible.length ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4 lg:grid-cols-6", children: visible.map((name) => /* @__PURE__ */ jsx(SourceIconTile, { name }, name)) }) : /* @__PURE__ */ jsx(EmptyState, { title: t("design_system.gallery.noResults") }),
54
+ filtered.length > pageSize ? /* @__PURE__ */ jsx(Pagination, { page, pageSize, total: filtered.length, showPageSize: false, onPageChange: setPage, "aria-label": t("design_system.gallery.sourceIcons.pages") }) : null
55
+ ] });
56
+ }
57
+ const sourceIconCatalogueCode = `import { SourceIcon, sourceIconNames } from '@open-mercato/ui/assets/source-icons'
58
+
59
+ <div className="grid grid-cols-4 gap-4">
60
+ {sourceIconNames.map(name => <div key={name} className="flex items-center gap-2">
61
+ <SourceIcon name={name} aria-hidden="true" />
62
+ <span>{name}</span>
63
+ </div>)}
64
+ </div>`;
65
+ export {
66
+ SourceIconCatalogue,
67
+ sourceIconCatalogueCode
68
+ };
69
+ //# sourceMappingURL=source-icons.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/demos/source-icons.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { SourceIcon, sourceIconNames, type SourceIconName } from '@open-mercato/ui/assets/source-icons'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Pagination } from '@open-mercato/ui/primitives/pagination'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\n\nconst pageSize = 48\n\nfunction SourceIconTile({ name }: { name: SourceIconName }) {\n const t = useT()\n const [notice, setNotice] = React.useState('')\n const code = `import { SourceIcon } from '@open-mercato/ui/assets/source-icons'\\n\\n<SourceIcon name=\"${name}\" aria-hidden=\"true\" className=\"size-6\" />`\n async function copy() {\n try { await navigator.clipboard.writeText(code); setNotice(t('design_system.gallery.sourceIcons.copied')) }\n catch { setNotice(t('design_system.gallery.copyFailed')) }\n }\n return <Popover onOpenChange={() => setNotice('')}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" aria-label={name} className=\"h-auto min-h-28 min-w-0 flex-col gap-3 whitespace-normal rounded-lg border border-border bg-background p-3\">\n <SourceIcon name={name} aria-hidden=\"true\" className=\"size-7\" />\n <span className=\"max-w-full break-words text-center text-xs font-normal leading-4 text-muted-foreground\">{name}</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-72 space-y-4 p-4\" aria-label={name}>\n <div className=\"flex h-24 items-center justify-center rounded-md bg-muted\"><SourceIcon name={name} aria-hidden=\"true\" className=\"size-10\" /></div>\n <p className=\"break-words font-medium\">{name}</p>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={copy}>{t('design_system.gallery.sourceIcons.copy')}</Button>\n {notice ? <p role=\"status\" className=\"text-xs text-muted-foreground\">{notice}</p> : null}\n </PopoverContent>\n </Popover>\n}\n\nexport function SourceIconCatalogue({ collectionControl }: { collectionControl?: React.ReactNode } = {}) {\n const t = useT()\n const [query, setQuery] = React.useState('')\n const [page, setPage] = React.useState(1)\n const filtered = sourceIconNames.filter(name => name.includes(query.trim().toLowerCase()))\n const visible = filtered.slice((page - 1) * pageSize, page * pageSize)\n return <div className=\"w-full min-w-0 space-y-5\" data-example=\"source-icon-catalogue\">\n <div className=\"flex flex-wrap items-center gap-4\">\n {collectionControl}\n <SearchInput value={query} onChange={value => { setQuery(value); setPage(1) }} aria-label={t('design_system.gallery.iconSearchPlaceholder')} placeholder={t('design_system.gallery.iconSearchPlaceholder')} className=\"w-80 max-w-full\" />\n <p className=\"text-sm text-muted-foreground\" role=\"status\">{t('design_system.gallery.iconCountFiltered', { visible: filtered.length, total: sourceIconNames.length })}</p>\n </div>\n {visible.length ? <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4 lg:grid-cols-6\">\n {visible.map(name => <SourceIconTile key={name} name={name} />)}\n </div> : <EmptyState title={t('design_system.gallery.noResults')} />}\n {filtered.length > pageSize ? <Pagination page={page} pageSize={pageSize} total={filtered.length} showPageSize={false} onPageChange={setPage} aria-label={t('design_system.gallery.sourceIcons.pages')} /> : null}\n </div>\n}\n\nexport const sourceIconCatalogueCode = `import { SourceIcon, sourceIconNames } from '@open-mercato/ui/assets/source-icons'\n\n<div className=\"grid grid-cols-4 gap-4\">\n {sourceIconNames.map(name => <div key={name} className=\"flex items-center gap-2\">\n <SourceIcon name={name} aria-hidden=\"true\" />\n <span>{name}</span>\n </div>)}\n</div>`\n"],
5
+ "mappings": "AAqBM,SACE,KADF;AArBN,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,YAAY,uBAA4C;AACjE,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,SAAS,gBAAgB,sBAAsB;AAExD,MAAM,WAAW;AAEjB,SAAS,eAAe,EAAE,KAAK,GAA6B;AAC1D,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE;AAC7C,QAAM,OAAO;AAAA;AAAA,oBAA0F,IAAI;AAC3G,iBAAe,OAAO;AACpB,QAAI;AAAE,YAAM,UAAU,UAAU,UAAU,IAAI;AAAG,gBAAU,EAAE,0CAA0C,CAAC;AAAA,IAAE,QACpG;AAAE,gBAAU,EAAE,kCAAkC,CAAC;AAAA,IAAE;AAAA,EAC3D;AACA,SAAO,qBAAC,WAAQ,cAAc,MAAM,UAAU,EAAE,GAC9C;AAAA,wBAAC,kBAAe,SAAO,MACrB,+BAAC,UAAO,MAAK,UAAS,SAAQ,SAAQ,cAAY,MAAM,WAAU,8GAChE;AAAA,0BAAC,cAAW,MAAY,eAAY,QAAO,WAAU,UAAS;AAAA,MAC9D,oBAAC,UAAK,WAAU,0FAA0F,gBAAK;AAAA,OACjH,GACF;AAAA,IACA,qBAAC,kBAAe,WAAU,sBAAqB,cAAY,MACzD;AAAA,0BAAC,SAAI,WAAU,6DAA4D,8BAAC,cAAW,MAAY,eAAY,QAAO,WAAU,WAAU,GAAE;AAAA,MAC5I,oBAAC,OAAE,WAAU,2BAA2B,gBAAK;AAAA,MAC7C,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAO,YAAE,wCAAwC,GAAE;AAAA,MAC7G,SAAS,oBAAC,OAAE,MAAK,UAAS,WAAU,iCAAiC,kBAAO,IAAO;AAAA,OACtF;AAAA,KACF;AACF;AAEO,SAAS,oBAAoB,EAAE,kBAAkB,IAA6C,CAAC,GAAG;AACvG,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAC3C,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC;AACxC,QAAM,WAAW,gBAAgB,OAAO,UAAQ,KAAK,SAAS,MAAM,KAAK,EAAE,YAAY,CAAC,CAAC;AACzF,QAAM,UAAU,SAAS,OAAO,OAAO,KAAK,UAAU,OAAO,QAAQ;AACrE,SAAO,qBAAC,SAAI,WAAU,4BAA2B,gBAAa,yBAC5D;AAAA,yBAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,MACD,oBAAC,eAAY,OAAO,OAAO,UAAU,WAAS;AAAE,iBAAS,KAAK;AAAG,gBAAQ,CAAC;AAAA,MAAE,GAAG,cAAY,EAAE,6CAA6C,GAAG,aAAa,EAAE,6CAA6C,GAAG,WAAU,mBAAkB;AAAA,MACxO,oBAAC,OAAE,WAAU,iCAAgC,MAAK,UAAU,YAAE,2CAA2C,EAAE,SAAS,SAAS,QAAQ,OAAO,gBAAgB,OAAO,CAAC,GAAE;AAAA,OACxK;AAAA,IACC,QAAQ,SAAS,oBAAC,SAAI,WAAU,wDAC9B,kBAAQ,IAAI,UAAQ,oBAAC,kBAA0B,QAAN,IAAkB,CAAE,GAChE,IAAS,oBAAC,cAAW,OAAO,EAAE,iCAAiC,GAAG;AAAA,IACjE,SAAS,SAAS,WAAW,oBAAC,cAAW,MAAY,UAAoB,OAAO,SAAS,QAAQ,cAAc,OAAO,cAAc,SAAS,cAAY,EAAE,yCAAyC,GAAG,IAAK;AAAA,KAC/M;AACF;AAEO,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }