@measured/puck 0.17.0-canary.8ea38c3 → 0.17.0-canary.9991c07

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.mjs CHANGED
@@ -178,14 +178,13 @@ init_react_import();
178
178
 
179
179
  // css-module:/home/runner/work/puck/puck/packages/core/components/AutoField/styles.module.css#css-module
180
180
  init_react_import();
181
- 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" };
181
+ 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" };
182
182
 
183
183
  // components/AutoField/index.tsx
184
184
  import {
185
185
  useCallback as useCallback5,
186
186
  useEffect as useEffect9,
187
187
  useMemo as useMemo2,
188
- useRef as useRef2,
189
188
  useState as useState10
190
189
  } from "react";
191
190
 
@@ -880,7 +879,8 @@ var defaultAppState = {
880
879
  },
881
880
  options: [],
882
881
  controlsVisible: true
883
- }
882
+ },
883
+ field: { focus: null }
884
884
  }
885
885
  };
886
886
  var defaultContext = {
@@ -1228,11 +1228,13 @@ var ArrayField = ({
1228
1228
  event.source.index,
1229
1229
  (_b = event.destination) == null ? void 0 : _b.index
1230
1230
  );
1231
- onChange(newValue, {
1231
+ const newUi = {
1232
1232
  arrayState: __spreadProps(__spreadValues({}, state.ui.arrayState), {
1233
1233
  [id]: __spreadProps(__spreadValues({}, arrayState), { items: newArrayStateItems })
1234
1234
  })
1235
- });
1235
+ };
1236
+ setUi(newUi, false);
1237
+ onChange(newValue, newUi);
1236
1238
  setLocalState({
1237
1239
  value: newValue,
1238
1240
  arrayState: __spreadProps(__spreadValues({}, arrayState), { items: newArrayStateItems })
@@ -1298,32 +1300,60 @@ var ArrayField = ({
1298
1300
  children: [
1299
1301
  field.getItemSummary ? field.getItemSummary(data, i) : `Item #${_originalIndex}`,
1300
1302
  /* @__PURE__ */ jsxs4("div", { className: getClassNameItem("rhs"), children: [
1301
- !readOnly && /* @__PURE__ */ jsx9("div", { className: getClassNameItem("actions"), children: /* @__PURE__ */ jsx9("div", { className: getClassNameItem("action"), children: /* @__PURE__ */ jsx9(
1302
- IconButton,
1303
- {
1304
- type: "button",
1305
- disabled: field.min !== void 0 && field.min >= localState.arrayState.items.length,
1306
- onClick: (e) => {
1307
- e.stopPropagation();
1308
- const existingValue = [
1309
- ...value || []
1310
- ];
1311
- const existingItems = [
1312
- ...arrayState.items || []
1313
- ];
1314
- existingValue.splice(i, 1);
1315
- existingItems.splice(i, 1);
1316
- onChange(
1317
- existingValue,
1318
- mapArrayStateToUi({
1319
- items: existingItems
1320
- })
1321
- );
1322
- },
1323
- title: "Delete",
1324
- children: /* @__PURE__ */ jsx9(Trash, { size: 16 })
1325
- }
1326
- ) }) }),
1303
+ !readOnly && /* @__PURE__ */ jsxs4("div", { className: getClassNameItem("actions"), children: [
1304
+ /* @__PURE__ */ jsx9("div", { className: getClassNameItem("action"), children: /* @__PURE__ */ jsx9(
1305
+ IconButton,
1306
+ {
1307
+ type: "button",
1308
+ disabled: !!addDisabled,
1309
+ onClick: (e) => {
1310
+ e.stopPropagation();
1311
+ const existingValue = [
1312
+ ...value || []
1313
+ ];
1314
+ existingValue.splice(
1315
+ i,
1316
+ 0,
1317
+ existingValue[i]
1318
+ );
1319
+ onChange(
1320
+ existingValue,
1321
+ mapArrayStateToUi(
1322
+ regenerateArrayState(existingValue)
1323
+ )
1324
+ );
1325
+ },
1326
+ title: "Duplicate",
1327
+ children: /* @__PURE__ */ jsx9(Copy, { size: 16 })
1328
+ }
1329
+ ) }),
1330
+ /* @__PURE__ */ jsx9("div", { className: getClassNameItem("action"), children: /* @__PURE__ */ jsx9(
1331
+ IconButton,
1332
+ {
1333
+ type: "button",
1334
+ disabled: field.min !== void 0 && field.min >= localState.arrayState.items.length,
1335
+ onClick: (e) => {
1336
+ e.stopPropagation();
1337
+ const existingValue = [
1338
+ ...value || []
1339
+ ];
1340
+ const existingItems = [
1341
+ ...arrayState.items || []
1342
+ ];
1343
+ existingValue.splice(i, 1);
1344
+ existingItems.splice(i, 1);
1345
+ onChange(
1346
+ existingValue,
1347
+ mapArrayStateToUi({
1348
+ items: existingItems
1349
+ })
1350
+ );
1351
+ },
1352
+ title: "Delete",
1353
+ children: /* @__PURE__ */ jsx9(Trash, { size: 16 })
1354
+ }
1355
+ ) })
1356
+ ] }),
1327
1357
  /* @__PURE__ */ jsx9("div", { children: /* @__PURE__ */ jsx9(DragIcon, {}) })
1328
1358
  ] })
1329
1359
  ]
@@ -1419,6 +1449,7 @@ var DefaultField = ({
1419
1449
  className: getClassName6("input"),
1420
1450
  autoComplete: "off",
1421
1451
  type: field.type,
1452
+ title: label || name,
1422
1453
  name,
1423
1454
  value: typeof value === "undefined" ? "" : value.toString(),
1424
1455
  onChange: (e) => {
@@ -1455,7 +1486,7 @@ import {
1455
1486
 
1456
1487
  // css-module:/home/runner/work/puck/puck/packages/core/components/ExternalInput/styles.module.css#css-module
1457
1488
  init_react_import();
1458
- 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" };
1489
+ 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" };
1459
1490
 
1460
1491
  // components/Modal/index.tsx
1461
1492
  init_react_import();
@@ -1633,6 +1664,14 @@ var ExternalInput = ({
1633
1664
  }),
1634
1665
  [id, field]
1635
1666
  );
1667
+ const Footer = useCallback4(
1668
+ (props) => field.renderFooter ? field.renderFooter(props) : /* @__PURE__ */ jsxs7("span", { className: getClassNameModal("footer"), children: [
1669
+ props.items.length,
1670
+ " result",
1671
+ props.items.length === 1 ? "" : "s"
1672
+ ] }),
1673
+ [field.renderFooter]
1674
+ );
1636
1675
  useEffect7(() => {
1637
1676
  search(searchQuery, filters);
1638
1677
  }, []);
@@ -1772,11 +1811,7 @@ var ExternalInput = ({
1772
1811
  /* @__PURE__ */ jsx14("div", { className: getClassNameModal("loadingBanner"), children: /* @__PURE__ */ jsx14(Loader, { size: 24 }) })
1773
1812
  ] })
1774
1813
  ] }),
1775
- /* @__PURE__ */ jsxs7("div", { className: getClassNameModal("footer"), children: [
1776
- mappedData.length,
1777
- " result",
1778
- mappedData.length === 1 ? "" : "s"
1779
- ] })
1814
+ /* @__PURE__ */ jsx14("div", { className: getClassNameModal("footerContainer"), children: /* @__PURE__ */ jsx14(Footer, { items: mappedData }) })
1780
1815
  ]
1781
1816
  }
1782
1817
  ) })
