@open-mercato/core 0.6.7-develop.6828.1.ab1620a63e → 0.6.7-develop.6842.1.8cd8a8883c

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 (181) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/attachments/fields/attachment.js +1 -1
  3. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  4. package/dist/modules/auth/components/UserConsentsPanel.js +9 -9
  5. package/dist/modules/auth/components/UserConsentsPanel.js.map +2 -2
  6. package/dist/modules/auth/frontend/reset.js +2 -2
  7. package/dist/modules/auth/frontend/reset.js.map +2 -2
  8. package/dist/modules/business_rules/components/ActionRow.js +1 -1
  9. package/dist/modules/business_rules/components/ActionRow.js.map +1 -1
  10. package/dist/modules/business_rules/components/ConditionRow.js +8 -4
  11. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  12. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +4 -4
  13. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  14. package/dist/modules/catalog/backend/catalog/products/create/page.js +5 -5
  15. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  16. package/dist/modules/catalog/components/PriceKindSettings.js +3 -3
  17. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  18. package/dist/modules/catalog/components/products/ProductCategorizeSection.js +3 -3
  19. package/dist/modules/catalog/components/products/ProductCategorizeSection.js.map +2 -2
  20. package/dist/modules/catalog/components/products/ProductMediaManager.js +1 -1
  21. package/dist/modules/catalog/components/products/ProductMediaManager.js.map +2 -2
  22. package/dist/modules/catalog/components/products/VariantBuilder.js +5 -5
  23. package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
  24. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +1 -1
  25. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
  26. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js +2 -3
  27. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js.map +2 -2
  28. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +1 -1
  29. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +1 -1
  30. package/dist/modules/dashboards/api/widgets/data/schema.js +26 -17
  31. package/dist/modules/dashboards/api/widgets/data/schema.js.map +2 -2
  32. package/dist/modules/dashboards/lib/aggregations.js +20 -6
  33. package/dist/modules/dashboards/lib/aggregations.js.map +2 -2
  34. package/dist/modules/design_system/gallery/entries/detail.js +8 -8
  35. package/dist/modules/design_system/gallery/entries/detail.js.map +1 -1
  36. package/dist/modules/design_system/gallery/entries/overlays.js +2 -2
  37. package/dist/modules/design_system/gallery/entries/overlays.js.map +2 -2
  38. package/dist/modules/design_system/gallery/entries/scaffolding.js +8 -8
  39. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +1 -1
  40. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +1 -1
  41. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  42. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +6 -6
  43. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
  44. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +3 -3
  45. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
  46. package/dist/modules/messages/components/message-detail/panels/dialogs.js +1 -1
  47. package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +1 -1
  48. package/dist/modules/planner/components/AvailabilityRulesEditor.js +4 -4
  49. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  50. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
  51. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
  52. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +1 -1
  53. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +1 -1
  54. package/dist/modules/workflows/backend/definitions/page.js +1 -1
  55. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  56. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +1 -1
  57. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  58. package/dist/modules/workflows/backend/instances/page.js +8 -8
  59. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  60. package/dist/modules/workflows/backend/tasks/page.js +6 -6
  61. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  62. package/dist/modules/workflows/components/ActivitiesEditor.js +2 -2
  63. package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
  64. package/dist/modules/workflows/components/BusinessRulesSelector.js +1 -1
  65. package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
  66. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +2 -2
  67. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
  68. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +1 -2
  69. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
  70. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +1 -2
  71. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
  72. package/dist/modules/workflows/components/StepsEditor.js +2 -2
  73. package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
  74. package/dist/modules/workflows/components/TransitionsEditor.js +3 -3
  75. package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
  76. package/dist/modules/workflows/components/WorkflowLegend.js +1 -1
  77. package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
  78. package/dist/modules/workflows/components/WorkflowSelector.js +1 -1
  79. package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
  80. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +1 -1
  81. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  82. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +1 -1
  83. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
  84. package/dist/modules/workflows/components/fields/MappingArrayEditor.js +1 -1
  85. package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
  86. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +1 -1
  87. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  88. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js +4 -4
  89. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js.map +2 -2
  90. package/package.json +8 -8
  91. package/src/modules/api_keys/i18n/ko.json +42 -0
  92. package/src/modules/attachments/fields/attachment.tsx +1 -1
  93. package/src/modules/attachments/i18n/ko.json +172 -0
  94. package/src/modules/audit_logs/i18n/ko.json +66 -0
  95. package/src/modules/auth/components/UserConsentsPanel.tsx +9 -9
  96. package/src/modules/auth/frontend/reset.tsx +2 -2
  97. package/src/modules/auth/i18n/ko.json +255 -0
  98. package/src/modules/business_rules/components/ActionRow.tsx +1 -1
  99. package/src/modules/business_rules/components/ConditionRow.tsx +9 -6
  100. package/src/modules/business_rules/i18n/ko.json +396 -0
  101. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +4 -4
  102. package/src/modules/catalog/backend/catalog/products/create/page.tsx +5 -5
  103. package/src/modules/catalog/components/PriceKindSettings.tsx +3 -3
  104. package/src/modules/catalog/components/products/ProductCategorizeSection.tsx +3 -3
  105. package/src/modules/catalog/components/products/ProductMediaManager.tsx +1 -1
  106. package/src/modules/catalog/components/products/VariantBuilder.tsx +5 -5
  107. package/src/modules/catalog/i18n/ko.json +723 -0
  108. package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +1 -1
  109. package/src/modules/communication_channels/i18n/ko.json +138 -0
  110. package/src/modules/configs/i18n/ko.json +197 -0
  111. package/src/modules/currencies/i18n/de.json +1 -0
  112. package/src/modules/currencies/i18n/en.json +1 -0
  113. package/src/modules/currencies/i18n/es.json +1 -0
  114. package/src/modules/currencies/i18n/ko.json +160 -0
  115. package/src/modules/currencies/i18n/pl.json +1 -0
  116. package/src/modules/customer_accounts/i18n/ko.json +354 -0
  117. package/src/modules/customers/components/detail/ActivitiesDayStrip.tsx +2 -3
  118. package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +1 -1
  119. package/src/modules/customers/i18n/de.json +10 -0
  120. package/src/modules/customers/i18n/en.json +10 -0
  121. package/src/modules/customers/i18n/es.json +10 -0
  122. package/src/modules/customers/i18n/ko.json +2855 -0
  123. package/src/modules/customers/i18n/pl.json +10 -0
  124. package/src/modules/dashboards/api/widgets/data/schema.ts +48 -19
  125. package/src/modules/dashboards/i18n/ko.json +118 -0
  126. package/src/modules/dashboards/lib/aggregations.ts +42 -6
  127. package/src/modules/data_sync/i18n/ko.json +125 -0
  128. package/src/modules/design_system/gallery/entries/detail.tsx +8 -8
  129. package/src/modules/design_system/gallery/entries/overlays.tsx +2 -2
  130. package/src/modules/design_system/gallery/entries/scaffolding.tsx +8 -8
  131. package/src/modules/design_system/i18n/de.json +12 -0
  132. package/src/modules/design_system/i18n/en.json +12 -0
  133. package/src/modules/design_system/i18n/es.json +12 -0
  134. package/src/modules/design_system/i18n/ko.json +58 -0
  135. package/src/modules/design_system/i18n/pl.json +12 -0
  136. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +1 -1
  137. package/src/modules/dictionaries/i18n/ko.json +130 -0
  138. package/src/modules/directory/i18n/ko.json +105 -0
  139. package/src/modules/entities/i18n/ko.json +260 -0
  140. package/src/modules/feature_toggles/i18n/ko.json +96 -0
  141. package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +6 -6
  142. package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +3 -3
  143. package/src/modules/inbox_ops/i18n/ko.json +196 -0
  144. package/src/modules/integrations/i18n/ko.json +129 -0
  145. package/src/modules/messages/components/message-detail/panels/dialogs.tsx +1 -1
  146. package/src/modules/messages/i18n/ko.json +263 -0
  147. package/src/modules/notifications/i18n/ko.json +55 -0
  148. package/src/modules/payment_gateways/i18n/ko.json +87 -0
  149. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +4 -4
  150. package/src/modules/planner/i18n/ko.json +565 -0
  151. package/src/modules/portal/i18n/ko.json +143 -0
  152. package/src/modules/progress/i18n/ko.json +20 -0
  153. package/src/modules/query_index/i18n/ko.json +69 -0
  154. package/src/modules/resources/i18n/ko.json +770 -0
  155. package/src/modules/sales/i18n/ko.json +1442 -0
  156. package/src/modules/shipping_carriers/i18n/ko.json +85 -0
  157. package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
  158. package/src/modules/staff/i18n/ko.json +1162 -0
  159. package/src/modules/sync_excel/i18n/ko.json +107 -0
  160. package/src/modules/translations/i18n/ko.json +45 -0
  161. package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +1 -1
  162. package/src/modules/wms/i18n/ko.json +1053 -0
  163. package/src/modules/workflows/backend/definitions/page.tsx +1 -1
  164. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +1 -1
  165. package/src/modules/workflows/backend/instances/page.tsx +8 -8
  166. package/src/modules/workflows/backend/tasks/page.tsx +6 -6
  167. package/src/modules/workflows/components/ActivitiesEditor.tsx +2 -2
  168. package/src/modules/workflows/components/BusinessRulesSelector.tsx +1 -1
  169. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +2 -2
  170. package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +1 -2
  171. package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +1 -2
  172. package/src/modules/workflows/components/StepsEditor.tsx +2 -2
  173. package/src/modules/workflows/components/TransitionsEditor.tsx +3 -3
  174. package/src/modules/workflows/components/WorkflowLegend.tsx +1 -1
  175. package/src/modules/workflows/components/WorkflowSelector.tsx +1 -1
  176. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +1 -1
  177. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +1 -1
  178. package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +1 -1
  179. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +1 -1
  180. package/src/modules/workflows/components/fields/WorkflowSelectorField.tsx +4 -4
  181. package/src/modules/workflows/i18n/ko.json +1203 -0
@@ -124,7 +124,7 @@ import {
124
124
  ] }),
125
125
  /* @__PURE__ */ jsxs(DialogFooter, { layout: "equal", children: [
126
126
  /* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "outline", children: "Cancel" }) }),
127
- /* @__PURE__ */ jsx(Button, { variant: "destructive", children: "Delete" })
127
+ /* @__PURE__ */ jsx(Button, { variant: "destructive-solid", children: "Delete" })
128
128
  ] })
129
129
  ] })
130
130
  ] }),
