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

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/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
  ]
@@ -1420,7 +1450,7 @@ var DefaultField = ({
1420
1450
  autoComplete: "off",
1421
1451
  type: field.type,
1422
1452
  name,
1423
- value: typeof value === "undefined" ? "" : value,
1453
+ value: typeof value === "undefined" ? "" : value.toString(),
1424
1454
  onChange: (e) => {
1425
1455
  if (field.type === "number") {
1426
1456
  onChange(Number(e.currentTarget.value));
@@ -1445,11 +1475,17 @@ import { useEffect as useEffect8 } from "react";
1445
1475
 
1446
1476
  // components/ExternalInput/index.tsx
1447
1477
  init_react_import();
1448
- import { useMemo, useEffect as useEffect7, useState as useState8, useCallback as useCallback4 } from "react";
1478
+ import {
1479
+ useMemo,
1480
+ useEffect as useEffect7,
1481
+ useState as useState8,
1482
+ useCallback as useCallback4,
1483
+ isValidElement
1484
+ } from "react";
1449
1485
 
1450
1486
  // css-module:/home/runner/work/puck/puck/packages/core/components/ExternalInput/styles.module.css#css-module
1451
1487
  init_react_import();
1452
- 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" };
1488
+ 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" };
1453
1489
 
1454
1490
  // components/Modal/index.tsx
1455
1491
  init_react_import();
@@ -1606,7 +1642,7 @@ var ExternalInput = ({
1606
1642
  const validKeys = /* @__PURE__ */ new Set();
1607
1643
  for (const item of mappedData) {
1608
1644
  for (const key of Object.keys(item)) {
1609
- if (typeof item[key] === "string" || typeof item[key] === "number") {
1645
+ if (typeof item[key] === "string" || typeof item[key] === "number" || isValidElement(item[key])) {
1610
1646
  validKeys.add(key);
1611
1647
  }
1612
1648
  }
@@ -1627,6 +1663,14 @@ var ExternalInput = ({
1627
1663
  }),
1628
1664
  [id, field]
1629
1665
  );
1666
+ const Footer = useCallback4(
1667
+ (props) => field.renderFooter ? field.renderFooter(props) : /* @__PURE__ */ jsxs7("span", { className: getClassNameModal("footer"), children: [
1668
+ props.items.length,
1669
+ " result",
1670
+ props.items.length === 1 ? "" : "s"
1671
+ ] }),
1672
+ [field.renderFooter]
1673
+ );
1630
1674
  useEffect7(() => {
1631
1675
  search(searchQuery, filters);
1632
1676
  }, []);
@@ -1766,11 +1810,7 @@ var ExternalInput = ({
1766
1810
  /* @__PURE__ */ jsx14("div", { className: getClassNameModal("loadingBanner"), children: /* @__PURE__ */ jsx14(Loader, { size: 24 }) })
1767
1811
  ] })
1768
1812
  ] }),
1769
- /* @__PURE__ */ jsxs7("div", { className: getClassNameModal("footer"), children: [
1770
- mappedData.length,
1771
- " result",
1772
- mappedData.length === 1 ? "" : "s"
1773
- ] })
1813
+ /* @__PURE__ */ jsx14("div", { className: getClassNameModal("footerContainer"), children: /* @__PURE__ */ jsx14(Footer, { items: mappedData }) })
1774
1814
  ]
1775
1815
  }
1776
1816
  ) })