@@ -1835,6 +1870,19 @@ var ExternalField = ({
1835
1870
 
1836
1871
  // components/AutoField/fields/RadioField/index.tsx
1837
1872
  init_react_import();
1873
+
1874
+ // lib/safe-json-parse.ts
1875
+ init_react_import();
1876
+ var safeJsonParse = (str) => {
1877
+ try {
1878
+ const jsonValue = JSON.parse(str);
1879
+ return jsonValue;
1880
+ } catch (e) {
1881
+ return str;
1882
+ }
1883
+ };
1884
+
1885
+ // components/AutoField/fields/RadioField/index.tsx
1838
1886
  import { jsx as jsx16, jsxs as jsxs8 } from "react/jsx-runtime";
1839
1887
  var getClassName11 = get_class_name_factory_default("Input", styles_module_default2);
1840
1888
  var RadioField = ({
@@ -1869,13 +1917,7 @@ var RadioField = ({
1869
1917
  className: getClassName11("radioInput"),
1870
1918
  value: option.value,
1871
1919
  name,
1872
- onChange: (e) => {
1873
- if (e.currentTarget.value === "true" || e.currentTarget.value === "false") {
1874
- onChange(JSON.parse(e.currentTarget.value));
1875
- return;
1876
- }
1877
- onChange(e.currentTarget.value);
1878
- },
1920
+ onChange: ({ target: { value: value2 } }) => onChange(safeJsonParse(value2) || value2),
1879
1921
  disabled: readOnly,
1880
1922
  checked: value === option.value
1881
1923
  }
@@ -1916,15 +1958,10 @@ var SelectField = ({
1916
1958
  "select",
1917
1959
  {
1918
1960
  id,
1961
+ title: label || name,
1919
1962
  className: getClassName12("input"),
1920
1963
  disabled: readOnly,
1921
- onChange: (e) => {
1922
- if (e.currentTarget.value === "true" || e.currentTarget.value === "false") {
1923
- onChange(JSON.parse(e.currentTarget.value));
1924
- return;
1925
- }
1926
- onChange(e.currentTarget.value);
1927
- },
1964
+ onChange: ({ target: { value: value2 } }) => onChange(safeJsonParse(value2) || value2),
1928
1965
  value,
1929
1966
  children: field.options.map((option) => /* @__PURE__ */ jsx17(
1930
1967
  "option",
@@ -2056,6 +2093,7 @@ var useSafeId = () => {
2056
2093
  // components/AutoField/index.tsx
2057
2094
  import { Fragment as Fragment8, jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
2058
2095
  var getClassName15 = get_class_name_factory_default("Input", styles_module_default2);
2096
+ var getClassNameWrapper = get_class_name_factory_default("InputWrapper", styles_module_default2);
2059
2097
  var FieldLabel = ({
2060
2098
  children,
2061
2099
  icon,
@@ -2103,7 +2141,7 @@ var FieldLabelInternal2 = ({
2103
2141
  };
2104
2142
  function AutoFieldInternal(props) {
2105
2143
  var _a, _b, _c, _d, _e, _f, _g, _h;
2106
- const { overrides } = useAppContext();
2144
+ const { dispatch, overrides } = useAppContext();
2107
2145
  const { id, Label = FieldLabelInternal2 } = props;
2108
2146
  const field = props.field;
2109
2147
  const label = field.label;
@@ -2135,23 +2173,56 @@ function AutoFieldInternal(props) {
2135
2173
  Label,
2136
2174
  id: resolvedId
2137
2175
  });
2176
+ const onFocus = useCallback5(
2177
+ (e) => {
2178
+ if (mergedProps.name && e.target.nodeName === "INPUT") {
2179
+ e.stopPropagation();
2180
+ dispatch({
2181
+ type: "setUi",
2182
+ ui: {
2183
+ field: { focus: mergedProps.name }
2184
+ }
2185
+ });
2186
+ }
2187
+ },
2188
+ [mergedProps.name]
2189
+ );
2190
+ const onBlur = useCallback5((e) => {
2191
+ if ("name" in e.target) {
2192
+ dispatch({
2193
+ type: "setUi",
2194
+ ui: {
2195
+ field: { focus: null }
2196
+ }
2197
+ });
2198
+ }
2199
+ }, []);
2138
2200
  if (field.type === "custom") {
2139
2201
  if (!field.render) {
2140
2202
  return null;
2141
2203
  }
2142
2204
  const CustomField = field.render;
2143
- return /* @__PURE__ */ jsx20("div", { className: getClassName15(), children: /* @__PURE__ */ jsx20(CustomField, __spreadValues({}, mergedProps)) });
2205
+ return /* @__PURE__ */ jsx20("div", { className: getClassNameWrapper(), onFocus, onBlur, children: /* @__PURE__ */ jsx20("div", { className: getClassName15(), children: /* @__PURE__ */ jsx20(CustomField, __spreadValues({}, mergedProps)) }) });
2144
2206
  }
2145
2207
  const children = defaultFields[field.type](mergedProps);
2146
2208
  const Render2 = render[field.type];
2147
- return /* @__PURE__ */ jsx20(Render2, __spreadProps(__spreadValues({}, mergedProps), { children }));
2209
+ return /* @__PURE__ */ jsx20(
2210
+ "div",
2211
+ {
2212
+ className: getClassNameWrapper(),
2213
+ onFocus,
2214
+ onBlur,
2215
+ onClick: (e) => {
2216
+ e.stopPropagation();
2217
+ },
2218
+ children: /* @__PURE__ */ jsx20(Render2, __spreadProps(__spreadValues({}, mergedProps), { children }))
2219
+ }
2220
+ );
2148
2221
  }
2149
- var RECENT_CHANGE_TIMEOUT = 200;
2150
2222
  function AutoFieldPrivate(props) {
2223
+ const { state } = useAppContext();
2151
2224
  const { value, onChange } = props;
2152
2225
  const [localValue, setLocalValue] = useState10(value);
2153
- const [recentlyChanged, setRecentlyChanged] = useState10(false);
2154
- const timeoutRef = useRef2();
2155
2226
  const onChangeDb = useDebouncedCallback(
2156
2227
  (val, ui) => {
2157
2228
  onChange(val, ui);
@@ -2161,15 +2232,10 @@ function AutoFieldPrivate(props) {
2161
2232
  );
2162
2233
  const onChangeLocal = useCallback5((val, ui) => {
2163
2234
  setLocalValue(val);
2164
- setRecentlyChanged(true);
2165
- clearTimeout(timeoutRef.current);
2166
- timeoutRef.current = setTimeout(() => {
2167
- setRecentlyChanged(false);
2168
- }, RECENT_CHANGE_TIMEOUT);
2169
2235
  onChangeDb(val, ui);
2170
2236
  }, []);
2171
2237
  useEffect9(() => {
2172
- if (!recentlyChanged) {
2238
+ if (state.ui.field.focus !== props.name) {
2173
2239
  setLocalValue(value);
2174
2240
  }
2175
2241
  }, [value]);
@@ -3520,6 +3586,22 @@ var styles_module_default16 = { "PuckFields": "_PuckFields_jp3lw_1", "PuckFields
3520
3586
 
3521
3587
  // components/Puck/components/Fields/index.tsx
3522
3588
  import { useCallback as useCallback7, useEffect as useEffect13, useMemo as useMemo6, useState as useState15 } from "react";
3589
+
3590
+ // lib/use-parent.ts
3591
+ init_react_import();
3592
+ import { useContext as useContext5 } from "react";
3593
+ var useParent = (itemSelector) => {
3594
+ var _a;
3595
+ const { selectedItem, state } = useAppContext();
3596
+ const { pathData } = useContext5(dropZoneContext) || {};
3597
+ const item = itemSelector ? getItem(itemSelector, state.data) : selectedItem;
3598
+ const breadcrumbs = convertPathDataToBreadcrumbs(item, pathData, state.data);
3599
+ const lastItem = breadcrumbs[breadcrumbs.length - 1];
3600
+ const parent = (lastItem == null ? void 0 : lastItem.selector) ? (_a = getItem(lastItem.selector, state.data)) != null ? _a : null : null;
3601
+ return parent || null;
3602
+ };
3603
+
3604
+ // components/Puck/components/Fields/index.tsx
3523
3605
  import { Fragment as Fragment12, jsx as jsx27, jsxs as jsxs15 } from "react/jsx-runtime";
3524
3606
  var getClassName21 = get_class_name_factory_default("PuckFields", styles_module_default16);
3525
3607
  var defaultPageFields = {
@@ -3533,6 +3615,7 @@ var DefaultFields = ({
3533
3615
  var useResolvedFields = () => {
3534
3616
  var _a, _b;
3535
3617
  const { selectedItem, state, config } = useAppContext();
3618
+ const parent = useParent();
3536
3619
  const { data } = state;
3537
3620
  const rootFields = ((_a = config.root) == null ? void 0 : _a.fields) || defaultPageFields;
3538
3621
  const componentConfig = selectedItem ? config.components[selectedItem.type] : null;
@@ -3563,7 +3646,8 @@ var useResolvedFields = () => {
3563
3646
  fields,
3564
3647
  lastFields: resolvedFields,
3565
3648
  lastData,
3566
- appState: state
3649
+ appState: state,
3650
+ parent
3567
3651
  }
3568
3652
  );
3569
3653
  }
@@ -3573,7 +3657,8 @@ var useResolvedFields = () => {
3573
3657
  fields,
3574
3658
  lastFields: resolvedFields,
3575
3659
  lastData,
3576
- appState: state
3660
+ appState: state,
3661
+ parent
3577
3662
  });
3578
3663
  }
3579
3664
  return defaultResolveFields(componentData, {
@@ -3595,7 +3680,7 @@ var useResolvedFields = () => {
3595
3680
  } else {
3596
3681
  setResolvedFields(defaultFields);
3597
3682
  }
3598
- }, [data, defaultFields, state.ui.itemSelector, hasResolver]);
3683
+ }, [data, defaultFields, selectedItem, hasResolver]);
3599
3684
  return [resolvedFields, fieldsLoading];
3600
3685
  };
3601
3686
  var Fields = () => {
@@ -3902,7 +3987,7 @@ import { useCallback as useCallback8, useMemo as useMemo8 } from "react";
3902
3987
  init_react_import();
3903
3988
  import {
3904
3989
  createContext as createContext4,
3905
- useContext as useContext5,
3990
+ useContext as useContext6,
3906
3991
  useEffect as useEffect15,
3907
3992
  useRef as useRef3,
3908
3993
  useState as useState17
@@ -4112,7 +4197,7 @@ var CopyHostStyles = ({
4112
4197
  return /* @__PURE__ */ jsx31(Fragment13, { children });
4113
4198
  };
4114
4199
  var autoFrameContext = createContext4({});
4115
- var useFrame = () => useContext5(autoFrameContext);
4200
+ var useFrame = () => useContext6(autoFrameContext);
4116
4201
  function AutoFrame(_a) {
4117
4202
  var _b = _a, {
4118
4203
  children,
@@ -4265,7 +4350,7 @@ var scrollIntoView = (el) => {
4265
4350
  };
4266
4351
 
4267
4352
  // components/LayerTree/index.tsx
4268
- import { useContext as useContext6 } from "react";
4353
+ import { useContext as useContext7 } from "react";
4269
4354
 
4270
4355
  // lib/is-child-of-zone.ts
4271
4356
  init_react_import();
@@ -4292,7 +4377,7 @@ var LayerTree = ({
4292
4377
  label
4293
4378
  }) => {
4294
4379
  const zones = data.zones || {};
4295
- const ctx = useContext6(dropZoneContext);
4380
+ const ctx = useContext7(dropZoneContext);
4296
4381
  return /* @__PURE__ */ jsxs17(Fragment15, { children: [
4297
4382
  label && /* @__PURE__ */ jsxs17("div", { className: getClassName24("zoneTitle"), children: [
4298
4383
  /* @__PURE__ */ jsx33("div", { className: getClassName24("zoneIcon"), children: /* @__PURE__ */ jsx33(Layers, { size: "16" }) }),
@@ -5656,6 +5741,11 @@ var usePuck = () => {
5656
5741
  getPermissions,
5657
5742
  refreshPermissions
5658
5743
  } = useAppContext();
5744
+ if (dispatch === defaultContext.dispatch) {
5745
+ throw new Error(
5746
+ "usePuck was used outside of the <Puck> component. The usePuck hook must be rendered within the <Puck> context as children, overrides or plugins as described in https://puckeditor.com/docs/api-reference/functions/use-puck."
5747
+ );
5748
+ }
5659
5749
  return {
5660
5750
  appState,
5661
5751
  config,
@@ -94,6 +94,9 @@ type ExternalField<Props extends {
94
94
  mapRow?: (value: any) => Record<string, string | number | ReactElement>;
95
95
  getItemSummary?: (item: Props, index?: number) => string;
96
96
  showSearch?: boolean;
97
+ renderFooter?: (props: {
98
+ items: any[];
99
+ }) => ReactElement;
97
100
  initialQuery?: string;
98
101
  filterFields?: Record<string, Field>;
99
102
  initialFilters?: Record<string, any>;
@@ -142,6 +145,7 @@ type ComponentConfig<RenderProps extends DefaultComponentProps = DefaultComponen
142
145
  lastFields: Fields<FieldProps>;
143
146
  lastData: DataShape | null;
144
147
  appState: AppState;
148
+ parent: ComponentData | null;
145
149
  }) => Promise<Fields<FieldProps>> | Fields<FieldProps>;
146
150
  resolveData?: (data: DataShape, params: {
147
151
  changed: Partial<Record<keyof FieldProps, boolean>>;
@@ -271,6 +275,9 @@ type UiState = {
271
275
  controlsVisible: boolean;
272
276
  options: Viewport[];
273
277
  };
278
+ field: {
279
+ focus?: string | null;
280
+ };
274
281
  };
275
282
  type AppState<UserData extends Data = Data> = {
276
283
  data: UserData;
@@ -94,6 +94,9 @@ type ExternalField<Props extends {
94
94
  mapRow?: (value: any) => Record<string, string | number | ReactElement>;
95
95
  getItemSummary?: (item: Props, index?: number) => string;
96
96
  showSearch?: boolean;
97
+ renderFooter?: (props: {
98
+ items: any[];
99
+ }) => ReactElement;
97
100
  initialQuery?: string;
98
101
  filterFields?: Record<string, Field>;
99
102
  initialFilters?: Record<string, any>;
@@ -142,6 +145,7 @@ type ComponentConfig<RenderProps extends DefaultComponentProps = DefaultComponen
142
145
  lastFields: Fields<FieldProps>;
143
146
  lastData: DataShape | null;
144
147
  appState: AppState;
148
+ parent: ComponentData | null;
145
149
  }) => Promise<Fields<FieldProps>> | Fields<FieldProps>;
146
150
  resolveData?: (data: DataShape, params: {
147
151
  changed: Partial<Record<keyof FieldProps, boolean>>;
@@ -271,6 +275,9 @@ type UiState = {
271
275
  controlsVisible: boolean;
272
276
  options: Viewport[];
273
277
  };
278
+ field: {
279
+ focus?: string | null;
280
+ };
274
281
  };
275
282
  type AppState<UserData extends Data = Data> = {
276
283
  data: UserData;
package/dist/rsc.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { C as Config, D as Data } from './resolve-all-data-CaVk1fIL.mjs';
3
- export { a4 as resolveAllData } from './resolve-all-data-CaVk1fIL.mjs';
2
+ import { C as Config, D as Data } from './resolve-all-data-C7aAQCY3.mjs';
3
+ export { a4 as resolveAllData } from './resolve-all-data-C7aAQCY3.mjs';
4
4
  import 'react';
5
5
 
6
6
  declare function Render<UserConfig extends Config = Config>({ config, data, }: {
package/dist/rsc.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { C as Config, D as Data } from './resolve-all-data-CaVk1fIL.js';
3
- export { a4 as resolveAllData } from './resolve-all-data-CaVk1fIL.js';
2
+ import { C as Config, D as Data } from './resolve-all-data-C7aAQCY3.js';
3
+ export { a4 as resolveAllData } from './resolve-all-data-C7aAQCY3.js';
4
4
  import 'react';
5
5
 
6
6
  declare function Render<UserConfig extends Config = Config>({ config, data, }: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@measured/puck",
3
- "version": "0.17.0-canary.8ea38c3",
3
+ "version": "0.17.0-canary.9991c07",
4
4
  "author": "Measured Corporation Ltd <hello@measured.co>",
5
5
  "repository": "measuredco/puck",
6
6
  "bugs": "https://github.com/measuredco/puck/issues",