@@ -156,7 +156,7 @@ import {
156
156
  <DialogClose asChild>
157
157
  <Button variant="outline">Cancel</Button>
158
158
  </DialogClose>
159
- <Button variant="destructive">Delete</Button>
159
+ <Button variant="destructive-solid">Delete</Button>
160
160
  </DialogFooter>
161
161
  </DialogContent>
162
162
  </Dialog>`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/design_system/gallery/entries/overlays.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport {\n FilePlus2,\n Info,\n LayoutDashboard,\n Settings,\n TriangleAlert,\n UserRound,\n Users,\n} from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport {\n Drawer,\n DrawerBody,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from '@open-mercato/ui/primitives/drawer'\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from '@open-mercato/ui/primitives/sheet'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@open-mercato/ui/primitives/popover'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport {\n CommandMenu,\n CommandMenuContent,\n CommandMenuEmpty,\n CommandMenuFooter,\n CommandMenuGroup,\n CommandMenuInput,\n CommandMenuItem,\n CommandMenuList,\n CommandMenuSeparator,\n CommandMenuTrigger,\n} from '@open-mercato/ui/primitives/command-menu'\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//\n// Every stateful overlay renders a REAL trigger in the preview stage and opens\n// uncontrolled \u2014 the actual Radix focus trap, Escape-to-close, and\n// outside-click behavior are exercised live, never imitated.\n\nconst dialogEntry: GalleryEntry = {\n id: 'dialog',\n title: 'Dialog',\n importPath: '@open-mercato/ui/primitives/dialog',\n docsAnchor: '#dialog',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\">Open dialog</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Rename view</DialogTitle>\n <DialogDescription>\n The new name is visible to everyone in this workspace.\n </DialogDescription>\n </DialogHeader>\n <p className=\"text-sm text-muted-foreground\">\n Press Escape or click outside to dismiss.\n </p>\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button>Save changes</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n DialogClose,\n} from '@open-mercato/ui/primitives/dialog'\n\n<Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\">Open dialog</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Rename view</DialogTitle>\n <DialogDescription>\n The new name is visible to everyone in this workspace.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button>Save changes</Button>\n </DialogFooter>\n </DialogContent>\n</Dialog>`,\n },\n {\n id: 'status-leading',\n title: 'Status leading badge',\n render: () => (\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"destructive-outline\">Delete record</Button>\n </DialogTrigger>\n <DialogContent size=\"sm\">\n <DialogHeader leading={<TriangleAlert className=\"size-4\" />} leadingTone=\"error\">\n <DialogTitle>Delete this record?</DialogTitle>\n <DialogDescription>\n This removes the record from every linked view.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter layout=\"equal\">\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button variant=\"destructive\">Delete</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n ),\n code: `import { TriangleAlert } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n DialogClose,\n} from '@open-mercato/ui/primitives/dialog'\n\n<Dialog>\n <DialogTrigger asChild>\n <Button variant=\"destructive-outline\">Delete record</Button>\n </DialogTrigger>\n <DialogContent size=\"sm\">\n <DialogHeader leading={<TriangleAlert className=\"size-4\" />} leadingTone=\"error\">\n <DialogTitle>Delete this record?</DialogTitle>\n <DialogDescription>\n This removes the record from every linked view.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter layout=\"equal\">\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button variant=\"destructive\">Delete</Button>\n </DialogFooter>\n </DialogContent>\n</Dialog>`,\n },\n ],\n}\n\nconst drawerEntry: GalleryEntry = {\n id: 'drawer',\n title: 'Drawer',\n importPath: '@open-mercato/ui/primitives/drawer',\n docsAnchor: '#drawer',\n figmaNodeId: '486:7366',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <Drawer>\n <DrawerTrigger asChild>\n <Button variant=\"outline\">Open drawer</Button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>Edit person</DrawerTitle>\n <DrawerDescription>Update the contact details below.</DrawerDescription>\n </DrawerHeader>\n <DrawerBody>\n <div className=\"divide-y divide-input text-sm\">\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-muted-foreground\">Name</span>\n <span className=\"text-foreground\">Anna Kowalska</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-muted-foreground\">Role</span>\n <span className=\"text-foreground\">Account manager</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-muted-foreground\">Team</span>\n <span className=\"text-foreground\">Sales EU</span>\n </div>\n </div>\n </DrawerBody>\n <DrawerFooter layout=\"equal\">\n <DrawerClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DrawerClose>\n <Button>Save changes</Button>\n </DrawerFooter>\n </DrawerContent>\n </Drawer>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Drawer,\n DrawerTrigger,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerDescription,\n DrawerBody,\n DrawerFooter,\n DrawerClose,\n} from '@open-mercato/ui/primitives/drawer'\n\n<Drawer>\n <DrawerTrigger asChild>\n <Button variant=\"outline\">Open drawer</Button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>Edit person</DrawerTitle>\n <DrawerDescription>Update the contact details below.</DrawerDescription>\n </DrawerHeader>\n <DrawerBody>{/* content */}</DrawerBody>\n <DrawerFooter layout=\"equal\">\n <DrawerClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DrawerClose>\n <Button>Save changes</Button>\n </DrawerFooter>\n </DrawerContent>\n</Drawer>`,\n },\n {\n id: 'leading-icon',\n title: 'Header leading icon',\n render: () => (\n <Drawer>\n <DrawerTrigger asChild>\n <Button variant=\"outline\">Open profile drawer</Button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader leading={<UserRound className=\"size-4\" />}>\n <DrawerTitle>Profile details</DrawerTitle>\n <DrawerDescription>Read-only summary of this account.</DrawerDescription>\n </DrawerHeader>\n <DrawerBody>\n <p className=\"text-sm text-muted-foreground\">\n The header badge takes any Lucide icon via the <code>leading</code> prop.\n </p>\n </DrawerBody>\n <DrawerFooter layout=\"equal\">\n <DrawerClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DrawerClose>\n <Button>Continue</Button>\n </DrawerFooter>\n </DrawerContent>\n </Drawer>\n ),\n code: `import { UserRound } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Drawer,\n DrawerTrigger,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerDescription,\n DrawerBody,\n DrawerFooter,\n DrawerClose,\n} from '@open-mercato/ui/primitives/drawer'\n\n<Drawer>\n <DrawerTrigger asChild>\n <Button variant=\"outline\">Open profile drawer</Button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader leading={<UserRound className=\"size-4\" />}>\n <DrawerTitle>Profile details</DrawerTitle>\n <DrawerDescription>Read-only summary of this account.</DrawerDescription>\n </DrawerHeader>\n <DrawerBody>{/* content */}</DrawerBody>\n <DrawerFooter layout=\"equal\">\n <DrawerClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DrawerClose>\n <Button>Continue</Button>\n </DrawerFooter>\n </DrawerContent>\n</Drawer>`,\n },\n ],\n}\n\nconst sheetEntry: GalleryEntry = {\n id: 'sheet',\n title: 'Sheet',\n importPath: '@open-mercato/ui/primitives/sheet',\n variants: [\n {\n id: 'right',\n title: 'right (default)',\n render: () => (\n <Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open sheet</Button>\n </SheetTrigger>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Filters</SheetTitle>\n <SheetDescription>Narrow down the current list.</SheetDescription>\n </SheetHeader>\n <div className=\"flex-1 px-4 text-sm text-muted-foreground\">\n Sheet body content scrolls independently of the header and footer.\n </div>\n <SheetFooter>\n <Button variant=\"outline\">Reset</Button>\n <Button>Apply</Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Sheet,\n SheetTrigger,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetFooter,\n} from '@open-mercato/ui/primitives/sheet'\n\n<Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open sheet</Button>\n </SheetTrigger>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Filters</SheetTitle>\n <SheetDescription>Narrow down the current list.</SheetDescription>\n </SheetHeader>\n {/* body */}\n <SheetFooter>\n <Button variant=\"outline\">Reset</Button>\n <Button>Apply</Button>\n </SheetFooter>\n </SheetContent>\n</Sheet>`,\n },\n {\n id: 'left',\n title: 'side=\"left\"',\n render: () => (\n <Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open left sheet</Button>\n </SheetTrigger>\n <SheetContent side=\"left\">\n <SheetHeader>\n <SheetTitle>Navigation</SheetTitle>\n <SheetDescription>Slides in from the left edge.</SheetDescription>\n </SheetHeader>\n <div className=\"flex-1 px-4 text-sm text-muted-foreground\">\n Use the left side for mobile menus and secondary navigation.\n </div>\n </SheetContent>\n </Sheet>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Sheet,\n SheetTrigger,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n} from '@open-mercato/ui/primitives/sheet'\n\n<Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open left sheet</Button>\n </SheetTrigger>\n <SheetContent side=\"left\">\n <SheetHeader>\n <SheetTitle>Navigation</SheetTitle>\n <SheetDescription>Slides in from the left edge.</SheetDescription>\n </SheetHeader>\n {/* body */}\n </SheetContent>\n</Sheet>`,\n },\n ],\n}\n\nconst popoverEntry: GalleryEntry = {\n id: 'popover',\n title: 'Popover',\n importPath: '@open-mercato/ui/primitives/popover',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open popover</Button>\n </PopoverTrigger>\n <PopoverContent className=\"p-4\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-medium text-foreground\">Display density</span>\n <span className=\"text-sm text-muted-foreground\">\n Anchored to its trigger; Escape and outside-click dismiss it.\n </span>\n </div>\n </PopoverContent>\n </Popover>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@open-mercato/ui/primitives/popover'\n\n<Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open popover</Button>\n </PopoverTrigger>\n <PopoverContent className=\"p-4\">\n {/* content */}\n </PopoverContent>\n</Popover>`,\n },\n {\n id: 'align-end',\n title: 'align=\"end\" + side=\"top\"',\n render: () => (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open above</Button>\n </PopoverTrigger>\n <PopoverContent side=\"top\" align=\"end\" className=\"p-4\">\n <span className=\"text-sm text-muted-foreground\">\n Placement follows Radix side/align props and flips when space runs out.\n </span>\n </PopoverContent>\n </Popover>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@open-mercato/ui/primitives/popover'\n\n<Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open above</Button>\n </PopoverTrigger>\n <PopoverContent side=\"top\" align=\"end\" className=\"p-4\">\n {/* content */}\n </PopoverContent>\n</Popover>`,\n },\n ],\n}\n\nconst tooltipEntry: GalleryEntry = {\n id: 'tooltip',\n title: 'Tooltip',\n importPath: '@open-mercato/ui/primitives/tooltip',\n docsAnchor: '#tooltip--simpletooltip',\n variants: [\n {\n id: 'default',\n title: 'default (dark)',\n render: () => (\n <SimpleTooltip content=\"Duplicates this view with all filters\">\n <Button variant=\"outline\">Hover me</Button>\n </SimpleTooltip>\n ),\n code: `import { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<SimpleTooltip content=\"Duplicates this view with all filters\">\n <Button variant=\"outline\">Hover me</Button>\n</SimpleTooltip>`,\n },\n {\n id: 'light',\n title: 'light',\n render: () => (\n <SimpleTooltip content=\"Help text on a light surface\" variant=\"light\">\n <Button variant=\"outline\">\n <Info />\n Light variant\n </Button>\n </SimpleTooltip>\n ),\n code: `import { Info } from 'lucide-react'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<SimpleTooltip content=\"Help text on a light surface\" variant=\"light\">\n <Button variant=\"outline\"><Info />Light variant</Button>\n</SimpleTooltip>`,\n },\n {\n id: 'sizes',\n title: 'Sizes',\n render: () => (\n <>\n <SimpleTooltip content=\"Small\" size=\"sm\">\n <Button variant=\"outline\" size=\"sm\">sm</Button>\n </SimpleTooltip>\n <SimpleTooltip content=\"Default\">\n <Button variant=\"outline\" size=\"sm\">default</Button>\n </SimpleTooltip>\n <SimpleTooltip content=\"Large tooltip for longer helper copy\" size=\"lg\">\n <Button variant=\"outline\" size=\"sm\">lg</Button>\n </SimpleTooltip>\n </>\n ),\n code: `import { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<SimpleTooltip content=\"Small\" size=\"sm\">\n <Button variant=\"outline\" size=\"sm\">sm</Button>\n</SimpleTooltip>\n<SimpleTooltip content=\"Default\">\n <Button variant=\"outline\" size=\"sm\">default</Button>\n</SimpleTooltip>\n<SimpleTooltip content=\"Large tooltip for longer helper copy\" size=\"lg\">\n <Button variant=\"outline\" size=\"sm\">lg</Button>\n</SimpleTooltip>`,\n },\n ],\n}\n\nconst commandMenuEntry: GalleryEntry = {\n id: 'command-menu',\n title: 'CommandMenu',\n importPath: '@open-mercato/ui/primitives/command-menu',\n docsAnchor: '#commandmenu',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <CommandMenu>\n <CommandMenuTrigger asChild>\n <Button variant=\"outline\">Open command menu</Button>\n </CommandMenuTrigger>\n <CommandMenuContent>\n <CommandMenuInput placeholder=\"Search actions...\" />\n <CommandMenuList>\n <CommandMenuEmpty>No results.</CommandMenuEmpty>\n <CommandMenuGroup heading=\"Actions\">\n <CommandMenuItem leading={<FilePlus2 className=\"size-4 text-muted-foreground\" />}>\n Create record\n </CommandMenuItem>\n <CommandMenuItem leading={<Users className=\"size-4 text-muted-foreground\" />} description=\"Invite teammates to this workspace\">\n Manage members\n </CommandMenuItem>\n </CommandMenuGroup>\n <CommandMenuSeparator />\n <CommandMenuGroup heading=\"Navigate\">\n <CommandMenuItem leading={<LayoutDashboard className=\"size-4 text-muted-foreground\" />}>\n Go to dashboard\n </CommandMenuItem>\n <CommandMenuItem leading={<Settings className=\"size-4 text-muted-foreground\" />}>\n Open settings\n </CommandMenuItem>\n </CommandMenuGroup>\n </CommandMenuList>\n <CommandMenuFooter />\n </CommandMenuContent>\n </CommandMenu>\n ),\n code: `import { FilePlus2, LayoutDashboard, Settings, Users } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n CommandMenu,\n CommandMenuTrigger,\n CommandMenuContent,\n CommandMenuInput,\n CommandMenuList,\n CommandMenuEmpty,\n CommandMenuGroup,\n CommandMenuItem,\n CommandMenuSeparator,\n CommandMenuFooter,\n} from '@open-mercato/ui/primitives/command-menu'\n\n<CommandMenu>\n <CommandMenuTrigger asChild>\n <Button variant=\"outline\">Open command menu</Button>\n </CommandMenuTrigger>\n <CommandMenuContent>\n <CommandMenuInput placeholder=\"Search actions...\" />\n <CommandMenuList>\n <CommandMenuEmpty>No results.</CommandMenuEmpty>\n <CommandMenuGroup heading=\"Actions\">\n <CommandMenuItem leading={<FilePlus2 className=\"size-4\" />}>\n Create record\n </CommandMenuItem>\n <CommandMenuItem leading={<Users className=\"size-4\" />} description=\"Invite teammates to this workspace\">\n Manage members\n </CommandMenuItem>\n </CommandMenuGroup>\n <CommandMenuSeparator />\n <CommandMenuGroup heading=\"Navigate\">\n <CommandMenuItem leading={<LayoutDashboard className=\"size-4\" />}>\n Go to dashboard\n </CommandMenuItem>\n <CommandMenuItem leading={<Settings className=\"size-4\" />}>\n Open settings\n </CommandMenuItem>\n </CommandMenuGroup>\n </CommandMenuList>\n <CommandMenuFooter />\n </CommandMenuContent>\n</CommandMenu>`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n dialogEntry,\n drawerEntry,\n sheetEntry,\n popoverEntry,\n tooltipEntry,\n commandMenuEntry,\n]\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as React from 'react'\nimport {\n FilePlus2,\n Info,\n LayoutDashboard,\n Settings,\n TriangleAlert,\n UserRound,\n Users,\n} from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport {\n Drawer,\n DrawerBody,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from '@open-mercato/ui/primitives/drawer'\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from '@open-mercato/ui/primitives/sheet'\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@open-mercato/ui/primitives/popover'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport {\n CommandMenu,\n CommandMenuContent,\n CommandMenuEmpty,\n CommandMenuFooter,\n CommandMenuGroup,\n CommandMenuInput,\n CommandMenuItem,\n CommandMenuList,\n CommandMenuSeparator,\n CommandMenuTrigger,\n} from '@open-mercato/ui/primitives/command-menu'\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//\n// Every stateful overlay renders a REAL trigger in the preview stage and opens\n// uncontrolled \u2014 the actual Radix focus trap, Escape-to-close, and\n// outside-click behavior are exercised live, never imitated.\n\nconst dialogEntry: GalleryEntry = {\n id: 'dialog',\n title: 'Dialog',\n importPath: '@open-mercato/ui/primitives/dialog',\n docsAnchor: '#dialog',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\">Open dialog</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Rename view</DialogTitle>\n <DialogDescription>\n The new name is visible to everyone in this workspace.\n </DialogDescription>\n </DialogHeader>\n <p className=\"text-sm text-muted-foreground\">\n Press Escape or click outside to dismiss.\n </p>\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button>Save changes</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n DialogClose,\n} from '@open-mercato/ui/primitives/dialog'\n\n<Dialog>\n <DialogTrigger asChild>\n <Button variant=\"outline\">Open dialog</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Rename view</DialogTitle>\n <DialogDescription>\n The new name is visible to everyone in this workspace.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button>Save changes</Button>\n </DialogFooter>\n </DialogContent>\n</Dialog>`,\n },\n {\n id: 'status-leading',\n title: 'Status leading badge',\n render: () => (\n <Dialog>\n <DialogTrigger asChild>\n <Button variant=\"destructive-outline\">Delete record</Button>\n </DialogTrigger>\n <DialogContent size=\"sm\">\n <DialogHeader leading={<TriangleAlert className=\"size-4\" />} leadingTone=\"error\">\n <DialogTitle>Delete this record?</DialogTitle>\n <DialogDescription>\n This removes the record from every linked view.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter layout=\"equal\">\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button variant=\"destructive-solid\">Delete</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n ),\n code: `import { TriangleAlert } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n DialogClose,\n} from '@open-mercato/ui/primitives/dialog'\n\n<Dialog>\n <DialogTrigger asChild>\n <Button variant=\"destructive-outline\">Delete record</Button>\n </DialogTrigger>\n <DialogContent size=\"sm\">\n <DialogHeader leading={<TriangleAlert className=\"size-4\" />} leadingTone=\"error\">\n <DialogTitle>Delete this record?</DialogTitle>\n <DialogDescription>\n This removes the record from every linked view.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter layout=\"equal\">\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button variant=\"destructive-solid\">Delete</Button>\n </DialogFooter>\n </DialogContent>\n</Dialog>`,\n },\n ],\n}\n\nconst drawerEntry: GalleryEntry = {\n id: 'drawer',\n title: 'Drawer',\n importPath: '@open-mercato/ui/primitives/drawer',\n docsAnchor: '#drawer',\n figmaNodeId: '486:7366',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <Drawer>\n <DrawerTrigger asChild>\n <Button variant=\"outline\">Open drawer</Button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>Edit person</DrawerTitle>\n <DrawerDescription>Update the contact details below.</DrawerDescription>\n </DrawerHeader>\n <DrawerBody>\n <div className=\"divide-y divide-input text-sm\">\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-muted-foreground\">Name</span>\n <span className=\"text-foreground\">Anna Kowalska</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-muted-foreground\">Role</span>\n <span className=\"text-foreground\">Account manager</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-muted-foreground\">Team</span>\n <span className=\"text-foreground\">Sales EU</span>\n </div>\n </div>\n </DrawerBody>\n <DrawerFooter layout=\"equal\">\n <DrawerClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DrawerClose>\n <Button>Save changes</Button>\n </DrawerFooter>\n </DrawerContent>\n </Drawer>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Drawer,\n DrawerTrigger,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerDescription,\n DrawerBody,\n DrawerFooter,\n DrawerClose,\n} from '@open-mercato/ui/primitives/drawer'\n\n<Drawer>\n <DrawerTrigger asChild>\n <Button variant=\"outline\">Open drawer</Button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>Edit person</DrawerTitle>\n <DrawerDescription>Update the contact details below.</DrawerDescription>\n </DrawerHeader>\n <DrawerBody>{/* content */}</DrawerBody>\n <DrawerFooter layout=\"equal\">\n <DrawerClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DrawerClose>\n <Button>Save changes</Button>\n </DrawerFooter>\n </DrawerContent>\n</Drawer>`,\n },\n {\n id: 'leading-icon',\n title: 'Header leading icon',\n render: () => (\n <Drawer>\n <DrawerTrigger asChild>\n <Button variant=\"outline\">Open profile drawer</Button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader leading={<UserRound className=\"size-4\" />}>\n <DrawerTitle>Profile details</DrawerTitle>\n <DrawerDescription>Read-only summary of this account.</DrawerDescription>\n </DrawerHeader>\n <DrawerBody>\n <p className=\"text-sm text-muted-foreground\">\n The header badge takes any Lucide icon via the <code>leading</code> prop.\n </p>\n </DrawerBody>\n <DrawerFooter layout=\"equal\">\n <DrawerClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DrawerClose>\n <Button>Continue</Button>\n </DrawerFooter>\n </DrawerContent>\n </Drawer>\n ),\n code: `import { UserRound } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Drawer,\n DrawerTrigger,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerDescription,\n DrawerBody,\n DrawerFooter,\n DrawerClose,\n} from '@open-mercato/ui/primitives/drawer'\n\n<Drawer>\n <DrawerTrigger asChild>\n <Button variant=\"outline\">Open profile drawer</Button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader leading={<UserRound className=\"size-4\" />}>\n <DrawerTitle>Profile details</DrawerTitle>\n <DrawerDescription>Read-only summary of this account.</DrawerDescription>\n </DrawerHeader>\n <DrawerBody>{/* content */}</DrawerBody>\n <DrawerFooter layout=\"equal\">\n <DrawerClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DrawerClose>\n <Button>Continue</Button>\n </DrawerFooter>\n </DrawerContent>\n</Drawer>`,\n },\n ],\n}\n\nconst sheetEntry: GalleryEntry = {\n id: 'sheet',\n title: 'Sheet',\n importPath: '@open-mercato/ui/primitives/sheet',\n variants: [\n {\n id: 'right',\n title: 'right (default)',\n render: () => (\n <Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open sheet</Button>\n </SheetTrigger>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Filters</SheetTitle>\n <SheetDescription>Narrow down the current list.</SheetDescription>\n </SheetHeader>\n <div className=\"flex-1 px-4 text-sm text-muted-foreground\">\n Sheet body content scrolls independently of the header and footer.\n </div>\n <SheetFooter>\n <Button variant=\"outline\">Reset</Button>\n <Button>Apply</Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Sheet,\n SheetTrigger,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetFooter,\n} from '@open-mercato/ui/primitives/sheet'\n\n<Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open sheet</Button>\n </SheetTrigger>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Filters</SheetTitle>\n <SheetDescription>Narrow down the current list.</SheetDescription>\n </SheetHeader>\n {/* body */}\n <SheetFooter>\n <Button variant=\"outline\">Reset</Button>\n <Button>Apply</Button>\n </SheetFooter>\n </SheetContent>\n</Sheet>`,\n },\n {\n id: 'left',\n title: 'side=\"left\"',\n render: () => (\n <Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open left sheet</Button>\n </SheetTrigger>\n <SheetContent side=\"left\">\n <SheetHeader>\n <SheetTitle>Navigation</SheetTitle>\n <SheetDescription>Slides in from the left edge.</SheetDescription>\n </SheetHeader>\n <div className=\"flex-1 px-4 text-sm text-muted-foreground\">\n Use the left side for mobile menus and secondary navigation.\n </div>\n </SheetContent>\n </Sheet>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Sheet,\n SheetTrigger,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n} from '@open-mercato/ui/primitives/sheet'\n\n<Sheet>\n <SheetTrigger asChild>\n <Button variant=\"outline\">Open left sheet</Button>\n </SheetTrigger>\n <SheetContent side=\"left\">\n <SheetHeader>\n <SheetTitle>Navigation</SheetTitle>\n <SheetDescription>Slides in from the left edge.</SheetDescription>\n </SheetHeader>\n {/* body */}\n </SheetContent>\n</Sheet>`,\n },\n ],\n}\n\nconst popoverEntry: GalleryEntry = {\n id: 'popover',\n title: 'Popover',\n importPath: '@open-mercato/ui/primitives/popover',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open popover</Button>\n </PopoverTrigger>\n <PopoverContent className=\"p-4\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-medium text-foreground\">Display density</span>\n <span className=\"text-sm text-muted-foreground\">\n Anchored to its trigger; Escape and outside-click dismiss it.\n </span>\n </div>\n </PopoverContent>\n </Popover>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@open-mercato/ui/primitives/popover'\n\n<Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open popover</Button>\n </PopoverTrigger>\n <PopoverContent className=\"p-4\">\n {/* content */}\n </PopoverContent>\n</Popover>`,\n },\n {\n id: 'align-end',\n title: 'align=\"end\" + side=\"top\"',\n render: () => (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open above</Button>\n </PopoverTrigger>\n <PopoverContent side=\"top\" align=\"end\" className=\"p-4\">\n <span className=\"text-sm text-muted-foreground\">\n Placement follows Radix side/align props and flips when space runs out.\n </span>\n </PopoverContent>\n </Popover>\n ),\n code: `import { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@open-mercato/ui/primitives/popover'\n\n<Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open above</Button>\n </PopoverTrigger>\n <PopoverContent side=\"top\" align=\"end\" className=\"p-4\">\n {/* content */}\n </PopoverContent>\n</Popover>`,\n },\n ],\n}\n\nconst tooltipEntry: GalleryEntry = {\n id: 'tooltip',\n title: 'Tooltip',\n importPath: '@open-mercato/ui/primitives/tooltip',\n docsAnchor: '#tooltip--simpletooltip',\n variants: [\n {\n id: 'default',\n title: 'default (dark)',\n render: () => (\n <SimpleTooltip content=\"Duplicates this view with all filters\">\n <Button variant=\"outline\">Hover me</Button>\n </SimpleTooltip>\n ),\n code: `import { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<SimpleTooltip content=\"Duplicates this view with all filters\">\n <Button variant=\"outline\">Hover me</Button>\n</SimpleTooltip>`,\n },\n {\n id: 'light',\n title: 'light',\n render: () => (\n <SimpleTooltip content=\"Help text on a light surface\" variant=\"light\">\n <Button variant=\"outline\">\n <Info />\n Light variant\n </Button>\n </SimpleTooltip>\n ),\n code: `import { Info } from 'lucide-react'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<SimpleTooltip content=\"Help text on a light surface\" variant=\"light\">\n <Button variant=\"outline\"><Info />Light variant</Button>\n</SimpleTooltip>`,\n },\n {\n id: 'sizes',\n title: 'Sizes',\n render: () => (\n <>\n <SimpleTooltip content=\"Small\" size=\"sm\">\n <Button variant=\"outline\" size=\"sm\">sm</Button>\n </SimpleTooltip>\n <SimpleTooltip content=\"Default\">\n <Button variant=\"outline\" size=\"sm\">default</Button>\n </SimpleTooltip>\n <SimpleTooltip content=\"Large tooltip for longer helper copy\" size=\"lg\">\n <Button variant=\"outline\" size=\"sm\">lg</Button>\n </SimpleTooltip>\n </>\n ),\n code: `import { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<SimpleTooltip content=\"Small\" size=\"sm\">\n <Button variant=\"outline\" size=\"sm\">sm</Button>\n</SimpleTooltip>\n<SimpleTooltip content=\"Default\">\n <Button variant=\"outline\" size=\"sm\">default</Button>\n</SimpleTooltip>\n<SimpleTooltip content=\"Large tooltip for longer helper copy\" size=\"lg\">\n <Button variant=\"outline\" size=\"sm\">lg</Button>\n</SimpleTooltip>`,\n },\n ],\n}\n\nconst commandMenuEntry: GalleryEntry = {\n id: 'command-menu',\n title: 'CommandMenu',\n importPath: '@open-mercato/ui/primitives/command-menu',\n docsAnchor: '#commandmenu',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <CommandMenu>\n <CommandMenuTrigger asChild>\n <Button variant=\"outline\">Open command menu</Button>\n </CommandMenuTrigger>\n <CommandMenuContent>\n <CommandMenuInput placeholder=\"Search actions...\" />\n <CommandMenuList>\n <CommandMenuEmpty>No results.</CommandMenuEmpty>\n <CommandMenuGroup heading=\"Actions\">\n <CommandMenuItem leading={<FilePlus2 className=\"size-4 text-muted-foreground\" />}>\n Create record\n </CommandMenuItem>\n <CommandMenuItem leading={<Users className=\"size-4 text-muted-foreground\" />} description=\"Invite teammates to this workspace\">\n Manage members\n </CommandMenuItem>\n </CommandMenuGroup>\n <CommandMenuSeparator />\n <CommandMenuGroup heading=\"Navigate\">\n <CommandMenuItem leading={<LayoutDashboard className=\"size-4 text-muted-foreground\" />}>\n Go to dashboard\n </CommandMenuItem>\n <CommandMenuItem leading={<Settings className=\"size-4 text-muted-foreground\" />}>\n Open settings\n </CommandMenuItem>\n </CommandMenuGroup>\n </CommandMenuList>\n <CommandMenuFooter />\n </CommandMenuContent>\n </CommandMenu>\n ),\n code: `import { FilePlus2, LayoutDashboard, Settings, Users } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n CommandMenu,\n CommandMenuTrigger,\n CommandMenuContent,\n CommandMenuInput,\n CommandMenuList,\n CommandMenuEmpty,\n CommandMenuGroup,\n CommandMenuItem,\n CommandMenuSeparator,\n CommandMenuFooter,\n} from '@open-mercato/ui/primitives/command-menu'\n\n<CommandMenu>\n <CommandMenuTrigger asChild>\n <Button variant=\"outline\">Open command menu</Button>\n </CommandMenuTrigger>\n <CommandMenuContent>\n <CommandMenuInput placeholder=\"Search actions...\" />\n <CommandMenuList>\n <CommandMenuEmpty>No results.</CommandMenuEmpty>\n <CommandMenuGroup heading=\"Actions\">\n <CommandMenuItem leading={<FilePlus2 className=\"size-4\" />}>\n Create record\n </CommandMenuItem>\n <CommandMenuItem leading={<Users className=\"size-4\" />} description=\"Invite teammates to this workspace\">\n Manage members\n </CommandMenuItem>\n </CommandMenuGroup>\n <CommandMenuSeparator />\n <CommandMenuGroup heading=\"Navigate\">\n <CommandMenuItem leading={<LayoutDashboard className=\"size-4\" />}>\n Go to dashboard\n </CommandMenuItem>\n <CommandMenuItem leading={<Settings className=\"size-4\" />}>\n Open settings\n </CommandMenuItem>\n </CommandMenuGroup>\n </CommandMenuList>\n <CommandMenuFooter />\n </CommandMenuContent>\n</CommandMenu>`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n dialogEntry,\n drawerEntry,\n sheetEntry,\n popoverEntry,\n tooltipEntry,\n commandMenuEntry,\n]\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -66,7 +66,7 @@ const pageEntry = {
66
66
  code: `import { Page, PageBody, PageHeader } from '@open-mercato/ui/backend/Page'
67
67
 
68
68
  <Page>
69
- <PageHeader title={t('currencies.list.title')} description={t('currencies.list.description')} />
69
+ <PageHeader title={t('currencies.list.title')} description={t('design_system.gallery.samples.listDescription')} />
70
70
  <PageBody>{/* DataTable, sections\u2026 */}</PageBody>
71
71
  </Page>`
72
72
  },
@@ -133,7 +133,7 @@ import { SectionHeader } from '@open-mercato/ui/backend/SectionHeader'
133
133
  import { Button } from '@open-mercato/ui/primitives/button'
134
134
 
135
135
  <SectionHeader
136
- title={t('customers.people.detail.addresses.title')}
136
+ title={t('design_system.gallery.samples.addresses.title')}
137
137
  count={addresses.length}
138
138
  action={<Button variant="ghost" size="sm"><Plus className="size-4" /> {t('common.add')}</Button>}
139
139
  />`
@@ -144,7 +144,7 @@ import { Button } from '@open-mercato/ui/primitives/button'
144
144
  render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(CollapsibleSection, { title: "Billing details", count: 2, children: /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-dashed p-4 text-sm text-muted-foreground", children: "Section content" }) }) }),
145
145
  code: `import { CollapsibleSection } from '@open-mercato/ui/backend/SectionHeader'
146
146
 
147
- <CollapsibleSection title={t('billing.details.title')} count={2}>
147
+ <CollapsibleSection title={t('design_system.gallery.samples.billingDetails')} count={2}>
148
148
  {/* section content */}
149
149
  </CollapsibleSection>`
150
150
  }
@@ -173,7 +173,7 @@ const sections: SectionNavGroup[] = [
173
173
  },
174
174
  ]
175
175
 
176
- <SectionPage title={t('profile.title')} sections={sections} activePath={pathname}>
176
+ <SectionPage title={t('profile.page.title')} sections={sections} activePath={pathname}>
177
177
  {children}
178
178
  </SectionPage>`
179
179
  },
