@endora-commerce/page-builder-admin 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 (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/chrome/AssetPickers.d.ts +16 -0
  4. package/dist/chrome/AssetPickers.d.ts.map +1 -0
  5. package/dist/chrome/AssetPickers.js +112 -0
  6. package/dist/chrome/AssetPickers.js.map +1 -0
  7. package/dist/chrome/CatalogPickers.d.ts +6 -0
  8. package/dist/chrome/CatalogPickers.d.ts.map +1 -0
  9. package/dist/chrome/CatalogPickers.js +310 -0
  10. package/dist/chrome/CatalogPickers.js.map +1 -0
  11. package/dist/chrome/ColorPaletteModal.d.ts +11 -0
  12. package/dist/chrome/ColorPaletteModal.d.ts.map +1 -0
  13. package/dist/chrome/ColorPaletteModal.js +82 -0
  14. package/dist/chrome/ColorPaletteModal.js.map +1 -0
  15. package/dist/chrome/ColorPaletteProvider.d.ts +7 -0
  16. package/dist/chrome/ColorPaletteProvider.d.ts.map +1 -0
  17. package/dist/chrome/ColorPaletteProvider.js +40 -0
  18. package/dist/chrome/ColorPaletteProvider.js.map +1 -0
  19. package/dist/chrome/PageBuilderHeaderActions.d.ts +52 -0
  20. package/dist/chrome/PageBuilderHeaderActions.d.ts.map +1 -0
  21. package/dist/chrome/PageBuilderHeaderActions.js +242 -0
  22. package/dist/chrome/PageBuilderHeaderActions.js.map +1 -0
  23. package/dist/chrome/PageBuilderOverlayBridge.d.ts +10 -0
  24. package/dist/chrome/PageBuilderOverlayBridge.d.ts.map +1 -0
  25. package/dist/chrome/PageBuilderOverlayBridge.js +25 -0
  26. package/dist/chrome/PageBuilderOverlayBridge.js.map +1 -0
  27. package/dist/chrome/QuickTooltip.d.ts +8 -0
  28. package/dist/chrome/QuickTooltip.d.ts.map +1 -0
  29. package/dist/chrome/QuickTooltip.js +33 -0
  30. package/dist/chrome/QuickTooltip.js.map +1 -0
  31. package/dist/chrome/action-bar-target.d.ts +12 -0
  32. package/dist/chrome/action-bar-target.d.ts.map +1 -0
  33. package/dist/chrome/action-bar-target.js +37 -0
  34. package/dist/chrome/action-bar-target.js.map +1 -0
  35. package/dist/chrome/cms-page-builder-api.d.ts +21 -0
  36. package/dist/chrome/cms-page-builder-api.d.ts.map +1 -0
  37. package/dist/chrome/cms-page-builder-api.js +50 -0
  38. package/dist/chrome/cms-page-builder-api.js.map +1 -0
  39. package/dist/chrome/page-builder-data.d.ts +5 -0
  40. package/dist/chrome/page-builder-data.d.ts.map +1 -0
  41. package/dist/chrome/page-builder-data.js +12 -0
  42. package/dist/chrome/page-builder-data.js.map +1 -0
  43. package/dist/email/EmailBuilderActionBar.d.ts +8 -0
  44. package/dist/email/EmailBuilderActionBar.d.ts.map +1 -0
  45. package/dist/email/EmailBuilderActionBar.js +91 -0
  46. package/dist/email/EmailBuilderActionBar.js.map +1 -0
  47. package/dist/email/EmailEditorPane.d.ts +42 -0
  48. package/dist/email/EmailEditorPane.d.ts.map +1 -0
  49. package/dist/email/EmailEditorPane.js +637 -0
  50. package/dist/email/EmailEditorPane.js.map +1 -0
  51. package/dist/email/EmailRichTextField.d.ts +14 -0
  52. package/dist/email/EmailRichTextField.d.ts.map +1 -0
  53. package/dist/email/EmailRichTextField.js +45 -0
  54. package/dist/email/EmailRichTextField.js.map +1 -0
  55. package/dist/email/EmailRowLayoutPicker.d.ts +8 -0
  56. package/dist/email/EmailRowLayoutPicker.d.ts.map +1 -0
  57. package/dist/email/EmailRowLayoutPicker.js +17 -0
  58. package/dist/email/EmailRowLayoutPicker.js.map +1 -0
  59. package/dist/email/EmailVariableFields.d.ts +13 -0
  60. package/dist/email/EmailVariableFields.d.ts.map +1 -0
  61. package/dist/email/EmailVariableFields.js +49 -0
  62. package/dist/email/EmailVariableFields.js.map +1 -0
  63. package/dist/email/EmailVariablesProvider.d.ts +15 -0
  64. package/dist/email/EmailVariablesProvider.d.ts.map +1 -0
  65. package/dist/email/EmailVariablesProvider.js +54 -0
  66. package/dist/email/EmailVariablesProvider.js.map +1 -0
  67. package/dist/email/email-builder-plugin.d.ts +6 -0
  68. package/dist/email/email-builder-plugin.d.ts.map +1 -0
  69. package/dist/email/email-builder-plugin.js +14 -0
  70. package/dist/email/email-builder-plugin.js.map +1 -0
  71. package/dist/email/email-template-layout.d.ts +16 -0
  72. package/dist/email/email-template-layout.d.ts.map +1 -0
  73. package/dist/email/email-template-layout.js +55 -0
  74. package/dist/email/email-template-layout.js.map +1 -0
  75. package/dist/email/email-templates-api.d.ts +14 -0
  76. package/dist/email/email-templates-api.d.ts.map +1 -0
  77. package/dist/email/email-templates-api.js +54 -0
  78. package/dist/email/email-templates-api.js.map +1 -0
  79. package/dist/email/index.d.ts +33 -0
  80. package/dist/email/index.d.ts.map +1 -0
  81. package/dist/email/index.js +33 -0
  82. package/dist/email/index.js.map +1 -0
  83. package/dist/email/insert-at-cursor.d.ts +8 -0
  84. package/dist/email/insert-at-cursor.d.ts.map +1 -0
  85. package/dist/email/insert-at-cursor.js +12 -0
  86. package/dist/email/insert-at-cursor.js.map +1 -0
  87. package/dist/email/variables.d.ts +20 -0
  88. package/dist/email/variables.d.ts.map +1 -0
  89. package/dist/email/variables.js +41 -0
  90. package/dist/email/variables.js.map +1 -0
  91. package/dist/index.d.ts +52 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +49 -0
  94. package/dist/index.js.map +1 -0
  95. package/package.json +69 -0
  96. package/tailwind.css +14 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Endora sp. z o.o. and the Endora Commerce contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,49 @@
1
+ <!-- Generated by `pnpm --filter backend run manifests:generate`. Delete this line to take the file over; a README without it is never regenerated. -->
2
+
3
+ # @endora-commerce/page-builder-admin
4
+
5
+ The admin-side page-builder chrome and the e-mail builder (feature 091, P5b; D-192). `.` is the editor chrome `cms`, `blog` and `invoices` render — header actions, asset and catalog field factories, the colour palette, the overlay bridge and the action-bar target — which named `cms` nowhere and lived there only because `cms` was the first builder written. `./email` is the e-mail builder those same primitives compose, which `newsletter` and `transactional_emails` render. A fourth member of the `page-builder` family, in D-108's one `linked` group.
6
+
7
+ ## What this is
8
+
9
+ A shared library package of **Endora Commerce**, the modular B2B/B2C commerce platform. It declares no module manifest, so the platform composes nothing from it: what is published here is what the platform and the modules built on it compile against.
10
+
11
+ ## Entry points
12
+
13
+ - `@endora-commerce/page-builder-admin`
14
+ - `@endora-commerce/page-builder-admin/email`
15
+ - `@endora-commerce/page-builder-admin/tailwind.css`
16
+
17
+ ## Depends on
18
+
19
+ Everything below is a **peer** dependency, so the application resolves exactly one copy of each — two copies of a host or of React are a runtime failure rather than a type error. An entry marked *optional* is needed only by the layers that use it.
20
+
21
+ **Endora packages**
22
+
23
+ - `@endora-commerce/admin-kit`
24
+ - `@endora-commerce/cms-components`
25
+ - `@endora-commerce/contracts`
26
+ - `@endora-commerce/email-components`
27
+ - `@endora-commerce/page-builder-core`
28
+
29
+ **Third-party**
30
+
31
+ - `@measured/puck` *
32
+ - `lucide-react` ^1.11.0
33
+ - `react` ^19.0.0
34
+ - `react-dom` ^19.0.0
35
+
36
+ ## What the tarball carries
37
+
38
+ - `dist/` — the compiled JavaScript and its type declarations
39
+ - `tailwind.css` — the Tailwind source declaration
40
+
41
+ ## Install
42
+
43
+ ```bash
44
+ pnpm add @endora-commerce/page-builder-admin
45
+ ```
46
+
47
+ ## Licence
48
+
49
+ MIT — the text is in `LICENSE`, beside this file.
@@ -0,0 +1,16 @@
1
+ import type { CustomField } from '@measured/puck';
2
+ declare const inputClassName = "_Input-input_bsxfo_26";
3
+ export declare const pickerButtonClass = "h-9 shrink-0";
4
+ export declare function createImageSourceField(): CustomField<'url' | 'library'>;
5
+ export declare function createImageUrlField(label: string): CustomField<string>;
6
+ export declare function createImageAssetField(label: string): CustomField<string>;
7
+ export type SlideImageValue = {
8
+ imageSource?: 'url' | 'library';
9
+ src?: string;
10
+ assetId?: string;
11
+ };
12
+ /** Single control for Image Slider slides — hides URL vs Asset based on source. */
13
+ export declare function createSlideImageField(): CustomField<SlideImageValue>;
14
+ export declare function createVideoAssetField(label: string): CustomField<string>;
15
+ export { inputClassName };
16
+ //# sourceMappingURL=AssetPickers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetPickers.d.ts","sourceRoot":"","sources":["../../src/chrome/AssetPickers.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAQlD,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAC/C,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAiKhD,wBAAgB,sBAAsB,IAAI,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,CAkBvE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAgBtE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAexE;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,mFAAmF;AACnF,wBAAgB,qBAAqB,IAAI,WAAW,CAAC,eAAe,CAAC,CAqDpE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAexE;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useState } from 'react';
4
+ import { FieldLabel } from '@measured/puck';
5
+ import { X } from 'lucide-react';
6
+ import { Button } from '@endora-commerce/admin-kit/ui';
7
+ import { AssetPicker, fetchAssetDetail } from '@endora-commerce/admin-kit/components';
8
+ import { toAbsoluteAssetUrl } from '@endora-commerce/admin-kit/lib';
9
+ const inputClassName = '_Input-input_bsxfo_26';
10
+ export const pickerButtonClass = 'h-9 shrink-0';
11
+ function AssetModalShell({ title, onClose, children, }) {
12
+ useEffect(() => {
13
+ const onKey = (e) => {
14
+ if (e.key === 'Escape')
15
+ onClose();
16
+ };
17
+ window.addEventListener('keydown', onKey);
18
+ return () => window.removeEventListener('keydown', onKey);
19
+ }, [onClose]);
20
+ return (_jsx("div", { className: "fixed inset-0 z-[70] flex items-center justify-center bg-black/40 p-4", role: "dialog", "aria-modal": "true", "aria-label": title, onClick: onClose, children: _jsxs("div", { className: "flex max-h-[90vh] w-full max-w-3xl flex-col overflow-hidden rounded-lg border bg-background shadow-lg", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-center justify-between gap-3 border-b px-4 py-3", children: [_jsx("h2", { className: "text-base font-semibold", children: title }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onClose, children: "Close" })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto p-4", children: children })] }) }));
21
+ }
22
+ function AssetModalFieldControl({ value, onChange, readOnly, label, acceptMimePrefix, modalTitle, }) {
23
+ const selected = typeof value === 'string' ? value : '';
24
+ const [modalOpen, setModalOpen] = useState(false);
25
+ const [previewUrl, setPreviewUrl] = useState(null);
26
+ const [previewLabel, setPreviewLabel] = useState(null);
27
+ useEffect(() => {
28
+ if (!selected) {
29
+ setPreviewUrl(null);
30
+ setPreviewLabel(null);
31
+ return;
32
+ }
33
+ let cancelled = false;
34
+ void (async () => {
35
+ try {
36
+ const asset = await fetchAssetDetail(selected);
37
+ if (!cancelled) {
38
+ setPreviewUrl(toAbsoluteAssetUrl(asset.url));
39
+ setPreviewLabel(asset.label ?? asset.filename);
40
+ }
41
+ }
42
+ catch {
43
+ if (!cancelled) {
44
+ setPreviewUrl(null);
45
+ setPreviewLabel(selected);
46
+ }
47
+ }
48
+ })();
49
+ return () => {
50
+ cancelled = true;
51
+ };
52
+ }, [selected]);
53
+ const onPick = useCallback((asset) => {
54
+ onChange(asset.id);
55
+ setPreviewUrl(toAbsoluteAssetUrl(asset.url));
56
+ setPreviewLabel(asset.label ?? asset.filename);
57
+ setModalOpen(false);
58
+ }, [onChange]);
59
+ const isImage = acceptMimePrefix === 'image/';
60
+ return (_jsxs(FieldLabel, { label: label, ...(readOnly === true ? { readOnly: true } : {}), children: [_jsxs("div", { className: "space-y-2", children: [selected && previewUrl && isImage ? (_jsx("div", { className: "overflow-hidden rounded-md border bg-muted/30", children: _jsx("img", { src: previewUrl, alt: previewLabel ?? 'Selected asset', className: "max-h-40 w-full object-contain" }) })) : null, selected ? (_jsx("input", { className: inputClassName, readOnly: true, value: previewLabel ?? selected })) : null, _jsxs("div", { className: "flex items-stretch gap-2", children: [_jsx(Button, { type: "button", variant: "outline", className: pickerButtonClass, disabled: readOnly === true, onClick: () => setModalOpen(true), children: selected ? 'Change' : 'Select' }), selected && !readOnly ? (_jsx(Button, { type: "button", variant: "ghost", className: pickerButtonClass, "aria-label": "Clear selection", onClick: () => {
61
+ onChange('');
62
+ setPreviewUrl(null);
63
+ setPreviewLabel(null);
64
+ }, children: _jsx(X, { className: "h-4 w-4" }) })) : null] })] }), modalOpen ? (_jsx(AssetModalShell, { title: modalTitle, onClose: () => setModalOpen(false), children: _jsx(AssetPicker, { ...(acceptMimePrefix ? { acceptMimePrefix } : {}), allowUpload: true, onSelect: onPick, onClose: () => setModalOpen(false) }) })) : null] }));
65
+ }
66
+ export function createImageSourceField() {
67
+ return {
68
+ type: 'custom',
69
+ label: 'Image source',
70
+ render: ({ value, onChange, readOnly, field }) => (_jsx(FieldLabel, { label: field.label ?? 'Image source', ...(readOnly === true ? { readOnly: true } : {}), children: _jsxs("select", { className: inputClassName, disabled: readOnly === true, value: value ?? 'url', onChange: (e) => onChange(e.target.value), children: [_jsx("option", { value: "url", children: "URL" }), _jsx("option", { value: "library", children: "Asset library" })] }) })),
71
+ };
72
+ }
73
+ export function createImageUrlField(label) {
74
+ return {
75
+ type: 'custom',
76
+ label,
77
+ render: ({ value, onChange, readOnly, field }) => (_jsx(FieldLabel, { label: field.label ?? label, ...(readOnly === true ? { readOnly: true } : {}), children: _jsx("input", { className: inputClassName, readOnly: readOnly === true, value: value ?? '', placeholder: "https://\u2026", onChange: (e) => onChange(e.target.value) }) })),
78
+ };
79
+ }
80
+ export function createImageAssetField(label) {
81
+ return {
82
+ type: 'custom',
83
+ label,
84
+ render: ({ value, onChange, readOnly, field }) => (_jsx(AssetModalFieldControl, { value: value, onChange: onChange, ...(readOnly === true ? { readOnly: true } : {}), label: field.label ?? label, acceptMimePrefix: "image/", modalTitle: "Select image" })),
85
+ };
86
+ }
87
+ /** Single control for Image Slider slides — hides URL vs Asset based on source. */
88
+ export function createSlideImageField() {
89
+ return {
90
+ type: 'custom',
91
+ label: 'Image',
92
+ render: ({ value, onChange, readOnly, field }) => {
93
+ const imageSource = value?.imageSource ?? 'url';
94
+ const src = value?.src ?? '';
95
+ const assetId = value?.assetId ?? '';
96
+ return (_jsx(FieldLabel, { label: field.label ?? 'Image', ...(readOnly === true ? { readOnly: true } : {}), children: _jsxs("div", { className: "space-y-3", children: [_jsxs("select", { className: inputClassName, disabled: readOnly === true, value: imageSource, onChange: (e) => onChange({
97
+ imageSource: e.target.value,
98
+ src,
99
+ assetId,
100
+ }), children: [_jsx("option", { value: "url", children: "URL" }), _jsx("option", { value: "library", children: "Asset library" })] }), imageSource === 'library' ? (_jsx(AssetModalFieldControl, { value: assetId, onChange: (nextId) => onChange({ imageSource: 'library', src: '', assetId: nextId }), ...(readOnly === true ? { readOnly: true } : {}), label: "Image", acceptMimePrefix: "image/", modalTitle: "Select image" })) : (_jsx("input", { className: inputClassName, readOnly: readOnly === true, value: src, placeholder: "https://\u2026", onChange: (e) => onChange({ imageSource: 'url', src: e.target.value, assetId: '' }) }))] }) }));
101
+ },
102
+ };
103
+ }
104
+ export function createVideoAssetField(label) {
105
+ return {
106
+ type: 'custom',
107
+ label,
108
+ render: ({ value, onChange, readOnly, field }) => (_jsx(AssetModalFieldControl, { value: value, onChange: onChange, ...(readOnly === true ? { readOnly: true } : {}), label: field.label ?? label, acceptMimePrefix: "video/", modalTitle: "Select video" })),
109
+ };
110
+ }
111
+ export { inputClassName };
112
+ //# sourceMappingURL=AssetPickers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetPickers.js","sourceRoot":"","sources":["../../src/chrome/AssetPickers.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Field } from '@measured/puck';
2
+ export declare function createProductSlugField(): Field<string, Record<string, unknown>>;
3
+ export declare function createProductSlugsField(): Field<string[], Record<string, unknown>>;
4
+ export declare function createCategorySlugField(): Field<string, Record<string, unknown>>;
5
+ export declare function createCategorySlugsField(): Field<string[], Record<string, unknown>>;
6
+ //# sourceMappingURL=CatalogPickers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CatalogPickers.d.ts","sourceRoot":"","sources":["../../src/chrome/CatalogPickers.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAysB5C,wBAAgB,sBAAsB,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAc/E;AAED,wBAAgB,uBAAuB,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAclF;AAED,wBAAgB,uBAAuB,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAchF;AAED,wBAAgB,wBAAwB,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAcnF"}
@@ -0,0 +1,310 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useMemo, useState } from 'react';
4
+ import { PB_DATA_METADATA } from '@endora-commerce/page-builder-core';
5
+ import { ChevronDown, ChevronRight, Search, X } from 'lucide-react';
6
+ import { apiClient, normalize } from '@endora-commerce/admin-kit/lib';
7
+ import { Button } from '@endora-commerce/admin-kit/ui';
8
+ const inputClassName = '_Input-input_bsxfo_26';
9
+ /** Match shadcn Button `h-9` — Puck's input padding is taller by default. */
10
+ const pickerInputClassName = `${inputClassName} !box-border !h-9 !min-h-9 !py-0 !px-3 !text-sm leading-9`;
11
+ const pickerButtonClass = 'h-9 shrink-0 px-3';
12
+ function FieldShell({ label, children, }) {
13
+ return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { className: "text-xs font-medium opacity-80", children: label }), children] }));
14
+ }
15
+ /** Stable key so modal draft sync does not reset on new array identities each render. */
16
+ function slugsKey(slugs) {
17
+ return slugs.join('\0');
18
+ }
19
+ function pickName(name, fallback) {
20
+ if (typeof name === 'string')
21
+ return name || fallback;
22
+ return name['pl-PL'] ?? name['en-US'] ?? Object.values(name)[0] ?? fallback;
23
+ }
24
+ function flattenCategories(categories) {
25
+ const byParent = new Map();
26
+ for (const cat of categories) {
27
+ const key = cat.parentCategoryId;
28
+ const list = byParent.get(key) ?? [];
29
+ list.push(cat);
30
+ byParent.set(key, list);
31
+ }
32
+ const walk = (parentId, level) => {
33
+ const nodes = byParent.get(parentId) ?? [];
34
+ return nodes.flatMap((cat) => {
35
+ const prefix = level > 0 ? `${'—'.repeat(level)} ` : '';
36
+ return [
37
+ { slug: cat.slug, label: `${prefix}${pickName(cat.name, cat.slug)}` },
38
+ ...walk(cat.id, level + 1),
39
+ ];
40
+ });
41
+ };
42
+ return walk(null, 0);
43
+ }
44
+ function useCategoryOptions() {
45
+ const [categories, setCategories] = useState([]);
46
+ const [loading, setLoading] = useState(true);
47
+ useEffect(() => {
48
+ let cancelled = false;
49
+ void (async () => {
50
+ setLoading(true);
51
+ try {
52
+ const res = await apiClient.get('/api/v1/admin/catalog/categories');
53
+ if (!cancelled)
54
+ setCategories(flattenCategories(res.data));
55
+ }
56
+ finally {
57
+ if (!cancelled)
58
+ setLoading(false);
59
+ }
60
+ })();
61
+ return () => {
62
+ cancelled = true;
63
+ };
64
+ }, []);
65
+ return { categories, loading };
66
+ }
67
+ function ModalShell({ title, onClose, children, }) {
68
+ useEffect(() => {
69
+ const onKey = (e) => {
70
+ if (e.key === 'Escape')
71
+ onClose();
72
+ };
73
+ window.addEventListener('keydown', onKey);
74
+ return () => window.removeEventListener('keydown', onKey);
75
+ }, [onClose]);
76
+ return (_jsx("div", { className: "fixed inset-0 z-[70] flex items-center justify-center bg-black/40 p-4", role: "dialog", "aria-modal": "true", "aria-label": title, onClick: onClose, children: _jsxs("div", { className: "flex max-h-[85vh] w-full max-w-2xl flex-col overflow-hidden rounded-lg border bg-background shadow-lg", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-center justify-between gap-3 border-b px-4 py-3", children: [_jsx("h2", { className: "text-base font-semibold", children: title }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onClose, children: "Close" })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto p-4", children: children })] }) }));
77
+ }
78
+ function ProductSearchModal({ open, selectedSlugs, multiple = true, onClose, onApply, }) {
79
+ const [query, setQuery] = useState('');
80
+ const [status, setStatus] = useState('active');
81
+ const [page, setPage] = useState(0);
82
+ const [products, setProducts] = useState([]);
83
+ const [total, setTotal] = useState(0);
84
+ const [loading, setLoading] = useState(false);
85
+ const [draft, setDraft] = useState(selectedSlugs);
86
+ const pageSize = 20;
87
+ const load = useCallback(async () => {
88
+ setLoading(true);
89
+ try {
90
+ const params = new URLSearchParams();
91
+ params.set('page', String(page));
92
+ params.set('pageSize', String(pageSize));
93
+ if (query.trim())
94
+ params.set('q', query.trim());
95
+ if (status !== 'all')
96
+ params.set('status', status);
97
+ const res = await apiClient.get(`/api/v1/admin/catalog/products?${params.toString()}`);
98
+ setProducts(res.data);
99
+ setTotal(res.pagination.total);
100
+ }
101
+ finally {
102
+ setLoading(false);
103
+ }
104
+ }, [page, query, status]);
105
+ const selectedKey = slugsKey(selectedSlugs);
106
+ useEffect(() => {
107
+ if (!open)
108
+ return;
109
+ setDraft(selectedKey ? selectedKey.split('\0') : []);
110
+ setPage(0);
111
+ }, [open, selectedKey]);
112
+ useEffect(() => {
113
+ if (!open)
114
+ return undefined;
115
+ const id = window.setTimeout(() => void load(), 250);
116
+ return () => window.clearTimeout(id);
117
+ }, [open, load]);
118
+ const toggle = (slug) => {
119
+ if (multiple) {
120
+ setDraft((prev) => (prev.includes(slug) ? prev.filter((s) => s !== slug) : [...prev, slug]));
121
+ return;
122
+ }
123
+ // Single-select: apply immediately (same UX as asset picker).
124
+ onApply([slug]);
125
+ onClose();
126
+ };
127
+ if (!open)
128
+ return null;
129
+ const pageCount = Math.max(1, Math.ceil(total / pageSize));
130
+ return (_jsx(ModalShell, { title: "Select products", onClose: onClose, children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsxs("div", { className: "relative min-w-[12rem] flex-1", children: [_jsx(Search, { className: "pointer-events-none absolute left-2 top-2.5 h-4 w-4 opacity-50" }), _jsx("input", { className: `${inputClassName} pl-8`, value: query, onChange: (e) => {
131
+ setQuery(e.target.value);
132
+ setPage(0);
133
+ }, placeholder: "Search by name, SKU or slug\u2026" })] }), _jsxs("select", { className: inputClassName, value: status, onChange: (e) => {
134
+ setStatus(e.target.value);
135
+ setPage(0);
136
+ }, children: [_jsx("option", { value: "all", children: "All statuses" }), _jsx("option", { value: "active", children: "Active" }), _jsx("option", { value: "draft", children: "Draft" }), _jsx("option", { value: "inactive", children: "Inactive" })] })] }), _jsx("div", { className: "rounded-md border", children: loading ? (_jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "Loading\u2026" })) : products.length === 0 ? (_jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "No products found." })) : (_jsx("ul", { className: "divide-y", children: products.map((product) => {
137
+ const checked = draft.includes(product.slug);
138
+ return (_jsx("li", { children: _jsxs("label", { className: "flex cursor-pointer items-start gap-3 px-3 py-2 hover:bg-muted/40", children: [_jsx("input", { type: multiple ? 'checkbox' : 'radio', name: "product-pick", className: "mt-1", checked: checked, onChange: () => toggle(product.slug) }), _jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "block truncate text-sm font-medium", children: pickName(product.name, product.slug) }), _jsxs("span", { className: "block font-mono text-xs text-muted-foreground", children: [product.sku, " \u00B7 ", product.slug] })] })] }) }, product.id));
139
+ }) })) }), _jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("span", { className: "text-xs text-muted-foreground", children: [draft.length, " selected \u00B7 page ", page + 1, " / ", pageCount] }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", disabled: page <= 0, onClick: () => setPage((p) => p - 1), children: "Previous" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", disabled: page + 1 >= pageCount, onClick: () => setPage((p) => p + 1), children: "Next" })] })] }), _jsxs("div", { className: "flex justify-end gap-2 border-t pt-3", children: [_jsx(Button, { type: "button", variant: "outline", onClick: onClose, children: "Cancel" }), multiple ? (_jsx(Button, { type: "button", onClick: () => {
140
+ onApply(draft);
141
+ onClose();
142
+ }, children: "Apply selection" })) : null] })] }) }));
143
+ }
144
+ function CategorySearchModal({ open, selectedSlugs, multiple, onClose, onApply, }) {
145
+ const { categories, loading } = useCategoryOptions();
146
+ const [query, setQuery] = useState('');
147
+ const [draft, setDraft] = useState(selectedSlugs);
148
+ const selectedKey = slugsKey(selectedSlugs);
149
+ useEffect(() => {
150
+ if (!open)
151
+ return;
152
+ setDraft(selectedKey ? selectedKey.split('\0') : []);
153
+ setQuery('');
154
+ }, [open, selectedKey]);
155
+ const filtered = useMemo(() => {
156
+ const needle = normalize(query);
157
+ if (!needle)
158
+ return categories;
159
+ return categories.filter((c) => normalize(c.label).includes(needle) || normalize(c.slug).includes(needle));
160
+ }, [categories, query]);
161
+ if (!open)
162
+ return null;
163
+ const toggle = (slug) => {
164
+ if (multiple) {
165
+ setDraft((prev) => (prev.includes(slug) ? prev.filter((s) => s !== slug) : [...prev, slug]));
166
+ return;
167
+ }
168
+ onApply([slug]);
169
+ onClose();
170
+ };
171
+ return (_jsx(ModalShell, { title: multiple ? 'Select categories' : 'Select category', onClose: onClose, children: _jsxs("div", { className: "space-y-3", children: [_jsx("input", { className: inputClassName, value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Filter categories\u2026" }), _jsx("div", { className: "max-h-80 overflow-y-auto rounded-md border", children: loading ? (_jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "Loading\u2026" })) : filtered.length === 0 ? (_jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "No categories found." })) : (_jsx("ul", { className: "divide-y", children: filtered.map((cat) => {
172
+ const checked = draft.includes(cat.slug);
173
+ return (_jsx("li", { children: _jsxs("label", { className: "flex cursor-pointer items-center gap-3 px-3 py-2 hover:bg-muted/40", children: [_jsx("input", { type: multiple ? 'checkbox' : 'radio', name: "category-pick", checked: checked, onChange: () => toggle(cat.slug) }), _jsx("span", { className: "text-sm", children: cat.label })] }) }, cat.slug));
174
+ }) })) }), _jsxs("div", { className: "flex justify-end gap-2 border-t pt-3", children: [_jsx(Button, { type: "button", variant: "outline", onClick: onClose, children: "Cancel" }), multiple ? (_jsx(Button, { type: "button", onClick: () => {
175
+ onApply(draft);
176
+ onClose();
177
+ }, children: "Apply" })) : null] })] }) }));
178
+ }
179
+ function SelectedItemsList({ items, onRemove, emptyLabel, }) {
180
+ const [open, setOpen] = useState(items.length > 0);
181
+ useEffect(() => {
182
+ if (items.length > 0)
183
+ setOpen(true);
184
+ }, [items.length]);
185
+ return (_jsxs("div", { className: "rounded-md border", children: [_jsxs("button", { type: "button", className: "flex w-full items-center gap-2 px-3 py-2 text-left text-xs font-medium", onClick: () => setOpen((v) => !v), children: [open ? _jsx(ChevronDown, { className: "h-3.5 w-3.5" }) : _jsx(ChevronRight, { className: "h-3.5 w-3.5" }), "Selected (", items.length, ")"] }), open ? (_jsx("ul", { className: "max-h-40 divide-y overflow-y-auto border-t", children: items.length === 0 ? (_jsx("li", { className: "px-3 py-2 text-xs text-muted-foreground", children: emptyLabel })) : (items.map((item) => (_jsxs("li", { className: "flex items-center gap-2 px-3 py-1.5 text-xs", children: [_jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }), _jsx("button", { type: "button", className: "shrink-0 rounded p-0.5 hover:bg-muted", "aria-label": `Remove ${item.label}`, onClick: () => onRemove(item.slug), children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }, item.slug)))) })) : null] }));
186
+ }
187
+ function ProductSlugsFieldControl({ value, onChange, readOnly, label, }) {
188
+ const selected = Array.isArray(value) ? value : [];
189
+ const [modalOpen, setModalOpen] = useState(false);
190
+ const [labels, setLabels] = useState({});
191
+ useEffect(() => {
192
+ if (selected.length === 0) {
193
+ setLabels({});
194
+ return;
195
+ }
196
+ let cancelled = false;
197
+ void (async () => {
198
+ try {
199
+ const params = new URLSearchParams();
200
+ params.set('pageSize', '50');
201
+ const res = await apiClient.get(`/api/v1/admin/catalog/products?${params.toString()}`);
202
+ if (cancelled)
203
+ return;
204
+ const next = {};
205
+ for (const product of res.data) {
206
+ if (selected.includes(product.slug)) {
207
+ next[product.slug] = `${pickName(product.name, product.slug)} (${product.sku})`;
208
+ }
209
+ }
210
+ for (const slug of selected) {
211
+ if (!next[slug])
212
+ next[slug] = slug;
213
+ }
214
+ setLabels(next);
215
+ }
216
+ catch {
217
+ if (!cancelled) {
218
+ setLabels(Object.fromEntries(selected.map((slug) => [slug, slug])));
219
+ }
220
+ }
221
+ })();
222
+ return () => {
223
+ cancelled = true;
224
+ };
225
+ }, [selected]);
226
+ const listItems = selected.map((slug) => ({ slug, label: labels[slug] ?? slug }));
227
+ return (_jsxs(FieldShell, { label: label, children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Button, { type: "button", variant: "outline", className: pickerButtonClass, disabled: readOnly === true, onClick: () => setModalOpen(true), children: "Select products" }), _jsx(SelectedItemsList, { items: listItems, emptyLabel: "No products selected yet.", onRemove: (slug) => onChange(selected.filter((s) => s !== slug)) })] }), _jsx(ProductSearchModal, { open: modalOpen, selectedSlugs: selected, onClose: () => setModalOpen(false), onApply: onChange })] }));
228
+ }
229
+ function CategorySlugsFieldControl({ value, onChange, readOnly, label, }) {
230
+ const selected = Array.isArray(value) ? value : [];
231
+ const { categories } = useCategoryOptions();
232
+ const [modalOpen, setModalOpen] = useState(false);
233
+ const labelBySlug = useMemo(() => new Map(categories.map((c) => [c.slug, c.label])), [categories]);
234
+ const listItems = selected.map((slug) => ({ slug, label: labelBySlug.get(slug) ?? slug }));
235
+ return (_jsxs(FieldShell, { label: label, children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Button, { type: "button", variant: "outline", className: pickerButtonClass, disabled: readOnly === true, onClick: () => setModalOpen(true), children: "Select categories" }), _jsx(SelectedItemsList, { items: listItems, emptyLabel: "No categories selected yet.", onRemove: (slug) => onChange(selected.filter((s) => s !== slug)) })] }), _jsx(CategorySearchModal, { open: modalOpen, selectedSlugs: selected, multiple: true, onClose: () => setModalOpen(false), onApply: onChange })] }));
236
+ }
237
+ function SingleCategoryFieldControl({ value, onChange, readOnly, label, }) {
238
+ const { categories, loading } = useCategoryOptions();
239
+ const [modalOpen, setModalOpen] = useState(false);
240
+ const selected = typeof value === 'string' ? value : '';
241
+ const selectedLabel = categories.find((c) => c.slug === selected)?.label ?? selected;
242
+ const selectedSlugs = useMemo(() => (selected ? [selected] : []), [selected]);
243
+ return (_jsxs(FieldShell, { label: label, children: [_jsx("div", { className: "space-y-2", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { className: `${pickerInputClassName} min-w-0 flex-1`, readOnly: true, value: selectedLabel || '— Not selected —' }), _jsx(Button, { type: "button", variant: "outline", className: pickerButtonClass, disabled: readOnly === true || loading, onClick: () => setModalOpen(true), children: "Select" })] }) }), _jsx(CategorySearchModal, { open: modalOpen, selectedSlugs: selectedSlugs, multiple: false, onClose: () => setModalOpen(false), onApply: (slugs) => onChange(slugs[0] ?? '') })] }));
244
+ }
245
+ function SingleProductFieldControl({ value, onChange, readOnly, label, }) {
246
+ const selected = typeof value === 'string' ? value : '';
247
+ const [modalOpen, setModalOpen] = useState(false);
248
+ const [selectedLabel, setSelectedLabel] = useState(selected);
249
+ useEffect(() => {
250
+ if (!selected) {
251
+ setSelectedLabel('');
252
+ return;
253
+ }
254
+ let cancelled = false;
255
+ void (async () => {
256
+ try {
257
+ const params = new URLSearchParams();
258
+ params.set('q', selected);
259
+ params.set('pageSize', '5');
260
+ const res = await apiClient.get(`/api/v1/admin/catalog/products?${params.toString()}`);
261
+ const product = res.data.find((p) => p.slug === selected);
262
+ if (!cancelled) {
263
+ setSelectedLabel(product ? `${pickName(product.name, product.slug)} (${product.sku})` : selected);
264
+ }
265
+ }
266
+ catch {
267
+ if (!cancelled)
268
+ setSelectedLabel(selected);
269
+ }
270
+ })();
271
+ return () => {
272
+ cancelled = true;
273
+ };
274
+ }, [selected]);
275
+ const selectedSlugs = useMemo(() => (selected ? [selected] : []), [selected]);
276
+ return (_jsxs(FieldShell, { label: label, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { className: `${pickerInputClassName} min-w-0 flex-1`, readOnly: true, value: selectedLabel || '— Not selected —' }), _jsx(Button, { type: "button", variant: "outline", className: pickerButtonClass, disabled: readOnly === true, onClick: () => setModalOpen(true), children: "Select" })] }), _jsx(ProductSearchModal, { open: modalOpen, selectedSlugs: selectedSlugs, multiple: false, onClose: () => setModalOpen(false), onApply: (slugs) => onChange(slugs[0] ?? '') })] }));
277
+ }
278
+ export function createProductSlugField() {
279
+ return {
280
+ type: 'custom',
281
+ label: 'Product',
282
+ metadata: PB_DATA_METADATA,
283
+ render: ({ value, onChange, readOnly, field }) => (_jsx(SingleProductFieldControl, { value: value, onChange: onChange, ...(readOnly === true ? { readOnly: true } : {}), label: field.label ?? 'Product' })),
284
+ };
285
+ }
286
+ export function createProductSlugsField() {
287
+ return {
288
+ type: 'custom',
289
+ label: 'Products',
290
+ metadata: PB_DATA_METADATA,
291
+ render: ({ value, onChange, readOnly, field }) => (_jsx(ProductSlugsFieldControl, { value: value, onChange: onChange, ...(readOnly === true ? { readOnly: true } : {}), label: field.label ?? 'Products' })),
292
+ };
293
+ }
294
+ export function createCategorySlugField() {
295
+ return {
296
+ type: 'custom',
297
+ label: 'Category',
298
+ metadata: PB_DATA_METADATA,
299
+ render: ({ value, onChange, readOnly, field }) => (_jsx(SingleCategoryFieldControl, { value: value, onChange: onChange, ...(readOnly === true ? { readOnly: true } : {}), label: field.label ?? 'Category' })),
300
+ };
301
+ }
302
+ export function createCategorySlugsField() {
303
+ return {
304
+ type: 'custom',
305
+ label: 'Categories',
306
+ metadata: PB_DATA_METADATA,
307
+ render: ({ value, onChange, readOnly, field }) => (_jsx(CategorySlugsFieldControl, { value: value, onChange: onChange, ...(readOnly === true ? { readOnly: true } : {}), label: field.label ?? 'Categories' })),
308
+ };
309
+ }
310
+ //# sourceMappingURL=CatalogPickers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CatalogPickers.js","sourceRoot":"","sources":["../../src/chrome/CatalogPickers.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { CmsColorPaletteEntry } from '@endora-commerce/contracts';
3
+ export declare function ColorPaletteModal({ open, entries, pickMode, onClose, onPick, onSave, }: {
4
+ open: boolean;
5
+ entries: CmsColorPaletteEntry[];
6
+ pickMode: boolean;
7
+ onClose: () => void;
8
+ onPick: (hex: string) => void;
9
+ onSave: (entries: CmsColorPaletteEntry[]) => Promise<void>;
10
+ }): ReactNode;
11
+ //# sourceMappingURL=ColorPaletteModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorPaletteModal.d.ts","sourceRoot":"","sources":["../../src/chrome/ColorPaletteModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AA0DvE,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,OAAO,EACP,MAAM,EACN,MAAM,GACP,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,MAAM,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D,GAAG,SAAS,CAmIZ"}