@open-mercato/core 0.6.7-develop.6785.1.1dd7cfac55 → 0.6.7-develop.6795.1.8a3f27921c

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 (196) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/generated/entities.ids.generated.js +1 -0
  3. package/dist/generated/entities.ids.generated.js.map +2 -2
  4. package/dist/modules/auth/backend/settings/page.js +14 -9
  5. package/dist/modules/auth/backend/settings/page.js.map +2 -2
  6. package/dist/modules/customers/cli.js +17 -7
  7. package/dist/modules/customers/cli.js.map +2 -2
  8. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +229 -216
  9. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
  10. package/dist/modules/customers/search.js +50 -29
  11. package/dist/modules/customers/search.js.map +2 -2
  12. package/dist/modules/data_sync/api/mappings/[id]/route.js +22 -9
  13. package/dist/modules/data_sync/api/mappings/[id]/route.js.map +2 -2
  14. package/dist/modules/data_sync/api/mappings/route.js +13 -4
  15. package/dist/modules/data_sync/api/mappings/route.js.map +2 -2
  16. package/dist/modules/data_sync/api/options.js +7 -2
  17. package/dist/modules/data_sync/api/options.js.map +2 -2
  18. package/dist/modules/data_sync/api/run.js +7 -2
  19. package/dist/modules/data_sync/api/run.js.map +2 -2
  20. package/dist/modules/data_sync/api/runs/[id]/cancel.js +8 -3
  21. package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
  22. package/dist/modules/data_sync/api/runs/[id]/retry.js +7 -2
  23. package/dist/modules/data_sync/api/runs/[id]/retry.js.map +2 -2
  24. package/dist/modules/data_sync/api/runs/[id]/route.js +8 -3
  25. package/dist/modules/data_sync/api/runs/[id]/route.js.map +2 -2
  26. package/dist/modules/data_sync/api/runs.js +7 -2
  27. package/dist/modules/data_sync/api/runs.js.map +2 -2
  28. package/dist/modules/data_sync/api/schedules/[id]/route.js +19 -6
  29. package/dist/modules/data_sync/api/schedules/[id]/route.js.map +2 -2
  30. package/dist/modules/data_sync/api/schedules/route.js +13 -4
  31. package/dist/modules/data_sync/api/schedules/route.js.map +2 -2
  32. package/dist/modules/data_sync/api/validate.js +9 -4
  33. package/dist/modules/data_sync/api/validate.js.map +2 -2
  34. package/dist/modules/design_system/acl.js +9 -0
  35. package/dist/modules/design_system/acl.js.map +7 -0
  36. package/dist/modules/design_system/backend/design-system/page.js +11 -0
  37. package/dist/modules/design_system/backend/design-system/page.js.map +7 -0
  38. package/dist/modules/design_system/backend/design-system/page.meta.js +15 -0
  39. package/dist/modules/design_system/backend/design-system/page.meta.js.map +7 -0
  40. package/dist/modules/design_system/gallery/components/CodeSnippet.js +52 -0
  41. package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +7 -0
  42. package/dist/modules/design_system/gallery/components/EntryCard.js +63 -0
  43. package/dist/modules/design_system/gallery/components/EntryCard.js.map +7 -0
  44. package/dist/modules/design_system/gallery/components/GalleryShell.js +163 -0
  45. package/dist/modules/design_system/gallery/components/GalleryShell.js.map +7 -0
  46. package/dist/modules/design_system/gallery/components/VariantPreview.js +9 -0
  47. package/dist/modules/design_system/gallery/components/VariantPreview.js.map +7 -0
  48. package/dist/modules/design_system/gallery/entries/banners.js +186 -0
  49. package/dist/modules/design_system/gallery/entries/banners.js.map +7 -0
  50. package/dist/modules/design_system/gallery/entries/buttons.js +361 -0
  51. package/dist/modules/design_system/gallery/entries/buttons.js.map +7 -0
  52. package/dist/modules/design_system/gallery/entries/charts.js +457 -0
  53. package/dist/modules/design_system/gallery/entries/charts.js.map +7 -0
  54. package/dist/modules/design_system/gallery/entries/dates.js +306 -0
  55. package/dist/modules/design_system/gallery/entries/dates.js.map +7 -0
  56. package/dist/modules/design_system/gallery/entries/detail.js +358 -0
  57. package/dist/modules/design_system/gallery/entries/detail.js.map +7 -0
  58. package/dist/modules/design_system/gallery/entries/display.js +785 -0
  59. package/dist/modules/design_system/gallery/entries/display.js.map +7 -0
  60. package/dist/modules/design_system/gallery/entries/feedback.js +658 -0
  61. package/dist/modules/design_system/gallery/entries/feedback.js.map +7 -0
  62. package/dist/modules/design_system/gallery/entries/filters.js +505 -0
  63. package/dist/modules/design_system/gallery/entries/filters.js.map +7 -0
  64. package/dist/modules/design_system/gallery/entries/foundations.js +453 -0
  65. package/dist/modules/design_system/gallery/entries/foundations.js.map +7 -0
  66. package/dist/modules/design_system/gallery/entries/icons.js +140 -0
  67. package/dist/modules/design_system/gallery/entries/icons.js.map +7 -0
  68. package/dist/modules/design_system/gallery/entries/inputs.js +1217 -0
  69. package/dist/modules/design_system/gallery/entries/inputs.js.map +7 -0
  70. package/dist/modules/design_system/gallery/entries/messages.js +334 -0
  71. package/dist/modules/design_system/gallery/entries/messages.js.map +7 -0
  72. package/dist/modules/design_system/gallery/entries/navigation.js +475 -0
  73. package/dist/modules/design_system/gallery/entries/navigation.js.map +7 -0
  74. package/dist/modules/design_system/gallery/entries/notifications.js +257 -0
  75. package/dist/modules/design_system/gallery/entries/notifications.js.map +7 -0
  76. package/dist/modules/design_system/gallery/entries/overlays.js +576 -0
  77. package/dist/modules/design_system/gallery/entries/overlays.js.map +7 -0
  78. package/dist/modules/design_system/gallery/entries/scaffolding.js +378 -0
  79. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +7 -0
  80. package/dist/modules/design_system/gallery/entries/schedule.js +297 -0
  81. package/dist/modules/design_system/gallery/entries/schedule.js.map +7 -0
  82. package/dist/modules/design_system/gallery/registry.js +139 -0
  83. package/dist/modules/design_system/gallery/registry.js.map +7 -0
  84. package/dist/modules/design_system/gallery/types.js +1 -0
  85. package/dist/modules/design_system/gallery/types.js.map +7 -0
  86. package/dist/modules/design_system/index.js +9 -0
  87. package/dist/modules/design_system/index.js.map +7 -0
  88. package/dist/modules/design_system/setup.js +14 -0
  89. package/dist/modules/design_system/setup.js.map +7 -0
  90. package/dist/modules/inbox_ops/search.js +15 -4
  91. package/dist/modules/inbox_ops/search.js.map +2 -2
  92. package/dist/modules/integrations/api/[id]/credentials/route.js +11 -5
  93. package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
  94. package/dist/modules/integrations/api/[id]/health/route.js +6 -3
  95. package/dist/modules/integrations/api/[id]/health/route.js.map +2 -2
  96. package/dist/modules/integrations/api/[id]/route.js +6 -3
  97. package/dist/modules/integrations/api/[id]/route.js.map +2 -2
  98. package/dist/modules/integrations/api/[id]/state/route.js +6 -3
  99. package/dist/modules/integrations/api/[id]/state/route.js.map +2 -2
  100. package/dist/modules/integrations/api/[id]/version/route.js +6 -3
  101. package/dist/modules/integrations/api/[id]/version/route.js.map +2 -2
  102. package/dist/modules/integrations/api/logs/route.js +6 -3
  103. package/dist/modules/integrations/api/logs/route.js.map +2 -2
  104. package/dist/modules/integrations/api/route.js +6 -3
  105. package/dist/modules/integrations/api/route.js.map +2 -2
  106. package/dist/modules/integrations/api/umes-read.js +2 -2
  107. package/dist/modules/integrations/api/umes-read.js.map +2 -2
  108. package/dist/modules/integrations/lib/organization-scope.js +2 -9
  109. package/dist/modules/integrations/lib/organization-scope.js.map +2 -2
  110. package/dist/modules/messages/search.js +10 -5
  111. package/dist/modules/messages/search.js.map +2 -2
  112. package/dist/modules/query_index/data/entities.js +2 -1
  113. package/dist/modules/query_index/data/entities.js.map +2 -2
  114. package/dist/modules/query_index/lib/engine.js +32 -50
  115. package/dist/modules/query_index/lib/engine.js.map +2 -2
  116. package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js +17 -0
  117. package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js.map +7 -0
  118. package/generated/entities.ids.generated.ts +1 -0
  119. package/package.json +16 -16
  120. package/src/modules/auth/backend/settings/page.tsx +17 -8
  121. package/src/modules/customers/cli.ts +17 -7
  122. package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +24 -13
  123. package/src/modules/customers/i18n/de.json +17 -0
  124. package/src/modules/customers/i18n/en.json +17 -0
  125. package/src/modules/customers/i18n/es.json +17 -0
  126. package/src/modules/customers/i18n/pl.json +17 -0
  127. package/src/modules/customers/search.ts +59 -27
  128. package/src/modules/data_sync/AGENTS.md +1 -0
  129. package/src/modules/data_sync/api/mappings/[id]/route.ts +22 -9
  130. package/src/modules/data_sync/api/mappings/route.ts +13 -4
  131. package/src/modules/data_sync/api/options.ts +7 -2
  132. package/src/modules/data_sync/api/run.ts +7 -2
  133. package/src/modules/data_sync/api/runs/[id]/cancel.ts +8 -3
  134. package/src/modules/data_sync/api/runs/[id]/retry.ts +7 -2
  135. package/src/modules/data_sync/api/runs/[id]/route.ts +8 -3
  136. package/src/modules/data_sync/api/runs.ts +7 -2
  137. package/src/modules/data_sync/api/schedules/[id]/route.ts +19 -6
  138. package/src/modules/data_sync/api/schedules/route.ts +13 -4
  139. package/src/modules/data_sync/api/validate.ts +9 -4
  140. package/src/modules/design_system/AGENTS.md +34 -0
  141. package/src/modules/design_system/acl.ts +5 -0
  142. package/src/modules/design_system/backend/design-system/page.meta.ts +11 -0
  143. package/src/modules/design_system/backend/design-system/page.tsx +14 -0
  144. package/src/modules/design_system/gallery/components/CodeSnippet.tsx +55 -0
  145. package/src/modules/design_system/gallery/components/EntryCard.tsx +95 -0
  146. package/src/modules/design_system/gallery/components/GalleryShell.tsx +206 -0
  147. package/src/modules/design_system/gallery/components/VariantPreview.tsx +15 -0
  148. package/src/modules/design_system/gallery/entries/banners.tsx +226 -0
  149. package/src/modules/design_system/gallery/entries/buttons.tsx +422 -0
  150. package/src/modules/design_system/gallery/entries/charts.tsx +518 -0
  151. package/src/modules/design_system/gallery/entries/dates.tsx +325 -0
  152. package/src/modules/design_system/gallery/entries/detail.tsx +403 -0
  153. package/src/modules/design_system/gallery/entries/display.tsx +893 -0
  154. package/src/modules/design_system/gallery/entries/feedback.tsx +746 -0
  155. package/src/modules/design_system/gallery/entries/filters.tsx +570 -0
  156. package/src/modules/design_system/gallery/entries/foundations.tsx +529 -0
  157. package/src/modules/design_system/gallery/entries/icons.tsx +168 -0
  158. package/src/modules/design_system/gallery/entries/inputs.tsx +1516 -0
  159. package/src/modules/design_system/gallery/entries/messages.tsx +339 -0
  160. package/src/modules/design_system/gallery/entries/navigation.tsx +573 -0
  161. package/src/modules/design_system/gallery/entries/notifications.tsx +285 -0
  162. package/src/modules/design_system/gallery/entries/overlays.tsx +677 -0
  163. package/src/modules/design_system/gallery/entries/scaffolding.tsx +430 -0
  164. package/src/modules/design_system/gallery/entries/schedule.tsx +307 -0
  165. package/src/modules/design_system/gallery/registry.ts +152 -0
  166. package/src/modules/design_system/gallery/types.ts +32 -0
  167. package/src/modules/design_system/i18n/.hardcoded-allowlist.json +71 -0
  168. package/src/modules/design_system/i18n/de.json +46 -0
  169. package/src/modules/design_system/i18n/en.json +46 -0
  170. package/src/modules/design_system/i18n/es.json +46 -0
  171. package/src/modules/design_system/i18n/pl.json +46 -0
  172. package/src/modules/design_system/index.ts +7 -0
  173. package/src/modules/design_system/setup.ts +12 -0
  174. package/src/modules/inbox_ops/i18n/de.json +3 -0
  175. package/src/modules/inbox_ops/i18n/en.json +3 -0
  176. package/src/modules/inbox_ops/i18n/es.json +3 -0
  177. package/src/modules/inbox_ops/i18n/pl.json +3 -0
  178. package/src/modules/inbox_ops/search.ts +20 -4
  179. package/src/modules/integrations/api/[id]/credentials/route.ts +11 -5
  180. package/src/modules/integrations/api/[id]/health/route.ts +6 -3
  181. package/src/modules/integrations/api/[id]/route.ts +6 -3
  182. package/src/modules/integrations/api/[id]/state/route.ts +6 -3
  183. package/src/modules/integrations/api/[id]/version/route.ts +6 -3
  184. package/src/modules/integrations/api/logs/route.ts +6 -3
  185. package/src/modules/integrations/api/route.ts +6 -3
  186. package/src/modules/integrations/api/umes-read.ts +2 -2
  187. package/src/modules/integrations/lib/organization-scope.ts +5 -25
  188. package/src/modules/messages/i18n/de.json +2 -0
  189. package/src/modules/messages/i18n/en.json +2 -0
  190. package/src/modules/messages/i18n/es.json +2 -0
  191. package/src/modules/messages/i18n/pl.json +2 -0
  192. package/src/modules/messages/search.ts +11 -5
  193. package/src/modules/query_index/data/entities.ts +7 -0
  194. package/src/modules/query_index/lib/engine.ts +40 -63
  195. package/src/modules/query_index/migrations/.snapshot-open-mercato.json +12 -0
  196. package/src/modules/query_index/migrations/Migration20260731105052_query_index.ts +35 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/entries/feedback.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { Inbox, RefreshCw, Search, Settings, UserPlus } from 'lucide-react'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Skeleton } from '@open-mercato/ui/primitives/skeleton'\nimport { CircularProgress, Progress } from '@open-mercato/ui/primitives/progress'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Rating } from '@open-mercato/ui/primitives/rating'\nimport { StepIndicator, type StepIndicatorStep } from '@open-mercato/ui/primitives/step-indicator'\nimport { Notification } from '@open-mercato/ui/primitives/notification'\nimport {\n NotificationFeed,\n NotificationFeedFooter,\n NotificationFeedHeader,\n NotificationFeedIconBadge,\n NotificationFeedItem,\n NotificationFeedList,\n} from '@open-mercato/ui/primitives/notification-feed'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { LinkButton } from '@open-mercato/ui/primitives/link-button'\nimport type { GalleryEntry } from '../types'\n\n// Component titles and variant names are proper nouns from the codebase and\n// are deliberately not translated. `code` MUST contain the entry's importPath\n// (enforced by the registry-integrity test) and is always reviewed alongside\n// its sibling `render`.\n\nconst alertEntry: GalleryEntry = {\n id: 'alert',\n title: 'Alert',\n importPath: '@open-mercato/ui/primitives/alert',\n usage: {\n do: [\n 'Current API only: status (error/warning/success/information/feature) + style (filled/light/lighter/stroke) + size.',\n 'light/lighter for inline page notices; filled for high-emphasis moments.',\n ],\n dont: ['The legacy variant prop is deprecated \u2014 lint flags it.', 'Never build ad-hoc colored notice boxes; this is the primitive for them.'],\n },\n variants: [\n {\n id: 'statuses-light',\n title: 'Statuses (light)',\n render: () => (\n <div className=\"flex w-full max-w-md flex-col gap-2\">\n <Alert status=\"error\" style=\"light\">Payment failed \u2014 the card was declined.</Alert>\n <Alert status=\"warning\" style=\"light\">Inventory sync is running behind schedule.</Alert>\n <Alert status=\"success\" style=\"light\">Order #10231 was fulfilled.</Alert>\n <Alert status=\"information\" style=\"light\">Prices include VAT for EU customers.</Alert>\n <Alert status=\"feature\" style=\"light\">Bulk editing is now available in the catalog.</Alert>\n </div>\n ),\n code: `import { Alert } from '@open-mercato/ui/primitives/alert'\n\n<Alert status=\"error\" style=\"light\">Payment failed \u2014 the card was declined.</Alert>\n<Alert status=\"warning\" style=\"light\">Inventory sync is running behind schedule.</Alert>\n<Alert status=\"success\" style=\"light\">Order #10231 was fulfilled.</Alert>\n<Alert status=\"information\" style=\"light\">Prices include VAT for EU customers.</Alert>\n<Alert status=\"feature\" style=\"light\">Bulk editing is now available in the catalog.</Alert>`,\n },\n {\n id: 'filled',\n title: 'filled',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Alert status=\"error\" style=\"filled\" size=\"default\">\n <AlertTitle>Import failed</AlertTitle>\n <AlertDescription>14 rows were rejected \u2014 download the error report to review them.</AlertDescription>\n </Alert>\n </div>\n ),\n code: `import { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\n\n<Alert status=\"error\" style=\"filled\" size=\"default\">\n <AlertTitle>Import failed</AlertTitle>\n <AlertDescription>14 rows were rejected \u2014 download the error report to review them.</AlertDescription>\n</Alert>`,\n },\n {\n id: 'stroke',\n title: 'stroke',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Alert status=\"success\" style=\"stroke\" size=\"default\">\n <AlertTitle>Backup complete</AlertTitle>\n <AlertDescription>The nightly snapshot finished without warnings.</AlertDescription>\n </Alert>\n </div>\n ),\n code: `import { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\n\n<Alert status=\"success\" style=\"stroke\" size=\"default\">\n <AlertTitle>Backup complete</AlertTitle>\n <AlertDescription>The nightly snapshot finished without warnings.</AlertDescription>\n</Alert>`,\n },\n {\n id: 'sizes',\n title: 'Sizes',\n render: () => (\n <div className=\"flex w-full max-w-md flex-col gap-2\">\n <Alert status=\"information\" size=\"xs\">X-Small \u2014 inline form hint.</Alert>\n <Alert status=\"information\" size=\"sm\">Small \u2014 the default single-line alert.</Alert>\n <Alert status=\"information\" size=\"default\">\n <AlertTitle>Large</AlertTitle>\n <AlertDescription>Multi-line alert with a title and a description body.</AlertDescription>\n </Alert>\n </div>\n ),\n code: `import { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\n\n<Alert status=\"information\" size=\"xs\">X-Small \u2014 inline form hint.</Alert>\n<Alert status=\"information\" size=\"sm\">Small \u2014 the default single-line alert.</Alert>\n<Alert status=\"information\" size=\"default\">\n <AlertTitle>Large</AlertTitle>\n <AlertDescription>Multi-line alert with a title and a description body.</AlertDescription>\n</Alert>`,\n },\n {\n id: 'dismissible-with-action',\n title: 'Dismissible with action',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Alert\n status=\"warning\"\n style=\"lighter\"\n dismissible\n action={<LinkButton variant=\"black\" underline=\"always\">Review</LinkButton>}\n >\n 3 products are missing tax categories.\n </Alert>\n </div>\n ),\n code: `import { Alert } from '@open-mercato/ui/primitives/alert'\nimport { LinkButton } from '@open-mercato/ui/primitives/link-button'\n\n<Alert\n status=\"warning\"\n style=\"lighter\"\n dismissible\n onDismiss={() => setVisible(false)}\n action={<LinkButton variant=\"black\" underline=\"always\">Review</LinkButton>}\n>\n 3 products are missing tax categories.\n</Alert>`,\n },\n ],\n}\n\nconst emptyStateEntry: GalleryEntry = {\n id: 'empty-state',\n title: 'EmptyState',\n importPath: '@open-mercato/ui/primitives/empty-state',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <div className=\"w-full max-w-md\">\n <EmptyState\n title=\"No customers yet\"\n description=\"Create your first customer to start tracking opportunities.\"\n />\n </div>\n ),\n code: `import { EmptyState } from '@open-mercato/ui/primitives/empty-state'\n\n<EmptyState\n title=\"No customers yet\"\n description=\"Create your first customer to start tracking opportunities.\"\n/>`,\n },\n {\n id: 'with-actions',\n title: 'With icon and actions',\n render: () => (\n <div className=\"w-full max-w-md\">\n <EmptyState\n icon={<Inbox className=\"size-8\" />}\n title=\"No orders found\"\n description=\"Orders will appear here once your storefront starts selling.\"\n actions={<Button size=\"sm\">Create order</Button>}\n />\n </div>\n ),\n code: `import { Inbox } from 'lucide-react'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<EmptyState\n icon={<Inbox className=\"size-8\" />}\n title=\"No orders found\"\n description=\"Orders will appear here once your storefront starts selling.\"\n actions={<Button size=\"sm\">Create order</Button>}\n/>`,\n },\n {\n id: 'subtle',\n title: 'subtle',\n render: () => (\n <div className=\"w-full max-w-md\">\n <EmptyState\n variant=\"subtle\"\n size=\"sm\"\n icon={<Search className=\"size-5\" />}\n title=\"No results\"\n description=\"Try a different search term or clear the filters.\"\n />\n </div>\n ),\n code: `import { Search } from 'lucide-react'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\n\n<EmptyState\n variant=\"subtle\"\n size=\"sm\"\n icon={<Search className=\"size-5\" />}\n title=\"No results\"\n description=\"Try a different search term or clear the filters.\"\n/>`,\n },\n ],\n}\n\nconst skeletonEntry: GalleryEntry = {\n id: 'skeleton',\n title: 'Skeleton',\n importPath: '@open-mercato/ui/primitives/skeleton',\n variants: [\n {\n id: 'shapes',\n title: 'Shapes',\n render: () => (\n <div className=\"flex w-full max-w-md items-center gap-4\">\n <Skeleton shape=\"circle\" className=\"size-10\" />\n <Skeleton className=\"h-8 w-24\" />\n <Skeleton className=\"h-8 flex-1\" />\n </div>\n ),\n code: `import { Skeleton } from '@open-mercato/ui/primitives/skeleton'\n\n<Skeleton shape=\"circle\" className=\"size-10\" />\n<Skeleton className=\"h-8 w-24\" />\n<Skeleton className=\"h-8 flex-1\" />`,\n },\n {\n id: 'text-lines',\n title: 'Text lines',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Skeleton shape=\"text\" lines={3} />\n </div>\n ),\n code: `import { Skeleton } from '@open-mercato/ui/primitives/skeleton'\n\n<Skeleton shape=\"text\" lines={3} />`,\n },\n {\n id: 'card-placeholder',\n title: 'Card placeholder',\n render: () => (\n <div className=\"flex w-full max-w-md items-start gap-3 rounded-lg border border-border p-4\">\n <Skeleton shape=\"circle\" className=\"size-12\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton shape=\"text\" lines={2} />\n </div>\n </div>\n ),\n code: `import { Skeleton } from '@open-mercato/ui/primitives/skeleton'\n\n<div className=\"flex items-start gap-3 rounded-lg border border-border p-4\">\n <Skeleton shape=\"circle\" className=\"size-12\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton shape=\"text\" lines={2} />\n </div>\n</div>`,\n },\n ],\n}\n\nconst progressEntry: GalleryEntry = {\n id: 'progress',\n title: 'Progress',\n importPath: '@open-mercato/ui/primitives/progress',\n variants: [\n {\n id: 'basic',\n title: 'Basic',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Progress value={50} />\n </div>\n ),\n code: `import { Progress } from '@open-mercato/ui/primitives/progress'\n\n<Progress value={50} />`,\n },\n {\n id: 'labelled',\n title: 'Labelled',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Progress\n value={80}\n label=\"Data storage\"\n showValue\n description=\"Upgrade to unlock unlimited storage.\"\n />\n </div>\n ),\n code: `import { Progress } from '@open-mercato/ui/primitives/progress'\n\n<Progress\n value={80}\n label=\"Data storage\"\n showValue\n description=\"Upgrade to unlock unlimited storage.\"\n/>`,\n },\n {\n id: 'tones',\n title: 'Tones',\n render: () => (\n <div className=\"flex w-full max-w-md flex-col gap-3\">\n <Progress value={42} tone=\"accent\" />\n <Progress value={42} tone=\"success\" />\n <Progress value={42} tone=\"warning\" />\n <Progress value={42} tone=\"destructive\" />\n <Progress value={42} tone=\"muted\" />\n </div>\n ),\n code: `import { Progress } from '@open-mercato/ui/primitives/progress'\n\n<Progress value={42} tone=\"accent\" />\n<Progress value={42} tone=\"success\" />\n<Progress value={42} tone=\"warning\" />\n<Progress value={42} tone=\"destructive\" />\n<Progress value={42} tone=\"muted\" />`,\n },\n {\n id: 'circular',\n title: 'CircularProgress',\n render: () => (\n <>\n <CircularProgress value={75} size=\"lg\" showValue />\n <CircularProgress value={75} size=\"default\" showValue />\n <CircularProgress value={75} size=\"sm\" />\n <CircularProgress value={75} size=\"xs\" />\n <CircularProgress value={100} tone=\"success\" showValue />\n </>\n ),\n code: `import { CircularProgress } from '@open-mercato/ui/primitives/progress'\n\n<CircularProgress value={75} size=\"lg\" showValue />\n<CircularProgress value={75} size=\"default\" showValue />\n<CircularProgress value={75} size=\"sm\" />\n<CircularProgress value={75} size=\"xs\" />\n<CircularProgress value={100} tone=\"success\" showValue />`,\n },\n ],\n}\n\nconst spinnerEntry: GalleryEntry = {\n id: 'spinner',\n title: 'Spinner',\n importPath: '@open-mercato/ui/primitives/spinner',\n variants: [\n {\n id: 'sizes',\n title: 'Sizes',\n render: () => (\n <>\n <Spinner size=\"sm\" />\n <Spinner size=\"md\" />\n <Spinner size=\"lg\" />\n </>\n ),\n code: `import { Spinner } from '@open-mercato/ui/primitives/spinner'\n\n<Spinner size=\"sm\" />\n<Spinner size=\"md\" />\n<Spinner size=\"lg\" />`,\n },\n {\n id: 'inline-with-label',\n title: 'Inline with label',\n render: () => (\n <span className=\"inline-flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner size=\"sm\" />\n Loading orders\u2026\n </span>\n ),\n code: `import { Spinner } from '@open-mercato/ui/primitives/spinner'\n\n<span className=\"inline-flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner size=\"sm\" />\n Loading orders\u2026\n</span>`,\n },\n ],\n}\n\nfunction InteractiveRatingDemo() {\n const [value, setValue] = React.useState(3)\n return <Rating value={value} onChange={setValue} aria-label=\"Your rating\" />\n}\n\nconst ratingEntry: GalleryEntry = {\n id: 'rating',\n title: 'Rating',\n importPath: '@open-mercato/ui/primitives/rating',\n variants: [\n {\n id: 'read-only',\n title: 'Read-only',\n render: () => <Rating value={4} max={5} />,\n code: `import { Rating } from '@open-mercato/ui/primitives/rating'\n\n<Rating value={4} max={5} />`,\n },\n {\n id: 'half-precision',\n title: 'Half precision',\n render: () => <Rating value={3.5} max={5} allowHalf />,\n code: `import { Rating } from '@open-mercato/ui/primitives/rating'\n\n<Rating value={3.5} max={5} allowHalf />`,\n },\n {\n id: 'interactive',\n title: 'Interactive',\n render: () => <InteractiveRatingDemo />,\n code: `import { Rating } from '@open-mercato/ui/primitives/rating'\n\nconst [value, setValue] = React.useState(3)\n\n<Rating value={value} onChange={setValue} aria-label=\"Your rating\" />`,\n },\n {\n id: 'icons-and-sizes',\n title: 'Icons and sizes',\n render: () => (\n <>\n <Rating value={3} max={5} icon=\"heart\" />\n <Rating value={3} max={5} icon=\"circle\" size=\"sm\" />\n <Rating value={3} max={5} size=\"lg\" />\n </>\n ),\n code: `import { Rating } from '@open-mercato/ui/primitives/rating'\n\n<Rating value={3} max={5} icon=\"heart\" />\n<Rating value={3} max={5} icon=\"circle\" size=\"sm\" />\n<Rating value={3} max={5} size=\"lg\" />`,\n },\n ],\n}\n\nconst wizardSteps: StepIndicatorStep[] = [\n { id: 'account', label: 'Account', status: 'complete' },\n { id: 'profile', label: 'Profile', status: 'current' },\n { id: 'review', label: 'Review', status: 'pending' },\n]\n\nconst verticalSteps: StepIndicatorStep[] = [\n { id: 'details', label: 'Store details', description: 'Name, currency, region', status: 'complete' },\n { id: 'payments', label: 'Payments', description: 'Connect a payment provider', status: 'current' },\n { id: 'shipping', label: 'Shipping', description: 'Zones and carriers', status: 'pending' },\n]\n\nconst errorSteps: StepIndicatorStep[] = [\n { id: 'upload', label: 'Upload file', status: 'complete' },\n { id: 'validate', label: 'Validation', status: 'error' },\n { id: 'import', label: 'Import', status: 'pending' },\n]\n\nconst stepIndicatorEntry: GalleryEntry = {\n id: 'step-indicator',\n title: 'StepIndicator',\n importPath: '@open-mercato/ui/primitives/step-indicator',\n variants: [\n {\n id: 'horizontal',\n title: 'Horizontal',\n render: () => <StepIndicator steps={wizardSteps} />,\n code: `import { StepIndicator, type StepIndicatorStep } from '@open-mercato/ui/primitives/step-indicator'\n\nconst steps: StepIndicatorStep[] = [\n { id: 'account', label: 'Account', status: 'complete' },\n { id: 'profile', label: 'Profile', status: 'current' },\n { id: 'review', label: 'Review', status: 'pending' },\n]\n\n<StepIndicator steps={steps} />`,\n },\n {\n id: 'vertical',\n title: 'Vertical with descriptions',\n render: () => (\n <div className=\"w-full max-w-xs\">\n <StepIndicator steps={verticalSteps} orientation=\"vertical\" />\n </div>\n ),\n code: `import { StepIndicator, type StepIndicatorStep } from '@open-mercato/ui/primitives/step-indicator'\n\nconst steps: StepIndicatorStep[] = [\n { id: 'details', label: 'Store details', description: 'Name, currency, region', status: 'complete' },\n { id: 'payments', label: 'Payments', description: 'Connect a payment provider', status: 'current' },\n { id: 'shipping', label: 'Shipping', description: 'Zones and carriers', status: 'pending' },\n]\n\n<StepIndicator steps={steps} orientation=\"vertical\" />`,\n },\n {\n id: 'error-state',\n title: 'Error state',\n render: () => <StepIndicator steps={errorSteps} />,\n code: `import { StepIndicator, type StepIndicatorStep } from '@open-mercato/ui/primitives/step-indicator'\n\nconst steps: StepIndicatorStep[] = [\n { id: 'upload', label: 'Upload file', status: 'complete' },\n { id: 'validate', label: 'Validation', status: 'error' },\n { id: 'import', label: 'Import', status: 'pending' },\n]\n\n<StepIndicator steps={steps} />`,\n },\n ],\n}\n\nconst notificationEntry: GalleryEntry = {\n id: 'notification',\n title: 'Notification',\n importPath: '@open-mercato/ui/primitives/notification',\n variants: [\n {\n id: 'information',\n title: 'Information',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Notification\n title=\"Scheduled maintenance\"\n description=\"The admin panel will be read-only on Sunday between 02:00 and 04:00 UTC.\"\n timestamp=\"2 min ago\"\n />\n </div>\n ),\n code: `import { Notification } from '@open-mercato/ui/primitives/notification'\n\n<Notification\n title=\"Scheduled maintenance\"\n description=\"The admin panel will be read-only on Sunday between 02:00 and 04:00 UTC.\"\n timestamp=\"2 min ago\"\n onDismiss={() => dismiss(id)}\n/>`,\n },\n {\n id: 'success-with-actions',\n title: 'Success with actions',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Notification\n status=\"success\"\n title=\"Export ready\"\n description=\"Your product export (1,204 rows) finished successfully.\"\n timestamp=\"just now\"\n actions={\n <>\n <LinkButton variant=\"black\" underline=\"always\">Download</LinkButton>\n <LinkButton variant=\"gray\" underline=\"always\">View log</LinkButton>\n </>\n }\n />\n </div>\n ),\n code: `import { Notification } from '@open-mercato/ui/primitives/notification'\nimport { LinkButton } from '@open-mercato/ui/primitives/link-button'\n\n<Notification\n status=\"success\"\n title=\"Export ready\"\n description=\"Your product export (1,204 rows) finished successfully.\"\n timestamp=\"just now\"\n actions={\n <>\n <LinkButton variant=\"black\" underline=\"always\">Download</LinkButton>\n <LinkButton variant=\"gray\" underline=\"always\">View log</LinkButton>\n </>\n }\n/>`,\n },\n {\n id: 'error',\n title: 'Error',\n render: () => (\n <div className=\"w-full max-w-md\">\n <Notification\n status=\"error\"\n title=\"Webhook delivery failed\"\n description=\"The endpoint responded with 503 after 3 retries.\"\n timestamp=\"5 min ago\"\n actions={<LinkButton variant=\"error\" underline=\"always\">Retry now</LinkButton>}\n />\n </div>\n ),\n code: `import { Notification } from '@open-mercato/ui/primitives/notification'\nimport { LinkButton } from '@open-mercato/ui/primitives/link-button'\n\n<Notification\n status=\"error\"\n title=\"Webhook delivery failed\"\n description=\"The endpoint responded with 503 after 3 retries.\"\n timestamp=\"5 min ago\"\n actions={<LinkButton variant=\"error\" underline=\"always\">Retry now</LinkButton>}\n/>`,\n },\n ],\n}\n\nconst notificationFeedEntry: GalleryEntry = {\n id: 'notification-feed',\n title: 'NotificationFeed',\n importPath: '@open-mercato/ui/primitives/notification-feed',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <div className=\"w-full max-w-sm\">\n <NotificationFeed>\n <NotificationFeedHeader title=\"Notifications\">\n <IconButton size=\"sm\" variant=\"ghost\" aria-label=\"Notification settings\">\n <Settings />\n </IconButton>\n </NotificationFeedHeader>\n <NotificationFeedList>\n <NotificationFeedItem\n icon={\n <NotificationFeedIconBadge tone=\"indigo\">\n <UserPlus className=\"size-5\" />\n </NotificationFeedIconBadge>\n }\n title=\"New lead generated\"\n body=\"John Smith submitted the contact form.\"\n timestamp=\"10 minutes ago\"\n unread\n />\n <NotificationFeedItem\n icon={\n <NotificationFeedIconBadge tone=\"success\">\n <RefreshCw className=\"size-5\" />\n </NotificationFeedIconBadge>\n }\n title=\"Catalog sync completed\"\n body=\"312 products updated from the PIM.\"\n timestamp=\"1 hour ago\"\n />\n </NotificationFeedList>\n <NotificationFeedFooter>\n <Button variant=\"outline\" size=\"sm\" className=\"w-full\">Archive all</Button>\n </NotificationFeedFooter>\n </NotificationFeed>\n </div>\n ),\n code: `import { Settings, UserPlus } from 'lucide-react'\nimport {\n NotificationFeed,\n NotificationFeedFooter,\n NotificationFeedHeader,\n NotificationFeedIconBadge,\n NotificationFeedItem,\n NotificationFeedList,\n} from '@open-mercato/ui/primitives/notification-feed'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\n\n<NotificationFeed>\n <NotificationFeedHeader title=\"Notifications\">\n <IconButton size=\"sm\" variant=\"ghost\" aria-label=\"Notification settings\">\n <Settings />\n </IconButton>\n </NotificationFeedHeader>\n <NotificationFeedList>\n <NotificationFeedItem\n icon={\n <NotificationFeedIconBadge tone=\"indigo\">\n <UserPlus className=\"size-5\" />\n </NotificationFeedIconBadge>\n }\n title=\"New lead generated\"\n body=\"John Smith submitted the contact form.\"\n timestamp=\"10 minutes ago\"\n unread\n />\n </NotificationFeedList>\n <NotificationFeedFooter>\n <Button variant=\"outline\" size=\"sm\" className=\"w-full\">Archive all</Button>\n </NotificationFeedFooter>\n</NotificationFeed>`,\n },\n {\n id: 'icon-badge-tones',\n title: 'NotificationFeedIconBadge tones',\n render: () => (\n <>\n <NotificationFeedIconBadge tone=\"indigo\">\n <UserPlus className=\"size-5\" />\n </NotificationFeedIconBadge>\n <NotificationFeedIconBadge tone=\"success\">\n <RefreshCw className=\"size-5\" />\n </NotificationFeedIconBadge>\n <NotificationFeedIconBadge tone=\"error\">\n <Inbox className=\"size-5\" />\n </NotificationFeedIconBadge>\n <NotificationFeedIconBadge tone=\"info\">\n <Search className=\"size-5\" />\n </NotificationFeedIconBadge>\n <NotificationFeedIconBadge tone=\"neutral\">\n <Settings className=\"size-5\" />\n </NotificationFeedIconBadge>\n </>\n ),\n code: `import { UserPlus } from 'lucide-react'\nimport { NotificationFeedIconBadge } from '@open-mercato/ui/primitives/notification-feed'\n\n<NotificationFeedIconBadge tone=\"indigo\"><UserPlus className=\"size-5\" /></NotificationFeedIconBadge>\n<NotificationFeedIconBadge tone=\"success\"><RefreshCw className=\"size-5\" /></NotificationFeedIconBadge>\n<NotificationFeedIconBadge tone=\"error\"><Inbox className=\"size-5\" /></NotificationFeedIconBadge>\n<NotificationFeedIconBadge tone=\"info\"><Search className=\"size-5\" /></NotificationFeedIconBadge>\n<NotificationFeedIconBadge tone=\"neutral\"><Settings className=\"size-5\" /></NotificationFeedIconBadge>`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n alertEntry,\n emptyStateEntry,\n skeletonEntry,\n progressEntry,\n spinnerEntry,\n ratingEntry,\n stepIndicatorEntry,\n notificationEntry,\n notificationFeedEntry,\n]\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,505 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Download } from "lucide-react";
