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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/generated/entities.ids.generated.js +1 -0
  3. package/dist/generated/entities.ids.generated.js.map +2 -2
  4. package/dist/modules/auth/backend/settings/page.js +14 -9
  5. package/dist/modules/auth/backend/settings/page.js.map +2 -2
  6. package/dist/modules/customers/cli.js +17 -7
  7. package/dist/modules/customers/cli.js.map +2 -2
  8. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +229 -216
  9. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
  10. package/dist/modules/customers/search.js +50 -29
  11. package/dist/modules/customers/search.js.map +2 -2
  12. package/dist/modules/data_sync/api/mappings/[id]/route.js +22 -9
  13. package/dist/modules/data_sync/api/mappings/[id]/route.js.map +2 -2
  14. package/dist/modules/data_sync/api/mappings/route.js +13 -4
  15. package/dist/modules/data_sync/api/mappings/route.js.map +2 -2
  16. package/dist/modules/data_sync/api/options.js +7 -2
  17. package/dist/modules/data_sync/api/options.js.map +2 -2
  18. package/dist/modules/data_sync/api/run.js +7 -2
  19. package/dist/modules/data_sync/api/run.js.map +2 -2
  20. package/dist/modules/data_sync/api/runs/[id]/cancel.js +8 -3
  21. package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
  22. package/dist/modules/data_sync/api/runs/[id]/retry.js +7 -2
  23. package/dist/modules/data_sync/api/runs/[id]/retry.js.map +2 -2
  24. package/dist/modules/data_sync/api/runs/[id]/route.js +8 -3
  25. package/dist/modules/data_sync/api/runs/[id]/route.js.map +2 -2
  26. package/dist/modules/data_sync/api/runs.js +7 -2
  27. package/dist/modules/data_sync/api/runs.js.map +2 -2
  28. package/dist/modules/data_sync/api/schedules/[id]/route.js +19 -6
  29. package/dist/modules/data_sync/api/schedules/[id]/route.js.map +2 -2
  30. package/dist/modules/data_sync/api/schedules/route.js +13 -4
  31. package/dist/modules/data_sync/api/schedules/route.js.map +2 -2
  32. package/dist/modules/data_sync/api/validate.js +9 -4
  33. package/dist/modules/data_sync/api/validate.js.map +2 -2
  34. package/dist/modules/design_system/acl.js +9 -0
  35. package/dist/modules/design_system/acl.js.map +7 -0
  36. package/dist/modules/design_system/backend/design-system/page.js +11 -0
  37. package/dist/modules/design_system/backend/design-system/page.js.map +7 -0
  38. package/dist/modules/design_system/backend/design-system/page.meta.js +15 -0
  39. package/dist/modules/design_system/backend/design-system/page.meta.js.map +7 -0
  40. package/dist/modules/design_system/gallery/components/CodeSnippet.js +52 -0
  41. package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +7 -0
  42. package/dist/modules/design_system/gallery/components/EntryCard.js +63 -0
  43. package/dist/modules/design_system/gallery/components/EntryCard.js.map +7 -0
  44. package/dist/modules/design_system/gallery/components/GalleryShell.js +163 -0
  45. package/dist/modules/design_system/gallery/components/GalleryShell.js.map +7 -0
  46. package/dist/modules/design_system/gallery/components/VariantPreview.js +9 -0
  47. package/dist/modules/design_system/gallery/components/VariantPreview.js.map +7 -0
  48. package/dist/modules/design_system/gallery/entries/banners.js +186 -0
  49. package/dist/modules/design_system/gallery/entries/banners.js.map +7 -0
  50. package/dist/modules/design_system/gallery/entries/buttons.js +361 -0
  51. package/dist/modules/design_system/gallery/entries/buttons.js.map +7 -0
  52. package/dist/modules/design_system/gallery/entries/charts.js +457 -0
  53. package/dist/modules/design_system/gallery/entries/charts.js.map +7 -0
  54. package/dist/modules/design_system/gallery/entries/dates.js +306 -0
  55. package/dist/modules/design_system/gallery/entries/dates.js.map +7 -0
  56. package/dist/modules/design_system/gallery/entries/detail.js +358 -0
  57. package/dist/modules/design_system/gallery/entries/detail.js.map +7 -0
  58. package/dist/modules/design_system/gallery/entries/display.js +785 -0
  59. package/dist/modules/design_system/gallery/entries/display.js.map +7 -0
  60. package/dist/modules/design_system/gallery/entries/feedback.js +658 -0
  61. package/dist/modules/design_system/gallery/entries/feedback.js.map +7 -0
  62. package/dist/modules/design_system/gallery/entries/filters.js +505 -0
  63. package/dist/modules/design_system/gallery/entries/filters.js.map +7 -0
  64. package/dist/modules/design_system/gallery/entries/foundations.js +453 -0
  65. package/dist/modules/design_system/gallery/entries/foundations.js.map +7 -0
  66. package/dist/modules/design_system/gallery/entries/icons.js +140 -0
  67. package/dist/modules/design_system/gallery/entries/icons.js.map +7 -0
  68. package/dist/modules/design_system/gallery/entries/inputs.js +1217 -0
  69. package/dist/modules/design_system/gallery/entries/inputs.js.map +7 -0
  70. package/dist/modules/design_system/gallery/entries/messages.js +334 -0
  71. package/dist/modules/design_system/gallery/entries/messages.js.map +7 -0
  72. package/dist/modules/design_system/gallery/entries/navigation.js +475 -0
  73. package/dist/modules/design_system/gallery/entries/navigation.js.map +7 -0
  74. package/dist/modules/design_system/gallery/entries/notifications.js +257 -0
  75. package/dist/modules/design_system/gallery/entries/notifications.js.map +7 -0
  76. package/dist/modules/design_system/gallery/entries/overlays.js +576 -0
  77. package/dist/modules/design_system/gallery/entries/overlays.js.map +7 -0
  78. package/dist/modules/design_system/gallery/entries/scaffolding.js +378 -0
  79. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +7 -0
  80. package/dist/modules/design_system/gallery/entries/schedule.js +297 -0
  81. package/dist/modules/design_system/gallery/entries/schedule.js.map +7 -0
  82. package/dist/modules/design_system/gallery/registry.js +139 -0
  83. package/dist/modules/design_system/gallery/registry.js.map +7 -0
  84. package/dist/modules/design_system/gallery/types.js +1 -0
  85. package/dist/modules/design_system/gallery/types.js.map +7 -0
  86. package/dist/modules/design_system/index.js +9 -0
  87. package/dist/modules/design_system/index.js.map +7 -0
  88. package/dist/modules/design_system/setup.js +14 -0
  89. package/dist/modules/design_system/setup.js.map +7 -0
  90. package/dist/modules/inbox_ops/search.js +15 -4
  91. package/dist/modules/inbox_ops/search.js.map +2 -2
  92. package/dist/modules/integrations/api/[id]/credentials/route.js +11 -5
  93. package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
  94. package/dist/modules/integrations/api/[id]/health/route.js +6 -3
  95. package/dist/modules/integrations/api/[id]/health/route.js.map +2 -2
  96. package/dist/modules/integrations/api/[id]/route.js +6 -3
  97. package/dist/modules/integrations/api/[id]/route.js.map +2 -2
  98. package/dist/modules/integrations/api/[id]/state/route.js +6 -3
  99. package/dist/modules/integrations/api/[id]/state/route.js.map +2 -2
  100. package/dist/modules/integrations/api/[id]/version/route.js +6 -3
  101. package/dist/modules/integrations/api/[id]/version/route.js.map +2 -2
  102. package/dist/modules/integrations/api/logs/route.js +6 -3
  103. package/dist/modules/integrations/api/logs/route.js.map +2 -2
  104. package/dist/modules/integrations/api/route.js +6 -3
  105. package/dist/modules/integrations/api/route.js.map +2 -2
  106. package/dist/modules/integrations/api/umes-read.js +2 -2
  107. package/dist/modules/integrations/api/umes-read.js.map +2 -2
  108. package/dist/modules/integrations/lib/organization-scope.js +2 -9
  109. package/dist/modules/integrations/lib/organization-scope.js.map +2 -2
  110. package/dist/modules/messages/search.js +10 -5
  111. package/dist/modules/messages/search.js.map +2 -2
  112. package/dist/modules/query_index/data/entities.js +2 -1
  113. package/dist/modules/query_index/data/entities.js.map +2 -2
  114. package/dist/modules/query_index/lib/engine.js +32 -50
  115. package/dist/modules/query_index/lib/engine.js.map +2 -2
  116. package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js +17 -0
  117. package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js.map +7 -0
  118. package/generated/entities.ids.generated.ts +1 -0
  119. package/package.json +16 -16
  120. package/src/modules/auth/backend/settings/page.tsx +17 -8
  121. package/src/modules/customers/cli.ts +17 -7
  122. package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +24 -13
  123. package/src/modules/customers/i18n/de.json +17 -0
  124. package/src/modules/customers/i18n/en.json +17 -0
  125. package/src/modules/customers/i18n/es.json +17 -0
  126. package/src/modules/customers/i18n/pl.json +17 -0
  127. package/src/modules/customers/search.ts +59 -27
  128. package/src/modules/data_sync/AGENTS.md +1 -0
  129. package/src/modules/data_sync/api/mappings/[id]/route.ts +22 -9
  130. package/src/modules/data_sync/api/mappings/route.ts +13 -4
  131. package/src/modules/data_sync/api/options.ts +7 -2
  132. package/src/modules/data_sync/api/run.ts +7 -2
  133. package/src/modules/data_sync/api/runs/[id]/cancel.ts +8 -3
  134. package/src/modules/data_sync/api/runs/[id]/retry.ts +7 -2
  135. package/src/modules/data_sync/api/runs/[id]/route.ts +8 -3
  136. package/src/modules/data_sync/api/runs.ts +7 -2
  137. package/src/modules/data_sync/api/schedules/[id]/route.ts +19 -6
  138. package/src/modules/data_sync/api/schedules/route.ts +13 -4
  139. package/src/modules/data_sync/api/validate.ts +9 -4
  140. package/src/modules/design_system/AGENTS.md +34 -0
  141. package/src/modules/design_system/acl.ts +5 -0
  142. package/src/modules/design_system/backend/design-system/page.meta.ts +11 -0
  143. package/src/modules/design_system/backend/design-system/page.tsx +14 -0
  144. package/src/modules/design_system/gallery/components/CodeSnippet.tsx +55 -0
  145. package/src/modules/design_system/gallery/components/EntryCard.tsx +95 -0
  146. package/src/modules/design_system/gallery/components/GalleryShell.tsx +206 -0
  147. package/src/modules/design_system/gallery/components/VariantPreview.tsx +15 -0
  148. package/src/modules/design_system/gallery/entries/banners.tsx +226 -0
  149. package/src/modules/design_system/gallery/entries/buttons.tsx +422 -0
  150. package/src/modules/design_system/gallery/entries/charts.tsx +518 -0
  151. package/src/modules/design_system/gallery/entries/dates.tsx +325 -0
  152. package/src/modules/design_system/gallery/entries/detail.tsx +403 -0
  153. package/src/modules/design_system/gallery/entries/display.tsx +893 -0
  154. package/src/modules/design_system/gallery/entries/feedback.tsx +746 -0
  155. package/src/modules/design_system/gallery/entries/filters.tsx +570 -0
  156. package/src/modules/design_system/gallery/entries/foundations.tsx +529 -0
  157. package/src/modules/design_system/gallery/entries/icons.tsx +168 -0
  158. package/src/modules/design_system/gallery/entries/inputs.tsx +1516 -0
  159. package/src/modules/design_system/gallery/entries/messages.tsx +339 -0
  160. package/src/modules/design_system/gallery/entries/navigation.tsx +573 -0
  161. package/src/modules/design_system/gallery/entries/notifications.tsx +285 -0
  162. package/src/modules/design_system/gallery/entries/overlays.tsx +677 -0
  163. package/src/modules/design_system/gallery/entries/scaffolding.tsx +430 -0
  164. package/src/modules/design_system/gallery/entries/schedule.tsx +307 -0
  165. package/src/modules/design_system/gallery/registry.ts +152 -0
  166. package/src/modules/design_system/gallery/types.ts +32 -0
  167. package/src/modules/design_system/i18n/.hardcoded-allowlist.json +71 -0
  168. package/src/modules/design_system/i18n/de.json +46 -0
  169. package/src/modules/design_system/i18n/en.json +46 -0
  170. package/src/modules/design_system/i18n/es.json +46 -0
  171. package/src/modules/design_system/i18n/pl.json +46 -0
  172. package/src/modules/design_system/index.ts +7 -0
  173. package/src/modules/design_system/setup.ts +12 -0
  174. package/src/modules/inbox_ops/i18n/de.json +3 -0
  175. package/src/modules/inbox_ops/i18n/en.json +3 -0
  176. package/src/modules/inbox_ops/i18n/es.json +3 -0
  177. package/src/modules/inbox_ops/i18n/pl.json +3 -0
  178. package/src/modules/inbox_ops/search.ts +20 -4
  179. package/src/modules/integrations/api/[id]/credentials/route.ts +11 -5
  180. package/src/modules/integrations/api/[id]/health/route.ts +6 -3
  181. package/src/modules/integrations/api/[id]/route.ts +6 -3
  182. package/src/modules/integrations/api/[id]/state/route.ts +6 -3
  183. package/src/modules/integrations/api/[id]/version/route.ts +6 -3
  184. package/src/modules/integrations/api/logs/route.ts +6 -3
  185. package/src/modules/integrations/api/route.ts +6 -3
  186. package/src/modules/integrations/api/umes-read.ts +2 -2
  187. package/src/modules/integrations/lib/organization-scope.ts +5 -25
  188. package/src/modules/messages/i18n/de.json +2 -0
  189. package/src/modules/messages/i18n/en.json +2 -0
  190. package/src/modules/messages/i18n/es.json +2 -0
  191. package/src/modules/messages/i18n/pl.json +2 -0
  192. package/src/modules/messages/search.ts +11 -5
  193. package/src/modules/query_index/data/entities.ts +7 -0
  194. package/src/modules/query_index/lib/engine.ts +40 -63
  195. package/src/modules/query_index/migrations/.snapshot-open-mercato.json +12 -0
  196. package/src/modules/query_index/migrations/Migration20260731105052_query_index.ts +35 -0
