@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/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
- 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" }, "*"), field.collection && /* @__PURE__ */ import_react.default.createElement("span", { style: { marginLeft: 6, fontSize: 11, color: "var(--theme-elevation-400)", fontWeight: 400 } }, "(", field.collection, ")")), /* @__PURE__ */ import_react.default.createElement(
219
- "input",
267
+ case "relationship": {
268
+ const collection = field.collection ?? "media";
269
+ return /* @__PURE__ */ import_react.default.createElement(
270
+ RelationshipPicker,
220
271
  {
221
- className: "bdf-input",
222
- type: "text",
223
- value: value ?? "",
224
- onChange: (e) => onChange(e.target.value),
225
- placeholder: "Enter document ID"
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
- await onAfterPublish();
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("span", { className: "bb-block-picker__icon" }, "B"),
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("span", { className: "bb-version-selector__chevron" }, "v")
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("span", { className: "bb-version-selector__chevron" }, "v")
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
- setVersionMeta(null, false);
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) }, "x"))), 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) }, "x"))));
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" }, "+")), /* @__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) => {
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
- "x"
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: "T",
1571
- textarea: "Tx",
1572
- richText: "RT",
1573
- number: "#",
1574
- checkbox: "[x]",
1575
- select: "v",
1576
- radio: "(o)",
1577
- date: "D",
1578
- upload: "^",
1579
- email: "@",
1580
- code: "<>",
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" }, ICON_MAP[field.type] ?? "?"),
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
- "x"
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
- "array",
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 import_lucide_react = require("lucide-react");
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: import_lucide_react.Type,
1972
- AlignLeft: import_lucide_react.AlignLeft,
1973
- Hash: import_lucide_react.Hash,
1974
- Mail: import_lucide_react.Mail,
1975
- Calendar: import_lucide_react.Calendar,
1976
- CheckSquare: import_lucide_react.CheckSquare,
1977
- ChevronDown: import_lucide_react.ChevronDown,
1978
- Circle: import_lucide_react.Circle,
1979
- Upload: import_lucide_react.Upload,
1980
- Link: import_lucide_react.Link,
1981
- List: import_lucide_react.List,
1982
- Folder: import_lucide_react.Folder,
1983
- Braces: import_lucide_react.Braces
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) => {