@@ -2050,6 +2090,7 @@ var useSafeId = () => {
2050
2090
  // components/AutoField/index.tsx
2051
2091
  import { Fragment as Fragment8, jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
2052
2092
  var getClassName15 = get_class_name_factory_default("Input", styles_module_default2);
2093
+ var getClassNameWrapper = get_class_name_factory_default("InputWrapper", styles_module_default2);
2053
2094
  var FieldLabel = ({
2054
2095
  children,
2055
2096
  icon,
@@ -2097,7 +2138,7 @@ var FieldLabelInternal2 = ({
2097
2138
  };
2098
2139
  function AutoFieldInternal(props) {
2099
2140
  var _a, _b, _c, _d, _e, _f, _g, _h;
2100
- const { overrides } = useAppContext();
2141
+ const { dispatch, overrides } = useAppContext();
2101
2142
  const { id, Label = FieldLabelInternal2 } = props;
2102
2143
  const field = props.field;
2103
2144
  const label = field.label;
@@ -2129,23 +2170,45 @@ function AutoFieldInternal(props) {
2129
2170
  Label,
2130
2171
  id: resolvedId
2131
2172
  });
2173
+ const onFocus = useCallback5(
2174
+ (e) => {
2175
+ if (mergedProps.name && e.target.nodeName === "INPUT") {
2176
+ e.stopPropagation();
2177
+ dispatch({
2178
+ type: "setUi",
2179
+ ui: {
2180
+ field: { focus: mergedProps.name }
2181
+ }
2182
+ });
2183
+ }
2184
+ },
2185
+ [mergedProps.name]
2186
+ );
2187
+ const onBlur = useCallback5((e) => {
2188
+ if ("name" in e.target) {
2189
+ dispatch({
2190
+ type: "setUi",
2191
+ ui: {
2192
+ field: { focus: null }
2193
+ }
2194
+ });
2195
+ }
2196
+ }, []);
2132
2197
  if (field.type === "custom") {
2133
2198
  if (!field.render) {
2134
2199
  return null;
2135
2200
  }
2136
2201
  const CustomField = field.render;
2137
- return /* @__PURE__ */ jsx20("div", { className: getClassName15(), children: /* @__PURE__ */ jsx20(CustomField, __spreadValues({}, mergedProps)) });
2202
+ return /* @__PURE__ */ jsx20("div", { className: getClassNameWrapper(), onFocus, onBlur, children: /* @__PURE__ */ jsx20("div", { className: getClassName15(), children: /* @__PURE__ */ jsx20(CustomField, __spreadValues({}, mergedProps)) }) });
2138
2203
  }
2139
2204
  const children = defaultFields[field.type](mergedProps);
2140
2205
  const Render2 = render[field.type];
2141
- return /* @__PURE__ */ jsx20(Render2, __spreadProps(__spreadValues({}, mergedProps), { children }));
2206
+ return /* @__PURE__ */ jsx20("div", { className: getClassNameWrapper(), onFocus, onBlur, children: /* @__PURE__ */ jsx20(Render2, __spreadProps(__spreadValues({}, mergedProps), { children })) });
2142
2207
  }
2143
- var RECENT_CHANGE_TIMEOUT = 200;
2144
2208
  function AutoFieldPrivate(props) {
2209
+ const { state } = useAppContext();
2145
2210
  const { value, onChange } = props;
2146
2211
  const [localValue, setLocalValue] = useState10(value);
2147
- const [recentlyChanged, setRecentlyChanged] = useState10(false);
2148
- const timeoutRef = useRef2();
2149
2212
  const onChangeDb = useDebouncedCallback(
2150
2213
  (val, ui) => {
2151
2214
  onChange(val, ui);
@@ -2155,15 +2218,10 @@ function AutoFieldPrivate(props) {
2155
2218
  );
2156
2219
  const onChangeLocal = useCallback5((val, ui) => {
2157
2220
  setLocalValue(val);
2158
- setRecentlyChanged(true);
2159
- clearTimeout(timeoutRef.current);
2160
- timeoutRef.current = setTimeout(() => {
2161
- setRecentlyChanged(false);
2162
- }, RECENT_CHANGE_TIMEOUT);
2163
2221
  onChangeDb(val, ui);
2164
2222
  }, []);
2165
2223
  useEffect9(() => {
2166
- if (!recentlyChanged) {
2224
+ if (state.ui.field.focus !== props.name) {
2167
2225
  setLocalValue(value);
2168
2226
  }
2169
2227
  }, [value]);
@@ -3514,6 +3572,22 @@ var styles_module_default16 = { "PuckFields": "_PuckFields_jp3lw_1", "PuckFields
3514
3572
 
3515
3573
  // components/Puck/components/Fields/index.tsx
3516
3574
  import { useCallback as useCallback7, useEffect as useEffect13, useMemo as useMemo6, useState as useState15 } from "react";
3575
+
3576
+ // lib/use-parent.ts
3577
+ init_react_import();
3578
+ import { useContext as useContext5 } from "react";
3579
+ var useParent = (itemSelector) => {
3580
+ var _a;
3581
+ const { selectedItem, state } = useAppContext();
3582
+ const { pathData } = useContext5(dropZoneContext) || {};
3583
+ const item = itemSelector ? getItem(itemSelector, state.data) : selectedItem;
3584
+ const breadcrumbs = convertPathDataToBreadcrumbs(item, pathData, state.data);
3585
+ const lastItem = breadcrumbs[breadcrumbs.length - 1];
3586
+ const parent = (lastItem == null ? void 0 : lastItem.selector) ? (_a = getItem(lastItem.selector, state.data)) != null ? _a : null : null;
3587
+ return parent || null;
3588
+ };
3589
+
3590
+ // components/Puck/components/Fields/index.tsx
3517
3591
  import { Fragment as Fragment12, jsx as jsx27, jsxs as jsxs15 } from "react/jsx-runtime";
3518
3592
  var getClassName21 = get_class_name_factory_default("PuckFields", styles_module_default16);
3519
3593
  var defaultPageFields = {
@@ -3527,6 +3601,7 @@ var DefaultFields = ({
3527
3601
  var useResolvedFields = () => {
3528
3602
  var _a, _b;
3529
3603
  const { selectedItem, state, config } = useAppContext();
3604
+ const parent = useParent();
3530
3605
  const { data } = state;
3531
3606
  const rootFields = ((_a = config.root) == null ? void 0 : _a.fields) || defaultPageFields;
3532
3607
  const componentConfig = selectedItem ? config.components[selectedItem.type] : null;
@@ -3557,7 +3632,8 @@ var useResolvedFields = () => {
3557
3632
  fields,
3558
3633
  lastFields: resolvedFields,
3559
3634
  lastData,
3560
- appState: state
3635
+ appState: state,
3636
+ parent
3561
3637
  }
3562
3638
  );
3563
3639
  }
@@ -3567,7 +3643,8 @@ var useResolvedFields = () => {
3567
3643
  fields,
3568
3644
  lastFields: resolvedFields,
3569
3645
  lastData,
3570
- appState: state
3646
+ appState: state,
3647
+ parent
3571
3648
  });
3572
3649
  }
3573
3650
  return defaultResolveFields(componentData, {
@@ -3589,7 +3666,7 @@ var useResolvedFields = () => {
3589
3666
  } else {
3590
3667
  setResolvedFields(defaultFields);
3591
3668
  }
3592
- }, [data, defaultFields, state.ui.itemSelector, hasResolver]);
3669
+ }, [data, defaultFields, selectedItem, hasResolver]);
3593
3670
  return [resolvedFields, fieldsLoading];
3594
3671
  };
3595
3672
  var Fields = () => {
@@ -3896,7 +3973,7 @@ import { useCallback as useCallback8, useMemo as useMemo8 } from "react";
3896
3973
  init_react_import();
3897
3974
  import {
3898
3975
  createContext as createContext4,
3899
- useContext as useContext5,
3976
+ useContext as useContext6,
3900
3977
  useEffect as useEffect15,
3901
3978
  useRef as useRef3,
3902
3979
  useState as useState17
@@ -4106,7 +4183,7 @@ var CopyHostStyles = ({
4106
4183
  return /* @__PURE__ */ jsx31(Fragment13, { children });
4107
4184
  };
4108
4185
  var autoFrameContext = createContext4({});
4109
- var useFrame = () => useContext5(autoFrameContext);
4186
+ var useFrame = () => useContext6(autoFrameContext);
4110
4187
  function AutoFrame(_a) {
4111
4188
  var _b = _a, {
4112
4189
  children,
@@ -4259,7 +4336,7 @@ var scrollIntoView = (el) => {
4259
4336
  };
4260
4337
 
4261
4338
  // components/LayerTree/index.tsx
4262
- import { useContext as useContext6 } from "react";
4339
+ import { useContext as useContext7 } from "react";
4263
4340
 
4264
4341
  // lib/is-child-of-zone.ts
4265
4342
  init_react_import();
@@ -4286,7 +4363,7 @@ var LayerTree = ({
4286
4363
  label
4287
4364
  }) => {
4288
4365
  const zones = data.zones || {};
4289
- const ctx = useContext6(dropZoneContext);
4366
+ const ctx = useContext7(dropZoneContext);
4290
4367
  return /* @__PURE__ */ jsxs17(Fragment15, { children: [
4291
4368
  label && /* @__PURE__ */ jsxs17("div", { className: getClassName24("zoneTitle"), children: [
4292
4369
  /* @__PURE__ */ jsx33("div", { className: getClassName24("zoneIcon"), children: /* @__PURE__ */ jsx33(Layers, { size: "16" }) }),
@@ -91,9 +91,12 @@ type ExternalField<Props extends {
91
91
  filters: Record<string, any>;
92
92
  }) => Promise<any[] | null>;
93
93
  mapProp?: (value: any) => Props;
94
- mapRow?: (value: any) => Record<string, string | number>;
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;
@@ -91,9 +91,12 @@ type ExternalField<Props extends {
91
91
  filters: Record<string, any>;
92
92
  }) => Promise<any[] | null>;
93
93
  mapProp?: (value: any) => Props;
94
- mapRow?: (value: any) => Record<string, string | number>;
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-BoWgijLi.mjs';
3
- export { a4 as resolveAllData } from './resolve-all-data-BoWgijLi.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-BoWgijLi.js';
3
- export { a4 as resolveAllData } from './resolve-all-data-BoWgijLi.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.16.3-canary.83b8190",
3
+ "version": "0.17.0-canary.159d819",
4
4
  "author": "Measured Corporation Ltd <hello@measured.co>",
5
5
  "repository": "measuredco/puck",
6
6
  "bugs": "https://github.com/measuredco/puck/issues",