@endora-commerce/mod-cms 0.0.0-stage → 0.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -2
  3. package/dist/admin/api/cms-client.d.ts +77 -0
  4. package/dist/admin/api/cms-client.d.ts.map +1 -0
  5. package/dist/admin/api/cms-client.js +162 -0
  6. package/dist/admin/api/cms-client.js.map +1 -0
  7. package/dist/admin/components/AdminCatalogPreviewProvider.d.ts +6 -0
  8. package/dist/admin/components/AdminCatalogPreviewProvider.d.ts.map +1 -0
  9. package/dist/admin/components/AdminCatalogPreviewProvider.js +74 -0
  10. package/dist/admin/components/AdminCatalogPreviewProvider.js.map +1 -0
  11. package/dist/admin/components/AdminCmsAssetProvider.d.ts +9 -0
  12. package/dist/admin/components/AdminCmsAssetProvider.d.ts.map +1 -0
  13. package/dist/admin/components/AdminCmsAssetProvider.js +50 -0
  14. package/dist/admin/components/AdminCmsAssetProvider.js.map +1 -0
  15. package/dist/admin/components/BackgroundFields.d.ts +4 -0
  16. package/dist/admin/components/BackgroundFields.d.ts.map +1 -0
  17. package/dist/admin/components/BackgroundFields.js +40 -0
  18. package/dist/admin/components/BackgroundFields.js.map +1 -0
  19. package/dist/admin/components/ButtonLinkFields.d.ts +6 -0
  20. package/dist/admin/components/ButtonLinkFields.d.ts.map +1 -0
  21. package/dist/admin/components/ButtonLinkFields.js +127 -0
  22. package/dist/admin/components/ButtonLinkFields.js.map +1 -0
  23. package/dist/admin/components/CarouselPreviewNav.d.ts +12 -0
  24. package/dist/admin/components/CarouselPreviewNav.d.ts.map +1 -0
  25. package/dist/admin/components/CarouselPreviewNav.js +31 -0
  26. package/dist/admin/components/CarouselPreviewNav.js.map +1 -0
  27. package/dist/admin/components/CmsContentEditorLayout.d.ts +12 -0
  28. package/dist/admin/components/CmsContentEditorLayout.d.ts.map +1 -0
  29. package/dist/admin/components/CmsContentEditorLayout.js +9 -0
  30. package/dist/admin/components/CmsContentEditorLayout.js.map +1 -0
  31. package/dist/admin/components/ComponentDragHandle.d.ts +6 -0
  32. package/dist/admin/components/ComponentDragHandle.d.ts.map +1 -0
  33. package/dist/admin/components/ComponentDragHandle.js +119 -0
  34. package/dist/admin/components/ComponentDragHandle.js.map +1 -0
  35. package/dist/admin/components/ContentSliderActionBarExtras.d.ts +6 -0
  36. package/dist/admin/components/ContentSliderActionBarExtras.d.ts.map +1 -0
  37. package/dist/admin/components/ContentSliderActionBarExtras.js +109 -0
  38. package/dist/admin/components/ContentSliderActionBarExtras.js.map +1 -0
  39. package/dist/admin/components/HookBlockAttachmentsPanel.d.ts +9 -0
  40. package/dist/admin/components/HookBlockAttachmentsPanel.d.ts.map +1 -0
  41. package/dist/admin/components/HookBlockAttachmentsPanel.js +137 -0
  42. package/dist/admin/components/HookBlockAttachmentsPanel.js.map +1 -0
  43. package/dist/admin/components/PageBuilderActionBar.d.ts +10 -0
  44. package/dist/admin/components/PageBuilderActionBar.d.ts.map +1 -0
  45. package/dist/admin/components/PageBuilderActionBar.js +118 -0
  46. package/dist/admin/components/PageBuilderActionBar.js.map +1 -0
  47. package/dist/admin/components/PageBuilderDrawer.d.ts +16 -0
  48. package/dist/admin/components/PageBuilderDrawer.d.ts.map +1 -0
  49. package/dist/admin/components/PageBuilderDrawer.js +53 -0
  50. package/dist/admin/components/PageBuilderDrawer.js.map +1 -0
  51. package/dist/admin/components/PageBuilderEditor.d.ts +45 -0
  52. package/dist/admin/components/PageBuilderEditor.d.ts.map +1 -0
  53. package/dist/admin/components/PageBuilderEditor.js +632 -0
  54. package/dist/admin/components/PageBuilderEditor.js.map +1 -0
  55. package/dist/admin/components/PuckActionGuard.d.ts +12 -0
  56. package/dist/admin/components/PuckActionGuard.d.ts.map +1 -0
  57. package/dist/admin/components/PuckActionGuard.js +30 -0
  58. package/dist/admin/components/PuckActionGuard.js.map +1 -0
  59. package/dist/admin/components/RowLayoutPicker.d.ts +8 -0
  60. package/dist/admin/components/RowLayoutPicker.d.ts.map +1 -0
  61. package/dist/admin/components/RowLayoutPicker.js +17 -0
  62. package/dist/admin/components/RowLayoutPicker.js.map +1 -0
  63. package/dist/admin/components/SliderPreviewActionBarExtras.d.ts +6 -0
  64. package/dist/admin/components/SliderPreviewActionBarExtras.d.ts.map +1 -0
  65. package/dist/admin/components/SliderPreviewActionBarExtras.js +32 -0
  66. package/dist/admin/components/SliderPreviewActionBarExtras.js.map +1 -0
  67. package/dist/admin/components/admin-catalog-preview-map.d.ts +17 -0
  68. package/dist/admin/components/admin-catalog-preview-map.d.ts.map +1 -0
  69. package/dist/admin/components/admin-catalog-preview-map.js +18 -0
  70. package/dist/admin/components/admin-catalog-preview-map.js.map +1 -0
  71. package/dist/admin/components/build-viewports.d.ts +23 -0
  72. package/dist/admin/components/build-viewports.d.ts.map +1 -0
  73. package/dist/admin/components/build-viewports.js +23 -0
  74. package/dist/admin/components/build-viewports.js.map +1 -0
  75. package/dist/admin/components/cms-template-layout.d.ts +16 -0
  76. package/dist/admin/components/cms-template-layout.d.ts.map +1 -0
  77. package/dist/admin/components/cms-template-layout.js +53 -0
  78. package/dist/admin/components/cms-template-layout.js.map +1 -0
  79. package/dist/admin/components/page-builder-i18n.d.ts +27 -0
  80. package/dist/admin/components/page-builder-i18n.d.ts.map +1 -0
  81. package/dist/admin/components/page-builder-i18n.js +34 -0
  82. package/dist/admin/components/page-builder-i18n.js.map +1 -0
  83. package/dist/admin/components/puck-safe.d.ts +10 -0
  84. package/dist/admin/components/puck-safe.d.ts.map +1 -0
  85. package/dist/admin/components/puck-safe.js +22 -0
  86. package/dist/admin/components/puck-safe.js.map +1 -0
  87. package/dist/admin/components/scope-utils.d.ts +4 -0
  88. package/dist/admin/components/scope-utils.d.ts.map +1 -0
  89. package/dist/admin/components/scope-utils.js +7 -0
  90. package/dist/admin/components/scope-utils.js.map +1 -0
  91. package/dist/admin/editors/BlockEditor.d.ts +9 -0
  92. package/dist/admin/editors/BlockEditor.d.ts.map +1 -0
  93. package/dist/admin/editors/BlockEditor.js +217 -0
  94. package/dist/admin/editors/BlockEditor.js.map +1 -0
  95. package/dist/admin/editors/PageEditor.d.ts +9 -0
  96. package/dist/admin/editors/PageEditor.d.ts.map +1 -0
  97. package/dist/admin/editors/PageEditor.js +316 -0
  98. package/dist/admin/editors/PageEditor.js.map +1 -0
  99. package/dist/admin/editors/TemplateEditor.d.ts +9 -0
  100. package/dist/admin/editors/TemplateEditor.d.ts.map +1 -0
  101. package/dist/admin/editors/TemplateEditor.js +180 -0
  102. package/dist/admin/editors/TemplateEditor.js.map +1 -0
  103. package/dist/admin/index.d.ts +38 -0
  104. package/dist/admin/index.d.ts.map +1 -0
  105. package/dist/admin/index.js +144 -0
  106. package/dist/admin/index.js.map +1 -0
  107. package/dist/admin/pages/BlocksListPage.d.ts +9 -0
  108. package/dist/admin/pages/BlocksListPage.d.ts.map +1 -0
  109. package/dist/admin/pages/BlocksListPage.js +47 -0
  110. package/dist/admin/pages/BlocksListPage.js.map +1 -0
  111. package/dist/admin/pages/HooksPage.d.ts +9 -0
  112. package/dist/admin/pages/HooksPage.d.ts.map +1 -0
  113. package/dist/admin/pages/HooksPage.js +41 -0
  114. package/dist/admin/pages/HooksPage.js.map +1 -0
  115. package/dist/admin/pages/PagesListPage.d.ts +9 -0
  116. package/dist/admin/pages/PagesListPage.d.ts.map +1 -0
  117. package/dist/admin/pages/PagesListPage.js +51 -0
  118. package/dist/admin/pages/PagesListPage.js.map +1 -0
  119. package/dist/admin/pages/TemplatesListPage.d.ts +9 -0
  120. package/dist/admin/pages/TemplatesListPage.d.ts.map +1 -0
  121. package/dist/admin/pages/TemplatesListPage.js +47 -0
  122. package/dist/admin/pages/TemplatesListPage.js.map +1 -0
  123. package/dist/admin-ui/index.d.ts +90 -0
  124. package/dist/admin-ui/index.d.ts.map +1 -0
  125. package/dist/admin-ui/index.js +89 -0
  126. package/dist/admin-ui/index.js.map +1 -0
  127. package/dist/backend/cli/block-names.d.ts +92 -0
  128. package/dist/backend/cli/block-names.d.ts.map +1 -0
  129. package/dist/backend/cli/block-names.js +132 -0
  130. package/dist/backend/cli/block-names.js.map +1 -0
  131. package/dist/backend/entities/cms-block.entity.d.ts +20 -0
  132. package/dist/backend/entities/cms-block.entity.d.ts.map +1 -0
  133. package/dist/backend/entities/cms-block.entity.js +77 -0
  134. package/dist/backend/entities/cms-block.entity.js.map +1 -0
  135. package/dist/backend/entities/cms-hook-block-attachment.entity.d.ts +15 -0
  136. package/dist/backend/entities/cms-hook-block-attachment.entity.d.ts.map +1 -0
  137. package/dist/backend/entities/cms-hook-block-attachment.entity.js +46 -0
  138. package/dist/backend/entities/cms-hook-block-attachment.entity.js.map +1 -0
  139. package/dist/backend/entities/cms-hook.entity.d.ts +20 -0
  140. package/dist/backend/entities/cms-hook.entity.d.ts.map +1 -0
  141. package/dist/backend/entities/cms-hook.entity.js +73 -0
  142. package/dist/backend/entities/cms-hook.entity.js.map +1 -0
  143. package/dist/backend/entities/cms-page.entity.d.ts +43 -0
  144. package/dist/backend/entities/cms-page.entity.d.ts.map +1 -0
  145. package/dist/backend/entities/cms-page.entity.js +140 -0
  146. package/dist/backend/entities/cms-page.entity.js.map +1 -0
  147. package/dist/backend/entities/cms-template.entity.d.ts +20 -0
  148. package/dist/backend/entities/cms-template.entity.d.ts.map +1 -0
  149. package/dist/backend/entities/cms-template.entity.js +73 -0
  150. package/dist/backend/entities/cms-template.entity.js.map +1 -0
  151. package/dist/backend/index.d.ts +157 -0
  152. package/dist/backend/index.d.ts.map +1 -0
  153. package/dist/backend/index.js +317 -0
  154. package/dist/backend/index.js.map +1 -0
  155. package/dist/backend/plugin.d.ts +81 -0
  156. package/dist/backend/plugin.d.ts.map +1 -0
  157. package/dist/backend/plugin.js +81 -0
  158. package/dist/backend/plugin.js.map +1 -0
  159. package/dist/backend/routes.admin.d.ts +19 -0
  160. package/dist/backend/routes.admin.d.ts.map +1 -0
  161. package/dist/backend/routes.admin.js +164 -0
  162. package/dist/backend/routes.admin.js.map +1 -0
  163. package/dist/backend/routes.storefront.d.ts +6 -0
  164. package/dist/backend/routes.storefront.d.ts.map +1 -0
  165. package/dist/backend/routes.storefront.js +89 -0
  166. package/dist/backend/routes.storefront.js.map +1 -0
  167. package/dist/backend/services/asset-embed-resolver.d.ts +17 -0
  168. package/dist/backend/services/asset-embed-resolver.d.ts.map +1 -0
  169. package/dist/backend/services/asset-embed-resolver.js +40 -0
  170. package/dist/backend/services/asset-embed-resolver.js.map +1 -0
  171. package/dist/backend/services/asset-references.d.ts +4 -0
  172. package/dist/backend/services/asset-references.d.ts.map +1 -0
  173. package/dist/backend/services/asset-references.js +55 -0
  174. package/dist/backend/services/asset-references.js.map +1 -0
  175. package/dist/backend/services/cms-block-read-port.d.ts +27 -0
  176. package/dist/backend/services/cms-block-read-port.d.ts.map +1 -0
  177. package/dist/backend/services/cms-block-read-port.js +50 -0
  178. package/dist/backend/services/cms-block-read-port.js.map +1 -0
  179. package/dist/backend/services/cms-block-seed-port.d.ts +31 -0
  180. package/dist/backend/services/cms-block-seed-port.d.ts.map +1 -0
  181. package/dist/backend/services/cms-block-seed-port.js +68 -0
  182. package/dist/backend/services/cms-block-seed-port.js.map +1 -0
  183. package/dist/backend/services/cms-block-service.d.ts +38 -0
  184. package/dist/backend/services/cms-block-service.d.ts.map +1 -0
  185. package/dist/backend/services/cms-block-service.js +218 -0
  186. package/dist/backend/services/cms-block-service.js.map +1 -0
  187. package/dist/backend/services/cms-cache.d.ts +54 -0
  188. package/dist/backend/services/cms-cache.d.ts.map +1 -0
  189. package/dist/backend/services/cms-cache.js +113 -0
  190. package/dist/backend/services/cms-cache.js.map +1 -0
  191. package/dist/backend/services/cms-hook-service.d.ts +35 -0
  192. package/dist/backend/services/cms-hook-service.d.ts.map +1 -0
  193. package/dist/backend/services/cms-hook-service.js +216 -0
  194. package/dist/backend/services/cms-hook-service.js.map +1 -0
  195. package/dist/backend/services/cms-language-reference.d.ts +11 -0
  196. package/dist/backend/services/cms-language-reference.d.ts.map +1 -0
  197. package/dist/backend/services/cms-language-reference.js +26 -0
  198. package/dist/backend/services/cms-language-reference.js.map +1 -0
  199. package/dist/backend/services/cms-page-read-port.d.ts +23 -0
  200. package/dist/backend/services/cms-page-read-port.d.ts.map +1 -0
  201. package/dist/backend/services/cms-page-read-port.js +54 -0
  202. package/dist/backend/services/cms-page-read-port.js.map +1 -0
  203. package/dist/backend/services/cms-page-service.d.ts +104 -0
  204. package/dist/backend/services/cms-page-service.d.ts.map +1 -0
  205. package/dist/backend/services/cms-page-service.js +468 -0
  206. package/dist/backend/services/cms-page-service.js.map +1 -0
  207. package/dist/backend/services/cms-reference-registry.d.ts +30 -0
  208. package/dist/backend/services/cms-reference-registry.d.ts.map +1 -0
  209. package/dist/backend/services/cms-reference-registry.js +98 -0
  210. package/dist/backend/services/cms-reference-registry.js.map +1 -0
  211. package/dist/backend/services/cms-template-service.d.ts +37 -0
  212. package/dist/backend/services/cms-template-service.d.ts.map +1 -0
  213. package/dist/backend/services/cms-template-service.js +205 -0
  214. package/dist/backend/services/cms-template-service.js.map +1 -0
  215. package/dist/backend/services/content-tree-walker.d.ts +7 -0
  216. package/dist/backend/services/content-tree-walker.d.ts.map +1 -0
  217. package/dist/backend/services/content-tree-walker.js +89 -0
  218. package/dist/backend/services/content-tree-walker.js.map +1 -0
  219. package/dist/backend/services/page-builder-registry.d.ts +120 -0
  220. package/dist/backend/services/page-builder-registry.d.ts.map +1 -0
  221. package/dist/backend/services/page-builder-registry.js +220 -0
  222. package/dist/backend/services/page-builder-registry.js.map +1 -0
  223. package/dist/backend/services/seed-hooks.d.ts +22 -0
  224. package/dist/backend/services/seed-hooks.d.ts.map +1 -0
  225. package/dist/backend/services/seed-hooks.js +94 -0
  226. package/dist/backend/services/seed-hooks.js.map +1 -0
  227. package/dist/backend/services/storefront-resolver.d.ts +71 -0
  228. package/dist/backend/services/storefront-resolver.d.ts.map +1 -0
  229. package/dist/backend/services/storefront-resolver.js +329 -0
  230. package/dist/backend/services/storefront-resolver.js.map +1 -0
  231. package/dist/manifest.d.ts +225 -0
  232. package/dist/manifest.d.ts.map +1 -0
  233. package/dist/manifest.js +695 -0
  234. package/dist/manifest.js.map +1 -0
  235. package/dist/migrations/20260425T162418_cms_pages_init.d.ts +10 -0
  236. package/dist/migrations/20260425T162418_cms_pages_init.d.ts.map +1 -0
  237. package/dist/migrations/20260425T162418_cms_pages_init.js +30 -0
  238. package/dist/migrations/20260425T162418_cms_pages_init.js.map +1 -0
  239. package/dist/migrations/20260505T130214_cms_init.d.ts +28 -0
  240. package/dist/migrations/20260505T130214_cms_init.d.ts.map +1 -0
  241. package/dist/migrations/20260505T130214_cms_init.js +332 -0
  242. package/dist/migrations/20260505T130214_cms_init.js.map +1 -0
  243. package/dist/migrations/20260903T101741_cms_namespace_block_names.d.ts +6 -0
  244. package/dist/migrations/20260903T101741_cms_namespace_block_names.d.ts.map +1 -0
  245. package/dist/migrations/20260903T101741_cms_namespace_block_names.js +60 -0
  246. package/dist/migrations/20260903T101741_cms_namespace_block_names.js.map +1 -0
  247. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.d.ts +27 -0
  248. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.d.ts.map +1 -0
  249. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.js +44 -0
  250. package/dist/migrations/20260912T094733_cms_sales_channel_cms_pages.js.map +1 -0
  251. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.d.ts +32 -0
  252. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.d.ts.map +1 -0
  253. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.js +36 -0
  254. package/dist/migrations/20260912T125709_cms_page_body_asset_ref_index.js.map +1 -0
  255. package/dist/migrations/index.d.ts +31 -0
  256. package/dist/migrations/index.d.ts.map +1 -0
  257. package/dist/migrations/index.js +37 -0
  258. package/dist/migrations/index.js.map +1 -0
  259. package/docs/cms/extending-page-builder.md +256 -0
  260. package/docs/cms/index.md +233 -0
  261. package/i18n/en.json +231 -0
  262. package/i18n/pl.json +231 -0
  263. package/package.json +125 -3
  264. package/tailwind.css +16 -0
