@nextbridgehq/payload-block-builder 0.1.6 → 0.1.8
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/README.md +181 -35
- package/dist/bin/init.js +79 -25
- package/dist/client.cjs +118 -65
- package/dist/client.js +142 -75
- package/dist/index.cjs +32 -15
- package/dist/index.js +32 -15
- package/package.json +2 -2
package/dist/client.cjs
CHANGED
|
@@ -77,6 +77,56 @@ function MediaPicker({ label, required, value, onChange }) {
|
|
|
77
77
|
"x"
|
|
78
78
|
))) : /* @__PURE__ */ import_react.default.createElement(ListDrawerToggler, { className: "bdf-upload-btn" }, "Choose from Media Library")), /* @__PURE__ */ import_react.default.createElement(ListDrawer, { onSelect: handleSelect }));
|
|
79
79
|
}
|
|
80
|
+
function RelationshipPicker({ label, required, collection, value, onChange }) {
|
|
81
|
+
const changeRef = (0, import_react.useRef)(onChange);
|
|
82
|
+
const closeRef = (0, import_react.useRef)(() => {
|
|
83
|
+
});
|
|
84
|
+
(0, import_react.useEffect)(() => {
|
|
85
|
+
changeRef.current = onChange;
|
|
86
|
+
});
|
|
87
|
+
const handleSelect = (0, import_react.useCallback)(
|
|
88
|
+
({ docID, doc }) => {
|
|
89
|
+
changeRef.current({
|
|
90
|
+
id: docID,
|
|
91
|
+
title: doc?.title ?? doc?.name ?? doc?.slug ?? null
|
|
92
|
+
});
|
|
93
|
+
closeRef.current();
|
|
94
|
+
},
|
|
95
|
+
[]
|
|
96
|
+
);
|
|
97
|
+
const [ListDrawer, ListDrawerToggler, { closeDrawer }] = (0, import_ui.useListDrawer)({
|
|
98
|
+
collectionSlugs: [collection]
|
|
99
|
+
});
|
|
100
|
+
closeRef.current = closeDrawer;
|
|
101
|
+
const relObj = value && typeof value === "object" ? value : null;
|
|
102
|
+
const relId = relObj?.id ?? (typeof value === "string" || typeof value === "number" ? value : null);
|
|
103
|
+
const relTitle = relObj?.title ? String(relObj.title) : null;
|
|
104
|
+
const [fetchedTitle, setFetchedTitle] = (0, import_react.useState)(null);
|
|
105
|
+
(0, import_react.useEffect)(() => {
|
|
106
|
+
if (!relId || relTitle) {
|
|
107
|
+
setFetchedTitle(null);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
fetch(`/api/${collection}/${String(relId)}?depth=0`, { credentials: "same-origin" }).then((r) => r.ok ? r.json() : null).then((doc) => {
|
|
111
|
+
if (doc) {
|
|
112
|
+
const t = doc.title ?? doc.name ?? doc.slug ?? null;
|
|
113
|
+
setFetchedTitle(t ? String(t) : null);
|
|
114
|
+
}
|
|
115
|
+
}).catch(() => {
|
|
116
|
+
});
|
|
117
|
+
}, [relId, relTitle, collection]);
|
|
118
|
+
const displayTitle = relTitle ?? fetchedTitle;
|
|
119
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: "bdf-field" }, /* @__PURE__ */ import_react.default.createElement("label", { className: "bdf-label" }, label, required && /* @__PURE__ */ import_react.default.createElement("span", { className: "bdf-required" }, "*"), /* @__PURE__ */ import_react.default.createElement("span", { style: { marginLeft: 6, fontSize: 11, color: "var(--theme-elevation-400)", fontWeight: 400 } }, "(", collection, ")")), /* @__PURE__ */ import_react.default.createElement("div", { className: "bdf-upload-area" }, relId ? /* @__PURE__ */ import_react.default.createElement("div", { className: "bdf-upload-selected" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "bdf-upload-name" }, displayTitle ?? `ID: ${String(relId)}`), /* @__PURE__ */ import_react.default.createElement("div", { className: "bdf-upload-actions" }, /* @__PURE__ */ import_react.default.createElement(ListDrawerToggler, { className: "bdf-upload-btn" }, "Change"), /* @__PURE__ */ import_react.default.createElement(
|
|
120
|
+
"button",
|
|
121
|
+
{
|
|
122
|
+
type: "button",
|
|
123
|
+
className: "bdf-icon-btn bdf-icon-btn--danger",
|
|
124
|
+
title: "Remove",
|
|
125
|
+
onClick: () => onChange(null)
|
|
126
|
+
},
|
|
127
|
+
"\xD7"
|
|
128
|
+
))) : /* @__PURE__ */ import_react.default.createElement(ListDrawerToggler, { className: "bdf-upload-btn" }, "Choose from ", collection)), /* @__PURE__ */ import_react.default.createElement(ListDrawer, { onSelect: handleSelect }));
|
|
129
|
+
}
|
|
80
130
|
function SchemaForm({ schema, value, onChange }) {
|
|
81
131
|
const set = (0, import_react.useCallback)(
|
|
82
132
|
(key, val) => onChange({ ...value, [key]: val }),
|
|
@@ -214,17 +264,19 @@ function FieldInput({ field, value, onChange }) {
|
|
|
214
264
|
onChange
|
|
215
265
|
}
|
|
216
266
|
);
|
|
217
|
-
case "relationship":
|
|
218
|
-
|
|
219
|
-
|
|
267
|
+
case "relationship": {
|
|
268
|
+
const collection = field.collection ?? "media";
|
|
269
|
+
return /* @__PURE__ */ import_react.default.createElement(
|
|
270
|
+
RelationshipPicker,
|
|
220
271
|
{
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
272
|
+
label,
|
|
273
|
+
required: field.required,
|
|
274
|
+
collection,
|
|
275
|
+
value,
|
|
276
|
+
onChange
|
|
226
277
|
}
|
|
227
|
-
)
|
|
278
|
+
);
|
|
279
|
+
}
|
|
228
280
|
case "json":
|
|
229
281
|
return /* @__PURE__ */ import_react.default.createElement("div", { className: "bdf-field" }, /* @__PURE__ */ import_react.default.createElement("label", { className: "bdf-label" }, label, field.required && /* @__PURE__ */ import_react.default.createElement("span", { className: "bdf-required" }, "*"), /* @__PURE__ */ import_react.default.createElement("span", { style: { marginLeft: 6, fontSize: 11, color: "var(--theme-elevation-400)", fontWeight: 400 } }, "(JSON)")), /* @__PURE__ */ import_react.default.createElement(
|
|
230
282
|
"textarea",
|
|
@@ -1172,6 +1224,7 @@ var useBuilderStore = (0, import_zustand.create)()(
|
|
|
1172
1224
|
|
|
1173
1225
|
// src/block-builder/components/canvas/TopBar.tsx
|
|
1174
1226
|
var import_react7 = __toESM(require("react"), 1);
|
|
1227
|
+
var import_lucide_react = require("lucide-react");
|
|
1175
1228
|
|
|
1176
1229
|
// src/block-builder/lib/mapToSaveRequest.ts
|
|
1177
1230
|
var TYPE_MAP = {
|
|
@@ -1360,7 +1413,7 @@ function TopBar({ blockDefs, activeSlug, onBlockSelect, versions, selectedVersio
|
|
|
1360
1413
|
return () => document.removeEventListener("mousedown", handleClick);
|
|
1361
1414
|
}, []);
|
|
1362
1415
|
async function handlePublish() {
|
|
1363
|
-
if (!activeBlock || isReadOnly) return;
|
|
1416
|
+
if (!activeBlock || isReadOnly) return false;
|
|
1364
1417
|
setNotification({ status: "publishing" });
|
|
1365
1418
|
try {
|
|
1366
1419
|
const req = mapToSaveRequest(activeBlock);
|
|
@@ -1377,13 +1430,15 @@ function TopBar({ blockDefs, activeSlug, onBlockSelect, versions, selectedVersio
|
|
|
1377
1430
|
status: "success",
|
|
1378
1431
|
msg: `v${json.versionNumber ?? "?"} published successfully!`
|
|
1379
1432
|
});
|
|
1380
|
-
|
|
1433
|
+
onAfterPublish();
|
|
1434
|
+
return true;
|
|
1381
1435
|
} else {
|
|
1382
1436
|
setNotification({
|
|
1383
1437
|
status: "error",
|
|
1384
1438
|
title: "Failed to publish block",
|
|
1385
1439
|
errors: json.errors ?? ["An unknown error occurred."]
|
|
1386
1440
|
});
|
|
1441
|
+
return false;
|
|
1387
1442
|
}
|
|
1388
1443
|
} catch (err) {
|
|
1389
1444
|
setNotification({
|
|
@@ -1391,6 +1446,7 @@ function TopBar({ blockDefs, activeSlug, onBlockSelect, versions, selectedVersio
|
|
|
1391
1446
|
title: "Network error",
|
|
1392
1447
|
errors: [err instanceof Error ? err.message : "Could not reach the server."]
|
|
1393
1448
|
});
|
|
1449
|
+
return false;
|
|
1394
1450
|
}
|
|
1395
1451
|
}
|
|
1396
1452
|
function handleExport() {
|
|
@@ -1418,9 +1474,9 @@ function TopBar({ blockDefs, activeSlug, onBlockSelect, versions, selectedVersio
|
|
|
1418
1474
|
className: "bb-block-picker__trigger",
|
|
1419
1475
|
onClick: () => setBlockPickerOpen((o) => !o)
|
|
1420
1476
|
},
|
|
1421
|
-
/* @__PURE__ */ import_react7.default.createElement(
|
|
1477
|
+
/* @__PURE__ */ import_react7.default.createElement(import_lucide_react.Blocks, { size: 14, strokeWidth: 1.75, className: "bb-block-picker__icon" }),
|
|
1422
1478
|
/* @__PURE__ */ import_react7.default.createElement("span", null, activeBlockDef?.name ?? activeSlug ?? "Select a block"),
|
|
1423
|
-
/* @__PURE__ */ import_react7.default.createElement(
|
|
1479
|
+
/* @__PURE__ */ import_react7.default.createElement(import_lucide_react.ChevronDown, { size: 14, strokeWidth: 1.75, className: "bb-version-selector__chevron" })
|
|
1424
1480
|
), blockPickerOpen && /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-block-picker__dropdown" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-version-dropdown__header" }, "Block Definitions"), blockDefs.map((b) => /* @__PURE__ */ import_react7.default.createElement(
|
|
1425
1481
|
"button",
|
|
1426
1482
|
{
|
|
@@ -1444,7 +1500,7 @@ function TopBar({ blockDefs, activeSlug, onBlockSelect, versions, selectedVersio
|
|
|
1444
1500
|
/* @__PURE__ */ import_react7.default.createElement("span", { className: `bb-version-selector__dot${selectedVersion?.isCurrent ? " bb-version-selector__dot--current" : " bb-version-selector__dot--old"}` }),
|
|
1445
1501
|
/* @__PURE__ */ import_react7.default.createElement("span", null, selectedVersion?.label ?? `v${selectedVersion?.versionNumber ?? "?"}`),
|
|
1446
1502
|
selectedVersion?.isCurrent && /* @__PURE__ */ import_react7.default.createElement("span", { className: "bb-version-selector__badge" }, "current"),
|
|
1447
|
-
/* @__PURE__ */ import_react7.default.createElement(
|
|
1503
|
+
/* @__PURE__ */ import_react7.default.createElement(import_lucide_react.ChevronDown, { size: 14, strokeWidth: 1.75, className: "bb-version-selector__chevron" })
|
|
1448
1504
|
), versionDropdownOpen && /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-version-dropdown" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-version-dropdown__header" }, "Version History"), versions.map((v) => /* @__PURE__ */ import_react7.default.createElement(
|
|
1449
1505
|
"button",
|
|
1450
1506
|
{
|
|
@@ -1485,9 +1541,8 @@ function TopBar({ blockDefs, activeSlug, onBlockSelect, versions, selectedVersio
|
|
|
1485
1541
|
{
|
|
1486
1542
|
type: "button",
|
|
1487
1543
|
onClick: async () => {
|
|
1488
|
-
await handlePublish();
|
|
1489
|
-
|
|
1490
|
-
onRestoreVersion();
|
|
1544
|
+
const success = await handlePublish();
|
|
1545
|
+
if (success) onRestoreVersion();
|
|
1491
1546
|
},
|
|
1492
1547
|
disabled: notification?.status === "publishing" || !activeBlock,
|
|
1493
1548
|
className: "bb-btn bb-btn--warning"
|
|
@@ -1502,11 +1557,12 @@ function TopBar({ blockDefs, activeSlug, onBlockSelect, versions, selectedVersio
|
|
|
1502
1557
|
className: "bb-btn bb-btn--primary"
|
|
1503
1558
|
},
|
|
1504
1559
|
notification?.status === "publishing" ? "Publishing..." : "Publish to Payload"
|
|
1505
|
-
))), notification?.status === "publishing" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify bb-notify--publishing" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__box" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__spinner" }), /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__body" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__title" }, isReadOnly ? "Restoring version..." : "Publishing to Payload..."), /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__sub" }, "Validating schema and saving block definition.")))), notification?.status === "success" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify bb-notify--success" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__box" }, /* @__PURE__ */ import_react7.default.createElement("span", { className: "bb-notify__icon" }, "OK"), /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__body" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__title" }, notification.msg), /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__sub" }, "The block definition and version have been saved.")), /* @__PURE__ */ import_react7.default.createElement("button", { className: "bb-notify__close", onClick: () => setNotification(null) },
|
|
1560
|
+
))), notification?.status === "publishing" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify bb-notify--publishing" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__box" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__spinner" }), /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__body" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__title" }, isReadOnly ? "Restoring version..." : "Publishing to Payload..."), /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__sub" }, "Validating schema and saving block definition.")))), notification?.status === "success" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify bb-notify--success" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__box" }, /* @__PURE__ */ import_react7.default.createElement("span", { className: "bb-notify__icon" }, "OK"), /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__body" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__title" }, notification.msg), /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__sub" }, "The block definition and version have been saved.")), /* @__PURE__ */ import_react7.default.createElement("button", { className: "bb-notify__close", onClick: () => setNotification(null) }, /* @__PURE__ */ import_react7.default.createElement(import_lucide_react.X, { size: 12, strokeWidth: 2 })))), notification?.status === "error" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify bb-notify--error" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__box" }, /* @__PURE__ */ import_react7.default.createElement("span", { className: "bb-notify__icon" }, "!"), /* @__PURE__ */ import_react7.default.createElement("div", { className: "bb-notify__body" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__title" }, notification.title), /* @__PURE__ */ import_react7.default.createElement("p", { className: "bb-notify__sub" }, "Fix the following errors before publishing:"), /* @__PURE__ */ import_react7.default.createElement("ul", { className: "bb-notify__error-list" }, notification.errors.map((e, i) => /* @__PURE__ */ import_react7.default.createElement("li", { key: i }, e)))), /* @__PURE__ */ import_react7.default.createElement("button", { className: "bb-notify__close", onClick: () => setNotification(null) }, /* @__PURE__ */ import_react7.default.createElement(import_lucide_react.X, { size: 12, strokeWidth: 2 })))));
|
|
1506
1561
|
}
|
|
1507
1562
|
|
|
1508
1563
|
// src/block-builder/components/canvas/BlockList.tsx
|
|
1509
1564
|
var import_react8 = __toESM(require("react"), 1);
|
|
1565
|
+
var import_lucide_react2 = require("lucide-react");
|
|
1510
1566
|
function BlockList() {
|
|
1511
1567
|
const blocks = useBuilderStore((s) => s.blocks);
|
|
1512
1568
|
const activeBlockId = useBuilderStore((s) => s.activeBlockId);
|
|
@@ -1514,7 +1570,7 @@ function BlockList() {
|
|
|
1514
1570
|
const removeBlock = useBuilderStore((s) => s.removeBlock);
|
|
1515
1571
|
const duplicateBlock = useBuilderStore((s) => s.duplicateBlock);
|
|
1516
1572
|
const setActiveBlock = useBuilderStore((s) => s.setActiveBlock);
|
|
1517
|
-
return /* @__PURE__ */ import_react8.default.createElement("div", { className: "bb-sidebar bb-sidebar--200 bb-sidebar--blocks" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "bb-sidebar__header" }, /* @__PURE__ */ import_react8.default.createElement("span", { className: "bb-sidebar__title" }, "Blocks"), /* @__PURE__ */ import_react8.default.createElement("button", { type: "button", onClick: addBlock, title: "Add block", className: "bb-sidebar__add" },
|
|
1573
|
+
return /* @__PURE__ */ import_react8.default.createElement("div", { className: "bb-sidebar bb-sidebar--200 bb-sidebar--blocks" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "bb-sidebar__header" }, /* @__PURE__ */ import_react8.default.createElement("span", { className: "bb-sidebar__title" }, "Blocks"), /* @__PURE__ */ import_react8.default.createElement("button", { type: "button", onClick: addBlock, title: "Add block", className: "bb-sidebar__add" }, /* @__PURE__ */ import_react8.default.createElement(import_lucide_react2.Plus, { size: 14, strokeWidth: 2 }))), /* @__PURE__ */ import_react8.default.createElement("div", { className: "bb-sidebar__body" }, blocks.length === 0 && /* @__PURE__ */ import_react8.default.createElement("div", { className: "bb-block-empty" }, "No blocks yet.", /* @__PURE__ */ import_react8.default.createElement("br", null), "Click + to create one."), blocks.map((block) => {
|
|
1518
1574
|
const isActive = block.id === activeBlockId;
|
|
1519
1575
|
return /* @__PURE__ */ import_react8.default.createElement(
|
|
1520
1576
|
"div",
|
|
@@ -1539,7 +1595,7 @@ function BlockList() {
|
|
|
1539
1595
|
className: "bb-block-action",
|
|
1540
1596
|
title: "Duplicate"
|
|
1541
1597
|
},
|
|
1542
|
-
|
|
1598
|
+
/* @__PURE__ */ import_react8.default.createElement(import_lucide_react2.Copy, { size: 12, strokeWidth: 1.75 })
|
|
1543
1599
|
),
|
|
1544
1600
|
/* @__PURE__ */ import_react8.default.createElement(
|
|
1545
1601
|
"button",
|
|
@@ -1549,7 +1605,7 @@ function BlockList() {
|
|
|
1549
1605
|
className: "bb-block-action bb-block-action--danger",
|
|
1550
1606
|
title: "Delete"
|
|
1551
1607
|
},
|
|
1552
|
-
|
|
1608
|
+
/* @__PURE__ */ import_react8.default.createElement(import_lucide_react2.Trash2, { size: 12, strokeWidth: 1.75 })
|
|
1553
1609
|
)
|
|
1554
1610
|
)
|
|
1555
1611
|
);
|
|
@@ -1566,24 +1622,19 @@ var import_modifiers = require("@dnd-kit/modifiers");
|
|
|
1566
1622
|
var import_react9 = __toESM(require("react"), 1);
|
|
1567
1623
|
var import_sortable = require("@dnd-kit/sortable");
|
|
1568
1624
|
var import_utilities = require("@dnd-kit/utilities");
|
|
1625
|
+
var import_lucide_react3 = require("lucide-react");
|
|
1569
1626
|
var ICON_MAP = {
|
|
1570
|
-
text:
|
|
1571
|
-
textarea:
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
upload:
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
point: "P",
|
|
1582
|
-
relationship: "->>",
|
|
1583
|
-
array: "[]",
|
|
1584
|
-
group: "{ }",
|
|
1585
|
-
json: "{ }",
|
|
1586
|
-
ui: "UI"
|
|
1627
|
+
text: import_lucide_react3.Type,
|
|
1628
|
+
textarea: import_lucide_react3.AlignLeft,
|
|
1629
|
+
number: import_lucide_react3.Hash,
|
|
1630
|
+
email: import_lucide_react3.Mail,
|
|
1631
|
+
date: import_lucide_react3.Calendar,
|
|
1632
|
+
checkbox: import_lucide_react3.CheckSquare,
|
|
1633
|
+
select: import_lucide_react3.ChevronDown,
|
|
1634
|
+
radio: import_lucide_react3.Circle,
|
|
1635
|
+
upload: import_lucide_react3.Upload,
|
|
1636
|
+
relationship: import_lucide_react3.Link,
|
|
1637
|
+
json: import_lucide_react3.Braces
|
|
1587
1638
|
};
|
|
1588
1639
|
function SortableFieldCard({ field, blockId, index }) {
|
|
1589
1640
|
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = (0, import_sortable.useSortable)({
|
|
@@ -1592,6 +1643,7 @@ function SortableFieldCard({ field, blockId, index }) {
|
|
|
1592
1643
|
const activeFieldId = useBuilderStore((s) => s.activeFieldId);
|
|
1593
1644
|
const setActiveField = useBuilderStore((s) => s.setActiveField);
|
|
1594
1645
|
const removeField = useBuilderStore((s) => s.removeField);
|
|
1646
|
+
const isReadOnly = useBuilderStore((s) => s.isReadOnly);
|
|
1595
1647
|
const isActive = activeFieldId === field.id;
|
|
1596
1648
|
const wrapStyle = {
|
|
1597
1649
|
transform: import_utilities.CSS.Transform.toString(transform),
|
|
@@ -1612,10 +1664,10 @@ function SortableFieldCard({ field, blockId, index }) {
|
|
|
1612
1664
|
className: `bb-field-card${isActive ? " bb-field-card--active" : ""}`,
|
|
1613
1665
|
onClick: () => setActiveField(isActive ? null : field.id)
|
|
1614
1666
|
},
|
|
1615
|
-
/* @__PURE__ */ import_react9.default.createElement("span", { className: "bb-field-card__icon" },
|
|
1667
|
+
/* @__PURE__ */ import_react9.default.createElement("span", { className: "bb-field-card__icon" }, /* @__PURE__ */ import_react9.default.createElement(FieldIcon, { type: field.type })),
|
|
1616
1668
|
/* @__PURE__ */ import_react9.default.createElement("div", { className: "bb-field-card__body" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "bb-field-card__name" }, field.name || /* @__PURE__ */ import_react9.default.createElement("span", { className: "bb-field-card__name--empty" }, "unnamed")), /* @__PURE__ */ import_react9.default.createElement("div", { className: "bb-field-card__type" }, field.type, field.required && /* @__PURE__ */ import_react9.default.createElement("span", { className: "bb-field-card__required" }, "*"))),
|
|
1617
1669
|
/* @__PURE__ */ import_react9.default.createElement("span", { className: "bb-field-card__index" }, "#", index + 1),
|
|
1618
|
-
/* @__PURE__ */ import_react9.default.createElement(
|
|
1670
|
+
!isReadOnly && /* @__PURE__ */ import_react9.default.createElement(
|
|
1619
1671
|
"button",
|
|
1620
1672
|
{
|
|
1621
1673
|
type: "button",
|
|
@@ -1627,11 +1679,15 @@ function SortableFieldCard({ field, blockId, index }) {
|
|
|
1627
1679
|
className: "bb-field-card__delete",
|
|
1628
1680
|
title: "Remove field"
|
|
1629
1681
|
},
|
|
1630
|
-
|
|
1682
|
+
/* @__PURE__ */ import_react9.default.createElement(import_lucide_react3.X, { size: 12, strokeWidth: 2 })
|
|
1631
1683
|
)
|
|
1632
1684
|
)
|
|
1633
1685
|
);
|
|
1634
1686
|
}
|
|
1687
|
+
function FieldIcon({ type }) {
|
|
1688
|
+
const Icon = ICON_MAP[type];
|
|
1689
|
+
return Icon ? /* @__PURE__ */ import_react9.default.createElement(Icon, { size: 13, strokeWidth: 1.75 }) : null;
|
|
1690
|
+
}
|
|
1635
1691
|
|
|
1636
1692
|
// src/block-builder/components/canvas/BuilderCanvas.tsx
|
|
1637
1693
|
function BuilderCanvas() {
|
|
@@ -1748,21 +1804,15 @@ var import_react12 = __toESM(require("react"), 1);
|
|
|
1748
1804
|
var ALL_TYPES = [
|
|
1749
1805
|
"text",
|
|
1750
1806
|
"textarea",
|
|
1751
|
-
"richText",
|
|
1752
1807
|
"number",
|
|
1808
|
+
"email",
|
|
1809
|
+
"date",
|
|
1753
1810
|
"checkbox",
|
|
1754
1811
|
"select",
|
|
1755
1812
|
"radio",
|
|
1756
|
-
"date",
|
|
1757
1813
|
"upload",
|
|
1758
|
-
"email",
|
|
1759
|
-
"code",
|
|
1760
|
-
"point",
|
|
1761
1814
|
"relationship",
|
|
1762
|
-
"
|
|
1763
|
-
"group",
|
|
1764
|
-
"json",
|
|
1765
|
-
"ui"
|
|
1815
|
+
"json"
|
|
1766
1816
|
];
|
|
1767
1817
|
function FieldConfig() {
|
|
1768
1818
|
const activeBlockId = useBuilderStore((s) => s.activeBlockId);
|
|
@@ -1934,7 +1984,7 @@ function ConfigPanel() {
|
|
|
1934
1984
|
|
|
1935
1985
|
// src/block-builder/components/sidebar/FieldPalette.tsx
|
|
1936
1986
|
var import_react14 = __toESM(require("react"), 1);
|
|
1937
|
-
var
|
|
1987
|
+
var import_lucide_react4 = require("lucide-react");
|
|
1938
1988
|
|
|
1939
1989
|
// src/block-builder/lib/field-palette.ts
|
|
1940
1990
|
var FIELD_PALETTE = [
|
|
@@ -1968,19 +2018,20 @@ function getFieldMeta(type) {
|
|
|
1968
2018
|
|
|
1969
2019
|
// src/block-builder/components/sidebar/FieldPalette.tsx
|
|
1970
2020
|
var ICON_MAP2 = {
|
|
1971
|
-
Type:
|
|
1972
|
-
AlignLeft:
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
2021
|
+
Type: import_lucide_react4.Type,
|
|
2022
|
+
AlignLeft: import_lucide_react4.AlignLeft,
|
|
2023
|
+
AlignJustify: import_lucide_react4.AlignJustify,
|
|
2024
|
+
Hash: import_lucide_react4.Hash,
|
|
2025
|
+
Mail: import_lucide_react4.Mail,
|
|
2026
|
+
Calendar: import_lucide_react4.Calendar,
|
|
2027
|
+
CheckSquare: import_lucide_react4.CheckSquare,
|
|
2028
|
+
ChevronDown: import_lucide_react4.ChevronDown,
|
|
2029
|
+
Circle: import_lucide_react4.Circle,
|
|
2030
|
+
Upload: import_lucide_react4.Upload,
|
|
2031
|
+
Link: import_lucide_react4.Link,
|
|
2032
|
+
List: import_lucide_react4.List,
|
|
2033
|
+
Folder: import_lucide_react4.Folder,
|
|
2034
|
+
Braces: import_lucide_react4.Braces
|
|
1984
2035
|
};
|
|
1985
2036
|
function FieldPalette() {
|
|
1986
2037
|
const [search, setSearch] = (0, import_react14.useState)("");
|
|
@@ -2333,7 +2384,9 @@ function BuilderShell({ loadSlug }) {
|
|
|
2333
2384
|
setBlockDefs(
|
|
2334
2385
|
(json.docs ?? []).map((d) => ({ id: String(d.id), slug: d.slug, name: d.name }))
|
|
2335
2386
|
);
|
|
2336
|
-
}).catch(() => {
|
|
2387
|
+
}).catch((err) => {
|
|
2388
|
+
console.error("[block-builder] Failed to load block definitions:", err);
|
|
2389
|
+
setLoadError("Could not load block definitions. Please refresh the page.");
|
|
2337
2390
|
});
|
|
2338
2391
|
}, []);
|
|
2339
2392
|
const loadVersionsForSlug = (0, import_react16.useCallback)(async (slug) => {
|