@brunoalz/smartgesti-site-editor 1.13.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editor/BlockPalette.d.ts.map +1 -1
- package/dist/editor/BlockPalette.js +44 -36
- package/dist/editor/BlockPalette.js.map +1 -1
- package/dist/editor/BlockSelector.d.ts +1 -0
- package/dist/editor/BlockSelector.d.ts.map +1 -1
- package/dist/editor/BlockSelector.js +100 -131
- package/dist/editor/BlockSelector.js.map +1 -1
- package/dist/editor/LandingPageEditor.d.ts.map +1 -1
- package/dist/editor/LandingPageEditor.js +67 -65
- package/dist/editor/LandingPageEditor.js.map +1 -1
- package/dist/editor/components/LeftPanel.d.ts +1 -0
- package/dist/editor/components/LeftPanel.d.ts.map +1 -1
- package/dist/editor/components/LeftPanel.js +30 -28
- package/dist/editor/components/LeftPanel.js.map +1 -1
- package/dist/editor/dnd/DndEditorContext.d.ts +10 -0
- package/dist/editor/dnd/DndEditorContext.d.ts.map +1 -0
- package/dist/editor/dnd/DndEditorContext.js +120 -0
- package/dist/editor/dnd/DndEditorContext.js.map +1 -0
- package/dist/editor/dnd/DraggablePaletteItem.d.ts +10 -0
- package/dist/editor/dnd/DraggablePaletteItem.d.ts.map +1 -0
- package/dist/editor/dnd/DraggablePaletteItem.js +33 -0
- package/dist/editor/dnd/DraggablePaletteItem.js.map +1 -0
- package/dist/editor/dnd/DropIndicator.d.ts +6 -0
- package/dist/editor/dnd/DropIndicator.d.ts.map +1 -0
- package/dist/editor/dnd/DropIndicator.js +12 -0
- package/dist/editor/dnd/DropIndicator.js.map +1 -0
- package/dist/editor/dnd/SortableBlockItem.d.ts +11 -0
- package/dist/editor/dnd/SortableBlockItem.d.ts.map +1 -0
- package/dist/editor/dnd/SortableBlockItem.js +58 -0
- package/dist/editor/dnd/SortableBlockItem.js.map +1 -0
- package/dist/editor/dnd/index.d.ts +7 -0
- package/dist/editor/dnd/index.d.ts.map +1 -0
- package/dist/editor/dnd/types.d.ts +17 -0
- package/dist/editor/dnd/types.d.ts.map +1 -0
- package/dist/editor/dnd/types.js +5 -0
- package/dist/editor/dnd/types.js.map +1 -0
- package/dist/hooks/useEditorState.d.ts +1 -0
- package/dist/hooks/useEditorState.d.ts.map +1 -1
- package/dist/hooks/useEditorState.js +125 -102
- package/dist/hooks/useEditorState.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockPalette.d.ts","sourceRoot":"","sources":["../../src/editor/BlockPalette.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"BlockPalette.d.ts","sourceRoot":"","sources":["../../src/editor/BlockPalette.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;AA0BvD,UAAU,iBAAiB;IACzB,UAAU,EAAE,CACV,SAAS,EAAE,SAAS,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,KACd,IAAI,CAAC;IACV,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,EAAE,iBAAiB,2CA0JnB"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { jsxs as l, jsx as
|
|
1
|
+
import { jsxs as l, jsx as o } from "react/jsx-runtime";
|
|
2
2
|
import { useState as w, useMemo as i } from "react";
|
|
3
3
|
import { cn as d } from "../utils/cn.js";
|
|
4
4
|
import { getBlockIcon as B } from "../utils/blockIcons.js";
|
|
5
5
|
import { Search as C } from "lucide-react";
|
|
6
|
-
import {
|
|
6
|
+
import { DraggablePaletteItem as E } from "./dnd/DraggablePaletteItem.js";
|
|
7
|
+
import { componentRegistry as O } from "../engine/registry/registry.js";
|
|
7
8
|
const y = [
|
|
8
9
|
"Banner e Navegação",
|
|
9
10
|
"Marketing",
|
|
@@ -17,43 +18,43 @@ const y = [
|
|
|
17
18
|
"Texto e Mídia",
|
|
18
19
|
"Estrutura",
|
|
19
20
|
"Formulários"
|
|
20
|
-
],
|
|
21
|
-
function
|
|
22
|
-
onAddBlock:
|
|
23
|
-
selectedParentBlockId:
|
|
21
|
+
], A = /* @__PURE__ */ new Set(["navbar", "footer"]);
|
|
22
|
+
function M({
|
|
23
|
+
onAddBlock: b,
|
|
24
|
+
selectedParentBlockId: p,
|
|
24
25
|
activePlugins: u,
|
|
25
26
|
existingBlockTypes: x
|
|
26
27
|
}) {
|
|
27
|
-
const [n, h] = w(""), g = i(() =>
|
|
28
|
+
const [n, h] = w(""), g = i(() => O.getAll().filter((e) => !(e.isChildBlock || e.pluginId && !u?.includes(e.pluginId))), [u]), c = i(() => {
|
|
28
29
|
const e = n.toLowerCase().trim(), t = {};
|
|
29
30
|
for (const r of g) {
|
|
30
31
|
if (e) {
|
|
31
32
|
const a = r.name.toLowerCase().includes(e), v = r.description.toLowerCase().includes(e), N = r.type.toLowerCase().includes(e);
|
|
32
33
|
if (!a && !v && !N) continue;
|
|
33
34
|
}
|
|
34
|
-
const
|
|
35
|
-
t[
|
|
35
|
+
const s = r.userCategory || "Outros";
|
|
36
|
+
t[s] || (t[s] = []), t[s].push(r);
|
|
36
37
|
}
|
|
37
38
|
return t;
|
|
38
39
|
}, [g, n]), f = i(() => Object.keys(c).sort((t, r) => {
|
|
39
|
-
const
|
|
40
|
-
return
|
|
40
|
+
const s = y.indexOf(t), a = y.indexOf(r);
|
|
41
|
+
return s === -1 && a === -1 ? t.localeCompare(r) : s === -1 ? 1 : a === -1 ? -1 : s - a;
|
|
41
42
|
}), [c]), k = (e) => {
|
|
42
|
-
|
|
43
|
+
b(e, p || void 0);
|
|
43
44
|
}, m = Object.values(c).reduce(
|
|
44
45
|
(e, t) => e + t.length,
|
|
45
46
|
0
|
|
46
47
|
);
|
|
47
48
|
return /* @__PURE__ */ l("div", { className: "h-full flex flex-col overflow-hidden", children: [
|
|
48
49
|
/* @__PURE__ */ l("div", { className: "flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900", children: [
|
|
49
|
-
/* @__PURE__ */
|
|
50
|
+
/* @__PURE__ */ o("h2", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100", children: "Adicionar Bloco" }),
|
|
50
51
|
/* @__PURE__ */ l("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: [
|
|
51
52
|
m,
|
|
52
53
|
" blocos disponíveis"
|
|
53
54
|
] }),
|
|
54
55
|
/* @__PURE__ */ l("div", { className: "relative mt-2", children: [
|
|
55
|
-
/* @__PURE__ */
|
|
56
|
-
/* @__PURE__ */
|
|
56
|
+
/* @__PURE__ */ o(C, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400" }),
|
|
57
|
+
/* @__PURE__ */ o(
|
|
57
58
|
"input",
|
|
58
59
|
{
|
|
59
60
|
type: "text",
|
|
@@ -74,38 +75,45 @@ function q({
|
|
|
74
75
|
f.map((e) => {
|
|
75
76
|
const t = c[e];
|
|
76
77
|
return !t || t.length === 0 ? null : /* @__PURE__ */ l("div", { children: [
|
|
77
|
-
/* @__PURE__ */
|
|
78
|
-
/* @__PURE__ */
|
|
79
|
-
const a =
|
|
80
|
-
return /* @__PURE__ */
|
|
81
|
-
|
|
78
|
+
/* @__PURE__ */ o("h3", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide mb-2", children: e }),
|
|
79
|
+
/* @__PURE__ */ o("div", { className: "grid grid-cols-2 gap-2", children: t.map((r) => {
|
|
80
|
+
const a = A.has(r.type) && x?.includes(r.type);
|
|
81
|
+
return /* @__PURE__ */ o(
|
|
82
|
+
E,
|
|
82
83
|
{
|
|
83
|
-
|
|
84
|
+
blockType: r.type,
|
|
84
85
|
disabled: !!a,
|
|
85
|
-
|
|
86
|
-
"
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
86
|
+
children: /* @__PURE__ */ l(
|
|
87
|
+
"button",
|
|
88
|
+
{
|
|
89
|
+
onClick: () => !a && k(r.type),
|
|
90
|
+
disabled: !!a,
|
|
91
|
+
className: d(
|
|
92
|
+
"flex flex-col items-center gap-2 p-3 rounded-lg border-2 transition-all w-full",
|
|
93
|
+
a ? "opacity-40 cursor-not-allowed bg-gray-100 dark:bg-gray-800 border-gray-200 dark:border-gray-700" : d(
|
|
94
|
+
"bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700",
|
|
95
|
+
"hover:border-blue-500 dark:hover:border-blue-500 hover:bg-blue-50 dark:hover:bg-blue-950/20",
|
|
96
|
+
"hover:scale-[1.02] active:scale-[0.98]"
|
|
97
|
+
)
|
|
98
|
+
),
|
|
99
|
+
title: a ? `${r.name} já existe na página` : r.description,
|
|
100
|
+
children: [
|
|
101
|
+
/* @__PURE__ */ o("div", { className: "text-2xl", children: B(r.type) }),
|
|
102
|
+
/* @__PURE__ */ o("div", { className: "text-xs font-medium text-gray-700 dark:text-gray-300 text-center", children: r.name })
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
)
|
|
98
106
|
},
|
|
99
107
|
r.type
|
|
100
108
|
);
|
|
101
109
|
}) })
|
|
102
110
|
] }, e);
|
|
103
111
|
}),
|
|
104
|
-
m === 0 && /* @__PURE__ */
|
|
112
|
+
m === 0 && /* @__PURE__ */ o("div", { className: "text-center text-gray-500 dark:text-gray-400 text-xs py-8", children: n ? "Nenhum bloco encontrado" : "Nenhum bloco disponível" })
|
|
105
113
|
] })
|
|
106
114
|
] });
|
|
107
115
|
}
|
|
108
116
|
export {
|
|
109
|
-
|
|
117
|
+
M as BlockPalette
|
|
110
118
|
};
|
|
111
119
|
//# sourceMappingURL=BlockPalette.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockPalette.js","sources":["../../src/editor/BlockPalette.tsx"],"sourcesContent":["/**\n * Block Palette\n * Paleta de blocos disponíveis para adicionar, agrupados por userCategory\n */\n\nimport { useMemo, useState } from \"react\";\nimport { BlockType, BlockDefinition } from \"../engine\";\nimport { componentRegistry } from \"../engine\";\nimport { cn } from \"../utils/cn\";\nimport { getBlockIcon } from \"../utils/blockIcons\";\nimport { Search } from \"lucide-react\";\n\n/** Ordem fixa das categorias na paleta */\nconst CATEGORY_ORDER = [\n \"Banner e Navegação\",\n \"Marketing\",\n \"Prova Social\",\n \"Galeria e Mídia\",\n \"Equipe\",\n \"Institucional\",\n \"Blog e Notícias\",\n \"Blog (Plugin)\",\n \"Educação\",\n \"Texto e Mídia\",\n \"Estrutura\",\n \"Formulários\",\n];\n\n/** Blocos que só podem existir uma vez por página */\nconst UNIQUE_BLOCK_TYPES = new Set<string>([\"navbar\", \"footer\"]);\n\ninterface BlockPaletteProps {\n onAddBlock: (\n blockType: BlockType,\n parentBlockId?: string,\n position?: number,\n ) => void;\n selectedParentBlockId?: string | null;\n activePlugins?: string[];\n existingBlockTypes?: string[];\n}\n\nexport function BlockPalette({\n onAddBlock,\n selectedParentBlockId,\n activePlugins,\n existingBlockTypes,\n}: BlockPaletteProps) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n // Filtrar blocos disponíveis\n const availableBlocks = useMemo(() => {\n return componentRegistry.getAll().filter((def) => {\n if (def.isChildBlock) return false;\n if (def.pluginId && !activePlugins?.includes(def.pluginId)) return false;\n return true;\n });\n }, [activePlugins]);\n\n // Agrupar por userCategory e filtrar por busca\n const blocksByUserCategory = useMemo(() => {\n const query = searchQuery.toLowerCase().trim();\n const groups: Record<string, BlockDefinition[]> = {};\n\n for (const def of availableBlocks) {\n // Filtrar por busca\n if (query) {\n const matchesName = def.name.toLowerCase().includes(query);\n const matchesDesc = def.description.toLowerCase().includes(query);\n const matchesType = def.type.toLowerCase().includes(query);\n if (!matchesName && !matchesDesc && !matchesType) continue;\n }\n\n const cat = def.userCategory || \"Outros\";\n if (!groups[cat]) groups[cat] = [];\n groups[cat].push(def);\n }\n\n return groups;\n }, [availableBlocks, searchQuery]);\n\n // Categorias ordenadas\n const sortedCategories = useMemo(() => {\n const cats = Object.keys(blocksByUserCategory);\n return cats.sort((a, b) => {\n const idxA = CATEGORY_ORDER.indexOf(a);\n const idxB = CATEGORY_ORDER.indexOf(b);\n if (idxA === -1 && idxB === -1) return a.localeCompare(b);\n if (idxA === -1) return 1;\n if (idxB === -1) return -1;\n return idxA - idxB;\n });\n }, [blocksByUserCategory]);\n\n const handleAddBlock = (blockType: BlockType) => {\n onAddBlock(blockType, selectedParentBlockId || undefined);\n };\n\n const totalAvailable = Object.values(blocksByUserCategory).reduce(\n (sum, arr) => sum + arr.length,\n 0,\n );\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100\">\n Adicionar Bloco\n </h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalAvailable} blocos disponíveis\n </p>\n\n {/* Campo de busca */}\n <div className=\"relative mt-2\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400\" />\n <input\n type=\"text\"\n placeholder=\"Buscar blocos...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n \"w-full pl-8 pr-3 py-1.5 text-xs rounded-lg border transition-colors\",\n \"bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700\",\n \"focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\",\n \"text-gray-700 dark:text-gray-300 placeholder-gray-400\",\n )}\n />\n </div>\n </div>\n\n {/* Lista de blocos por userCategory */}\n <div className=\"flex-1 overflow-y-auto p-3 space-y-4\">\n {sortedCategories.map((category) => {\n const blocks = blocksByUserCategory[category];\n if (!blocks || blocks.length === 0) return null;\n\n return (\n <div key={category}>\n <h3 className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide mb-2\">\n {category}\n </h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {blocks.map((def) => {\n const isUnique = UNIQUE_BLOCK_TYPES.has(def.type);\n const alreadyExists =\n isUnique && existingBlockTypes?.includes(def.type);\n\n return (\n <button\n key={def.type}\n onClick={() => !alreadyExists && handleAddBlock(def.type)}\n disabled={!!alreadyExists}\n className={cn(\n \"flex flex-col items-center gap-2 p-3 rounded-lg border-2 transition-all\",\n alreadyExists\n ? \"opacity-40 cursor-not-allowed bg-gray-100 dark:bg-gray-800 border-gray-200 dark:border-gray-700\"\n : cn(\n \"bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700 cursor-pointer\",\n \"hover:border-blue-500 dark:hover:border-blue-500 hover:bg-blue-50 dark:hover:bg-blue-950/20\",\n \"hover:scale-[1.02] active:scale-[0.98]\",\n ),\n )}\n title={\n alreadyExists\n ? `${def.name} já existe na página`\n : def.description\n }\n >\n <div className=\"text-2xl\">{getBlockIcon(def.type)}</div>\n <div className=\"text-xs font-medium text-gray-700 dark:text-gray-300 text-center\">\n {def.name}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n {totalAvailable === 0 && (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n {searchQuery\n ? \"Nenhum bloco encontrado\"\n : \"Nenhum bloco disponível\"}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["CATEGORY_ORDER","UNIQUE_BLOCK_TYPES","BlockPalette","onAddBlock","selectedParentBlockId","activePlugins","existingBlockTypes","searchQuery","setSearchQuery","useState","availableBlocks","useMemo","componentRegistry","def","blocksByUserCategory","query","groups","matchesName","matchesDesc","matchesType","cat","sortedCategories","a","b","idxA","idxB","handleAddBlock","blockType","totalAvailable","sum","arr","jsxs","jsx","Search","cn","category","blocks","alreadyExists","getBlockIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BlockPalette.js","sources":["../../src/editor/BlockPalette.tsx"],"sourcesContent":["/**\n * Block Palette\n * Paleta de blocos disponíveis para adicionar, agrupados por userCategory\n */\n\nimport { useMemo, useState } from \"react\";\nimport { BlockType, BlockDefinition } from \"../engine\";\nimport { componentRegistry } from \"../engine\";\nimport { cn } from \"../utils/cn\";\nimport { getBlockIcon } from \"../utils/blockIcons\";\nimport { Search } from \"lucide-react\";\nimport { DraggablePaletteItem } from \"./dnd\";\n\n/** Ordem fixa das categorias na paleta */\nconst CATEGORY_ORDER = [\n \"Banner e Navegação\",\n \"Marketing\",\n \"Prova Social\",\n \"Galeria e Mídia\",\n \"Equipe\",\n \"Institucional\",\n \"Blog e Notícias\",\n \"Blog (Plugin)\",\n \"Educação\",\n \"Texto e Mídia\",\n \"Estrutura\",\n \"Formulários\",\n];\n\n/** Blocos que só podem existir uma vez por página */\nconst UNIQUE_BLOCK_TYPES = new Set<string>([\"navbar\", \"footer\"]);\n\ninterface BlockPaletteProps {\n onAddBlock: (\n blockType: BlockType,\n parentBlockId?: string,\n position?: number,\n ) => void;\n selectedParentBlockId?: string | null;\n activePlugins?: string[];\n existingBlockTypes?: string[];\n}\n\nexport function BlockPalette({\n onAddBlock,\n selectedParentBlockId,\n activePlugins,\n existingBlockTypes,\n}: BlockPaletteProps) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n // Filtrar blocos disponíveis\n const availableBlocks = useMemo(() => {\n return componentRegistry.getAll().filter((def) => {\n if (def.isChildBlock) return false;\n if (def.pluginId && !activePlugins?.includes(def.pluginId)) return false;\n return true;\n });\n }, [activePlugins]);\n\n // Agrupar por userCategory e filtrar por busca\n const blocksByUserCategory = useMemo(() => {\n const query = searchQuery.toLowerCase().trim();\n const groups: Record<string, BlockDefinition[]> = {};\n\n for (const def of availableBlocks) {\n // Filtrar por busca\n if (query) {\n const matchesName = def.name.toLowerCase().includes(query);\n const matchesDesc = def.description.toLowerCase().includes(query);\n const matchesType = def.type.toLowerCase().includes(query);\n if (!matchesName && !matchesDesc && !matchesType) continue;\n }\n\n const cat = def.userCategory || \"Outros\";\n if (!groups[cat]) groups[cat] = [];\n groups[cat].push(def);\n }\n\n return groups;\n }, [availableBlocks, searchQuery]);\n\n // Categorias ordenadas\n const sortedCategories = useMemo(() => {\n const cats = Object.keys(blocksByUserCategory);\n return cats.sort((a, b) => {\n const idxA = CATEGORY_ORDER.indexOf(a);\n const idxB = CATEGORY_ORDER.indexOf(b);\n if (idxA === -1 && idxB === -1) return a.localeCompare(b);\n if (idxA === -1) return 1;\n if (idxB === -1) return -1;\n return idxA - idxB;\n });\n }, [blocksByUserCategory]);\n\n const handleAddBlock = (blockType: BlockType) => {\n onAddBlock(blockType, selectedParentBlockId || undefined);\n };\n\n const totalAvailable = Object.values(blocksByUserCategory).reduce(\n (sum, arr) => sum + arr.length,\n 0,\n );\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100\">\n Adicionar Bloco\n </h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalAvailable} blocos disponíveis\n </p>\n\n {/* Campo de busca */}\n <div className=\"relative mt-2\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400\" />\n <input\n type=\"text\"\n placeholder=\"Buscar blocos...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n \"w-full pl-8 pr-3 py-1.5 text-xs rounded-lg border transition-colors\",\n \"bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700\",\n \"focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\",\n \"text-gray-700 dark:text-gray-300 placeholder-gray-400\",\n )}\n />\n </div>\n </div>\n\n {/* Lista de blocos por userCategory */}\n <div className=\"flex-1 overflow-y-auto p-3 space-y-4\">\n {sortedCategories.map((category) => {\n const blocks = blocksByUserCategory[category];\n if (!blocks || blocks.length === 0) return null;\n\n return (\n <div key={category}>\n <h3 className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide mb-2\">\n {category}\n </h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {blocks.map((def) => {\n const isUnique = UNIQUE_BLOCK_TYPES.has(def.type);\n const alreadyExists =\n isUnique && existingBlockTypes?.includes(def.type);\n\n return (\n <DraggablePaletteItem\n key={def.type}\n blockType={def.type}\n disabled={!!alreadyExists}\n >\n <button\n onClick={() =>\n !alreadyExists && handleAddBlock(def.type)\n }\n disabled={!!alreadyExists}\n className={cn(\n \"flex flex-col items-center gap-2 p-3 rounded-lg border-2 transition-all w-full\",\n alreadyExists\n ? \"opacity-40 cursor-not-allowed bg-gray-100 dark:bg-gray-800 border-gray-200 dark:border-gray-700\"\n : cn(\n \"bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700\",\n \"hover:border-blue-500 dark:hover:border-blue-500 hover:bg-blue-50 dark:hover:bg-blue-950/20\",\n \"hover:scale-[1.02] active:scale-[0.98]\",\n ),\n )}\n title={\n alreadyExists\n ? `${def.name} já existe na página`\n : def.description\n }\n >\n <div className=\"text-2xl\">\n {getBlockIcon(def.type)}\n </div>\n <div className=\"text-xs font-medium text-gray-700 dark:text-gray-300 text-center\">\n {def.name}\n </div>\n </button>\n </DraggablePaletteItem>\n );\n })}\n </div>\n </div>\n );\n })}\n\n {totalAvailable === 0 && (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n {searchQuery\n ? \"Nenhum bloco encontrado\"\n : \"Nenhum bloco disponível\"}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["CATEGORY_ORDER","UNIQUE_BLOCK_TYPES","BlockPalette","onAddBlock","selectedParentBlockId","activePlugins","existingBlockTypes","searchQuery","setSearchQuery","useState","availableBlocks","useMemo","componentRegistry","def","blocksByUserCategory","query","groups","matchesName","matchesDesc","matchesType","cat","sortedCategories","a","b","idxA","idxB","handleAddBlock","blockType","totalAvailable","sum","arr","jsxs","jsx","Search","cn","category","blocks","alreadyExists","DraggablePaletteItem","getBlockIcon"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ interface BlockSelectorProps {
|
|
|
5
5
|
selectedBlockId: string | null;
|
|
6
6
|
onSelectBlock: (blockId: string) => void;
|
|
7
7
|
onDeleteBlock: (blockId: string) => void;
|
|
8
|
+
overIndex?: number | null;
|
|
8
9
|
}
|
|
9
10
|
export declare const BlockSelector: React.NamedExoticComponent<BlockSelectorProps>;
|
|
10
11
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockSelector.d.ts","sourceRoot":"","sources":["../../src/editor/BlockSelector.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAkB,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"BlockSelector.d.ts","sourceRoot":"","sources":["../../src/editor/BlockSelector.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAkB,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAQjC,UAAU,kBAAkB;IAC1B,SAAS,EAAE,KAAK,EAAE,CAAA;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAiKD,eAAO,MAAM,aAAa,gDAgGxB,CAAC"}
|
|
@@ -1,186 +1,144 @@
|
|
|
1
|
-
import { jsxs as s, jsx as
|
|
2
|
-
import
|
|
3
|
-
import { Trash2 as
|
|
4
|
-
import { cn as
|
|
5
|
-
import {
|
|
6
|
-
import "
|
|
7
|
-
import "
|
|
8
|
-
import "../engine/registry/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import "../engine/registry/blocks/content/heading.js";
|
|
12
|
-
import "../engine/registry/blocks/content/text.js";
|
|
13
|
-
import "../engine/registry/blocks/content/image.js";
|
|
14
|
-
import "../engine/registry/blocks/content/button.js";
|
|
15
|
-
import "../engine/registry/blocks/content/link.js";
|
|
16
|
-
import "../engine/registry/blocks/content/divider.js";
|
|
17
|
-
import "../engine/registry/blocks/content/badge.js";
|
|
18
|
-
import "../engine/registry/blocks/content/icon.js";
|
|
19
|
-
import "../engine/registry/blocks/content/avatar.js";
|
|
20
|
-
import "../engine/registry/blocks/content/video.js";
|
|
21
|
-
import "../engine/registry/blocks/content/socialLinks.js";
|
|
22
|
-
import "../engine/registry/blocks/composition/card.js";
|
|
23
|
-
import "../engine/registry/blocks/composition/section.js";
|
|
24
|
-
import "../engine/registry/blocks/sections/hero.js";
|
|
25
|
-
import "../engine/registry/blocks/sections/navbar.js";
|
|
26
|
-
import "../engine/registry/blocks/sections/footer.js";
|
|
27
|
-
import "../engine/registry/blocks/sections/feature.js";
|
|
28
|
-
import "../engine/registry/blocks/sections/featureGrid.js";
|
|
29
|
-
import "../engine/registry/blocks/sections/pricing.js";
|
|
30
|
-
import "../engine/registry/blocks/sections/pricingCard.js";
|
|
31
|
-
import "../engine/registry/blocks/sections/testimonial.js";
|
|
32
|
-
import "../engine/registry/blocks/sections/testimonialGrid.js";
|
|
33
|
-
import "../engine/registry/blocks/sections/faq.js";
|
|
34
|
-
import "../engine/registry/blocks/sections/faqItem.js";
|
|
35
|
-
import "../engine/registry/blocks/sections/cta.js";
|
|
36
|
-
import "../engine/registry/blocks/sections/stats.js";
|
|
37
|
-
import "../engine/registry/blocks/sections/statItem.js";
|
|
38
|
-
import "../engine/registry/blocks/sections/logoCloud.js";
|
|
39
|
-
import "../engine/registry/blocks/sections/countdown.js";
|
|
40
|
-
import "../engine/registry/blocks/sections/carousel.js";
|
|
41
|
-
import "../engine/registry/blocks/sections/blogCard.js";
|
|
42
|
-
import "../engine/registry/blocks/sections/blogCardGrid.js";
|
|
43
|
-
import "../engine/registry/blocks/sections/teamCard.js";
|
|
44
|
-
import "../engine/registry/blocks/sections/teamGrid.js";
|
|
45
|
-
import "../engine/registry/blocks/sections/courseCardGrid.js";
|
|
46
|
-
import "../engine/registry/blocks/sections/categoryCardGrid.js";
|
|
47
|
-
import "../engine/registry/blocks/sections/blogPostCard.js";
|
|
48
|
-
import "../engine/registry/blocks/sections/blogPostGrid.js";
|
|
49
|
-
import "../engine/registry/blocks/sections/blogPostDetail.js";
|
|
50
|
-
import "../engine/registry/blocks/sections/blogCategoryFilter.js";
|
|
51
|
-
import "../engine/registry/blocks/sections/blogSearchBar.js";
|
|
52
|
-
import "../engine/registry/blocks/sections/productShowcase.js";
|
|
53
|
-
import "../engine/registry/blocks/sections/aboutSection.js";
|
|
54
|
-
import "../engine/registry/blocks/sections/contactSection.js";
|
|
55
|
-
import "../engine/registry/blocks/sections/blogRecentPosts.js";
|
|
56
|
-
import "../engine/registry/blocks/sections/blogTagCloud.js";
|
|
57
|
-
import "../engine/registry/blocks/sections/imageGallery.js";
|
|
58
|
-
import "../engine/registry/blocks/forms/form.js";
|
|
59
|
-
import "../engine/registry/blocks/forms/input.js";
|
|
60
|
-
import "../engine/registry/blocks/forms/textarea.js";
|
|
61
|
-
import "../engine/registry/blocks/forms/select.js";
|
|
62
|
-
function x(t) {
|
|
63
|
-
return v.get(t)?.name || t;
|
|
1
|
+
import { jsxs as s, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import j, { useMemo as N } from "react";
|
|
3
|
+
import { Trash2 as C, ChevronRight as k } from "lucide-react";
|
|
4
|
+
import { cn as u } from "../utils/cn.js";
|
|
5
|
+
import { SortableContext as B, verticalListSortingStrategy as I } from "@dnd-kit/sortable";
|
|
6
|
+
import { useDroppable as T } from "@dnd-kit/core";
|
|
7
|
+
import { SortableBlockItem as R } from "./dnd/SortableBlockItem.js";
|
|
8
|
+
import { componentRegistry as w } from "../engine/registry/registry.js";
|
|
9
|
+
function f(e) {
|
|
10
|
+
return w.get(e)?.name || e;
|
|
64
11
|
}
|
|
65
|
-
function
|
|
66
|
-
const
|
|
67
|
-
switch (
|
|
12
|
+
function $(e) {
|
|
13
|
+
const t = e.props;
|
|
14
|
+
switch (e.type) {
|
|
68
15
|
case "heading":
|
|
69
|
-
return
|
|
16
|
+
return t.text || "Heading";
|
|
70
17
|
case "text":
|
|
71
|
-
return
|
|
18
|
+
return t.text ? String(t.text).substring(0, 30) + (String(t.text).length > 30 ? "..." : "") : "Text";
|
|
72
19
|
case "button":
|
|
73
|
-
return
|
|
20
|
+
return t.text || "Button";
|
|
74
21
|
case "link":
|
|
75
|
-
return
|
|
22
|
+
return t.text || "Link";
|
|
76
23
|
case "image":
|
|
77
|
-
return
|
|
24
|
+
return t.alt || t.src, "Image";
|
|
78
25
|
case "container":
|
|
79
26
|
case "stack":
|
|
80
27
|
case "grid":
|
|
81
28
|
case "box":
|
|
82
|
-
return `${
|
|
29
|
+
return `${f(e.type)} (${Array.isArray(t.children) ? t.children.length : 0} children)`;
|
|
83
30
|
case "section":
|
|
84
|
-
return
|
|
31
|
+
return t.id ? `Section: ${t.id}` : "Section";
|
|
85
32
|
case "card":
|
|
86
33
|
return "Card";
|
|
87
34
|
case "divider":
|
|
88
35
|
return "Divider";
|
|
89
36
|
default:
|
|
90
|
-
return
|
|
37
|
+
return f(e.type);
|
|
91
38
|
}
|
|
92
39
|
}
|
|
93
|
-
function
|
|
94
|
-
if (!
|
|
40
|
+
function S(e, t, d, g, p) {
|
|
41
|
+
if (!e || typeof e != "object" || !e.id || !e.type)
|
|
95
42
|
return null;
|
|
96
|
-
const
|
|
43
|
+
const c = e.id === d, r = e.props, x = r && typeof r == "object" && r.children && Array.isArray(r.children) && r.children.length > 0;
|
|
97
44
|
return /* @__PURE__ */ s("div", { children: [
|
|
98
45
|
/* @__PURE__ */ s(
|
|
99
46
|
"div",
|
|
100
47
|
{
|
|
101
|
-
className:
|
|
48
|
+
className: u(
|
|
102
49
|
"flex items-center gap-2 p-2 rounded-lg transition-all cursor-pointer group",
|
|
103
50
|
"hover:scale-[1.01] active:scale-[0.99]",
|
|
104
|
-
|
|
105
|
-
|
|
51
|
+
c ? "bg-blue-500 text-white shadow-md shadow-blue-500/20" : "bg-gray-100/50 dark:bg-gray-800/50 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300",
|
|
52
|
+
t > 0 && "ml-4"
|
|
106
53
|
),
|
|
107
|
-
style: { paddingLeft: `${
|
|
108
|
-
onClick: () =>
|
|
54
|
+
style: { paddingLeft: `${t * 12 + 8}px` },
|
|
55
|
+
onClick: () => g(e.id),
|
|
109
56
|
children: [
|
|
110
|
-
|
|
111
|
-
/* @__PURE__ */
|
|
57
|
+
t > 0 && /* @__PURE__ */ i("div", { className: "flex-shrink-0 w-4 flex items-center justify-center", children: /* @__PURE__ */ i(k, { className: "w-3 h-3 opacity-50" }) }),
|
|
58
|
+
/* @__PURE__ */ i(
|
|
112
59
|
"div",
|
|
113
60
|
{
|
|
114
|
-
className:
|
|
61
|
+
className: u(
|
|
115
62
|
"flex-shrink-0 w-6 h-6 rounded text-xs font-semibold flex items-center justify-center",
|
|
116
|
-
|
|
63
|
+
c ? "bg-white/20 text-white" : w.get(e.type)?.pluginId ? "bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400" : "bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400"
|
|
117
64
|
),
|
|
118
|
-
title:
|
|
119
|
-
children:
|
|
65
|
+
title: f(e.type),
|
|
66
|
+
children: w.get(e.type)?.pluginId ? "🧩" : e.type.substring(0, 2).toUpperCase()
|
|
120
67
|
}
|
|
121
68
|
),
|
|
122
69
|
/* @__PURE__ */ s("div", { className: "flex-1 min-w-0", children: [
|
|
123
|
-
/* @__PURE__ */
|
|
124
|
-
/* @__PURE__ */
|
|
70
|
+
/* @__PURE__ */ i("div", { className: "text-xs font-medium truncate", children: f(e.type) }),
|
|
71
|
+
/* @__PURE__ */ i(
|
|
125
72
|
"div",
|
|
126
73
|
{
|
|
127
|
-
className:
|
|
74
|
+
className: u(
|
|
128
75
|
"text-xs truncate",
|
|
129
|
-
|
|
76
|
+
c ? "text-white/80" : "text-gray-500 dark:text-gray-400"
|
|
130
77
|
),
|
|
131
|
-
children:
|
|
78
|
+
children: $(e)
|
|
132
79
|
}
|
|
133
80
|
)
|
|
134
81
|
] }),
|
|
135
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ i(
|
|
136
83
|
"button",
|
|
137
84
|
{
|
|
138
|
-
onClick: (
|
|
139
|
-
|
|
85
|
+
onClick: (n) => {
|
|
86
|
+
n.stopPropagation(), p(e.id);
|
|
140
87
|
},
|
|
141
|
-
className:
|
|
88
|
+
className: u(
|
|
142
89
|
"p-1.5 rounded-full transition-all opacity-0 group-hover:opacity-100",
|
|
143
90
|
"hover:bg-white/30 dark:hover:bg-gray-700/50",
|
|
144
91
|
"hover:scale-110 active:scale-95",
|
|
145
|
-
|
|
92
|
+
c ? "text-white hover:bg-white/40" : "text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700"
|
|
146
93
|
),
|
|
147
94
|
title: "Deletar bloco",
|
|
148
|
-
children: /* @__PURE__ */
|
|
95
|
+
children: /* @__PURE__ */ i(C, { className: "w-3.5 h-3.5" })
|
|
149
96
|
}
|
|
150
97
|
)
|
|
151
98
|
]
|
|
152
99
|
}
|
|
153
100
|
),
|
|
154
|
-
|
|
155
|
-
(
|
|
101
|
+
x && /* @__PURE__ */ i("div", { className: "mt-1", children: r.children.filter((n) => n && n.id && n.type).map(
|
|
102
|
+
(n) => S(n, t + 1, d, g, p)
|
|
156
103
|
) })
|
|
157
|
-
] },
|
|
104
|
+
] }, e.id);
|
|
158
105
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
106
|
+
function D({ index: e }) {
|
|
107
|
+
const { setNodeRef: t, isOver: d } = T({
|
|
108
|
+
id: "end-drop-zone",
|
|
109
|
+
data: { index: e }
|
|
110
|
+
});
|
|
111
|
+
return /* @__PURE__ */ i("div", { ref: t, className: "h-8 mt-1", children: d && /* @__PURE__ */ i("div", { className: "h-0.5 bg-blue-500 rounded-full mx-2" }) });
|
|
112
|
+
}
|
|
113
|
+
const Z = j.memo(function({
|
|
114
|
+
structure: t,
|
|
115
|
+
selectedBlockId: d,
|
|
116
|
+
onSelectBlock: g,
|
|
117
|
+
onDeleteBlock: p,
|
|
118
|
+
overIndex: c
|
|
164
119
|
}) {
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
120
|
+
const r = N(() => !t || !Array.isArray(t) ? [] : t.filter((a) => a && typeof a == "object" && a.id && a.type), [t]), x = N(
|
|
121
|
+
() => r.map((a) => a.id),
|
|
122
|
+
[r]
|
|
123
|
+
), n = N(() => {
|
|
124
|
+
const a = (o) => {
|
|
125
|
+
if (!o || !Array.isArray(o) || o.length === 0) return 0;
|
|
126
|
+
let v = 0;
|
|
127
|
+
for (let b = 0; b < o.length; b++) {
|
|
128
|
+
const l = o[b];
|
|
129
|
+
if (!(!l || typeof l != "object" || !l.id || !l.type)) {
|
|
130
|
+
v++;
|
|
173
131
|
try {
|
|
174
|
-
if (!
|
|
132
|
+
if (!l.props)
|
|
175
133
|
continue;
|
|
176
|
-
const
|
|
177
|
-
if (
|
|
178
|
-
const
|
|
179
|
-
if (
|
|
180
|
-
const
|
|
181
|
-
(
|
|
134
|
+
const y = l.props;
|
|
135
|
+
if (y && typeof y == "object" && !Array.isArray(y)) {
|
|
136
|
+
const h = y.children;
|
|
137
|
+
if (h && Array.isArray(h) && h.length > 0) {
|
|
138
|
+
const A = h.filter(
|
|
139
|
+
(m) => m && typeof m == "object" && m.id && m.type
|
|
182
140
|
);
|
|
183
|
-
|
|
141
|
+
A.length > 0 && (v += a(A));
|
|
184
142
|
}
|
|
185
143
|
}
|
|
186
144
|
} catch {
|
|
@@ -188,25 +146,36 @@ const Pt = A.memo(function({
|
|
|
188
146
|
}
|
|
189
147
|
}
|
|
190
148
|
}
|
|
191
|
-
return
|
|
149
|
+
return v;
|
|
192
150
|
};
|
|
193
|
-
return
|
|
194
|
-
}, [
|
|
151
|
+
return a(r);
|
|
152
|
+
}, [r]);
|
|
195
153
|
return /* @__PURE__ */ s("div", { className: "h-full flex flex-col overflow-hidden", children: [
|
|
196
154
|
/* @__PURE__ */ s("div", { className: "flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900", children: [
|
|
197
|
-
/* @__PURE__ */
|
|
155
|
+
/* @__PURE__ */ i("h2", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100", children: "Blocos" }),
|
|
198
156
|
/* @__PURE__ */ s("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: [
|
|
199
157
|
n,
|
|
200
158
|
" ",
|
|
201
159
|
n === 1 ? "bloco" : "blocos"
|
|
202
160
|
] })
|
|
203
161
|
] }),
|
|
204
|
-
/* @__PURE__ */
|
|
205
|
-
(
|
|
206
|
-
|
|
162
|
+
/* @__PURE__ */ i("div", { className: "flex-1 overflow-y-auto p-2 space-y-1", children: !r || r.length === 0 ? /* @__PURE__ */ i("div", { className: "text-center text-gray-500 dark:text-gray-400 text-xs py-8", children: "Nenhum bloco adicionado ainda" }) : /* @__PURE__ */ s(B, { items: x, strategy: I, children: [
|
|
163
|
+
r.map((a, o) => /* @__PURE__ */ i(
|
|
164
|
+
R,
|
|
165
|
+
{
|
|
166
|
+
id: a.id,
|
|
167
|
+
blockType: a.type,
|
|
168
|
+
index: o,
|
|
169
|
+
isOver: c === o,
|
|
170
|
+
children: S(a, 0, d, g, p)
|
|
171
|
+
},
|
|
172
|
+
a.id
|
|
173
|
+
)),
|
|
174
|
+
/* @__PURE__ */ i(D, { index: r.length })
|
|
175
|
+
] }) })
|
|
207
176
|
] });
|
|
208
177
|
});
|
|
209
178
|
export {
|
|
210
|
-
|
|
179
|
+
Z as BlockSelector
|
|
211
180
|
};
|
|
212
181
|
//# sourceMappingURL=BlockSelector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockSelector.js","sources":["../../src/editor/BlockSelector.tsx"],"sourcesContent":["/**\n * Block Selector\n * Lista blocos da estrutura de forma hierárquica\n */\n\nimport React, { useMemo } from 'react'\nimport { Block } from '../engine'\nimport { componentRegistry } from '../engine'\nimport { Trash2, ChevronRight } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ninterface BlockSelectorProps {\n structure: Block[]\n selectedBlockId: string | null\n onSelectBlock: (blockId: string) => void\n onDeleteBlock: (blockId: string) => void\n}\n\n/**\n * Obtém nome amigável do tipo de bloco\n */\nfunction getBlockTypeName(type: Block['type']): string {\n const definition = componentRegistry.get(type)\n return definition?.name || type\n}\n\n/**\n * Obtém preview do bloco (texto ou propriedade relevante)\n */\nfunction getBlockPreview(block: Block): string {\n const props = block.props as Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- dynamic access for preview\n\n switch (block.type) {\n case 'heading':\n return props.text || 'Heading'\n case 'text':\n return props.text ? String(props.text).substring(0, 30) + (String(props.text).length > 30 ? '...' : '') : 'Text'\n case 'button':\n return props.text || 'Button'\n case 'link':\n return props.text || 'Link'\n case 'image':\n return props.alt || props.src ? 'Image' : 'Image'\n case 'container':\n case 'stack':\n case 'grid':\n case 'box':\n return `${getBlockTypeName(block.type)} (${Array.isArray(props.children) ? props.children.length : 0} children)`\n case 'section':\n return props.id ? `Section: ${props.id}` : 'Section'\n case 'card':\n return 'Card'\n case 'divider':\n return 'Divider'\n default:\n return getBlockTypeName(block.type)\n }\n}\n\n/**\n * Renderiza um bloco e seus children recursivamente\n */\nfunction renderBlockTree(\n block: Block,\n depth: number,\n selectedBlockId: string | null,\n onSelectBlock: (blockId: string) => void,\n onDeleteBlock: (blockId: string) => void\n): React.ReactNode {\n // Verificar se o bloco é válido\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n return null\n }\n\n const isSelected = block.id === selectedBlockId\n const props = block.props as Record<string, any>\n const hasChildren = props && typeof props === 'object' && props.children && Array.isArray(props.children) && props.children.length > 0\n\n return (\n <div key={block.id}>\n <div\n className={cn(\n 'flex items-center gap-2 p-2 rounded-lg transition-all cursor-pointer group',\n 'hover:scale-[1.01] active:scale-[0.99]',\n isSelected\n ? 'bg-blue-500 text-white shadow-md shadow-blue-500/20'\n : 'bg-gray-100/50 dark:bg-gray-800/50 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\n depth > 0 && 'ml-4'\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSelectBlock(block.id)}\n >\n {/* Indentação visual */}\n {depth > 0 && (\n <div className=\"flex-shrink-0 w-4 flex items-center justify-center\">\n <ChevronRight className=\"w-3 h-3 opacity-50\" />\n </div>\n )}\n\n {/* Badge de tipo */}\n <div\n className={cn(\n 'flex-shrink-0 w-6 h-6 rounded text-xs font-semibold flex items-center justify-center',\n isSelected\n ? 'bg-white/20 text-white'\n : componentRegistry.get(block.type)?.pluginId\n ? 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400'\n : 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400'\n )}\n title={getBlockTypeName(block.type)}\n >\n {componentRegistry.get(block.type)?.pluginId ? '🧩' : block.type.substring(0, 2).toUpperCase()}\n </div>\n\n {/* Nome e preview */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium truncate\">{getBlockTypeName(block.type)}</div>\n <div\n className={cn(\n 'text-xs truncate',\n isSelected ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {getBlockPreview(block)}\n </div>\n </div>\n\n {/* Botão deletar */}\n <button\n onClick={(e) => {\n e.stopPropagation()\n onDeleteBlock(block.id)\n }}\n className={cn(\n 'p-1.5 rounded-full transition-all opacity-0 group-hover:opacity-100',\n 'hover:bg-white/30 dark:hover:bg-gray-700/50',\n 'hover:scale-110 active:scale-95',\n isSelected\n ? 'text-white hover:bg-white/40'\n : 'text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'\n )}\n title=\"Deletar bloco\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Renderizar children recursivamente */}\n {hasChildren && (\n <div className=\"mt-1\">\n {props.children\n .filter((child: Block) => child && child.id && child.type) // Filtrar children inválidos\n .map((child: Block) =>\n renderBlockTree(child, depth + 1, selectedBlockId, onSelectBlock, onDeleteBlock)\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport const BlockSelector = React.memo(function BlockSelector({\n structure,\n selectedBlockId,\n onSelectBlock,\n onDeleteBlock,\n}: BlockSelectorProps) {\n // Filtrar estrutura inválida ANTES de usar\n const validStructure = useMemo(() => {\n if (!structure || !Array.isArray(structure)) return []\n return structure.filter((b) => b && typeof b === 'object' && b.id && b.type)\n }, [structure])\n\n // Contar total de blocos (incluindo children) - usando useMemo para evitar recálculos\n const totalBlocks = useMemo(() => {\n const count = (blocks: Block[]): number => {\n if (!blocks || !Array.isArray(blocks) || blocks.length === 0) return 0\n \n let total = 0\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]\n \n // Verificar se o bloco é válido ANTES de acessar qualquer propriedade\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n continue\n }\n \n total++ // Contar o bloco atual\n \n // Verificar props de forma segura - SEMPRE dentro de try-catch\n try {\n if (!block.props) {\n continue\n }\n \n const props = block.props\n if (props && typeof props === 'object' && !Array.isArray(props)) {\n const children = (props as Record<string, any>).children\n if (children && Array.isArray(children) && children.length > 0) {\n // Filtrar children inválidos antes de contar recursivamente\n const validChildren = children.filter(\n (child: unknown) => child && typeof child === 'object' && (child as Block).id && (child as Block).type\n )\n if (validChildren.length > 0) {\n total += count(validChildren)\n }\n }\n }\n } catch (error) {\n // Se houver erro ao acessar props, apenas continuar\n continue\n }\n }\n return total\n }\n \n return count(validStructure)\n }, [validStructure])\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100\">Blocos</h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalBlocks} {totalBlocks === 1 ? 'bloco' : 'blocos'}\n </p>\n </div>\n\n {/* Lista de blocos */}\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {!validStructure || validStructure.length === 0 ? (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n Nenhum bloco adicionado ainda\n </div>\n ) : (\n validStructure.map((block) =>\n renderBlockTree(block, 0, selectedBlockId, onSelectBlock, onDeleteBlock)\n )\n )}\n </div>\n </div>\n )\n});\n"],"names":["getBlockTypeName","type","componentRegistry","getBlockPreview","block","props","renderBlockTree","depth","selectedBlockId","onSelectBlock","onDeleteBlock","isSelected","hasChildren","jsxs","cn","jsx","ChevronRight","Trash2","child","BlockSelector","React","structure","validStructure","useMemo","b","totalBlocks","count","blocks","total","i","children","validChildren"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BlockSelector.js","sources":["../../src/editor/BlockSelector.tsx"],"sourcesContent":["/**\n * Block Selector\n * Lista blocos da estrutura de forma hierárquica com drag & drop\n */\n\nimport React, { useMemo } from 'react'\nimport { Block } from '../engine'\nimport { componentRegistry } from '../engine'\nimport { Trash2, ChevronRight } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { useDroppable } from '@dnd-kit/core'\nimport { SortableBlockItem } from './dnd'\n\ninterface BlockSelectorProps {\n structure: Block[]\n selectedBlockId: string | null\n onSelectBlock: (blockId: string) => void\n onDeleteBlock: (blockId: string) => void\n overIndex?: number | null\n}\n\n/**\n * Obtém nome amigável do tipo de bloco\n */\nfunction getBlockTypeName(type: Block['type']): string {\n const definition = componentRegistry.get(type)\n return definition?.name || type\n}\n\n/**\n * Obtém preview do bloco (texto ou propriedade relevante)\n */\nfunction getBlockPreview(block: Block): string {\n const props = block.props as Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- dynamic access for preview\n\n switch (block.type) {\n case 'heading':\n return props.text || 'Heading'\n case 'text':\n return props.text ? String(props.text).substring(0, 30) + (String(props.text).length > 30 ? '...' : '') : 'Text'\n case 'button':\n return props.text || 'Button'\n case 'link':\n return props.text || 'Link'\n case 'image':\n return props.alt || props.src ? 'Image' : 'Image'\n case 'container':\n case 'stack':\n case 'grid':\n case 'box':\n return `${getBlockTypeName(block.type)} (${Array.isArray(props.children) ? props.children.length : 0} children)`\n case 'section':\n return props.id ? `Section: ${props.id}` : 'Section'\n case 'card':\n return 'Card'\n case 'divider':\n return 'Divider'\n default:\n return getBlockTypeName(block.type)\n }\n}\n\n/**\n * Renderiza um bloco e seus children recursivamente\n */\nfunction renderBlockTree(\n block: Block,\n depth: number,\n selectedBlockId: string | null,\n onSelectBlock: (blockId: string) => void,\n onDeleteBlock: (blockId: string) => void\n): React.ReactNode {\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n return null\n }\n\n const isSelected = block.id === selectedBlockId\n const props = block.props as Record<string, any>\n const hasChildren = props && typeof props === 'object' && props.children && Array.isArray(props.children) && props.children.length > 0\n\n return (\n <div key={block.id}>\n <div\n className={cn(\n 'flex items-center gap-2 p-2 rounded-lg transition-all cursor-pointer group',\n 'hover:scale-[1.01] active:scale-[0.99]',\n isSelected\n ? 'bg-blue-500 text-white shadow-md shadow-blue-500/20'\n : 'bg-gray-100/50 dark:bg-gray-800/50 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\n depth > 0 && 'ml-4'\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSelectBlock(block.id)}\n >\n {depth > 0 && (\n <div className=\"flex-shrink-0 w-4 flex items-center justify-center\">\n <ChevronRight className=\"w-3 h-3 opacity-50\" />\n </div>\n )}\n\n {/* Badge de tipo */}\n <div\n className={cn(\n 'flex-shrink-0 w-6 h-6 rounded text-xs font-semibold flex items-center justify-center',\n isSelected\n ? 'bg-white/20 text-white'\n : componentRegistry.get(block.type)?.pluginId\n ? 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400'\n : 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400'\n )}\n title={getBlockTypeName(block.type)}\n >\n {componentRegistry.get(block.type)?.pluginId ? '🧩' : block.type.substring(0, 2).toUpperCase()}\n </div>\n\n {/* Nome e preview */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium truncate\">{getBlockTypeName(block.type)}</div>\n <div\n className={cn(\n 'text-xs truncate',\n isSelected ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {getBlockPreview(block)}\n </div>\n </div>\n\n {/* Botão deletar */}\n <button\n onClick={(e) => {\n e.stopPropagation()\n onDeleteBlock(block.id)\n }}\n className={cn(\n 'p-1.5 rounded-full transition-all opacity-0 group-hover:opacity-100',\n 'hover:bg-white/30 dark:hover:bg-gray-700/50',\n 'hover:scale-110 active:scale-95',\n isSelected\n ? 'text-white hover:bg-white/40'\n : 'text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'\n )}\n title=\"Deletar bloco\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Renderizar children recursivamente */}\n {hasChildren && (\n <div className=\"mt-1\">\n {props.children\n .filter((child: Block) => child && child.id && child.type)\n .map((child: Block) =>\n renderBlockTree(child, depth + 1, selectedBlockId, onSelectBlock, onDeleteBlock)\n )}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Zona de drop no final da lista\n */\nfunction EndDropZone({ index }: { index: number }) {\n const { setNodeRef, isOver } = useDroppable({\n id: \"end-drop-zone\",\n data: { index },\n });\n\n return (\n <div ref={setNodeRef} className=\"h-8 mt-1\">\n {isOver && (\n <div className=\"h-0.5 bg-blue-500 rounded-full mx-2\" />\n )}\n </div>\n );\n}\n\nexport const BlockSelector = React.memo(function BlockSelector({\n structure,\n selectedBlockId,\n onSelectBlock,\n onDeleteBlock,\n overIndex,\n}: BlockSelectorProps) {\n // Filtrar estrutura inválida ANTES de usar\n const validStructure = useMemo(() => {\n if (!structure || !Array.isArray(structure)) return []\n return structure.filter((b) => b && typeof b === 'object' && b.id && b.type)\n }, [structure])\n\n // IDs para SortableContext\n const blockIds = useMemo(\n () => validStructure.map((b) => b.id),\n [validStructure]\n )\n\n // Contar total de blocos (incluindo children)\n const totalBlocks = useMemo(() => {\n const count = (blocks: Block[]): number => {\n if (!blocks || !Array.isArray(blocks) || blocks.length === 0) return 0\n\n let total = 0\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]\n\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n continue\n }\n\n total++\n\n try {\n if (!block.props) {\n continue\n }\n\n const props = block.props\n if (props && typeof props === 'object' && !Array.isArray(props)) {\n const children = (props as Record<string, any>).children\n if (children && Array.isArray(children) && children.length > 0) {\n const validChildren = children.filter(\n (child: unknown) => child && typeof child === 'object' && (child as Block).id && (child as Block).type\n )\n if (validChildren.length > 0) {\n total += count(validChildren)\n }\n }\n }\n } catch {\n continue\n }\n }\n return total\n }\n\n return count(validStructure)\n }, [validStructure])\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100\">Blocos</h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalBlocks} {totalBlocks === 1 ? 'bloco' : 'blocos'}\n </p>\n </div>\n\n {/* Lista de blocos */}\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {!validStructure || validStructure.length === 0 ? (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n Nenhum bloco adicionado ainda\n </div>\n ) : (\n <SortableContext items={blockIds} strategy={verticalListSortingStrategy}>\n {validStructure.map((block, index) => (\n <SortableBlockItem\n key={block.id}\n id={block.id}\n blockType={block.type}\n index={index}\n isOver={overIndex === index}\n >\n {renderBlockTree(block, 0, selectedBlockId, onSelectBlock, onDeleteBlock)}\n </SortableBlockItem>\n ))}\n <EndDropZone index={validStructure.length} />\n </SortableContext>\n )}\n </div>\n </div>\n )\n});\n"],"names":["getBlockTypeName","type","componentRegistry","getBlockPreview","block","props","renderBlockTree","depth","selectedBlockId","onSelectBlock","onDeleteBlock","isSelected","hasChildren","jsxs","cn","jsx","ChevronRight","e","Trash2","child","EndDropZone","index","setNodeRef","isOver","useDroppable","BlockSelector","React","structure","overIndex","validStructure","useMemo","b","blockIds","totalBlocks","count","blocks","total","i","children","validChildren","SortableContext","verticalListSortingStrategy","SortableBlockItem"],"mappings":";;;;;;;;AAyBA,SAASA,EAAiBC,GAA6B;AAErD,SADmBC,EAAkB,IAAID,CAAI,GAC1B,QAAQA;AAC7B;AAKA,SAASE,EAAgBC,GAAsB;AAC7C,QAAMC,IAAQD,EAAM;AAEpB,UAAQA,EAAM,MAAA;AAAA,IACZ,KAAK;AACH,aAAOC,EAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAOA,EAAM,OAAO,OAAOA,EAAM,IAAI,EAAE,UAAU,GAAG,EAAE,KAAK,OAAOA,EAAM,IAAI,EAAE,SAAS,KAAK,QAAQ,MAAM;AAAA,IAC5G,KAAK;AACH,aAAOA,EAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAOA,EAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAOA,EAAM,OAAOA,EAAM,KAAM;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAGL,EAAiBI,EAAM,IAAI,CAAC,KAAK,MAAM,QAAQC,EAAM,QAAQ,IAAIA,EAAM,SAAS,SAAS,CAAC;AAAA,IACtG,KAAK;AACH,aAAOA,EAAM,KAAK,YAAYA,EAAM,EAAE,KAAK;AAAA,IAC7C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAOL,EAAiBI,EAAM,IAAI;AAAA,EAAA;AAExC;AAKA,SAASE,EACPF,GACAG,GACAC,GACAC,GACAC,GACiB;AACjB,MAAI,CAACN,KAAS,OAAOA,KAAU,YAAY,CAACA,EAAM,MAAM,CAACA,EAAM;AAC7D,WAAO;AAGT,QAAMO,IAAaP,EAAM,OAAOI,GAC1BH,IAAQD,EAAM,OACdQ,IAAcP,KAAS,OAAOA,KAAU,YAAYA,EAAM,YAAY,MAAM,QAAQA,EAAM,QAAQ,KAAKA,EAAM,SAAS,SAAS;AAErI,2BACG,OAAA,EACC,UAAA;AAAA,IAAA,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC;AAAA,UACT;AAAA,UACA;AAAA,UACAH,IACI,wDACA;AAAA,UACJJ,IAAQ,KAAK;AAAA,QAAA;AAAA,QAEf,OAAO,EAAE,aAAa,GAAGA,IAAQ,KAAK,CAAC,KAAA;AAAA,QACvC,SAAS,MAAME,EAAcL,EAAM,EAAE;AAAA,QAEpC,UAAA;AAAA,UAAAG,IAAQ,uBACN,OAAA,EAAI,WAAU,sDACb,UAAA,gBAAAQ,EAACC,GAAA,EAAa,WAAU,qBAAA,CAAqB,EAAA,CAC/C;AAAA,UAIF,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD;AAAA,gBACT;AAAA,gBACAH,IACI,2BACAT,EAAkB,IAAIE,EAAM,IAAI,GAAG,WACjC,6EACA;AAAA,cAAA;AAAA,cAER,OAAOJ,EAAiBI,EAAM,IAAI;AAAA,cAEjC,UAAAF,EAAkB,IAAIE,EAAM,IAAI,GAAG,WAAW,OAAOA,EAAM,KAAK,UAAU,GAAG,CAAC,EAAE,YAAA;AAAA,YAAY;AAAA,UAAA;AAAA,UAI/F,gBAAAS,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAE,EAAC,SAAI,WAAU,gCAAgC,UAAAf,EAAiBI,EAAM,IAAI,GAAE;AAAA,YAC5E,gBAAAW;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWD;AAAA,kBACT;AAAA,kBACAH,IAAa,kBAAkB;AAAA,gBAAA;AAAA,gBAGhC,YAAgBP,CAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UACxB,GACF;AAAA,UAGA,gBAAAW;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,CAACE,MAAM;AACd,gBAAAA,EAAE,gBAAA,GACFP,EAAcN,EAAM,EAAE;AAAA,cACxB;AAAA,cACA,WAAWU;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACAH,IACI,iCACA;AAAA,cAAA;AAAA,cAEN,OAAM;AAAA,cAEN,UAAA,gBAAAI,EAACG,GAAA,EAAO,WAAU,cAAA,CAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAClC;AAAA,MAAA;AAAA,IAAA;AAAA,IAIDN,KACC,gBAAAG,EAAC,OAAA,EAAI,WAAU,QACZ,UAAAV,EAAM,SACJ,OAAO,CAACc,MAAiBA,KAASA,EAAM,MAAMA,EAAM,IAAI,EACxD;AAAA,MAAI,CAACA,MACJb,EAAgBa,GAAOZ,IAAQ,GAAGC,GAAiBC,GAAeC,CAAa;AAAA,IAAA,EACjF,CACJ;AAAA,EAAA,EAAA,GA3EMN,EAAM,EA6EhB;AAEJ;AAKA,SAASgB,EAAY,EAAE,OAAAC,KAA4B;AACjD,QAAM,EAAE,YAAAC,GAAY,QAAAC,EAAA,IAAWC,EAAa;AAAA,IAC1C,IAAI;AAAA,IACJ,MAAM,EAAE,OAAAH,EAAA;AAAA,EAAM,CACf;AAED,SACE,gBAAAN,EAAC,OAAA,EAAI,KAAKO,GAAY,WAAU,YAC7B,UAAAC,KACC,gBAAAR,EAAC,OAAA,EAAI,WAAU,sCAAA,CAAsC,GAEzD;AAEJ;AAEO,MAAMU,IAAgBC,EAAM,KAAK,SAAuB;AAAA,EAC7D,WAAAC;AAAA,EACA,iBAAAnB;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,WAAAkB;AACF,GAAuB;AAErB,QAAMC,IAAiBC,EAAQ,MACzB,CAACH,KAAa,CAAC,MAAM,QAAQA,CAAS,IAAU,CAAA,IAC7CA,EAAU,OAAO,CAACI,MAAMA,KAAK,OAAOA,KAAM,YAAYA,EAAE,MAAMA,EAAE,IAAI,GAC1E,CAACJ,CAAS,CAAC,GAGRK,IAAWF;AAAA,IACf,MAAMD,EAAe,IAAI,CAACE,MAAMA,EAAE,EAAE;AAAA,IACpC,CAACF,CAAc;AAAA,EAAA,GAIXI,IAAcH,EAAQ,MAAM;AAChC,UAAMI,IAAQ,CAACC,MAA4B;AACzC,UAAI,CAACA,KAAU,CAAC,MAAM,QAAQA,CAAM,KAAKA,EAAO,WAAW,EAAG,QAAO;AAErE,UAAIC,IAAQ;AACZ,eAASC,IAAI,GAAGA,IAAIF,EAAO,QAAQE,KAAK;AACtC,cAAMjC,IAAQ+B,EAAOE,CAAC;AAEtB,YAAI,GAACjC,KAAS,OAAOA,KAAU,YAAY,CAACA,EAAM,MAAM,CAACA,EAAM,OAI/D;AAAA,UAAAgC;AAEA,cAAI;AACF,gBAAI,CAAChC,EAAM;AACT;AAGF,kBAAMC,IAAQD,EAAM;AACpB,gBAAIC,KAAS,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK,GAAG;AAC/D,oBAAMiC,IAAYjC,EAA8B;AAChD,kBAAIiC,KAAY,MAAM,QAAQA,CAAQ,KAAKA,EAAS,SAAS,GAAG;AAC9D,sBAAMC,IAAgBD,EAAS;AAAA,kBAC7B,CAACnB,MAAmBA,KAAS,OAAOA,KAAU,YAAaA,EAAgB,MAAOA,EAAgB;AAAA,gBAAA;AAEpG,gBAAIoB,EAAc,SAAS,MACzBH,KAASF,EAAMK,CAAa;AAAA,cAEhC;AAAA,YACF;AAAA,UACF,QAAQ;AACN;AAAA,UACF;AAAA;AAAA,MACF;AACA,aAAOH;AAAA,IACT;AAEA,WAAOF,EAAML,CAAc;AAAA,EAC7B,GAAG,CAACA,CAAc,CAAC;AAEnB,SACE,gBAAAhB,EAAC,OAAA,EAAI,WAAU,wCAEb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,MAAA,gBAAAE,EAAC,MAAA,EAAG,WAAU,0DAAyD,UAAA,UAAM;AAAA,MAC7E,gBAAAF,EAAC,KAAA,EAAE,WAAU,iDACV,UAAA;AAAA,QAAAoB;AAAA,QAAY;AAAA,QAAEA,MAAgB,IAAI,UAAU;AAAA,MAAA,EAAA,CAC/C;AAAA,IAAA,GACF;AAAA,IAGA,gBAAAlB,EAAC,SAAI,WAAU,wCACZ,WAACc,KAAkBA,EAAe,WAAW,IAC5C,gBAAAd,EAAC,SAAI,WAAU,6DAA4D,2CAE3E,IAEA,gBAAAF,EAAC2B,KAAgB,OAAOR,GAAU,UAAUS,GACzC,UAAA;AAAA,MAAAZ,EAAe,IAAI,CAACzB,GAAOiB,MAC1B,gBAAAN;AAAA,QAAC2B;AAAA,QAAA;AAAA,UAEC,IAAItC,EAAM;AAAA,UACV,WAAWA,EAAM;AAAA,UACjB,OAAAiB;AAAA,UACA,QAAQO,MAAcP;AAAA,UAErB,UAAAf,EAAgBF,GAAO,GAAGI,GAAiBC,GAAeC,CAAa;AAAA,QAAA;AAAA,QANnEN,EAAM;AAAA,MAAA,CAQd;AAAA,MACD,gBAAAW,EAACK,GAAA,EAAY,OAAOS,EAAe,OAAA,CAAQ;AAAA,IAAA,EAAA,CAC7C,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ,CAAC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LandingPageEditor.d.ts","sourceRoot":"","sources":["../../src/editor/LandingPageEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAgB,MAAM,WAAW,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,wDAAwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"LandingPageEditor.d.ts","sourceRoot":"","sources":["../../src/editor/LandingPageEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAgB,MAAM,WAAW,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,wDAAwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,sBAAsB,2CAkWxB"}
|