@open-mercato/core 0.7.1-develop.7203.1.9396450b78 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/build.mjs +11 -0
  3. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +23 -0
  4. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  5. package/dist/modules/customers/backend/customers/companies/[id]/page.js +2 -1
  6. package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
  7. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -1
  8. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  9. package/dist/modules/customers/backend/customers/people/[id]/page.js +2 -2
  10. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  11. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -1
  12. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  13. package/dist/modules/customers/lib/detailHelpers.js +4 -0
  14. package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
  15. package/dist/modules/customers/lib/todoCompatibility.js +5 -0
  16. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  17. package/dist/modules/design_system/backend/design-system/page.meta.js +3 -2
  18. package/dist/modules/design_system/backend/design-system/page.meta.js.map +2 -2
  19. package/dist/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
  20. package/dist/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
  21. package/dist/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
  22. package/dist/modules/design_system/gallery/assets/avatar-photo.png +0 -0
  23. package/dist/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
  24. package/dist/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
  25. package/dist/modules/design_system/gallery/assets/crypto-ada.png +0 -0
  26. package/dist/modules/design_system/gallery/assets/crypto-avax.png +0 -0
  27. package/dist/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
  28. package/dist/modules/design_system/gallery/assets/crypto-brand.png +0 -0
  29. package/dist/modules/design_system/gallery/assets/crypto-btc.png +0 -0
  30. package/dist/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
  31. package/dist/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
  32. package/dist/modules/design_system/gallery/assets/crypto-dot.png +0 -0
  33. package/dist/modules/design_system/gallery/assets/crypto-eth.png +0 -0
  34. package/dist/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
  35. package/dist/modules/design_system/gallery/assets/crypto-history.svg +3 -0
  36. package/dist/modules/design_system/gallery/assets/crypto-link.svg +3 -0
  37. package/dist/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
  38. package/dist/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
  39. package/dist/modules/design_system/gallery/assets/crypto-more.svg +3 -0
  40. package/dist/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
  41. package/dist/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
  42. package/dist/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
  43. package/dist/modules/design_system/gallery/assets/crypto-sol.png +0 -0
  44. package/dist/modules/design_system/gallery/assets/crypto-star.svg +3 -0
  45. package/dist/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
  46. package/dist/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
  47. package/dist/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
  48. package/dist/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
  49. package/dist/modules/design_system/gallery/assets/crypto-trx.png +0 -0
  50. package/dist/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
  51. package/dist/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
  52. package/dist/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
  53. package/dist/modules/design_system/gallery/assets/crypto-wei.png +0 -0
  54. package/dist/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
  55. package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js +67 -0
  56. package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js.map +7 -0
  57. package/dist/modules/design_system/gallery/assets/github-logo.png +0 -0
  58. package/dist/modules/design_system/gallery/assets/images.d.js +1 -0
  59. package/dist/modules/design_system/gallery/assets/images.d.js.map +7 -0
  60. package/dist/modules/design_system/gallery/assets/input-european-union.svg +18 -0
  61. package/dist/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
  62. package/dist/modules/design_system/gallery/assets/marketing-artwork.js +83 -0
  63. package/dist/modules/design_system/gallery/assets/marketing-artwork.js.map +7 -0
  64. package/dist/modules/design_system/gallery/assets/menu-apex.svg +18 -0
  65. package/dist/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
  66. package/dist/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
  67. package/dist/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
  68. package/dist/modules/design_system/gallery/assets/select-google.png +0 -0
  69. package/dist/modules/design_system/gallery/assets/select-poland.png +0 -0
  70. package/dist/modules/design_system/gallery/assets/selection-artwork.js +5 -0
  71. package/dist/modules/design_system/gallery/assets/selection-artwork.js.map +7 -0
  72. package/dist/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
  73. package/dist/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
  74. package/dist/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
  75. package/dist/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
  76. package/dist/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
  77. package/dist/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
  78. package/dist/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
  79. package/dist/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
  80. package/dist/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
  81. package/dist/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
  82. package/dist/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
  83. package/dist/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
  84. package/dist/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
  85. package/dist/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
  86. package/dist/modules/design_system/gallery/assets/style-studio-product.png +0 -0
  87. package/dist/modules/design_system/gallery/assets/upload-images.js +8 -0
  88. package/dist/modules/design_system/gallery/assets/upload-images.js.map +7 -0
  89. package/dist/modules/design_system/gallery/components/BrandStylePreview.js +74 -0
  90. package/dist/modules/design_system/gallery/components/BrandStylePreview.js.map +7 -0
  91. package/dist/modules/design_system/gallery/components/CodeSnippet.js +31 -31
  92. package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +2 -2
  93. package/dist/modules/design_system/gallery/components/ColorPlayground.js +408 -0
  94. package/dist/modules/design_system/gallery/components/ColorPlayground.js.map +7 -0
  95. package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js +166 -0
  96. package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js.map +7 -0
  97. package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js +182 -0
  98. package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js.map +7 -0
  99. package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js +80 -0
  100. package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js.map +7 -0
  101. package/dist/modules/design_system/gallery/components/ComponentIndex.js +42 -0
  102. package/dist/modules/design_system/gallery/components/ComponentIndex.js.map +7 -0
  103. package/dist/modules/design_system/gallery/components/DesignSystemHome.js +69 -0
  104. package/dist/modules/design_system/gallery/components/DesignSystemHome.js.map +7 -0
  105. package/dist/modules/design_system/gallery/components/EntryCard.js +47 -41
  106. package/dist/modules/design_system/gallery/components/EntryCard.js.map +2 -2
  107. package/dist/modules/design_system/gallery/components/EntryHeader.js +68 -0
  108. package/dist/modules/design_system/gallery/components/EntryHeader.js.map +7 -0
  109. package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js +19 -0
  110. package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js.map +7 -0
  111. package/dist/modules/design_system/gallery/components/FoundationGuide.js +46 -0
  112. package/dist/modules/design_system/gallery/components/FoundationGuide.js.map +7 -0
  113. package/dist/modules/design_system/gallery/components/GalleryLink.js +21 -0
  114. package/dist/modules/design_system/gallery/components/GalleryLink.js.map +7 -0
  115. package/dist/modules/design_system/gallery/components/GalleryNavigation.js +82 -0
  116. package/dist/modules/design_system/gallery/components/GalleryNavigation.js.map +7 -0
  117. package/dist/modules/design_system/gallery/components/GalleryShell.js +147 -67
  118. package/dist/modules/design_system/gallery/components/GalleryShell.js.map +3 -3
  119. package/dist/modules/design_system/gallery/components/IconsBrowser.js +33 -0
  120. package/dist/modules/design_system/gallery/components/IconsBrowser.js.map +7 -0
  121. package/dist/modules/design_system/gallery/components/SourceLibrary.js +93 -0
  122. package/dist/modules/design_system/gallery/components/SourceLibrary.js.map +7 -0
  123. package/dist/modules/design_system/gallery/components/StyleAgents.js +139 -0
  124. package/dist/modules/design_system/gallery/components/StyleAgents.js.map +7 -0
  125. package/dist/modules/design_system/gallery/components/ThemeTokenReference.js +101 -0
  126. package/dist/modules/design_system/gallery/components/ThemeTokenReference.js.map +7 -0
  127. package/dist/modules/design_system/gallery/components/VariantPreview.js +2 -2
  128. package/dist/modules/design_system/gallery/components/VariantPreview.js.map +2 -2
  129. package/dist/modules/design_system/gallery/components/colorPreview.js +58 -0
  130. package/dist/modules/design_system/gallery/components/colorPreview.js.map +7 -0
  131. package/dist/modules/design_system/gallery/components/colorStudio.js +218 -0
  132. package/dist/modules/design_system/gallery/components/colorStudio.js.map +7 -0
  133. package/dist/modules/design_system/gallery/components/styleAgentBranding.js +46 -0
  134. package/dist/modules/design_system/gallery/components/styleAgentBranding.js.map +7 -0
  135. package/dist/modules/design_system/gallery/components/themeTokens.js +32 -0
  136. package/dist/modules/design_system/gallery/components/themeTokens.js.map +7 -0
  137. package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js +194 -0
  138. package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js.map +7 -0
  139. package/dist/modules/design_system/gallery/demos/ai-product.js +423 -0
  140. package/dist/modules/design_system/gallery/demos/ai-product.js.map +7 -0
  141. package/dist/modules/design_system/gallery/demos/buttons.js +289 -0
  142. package/dist/modules/design_system/gallery/demos/buttons.js.map +7 -0
  143. package/dist/modules/design_system/gallery/demos/cryptocurrency.js +1708 -0
  144. package/dist/modules/design_system/gallery/demos/cryptocurrency.js.map +7 -0
  145. package/dist/modules/design_system/gallery/demos/feeds-code.generated.js +92 -0
  146. package/dist/modules/design_system/gallery/demos/feeds-code.generated.js.map +7 -0
  147. package/dist/modules/design_system/gallery/demos/feeds.js +148 -0
  148. package/dist/modules/design_system/gallery/demos/feeds.js.map +7 -0
  149. package/dist/modules/design_system/gallery/demos/file-upload.js +72 -0
  150. package/dist/modules/design_system/gallery/demos/file-upload.js.map +7 -0
  151. package/dist/modules/design_system/gallery/demos/foundation-reference-data.js +4875 -0
  152. package/dist/modules/design_system/gallery/demos/foundation-reference-data.js.map +7 -0
  153. package/dist/modules/design_system/gallery/demos/foundation-references.js +188 -0
  154. package/dist/modules/design_system/gallery/demos/foundation-references.js.map +7 -0
  155. package/dist/modules/design_system/gallery/demos/key-components-code.generated.js +6 -0
  156. package/dist/modules/design_system/gallery/demos/key-components-code.generated.js.map +7 -0
  157. package/dist/modules/design_system/gallery/demos/key-components.js +127 -0
  158. package/dist/modules/design_system/gallery/demos/key-components.js.map +7 -0
  159. package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js +98 -0
  160. package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js.map +7 -0
  161. package/dist/modules/design_system/gallery/demos/marketing-controls.js +134 -0
  162. package/dist/modules/design_system/gallery/demos/marketing-controls.js.map +7 -0
  163. package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js +195 -0
  164. package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js.map +7 -0
  165. package/dist/modules/design_system/gallery/demos/marketing-widgets.js +586 -0
  166. package/dist/modules/design_system/gallery/demos/marketing-widgets.js.map +7 -0
  167. package/dist/modules/design_system/gallery/demos/menu-fixtures.js +40 -0
  168. package/dist/modules/design_system/gallery/demos/menu-fixtures.js.map +7 -0
  169. package/dist/modules/design_system/gallery/demos/menu-sources.js +295 -0
  170. package/dist/modules/design_system/gallery/demos/menu-sources.js.map +7 -0
  171. package/dist/modules/design_system/gallery/demos/menus.js +150 -0
  172. package/dist/modules/design_system/gallery/demos/menus.js.map +7 -0
  173. package/dist/modules/design_system/gallery/demos/rating-reviews.js +53 -0
  174. package/dist/modules/design_system/gallery/demos/rating-reviews.js.map +7 -0
  175. package/dist/modules/design_system/gallery/demos/registered-icons.js +104 -0
  176. package/dist/modules/design_system/gallery/demos/registered-icons.js.map +7 -0
  177. package/dist/modules/design_system/gallery/demos/selection-cards.js +99 -0
  178. package/dist/modules/design_system/gallery/demos/selection-cards.js.map +7 -0
  179. package/dist/modules/design_system/gallery/demos/shell-code.generated.js +189 -0
  180. package/dist/modules/design_system/gallery/demos/shell-code.generated.js.map +7 -0
  181. package/dist/modules/design_system/gallery/demos/shell.js +330 -0
  182. package/dist/modules/design_system/gallery/demos/shell.js.map +7 -0
  183. package/dist/modules/design_system/gallery/demos/source-artwork.js +120 -0
  184. package/dist/modules/design_system/gallery/demos/source-artwork.js.map +7 -0
  185. package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js +125 -0
  186. package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js.map +7 -0
  187. package/dist/modules/design_system/gallery/demos/source-filters.js +185 -0
  188. package/dist/modules/design_system/gallery/demos/source-filters.js.map +7 -0
  189. package/dist/modules/design_system/gallery/demos/source-icons.js +69 -0
  190. package/dist/modules/design_system/gallery/demos/source-icons.js.map +7 -0
  191. package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js +150 -0
  192. package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js.map +7 -0
  193. package/dist/modules/design_system/gallery/demos/table-cells.js +181 -0
  194. package/dist/modules/design_system/gallery/demos/table-cells.js.map +7 -0
  195. package/dist/modules/design_system/gallery/demos/text-inputs.js +113 -0
  196. package/dist/modules/design_system/gallery/demos/text-inputs.js.map +7 -0
  197. package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js +41 -0
  198. package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js.map +7 -0
  199. package/dist/modules/design_system/gallery/demos/time-picker.js +41 -0
  200. package/dist/modules/design_system/gallery/demos/time-picker.js.map +7 -0
  201. package/dist/modules/design_system/gallery/entries/banners.js +123 -60
  202. package/dist/modules/design_system/gallery/entries/banners.js.map +2 -2
  203. package/dist/modules/design_system/gallery/entries/buttons-snippets.js +433 -0
  204. package/dist/modules/design_system/gallery/entries/buttons-snippets.js.map +7 -0
  205. package/dist/modules/design_system/gallery/entries/buttons.js +127 -148
  206. package/dist/modules/design_system/gallery/entries/buttons.js.map +2 -2
  207. package/dist/modules/design_system/gallery/entries/charts.js +532 -186
  208. package/dist/modules/design_system/gallery/entries/charts.js.map +2 -2
  209. package/dist/modules/design_system/gallery/entries/dates.js +191 -3
  210. package/dist/modules/design_system/gallery/entries/dates.js.map +2 -2
  211. package/dist/modules/design_system/gallery/entries/detail.js +118 -77
  212. package/dist/modules/design_system/gallery/entries/detail.js.map +2 -2
  213. package/dist/modules/design_system/gallery/entries/display.js +1449 -240
  214. package/dist/modules/design_system/gallery/entries/display.js.map +2 -2
  215. package/dist/modules/design_system/gallery/entries/feedback.js +1058 -132
  216. package/dist/modules/design_system/gallery/entries/feedback.js.map +2 -2
  217. package/dist/modules/design_system/gallery/entries/filters.js +231 -103
  218. package/dist/modules/design_system/gallery/entries/filters.js.map +2 -2
  219. package/dist/modules/design_system/gallery/entries/foundations.js +368 -57
  220. package/dist/modules/design_system/gallery/entries/foundations.js.map +2 -2
  221. package/dist/modules/design_system/gallery/entries/icons.js +29 -91
  222. package/dist/modules/design_system/gallery/entries/icons.js.map +2 -2
  223. package/dist/modules/design_system/gallery/entries/inputs-snippets.js +154 -0
  224. package/dist/modules/design_system/gallery/entries/inputs-snippets.js.map +7 -0
  225. package/dist/modules/design_system/gallery/entries/inputs.js +2043 -306
  226. package/dist/modules/design_system/gallery/entries/inputs.js.map +2 -2
  227. package/dist/modules/design_system/gallery/entries/library.js +20 -0
  228. package/dist/modules/design_system/gallery/entries/library.js.map +7 -0
  229. package/dist/modules/design_system/gallery/entries/messages.js +121 -103
  230. package/dist/modules/design_system/gallery/entries/messages.js.map +2 -2
  231. package/dist/modules/design_system/gallery/entries/navigation.js +676 -103
  232. package/dist/modules/design_system/gallery/entries/navigation.js.map +2 -2
  233. package/dist/modules/design_system/gallery/entries/notifications.js +131 -78
  234. package/dist/modules/design_system/gallery/entries/notifications.js.map +2 -2
  235. package/dist/modules/design_system/gallery/entries/overlays.js +611 -203
  236. package/dist/modules/design_system/gallery/entries/overlays.js.map +2 -2
  237. package/dist/modules/design_system/gallery/entries/scaffolding.js +1175 -120
  238. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +2 -2
  239. package/dist/modules/design_system/gallery/entries/schedule.js +79 -54
  240. package/dist/modules/design_system/gallery/entries/schedule.js.map +2 -2
  241. package/dist/modules/design_system/gallery/presentation.js +108 -0
  242. package/dist/modules/design_system/gallery/presentation.js.map +7 -0
  243. package/dist/modules/design_system/gallery/registry.js +8 -5
  244. package/dist/modules/design_system/gallery/registry.js.map +2 -2
  245. package/dist/modules/design_system/gallery/source-library.generated.js +5 -0
  246. package/dist/modules/design_system/gallery/source-library.generated.js.map +7 -0
  247. package/dist/modules/design_system/i18n/de.json +7167 -0
  248. package/dist/modules/design_system/i18n/en.json +7167 -0
  249. package/dist/modules/design_system/i18n/es.json +7167 -0
  250. package/dist/modules/design_system/i18n/ko.json +7167 -0
  251. package/dist/modules/design_system/i18n/pl.json +7167 -0
  252. package/dist/modules/push_notifications/lib/queue.js +1 -31
  253. package/dist/modules/push_notifications/lib/queue.js.map +2 -2
  254. package/jest.config.cjs +1 -0
  255. package/jest.mocks/image.js +1 -0
  256. package/package.json +8 -9
  257. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +50 -0
  258. package/src/modules/customers/backend/customers/companies/[id]/page.tsx +2 -1
  259. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +2 -1
  260. package/src/modules/customers/backend/customers/people/[id]/page.tsx +2 -2
  261. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +2 -1
  262. package/src/modules/customers/lib/detailHelpers.ts +4 -0
  263. package/src/modules/customers/lib/todoCompatibility.ts +10 -0
  264. package/src/modules/design_system/backend/design-system/page.meta.ts +3 -2
  265. package/src/modules/design_system/gallery/assets/README.md +30 -0
  266. package/src/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
  267. package/src/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
  268. package/src/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
  269. package/src/modules/design_system/gallery/assets/avatar-photo.png +0 -0
  270. package/src/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
  271. package/src/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
  272. package/src/modules/design_system/gallery/assets/crypto-ada.png +0 -0
  273. package/src/modules/design_system/gallery/assets/crypto-avax.png +0 -0
  274. package/src/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
  275. package/src/modules/design_system/gallery/assets/crypto-brand.png +0 -0
  276. package/src/modules/design_system/gallery/assets/crypto-btc.png +0 -0
  277. package/src/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
  278. package/src/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
  279. package/src/modules/design_system/gallery/assets/crypto-dot.png +0 -0
  280. package/src/modules/design_system/gallery/assets/crypto-eth.png +0 -0
  281. package/src/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
  282. package/src/modules/design_system/gallery/assets/crypto-history.svg +3 -0
  283. package/src/modules/design_system/gallery/assets/crypto-link.svg +3 -0
  284. package/src/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
  285. package/src/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
  286. package/src/modules/design_system/gallery/assets/crypto-more.svg +3 -0
  287. package/src/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
  288. package/src/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
  289. package/src/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
  290. package/src/modules/design_system/gallery/assets/crypto-sol.png +0 -0
  291. package/src/modules/design_system/gallery/assets/crypto-star.svg +3 -0
  292. package/src/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
  293. package/src/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
  294. package/src/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
  295. package/src/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
  296. package/src/modules/design_system/gallery/assets/crypto-trx.png +0 -0
  297. package/src/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
  298. package/src/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
  299. package/src/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
  300. package/src/modules/design_system/gallery/assets/crypto-wei.png +0 -0
  301. package/src/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
  302. package/src/modules/design_system/gallery/assets/cryptocurrency-artwork.ts +63 -0
  303. package/src/modules/design_system/gallery/assets/github-logo.png +0 -0
  304. package/src/modules/design_system/gallery/assets/images.d.ts +9 -0
  305. package/src/modules/design_system/gallery/assets/input-european-union.svg +18 -0
  306. package/src/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
  307. package/src/modules/design_system/gallery/assets/marketing-artwork.ts +79 -0
  308. package/src/modules/design_system/gallery/assets/menu-apex.svg +18 -0
  309. package/src/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
  310. package/src/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
  311. package/src/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
  312. package/src/modules/design_system/gallery/assets/select-google.png +0 -0
  313. package/src/modules/design_system/gallery/assets/select-poland.png +0 -0
  314. package/src/modules/design_system/gallery/assets/selection-artwork.ts +1 -0
  315. package/src/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
  316. package/src/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
  317. package/src/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
  318. package/src/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
  319. package/src/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
  320. package/src/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
  321. package/src/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
  322. package/src/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
  323. package/src/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
  324. package/src/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
  325. package/src/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
  326. package/src/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
  327. package/src/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
  328. package/src/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
  329. package/src/modules/design_system/gallery/assets/style-studio-product.png +0 -0
  330. package/src/modules/design_system/gallery/assets/upload-images.ts +5 -0
  331. package/src/modules/design_system/gallery/components/BrandStylePreview.tsx +94 -0
  332. package/src/modules/design_system/gallery/components/CodeSnippet.tsx +34 -34
  333. package/src/modules/design_system/gallery/components/ColorPlayground.tsx +324 -0
  334. package/src/modules/design_system/gallery/components/ColorStudioCompositions.tsx +96 -0
  335. package/src/modules/design_system/gallery/components/ColorStudioSpecimen.tsx +164 -0
  336. package/src/modules/design_system/gallery/components/CompactEntrySpecimen.tsx +65 -0
  337. package/src/modules/design_system/gallery/components/ComponentIndex.tsx +47 -0
  338. package/src/modules/design_system/gallery/components/DesignSystemHome.tsx +66 -0
  339. package/src/modules/design_system/gallery/components/EntryCard.tsx +52 -37
  340. package/src/modules/design_system/gallery/components/EntryHeader.tsx +80 -0
  341. package/src/modules/design_system/gallery/components/FamilyEntryPreview.tsx +22 -0
  342. package/src/modules/design_system/gallery/components/FoundationGuide.tsx +43 -0
  343. package/src/modules/design_system/gallery/components/GalleryLink.tsx +19 -0
  344. package/src/modules/design_system/gallery/components/GalleryNavigation.tsx +86 -0
  345. package/src/modules/design_system/gallery/components/GalleryShell.tsx +149 -63
  346. package/src/modules/design_system/gallery/components/IconsBrowser.tsx +40 -0
  347. package/src/modules/design_system/gallery/components/SourceLibrary.tsx +90 -0
  348. package/src/modules/design_system/gallery/components/StyleAgents.tsx +115 -0
  349. package/src/modules/design_system/gallery/components/ThemeTokenReference.tsx +76 -0
  350. package/src/modules/design_system/gallery/components/VariantPreview.tsx +2 -2
  351. package/src/modules/design_system/gallery/components/colorPreview.ts +63 -0
  352. package/src/modules/design_system/gallery/components/colorStudio.ts +260 -0
  353. package/src/modules/design_system/gallery/components/styleAgentBranding.ts +42 -0
  354. package/src/modules/design_system/gallery/components/themeTokens.ts +26 -0
  355. package/src/modules/design_system/gallery/demos/ai-product-code.generated.ts +3 -0
  356. package/src/modules/design_system/gallery/demos/ai-product.tsx +188 -0
  357. package/src/modules/design_system/gallery/demos/buttons.tsx +331 -0
  358. package/src/modules/design_system/gallery/demos/cryptocurrency.tsx +1943 -0
  359. package/src/modules/design_system/gallery/demos/feeds-code.generated.ts +4 -0
  360. package/src/modules/design_system/gallery/demos/feeds.tsx +82 -0
  361. package/src/modules/design_system/gallery/demos/file-upload.tsx +61 -0
  362. package/src/modules/design_system/gallery/demos/foundation-reference-data.ts +4872 -0
  363. package/src/modules/design_system/gallery/demos/foundation-references.tsx +140 -0
  364. package/src/modules/design_system/gallery/demos/key-components-code.generated.ts +3 -0
  365. package/src/modules/design_system/gallery/demos/key-components.tsx +106 -0
  366. package/src/modules/design_system/gallery/demos/marketing-controls-code.generated.ts +3 -0
  367. package/src/modules/design_system/gallery/demos/marketing-controls.tsx +92 -0
  368. package/src/modules/design_system/gallery/demos/marketing-widgets-code.generated.ts +3 -0
  369. package/src/modules/design_system/gallery/demos/marketing-widgets.tsx +189 -0
  370. package/src/modules/design_system/gallery/demos/menu-fixtures.tsx +48 -0
  371. package/src/modules/design_system/gallery/demos/menu-sources.ts +5 -0
  372. package/src/modules/design_system/gallery/demos/menus.tsx +122 -0
  373. package/src/modules/design_system/gallery/demos/rating-reviews.tsx +44 -0
  374. package/src/modules/design_system/gallery/demos/registered-icons.tsx +117 -0
  375. package/src/modules/design_system/gallery/demos/selection-cards.tsx +97 -0
  376. package/src/modules/design_system/gallery/demos/shell-code.generated.ts +3 -0
  377. package/src/modules/design_system/gallery/demos/shell.tsx +183 -0
  378. package/src/modules/design_system/gallery/demos/source-artwork.tsx +88 -0
  379. package/src/modules/design_system/gallery/demos/source-filters-code.generated.ts +3 -0
  380. package/src/modules/design_system/gallery/demos/source-filters.tsx +119 -0
  381. package/src/modules/design_system/gallery/demos/source-icons.tsx +62 -0
  382. package/src/modules/design_system/gallery/demos/table-cells-code.generated.ts +3 -0
  383. package/src/modules/design_system/gallery/demos/table-cells.tsx +144 -0
  384. package/src/modules/design_system/gallery/demos/text-inputs.tsx +90 -0
  385. package/src/modules/design_system/gallery/demos/time-picker-code.generated.ts +5 -0
  386. package/src/modules/design_system/gallery/demos/time-picker.tsx +31 -0
  387. package/src/modules/design_system/gallery/entries/banners.tsx +143 -94
  388. package/src/modules/design_system/gallery/entries/buttons-snippets.ts +432 -0
  389. package/src/modules/design_system/gallery/entries/buttons.tsx +125 -196
  390. package/src/modules/design_system/gallery/entries/charts.tsx +545 -233
  391. package/src/modules/design_system/gallery/entries/dates.tsx +171 -3
  392. package/src/modules/design_system/gallery/entries/detail.tsx +142 -115
  393. package/src/modules/design_system/gallery/entries/display.tsx +1691 -319
  394. package/src/modules/design_system/gallery/entries/feedback.tsx +1082 -169
  395. package/src/modules/design_system/gallery/entries/filters.tsx +238 -143
  396. package/src/modules/design_system/gallery/entries/foundations.tsx +404 -61
  397. package/src/modules/design_system/gallery/entries/icons.tsx +31 -117
  398. package/src/modules/design_system/gallery/entries/inputs-snippets.ts +156 -0
  399. package/src/modules/design_system/gallery/entries/inputs.tsx +2146 -503
  400. package/src/modules/design_system/gallery/entries/library.tsx +16 -0
  401. package/src/modules/design_system/gallery/entries/messages.tsx +114 -106
  402. package/src/modules/design_system/gallery/entries/navigation.tsx +782 -192
  403. package/src/modules/design_system/gallery/entries/notifications.tsx +145 -120
  404. package/src/modules/design_system/gallery/entries/overlays.tsx +696 -280
  405. package/src/modules/design_system/gallery/entries/scaffolding.tsx +1192 -158
  406. package/src/modules/design_system/gallery/entries/schedule.tsx +72 -58
  407. package/src/modules/design_system/gallery/presentation.ts +106 -0
  408. package/src/modules/design_system/gallery/registry.ts +8 -6
  409. package/src/modules/design_system/gallery/source-library.generated.ts +2 -0
  410. package/src/modules/design_system/i18n/de.json +7112 -3
  411. package/src/modules/design_system/i18n/en.json +7112 -3
  412. package/src/modules/design_system/i18n/es.json +7112 -3
  413. package/src/modules/design_system/i18n/ko.json +7112 -3
  414. package/src/modules/design_system/i18n/pl.json +7112 -3
  415. package/src/modules/push_notifications/AGENTS.md +9 -5
  416. package/src/modules/push_notifications/lib/queue.ts +15 -44