@@ -186,7 +186,7 @@ const sections: SectionNavGroup[] = [
186
186
  const [collapsed, setCollapsed] = React.useState(false)
187
187
 
188
188
  <SectionNav
189
- title={t('profile.title')}
189
+ title={t('profile.page.title')}
190
190
  sections={sections}
191
191
  activePath={pathname}
192
192
  collapsed={collapsed}
@@ -221,7 +221,7 @@ const formHeaderEntry = {
221
221
  <FormHeader
222
222
  backHref="/backend/products"
223
223
  backLabel={t('ui.navigation.back')}
224
- title={t('products.edit.title')}
224
+ title={t('catalog.products.edit.title')}
225
225
  actions={{
226
226
  cancelHref: '/backend/products',
227
227
  cancelLabel: t('ui.forms.actions.cancel'),
@@ -258,9 +258,9 @@ import { FormHeader } from '@open-mercato/ui/backend/forms'
258
258
  <FormHeader
259
259
  mode="detail"
260
260
  backHref="/backend/customers/companies"
261
- entityTypeLabel={t('customers.companies.detail.entityType')}
261
+ entityTypeLabel={t('design_system.gallery.samples.entityType')}
262
262
  title={company.name}
263
- subtitle={t('customers.companies.detail.createdAt', { date: createdAt })}
263
+ subtitle={t('design_system.gallery.samples.createdAt', { date: createdAt })}
264
264
  statusBadge={<Badge variant="muted">{statusLabel}</Badge>}
265
265
  menuActions={[
266
266
  { id: 'duplicate', label: t('ui.actions.duplicate'), icon: Copy, onSelect: duplicate },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/design_system/gallery/entries/scaffolding.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport { Archive, Copy, Download, Lock, Plus, Trash2, UserRound } from 'lucide-react'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Page, PageBody, PageHeader } from '@open-mercato/ui/backend/Page'\nimport { CollapsibleSection, SectionHeader } from '@open-mercato/ui/backend/SectionHeader'\nimport {\n SectionNav,\n SectionPage,\n type SectionNavGroup,\n} from '@open-mercato/ui/backend/section-page'\nimport {\n ActionsDropdown,\n FormFooter,\n FormHeader,\n type ActionItem,\n} from '@open-mercato/ui/backend/forms'\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\n// The demos use `#`-anchors as hrefs so clicking inside the gallery never\n// navigates away, and every callback is a no-op.\n\nconst demoSections: SectionNavGroup[] = [\n {\n id: 'account',\n label: 'Account',\n items: [\n { id: 'profile', label: 'Profile', href: '#profile', icon: <UserRound className=\"size-4\" /> },\n { id: 'security', label: 'Security', href: '#security', icon: <Lock className=\"size-4\" /> },\n ],\n },\n]\n\n// SectionPage stretches to the viewport by design \u2014 the miniature demo clips\n// it inside a fixed-height frame so the two-item nav plus content stay small.\nfunction SectionPageMiniDemo() {\n return (\n <div className=\"h-80 w-full overflow-hidden rounded-lg border bg-background\">\n <SectionPage title=\"Settings\" sections={demoSections} activePath=\"#profile\">\n <div className=\"space-y-2\">\n <h2 className=\"text-sm font-semibold\">Profile</h2>\n <p className=\"text-sm text-muted-foreground\">Section content renders here.</p>\n </div>\n </SectionPage>\n </div>\n )\n}\n\n// SectionNav is controlled \u2014 the demo owns the collapsed state.\nfunction SectionNavDemo() {\n const [collapsed, setCollapsed] = React.useState(false)\n return (\n <div className=\"w-64 rounded-lg border bg-background px-3 py-4\">\n <SectionNav\n title=\"Settings\"\n sections={demoSections}\n activePath=\"#profile\"\n collapsed={collapsed}\n onToggleCollapse={() => setCollapsed((value) => !value)}\n />\n </div>\n )\n}\n\nconst demoActions: ActionItem[] = [\n { id: 'duplicate', label: 'Duplicate record', icon: Copy, onSelect: () => {} },\n { id: 'export', label: 'Export as CSV', icon: Download, onSelect: () => {} },\n { id: 'delete', label: 'Delete record', icon: Trash2, onSelect: () => {} },\n]\n\nconst pageEntry: GalleryEntry = {\n id: 'page',\n title: 'Page',\n importPath: '@open-mercato/ui/backend/Page',\n variants: [\n {\n id: 'basic',\n title: 'Page + PageHeader + PageBody',\n render: () => (\n <div className=\"w-full\">\n <Page>\n <PageHeader title=\"Currencies\" description=\"Exchange rates refresh nightly.\" />\n <PageBody>\n <div className=\"rounded-lg border border-dashed p-6 text-sm text-muted-foreground\">\n Page content\n </div>\n </PageBody>\n </Page>\n </div>\n ),\n code: `import { Page, PageBody, PageHeader } from '@open-mercato/ui/backend/Page'\n\n<Page>\n <PageHeader title={t('currencies.list.title')} description={t('currencies.list.description')} />\n <PageBody>{/* DataTable, sections\u2026 */}</PageBody>\n</Page>`,\n },\n {\n id: 'with-actions',\n title: 'Header actions',\n render: () => (\n <div className=\"w-full\">\n <Page>\n <PageHeader\n title=\"Currencies\"\n description=\"Exchange rates refresh nightly.\"\n actions={\n <>\n <Button variant=\"outline\" size=\"sm\">\n Import\n </Button>\n <Button size=\"sm\">\n <Plus className=\"size-4\" /> Add currency\n </Button>\n </>\n }\n />\n <PageBody>\n <div className=\"rounded-lg border border-dashed p-6 text-sm text-muted-foreground\">\n Page content\n </div>\n </PageBody>\n </Page>\n </div>\n ),\n code: `import { Plus } from 'lucide-react'\nimport { Page, PageBody, PageHeader } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<Page>\n <PageHeader\n title={t('currencies.list.title')}\n actions={\n <>\n <Button variant=\"outline\" size=\"sm\">Import</Button>\n <Button size=\"sm\"><Plus className=\"size-4\" /> Add currency</Button>\n </>\n }\n />\n <PageBody>{/* \u2026 */}</PageBody>\n</Page>`,\n },\n ],\n}\n\nconst sectionHeaderEntry: GalleryEntry = {\n id: 'section-header',\n title: 'SectionHeader',\n importPath: '@open-mercato/ui/backend/SectionHeader',\n variants: [\n {\n id: 'count-and-action',\n title: 'With count and action',\n render: () => (\n <div className=\"w-full max-w-md\">\n <SectionHeader\n title=\"Addresses\"\n count={3}\n action={\n <Button variant=\"ghost\" size=\"sm\">\n <Plus className=\"size-4\" /> Add\n </Button>\n }\n />\n </div>\n ),\n code: `import { Plus } from 'lucide-react'\nimport { SectionHeader } from '@open-mercato/ui/backend/SectionHeader'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<SectionHeader\n title={t('customers.people.detail.addresses.title')}\n count={addresses.length}\n action={<Button variant=\"ghost\" size=\"sm\"><Plus className=\"size-4\" /> {t('common.add')}</Button>}\n/>`,\n },\n {\n id: 'collapsible',\n title: 'CollapsibleSection',\n render: () => (\n <div className=\"w-full max-w-md\">\n <CollapsibleSection title=\"Billing details\" count={2}>\n <div className=\"rounded-lg border border-dashed p-4 text-sm text-muted-foreground\">\n Section content\n </div>\n </CollapsibleSection>\n </div>\n ),\n code: `import { CollapsibleSection } from '@open-mercato/ui/backend/SectionHeader'\n\n<CollapsibleSection title={t('billing.details.title')} count={2}>\n {/* section content */}\n</CollapsibleSection>`,\n },\n ],\n}\n\nconst sectionPageEntry: GalleryEntry = {\n id: 'section-page',\n title: 'SectionPage',\n importPath: '@open-mercato/ui/backend/section-page',\n variants: [\n {\n id: 'miniature',\n title: 'Two-item miniature (clipped frame)',\n render: () => <SectionPageMiniDemo />,\n code: `import { UserRound, Lock } from 'lucide-react'\nimport { SectionPage, type SectionNavGroup } from '@open-mercato/ui/backend/section-page'\n\nconst sections: SectionNavGroup[] = [\n {\n id: 'account',\n label: 'Account',\n items: [\n { id: 'profile', label: 'Profile', href: '/backend/profile', icon: <UserRound className=\"size-4\" /> },\n { id: 'security', label: 'Security', href: '/backend/profile/security', icon: <Lock className=\"size-4\" /> },\n ],\n },\n]\n\n<SectionPage title={t('profile.title')} sections={sections} activePath={pathname}>\n {children}\n</SectionPage>`,\n },\n {\n id: 'section-nav',\n title: 'SectionNav (standalone, controlled collapse)',\n render: () => <SectionNavDemo />,\n code: `import { SectionNav, type SectionNavGroup } from '@open-mercato/ui/backend/section-page'\n\nconst [collapsed, setCollapsed] = React.useState(false)\n\n<SectionNav\n title={t('profile.title')}\n sections={sections}\n activePath={pathname}\n collapsed={collapsed}\n onToggleCollapse={() => setCollapsed((value) => !value)}\n/>`,\n },\n ],\n}\n\nconst formHeaderEntry: GalleryEntry = {\n id: 'form-header',\n title: 'FormHeader',\n importPath: '@open-mercato/ui/backend/forms',\n variants: [\n {\n id: 'edit-mode',\n title: 'Edit mode',\n render: () => (\n <div className=\"w-full\">\n <FormHeader\n backHref=\"#form-header\"\n backLabel=\"Back\"\n title=\"Edit product\"\n actions={{\n cancelHref: '#form-header',\n cancelLabel: 'Cancel',\n submit: { label: 'Save', pendingLabel: 'Saving\u2026' },\n }}\n />\n </div>\n ),\n code: `import { FormHeader } from '@open-mercato/ui/backend/forms'\n\n<FormHeader\n backHref=\"/backend/products\"\n backLabel={t('ui.navigation.back')}\n title={t('products.edit.title')}\n actions={{\n cancelHref: '/backend/products',\n cancelLabel: t('ui.forms.actions.cancel'),\n submit: { formId: 'product-form', label: t('ui.forms.actions.save'), pendingLabel: t('ui.forms.actions.saving') },\n }}\n/>`,\n },\n {\n id: 'detail-mode',\n title: 'Detail mode',\n render: () => (\n <div className=\"w-full\">\n <FormHeader\n mode=\"detail\"\n backHref=\"#form-header\"\n entityTypeLabel=\"Company\"\n title=\"Acme Logistics\"\n subtitle=\"Created 12 Mar 2026\"\n statusBadge={<Badge variant=\"muted\">Active</Badge>}\n menuActions={[\n { id: 'duplicate', label: 'Duplicate', icon: Copy, onSelect: () => {} },\n { id: 'archive', label: 'Archive', icon: Archive, onSelect: () => {} },\n ]}\n onDelete={() => {}}\n deleteLabel=\"Delete\"\n />\n </div>\n ),\n code: `import { Archive, Copy } from 'lucide-react'\nimport { FormHeader } from '@open-mercato/ui/backend/forms'\n\n<FormHeader\n mode=\"detail\"\n backHref=\"/backend/customers/companies\"\n entityTypeLabel={t('customers.companies.detail.entityType')}\n title={company.name}\n subtitle={t('customers.companies.detail.createdAt', { date: createdAt })}\n statusBadge={<Badge variant=\"muted\">{statusLabel}</Badge>}\n menuActions={[\n { id: 'duplicate', label: t('ui.actions.duplicate'), icon: Copy, onSelect: duplicate },\n { id: 'archive', label: t('ui.actions.archive'), icon: Archive, onSelect: archive },\n ]}\n onDelete={confirmDelete}\n deleteLabel={t('ui.forms.actions.delete')}\n/>`,\n },\n ],\n}\n\nconst formFooterEntry: GalleryEntry = {\n id: 'form-footer',\n title: 'FormFooter',\n importPath: '@open-mercato/ui/backend/forms',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <div className=\"w-full\">\n <FormFooter\n actions={{\n cancelHref: '#form-footer',\n cancelLabel: 'Cancel',\n submit: { label: 'Save changes', pendingLabel: 'Saving\u2026' },\n }}\n />\n </div>\n ),\n code: `import { FormFooter } from '@open-mercato/ui/backend/forms'\n\n<FormFooter\n actions={{\n cancelHref: '/backend/products',\n cancelLabel: t('ui.forms.actions.cancel'),\n submit: { formId: 'product-form', label: t('ui.forms.actions.save'), pendingLabel: t('ui.forms.actions.saving') },\n }}\n/>`,\n },\n {\n id: 'embedded-with-delete',\n title: 'embedded, with delete',\n render: () => (\n <div className=\"w-full\">\n <FormFooter\n embedded\n actions={{\n showDelete: true,\n onDelete: () => {},\n deleteLabel: 'Delete',\n cancelHref: '#form-footer',\n cancelLabel: 'Cancel',\n submit: { label: 'Save' },\n }}\n />\n </div>\n ),\n code: `import { FormFooter } from '@open-mercato/ui/backend/forms'\n\n<FormFooter\n embedded\n actions={{\n showDelete: true,\n onDelete: confirmDelete,\n deleteLabel: t('ui.forms.actions.delete'),\n cancelHref: '/backend/products',\n cancelLabel: t('ui.forms.actions.cancel'),\n submit: { label: t('ui.forms.actions.save') },\n }}\n/>`,\n },\n ],\n}\n\nconst actionsDropdownEntry: GalleryEntry = {\n id: 'actions-dropdown',\n title: 'ActionsDropdown',\n importPath: '@open-mercato/ui/backend/forms',\n variants: [\n {\n id: 'label-trigger',\n title: 'Label trigger',\n render: () => <ActionsDropdown items={demoActions} />,\n code: `import { Copy, Download, Trash2 } from 'lucide-react'\nimport { ActionsDropdown, type ActionItem } from '@open-mercato/ui/backend/forms'\n\nconst items: ActionItem[] = [\n { id: 'duplicate', label: t('ui.actions.duplicate'), icon: Copy, onSelect: duplicate },\n { id: 'export', label: t('ui.actions.export'), icon: Download, onSelect: exportCsv },\n { id: 'delete', label: t('ui.actions.delete'), icon: Trash2, onSelect: confirmDelete },\n]\n\n<ActionsDropdown items={items} />`,\n },\n {\n id: 'icon-trigger',\n title: 'Icon trigger',\n render: () => (\n <ActionsDropdown items={demoActions} triggerMode=\"icon\" ariaLabel=\"More actions\" />\n ),\n code: `import { ActionsDropdown } from '@open-mercato/ui/backend/forms'\n\n<ActionsDropdown items={items} triggerMode=\"icon\" ariaLabel={t('ui.actions.more')} />`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n pageEntry,\n sectionHeaderEntry,\n sectionPageEntry,\n formHeaderEntry,\n formFooterEntry,\n actionsDropdownEntry,\n]\n"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { Archive, Copy, Download, Lock, Plus, Trash2, UserRound } from 'lucide-react'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Page, PageBody, PageHeader } from '@open-mercato/ui/backend/Page'\nimport { CollapsibleSection, SectionHeader } from '@open-mercato/ui/backend/SectionHeader'\nimport {\n SectionNav,\n SectionPage,\n type SectionNavGroup,\n} from '@open-mercato/ui/backend/section-page'\nimport {\n ActionsDropdown,\n FormFooter,\n FormHeader,\n type ActionItem,\n} from '@open-mercato/ui/backend/forms'\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\n// The demos use `#`-anchors as hrefs so clicking inside the gallery never\n// navigates away, and every callback is a no-op.\n\nconst demoSections: SectionNavGroup[] = [\n {\n id: 'account',\n label: 'Account',\n items: [\n { id: 'profile', label: 'Profile', href: '#profile', icon: <UserRound className=\"size-4\" /> },\n { id: 'security', label: 'Security', href: '#security', icon: <Lock className=\"size-4\" /> },\n ],\n },\n]\n\n// SectionPage stretches to the viewport by design \u2014 the miniature demo clips\n// it inside a fixed-height frame so the two-item nav plus content stay small.\nfunction SectionPageMiniDemo() {\n return (\n <div className=\"h-80 w-full overflow-hidden rounded-lg border bg-background\">\n <SectionPage title=\"Settings\" sections={demoSections} activePath=\"#profile\">\n <div className=\"space-y-2\">\n <h2 className=\"text-sm font-semibold\">Profile</h2>\n <p className=\"text-sm text-muted-foreground\">Section content renders here.</p>\n </div>\n </SectionPage>\n </div>\n )\n}\n\n// SectionNav is controlled \u2014 the demo owns the collapsed state.\nfunction SectionNavDemo() {\n const [collapsed, setCollapsed] = React.useState(false)\n return (\n <div className=\"w-64 rounded-lg border bg-background px-3 py-4\">\n <SectionNav\n title=\"Settings\"\n sections={demoSections}\n activePath=\"#profile\"\n collapsed={collapsed}\n onToggleCollapse={() => setCollapsed((value) => !value)}\n />\n </div>\n )\n}\n\nconst demoActions: ActionItem[] = [\n { id: 'duplicate', label: 'Duplicate record', icon: Copy, onSelect: () => {} },\n { id: 'export', label: 'Export as CSV', icon: Download, onSelect: () => {} },\n { id: 'delete', label: 'Delete record', icon: Trash2, onSelect: () => {} },\n]\n\nconst pageEntry: GalleryEntry = {\n id: 'page',\n title: 'Page',\n importPath: '@open-mercato/ui/backend/Page',\n variants: [\n {\n id: 'basic',\n title: 'Page + PageHeader + PageBody',\n render: () => (\n <div className=\"w-full\">\n <Page>\n <PageHeader title=\"Currencies\" description=\"Exchange rates refresh nightly.\" />\n <PageBody>\n <div className=\"rounded-lg border border-dashed p-6 text-sm text-muted-foreground\">\n Page content\n </div>\n </PageBody>\n </Page>\n </div>\n ),\n code: `import { Page, PageBody, PageHeader } from '@open-mercato/ui/backend/Page'\n\n<Page>\n <PageHeader title={t('currencies.list.title')} description={t('design_system.gallery.samples.listDescription')} />\n <PageBody>{/* DataTable, sections\u2026 */}</PageBody>\n</Page>`,\n },\n {\n id: 'with-actions',\n title: 'Header actions',\n render: () => (\n <div className=\"w-full\">\n <Page>\n <PageHeader\n title=\"Currencies\"\n description=\"Exchange rates refresh nightly.\"\n actions={\n <>\n <Button variant=\"outline\" size=\"sm\">\n Import\n </Button>\n <Button size=\"sm\">\n <Plus className=\"size-4\" /> Add currency\n </Button>\n </>\n }\n />\n <PageBody>\n <div className=\"rounded-lg border border-dashed p-6 text-sm text-muted-foreground\">\n Page content\n </div>\n </PageBody>\n </Page>\n </div>\n ),\n code: `import { Plus } from 'lucide-react'\nimport { Page, PageBody, PageHeader } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<Page>\n <PageHeader\n title={t('currencies.list.title')}\n actions={\n <>\n <Button variant=\"outline\" size=\"sm\">Import</Button>\n <Button size=\"sm\"><Plus className=\"size-4\" /> Add currency</Button>\n </>\n }\n />\n <PageBody>{/* \u2026 */}</PageBody>\n</Page>`,\n },\n ],\n}\n\nconst sectionHeaderEntry: GalleryEntry = {\n id: 'section-header',\n title: 'SectionHeader',\n importPath: '@open-mercato/ui/backend/SectionHeader',\n variants: [\n {\n id: 'count-and-action',\n title: 'With count and action',\n render: () => (\n <div className=\"w-full max-w-md\">\n <SectionHeader\n title=\"Addresses\"\n count={3}\n action={\n <Button variant=\"ghost\" size=\"sm\">\n <Plus className=\"size-4\" /> Add\n </Button>\n }\n />\n </div>\n ),\n code: `import { Plus } from 'lucide-react'\nimport { SectionHeader } from '@open-mercato/ui/backend/SectionHeader'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<SectionHeader\n title={t('design_system.gallery.samples.addresses.title')}\n count={addresses.length}\n action={<Button variant=\"ghost\" size=\"sm\"><Plus className=\"size-4\" /> {t('common.add')}</Button>}\n/>`,\n },\n {\n id: 'collapsible',\n title: 'CollapsibleSection',\n render: () => (\n <div className=\"w-full max-w-md\">\n <CollapsibleSection title=\"Billing details\" count={2}>\n <div className=\"rounded-lg border border-dashed p-4 text-sm text-muted-foreground\">\n Section content\n </div>\n </CollapsibleSection>\n </div>\n ),\n code: `import { CollapsibleSection } from '@open-mercato/ui/backend/SectionHeader'\n\n<CollapsibleSection title={t('design_system.gallery.samples.billingDetails')} count={2}>\n {/* section content */}\n</CollapsibleSection>`,\n },\n ],\n}\n\nconst sectionPageEntry: GalleryEntry = {\n id: 'section-page',\n title: 'SectionPage',\n importPath: '@open-mercato/ui/backend/section-page',\n variants: [\n {\n id: 'miniature',\n title: 'Two-item miniature (clipped frame)',\n render: () => <SectionPageMiniDemo />,\n code: `import { UserRound, Lock } from 'lucide-react'\nimport { SectionPage, type SectionNavGroup } from '@open-mercato/ui/backend/section-page'\n\nconst sections: SectionNavGroup[] = [\n {\n id: 'account',\n label: 'Account',\n items: [\n { id: 'profile', label: 'Profile', href: '/backend/profile', icon: <UserRound className=\"size-4\" /> },\n { id: 'security', label: 'Security', href: '/backend/profile/security', icon: <Lock className=\"size-4\" /> },\n ],\n },\n]\n\n<SectionPage title={t('profile.page.title')} sections={sections} activePath={pathname}>\n {children}\n</SectionPage>`,\n },\n {\n id: 'section-nav',\n title: 'SectionNav (standalone, controlled collapse)',\n render: () => <SectionNavDemo />,\n code: `import { SectionNav, type SectionNavGroup } from '@open-mercato/ui/backend/section-page'\n\nconst [collapsed, setCollapsed] = React.useState(false)\n\n<SectionNav\n title={t('profile.page.title')}\n sections={sections}\n activePath={pathname}\n collapsed={collapsed}\n onToggleCollapse={() => setCollapsed((value) => !value)}\n/>`,\n },\n ],\n}\n\nconst formHeaderEntry: GalleryEntry = {\n id: 'form-header',\n title: 'FormHeader',\n importPath: '@open-mercato/ui/backend/forms',\n variants: [\n {\n id: 'edit-mode',\n title: 'Edit mode',\n render: () => (\n <div className=\"w-full\">\n <FormHeader\n backHref=\"#form-header\"\n backLabel=\"Back\"\n title=\"Edit product\"\n actions={{\n cancelHref: '#form-header',\n cancelLabel: 'Cancel',\n submit: { label: 'Save', pendingLabel: 'Saving\u2026' },\n }}\n />\n </div>\n ),\n code: `import { FormHeader } from '@open-mercato/ui/backend/forms'\n\n<FormHeader\n backHref=\"/backend/products\"\n backLabel={t('ui.navigation.back')}\n title={t('catalog.products.edit.title')}\n actions={{\n cancelHref: '/backend/products',\n cancelLabel: t('ui.forms.actions.cancel'),\n submit: { formId: 'product-form', label: t('ui.forms.actions.save'), pendingLabel: t('ui.forms.actions.saving') },\n }}\n/>`,\n },\n {\n id: 'detail-mode',\n title: 'Detail mode',\n render: () => (\n <div className=\"w-full\">\n <FormHeader\n mode=\"detail\"\n backHref=\"#form-header\"\n entityTypeLabel=\"Company\"\n title=\"Acme Logistics\"\n subtitle=\"Created 12 Mar 2026\"\n statusBadge={<Badge variant=\"muted\">Active</Badge>}\n menuActions={[\n { id: 'duplicate', label: 'Duplicate', icon: Copy, onSelect: () => {} },\n { id: 'archive', label: 'Archive', icon: Archive, onSelect: () => {} },\n ]}\n onDelete={() => {}}\n deleteLabel=\"Delete\"\n />\n </div>\n ),\n code: `import { Archive, Copy } from 'lucide-react'\nimport { FormHeader } from '@open-mercato/ui/backend/forms'\n\n<FormHeader\n mode=\"detail\"\n backHref=\"/backend/customers/companies\"\n entityTypeLabel={t('design_system.gallery.samples.entityType')}\n title={company.name}\n subtitle={t('design_system.gallery.samples.createdAt', { date: createdAt })}\n statusBadge={<Badge variant=\"muted\">{statusLabel}</Badge>}\n menuActions={[\n { id: 'duplicate', label: t('ui.actions.duplicate'), icon: Copy, onSelect: duplicate },\n { id: 'archive', label: t('ui.actions.archive'), icon: Archive, onSelect: archive },\n ]}\n onDelete={confirmDelete}\n deleteLabel={t('ui.forms.actions.delete')}\n/>`,\n },\n ],\n}\n\nconst formFooterEntry: GalleryEntry = {\n id: 'form-footer',\n title: 'FormFooter',\n importPath: '@open-mercato/ui/backend/forms',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <div className=\"w-full\">\n <FormFooter\n actions={{\n cancelHref: '#form-footer',\n cancelLabel: 'Cancel',\n submit: { label: 'Save changes', pendingLabel: 'Saving\u2026' },\n }}\n />\n </div>\n ),\n code: `import { FormFooter } from '@open-mercato/ui/backend/forms'\n\n<FormFooter\n actions={{\n cancelHref: '/backend/products',\n cancelLabel: t('ui.forms.actions.cancel'),\n submit: { formId: 'product-form', label: t('ui.forms.actions.save'), pendingLabel: t('ui.forms.actions.saving') },\n }}\n/>`,\n },\n {\n id: 'embedded-with-delete',\n title: 'embedded, with delete',\n render: () => (\n <div className=\"w-full\">\n <FormFooter\n embedded\n actions={{\n showDelete: true,\n onDelete: () => {},\n deleteLabel: 'Delete',\n cancelHref: '#form-footer',\n cancelLabel: 'Cancel',\n submit: { label: 'Save' },\n }}\n />\n </div>\n ),\n code: `import { FormFooter } from '@open-mercato/ui/backend/forms'\n\n<FormFooter\n embedded\n actions={{\n showDelete: true,\n onDelete: confirmDelete,\n deleteLabel: t('ui.forms.actions.delete'),\n cancelHref: '/backend/products',\n cancelLabel: t('ui.forms.actions.cancel'),\n submit: { label: t('ui.forms.actions.save') },\n }}\n/>`,\n },\n ],\n}\n\nconst actionsDropdownEntry: GalleryEntry = {\n id: 'actions-dropdown',\n title: 'ActionsDropdown',\n importPath: '@open-mercato/ui/backend/forms',\n variants: [\n {\n id: 'label-trigger',\n title: 'Label trigger',\n render: () => <ActionsDropdown items={demoActions} />,\n code: `import { Copy, Download, Trash2 } from 'lucide-react'\nimport { ActionsDropdown, type ActionItem } from '@open-mercato/ui/backend/forms'\n\nconst items: ActionItem[] = [\n { id: 'duplicate', label: t('ui.actions.duplicate'), icon: Copy, onSelect: duplicate },\n { id: 'export', label: t('ui.actions.export'), icon: Download, onSelect: exportCsv },\n { id: 'delete', label: t('ui.actions.delete'), icon: Trash2, onSelect: confirmDelete },\n]\n\n<ActionsDropdown items={items} />`,\n },\n {\n id: 'icon-trigger',\n title: 'Icon trigger',\n render: () => (\n <ActionsDropdown items={demoActions} triggerMode=\"icon\" ariaLabel=\"More actions\" />\n ),\n code: `import { ActionsDropdown } from '@open-mercato/ui/backend/forms'\n\n<ActionsDropdown items={items} triggerMode=\"icon\" ariaLabel={t('ui.actions.more')} />`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n pageEntry,\n sectionHeaderEntry,\n sectionPageEntry,\n formHeaderEntry,\n formFooterEntry,\n actionsDropdownEntry,\n]\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -327,7 +327,7 @@ function DictionaryEntrySelect({
327
327
  labels: appearanceLabels ?? DEFAULT_APPEARANCE_LABELS
328
328
  }
329
329
  ) : null,
330
- formError ? /* @__PURE__ */ jsx("p", { className: "text-sm text-red-600", children: formError }) : null
330
+ formError ? /* @__PURE__ */ jsx("p", { className: "text-sm text-status-error-text", children: formError }) : null
331
331
  ] }),