@@ -0,0 +1,137 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { ArrowDown, ArrowUp, GripVertical, Plus, RefreshCw, Trash2 } from 'lucide-react';
4
+ import { TouchReorderButtons } from '@endora-commerce/admin-kit/components';
5
+ import { Alert, AlertDescription, Badge, Button, Card, CardContent, CardHeader, CardTitle, Input, Select } from '@endora-commerce/admin-kit/ui';
6
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@endora-commerce/admin-kit/ui';
7
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
8
+ import { cmsClient } from '../api/cms-client.js';
9
+ function nextPosition(rows) {
10
+ const max = rows.reduce((out, row) => Math.max(out, row.position), -10);
11
+ return max + 10;
12
+ }
13
+ function move(items, from, to) {
14
+ const copy = [...items];
15
+ const [item] = copy.splice(from, 1);
16
+ if (item === undefined)
17
+ return items;
18
+ copy.splice(to, 0, item);
19
+ return copy;
20
+ }
21
+ export function HookBlockAttachmentsPanel({ hook, onChanged, }) {
22
+ const t = useTranslation('cms');
23
+ const [attachments, setAttachments] = useState([]);
24
+ const [blocks, setBlocks] = useState([]);
25
+ const [selectedBlockId, setSelectedBlockId] = useState('');
26
+ const [position, setPosition] = useState(0);
27
+ const [dragBlockId, setDragBlockId] = useState(null);
28
+ const [loading, setLoading] = useState(false);
29
+ const [saving, setSaving] = useState(false);
30
+ const [error, setError] = useState(null);
31
+ const attachedIds = useMemo(() => new Set(attachments.map((row) => row.blockId)), [attachments]);
32
+ const attachableBlocks = useMemo(() => blocks.filter((block) => !attachedIds.has(block.id)), [attachedIds, blocks]);
33
+ const load = useCallback(async () => {
34
+ if (!hook) {
35
+ setAttachments([]);
36
+ setBlocks([]);
37
+ setSelectedBlockId('');
38
+ return;
39
+ }
40
+ setLoading(true);
41
+ setError(null);
42
+ try {
43
+ const [hookDetail, blockList] = await Promise.all([
44
+ cmsClient.getHook(hook.id),
45
+ cmsClient.listBlocks(),
46
+ ]);
47
+ setAttachments(hookDetail.attachments);
48
+ setBlocks(blockList.data);
49
+ setPosition(nextPosition(hookDetail.attachments));
50
+ setSelectedBlockId((current) => blockList.data.some((block) => block.id === current) ? current : '');
51
+ }
52
+ catch (err) {
53
+ setError(err instanceof Error ? err.message : String(err));
54
+ }
55
+ finally {
56
+ setLoading(false);
57
+ }
58
+ }, [hook]);
59
+ useEffect(() => {
60
+ void load();
61
+ }, [load]);
62
+ useEffect(() => {
63
+ if (!selectedBlockId && attachableBlocks[0])
64
+ setSelectedBlockId(attachableBlocks[0].id);
65
+ }, [attachableBlocks, selectedBlockId]);
66
+ async function addAttachment() {
67
+ if (!hook || !selectedBlockId)
68
+ return;
69
+ setSaving(true);
70
+ setError(null);
71
+ try {
72
+ const updated = await cmsClient.addHookAttachment(hook.id, {
73
+ blockId: selectedBlockId,
74
+ position,
75
+ });
76
+ setAttachments(updated);
77
+ setPosition(nextPosition(updated));
78
+ setSelectedBlockId('');
79
+ onChanged?.();
80
+ }
81
+ catch (err) {
82
+ setError(err instanceof Error ? err.message : String(err));
83
+ }
84
+ finally {
85
+ setSaving(false);
86
+ }
87
+ }
88
+ async function persistOrder(next) {
89
+ if (!hook)
90
+ return;
91
+ setSaving(true);
92
+ setError(null);
93
+ const normalized = next.map((row, index) => ({ ...row, position: index * 10 }));
94
+ setAttachments(normalized);
95
+ try {
96
+ await Promise.all(normalized.map((row) => cmsClient.reorderHookAttachment(hook.id, row.blockId, row.position)));
97
+ onChanged?.();
98
+ }
99
+ catch (err) {
100
+ setError(err instanceof Error ? err.message : String(err));
101
+ await load();
102
+ }
103
+ finally {
104
+ setSaving(false);
105
+ }
106
+ }
107
+ async function removeAttachment(blockId) {
108
+ if (!hook)
109
+ return;
110
+ setSaving(true);
111
+ setError(null);
112
+ try {
113
+ await cmsClient.removeHookAttachment(hook.id, blockId);
114
+ const updated = attachments.filter((row) => row.blockId !== blockId);
115
+ setAttachments(updated);
116
+ setPosition(nextPosition(updated));
117
+ onChanged?.();
118
+ }
119
+ catch (err) {
120
+ setError(err instanceof Error ? err.message : String(err));
121
+ }
122
+ finally {
123
+ setSaving(false);
124
+ }
125
+ }
126
+ if (!hook) {
127
+ return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: t('hookAttachments.title') }) }), _jsx(CardContent, { children: _jsx("p", { className: "text-sm text-muted-foreground", children: t('hookAttachments.selectHook') }) })] }));
128
+ }
129
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between gap-2", children: [_jsx(CardTitle, { className: "min-w-0 text-base", children: _jsx("span", { className: "truncate", children: hook.name }) }), _jsx(Button, { type: "button", size: "icon", variant: "outline", title: t('hookAttachments.refresh'), onClick: () => void load(), disabled: loading || saving, children: _jsx(RefreshCw, { className: "h-4 w-4" }) })] }), _jsxs(CardContent, { className: "space-y-4", children: [error ? (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) })) : null, _jsxs("div", { className: "grid grid-cols-[1fr_5rem_auto] gap-2", children: [_jsxs(Select, { value: selectedBlockId, onChange: (event) => setSelectedBlockId(event.target.value), disabled: saving || attachableBlocks.length === 0, children: [attachableBlocks.length === 0 ? (_jsx("option", { value: "", children: t('hookAttachments.noAvailableBlocks') })) : null, attachableBlocks.map((block) => (_jsxs("option", { value: block.id, children: [block.name, " (", block.code, ")"] }, block.id)))] }), _jsx(Input, { type: "number", min: 0, value: position, onChange: (event) => setPosition(Number(event.target.value)), disabled: saving }), _jsxs(Button, { type: "button", title: t('hookAttachments.addBlock'), onClick: () => void addAttachment(), disabled: saving || !selectedBlockId, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), t('common.add')] })] }), loading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('hookAttachments.loading') })) : attachments.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('hookAttachments.empty') })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "w-10" }), _jsx(TableHead, { children: t('columns.block') }), _jsx(TableHead, { children: t('columns.code') }), _jsx(TableHead, { className: "w-24 text-right", children: t('columns.position') }), _jsx(TableHead, { className: "w-32 text-right", children: t('columns.order') })] }) }), _jsx(TableBody, { children: attachments.map((attachment, index) => (_jsxs(TableRow, { draggable: true, onDragStart: () => setDragBlockId(attachment.blockId), onDragOver: (event) => event.preventDefault(), onDrop: () => {
130
+ const from = attachments.findIndex((row) => row.blockId === dragBlockId);
131
+ if (from < 0 || from === index)
132
+ return;
133
+ void persistOrder(move(attachments, from, index));
134
+ }, onDragEnd: () => setDragBlockId(null), children: [_jsx(TableCell, { children: _jsx(GripVertical, { className: "h-4 w-4 text-muted-foreground" }) }), _jsx(TableCell, { children: _jsx("span", { className: "font-medium", children: blocks.find((block) => block.id === attachment.blockId)?.name ??
135
+ attachment.blockId }) }), _jsx(TableCell, { className: "font-mono text-xs", children: attachment.blockCode }), _jsx(TableCell, { className: "text-right", children: _jsx(Badge, { variant: "outline", children: attachment.position }) }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex justify-end gap-1 items-center", children: [_jsx(TouchReorderButtons, { disabled: saving, onMoveUp: () => void persistOrder(move(attachments, index, index - 1)), onMoveDown: () => void persistOrder(move(attachments, index, index + 1)), disableUp: index === 0, disableDown: index === attachments.length - 1 }), _jsx(Button, { type: "button", size: "icon", variant: "ghost", className: "b2b-reorder-desktop-only", title: t('hookAttachments.moveUp'), disabled: saving || index === 0, onClick: () => void persistOrder(move(attachments, index, index - 1)), children: _jsx(ArrowUp, { className: "h-4 w-4" }) }), _jsx(Button, { type: "button", size: "icon", variant: "ghost", className: "b2b-reorder-desktop-only", title: t('hookAttachments.moveDown'), disabled: saving || index === attachments.length - 1, onClick: () => void persistOrder(move(attachments, index, index + 1)), children: _jsx(ArrowDown, { className: "h-4 w-4" }) }), _jsx(Button, { type: "button", size: "icon", variant: "ghost", title: t('common.remove'), disabled: saving, onClick: () => void removeAttachment(attachment.blockId), children: _jsx(Trash2, { className: "h-4 w-4" }) })] }) })] }, attachment.blockId))) })] }))] })] }));
136
+ }
137
+ //# sourceMappingURL=HookBlockAttachmentsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HookBlockAttachmentsPanel.js","sourceRoot":"","sources":["../../../src/admin/components/HookBlockAttachmentsPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAChJ,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,QAAQ,GACT,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AASjD,SAAS,YAAY,CAAC,IAAsB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,GAAG,GAAG,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,IAAI,CAAI,KAAU,EAAE,IAAY,EAAE,EAAU;IACnD,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EACxC,IAAI,EACJ,SAAS,GACsB;IAC/B,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAmB,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EACpD,CAAC,WAAW,CAAC,CACd,CAAC;IACF,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAC1D,CAAC,WAAW,EAAE,MAAM,CAAC,CACtB,CAAC;IAEF,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAmB,EAAE;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,cAAc,CAAC,EAAE,CAAC,CAAC;YACnB,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,SAAS,CAAC,UAAU,EAAE;aACvB,CAAC,CAAC;YACH,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACvC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1B,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;YAClD,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACpE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,IAAI,EAAE,CAAC;IACd,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,IAAI,gBAAgB,CAAC,CAAC,CAAC;YAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC;IAExC,KAAK,UAAU,aAAa;QAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO;QACtC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE;gBACzD,OAAO,EAAE,eAAe;gBACxB,QAAQ;aACT,CAAC,CAAC;YACH,cAAc,CAAC,OAAO,CAAC,CAAC;YACxB,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YACnC,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACvB,SAAS,EAAE,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,IAAsB;QAChD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAChF,cAAc,CAAC,UAAU,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACrB,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CACpE,CACF,CAAC;YACF,SAAS,EAAE,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,UAAU,gBAAgB,CAAC,OAAe;QAC7C,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YACrE,cAAc,CAAC,OAAO,CAAC,CAAC;YACxB,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YACnC,SAAS,EAAE,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CACL,MAAC,IAAI,eACH,KAAC,UAAU,cACT,KAAC,SAAS,IAAC,SAAS,EAAC,WAAW,YAAE,CAAC,CAAC,uBAAuB,CAAC,GAAa,GAC9D,EACb,KAAC,WAAW,cACV,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,4BAA4B,CAAC,GAAK,GACtE,IACT,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,IAAI,eACH,MAAC,UAAU,IAAC,SAAS,EAAC,kDAAkD,aACtE,KAAC,SAAS,IAAC,SAAS,EAAC,mBAAmB,YACtC,eAAM,SAAS,EAAC,UAAU,YAAE,IAAI,CAAC,IAAI,GAAQ,GACnC,EACZ,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,SAAS,EACjB,KAAK,EAAE,CAAC,CAAC,yBAAyB,CAAC,EACnC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAC1B,QAAQ,EAAE,OAAO,IAAI,MAAM,YAE3B,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,GAC1B,IACE,EACb,MAAC,WAAW,IAAC,SAAS,EAAC,WAAW,aAC/B,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,KAAK,IAAC,OAAO,EAAC,aAAa,YAC1B,KAAC,gBAAgB,cAAE,KAAK,GAAoB,GACtC,CACT,CAAC,CAAC,CAAC,IAAI,EAER,eAAK,SAAS,EAAC,sCAAsC,aACnD,MAAC,MAAM,IACL,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3D,QAAQ,EAAE,MAAM,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,aAEhD,gBAAgB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/B,iBAAQ,KAAK,EAAC,EAAE,YAAE,CAAC,CAAC,mCAAmC,CAAC,GAAU,CACnE,CAAC,CAAC,CAAC,IAAI,EACP,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC/B,kBAAuB,KAAK,EAAE,KAAK,CAAC,EAAE,aACnC,KAAK,CAAC,IAAI,QAAI,KAAK,CAAC,IAAI,UADd,KAAK,CAAC,EAAE,CAEZ,CACV,CAAC,IACK,EACT,KAAC,KAAK,IACJ,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAC5D,QAAQ,EAAE,MAAM,GAChB,EACF,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,CAAC,CAAC,0BAA0B,CAAC,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,aAAa,EAAE,EACnC,QAAQ,EAAE,MAAM,IAAI,CAAC,eAAe,aAEpC,KAAC,IAAI,IAAC,SAAS,EAAC,cAAc,GAAG,EAChC,CAAC,CAAC,YAAY,CAAC,IACT,IACL,EAEL,OAAO,CAAC,CAAC,CAAC,CACT,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,yBAAyB,CAAC,GAAK,CAChF,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC7B,YAAG,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,uBAAuB,CAAC,GAAK,CAC9E,CAAC,CAAC,CAAC,CACF,MAAC,KAAK,eACJ,KAAC,WAAW,cACV,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,MAAM,GAAG,EAC9B,KAAC,SAAS,cAAE,CAAC,CAAC,eAAe,CAAC,GAAa,EAC3C,KAAC,SAAS,cAAE,CAAC,CAAC,cAAc,CAAC,GAAa,EAC1C,KAAC,SAAS,IAAC,SAAS,EAAC,iBAAiB,YAAE,CAAC,CAAC,kBAAkB,CAAC,GAAa,EAC1E,KAAC,SAAS,IAAC,SAAS,EAAC,iBAAiB,YAAE,CAAC,CAAC,eAAe,CAAC,GAAa,IAC9D,GACC,EACd,KAAC,SAAS,cACP,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CACtC,MAAC,QAAQ,IAEP,SAAS,QACT,WAAW,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,EACrD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAC7C,MAAM,EAAE,GAAG,EAAE;wCACX,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;wCACzE,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK;4CAAE,OAAO;wCACvC,KAAK,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;oCACpD,CAAC,EACD,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,aAErC,KAAC,SAAS,cACR,KAAC,YAAY,IAAC,SAAS,EAAC,+BAA+B,GAAG,GAChD,EACZ,KAAC,SAAS,cACR,eAAM,SAAS,EAAC,aAAa,YAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;oDAC5D,UAAU,CAAC,OAAO,GACf,GACG,EACZ,KAAC,SAAS,IAAC,SAAS,EAAC,mBAAmB,YAAE,UAAU,CAAC,SAAS,GAAa,EAC3E,KAAC,SAAS,IAAC,SAAS,EAAC,YAAY,YAC/B,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,YAAE,UAAU,CAAC,QAAQ,GAAS,GAC5C,EACZ,KAAC,SAAS,IAAC,SAAS,EAAC,YAAY,YAC/B,eAAK,SAAS,EAAC,qCAAqC,aAClD,KAAC,mBAAmB,IAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EACtE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EACxE,SAAS,EAAE,KAAK,KAAK,CAAC,EACtB,WAAW,EAAE,KAAK,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,GAC7C,EACF,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,OAAO,EACf,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE,CAAC,CAAC,wBAAwB,CAAC,EAClC,QAAQ,EAAE,MAAM,IAAI,KAAK,KAAK,CAAC,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,YAErE,KAAC,OAAO,IAAC,SAAS,EAAC,SAAS,GAAG,GACxB,EACT,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,OAAO,EACf,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE,CAAC,CAAC,0BAA0B,CAAC,EACpC,QAAQ,EAAE,MAAM,IAAI,KAAK,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,EACpD,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,YAErE,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,GAC1B,EACT,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,OAAO,EACf,KAAK,EAAE,CAAC,CAAC,eAAe,CAAC,EACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,YAExD,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,GAAG,GACvB,IACL,GACI,KAlEP,UAAU,CAAC,OAAO,CAmEd,CACZ,CAAC,GACQ,IACN,CACT,IACW,IACT,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type ReactElement, type ReactNode } from 'react';
2
+ import { type RowLayoutPresetId } from '@endora-commerce/cms-components/editor/row-layout-presets';
3
+ /** Puck action bar — default duplicate/delete plus Row layout controls when a Row is active. */
4
+ export declare function PageBuilderActionBar({ label, children, parentAction, }: {
5
+ label?: string;
6
+ children: ReactNode;
7
+ parentAction: ReactNode;
8
+ }): ReactElement;
9
+ export type { RowLayoutPresetId };
10
+ //# sourceMappingURL=PageBuilderActionBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageBuilderActionBar.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PageBuilderActionBar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,2DAA2D,CAAC;AAqInE,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,QAAQ,EACR,YAAY,GACb,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,SAAS,CAAC;CACzB,GAAG,YAAY,CAmEf;AAED,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,118 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { createPortal } from 'react-dom';
4
+ import { Children, useEffect, useLayoutEffect, useRef, useState, } from 'react';
5
+ import { ActionBar } from '@measured/puck';
6
+ import { Columns2, LayoutGrid, Plus } from 'lucide-react';
7
+ import { ROW_LAYOUT_PRESETS, addColumnFitRow, addColumnFullWidth, applyRowLayoutPreset, } from '@endora-commerce/cms-components/editor/row-layout-presets';
8
+ import { usePageBuilderPuck, resolveContentSliderIdForItem } from '@endora-commerce/page-builder-core/editor';
9
+ import { useActionBarTarget, QuickTooltip, wrapQuickTooltip } from '@endora-commerce/page-builder-admin';
10
+ import { ContentSliderActionBarExtras } from './ContentSliderActionBarExtras.js';
11
+ import { SliderPreviewActionBarExtras } from './SliderPreviewActionBarExtras.js';
12
+ import { isPuckItemType, safeGetPuckItem } from './puck-safe.js';
13
+ function RowLayoutFlyout({ anchorRef, onClose, onSelect, }) {
14
+ const [style, setStyle] = useState({ visibility: 'hidden' });
15
+ const [portalRoot, setPortalRoot] = useState(null);
16
+ const menuRef = useRef(null);
17
+ useLayoutEffect(() => {
18
+ const anchor = anchorRef.current;
19
+ if (!anchor)
20
+ return;
21
+ const doc = anchor.ownerDocument;
22
+ setPortalRoot(doc.body);
23
+ const rect = anchor.getBoundingClientRect();
24
+ setStyle({
25
+ position: 'fixed',
26
+ top: rect.bottom + 6,
27
+ left: rect.left,
28
+ zIndex: 9999,
29
+ visibility: 'visible',
30
+ });
31
+ }, [anchorRef]);
32
+ useEffect(() => {
33
+ const anchor = anchorRef.current;
34
+ const doc = anchor?.ownerDocument ?? document;
35
+ const onPointerDown = (event) => {
36
+ const target = event.target;
37
+ if (menuRef.current?.contains(target) || anchorRef.current?.contains(target))
38
+ return;
39
+ onClose();
40
+ };
41
+ const onKeyDown = (event) => {
42
+ if (event.key === 'Escape')
43
+ onClose();
44
+ };
45
+ doc.addEventListener('pointerdown', onPointerDown);
46
+ doc.addEventListener('keydown', onKeyDown);
47
+ return () => {
48
+ doc.removeEventListener('pointerdown', onPointerDown);
49
+ doc.removeEventListener('keydown', onKeyDown);
50
+ };
51
+ }, [anchorRef, onClose]);
52
+ if (!portalRoot)
53
+ return null;
54
+ return createPortal(_jsxs("div", { ref: menuRef, className: "pb-row-action-flyout", style: style, role: "menu", children: [_jsx("p", { className: "pb-row-action-flyout__heading", children: "Layout" }), ROW_LAYOUT_PRESETS.map((preset) => (_jsx("button", { type: "button", className: "pb-row-action-flyout__item", onClick: () => onSelect(preset.id), children: preset.label }, preset.id)))] }), portalRoot);
55
+ }
56
+ function RowActionBarExtras({ rowId }) {
57
+ const dispatch = usePageBuilderPuck((s) => s.dispatch);
58
+ const getItemById = usePageBuilderPuck((s) => s.getItemById);
59
+ const getSelectorForId = usePageBuilderPuck((s) => s.getSelectorForId);
60
+ const [layoutOpen, setLayoutOpen] = useState(false);
61
+ const layoutAnchorRef = useRef(null);
62
+ const applyRow = (mutate) => {
63
+ const item = getItemById(rowId);
64
+ const selector = getSelectorForId(rowId);
65
+ if (!item || item.type !== 'cms.Row' || !selector)
66
+ return;
67
+ const nextProps = mutate(item.props);
68
+ dispatch({
69
+ type: 'replace',
70
+ destinationZone: selector.zone,
71
+ destinationIndex: selector.index,
72
+ data: { type: 'cms.Row', props: { ...nextProps, id: rowId } },
73
+ recordHistory: true,
74
+ });
75
+ setLayoutOpen(false);
76
+ };
77
+ return (_jsxs(_Fragment, { children: [_jsx("span", { ref: layoutAnchorRef, className: "pb-row-action-bar__layout-anchor", children: _jsx(QuickTooltip, { text: "Column layout", children: _jsx(ActionBar.Action, { label: "Column layout", onClick: () => setLayoutOpen((open) => !open), children: _jsx(LayoutGrid, { size: 16 }) }) }) }), layoutOpen ? (_jsx(RowLayoutFlyout, { anchorRef: layoutAnchorRef, onClose: () => setLayoutOpen(false), onSelect: (presetId) => applyRow((props) => applyRowLayoutPreset(props, presetId)) })) : null, _jsx(QuickTooltip, { text: "Add column and fit row", children: _jsx(ActionBar.Action, { label: "Add column and fit row", onClick: () => applyRow(addColumnFitRow), children: _jsx(Plus, { size: 16 }) }) }), _jsx(QuickTooltip, { text: "Add full-width column", children: _jsx(ActionBar.Action, { label: "Add full-width column", onClick: () => applyRow(addColumnFullWidth), children: _jsx(Columns2, { size: 16 }) }) })] }));
78
+ }
79
+ /** Puck action bar — default duplicate/delete plus Row layout controls when a Row is active. */
80
+ export function PageBuilderActionBar({ label, children, parentAction, }) {
81
+ const target = useActionBarTarget();
82
+ const selectedItem = usePageBuilderPuck((s) => s.selectedItem);
83
+ const selectedRowId = selectedItem?.type === 'cms.Row' && typeof selectedItem.props.id === 'string'
84
+ ? selectedItem.props.id
85
+ : null;
86
+ const rowId = label === 'Row' ? (target?.type === 'cms.Row' ? target.id : selectedRowId) : null;
87
+ const showRowExtras = Boolean(rowId);
88
+ const getSelectorForId = usePageBuilderPuck((s) => s.getSelectorForId);
89
+ const getItemById = usePageBuilderPuck((s) => s.getItemById);
90
+ const resolveCarouselId = (type, id) => {
91
+ const item = safeGetPuckItem(getItemById, id);
92
+ return isPuckItemType(item, type) ? id : null;
93
+ };
94
+ const contentSliderId = (() => {
95
+ if (target?.type === 'cms.ContentSlider')
96
+ return resolveCarouselId('cms.ContentSlider', target.id);
97
+ if (selectedItem?.type === 'cms.ContentSlider' && typeof selectedItem.props.id === 'string') {
98
+ return resolveCarouselId('cms.ContentSlider', selectedItem.props.id);
99
+ }
100
+ const selectedId = selectedItem?.props.id;
101
+ if (typeof selectedId !== 'string')
102
+ return null;
103
+ const nestedSliderId = resolveContentSliderIdForItem(selectedId, getSelectorForId, getItemById);
104
+ return nestedSliderId ? resolveCarouselId('cms.ContentSlider', nestedSliderId) : null;
105
+ })();
106
+ const imageSliderId = target?.type === 'cms.ImageSlider'
107
+ ? resolveCarouselId('cms.ImageSlider', target.id)
108
+ : selectedItem?.type === 'cms.ImageSlider' && typeof selectedItem.props.id === 'string'
109
+ ? resolveCarouselId('cms.ImageSlider', selectedItem.props.id)
110
+ : null;
111
+ const productSliderId = target?.type === 'catalog.ProductSlider'
112
+ ? resolveCarouselId('catalog.ProductSlider', target.id)
113
+ : selectedItem?.type === 'catalog.ProductSlider' && typeof selectedItem.props.id === 'string'
114
+ ? resolveCarouselId('catalog.ProductSlider', selectedItem.props.id)
115
+ : null;
116
+ return (_jsxs(ActionBar, { children: [_jsxs(ActionBar.Group, { children: [wrapQuickTooltip(parentAction, 'parent'), label ? _jsx(ActionBar.Label, { label: label }) : null, showRowExtras ? _jsx(RowActionBarExtras, { rowId: rowId }) : null] }), contentSliderId || imageSliderId || productSliderId ? (_jsxs(ActionBar.Group, { children: [contentSliderId ? _jsx(ContentSliderActionBarExtras, { sliderId: contentSliderId }) : null, imageSliderId ? (_jsx(SliderPreviewActionBarExtras, { carouselId: imageSliderId, type: "cms.ImageSlider" })) : null, productSliderId ? (_jsx(SliderPreviewActionBarExtras, { carouselId: productSliderId, type: "catalog.ProductSlider" })) : null] })) : null, _jsx(ActionBar.Group, { children: Children.map(children, (child, index) => wrapQuickTooltip(child, `action-${index}`)) })] }));
117
+ }
118
+ //# sourceMappingURL=PageBuilderActionBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageBuilderActionBar.js","sourceRoot":"","sources":["../../../src/admin/components/PageBuilderActionBar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type ReactElement, type ReactNode } from 'react';
2
+ /**
3
+ * Puck `overrides.drawer` — search box above the component list.
4
+ *
5
+ * The fold is `lib/text-normalization.ts`, **imported, never re-implemented**.
6
+ * This file used to carry its own NFD-only copy, which cannot touch `ł` — so
7
+ * `naglowek` found nothing while `Nagłówek`, the shipped Polish label for the
8
+ * Heading block, sat in the list unmatched (issue #236). Both sides are folded:
9
+ * folding only the haystack breaks the operator who does type the diacritics.
10
+ */
11
+ export declare function PageBuilderDrawer({ children, searchPlaceholder, emptyLabel, }: {
12
+ children: ReactNode;
13
+ searchPlaceholder: string;
14
+ emptyLabel: string;
15
+ }): ReactElement;
16
+ //# sourceMappingURL=PageBuilderDrawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageBuilderDrawer.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PageBuilderDrawer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAqC,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK7F;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,iBAAiB,EACjB,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,YAAY,CAoEf"}
@@ -0,0 +1,53 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useLayoutEffect, useRef, useState } from 'react';
4
+ import { Search } from 'lucide-react';
5
+ import { Input } from '@endora-commerce/admin-kit/ui';
6
+ import { normalize } from '@endora-commerce/admin-kit/lib';
7
+ /**
8
+ * Puck `overrides.drawer` — search box above the component list.
9
+ *
10
+ * The fold is `lib/text-normalization.ts`, **imported, never re-implemented**.
11
+ * This file used to carry its own NFD-only copy, which cannot touch `ł` — so
12
+ * `naglowek` found nothing while `Nagłówek`, the shipped Polish label for the
13
+ * Heading block, sat in the list unmatched (issue #236). Both sides are folded:
14
+ * folding only the haystack breaks the operator who does type the diacritics.
15
+ */
16
+ export function PageBuilderDrawer({ children, searchPlaceholder, emptyLabel, }) {
17
+ const [query, setQuery] = useState('');
18
+ const listRef = useRef(null);
19
+ const [matchCount, setMatchCount] = useState(null);
20
+ useLayoutEffect(() => {
21
+ const root = listRef.current;
22
+ if (!root)
23
+ return;
24
+ const q = normalize(query);
25
+ const items = root.querySelectorAll('[data-puck-drawer-item]');
26
+ let visible = 0;
27
+ items.forEach((el) => {
28
+ const testId = el.getAttribute('data-testid') ?? '';
29
+ const name = testId.startsWith('drawer-item:') ? testId.slice('drawer-item:'.length) : '';
30
+ const label = (el.textContent ?? '').trim();
31
+ const haystack = normalize(`${name} ${label}`);
32
+ const match = q.length === 0 || haystack.includes(q);
33
+ el.style.display = match ? '' : 'none';
34
+ if (match)
35
+ visible += 1;
36
+ });
37
+ // Hide category groups that have no matching items while filtering.
38
+ root.querySelectorAll('[class*="ComponentList_"]').forEach((list) => {
39
+ const className = list.className;
40
+ if (className.includes('ComponentList-content') || className.includes('ComponentList-title')) {
41
+ return;
42
+ }
43
+ if (!list.querySelector('[class*="ComponentList-content"]'))
44
+ return;
45
+ const anyVisible = [...list.querySelectorAll('[data-puck-drawer-item]')].some((el) => el.style.display !== 'none');
46
+ list.style.display = q.length > 0 && !anyVisible ? 'none' : '';
47
+ });
48
+ setMatchCount(q.length > 0 ? visible : null);
49
+ }, [query, children]);
50
+ const filtering = query.trim().length > 0;
51
+ return (_jsxs("div", { className: "flex min-h-0 flex-col gap-2", children: [_jsxs("div", { className: "sticky top-0 z-[1] bg-background px-2 pt-2", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { type: "search", value: query, onChange: (e) => setQuery(e.target.value), placeholder: searchPlaceholder, className: "h-8 bg-white pl-8 text-xs", "aria-label": searchPlaceholder })] }), filtering && matchCount === 0 ? (_jsx("p", { className: "mt-2 px-0.5 text-xs text-muted-foreground", children: emptyLabel })) : null] }), _jsx("div", { ref: listRef, className: "min-h-0 flex-1 overflow-y-auto px-1 pb-2", ...(filtering ? { 'data-pb-drawer-filtering': '' } : {}), children: children })] }));
52
+ }
53
+ //# sourceMappingURL=PageBuilderDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageBuilderDrawer.js","sourceRoot":"","sources":["../../../src/admin/components/PageBuilderDrawer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type Data } from '@measured/puck';
3
+ import '@measured/puck/puck.css';
4
+ import '@endora-commerce/cms-components/styles.css';
5
+ import { type PageBuilderContext } from '@endora-commerce/page-builder-core';
6
+ export declare function PageBuilderEditor({ data, onChange, contentKey, pageContainer, context, languages, activeLanguage, onResolveLanguageContent, onSaveAsTemplate, onListTemplatesForApply, onResolveTemplateLayout, }: {
7
+ data: Data | null;
8
+ onChange: (data: Data) => void;
9
+ /**
10
+ * Identity of the content currently loaded into the editor — typically
11
+ * `${resourceId}:${language}`. Puck seeds its internal editor state from
12
+ * `data` only on mount (the `data` prop is treated as *initial* data, not a
13
+ * controlled value), so when the surrounding editor finishes its async
14
+ * fetch and swaps `data` from the empty placeholder to the saved tree, Puck
15
+ * would otherwise keep showing the empty canvas. Threading this through as
16
+ * the Puck `key` forces a remount whenever a different resource/language is
17
+ * loaded, re-seeding from the freshly-loaded `data`. It deliberately does
18
+ * NOT change on every keystroke (which flows through `onChange`/draft
19
+ * state), so editing stays smooth and never loses focus.
20
+ */
21
+ contentKey?: string;
22
+ /** Wrap the canvas in the CMS page max-width container (pages only). */
23
+ pageContainer?: boolean;
24
+ /** Page Builder palette context (default CMS content). */
25
+ context?: PageBuilderContext;
26
+ /** Content languages available for "copy from language". */
27
+ languages?: string[];
28
+ activeLanguage?: string | null;
29
+ /** Load another language's saved/draft content (used by Copy from language). */
30
+ onResolveLanguageContent?: (language: string) => Data | null | Promise<Data | null>;
31
+ /** Persist the current canvas as a new CMS content template. */
32
+ onSaveAsTemplate?: (meta: {
33
+ name: string;
34
+ code: string;
35
+ }, data: Data) => void | Promise<void>;
36
+ /** List CMS content templates for Apply template. */
37
+ onListTemplatesForApply?: () => Promise<Array<{
38
+ id: string;
39
+ label: string;
40
+ }>>;
41
+ /** Resolve a CMS content template layout to replace the canvas. */
42
+ onResolveTemplateLayout?: (templateId: string) => Data | Promise<Data>;
43
+ }): ReactNode;
44
+ export type { Data as PageBuilderData };
45
+ //# sourceMappingURL=PageBuilderEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageBuilderEditor.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PageBuilderEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACxH,OAAO,EAAmD,KAAK,IAAI,EAAmB,MAAM,gBAAgB,CAAC;AAC7G,OAAO,yBAAyB,CAAC;AAIjC,OAAO,4CAA4C,CAAC;AAQpD,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,oCAAoC,CAAC;AAmY5C,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,aAAqB,EACrB,OAAe,EACf,SAAc,EACd,cAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,GACxB,EAAE;IACD,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC/B;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gFAAgF;IAChF,wBAAwB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpF,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,qDAAqD;IACrD,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC9E,mEAAmE;IACnE,uBAAuB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE,GAAG,SAAS,CAidZ;AAED,YAAY,EAAE,IAAI,IAAI,eAAe,EAAE,CAAC"}