@measured/puck 0.16.3-canary.af421c6 → 0.17.0-canary.159d819

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.js CHANGED
@@ -276,7 +276,7 @@ init_react_import();
276
276
 
277
277
  // css-module:/home/runner/work/puck/puck/packages/core/components/AutoField/styles.module.css#css-module
278
278
  init_react_import();
279
- var styles_module_default2 = { "Input": "_Input_3pq3z_1", "Input-label": "_Input-label_3pq3z_26", "Input-labelIcon": "_Input-labelIcon_3pq3z_35", "Input-disabledIcon": "_Input-disabledIcon_3pq3z_42", "Input-input": "_Input-input_3pq3z_47", "Input--readOnly": "_Input--readOnly_3pq3z_91", "Input-radioGroupItems": "_Input-radioGroupItems_3pq3z_102", "Input-radio": "_Input-radio_3pq3z_102", "Input-radioInner": "_Input-radioInner_3pq3z_119", "Input-radioInput": "_Input-radioInput_3pq3z_164" };
279
+ var styles_module_default2 = { "InputWrapper": "_InputWrapper_1l5m8_1", "Input": "_Input_1l5m8_1", "Input-label": "_Input-label_1l5m8_26", "Input-labelIcon": "_Input-labelIcon_1l5m8_35", "Input-disabledIcon": "_Input-disabledIcon_1l5m8_42", "Input-input": "_Input-input_1l5m8_47", "Input--readOnly": "_Input--readOnly_1l5m8_91", "Input-radioGroupItems": "_Input-radioGroupItems_1l5m8_102", "Input-radio": "_Input-radio_1l5m8_102", "Input-radioInner": "_Input-radioInner_1l5m8_119", "Input-radioInput": "_Input-radioInput_1l5m8_164" };
280
280
 
281
281
  // components/AutoField/index.tsx
282
282
  var import_react13 = require("react");
@@ -1071,7 +1071,8 @@ var defaultAppState = {
1071
1071
  },
1072
1072
  options: [],
1073
1073
  controlsVisible: true
1074
- }
1074
+ },
1075
+ field: { focus: null }
1075
1076
  }
1076
1077
  };
1077
1078
  var defaultContext = {
@@ -1415,11 +1416,13 @@ var ArrayField = ({
1415
1416
  event.source.index,
1416
1417
  (_b = event.destination) == null ? void 0 : _b.index
1417
1418
  );
1418
- onChange(newValue, {
1419
+ const newUi = {
1419
1420
  arrayState: __spreadProps(__spreadValues({}, state.ui.arrayState), {
1420
1421
  [id]: __spreadProps(__spreadValues({}, arrayState), { items: newArrayStateItems })
1421
1422
  })
1422
- });
1423
+ };
1424
+ setUi(newUi, false);
1425
+ onChange(newValue, newUi);
1423
1426
  setLocalState({
1424
1427
  value: newValue,
1425
1428
  arrayState: __spreadProps(__spreadValues({}, arrayState), { items: newArrayStateItems })
@@ -1485,32 +1488,60 @@ var ArrayField = ({
1485
1488
  children: [
1486
1489
  field.getItemSummary ? field.getItemSummary(data, i) : `Item #${_originalIndex}`,
1487
1490
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: getClassNameItem("rhs"), children: [
1488
- !readOnly && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: getClassNameItem("actions"), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: getClassNameItem("action"), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1489
- IconButton,
1490
- {
1491
- type: "button",
1492
- disabled: field.min !== void 0 && field.min >= localState.arrayState.items.length,
1493
- onClick: (e) => {
1494
- e.stopPropagation();
1495
- const existingValue = [
1496
- ...value || []
1497
- ];
1498
- const existingItems = [
1499
- ...arrayState.items || []
1500
- ];
1501
- existingValue.splice(i, 1);
1502
- existingItems.splice(i, 1);
1503
- onChange(
1504
- existingValue,
1505
- mapArrayStateToUi({
1506
- items: existingItems
1507
- })
1508
- );
1509
- },
1510
- title: "Delete",
1511
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Trash, { size: 16 })
1512
- }
1513
- ) }) }),
1491
+ !readOnly && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: getClassNameItem("actions"), children: [
1492
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: getClassNameItem("action"), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1493
+ IconButton,
1494
+ {
1495
+ type: "button",
1496
+ disabled: !!addDisabled,
1497
+ onClick: (e) => {
1498
+ e.stopPropagation();
1499
+ const existingValue = [
1500
+ ...value || []
1501
+ ];
1502
+ existingValue.splice(
1503
+ i,
1504
+ 0,
1505
+ existingValue[i]
1506
+ );
1507
+ onChange(
1508
+ existingValue,
1509
+ mapArrayStateToUi(
1510
+ regenerateArrayState(existingValue)
1511
+ )
1512
+ );
1513
+ },
1514
+ title: "Duplicate",
1515
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Copy, { size: 16 })
1516
+ }
1517
+ ) }),
1518
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: getClassNameItem("action"), children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1519
+ IconButton,
1520
+ {
1521
+ type: "button",
1522
+ disabled: field.min !== void 0 && field.min >= localState.arrayState.items.length,
1523
+ onClick: (e) => {
1524
+ e.stopPropagation();
1525
+ const existingValue = [
1526
+ ...value || []
1527
+ ];
1528
+ const existingItems = [
1529
+ ...arrayState.items || []
1530
+ ];
1531
+ existingValue.splice(i, 1);
1532
+ existingItems.splice(i, 1);
1533
+ onChange(
1534
+ existingValue,
1535
+ mapArrayStateToUi({
1536
+ items: existingItems
1537
+ })
1538
+ );
1539
+ },
1540
+ title: "Delete",
1541
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Trash, { size: 16 })
1542
+ }
1543
+ ) })
1544
+ ] }),
1514
1545
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(DragIcon, {}) })
1515
1546
  ] })
1516
1547
  ]