@@ -1,4 +1,6 @@
1
1
  import * as React from 'react'
2
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
3
+ import { Label } from '@open-mercato/ui/primitives/label'
2
4
  import { CreditCard, LayoutGrid, Settings, ShoppingCart, Truck } from 'lucide-react'
3
5
  import { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'
4
6
  import {
@@ -10,7 +12,7 @@ import {
10
12
  BreadcrumbPage,
11
13
  BreadcrumbSeparator,
12
14
  } from '@open-mercato/ui/primitives/breadcrumb'
13
- import { Pagination } from '@open-mercato/ui/primitives/pagination'
15
+ import { Pagination, type PaginationAppearance } from '@open-mercato/ui/primitives/pagination'
14
16
  import {
15
17
  SegmentedControl,
16
18
  SegmentedControlItem,
@@ -21,6 +23,10 @@ import {
21
23
  AccordionItem,
22
24
  AccordionTrigger,
23
25
  } from '@open-mercato/ui/primitives/accordion'
26
+ import { SidebarExample, SidebarFeatureExample, SidebarIdentityExample, SidebarItemsExample, TopbarExample, NavigationBrandsExample } from '../demos/shell'
27
+ import { shellExampleCode } from '../demos/shell-code.generated'
28
+ import { AiPromptExample, AiIconButtonExamples, AiNavigationExamples, AiSearchExamples, AiAuthExamples, AiSettingsExamples, AiNewChatExample, AiSidebarExample, AiMobileNavigationExample } from '../demos/ai-product'
29
+ import { aiProductExampleCode } from '../demos/ai-product-code.generated'
24
30
  import type { GalleryEntry } from '../types'
25
31
 
26
32
  // Component titles and variant names are proper nouns from the codebase and
@@ -31,11 +37,13 @@ import type { GalleryEntry } from '../types'
31
37
  // Pagination is a controlled component — these small wrappers own the page
32
38
  // state so the preview stays interactive without polluting the entry shape.
33
39
 
34
- function PaginationBasicDemo() {
40
+ function PaginationBasicDemo({ appearance, disabled = false }: { appearance?: PaginationAppearance; disabled?: boolean }) {
35
41
  const [page, setPage] = React.useState(2)
36
42
  const [pageSize, setPageSize] = React.useState(25)
37
43
  return (
38
44
  <Pagination
45
+ appearance={appearance}
46
+ disabled={disabled}
39
47
  page={page}
40
48
  pageSize={pageSize}
41
49
  total={400}
@@ -59,6 +67,99 @@ function PaginationCompactDemo() {
59
67
  )
60
68
  }
61
69
 
70
+ function TabsQuantityDemo({ variant, orientation }: { variant: 'underline' | 'card' | 'list'; orientation: 'horizontal' | 'vertical' }) {
71
+ const t = useT()
72
+ const counts = orientation === 'vertical' ? [2, 3, 4, 5, 6, 7, 8] : [2, 3, 4, 5, 6]
73
+ return <div className={orientation === 'vertical' ? 'grid w-full gap-6 xl:grid-cols-2' : 'flex w-full flex-col gap-6'}>
74
+ {counts.map(count => <Tabs key={count} defaultValue="1" variant={variant} orientation={orientation} className="min-w-0">
75
+ <TabsList aria-label={t('design_system.gallery.examples.navigation2.sections', { count })} className={orientation === 'vertical' ? 'w-64 shrink-0' : 'flex w-full overflow-x-auto'}>
76
+ {orientation === 'vertical' && <span aria-hidden="true" className="px-2 py-1 text-xs font-medium uppercase text-muted-foreground">{t('design_system.gallery.examples.navigation2.selectMenu')}</span>}
77
+ {Array.from({ length: count }, (_, index) => <TabsTrigger key={index} value={String(index + 1)} leading={<LayoutGrid className="size-5" />} count={index === 1 ? 12 : undefined}>
78
+ {t('design_system.gallery.examples.navigation2.section', { number: index + 1 })}
79
+ </TabsTrigger>)}
80
+ </TabsList>
81
+ {Array.from({ length: count }, (_, index) => <TabsContent key={index} value={String(index + 1)} className="text-sm text-muted-foreground">
82
+ {t('design_system.gallery.examples.navigation2.panel', { number: index + 1 })}
83
+ </TabsContent>)}
84
+ </Tabs>)}
85
+ </div>
86
+ }
87
+
88
+ function TabsKeyboardDemo() {
89
+ const t = useT()
90
+ return <Tabs defaultValue="overview" variant="underline" className="w-full">
91
+ <TabsList aria-label={t('design_system.gallery.examples.navigation2.keyboard')}>
92
+ <TabsTrigger value="overview" leading={<LayoutGrid className="size-5" />}>{t('design_system.gallery.examples.navigation2.overview')}</TabsTrigger>
93
+ <TabsTrigger value="locked" disabled count={4}>{t('design_system.gallery.examples.navigation2.locked')}</TabsTrigger>
94
+ <TabsTrigger value="settings" leading={<Settings className="size-5" />}>{t('design_system.gallery.examples.navigation2.settings')}</TabsTrigger>
95
+ </TabsList>
96
+ <TabsContent value="overview">{t('design_system.gallery.examples.navigation2.keyboardHint')}</TabsContent>
97
+ <TabsContent value="settings">{t('design_system.gallery.examples.navigation2.settingsPanel')}</TabsContent>
98
+ </Tabs>
99
+ }
100
+
101
+ function BreadcrumbQuantityDemo() {
102
+ const t = useT()
103
+ const targetId = React.useId()
104
+ return <div className="flex w-full flex-col gap-4">
105
+ {(['arrow', 'slash', 'dot'] as const).map(divider => <div key={divider} className="flex flex-col gap-4">
106
+ {[3, 4, 5].map(count => <Breadcrumb key={count} divider={divider} aria-label={t('design_system.gallery.examples.navigation2.path', { count })}>
107
+ <BreadcrumbList className="flex-wrap">
108
+ {Array.from({ length: count }, (_, index) => <React.Fragment key={index}>
109
+ {index > 0 && <BreadcrumbSeparator className="size-5 justify-center">{divider === 'dot' ? '•' : undefined}</BreadcrumbSeparator>}
110
+ <BreadcrumbItem>
111
+ {index === count - 1
112
+ ? <BreadcrumbPage>{t('design_system.gallery.examples.navigation2.section', { number: index + 1 })}</BreadcrumbPage>
113
+ : <BreadcrumbLink href={`#${targetId}`}><LayoutGrid className="size-5" aria-hidden="true" />{t('design_system.gallery.examples.navigation2.section', { number: index + 1 })}</BreadcrumbLink>}
114
+ </BreadcrumbItem>
115
+ </React.Fragment>)}
116
+ </BreadcrumbList>
117
+ </Breadcrumb>)}
118
+ </div>)}
119
+ <p id={targetId} tabIndex={-1} className="text-sm text-muted-foreground">{t('design_system.gallery.examples.navigation2.localDestination')}</p>
120
+ </div>
121
+ }
122
+
123
+ function AccordionStartDemo() {
124
+ const t = useT()
125
+ return <Accordion type="single" collapsible defaultValue="details" className="w-full max-w-md space-y-2">
126
+ <AccordionItem value="overview">
127
+ <AccordionTrigger iconPosition="start">{t('design_system.gallery.examples.navigation2.overview')}</AccordionTrigger>
128
+ <AccordionContent>{t('design_system.gallery.examples.navigation2.accordionBody')}</AccordionContent>
129
+ </AccordionItem>
130
+ <AccordionItem value="details">
131
+ <AccordionTrigger iconPosition="start">{t('design_system.gallery.examples.navigation2.settings')}</AccordionTrigger>
132
+ <AccordionContent>{t('design_system.gallery.examples.navigation2.accordionBody')}</AccordionContent>
133
+ </AccordionItem>
134
+ <AccordionItem value="locked" disabled>
135
+ <AccordionTrigger iconPosition="start">{t('design_system.gallery.examples.navigation2.locked')}</AccordionTrigger>
136
+ <AccordionContent>{t('design_system.gallery.examples.navigation2.accordionBody')}</AccordionContent>
137
+ </AccordionItem>
138
+ </Accordion>
139
+ }
140
+
141
+ function SegmentedSourceDemo({ content }: { content: 'text' | 'leading' | 'icon' }) {
142
+ const t = useT()
143
+ const labelId = React.useId()
144
+ const [value, setValue] = React.useState('overview')
145
+ const options = [
146
+ { value: 'overview', label: t('design_system.gallery.examples.navigation2.overview'), icon: <LayoutGrid className="size-5" aria-hidden="true" /> },
147
+ { value: 'settings', label: t('design_system.gallery.examples.navigation2.settings'), icon: <Settings className="size-5" aria-hidden="true" /> },
148
+ { value: 'orders', label: t('design_system.gallery.examples.navigation2.orders'), icon: <ShoppingCart className="size-5" aria-hidden="true" /> },
149
+ ]
150
+ return <div className="flex w-full max-w-sm flex-col gap-6">
151
+ {[false, true].map(disabled => <div key={String(disabled)} className="flex flex-col gap-1.5">
152
+ <Label id={`${labelId}-${disabled}`} className="leading-5">{disabled ? t('design_system.gallery.examples.navigation2.locked') : t('design_system.gallery.examples.navigation2.selectMenu')}</Label>
153
+ <SegmentedControl value={value} onValueChange={setValue} disabled={disabled} aria-labelledby={`${labelId}-${disabled}`} className="h-9 w-full gap-1 rounded-lg border-0 p-1">
154
+ {options.map(option => <SegmentedControlItem key={option.value} value={option.value} aria-label={content === 'icon' ? option.label : undefined} className="h-7 min-w-0 flex-1 gap-1.5 rounded-md p-1">
155
+ {content !== 'text' && option.icon}
156
+ {content !== 'icon' && option.label}
157
+ </SegmentedControlItem>)}
158
+ </SegmentedControl>
159
+ </div>)}
160
+ </div>
161
+ }
162
+
62
163
  const tabsEntry: GalleryEntry = {
63
164
  id: 'tabs',
64
165
  title: 'Tabs',
@@ -78,30 +179,7 @@ const tabsEntry: GalleryEntry = {
78
179
  title: 'underline',
79
180
  // Underline is the DS canon for page-level tab strips — flat rail
80
181
  // with an accent underline, per-tab `leading` icon and `count` badge.
81
- render: () => (
82
- <Tabs defaultValue="orders" variant="underline" className="w-full">
83
- <TabsList aria-label="Customer sections">
84
- <TabsTrigger value="overview" leading={<LayoutGrid className="size-4" />}>
85
- Overview
86
- </TabsTrigger>
87
- <TabsTrigger value="orders" leading={<ShoppingCart className="size-4" />} count={12}>
88
- Orders
89
- </TabsTrigger>
90
- <TabsTrigger value="settings" leading={<Settings className="size-4" />}>
91
- Settings
92
- </TabsTrigger>
93
- </TabsList>
94
- <TabsContent value="overview">
95
- <p className="text-sm text-muted-foreground">Customer overview panel.</p>
96
- </TabsContent>
97
- <TabsContent value="orders">
98
- <p className="text-sm text-muted-foreground">12 orders in the last 30 days.</p>
99
- </TabsContent>
100
- <TabsContent value="settings">
101
- <p className="text-sm text-muted-foreground">Notification and access settings.</p>
102
- </TabsContent>
103
- </Tabs>
104
- ),
182
+ render: () => <TabsNavigationUnderlineSample />,
105
183
  code: `import { LayoutGrid, Settings, ShoppingCart } from 'lucide-react'
106
184
  import { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'
107
185
 
@@ -119,24 +197,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primi
119
197
  {
120
198
  id: 'pill',
121
199
  title: 'pill (default)',
122
- render: () => (
123
- <Tabs defaultValue="preview">
124
- <TabsList aria-label="Editor view">
125
- <TabsTrigger value="preview">Preview</TabsTrigger>
126
- <TabsTrigger value="code">Code</TabsTrigger>
127
- <TabsTrigger value="logs">Logs</TabsTrigger>
128
- </TabsList>
129
- <TabsContent value="preview">
130
- <p className="text-sm text-muted-foreground">Rendered preview.</p>
131
- </TabsContent>
132
- <TabsContent value="code">
133
- <p className="text-sm text-muted-foreground">Source code panel.</p>
134
- </TabsContent>
135
- <TabsContent value="logs">
136
- <p className="text-sm text-muted-foreground">Runtime logs panel.</p>
137
- </TabsContent>
138
- </Tabs>
139
- ),
200
+ render: () => <TabsNavigationPillSample />,
140
201
  code: `import { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'
141
202
 
142
203
  <Tabs defaultValue="preview">
@@ -153,24 +214,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primi
153
214
  {
154
215
  id: 'pill-vertical',
155
216
  title: 'pill, vertical',
156
- render: () => (
157
- <Tabs defaultValue="profile" orientation="vertical" className="w-full">
158
- <TabsList aria-label="Account settings">
159
- <TabsTrigger value="profile">Profile</TabsTrigger>
160
- <TabsTrigger value="billing">Billing</TabsTrigger>
161
- <TabsTrigger value="security">Security</TabsTrigger>
162
- </TabsList>
163
- <TabsContent value="profile">
164
- <p className="text-sm text-muted-foreground">Profile settings panel.</p>
165
- </TabsContent>
166
- <TabsContent value="billing">
167
- <p className="text-sm text-muted-foreground">Billing settings panel.</p>
168
- </TabsContent>
169
- <TabsContent value="security">
170
- <p className="text-sm text-muted-foreground">Security settings panel.</p>
171
- </TabsContent>
172
- </Tabs>
173
- ),
217
+ render: () => <TabsNavigationPillVerticalSample />,
174
218
  code: `import { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'
175
219
 
176
220
  <Tabs defaultValue="profile" orientation="vertical">
@@ -184,11 +228,123 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primi
184
228
  <TabsContent value="security">…</TabsContent>
185
229
  </Tabs>`,
186
230
  },
231
+ {
232
+ id: 'underline-quantities',
233
+ title: 'underline · all source counts',
234
+ render: () => <TabsQuantityDemo variant="underline" orientation="horizontal" />,
235
+ code: `import * as React from 'react'
236
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
237
+ import { LayoutGrid, Settings } from 'lucide-react'
238
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from '@open-mercato/ui/primitives/tabs'
239
+
240
+ function TabsQuantityDemo({ variant, orientation }: { variant: 'underline' | 'card' | 'list'; orientation: 'horizontal' | 'vertical' }) {
241
+ const t = useT()
242
+ const counts = orientation === 'vertical' ? [2, 3, 4, 5, 6, 7, 8] : [2, 3, 4, 5, 6]
243
+ return <div className={orientation === 'vertical' ? 'grid w-full gap-6 xl:grid-cols-2' : 'flex w-full flex-col gap-6'}>
244
+ {counts.map(count => <Tabs key={count} defaultValue="1" variant={variant} orientation={orientation} className="min-w-0">
245
+ <TabsList aria-label={t('design_system.gallery.examples.navigation2.sections', { count })} className={orientation === 'vertical' ? 'w-64 shrink-0' : 'flex w-full overflow-x-auto'}>
246
+ {orientation === 'vertical' && <span aria-hidden="true" className="px-2 py-1 text-xs font-medium uppercase text-muted-foreground">{t('design_system.gallery.examples.navigation2.selectMenu')}</span>}
247
+ {Array.from({ length: count }, (_, index) => <TabsTrigger key={index} value={String(index + 1)} leading={<LayoutGrid className="size-5" />} count={index === 1 ? 12 : undefined}>
248
+ {t('design_system.gallery.examples.navigation2.section', { number: index + 1 })}
249
+ </TabsTrigger>)}
250
+ </TabsList>
251
+ {Array.from({ length: count }, (_, index) => <TabsContent key={index} value={String(index + 1)} className="text-sm text-muted-foreground">
252
+ {t('design_system.gallery.examples.navigation2.panel', { number: index + 1 })}
253
+ </TabsContent>)}
254
+ </Tabs>)}
255
+ </div>
256
+ }
257
+
258
+ <TabsQuantityDemo variant="underline" orientation="horizontal" />`,
259
+ },
260
+ {
261
+ id: 'card-quantities',
262
+ title: 'card · all source counts',
263
+ render: () => <TabsQuantityDemo variant="card" orientation="vertical" />,
264
+ code: `import * as React from 'react'
265
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
266
+ import { LayoutGrid, Settings } from 'lucide-react'
267
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from '@open-mercato/ui/primitives/tabs'
268
+
269
+ function TabsQuantityDemo({ variant, orientation }: { variant: 'underline' | 'card' | 'list'; orientation: 'horizontal' | 'vertical' }) {
270
+ const t = useT()
271
+ const counts = orientation === 'vertical' ? [2, 3, 4, 5, 6, 7, 8] : [2, 3, 4, 5, 6]
272
+ return <div className={orientation === 'vertical' ? 'grid w-full gap-6 xl:grid-cols-2' : 'flex w-full flex-col gap-6'}>
273
+ {counts.map(count => <Tabs key={count} defaultValue="1" variant={variant} orientation={orientation} className="min-w-0">
274
+ <TabsList aria-label={t('design_system.gallery.examples.navigation2.sections', { count })} className={orientation === 'vertical' ? 'w-64 shrink-0' : 'flex w-full overflow-x-auto'}>
275
+ {orientation === 'vertical' && <span aria-hidden="true" className="px-2 py-1 text-xs font-medium uppercase text-muted-foreground">{t('design_system.gallery.examples.navigation2.selectMenu')}</span>}
276
+ {Array.from({ length: count }, (_, index) => <TabsTrigger key={index} value={String(index + 1)} leading={<LayoutGrid className="size-5" />} count={index === 1 ? 12 : undefined}>
277
+ {t('design_system.gallery.examples.navigation2.section', { number: index + 1 })}
278
+ </TabsTrigger>)}
279
+ </TabsList>
280
+ {Array.from({ length: count }, (_, index) => <TabsContent key={index} value={String(index + 1)} className="text-sm text-muted-foreground">
281
+ {t('design_system.gallery.examples.navigation2.panel', { number: index + 1 })}
282
+ </TabsContent>)}
283
+ </Tabs>)}
284
+ </div>
285
+ }
286
+
287
+ <TabsQuantityDemo variant="card" orientation="vertical" />`,
288
+ },
289
+ {
290
+ id: 'list-quantities',
291
+ title: 'list · all source counts',
292
+ render: () => <TabsQuantityDemo variant="list" orientation="vertical" />,
293
+ code: `import * as React from 'react'
294
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
295
+ import { LayoutGrid, Settings } from 'lucide-react'
296
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from '@open-mercato/ui/primitives/tabs'
297
+
298
+ function TabsQuantityDemo({ variant, orientation }: { variant: 'underline' | 'card' | 'list'; orientation: 'horizontal' | 'vertical' }) {
299
+ const t = useT()
300
+ const counts = orientation === 'vertical' ? [2, 3, 4, 5, 6, 7, 8] : [2, 3, 4, 5, 6]
301
+ return <div className={orientation === 'vertical' ? 'grid w-full gap-6 xl:grid-cols-2' : 'flex w-full flex-col gap-6'}>
302
+ {counts.map(count => <Tabs key={count} defaultValue="1" variant={variant} orientation={orientation} className="min-w-0">
303
+ <TabsList aria-label={t('design_system.gallery.examples.navigation2.sections', { count })} className={orientation === 'vertical' ? 'w-64 shrink-0' : 'flex w-full overflow-x-auto'}>
304
+ {orientation === 'vertical' && <span aria-hidden="true" className="px-2 py-1 text-xs font-medium uppercase text-muted-foreground">{t('design_system.gallery.examples.navigation2.selectMenu')}</span>}
305
+ {Array.from({ length: count }, (_, index) => <TabsTrigger key={index} value={String(index + 1)} leading={<LayoutGrid className="size-5" />} count={index === 1 ? 12 : undefined}>
306
+ {t('design_system.gallery.examples.navigation2.section', { number: index + 1 })}
307
+ </TabsTrigger>)}
308
+ </TabsList>
309
+ {Array.from({ length: count }, (_, index) => <TabsContent key={index} value={String(index + 1)} className="text-sm text-muted-foreground">
310
+ {t('design_system.gallery.examples.navigation2.panel', { number: index + 1 })}
311
+ </TabsContent>)}
312
+ </Tabs>)}
313
+ </div>
314
+ }
315
+
316
+ <TabsQuantityDemo variant="list" orientation="vertical" />`,
317
+ },
318
+ {
319
+ id: 'keyboard-states',
320
+ title: 'Keyboard and disabled tabs',
321
+ render: () => <TabsKeyboardDemo />,
322
+ code: `import * as React from 'react'
323
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
324
+ import { LayoutGrid, Settings } from 'lucide-react'
325
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from '@open-mercato/ui/primitives/tabs'
326
+
327
+ function TabsKeyboardDemo() {
328
+ const t = useT()
329
+ return <Tabs defaultValue="overview" variant="underline" className="w-full">
330
+ <TabsList aria-label={t('design_system.gallery.examples.navigation2.keyboard')}>
331
+ <TabsTrigger value="overview" leading={<LayoutGrid className="size-5" />}>{t('design_system.gallery.examples.navigation2.overview')}</TabsTrigger>
332
+ <TabsTrigger value="locked" disabled count={4}>{t('design_system.gallery.examples.navigation2.locked')}</TabsTrigger>
333
+ <TabsTrigger value="settings" leading={<Settings className="size-5" />}>{t('design_system.gallery.examples.navigation2.settings')}</TabsTrigger>
334
+ </TabsList>
335
+ <TabsContent value="overview">{t('design_system.gallery.examples.navigation2.keyboardHint')}</TabsContent>
336
+ <TabsContent value="settings">{t('design_system.gallery.examples.navigation2.settingsPanel')}</TabsContent>
337
+ </Tabs>
338
+ }
339
+
340
+ <TabsKeyboardDemo />`,
341
+ },
187
342
  ],
188
343
  }
189
344
 
190
345
  const breadcrumbEntry: GalleryEntry = {
191
346
  id: 'breadcrumb',
347
+ figmaNodeId: '447:8832',
192
348
  title: 'Breadcrumb',
193
349
  importPath: '@open-mercato/ui/primitives/breadcrumb',
194
350
  docsAnchor: '#breadcrumb',
@@ -196,23 +352,7 @@ const breadcrumbEntry: GalleryEntry = {
196
352
  {
197
353
  id: 'slash',
198
354
  title: 'slash (default)',
199
- render: () => (
200
- <Breadcrumb>
201
- <BreadcrumbList>
202
- <BreadcrumbItem>
203
- <BreadcrumbLink href="#gallery-entry-breadcrumb">Dashboard</BreadcrumbLink>
204
- </BreadcrumbItem>
205
- <BreadcrumbSeparator />
206
- <BreadcrumbItem>
207
- <BreadcrumbLink href="#gallery-entry-breadcrumb">Products</BreadcrumbLink>
208
- </BreadcrumbItem>
209
- <BreadcrumbSeparator />
210
- <BreadcrumbItem>
211
- <BreadcrumbPage>Winter catalog</BreadcrumbPage>
212
- </BreadcrumbItem>
213
- </BreadcrumbList>
214
- </Breadcrumb>
215
- ),
355
+ render: () => <BreadcrumbNavigationSlashSample />,
216
356
  code: `import {
217
357
  Breadcrumb,
218
358
  BreadcrumbItem,
@@ -241,23 +381,7 @@ const breadcrumbEntry: GalleryEntry = {
241
381
  {
242
382
  id: 'arrow',
243
383
  title: 'arrow divider',
244
- render: () => (
245
- <Breadcrumb divider="arrow">
246
- <BreadcrumbList>
247
- <BreadcrumbItem>
248
- <BreadcrumbLink href="#gallery-entry-breadcrumb">Orders</BreadcrumbLink>
249
- </BreadcrumbItem>
250
- <BreadcrumbSeparator />
251
- <BreadcrumbItem>
252
- <BreadcrumbLink href="#gallery-entry-breadcrumb">#20418</BreadcrumbLink>
253
- </BreadcrumbItem>
254
- <BreadcrumbSeparator />
255
- <BreadcrumbItem>
256
- <BreadcrumbPage>Shipment</BreadcrumbPage>
257
- </BreadcrumbItem>
258
- </BreadcrumbList>
259
- </Breadcrumb>
260
- ),
384
+ render: () => <BreadcrumbNavigationArrowSample />,
261
385
  code: `import {
262
386
  Breadcrumb,
263
387
  BreadcrumbItem,
@@ -286,27 +410,7 @@ const breadcrumbEntry: GalleryEntry = {
286
410
  {
287
411
  id: 'ellipsis',
288
412
  title: 'collapsed (ellipsis)',
289
- render: () => (
290
- <Breadcrumb>
291
- <BreadcrumbList>
292
- <BreadcrumbItem>
293
- <BreadcrumbLink href="#gallery-entry-breadcrumb">Dashboard</BreadcrumbLink>
294
- </BreadcrumbItem>
295
- <BreadcrumbSeparator />
296
- <BreadcrumbItem>
297
- <BreadcrumbEllipsis />
298
- </BreadcrumbItem>
299
- <BreadcrumbSeparator />
300
- <BreadcrumbItem>
301
- <BreadcrumbLink href="#gallery-entry-breadcrumb">Attributes</BreadcrumbLink>
302
- </BreadcrumbItem>
303
- <BreadcrumbSeparator />
304
- <BreadcrumbItem>
305
- <BreadcrumbPage>Color</BreadcrumbPage>
306
- </BreadcrumbItem>
307
- </BreadcrumbList>
308
- </Breadcrumb>
309
- ),
413
+ render: () => <BreadcrumbNavigationEllipsisSample />,
310
414
  code: `import {
311
415
  Breadcrumb,
312
416
  BreadcrumbEllipsis,
@@ -337,6 +441,39 @@ const breadcrumbEntry: GalleryEntry = {
337
441
  </BreadcrumbList>
338
442
  </Breadcrumb>`,
339
443
  },
444
+ {
445
+ id: 'dividers-quantities',
446
+ title: 'Arrow / Slash / Dot ·3,4,5items',
447
+ render: () => <BreadcrumbQuantityDemo />,
448
+ code: `import * as React from 'react'
449
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
450
+ import { LayoutGrid } from 'lucide-react'
451
+ import { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbSeparator, BreadcrumbLink, BreadcrumbPage } from '@open-mercato/ui/primitives/breadcrumb'
452
+
453
+ function BreadcrumbQuantityDemo() {
454
+ const t = useT()
455
+ const targetId = React.useId()
456
+ return <div className="flex w-full flex-col gap-4">
457
+ {(['arrow', 'slash', 'dot'] as const).map(divider => <div key={divider} className="flex flex-col gap-4">
458
+ {[3, 4, 5].map(count => <Breadcrumb key={count} divider={divider} aria-label={t('design_system.gallery.examples.navigation2.path', { count })}>
459
+ <BreadcrumbList className="flex-wrap">
460
+ {Array.from({ length: count }, (_, index) => <React.Fragment key={index}>
461
+ {index > 0 && <BreadcrumbSeparator className="size-5 justify-center">{divider === 'dot' ? '•' : undefined}</BreadcrumbSeparator>}
462
+ <BreadcrumbItem>
463
+ {index === count - 1
464
+ ? <BreadcrumbPage>{t('design_system.gallery.examples.navigation2.section', { number: index + 1 })}</BreadcrumbPage>
465
+ : <BreadcrumbLink href={\`#\${targetId}\`}><LayoutGrid className="size-5" aria-hidden="true" />{t('design_system.gallery.examples.navigation2.section', { number: index + 1 })}</BreadcrumbLink>}
466
+ </BreadcrumbItem>
467
+ </React.Fragment>)}
468
+ </BreadcrumbList>
469
+ </Breadcrumb>)}
470
+ </div>)}
471
+ <p id={targetId} tabIndex={-1} className="text-sm text-muted-foreground">{t('design_system.gallery.examples.navigation2.localDestination')}</p>
472
+ </div>
473
+ }
474
+
475
+ <BreadcrumbQuantityDemo />`,
476
+ },
340
477
  ],
341
478
  }
342
479
 
@@ -345,6 +482,7 @@ const paginationEntry: GalleryEntry = {
345
482
  title: 'Pagination',
346
483
  importPath: '@open-mercato/ui/primitives/pagination',
347
484
  docsAnchor: '#pagination',
485
+ figmaNodeId: '513:3892',
348
486
  variants: [
349
487
  {
350
488
  id: 'basic',
@@ -380,6 +518,83 @@ const [page, setPage] = React.useState(1)
380
518
  onPageChange={setPage}
381
519
  showFirstLast={false}
382
520
  showPageSize={false}
521
+ />`,
522
+ },
523
+ {
524
+ id: 'source-basic',
525
+ title: 'Basic cells',
526
+ render: () => <PaginationBasicDemo appearance="basic" />,
527
+ code: `import * as React from 'react'
528
+ import { Pagination } from '@open-mercato/ui/primitives/pagination'
529
+
530
+ const [page, setPage] = React.useState(2)
531
+ const [pageSize, setPageSize] = React.useState(25)
532
+
533
+ <Pagination
534
+ appearance="basic"
535
+ page={page}
536
+ pageSize={pageSize}
537
+ total={400}
538
+ onPageChange={setPage}
539
+ onPageSizeChange={setPageSize}
540
+ />`,
541
+ },
542
+ {
543
+ id: 'circle',
544
+ title: 'Full radius',
545
+ render: () => <PaginationBasicDemo appearance="circle" />,
546
+ code: `import * as React from 'react'
547
+ import { Pagination } from '@open-mercato/ui/primitives/pagination'
548
+
549
+ const [page, setPage] = React.useState(2)
550
+ const [pageSize, setPageSize] = React.useState(25)
551
+
552
+ <Pagination
553
+ appearance="circle"
554
+ page={page}
555
+ pageSize={pageSize}
556
+ total={400}
557
+ onPageChange={setPage}
558
+ onPageSizeChange={setPageSize}
559
+ />`,
560
+ },
561
+ {
562
+ id: 'group',
563
+ title: 'Connected group',
564
+ render: () => <PaginationBasicDemo appearance="group" />,
565
+ code: `import * as React from 'react'
566
+ import { Pagination } from '@open-mercato/ui/primitives/pagination'
567
+
568
+ const [page, setPage] = React.useState(2)
569
+ const [pageSize, setPageSize] = React.useState(25)
570
+
571
+ <Pagination
572
+ appearance="group"
573
+ page={page}
574
+ pageSize={pageSize}
575
+ total={400}
576
+ onPageChange={setPage}
577
+ onPageSizeChange={setPageSize}
578
+ />`,
579
+ },
580
+ {
581
+ id: 'disabled',
582
+ title: 'Disabled states',
583
+ render: () => <PaginationBasicDemo appearance="circle" disabled />,
584
+ code: `import * as React from 'react'
585
+ import { Pagination } from '@open-mercato/ui/primitives/pagination'
586
+
587
+ const [page, setPage] = React.useState(2)
588
+ const [pageSize, setPageSize] = React.useState(25)
589
+
590
+ <Pagination
591
+ appearance="circle"
592
+ page={page}
593
+ pageSize={pageSize}
594
+ total={400}
595
+ onPageChange={setPage}
596
+ onPageSizeChange={setPageSize}
597
+ disabled
383
598
  />`,
384
599
  },
385
600
  ],
@@ -387,6 +602,7 @@ const [page, setPage] = React.useState(1)
387
602
 
388
603
  const segmentedControlEntry: GalleryEntry = {
389
604
  id: 'segmented-control',
605
+ figmaNodeId: '2604:114',
390
606
  title: 'SegmentedControl',
391
607
  importPath: '@open-mercato/ui/primitives/segmented-control',
392
608
  docsAnchor: '#segmentedcontrol',
@@ -394,13 +610,7 @@ const segmentedControlEntry: GalleryEntry = {
394
610
  {
395
611
  id: 'default',
396
612
  title: 'default',
397
- render: () => (
398
- <SegmentedControl defaultValue="all" aria-label="View filter">
399
- <SegmentedControlItem value="all">All</SegmentedControlItem>
400
- <SegmentedControlItem value="active">Active</SegmentedControlItem>
401
- <SegmentedControlItem value="archived">Archived</SegmentedControlItem>
402
- </SegmentedControl>
403
- ),
613
+ render: () => <SegmentedControlNavigationDefaultSample />,
404
614
  code: `import { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'
405
615
 
406
616
  <SegmentedControl defaultValue="all" aria-label="View filter">
@@ -412,14 +622,7 @@ const segmentedControlEntry: GalleryEntry = {
412
622
  {
413
623
  id: 'small',
414
624
  title: 'Small',
415
- render: () => (
416
- <SegmentedControl size="sm" defaultValue="30d" aria-label="Chart period">
417
- <SegmentedControlItem value="7d">7d</SegmentedControlItem>
418
- <SegmentedControlItem value="30d">30d</SegmentedControlItem>
419
- <SegmentedControlItem value="90d">90d</SegmentedControlItem>
420
- <SegmentedControlItem value="1y">1y</SegmentedControlItem>
421
- </SegmentedControl>
422
- ),
625
+ render: () => <SegmentedControlNavigationSmallSample />,
423
626
  code: `import { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'
424
627
 
425
628
  <SegmentedControl size="sm" defaultValue="30d" aria-label="Chart period">
@@ -432,12 +635,7 @@ const segmentedControlEntry: GalleryEntry = {
432
635
  {
433
636
  id: 'disabled',
434
637
  title: 'Disabled',
435
- render: () => (
436
- <SegmentedControl defaultValue="list" disabled aria-label="Layout">
437
- <SegmentedControlItem value="list">List</SegmentedControlItem>
438
- <SegmentedControlItem value="grid">Grid</SegmentedControlItem>
439
- </SegmentedControl>
440
- ),
638
+ render: () => <SegmentedControlNavigationDisabledSample />,
441
639
  code: `import { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'
442
640
 
443
641
  <SegmentedControl defaultValue="list" disabled aria-label="Layout">
@@ -445,11 +643,114 @@ const segmentedControlEntry: GalleryEntry = {
445
643
  <SegmentedControlItem value="grid">Grid</SegmentedControlItem>
446
644
  </SegmentedControl>`,
447
645
  },
646
+ {
647
+ id: 'source-text',
648
+ title: 'Label shell · text',
649
+ render: () => <SegmentedSourceDemo content="text" />,
650
+ code: `import * as React from 'react'
651
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
652
+ import { LayoutGrid, Settings, ShoppingCart } from 'lucide-react'
653
+ import { Label } from '@open-mercato/ui/primitives/label'
654
+ import { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'
655
+
656
+ function SegmentedSourceDemo({ content }: { content: 'text' | 'leading' | 'icon' }) {
657
+ const t = useT()
658
+ const labelId = React.useId()
659
+ const [value, setValue] = React.useState('overview')
660
+ const options = [
661
+ { value: 'overview', label: t('design_system.gallery.examples.navigation2.overview'), icon: <LayoutGrid className="size-5" aria-hidden="true" /> },
662
+ { value: 'settings', label: t('design_system.gallery.examples.navigation2.settings'), icon: <Settings className="size-5" aria-hidden="true" /> },
663
+ { value: 'orders', label: t('design_system.gallery.examples.navigation2.orders'), icon: <ShoppingCart className="size-5" aria-hidden="true" /> },
664
+ ]
665
+ return <div className="flex w-full max-w-sm flex-col gap-6">
666
+ {[false, true].map(disabled => <div key={String(disabled)} className="flex flex-col gap-1.5">
667
+ <Label id={\`\${labelId}-\${disabled}\`} className="leading-5">{disabled ? t('design_system.gallery.examples.navigation2.locked') : t('design_system.gallery.examples.navigation2.selectMenu')}</Label>
668
+ <SegmentedControl value={value} onValueChange={setValue} disabled={disabled} aria-labelledby={\`\${labelId}-\${disabled}\`} className="h-9 w-full gap-1 rounded-lg border-0 p-1">
669
+ {options.map(option => <SegmentedControlItem key={option.value} value={option.value} aria-label={content === 'icon' ? option.label : undefined} className="h-7 min-w-0 flex-1 gap-1.5 rounded-md p-1">
670
+ {content !== 'text' && option.icon}
671
+ {content !== 'icon' && option.label}
672
+ </SegmentedControlItem>)}
673
+ </SegmentedControl>
674
+ </div>)}
675
+ </div>
676
+ }
677
+
678
+ <SegmentedSourceDemo content="text" />`,
679
+ },
680
+ {
681
+ id: 'source-leading',
682
+ title: 'Label shell · leading',
683
+ render: () => <SegmentedSourceDemo content="leading" />,
684
+ code: `import * as React from 'react'
685
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
686
+ import { LayoutGrid, Settings, ShoppingCart } from 'lucide-react'
687
+ import { Label } from '@open-mercato/ui/primitives/label'
688
+ import { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'
689
+
690
+ function SegmentedSourceDemo({ content }: { content: 'text' | 'leading' | 'icon' }) {
691
+ const t = useT()
692
+ const labelId = React.useId()
693
+ const [value, setValue] = React.useState('overview')
694
+ const options = [
695
+ { value: 'overview', label: t('design_system.gallery.examples.navigation2.overview'), icon: <LayoutGrid className="size-5" aria-hidden="true" /> },
696
+ { value: 'settings', label: t('design_system.gallery.examples.navigation2.settings'), icon: <Settings className="size-5" aria-hidden="true" /> },
697
+ { value: 'orders', label: t('design_system.gallery.examples.navigation2.orders'), icon: <ShoppingCart className="size-5" aria-hidden="true" /> },
698
+ ]
699
+ return <div className="flex w-full max-w-sm flex-col gap-6">
700
+ {[false, true].map(disabled => <div key={String(disabled)} className="flex flex-col gap-1.5">
701
+ <Label id={\`\${labelId}-\${disabled}\`} className="leading-5">{disabled ? t('design_system.gallery.examples.navigation2.locked') : t('design_system.gallery.examples.navigation2.selectMenu')}</Label>
702
+ <SegmentedControl value={value} onValueChange={setValue} disabled={disabled} aria-labelledby={\`\${labelId}-\${disabled}\`} className="h-9 w-full gap-1 rounded-lg border-0 p-1">
703
+ {options.map(option => <SegmentedControlItem key={option.value} value={option.value} aria-label={content === 'icon' ? option.label : undefined} className="h-7 min-w-0 flex-1 gap-1.5 rounded-md p-1">
704
+ {content !== 'text' && option.icon}
705
+ {content !== 'icon' && option.label}
706
+ </SegmentedControlItem>)}
707
+ </SegmentedControl>
708
+ </div>)}
709
+ </div>
710
+ }
711
+
712
+ <SegmentedSourceDemo content="leading" />`,
713
+ },
714
+ {
715
+ id: 'source-icon',
716
+ title: 'Label shell · icon',
717
+ render: () => <SegmentedSourceDemo content="icon" />,
718
+ code: `import * as React from 'react'
719
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
720
+ import { LayoutGrid, Settings, ShoppingCart } from 'lucide-react'
721
+ import { Label } from '@open-mercato/ui/primitives/label'
722
+ import { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'
723
+
724
+ function SegmentedSourceDemo({ content }: { content: 'text' | 'leading' | 'icon' }) {
725
+ const t = useT()
726
+ const labelId = React.useId()
727
+ const [value, setValue] = React.useState('overview')
728
+ const options = [
729
+ { value: 'overview', label: t('design_system.gallery.examples.navigation2.overview'), icon: <LayoutGrid className="size-5" aria-hidden="true" /> },
730
+ { value: 'settings', label: t('design_system.gallery.examples.navigation2.settings'), icon: <Settings className="size-5" aria-hidden="true" /> },
731
+ { value: 'orders', label: t('design_system.gallery.examples.navigation2.orders'), icon: <ShoppingCart className="size-5" aria-hidden="true" /> },
732
+ ]
733
+ return <div className="flex w-full max-w-sm flex-col gap-6">
734
+ {[false, true].map(disabled => <div key={String(disabled)} className="flex flex-col gap-1.5">
735
+ <Label id={\`\${labelId}-\${disabled}\`} className="leading-5">{disabled ? t('design_system.gallery.examples.navigation2.locked') : t('design_system.gallery.examples.navigation2.selectMenu')}</Label>
736
+ <SegmentedControl value={value} onValueChange={setValue} disabled={disabled} aria-labelledby={\`\${labelId}-\${disabled}\`} className="h-9 w-full gap-1 rounded-lg border-0 p-1">
737
+ {options.map(option => <SegmentedControlItem key={option.value} value={option.value} aria-label={content === 'icon' ? option.label : undefined} className="h-7 min-w-0 flex-1 gap-1.5 rounded-md p-1">
738
+ {content !== 'text' && option.icon}
739
+ {content !== 'icon' && option.label}
740
+ </SegmentedControlItem>)}
741
+ </SegmentedControl>
742
+ </div>)}
743
+ </div>
744
+ }
745
+
746
+ <SegmentedSourceDemo content="icon" />`,
747
+ },
448
748
  ],
449
749
  }
450
750
 
451
751
  const accordionEntry: GalleryEntry = {
452
752
  id: 'accordion',
753
+ figmaNodeId: '210:4022',
453
754
  title: 'Accordion',
454
755
  importPath: '@open-mercato/ui/primitives/accordion',
455
756
  docsAnchor: '#accordion',
@@ -457,28 +758,7 @@ const accordionEntry: GalleryEntry = {
457
758
  {
458
759
  id: 'card',
459
760
  title: 'card (default)',
460
- render: () => (
461
- <Accordion type="single" collapsible defaultValue="shipping" className="w-full space-y-2">
462
- <AccordionItem value="shipping">
463
- <AccordionTrigger>Shipping and delivery</AccordionTrigger>
464
- <AccordionContent>
465
- Orders placed before 2 PM ship the same business day from the nearest warehouse.
466
- </AccordionContent>
467
- </AccordionItem>
468
- <AccordionItem value="returns">
469
- <AccordionTrigger>Returns</AccordionTrigger>
470
- <AccordionContent>
471
- Items can be returned within 30 days of delivery in their original packaging.
472
- </AccordionContent>
473
- </AccordionItem>
474
- <AccordionItem value="payments">
475
- <AccordionTrigger>Payment methods</AccordionTrigger>
476
- <AccordionContent>
477
- We accept cards, bank transfer, and deferred payment for verified B2B accounts.
478
- </AccordionContent>
479
- </AccordionItem>
480
- </Accordion>
481
- ),
761
+ render: () => <AccordionNavigationCardSample />,
482
762
  code: `import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@open-mercato/ui/primitives/accordion'
483
763
 
484
764
  <Accordion type="single" collapsible defaultValue="shipping" className="w-full space-y-2">
@@ -499,22 +779,7 @@ const accordionEntry: GalleryEntry = {
499
779
  {
500
780
  id: 'left-icon',
501
781
  title: 'With leftIcon',
502
- render: () => (
503
- <Accordion type="single" collapsible className="w-full space-y-2">
504
- <AccordionItem value="shipping">
505
- <AccordionTrigger leftIcon={<Truck />}>How fast is shipping?</AccordionTrigger>
506
- <AccordionContent>
507
- Same-day dispatch on weekdays; delivery typically takes 1–3 business days.
508
- </AccordionContent>
509
- </AccordionItem>
510
- <AccordionItem value="billing">
511
- <AccordionTrigger leftIcon={<CreditCard />}>When am I charged?</AccordionTrigger>
512
- <AccordionContent>
513
- Your card is charged when the order ships, never at checkout.
514
- </AccordionContent>
515
- </AccordionItem>
516
- </Accordion>
517
- ),
782
+ render: () => <AccordionNavigationLeftIconSample />,
518
783
  code: `import { CreditCard, Truck } from 'lucide-react'
519
784
  import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@open-mercato/ui/primitives/accordion'
520
785
 
@@ -532,22 +797,7 @@ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@o
532
797
  {
533
798
  id: 'chevron',
534
799
  title: 'Chevron indicator',
535
- render: () => (
536
- <Accordion type="multiple" className="w-full space-y-2">
537
- <AccordionItem value="general">
538
- <AccordionTrigger triggerIcon="chevron">General</AccordionTrigger>
539
- <AccordionContent>
540
- Store name, contact details, and default locale for the storefront.
541
- </AccordionContent>
542
- </AccordionItem>
543
- <AccordionItem value="advanced">
544
- <AccordionTrigger triggerIcon="chevron">Advanced</AccordionTrigger>
545
- <AccordionContent>
546
- Webhooks, API keys, and other developer-facing configuration.
547
- </AccordionContent>
548
- </AccordionItem>
549
- </Accordion>
550
- ),
800
+ render: () => <AccordionNavigationChevronSample />,
551
801
  code: `import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@open-mercato/ui/primitives/accordion'
552
802
 
553
803
  <Accordion type="multiple" className="w-full space-y-2">
@@ -561,13 +811,353 @@ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@o
561
811
  </AccordionItem>
562
812
  </Accordion>`,
563
813
  },
814
+ {
815
+ id: 'indicator-start',
816
+ title: 'Indicator at start · closed/open/disabled',
817
+ render: () => <AccordionStartDemo />,
818
+ code: `import * as React from 'react'
819
+ import { useT } from '@open-mercato/shared/lib/i18n/context'
820
+ import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '@open-mercato/ui/primitives/accordion'
821
+
822
+ function AccordionStartDemo() {
823
+ const t = useT()
824
+ return <Accordion type="single" collapsible defaultValue="details" className="w-full max-w-md space-y-2">
825
+ <AccordionItem value="overview">
826
+ <AccordionTrigger iconPosition="start">{t('design_system.gallery.examples.navigation2.overview')}</AccordionTrigger>
827
+ <AccordionContent>{t('design_system.gallery.examples.navigation2.accordionBody')}</AccordionContent>
828
+ </AccordionItem>
829
+ <AccordionItem value="details">
830
+ <AccordionTrigger iconPosition="start">{t('design_system.gallery.examples.navigation2.settings')}</AccordionTrigger>
831
+ <AccordionContent>{t('design_system.gallery.examples.navigation2.accordionBody')}</AccordionContent>
832
+ </AccordionItem>
833
+ <AccordionItem value="locked" disabled>
834
+ <AccordionTrigger iconPosition="start">{t('design_system.gallery.examples.navigation2.locked')}</AccordionTrigger>
835
+ <AccordionContent>{t('design_system.gallery.examples.navigation2.accordionBody')}</AccordionContent>
836
+ </AccordionItem>
837
+ </Accordion>
838
+ }
839
+
840
+ <AccordionStartDemo />`,
841
+ },
842
+ ],
843
+ }
844
+
845
+ const sidebarEntry: GalleryEntry = {
846
+ id: 'sidebar',
847
+ title: 'Sidebar and Topbar',
848
+ figmaNodeId: '3802:11759',
849
+ importPath: '@open-mercato/ui/primitives/sidebar',
850
+ usage: { do: ['Presentational composition with local state; the application AppShell still owns tenant APIs and injection points.', 'Hover, current navigation, workspace switching, filtering and feature-card actions use real controls.', 'Feature-card primary and neutral surfaces use the existing accessible application palettes; they do not claim exact Figma color parity.'] },
851
+ variants: [
852
+ { id: 'items', title: 'Sidebar items / expanded and collapsed', render: () => <SidebarItemsExample />, code: shellExampleCode('<SidebarItemsExample />') },
853
+ { id: 'identity-cards', title: 'Header and profile cards / expanded and collapsed', render: () => <SidebarIdentityExample />, code: shellExampleCode('<SidebarIdentityExample />') },
854
+ { id: 'feature-meeting', title: 'Feature card / meeting / 4 styles', render: () => <SidebarFeatureExample type="meeting" />, code: shellExampleCode('<SidebarFeatureExample type="meeting" />') },
855
+ { id: 'feature-progress', title: 'Feature card / progress / 4 styles', render: () => <SidebarFeatureExample type="progress" />, code: shellExampleCode('<SidebarFeatureExample type="progress" />') },
856
+ { id: 'feature-link', title: 'Feature card / link / 4 styles', render: () => <SidebarFeatureExample type="link" />, code: shellExampleCode('<SidebarFeatureExample type="link" />') },
857
+ { id: 'feature-gift', title: 'Feature card / gift / 4 styles', render: () => <SidebarFeatureExample type="gift" />, code: shellExampleCode('<SidebarFeatureExample type="gift" />') },
858
+ { id: 'feature-storage', title: 'Feature card / storage / 4 styles', render: () => <SidebarFeatureExample type="storage" />, code: shellExampleCode('<SidebarFeatureExample type="storage" />') },
859
+ { id: 'feature-support', title: 'Feature card / support / 4 styles', render: () => <SidebarFeatureExample type="support" />, code: shellExampleCode('<SidebarFeatureExample type="support" />') },
860
+ { id: 'topbar-hr-default', title: 'HR topbar / default', render: () => <TopbarExample product="hr" />, code: shellExampleCode('<TopbarExample product="hr" />') },
861
+ { id: 'topbar-hr-icons', title: 'HR topbar / icons', render: () => <TopbarExample product="hr" icons />, code: shellExampleCode('<TopbarExample product="hr" icons />') },
862
+ { id: 'topbar-finance-default', title: 'FINANCE topbar / default', render: () => <TopbarExample product="finance" />, code: shellExampleCode('<TopbarExample product="finance" />') },
863
+ { id: 'topbar-finance-icons', title: 'FINANCE topbar / icons', render: () => <TopbarExample product="finance" icons />, code: shellExampleCode('<TopbarExample product="finance" icons />') },
864
+ { id: 'brand-artwork', title: 'Synergy and Apex / 6 original assets', render: () => <NavigationBrandsExample />, code: shellExampleCode('<NavigationBrandsExample />') },
865
+ ],
866
+ }
867
+
868
+ const promptAreaEntry: GalleryEntry = {
869
+ id: 'prompt-area',
870
+ title: 'PromptArea',
871
+ figmaNodeId: '191226:4236',
872
+ importPath: '@open-mercato/ui/primitives/prompt-area',
873
+ usage: { do: ['Desktop and mobile compositions expose all 18 source variants through real hover and focus states.', 'Enter saves a local draft; Shift+Enter inserts a line break. Attachments stay in this browser and can be removed.', 'Model names reproduce source labels. These examples do not call a model or represent a subscription.'] },
874
+ variants: [
875
+ { id: 'desktop', title: 'Desktop / empty / Default, Hover, Active', render: () => <AiPromptExample />, code: aiProductExampleCode('<AiPromptExample />') },
876
+ { id: 'desktop-file', title: 'Desktop / file', render: () => <AiPromptExample attachment="file" />, code: aiProductExampleCode('<AiPromptExample attachment="file" />') },
877
+ { id: 'desktop-image', title: 'Desktop / original image', render: () => <AiPromptExample attachment="image" />, code: aiProductExampleCode('<AiPromptExample attachment="image" />') },
878
+ { id: 'mobile', title: 'Mobile / empty / Default, Hover, Active', render: () => <AiPromptExample compact />, code: aiProductExampleCode('<AiPromptExample compact />') },
879
+ { id: 'mobile-file', title: 'Mobile / file', render: () => <AiPromptExample compact attachment="file" />, code: aiProductExampleCode('<AiPromptExample compact attachment="file" />') },
880
+ { id: 'mobile-image', title: 'Mobile / original image', render: () => <AiPromptExample compact attachment="image" />, code: aiProductExampleCode('<AiPromptExample compact attachment="image" />') },
881
+ ],
882
+ }
883
+
884
+ // Composed AI-product patterns: point at the demo module rather than claiming a primitive's import path.
885
+ const aiProductPatternCode = (expression: string) => `import { ${expression.match(/<(\w+)/)?.[1] ?? 'AiPromptExample'} } from '@open-mercato/core/modules/design_system/gallery/demos/ai-product'
886
+
887
+ ${expression}
888
+ `
889
+
890
+ const aiControlsEntry: GalleryEntry = {
891
+ id: 'ai-controls',
892
+ title: 'AI Product / Controls',
893
+ figmaNodeId: '191042:2378',
894
+ importPath: '@open-mercato/core/modules/design_system/gallery/demos/ai-product',
895
+ usage: { do: ['Source-specific compositions reuse existing primitives with additive semantic radius and typography tokens.', 'Hover, keyboard focus and selected states are real interactions. Authentication buttons only display local explanatory feedback.', 'Original authentication glyphs are preserved as source assets. Application fonts, focus and semantic colors remain explicit adaptations.'] },
896
+ variants: [
897
+ { id: 'chat-buttons', title: 'Chat custom buttons / 2 styles × 3 states', render: () => <AiIconButtonExamples chat />, code: aiProductPatternCode('<AiIconButtonExamples chat />') },
898
+ { id: 'icon-buttons', title: 'Custom icon buttons / 4 sizes × 2 tones × 3 states', render: () => <AiIconButtonExamples />, code: aiProductPatternCode('<AiIconButtonExamples />') },
899
+ { id: 'search', title: 'Search / 2 sizes × 3 states', render: () => <AiSearchExamples />, code: aiProductPatternCode('<AiSearchExamples />') },
900
+ { id: 'new-chat', title: 'New chat / Default, Hover', render: () => <AiNewChatExample />, code: aiProductPatternCode('<AiNewChatExample />') },
901
+ { id: 'navigation-items', title: 'Navigation items / 12 variants', render: () => <AiNavigationExamples />, code: aiProductPatternCode('<AiNavigationExamples />') },
902
+ { id: 'auth-icons', title: 'Authentication / 8 original icons', render: () => <AiAuthExamples />, code: aiProductPatternCode('<AiAuthExamples />') },
903
+ { id: 'social-google', title: 'Google button / local feedback', render: () => <AiAuthExamples kind="social" />, code: aiProductPatternCode('<AiAuthExamples kind="social" />') },
904
+ { id: 'text-input', title: 'Text input / 5 source states', render: () => <AiAuthExamples kind="text" />, code: aiProductPatternCode('<AiAuthExamples kind="text" />') },
905
+ { id: 'digit-input', title: 'Digit input / 5 source states', render: () => <AiAuthExamples kind="digits" />, code: aiProductPatternCode('<AiAuthExamples kind="digits" />') },
906
+ { id: 'settings', title: 'Settings navigation, select, counter and model / 15 variants', render: () => <AiSettingsExamples />, code: aiProductPatternCode('<AiSettingsExamples />') },
907
+ ],
908
+ }
909
+
910
+ const aiSidebarEntry: GalleryEntry = {
911
+ id: 'ai-sidebar',
912
+ title: 'AI Product / Sidebar',
913
+ figmaNodeId: '191050:3105',
914
+ importPath: '@open-mercato/ui/primitives/sidebar',
915
+ usage: { do: ['All four source sidebar variants render using the presentational Sidebar without application API calls.', 'Search filters the local history, navigation updates the selected item, and new chat creates a local draft counter.', 'The collapsed logo expands the sidebar; this adds a keyboard-accessible restoration control to the source composition.'] },
916
+ variants: [
917
+ { id: 'search-01', title: 'Search 01 / expanded / 272 × 900', render: () => <AiSidebarExample />, code: aiProductExampleCode('<AiSidebarExample />') },
918
+ { id: 'search-02', title: 'Search 02 / expanded', render: () => <AiSidebarExample search="02" />, code: aiProductExampleCode('<AiSidebarExample search="02" />') },
919
+ { id: 'search-03', title: 'Search 03 / expanded', render: () => <AiSidebarExample search="03" />, code: aiProductExampleCode('<AiSidebarExample search="03" />') },
920
+ { id: 'collapsed', title: 'Search 01 / collapsed / 72 × 900', render: () => <AiSidebarExample initialCollapsed />, code: aiProductExampleCode('<AiSidebarExample initialCollapsed />') },
921
+ ],
922
+ }
923
+
924
+ const aiMobileNavigationEntry: GalleryEntry = {
925
+ id: 'ai-mobile-navigation',
926
+ title: 'AI Product / Mobile Navigation',
927
+ figmaNodeId: '192681:59134',
928
+ importPath: '@open-mercato/core/modules/design_system/gallery/demos/ai-product',
929
+ usage: { do: ['All four 390 × 64 source compositions have working local controls and keyboard-accessible popovers.', 'Add project stores the entered name only in component state. Escape closes the popover, Enter or Ctrl/Cmd+Enter confirms.'] },
930
+ variants: [
931
+ { id: 'default', title: 'Default', render: () => <AiMobileNavigationExample />, code: aiProductPatternCode('<AiMobileNavigationExample />') },
932
+ { id: 'in-projects', title: 'In Projects', render: () => <AiMobileNavigationExample kind="in-projects" />, code: aiProductPatternCode('<AiMobileNavigationExample kind="in-projects" />') },
933
+ { id: 'projects', title: 'Projects', render: () => <AiMobileNavigationExample kind="projects" />, code: aiProductPatternCode('<AiMobileNavigationExample kind="projects" />') },
934
+ { id: 'project-details', title: 'Project Details', render: () => <AiMobileNavigationExample kind="project-details" />, code: aiProductPatternCode('<AiMobileNavigationExample kind="project-details" />') },
564
935
  ],
565
936
  }
566
937
 
567
938
  export const entries: GalleryEntry[] = [
939
+ promptAreaEntry,
940
+ aiControlsEntry,
941
+ aiSidebarEntry,
942
+ aiMobileNavigationEntry,
943
+ sidebarEntry,
568
944
  tabsEntry,
569
945
  breadcrumbEntry,
570
946
  paginationEntry,
571
947
  segmentedControlEntry,
572
948
  accordionEntry,
573
949
  ]
950
+
951
+ function TabsNavigationUnderlineSample() {
952
+ const t = useT()
953
+ return (<Tabs defaultValue="orders" variant="underline" className="w-full">
954
+ <TabsList aria-label={t('design_system.gallery.sampleCopy.customerSections')}>
955
+ <TabsTrigger value="overview" leading={<LayoutGrid className="size-4" />}>
956
+ {t('design_system.gallery.examples.navigation2.overview')}
957
+ </TabsTrigger>
958
+ <TabsTrigger value="orders" leading={<ShoppingCart className="size-4" />} count={12}>
959
+ {t('design_system.gallery.examples.navigation2.orders')}
960
+ </TabsTrigger>
961
+ <TabsTrigger value="settings" leading={<Settings className="size-4" />}>
962
+ {t('design_system.gallery.examples.navigation2.settings')}
963
+ </TabsTrigger>
964
+ </TabsList>
965
+ <TabsContent value="overview">
966
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.customerOverviewPanel')}</p>
967
+ </TabsContent>
968
+ <TabsContent value="orders">
969
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.12OrdersInTheLast30Days')}</p>
970
+ </TabsContent>
971
+ <TabsContent value="settings">
972
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.notificationAndAccessSettings')}</p>
973
+ </TabsContent>
974
+ </Tabs>)
975
+ }
976
+
977
+ function TabsNavigationPillSample() {
978
+ const t = useT()
979
+ return (<Tabs defaultValue="preview">
980
+ <TabsList aria-label={t('design_system.gallery.sampleCopy.editorView')}>
981
+ <TabsTrigger value="preview">{t('design_system.gallery.samples.table.preview')}</TabsTrigger>
982
+ <TabsTrigger value="code">{t('design_system.gallery.samples.richEditor.labels.code')}</TabsTrigger>
983
+ <TabsTrigger value="logs">{t('design_system.gallery.sampleCopy.logs')}</TabsTrigger>
984
+ </TabsList>
985
+ <TabsContent value="preview">
986
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.renderedPreview')}</p>
987
+ </TabsContent>
988
+ <TabsContent value="code">
989
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.sourceCodePanel')}</p>
990
+ </TabsContent>
991
+ <TabsContent value="logs">
992
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.runtimeLogsPanel')}</p>
993
+ </TabsContent>
994
+ </Tabs>)
995
+ }
996
+
997
+ function TabsNavigationPillVerticalSample() {
998
+ const t = useT()
999
+ return (<Tabs defaultValue="profile" orientation="vertical" className="w-full">
1000
+ <TabsList aria-label={t('design_system.gallery.samples.crypto.accountSettings')}>
1001
+ <TabsTrigger value="profile">{t('design_system.gallery.samples.crypto.profile')}</TabsTrigger>
1002
+ <TabsTrigger value="billing">{t('design_system.gallery.samples.marketing.billing')}</TabsTrigger>
1003
+ <TabsTrigger value="security">{t('design_system.gallery.sampleCopy.security')}</TabsTrigger>
1004
+ </TabsList>
1005
+ <TabsContent value="profile">
1006
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.profileSettingsPanel')}</p>
1007
+ </TabsContent>
1008
+ <TabsContent value="billing">
1009
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.billingSettingsPanel')}</p>
1010
+ </TabsContent>
1011
+ <TabsContent value="security">
1012
+ <p className="text-sm text-muted-foreground">{t('design_system.gallery.sampleCopy.securitySettingsPanel')}</p>
1013
+ </TabsContent>
1014
+ </Tabs>)
1015
+ }
1016
+
1017
+ function BreadcrumbNavigationSlashSample() {
1018
+ const t = useT()
1019
+ return (<Breadcrumb>
1020
+ <BreadcrumbList>
1021
+ <BreadcrumbItem>
1022
+ <BreadcrumbLink href="#gallery-entry-breadcrumb">{t('design_system.gallery.examples.shell.dashboard')}</BreadcrumbLink>
1023
+ </BreadcrumbItem>
1024
+ <BreadcrumbSeparator />
1025
+ <BreadcrumbItem>
1026
+ <BreadcrumbLink href="#gallery-entry-breadcrumb">{t('design_system.gallery.sampleCopy.products')}</BreadcrumbLink>
1027
+ </BreadcrumbItem>
1028
+ <BreadcrumbSeparator />
1029
+ <BreadcrumbItem>
1030
+ <BreadcrumbPage>{t('design_system.gallery.sampleCopy.winterCatalog')}</BreadcrumbPage>
1031
+ </BreadcrumbItem>
1032
+ </BreadcrumbList>
1033
+ </Breadcrumb>)
1034
+ }
1035
+
1036
+ function BreadcrumbNavigationArrowSample() {
1037
+ const t = useT()
1038
+ return (<Breadcrumb divider="arrow">
1039
+ <BreadcrumbList>
1040
+ <BreadcrumbItem>
1041
+ <BreadcrumbLink href="#gallery-entry-breadcrumb">{t('design_system.gallery.examples.navigation2.orders')}</BreadcrumbLink>
1042
+ </BreadcrumbItem>
1043
+ <BreadcrumbSeparator />
1044
+ <BreadcrumbItem>
1045
+ <BreadcrumbLink href="#gallery-entry-breadcrumb">#20418</BreadcrumbLink>
1046
+ </BreadcrumbItem>
1047
+ <BreadcrumbSeparator />
1048
+ <BreadcrumbItem>
1049
+ <BreadcrumbPage>{t('design_system.gallery.sampleCopy.shipment')}</BreadcrumbPage>
1050
+ </BreadcrumbItem>
1051
+ </BreadcrumbList>
1052
+ </Breadcrumb>)
1053
+ }
1054
+
1055
+ function BreadcrumbNavigationEllipsisSample() {
1056
+ const t = useT()
1057
+ return (<Breadcrumb>
1058
+ <BreadcrumbList>
1059
+ <BreadcrumbItem>
1060
+ <BreadcrumbLink href="#gallery-entry-breadcrumb">{t('design_system.gallery.examples.shell.dashboard')}</BreadcrumbLink>
1061
+ </BreadcrumbItem>
1062
+ <BreadcrumbSeparator />
1063
+ <BreadcrumbItem>
1064
+ <BreadcrumbEllipsis />
1065
+ </BreadcrumbItem>
1066
+ <BreadcrumbSeparator />
1067
+ <BreadcrumbItem>
1068
+ <BreadcrumbLink href="#gallery-entry-breadcrumb">{t('design_system.gallery.sampleCopy.attributes')}</BreadcrumbLink>
1069
+ </BreadcrumbItem>
1070
+ <BreadcrumbSeparator />
1071
+ <BreadcrumbItem>
1072
+ <BreadcrumbPage>{t('design_system.gallery.samples.richEditor.labels.textColor')}</BreadcrumbPage>
1073
+ </BreadcrumbItem>
1074
+ </BreadcrumbList>
1075
+ </Breadcrumb>)
1076
+ }
1077
+
1078
+ function SegmentedControlNavigationDefaultSample() {
1079
+ const t = useT()
1080
+ return (<SegmentedControl defaultValue="all" aria-label={t('design_system.gallery.sampleCopy.viewFilter')}>
1081
+ <SegmentedControlItem value="all">{t('design_system.gallery.samples.feeds.all')}</SegmentedControlItem>
1082
+ <SegmentedControlItem value="active">{t('design_system.gallery.samples.finance.active')}</SegmentedControlItem>
1083
+ <SegmentedControlItem value="archived">{t('design_system.gallery.sampleCopy.archived')}</SegmentedControlItem>
1084
+ </SegmentedControl>)
1085
+ }
1086
+
1087
+ function SegmentedControlNavigationSmallSample() {
1088
+ const t = useT()
1089
+ return (<SegmentedControl size="sm" defaultValue={t('design_system.gallery.sampleCopy.30d')} aria-label={t('design_system.gallery.samples.crypto.chartRange')}>
1090
+ <SegmentedControlItem value="7d">{t('design_system.gallery.sampleCopy.7d')}</SegmentedControlItem>
1091
+ <SegmentedControlItem value="30d">{t('design_system.gallery.sampleCopy.30d')}</SegmentedControlItem>
1092
+ <SegmentedControlItem value="90d">{t('design_system.gallery.sampleCopy.90d')}</SegmentedControlItem>
1093
+ <SegmentedControlItem value="1y">{t('design_system.gallery.sampleCopy.1y')}</SegmentedControlItem>
1094
+ </SegmentedControl>)
1095
+ }
1096
+
1097
+ function SegmentedControlNavigationDisabledSample() {
1098
+ const t = useT()
1099
+ return (<SegmentedControl defaultValue="list" disabled aria-label={t('design_system.gallery.sampleCopy.layout')}>
1100
+ <SegmentedControlItem value="list">{t('design_system.gallery.sampleCopy.list')}</SegmentedControlItem>
1101
+ <SegmentedControlItem value="grid">{t('design_system.gallery.sampleCopy.grid')}</SegmentedControlItem>
1102
+ </SegmentedControl>)
1103
+ }
1104
+
1105
+ function AccordionNavigationCardSample() {
1106
+ const t = useT()
1107
+ return (<Accordion type="single" collapsible defaultValue="shipping" className="w-full space-y-2">
1108
+ <AccordionItem value="shipping">
1109
+ <AccordionTrigger>{t('design_system.gallery.sampleCopy.shippingAndDelivery')}</AccordionTrigger>
1110
+ <AccordionContent>
1111
+ {t('design_system.gallery.sampleCopy.ordersPlacedBefore2PMShipTheSameBusinessDay')}
1112
+ </AccordionContent>
1113
+ </AccordionItem>
1114
+ <AccordionItem value="returns">
1115
+ <AccordionTrigger>{t('design_system.gallery.sampleCopy.returns')}</AccordionTrigger>
1116
+ <AccordionContent>
1117
+ {t('design_system.gallery.sampleCopy.itemsCanBeReturnedWithin30DaysOfDeliveryIn')}
1118
+ </AccordionContent>
1119
+ </AccordionItem>
1120
+ <AccordionItem value="payments">
1121
+ <AccordionTrigger>{t('design_system.gallery.sampleCopy.paymentMethods')}</AccordionTrigger>
1122
+ <AccordionContent>
1123
+ {t('design_system.gallery.sampleCopy.weAcceptCardsBankTransferAndDeferredPaymentForVerified')}
1124
+ </AccordionContent>
1125
+ </AccordionItem>
1126
+ </Accordion>)
1127
+ }
1128
+
1129
+ function AccordionNavigationLeftIconSample() {
1130
+ const t = useT()
1131
+ return (<Accordion type="single" collapsible className="w-full space-y-2">
1132
+ <AccordionItem value="shipping">
1133
+ <AccordionTrigger leftIcon={<Truck />}>{t('design_system.gallery.sampleCopy.howFastIsShipping')}</AccordionTrigger>
1134
+ <AccordionContent>
1135
+ {t('design_system.gallery.sampleCopy.samedayDispatchOnWeekdaysDeliveryTypicallyTakes13BusinessDays')}
1136
+ </AccordionContent>
1137
+ </AccordionItem>
1138
+ <AccordionItem value="billing">
1139
+ <AccordionTrigger leftIcon={<CreditCard />}>{t('design_system.gallery.sampleCopy.whenAmICharged')}</AccordionTrigger>
1140
+ <AccordionContent>
1141
+ {t('design_system.gallery.sampleCopy.yourCardIsChargedWhenTheOrderShipsNeverAt')}
1142
+ </AccordionContent>
1143
+ </AccordionItem>
1144
+ </Accordion>)
1145
+ }
1146
+
1147
+ function AccordionNavigationChevronSample() {
1148
+ const t = useT()
1149
+ return (<Accordion type="multiple" className="w-full space-y-2">
1150
+ <AccordionItem value="general">
1151
+ <AccordionTrigger triggerIcon="chevron">{t('design_system.gallery.sampleCopy.general')}</AccordionTrigger>
1152
+ <AccordionContent>
1153
+ {t('design_system.gallery.sampleCopy.storeNameContactDetailsAndDefaultLocaleForTheStorefront')}
1154
+ </AccordionContent>
1155
+ </AccordionItem>
1156
+ <AccordionItem value="advanced">
1157
+ <AccordionTrigger triggerIcon="chevron">{t('design_system.gallery.samples.finance.advanced')}</AccordionTrigger>
1158
+ <AccordionContent>
1159
+ {t('design_system.gallery.sampleCopy.webhooksAPIKeysAndOtherDeveloperfacingConfiguration')}
1160
+ </AccordionContent>
1161
+ </AccordionItem>
1162
+ </Accordion>)
1163
+ }