332
332
  /* @__PURE__ */ jsxs(DialogFooter, { children: [
333
333
  /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => setDialogOpen(false), disabled: saving, children: labels.cancelLabel }),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/dictionaries/components/DictionaryEntrySelect.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { usePathname, useSearchParams } from 'next/navigation'\nimport { Plus, Settings, Save } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { buildHrefWithReturnTo } from '@open-mercato/shared/lib/navigation/returnTo'\nimport { DictionaryValue, renderDictionaryColor, renderDictionaryIcon } from './dictionaryAppearance'\nimport { AppearanceSelector, type AppearanceSelectorLabels, useAppearanceState } from './AppearanceSelector'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('dictionaries').child({ component: 'DictionaryEntrySelect' })\n\nexport class DictionaryOptionsUnavailableError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DictionaryOptionsUnavailableError'\n }\n}\n\nconst DEFAULT_APPEARANCE_LABELS: AppearanceSelectorLabels = {\n colorLabel: 'Color',\n colorHelp: 'Pick a highlight color for this entry.',\n colorClearLabel: 'Remove color',\n iconLabel: 'Icon or emoji',\n iconPlaceholder: 'Type an emoji or icon token.',\n iconPickerTriggerLabel: 'Browse icons and emoji',\n iconSearchPlaceholder: 'Search icons or emojis\u2026',\n iconSearchEmptyLabel: 'No icons match your search.',\n iconSuggestionsLabel: 'Suggestions',\n iconClearLabel: 'Remove icon',\n previewEmptyLabel: 'No appearance selected',\n}\n\nexport type DictionaryOption = {\n value: string\n label: string\n color: string | null\n icon: string | null\n}\n\nexport type DictionarySelectLabels = {\n placeholder: string\n addLabel: string\n addPrompt?: string\n dialogTitle: string\n valueLabel: string\n valuePlaceholder: string\n labelLabel: string\n labelPlaceholder: string\n emptyError: string\n cancelLabel: string\n saveLabel: string\n saveShortcutHint?: string\n successCreateLabel?: string\n errorLoad: string\n errorSave: string\n loadingLabel: string\n manageTitle: string\n}\n\nexport type DictionaryEntrySelectProps = {\n id?: string\n value?: string\n onChange: (value: string | undefined) => void\n fetchOptions: () => Promise<DictionaryOption[]>\n createOption?: (input: { value: string; label?: string; color?: string | null; icon?: string | null }) => Promise<DictionaryOption | null>\n labels: DictionarySelectLabels\n manageHref?: string\n selectClassName?: string\n seedOptions?: DictionaryOption[]\n allowInlineCreate?: boolean\n allowAppearance?: boolean\n appearanceLabels?: AppearanceSelectorLabels\n disabled?: boolean\n showLabelInput?: boolean\n showManage?: boolean\n sortOptions?: 'label_asc' | 'none'\n /**\n * When false, hides the read-only appearance preview (color swatch + icon + hex)\n * rendered below the trigger for the currently-selected entry. Defaults to true to\n * preserve existing behavior; set false where the host only wants a plain select\n * (e.g. a create form that shouldn't surface dictionary styling).\n */\n showActiveAppearance?: boolean\n}\n\nexport function DictionaryEntrySelect({\n id,\n value,\n onChange,\n fetchOptions,\n createOption,\n labels,\n manageHref,\n selectClassName,\n seedOptions,\n allowInlineCreate = true,\n allowAppearance = false,\n appearanceLabels,\n disabled: disabledProp = false,\n showLabelInput = true,\n showManage = true,\n sortOptions = 'label_asc',\n showActiveAppearance = true,\n}: DictionaryEntrySelectProps) {\n const unavailableMessageId = React.useId()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [options, setOptions] = React.useState<DictionaryOption[]>([])\n const [loading, setLoading] = React.useState(true)\n const [saving, setSaving] = React.useState(false)\n const [dialogOpen, setDialogOpen] = React.useState(false)\n const [newValue, setNewValue] = React.useState('')\n const [newLabel, setNewLabel] = React.useState('')\n const [formError, setFormError] = React.useState<string | null>(null)\n const [unavailableMessage, setUnavailableMessage] = React.useState<string | null>(null)\n const appearance = useAppearanceState(null, null)\n\n const loadOptions = React.useCallback(async () => {\n setLoading(true)\n setUnavailableMessage(null)\n try {\n const items = await fetchOptions()\n setOptions(sortOptions === 'none' ? items : items.slice().sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' })))\n } catch (err) {\n if (err instanceof DictionaryOptionsUnavailableError) {\n setUnavailableMessage(err.message)\n setOptions([])\n } else {\n logger.error('Failed to fetch options', { err })\n flash(labels.errorLoad, 'error')\n setOptions([])\n }\n } finally {\n setLoading(false)\n }\n }, [fetchOptions, labels.errorLoad, sortOptions])\n\n React.useEffect(() => {\n loadOptions().catch(() => {})\n }, [loadOptions])\n\n const resetDialogState = React.useCallback(() => {\n setNewValue('')\n setNewLabel('')\n setFormError(null)\n appearance.setColor(null)\n appearance.setIcon(null)\n setSaving(false)\n }, [appearance])\n\n React.useEffect(() => {\n if (!dialogOpen) resetDialogState()\n }, [dialogOpen, resetDialogState])\n\n const mergedOptions = React.useMemo(() => {\n if (!Array.isArray(seedOptions) || !seedOptions.length) return options\n const merged: DictionaryOption[] = []\n const seen = new Set<string>()\n for (const option of seedOptions) {\n if (!option.value || seen.has(option.value)) continue\n seen.add(option.value)\n merged.push(option)\n }\n for (const option of options) {\n if (seen.has(option.value)) continue\n seen.add(option.value)\n merged.push(option)\n }\n return merged\n }, [options, seedOptions])\n\n const activeOption = React.useMemo(\n () => mergedOptions.find((option) => option.value === value) ?? null,\n [mergedOptions, value],\n )\n const displayOptions = React.useMemo(() => {\n if (!value || activeOption) return mergedOptions\n return [\n {\n value,\n label: value,\n color: null,\n icon: null,\n },\n ...mergedOptions,\n ]\n }, [activeOption, mergedOptions, value])\n\n const handleCreate = React.useCallback(async () => {\n if (!createOption) return\n const trimmedValue = newValue.trim()\n if (!trimmedValue.length) {\n setFormError(labels.emptyError)\n return\n }\n setSaving(true)\n try {\n const payload = await createOption({\n value: trimmedValue,\n label: showLabelInput ? newLabel.trim() || undefined : undefined,\n color: allowAppearance && appearance.color ? appearance.color : undefined,\n icon: allowAppearance && appearance.icon ? appearance.icon : undefined,\n })\n if (!payload) throw new Error('createOption did not return an entry')\n setOptions((previous) => {\n const map = new Map(previous.map((option) => [option.value, option]))\n map.set(payload.value, {\n value: payload.value,\n label: payload.label,\n color: payload.color ?? null,\n icon: payload.icon ?? null,\n })\n const nextOptions = Array.from(map.values())\n return sortOptions === 'none'\n ? nextOptions\n : nextOptions.sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }))\n })\n await loadOptions()\n onChange(payload.value)\n setDialogOpen(false)\n if (labels.successCreateLabel) {\n flash(labels.successCreateLabel, 'success')\n }\n } catch (err) {\n logger.error('Failed to create option', { err })\n flash(labels.errorSave, 'error')\n } finally {\n setSaving(false)\n }\n }, [\n allowAppearance,\n appearance.color,\n appearance.icon,\n createOption,\n labels.emptyError,\n labels.errorSave,\n labels.successCreateLabel,\n loadOptions,\n newLabel,\n newValue,\n onChange,\n sortOptions,\n ])\n\n const handleDialogKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n if (!saving) {\n setDialogOpen(false)\n }\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving && newValue.trim().length) {\n handleCreate().catch(() => {})\n } else if (!saving && !newValue.trim().length) {\n setFormError(labels.emptyError)\n }\n }\n },\n [handleCreate, labels.emptyError, newValue, saving],\n )\n\n const shortcutHint = React.useMemo(() => {\n const provided = typeof labels.saveShortcutHint === 'string' ? labels.saveShortcutHint.trim() : ''\n if (provided.length) return provided\n return '\u2318/Ctrl + Enter'\n }, [labels.saveShortcutHint])\n\n const disabled = disabledProp || loading || saving || unavailableMessage !== null\n const manageLink = manageHref ?? '/backend/config/dictionaries'\n const returnTo = React.useMemo(() => {\n const query = searchParams?.toString() ?? ''\n if (!pathname) return null\n return query.length ? `${pathname}?${query}` : pathname\n }, [pathname, searchParams])\n const manageLinkWithReturnTo = React.useMemo(\n () => buildHrefWithReturnTo(manageLink, returnTo),\n [manageLink, returnTo],\n )\n const optionsKey = React.useMemo(\n () => displayOptions.map((option) => `${option.value}:${option.label}`).join('\\0'),\n [displayOptions],\n )\n\n return (\n <div className=\"space-y-2\">\n {unavailableMessage ? (\n <p id={unavailableMessageId} className=\"text-xs text-muted-foreground\">\n {unavailableMessage}\n </p>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Select\n key={`dictionary-entry:${value ?? ''}:${optionsKey}`}\n value={value ?? ''}\n onValueChange={(next) => {\n if (!next) return\n onChange(next)\n }}\n disabled={disabled}\n >\n <SelectTrigger\n id={id}\n aria-describedby={unavailableMessage ? unavailableMessageId : undefined}\n className={selectClassName}\n title={activeOption?.label ?? undefined}\n >\n <SelectValue placeholder={labels.placeholder}>\n {activeOption?.label}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {displayOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div className=\"flex items-center gap-1\">\n {allowInlineCreate && createOption ? (\n <Dialog open={dialogOpen} onOpenChange={setDialogOpen}>\n <DialogTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n disabled={disabled}\n title={labels.addLabel}\n aria-label={labels.addLabel}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n </DialogTrigger>\n <DialogContent className=\"sm:max-w-md\" onKeyDown={handleDialogKeyDown}>\n <DialogHeader>\n <DialogTitle>{labels.dialogTitle}</DialogTitle>\n {labels.addPrompt ? <DialogDescription>{labels.addPrompt}</DialogDescription> : null}\n </DialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{labels.valueLabel}</label>\n <Input\n type=\"text\"\n value={newValue}\n onChange={(event) => {\n setNewValue(event.target.value)\n if (formError) setFormError(null)\n }}\n placeholder={labels.valuePlaceholder}\n autoFocus\n disabled={saving}\n />\n </div>\n {showLabelInput ? (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{labels.labelLabel}</label>\n <Input\n type=\"text\"\n value={newLabel}\n onChange={(event) => setNewLabel(event.target.value)}\n placeholder={labels.labelPlaceholder}\n disabled={saving}\n />\n </div>\n ) : null}\n {allowAppearance ? (\n <AppearanceSelector\n icon={appearance.icon}\n color={appearance.color}\n onIconChange={appearance.setIcon}\n onColorChange={appearance.setColor}\n labels={appearanceLabels ?? DEFAULT_APPEARANCE_LABELS}\n />\n ) : null}\n {formError ? <p className=\"text-sm text-red-600\">{formError}</p> : null}\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setDialogOpen(false)} disabled={saving}>\n {labels.cancelLabel}\n </Button>\n <Button type=\"button\" onClick={handleCreate} disabled={saving || !newValue.trim()}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4\" /> : <Save className=\"mr-2 h-4 w-4\" />}\n <span className=\"flex items-center gap-2\">\n <span>{labels.saveLabel}</span>\n {!saving ? (\n <span className=\"text-xs text-muted-foreground\">{`(${shortcutHint})`}</span>\n ) : null}\n </span>\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n ) : null}\n {showManage ? (\n <Button asChild variant=\"ghost\" size=\"icon\" title={labels.manageTitle} aria-label={labels.manageTitle}>\n <Link href={manageLinkWithReturnTo}>\n <Settings className=\"h-4 w-4\" />\n <span className=\"sr-only\">{labels.manageTitle}</span>\n </Link>\n </Button>\n ) : null}\n </div>\n </div>\n {showActiveAppearance && activeOption && (activeOption.icon || activeOption.color) ? (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-2 rounded border border-dashed px-2 py-1\">\n {activeOption.icon ? renderDictionaryIcon(activeOption.icon, 'h-4 w-4') : null}\n {activeOption.color ? renderDictionaryColor(activeOption.color, 'h-4 w-4 rounded-sm') : null}\n </span>\n {activeOption.color ? <span>{activeOption.color}</span> : null}\n </div>\n ) : null}\n {loading ? <div className=\"text-xs text-muted-foreground\">{labels.loadingLabel}</div> : null}\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { usePathname, useSearchParams } from 'next/navigation'\nimport { Plus, Settings, Save } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { buildHrefWithReturnTo } from '@open-mercato/shared/lib/navigation/returnTo'\nimport { DictionaryValue, renderDictionaryColor, renderDictionaryIcon } from './dictionaryAppearance'\nimport { AppearanceSelector, type AppearanceSelectorLabels, useAppearanceState } from './AppearanceSelector'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('dictionaries').child({ component: 'DictionaryEntrySelect' })\n\nexport class DictionaryOptionsUnavailableError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DictionaryOptionsUnavailableError'\n }\n}\n\nconst DEFAULT_APPEARANCE_LABELS: AppearanceSelectorLabels = {\n colorLabel: 'Color',\n colorHelp: 'Pick a highlight color for this entry.',\n colorClearLabel: 'Remove color',\n iconLabel: 'Icon or emoji',\n iconPlaceholder: 'Type an emoji or icon token.',\n iconPickerTriggerLabel: 'Browse icons and emoji',\n iconSearchPlaceholder: 'Search icons or emojis\u2026',\n iconSearchEmptyLabel: 'No icons match your search.',\n iconSuggestionsLabel: 'Suggestions',\n iconClearLabel: 'Remove icon',\n previewEmptyLabel: 'No appearance selected',\n}\n\nexport type DictionaryOption = {\n value: string\n label: string\n color: string | null\n icon: string | null\n}\n\nexport type DictionarySelectLabels = {\n placeholder: string\n addLabel: string\n addPrompt?: string\n dialogTitle: string\n valueLabel: string\n valuePlaceholder: string\n labelLabel: string\n labelPlaceholder: string\n emptyError: string\n cancelLabel: string\n saveLabel: string\n saveShortcutHint?: string\n successCreateLabel?: string\n errorLoad: string\n errorSave: string\n loadingLabel: string\n manageTitle: string\n}\n\nexport type DictionaryEntrySelectProps = {\n id?: string\n value?: string\n onChange: (value: string | undefined) => void\n fetchOptions: () => Promise<DictionaryOption[]>\n createOption?: (input: { value: string; label?: string; color?: string | null; icon?: string | null }) => Promise<DictionaryOption | null>\n labels: DictionarySelectLabels\n manageHref?: string\n selectClassName?: string\n seedOptions?: DictionaryOption[]\n allowInlineCreate?: boolean\n allowAppearance?: boolean\n appearanceLabels?: AppearanceSelectorLabels\n disabled?: boolean\n showLabelInput?: boolean\n showManage?: boolean\n sortOptions?: 'label_asc' | 'none'\n /**\n * When false, hides the read-only appearance preview (color swatch + icon + hex)\n * rendered below the trigger for the currently-selected entry. Defaults to true to\n * preserve existing behavior; set false where the host only wants a plain select\n * (e.g. a create form that shouldn't surface dictionary styling).\n */\n showActiveAppearance?: boolean\n}\n\nexport function DictionaryEntrySelect({\n id,\n value,\n onChange,\n fetchOptions,\n createOption,\n labels,\n manageHref,\n selectClassName,\n seedOptions,\n allowInlineCreate = true,\n allowAppearance = false,\n appearanceLabels,\n disabled: disabledProp = false,\n showLabelInput = true,\n showManage = true,\n sortOptions = 'label_asc',\n showActiveAppearance = true,\n}: DictionaryEntrySelectProps) {\n const unavailableMessageId = React.useId()\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const [options, setOptions] = React.useState<DictionaryOption[]>([])\n const [loading, setLoading] = React.useState(true)\n const [saving, setSaving] = React.useState(false)\n const [dialogOpen, setDialogOpen] = React.useState(false)\n const [newValue, setNewValue] = React.useState('')\n const [newLabel, setNewLabel] = React.useState('')\n const [formError, setFormError] = React.useState<string | null>(null)\n const [unavailableMessage, setUnavailableMessage] = React.useState<string | null>(null)\n const appearance = useAppearanceState(null, null)\n\n const loadOptions = React.useCallback(async () => {\n setLoading(true)\n setUnavailableMessage(null)\n try {\n const items = await fetchOptions()\n setOptions(sortOptions === 'none' ? items : items.slice().sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' })))\n } catch (err) {\n if (err instanceof DictionaryOptionsUnavailableError) {\n setUnavailableMessage(err.message)\n setOptions([])\n } else {\n logger.error('Failed to fetch options', { err })\n flash(labels.errorLoad, 'error')\n setOptions([])\n }\n } finally {\n setLoading(false)\n }\n }, [fetchOptions, labels.errorLoad, sortOptions])\n\n React.useEffect(() => {\n loadOptions().catch(() => {})\n }, [loadOptions])\n\n const resetDialogState = React.useCallback(() => {\n setNewValue('')\n setNewLabel('')\n setFormError(null)\n appearance.setColor(null)\n appearance.setIcon(null)\n setSaving(false)\n }, [appearance])\n\n React.useEffect(() => {\n if (!dialogOpen) resetDialogState()\n }, [dialogOpen, resetDialogState])\n\n const mergedOptions = React.useMemo(() => {\n if (!Array.isArray(seedOptions) || !seedOptions.length) return options\n const merged: DictionaryOption[] = []\n const seen = new Set<string>()\n for (const option of seedOptions) {\n if (!option.value || seen.has(option.value)) continue\n seen.add(option.value)\n merged.push(option)\n }\n for (const option of options) {\n if (seen.has(option.value)) continue\n seen.add(option.value)\n merged.push(option)\n }\n return merged\n }, [options, seedOptions])\n\n const activeOption = React.useMemo(\n () => mergedOptions.find((option) => option.value === value) ?? null,\n [mergedOptions, value],\n )\n const displayOptions = React.useMemo(() => {\n if (!value || activeOption) return mergedOptions\n return [\n {\n value,\n label: value,\n color: null,\n icon: null,\n },\n ...mergedOptions,\n ]\n }, [activeOption, mergedOptions, value])\n\n const handleCreate = React.useCallback(async () => {\n if (!createOption) return\n const trimmedValue = newValue.trim()\n if (!trimmedValue.length) {\n setFormError(labels.emptyError)\n return\n }\n setSaving(true)\n try {\n const payload = await createOption({\n value: trimmedValue,\n label: showLabelInput ? newLabel.trim() || undefined : undefined,\n color: allowAppearance && appearance.color ? appearance.color : undefined,\n icon: allowAppearance && appearance.icon ? appearance.icon : undefined,\n })\n if (!payload) throw new Error('createOption did not return an entry')\n setOptions((previous) => {\n const map = new Map(previous.map((option) => [option.value, option]))\n map.set(payload.value, {\n value: payload.value,\n label: payload.label,\n color: payload.color ?? null,\n icon: payload.icon ?? null,\n })\n const nextOptions = Array.from(map.values())\n return sortOptions === 'none'\n ? nextOptions\n : nextOptions.sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }))\n })\n await loadOptions()\n onChange(payload.value)\n setDialogOpen(false)\n if (labels.successCreateLabel) {\n flash(labels.successCreateLabel, 'success')\n }\n } catch (err) {\n logger.error('Failed to create option', { err })\n flash(labels.errorSave, 'error')\n } finally {\n setSaving(false)\n }\n }, [\n allowAppearance,\n appearance.color,\n appearance.icon,\n createOption,\n labels.emptyError,\n labels.errorSave,\n labels.successCreateLabel,\n loadOptions,\n newLabel,\n newValue,\n onChange,\n sortOptions,\n ])\n\n const handleDialogKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n if (!saving) {\n setDialogOpen(false)\n }\n return\n }\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n if (!saving && newValue.trim().length) {\n handleCreate().catch(() => {})\n } else if (!saving && !newValue.trim().length) {\n setFormError(labels.emptyError)\n }\n }\n },\n [handleCreate, labels.emptyError, newValue, saving],\n )\n\n const shortcutHint = React.useMemo(() => {\n const provided = typeof labels.saveShortcutHint === 'string' ? labels.saveShortcutHint.trim() : ''\n if (provided.length) return provided\n return '\u2318/Ctrl + Enter'\n }, [labels.saveShortcutHint])\n\n const disabled = disabledProp || loading || saving || unavailableMessage !== null\n const manageLink = manageHref ?? '/backend/config/dictionaries'\n const returnTo = React.useMemo(() => {\n const query = searchParams?.toString() ?? ''\n if (!pathname) return null\n return query.length ? `${pathname}?${query}` : pathname\n }, [pathname, searchParams])\n const manageLinkWithReturnTo = React.useMemo(\n () => buildHrefWithReturnTo(manageLink, returnTo),\n [manageLink, returnTo],\n )\n const optionsKey = React.useMemo(\n () => displayOptions.map((option) => `${option.value}:${option.label}`).join('\\0'),\n [displayOptions],\n )\n\n return (\n <div className=\"space-y-2\">\n {unavailableMessage ? (\n <p id={unavailableMessageId} className=\"text-xs text-muted-foreground\">\n {unavailableMessage}\n </p>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <Select\n key={`dictionary-entry:${value ?? ''}:${optionsKey}`}\n value={value ?? ''}\n onValueChange={(next) => {\n if (!next) return\n onChange(next)\n }}\n disabled={disabled}\n >\n <SelectTrigger\n id={id}\n aria-describedby={unavailableMessage ? unavailableMessageId : undefined}\n className={selectClassName}\n title={activeOption?.label ?? undefined}\n >\n <SelectValue placeholder={labels.placeholder}>\n {activeOption?.label}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {displayOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div className=\"flex items-center gap-1\">\n {allowInlineCreate && createOption ? (\n <Dialog open={dialogOpen} onOpenChange={setDialogOpen}>\n <DialogTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n disabled={disabled}\n title={labels.addLabel}\n aria-label={labels.addLabel}\n >\n <Plus className=\"h-4 w-4\" />\n </Button>\n </DialogTrigger>\n <DialogContent className=\"sm:max-w-md\" onKeyDown={handleDialogKeyDown}>\n <DialogHeader>\n <DialogTitle>{labels.dialogTitle}</DialogTitle>\n {labels.addPrompt ? <DialogDescription>{labels.addPrompt}</DialogDescription> : null}\n </DialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{labels.valueLabel}</label>\n <Input\n type=\"text\"\n value={newValue}\n onChange={(event) => {\n setNewValue(event.target.value)\n if (formError) setFormError(null)\n }}\n placeholder={labels.valuePlaceholder}\n autoFocus\n disabled={saving}\n />\n </div>\n {showLabelInput ? (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{labels.labelLabel}</label>\n <Input\n type=\"text\"\n value={newLabel}\n onChange={(event) => setNewLabel(event.target.value)}\n placeholder={labels.labelPlaceholder}\n disabled={saving}\n />\n </div>\n ) : null}\n {allowAppearance ? (\n <AppearanceSelector\n icon={appearance.icon}\n color={appearance.color}\n onIconChange={appearance.setIcon}\n onColorChange={appearance.setColor}\n labels={appearanceLabels ?? DEFAULT_APPEARANCE_LABELS}\n />\n ) : null}\n {formError ? <p className=\"text-sm text-status-error-text\">{formError}</p> : null}\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setDialogOpen(false)} disabled={saving}>\n {labels.cancelLabel}\n </Button>\n <Button type=\"button\" onClick={handleCreate} disabled={saving || !newValue.trim()}>\n {saving ? <Spinner className=\"mr-2 h-4 w-4\" /> : <Save className=\"mr-2 h-4 w-4\" />}\n <span className=\"flex items-center gap-2\">\n <span>{labels.saveLabel}</span>\n {!saving ? (\n <span className=\"text-xs text-muted-foreground\">{`(${shortcutHint})`}</span>\n ) : null}\n </span>\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n ) : null}\n {showManage ? (\n <Button asChild variant=\"ghost\" size=\"icon\" title={labels.manageTitle} aria-label={labels.manageTitle}>\n <Link href={manageLinkWithReturnTo}>\n <Settings className=\"h-4 w-4\" />\n <span className=\"sr-only\">{labels.manageTitle}</span>\n </Link>\n </Button>\n ) : null}\n </div>\n </div>\n {showActiveAppearance && activeOption && (activeOption.icon || activeOption.color) ? (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-2 rounded border border-dashed px-2 py-1\">\n {activeOption.icon ? renderDictionaryIcon(activeOption.icon, 'h-4 w-4') : null}\n {activeOption.color ? renderDictionaryColor(activeOption.color, 'h-4 w-4 rounded-sm') : null}\n </span>\n {activeOption.color ? <span>{activeOption.color}</span> : null}\n </div>\n ) : null}\n {loading ? <div className=\"text-xs text-muted-foreground\">{labels.loadingLabel}</div> : null}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -12,11 +12,11 @@ import { useGuardedMutation } from "@open-mercato/ui/backend/injection/useGuarde
12
12
  import { useT } from "@open-mercato/shared/lib/i18n/context";
13
13
  import { ArrowLeft, RefreshCw } from "lucide-react";
14
14
  const STATUS_COLORS = {
15
- received: "bg-blue-100 text-blue-800",
16
- processing: "bg-purple-100 text-purple-800",
17
- processed: "bg-green-100 text-green-800",
18
- needs_review: "bg-amber-100 text-amber-800",
19
- failed: "bg-red-100 text-red-800"
15
+ received: "bg-status-info-bg text-status-info-text",
16
+ processing: "bg-status-neutral-bg text-status-neutral-text",
17
+ processed: "bg-status-success-bg text-status-success-text",
18
+ needs_review: "bg-status-warning-bg text-status-warning-text",
19
+ failed: "bg-status-error-bg text-status-error-text"
20
20
  };
21
21
  function ProcessingLogPage() {
22
22
  const t = useT();
@@ -113,7 +113,7 @@ function ProcessingLogPage() {
113
113
  {
114
114
  accessorKey: "processingError",
115
115
  header: t("inbox_ops.extraction_failed", "Error"),
116
- cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "text-xs text-red-600 truncate max-w-[280px] block", children: row.original.processingError || "-" })
116
+ cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "text-xs text-status-error-text truncate max-w-[280px] block", children: row.original.processingError || "-" })
117
117
  },
118
118
  {
119
119
  id: "actions",