@brunoalz/smartgesti-site-editor 1.10.1 → 1.10.2
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.
- package/dist/editor/PropertyEditor/index.js +26 -24
- package/dist/editor/PropertyEditor/index.js.map +1 -1
- package/dist/editor/PropertyEditor/inputs/GalleryImagesInput.d.ts +14 -0
- package/dist/editor/PropertyEditor/inputs/GalleryImagesInput.d.ts.map +1 -0
- package/dist/editor/PropertyEditor/inputs/GalleryImagesInput.js +469 -0
- package/dist/editor/PropertyEditor/inputs/GalleryImagesInput.js.map +1 -0
- package/dist/editor/PropertyEditor/inputs/index.d.ts +1 -0
- package/dist/editor/PropertyEditor/inputs/index.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/renderPropertyInput.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/renderPropertyInput.js +59 -45
- package/dist/editor/PropertyEditor/renderPropertyInput.js.map +1 -1
- package/dist/engine/registry/blocks/sections/imageGallery.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/imageGallery.js +6 -4
- package/dist/engine/registry/blocks/sections/imageGallery.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,35 +1,37 @@
|
|
|
1
1
|
import { BlockPropertyEditor as o } from "./BlockPropertyEditor.js";
|
|
2
|
-
import { VariationSelector as
|
|
2
|
+
import { VariationSelector as p } from "./VariationSelector.js";
|
|
3
3
|
import { renderPropertyInput as n } from "./renderPropertyInput.js";
|
|
4
4
|
import { ButtonGroupInput as x } from "./inputs/ButtonGroupInput.js";
|
|
5
5
|
import { CarouselImagesInput as f } from "./inputs/CarouselImagesInput.js";
|
|
6
|
-
import { ColorInput as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
6
|
+
import { ColorInput as l } from "./inputs/ColorInput.js";
|
|
7
|
+
import { GalleryImagesInput as i } from "./inputs/GalleryImagesInput.js";
|
|
8
|
+
import { IconGridInput as y } from "./inputs/IconGridInput.js";
|
|
9
|
+
import { ImageGridInput as G } from "./inputs/ImageGridInput.js";
|
|
10
|
+
import { ImageInput as s } from "./inputs/ImageInput.js";
|
|
11
|
+
import { NumberInput as S } from "./inputs/NumberInput.js";
|
|
12
|
+
import { SelectInput as P } from "./inputs/SelectInput.js";
|
|
13
|
+
import { SliderInput as h } from "./inputs/SliderInput.js";
|
|
14
|
+
import { TextAreaInput as A } from "./inputs/TextAreaInput.js";
|
|
15
|
+
import { TextInput as N } from "./inputs/TextInput.js";
|
|
16
|
+
import { ToggleButton as j } from "./inputs/ToggleButton.js";
|
|
17
|
+
import { TypographyInput as v } from "./inputs/TypographyInput.js";
|
|
17
18
|
export {
|
|
18
19
|
o as BlockPropertyEditor,
|
|
19
20
|
x as ButtonGroupInput,
|
|
20
21
|
f as CarouselImagesInput,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
P as
|
|
28
|
-
h as
|
|
29
|
-
A as
|
|
30
|
-
N as
|
|
31
|
-
j as
|
|
32
|
-
|
|
22
|
+
l as ColorInput,
|
|
23
|
+
i as GalleryImagesInput,
|
|
24
|
+
y as IconGridInput,
|
|
25
|
+
G as ImageGridInput,
|
|
26
|
+
s as ImageInput,
|
|
27
|
+
S as NumberInput,
|
|
28
|
+
P as SelectInput,
|
|
29
|
+
h as SliderInput,
|
|
30
|
+
A as TextAreaInput,
|
|
31
|
+
N as TextInput,
|
|
32
|
+
j as ToggleButton,
|
|
33
|
+
v as TypographyInput,
|
|
34
|
+
p as VariationSelector,
|
|
33
35
|
n as renderPropertyInput
|
|
34
36
|
};
|
|
35
37
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GalleryImage } from '../../../engine/schema/siteDocument';
|
|
2
|
+
import { UploadConfig } from '../../LandingPageEditor';
|
|
3
|
+
interface GalleryImagesInputProps {
|
|
4
|
+
images: GalleryImage[];
|
|
5
|
+
onImagesChange: (images: GalleryImage[]) => void;
|
|
6
|
+
label?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
uploadConfig?: UploadConfig;
|
|
9
|
+
/** Aviso de performance a partir de N imagens */
|
|
10
|
+
warningThreshold?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function GalleryImagesInput({ images, onImagesChange, label, description, warningThreshold, }: GalleryImagesInputProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=GalleryImagesInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GalleryImagesInput.d.ts","sourceRoot":"","sources":["../../../../src/editor/PropertyEditor/inputs/GalleryImagesInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,UAAU,uBAAuB;IAC/B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAoZD,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,cAAc,EACd,KAAK,EACL,WAAW,EACX,gBAAqB,GACtB,EAAE,uBAAuB,2CAyLzB"}
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import { jsxs as a, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useState as k, useRef as R, useCallback as B } from "react";
|
|
3
|
+
import E from "react-dom";
|
|
4
|
+
import { cn as i } from "../../../utils/cn.js";
|
|
5
|
+
import { logger as j } from "../../../utils/logger.js";
|
|
6
|
+
function I() {
|
|
7
|
+
return `img-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
|
8
|
+
}
|
|
9
|
+
function z({ draft: r, onDraftChange: o, onSave: h, onCancel: c, isEditing: x }) {
|
|
10
|
+
const g = R(null), [d, b] = k(!1), [m, n] = k(!1), p = B(
|
|
11
|
+
(s) => {
|
|
12
|
+
const y = s.target.files?.[0];
|
|
13
|
+
if (!y || !y.type.startsWith("image/")) return;
|
|
14
|
+
if (y.size > 10 * 1024 * 1024) {
|
|
15
|
+
j.warn("[GalleryImagesInput] Arquivo muito grande (máx 10MB)");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
b(!0);
|
|
19
|
+
const u = new FileReader();
|
|
20
|
+
u.onload = (v) => {
|
|
21
|
+
o({ ...r, src: v.target?.result }), b(!1);
|
|
22
|
+
}, u.onerror = () => {
|
|
23
|
+
j.error("[GalleryImagesInput] Erro ao ler arquivo"), b(!1);
|
|
24
|
+
}, u.readAsDataURL(y);
|
|
25
|
+
},
|
|
26
|
+
[r, o]
|
|
27
|
+
), w = () => {
|
|
28
|
+
if (!r.alt.trim()) {
|
|
29
|
+
n(!0);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
n(!1), h();
|
|
33
|
+
}, N = r.tags?.join(", ") ?? "", L = /* @__PURE__ */ e(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
className: "fixed inset-0 z-[9999] flex items-center justify-center p-4",
|
|
37
|
+
style: { backgroundColor: "rgba(0,0,0,0.5)" },
|
|
38
|
+
onMouseDown: (s) => {
|
|
39
|
+
s.target === s.currentTarget && c();
|
|
40
|
+
},
|
|
41
|
+
children: /* @__PURE__ */ a("div", { className: "bg-white dark:bg-gray-900 rounded-xl shadow-2xl w-full max-w-md max-h-[90vh] overflow-y-auto", children: [
|
|
42
|
+
/* @__PURE__ */ a("div", { className: "flex items-center justify-between px-5 py-4 border-b border-gray-200 dark:border-gray-700", children: [
|
|
43
|
+
/* @__PURE__ */ e("h3", { className: "text-sm font-semibold text-gray-900 dark:text-white", children: x ? "Editar imagem" : "Adicionar imagem" }),
|
|
44
|
+
/* @__PURE__ */ e(
|
|
45
|
+
"button",
|
|
46
|
+
{
|
|
47
|
+
type: "button",
|
|
48
|
+
onClick: c,
|
|
49
|
+
className: "text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 transition-colors",
|
|
50
|
+
children: /* @__PURE__ */ e("svg", { className: "w-5 h-5", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ e(
|
|
51
|
+
"path",
|
|
52
|
+
{
|
|
53
|
+
fillRule: "evenodd",
|
|
54
|
+
d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",
|
|
55
|
+
clipRule: "evenodd"
|
|
56
|
+
}
|
|
57
|
+
) })
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
] }),
|
|
61
|
+
/* @__PURE__ */ a("div", { className: "px-5 py-4 space-y-4", children: [
|
|
62
|
+
r.src && /* @__PURE__ */ e("div", { className: "w-full h-40 rounded-lg overflow-hidden bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ e("img", { src: r.src, alt: "preview", className: "w-full h-full object-contain" }) }),
|
|
63
|
+
/* @__PURE__ */ a("div", { className: "space-y-2", children: [
|
|
64
|
+
/* @__PURE__ */ e("label", { className: "block text-xs font-medium text-gray-700 dark:text-gray-300", children: "Imagem" }),
|
|
65
|
+
/* @__PURE__ */ e(
|
|
66
|
+
"input",
|
|
67
|
+
{
|
|
68
|
+
ref: g,
|
|
69
|
+
type: "file",
|
|
70
|
+
accept: "image/*",
|
|
71
|
+
onChange: p,
|
|
72
|
+
className: "hidden"
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ a(
|
|
76
|
+
"button",
|
|
77
|
+
{
|
|
78
|
+
type: "button",
|
|
79
|
+
onClick: () => {
|
|
80
|
+
g.current && (g.current.value = "", g.current.click());
|
|
81
|
+
},
|
|
82
|
+
disabled: d,
|
|
83
|
+
className: i(
|
|
84
|
+
"w-full h-10 rounded-lg border-2 border-dashed transition-colors",
|
|
85
|
+
"border-gray-300 dark:border-gray-600",
|
|
86
|
+
"hover:border-blue-400 dark:hover:border-blue-500",
|
|
87
|
+
"flex items-center justify-center gap-2",
|
|
88
|
+
"bg-gray-50 dark:bg-gray-800 text-sm text-gray-500 dark:text-gray-400",
|
|
89
|
+
d && "opacity-50 cursor-not-allowed"
|
|
90
|
+
),
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ e("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e(
|
|
93
|
+
"path",
|
|
94
|
+
{
|
|
95
|
+
strokeLinecap: "round",
|
|
96
|
+
strokeLinejoin: "round",
|
|
97
|
+
strokeWidth: 2,
|
|
98
|
+
d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"
|
|
99
|
+
}
|
|
100
|
+
) }),
|
|
101
|
+
d ? "Carregando..." : "Enviar arquivo"
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
/* @__PURE__ */ e("div", { className: "text-center text-xs text-gray-400", children: "ou" }),
|
|
106
|
+
/* @__PURE__ */ e(
|
|
107
|
+
"input",
|
|
108
|
+
{
|
|
109
|
+
type: "text",
|
|
110
|
+
placeholder: "https://... (URL externa)",
|
|
111
|
+
value: r.src.startsWith("data:") ? "" : r.src,
|
|
112
|
+
onChange: (s) => o({ ...r, src: s.target.value }),
|
|
113
|
+
className: i(
|
|
114
|
+
"w-full h-9 rounded-lg border-2 bg-white dark:bg-gray-800 px-3 text-sm transition-all",
|
|
115
|
+
"border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:outline-none",
|
|
116
|
+
"text-gray-900 dark:text-gray-100 placeholder:text-gray-400"
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
)
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ a("div", { className: "space-y-1", children: [
|
|
122
|
+
/* @__PURE__ */ a("label", { className: "block text-xs font-medium text-gray-700 dark:text-gray-300", children: [
|
|
123
|
+
"Texto alternativo",
|
|
124
|
+
" ",
|
|
125
|
+
/* @__PURE__ */ e("span", { className: "text-red-500", children: "*" }),
|
|
126
|
+
/* @__PURE__ */ e("span", { className: "font-normal text-gray-400 ml-1", children: "(obrigatório para acessibilidade)" })
|
|
127
|
+
] }),
|
|
128
|
+
/* @__PURE__ */ e(
|
|
129
|
+
"input",
|
|
130
|
+
{
|
|
131
|
+
type: "text",
|
|
132
|
+
placeholder: "Descrição da imagem para leitores de tela",
|
|
133
|
+
value: r.alt,
|
|
134
|
+
onChange: (s) => {
|
|
135
|
+
n(!1), o({ ...r, alt: s.target.value });
|
|
136
|
+
},
|
|
137
|
+
className: i(
|
|
138
|
+
"w-full h-9 rounded-lg border-2 bg-white dark:bg-gray-800 px-3 text-sm transition-all",
|
|
139
|
+
"focus:outline-none",
|
|
140
|
+
m ? "border-red-400 dark:border-red-500" : "border-gray-300 dark:border-gray-600 focus:border-blue-500",
|
|
141
|
+
"text-gray-900 dark:text-gray-100 placeholder:text-gray-400"
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
),
|
|
145
|
+
m && /* @__PURE__ */ e("p", { className: "text-xs text-red-500", children: "O texto alternativo é obrigatório." })
|
|
146
|
+
] }),
|
|
147
|
+
/* @__PURE__ */ a("div", { className: "space-y-1", children: [
|
|
148
|
+
/* @__PURE__ */ a("label", { className: "block text-xs font-medium text-gray-700 dark:text-gray-300", children: [
|
|
149
|
+
"Título ",
|
|
150
|
+
/* @__PURE__ */ e("span", { className: "font-normal text-gray-400", children: "(opcional)" })
|
|
151
|
+
] }),
|
|
152
|
+
/* @__PURE__ */ e(
|
|
153
|
+
"input",
|
|
154
|
+
{
|
|
155
|
+
type: "text",
|
|
156
|
+
placeholder: "Ex: Projeto de design para cliente X",
|
|
157
|
+
value: r.title ?? "",
|
|
158
|
+
onChange: (s) => o({ ...r, title: s.target.value || void 0 }),
|
|
159
|
+
className: i(
|
|
160
|
+
"w-full h-9 rounded-lg border-2 bg-white dark:bg-gray-800 px-3 text-sm transition-all",
|
|
161
|
+
"border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:outline-none",
|
|
162
|
+
"text-gray-900 dark:text-gray-100 placeholder:text-gray-400"
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
)
|
|
166
|
+
] }),
|
|
167
|
+
/* @__PURE__ */ a("div", { className: "space-y-1", children: [
|
|
168
|
+
/* @__PURE__ */ a("label", { className: "block text-xs font-medium text-gray-700 dark:text-gray-300", children: [
|
|
169
|
+
"Descrição ",
|
|
170
|
+
/* @__PURE__ */ e("span", { className: "font-normal text-gray-400", children: "(opcional)" })
|
|
171
|
+
] }),
|
|
172
|
+
/* @__PURE__ */ e(
|
|
173
|
+
"textarea",
|
|
174
|
+
{
|
|
175
|
+
placeholder: "Legenda exibida no lightbox",
|
|
176
|
+
value: r.description ?? "",
|
|
177
|
+
onChange: (s) => o({ ...r, description: s.target.value || void 0 }),
|
|
178
|
+
rows: 2,
|
|
179
|
+
className: i(
|
|
180
|
+
"w-full rounded-lg border-2 bg-white dark:bg-gray-800 px-3 py-2 text-sm transition-all resize-none",
|
|
181
|
+
"border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:outline-none",
|
|
182
|
+
"text-gray-900 dark:text-gray-100 placeholder:text-gray-400"
|
|
183
|
+
)
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ a("div", { className: "space-y-1", children: [
|
|
188
|
+
/* @__PURE__ */ a("label", { className: "block text-xs font-medium text-gray-700 dark:text-gray-300", children: [
|
|
189
|
+
"Tags ",
|
|
190
|
+
/* @__PURE__ */ e("span", { className: "font-normal text-gray-400", children: "(opcional, separadas por vírgula)" })
|
|
191
|
+
] }),
|
|
192
|
+
/* @__PURE__ */ e(
|
|
193
|
+
"input",
|
|
194
|
+
{
|
|
195
|
+
type: "text",
|
|
196
|
+
placeholder: "Ex: produto, destaque, azul",
|
|
197
|
+
value: N,
|
|
198
|
+
onChange: (s) => {
|
|
199
|
+
const u = s.target.value.split(",").map((v) => v.trim()).filter(Boolean);
|
|
200
|
+
o({ ...r, tags: u.length > 0 ? u : void 0 });
|
|
201
|
+
},
|
|
202
|
+
className: i(
|
|
203
|
+
"w-full h-9 rounded-lg border-2 bg-white dark:bg-gray-800 px-3 text-sm transition-all",
|
|
204
|
+
"border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:outline-none",
|
|
205
|
+
"text-gray-900 dark:text-gray-100 placeholder:text-gray-400"
|
|
206
|
+
)
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
] })
|
|
210
|
+
] }),
|
|
211
|
+
/* @__PURE__ */ a("div", { className: "flex items-center justify-end gap-2 px-5 py-4 border-t border-gray-200 dark:border-gray-700", children: [
|
|
212
|
+
/* @__PURE__ */ e(
|
|
213
|
+
"button",
|
|
214
|
+
{
|
|
215
|
+
type: "button",
|
|
216
|
+
onClick: c,
|
|
217
|
+
className: i(
|
|
218
|
+
"px-4 py-2 text-sm rounded-lg transition-colors",
|
|
219
|
+
"text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800"
|
|
220
|
+
),
|
|
221
|
+
children: "Cancelar"
|
|
222
|
+
}
|
|
223
|
+
),
|
|
224
|
+
/* @__PURE__ */ e(
|
|
225
|
+
"button",
|
|
226
|
+
{
|
|
227
|
+
type: "button",
|
|
228
|
+
onClick: w,
|
|
229
|
+
disabled: !r.src,
|
|
230
|
+
className: i(
|
|
231
|
+
"px-4 py-2 text-sm rounded-lg font-medium transition-colors",
|
|
232
|
+
"bg-blue-600 hover:bg-blue-700 text-white",
|
|
233
|
+
!r.src && "opacity-50 cursor-not-allowed"
|
|
234
|
+
),
|
|
235
|
+
children: x ? "Salvar" : "Adicionar"
|
|
236
|
+
}
|
|
237
|
+
)
|
|
238
|
+
] })
|
|
239
|
+
] })
|
|
240
|
+
}
|
|
241
|
+
);
|
|
242
|
+
return E.createPortal(L, document.body);
|
|
243
|
+
}
|
|
244
|
+
function W({ image: r, index: o, total: h, onEdit: c, onRemove: x, onMoveUp: g, onMoveDown: d }) {
|
|
245
|
+
return /* @__PURE__ */ a("div", { className: "relative group flex-shrink-0", children: [
|
|
246
|
+
/* @__PURE__ */ e(
|
|
247
|
+
"button",
|
|
248
|
+
{
|
|
249
|
+
type: "button",
|
|
250
|
+
onClick: c,
|
|
251
|
+
className: i(
|
|
252
|
+
"w-16 h-16 rounded-lg overflow-hidden border-2 transition-all block",
|
|
253
|
+
"bg-gray-100 dark:bg-gray-800",
|
|
254
|
+
"border-gray-200 dark:border-gray-700 hover:border-blue-400 dark:hover:border-blue-500"
|
|
255
|
+
),
|
|
256
|
+
title: r.alt || r.title || `Imagem ${o + 1}`,
|
|
257
|
+
children: r.src ? /* @__PURE__ */ e("img", { src: r.src, alt: r.alt, className: "w-full h-full object-cover" }) : /* @__PURE__ */ e("div", { className: "w-full h-full flex items-center justify-center", children: /* @__PURE__ */ e("svg", { className: "w-6 h-6 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e(
|
|
258
|
+
"path",
|
|
259
|
+
{
|
|
260
|
+
strokeLinecap: "round",
|
|
261
|
+
strokeLinejoin: "round",
|
|
262
|
+
strokeWidth: 2,
|
|
263
|
+
d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"
|
|
264
|
+
}
|
|
265
|
+
) }) })
|
|
266
|
+
}
|
|
267
|
+
),
|
|
268
|
+
/* @__PURE__ */ a("div", { className: i(
|
|
269
|
+
"absolute inset-0 rounded-lg opacity-0 group-hover:opacity-100 transition-opacity",
|
|
270
|
+
"flex flex-col items-center justify-between p-0.5",
|
|
271
|
+
"bg-black/20"
|
|
272
|
+
), children: [
|
|
273
|
+
/* @__PURE__ */ e(
|
|
274
|
+
"button",
|
|
275
|
+
{
|
|
276
|
+
type: "button",
|
|
277
|
+
onClick: g,
|
|
278
|
+
disabled: o === 0,
|
|
279
|
+
className: i(
|
|
280
|
+
"w-5 h-5 rounded bg-white/90 dark:bg-gray-800/90 flex items-center justify-center",
|
|
281
|
+
"text-gray-700 dark:text-gray-200 transition-colors",
|
|
282
|
+
o === 0 ? "opacity-30 cursor-not-allowed" : "hover:bg-white dark:hover:bg-gray-700"
|
|
283
|
+
),
|
|
284
|
+
title: "Mover para cima",
|
|
285
|
+
children: /* @__PURE__ */ e("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2.5, d: "M5 15l7-7 7 7" }) })
|
|
286
|
+
}
|
|
287
|
+
),
|
|
288
|
+
/* @__PURE__ */ e(
|
|
289
|
+
"button",
|
|
290
|
+
{
|
|
291
|
+
type: "button",
|
|
292
|
+
onClick: x,
|
|
293
|
+
className: i(
|
|
294
|
+
"w-5 h-5 rounded bg-red-500/90 hover:bg-red-600 flex items-center justify-center",
|
|
295
|
+
"text-white transition-colors"
|
|
296
|
+
),
|
|
297
|
+
title: "Remover imagem",
|
|
298
|
+
children: /* @__PURE__ */ e("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2.5, d: "M6 18L18 6M6 6l12 12" }) })
|
|
299
|
+
}
|
|
300
|
+
),
|
|
301
|
+
/* @__PURE__ */ e(
|
|
302
|
+
"button",
|
|
303
|
+
{
|
|
304
|
+
type: "button",
|
|
305
|
+
onClick: d,
|
|
306
|
+
disabled: o === h - 1,
|
|
307
|
+
className: i(
|
|
308
|
+
"w-5 h-5 rounded bg-white/90 dark:bg-gray-800/90 flex items-center justify-center",
|
|
309
|
+
"text-gray-700 dark:text-gray-200 transition-colors",
|
|
310
|
+
o === h - 1 ? "opacity-30 cursor-not-allowed" : "hover:bg-white dark:hover:bg-gray-700"
|
|
311
|
+
),
|
|
312
|
+
title: "Mover para baixo",
|
|
313
|
+
children: /* @__PURE__ */ e("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2.5, d: "M19 9l-7 7-7-7" }) })
|
|
314
|
+
}
|
|
315
|
+
)
|
|
316
|
+
] }),
|
|
317
|
+
/* @__PURE__ */ e("div", { className: "absolute bottom-0 left-0 right-0 bg-black/50 text-white text-[9px] text-center py-0.5 rounded-b-lg pointer-events-none", children: o + 1 })
|
|
318
|
+
] });
|
|
319
|
+
}
|
|
320
|
+
const f = { src: "", alt: "", title: void 0, description: void 0, tags: void 0 };
|
|
321
|
+
function q({
|
|
322
|
+
images: r,
|
|
323
|
+
onImagesChange: o,
|
|
324
|
+
label: h,
|
|
325
|
+
description: c,
|
|
326
|
+
warningThreshold: x = 50
|
|
327
|
+
}) {
|
|
328
|
+
const [g, d] = k(!1), [b, m] = k(null), [n, p] = k(f), w = () => {
|
|
329
|
+
p(f), m(null), d(!0);
|
|
330
|
+
}, N = (l) => {
|
|
331
|
+
const t = r[l];
|
|
332
|
+
p({
|
|
333
|
+
src: t.src,
|
|
334
|
+
alt: t.alt,
|
|
335
|
+
title: t.title,
|
|
336
|
+
description: t.description,
|
|
337
|
+
tags: t.tags
|
|
338
|
+
}), m(l), d(!0);
|
|
339
|
+
}, L = () => {
|
|
340
|
+
if (!(!n.src || !n.alt.trim())) {
|
|
341
|
+
if (b !== null) {
|
|
342
|
+
const l = r.map(
|
|
343
|
+
(t, M) => M === b ? {
|
|
344
|
+
...t,
|
|
345
|
+
src: n.src,
|
|
346
|
+
alt: n.alt.trim(),
|
|
347
|
+
title: n.title,
|
|
348
|
+
description: n.description,
|
|
349
|
+
tags: n.tags
|
|
350
|
+
} : t
|
|
351
|
+
);
|
|
352
|
+
o(l);
|
|
353
|
+
} else {
|
|
354
|
+
const l = {
|
|
355
|
+
id: I(),
|
|
356
|
+
src: n.src,
|
|
357
|
+
alt: n.alt.trim(),
|
|
358
|
+
title: n.title,
|
|
359
|
+
description: n.description,
|
|
360
|
+
tags: n.tags
|
|
361
|
+
};
|
|
362
|
+
o([...r, l]);
|
|
363
|
+
}
|
|
364
|
+
d(!1), p(f), m(null);
|
|
365
|
+
}
|
|
366
|
+
}, s = () => {
|
|
367
|
+
d(!1), p(f), m(null);
|
|
368
|
+
}, y = (l) => {
|
|
369
|
+
o(r.filter((t, M) => M !== l));
|
|
370
|
+
}, u = (l) => {
|
|
371
|
+
if (l === 0) return;
|
|
372
|
+
const t = [...r];
|
|
373
|
+
[t[l - 1], t[l]] = [t[l], t[l - 1]], o(t);
|
|
374
|
+
}, v = (l) => {
|
|
375
|
+
if (l === r.length - 1) return;
|
|
376
|
+
const t = [...r];
|
|
377
|
+
[t[l], t[l + 1]] = [t[l + 1], t[l]], o(t);
|
|
378
|
+
}, C = r.length >= x;
|
|
379
|
+
return /* @__PURE__ */ a("div", { className: "space-y-2", children: [
|
|
380
|
+
h && /* @__PURE__ */ a("div", { className: "flex items-center justify-between", children: [
|
|
381
|
+
/* @__PURE__ */ e("label", { className: "block text-xs font-medium text-gray-800 dark:text-gray-100", children: h }),
|
|
382
|
+
/* @__PURE__ */ a("span", { className: "text-[10px] text-gray-500 dark:text-gray-400", children: [
|
|
383
|
+
r.length,
|
|
384
|
+
" ",
|
|
385
|
+
r.length === 1 ? "imagem" : "imagens"
|
|
386
|
+
] })
|
|
387
|
+
] }),
|
|
388
|
+
c && /* @__PURE__ */ e("p", { className: "text-[10px] text-gray-500 dark:text-gray-400", children: c }),
|
|
389
|
+
r.length > 0 ? /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-2 max-h-52 overflow-y-auto pr-1", children: r.map((l, t) => /* @__PURE__ */ e(
|
|
390
|
+
W,
|
|
391
|
+
{
|
|
392
|
+
image: l,
|
|
393
|
+
index: t,
|
|
394
|
+
total: r.length,
|
|
395
|
+
onEdit: () => N(t),
|
|
396
|
+
onRemove: () => y(t),
|
|
397
|
+
onMoveUp: () => u(t),
|
|
398
|
+
onMoveDown: () => v(t)
|
|
399
|
+
},
|
|
400
|
+
l.id
|
|
401
|
+
)) }) : /* @__PURE__ */ a("div", { className: i(
|
|
402
|
+
"w-full py-6 rounded-lg border-2 border-dashed",
|
|
403
|
+
"border-gray-200 dark:border-gray-700",
|
|
404
|
+
"flex flex-col items-center justify-center gap-1",
|
|
405
|
+
"text-gray-400 dark:text-gray-500"
|
|
406
|
+
), children: [
|
|
407
|
+
/* @__PURE__ */ e("svg", { className: "w-7 h-7", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e(
|
|
408
|
+
"path",
|
|
409
|
+
{
|
|
410
|
+
strokeLinecap: "round",
|
|
411
|
+
strokeLinejoin: "round",
|
|
412
|
+
strokeWidth: 1.5,
|
|
413
|
+
d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"
|
|
414
|
+
}
|
|
415
|
+
) }),
|
|
416
|
+
/* @__PURE__ */ e("span", { className: "text-xs", children: "Nenhuma imagem adicionada" })
|
|
417
|
+
] }),
|
|
418
|
+
C && /* @__PURE__ */ a("div", { className: "flex items-start gap-2 p-2 bg-amber-50 dark:bg-amber-900/20 rounded-lg border border-amber-200 dark:border-amber-700", children: [
|
|
419
|
+
/* @__PURE__ */ e("svg", { className: "w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ e(
|
|
420
|
+
"path",
|
|
421
|
+
{
|
|
422
|
+
fillRule: "evenodd",
|
|
423
|
+
d: "M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z",
|
|
424
|
+
clipRule: "evenodd"
|
|
425
|
+
}
|
|
426
|
+
) }),
|
|
427
|
+
/* @__PURE__ */ a("p", { className: "text-[10px] text-amber-700 dark:text-amber-300", children: [
|
|
428
|
+
/* @__PURE__ */ a("strong", { children: [
|
|
429
|
+
r.length,
|
|
430
|
+
" imagens"
|
|
431
|
+
] }),
|
|
432
|
+
" — muitas imagens podem afetar o desempenho da página."
|
|
433
|
+
] })
|
|
434
|
+
] }),
|
|
435
|
+
/* @__PURE__ */ a(
|
|
436
|
+
"button",
|
|
437
|
+
{
|
|
438
|
+
type: "button",
|
|
439
|
+
onClick: w,
|
|
440
|
+
className: i(
|
|
441
|
+
"w-full h-9 rounded-lg border-2 border-dashed transition-colors",
|
|
442
|
+
"border-gray-300 dark:border-gray-600",
|
|
443
|
+
"hover:border-blue-400 dark:hover:border-blue-500",
|
|
444
|
+
"flex items-center justify-center gap-1.5",
|
|
445
|
+
"text-sm text-gray-500 dark:text-gray-400 hover:text-blue-500 dark:hover:text-blue-400",
|
|
446
|
+
"bg-gray-50 dark:bg-gray-800/50"
|
|
447
|
+
),
|
|
448
|
+
children: [
|
|
449
|
+
/* @__PURE__ */ e("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ e("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" }) }),
|
|
450
|
+
"Adicionar imagem"
|
|
451
|
+
]
|
|
452
|
+
}
|
|
453
|
+
),
|
|
454
|
+
g && /* @__PURE__ */ e(
|
|
455
|
+
z,
|
|
456
|
+
{
|
|
457
|
+
draft: n,
|
|
458
|
+
onDraftChange: p,
|
|
459
|
+
onSave: L,
|
|
460
|
+
onCancel: s,
|
|
461
|
+
isEditing: b !== null
|
|
462
|
+
}
|
|
463
|
+
)
|
|
464
|
+
] });
|
|
465
|
+
}
|
|
466
|
+
export {
|
|
467
|
+
q as GalleryImagesInput
|
|
468
|
+
};
|
|
469
|
+
//# sourceMappingURL=GalleryImagesInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GalleryImagesInput.js","sources":["../../../../src/editor/PropertyEditor/inputs/GalleryImagesInput.tsx"],"sourcesContent":["/**\n * GalleryImagesInput\n * Modal avançado para gerenciar imagens da galeria:\n * - Upload (FileReader) ou URL externa\n * - Alt text obrigatório (a11y)\n * - Título, descrição, tags opcionais\n * - Reordenação (mover para cima/baixo)\n * - Aviso de performance acima de 50 imagens\n */\n\nimport { useState, useRef, useCallback } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { cn } from \"../../../utils/cn\";\nimport { logger } from \"../../../utils/logger\";\nimport type { GalleryImage } from \"../../../engine/schema/siteDocument\";\nimport type { UploadConfig } from \"../../LandingPageEditor\";\n\ninterface GalleryImagesInputProps {\n images: GalleryImage[];\n onImagesChange: (images: GalleryImage[]) => void;\n label?: string;\n description?: string;\n uploadConfig?: UploadConfig;\n /** Aviso de performance a partir de N imagens */\n warningThreshold?: number;\n}\n\ntype DraftImage = Partial<GalleryImage> & { src: string; alt: string };\n\n/** Gera um ID único simples */\nfunction generateId(): string {\n return `img-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n}\n\n// ─────────────────────────────────────────────────────────\n// Modal de add/edit\n// ─────────────────────────────────────────────────────────\n\ninterface ImageModalProps {\n draft: DraftImage;\n onDraftChange: (d: DraftImage) => void;\n onSave: () => void;\n onCancel: () => void;\n isEditing: boolean;\n}\n\nfunction ImageModal({ draft, onDraftChange, onSave, onCancel, isEditing }: ImageModalProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const [altError, setAltError] = useState(false);\n\n const handleFileChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n if (!file.type.startsWith(\"image/\")) return;\n if (file.size > 10 * 1024 * 1024) {\n logger.warn(\"[GalleryImagesInput] Arquivo muito grande (máx 10MB)\");\n return;\n }\n\n setUploading(true);\n const reader = new FileReader();\n reader.onload = (evt) => {\n onDraftChange({ ...draft, src: evt.target?.result as string });\n setUploading(false);\n };\n reader.onerror = () => {\n logger.error(\"[GalleryImagesInput] Erro ao ler arquivo\");\n setUploading(false);\n };\n reader.readAsDataURL(file);\n },\n [draft, onDraftChange],\n );\n\n const handleSave = () => {\n if (!draft.alt.trim()) {\n setAltError(true);\n return;\n }\n setAltError(false);\n onSave();\n };\n\n const tagsString = draft.tags?.join(\", \") ?? \"\";\n\n const content = (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4\"\n style={{ backgroundColor: \"rgba(0,0,0,0.5)\" }}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onCancel();\n }}\n >\n <div className=\"bg-white dark:bg-gray-900 rounded-xl shadow-2xl w-full max-w-md max-h-[90vh] overflow-y-auto\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-gray-200 dark:border-gray-700\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {isEditing ? \"Editar imagem\" : \"Adicionar imagem\"}\n </h3>\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 transition-colors\"\n >\n <svg className=\"w-5 h-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 py-4 space-y-4\">\n {/* Preview */}\n {draft.src && (\n <div className=\"w-full h-40 rounded-lg overflow-hidden bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700\">\n <img src={draft.src} alt=\"preview\" className=\"w-full h-full object-contain\" />\n </div>\n )}\n\n {/* Fonte da imagem */}\n <div className=\"space-y-2\">\n <label className=\"block text-xs font-medium text-gray-700 dark:text-gray-300\">\n Imagem\n </label>\n\n {/* Upload */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n className=\"hidden\"\n />\n <button\n type=\"button\"\n onClick={() => {\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n fileInputRef.current.click();\n }\n }}\n disabled={uploading}\n className={cn(\n \"w-full h-10 rounded-lg border-2 border-dashed transition-colors\",\n \"border-gray-300 dark:border-gray-600\",\n \"hover:border-blue-400 dark:hover:border-blue-500\",\n \"flex items-center justify-center gap-2\",\n \"bg-gray-50 dark:bg-gray-800 text-sm text-gray-500 dark:text-gray-400\",\n uploading && \"opacity-50 cursor-not-allowed\",\n )}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\"\n />\n </svg>\n {uploading ? \"Carregando...\" : \"Enviar arquivo\"}\n </button>\n\n <div className=\"text-center text-xs text-gray-400\">ou</div>\n\n {/* URL */}\n <input\n type=\"text\"\n placeholder=\"https://... (URL externa)\"\n value={draft.src.startsWith(\"data:\") ? \"\" : draft.src}\n onChange={(e) => onDraftChange({ ...draft, src: e.target.value })}\n className={cn(\n \"w-full h-9 rounded-lg border-2 bg-white dark:bg-gray-800 px-3 text-sm transition-all\",\n \"border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:outline-none\",\n \"text-gray-900 dark:text-gray-100 placeholder:text-gray-400\",\n )}\n />\n </div>\n\n {/* Alt text (obrigatório) */}\n <div className=\"space-y-1\">\n <label className=\"block text-xs font-medium text-gray-700 dark:text-gray-300\">\n Texto alternativo{\" \"}\n <span className=\"text-red-500\">*</span>\n <span className=\"font-normal text-gray-400 ml-1\">(obrigatório para acessibilidade)</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Descrição da imagem para leitores de tela\"\n value={draft.alt}\n onChange={(e) => {\n setAltError(false);\n onDraftChange({ ...draft, alt: e.target.value });\n }}\n className={cn(\n \"w-full h-9 rounded-lg border-2 bg-white dark:bg-gray-800 px-3 text-sm transition-all\",\n \"focus:outline-none\",\n altError\n ? \"border-red-400 dark:border-red-500\"\n : \"border-gray-300 dark:border-gray-600 focus:border-blue-500\",\n \"text-gray-900 dark:text-gray-100 placeholder:text-gray-400\",\n )}\n />\n {altError && (\n <p className=\"text-xs text-red-500\">O texto alternativo é obrigatório.</p>\n )}\n </div>\n\n {/* Título (opcional) */}\n <div className=\"space-y-1\">\n <label className=\"block text-xs font-medium text-gray-700 dark:text-gray-300\">\n Título <span className=\"font-normal text-gray-400\">(opcional)</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Ex: Projeto de design para cliente X\"\n value={draft.title ?? \"\"}\n onChange={(e) =>\n onDraftChange({ ...draft, title: e.target.value || undefined })\n }\n className={cn(\n \"w-full h-9 rounded-lg border-2 bg-white dark:bg-gray-800 px-3 text-sm transition-all\",\n \"border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:outline-none\",\n \"text-gray-900 dark:text-gray-100 placeholder:text-gray-400\",\n )}\n />\n </div>\n\n {/* Descrição (opcional) */}\n <div className=\"space-y-1\">\n <label className=\"block text-xs font-medium text-gray-700 dark:text-gray-300\">\n Descrição <span className=\"font-normal text-gray-400\">(opcional)</span>\n </label>\n <textarea\n placeholder=\"Legenda exibida no lightbox\"\n value={draft.description ?? \"\"}\n onChange={(e) =>\n onDraftChange({ ...draft, description: e.target.value || undefined })\n }\n rows={2}\n className={cn(\n \"w-full rounded-lg border-2 bg-white dark:bg-gray-800 px-3 py-2 text-sm transition-all resize-none\",\n \"border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:outline-none\",\n \"text-gray-900 dark:text-gray-100 placeholder:text-gray-400\",\n )}\n />\n </div>\n\n {/* Tags (opcional) */}\n <div className=\"space-y-1\">\n <label className=\"block text-xs font-medium text-gray-700 dark:text-gray-300\">\n Tags <span className=\"font-normal text-gray-400\">(opcional, separadas por vírgula)</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Ex: produto, destaque, azul\"\n value={tagsString}\n onChange={(e) => {\n const raw = e.target.value;\n const tags = raw\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n onDraftChange({ ...draft, tags: tags.length > 0 ? tags : undefined });\n }}\n className={cn(\n \"w-full h-9 rounded-lg border-2 bg-white dark:bg-gray-800 px-3 text-sm transition-all\",\n \"border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:outline-none\",\n \"text-gray-900 dark:text-gray-100 placeholder:text-gray-400\",\n )}\n />\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-end gap-2 px-5 py-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={onCancel}\n className={cn(\n \"px-4 py-2 text-sm rounded-lg transition-colors\",\n \"text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800\",\n )}\n >\n Cancelar\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={!draft.src}\n className={cn(\n \"px-4 py-2 text-sm rounded-lg font-medium transition-colors\",\n \"bg-blue-600 hover:bg-blue-700 text-white\",\n !draft.src && \"opacity-50 cursor-not-allowed\",\n )}\n >\n {isEditing ? \"Salvar\" : \"Adicionar\"}\n </button>\n </div>\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(content, document.body);\n}\n\n// ─────────────────────────────────────────────────────────\n// Thumbnail individual\n// ─────────────────────────────────────────────────────────\n\ninterface ImageThumbProps {\n image: GalleryImage;\n index: number;\n total: number;\n onEdit: () => void;\n onRemove: () => void;\n onMoveUp: () => void;\n onMoveDown: () => void;\n}\n\nfunction ImageThumb({ image, index, total, onEdit, onRemove, onMoveUp, onMoveDown }: ImageThumbProps) {\n return (\n <div className=\"relative group flex-shrink-0\">\n {/* Thumbnail */}\n <button\n type=\"button\"\n onClick={onEdit}\n className={cn(\n \"w-16 h-16 rounded-lg overflow-hidden border-2 transition-all block\",\n \"bg-gray-100 dark:bg-gray-800\",\n \"border-gray-200 dark:border-gray-700 hover:border-blue-400 dark:hover:border-blue-500\",\n )}\n title={image.alt || image.title || `Imagem ${index + 1}`}\n >\n {image.src ? (\n <img src={image.src} alt={image.alt} className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <svg className=\"w-6 h-6 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n </div>\n )}\n </button>\n\n {/* Ações no hover */}\n <div className={cn(\n \"absolute inset-0 rounded-lg opacity-0 group-hover:opacity-100 transition-opacity\",\n \"flex flex-col items-center justify-between p-0.5\",\n \"bg-black/20\",\n )}>\n {/* Mover para cima */}\n <button\n type=\"button\"\n onClick={onMoveUp}\n disabled={index === 0}\n className={cn(\n \"w-5 h-5 rounded bg-white/90 dark:bg-gray-800/90 flex items-center justify-center\",\n \"text-gray-700 dark:text-gray-200 transition-colors\",\n index === 0\n ? \"opacity-30 cursor-not-allowed\"\n : \"hover:bg-white dark:hover:bg-gray-700\",\n )}\n title=\"Mover para cima\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n\n {/* Remover */}\n <button\n type=\"button\"\n onClick={onRemove}\n className={cn(\n \"w-5 h-5 rounded bg-red-500/90 hover:bg-red-600 flex items-center justify-center\",\n \"text-white transition-colors\",\n )}\n title=\"Remover imagem\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n\n {/* Mover para baixo */}\n <button\n type=\"button\"\n onClick={onMoveDown}\n disabled={index === total - 1}\n className={cn(\n \"w-5 h-5 rounded bg-white/90 dark:bg-gray-800/90 flex items-center justify-center\",\n \"text-gray-700 dark:text-gray-200 transition-colors\",\n index === total - 1\n ? \"opacity-30 cursor-not-allowed\"\n : \"hover:bg-white dark:hover:bg-gray-700\",\n )}\n title=\"Mover para baixo\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* Número */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-[9px] text-center py-0.5 rounded-b-lg pointer-events-none\">\n {index + 1}\n </div>\n </div>\n );\n}\n\n// ─────────────────────────────────────────────────────────\n// Componente principal\n// ─────────────────────────────────────────────────────────\n\nconst EMPTY_DRAFT: DraftImage = { src: \"\", alt: \"\", title: undefined, description: undefined, tags: undefined };\n\nexport function GalleryImagesInput({\n images,\n onImagesChange,\n label,\n description,\n warningThreshold = 50,\n}: GalleryImagesInputProps) {\n const [showModal, setShowModal] = useState(false);\n const [editingIndex, setEditingIndex] = useState<number | null>(null);\n const [draft, setDraft] = useState<DraftImage>(EMPTY_DRAFT);\n\n const openAdd = () => {\n setDraft(EMPTY_DRAFT);\n setEditingIndex(null);\n setShowModal(true);\n };\n\n const openEdit = (index: number) => {\n const img = images[index];\n setDraft({\n src: img.src,\n alt: img.alt,\n title: img.title,\n description: img.description,\n tags: img.tags,\n });\n setEditingIndex(index);\n setShowModal(true);\n };\n\n const handleSave = () => {\n if (!draft.src || !draft.alt.trim()) return;\n\n if (editingIndex !== null) {\n // Editar existente\n const updated = images.map((img, i) =>\n i === editingIndex\n ? {\n ...img,\n src: draft.src,\n alt: draft.alt.trim(),\n title: draft.title,\n description: draft.description,\n tags: draft.tags,\n }\n : img,\n );\n onImagesChange(updated);\n } else {\n // Adicionar novo\n const newImage: GalleryImage = {\n id: generateId(),\n src: draft.src,\n alt: draft.alt.trim(),\n title: draft.title,\n description: draft.description,\n tags: draft.tags,\n };\n onImagesChange([...images, newImage]);\n }\n\n setShowModal(false);\n setDraft(EMPTY_DRAFT);\n setEditingIndex(null);\n };\n\n const handleCancel = () => {\n setShowModal(false);\n setDraft(EMPTY_DRAFT);\n setEditingIndex(null);\n };\n\n const handleRemove = (index: number) => {\n onImagesChange(images.filter((_, i) => i !== index));\n };\n\n const handleMoveUp = (index: number) => {\n if (index === 0) return;\n const arr = [...images];\n [arr[index - 1], arr[index]] = [arr[index], arr[index - 1]];\n onImagesChange(arr);\n };\n\n const handleMoveDown = (index: number) => {\n if (index === images.length - 1) return;\n const arr = [...images];\n [arr[index], arr[index + 1]] = [arr[index + 1], arr[index]];\n onImagesChange(arr);\n };\n\n const showWarning = images.length >= warningThreshold;\n\n return (\n <div className=\"space-y-2\">\n {/* Label */}\n {label && (\n <div className=\"flex items-center justify-between\">\n <label className=\"block text-xs font-medium text-gray-800 dark:text-gray-100\">\n {label}\n </label>\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400\">\n {images.length} {images.length === 1 ? \"imagem\" : \"imagens\"}\n </span>\n </div>\n )}\n {description && (\n <p className=\"text-[10px] text-gray-500 dark:text-gray-400\">{description}</p>\n )}\n\n {/* Grid de thumbnails */}\n {images.length > 0 ? (\n <div className=\"flex flex-wrap gap-2 max-h-52 overflow-y-auto pr-1\">\n {images.map((img, index) => (\n <ImageThumb\n key={img.id}\n image={img}\n index={index}\n total={images.length}\n onEdit={() => openEdit(index)}\n onRemove={() => handleRemove(index)}\n onMoveUp={() => handleMoveUp(index)}\n onMoveDown={() => handleMoveDown(index)}\n />\n ))}\n </div>\n ) : (\n <div className={cn(\n \"w-full py-6 rounded-lg border-2 border-dashed\",\n \"border-gray-200 dark:border-gray-700\",\n \"flex flex-col items-center justify-center gap-1\",\n \"text-gray-400 dark:text-gray-500\",\n )}>\n <svg className=\"w-7 h-7\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n <span className=\"text-xs\">Nenhuma imagem adicionada</span>\n </div>\n )}\n\n {/* Aviso de performance */}\n {showWarning && (\n <div className=\"flex items-start gap-2 p-2 bg-amber-50 dark:bg-amber-900/20 rounded-lg border border-amber-200 dark:border-amber-700\">\n <svg className=\"w-4 h-4 text-amber-500 flex-shrink-0 mt-0.5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <p className=\"text-[10px] text-amber-700 dark:text-amber-300\">\n <strong>{images.length} imagens</strong> — muitas imagens podem afetar o desempenho da página.\n </p>\n </div>\n )}\n\n {/* Botão adicionar */}\n <button\n type=\"button\"\n onClick={openAdd}\n className={cn(\n \"w-full h-9 rounded-lg border-2 border-dashed transition-colors\",\n \"border-gray-300 dark:border-gray-600\",\n \"hover:border-blue-400 dark:hover:border-blue-500\",\n \"flex items-center justify-center gap-1.5\",\n \"text-sm text-gray-500 dark:text-gray-400 hover:text-blue-500 dark:hover:text-blue-400\",\n \"bg-gray-50 dark:bg-gray-800/50\",\n )}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n Adicionar imagem\n </button>\n\n {/* Modal */}\n {showModal && (\n <ImageModal\n draft={draft}\n onDraftChange={setDraft}\n onSave={handleSave}\n onCancel={handleCancel}\n isEditing={editingIndex !== null}\n />\n )}\n </div>\n );\n}\n"],"names":["generateId","ImageModal","draft","onDraftChange","onSave","onCancel","isEditing","fileInputRef","useRef","uploading","setUploading","useState","altError","setAltError","handleFileChange","useCallback","e","file","logger","reader","evt","handleSave","tagsString","content","jsx","jsxs","cn","tags","t","ReactDOM","ImageThumb","image","index","total","onEdit","onRemove","onMoveUp","onMoveDown","EMPTY_DRAFT","GalleryImagesInput","images","onImagesChange","label","description","warningThreshold","showModal","setShowModal","editingIndex","setEditingIndex","setDraft","openAdd","openEdit","img","updated","i","newImage","handleCancel","handleRemove","_","handleMoveUp","arr","handleMoveDown","showWarning"],"mappings":"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"}
|
|
@@ -12,4 +12,5 @@ export { ImageGridInput } from './ImageGridInput';
|
|
|
12
12
|
export { TypographyInput } from './TypographyInput';
|
|
13
13
|
export { ImageInput } from './ImageInput';
|
|
14
14
|
export { CarouselImagesInput } from './CarouselImagesInput';
|
|
15
|
+
export { GalleryImagesInput } from './GalleryImagesInput';
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/editor/PropertyEditor/inputs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/editor/PropertyEditor/inputs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderPropertyInput.d.ts","sourceRoot":"","sources":["../../../src/editor/PropertyEditor/renderPropertyInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"renderPropertyInput.d.ts","sourceRoot":"","sources":["../../../src/editor/PropertyEditor/renderPropertyInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAiB7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,gDAAgD;IAChD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CACxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,KAAK,CAAC,SAAS,CAmSjB"}
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
import { jsxs as
|
|
1
|
+
import { jsxs as p, jsx as e } from "react/jsx-runtime";
|
|
2
2
|
import { TypographyInput as M } from "./inputs/TypographyInput.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { GalleryImagesInput as U } from "./inputs/GalleryImagesInput.js";
|
|
4
|
+
import { CarouselImagesInput as k } from "./inputs/CarouselImagesInput.js";
|
|
5
|
+
import { ImageGridInput as z } from "./inputs/ImageGridInput.js";
|
|
6
|
+
import { IconGridInput as S } from "./inputs/IconGridInput.js";
|
|
7
|
+
import { ToggleButton as B } from "./inputs/ToggleButton.js";
|
|
7
8
|
import { ImageInput as x } from "./inputs/ImageInput.js";
|
|
8
9
|
import { ColorInput as b } from "./inputs/ColorInput.js";
|
|
9
|
-
import { SliderInput as
|
|
10
|
-
import { ButtonGroupInput as
|
|
11
|
-
import { SelectInput as
|
|
12
|
-
import { NumberInput as
|
|
13
|
-
import { TextAreaInput as
|
|
14
|
-
import { TextInput as
|
|
15
|
-
function G(r, c, i, s,
|
|
16
|
-
const { label: t, description: l, inputType: T, options:
|
|
10
|
+
import { SliderInput as V } from "./inputs/SliderInput.js";
|
|
11
|
+
import { ButtonGroupInput as j } from "./inputs/ButtonGroupInput.js";
|
|
12
|
+
import { SelectInput as F } from "./inputs/SelectInput.js";
|
|
13
|
+
import { NumberInput as H } from "./inputs/NumberInput.js";
|
|
14
|
+
import { TextAreaInput as q } from "./inputs/TextAreaInput.js";
|
|
15
|
+
import { TextInput as v } from "./inputs/TextInput.js";
|
|
16
|
+
function G(r, c, i, s, n, a) {
|
|
17
|
+
const { label: t, description: l, inputType: T, options: d, min: f, max: y, step: h, size: P } = c;
|
|
17
18
|
if (c.readOnly)
|
|
18
|
-
return /* @__PURE__ */
|
|
19
|
-
/* @__PURE__ */
|
|
19
|
+
return /* @__PURE__ */ p("div", { className: "relative", children: [
|
|
20
|
+
/* @__PURE__ */ p("div", { className: "flex items-center gap-1 mb-1", children: [
|
|
20
21
|
/* @__PURE__ */ e("svg", { className: "w-3 h-3 text-gray-400", viewBox: "0 0 16 16", fill: "currentColor", children: /* @__PURE__ */ e("path", { d: "M8 1a4 4 0 0 0-4 4v2H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1h-1V5a4 4 0 0 0-4-4zm2 6H6V5a2 2 0 1 1 4 0v2z" }) }),
|
|
21
22
|
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-gray-400", children: t })
|
|
22
23
|
] }),
|
|
@@ -26,7 +27,7 @@ function G(r, c, i, s, d, a) {
|
|
|
26
27
|
switch (T) {
|
|
27
28
|
case "text":
|
|
28
29
|
return /* @__PURE__ */ e(
|
|
29
|
-
|
|
30
|
+
v,
|
|
30
31
|
{
|
|
31
32
|
value: i || "",
|
|
32
33
|
onChange: s,
|
|
@@ -38,7 +39,7 @@ function G(r, c, i, s, d, a) {
|
|
|
38
39
|
);
|
|
39
40
|
case "textarea":
|
|
40
41
|
return /* @__PURE__ */ e(
|
|
41
|
-
|
|
42
|
+
q,
|
|
42
43
|
{
|
|
43
44
|
value: i || "",
|
|
44
45
|
onChange: s,
|
|
@@ -51,7 +52,7 @@ function G(r, c, i, s, d, a) {
|
|
|
51
52
|
);
|
|
52
53
|
case "number":
|
|
53
54
|
return /* @__PURE__ */ e(
|
|
54
|
-
|
|
55
|
+
H,
|
|
55
56
|
{
|
|
56
57
|
value: i,
|
|
57
58
|
onChange: s,
|
|
@@ -59,8 +60,8 @@ function G(r, c, i, s, d, a) {
|
|
|
59
60
|
description: l,
|
|
60
61
|
placeholder: t,
|
|
61
62
|
min: f,
|
|
62
|
-
max:
|
|
63
|
-
step:
|
|
63
|
+
max: y,
|
|
64
|
+
step: h
|
|
64
65
|
},
|
|
65
66
|
r
|
|
66
67
|
);
|
|
@@ -76,44 +77,44 @@ function G(r, c, i, s, d, a) {
|
|
|
76
77
|
r
|
|
77
78
|
);
|
|
78
79
|
case "select":
|
|
79
|
-
return !
|
|
80
|
+
return !d || d.length === 0 ? G(
|
|
80
81
|
r,
|
|
81
82
|
{ ...c, inputType: "text" },
|
|
82
83
|
i,
|
|
83
84
|
s,
|
|
84
|
-
|
|
85
|
-
) :
|
|
86
|
-
|
|
85
|
+
n
|
|
86
|
+
) : d.length <= 3 ? /* @__PURE__ */ e(
|
|
87
|
+
j,
|
|
87
88
|
{
|
|
88
89
|
value: i,
|
|
89
90
|
onChange: s,
|
|
90
91
|
label: t,
|
|
91
92
|
description: l,
|
|
92
|
-
options:
|
|
93
|
+
options: d
|
|
93
94
|
},
|
|
94
95
|
r
|
|
95
96
|
) : /* @__PURE__ */ e(
|
|
96
|
-
|
|
97
|
+
F,
|
|
97
98
|
{
|
|
98
99
|
value: i,
|
|
99
100
|
onChange: s,
|
|
100
101
|
label: t,
|
|
101
102
|
description: l,
|
|
102
|
-
options:
|
|
103
|
+
options: d
|
|
103
104
|
},
|
|
104
105
|
r
|
|
105
106
|
);
|
|
106
107
|
case "slider":
|
|
107
108
|
return /* @__PURE__ */ e(
|
|
108
|
-
|
|
109
|
+
V,
|
|
109
110
|
{
|
|
110
111
|
value: i,
|
|
111
112
|
onChange: s,
|
|
112
113
|
label: t,
|
|
113
114
|
description: l,
|
|
114
115
|
min: f,
|
|
115
|
-
max:
|
|
116
|
-
step:
|
|
116
|
+
max: y,
|
|
117
|
+
step: h
|
|
117
118
|
},
|
|
118
119
|
r
|
|
119
120
|
);
|
|
@@ -148,10 +149,10 @@ function G(r, c, i, s, d, a) {
|
|
|
148
149
|
size: { width: 160, height: 80 },
|
|
149
150
|
showUrlInput: !1,
|
|
150
151
|
maxSizeMB: 10,
|
|
151
|
-
tenantId:
|
|
152
|
-
schoolId:
|
|
153
|
-
siteId:
|
|
154
|
-
authToken:
|
|
152
|
+
tenantId: n?.tenantId,
|
|
153
|
+
schoolId: n?.schoolId,
|
|
154
|
+
siteId: n?.siteId || void 0,
|
|
155
|
+
authToken: n?.authToken,
|
|
155
156
|
assetType: "image",
|
|
156
157
|
deferUpload: !0
|
|
157
158
|
},
|
|
@@ -159,7 +160,7 @@ function G(r, c, i, s, d, a) {
|
|
|
159
160
|
);
|
|
160
161
|
case "checkbox":
|
|
161
162
|
return /* @__PURE__ */ e(
|
|
162
|
-
|
|
163
|
+
B,
|
|
163
164
|
{
|
|
164
165
|
value: !!i,
|
|
165
166
|
onChange: s,
|
|
@@ -171,7 +172,7 @@ function G(r, c, i, s, d, a) {
|
|
|
171
172
|
);
|
|
172
173
|
case "icon-grid":
|
|
173
174
|
return /* @__PURE__ */ e(
|
|
174
|
-
|
|
175
|
+
S,
|
|
175
176
|
{
|
|
176
177
|
value: i || "arrow-right",
|
|
177
178
|
onChange: s,
|
|
@@ -184,7 +185,7 @@ function G(r, c, i, s, d, a) {
|
|
|
184
185
|
if (a?.allProps && a?.onMultiUpdate) {
|
|
185
186
|
const g = a.allProps.imageGridPreset || "four-equal", I = a.allProps.imageGridImages || [], w = a.allProps.imageGridGap ?? 8;
|
|
186
187
|
return /* @__PURE__ */ e(
|
|
187
|
-
|
|
188
|
+
z,
|
|
188
189
|
{
|
|
189
190
|
preset: g,
|
|
190
191
|
images: I,
|
|
@@ -200,7 +201,7 @@ function G(r, c, i, s, d, a) {
|
|
|
200
201
|
},
|
|
201
202
|
label: t,
|
|
202
203
|
description: l,
|
|
203
|
-
uploadConfig:
|
|
204
|
+
uploadConfig: n
|
|
204
205
|
},
|
|
205
206
|
r
|
|
206
207
|
);
|
|
@@ -210,7 +211,7 @@ function G(r, c, i, s, d, a) {
|
|
|
210
211
|
if (a?.allProps && a?.onMultiUpdate) {
|
|
211
212
|
const g = a.allProps.carouselImages || [];
|
|
212
213
|
return /* @__PURE__ */ e(
|
|
213
|
-
|
|
214
|
+
k,
|
|
214
215
|
{
|
|
215
216
|
images: g,
|
|
216
217
|
onImagesChange: (I) => {
|
|
@@ -218,22 +219,35 @@ function G(r, c, i, s, d, a) {
|
|
|
218
219
|
},
|
|
219
220
|
label: t,
|
|
220
221
|
description: l,
|
|
221
|
-
uploadConfig:
|
|
222
|
+
uploadConfig: n
|
|
222
223
|
},
|
|
223
224
|
r
|
|
224
225
|
);
|
|
225
226
|
}
|
|
226
227
|
return null;
|
|
228
|
+
case "gallery-images":
|
|
229
|
+
return /* @__PURE__ */ e(
|
|
230
|
+
U,
|
|
231
|
+
{
|
|
232
|
+
images: i || [],
|
|
233
|
+
onImagesChange: s,
|
|
234
|
+
label: t,
|
|
235
|
+
description: l,
|
|
236
|
+
uploadConfig: n,
|
|
237
|
+
warningThreshold: 50
|
|
238
|
+
},
|
|
239
|
+
r
|
|
240
|
+
);
|
|
227
241
|
case "typography":
|
|
228
|
-
let
|
|
229
|
-
return r.includes("title") || r.includes("Title") ? (
|
|
242
|
+
let m = 16, o = "normal";
|
|
243
|
+
return r.includes("title") || r.includes("Title") ? (m = 48, o = "bold") : r.includes("subtitle") || r.includes("Subtitle") ? (m = 24, o = "medium") : (r.includes("description") || r.includes("Description")) && (m = 16, o = "normal"), /* @__PURE__ */ e(
|
|
230
244
|
M,
|
|
231
245
|
{
|
|
232
246
|
value: i,
|
|
233
247
|
onChange: s,
|
|
234
248
|
label: t,
|
|
235
|
-
defaultFontSize:
|
|
236
|
-
defaultFontWeight:
|
|
249
|
+
defaultFontSize: m,
|
|
250
|
+
defaultFontWeight: o
|
|
237
251
|
},
|
|
238
252
|
r
|
|
239
253
|
);
|
|
@@ -243,7 +257,7 @@ function G(r, c, i, s, d, a) {
|
|
|
243
257
|
{ ...c, inputType: "text" },
|
|
244
258
|
i,
|
|
245
259
|
s,
|
|
246
|
-
|
|
260
|
+
n
|
|
247
261
|
);
|
|
248
262
|
}
|
|
249
263
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderPropertyInput.js","sources":["../../../src/editor/PropertyEditor/renderPropertyInput.tsx"],"sourcesContent":["import React from \"react\";\nimport { InspectorMeta } from \"../../engine\";\nimport {\n TextInput,\n TextAreaInput,\n ColorInput,\n NumberInput,\n SelectInput,\n SliderInput,\n ToggleButton,\n ButtonGroupInput,\n IconGridInput,\n ImageGridInput,\n TypographyInput,\n ImageInput,\n CarouselImagesInput,\n} from \"./inputs\";\nimport type { UploadConfig } from \"../LandingPageEditor\";\n\n/**\n * Extended context for special input types that need to update multiple props\n */\nexport interface RenderInputContext {\n /** All current prop values (for inputs that read multiple props) */\n allProps?: Record<string, any>;\n /** Callback to update multiple props at once */\n onMultiUpdate?: (updates: Record<string, any>) => void;\n}\n\n/**\n * Renderiza um input baseado no tipo especificado em inspectorMeta\n */\nexport function renderPropertyInput(\n propName: string,\n meta: InspectorMeta,\n value: any,\n onChange: (value: any) => void,\n uploadConfig?: UploadConfig,\n context?: RenderInputContext,\n): React.ReactNode {\n const { label, description, inputType, options, min, max, step, size } = meta;\n\n // Campo readOnly: mostrar valor com overlay de bloqueio\n if (meta.readOnly) {\n return (\n <div key={propName} className=\"relative\">\n <div className=\"flex items-center gap-1 mb-1\">\n <svg className=\"w-3 h-3 text-gray-400\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a4 4 0 0 0-4 4v2H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1h-1V5a4 4 0 0 0-4-4zm2 6H6V5a2 2 0 1 1 4 0v2z\"/>\n </svg>\n <span className=\"text-xs font-medium text-gray-400\">{label}</span>\n </div>\n <div className=\"px-2 py-1.5 text-xs text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 cursor-not-allowed select-none truncate\">\n {value !== undefined && value !== null ? String(value) : \"—\"}\n </div>\n {description && (\n <p className=\"text-xs text-gray-400 mt-0.5 italic\">{description}</p>\n )}\n </div>\n );\n }\n\n switch (inputType) {\n case \"text\":\n return (\n <TextInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n description={description}\n placeholder={label}\n />\n );\n\n case \"textarea\":\n return (\n <TextAreaInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n description={description}\n placeholder={label}\n rows={3}\n />\n );\n\n case \"number\":\n return (\n <NumberInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n placeholder={label}\n min={min}\n max={max}\n step={step}\n />\n );\n\n case \"color\":\n return (\n <ColorInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n />\n );\n\n case \"select\":\n if (!options || options.length === 0) {\n // Fallback para text input\n return renderPropertyInput(\n propName,\n { ...meta, inputType: \"text\" },\n value,\n onChange,\n uploadConfig,\n );\n }\n // Usar ButtonGroup para 2-3 opções, Select para 4+\n if (options.length <= 3) {\n return (\n <ButtonGroupInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n options={options}\n />\n );\n }\n return (\n <SelectInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n options={options}\n />\n );\n\n case \"slider\":\n return (\n <SliderInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n min={min}\n max={max}\n step={step}\n />\n );\n\n case \"image\":\n return (\n <ImageInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n />\n );\n\n case \"color-advanced\":\n // Usar o mesmo ColorInput simples - funciona melhor que o picker avançado\n return (\n <ColorInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n description={description}\n />\n );\n\n case \"image-upload\":\n return (\n <ImageInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n size={{ width: 160, height: 80 }}\n showUrlInput={false}\n maxSizeMB={10}\n tenantId={uploadConfig?.tenantId}\n schoolId={uploadConfig?.schoolId}\n siteId={uploadConfig?.siteId || undefined}\n authToken={uploadConfig?.authToken}\n assetType=\"image\"\n deferUpload={true}\n />\n );\n\n case \"checkbox\":\n return (\n <ToggleButton\n key={propName}\n value={!!value}\n onChange={onChange}\n label={label}\n description={description}\n size={size}\n />\n );\n\n case \"icon-grid\":\n return (\n <IconGridInput\n key={propName}\n value={value || \"arrow-right\"}\n onChange={onChange}\n label={label}\n description={description}\n />\n );\n\n case \"image-grid\":\n // Image grid needs to read/write multiple props (preset, images, gap)\n // We use the extended context if available\n if (context?.allProps && context?.onMultiUpdate) {\n const preset = context.allProps.imageGridPreset || \"four-equal\";\n const images = context.allProps.imageGridImages || [];\n const gap = context.allProps.imageGridGap ?? 8;\n\n return (\n <ImageGridInput\n key={propName}\n preset={preset}\n images={images}\n gap={gap}\n onPresetChange={(newPreset) => {\n context.onMultiUpdate!({ imageGridPreset: newPreset });\n }}\n onImagesChange={(newImages) => {\n context.onMultiUpdate!({ imageGridImages: newImages });\n }}\n onGapChange={(newGap) => {\n context.onMultiUpdate!({ imageGridGap: newGap });\n }}\n label={label}\n description={description}\n uploadConfig={uploadConfig}\n />\n );\n }\n // Fallback: single-value mode (shouldn't happen in practice)\n return null;\n\n case \"carousel-images\":\n // Carousel images needs to read/write carouselImages via multi-prop context\n if (context?.allProps && context?.onMultiUpdate) {\n const images = context.allProps.carouselImages || [];\n\n return (\n <CarouselImagesInput\n key={propName}\n images={images}\n onImagesChange={(newImages) => {\n context.onMultiUpdate!({ carouselImages: newImages });\n }}\n label={label}\n description={description}\n uploadConfig={uploadConfig}\n />\n );\n }\n return null;\n\n case \"typography\":\n // Determina defaults baseado no nome da prop\n let defaultFontSize = 16;\n let defaultFontWeight: \"light\" | \"normal\" | \"medium\" | \"semibold\" | \"bold\" = \"normal\";\n\n if (propName.includes(\"title\") || propName.includes(\"Title\")) {\n defaultFontSize = 48;\n defaultFontWeight = \"bold\";\n } else if (propName.includes(\"subtitle\") || propName.includes(\"Subtitle\")) {\n defaultFontSize = 24;\n defaultFontWeight = \"medium\";\n } else if (propName.includes(\"description\") || propName.includes(\"Description\")) {\n defaultFontSize = 16;\n defaultFontWeight = \"normal\";\n }\n\n return (\n <TypographyInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n defaultFontSize={defaultFontSize}\n defaultFontWeight={defaultFontWeight}\n />\n );\n\n default:\n // Fallback para text input\n return renderPropertyInput(\n propName,\n { ...meta, inputType: \"text\" },\n value,\n onChange,\n uploadConfig,\n );\n }\n}\n"],"names":["renderPropertyInput","propName","meta","value","onChange","uploadConfig","context","label","description","inputType","options","min","max","step","size","jsxs","jsx","TextInput","TextAreaInput","NumberInput","ColorInput","ButtonGroupInput","SelectInput","SliderInput","ImageInput","ToggleButton","IconGridInput","preset","images","gap","ImageGridInput","newPreset","newImages","newGap","CarouselImagesInput","defaultFontSize","defaultFontWeight","TypographyInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderPropertyInput.js","sources":["../../../src/editor/PropertyEditor/renderPropertyInput.tsx"],"sourcesContent":["import React from \"react\";\nimport { InspectorMeta } from \"../../engine\";\nimport {\n TextInput,\n TextAreaInput,\n ColorInput,\n NumberInput,\n SelectInput,\n SliderInput,\n ToggleButton,\n ButtonGroupInput,\n IconGridInput,\n ImageGridInput,\n TypographyInput,\n ImageInput,\n CarouselImagesInput,\n GalleryImagesInput,\n} from \"./inputs\";\nimport type { UploadConfig } from \"../LandingPageEditor\";\n\n/**\n * Extended context for special input types that need to update multiple props\n */\nexport interface RenderInputContext {\n /** All current prop values (for inputs that read multiple props) */\n allProps?: Record<string, any>;\n /** Callback to update multiple props at once */\n onMultiUpdate?: (updates: Record<string, any>) => void;\n}\n\n/**\n * Renderiza um input baseado no tipo especificado em inspectorMeta\n */\nexport function renderPropertyInput(\n propName: string,\n meta: InspectorMeta,\n value: any,\n onChange: (value: any) => void,\n uploadConfig?: UploadConfig,\n context?: RenderInputContext,\n): React.ReactNode {\n const { label, description, inputType, options, min, max, step, size } = meta;\n\n // Campo readOnly: mostrar valor com overlay de bloqueio\n if (meta.readOnly) {\n return (\n <div key={propName} className=\"relative\">\n <div className=\"flex items-center gap-1 mb-1\">\n <svg className=\"w-3 h-3 text-gray-400\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a4 4 0 0 0-4 4v2H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1h-1V5a4 4 0 0 0-4-4zm2 6H6V5a2 2 0 1 1 4 0v2z\"/>\n </svg>\n <span className=\"text-xs font-medium text-gray-400\">{label}</span>\n </div>\n <div className=\"px-2 py-1.5 text-xs text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 cursor-not-allowed select-none truncate\">\n {value !== undefined && value !== null ? String(value) : \"—\"}\n </div>\n {description && (\n <p className=\"text-xs text-gray-400 mt-0.5 italic\">{description}</p>\n )}\n </div>\n );\n }\n\n switch (inputType) {\n case \"text\":\n return (\n <TextInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n description={description}\n placeholder={label}\n />\n );\n\n case \"textarea\":\n return (\n <TextAreaInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n description={description}\n placeholder={label}\n rows={3}\n />\n );\n\n case \"number\":\n return (\n <NumberInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n placeholder={label}\n min={min}\n max={max}\n step={step}\n />\n );\n\n case \"color\":\n return (\n <ColorInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n />\n );\n\n case \"select\":\n if (!options || options.length === 0) {\n // Fallback para text input\n return renderPropertyInput(\n propName,\n { ...meta, inputType: \"text\" },\n value,\n onChange,\n uploadConfig,\n );\n }\n // Usar ButtonGroup para 2-3 opções, Select para 4+\n if (options.length <= 3) {\n return (\n <ButtonGroupInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n options={options}\n />\n );\n }\n return (\n <SelectInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n options={options}\n />\n );\n\n case \"slider\":\n return (\n <SliderInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n description={description}\n min={min}\n max={max}\n step={step}\n />\n );\n\n case \"image\":\n return (\n <ImageInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n />\n );\n\n case \"color-advanced\":\n // Usar o mesmo ColorInput simples - funciona melhor que o picker avançado\n return (\n <ColorInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n description={description}\n />\n );\n\n case \"image-upload\":\n return (\n <ImageInput\n key={propName}\n value={value || \"\"}\n onChange={onChange}\n label={label}\n size={{ width: 160, height: 80 }}\n showUrlInput={false}\n maxSizeMB={10}\n tenantId={uploadConfig?.tenantId}\n schoolId={uploadConfig?.schoolId}\n siteId={uploadConfig?.siteId || undefined}\n authToken={uploadConfig?.authToken}\n assetType=\"image\"\n deferUpload={true}\n />\n );\n\n case \"checkbox\":\n return (\n <ToggleButton\n key={propName}\n value={!!value}\n onChange={onChange}\n label={label}\n description={description}\n size={size}\n />\n );\n\n case \"icon-grid\":\n return (\n <IconGridInput\n key={propName}\n value={value || \"arrow-right\"}\n onChange={onChange}\n label={label}\n description={description}\n />\n );\n\n case \"image-grid\":\n // Image grid needs to read/write multiple props (preset, images, gap)\n // We use the extended context if available\n if (context?.allProps && context?.onMultiUpdate) {\n const preset = context.allProps.imageGridPreset || \"four-equal\";\n const images = context.allProps.imageGridImages || [];\n const gap = context.allProps.imageGridGap ?? 8;\n\n return (\n <ImageGridInput\n key={propName}\n preset={preset}\n images={images}\n gap={gap}\n onPresetChange={(newPreset) => {\n context.onMultiUpdate!({ imageGridPreset: newPreset });\n }}\n onImagesChange={(newImages) => {\n context.onMultiUpdate!({ imageGridImages: newImages });\n }}\n onGapChange={(newGap) => {\n context.onMultiUpdate!({ imageGridGap: newGap });\n }}\n label={label}\n description={description}\n uploadConfig={uploadConfig}\n />\n );\n }\n // Fallback: single-value mode (shouldn't happen in practice)\n return null;\n\n case \"carousel-images\":\n // Carousel images needs to read/write carouselImages via multi-prop context\n if (context?.allProps && context?.onMultiUpdate) {\n const images = context.allProps.carouselImages || [];\n\n return (\n <CarouselImagesInput\n key={propName}\n images={images}\n onImagesChange={(newImages) => {\n context.onMultiUpdate!({ carouselImages: newImages });\n }}\n label={label}\n description={description}\n uploadConfig={uploadConfig}\n />\n );\n }\n return null;\n\n case \"gallery-images\":\n // Gallery images: value is directly the GalleryImage[] array\n return (\n <GalleryImagesInput\n key={propName}\n images={value || []}\n onImagesChange={onChange}\n label={label}\n description={description}\n uploadConfig={uploadConfig}\n warningThreshold={50}\n />\n );\n\n case \"typography\":\n // Determina defaults baseado no nome da prop\n let defaultFontSize = 16;\n let defaultFontWeight: \"light\" | \"normal\" | \"medium\" | \"semibold\" | \"bold\" = \"normal\";\n\n if (propName.includes(\"title\") || propName.includes(\"Title\")) {\n defaultFontSize = 48;\n defaultFontWeight = \"bold\";\n } else if (propName.includes(\"subtitle\") || propName.includes(\"Subtitle\")) {\n defaultFontSize = 24;\n defaultFontWeight = \"medium\";\n } else if (propName.includes(\"description\") || propName.includes(\"Description\")) {\n defaultFontSize = 16;\n defaultFontWeight = \"normal\";\n }\n\n return (\n <TypographyInput\n key={propName}\n value={value}\n onChange={onChange}\n label={label}\n defaultFontSize={defaultFontSize}\n defaultFontWeight={defaultFontWeight}\n />\n );\n\n default:\n // Fallback para text input\n return renderPropertyInput(\n propName,\n { ...meta, inputType: \"text\" },\n value,\n onChange,\n uploadConfig,\n );\n }\n}\n"],"names":["renderPropertyInput","propName","meta","value","onChange","uploadConfig","context","label","description","inputType","options","min","max","step","size","jsxs","jsx","TextInput","TextAreaInput","NumberInput","ColorInput","ButtonGroupInput","SelectInput","SliderInput","ImageInput","ToggleButton","IconGridInput","preset","images","gap","ImageGridInput","newPreset","newImages","newGap","CarouselImagesInput","GalleryImagesInput","defaultFontSize","defaultFontWeight","TypographyInput"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageGallery.d.ts","sourceRoot":"","sources":["../../../../../src/engine/registry/blocks/sections/imageGallery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,iBAAiB,CAAC,OAAO,CAuElE,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,cAAc,
|
|
1
|
+
{"version":3,"file":"imageGallery.d.ts","sourceRoot":"","sources":["../../../../../src/engine/registry/blocks/sections/imageGallery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,iBAAiB,CAAC,OAAO,CAuElE,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,cAAc,CAiQ7D,CAAC;AAKF,eAAe,iBAAiB,CAAC"}
|
|
@@ -88,10 +88,12 @@ const o = {
|
|
|
88
88
|
inputType: "text",
|
|
89
89
|
group: "Conteúdo"
|
|
90
90
|
},
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
images: {
|
|
92
|
+
label: "Imagens",
|
|
93
|
+
inputType: "gallery-images",
|
|
94
|
+
group: "Conteúdo",
|
|
95
|
+
description: "Adicione e gerencie as imagens da galeria"
|
|
96
|
+
},
|
|
95
97
|
// =========================================================================
|
|
96
98
|
// GRUPO: Layout
|
|
97
99
|
// =========================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageGallery.js","sources":["../../../../../src/engine/registry/blocks/sections/imageGallery.ts"],"sourcesContent":["import { BlockDefinition } from \"../../types\";\nimport { componentRegistry } from \"../../registry\";\nimport type { ImageGalleryBlock } from \"../../../schema/siteDocument\";\nimport { galleryVariations } from \"../../../presets/galleryVariations\";\n\n/**\n * Valores padrão do ImageGallery - Use para garantir consistência em templates e factories\n */\nexport const IMAGE_GALLERY_DEFAULT_PROPS: ImageGalleryBlock[\"props\"] = {\n // Conteúdo\n title: \"Nossa Galeria\",\n subtitle: \"Confira nossas imagens\",\n images: [\n {\n id: \"1\",\n src: \"https://placehold.co/800x600/3b82f6/ffffff?text=Image+1\",\n alt: \"Imagem de demonstração 1\",\n title: \"Projeto 1\",\n description: \"Descrição da primeira imagem\",\n },\n {\n id: \"2\",\n src: \"https://placehold.co/800x600/8b5cf6/ffffff?text=Image+2\",\n alt: \"Imagem de demonstração 2\",\n title: \"Projeto 2\",\n description: \"Descrição da segunda imagem\",\n },\n {\n id: \"3\",\n src: \"https://placehold.co/800x600/ec4899/ffffff?text=Image+3\",\n alt: \"Imagem de demonstração 3\",\n title: \"Projeto 3\",\n description: \"Descrição da terceira imagem\",\n },\n {\n id: \"4\",\n src: \"https://placehold.co/800x600/10b981/ffffff?text=Image+4\",\n alt: \"Imagem de demonstração 4\",\n title: \"Projeto 4\",\n description: \"Descrição da quarta imagem\",\n },\n ],\n\n // Layout\n variation: \"gallery-grid\",\n columns: 4,\n gap: 1,\n aspectRatio: \"auto\",\n\n // Aparência\n imageBorderRadius: 8,\n imageShadow: \"md\",\n\n // Animações\n enterAnimation: \"fade-scale\",\n hoverEffect: \"zoom-overlay\",\n hoverIntensity: 50,\n\n // Lightbox\n lightbox: {\n mode: \"adaptive\",\n showArrows: true,\n showThumbnails: true,\n showCounter: true,\n showCaption: true,\n enableZoom: true,\n enableDownload: false,\n enableAutoplay: false,\n autoplayInterval: 5,\n closeOnBackdropClick: true,\n closeOnEsc: true,\n enableKeyboard: true,\n enableTouchGestures: true,\n transitionDuration: 300,\n },\n\n // Performance\n lazyLoad: true,\n showWarningAt: 50,\n};\n\nexport const imageGalleryBlock: BlockDefinition<\"imageGallery\"> = {\n type: \"imageGallery\",\n name: \"Galeria de Imagens\",\n description: \"Galeria de imagens com lightbox profissional e zoom\",\n category: \"sections\",\n canHaveChildren: false,\n defaultProps: IMAGE_GALLERY_DEFAULT_PROPS,\n variations: Object.values(galleryVariations),\n\n inspectorMeta: {\n // =========================================================================\n // GRUPO: Conteúdo\n // =========================================================================\n title: {\n label: \"Título\",\n inputType: \"text\",\n group: \"Conteúdo\",\n },\n subtitle: {\n label: \"Subtítulo\",\n inputType: \"text\",\n group: \"Conteúdo\",\n },\n // Note: \"images\" field is hidden because there's no modal UI for it yet.\n // Users add images via defaultProps or programmatically.\n // The gallery-images input type exists but shows confusing \"[object Object]...\" text.\n // Will be re-enabled when GalleryImagesInput modal component is implemented.\n\n // =========================================================================\n // GRUPO: Layout\n // =========================================================================\n variation: {\n label: \"Layout\",\n inputType: \"select\",\n options: [\n { value: \"gallery-grid\", label: \"Grid Clássico\" },\n { value: \"gallery-masonry\", label: \"Masonry (v1.1)\" },\n { value: \"gallery-featured\", label: \"Destaque (v1.2)\" },\n { value: \"gallery-carousel\", label: \"Carrossel (v1.3)\" },\n { value: \"gallery-alternating\", label: \"Alternado (v1.4)\" },\n ],\n group: \"Layout\",\n },\n columns: {\n label: \"Colunas\",\n inputType: \"number\",\n min: 2,\n max: 12,\n group: \"Layout\",\n description: \"Número de colunas no desktop (responsivo: 4→3→2→1)\",\n },\n gap: {\n label: \"Espaçamento (rem)\",\n inputType: \"number\",\n min: 0,\n max: 5,\n step: 0.5,\n group: \"Layout\",\n description: \"Espaçamento entre imagens (0 = sem espaço)\",\n },\n aspectRatio: {\n label: \"Proporção\",\n inputType: \"select\",\n options: [\n { value: \"auto\", label: \"Original\" },\n { value: \"1/1\", label: \"Quadrado (1:1)\" },\n { value: \"4/3\", label: \"Paisagem (4:3)\" },\n { value: \"16/9\", label: \"Widescreen (16:9)\" },\n { value: \"3/2\", label: \"Clássico (3:2)\" },\n ],\n group: \"Layout\",\n },\n\n // =========================================================================\n // GRUPO: Aparência\n // =========================================================================\n bg: {\n label: \"Cor de Fundo\",\n inputType: \"color\",\n group: \"Aparência\",\n },\n imageBorderRadius: {\n label: \"Borda Arredondada\",\n inputType: \"number\",\n min: 0,\n max: 32,\n group: \"Aparência\",\n description: \"Arredondamento das imagens (px)\",\n },\n imageShadow: {\n label: \"Sombra da Imagem\",\n inputType: \"select\",\n options: [\n { value: \"none\", label: \"Nenhuma\" },\n { value: \"sm\", label: \"Pequena\" },\n { value: \"md\", label: \"Média\" },\n { value: \"lg\", label: \"Grande\" },\n { value: \"xl\", label: \"Extra Grande\" },\n ],\n group: \"Aparência\",\n },\n\n // =========================================================================\n // GRUPO: Animações\n // =========================================================================\n enterAnimation: {\n label: \"Animação de Entrada\",\n inputType: \"select\",\n options: [\n { value: \"fade-scale\", label: \"Fade + Zoom\" },\n { value: \"stagger\", label: \"Cascata\" },\n { value: \"slide-up\", label: \"Desliza de Baixo\" },\n { value: \"none\", label: \"Sem animação\" },\n ],\n group: \"Animações\",\n },\n hoverEffect: {\n label: \"Efeito de Hover\",\n inputType: \"select\",\n options: [\n { value: \"zoom-overlay\", label: \"Zoom + Overlay\" },\n { value: \"glow\", label: \"Brilho\" },\n { value: \"scale\", label: \"Aumentar\" },\n { value: \"caption-reveal\", label: \"Revelar Legenda\" },\n { value: \"none\", label: \"Sem efeito\" },\n ],\n group: \"Animações\",\n },\n hoverIntensity: {\n label: \"Intensidade do Hover\",\n inputType: \"number\",\n min: 0,\n max: 100,\n group: \"Animações\",\n description: \"Intensidade do efeito (0-100%)\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Tema\n // =========================================================================\n \"lightbox.mode\": {\n label: \"Tema do Lightbox\",\n inputType: \"select\",\n options: [\n { value: \"adaptive\", label: \"Adaptável (Auto)\" },\n { value: \"dark\", label: \"Escuro\" },\n { value: \"light\", label: \"Claro\" },\n { value: \"theme\", label: \"Seguir Tema do Site\" },\n ],\n group: \"Lightbox - Tema\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Navegação\n // =========================================================================\n \"lightbox.showArrows\": {\n label: \"Mostrar Setas\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n \"lightbox.showThumbnails\": {\n label: \"Mostrar Miniaturas\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n \"lightbox.showCounter\": {\n label: \"Mostrar Contador\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n description: 'Exibe \"3 de 12\"',\n },\n \"lightbox.showCaption\": {\n label: \"Mostrar Legenda\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Funcionalidades\n // =========================================================================\n \"lightbox.enableZoom\": {\n label: \"Ativar Zoom\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.enableDownload\": {\n label: \"Ativar Download\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Permitir download de imagens (v1.1)\",\n },\n \"lightbox.enableAutoplay\": {\n label: \"Ativar Autoplay\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Reprodução automática (v1.3)\",\n },\n \"lightbox.autoplayInterval\": {\n label: \"Intervalo do Autoplay\",\n inputType: \"number\",\n min: 2,\n max: 10,\n group: \"Lightbox - Funcionalidades\",\n description: \"Intervalo em segundos\",\n },\n \"lightbox.closeOnBackdropClick\": {\n label: \"Fechar ao Clicar Fora\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.closeOnEsc\": {\n label: \"Fechar com ESC\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.enableKeyboard\": {\n label: \"Navegação por Teclado\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Arrows, +, -, 0\",\n },\n \"lightbox.enableTouchGestures\": {\n label: \"Gestos Touch\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Swipe, pinch, double-tap\",\n },\n \"lightbox.transitionDuration\": {\n label: \"Duração da Transição\",\n inputType: \"number\",\n min: 100,\n max: 1000,\n step: 50,\n group: \"Lightbox - Funcionalidades\",\n description: \"Velocidade da animação (ms)\",\n },\n\n // =========================================================================\n // GRUPO: Performance\n // =========================================================================\n lazyLoad: {\n label: \"Lazy Loading\",\n inputType: \"checkbox\",\n group: \"Performance\",\n description: \"Carregar imagens sob demanda\",\n },\n showWarningAt: {\n label: \"Aviso de Performance\",\n inputType: \"number\",\n min: 20,\n max: 100,\n group: \"Performance\",\n description: \"Mostrar alerta após N imagens\",\n },\n },\n};\n\n// Register the block\ncomponentRegistry.register(imageGalleryBlock);\n\nexport default imageGalleryBlock;\n"],"names":["IMAGE_GALLERY_DEFAULT_PROPS","imageGalleryBlock","galleryVariations","componentRegistry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"imageGallery.js","sources":["../../../../../src/engine/registry/blocks/sections/imageGallery.ts"],"sourcesContent":["import { BlockDefinition } from \"../../types\";\nimport { componentRegistry } from \"../../registry\";\nimport type { ImageGalleryBlock } from \"../../../schema/siteDocument\";\nimport { galleryVariations } from \"../../../presets/galleryVariations\";\n\n/**\n * Valores padrão do ImageGallery - Use para garantir consistência em templates e factories\n */\nexport const IMAGE_GALLERY_DEFAULT_PROPS: ImageGalleryBlock[\"props\"] = {\n // Conteúdo\n title: \"Nossa Galeria\",\n subtitle: \"Confira nossas imagens\",\n images: [\n {\n id: \"1\",\n src: \"https://placehold.co/800x600/3b82f6/ffffff?text=Image+1\",\n alt: \"Imagem de demonstração 1\",\n title: \"Projeto 1\",\n description: \"Descrição da primeira imagem\",\n },\n {\n id: \"2\",\n src: \"https://placehold.co/800x600/8b5cf6/ffffff?text=Image+2\",\n alt: \"Imagem de demonstração 2\",\n title: \"Projeto 2\",\n description: \"Descrição da segunda imagem\",\n },\n {\n id: \"3\",\n src: \"https://placehold.co/800x600/ec4899/ffffff?text=Image+3\",\n alt: \"Imagem de demonstração 3\",\n title: \"Projeto 3\",\n description: \"Descrição da terceira imagem\",\n },\n {\n id: \"4\",\n src: \"https://placehold.co/800x600/10b981/ffffff?text=Image+4\",\n alt: \"Imagem de demonstração 4\",\n title: \"Projeto 4\",\n description: \"Descrição da quarta imagem\",\n },\n ],\n\n // Layout\n variation: \"gallery-grid\",\n columns: 4,\n gap: 1,\n aspectRatio: \"auto\",\n\n // Aparência\n imageBorderRadius: 8,\n imageShadow: \"md\",\n\n // Animações\n enterAnimation: \"fade-scale\",\n hoverEffect: \"zoom-overlay\",\n hoverIntensity: 50,\n\n // Lightbox\n lightbox: {\n mode: \"adaptive\",\n showArrows: true,\n showThumbnails: true,\n showCounter: true,\n showCaption: true,\n enableZoom: true,\n enableDownload: false,\n enableAutoplay: false,\n autoplayInterval: 5,\n closeOnBackdropClick: true,\n closeOnEsc: true,\n enableKeyboard: true,\n enableTouchGestures: true,\n transitionDuration: 300,\n },\n\n // Performance\n lazyLoad: true,\n showWarningAt: 50,\n};\n\nexport const imageGalleryBlock: BlockDefinition<\"imageGallery\"> = {\n type: \"imageGallery\",\n name: \"Galeria de Imagens\",\n description: \"Galeria de imagens com lightbox profissional e zoom\",\n category: \"sections\",\n canHaveChildren: false,\n defaultProps: IMAGE_GALLERY_DEFAULT_PROPS,\n variations: Object.values(galleryVariations),\n\n inspectorMeta: {\n // =========================================================================\n // GRUPO: Conteúdo\n // =========================================================================\n title: {\n label: \"Título\",\n inputType: \"text\",\n group: \"Conteúdo\",\n },\n subtitle: {\n label: \"Subtítulo\",\n inputType: \"text\",\n group: \"Conteúdo\",\n },\n images: {\n label: \"Imagens\",\n inputType: \"gallery-images\",\n group: \"Conteúdo\",\n description: \"Adicione e gerencie as imagens da galeria\",\n },\n\n // =========================================================================\n // GRUPO: Layout\n // =========================================================================\n variation: {\n label: \"Layout\",\n inputType: \"select\",\n options: [\n { value: \"gallery-grid\", label: \"Grid Clássico\" },\n { value: \"gallery-masonry\", label: \"Masonry (v1.1)\" },\n { value: \"gallery-featured\", label: \"Destaque (v1.2)\" },\n { value: \"gallery-carousel\", label: \"Carrossel (v1.3)\" },\n { value: \"gallery-alternating\", label: \"Alternado (v1.4)\" },\n ],\n group: \"Layout\",\n },\n columns: {\n label: \"Colunas\",\n inputType: \"number\",\n min: 2,\n max: 12,\n group: \"Layout\",\n description: \"Número de colunas no desktop (responsivo: 4→3→2→1)\",\n },\n gap: {\n label: \"Espaçamento (rem)\",\n inputType: \"number\",\n min: 0,\n max: 5,\n step: 0.5,\n group: \"Layout\",\n description: \"Espaçamento entre imagens (0 = sem espaço)\",\n },\n aspectRatio: {\n label: \"Proporção\",\n inputType: \"select\",\n options: [\n { value: \"auto\", label: \"Original\" },\n { value: \"1/1\", label: \"Quadrado (1:1)\" },\n { value: \"4/3\", label: \"Paisagem (4:3)\" },\n { value: \"16/9\", label: \"Widescreen (16:9)\" },\n { value: \"3/2\", label: \"Clássico (3:2)\" },\n ],\n group: \"Layout\",\n },\n\n // =========================================================================\n // GRUPO: Aparência\n // =========================================================================\n bg: {\n label: \"Cor de Fundo\",\n inputType: \"color\",\n group: \"Aparência\",\n },\n imageBorderRadius: {\n label: \"Borda Arredondada\",\n inputType: \"number\",\n min: 0,\n max: 32,\n group: \"Aparência\",\n description: \"Arredondamento das imagens (px)\",\n },\n imageShadow: {\n label: \"Sombra da Imagem\",\n inputType: \"select\",\n options: [\n { value: \"none\", label: \"Nenhuma\" },\n { value: \"sm\", label: \"Pequena\" },\n { value: \"md\", label: \"Média\" },\n { value: \"lg\", label: \"Grande\" },\n { value: \"xl\", label: \"Extra Grande\" },\n ],\n group: \"Aparência\",\n },\n\n // =========================================================================\n // GRUPO: Animações\n // =========================================================================\n enterAnimation: {\n label: \"Animação de Entrada\",\n inputType: \"select\",\n options: [\n { value: \"fade-scale\", label: \"Fade + Zoom\" },\n { value: \"stagger\", label: \"Cascata\" },\n { value: \"slide-up\", label: \"Desliza de Baixo\" },\n { value: \"none\", label: \"Sem animação\" },\n ],\n group: \"Animações\",\n },\n hoverEffect: {\n label: \"Efeito de Hover\",\n inputType: \"select\",\n options: [\n { value: \"zoom-overlay\", label: \"Zoom + Overlay\" },\n { value: \"glow\", label: \"Brilho\" },\n { value: \"scale\", label: \"Aumentar\" },\n { value: \"caption-reveal\", label: \"Revelar Legenda\" },\n { value: \"none\", label: \"Sem efeito\" },\n ],\n group: \"Animações\",\n },\n hoverIntensity: {\n label: \"Intensidade do Hover\",\n inputType: \"number\",\n min: 0,\n max: 100,\n group: \"Animações\",\n description: \"Intensidade do efeito (0-100%)\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Tema\n // =========================================================================\n \"lightbox.mode\": {\n label: \"Tema do Lightbox\",\n inputType: \"select\",\n options: [\n { value: \"adaptive\", label: \"Adaptável (Auto)\" },\n { value: \"dark\", label: \"Escuro\" },\n { value: \"light\", label: \"Claro\" },\n { value: \"theme\", label: \"Seguir Tema do Site\" },\n ],\n group: \"Lightbox - Tema\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Navegação\n // =========================================================================\n \"lightbox.showArrows\": {\n label: \"Mostrar Setas\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n \"lightbox.showThumbnails\": {\n label: \"Mostrar Miniaturas\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n \"lightbox.showCounter\": {\n label: \"Mostrar Contador\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n description: 'Exibe \"3 de 12\"',\n },\n \"lightbox.showCaption\": {\n label: \"Mostrar Legenda\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Funcionalidades\n // =========================================================================\n \"lightbox.enableZoom\": {\n label: \"Ativar Zoom\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.enableDownload\": {\n label: \"Ativar Download\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Permitir download de imagens (v1.1)\",\n },\n \"lightbox.enableAutoplay\": {\n label: \"Ativar Autoplay\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Reprodução automática (v1.3)\",\n },\n \"lightbox.autoplayInterval\": {\n label: \"Intervalo do Autoplay\",\n inputType: \"number\",\n min: 2,\n max: 10,\n group: \"Lightbox - Funcionalidades\",\n description: \"Intervalo em segundos\",\n },\n \"lightbox.closeOnBackdropClick\": {\n label: \"Fechar ao Clicar Fora\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.closeOnEsc\": {\n label: \"Fechar com ESC\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.enableKeyboard\": {\n label: \"Navegação por Teclado\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Arrows, +, -, 0\",\n },\n \"lightbox.enableTouchGestures\": {\n label: \"Gestos Touch\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Swipe, pinch, double-tap\",\n },\n \"lightbox.transitionDuration\": {\n label: \"Duração da Transição\",\n inputType: \"number\",\n min: 100,\n max: 1000,\n step: 50,\n group: \"Lightbox - Funcionalidades\",\n description: \"Velocidade da animação (ms)\",\n },\n\n // =========================================================================\n // GRUPO: Performance\n // =========================================================================\n lazyLoad: {\n label: \"Lazy Loading\",\n inputType: \"checkbox\",\n group: \"Performance\",\n description: \"Carregar imagens sob demanda\",\n },\n showWarningAt: {\n label: \"Aviso de Performance\",\n inputType: \"number\",\n min: 20,\n max: 100,\n group: \"Performance\",\n description: \"Mostrar alerta após N imagens\",\n },\n },\n};\n\n// Register the block\ncomponentRegistry.register(imageGalleryBlock);\n\nexport default imageGalleryBlock;\n"],"names":["IMAGE_GALLERY_DEFAULT_PROPS","imageGalleryBlock","galleryVariations","componentRegistry"],"mappings":"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"}
|