@@ -1607,7 +1638,7 @@ var DefaultField = ({
1607
1638
  autoComplete: "off",
1608
1639
  type: field.type,
1609
1640
  name,
1610
- value: typeof value === "undefined" ? "" : value,
1641
+ value: typeof value === "undefined" ? "" : value.toString(),
1611
1642
  onChange: (e) => {
1612
1643
  if (field.type === "number") {
1613
1644
  onChange(Number(e.currentTarget.value));
@@ -1636,7 +1667,7 @@ var import_react10 = require("react");
1636
1667
 
1637
1668
  // css-module:/home/runner/work/puck/puck/packages/core/components/ExternalInput/styles.module.css#css-module
1638
1669
  init_react_import();
1639
- var styles_module_default6 = { "ExternalInput-actions": "_ExternalInput-actions_wprq3_1", "ExternalInput-button": "_ExternalInput-button_wprq3_5", "ExternalInput--dataSelected": "_ExternalInput--dataSelected_wprq3_24", "ExternalInput--readOnly": "_ExternalInput--readOnly_wprq3_31", "ExternalInput-detachButton": "_ExternalInput-detachButton_wprq3_35", "ExternalInput": "_ExternalInput_wprq3_1", "ExternalInputModal": "_ExternalInputModal_wprq3_79", "ExternalInputModal-grid": "_ExternalInputModal-grid_wprq3_89", "ExternalInputModal--filtersToggled": "_ExternalInputModal--filtersToggled_wprq3_100", "ExternalInputModal-filters": "_ExternalInputModal-filters_wprq3_105", "ExternalInputModal-masthead": "_ExternalInputModal-masthead_wprq3_124", "ExternalInputModal-tableWrapper": "_ExternalInputModal-tableWrapper_wprq3_133", "ExternalInputModal-table": "_ExternalInputModal-table_wprq3_133", "ExternalInputModal-thead": "_ExternalInputModal-thead_wprq3_149", "ExternalInputModal-th": "_ExternalInputModal-th_wprq3_149", "ExternalInputModal-td": "_ExternalInputModal-td_wprq3_164", "ExternalInputModal-tr": "_ExternalInputModal-tr_wprq3_169", "ExternalInputModal-tbody": "_ExternalInputModal-tbody_wprq3_176", "ExternalInputModal--hasData": "_ExternalInputModal--hasData_wprq3_202", "ExternalInputModal-loadingBanner": "_ExternalInputModal-loadingBanner_wprq3_206", "ExternalInputModal--isLoading": "_ExternalInputModal--isLoading_wprq3_223", "ExternalInputModal-searchForm": "_ExternalInputModal-searchForm_wprq3_227", "ExternalInputModal-search": "_ExternalInputModal-search_wprq3_227", "ExternalInputModal-searchIcon": "_ExternalInputModal-searchIcon_wprq3_264", "ExternalInputModal-searchIconText": "_ExternalInputModal-searchIconText_wprq3_289", "ExternalInputModal-searchInput": "_ExternalInputModal-searchInput_wprq3_299", "ExternalInputModal-searchActions": "_ExternalInputModal-searchActions_wprq3_313", "ExternalInputModal-searchActionIcon": "_ExternalInputModal-searchActionIcon_wprq3_326", "ExternalInputModal-footer": "_ExternalInputModal-footer_wprq3_330" };
1670
+ var styles_module_default6 = { "ExternalInput-actions": "_ExternalInput-actions_8wgzm_1", "ExternalInput-button": "_ExternalInput-button_8wgzm_5", "ExternalInput--dataSelected": "_ExternalInput--dataSelected_8wgzm_24", "ExternalInput--readOnly": "_ExternalInput--readOnly_8wgzm_31", "ExternalInput-detachButton": "_ExternalInput-detachButton_8wgzm_35", "ExternalInput": "_ExternalInput_8wgzm_1", "ExternalInputModal": "_ExternalInputModal_8wgzm_79", "ExternalInputModal-grid": "_ExternalInputModal-grid_8wgzm_89", "ExternalInputModal--filtersToggled": "_ExternalInputModal--filtersToggled_8wgzm_100", "ExternalInputModal-filters": "_ExternalInputModal-filters_8wgzm_105", "ExternalInputModal-masthead": "_ExternalInputModal-masthead_8wgzm_124", "ExternalInputModal-tableWrapper": "_ExternalInputModal-tableWrapper_8wgzm_133", "ExternalInputModal-table": "_ExternalInputModal-table_8wgzm_133", "ExternalInputModal-thead": "_ExternalInputModal-thead_8wgzm_149", "ExternalInputModal-th": "_ExternalInputModal-th_8wgzm_149", "ExternalInputModal-td": "_ExternalInputModal-td_8wgzm_164", "ExternalInputModal-tr": "_ExternalInputModal-tr_8wgzm_169", "ExternalInputModal-tbody": "_ExternalInputModal-tbody_8wgzm_176", "ExternalInputModal--hasData": "_ExternalInputModal--hasData_8wgzm_202", "ExternalInputModal-loadingBanner": "_ExternalInputModal-loadingBanner_8wgzm_206", "ExternalInputModal--isLoading": "_ExternalInputModal--isLoading_8wgzm_223", "ExternalInputModal-searchForm": "_ExternalInputModal-searchForm_8wgzm_227", "ExternalInputModal-search": "_ExternalInputModal-search_8wgzm_227", "ExternalInputModal-searchIcon": "_ExternalInputModal-searchIcon_8wgzm_264", "ExternalInputModal-searchIconText": "_ExternalInputModal-searchIconText_8wgzm_289", "ExternalInputModal-searchInput": "_ExternalInputModal-searchInput_8wgzm_299", "ExternalInputModal-searchActions": "_ExternalInputModal-searchActions_8wgzm_313", "ExternalInputModal-searchActionIcon": "_ExternalInputModal-searchActionIcon_8wgzm_326", "ExternalInputModal-footerContainer": "_ExternalInputModal-footerContainer_8wgzm_330", "ExternalInputModal-footer": "_ExternalInputModal-footer_8wgzm_330" };
1640
1671
 
1641
1672
  // components/Modal/index.tsx
1642
1673
  init_react_import();
@@ -1793,7 +1824,7 @@ var ExternalInput = ({
1793
1824
  const validKeys = /* @__PURE__ */ new Set();
1794
1825
  for (const item of mappedData) {
1795
1826
  for (const key of Object.keys(item)) {
1796
- if (typeof item[key] === "string" || typeof item[key] === "number") {
1827
+ if (typeof item[key] === "string" || typeof item[key] === "number" || (0, import_react10.isValidElement)(item[key])) {
1797
1828
  validKeys.add(key);
1798
1829
  }
1799
1830
  }
@@ -1814,6 +1845,14 @@ var ExternalInput = ({
1814
1845
  }),
1815
1846
  [id, field]
1816
1847
  );
1848
+ const Footer = (0, import_react10.useCallback)(
1849
+ (props) => field.renderFooter ? field.renderFooter(props) : /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: getClassNameModal("footer"), children: [
1850
+ props.items.length,
1851
+ " result",
1852
+ props.items.length === 1 ? "" : "s"
1853
+ ] }),
1854
+ [field.renderFooter]
1855
+ );
1817
1856
  (0, import_react10.useEffect)(() => {
1818
1857
  search(searchQuery, filters);
1819
1858
  }, []);
@@ -1953,11 +1992,7 @@ var ExternalInput = ({
1953
1992
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: getClassNameModal("loadingBanner"), children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Loader, { size: 24 }) })
1954
1993
  ] })
1955
1994
  ] }),