@@ -0,0 +1,257 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Bell } from "lucide-react";
4
+ import { Button } from "@open-mercato/ui/primitives/button";
5
+ import { IconButton } from "@open-mercato/ui/primitives/icon-button";
6
+ import {
7
+ NotificationCountBadge,
8
+ NotificationItem,
9
+ NotificationPanel
10
+ } from "@open-mercato/ui/backend/notifications";
11
+ const galleryT = (key, fallbackOrParams, params) => {
12
+ const fallback = typeof fallbackOrParams === "string" ? fallbackOrParams : key;
13
+ const variables = (typeof fallbackOrParams === "object" ? fallbackOrParams : params) ?? {};
14
+ return Object.entries(variables).reduce(
15
+ (text, [name, value]) => text.replaceAll(`{${name}}`, String(value)),
16
+ fallback
17
+ );
18
+ };
19
+ const minutesAgo = (minutes) => new Date(Date.now() - minutes * 6e4).toISOString();
20
+ const noopMarkAsRead = async () => {
21
+ };
22
+ const noopDismiss = async () => {
23
+ };
24
+ const noopExecuteAction = async () => ({});
25
+ function mockNotification(overrides) {
26
+ return {
27
+ id: "gallery-notification",
28
+ type: "gallery.demo",
29
+ title: "Notification",
30
+ severity: "info",
31
+ status: "unread",
32
+ actions: [],
33
+ createdAt: minutesAgo(5),
34
+ ...overrides
35
+ };
36
+ }
37
+ const unreadInfoNotification = mockNotification({
38
+ id: "gallery-unread-info",
39
+ title: "Nightly import finished",
40
+ severity: "info",
41
+ status: "unread",
42
+ sourceModule: "catalog",
43
+ createdAt: minutesAgo(4)
44
+ });
45
+ const successWithBodyNotification = mockNotification({
46
+ id: "gallery-success-body",
47
+ title: "Order #10023 shipped",
48
+ body: "Carrier picked up 3 parcels. Tracking numbers were emailed to the customer.",
49
+ severity: "success",
50
+ status: "read",
51
+ sourceModule: "sales",
52
+ createdAt: minutesAgo(35)
53
+ });
54
+ const actionRequiredNotification = mockNotification({
55
+ id: "gallery-action-required",
56
+ title: "Price list awaiting approval",
57
+ body: "Wholesale EU price list changes 214 products.",
58
+ severity: "warning",
59
+ status: "unread",
60
+ sourceModule: "pricing",
61
+ actions: [
62
+ { id: "review", label: "Review changes", variant: "outline" },
63
+ { id: "approve", label: "Approve", variant: "default" }
64
+ ],
65
+ createdAt: minutesAgo(90)
66
+ });
67
+ const panelNotifications = [
68
+ unreadInfoNotification,
69
+ actionRequiredNotification,
70
+ successWithBodyNotification
71
+ ];
72
+ function DemoNotificationPanel() {
73
+ const [open, setOpen] = React.useState(false);
74
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
75
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => setOpen(true), children: "Open notification panel" }),
76
+ /* @__PURE__ */ jsx(
77
+ NotificationPanel,
78
+ {
79
+ open,
80
+ onOpenChange: setOpen,
81
+ notifications: panelNotifications,
82
+ unreadCount: 2,
83
+ onMarkAsRead: noopMarkAsRead,
84
+ onExecuteAction: noopExecuteAction,
85
+ onDismiss: noopDismiss,
86
+ onMarkAllRead: noopMarkAsRead,
87
+ t: galleryT
88
+ }
89
+ )
90
+ ] });
91
+ }
92
+ const notificationBellEntry = {
93
+ id: "notification-bell",
94
+ title: "NotificationBell",
95
+ importPath: "@open-mercato/ui/backend/notifications",
96
+ variants: [
97
+ {
98
+ id: "presentational-mock",
99
+ title: "Presentational mock (live bell is SSE-wired)",
100
+ render: () => /* @__PURE__ */ jsxs(IconButton, { variant: "ghost", size: "sm", className: "relative", "aria-label": "3 unread notifications", children: [
101
+ /* @__PURE__ */ jsx(Bell, { className: "h-5 w-5" }),
102
+ /* @__PURE__ */ jsx(NotificationCountBadge, { count: 3 })
103
+ ] }),
104
+ code: `import { NotificationBell } from '@open-mercato/ui/backend/notifications'
105
+
106
+ // Wired to the notifications API + SSE \u2014 AppShell renders one in the topbar.
107
+ <NotificationBell t={t} />`
108
+ }
109
+ ]
110
+ };
111
+ const notificationCountBadgeEntry = {
112
+ id: "notification-count-badge",
113
+ title: "NotificationCountBadge",
114
+ importPath: "@open-mercato/ui/backend/notifications",
115
+ variants: [
116
+ {
117
+ id: "counts",
118
+ title: "Counts (caps at 99+)",
119
+ render: () => /* @__PURE__ */ jsxs(Fragment, { children: [
120
+ /* @__PURE__ */ jsxs(IconButton, { variant: "ghost", size: "sm", className: "relative", "aria-label": "3 unread notifications", children: [
121
+ /* @__PURE__ */ jsx(Bell, { className: "h-5 w-5" }),
122
+ /* @__PURE__ */ jsx(NotificationCountBadge, { count: 3 })
123
+ ] }),
124
+ /* @__PURE__ */ jsxs(IconButton, { variant: "ghost", size: "sm", className: "relative", "aria-label": "12 unread notifications", children: [
125
+ /* @__PURE__ */ jsx(Bell, { className: "h-5 w-5" }),
126
+ /* @__PURE__ */ jsx(NotificationCountBadge, { count: 12 })
127
+ ] }),
128
+ /* @__PURE__ */ jsxs(IconButton, { variant: "ghost", size: "sm", className: "relative", "aria-label": "120 unread notifications", children: [
129
+ /* @__PURE__ */ jsx(Bell, { className: "h-5 w-5" }),
130
+ /* @__PURE__ */ jsx(NotificationCountBadge, { count: 120 })
131
+ ] })
132
+ ] }),
133
+ code: `import { NotificationCountBadge } from '@open-mercato/ui/backend/notifications'
134
+
135
+ // Renders nothing for count <= 0; anchors to the nearest relative parent.
136
+ <IconButton variant="ghost" size="sm" className="relative" aria-label="3 unread notifications">
137
+ <Bell className="h-5 w-5" />
138
+ <NotificationCountBadge count={3} />
139
+ </IconButton>`
140
+ }
141
+ ]
142
+ };
143
+ const notificationItemEntry = {
144
+ id: "notification-item",
145
+ title: "NotificationItem",
146
+ importPath: "@open-mercato/ui/backend/notifications",
147
+ variants: [
148
+ {
149
+ id: "unread-info",
150
+ title: "Unread (mocked data)",
151
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(
152
+ NotificationItem,
153
+ {
154
+ notification: unreadInfoNotification,
155
+ onMarkAsRead: noopMarkAsRead,
156
+ onExecuteAction: noopExecuteAction,
157
+ onDismiss: noopDismiss,
158
+ t: galleryT
159
+ }
160
+ ) }),
161
+ code: `import { NotificationItem } from '@open-mercato/ui/backend/notifications'
162
+
163
+ <NotificationItem
164
+ notification={notification} // NotificationDto with status: 'unread'
165
+ onMarkAsRead={() => markAsRead(notification.id)}
166
+ onExecuteAction={(actionId) => executeAction(notification.id, actionId)}
167
+ onDismiss={() => dismiss(notification.id)}
168
+ t={t}
169
+ />`
170
+ },
171
+ {
172
+ id: "with-body",
173
+ title: "Read with body bubble (mocked data)",
174
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(
175
+ NotificationItem,
176
+ {
177
+ notification: successWithBodyNotification,
178
+ onMarkAsRead: noopMarkAsRead,
179
+ onExecuteAction: noopExecuteAction,
180
+ onDismiss: noopDismiss,
181
+ t: galleryT
182
+ }
183
+ ) }),
184
+ code: `import { NotificationItem } from '@open-mercato/ui/backend/notifications'
185
+
186
+ // A notification with a body renders it as a speech-bubble under the title.
187
+ <NotificationItem
188
+ notification={notification} // NotificationDto with body text
189
+ onMarkAsRead={() => markAsRead(notification.id)}
190
+ onExecuteAction={(actionId) => executeAction(notification.id, actionId)}
191
+ onDismiss={() => dismiss(notification.id)}
192
+ t={t}
193
+ />`
194
+ },
195
+ {
196
+ id: "with-actions",
197
+ title: "Action required (mocked data)",
198
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(
199
+ NotificationItem,
200
+ {
201
+ notification: actionRequiredNotification,
202
+ onMarkAsRead: noopMarkAsRead,
203
+ onExecuteAction: noopExecuteAction,
204
+ onDismiss: noopDismiss,
205
+ t: galleryT
206
+ }
207
+ ) }),
208
+ code: `import { NotificationItem } from '@open-mercato/ui/backend/notifications'
209
+
210
+ // Actions come from notification.actions; the last one renders as primary.
211
+ <NotificationItem
212
+ notification={notification} // NotificationDto with actions[]
213
+ onMarkAsRead={() => markAsRead(notification.id)}
214
+ onExecuteAction={(actionId) => executeAction(notification.id, actionId)}
215
+ onDismiss={() => dismiss(notification.id)}
216
+ t={t}
217
+ />`
218
+ }
219
+ ]
220
+ };
221
+ const notificationPanelEntry = {
222
+ id: "notification-panel",
223
+ title: "NotificationPanel",
224
+ importPath: "@open-mercato/ui/backend/notifications",
225
+ variants: [
226
+ {
227
+ id: "mocked-inbox",
228
+ title: "Mocked inbox (opens in a sheet)",
229
+ render: () => /* @__PURE__ */ jsx(DemoNotificationPanel, {}),
230
+ code: `import { NotificationPanel } from '@open-mercato/ui/backend/notifications'
231
+
232
+ const [open, setOpen] = React.useState(false)
233
+
234
+ <NotificationPanel
235
+ open={open}
236
+ onOpenChange={setOpen}
237
+ notifications={notifications} // NotificationDto[]
238
+ unreadCount={unreadCount}
239
+ onMarkAsRead={markAsRead}
240
+ onExecuteAction={executeAction}
241
+ onDismiss={dismiss}
242
+ onMarkAllRead={markAllRead}
243
+ t={t}
244
+ />`
245
+ }
246
+ ]
247
+ };
248
+ const entries = [
249
+ notificationBellEntry,
250
+ notificationCountBadgeEntry,
251
+ notificationItemEntry,
252
+ notificationPanelEntry
253
+ ];
254
+ export {
255
+ entries
256
+ };
257
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/entries/notifications.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { Bell } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport {\n NotificationCountBadge,\n NotificationItem,\n NotificationPanel,\n} from '@open-mercato/ui/backend/notifications'\nimport type { NotificationDto } from '@open-mercato/shared/modules/notifications/types'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\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// All previews below run on inline mocked data \u2014 no API calls, no SSE.\n// `NotificationBell` itself is wired to `useNotifications` (SSE + API) and\n// cannot be severed from it, so its entry shows the presentational chrome\n// (bell trigger + `NotificationCountBadge`) instead of mounting the live bell.\n\nconst galleryT: TranslateFn = (key, fallbackOrParams, params) => {\n const fallback = typeof fallbackOrParams === 'string' ? fallbackOrParams : key\n const variables = (typeof fallbackOrParams === 'object' ? fallbackOrParams : params) ?? {}\n return Object.entries(variables).reduce(\n (text, [name, value]) => text.replaceAll(`{${name}}`, String(value)),\n fallback,\n )\n}\n\nconst minutesAgo = (minutes: number) => new Date(Date.now() - minutes * 60_000).toISOString()\n\nconst noopMarkAsRead = async () => {}\nconst noopDismiss = async () => {}\nconst noopExecuteAction = async () => ({})\n\nfunction mockNotification(overrides: Partial<NotificationDto>): NotificationDto {\n return {\n id: 'gallery-notification',\n type: 'gallery.demo',\n title: 'Notification',\n severity: 'info',\n status: 'unread',\n actions: [],\n createdAt: minutesAgo(5),\n ...overrides,\n }\n}\n\nconst unreadInfoNotification = mockNotification({\n id: 'gallery-unread-info',\n title: 'Nightly import finished',\n severity: 'info',\n status: 'unread',\n sourceModule: 'catalog',\n createdAt: minutesAgo(4),\n})\n\nconst successWithBodyNotification = mockNotification({\n id: 'gallery-success-body',\n title: 'Order #10023 shipped',\n body: 'Carrier picked up 3 parcels. Tracking numbers were emailed to the customer.',\n severity: 'success',\n status: 'read',\n sourceModule: 'sales',\n createdAt: minutesAgo(35),\n})\n\nconst actionRequiredNotification = mockNotification({\n id: 'gallery-action-required',\n title: 'Price list awaiting approval',\n body: 'Wholesale EU price list changes 214 products.',\n severity: 'warning',\n status: 'unread',\n sourceModule: 'pricing',\n actions: [\n { id: 'review', label: 'Review changes', variant: 'outline' },\n { id: 'approve', label: 'Approve', variant: 'default' },\n ],\n createdAt: minutesAgo(90),\n})\n\nconst panelNotifications: NotificationDto[] = [\n unreadInfoNotification,\n actionRequiredNotification,\n successWithBodyNotification,\n]\n\nfunction DemoNotificationPanel() {\n const [open, setOpen] = React.useState(false)\n return (\n <>\n <Button variant=\"outline\" onClick={() => setOpen(true)}>\n Open notification panel\n </Button>\n <NotificationPanel\n open={open}\n onOpenChange={setOpen}\n notifications={panelNotifications}\n unreadCount={2}\n onMarkAsRead={noopMarkAsRead}\n onExecuteAction={noopExecuteAction}\n onDismiss={noopDismiss}\n onMarkAllRead={noopMarkAsRead}\n t={galleryT}\n />\n </>\n )\n}\n\nconst notificationBellEntry: GalleryEntry = {\n id: 'notification-bell',\n title: 'NotificationBell',\n importPath: '@open-mercato/ui/backend/notifications',\n variants: [\n {\n id: 'presentational-mock',\n title: 'Presentational mock (live bell is SSE-wired)',\n render: () => (\n <IconButton variant=\"ghost\" size=\"sm\" className=\"relative\" aria-label=\"3 unread notifications\">\n <Bell className=\"h-5 w-5\" />\n <NotificationCountBadge count={3} />\n </IconButton>\n ),\n code: `import { NotificationBell } from '@open-mercato/ui/backend/notifications'\n\n// Wired to the notifications API + SSE \u2014 AppShell renders one in the topbar.\n<NotificationBell t={t} />`,\n },\n ],\n}\n\nconst notificationCountBadgeEntry: GalleryEntry = {\n id: 'notification-count-badge',\n title: 'NotificationCountBadge',\n importPath: '@open-mercato/ui/backend/notifications',\n variants: [\n {\n id: 'counts',\n title: 'Counts (caps at 99+)',\n render: () => (\n <>\n <IconButton variant=\"ghost\" size=\"sm\" className=\"relative\" aria-label=\"3 unread notifications\">\n <Bell className=\"h-5 w-5\" />\n <NotificationCountBadge count={3} />\n </IconButton>\n <IconButton variant=\"ghost\" size=\"sm\" className=\"relative\" aria-label=\"12 unread notifications\">\n <Bell className=\"h-5 w-5\" />\n <NotificationCountBadge count={12} />\n </IconButton>\n <IconButton variant=\"ghost\" size=\"sm\" className=\"relative\" aria-label=\"120 unread notifications\">\n <Bell className=\"h-5 w-5\" />\n <NotificationCountBadge count={120} />\n </IconButton>\n </>\n ),\n code: `import { NotificationCountBadge } from '@open-mercato/ui/backend/notifications'\n\n// Renders nothing for count <= 0; anchors to the nearest relative parent.\n<IconButton variant=\"ghost\" size=\"sm\" className=\"relative\" aria-label=\"3 unread notifications\">\n <Bell className=\"h-5 w-5\" />\n <NotificationCountBadge count={3} />\n</IconButton>`,\n },\n ],\n}\n\nconst notificationItemEntry: GalleryEntry = {\n id: 'notification-item',\n title: 'NotificationItem',\n importPath: '@open-mercato/ui/backend/notifications',\n variants: [\n {\n id: 'unread-info',\n title: 'Unread (mocked data)',\n render: () => (\n <div className=\"w-full max-w-md\">\n <NotificationItem\n notification={unreadInfoNotification}\n onMarkAsRead={noopMarkAsRead}\n onExecuteAction={noopExecuteAction}\n onDismiss={noopDismiss}\n t={galleryT}\n />\n </div>\n ),\n code: `import { NotificationItem } from '@open-mercato/ui/backend/notifications'\n\n<NotificationItem\n notification={notification} // NotificationDto with status: 'unread'\n onMarkAsRead={() => markAsRead(notification.id)}\n onExecuteAction={(actionId) => executeAction(notification.id, actionId)}\n onDismiss={() => dismiss(notification.id)}\n t={t}\n/>`,\n },\n {\n id: 'with-body',\n title: 'Read with body bubble (mocked data)',\n render: () => (\n <div className=\"w-full max-w-md\">\n <NotificationItem\n notification={successWithBodyNotification}\n onMarkAsRead={noopMarkAsRead}\n onExecuteAction={noopExecuteAction}\n onDismiss={noopDismiss}\n t={galleryT}\n />\n </div>\n ),\n code: `import { NotificationItem } from '@open-mercato/ui/backend/notifications'\n\n// A notification with a body renders it as a speech-bubble under the title.\n<NotificationItem\n notification={notification} // NotificationDto with body text\n onMarkAsRead={() => markAsRead(notification.id)}\n onExecuteAction={(actionId) => executeAction(notification.id, actionId)}\n onDismiss={() => dismiss(notification.id)}\n t={t}\n/>`,\n },\n {\n id: 'with-actions',\n title: 'Action required (mocked data)',\n render: () => (\n <div className=\"w-full max-w-md\">\n <NotificationItem\n notification={actionRequiredNotification}\n onMarkAsRead={noopMarkAsRead}\n onExecuteAction={noopExecuteAction}\n onDismiss={noopDismiss}\n t={galleryT}\n />\n </div>\n ),\n code: `import { NotificationItem } from '@open-mercato/ui/backend/notifications'\n\n// Actions come from notification.actions; the last one renders as primary.\n<NotificationItem\n notification={notification} // NotificationDto with actions[]\n onMarkAsRead={() => markAsRead(notification.id)}\n onExecuteAction={(actionId) => executeAction(notification.id, actionId)}\n onDismiss={() => dismiss(notification.id)}\n t={t}\n/>`,\n },\n ],\n}\n\nconst notificationPanelEntry: GalleryEntry = {\n id: 'notification-panel',\n title: 'NotificationPanel',\n importPath: '@open-mercato/ui/backend/notifications',\n variants: [\n {\n id: 'mocked-inbox',\n title: 'Mocked inbox (opens in a sheet)',\n render: () => <DemoNotificationPanel />,\n code: `import { NotificationPanel } from '@open-mercato/ui/backend/notifications'\n\nconst [open, setOpen] = React.useState(false)\n\n<NotificationPanel\n open={open}\n onOpenChange={setOpen}\n notifications={notifications} // NotificationDto[]\n unreadCount={unreadCount}\n onMarkAsRead={markAsRead}\n onExecuteAction={executeAction}\n onDismiss={dismiss}\n onMarkAllRead={markAllRead}\n t={t}\n/>`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n notificationBellEntry,\n notificationCountBadgeEntry,\n notificationItemEntry,\n notificationPanelEntry,\n]\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }