@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,358 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Badge } from "@open-mercato/ui/primitives/badge";
3
+ import { Button } from "@open-mercato/ui/primitives/button";
4
+ import {
5
+ AddressesSection,
6
+ AttachmentsSection,
7
+ DetailFieldsSection,
8
+ ErrorMessage,
9
+ LoadingMessage,
10
+ NotesSection
11
+ } from "@open-mercato/ui/backend/detail";
12
+ const saveNoop = async () => {
13
+ };
14
+ const fieldGrid = [
15
+ {
16
+ key: "first-name",
17
+ kind: "text",
18
+ label: "First name",
19
+ value: "Anna",
20
+ emptyLabel: "Add first name",
21
+ onSave: saveNoop
22
+ },
23
+ {
24
+ key: "phone",
25
+ kind: "text",
26
+ label: "Phone",
27
+ value: null,
28
+ emptyLabel: "Add phone",
29
+ onSave: saveNoop
30
+ },
31
+ {
32
+ key: "status",
33
+ kind: "select",
34
+ label: "Status",
35
+ value: "active",
36
+ emptyLabel: "Set status",
37
+ options: [
38
+ { value: "active", label: "Active" },
39
+ { value: "inactive", label: "Inactive" }
40
+ ],
41
+ onSave: saveNoop
42
+ },
43
+ {
44
+ key: "notes",
45
+ kind: "multiline",
46
+ label: "Notes",
47
+ value: "Prefers email contact.",
48
+ emptyLabel: "Add notes",
49
+ onSave: saveNoop,
50
+ gridClassName: "sm:col-span-2 md:col-span-3"
51
+ }
52
+ ];
53
+ const fieldGridWithCustom = [
54
+ {
55
+ key: "email",
56
+ kind: "text",
57
+ label: "Email",
58
+ value: "anna@example.com",
59
+ emptyLabel: "Add email",
60
+ onSave: saveNoop
61
+ },
62
+ {
63
+ key: "owner",
64
+ kind: "custom",
65
+ label: "Owner",
66
+ emptyLabel: "Unassigned",
67
+ render: () => /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
68
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Owner" }),
69
+ /* @__PURE__ */ jsx(Badge, { variant: "muted", children: "Unassigned" })
70
+ ] })
71
+ }
72
+ ];
73
+ const galleryTranslator = (key, fallback) => fallback ?? key.split(".").pop() ?? key;
74
+ const notesAdapter = {
75
+ list: async () => [
76
+ {
77
+ id: "note-1",
78
+ body: "Asked for a revised quote \u2014 follow up on Friday.",
79
+ createdAt: "2026-07-15T09:30:00.000Z",
80
+ authorName: "Anna Nowak"
81
+ },
82
+ {
83
+ id: "note-2",
84
+ body: "Prefers email contact over phone.",
85
+ createdAt: "2026-07-10T14:05:00.000Z",
86
+ authorName: "Jan Kowalski"
87
+ }
88
+ ],
89
+ create: async () => {
90
+ },
91
+ update: async () => {
92
+ },
93
+ delete: async () => {
94
+ }
95
+ };
96
+ const addressesAdapter = {
97
+ list: async () => [
98
+ {
99
+ id: "address-1",
100
+ name: "Headquarters",
101
+ addressLine1: "Prosta 51",
102
+ city: "Warszawa",
103
+ postalCode: "00-838",
104
+ country: "PL",
105
+ isPrimary: true
106
+ },
107
+ {
108
+ id: "address-2",
109
+ name: "Warehouse",
110
+ addressLine1: "Magazynowa 7",
111
+ city: "Pruszk\xF3w",
112
+ postalCode: "05-800",
113
+ country: "PL"
114
+ }
115
+ ],
116
+ create: async () => {
117
+ },
118
+ update: async () => {
119
+ },
120
+ delete: async () => {
121
+ }
122
+ };
123
+ const detailFieldsSectionEntry = {
124
+ id: "detail-fields-section",
125
+ title: "DetailFieldsSection",
126
+ importPath: "@open-mercato/ui/backend/detail",
127
+ variants: [
128
+ {
129
+ id: "field-grid",
130
+ title: "Inline-editable field grid",
131
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx(DetailFieldsSection, { fields: fieldGrid }) }),
132
+ code: `import { DetailFieldsSection, type DetailFieldConfig } from '@open-mercato/ui/backend/detail'
133
+
134
+ const fields: DetailFieldConfig[] = [
135
+ { key: 'first-name', kind: 'text', label: 'First name', value: person.firstName, emptyLabel: 'Add first name', onSave: saveFirstName },
136
+ { key: 'phone', kind: 'text', label: 'Phone', value: person.phone, emptyLabel: 'Add phone', onSave: savePhone },
137
+ {
138
+ key: 'status', kind: 'select', label: 'Status', value: person.status, emptyLabel: 'Set status',
139
+ options: [{ value: 'active', label: 'Active' }, { value: 'inactive', label: 'Inactive' }],
140
+ onSave: saveStatus,
141
+ },
142
+ {
143
+ key: 'notes', kind: 'multiline', label: 'Notes', value: person.notes, emptyLabel: 'Add notes',
144
+ onSave: saveNotes, gridClassName: 'sm:col-span-2 md:col-span-3',
145
+ },
146
+ ]
147
+
148
+ <DetailFieldsSection fields={fields} />`
149
+ },
150
+ {
151
+ id: "custom-field",
152
+ title: "With a custom field cell",
153
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx(DetailFieldsSection, { fields: fieldGridWithCustom }) }),
154
+ code: `import { DetailFieldsSection, type DetailFieldConfig } from '@open-mercato/ui/backend/detail'
155
+ import { Badge } from '@open-mercato/ui/primitives/badge'
156
+
157
+ const fields: DetailFieldConfig[] = [
158
+ { key: 'email', kind: 'text', label: 'Email', value: person.email, emptyLabel: 'Add email', onSave: saveEmail },
159
+ {
160
+ key: 'owner', kind: 'custom', label: 'Owner', emptyLabel: 'Unassigned',
161
+ render: () => (
162
+ <div className="space-y-1">
163
+ <div className="text-xs text-muted-foreground">Owner</div>
164
+ <Badge variant="muted">Unassigned</Badge>
165
+ </div>
166
+ ),
167
+ },
168
+ ]
169
+
170
+ <DetailFieldsSection fields={fields} />`
171
+ }
172
+ ]
173
+ };
174
+ const loadingMessageEntry = {
175
+ id: "loading-message",
176
+ title: "LoadingMessage",
177
+ importPath: "@open-mercato/ui/backend/detail",
178
+ variants: [
179
+ {
180
+ id: "default",
181
+ title: "default",
182
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(LoadingMessage, { label: "Loading customer\u2026" }) }),
183
+ code: `import { LoadingMessage } from '@open-mercato/ui/backend/detail'
184
+
185
+ if (isLoading) return <LoadingMessage label={t('customers.people.detail.loading')} />`
186
+ }
187
+ ]
188
+ };
189
+ const errorMessageEntry = {
190
+ id: "error-message",
191
+ title: "ErrorMessage",
192
+ importPath: "@open-mercato/ui/backend/detail",
193
+ variants: [
194
+ {
195
+ id: "basic",
196
+ title: "Label only",
197
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(ErrorMessage, { label: "Failed to load customer." }) }),
198
+ code: `import { ErrorMessage } from '@open-mercato/ui/backend/detail'
199
+
200
+ if (error) return <ErrorMessage label={error} />`
201
+ },
202
+ {
203
+ id: "with-description-action",
204
+ title: "With description and action",
205
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(
206
+ ErrorMessage,
207
+ {
208
+ label: "Failed to load attachments.",
209
+ description: "The storage service did not respond in time.",
210
+ action: /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", children: "Retry" })
211
+ }
212
+ ) }),
213
+ code: `import { ErrorMessage } from '@open-mercato/ui/backend/detail'
214
+ import { Button } from '@open-mercato/ui/primitives/button'
215
+
216
+ <ErrorMessage
217
+ label="Failed to load attachments."
218
+ description="The storage service did not respond in time."
219
+ action={<Button variant="outline" size="sm" onClick={retry}>Retry</Button>}
220
+ />`
221
+ }
222
+ ]
223
+ };
224
+ const notesSectionEntry = {
225
+ id: "notes-section",
226
+ title: "NotesSection",
227
+ importPath: "@open-mercato/ui/backend/detail",
228
+ variants: [
229
+ {
230
+ id: "mock-adapter",
231
+ title: "Timeline (inline mock adapter \u2014 no API)",
232
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-2xl", children: /* @__PURE__ */ jsx(
233
+ NotesSection,
234
+ {
235
+ entityId: "person-1",
236
+ viewerUserId: "user-1",
237
+ viewerName: "Anna Nowak",
238
+ emptyLabel: "No notes yet",
239
+ addActionLabel: "Add note",
240
+ emptyState: {
241
+ title: "No notes yet",
242
+ actionLabel: "Add note",
243
+ description: "Notes added here are visible to the whole team."
244
+ },
245
+ translator: galleryTranslator,
246
+ dataAdapter: notesAdapter
247
+ }
248
+ ) }),
249
+ code: `import { NotesSection, type NotesDataAdapter } from '@open-mercato/ui/backend/detail'
250
+
251
+ // Implement the adapter against your module's API (apiCall) \u2014 never fork the section.
252
+ const notesAdapter: NotesDataAdapter = {
253
+ list: async ({ entityId }) => fetchNotes(entityId),
254
+ create: async ({ entityId, body }) => createNote(entityId, body),
255
+ update: async ({ id, patch }) => updateNote(id, patch),
256
+ delete: async ({ id }) => deleteNote(id),
257
+ }
258
+
259
+ <NotesSection
260
+ entityId={personId}
261
+ viewerUserId={viewer.id}
262
+ viewerName={viewer.name}
263
+ emptyLabel={t('customers.people.detail.notes.empty')}
264
+ addActionLabel={t('customers.people.detail.notes.add')}
265
+ emptyState={{
266
+ title: t('customers.people.detail.notes.emptyTitle'),
267
+ actionLabel: t('customers.people.detail.notes.add'),
268
+ }}
269
+ translator={t}
270
+ dataAdapter={notesAdapter}
271
+ />`
272
+ }
273
+ ]
274
+ };
275
+ const addressesSectionEntry = {
276
+ id: "addresses-section",
277
+ title: "AddressesSection",
278
+ importPath: "@open-mercato/ui/backend/detail",
279
+ variants: [
280
+ {
281
+ id: "mock-adapter",
282
+ title: "Address tiles (inline mock adapter \u2014 no API)",
283
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-2xl", children: /* @__PURE__ */ jsx(
284
+ AddressesSection,
285
+ {
286
+ entityId: "person-1",
287
+ emptyLabel: "No addresses yet",
288
+ addActionLabel: "Add address",
289
+ emptyState: { title: "No addresses yet", actionLabel: "Add address" },
290
+ translator: galleryTranslator,
291
+ dataAdapter: addressesAdapter
292
+ }
293
+ ) }),
294
+ code: `import { AddressesSection, type AddressDataAdapter } from '@open-mercato/ui/backend/detail'
295
+
296
+ const addressesAdapter: AddressDataAdapter = {
297
+ list: async ({ entityId }) => fetchAddresses(entityId),
298
+ create: async ({ entityId, payload }) => createAddress(entityId, payload),
299
+ update: async ({ id, payload }) => updateAddress(id, payload),
300
+ delete: async ({ id }) => deleteAddress(id),
301
+ }
302
+
303
+ <AddressesSection
304
+ entityId={personId}
305
+ emptyLabel={t('customers.people.detail.addresses.empty')}
306
+ addActionLabel={t('customers.people.detail.addresses.add')}
307
+ emptyState={{
308
+ title: t('customers.people.detail.addresses.emptyTitle'),
309
+ actionLabel: t('customers.people.detail.addresses.add'),
310
+ }}
311
+ translator={t}
312
+ dataAdapter={addressesAdapter}
313
+ />`
314
+ }
315
+ ]
316
+ };
317
+ const attachmentsSectionEntry = {
318
+ id: "attachments-section",
319
+ title: "AttachmentsSection",
320
+ importPath: "@open-mercato/ui/backend/detail",
321
+ variants: [
322
+ {
323
+ id: "unsaved-record",
324
+ title: "Unsaved record (recordId null \u2014 API fetch disabled)",
325
+ render: () => /* @__PURE__ */ jsx("div", { className: "w-full max-w-2xl", children: /* @__PURE__ */ jsx(
326
+ AttachmentsSection,
327
+ {
328
+ entityId: "customers:person",
329
+ recordId: null,
330
+ title: "Attachments",
331
+ description: "Files linked to this record."
332
+ }
333
+ ) }),
334
+ code: `import { AttachmentsSection } from '@open-mercato/ui/backend/detail'
335
+
336
+ // Fetches /api/attachments internally once recordId is set;
337
+ // with recordId={null} it renders the save-first placeholder.
338
+ <AttachmentsSection
339
+ entityId="customers:person"
340
+ recordId={person?.id ?? null}
341
+ title={t('customers.people.detail.attachments.title')}
342
+ description={t('customers.people.detail.attachments.description')}
343
+ />`
344
+ }
345
+ ]
346
+ };
347
+ const entries = [
348
+ detailFieldsSectionEntry,
349
+ loadingMessageEntry,
350
+ errorMessageEntry,
351
+ notesSectionEntry,
352
+ addressesSectionEntry,
353
+ attachmentsSectionEntry
354
+ ];
355
+ export {
356
+ entries
357
+ };
358
+ //# sourceMappingURL=detail.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/design_system/gallery/entries/detail.tsx"],
4
+ "sourcesContent": ["import * as React from 'react'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n AddressesSection,\n AttachmentsSection,\n DetailFieldsSection,\n ErrorMessage,\n LoadingMessage,\n NotesSection,\n type AddressDataAdapter,\n type DetailFieldConfig,\n type NotesSectionProps,\n} from '@open-mercato/ui/backend/detail'\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// Data-backed sections (Notes/Addresses) take adapter objects \u2014 the demos pass\n// inline in-memory adapters, so previews never touch an API. AttachmentsSection\n// fetches through `apiCall` internally and cannot take an adapter; it is shown\n// in its `recordId={null}` state, where fetching is disabled by design.\n\nconst saveNoop = async () => {}\n\nconst fieldGrid: DetailFieldConfig[] = [\n {\n key: 'first-name',\n kind: 'text',\n label: 'First name',\n value: 'Anna',\n emptyLabel: 'Add first name',\n onSave: saveNoop,\n },\n {\n key: 'phone',\n kind: 'text',\n label: 'Phone',\n value: null,\n emptyLabel: 'Add phone',\n onSave: saveNoop,\n },\n {\n key: 'status',\n kind: 'select',\n label: 'Status',\n value: 'active',\n emptyLabel: 'Set status',\n options: [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n ],\n onSave: saveNoop,\n },\n {\n key: 'notes',\n kind: 'multiline',\n label: 'Notes',\n value: 'Prefers email contact.',\n emptyLabel: 'Add notes',\n onSave: saveNoop,\n gridClassName: 'sm:col-span-2 md:col-span-3',\n },\n]\n\nconst fieldGridWithCustom: DetailFieldConfig[] = [\n {\n key: 'email',\n kind: 'text',\n label: 'Email',\n value: 'anna@example.com',\n emptyLabel: 'Add email',\n onSave: saveNoop,\n },\n {\n key: 'owner',\n kind: 'custom',\n label: 'Owner',\n emptyLabel: 'Unassigned',\n render: () => (\n <div className=\"space-y-1\">\n <div className=\"text-xs text-muted-foreground\">Owner</div>\n <Badge variant=\"muted\">Unassigned</Badge>\n </div>\n ),\n },\n]\n\n// Sections resolve their labels through an app translator in real pages; the\n// gallery translator just surfaces each key's fallback (or last segment).\nconst galleryTranslator = (key: string, fallback?: string) =>\n fallback ?? key.split('.').pop() ?? key\n\nconst notesAdapter: NotesSectionProps['dataAdapter'] = {\n list: async () => [\n {\n id: 'note-1',\n body: 'Asked for a revised quote \u2014 follow up on Friday.',\n createdAt: '2026-07-15T09:30:00.000Z',\n authorName: 'Anna Nowak',\n },\n {\n id: 'note-2',\n body: 'Prefers email contact over phone.',\n createdAt: '2026-07-10T14:05:00.000Z',\n authorName: 'Jan Kowalski',\n },\n ],\n create: async () => {},\n update: async () => {},\n delete: async () => {},\n}\n\nconst addressesAdapter: AddressDataAdapter = {\n list: async () => [\n {\n id: 'address-1',\n name: 'Headquarters',\n addressLine1: 'Prosta 51',\n city: 'Warszawa',\n postalCode: '00-838',\n country: 'PL',\n isPrimary: true,\n },\n {\n id: 'address-2',\n name: 'Warehouse',\n addressLine1: 'Magazynowa 7',\n city: 'Pruszk\u00F3w',\n postalCode: '05-800',\n country: 'PL',\n },\n ],\n create: async () => {},\n update: async () => {},\n delete: async () => {},\n}\n\nconst detailFieldsSectionEntry: GalleryEntry = {\n id: 'detail-fields-section',\n title: 'DetailFieldsSection',\n importPath: '@open-mercato/ui/backend/detail',\n variants: [\n {\n id: 'field-grid',\n title: 'Inline-editable field grid',\n render: () => (\n <div className=\"w-full\">\n <DetailFieldsSection fields={fieldGrid} />\n </div>\n ),\n code: `import { DetailFieldsSection, type DetailFieldConfig } from '@open-mercato/ui/backend/detail'\n\nconst fields: DetailFieldConfig[] = [\n { key: 'first-name', kind: 'text', label: 'First name', value: person.firstName, emptyLabel: 'Add first name', onSave: saveFirstName },\n { key: 'phone', kind: 'text', label: 'Phone', value: person.phone, emptyLabel: 'Add phone', onSave: savePhone },\n {\n key: 'status', kind: 'select', label: 'Status', value: person.status, emptyLabel: 'Set status',\n options: [{ value: 'active', label: 'Active' }, { value: 'inactive', label: 'Inactive' }],\n onSave: saveStatus,\n },\n {\n key: 'notes', kind: 'multiline', label: 'Notes', value: person.notes, emptyLabel: 'Add notes',\n onSave: saveNotes, gridClassName: 'sm:col-span-2 md:col-span-3',\n },\n]\n\n<DetailFieldsSection fields={fields} />`,\n },\n {\n id: 'custom-field',\n title: 'With a custom field cell',\n render: () => (\n <div className=\"w-full\">\n <DetailFieldsSection fields={fieldGridWithCustom} />\n </div>\n ),\n code: `import { DetailFieldsSection, type DetailFieldConfig } from '@open-mercato/ui/backend/detail'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\n\nconst fields: DetailFieldConfig[] = [\n { key: 'email', kind: 'text', label: 'Email', value: person.email, emptyLabel: 'Add email', onSave: saveEmail },\n {\n key: 'owner', kind: 'custom', label: 'Owner', emptyLabel: 'Unassigned',\n render: () => (\n <div className=\"space-y-1\">\n <div className=\"text-xs text-muted-foreground\">Owner</div>\n <Badge variant=\"muted\">Unassigned</Badge>\n </div>\n ),\n },\n]\n\n<DetailFieldsSection fields={fields} />`,\n },\n ],\n}\n\nconst loadingMessageEntry: GalleryEntry = {\n id: 'loading-message',\n title: 'LoadingMessage',\n importPath: '@open-mercato/ui/backend/detail',\n variants: [\n {\n id: 'default',\n title: 'default',\n render: () => (\n <div className=\"w-full max-w-md\">\n <LoadingMessage label=\"Loading customer\u2026\" />\n </div>\n ),\n code: `import { LoadingMessage } from '@open-mercato/ui/backend/detail'\n\nif (isLoading) return <LoadingMessage label={t('customers.people.detail.loading')} />`,\n },\n ],\n}\n\nconst errorMessageEntry: GalleryEntry = {\n id: 'error-message',\n title: 'ErrorMessage',\n importPath: '@open-mercato/ui/backend/detail',\n variants: [\n {\n id: 'basic',\n title: 'Label only',\n render: () => (\n <div className=\"w-full max-w-md\">\n <ErrorMessage label=\"Failed to load customer.\" />\n </div>\n ),\n code: `import { ErrorMessage } from '@open-mercato/ui/backend/detail'\n\nif (error) return <ErrorMessage label={error} />`,\n },\n {\n id: 'with-description-action',\n title: 'With description and action',\n render: () => (\n <div className=\"w-full max-w-md\">\n <ErrorMessage\n label=\"Failed to load attachments.\"\n description=\"The storage service did not respond in time.\"\n action={\n <Button variant=\"outline\" size=\"sm\">\n Retry\n </Button>\n }\n />\n </div>\n ),\n code: `import { ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport { Button } from '@open-mercato/ui/primitives/button'\n\n<ErrorMessage\n label=\"Failed to load attachments.\"\n description=\"The storage service did not respond in time.\"\n action={<Button variant=\"outline\" size=\"sm\" onClick={retry}>Retry</Button>}\n/>`,\n },\n ],\n}\n\nconst notesSectionEntry: GalleryEntry = {\n id: 'notes-section',\n title: 'NotesSection',\n importPath: '@open-mercato/ui/backend/detail',\n variants: [\n {\n id: 'mock-adapter',\n title: 'Timeline (inline mock adapter \u2014 no API)',\n render: () => (\n <div className=\"w-full max-w-2xl\">\n <NotesSection\n entityId=\"person-1\"\n viewerUserId=\"user-1\"\n viewerName=\"Anna Nowak\"\n emptyLabel=\"No notes yet\"\n addActionLabel=\"Add note\"\n emptyState={{\n title: 'No notes yet',\n actionLabel: 'Add note',\n description: 'Notes added here are visible to the whole team.',\n }}\n translator={galleryTranslator}\n dataAdapter={notesAdapter}\n />\n </div>\n ),\n code: `import { NotesSection, type NotesDataAdapter } from '@open-mercato/ui/backend/detail'\n\n// Implement the adapter against your module's API (apiCall) \u2014 never fork the section.\nconst notesAdapter: NotesDataAdapter = {\n list: async ({ entityId }) => fetchNotes(entityId),\n create: async ({ entityId, body }) => createNote(entityId, body),\n update: async ({ id, patch }) => updateNote(id, patch),\n delete: async ({ id }) => deleteNote(id),\n}\n\n<NotesSection\n entityId={personId}\n viewerUserId={viewer.id}\n viewerName={viewer.name}\n emptyLabel={t('customers.people.detail.notes.empty')}\n addActionLabel={t('customers.people.detail.notes.add')}\n emptyState={{\n title: t('customers.people.detail.notes.emptyTitle'),\n actionLabel: t('customers.people.detail.notes.add'),\n }}\n translator={t}\n dataAdapter={notesAdapter}\n/>`,\n },\n ],\n}\n\nconst addressesSectionEntry: GalleryEntry = {\n id: 'addresses-section',\n title: 'AddressesSection',\n importPath: '@open-mercato/ui/backend/detail',\n variants: [\n {\n id: 'mock-adapter',\n title: 'Address tiles (inline mock adapter \u2014 no API)',\n render: () => (\n <div className=\"w-full max-w-2xl\">\n <AddressesSection\n entityId=\"person-1\"\n emptyLabel=\"No addresses yet\"\n addActionLabel=\"Add address\"\n emptyState={{ title: 'No addresses yet', actionLabel: 'Add address' }}\n translator={galleryTranslator}\n dataAdapter={addressesAdapter}\n />\n </div>\n ),\n code: `import { AddressesSection, type AddressDataAdapter } from '@open-mercato/ui/backend/detail'\n\nconst addressesAdapter: AddressDataAdapter = {\n list: async ({ entityId }) => fetchAddresses(entityId),\n create: async ({ entityId, payload }) => createAddress(entityId, payload),\n update: async ({ id, payload }) => updateAddress(id, payload),\n delete: async ({ id }) => deleteAddress(id),\n}\n\n<AddressesSection\n entityId={personId}\n emptyLabel={t('customers.people.detail.addresses.empty')}\n addActionLabel={t('customers.people.detail.addresses.add')}\n emptyState={{\n title: t('customers.people.detail.addresses.emptyTitle'),\n actionLabel: t('customers.people.detail.addresses.add'),\n }}\n translator={t}\n dataAdapter={addressesAdapter}\n/>`,\n },\n ],\n}\n\nconst attachmentsSectionEntry: GalleryEntry = {\n id: 'attachments-section',\n title: 'AttachmentsSection',\n importPath: '@open-mercato/ui/backend/detail',\n variants: [\n {\n id: 'unsaved-record',\n title: 'Unsaved record (recordId null \u2014 API fetch disabled)',\n render: () => (\n <div className=\"w-full max-w-2xl\">\n <AttachmentsSection\n entityId=\"customers:person\"\n recordId={null}\n title=\"Attachments\"\n description=\"Files linked to this record.\"\n />\n </div>\n ),\n code: `import { AttachmentsSection } from '@open-mercato/ui/backend/detail'\n\n// Fetches /api/attachments internally once recordId is set;\n// with recordId={null} it renders the save-first placeholder.\n<AttachmentsSection\n entityId=\"customers:person\"\n recordId={person?.id ?? null}\n title={t('customers.people.detail.attachments.title')}\n description={t('customers.people.detail.attachments.description')}\n/>`,\n },\n ],\n}\n\nexport const entries: GalleryEntry[] = [\n detailFieldsSectionEntry,\n loadingMessageEntry,\n errorMessageEntry,\n notesSectionEntry,\n addressesSectionEntry,\n attachmentsSectionEntry,\n]\n"],
5
+ "mappings": "AAmFM,SACE,KADF;AAlFN,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAaP,MAAM,WAAW,YAAY;AAAC;AAE9B,MAAM,YAAiC;AAAA,EACrC;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,MACP,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,MACnC,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,IACzC;AAAA,IACA,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,eAAe;AAAA,EACjB;AACF;AAEA,MAAM,sBAA2C;AAAA,EAC/C;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ,MACN,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,SAAI,WAAU,iCAAgC,mBAAK;AAAA,MACpD,oBAAC,SAAM,SAAQ,SAAQ,wBAAU;AAAA,OACnC;AAAA,EAEJ;AACF;AAIA,MAAM,oBAAoB,CAAC,KAAa,aACtC,YAAY,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;AAEtC,MAAM,eAAiD;AAAA,EACrD,MAAM,YAAY;AAAA,IAChB;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EACA,QAAQ,YAAY;AAAA,EAAC;AAAA,EACrB,QAAQ,YAAY;AAAA,EAAC;AAAA,EACrB,QAAQ,YAAY;AAAA,EAAC;AACvB;AAEA,MAAM,mBAAuC;AAAA,EAC3C,MAAM,YAAY;AAAA,IAChB;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,cAAc;AAAA,MACd,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,QAAQ,YAAY;AAAA,EAAC;AAAA,EACrB,QAAQ,YAAY;AAAA,EAAC;AAAA,EACrB,QAAQ,YAAY;AAAA,EAAC;AACvB;AAEA,MAAM,2BAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,UACb,8BAAC,uBAAoB,QAAQ,WAAW,GAC1C;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,UACb,8BAAC,uBAAoB,QAAQ,qBAAqB,GACpD;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBR;AAAA,EACF;AACF;AAEA,MAAM,sBAAoC;AAAA,EACxC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,mBACb,8BAAC,kBAAe,OAAM,0BAAoB,GAC5C;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA,IAGR;AAAA,EACF;AACF;AAEA,MAAM,oBAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,mBACb,8BAAC,gBAAa,OAAM,4BAA2B,GACjD;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA,IAGR;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,mBACb;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,QACE,oBAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,mBAEpC;AAAA;AAAA,MAEJ,GACF;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQR;AAAA,EACF;AACF;AAEA,MAAM,oBAAkC;AAAA,EACtC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,oBACb;AAAA,QAAC;AAAA;AAAA,UACC,UAAS;AAAA,UACT,cAAa;AAAA,UACb,YAAW;AAAA,UACX,YAAW;AAAA,UACX,gBAAe;AAAA,UACf,YAAY;AAAA,YACV,OAAO;AAAA,YACP,aAAa;AAAA,YACb,aAAa;AAAA,UACf;AAAA,UACA,YAAY;AAAA,UACZ,aAAa;AAAA;AAAA,MACf,GACF;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAuBR;AAAA,EACF;AACF;AAEA,MAAM,wBAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,oBACb;AAAA,QAAC;AAAA;AAAA,UACC,UAAS;AAAA,UACT,YAAW;AAAA,UACX,gBAAe;AAAA,UACf,YAAY,EAAE,OAAO,oBAAoB,aAAa,cAAc;AAAA,UACpE,YAAY;AAAA,UACZ,aAAa;AAAA;AAAA,MACf,GACF;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoBR;AAAA,EACF;AACF;AAEA,MAAM,0BAAwC;AAAA,EAC5C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ,MACN,oBAAC,SAAI,WAAU,oBACb;AAAA,QAAC;AAAA;AAAA,UACC,UAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAM;AAAA,UACN,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MAEF,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUR;AAAA,EACF;AACF;AAEO,MAAM,UAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
6
+ "names": []
7
+ }