1956
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: getClassNameModal("footer"), children: [
1957
- mappedData.length,
1958
- " result",
1959
- mappedData.length === 1 ? "" : "s"
1960
- ] })
1995
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: getClassNameModal("footerContainer"), children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Footer, { items: mappedData }) })
1961
1996
  ]
1962
1997
  }
1963
1998
  ) })
@@ -2237,6 +2272,7 @@ var useSafeId = () => {
2237
2272
  // components/AutoField/index.tsx
2238
2273
  var import_jsx_runtime20 = require("react/jsx-runtime");
2239
2274
  var getClassName15 = get_class_name_factory_default("Input", styles_module_default2);
2275
+ var getClassNameWrapper = get_class_name_factory_default("InputWrapper", styles_module_default2);
2240
2276
  var FieldLabel = ({
2241
2277
  children,
2242
2278
  icon,
@@ -2284,7 +2320,7 @@ var FieldLabelInternal2 = ({
2284
2320
  };
2285
2321
  function AutoFieldInternal(props) {
2286
2322
  var _a, _b, _c, _d, _e, _f, _g, _h;
2287
- const { overrides } = useAppContext();
2323
+ const { dispatch, overrides } = useAppContext();
2288
2324
  const { id, Label = FieldLabelInternal2 } = props;
2289
2325
  const field = props.field;
2290
2326
  const label = field.label;
@@ -2316,23 +2352,45 @@ function AutoFieldInternal(props) {
2316
2352
  Label,
2317
2353
  id: resolvedId
2318
2354
  });
2355
+ const onFocus = (0, import_react13.useCallback)(
2356
+ (e) => {
2357
+ if (mergedProps.name && e.target.nodeName === "INPUT") {
2358
+ e.stopPropagation();
2359
+ dispatch({
2360
+ type: "setUi",
2361
+ ui: {
2362
+ field: { focus: mergedProps.name }
2363
+ }
2364
+ });
2365
+ }
2366
+ },
2367
+ [mergedProps.name]
2368
+ );
2369
+ const onBlur = (0, import_react13.useCallback)((e) => {
2370
+ if ("name" in e.target) {
2371
+ dispatch({
2372
+ type: "setUi",
2373
+ ui: {
2374
+ field: { focus: null }
2375
+ }
2376
+ });
2377
+ }
2378
+ }, []);
2319
2379
  if (field.type === "custom") {
2320
2380
  if (!field.render) {
2321
2381
  return null;
2322
2382
  }
2323
2383
  const CustomField = field.render;
2324
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: getClassName15(), children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CustomField, __spreadValues({}, mergedProps)) });
2384
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: getClassNameWrapper(), onFocus, onBlur, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: getClassName15(), children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CustomField, __spreadValues({}, mergedProps)) }) });
2325
2385
  }
2326
2386
  const children = defaultFields[field.type](mergedProps);
2327
2387
  const Render2 = render[field.type];
2328
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Render2, __spreadProps(__spreadValues({}, mergedProps), { children }));
2388
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: getClassNameWrapper(), onFocus, onBlur, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Render2, __spreadProps(__spreadValues({}, mergedProps), { children })) });
2329
2389
  }