4
+ import { Button } from "@open-mercato/ui/primitives/button";
5
+ import {
6
+ FilterBar
7
+ } from "@open-mercato/ui/backend/FilterBar";
8
+ import { QuickFilters } from "@open-mercato/ui/backend/filters/QuickFilters";
9
+ import { ActiveFilterChips } from "@open-mercato/ui/backend/filters/ActiveFilterChips";
10
+ import { AdvancedFilterBuilder } from "@open-mercato/ui/backend/filters/AdvancedFilterBuilder";
11
+ import { FilterEmptyState } from "@open-mercato/ui/backend/filters/FilterEmptyState";
12
+ import { ListEmptyState } from "@open-mercato/ui/backend/filters/ListEmptyState";
13
+ import { FilteredEmptyResults } from "@open-mercato/ui/backend/filters/FilteredEmptyResults";
14
+ import { SearchEmptyResults } from "@open-mercato/ui/backend/filters/SearchEmptyResults";
15
+ const demoFilterDefs = [
16
+ { id: "city", label: "City", type: "text", placeholder: "e.g. Berlin" },
17
+ {
18
+ id: "status",
19
+ label: "Status",
20
+ type: "select",
21
+ options: [
22
+ { value: "active", label: "Active" },
23
+ { value: "prospect", label: "Prospect" },
24
+ { value: "churned", label: "Churned" }
25
+ ]
26
+ },
27
+ { id: "hasOpenDeals", label: "Has open deals", type: "checkbox" }
28
+ ];
29
+ const demoFields = [
30
+ { key: "name", label: "Name", type: "text" },
31
+ { key: "email", label: "Email", type: "text" },
32
+ {
33
+ key: "status",
34
+ label: "Status",
35
+ type: "select",
36
+ options: [
37
+ { value: "active", label: "Active", tone: "success" },
38
+ { value: "prospect", label: "Prospect", tone: "info" },
39
+ { value: "churned", label: "Churned", tone: "error" }
40
+ ]
41
+ },
42
+ { key: "employees", label: "Employees", type: "number" }
43
+ ];
44
+ function rule(id, field, operator, value) {
45
+ return { id, type: "rule", field, operator, value };
46
+ }
47
+ function tree(children) {
48
+ return { root: { id: "root", type: "group", combinator: "and", children } };
49
+ }
50
+ const ruleChipsTree = tree([
51
+ rule("r1", "name", "contains", "north"),
52
+ rule("r2", "status", "is", "active"),
53
+ rule("r3", "employees", "between", [10, 50])
54
+ ]);
55
+ const groupChipTree = tree([
56
+ {
57
+ id: "g1",
58
+ type: "group",
59
+ combinator: "or",
60
+ children: [
61
+ rule("g1r1", "status", "is", "prospect"),
62
+ rule("g1r2", "status", "is", "churned")
63
+ ]
64
+ }
65
+ ]);
66
+ const valuelessChipTree = tree([rule("r4", "email", "is_empty", null)]);
67
+ const builderSingleRuleTree = tree([rule("b1", "status", "is", "active")]);
68
+ const builderNestedTree = tree([
69
+ rule("b2", "name", "contains", "north"),
70
+ {
71
+ id: "bg1",
72
+ type: "group",
73
+ combinator: "or",
74
+ children: [
75
+ rule("bg1r1", "status", "is", "prospect"),
76
+ rule("bg1r2", "employees", "greater_than", 100)
77
+ ]
78
+ }
79
+ ]);
80
+ const demoPresets = [
81
+ {
82
+ id: "active-accounts",
83
+ labelKey: "Active accounts",
84
+ iconName: "filter",
85
+ build: () => tree([rule("p1", "status", "is", "active")])
86
+ },
87
+ {
88
+ id: "added-this-week",
89
+ labelKey: "Added this week",
90
+ iconName: "clock",
91
+ build: () => tree([rule("p2", "name", "is_not_empty", null)])
92
+ }
93
+ ];
94
+ const userScopedPresets = [
95
+ ...demoPresets,
96
+ {
97
+ id: "my-accounts",
98
+ labelKey: "My accounts",
99
+ requiresUser: true,
100
+ build: ({ userId }) => tree([rule("p3", "name", "contains", userId)])
101
+ }
102
+ ];
103
+ function DemoFilterBar({
104
+ layout,
105
+ trailingItems
106
+ }) {
107
+ const [search, setSearch] = React.useState("");
108
+ const [values, setValues] = React.useState({ status: "active" });
109
+ return /* @__PURE__ */ jsx("div", { className: "w-full max-w-2xl", children: /* @__PURE__ */ jsx(
110
+ FilterBar,
111
+ {
112
+ searchValue: search,
113
+ onSearchChange: setSearch,
114
+ filters: demoFilterDefs,
115
+ values,
116
+ onApply: setValues,
117
+ onClear: () => setValues({}),
118
+ layout,
119
+ trailingItems
120
+ }
121
+ ) });
122
+ }
123
+ function DemoActiveFilterChips({ initialTree }) {
124
+ const [value, setValue] = React.useState(initialTree);
125
+ const removeNode = (id) => setValue((prev) => ({
126
+ root: { ...prev.root, children: prev.root.children.filter((child) => child.id !== id) }
127
+ }));
128
+ return /* @__PURE__ */ jsx("div", { className: "w-full max-w-2xl", children: /* @__PURE__ */ jsx(
129
+ ActiveFilterChips,
130
+ {
131
+ tree: value,
132
+ fields: demoFields,
133
+ popoverOpen: false,
134
+ onRemoveNode: removeNode,
135
+ onOpen: () => {
136
+ }
137
+ }
138
+ ) });
139
+ }
140
+ function DemoAdvancedFilterBuilder({ initialTree }) {
141
+ const [value, setValue] = React.useState(initialTree);
142
+ return /* @__PURE__ */ jsx("div", { className: "w-full max-w-2xl rounded-lg border bg-popover p-3", children: /* @__PURE__ */ jsx(
143
+ AdvancedFilterBuilder,
144
+ {
145
+ fields: demoFields,
146
+ value,
147
+ onChange: setValue,
148
+ onApply: () => {
149
+ },
150
+ onClear: () => setValue(tree([]))
151
+ }
152
+ ) });
153
+ }
154
+ function DemoFilterEmptyState({ withQuickFilters }) {
155
+ const addConditionRef = React.useRef(null);
156
+ return /* @__PURE__ */ jsx("div", { className: "w-full max-w-xl rounded-lg border bg-popover", children: /* @__PURE__ */ jsx(
157
+ FilterEmptyState,
158
+ {
159
+ onAddCondition: () => {
160
+ },
161
+ addConditionRef,
162
+ quickFilters: withQuickFilters ? /* @__PURE__ */ jsx(QuickFilters, { presets: demoPresets, userId: "user-1", onApply: () => {
163
+ } }) : void 0
164
+ }
165
+ ) });
166
+ }
167
+ const filterBarEntry = {
168
+ id: "filter-bar",
169
+ title: "FilterBar",
170
+ importPath: "@open-mercato/ui/backend/FilterBar",
171
+ variants: [
172
+ {
173
+ id: "stacked",
174
+ title: "Stacked (default)",
175
+ render: () => /* @__PURE__ */ jsx(DemoFilterBar, {}),
176
+ code: `import { FilterBar, type FilterDef, type FilterValues } from '@open-mercato/ui/backend/FilterBar'
177
+
178
+ const filters: FilterDef[] = [
179
+ { id: 'city', label: 'City', type: 'text' },
180
+ { id: 'status', label: 'Status', type: 'select', options: statusOptions },
181
+ { id: 'hasOpenDeals', label: 'Has open deals', type: 'checkbox' },
182
+ ]
183
+
184
+ <FilterBar
185
+ searchValue={search}
186
+ onSearchChange={setSearch}
187
+ filters={filters}
188
+ values={values}
189
+ onApply={setValues}
190
+ onClear={() => setValues({})}
191
+ />`
192
+ },
193
+ {
194
+ id: "inline",
195
+ title: "Inline layout",
196
+ render: () => /* @__PURE__ */ jsx(DemoFilterBar, { layout: "inline" }),
197
+ code: `import { FilterBar } from '@open-mercato/ui/backend/FilterBar'
198
+
199
+ <FilterBar
200
+ searchValue={search}
201
+ onSearchChange={setSearch}
202
+ filters={filters}
203
+ values={values}
204
+ onApply={setValues}
205
+ layout="inline"
206
+ />`
207
+ },
208
+ {
209
+ id: "trailing-items",
210
+ title: "With trailing items",
211
+ render: () => /* @__PURE__ */ jsx(
212
+ DemoFilterBar,
213
+ {
214
+ trailingItems: /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", children: [
215
+ /* @__PURE__ */ jsx(Download, {}),
216
+ "Export"
217
+ ] })
218
+ }
219
+ ),
220
+ code: `import { Download } from 'lucide-react'
221
+ import { FilterBar } from '@open-mercato/ui/backend/FilterBar'
222
+ import { Button } from '@open-mercato/ui/primitives/button'
223
+
224
+ <FilterBar
225
+ searchValue={search}
226
+ onSearchChange={setSearch}
227
+ filters={filters}
228
+ values={values}
229
+ onApply={setValues}
230
+ trailingItems={<Button variant="outline" size="sm"><Download />Export</Button>}
231
+ />`
232
+ }
233
+ ]
234
+ };
235
+ const quickFiltersEntry = {
236
+ id: "quick-filters",
237
+ title: "QuickFilters",
238
+ importPath: "@open-mercato/ui/backend/filters/QuickFilters",
239
+ variants: [
240
+ {
241
+ id: "presets",
242
+ title: "Presets (used inside AdvancedFilterPanel)",
243
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-xl", children: /* @__PURE__ */ jsx(QuickFilters, { presets: demoPresets, userId: "user-1", onApply: () => {
244
+ } }) }),
245
+ code: `import { QuickFilters, type FilterPreset } from '@open-mercato/ui/backend/filters/QuickFilters'
246
+
247
+ const presets: FilterPreset[] = [
248
+ { id: 'active-accounts', labelKey: 'customers.filters.activeAccounts', iconName: 'filter', build: () => activeTree },
249
+ { id: 'added-this-week', labelKey: 'customers.filters.addedThisWeek', iconName: 'clock', build: () => recentTree },
250
+ ]
251
+
252
+ <QuickFilters presets={presets} userId={userId} onApply={(tree, preset) => applyTree(tree)} />`
253
+ },
254
+ {
255
+ id: "user-scoped",
256
+ title: "User-scoped preset (hidden without userId)",
257
+ render: () => /* @__PURE__ */ jsxs("div", { className: "flex w-full max-w-xl flex-col gap-6", children: [
258
+ /* @__PURE__ */ jsx(QuickFilters, { presets: userScopedPresets, userId: "user-1", onApply: () => {
259
+ } }),
260
+ /* @__PURE__ */ jsx(QuickFilters, { presets: userScopedPresets, userId: "", onApply: () => {
261
+ } })
262
+ ] }),
263
+ code: `import { QuickFilters } from '@open-mercato/ui/backend/filters/QuickFilters'
264
+
265
+ // Presets with requiresUser: true are hidden when userId is empty.
266
+ <QuickFilters presets={presets} userId={userId} onApply={applyTree} />`
267
+ }
268
+ ]
269
+ };
270
+ const activeFilterChipsEntry = {
271
+ id: "active-filter-chips",
272
+ title: "ActiveFilterChips",
273
+ importPath: "@open-mercato/ui/backend/filters/ActiveFilterChips",
274
+ variants: [
275
+ {
276
+ id: "rule-chips",
277
+ title: "Rule chips (text, toned select, range)",
278
+ render: () => /* @__PURE__ */ jsx(DemoActiveFilterChips, { initialTree: ruleChipsTree }),
279
+ code: `import { ActiveFilterChips } from '@open-mercato/ui/backend/filters/ActiveFilterChips'
280
+
281
+ <ActiveFilterChips
282
+ tree={tree}
283
+ fields={fields}
284
+ popoverOpen={panelOpen}
285
+ onRemoveNode={(id) => dispatch({ type: 'removeNode', id })}
286
+ onOpen={(focusNodeId) => setPanelOpen(true)}
287
+ />`
288
+ },
289
+ {
290
+ id: "group-chip",
291
+ title: "Group chip (first rule +N)",
292
+ render: () => /* @__PURE__ */ jsx(DemoActiveFilterChips, { initialTree: groupChipTree }),
293
+ code: `import { ActiveFilterChips } from '@open-mercato/ui/backend/filters/ActiveFilterChips'
294
+
295
+ // An OR group renders as a single chip: "Status: Prospect +1".
296
+ <ActiveFilterChips tree={tree} fields={fields} popoverOpen={false} onRemoveNode={removeNode} onOpen={openPanel} />`
297
+ },
298
+ {
299
+ id: "valueless-operator",
300
+ title: "Valueless operator chip",
301
+ render: () => /* @__PURE__ */ jsx(DemoActiveFilterChips, { initialTree: valuelessChipTree }),
302
+ code: `import { ActiveFilterChips } from '@open-mercato/ui/backend/filters/ActiveFilterChips'
303
+
304
+ // Valueless operators read as a phrase: "Email is empty".
305
+ <ActiveFilterChips tree={tree} fields={fields} popoverOpen={false} onRemoveNode={removeNode} onOpen={openPanel} />`
306
+ }
307
+ ]
308
+ };
309
+ const advancedFilterBuilderEntry = {
310
+ id: "advanced-filter-builder",
311
+ title: "AdvancedFilterBuilder",
312
+ importPath: "@open-mercato/ui/backend/filters/AdvancedFilterBuilder",
313
+ variants: [
314
+ {
315
+ id: "single-rule",
316
+ title: "Single rule (presentational core of AdvancedFilterPanel)",
317
+ render: () => /* @__PURE__ */ jsx(DemoAdvancedFilterBuilder, { initialTree: builderSingleRuleTree }),
318
+ code: `import { AdvancedFilterBuilder } from '@open-mercato/ui/backend/filters/AdvancedFilterBuilder'
319
+
320
+ <AdvancedFilterBuilder
321
+ fields={fields}
322
+ value={tree}
323
+ onChange={setTree}
324
+ onApply={applyFilters}
325
+ onClear={clearFilters}
326
+ />`
327
+ },
328
+ {
329
+ id: "nested-group",
330
+ title: "Rule with nested OR group",
331
+ render: () => /* @__PURE__ */ jsx(DemoAdvancedFilterBuilder, { initialTree: builderNestedTree }),
332
+ code: `import { AdvancedFilterBuilder } from '@open-mercato/ui/backend/filters/AdvancedFilterBuilder'
333
+
334
+ // Groups nest up to 3 levels; the value is a plain AdvancedFilterTree.
335
+ <AdvancedFilterBuilder fields={fields} value={tree} onChange={setTree} onApply={applyFilters} onClear={clearFilters} />`
336
+ }
337
+ ]
338
+ };
339
+ const filterEmptyStateEntry = {
340
+ id: "filter-empty-state",
341
+ title: "FilterEmptyState",
342
+ importPath: "@open-mercato/ui/backend/filters/FilterEmptyState",
343
+ variants: [
344
+ {
345
+ id: "default",
346
+ title: "Default (panel empty state of AdvancedFilterPanel)",
347
+ render: () => /* @__PURE__ */ jsx(DemoFilterEmptyState, {}),
348
+ code: `import { FilterEmptyState } from '@open-mercato/ui/backend/filters/FilterEmptyState'
349
+
350
+ <FilterEmptyState onAddCondition={openFieldPicker} addConditionRef={addConditionRef} />`
351
+ },
352
+ {
353
+ id: "with-quick-filters",
354
+ title: "With quick filters slot",
355
+ render: () => /* @__PURE__ */ jsx(DemoFilterEmptyState, { withQuickFilters: true }),
356
+ code: `import { FilterEmptyState } from '@open-mercato/ui/backend/filters/FilterEmptyState'
357
+ import { QuickFilters } from '@open-mercato/ui/backend/filters/QuickFilters'
358
+
359
+ <FilterEmptyState
360
+ onAddCondition={openFieldPicker}
361
+ addConditionRef={addConditionRef}
362
+ quickFilters={<QuickFilters presets={presets} userId={userId} onApply={applyTree} />}
363
+ />`
364
+ }
365
+ ]
366
+ };
367
+ const listEmptyStateEntry = {
368
+ id: "list-empty-state",
369
+ title: "ListEmptyState",
370
+ importPath: "@open-mercato/ui/backend/filters/ListEmptyState",
371
+ variants: [
372
+ {
373
+ id: "with-create-action",
374
+ title: "With create action",
375
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-xl", children: /* @__PURE__ */ jsx(ListEmptyState, { entityName: "companies", onCreate: () => {
376
+ }, createLabel: "Add company" }) }),
377
+ code: `import { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'
378
+
379
+ // Pass to DataTable's emptyState for the zero-records case.
380
+ <ListEmptyState entityName="companies" createHref="/backend/customers/companies/create" createLabel="Add company" />`
381
+ },
382
+ {
383
+ id: "custom-copy",
384
+ title: "Custom title and description",
385
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-xl", children: /* @__PURE__ */ jsx(
386
+ ListEmptyState,
387
+ {
388
+ title: "No imports yet",
389
+ description: "Connect a source or upload a CSV file to bring records in."
390
+ }
391
+ ) }),
392
+ code: `import { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'
393
+
394
+ <ListEmptyState
395
+ title="No imports yet"
396
+ description="Connect a source or upload a CSV file to bring records in."
397
+ />`
398
+ }
399
+ ]
400
+ };
401
+ const filteredEmptyResultsEntry = {
402
+ id: "filtered-empty-results",
403
+ title: "FilteredEmptyResults",
404
+ importPath: "@open-mercato/ui/backend/filters/FilteredEmptyResults",
405
+ variants: [
406
+ {
407
+ id: "filters-only",
408
+ title: "Filters active",
409
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-xl", children: /* @__PURE__ */ jsx(
410
+ FilteredEmptyResults,
411
+ {
412
+ entityNamePlural: "companies",
413
+ canRemoveLast: true,
414
+ onClearAll: () => {
415
+ },
416
+ onRemoveLast: () => {
417
+ }
418
+ }
419
+ ) }),
420
+ code: `import { FilteredEmptyResults } from '@open-mercato/ui/backend/filters/FilteredEmptyResults'
421
+
422
+ // DataTable renders this automatically when filters match nothing.
423
+ <FilteredEmptyResults
424
+ entityNamePlural="companies"
425
+ canRemoveLast={tree.root.children.length > 0}
426
+ onClearAll={clearFilters}
427
+ onRemoveLast={removeLastFilter}
428
+ />`
429
+ },
430
+ {
431
+ id: "with-search",
432
+ title: "Search and filters active",
433
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-xl", children: /* @__PURE__ */ jsx(
434
+ FilteredEmptyResults,
435
+ {
436
+ entityNamePlural: "companies",
437
+ canRemoveLast: true,
438
+ onClearAll: () => {
439
+ },
440
+ onRemoveLast: () => {
441
+ },
442
+ onClearSearch: () => {
443
+ }
444
+ }
445
+ ) }),
446
+ code: `import { FilteredEmptyResults } from '@open-mercato/ui/backend/filters/FilteredEmptyResults'
447
+
448
+ // Passing onClearSearch switches to combined copy and clears both at once.
449
+ <FilteredEmptyResults
450
+ entityNamePlural="companies"
451
+ canRemoveLast
452
+ onClearAll={clearFilters}
453
+ onRemoveLast={removeLastFilter}
454
+ onClearSearch={clearSearch}
455
+ />`
456
+ }
457
+ ]
458
+ };
459
+ const searchEmptyResultsEntry = {
460
+ id: "search-empty-results",
461
+ title: "SearchEmptyResults",
462
+ importPath: "@open-mercato/ui/backend/filters/SearchEmptyResults",
463
+ variants: [
464
+ {
465
+ id: "default",
466
+ title: "Default",
467
+ render: () => /* @__PURE__ */ jsx("div", { className: "flex w-full max-w-xl justify-center", children: /* @__PURE__ */ jsx(SearchEmptyResults, { query: "northwind", onClearSearch: () => {
468
+ } }) }),
469
+ code: `import { SearchEmptyResults } from '@open-mercato/ui/backend/filters/SearchEmptyResults'
470
+
471
+ // DataTable renders this automatically when a search matches nothing.
472
+ <SearchEmptyResults query={search} onClearSearch={() => setSearch('')} />`
473
+ },
474
+ {
475
+ id: "with-entity",
476
+ title: "With entity label",
477
+ render: () => /* @__PURE__ */ jsx("div", { className: "flex w-full max-w-xl justify-center", children: /* @__PURE__ */ jsx(
478
+ SearchEmptyResults,
479
+ {
480
+ query: "northwind",
481
+ entityNamePlural: "companies",
482
+ onClearSearch: () => {
483
+ }
484
+ }
485
+ ) }),
486
+ code: `import { SearchEmptyResults } from '@open-mercato/ui/backend/filters/SearchEmptyResults'
487
+
488
+ <SearchEmptyResults query={search} entityNamePlural="companies" onClearSearch={() => setSearch('')} />`
489
+ }
490
+ ]
491
+ };
492
+ const entries = [
493
+ filterBarEntry,
494
+ quickFiltersEntry,
495
+ activeFilterChipsEntry,
496
+ advancedFilterBuilderEntry,
497
+ filterEmptyStateEntry,
498
+ listEmptyStateEntry,
499
+ filteredEmptyResultsEntry,
500
+ searchEmptyResultsEntry
501
+ ];
502
+ export {
503
+ entries
504
+ };
505
+ //# sourceMappingURL=filters.js.map