2330
- var RECENT_CHANGE_TIMEOUT = 200;
2331
2390
  function AutoFieldPrivate(props) {
2391
+ const { state } = useAppContext();
2332
2392
  const { value, onChange } = props;
2333
2393
  const [localValue, setLocalValue] = (0, import_react13.useState)(value);
2334
- const [recentlyChanged, setRecentlyChanged] = (0, import_react13.useState)(false);
2335
- const timeoutRef = (0, import_react13.useRef)();
2336
2394
  const onChangeDb = (0, import_use_debounce.useDebouncedCallback)(
2337
2395
  (val, ui) => {
2338
2396
  onChange(val, ui);
@@ -2342,15 +2400,10 @@ function AutoFieldPrivate(props) {
2342
2400
  );
2343
2401
  const onChangeLocal = (0, import_react13.useCallback)((val, ui) => {
2344
2402
  setLocalValue(val);
2345
- setRecentlyChanged(true);
2346
- clearTimeout(timeoutRef.current);
2347
- timeoutRef.current = setTimeout(() => {
2348
- setRecentlyChanged(false);
2349
- }, RECENT_CHANGE_TIMEOUT);
2350
2403
  onChangeDb(val, ui);
2351
2404
  }, []);
2352
2405
  (0, import_react13.useEffect)(() => {
2353
- if (!recentlyChanged) {
2406
+ if (state.ui.field.focus !== props.name) {
2354
2407
  setLocalValue(value);
2355
2408
  }
2356
2409
  }, [value]);
@@ -3075,7 +3128,7 @@ function DropZone(props) {
3075
3128
 
3076
3129
  // components/Puck/index.tsx
3077
3130
  init_react_import();
3078
- var import_react32 = require("react");
3131
+ var import_react33 = require("react");
3079
3132
 
3080
3133
  // lib/use-placeholder-style.ts
3081
3134
  init_react_import();
@@ -3682,7 +3735,23 @@ init_react_import();
3682
3735
  var styles_module_default16 = { "PuckFields": "_PuckFields_jp3lw_1", "PuckFields--isLoading": "_PuckFields--isLoading_jp3lw_6", "PuckFields-loadingOverlay": "_PuckFields-loadingOverlay_jp3lw_10", "PuckFields-loadingOverlayInner": "_PuckFields-loadingOverlayInner_jp3lw_25" };
3683
3736
 
3684
3737
  // components/Puck/components/Fields/index.tsx
3738
+ var import_react22 = require("react");
3739
+
3740
+ // lib/use-parent.ts
3741
+ init_react_import();
3685
3742
  var import_react21 = require("react");
3743
+ var useParent = (itemSelector) => {
3744
+ var _a;
3745
+ const { selectedItem, state } = useAppContext();
3746
+ const { pathData } = (0, import_react21.useContext)(dropZoneContext) || {};
3747
+ const item = itemSelector ? getItem(itemSelector, state.data) : selectedItem;
3748
+ const breadcrumbs = convertPathDataToBreadcrumbs(item, pathData, state.data);
3749
+ const lastItem = breadcrumbs[breadcrumbs.length - 1];
3750
+ const parent = (lastItem == null ? void 0 : lastItem.selector) ? (_a = getItem(lastItem.selector, state.data)) != null ? _a : null : null;
3751
+ return parent || null;
3752
+ };
3753
+
3754
+ // components/Puck/components/Fields/index.tsx
3686
3755
  var import_jsx_runtime27 = require("react/jsx-runtime");
3687
3756
  var getClassName21 = get_class_name_factory_default("PuckFields", styles_module_default16);
3688
3757
  var defaultPageFields = {
@@ -3696,23 +3765,24 @@ var DefaultFields = ({
3696
3765
  var useResolvedFields = () => {
3697
3766
  var _a, _b;
3698
3767
  const { selectedItem, state, config } = useAppContext();
3768
+ const parent = useParent();
3699
3769
  const { data } = state;
3700
3770
  const rootFields = ((_a = config.root) == null ? void 0 : _a.fields) || defaultPageFields;
3701
3771
  const componentConfig = selectedItem ? config.components[selectedItem.type] : null;
3702
- const defaultFields = (0, import_react21.useMemo)(
3772
+ const defaultFields = (0, import_react22.useMemo)(
3703
3773
  () => (selectedItem ? componentConfig == null ? void 0 : componentConfig.fields : rootFields) || {},
3704
3774
  [selectedItem, rootFields, componentConfig == null ? void 0 : componentConfig.fields]
3705
3775
  );
3706
3776
  const rootProps = data.root.props || data.root;
3707
- const [lastSelectedData, setLastSelectedData] = (0, import_react21.useState)({});
3708
- const [resolvedFields, setResolvedFields] = (0, import_react21.useState)(defaultFields);
3709
- const [fieldsLoading, setFieldsLoading] = (0, import_react21.useState)(false);
3777
+ const [lastSelectedData, setLastSelectedData] = (0, import_react22.useState)({});
3778
+ const [resolvedFields, setResolvedFields] = (0, import_react22.useState)(defaultFields);
3779
+ const [fieldsLoading, setFieldsLoading] = (0, import_react22.useState)(false);
3710
3780
  const defaultResolveFields = (_componentData, _params) => defaultFields;
3711
3781
  const componentData = selectedItem ? selectedItem : { props: rootProps, readOnly: data.root.readOnly };
3712
3782
  const hasComponentResolver = selectedItem && (componentConfig == null ? void 0 : componentConfig.resolveFields);
3713
3783
  const hasRootResolver = !selectedItem && ((_b = config.root) == null ? void 0 : _b.resolveFields);
3714
3784
  const hasResolver = hasComponentResolver || hasRootResolver;
3715
- const resolveFields = (0, import_react21.useCallback)(
3785
+ const resolveFields = (0, import_react22.useCallback)(
3716
3786
  (..._0) => __async(void 0, [..._0], function* (fields = {}) {
3717
3787
  var _a2;
3718
3788
  const lastData = ((_a2 = lastSelectedData.props) == null ? void 0 : _a2.id) === componentData.props.id ? lastSelectedData : null;
@@ -3726,7 +3796,8 @@ var useResolvedFields = () => {
3726
3796
  fields,
3727
3797
  lastFields: resolvedFields,
3728
3798
  lastData,
3729
- appState: state
3799
+ appState: state,
3800
+ parent
3730
3801
  }
3731
3802
  );
3732
3803
  }
@@ -3736,7 +3807,8 @@ var useResolvedFields = () => {
3736
3807
  fields,
3737
3808
  lastFields: resolvedFields,
3738
3809
  lastData,
3739
- appState: state
3810
+ appState: state,
3811
+ parent
3740
3812
  });
3741
3813
  }
3742
3814
  return defaultResolveFields(componentData, {
@@ -3748,7 +3820,7 @@ var useResolvedFields = () => {
3748
3820
  }),
3749
3821
  [data, config, componentData, selectedItem, resolvedFields, state]
3750
3822
  );
3751
- (0, import_react21.useEffect)(() => {
3823
+ (0, import_react22.useEffect)(() => {
3752
3824
  if (hasResolver) {
3753
3825
  setFieldsLoading(true);
3754
3826
  resolveFields(defaultFields).then((fields) => {
@@ -3758,7 +3830,7 @@ var useResolvedFields = () => {
3758
3830
  } else {
3759
3831
  setResolvedFields(defaultFields);
3760
3832
  }
3761
- }, [data, defaultFields, state.ui.itemSelector, hasResolver]);
3833
+ }, [data, defaultFields, selectedItem, hasResolver]);
3762
3834
  return [resolvedFields, fieldsLoading];
3763
3835
  };
3764
3836
  var Fields = () => {
@@ -3779,7 +3851,7 @@ var Fields = () => {
3779
3851
  const componentResolving = selectedItem ? ((_a = componentState[selectedItem == null ? void 0 : selectedItem.props.id]) == null ? void 0 : _a.loadingCount) > 0 : ((_b = componentState["puck-root"]) == null ? void 0 : _b.loadingCount) > 0;
3780
3852
  const isLoading = fieldsResolving || componentResolving;
3781
3853
  const rootProps = data.root.props || data.root;
3782
- const Wrapper = (0, import_react21.useMemo)(() => overrides.fields || DefaultFields, [overrides]);
3854
+ const Wrapper = (0, import_react22.useMemo)(() => overrides.fields || DefaultFields, [overrides]);
3783
3855
  return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
3784
3856
  "form",
3785
3857
  {
@@ -3900,7 +3972,7 @@ init_react_import();
3900
3972
 
3901
3973
  // lib/use-component-list.tsx
3902
3974
  init_react_import();
3903
- var import_react22 = require("react");
3975
+ var import_react23 = require("react");
3904
3976
 
3905
3977
  // components/ComponentList/index.tsx
3906
3978
  init_react_import();
@@ -3978,8 +4050,8 @@ ComponentList.Item = ComponentListItem;
3978
4050
  // lib/use-component-list.tsx
3979
4051
  var import_jsx_runtime29 = require("react/jsx-runtime");
3980
4052
  var useComponentList = (config, ui) => {
3981
- const [componentList, setComponentList] = (0, import_react22.useState)();
3982
- (0, import_react22.useEffect)(() => {
4053
+ const [componentList, setComponentList] = (0, import_react23.useState)();
4054
+ (0, import_react23.useEffect)(() => {
3983
4055
  var _a, _b, _c;
3984
4056
  if (Object.keys(ui.componentList).length > 0) {
3985
4057
  const matchedComponents = [];
@@ -4048,22 +4120,22 @@ var useComponentList = (config, ui) => {
4048
4120
  };
4049
4121
 
4050
4122
  // components/Puck/components/Components/index.tsx
4051
- var import_react23 = require("react");
4123
+ var import_react24 = require("react");
4052
4124
  var import_jsx_runtime30 = require("react/jsx-runtime");
4053
4125
  var Components = () => {
4054
4126
  const { config, state, overrides } = useAppContext();
4055
4127
  const componentList = useComponentList(config, state.ui);
4056
- const Wrapper = (0, import_react23.useMemo)(() => overrides.components || "div", [overrides]);
4128
+ const Wrapper = (0, import_react24.useMemo)(() => overrides.components || "div", [overrides]);
4057
4129
  return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Wrapper, { children: componentList ? componentList : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(ComponentList, { id: "all" }) });
4058
4130
  };
4059
4131
 
4060
4132
  // components/Puck/components/Preview/index.tsx
4061
4133
  init_react_import();
4062
- var import_react25 = require("react");
4134
+ var import_react26 = require("react");
4063
4135
 
4064
4136
  // components/AutoFrame/index.tsx
4065
4137
  init_react_import();
4066
- var import_react24 = require("react");
4138
+ var import_react25 = require("react");
4067
4139
  var import_object_hash = __toESM(require("object-hash"));
4068
4140
  var import_react_dom2 = require("react-dom");
4069
4141
  var import_jsx_runtime31 = require("react/jsx-runtime");
@@ -4109,7 +4181,7 @@ var CopyHostStyles = ({
4109
4181
  onStylesLoaded = () => null
4110
4182
  }) => {
4111
4183
  const { document: doc, window: win } = useFrame();
4112
- (0, import_react24.useEffect)(() => {
4184
+ (0, import_react25.useEffect)(() => {
4113
4185
  if (!win || !doc) {
4114
4186
  return () => {
4115
4187
  };
@@ -4268,8 +4340,8 @@ var CopyHostStyles = ({
4268
4340
  }, []);
4269
4341
  return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_jsx_runtime31.Fragment, { children });
4270
4342
  };
4271
- var autoFrameContext = (0, import_react24.createContext)({});
4272
- var useFrame = () => (0, import_react24.useContext)(autoFrameContext);
4343
+ var autoFrameContext = (0, import_react25.createContext)({});
4344
+ var useFrame = () => (0, import_react25.useContext)(autoFrameContext);
4273
4345
  function AutoFrame(_a) {
4274
4346
  var _b = _a, {
4275
4347
  children,
@@ -4284,11 +4356,11 @@ function AutoFrame(_a) {
4284
4356
  "id",
4285
4357
  "onStylesLoaded"
4286
4358
  ]);
4287
- const [loaded, setLoaded] = (0, import_react24.useState)(false);
4288
- const [ctx, setCtx] = (0, import_react24.useState)({});
4289
- const ref = (0, import_react24.useRef)(null);
4290
- const [mountTarget, setMountTarget] = (0, import_react24.useState)();
4291
- (0, import_react24.useEffect)(() => {
4359
+ const [loaded, setLoaded] = (0, import_react25.useState)(false);
4360
+ const [ctx, setCtx] = (0, import_react25.useState)({});
4361
+ const ref = (0, import_react25.useRef)(null);
4362
+ const [mountTarget, setMountTarget] = (0, import_react25.useState)();
4363
+ (0, import_react25.useEffect)(() => {
4292
4364
  var _a2;
4293
4365
  if (ref.current) {
4294
4366
  setCtx({
@@ -4324,7 +4396,7 @@ var import_jsx_runtime32 = require("react/jsx-runtime");
4324
4396
  var getClassName23 = get_class_name_factory_default("PuckPreview", styles_module_default18);
4325
4397
  var Preview = ({ id = "puck-preview" }) => {
4326
4398
  const { config, dispatch, state, setStatus, iframe, overrides } = useAppContext();
4327
- const Page = (0, import_react25.useCallback)(
4399
+ const Page = (0, import_react26.useCallback)(
4328
4400
  (pageProps) => {
4329
4401
  var _a, _b;
4330
4402
  return ((_a = config.root) == null ? void 0 : _a.render) ? (_b = config.root) == null ? void 0 : _b.render(__spreadValues({
@@ -4333,7 +4405,7 @@ var Preview = ({ id = "puck-preview" }) => {
4333
4405
  },
4334
4406
  [config.root]
4335
4407
  );
4336
- const Frame = (0, import_react25.useMemo)(() => overrides.iframe, [overrides]);
4408
+ const Frame = (0, import_react26.useMemo)(() => overrides.iframe, [overrides]);
4337
4409
  const rootProps = state.data.root.props || state.data.root;
4338
4410
  return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
4339
4411
  "div",
@@ -4422,7 +4494,7 @@ var scrollIntoView = (el) => {
4422
4494
  };
4423
4495
 
4424
4496
  // components/LayerTree/index.tsx
4425
- var import_react26 = require("react");
4497
+ var import_react27 = require("react");
4426
4498
 
4427
4499
  // lib/is-child-of-zone.ts
4428
4500
  init_react_import();
@@ -4449,7 +4521,7 @@ var LayerTree = ({
4449
4521
  label
4450
4522
  }) => {
4451
4523
  const zones = data.zones || {};
4452
- const ctx = (0, import_react26.useContext)(dropZoneContext);
4524
+ const ctx = (0, import_react27.useContext)(dropZoneContext);
4453
4525
  return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
4454
4526
  label && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: getClassName24("zoneTitle"), children: [
4455
4527
  /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: getClassName24("zoneIcon"), children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Layers, { size: "16" }) }),
@@ -4555,13 +4627,13 @@ var LayerTree = ({
4555
4627
  };
4556
4628
 
4557
4629
  // components/Puck/components/Outline/index.tsx
4558
- var import_react27 = require("react");
4630
+ var import_react28 = require("react");
4559
4631
  var import_jsx_runtime34 = require("react/jsx-runtime");
4560
4632
  var Outline = () => {
4561
4633
  const { dispatch, state, overrides, config } = useAppContext();
4562
4634
  const { data, ui } = state;
4563
4635
  const { itemSelector } = ui;
4564
- const setItemSelector = (0, import_react27.useCallback)(
4636
+ const setItemSelector = (0, import_react28.useCallback)(
4565
4637
  (newItemSelector) => {
4566
4638
  dispatch({
4567
4639
  type: "setUi",
@@ -4570,7 +4642,7 @@ var Outline = () => {
4570
4642
  },
4571
4643
  []
4572
4644
  );
4573
- const Wrapper = (0, import_react27.useMemo)(() => overrides.outline || "div", [overrides]);
4645
+ const Wrapper = (0, import_react28.useMemo)(() => overrides.outline || "div", [overrides]);
4574
4646
  return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Wrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(dropZoneContext.Consumer, { children: (ctx) => /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
4575
4647
  (ctx == null ? void 0 : ctx.activeZones) && (ctx == null ? void 0 : ctx.activeZones[rootDroppableId]) && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
4576
4648
  LayerTree,
@@ -4659,19 +4731,19 @@ function usePuckHistory({
4659
4731
 
4660
4732
  // lib/use-history-store.ts
4661
4733
  init_react_import();
4662
- var import_react28 = require("react");
4734
+ var import_react29 = require("react");
4663
4735
  var import_use_debounce3 = require("use-debounce");
4664
4736
  var EMPTY_HISTORY_INDEX = 0;
4665
4737
  function useHistoryStore(initialHistory) {
4666
4738
  var _a, _b;
4667
- const [histories, setHistories] = (0, import_react28.useState)(
4739
+ const [histories, setHistories] = (0, import_react29.useState)(
4668
4740
  (_a = initialHistory == null ? void 0 : initialHistory.histories) != null ? _a : []
4669
4741
  );
4670
4742
  const updateHistories = (histories2) => {
4671
4743
  setHistories(histories2);
4672
4744
  setIndex(histories2.length - 1);
4673
4745
  };
4674
- const [index, setIndex] = (0, import_react28.useState)(
4746
+ const [index, setIndex] = (0, import_react29.useState)(
4675
4747
  (_b = initialHistory == null ? void 0 : initialHistory.index) != null ? _b : EMPTY_HISTORY_INDEX
4676
4748
  );
4677
4749
  const hasPast = index > EMPTY_HISTORY_INDEX;
@@ -4831,11 +4903,11 @@ var getBox = function getBox2(el) {
4831
4903
  };
4832
4904
 
4833
4905
  // components/Puck/components/Canvas/index.tsx
4834
- var import_react30 = require("react");
4906
+ var import_react31 = require("react");
4835
4907
 
4836
4908
  // components/ViewportControls/index.tsx
4837
4909
  init_react_import();
4838
- var import_react29 = require("react");
4910
+ var import_react30 = require("react");
4839
4911
 
4840
4912
  // css-module:/home/runner/work/puck/puck/packages/core/components/ViewportControls/styles.module.css#css-module
4841
4913
  init_react_import();
@@ -4858,8 +4930,8 @@ var ViewportButton = ({
4858
4930
  onClick
4859
4931
  }) => {
4860
4932
  const { state } = useAppContext();
4861
- const [isActive, setIsActive] = (0, import_react29.useState)(false);
4862
- (0, import_react29.useEffect)(() => {
4933
+ const [isActive, setIsActive] = (0, import_react30.useState)(false);
4934
+ (0, import_react30.useEffect)(() => {
4863
4935
  setIsActive(width === state.ui.viewports.current.width);
4864
4936
  }, [width, state.ui.viewports.current.width]);
4865
4937
  return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: getClassNameButton({ isActive }), children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
@@ -4895,7 +4967,7 @@ var ViewportControls = ({
4895
4967
  const defaultsContainAutoZoom = defaultZoomOptions.find(
4896
4968
  (option) => option.value === autoZoom
4897
4969
  );
4898
- const zoomOptions = (0, import_react29.useMemo)(
4970
+ const zoomOptions = (0, import_react30.useMemo)(
4899
4971
  () => [
4900
4972
  ...defaultZoomOptions,
4901
4973
  ...defaultsContainAutoZoom ? [] : [
@@ -5018,17 +5090,17 @@ var Canvas = () => {
5018
5090
  const { status, iframe } = useAppContext();
5019
5091
  const { dispatch, state, overrides, setUi, zoomConfig, setZoomConfig } = useAppContext();
5020
5092
  const { ui } = state;
5021
- const frameRef = (0, import_react30.useRef)(null);
5022
- const [showTransition, setShowTransition] = (0, import_react30.useState)(false);
5023
- const defaultRender = (0, import_react30.useMemo)(() => {
5093
+ const frameRef = (0, import_react31.useRef)(null);
5094
+ const [showTransition, setShowTransition] = (0, import_react31.useState)(false);
5095
+ const defaultRender = (0, import_react31.useMemo)(() => {
5024
5096
  const PuckDefault = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_jsx_runtime36.Fragment, { children });
5025
5097
  return PuckDefault;
5026
5098
  }, []);
5027
- const CustomPreview = (0, import_react30.useMemo)(
5099
+ const CustomPreview = (0, import_react31.useMemo)(
5028
5100
  () => overrides.preview || defaultRender,
5029
5101
  [overrides]
5030
5102
  );
5031
- const getFrameDimensions = (0, import_react30.useCallback)(() => {
5103
+ const getFrameDimensions = (0, import_react31.useCallback)(() => {
5032
5104
  if (frameRef.current) {
5033
5105
  const frame = frameRef.current;
5034
5106
  const box = getBox(frame);
@@ -5036,7 +5108,7 @@ var Canvas = () => {
5036
5108
  }
5037
5109
  return { width: 0, height: 0 };
5038
5110
  }, [frameRef]);
5039
- const resetAutoZoom = (0, import_react30.useCallback)(
5111
+ const resetAutoZoom = (0, import_react31.useCallback)(
5040
5112
  (ui2 = state.ui) => {
5041
5113
  if (frameRef.current) {
5042
5114
  setZoomConfig(
@@ -5046,11 +5118,11 @@ var Canvas = () => {
5046
5118
  },
5047
5119
  [frameRef, zoomConfig, state.ui]
5048
5120
  );
5049
- (0, import_react30.useEffect)(() => {
5121
+ (0, import_react31.useEffect)(() => {
5050
5122
  setShowTransition(false);
5051
5123
  resetAutoZoom();
5052
5124
  }, [frameRef, ui.leftSideBarVisible, ui.rightSideBarVisible]);
5053
- (0, import_react30.useEffect)(() => {
5125
+ (0, import_react31.useEffect)(() => {
5054
5126
  const { height: frameHeight } = getFrameDimensions();
5055
5127
  if (ui.viewports.current.height === "auto") {
5056
5128
  setZoomConfig(__spreadProps(__spreadValues({}, zoomConfig), {
@@ -5058,13 +5130,13 @@ var Canvas = () => {
5058
5130
  }));
5059
5131
  }
5060
5132
  }, [zoomConfig.zoom]);
5061
- (0, import_react30.useEffect)(() => {
5133
+ (0, import_react31.useEffect)(() => {
5062
5134
  if (ZOOM_ON_CHANGE) {
5063
5135
  setShowTransition(true);
5064
5136
  resetAutoZoom(ui);
5065
5137
  }
5066
5138
  }, [ui.viewports.current.width]);
5067
- (0, import_react30.useEffect)(() => {
5139
+ (0, import_react31.useEffect)(() => {
5068
5140
  const observer = new ResizeObserver(() => {
5069
5141
  setShowTransition(false);
5070
5142
  resetAutoZoom();
@@ -5076,8 +5148,8 @@ var Canvas = () => {
5076
5148
  observer.disconnect();
5077
5149
  };
5078
5150
  }, []);
5079
- const [showLoader, setShowLoader] = (0, import_react30.useState)(false);
5080
- (0, import_react30.useEffect)(() => {
5151
+ const [showLoader, setShowLoader] = (0, import_react31.useState)(false);
5152
+ (0, import_react31.useEffect)(() => {
5081
5153
  setTimeout(() => {
5082
5154
  setShowLoader(true);
5083
5155
  }, 500);
@@ -5180,7 +5252,7 @@ var insertComponent = (componentType, zone, index, {
5180
5252
 
5181
5253
  // lib/use-loaded-overrides.ts
5182
5254
  init_react_import();
5183
- var import_react31 = require("react");
5255
+ var import_react32 = require("react");
5184
5256
 
5185
5257
  // lib/load-overrides.ts
5186
5258
  init_react_import();
@@ -5219,7 +5291,7 @@ var useLoadedOverrides = ({
5219
5291
  overrides,
5220
5292
  plugins
5221
5293
  }) => {
5222
- return (0, import_react31.useMemo)(() => {
5294
+ return (0, import_react32.useMemo)(() => {
5223
5295
  return loadOverrides({ overrides, plugins });
5224
5296
  }, [plugins, overrides]);
5225
5297
  };
@@ -5258,7 +5330,7 @@ function Puck({
5258
5330
  enabled: true,
5259
5331
  waitForStyles: true
5260
5332
  }, _iframe);
5261
- const [generatedAppState] = (0, import_react32.useState)(() => {
5333
+ const [generatedAppState] = (0, import_react33.useState)(() => {
5262
5334
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i;
5263
5335
  const initial = __spreadValues(__spreadValues({}, defaultAppState.ui), initialUi);
5264
5336
  let clientUiState = {};
@@ -5330,22 +5402,22 @@ function Puck({
5330
5402
  histories,
5331
5403
  index: initialHistoryIndex
5332
5404
  });
5333
- const [reducer] = (0, import_react32.useState)(
5405
+ const [reducer] = (0, import_react33.useState)(
5334
5406
  () => createReducer({
5335
5407
  config,
5336
5408
  record: historyStore.record,
5337
5409
  onAction
5338
5410
  })
5339
5411
  );
5340
- const [appState, dispatch] = (0, import_react32.useReducer)(
5412
+ const [appState, dispatch] = (0, import_react33.useReducer)(
5341
5413
  reducer,
5342
5414
  flushZones(initialAppState)
5343
5415
  );
5344
5416
  const { data, ui } = appState;
5345
5417
  const history = usePuckHistory({ dispatch, initialAppState, historyStore });
5346
- const [menuOpen, setMenuOpen] = (0, import_react32.useState)(false);
5418
+ const [menuOpen, setMenuOpen] = (0, import_react33.useState)(false);
5347
5419
  const { itemSelector, leftSideBarVisible, rightSideBarVisible } = ui;
5348
- const setItemSelector = (0, import_react32.useCallback)(
5420
+ const setItemSelector = (0, import_react33.useCallback)(
5349
5421
  (newItemSelector) => {
5350
5422
  if (newItemSelector === itemSelector) return;
5351
5423
  dispatch({
@@ -5357,13 +5429,13 @@ function Puck({
5357
5429
  [itemSelector]
5358
5430
  );
5359
5431
  const selectedItem = itemSelector ? getItem(itemSelector, data) : null;
5360
- (0, import_react32.useEffect)(() => {
5432
+ (0, import_react33.useEffect)(() => {
5361
5433
  if (onChange) onChange(data);
5362
5434
  }, [data]);
5363
5435
  const { onDragStartOrUpdate, placeholderStyle } = usePlaceholderStyle();
5364
- const [draggedItem, setDraggedItem] = (0, import_react32.useState)();
5436
+ const [draggedItem, setDraggedItem] = (0, import_react33.useState)();
5365
5437
  const rootProps = data.root.props || data.root;
5366
- const toggleSidebars = (0, import_react32.useCallback)(
5438
+ const toggleSidebars = (0, import_react33.useCallback)(
5367
5439
  (sidebar) => {
5368
5440
  const widerViewport = window.matchMedia("(min-width: 638px)").matches;
5369
5441
  const sideBarVisible = sidebar === "left" ? leftSideBarVisible : rightSideBarVisible;
@@ -5377,7 +5449,7 @@ function Puck({
5377
5449
  },
5378
5450
  [dispatch, leftSideBarVisible, rightSideBarVisible]
5379
5451
  );
5380
- (0, import_react32.useEffect)(() => {
5452
+ (0, import_react33.useEffect)(() => {
5381
5453
  if (!window.matchMedia("(min-width: 638px)").matches) {
5382
5454
  dispatch({
5383
5455
  type: "setUi",
@@ -5400,7 +5472,7 @@ function Puck({
5400
5472
  window.removeEventListener("resize", handleResize);
5401
5473
  };
5402
5474
  }, []);
5403
- const defaultHeaderRender = (0, import_react32.useMemo)(() => {
5475
+ const defaultHeaderRender = (0, import_react33.useMemo)(() => {
5404
5476
  if (renderHeader) {
5405
5477
  console.warn(
5406
5478
  "`renderHeader` is deprecated. Please use `overrides.header` and the `usePuck` hook instead"
@@ -5414,7 +5486,7 @@ function Puck({
5414
5486
  }
5415
5487
  return DefaultOverride;
5416
5488
  }, [renderHeader]);
5417
- const defaultHeaderActionsRender = (0, import_react32.useMemo)(() => {
5489
+ const defaultHeaderActionsRender = (0, import_react33.useMemo)(() => {
5418
5490
  if (renderHeaderActions) {
5419
5491
  console.warn(
5420
5492
  "`renderHeaderActions` is deprecated. Please use `overrides.headerActions` and the `usePuck` hook instead."
@@ -5431,20 +5503,20 @@ function Puck({
5431
5503
  overrides,
5432
5504
  plugins
5433
5505
  });
5434
- const CustomPuck = (0, import_react32.useMemo)(
5506
+ const CustomPuck = (0, import_react33.useMemo)(
5435
5507
  () => loadedOverrides.puck || DefaultOverride,
5436
5508
  [loadedOverrides]
5437
5509
  );
5438
- const CustomHeader = (0, import_react32.useMemo)(
5510
+ const CustomHeader = (0, import_react33.useMemo)(
5439
5511
  () => loadedOverrides.header || defaultHeaderRender,
5440
5512
  [loadedOverrides]
5441
5513
  );
5442
- const CustomHeaderActions = (0, import_react32.useMemo)(
5514
+ const CustomHeaderActions = (0, import_react33.useMemo)(
5443
5515
  () => loadedOverrides.headerActions || defaultHeaderActionsRender,
5444
5516
  [loadedOverrides]
5445
5517
  );
5446
- const [mounted, setMounted] = (0, import_react32.useState)(false);
5447
- (0, import_react32.useEffect)(() => {
5518
+ const [mounted, setMounted] = (0, import_react33.useState)(false);
5519
+ (0, import_react33.useEffect)(() => {
5448
5520
  setMounted(true);
5449
5521
  }, []);
5450
5522
  const selectedComponentConfig = selectedItem && config.components[selectedItem.type];