@measured/puck 0.16.0-canary.6d43ba0 → 0.16.0-canary.7a6a65c

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.js CHANGED
@@ -156,11 +156,13 @@ __export(core_exports, {
156
156
  DropZoneProvider: () => DropZoneProvider,
157
157
  FieldLabel: () => FieldLabel,
158
158
  FieldLabelInternal: () => FieldLabelInternal2,
159
+ Group: () => Group,
159
160
  IconButton: () => IconButton,
160
161
  Puck: () => Puck,
161
162
  Render: () => Render,
162
163
  dropZoneContext: () => dropZoneContext,
163
164
  migrate: () => migrate,
165
+ overrideKeys: () => overrideKeys,
164
166
  resolveAllData: () => resolveAllData,
165
167
  transformProps: () => transformProps,
166
168
  usePuck: () => usePuck
@@ -168,15 +170,47 @@ __export(core_exports, {
168
170
  module.exports = __toCommonJS(core_exports);
169
171
  init_react_import();
170
172
 
173
+ // types/API/index.ts
174
+ init_react_import();
175
+
176
+ // types/API/Viewports.ts
177
+ init_react_import();
178
+
179
+ // types/index.ts
180
+ init_react_import();
181
+
182
+ // types/API/Overrides.ts
183
+ init_react_import();
184
+ var overrideKeys = [
185
+ "header",
186
+ "headerActions",
187
+ "fields",
188
+ "fieldLabel",
189
+ "components",
190
+ "componentItem",
191
+ "outline",
192
+ "puck",
193
+ "preview"
194
+ ];
195
+
196
+ // types/AppState.tsx
197
+ init_react_import();
198
+
171
199
  // types/Config.tsx
172
200
  init_react_import();
173
201
 
174
- // types/Plugin.ts
202
+ // types/Data.tsx
175
203
  init_react_import();
176
204
 
177
205
  // types/Fields.ts
178
206
  init_react_import();
179
207
 
208
+ // types/Props.tsx
209
+ init_react_import();
210
+
211
+ // types/Utils.tsx
212
+ init_react_import();
213
+
180
214
  // components/ActionBar/index.tsx
181
215
  init_react_import();
182
216
 
@@ -209,11 +243,11 @@ var get_class_name_factory_default = getClassNameFactory;
209
243
 
210
244
  // css-module:/home/runner/work/puck/puck/packages/core/components/ActionBar/styles.module.css#css-module
211
245
  init_react_import();
212
- var styles_module_default = { "ActionBarComponent": "_ActionBarComponent_8nyey_1", "ActionBarComponent-actionsLabel": "_ActionBarComponent-actionsLabel_8nyey_15", "ActionBarComponent-action": "_ActionBarComponent-action_8nyey_15" };
246
+ var styles_module_default = { "ActionBar": "_ActionBar_fp58q_1", "ActionBar-actionsLabel": "_ActionBar-actionsLabel_fp58q_16", "ActionBar-group": "_ActionBar-group_fp58q_29", "ActionBar-action": "_ActionBar-action_fp58q_16" };
213
247
 
214
248
  // components/ActionBar/index.tsx
215
249
  var import_jsx_runtime = require("react/jsx-runtime");
216
- var getClassName = get_class_name_factory_default("ActionBarComponent", styles_module_default);
250
+ var getClassName = get_class_name_factory_default("ActionBar", styles_module_default);
217
251
  var ActionBar = ({
218
252
  label,
219
253
  children
@@ -225,8 +259,19 @@ var Action = ({
225
259
  children,
226
260
  label,
227
261
  onClick
228
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { className: getClassName("action"), onClick, title: label, children });
262
+ }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
263
+ "button",
264
+ {
265
+ type: "button",
266
+ className: getClassName("action"),
267
+ onClick,
268
+ title: label,
269
+ children
270
+ }
271
+ );
272
+ var Group = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: getClassName("group"), children });
229
273
  ActionBar.Action = Action;
274
+ ActionBar.Group = Group;
230
275
 
231
276
  // components/AutoField/index.tsx
232
277
  init_react_import();
@@ -236,7 +281,7 @@ init_react_import();
236
281
  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" };
237
282
 
238
283
  // components/AutoField/index.tsx
239
- var import_react11 = require("react");
284
+ var import_react13 = require("react");
240
285
 
241
286
  // components/AutoField/fields/index.tsx
242
287
  init_react_import();
@@ -644,7 +689,7 @@ var import_dnd = require("@measured/dnd");
644
689
 
645
690
  // components/Puck/context.tsx
646
691
  init_react_import();
647
- var import_react4 = require("react");
692
+ var import_react6 = require("react");
648
693
 
649
694
  // lib/get-item.ts
650
695
  init_react_import();
@@ -659,21 +704,22 @@ var setupZone = (data, zoneKey) => {
659
704
  if (zoneKey === rootDroppableId) {
660
705
  return data;
661
706
  }
662
- const newData = __spreadValues({}, data);
663
- newData.zones = data.zones || {};
707
+ const newData = __spreadProps(__spreadValues({}, data), {
708
+ zones: data.zones || {}
709
+ });
664
710
  newData.zones[zoneKey] = newData.zones[zoneKey] || [];
665
711
  return newData;
666
712
  };
667
713
 
668
714
  // lib/get-item.ts
669
- var getItem = (selector, data, dynamicProps = {}) => {
715
+ function getItem(selector, data, dynamicProps = {}) {
670
716
  if (!selector.zone || selector.zone === rootDroppableId) {
671
717
  const item2 = data.content[selector.index];
672
718
  return (item2 == null ? void 0 : item2.props) ? __spreadProps(__spreadValues({}, item2), { props: dynamicProps[item2.props.id] || item2.props }) : void 0;
673
719
  }
674
720
  const item = setupZone(data, selector.zone).zones[selector.zone][selector.index];
675
721
  return (item == null ? void 0 : item.props) ? __spreadProps(__spreadValues({}, item), { props: dynamicProps[item.props.id] || item.props }) : void 0;
676
- };
722
+ }
677
723
 
678
724
  // components/ViewportControls/default-viewports.ts
679
725
  init_react_import();
@@ -685,6 +731,332 @@ var defaultViewports = [
685
731
 
686
732
  // components/Puck/context.tsx
687
733
  var import_ua_parser_js = require("ua-parser-js");
734
+
735
+ // lib/use-resolved-permissions.ts
736
+ init_react_import();
737
+ var import_react4 = require("react");
738
+
739
+ // lib/flatten-data.ts
740
+ init_react_import();
741
+ var flattenData = (data) => {
742
+ return Object.keys(data.zones || {}).reduce(
743
+ (acc, zone) => [...acc, ...data.zones[zone]],
744
+ data.content
745
+ );
746
+ };
747
+
748
+ // lib/get-changed.ts
749
+ init_react_import();
750
+ var getChanged = (newItem, oldItem) => {
751
+ return newItem ? Object.keys(newItem.props || {}).reduce((acc, item) => {
752
+ const newItemProps = (newItem == null ? void 0 : newItem.props) || {};
753
+ const oldItemProps = (oldItem == null ? void 0 : oldItem.props) || {};
754
+ return __spreadProps(__spreadValues({}, acc), {
755
+ [item]: oldItemProps[item] !== newItemProps[item]
756
+ });
757
+ }, {}) : {};
758
+ };
759
+
760
+ // lib/use-resolved-permissions.ts
761
+ var useResolvedPermissions = (config, appState, globalPermissions, setComponentLoading, unsetComponentLoading) => {
762
+ const [cache3, setCache] = (0, import_react4.useState)({});
763
+ const [resolvedPermissions, setResolvedPermissions] = (0, import_react4.useState)({});
764
+ const resolveDataForItem = (0, import_react4.useCallback)(
765
+ (item, force = false) => __async(void 0, null, function* () {
766
+ var _a, _b, _c;
767
+ setComponentLoading == null ? void 0 : setComponentLoading(item.props.id);
768
+ const componentConfig = item.type === "root" ? config.root : config.components[item.type];
769
+ if (!componentConfig) {
770
+ unsetComponentLoading == null ? void 0 : unsetComponentLoading(item.props.id);
771
+ return;
772
+ }
773
+ const initialPermissions = __spreadValues(__spreadValues({}, globalPermissions), componentConfig.permissions);
774
+ if (componentConfig.resolvePermissions) {
775
+ const changed = getChanged(item, (_a = cache3[item.props.id]) == null ? void 0 : _a.lastData);
776
+ if (Object.values(changed).some((el) => el === true) || force) {
777
+ const resolvedPermissions2 = yield componentConfig.resolvePermissions(
778
+ item,
779
+ {
780
+ changed,
781
+ lastPermissions: ((_b = cache3[item.props.id]) == null ? void 0 : _b.lastPermissions) || null,
782
+ permissions: initialPermissions,
783
+ appState,
784
+ lastData: ((_c = cache3[item.props.id]) == null ? void 0 : _c.lastData) || null
785
+ }
786
+ );
787
+ setCache((_cache) => __spreadProps(__spreadValues({}, _cache), {
788
+ [item.props.id]: {
789
+ lastData: item,
790
+ lastPermissions: resolvedPermissions2
791
+ }
792
+ }));
793
+ setResolvedPermissions((p) => __spreadProps(__spreadValues({}, p), {
794
+ [item.props.id]: resolvedPermissions2
795
+ }));
796
+ }
797
+ }
798
+ unsetComponentLoading == null ? void 0 : unsetComponentLoading(item.props.id);
799
+ }),
800
+ [config, globalPermissions, appState, cache3]
801
+ );
802
+ const resolveDataForRoot = (force = false) => {
803
+ resolveDataForItem(
804
+ // Shim the root data in by conforming to component data shape
805
+ {
806
+ type: "root",
807
+ props: __spreadProps(__spreadValues({}, appState.data.root.props), { id: "puck-root" })
808
+ },
809
+ force
810
+ );
811
+ };
812
+ const resolvePermissions = (0, import_react4.useCallback)(
813
+ (..._0) => __async(void 0, [..._0], function* ({ item, type, root } = {}, force = false) {
814
+ if (item) {
815
+ yield resolveDataForItem(item, force);
816
+ } else if (type) {
817
+ flattenData(appState.data).filter((item2) => item2.type === type).map((item2) => __async(void 0, null, function* () {
818
+ yield resolveDataForItem(item2, force);
819
+ }));
820
+ } else if (root) {
821
+ resolveDataForRoot(force);
822
+ } else {
823
+ resolveDataForRoot(force);
824
+ flattenData(appState.data).map((item2) => __async(void 0, null, function* () {
825
+ yield resolveDataForItem(item2, force);
826
+ }));
827
+ }
828
+ }),
829
+ [config, appState]
830
+ );
831
+ const refreshPermissions = (0, import_react4.useCallback)(
832
+ (params) => __async(void 0, null, function* () {
833
+ resolvePermissions(params, true);
834
+ }),
835
+ [config, appState]
836
+ );
837
+ (0, import_react4.useEffect)(() => {
838
+ resolvePermissions();
839
+ }, [config, appState.data]);
840
+ const getPermissions = (0, import_react4.useCallback)(
841
+ ({ item, type, root } = {}) => {
842
+ if (item) {
843
+ const componentConfig = config.components[item.type];
844
+ const initialPermissions = __spreadValues(__spreadValues({}, globalPermissions), componentConfig.permissions);
845
+ const resolvedForItem = resolvedPermissions[item.props.id];
846
+ return resolvedForItem ? __spreadValues(__spreadValues({}, globalPermissions), resolvedForItem) : initialPermissions;
847
+ } else if (type) {
848
+ const componentConfig = config.components[type];
849
+ return __spreadValues(__spreadValues({}, globalPermissions), componentConfig.permissions);
850
+ } else if (root) {
851
+ const rootConfig = config.root;
852
+ const initialPermissions = __spreadValues(__spreadValues({}, globalPermissions), rootConfig == null ? void 0 : rootConfig.permissions);
853
+ const resolvedForItem = resolvedPermissions["puck-root"];
854
+ return resolvedForItem ? __spreadValues(__spreadValues({}, globalPermissions), resolvedForItem) : initialPermissions;
855
+ }
856
+ return globalPermissions;
857
+ },
858
+ [config, resolvedPermissions]
859
+ );
860
+ return {
861
+ getPermissions,
862
+ refreshPermissions
863
+ };
864
+ };
865
+
866
+ // lib/use-resolved-data.ts
867
+ init_react_import();
868
+ var import_react5 = require("react");
869
+
870
+ // lib/resolve-component-data.ts
871
+ init_react_import();
872
+ var cache = { lastChange: {} };
873
+ var resolveAllComponentData = (content, config, onResolveStart, onResolveEnd) => __async(void 0, null, function* () {
874
+ return yield Promise.all(
875
+ content.map((item) => __async(void 0, null, function* () {
876
+ return yield resolveComponentData(
877
+ item,
878
+ config,
879
+ onResolveStart,
880
+ onResolveEnd
881
+ );
882
+ }))
883
+ );
884
+ });
885
+ var resolveComponentData = (item, config, onResolveStart, onResolveEnd) => __async(void 0, null, function* () {
886
+ const configForItem = config.components[item.type];
887
+ if (configForItem.resolveData) {
888
+ const { item: oldItem = null, resolved = {} } = cache.lastChange[item.props.id] || {};
889
+ if (item && item === oldItem) {
890
+ return resolved;
891
+ }
892
+ const changed = getChanged(item, oldItem);
893
+ if (onResolveStart) {
894
+ onResolveStart(item);
895
+ }
896
+ const { props: resolvedProps, readOnly = {} } = yield configForItem.resolveData(item, { changed, lastData: oldItem });
897
+ const { readOnly: existingReadOnly = {} } = item || {};
898
+ const newReadOnly = __spreadValues(__spreadValues({}, existingReadOnly), readOnly);
899
+ const resolvedItem = __spreadProps(__spreadValues({}, item), {
900
+ props: __spreadValues(__spreadValues({}, item.props), resolvedProps)
901
+ });
902
+ if (Object.keys(newReadOnly).length) {
903
+ resolvedItem.readOnly = newReadOnly;
904
+ }
905
+ cache.lastChange[item.props.id] = {
906
+ item,
907
+ resolved: resolvedItem
908
+ };
909
+ if (onResolveEnd) {
910
+ onResolveEnd(resolvedItem);
911
+ }
912
+ return resolvedItem;
913
+ }
914
+ return item;
915
+ });
916
+
917
+ // lib/apply-dynamic-props.ts
918
+ init_react_import();
919
+ var applyDynamicProps = (data, dynamicProps, rootData) => {
920
+ return __spreadProps(__spreadValues({}, data), {
921
+ root: __spreadValues(__spreadValues({}, data.root), rootData ? rootData : {}),
922
+ content: data.content.map((item) => {
923
+ return dynamicProps[item.props.id] ? __spreadValues(__spreadValues({}, item), dynamicProps[item.props.id]) : item;
924
+ }),
925
+ zones: Object.keys(data.zones || {}).reduce((acc, zoneKey) => {
926
+ return __spreadProps(__spreadValues({}, acc), {
927
+ [zoneKey]: data.zones[zoneKey].map((item) => {
928
+ return dynamicProps[item.props.id] ? __spreadValues(__spreadValues({}, item), dynamicProps[item.props.id]) : item;
929
+ })
930
+ });
931
+ }, {})
932
+ });
933
+ };
934
+
935
+ // lib/resolve-root-data.ts
936
+ init_react_import();
937
+ var cache2 = {};
938
+ function resolveRootData(data, config) {
939
+ return __async(this, null, function* () {
940
+ var _a, _b, _c, _d, _e;
941
+ if (((_a = config.root) == null ? void 0 : _a.resolveData) && data.root.props) {
942
+ if (((_b = cache2.lastChange) == null ? void 0 : _b.original) === data.root) {
943
+ return cache2.lastChange.resolved;
944
+ }
945
+ const changed = getChanged(data.root, (_c = cache2.lastChange) == null ? void 0 : _c.original);
946
+ const rootWithProps = data.root;
947
+ const resolvedRoot = yield (_e = config.root) == null ? void 0 : _e.resolveData(rootWithProps, {
948
+ changed,
949
+ lastData: ((_d = cache2.lastChange) == null ? void 0 : _d.original) || {}
950
+ });
951
+ cache2.lastChange = {
952
+ original: data.root,
953
+ resolved: resolvedRoot
954
+ };
955
+ return __spreadProps(__spreadValues(__spreadValues({}, data.root), resolvedRoot), {
956
+ props: __spreadValues(__spreadValues({}, data.root.props), resolvedRoot.props)
957
+ });
958
+ }
959
+ return data.root;
960
+ });
961
+ }
962
+
963
+ // lib/use-resolved-data.ts
964
+ var useResolvedData = (appState, config, dispatch, setComponentLoading, unsetComponentLoading, refreshPermissions) => {
965
+ const [{ resolverKey, newAppState }, setResolverState] = (0, import_react5.useState)({
966
+ resolverKey: 0,
967
+ newAppState: appState
968
+ });
969
+ const deferredSetStates = {};
970
+ const _setComponentLoading = (0, import_react5.useCallback)(
971
+ (id, loading, defer2 = 0) => {
972
+ if (deferredSetStates[id]) {
973
+ clearTimeout(deferredSetStates[id]);
974
+ delete deferredSetStates[id];
975
+ }
976
+ deferredSetStates[id] = setTimeout(() => {
977
+ if (loading) {
978
+ setComponentLoading(id);
979
+ } else {
980
+ unsetComponentLoading(id);
981
+ }
982
+ delete deferredSetStates[id];
983
+ }, defer2);
984
+ },
985
+ []
986
+ );
987
+ const runResolvers = () => __async(void 0, null, function* () {
988
+ const newData = newAppState.data;
989
+ const flatContent = flattenData(newData).filter(
990
+ (item) => {
991
+ var _a;
992
+ return !!((_a = config.components[item.type]) == null ? void 0 : _a.resolveData);
993
+ }
994
+ );
995
+ const applyIfChange = (dynamicDataMap, dynamicRoot) => {
996
+ const processed = applyDynamicProps(
997
+ appState.data,
998
+ dynamicDataMap,
999
+ dynamicRoot
1000
+ );
1001
+ const processedAppState = __spreadProps(__spreadValues({}, appState), { data: processed });
1002
+ const containsChanges = JSON.stringify(appState) !== JSON.stringify(processedAppState);
1003
+ if (containsChanges) {
1004
+ dispatch({
1005
+ type: "set",
1006
+ state: (prev) => __spreadProps(__spreadValues({}, prev), {
1007
+ data: applyDynamicProps(prev.data, dynamicDataMap, dynamicRoot),
1008
+ ui: resolverKey > 0 ? __spreadValues(__spreadValues({}, prev.ui), newAppState.ui) : prev.ui
1009
+ }),
1010
+ recordHistory: resolverKey > 0
1011
+ });
1012
+ }
1013
+ };
1014
+ const promises = [];
1015
+ promises.push(
1016
+ (() => __async(void 0, null, function* () {
1017
+ _setComponentLoading("puck-root", true, 50);
1018
+ const dynamicRoot = yield resolveRootData(newData, config);
1019
+ applyIfChange({}, dynamicRoot);
1020
+ _setComponentLoading("puck-root", false);
1021
+ }))()
1022
+ );
1023
+ flatContent.forEach((item) => {
1024
+ promises.push(
1025
+ (() => __async(void 0, null, function* () {
1026
+ refreshPermissions({ item });
1027
+ const dynamicData = yield resolveComponentData(
1028
+ item,
1029
+ config,
1030
+ (item2) => {
1031
+ _setComponentLoading(item2.props.id, true, 50);
1032
+ },
1033
+ (item2) => {
1034
+ deferredSetStates[item2.props.id];
1035
+ _setComponentLoading(item2.props.id, false);
1036
+ }
1037
+ );
1038
+ const dynamicDataMap = { [item.props.id]: dynamicData };
1039
+ applyIfChange(dynamicDataMap);
1040
+ }))()
1041
+ );
1042
+ });
1043
+ yield Promise.all(promises);
1044
+ });
1045
+ (0, import_react5.useEffect)(() => {
1046
+ runResolvers();
1047
+ }, [resolverKey]);
1048
+ const resolveData = (0, import_react5.useCallback)((newAppState2 = appState) => {
1049
+ setResolverState((curr) => ({
1050
+ resolverKey: curr.resolverKey + 1,
1051
+ newAppState: newAppState2
1052
+ }));
1053
+ }, []);
1054
+ return {
1055
+ resolveData
1056
+ };
1057
+ };
1058
+
1059
+ // components/Puck/context.tsx
688
1060
  var import_jsx_runtime4 = require("react/jsx-runtime");
689
1061
  var defaultAppState = {
690
1062
  data: { content: [], root: {} },
@@ -710,6 +1082,8 @@ var defaultContext = {
710
1082
  dispatch: () => null,
711
1083
  config: { components: {} },
712
1084
  componentState: {},
1085
+ setComponentState: () => {
1086
+ },
713
1087
  resolveData: () => {
714
1088
  },
715
1089
  plugins: [],
@@ -726,20 +1100,22 @@ var defaultContext = {
726
1100
  setStatus: () => null,
727
1101
  iframe: {},
728
1102
  safariFallbackMode: false,
729
- globalPermissions: {}
1103
+ globalPermissions: {},
1104
+ getPermissions: () => ({}),
1105
+ refreshPermissions: () => null
730
1106
  };
731
- var appContext = (0, import_react4.createContext)(defaultContext);
1107
+ var appContext = (0, import_react6.createContext)(defaultContext);
732
1108
  var AppProvider = ({
733
1109
  children,
734
1110
  value
735
1111
  }) => {
736
- const [zoomConfig, setZoomConfig] = (0, import_react4.useState)(defaultContext.zoomConfig);
737
- const [status, setStatus] = (0, import_react4.useState)("LOADING");
738
- (0, import_react4.useEffect)(() => {
1112
+ const [zoomConfig, setZoomConfig] = (0, import_react6.useState)(defaultContext.zoomConfig);
1113
+ const [status, setStatus] = (0, import_react6.useState)("LOADING");
1114
+ (0, import_react6.useEffect)(() => {
739
1115
  setStatus("MOUNTED");
740
1116
  }, []);
741
- const [safariFallbackMode, setSafariFallbackMode] = (0, import_react4.useState)(false);
742
- (0, import_react4.useEffect)(() => {
1117
+ const [safariFallbackMode, setSafariFallbackMode] = (0, import_react6.useState)(false);
1118
+ (0, import_react6.useEffect)(() => {
743
1119
  var _a, _b, _c;
744
1120
  const ua = new import_ua_parser_js.UAParser(navigator.userAgent);
745
1121
  const { browser } = ua.getResult();
@@ -756,26 +1132,67 @@ See https://github.com/measuredco/puck/issues/411 for more information. This mes
756
1132
  setSafariFallbackMode(true);
757
1133
  }
758
1134
  }, []);
1135
+ const selectedItem = value.state.ui.itemSelector ? getItem(value.state.ui.itemSelector, value.state.data) : void 0;
1136
+ const [componentState, setComponentState] = (0, import_react6.useState)({});
1137
+ const setComponentLoading = (id) => {
1138
+ setComponentState((prev) => {
1139
+ var _a;
1140
+ return __spreadProps(__spreadValues({}, prev), {
1141
+ [id]: __spreadProps(__spreadValues({}, prev[id]), {
1142
+ loadingCount: (((_a = prev[id]) == null ? void 0 : _a.loadingCount) || 0) + 1
1143
+ })
1144
+ });
1145
+ });
1146
+ };
1147
+ const unsetComponentLoading = (id) => {
1148
+ setComponentState((prev) => {
1149
+ var _a;
1150
+ return __spreadProps(__spreadValues({}, prev), {
1151
+ [id]: __spreadProps(__spreadValues({}, prev[id]), {
1152
+ loadingCount: Math.max((((_a = prev[id]) == null ? void 0 : _a.loadingCount) || 0) - 1, 0)
1153
+ })
1154
+ });
1155
+ });
1156
+ };
1157
+ const { getPermissions, refreshPermissions } = useResolvedPermissions(
1158
+ value.config,
1159
+ value.state,
1160
+ value.globalPermissions || {},
1161
+ setComponentLoading,
1162
+ unsetComponentLoading
1163
+ );
1164
+ const { resolveData } = useResolvedData(
1165
+ value.state,
1166
+ value.config,
1167
+ value.dispatch,
1168
+ setComponentLoading,
1169
+ unsetComponentLoading,
1170
+ refreshPermissions
1171
+ );
759
1172
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
760
1173
  appContext.Provider,
761
1174
  {
762
1175
  value: __spreadProps(__spreadValues({}, value), {
1176
+ selectedItem,
763
1177
  zoomConfig,
764
1178
  setZoomConfig,
765
1179
  status,
766
1180
  setStatus,
767
- safariFallbackMode
1181
+ safariFallbackMode,
1182
+ getPermissions,
1183
+ refreshPermissions,
1184
+ componentState,
1185
+ setComponentState,
1186
+ resolveData
768
1187
  }),
769
1188
  children
770
1189
  }
771
1190
  );
772
1191
  };
773
1192
  function useAppContext() {
774
- const mainContext = (0, import_react4.useContext)(appContext);
775
- const selectedItem = mainContext.state.ui.itemSelector ? getItem(mainContext.state.ui.itemSelector, mainContext.state.data) : void 0;
1193
+ const mainContext = (0, import_react6.useContext)(appContext);
776
1194
  return __spreadProps(__spreadValues({}, mainContext), {
777
1195
  // Helpers
778
- selectedItem,
779
1196
  setUi: (ui, recordHistory) => {
780
1197
  return mainContext.dispatch({
781
1198
  type: "setUi",
@@ -877,7 +1294,7 @@ var Draggable = ({
877
1294
  };
878
1295
 
879
1296
  // components/AutoField/fields/ArrayField/index.tsx
880
- var import_react5 = require("react");
1297
+ var import_react7 = require("react");
881
1298
 
882
1299
  // components/DragIcon/index.tsx
883
1300
  init_react_import();
@@ -916,7 +1333,7 @@ var ArrayField = ({
916
1333
  id,
917
1334
  Label = (props) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", __spreadValues({}, props))
918
1335
  }) => {
919
- const { state, setUi, selectedItem } = useAppContext();
1336
+ const { state, setUi, selectedItem, getPermissions } = useAppContext();
920
1337
  const readOnlyFields = (selectedItem == null ? void 0 : selectedItem.readOnly) || {};
921
1338
  const value = _value;
922
1339
  const arrayState = state.ui.arrayState[id] || {
@@ -928,11 +1345,11 @@ var ArrayField = ({
928
1345
  }),
929
1346
  openId: ""
930
1347
  };
931
- const [localState, setLocalState] = (0, import_react5.useState)({ arrayState, value });
932
- (0, import_react5.useEffect)(() => {
1348
+ const [localState, setLocalState] = (0, import_react7.useState)({ arrayState, value });
1349
+ (0, import_react7.useEffect)(() => {
933
1350
  setLocalState({ arrayState, value });
934
1351
  }, [value, state.ui.arrayState[id]]);
935
- const mapArrayStateToUi = (0, import_react5.useCallback)(
1352
+ const mapArrayStateToUi = (0, import_react7.useCallback)(
936
1353
  (partialArrayState) => {
937
1354
  return {
938
1355
  arrayState: __spreadProps(__spreadValues({}, state.ui.arrayState), {
@@ -942,13 +1359,13 @@ var ArrayField = ({
942
1359
  },
943
1360
  [arrayState]
944
1361
  );
945
- const getHighestIndex = (0, import_react5.useCallback)(() => {
1362
+ const getHighestIndex = (0, import_react7.useCallback)(() => {
946
1363
  return arrayState.items.reduce(
947
1364
  (acc, item) => item._originalIndex > acc ? item._originalIndex : acc,
948
1365
  -1
949
1366
  );
950
1367
  }, [arrayState]);
951
- const regenerateArrayState = (0, import_react5.useCallback)(
1368
+ const regenerateArrayState = (0, import_react7.useCallback)(
952
1369
  (value2) => {
953
1370
  let highestIndex = getHighestIndex();
954
1371
  const newItems = Array.from(value2 || []).map((item, idx) => {
@@ -967,12 +1384,13 @@ var ArrayField = ({
967
1384
  },
968
1385
  [arrayState]
969
1386
  );
970
- (0, import_react5.useEffect)(() => {
1387
+ (0, import_react7.useEffect)(() => {
971
1388
  if (arrayState.items.length > 0) {
972
1389
  setUi(mapArrayStateToUi(arrayState));
973
1390
  }
974
1391
  }, []);
975
- const [hovering, setHovering] = (0, import_react5.useState)(false);
1392
+ const [hovering, setHovering] = (0, import_react7.useState)(false);
1393
+ const forceReadOnly = getPermissions({ item: selectedItem }).edit === false;
976
1394
  if (field.type !== "array" || !field.arrayFields) {
977
1395
  return null;
978
1396
  }
@@ -1103,13 +1521,14 @@ var ArrayField = ({
1103
1521
  const subField = field.arrayFields[fieldName];
1104
1522
  const subFieldName = `${name}[${i}].${fieldName}`;
1105
1523
  const wildcardFieldName = `${name}[*].${fieldName}`;
1524
+ const subReadOnly = forceReadOnly ? forceReadOnly : typeof readOnlyFields[subFieldName] !== "undefined" ? readOnlyFields[subFieldName] : readOnlyFields[wildcardFieldName];
1106
1525
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1107
1526
  AutoFieldPrivate,
1108
1527
  {
1109
1528
  name: subFieldName,
1110
1529
  label: subField.label || fieldName,
1111
1530
  id: `${_arrayId}_${fieldName}`,
1112
- readOnly: typeof readOnlyFields[subFieldName] !== "undefined" ? readOnlyFields[subFieldName] : readOnlyFields[wildcardFieldName],
1531
+ readOnly: subReadOnly,
1113
1532
  field: subField,
1114
1533
  value: data[fieldName],
1115
1534
  onChange: (val, ui) => {
@@ -1209,19 +1628,19 @@ var DefaultField = ({
1209
1628
 
1210
1629
  // components/AutoField/fields/ExternalField/index.tsx
1211
1630
  init_react_import();
1212
- var import_react9 = require("react");
1631
+ var import_react11 = require("react");
1213
1632
 
1214
1633
  // components/ExternalInput/index.tsx
1215
1634
  init_react_import();
1216
- var import_react8 = require("react");
1635
+ var import_react10 = require("react");
1217
1636
 
1218
1637
  // css-module:/home/runner/work/puck/puck/packages/core/components/ExternalInput/styles.module.css#css-module
1219
1638
  init_react_import();
1220
- var styles_module_default6 = { "ExternalInput-actions": "_ExternalInput-actions_19obq_1", "ExternalInput-button": "_ExternalInput-button_19obq_5", "ExternalInput--dataSelected": "_ExternalInput--dataSelected_19obq_25", "ExternalInput-detachButton": "_ExternalInput-detachButton_19obq_32", "ExternalInputModal": "_ExternalInputModal_19obq_74", "ExternalInputModal-grid": "_ExternalInputModal-grid_19obq_84", "ExternalInputModal--filtersToggled": "_ExternalInputModal--filtersToggled_19obq_95", "ExternalInputModal-filters": "_ExternalInputModal-filters_19obq_100", "ExternalInputModal-masthead": "_ExternalInputModal-masthead_19obq_119", "ExternalInputModal-tableWrapper": "_ExternalInputModal-tableWrapper_19obq_128", "ExternalInputModal-table": "_ExternalInputModal-table_19obq_128", "ExternalInputModal-thead": "_ExternalInputModal-thead_19obq_144", "ExternalInputModal-th": "_ExternalInputModal-th_19obq_144", "ExternalInputModal-td": "_ExternalInputModal-td_19obq_159", "ExternalInputModal-tr": "_ExternalInputModal-tr_19obq_164", "ExternalInputModal-tbody": "_ExternalInputModal-tbody_19obq_171", "ExternalInputModal--hasData": "_ExternalInputModal--hasData_19obq_197", "ExternalInputModal-loadingBanner": "_ExternalInputModal-loadingBanner_19obq_201", "ExternalInputModal--isLoading": "_ExternalInputModal--isLoading_19obq_218", "ExternalInputModal-searchForm": "_ExternalInputModal-searchForm_19obq_222", "ExternalInputModal-search": "_ExternalInputModal-search_19obq_222", "ExternalInputModal-searchIcon": "_ExternalInputModal-searchIcon_19obq_259", "ExternalInputModal-searchIconText": "_ExternalInputModal-searchIconText_19obq_284", "ExternalInputModal-searchInput": "_ExternalInputModal-searchInput_19obq_294", "ExternalInputModal-searchActions": "_ExternalInputModal-searchActions_19obq_308", "ExternalInputModal-searchActionIcon": "_ExternalInputModal-searchActionIcon_19obq_321", "ExternalInputModal-footer": "_ExternalInputModal-footer_19obq_325" };
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" };
1221
1640
 
1222
1641
  // components/Modal/index.tsx
1223
1642
  init_react_import();
1224
- var import_react6 = require("react");
1643
+ var import_react8 = require("react");
1225
1644
 
1226
1645
  // css-module:/home/runner/work/puck/puck/packages/core/components/Modal/styles.module.css#css-module
1227
1646
  init_react_import();
@@ -1236,8 +1655,8 @@ var Modal = ({
1236
1655
  onClose,
1237
1656
  isOpen
1238
1657
  }) => {
1239
- const [rootEl, setRootEl] = (0, import_react6.useState)(null);
1240
- (0, import_react6.useEffect)(() => {
1658
+ const [rootEl, setRootEl] = (0, import_react8.useState)(null);
1659
+ (0, import_react8.useEffect)(() => {
1241
1660
  setRootEl(document.getElementById("puck-portal-root"));
1242
1661
  }, []);
1243
1662
  if (!rootEl) {
@@ -1284,7 +1703,7 @@ init_react_import();
1284
1703
 
1285
1704
  // components/Button/Button.tsx
1286
1705
  init_react_import();
1287
- var import_react7 = require("react");
1706
+ var import_react9 = require("react");
1288
1707
 
1289
1708
  // css-module:/home/runner/work/puck/puck/packages/core/components/Button/Button.module.css#css-module
1290
1709
  init_react_import();
@@ -1307,8 +1726,8 @@ var Button = ({
1307
1726
  size = "medium",
1308
1727
  loading: loadingProp = false
1309
1728
  }) => {
1310
- const [loading, setLoading] = (0, import_react7.useState)(loadingProp);
1311
- (0, import_react7.useEffect)(() => setLoading(loadingProp), [loadingProp]);
1729
+ const [loading, setLoading] = (0, import_react9.useState)(loadingProp);
1730
+ (0, import_react9.useEffect)(() => setLoading(loadingProp), [loadingProp]);
1312
1731
  const ElementType = href ? "a" : type ? "button" : "span";
1313
1732
  const el = /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1314
1733
  ElementType,
@@ -1353,23 +1772,24 @@ var ExternalInput = ({
1353
1772
  onChange,
1354
1773
  value = null,
1355
1774
  name,
1356
- id
1775
+ id,
1776
+ readOnly
1357
1777
  }) => {
1358
1778
  const {
1359
1779
  mapProp = (val) => val,
1360
1780
  mapRow = (val) => val,
1361
1781
  filterFields
1362
1782
  } = field || {};
1363
- const [data, setData] = (0, import_react8.useState)([]);
1364
- const [isOpen, setOpen] = (0, import_react8.useState)(false);
1365
- const [isLoading, setIsLoading] = (0, import_react8.useState)(true);
1783
+ const [data, setData] = (0, import_react10.useState)([]);
1784
+ const [isOpen, setOpen] = (0, import_react10.useState)(false);
1785
+ const [isLoading, setIsLoading] = (0, import_react10.useState)(true);
1366
1786
  const hasFilterFields = !!filterFields;
1367
- const [filters, setFilters] = (0, import_react8.useState)(field.initialFilters || {});
1368
- const [filtersToggled, setFiltersToggled] = (0, import_react8.useState)(hasFilterFields);
1369
- const mappedData = (0, import_react8.useMemo)(() => {
1787
+ const [filters, setFilters] = (0, import_react10.useState)(field.initialFilters || {});
1788
+ const [filtersToggled, setFiltersToggled] = (0, import_react10.useState)(hasFilterFields);
1789
+ const mappedData = (0, import_react10.useMemo)(() => {
1370
1790
  return data.map(mapRow);
1371
1791
  }, [data]);
1372
- const keys = (0, import_react8.useMemo)(() => {
1792
+ const keys = (0, import_react10.useMemo)(() => {
1373
1793
  const validKeys = /* @__PURE__ */ new Set();
1374
1794
  for (const item of mappedData) {
1375
1795
  for (const key of Object.keys(item)) {
@@ -1380,8 +1800,8 @@ var ExternalInput = ({
1380
1800
  }
1381
1801
  return Array.from(validKeys);
1382
1802
  }, [mappedData]);
1383
- const [searchQuery, setSearchQuery] = (0, import_react8.useState)(field.initialQuery || "");
1384
- const search = (0, import_react8.useCallback)(
1803
+ const [searchQuery, setSearchQuery] = (0, import_react10.useState)(field.initialQuery || "");
1804
+ const search = (0, import_react10.useCallback)(
1385
1805
  (query, filters2) => __async(void 0, null, function* () {
1386
1806
  setIsLoading(true);
1387
1807
  const cacheKey = `${id}-${query}-${JSON.stringify(filters2)}`;
@@ -1394,7 +1814,7 @@ var ExternalInput = ({
1394
1814
  }),
1395
1815
  [id, field]
1396
1816
  );
1397
- (0, import_react8.useEffect)(() => {
1817
+ (0, import_react10.useEffect)(() => {
1398
1818
  search(searchQuery, filters);
1399
1819
  }, []);
1400
1820
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
@@ -1402,7 +1822,8 @@ var ExternalInput = ({
1402
1822
  {
1403
1823
  className: getClassName10({
1404
1824
  dataSelected: !!value,
1405
- modalVisible: isOpen
1825
+ modalVisible: isOpen,
1826
+ readOnly
1406
1827
  }),
1407
1828
  id,
1408
1829
  children: [
@@ -1413,6 +1834,7 @@ var ExternalInput = ({
1413
1834
  type: "button",
1414
1835
  onClick: () => setOpen(true),
1415
1836
  className: getClassName10("button"),
1837
+ disabled: readOnly,
1416
1838
  children: value ? field.getItemSummary ? field.getItemSummary(value) : "External item" : /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
1417
1839
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Link, { size: "16" }),
1418
1840
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: field.placeholder })
@@ -1422,10 +1844,12 @@ var ExternalInput = ({
1422
1844
  value && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1423
1845
  "button",
1424
1846
  {
1847
+ type: "button",
1425
1848
  className: getClassName10("detachButton"),
1426
1849
  onClick: () => {
1427
1850
  onChange(null);
1428
1851
  },
1852
+ disabled: readOnly,
1429
1853
  children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Unlock, { size: 16 })
1430
1854
  }
1431
1855
  )
@@ -1551,12 +1975,13 @@ var ExternalField = ({
1551
1975
  name,
1552
1976
  label,
1553
1977
  Label,
1554
- id
1978
+ id,
1979
+ readOnly
1555
1980
  }) => {
1556
1981
  var _a, _b, _c;
1557
1982
  const validField = field;
1558
1983
  const deprecatedField = field;
1559
- (0, import_react9.useEffect)(() => {
1984
+ (0, import_react11.useEffect)(() => {
1560
1985
  if (deprecatedField.adaptor) {
1561
1986
  console.error(
1562
1987
  "Warning: The `adaptor` API is deprecated. Please use updated APIs on the `external` field instead. This will be a breaking change in a future release."
@@ -1583,7 +2008,8 @@ var ExternalField = ({
1583
2008
  }),
1584
2009
  onChange,
1585
2010
  value,
1586
- id
2011
+ id,
2012
+ readOnly
1587
2013
  }
1588
2014
  ) });
1589
2015
  };
@@ -1764,13 +2190,14 @@ var ObjectField = ({
1764
2190
  const subField = field.objectFields[fieldName];
1765
2191
  const subFieldName = `${name}.${fieldName}`;
1766
2192
  const wildcardFieldName = `${name}.${fieldName}`;
2193
+ const subReadOnly = readOnly ? readOnly : typeof readOnlyFields[subFieldName] !== "undefined" ? readOnlyFields[subFieldName] : readOnlyFields[wildcardFieldName];
1767
2194
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1768
2195
  AutoFieldPrivate,
1769
2196
  {
1770
2197
  name: subFieldName,
1771
2198
  label: subField.label || fieldName,
1772
2199
  id: `${id}_${fieldName}`,
1773
- readOnly: typeof readOnlyFields[subFieldName] !== "undefined" ? readOnlyFields[subFieldName] : readOnlyFields[wildcardFieldName],
2200
+ readOnly: subReadOnly,
1774
2201
  field: subField,
1775
2202
  value: data[fieldName],
1776
2203
  onChange: (val, ui) => {
@@ -1791,7 +2218,7 @@ var ObjectField = ({
1791
2218
 
1792
2219
  // lib/use-safe-id.ts
1793
2220
  init_react_import();
1794
- var import_react10 = __toESM(require("react"));
2221
+ var import_react12 = __toESM(require("react"));
1795
2222
 
1796
2223
  // lib/generate-id.ts
1797
2224
  init_react_import();
@@ -1800,10 +2227,10 @@ var generateId = (type) => type ? `${type}-${(0, import_uuid.v4)()}` : (0, impor
1800
2227
 
1801
2228
  // lib/use-safe-id.ts
1802
2229
  var useSafeId = () => {
1803
- if (typeof import_react10.default.useId !== "undefined") {
1804
- return import_react10.default.useId();
2230
+ if (typeof import_react12.default.useId !== "undefined") {
2231
+ return import_react12.default.useId();
1805
2232
  }
1806
- const [id] = (0, import_react10.useState)(generateId());
2233
+ const [id] = (0, import_react12.useState)(generateId());
1807
2234
  return id;
1808
2235
  };
1809
2236
 
@@ -1836,7 +2263,7 @@ var FieldLabelInternal2 = ({
1836
2263
  readOnly
1837
2264
  }) => {
1838
2265
  const { overrides } = useAppContext();
1839
- const Wrapper = (0, import_react11.useMemo)(
2266
+ const Wrapper = (0, import_react13.useMemo)(
1840
2267
  () => overrides.fieldLabel || FieldLabel,
1841
2268
  [overrides]
1842
2269
  );
@@ -1900,7 +2327,7 @@ function AutoFieldInternal(props) {
1900
2327
  }
1901
2328
  function AutoFieldPrivate(props) {
1902
2329
  const { value, onChange } = props;
1903
- const [localValue, setLocalValue] = (0, import_react11.useState)(value);
2330
+ const [localValue, setLocalValue] = (0, import_react13.useState)(value);
1904
2331
  const onChangeDb = (0, import_use_debounce.useDebouncedCallback)(
1905
2332
  (val, ui) => {
1906
2333
  onChange(val, ui);
@@ -1908,11 +2335,11 @@ function AutoFieldPrivate(props) {
1908
2335
  50,
1909
2336
  { leading: true }
1910
2337
  );
1911
- const onChangeLocal = (0, import_react11.useCallback)((val, ui) => {
2338
+ const onChangeLocal = (0, import_react13.useCallback)((val, ui) => {
1912
2339
  setLocalValue(val);
1913
2340
  onChangeDb(val, ui);
1914
2341
  }, []);
1915
- (0, import_react11.useEffect)(() => {
2342
+ (0, import_react13.useEffect)(() => {
1916
2343
  setLocalValue(value);
1917
2344
  }, [value]);
1918
2345
  const localProps = {
@@ -1931,14 +2358,14 @@ init_react_import();
1931
2358
 
1932
2359
  // css-module:/home/runner/work/puck/puck/packages/core/components/Drawer/styles.module.css#css-module
1933
2360
  init_react_import();
1934
- var styles_module_default10 = { "Drawer": "_Drawer_4yfqn_1", "DrawerItem--disabled": "_DrawerItem--disabled_4yfqn_5", "DrawerItem-default": "_DrawerItem-default_4yfqn_11", "DrawerItem-draggableWrapper": "_DrawerItem-draggableWrapper_4yfqn_11", "DrawerItem": "_DrawerItem_4yfqn_5", "DrawerItem-draggable": "_DrawerItem-draggable_4yfqn_11", "Drawer--isDraggingFrom": "_Drawer--isDraggingFrom_4yfqn_36", "DrawerItem-name": "_DrawerItem-name_4yfqn_54" };
2361
+ var styles_module_default10 = { "Drawer": "_Drawer_1oa7v_1", "DrawerItem--disabled": "_DrawerItem--disabled_1oa7v_5", "DrawerItem-draggable": "_DrawerItem-draggable_1oa7v_5", "DrawerItem-default": "_DrawerItem-default_1oa7v_11", "DrawerItem-draggableWrapper": "_DrawerItem-draggableWrapper_1oa7v_11", "DrawerItem": "_DrawerItem_1oa7v_5", "Drawer--isDraggingFrom": "_Drawer--isDraggingFrom_1oa7v_36", "DrawerItem-name": "_DrawerItem-name_1oa7v_54" };
1935
2362
 
1936
2363
  // components/Drawer/index.tsx
1937
- var import_react12 = require("react");
2364
+ var import_react14 = require("react");
1938
2365
  var import_jsx_runtime21 = require("react/jsx-runtime");
1939
2366
  var getClassName16 = get_class_name_factory_default("Drawer", styles_module_default10);
1940
2367
  var getClassNameItem2 = get_class_name_factory_default("DrawerItem", styles_module_default10);
1941
- var drawerContext = (0, import_react12.createContext)({
2368
+ var drawerContext = (0, import_react14.createContext)({
1942
2369
  droppableId: ""
1943
2370
  });
1944
2371
  var DrawerDraggable = ({
@@ -1969,9 +2396,9 @@ var DrawerItem = ({
1969
2396
  index,
1970
2397
  isDragDisabled
1971
2398
  }) => {
1972
- const ctx = (0, import_react12.useContext)(drawerContext);
2399
+ const ctx = (0, import_react14.useContext)(drawerContext);
1973
2400
  const resolvedId = `${ctx.droppableId}::${id || name}`;
1974
- const CustomInner = (0, import_react12.useMemo)(
2401
+ const CustomInner = (0, import_react14.useMemo)(
1975
2402
  () => children || (({ children: children2, name: name2 }) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: getClassNameItem2("default"), children: children2 })),
1976
2403
  [children]
1977
2404
  );
@@ -2012,11 +2439,11 @@ Drawer.Item = DrawerItem;
2012
2439
 
2013
2440
  // components/DropZone/index.tsx
2014
2441
  init_react_import();
2015
- var import_react16 = require("react");
2442
+ var import_react18 = require("react");
2016
2443
 
2017
2444
  // components/DraggableComponent/index.tsx
2018
2445
  init_react_import();
2019
- var import_react14 = require("react");
2446
+ var import_react16 = require("react");
2020
2447
  var import_dnd4 = require("@measured/dnd");
2021
2448
 
2022
2449
  // css-module:/home/runner/work/puck/puck/packages/core/components/DraggableComponent/styles.module.css#css-module
@@ -2025,10 +2452,10 @@ var styles_module_default11 = { "DraggableComponent": "_DraggableComponent_1bhad
2025
2452
 
2026
2453
  // lib/use-modifier-held.ts
2027
2454
  init_react_import();
2028
- var import_react13 = require("react");
2455
+ var import_react15 = require("react");
2029
2456
  var useModifierHeld = (modifier) => {
2030
- const [modifierHeld, setModifierHeld] = (0, import_react13.useState)(false);
2031
- (0, import_react13.useEffect)(() => {
2457
+ const [modifierHeld, setModifierHeld] = (0, import_react15.useState)(false);
2458
+ (0, import_react15.useEffect)(() => {
2032
2459
  function downHandler({ key }) {
2033
2460
  if (key === modifier) {
2034
2461
  setModifierHeld(true);
@@ -2066,90 +2493,6 @@ init_react_import();
2066
2493
  var import_jsx_runtime22 = require("react/jsx-runtime");
2067
2494
  var DefaultOverride = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, { children });
2068
2495
 
2069
- // lib/get-permissions.ts
2070
- init_react_import();
2071
-
2072
- // lib/get-changed.ts
2073
- init_react_import();
2074
- var getChanged = (newItem, oldItem) => {
2075
- return newItem ? Object.keys(newItem.props || {}).reduce((acc, item) => {
2076
- const newItemProps = (newItem == null ? void 0 : newItem.props) || {};
2077
- const oldItemProps = (oldItem == null ? void 0 : oldItem.props) || {};
2078
- return __spreadProps(__spreadValues({}, acc), {
2079
- [item]: oldItemProps[item] !== newItemProps[item]
2080
- });
2081
- }, {}) : {};
2082
- };
2083
-
2084
- // lib/resolve-permissions.ts
2085
- init_react_import();
2086
- var resolvePermissions = ({
2087
- selectedItem,
2088
- config,
2089
- changed,
2090
- lastPermissions,
2091
- initialPermissions,
2092
- appState
2093
- }) => {
2094
- const componentConfig = selectedItem ? config.components[selectedItem.type] : null;
2095
- if (selectedItem && (componentConfig == null ? void 0 : componentConfig.resolvePermissions)) {
2096
- return componentConfig.resolvePermissions(selectedItem, {
2097
- changed,
2098
- lastPermissions,
2099
- initialPermissions,
2100
- appState
2101
- });
2102
- }
2103
- return {};
2104
- };
2105
-
2106
- // lib/get-permissions.ts
2107
- var cache = { lastPermissions: {}, lastSelected: {} };
2108
- var getPermissions = ({
2109
- selectedItem,
2110
- type,
2111
- globalPermissions,
2112
- config,
2113
- appState
2114
- }) => {
2115
- const componentType = type || selectedItem && selectedItem.type || "";
2116
- const componentId = selectedItem && selectedItem.props.id || "";
2117
- let componentPermissions = getInitialPermissions({
2118
- componentType,
2119
- config,
2120
- globalPermissions
2121
- });
2122
- const changed = getChanged(selectedItem, cache.lastSelected);
2123
- if (Object.values(changed).some((el) => el === true)) {
2124
- const resolvedPermissions = resolvePermissions({
2125
- selectedItem,
2126
- config,
2127
- changed,
2128
- lastPermissions: cache.lastPermissions[componentId] || componentPermissions,
2129
- initialPermissions: componentPermissions,
2130
- appState
2131
- });
2132
- if (resolvedPermissions !== void 0) {
2133
- componentPermissions = __spreadValues(__spreadValues({}, componentPermissions), resolvedPermissions);
2134
- }
2135
- cache.lastSelected = selectedItem;
2136
- cache.lastPermissions[componentId] = componentPermissions;
2137
- return componentPermissions;
2138
- }
2139
- if (Object.keys(componentId && cache.lastPermissions[componentId]).length !== 0) {
2140
- componentPermissions = cache.lastPermissions[componentId];
2141
- }
2142
- return componentPermissions;
2143
- };
2144
- var getInitialPermissions = ({
2145
- componentType,
2146
- globalPermissions,
2147
- config
2148
- }) => {
2149
- var _a;
2150
- return __spreadValues(__spreadValues({}, globalPermissions), (_a = config.components[componentType]) == null ? void 0 : _a.permissions);
2151
- };
2152
-
2153
2496
  // components/DraggableComponent/index.tsx
2154
2497
  var import_jsx_runtime23 = require("react/jsx-runtime");
2155
2498
  var getClassName17 = get_class_name_factory_default("DraggableComponent", styles_module_default11);
@@ -2160,7 +2503,7 @@ var actionsRight = space;
2160
2503
  var DefaultActionBar = ({
2161
2504
  label,
2162
2505
  children
2163
- }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ActionBar, { label, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(DefaultOverride, { children }) });
2506
+ }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ActionBar, { label, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ActionBar.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(DefaultOverride, { children }) }) });
2164
2507
  var DraggableComponent = ({
2165
2508
  children,
2166
2509
  id,
@@ -2183,34 +2526,22 @@ var DraggableComponent = ({
2183
2526
  indicativeHover = false,
2184
2527
  style
2185
2528
  }) => {
2186
- const {
2187
- zoomConfig,
2188
- status,
2189
- overrides,
2190
- plugins,
2191
- selectedItem,
2192
- config,
2193
- globalPermissions,
2194
- state
2195
- } = useAppContext();
2529
+ const { zoomConfig, status, overrides, selectedItem, getPermissions } = useAppContext();
2196
2530
  const isModifierHeld = useModifierHeld("Alt");
2197
2531
  const El = status !== "LOADING" ? import_dnd4.Draggable : DefaultDraggable;
2198
- (0, import_react14.useEffect)(onMount, []);
2199
- const [disableSecondaryAnimation, setDisableSecondaryAnimation] = (0, import_react14.useState)(false);
2200
- (0, import_react14.useEffect)(() => {
2532
+ (0, import_react16.useEffect)(onMount, []);
2533
+ const [disableSecondaryAnimation, setDisableSecondaryAnimation] = (0, import_react16.useState)(false);
2534
+ (0, import_react16.useEffect)(() => {
2201
2535
  if (isIos()) {
2202
2536
  setDisableSecondaryAnimation(true);
2203
2537
  }
2204
2538
  }, []);
2205
- const CustomActionBar = (0, import_react14.useMemo)(
2539
+ const CustomActionBar = (0, import_react16.useMemo)(
2206
2540
  () => overrides.actionBar || DefaultActionBar,
2207
2541
  [overrides.actionBar]
2208
2542
  );
2209
- const permissions = selectedItem && getPermissions({
2210
- selectedItem,
2211
- globalPermissions: globalPermissions || {},
2212
- config,
2213
- appState: state
2543
+ const permissions = getPermissions({
2544
+ item: selectedItem
2214
2545
  });
2215
2546
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2216
2547
  El,
@@ -2233,7 +2564,7 @@ var DraggableComponent = ({
2233
2564
  indicativeHover
2234
2565
  }),
2235
2566
  style: __spreadProps(__spreadValues(__spreadValues({}, style), provided.draggableProps.style), {
2236
- cursor: isModifierHeld || isDragDisabled ? "initial" : "grab"
2567
+ cursor: isModifierHeld || isDragDisabled ? "pointer" : "grab"
2237
2568
  }),
2238
2569
  onMouseOver,
2239
2570
  onMouseOut,
@@ -2260,8 +2591,8 @@ var DraggableComponent = ({
2260
2591
  right: actionsRight / zoomConfig.zoom
2261
2592
  },
2262
2593
  children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(CustomActionBar, { label, children: [
2263
- permissions && permissions.duplicate && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ActionBar.Action, { onClick: onDuplicate, label: "Duplicate", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Copy, { size: 16 }) }),
2264
- permissions && permissions.delete && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ActionBar.Action, { onClick: onDelete, label: "Delete", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Trash, { size: 16 }) })
2594
+ permissions.duplicate && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ActionBar.Action, { onClick: onDuplicate, label: "Duplicate", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Copy, { size: 16 }) }),
2595
+ permissions.delete && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ActionBar.Action, { onClick: onDelete, label: "Delete", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Trash, { size: 16 }) })
2265
2596
  ] })
2266
2597
  }
2267
2598
  )
@@ -2283,7 +2614,7 @@ var styles_module_default12 = { "DropZone": "_DropZone_djoti_1", "DropZone-conte
2283
2614
 
2284
2615
  // components/DropZone/context.tsx
2285
2616
  init_react_import();
2286
- var import_react15 = require("react");
2617
+ var import_react17 = require("react");
2287
2618
  var import_use_debounce2 = require("use-debounce");
2288
2619
 
2289
2620
  // lib/get-zone-id.ts
@@ -2300,29 +2631,29 @@ var getZoneId = (zoneCompound) => {
2300
2631
 
2301
2632
  // components/DropZone/context.tsx
2302
2633
  var import_jsx_runtime24 = require("react/jsx-runtime");
2303
- var dropZoneContext = (0, import_react15.createContext)(null);
2634
+ var dropZoneContext = (0, import_react17.createContext)(null);
2304
2635
  var DropZoneProvider = ({
2305
2636
  children,
2306
2637
  value
2307
2638
  }) => {
2308
- const [hoveringArea, setHoveringArea] = (0, import_react15.useState)(null);
2309
- const [hoveringZone, setHoveringZone] = (0, import_react15.useState)(
2639
+ const [hoveringArea, setHoveringArea] = (0, import_react17.useState)(null);
2640
+ const [hoveringZone, setHoveringZone] = (0, import_react17.useState)(
2310
2641
  rootDroppableId
2311
2642
  );
2312
- const [hoveringComponent, setHoveringComponent] = (0, import_react15.useState)();
2643
+ const [hoveringComponent, setHoveringComponent] = (0, import_react17.useState)();
2313
2644
  const [hoveringAreaDb] = (0, import_use_debounce2.useDebounce)(hoveringArea, 75, { leading: false });
2314
- const [areasWithZones, setAreasWithZones] = (0, import_react15.useState)(
2645
+ const [areasWithZones, setAreasWithZones] = (0, import_react17.useState)(
2315
2646
  {}
2316
2647
  );
2317
- const [activeZones, setActiveZones] = (0, import_react15.useState)({});
2648
+ const [activeZones, setActiveZones] = (0, import_react17.useState)({});
2318
2649
  const { dispatch = null } = value ? value : {};
2319
- const registerZoneArea = (0, import_react15.useCallback)(
2650
+ const registerZoneArea = (0, import_react17.useCallback)(
2320
2651
  (area) => {
2321
2652
  setAreasWithZones((latest) => __spreadProps(__spreadValues({}, latest), { [area]: true }));
2322
2653
  },
2323
2654
  [setAreasWithZones]
2324
2655
  );
2325
- const registerZone = (0, import_react15.useCallback)(
2656
+ const registerZone = (0, import_react17.useCallback)(
2326
2657
  (zoneCompound) => {
2327
2658
  if (!dispatch) {
2328
2659
  return;
@@ -2335,7 +2666,7 @@ var DropZoneProvider = ({
2335
2666
  },
2336
2667
  [setActiveZones, dispatch]
2337
2668
  );
2338
- const unregisterZone = (0, import_react15.useCallback)(
2669
+ const unregisterZone = (0, import_react17.useCallback)(
2339
2670
  (zoneCompound) => {
2340
2671
  if (!dispatch) {
2341
2672
  return;
@@ -2350,8 +2681,8 @@ var DropZoneProvider = ({
2350
2681
  },
2351
2682
  [setActiveZones, dispatch]
2352
2683
  );
2353
- const [pathData, setPathData] = (0, import_react15.useState)();
2354
- const registerPath = (0, import_react15.useCallback)(
2684
+ const [pathData, setPathData] = (0, import_react17.useState)();
2685
+ const registerPath = (0, import_react17.useCallback)(
2355
2686
  (selector) => {
2356
2687
  if (!(value == null ? void 0 : value.data)) {
2357
2688
  return;
@@ -2376,7 +2707,7 @@ var DropZoneProvider = ({
2376
2707
  },
2377
2708
  [value, setPathData]
2378
2709
  );
2379
- const [zoneWillDrag, setZoneWillDrag] = (0, import_react15.useState)("");
2710
+ const [zoneWillDrag, setZoneWillDrag] = (0, import_react17.useState)("");
2380
2711
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_jsx_runtime24.Fragment, { children: value && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2381
2712
  dropZoneContext.Provider,
2382
2713
  {
@@ -2408,7 +2739,7 @@ var getClassName18 = get_class_name_factory_default("DropZone", styles_module_de
2408
2739
  function DropZoneEdit({ zone, allow, disallow, style }) {
2409
2740
  var _a;
2410
2741
  const appContext2 = useAppContext();
2411
- const ctx = (0, import_react16.useContext)(dropZoneContext);
2742
+ const ctx = (0, import_react18.useContext)(dropZoneContext);
2412
2743
  const {
2413
2744
  // These all need setting via context
2414
2745
  data,
@@ -2427,12 +2758,12 @@ function DropZoneEdit({ zone, allow, disallow, style }) {
2427
2758
  } = ctx || {};
2428
2759
  let content = data.content || [];
2429
2760
  let zoneCompound = rootDroppableId;
2430
- (0, import_react16.useEffect)(() => {
2761
+ (0, import_react18.useEffect)(() => {
2431
2762
  if (areaId && registerZoneArea) {
2432
2763
  registerZoneArea(areaId);
2433
2764
  }
2434
2765
  }, [areaId]);
2435
- (0, import_react16.useEffect)(() => {
2766
+ (0, import_react18.useEffect)(() => {
2436
2767
  if (ctx == null ? void 0 : ctx.registerZone) {
2437
2768
  ctx == null ? void 0 : ctx.registerZone(zoneCompound);
2438
2769
  }
@@ -2559,14 +2890,11 @@ function DropZoneEdit({ zone, allow, disallow, style }) {
2559
2890
  ] });
2560
2891
  const componentConfig = config.components[item.type];
2561
2892
  const label = (_b = componentConfig == null ? void 0 : componentConfig["label"]) != null ? _b : item.type.toString();
2562
- const canDrag = getPermissions({
2563
- selectedItem: getItem(
2893
+ const canDrag = appContext2.getPermissions({
2894
+ item: getItem(
2564
2895
  { index: i, zone: zoneCompound },
2565
2896
  appContext2.state.data
2566
- ),
2567
- config: appContext2.config,
2568
- globalPermissions: appContext2.globalPermissions || {},
2569
- appState: appContext2.state
2897
+ )
2570
2898
  }).drag;
2571
2899
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
2572
2900
  "div",
@@ -2591,7 +2919,7 @@ function DropZoneEdit({ zone, allow, disallow, style }) {
2591
2919
  forceHover: hoveringComponent === componentId && !userIsDragging,
2592
2920
  isDragDisabled: !canDrag,
2593
2921
  indicativeHover: userIsDragging && containsZone && hoveringArea === componentId,
2594
- isLoading: (_c = appContext2.componentState[componentId]) == null ? void 0 : _c.loading,
2922
+ isLoading: ((_c = appContext2.componentState[componentId]) == null ? void 0 : _c.loadingCount) > 0,
2595
2923
  onMount: () => {
2596
2924
  ctx.registerPath({
2597
2925
  index: i,
@@ -2691,7 +3019,7 @@ function DropZoneEdit({ zone, allow, disallow, style }) {
2691
3019
  );
2692
3020
  }
2693
3021
  function DropZoneRender({ zone }) {
2694
- const ctx = (0, import_react16.useContext)(dropZoneContext);
3022
+ const ctx = (0, import_react18.useContext)(dropZoneContext);
2695
3023
  const { data, areaId = "root", config } = ctx || {};
2696
3024
  let zoneCompound = rootDroppableId;
2697
3025
  let content = (data == null ? void 0 : data.content) || [];
@@ -2723,7 +3051,7 @@ function DropZoneRender({ zone }) {
2723
3051
  }) });
2724
3052
  }
2725
3053
  function DropZone(props) {
2726
- const ctx = (0, import_react16.useContext)(dropZoneContext);
3054
+ const ctx = (0, import_react18.useContext)(dropZoneContext);
2727
3055
  if ((ctx == null ? void 0 : ctx.mode) === "edit") {
2728
3056
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DropZoneEdit, __spreadValues({}, props));
2729
3057
  }
@@ -2732,11 +3060,11 @@ function DropZone(props) {
2732
3060
 
2733
3061
  // components/Puck/index.tsx
2734
3062
  init_react_import();
2735
- var import_react31 = require("react");
3063
+ var import_react32 = require("react");
2736
3064
 
2737
3065
  // lib/use-placeholder-style.ts
2738
3066
  init_react_import();
2739
- var import_react17 = require("react");
3067
+ var import_react19 = require("react");
2740
3068
 
2741
3069
  // lib/get-frame.ts
2742
3070
  init_react_import();
@@ -2751,7 +3079,7 @@ var getFrame = () => {
2751
3079
  // lib/use-placeholder-style.ts
2752
3080
  var usePlaceholderStyle = () => {
2753
3081
  const queryAttr = "data-rfd-drag-handle-draggable-id";
2754
- const [placeholderStyle, setPlaceholderStyle] = (0, import_react17.useState)();
3082
+ const [placeholderStyle, setPlaceholderStyle] = (0, import_react19.useState)();
2755
3083
  const onDragStartOrUpdate = (draggedItem) => {
2756
3084
  var _a;
2757
3085
  const draggableId = draggedItem.draggableId;
@@ -2804,7 +3132,7 @@ var styles_module_default13 = { "SidebarSection": "_SidebarSection_125qe_1", "Si
2804
3132
 
2805
3133
  // lib/use-breadcrumbs.ts
2806
3134
  init_react_import();
2807
- var import_react18 = require("react");
3135
+ var import_react20 = require("react");
2808
3136
  var convertPathDataToBreadcrumbs = (selectedItem, pathData, data) => {
2809
3137
  const id = selectedItem ? selectedItem == null ? void 0 : selectedItem.props.id : "";
2810
3138
  const currentPathData = pathData && id && pathData[id] ? __spreadValues({}, pathData[id]) : { label: "Page", path: [] };
@@ -2854,8 +3182,8 @@ var useBreadcrumbs = (renderCount) => {
2854
3182
  state: { data },
2855
3183
  selectedItem
2856
3184
  } = useAppContext();
2857
- const dzContext = (0, import_react18.useContext)(dropZoneContext);
2858
- return (0, import_react18.useMemo)(() => {
3185
+ const dzContext = (0, import_react20.useContext)(dropZoneContext);
3186
+ return (0, import_react20.useMemo)(() => {
2859
3187
  const breadcrumbs = convertPathDataToBreadcrumbs(
2860
3188
  selectedItem,
2861
3189
  dzContext == null ? void 0 : dzContext.pathData,
@@ -2893,6 +3221,7 @@ var SidebarSection = ({
2893
3221
  /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2894
3222
  "button",
2895
3223
  {
3224
+ type: "button",
2896
3225
  className: getClassName19("breadcrumbLabel"),
2897
3226
  onClick: () => setUi({ itemSelector: breadcrumb.selector }),
2898
3227
  children: breadcrumb.label
@@ -2933,7 +3262,7 @@ var remove = (list, index) => {
2933
3262
 
2934
3263
  // lib/reduce-related-zones.ts
2935
3264
  init_react_import();
2936
- var reduceRelatedZones = (item, data, fn) => {
3265
+ function reduceRelatedZones(item, data, fn) {
2937
3266
  return __spreadProps(__spreadValues({}, data), {
2938
3267
  zones: Object.keys(data.zones || {}).reduce(
2939
3268
  (acc, key) => {
@@ -2947,7 +3276,7 @@ var reduceRelatedZones = (item, data, fn) => {
2947
3276
  {}
2948
3277
  )
2949
3278
  });
2950
- };
3279
+ }
2951
3280
  var findRelatedByZoneId = (zoneId, data) => {
2952
3281
  const [zoneParentId] = getZoneId(zoneId);
2953
3282
  return (data.zones[zoneId] || []).reduce(
@@ -2984,7 +3313,7 @@ var removeRelatedZones = (item, data) => {
2984
3313
  });
2985
3314
  return newData;
2986
3315
  };
2987
- var duplicateRelatedZones = (item, data, newId) => {
3316
+ function duplicateRelatedZones(item, data, newId) {
2988
3317
  return reduceRelatedZones(item, data, (acc, key, zone) => {
2989
3318
  const dupedZone = zone.map((zoneItem) => __spreadProps(__spreadValues({}, zoneItem), {
2990
3319
  props: __spreadProps(__spreadValues({}, zoneItem.props), { id: generateId(zoneItem.type) })
@@ -2999,7 +3328,7 @@ var duplicateRelatedZones = (item, data, newId) => {
2999
3328
  [`${newId}:${zoneId}`]: dupedZone
3000
3329
  });
3001
3330
  });
3002
- };
3331
+ }
3003
3332
 
3004
3333
  // reducer/data.ts
3005
3334
  var zoneCache = {};
@@ -3023,7 +3352,7 @@ var replaceAction = (data, action) => {
3023
3352
  })
3024
3353
  });
3025
3354
  };
3026
- var insertAction = (data, action, config) => {
3355
+ function insertAction(data, action, config) {
3027
3356
  const emptyComponentData = {
3028
3357
  type: action.componentType,
3029
3358
  props: __spreadProps(__spreadValues({}, config.components[action.componentType].defaultProps || {}), {
@@ -3049,8 +3378,8 @@ var insertAction = (data, action, config) => {
3049
3378
  )
3050
3379
  })
3051
3380
  });
3052
- };
3053
- var reduceData = (data, action, config) => {
3381
+ }
3382
+ function reduceData(data, action, config) {
3054
3383
  if (action.type === "insert") {
3055
3384
  return insertAction(data, action, config);
3056
3385
  }
@@ -3193,277 +3522,87 @@ var reduceData = (data, action, config) => {
3193
3522
  return __spreadProps(__spreadValues({}, data), { zones: _zones });
3194
3523
  }
3195
3524
  if (action.type === "setData") {
3196
- if (typeof action.data === "object") {
3197
- return __spreadValues(__spreadValues({}, data), action.data);
3198
- }
3199
- return __spreadValues(__spreadValues({}, data), action.data(data));
3200
- }
3201
- return data;
3202
- };
3203
-
3204
- // reducer/state.ts
3205
- init_react_import();
3206
- var reduceUi = (ui, action) => {
3207
- if (action.type === "setUi") {
3208
- if (typeof action.ui === "object") {
3209
- return __spreadValues(__spreadValues({}, ui), action.ui);
3210
- }
3211
- return __spreadValues(__spreadValues({}, ui), action.ui(ui));
3212
- }
3213
- return ui;
3214
- };
3215
-
3216
- // reducer/actions.tsx
3217
- init_react_import();
3218
-
3219
- // reducer/index.ts
3220
- var storeInterceptor = (reducer, record, onAction) => {
3221
- return (state, action) => {
3222
- const newAppState = reducer(state, action);
3223
- const isValidType = ![
3224
- "registerZone",
3225
- "unregisterZone",
3226
- "setData",
3227
- "setUi",
3228
- "set"
3229
- ].includes(action.type);
3230
- if (typeof action.recordHistory !== "undefined" ? action.recordHistory : isValidType) {
3231
- if (record) record(newAppState);
3232
- }
3233
- onAction == null ? void 0 : onAction(action, newAppState, state);
3234
- return newAppState;
3235
- };
3236
- };
3237
- var setAction = (state, action) => {
3238
- if (typeof action.state === "object") {
3239
- return __spreadValues(__spreadValues({}, state), action.state);
3240
- }
3241
- return __spreadValues(__spreadValues({}, state), action.state(state));
3242
- };
3243
- function createReducer({
3244
- config,
3245
- record,
3246
- onAction
3247
- }) {
3248
- return storeInterceptor(
3249
- (state, action) => {
3250
- const data = reduceData(state.data, action, config);
3251
- const ui = reduceUi(state.ui, action);
3252
- if (action.type === "set") {
3253
- return setAction(state, action);
3254
- }
3255
- return { data, ui };
3256
- },
3257
- record,
3258
- onAction
3259
- );
3260
- }
3261
-
3262
- // lib/flush-zones.ts
3263
- init_react_import();
3264
- var flushZones = (appState) => {
3265
- const containsZones = typeof appState.data.zones !== "undefined";
3266
- if (containsZones) {
3267
- Object.keys(appState.data.zones || {}).forEach((zone) => {
3268
- addToZoneCache(zone, appState.data.zones[zone]);
3269
- });
3270
- return __spreadProps(__spreadValues({}, appState), {
3271
- data: __spreadProps(__spreadValues({}, appState.data), {
3272
- zones: {}
3273
- })
3274
- });
3275
- }
3276
- return appState;
3277
- };
3278
-
3279
- // lib/use-resolved-data.ts
3280
- init_react_import();
3281
- var import_react19 = require("react");
3282
-
3283
- // lib/resolve-component-data.ts
3284
- init_react_import();
3285
- var cache2 = { lastChange: {} };
3286
- var resolveAllComponentData = (content, config, onResolveStart, onResolveEnd) => __async(void 0, null, function* () {
3287
- return yield Promise.all(
3288
- content.map((item) => __async(void 0, null, function* () {
3289
- return yield resolveComponentData(
3290
- item,
3291
- config,
3292
- onResolveStart,
3293
- onResolveEnd
3294
- );
3295
- }))
3296
- );
3297
- });
3298
- var resolveComponentData = (item, config, onResolveStart, onResolveEnd) => __async(void 0, null, function* () {
3299
- const configForItem = config.components[item.type];
3300
- if (configForItem.resolveData) {
3301
- const { item: oldItem = {}, resolved = {} } = cache2.lastChange[item.props.id] || {};
3302
- if (item && item === oldItem) {
3303
- return resolved;
3304
- }
3305
- const changed = getChanged(item, oldItem);
3306
- if (onResolveStart) {
3307
- onResolveStart(item);
3308
- }
3309
- const { props: resolvedProps, readOnly = {} } = yield configForItem.resolveData(item, { changed, lastData: oldItem });
3310
- const { readOnly: existingReadOnly = {} } = item || {};
3311
- const newReadOnly = __spreadValues(__spreadValues({}, existingReadOnly), readOnly);
3312
- const resolvedItem = __spreadProps(__spreadValues({}, item), {
3313
- props: __spreadValues(__spreadValues({}, item.props), resolvedProps)
3314
- });
3315
- if (Object.keys(newReadOnly).length) {
3316
- resolvedItem.readOnly = newReadOnly;
3317
- }
3318
- cache2.lastChange[item.props.id] = {
3319
- item,
3320
- resolved: resolvedItem
3321
- };
3322
- if (onResolveEnd) {
3323
- onResolveEnd(resolvedItem);
3324
- }
3325
- return resolvedItem;
3326
- }
3327
- return item;
3328
- });
3329
-
3330
- // lib/apply-dynamic-props.ts
3331
- init_react_import();
3332
- var applyDynamicProps = (data, dynamicProps, rootData) => {
3333
- return __spreadProps(__spreadValues({}, data), {
3334
- root: __spreadValues(__spreadValues({}, data.root), rootData ? rootData : {}),
3335
- content: data.content.map((item) => {
3336
- return dynamicProps[item.props.id] ? __spreadValues(__spreadValues({}, item), dynamicProps[item.props.id]) : item;
3337
- }),
3338
- zones: Object.keys(data.zones || {}).reduce((acc, zoneKey) => {
3339
- return __spreadProps(__spreadValues({}, acc), {
3340
- [zoneKey]: data.zones[zoneKey].map((item) => {
3341
- return dynamicProps[item.props.id] ? __spreadValues(__spreadValues({}, item), dynamicProps[item.props.id]) : item;
3342
- })
3343
- });
3344
- }, {})
3345
- });
3525
+ if (typeof action.data === "object") {
3526
+ return __spreadValues(__spreadValues({}, data), action.data);
3527
+ }
3528
+ return __spreadValues(__spreadValues({}, data), action.data(data));
3529
+ }
3530
+ return data;
3531
+ }
3532
+
3533
+ // reducer/state.ts
3534
+ init_react_import();
3535
+ var reduceUi = (ui, action) => {
3536
+ if (action.type === "setUi") {
3537
+ if (typeof action.ui === "object") {
3538
+ return __spreadValues(__spreadValues({}, ui), action.ui);
3539
+ }
3540
+ return __spreadValues(__spreadValues({}, ui), action.ui(ui));
3541
+ }
3542
+ return ui;
3346
3543
  };
3347
3544
 
3348
- // lib/resolve-root-data.ts
3545
+ // reducer/actions.tsx
3349
3546
  init_react_import();
3350
- var cache3 = {};
3351
- function resolveRootData(data, config) {
3352
- return __async(this, null, function* () {
3353
- var _a, _b, _c, _d, _e;
3354
- if (((_a = config.root) == null ? void 0 : _a.resolveData) && data.root.props) {
3355
- if (((_b = cache3.lastChange) == null ? void 0 : _b.original) === data.root) {
3356
- return cache3.lastChange.resolved;
3357
- }
3358
- const changed = getChanged(data.root, (_c = cache3.lastChange) == null ? void 0 : _c.original);
3359
- const rootWithProps = data.root;
3360
- const resolvedRoot = yield (_e = config.root) == null ? void 0 : _e.resolveData(rootWithProps, {
3361
- changed,
3362
- lastData: ((_d = cache3.lastChange) == null ? void 0 : _d.original) || {}
3363
- });
3364
- cache3.lastChange = {
3365
- original: data.root,
3366
- resolved: resolvedRoot
3367
- };
3368
- return __spreadProps(__spreadValues(__spreadValues({}, data.root), resolvedRoot), {
3369
- props: __spreadValues(__spreadValues({}, data.root.props), resolvedRoot.props)
3370
- });
3547
+
3548
+ // reducer/index.ts
3549
+ function storeInterceptor(reducer, record, onAction) {
3550
+ return (state, action) => {
3551
+ const newAppState = reducer(state, action);
3552
+ const isValidType = ![
3553
+ "registerZone",
3554
+ "unregisterZone",
3555
+ "setData",
3556
+ "setUi",
3557
+ "set"
3558
+ ].includes(action.type);
3559
+ if (typeof action.recordHistory !== "undefined" ? action.recordHistory : isValidType) {
3560
+ if (record) record(newAppState);
3371
3561
  }
3372
- return data.root;
3373
- });
3562
+ onAction == null ? void 0 : onAction(action, newAppState, state);
3563
+ return newAppState;
3564
+ };
3374
3565
  }
3375
-
3376
- // lib/use-resolved-data.ts
3377
- var useResolvedData = (appState, config, dispatch) => {
3378
- const [{ resolverKey, newAppState }, setResolverState] = (0, import_react19.useState)({
3379
- resolverKey: 0,
3380
- newAppState: appState
3381
- });
3382
- const [componentState, setComponentState] = (0, import_react19.useState)({});
3383
- const deferredSetStates = {};
3384
- const setComponentLoading = (0, import_react19.useCallback)(
3385
- (id, loading, defer2 = 0) => {
3386
- if (deferredSetStates[id]) {
3387
- clearTimeout(deferredSetStates[id]);
3388
- delete deferredSetStates[id];
3566
+ var setAction = (state, action) => {
3567
+ if (typeof action.state === "object") {
3568
+ return __spreadValues(__spreadValues({}, state), action.state);
3569
+ }
3570
+ return __spreadValues(__spreadValues({}, state), action.state(state));
3571
+ };
3572
+ function createReducer({
3573
+ config,
3574
+ record,
3575
+ onAction
3576
+ }) {
3577
+ return storeInterceptor(
3578
+ (state, action) => {
3579
+ const data = reduceData(state.data, action, config);
3580
+ const ui = reduceUi(state.ui, action);
3581
+ if (action.type === "set") {
3582
+ return setAction(state, action);
3389
3583
  }
3390
- deferredSetStates[id] = setTimeout(() => {
3391
- setComponentState((prev) => __spreadProps(__spreadValues({}, prev), {
3392
- [id]: __spreadProps(__spreadValues({}, prev[id]), { loading })
3393
- }));
3394
- delete deferredSetStates[id];
3395
- }, defer2);
3584
+ return { data, ui };
3396
3585
  },
3397
- []
3586
+ record,
3587
+ onAction
3398
3588
  );
3399
- const runResolvers = () => __async(void 0, null, function* () {
3400
- const newData = newAppState.data;
3401
- const flatContent = Object.keys(newData.zones || {}).reduce((acc, zone) => [...acc, ...newData.zones[zone]], newData.content).filter((item) => {
3402
- var _a;
3403
- return !!((_a = config.components[item.type]) == null ? void 0 : _a.resolveData);
3589
+ }
3590
+
3591
+ // lib/flush-zones.ts
3592
+ init_react_import();
3593
+ var flushZones = (appState) => {
3594
+ const containsZones = typeof appState.data.zones !== "undefined";
3595
+ if (containsZones) {
3596
+ Object.keys(appState.data.zones || {}).forEach((zone) => {
3597
+ addToZoneCache(zone, appState.data.zones[zone]);
3404
3598
  });
3405
- const applyIfChange = (dynamicDataMap, dynamicRoot) => {
3406
- const processed = applyDynamicProps(
3407
- appState.data,
3408
- dynamicDataMap,
3409
- dynamicRoot
3410
- );
3411
- const processedAppState = __spreadProps(__spreadValues({}, appState), { data: processed });
3412
- const containsChanges = JSON.stringify(appState) !== JSON.stringify(processedAppState);
3413
- if (containsChanges) {
3414
- dispatch({
3415
- type: "set",
3416
- state: (prev) => __spreadProps(__spreadValues({}, prev), {
3417
- data: applyDynamicProps(prev.data, dynamicDataMap, dynamicRoot),
3418
- ui: resolverKey > 0 ? __spreadValues(__spreadValues({}, prev.ui), newAppState.ui) : prev.ui
3419
- }),
3420
- recordHistory: resolverKey > 0
3421
- });
3422
- }
3423
- };
3424
- const promises = [];
3425
- promises.push(
3426
- (() => __async(void 0, null, function* () {
3427
- setComponentLoading("puck-root", true, 50);
3428
- const dynamicRoot = yield resolveRootData(newData, config);
3429
- applyIfChange({}, dynamicRoot);
3430
- setComponentLoading("puck-root", false);
3431
- }))()
3432
- );
3433
- flatContent.forEach((item) => {
3434
- promises.push(
3435
- (() => __async(void 0, null, function* () {
3436
- const dynamicData = yield resolveComponentData(
3437
- item,
3438
- config,
3439
- (item2) => {
3440
- setComponentLoading(item2.props.id, true, 50);
3441
- },
3442
- (item2) => {
3443
- deferredSetStates[item2.props.id];
3444
- setComponentLoading(item2.props.id, false);
3445
- }
3446
- );
3447
- const dynamicDataMap = { [item.props.id]: dynamicData };
3448
- applyIfChange(dynamicDataMap);
3449
- }))()
3450
- );
3599
+ return __spreadProps(__spreadValues({}, appState), {
3600
+ data: __spreadProps(__spreadValues({}, appState.data), {
3601
+ zones: {}
3602
+ })
3451
3603
  });
3452
- yield Promise.all(promises);
3453
- });
3454
- (0, import_react19.useEffect)(() => {
3455
- runResolvers();
3456
- }, [resolverKey]);
3457
- const resolveData = (0, import_react19.useCallback)((newAppState2 = appState) => {
3458
- setResolverState((curr) => ({
3459
- resolverKey: curr.resolverKey + 1,
3460
- newAppState: newAppState2
3461
- }));
3462
- }, []);
3463
- return {
3464
- resolveData,
3465
- componentState
3466
- };
3604
+ }
3605
+ return appState;
3467
3606
  };
3468
3607
 
3469
3608
  // components/MenuBar/index.tsx
@@ -3476,15 +3615,14 @@ var styles_module_default14 = { "MenuBar": "_MenuBar_8pf8c_1", "MenuBar--menuOpe
3476
3615
  // components/MenuBar/index.tsx
3477
3616
  var import_jsx_runtime27 = require("react/jsx-runtime");
3478
3617
  var getClassName20 = get_class_name_factory_default("MenuBar", styles_module_default14);
3479
- var MenuBar = ({
3618
+ function MenuBar({
3480
3619
  appState,
3481
- data = { content: [], root: {} },
3482
3620
  dispatch,
3483
3621
  menuOpen = false,
3484
3622
  onPublish,
3485
3623
  renderHeaderActions,
3486
3624
  setMenuOpen
3487
- }) => {
3625
+ }) {
3488
3626
  const {
3489
3627
  history: { back, forward, historyStore }
3490
3628
  } = useAppContext();
@@ -3515,7 +3653,7 @@ var MenuBar = ({
3515
3653
  ] })
3516
3654
  }
3517
3655
  );
3518
- };
3656
+ }
3519
3657
 
3520
3658
  // css-module:/home/runner/work/puck/puck/packages/core/components/Puck/styles.module.css#css-module
3521
3659
  init_react_import();
@@ -3529,7 +3667,7 @@ init_react_import();
3529
3667
  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" };
3530
3668
 
3531
3669
  // components/Puck/components/Fields/index.tsx
3532
- var import_react20 = require("react");
3670
+ var import_react21 = require("react");
3533
3671
  var import_jsx_runtime28 = require("react/jsx-runtime");
3534
3672
  var getClassName21 = get_class_name_factory_default("PuckFields", styles_module_default16);
3535
3673
  var defaultPageFields = {
@@ -3548,15 +3686,15 @@ var useResolvedFields = () => {
3548
3686
  const componentConfig = selectedItem ? config.components[selectedItem.type] : null;
3549
3687
  const defaultFields = selectedItem ? componentConfig == null ? void 0 : componentConfig.fields : rootFields;
3550
3688
  const rootProps = data.root.props || data.root;
3551
- const [lastSelectedData, setLastSelectedData] = (0, import_react20.useState)({});
3552
- const [resolvedFields, setResolvedFields] = (0, import_react20.useState)(defaultFields || {});
3553
- const [fieldsLoading, setFieldsLoading] = (0, import_react20.useState)(false);
3689
+ const [lastSelectedData, setLastSelectedData] = (0, import_react21.useState)({});
3690
+ const [resolvedFields, setResolvedFields] = (0, import_react21.useState)(defaultFields || {});
3691
+ const [fieldsLoading, setFieldsLoading] = (0, import_react21.useState)(false);
3554
3692
  const defaultResolveFields = (_componentData, _params) => defaultFields;
3555
3693
  const componentData = selectedItem ? selectedItem : { props: rootProps, readOnly: data.root.readOnly };
3556
- const resolveFields = (0, import_react20.useCallback)(
3694
+ const resolveFields = (0, import_react21.useCallback)(
3557
3695
  (..._0) => __async(void 0, [..._0], function* (fields = {}) {
3558
3696
  var _a2, _b, _c;
3559
- const lastData = ((_a2 = lastSelectedData.props) == null ? void 0 : _a2.id) === componentData.props.id ? lastSelectedData : {};
3697
+ const lastData = ((_a2 = lastSelectedData.props) == null ? void 0 : _a2.id) === componentData.props.id ? lastSelectedData : null;
3560
3698
  const changed = getChanged(componentData, lastData);
3561
3699
  setLastSelectedData(componentData);
3562
3700
  if (selectedItem && (componentConfig == null ? void 0 : componentConfig.resolveFields)) {
@@ -3589,13 +3727,13 @@ var useResolvedFields = () => {
3589
3727
  }),
3590
3728
  [data, config, componentData, selectedItem, resolvedFields, state]
3591
3729
  );
3592
- (0, import_react20.useEffect)(() => {
3730
+ (0, import_react21.useEffect)(() => {
3593
3731
  setFieldsLoading(true);
3594
3732
  resolveFields(defaultFields).then((fields) => {
3595
3733
  setResolvedFields(fields || {});
3596
3734
  setFieldsLoading(false);
3597
3735
  });
3598
- }, [data, defaultFields]);
3736
+ }, [data, defaultFields, state.ui.itemSelector]);
3599
3737
  return [resolvedFields, fieldsLoading];
3600
3738
  };
3601
3739
  var Fields = () => {
@@ -3607,16 +3745,16 @@ var Fields = () => {
3607
3745
  config,
3608
3746
  resolveData,
3609
3747
  componentState,
3610
- overrides,
3611
- globalPermissions
3748
+ overrides
3612
3749
  } = useAppContext();
3613
3750
  const { data, ui } = state;
3614
3751
  const { itemSelector } = ui;
3615
3752
  const [fields, fieldsResolving] = useResolvedFields();
3616
- const componentResolving = selectedItem ? (_a = componentState[selectedItem == null ? void 0 : selectedItem.props.id]) == null ? void 0 : _a.loading : (_b = componentState["puck-root"]) == null ? void 0 : _b.loading;
3753
+ const { getPermissions } = useAppContext();
3754
+ 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;
3617
3755
  const isLoading = fieldsResolving || componentResolving;
3618
3756
  const rootProps = data.root.props || data.root;
3619
- const Wrapper = (0, import_react20.useMemo)(() => overrides.fields || DefaultFields, [overrides]);
3757
+ const Wrapper = (0, import_react21.useMemo)(() => overrides.fields || DefaultFields, [overrides]);
3620
3758
  return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
3621
3759
  "form",
3622
3760
  {
@@ -3693,10 +3831,7 @@ var Fields = () => {
3693
3831
  if (selectedItem && itemSelector) {
3694
3832
  const { readOnly = {} } = selectedItem;
3695
3833
  const { edit } = getPermissions({
3696
- selectedItem,
3697
- config,
3698
- globalPermissions: globalPermissions || {},
3699
- appState: state
3834
+ item: selectedItem
3700
3835
  });
3701
3836
  return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
3702
3837
  AutoFieldPrivate,
@@ -3712,13 +3847,16 @@ var Fields = () => {
3712
3847
  );
3713
3848
  } else {
3714
3849
  const readOnly = data.root.readOnly || {};
3850
+ const { edit } = getPermissions({
3851
+ root: true
3852
+ });
3715
3853
  return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
3716
3854
  AutoFieldPrivate,
3717
3855
  {
3718
3856
  field,
3719
3857
  name: fieldName,
3720
3858
  id: `root_${fieldName}`,
3721
- readOnly: readOnly[fieldName],
3859
+ readOnly: !edit || readOnly[fieldName],
3722
3860
  value: rootProps[fieldName],
3723
3861
  onChange
3724
3862
  },
@@ -3737,7 +3875,7 @@ init_react_import();
3737
3875
 
3738
3876
  // lib/use-component-list.tsx
3739
3877
  init_react_import();
3740
- var import_react21 = require("react");
3878
+ var import_react22 = require("react");
3741
3879
 
3742
3880
  // components/ComponentList/index.tsx
3743
3881
  init_react_import();
@@ -3754,12 +3892,9 @@ var ComponentListItem = ({
3754
3892
  label,
3755
3893
  index
3756
3894
  }) => {
3757
- const { overrides, config, globalPermissions, state } = useAppContext();
3895
+ const { overrides, getPermissions } = useAppContext();
3758
3896
  const canInsert = getPermissions({
3759
- type: name,
3760
- config,
3761
- globalPermissions: globalPermissions || {},
3762
- appState: state
3897
+ type: name
3763
3898
  }).insert;
3764
3899
  return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
3765
3900
  Drawer.Item,
@@ -3783,6 +3918,7 @@ var ComponentList = ({
3783
3918
  title && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
3784
3919
  "button",
3785
3920
  {
3921
+ type: "button",
3786
3922
  className: getClassName22("title"),
3787
3923
  onClick: () => setUi({
3788
3924
  componentList: __spreadProps(__spreadValues({}, state.ui.componentList), {
@@ -3817,8 +3953,8 @@ ComponentList.Item = ComponentListItem;
3817
3953
  // lib/use-component-list.tsx
3818
3954
  var import_jsx_runtime30 = require("react/jsx-runtime");
3819
3955
  var useComponentList = (config, ui) => {
3820
- const [componentList, setComponentList] = (0, import_react21.useState)();
3821
- (0, import_react21.useEffect)(() => {
3956
+ const [componentList, setComponentList] = (0, import_react22.useState)();
3957
+ (0, import_react22.useEffect)(() => {
3822
3958
  var _a, _b, _c;
3823
3959
  if (Object.keys(ui.componentList).length > 0) {
3824
3960
  const matchedComponents = [];
@@ -3887,22 +4023,22 @@ var useComponentList = (config, ui) => {
3887
4023
  };
3888
4024
 
3889
4025
  // components/Puck/components/Components/index.tsx
3890
- var import_react22 = require("react");
4026
+ var import_react23 = require("react");
3891
4027
  var import_jsx_runtime31 = require("react/jsx-runtime");
3892
4028
  var Components = () => {
3893
4029
  const { config, state, overrides } = useAppContext();
3894
4030
  const componentList = useComponentList(config, state.ui);
3895
- const Wrapper = (0, import_react22.useMemo)(() => overrides.components || "div", [overrides]);
4031
+ const Wrapper = (0, import_react23.useMemo)(() => overrides.components || "div", [overrides]);
3896
4032
  return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Wrapper, { children: componentList ? componentList : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ComponentList, { id: "all" }) });
3897
4033
  };
3898
4034
 
3899
4035
  // components/Puck/components/Preview/index.tsx
3900
4036
  init_react_import();
3901
- var import_react24 = require("react");
4037
+ var import_react25 = require("react");
3902
4038
 
3903
4039
  // components/AutoFrame/index.tsx
3904
4040
  init_react_import();
3905
- var import_react23 = require("react");
4041
+ var import_react24 = require("react");
3906
4042
  var import_object_hash = __toESM(require("object-hash"));
3907
4043
  var import_react_dom2 = require("react-dom");
3908
4044
  var import_jsx_runtime32 = require("react/jsx-runtime");
@@ -3948,7 +4084,7 @@ var CopyHostStyles = ({
3948
4084
  onStylesLoaded = () => null
3949
4085
  }) => {
3950
4086
  const { document: doc, window: win } = useFrame();
3951
- (0, import_react23.useEffect)(() => {
4087
+ (0, import_react24.useEffect)(() => {
3952
4088
  if (!win || !doc) {
3953
4089
  return () => {
3954
4090
  };
@@ -4107,8 +4243,8 @@ var CopyHostStyles = ({
4107
4243
  }, []);
4108
4244
  return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_jsx_runtime32.Fragment, { children });
4109
4245
  };
4110
- var autoFrameContext = (0, import_react23.createContext)({});
4111
- var useFrame = () => (0, import_react23.useContext)(autoFrameContext);
4246
+ var autoFrameContext = (0, import_react24.createContext)({});
4247
+ var useFrame = () => (0, import_react24.useContext)(autoFrameContext);
4112
4248
  function AutoFrame(_a) {
4113
4249
  var _b = _a, {
4114
4250
  children,
@@ -4123,11 +4259,11 @@ function AutoFrame(_a) {
4123
4259
  "id",
4124
4260
  "onStylesLoaded"
4125
4261
  ]);
4126
- const [loaded, setLoaded] = (0, import_react23.useState)(false);
4127
- const [ctx, setCtx] = (0, import_react23.useState)({});
4128
- const ref = (0, import_react23.useRef)(null);
4129
- const [mountTarget, setMountTarget] = (0, import_react23.useState)();
4130
- (0, import_react23.useEffect)(() => {
4262
+ const [loaded, setLoaded] = (0, import_react24.useState)(false);
4263
+ const [ctx, setCtx] = (0, import_react24.useState)({});
4264
+ const ref = (0, import_react24.useRef)(null);
4265
+ const [mountTarget, setMountTarget] = (0, import_react24.useState)();
4266
+ (0, import_react24.useEffect)(() => {
4131
4267
  var _a2;
4132
4268
  if (ref.current) {
4133
4269
  setCtx({
@@ -4163,7 +4299,7 @@ var import_jsx_runtime33 = require("react/jsx-runtime");
4163
4299
  var getClassName23 = get_class_name_factory_default("PuckPreview", styles_module_default18);
4164
4300
  var Preview = ({ id = "puck-preview" }) => {
4165
4301
  const { config, dispatch, state, setStatus, iframe, overrides } = useAppContext();
4166
- const Page = (0, import_react24.useCallback)(
4302
+ const Page = (0, import_react25.useCallback)(
4167
4303
  (pageProps) => {
4168
4304
  var _a, _b;
4169
4305
  return ((_a = config.root) == null ? void 0 : _a.render) ? (_b = config.root) == null ? void 0 : _b.render(__spreadValues({
@@ -4172,7 +4308,7 @@ var Preview = ({ id = "puck-preview" }) => {
4172
4308
  },
4173
4309
  [config.root]
4174
4310
  );
4175
- const Frame = (0, import_react24.useMemo)(() => overrides.iframe, [overrides]);
4311
+ const Frame = (0, import_react25.useMemo)(() => overrides.iframe, [overrides]);
4176
4312
  const rootProps = state.data.root.props || state.data.root;
4177
4313
  return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
4178
4314
  "div",
@@ -4261,7 +4397,7 @@ var scrollIntoView = (el) => {
4261
4397
  };
4262
4398
 
4263
4399
  // components/LayerTree/index.tsx
4264
- var import_react25 = require("react");
4400
+ var import_react26 = require("react");
4265
4401
 
4266
4402
  // lib/is-child-of-zone.ts
4267
4403
  init_react_import();
@@ -4288,7 +4424,7 @@ var LayerTree = ({
4288
4424
  label
4289
4425
  }) => {
4290
4426
  const zones = data.zones || {};
4291
- const ctx = (0, import_react25.useContext)(dropZoneContext);
4427
+ const ctx = (0, import_react26.useContext)(dropZoneContext);
4292
4428
  return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
4293
4429
  label && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: getClassName24("zoneTitle"), children: [
4294
4430
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: getClassName24("zoneIcon"), children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Layers, { size: "16" }) }),
@@ -4327,6 +4463,7 @@ var LayerTree = ({
4327
4463
  /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: getClassNameLayer("inner"), children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
4328
4464
  "button",
4329
4465
  {
4466
+ type: "button",
4330
4467
  className: getClassNameLayer("clickable"),
4331
4468
  onClick: () => {
4332
4469
  if (isSelected) {
@@ -4393,13 +4530,13 @@ var LayerTree = ({
4393
4530
  };
4394
4531
 
4395
4532
  // components/Puck/components/Outline/index.tsx
4396
- var import_react26 = require("react");
4533
+ var import_react27 = require("react");
4397
4534
  var import_jsx_runtime35 = require("react/jsx-runtime");
4398
4535
  var Outline = () => {
4399
4536
  const { dispatch, state, overrides, config } = useAppContext();
4400
4537
  const { data, ui } = state;
4401
4538
  const { itemSelector } = ui;
4402
- const setItemSelector = (0, import_react26.useCallback)(
4539
+ const setItemSelector = (0, import_react27.useCallback)(
4403
4540
  (newItemSelector) => {
4404
4541
  dispatch({
4405
4542
  type: "setUi",
@@ -4408,7 +4545,7 @@ var Outline = () => {
4408
4545
  },
4409
4546
  []
4410
4547
  );
4411
- const Wrapper = (0, import_react26.useMemo)(() => overrides.outline || "div", [overrides]);
4548
+ const Wrapper = (0, import_react27.useMemo)(() => overrides.outline || "div", [overrides]);
4412
4549
  return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Wrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(dropZoneContext.Consumer, { children: (ctx) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
4413
4550
  (ctx == null ? void 0 : ctx.activeZones) && (ctx == null ? void 0 : ctx.activeZones[rootDroppableId]) && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4414
4551
  LayerTree,
@@ -4454,14 +4591,14 @@ function usePuckHistory({
4454
4591
  if (historyStore.hasPast) {
4455
4592
  dispatch({
4456
4593
  type: "set",
4457
- state: ((_a = historyStore.prevHistory) == null ? void 0 : _a.data) || initialAppState
4594
+ state: ((_a = historyStore.prevHistory) == null ? void 0 : _a.state) || initialAppState
4458
4595
  });
4459
4596
  historyStore.back();
4460
4597
  }
4461
4598
  };
4462
4599
  const forward = () => {
4463
4600
  if (historyStore.nextHistory) {
4464
- dispatch({ type: "set", state: historyStore.nextHistory.data });
4601
+ dispatch({ type: "set", state: historyStore.nextHistory.state });
4465
4602
  historyStore.forward();
4466
4603
  }
4467
4604
  };
@@ -4469,7 +4606,7 @@ function usePuckHistory({
4469
4606
  var _a;
4470
4607
  dispatch({
4471
4608
  type: "set",
4472
- state: ((_a = histories[histories.length - 1]) == null ? void 0 : _a.data) || initialAppState
4609
+ state: ((_a = histories[histories.length - 1]) == null ? void 0 : _a.state) || initialAppState
4473
4610
  });
4474
4611
  historyStore.setHistories(histories);
4475
4612
  };
@@ -4478,7 +4615,7 @@ function usePuckHistory({
4478
4615
  if (historyStore.histories.length > index) {
4479
4616
  dispatch({
4480
4617
  type: "set",
4481
- state: ((_a = historyStore.histories[index]) == null ? void 0 : _a.data) || initialAppState
4618
+ state: ((_a = historyStore.histories[index]) == null ? void 0 : _a.state) || initialAppState
4482
4619
  });
4483
4620
  historyStore.setHistoryIndex(index);
4484
4621
  }
@@ -4497,19 +4634,19 @@ function usePuckHistory({
4497
4634
 
4498
4635
  // lib/use-history-store.ts
4499
4636
  init_react_import();
4500
- var import_react27 = require("react");
4637
+ var import_react28 = require("react");
4501
4638
  var import_use_debounce3 = require("use-debounce");
4502
- var EMPTY_HISTORY_INDEX = -1;
4639
+ var EMPTY_HISTORY_INDEX = 0;
4503
4640
  function useHistoryStore(initialHistory) {
4504
4641
  var _a, _b;
4505
- const [histories, setHistories] = (0, import_react27.useState)(
4642
+ const [histories, setHistories] = (0, import_react28.useState)(
4506
4643
  (_a = initialHistory == null ? void 0 : initialHistory.histories) != null ? _a : []
4507
4644
  );
4508
4645
  const updateHistories = (histories2) => {
4509
4646
  setHistories(histories2);
4510
4647
  setIndex(histories2.length - 1);
4511
4648
  };
4512
- const [index, setIndex] = (0, import_react27.useState)(
4649
+ const [index, setIndex] = (0, import_react28.useState)(
4513
4650
  (_b = initialHistory == null ? void 0 : initialHistory.index) != null ? _b : EMPTY_HISTORY_INDEX
4514
4651
  );
4515
4652
  const hasPast = index > EMPTY_HISTORY_INDEX;
@@ -4517,9 +4654,9 @@ function useHistoryStore(initialHistory) {
4517
4654
  const currentHistory = histories[index];
4518
4655
  const nextHistory = hasFuture ? histories[index + 1] : null;
4519
4656
  const prevHistory = hasPast ? histories[index - 1] : null;
4520
- const record = (0, import_use_debounce3.useDebouncedCallback)((data) => {
4657
+ const record = (0, import_use_debounce3.useDebouncedCallback)((state) => {
4521
4658
  const history = {
4522
- data,
4659
+ state,
4523
4660
  id: generateId("history")
4524
4661
  };
4525
4662
  updateHistories([...histories.slice(0, index + 1), history]);
@@ -4669,11 +4806,11 @@ var getBox = function getBox2(el) {
4669
4806
  };
4670
4807
 
4671
4808
  // components/Puck/components/Canvas/index.tsx
4672
- var import_react29 = require("react");
4809
+ var import_react30 = require("react");
4673
4810
 
4674
4811
  // components/ViewportControls/index.tsx
4675
4812
  init_react_import();
4676
- var import_react28 = require("react");
4813
+ var import_react29 = require("react");
4677
4814
 
4678
4815
  // css-module:/home/runner/work/puck/puck/packages/core/components/ViewportControls/styles.module.css#css-module
4679
4816
  init_react_import();
@@ -4696,8 +4833,8 @@ var ViewportButton = ({
4696
4833
  onClick
4697
4834
  }) => {
4698
4835
  const { state } = useAppContext();
4699
- const [isActive, setIsActive] = (0, import_react28.useState)(false);
4700
- (0, import_react28.useEffect)(() => {
4836
+ const [isActive, setIsActive] = (0, import_react29.useState)(false);
4837
+ (0, import_react29.useEffect)(() => {
4701
4838
  setIsActive(width === state.ui.viewports.current.width);
4702
4839
  }, [width, state.ui.viewports.current.width]);
4703
4840
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: getClassNameButton({ isActive }), children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
@@ -4733,7 +4870,7 @@ var ViewportControls = ({
4733
4870
  const defaultsContainAutoZoom = defaultZoomOptions.find(
4734
4871
  (option) => option.value === autoZoom
4735
4872
  );
4736
- const zoomOptions = (0, import_react28.useMemo)(
4873
+ const zoomOptions = (0, import_react29.useMemo)(
4737
4874
  () => [
4738
4875
  ...defaultZoomOptions,
4739
4876
  ...defaultsContainAutoZoom ? [] : [
@@ -4816,7 +4953,7 @@ var ViewportControls = ({
4816
4953
 
4817
4954
  // css-module:/home/runner/work/puck/puck/packages/core/components/Puck/components/Canvas/styles.module.css#css-module
4818
4955
  init_react_import();
4819
- var styles_module_default21 = { "PuckCanvas": "_PuckCanvas_6zd4y_1", "PuckCanvas-controls": "_PuckCanvas-controls_6zd4y_16", "PuckCanvas-inner": "_PuckCanvas-inner_6zd4y_21", "PuckCanvas-root": "_PuckCanvas-root_6zd4y_32", "PuckCanvas--ready": "_PuckCanvas--ready_6zd4y_56" };
4956
+ var styles_module_default21 = { "PuckCanvas": "_PuckCanvas_esbg1_1", "PuckCanvas-controls": "_PuckCanvas-controls_esbg1_16", "PuckCanvas-inner": "_PuckCanvas-inner_esbg1_21", "PuckCanvas-root": "_PuckCanvas-root_esbg1_32", "PuckCanvas--ready": "_PuckCanvas--ready_esbg1_56", "PuckCanvas-loader": "_PuckCanvas-loader_esbg1_60", "PuckCanvas--showLoader": "_PuckCanvas--showLoader_esbg1_70" };
4820
4957
 
4821
4958
  // lib/get-zoom-config.ts
4822
4959
  init_react_import();
@@ -4856,17 +4993,17 @@ var Canvas = () => {
4856
4993
  const { status, iframe } = useAppContext();
4857
4994
  const { dispatch, state, overrides, setUi, zoomConfig, setZoomConfig } = useAppContext();
4858
4995
  const { ui } = state;
4859
- const frameRef = (0, import_react29.useRef)(null);
4860
- const [showTransition, setShowTransition] = (0, import_react29.useState)(false);
4861
- const defaultRender = (0, import_react29.useMemo)(() => {
4996
+ const frameRef = (0, import_react30.useRef)(null);
4997
+ const [showTransition, setShowTransition] = (0, import_react30.useState)(false);
4998
+ const defaultRender = (0, import_react30.useMemo)(() => {
4862
4999
  const PuckDefault = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_jsx_runtime37.Fragment, { children });
4863
5000
  return PuckDefault;
4864
5001
  }, []);
4865
- const CustomPreview = (0, import_react29.useMemo)(
5002
+ const CustomPreview = (0, import_react30.useMemo)(
4866
5003
  () => overrides.preview || defaultRender,
4867
5004
  [overrides]
4868
5005
  );
4869
- const getFrameDimensions = (0, import_react29.useCallback)(() => {
5006
+ const getFrameDimensions = (0, import_react30.useCallback)(() => {
4870
5007
  if (frameRef.current) {
4871
5008
  const frame = frameRef.current;
4872
5009
  const box = getBox(frame);
@@ -4874,7 +5011,7 @@ var Canvas = () => {
4874
5011
  }
4875
5012
  return { width: 0, height: 0 };
4876
5013
  }, [frameRef]);
4877
- const resetAutoZoom = (0, import_react29.useCallback)(
5014
+ const resetAutoZoom = (0, import_react30.useCallback)(
4878
5015
  (ui2 = state.ui) => {
4879
5016
  if (frameRef.current) {
4880
5017
  setZoomConfig(
@@ -4884,11 +5021,11 @@ var Canvas = () => {
4884
5021
  },
4885
5022
  [frameRef, zoomConfig, state.ui]
4886
5023
  );
4887
- (0, import_react29.useEffect)(() => {
5024
+ (0, import_react30.useEffect)(() => {
4888
5025
  setShowTransition(false);
4889
5026
  resetAutoZoom();
4890
5027
  }, [frameRef, ui.leftSideBarVisible, ui.rightSideBarVisible]);
4891
- (0, import_react29.useEffect)(() => {
5028
+ (0, import_react30.useEffect)(() => {
4892
5029
  const { height: frameHeight } = getFrameDimensions();
4893
5030
  if (ui.viewports.current.height === "auto") {
4894
5031
  setZoomConfig(__spreadProps(__spreadValues({}, zoomConfig), {
@@ -4896,7 +5033,13 @@ var Canvas = () => {
4896
5033
  }));
4897
5034
  }
4898
5035
  }, [zoomConfig.zoom]);
4899
- (0, import_react29.useEffect)(() => {
5036
+ (0, import_react30.useEffect)(() => {
5037
+ if (ZOOM_ON_CHANGE) {
5038
+ setShowTransition(true);
5039
+ resetAutoZoom(ui);
5040
+ }
5041
+ }, [ui.viewports.current.width]);
5042
+ (0, import_react30.useEffect)(() => {
4900
5043
  const observer = new ResizeObserver(() => {
4901
5044
  setShowTransition(false);
4902
5045
  resetAutoZoom();
@@ -4908,11 +5051,18 @@ var Canvas = () => {
4908
5051
  observer.disconnect();
4909
5052
  };
4910
5053
  }, []);
5054
+ const [showLoader, setShowLoader] = (0, import_react30.useState)(false);
5055
+ (0, import_react30.useEffect)(() => {
5056
+ setTimeout(() => {
5057
+ setShowLoader(true);
5058
+ }, 500);
5059
+ }, []);
4911
5060
  return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
4912
5061
  "div",
4913
5062
  {
4914
5063
  className: getClassName26({
4915
- ready: status === "READY" || !iframe.enabled
5064
+ ready: status === "READY" || !iframe.enabled || !iframe.waitForStyles,
5065
+ showLoader
4916
5066
  }),
4917
5067
  onClick: () => dispatch({
4918
5068
  type: "setUi",
@@ -4945,21 +5095,24 @@ var Canvas = () => {
4945
5095
  }
4946
5096
  }
4947
5097
  ) }),
4948
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: getClassName26("inner"), ref: frameRef, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
4949
- "div",
4950
- {
4951
- className: getClassName26("root"),
4952
- style: {
4953
- width: iframe.enabled ? ui.viewports.current.width : "100%",
4954
- height: zoomConfig.rootHeight,
4955
- transform: iframe.enabled ? `scale(${zoomConfig.zoom})` : void 0,
4956
- transition: showTransition ? "width 150ms ease-out, height 150ms ease-out, transform 150ms ease-out" : "",
4957
- overflow: iframe.enabled ? void 0 : "auto"
4958
- },
4959
- suppressHydrationWarning: true,
4960
- children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CustomPreview, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Preview, {}) })
4961
- }
4962
- ) })
5098
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: getClassName26("inner"), ref: frameRef, children: [
5099
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
5100
+ "div",
5101
+ {
5102
+ className: getClassName26("root"),
5103
+ style: {
5104
+ width: iframe.enabled ? ui.viewports.current.width : "100%",
5105
+ height: zoomConfig.rootHeight,
5106
+ transform: iframe.enabled ? `scale(${zoomConfig.zoom})` : void 0,
5107
+ transition: showTransition ? "width 150ms ease-out, height 150ms ease-out, transform 150ms ease-out" : "",
5108
+ overflow: iframe.enabled ? void 0 : "auto"
5109
+ },
5110
+ suppressHydrationWarning: true,
5111
+ children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(CustomPreview, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Preview, {}) })
5112
+ }
5113
+ ),
5114
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: getClassName26("loader"), children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Loader, { size: 24 }) })
5115
+ ] })
4963
5116
  ]
4964
5117
  }
4965
5118
  );
@@ -4984,7 +5137,10 @@ var insertComponent = (componentType, zone, index, {
4984
5137
  const insertedData = insertAction(state.data, insertActionData, config);
4985
5138
  dispatch(__spreadProps(__spreadValues({}, insertActionData), {
4986
5139
  // Dispatch insert rather set, as user's may rely on this via onAction
4987
- recordHistory: false
5140
+ // We must always record history here so the insert is added to user history
5141
+ // If the user has defined a resolveData method, they will end up with 2 history
5142
+ // entries on insert - one for the initial insert, and one when the data resolves
5143
+ recordHistory: true
4988
5144
  }));
4989
5145
  const itemSelector = {
4990
5146
  index,
@@ -4999,7 +5155,7 @@ var insertComponent = (componentType, zone, index, {
4999
5155
 
5000
5156
  // lib/use-loaded-overrides.ts
5001
5157
  init_react_import();
5002
- var import_react30 = require("react");
5158
+ var import_react31 = require("react");
5003
5159
 
5004
5160
  // lib/load-overrides.ts
5005
5161
  init_react_import();
@@ -5038,7 +5194,7 @@ var useLoadedOverrides = ({
5038
5194
  overrides,
5039
5195
  plugins
5040
5196
  }) => {
5041
- return (0, import_react30.useMemo)(() => {
5197
+ return (0, import_react31.useMemo)(() => {
5042
5198
  return loadOverrides({ overrides, plugins });
5043
5199
  }, [plugins, overrides]);
5044
5200
  };
@@ -5050,7 +5206,7 @@ var getLayoutClassName = get_class_name_factory_default("PuckLayout", styles_mod
5050
5206
  function Puck({
5051
5207
  children,
5052
5208
  config,
5053
- data: initialData = { content: [], root: {} },
5209
+ data: initialData,
5054
5210
  ui: initialUi,
5055
5211
  onChange,
5056
5212
  onPublish,
@@ -5063,18 +5219,16 @@ function Puck({
5063
5219
  headerTitle,
5064
5220
  headerPath,
5065
5221
  viewports = defaultViewports,
5066
- iframe = {
5067
- enabled: true
5068
- },
5222
+ iframe: _iframe,
5069
5223
  dnd,
5070
- initialHistory
5224
+ initialHistory: _initialHistory
5071
5225
  }) {
5072
5226
  var _a;
5073
- const historyStore = useHistoryStore(initialHistory);
5074
- const [reducer] = (0, import_react31.useState)(
5075
- () => createReducer({ config, record: historyStore.record, onAction })
5076
- );
5077
- const [initialAppState] = (0, import_react31.useState)(() => {
5227
+ const iframe = __spreadValues({
5228
+ enabled: true,
5229
+ waitForStyles: true
5230
+ }, _iframe);
5231
+ const [generatedAppState] = (0, import_react32.useState)(() => {
5078
5232
  var _a2, _b, _c, _d, _e, _f, _g, _h, _i;
5079
5233
  const initial = __spreadValues(__spreadValues({}, defaultAppState.ui), initialUi);
5080
5234
  let clientUiState = {};
@@ -5092,14 +5246,14 @@ function Puck({
5092
5246
  })).sort((a, b) => a.diff > b.diff ? 1 : -1);
5093
5247
  const closestViewport = viewportDifferences[0].key;
5094
5248
  if (iframe.enabled) {
5095
- clientUiState = {
5249
+ clientUiState = __spreadProps(__spreadValues({}, clientUiState), {
5096
5250
  viewports: __spreadProps(__spreadValues({}, initial.viewports), {
5097
5251
  current: __spreadProps(__spreadValues({}, initial.viewports.current), {
5098
5252
  height: ((_b = (_a2 = initialUi == null ? void 0 : initialUi.viewports) == null ? void 0 : _a2.current) == null ? void 0 : _b.height) || ((_c = viewports[closestViewport]) == null ? void 0 : _c.height) || "auto",
5099
5253
  width: ((_e = (_d = initialUi == null ? void 0 : initialUi.viewports) == null ? void 0 : _d.current) == null ? void 0 : _e.width) || ((_f = viewports[closestViewport]) == null ? void 0 : _f.width)
5100
5254
  })
5101
5255
  })
5102
- };
5256
+ });
5103
5257
  }
5104
5258
  }
5105
5259
  if (Object.keys((initialData == null ? void 0 : initialData.root) || {}).length > 0 && !((_g = initialData == null ? void 0 : initialData.root) == null ? void 0 : _g.props)) {
@@ -5132,20 +5286,36 @@ function Puck({
5132
5286
  })
5133
5287
  });
5134
5288
  });
5135
- const [appState, dispatch] = (0, import_react31.useReducer)(
5289
+ const { appendData = true } = _initialHistory || {};
5290
+ const histories = [
5291
+ ...(_initialHistory == null ? void 0 : _initialHistory.histories) || [],
5292
+ ...appendData ? [{ state: generatedAppState }] : []
5293
+ ].map((history2) => __spreadProps(__spreadValues({}, history2), {
5294
+ // Inject default data to enable partial history injections
5295
+ state: __spreadValues(__spreadValues({}, generatedAppState), history2.state)
5296
+ }));
5297
+ const initialHistoryIndex = (_initialHistory == null ? void 0 : _initialHistory.index) || histories.length - 1;
5298
+ const initialAppState = histories[initialHistoryIndex].state;
5299
+ const historyStore = useHistoryStore({
5300
+ histories,
5301
+ index: initialHistoryIndex
5302
+ });
5303
+ const [reducer] = (0, import_react32.useState)(
5304
+ () => createReducer({
5305
+ config,
5306
+ record: historyStore.record,
5307
+ onAction
5308
+ })
5309
+ );
5310
+ const [appState, dispatch] = (0, import_react32.useReducer)(
5136
5311
  reducer,
5137
5312
  flushZones(initialAppState)
5138
5313
  );
5139
5314
  const { data, ui } = appState;
5140
5315
  const history = usePuckHistory({ dispatch, initialAppState, historyStore });
5141
- const { resolveData, componentState } = useResolvedData(
5142
- appState,
5143
- config,
5144
- dispatch
5145
- );
5146
- const [menuOpen, setMenuOpen] = (0, import_react31.useState)(false);
5316
+ const [menuOpen, setMenuOpen] = (0, import_react32.useState)(false);
5147
5317
  const { itemSelector, leftSideBarVisible, rightSideBarVisible } = ui;
5148
- const setItemSelector = (0, import_react31.useCallback)(
5318
+ const setItemSelector = (0, import_react32.useCallback)(
5149
5319
  (newItemSelector) => {
5150
5320
  if (newItemSelector === itemSelector) return;
5151
5321
  dispatch({
@@ -5157,13 +5327,13 @@ function Puck({
5157
5327
  [itemSelector]
5158
5328
  );
5159
5329
  const selectedItem = itemSelector ? getItem(itemSelector, data) : null;
5160
- (0, import_react31.useEffect)(() => {
5330
+ (0, import_react32.useEffect)(() => {
5161
5331
  if (onChange) onChange(data);
5162
5332
  }, [data]);
5163
5333
  const { onDragStartOrUpdate, placeholderStyle } = usePlaceholderStyle();
5164
- const [draggedItem, setDraggedItem] = (0, import_react31.useState)();
5334
+ const [draggedItem, setDraggedItem] = (0, import_react32.useState)();
5165
5335
  const rootProps = data.root.props || data.root;
5166
- const toggleSidebars = (0, import_react31.useCallback)(
5336
+ const toggleSidebars = (0, import_react32.useCallback)(
5167
5337
  (sidebar) => {
5168
5338
  const widerViewport = window.matchMedia("(min-width: 638px)").matches;
5169
5339
  const sideBarVisible = sidebar === "left" ? leftSideBarVisible : rightSideBarVisible;
@@ -5177,7 +5347,7 @@ function Puck({
5177
5347
  },
5178
5348
  [dispatch, leftSideBarVisible, rightSideBarVisible]
5179
5349
  );
5180
- (0, import_react31.useEffect)(() => {
5350
+ (0, import_react32.useEffect)(() => {
5181
5351
  if (!window.matchMedia("(min-width: 638px)").matches) {
5182
5352
  dispatch({
5183
5353
  type: "setUi",
@@ -5200,7 +5370,7 @@ function Puck({
5200
5370
  window.removeEventListener("resize", handleResize);
5201
5371
  };
5202
5372
  }, []);
5203
- const defaultHeaderRender = (0, import_react31.useMemo)(() => {
5373
+ const defaultHeaderRender = (0, import_react32.useMemo)(() => {
5204
5374
  if (renderHeader) {
5205
5375
  console.warn(
5206
5376
  "`renderHeader` is deprecated. Please use `overrides.header` and the `usePuck` hook instead"
@@ -5214,7 +5384,7 @@ function Puck({
5214
5384
  }
5215
5385
  return DefaultOverride;
5216
5386
  }, [renderHeader]);
5217
- const defaultHeaderActionsRender = (0, import_react31.useMemo)(() => {
5387
+ const defaultHeaderActionsRender = (0, import_react32.useMemo)(() => {
5218
5388
  if (renderHeaderActions) {
5219
5389
  console.warn(
5220
5390
  "`renderHeaderActions` is deprecated. Please use `overrides.headerActions` and the `usePuck` hook instead."
@@ -5231,20 +5401,20 @@ function Puck({
5231
5401
  overrides,
5232
5402
  plugins
5233
5403
  });
5234
- const CustomPuck = (0, import_react31.useMemo)(
5404
+ const CustomPuck = (0, import_react32.useMemo)(
5235
5405
  () => loadedOverrides.puck || DefaultOverride,
5236
5406
  [loadedOverrides]
5237
5407
  );
5238
- const CustomHeader = (0, import_react31.useMemo)(
5408
+ const CustomHeader = (0, import_react32.useMemo)(
5239
5409
  () => loadedOverrides.header || defaultHeaderRender,
5240
5410
  [loadedOverrides]
5241
5411
  );
5242
- const CustomHeaderActions = (0, import_react31.useMemo)(
5412
+ const CustomHeaderActions = (0, import_react32.useMemo)(
5243
5413
  () => loadedOverrides.headerActions || defaultHeaderActionsRender,
5244
5414
  [loadedOverrides]
5245
5415
  );
5246
- const [mounted, setMounted] = (0, import_react31.useState)(false);
5247
- (0, import_react31.useEffect)(() => {
5416
+ const [mounted, setMounted] = (0, import_react32.useState)(false);
5417
+ (0, import_react32.useEffect)(() => {
5248
5418
  setMounted(true);
5249
5419
  }, []);
5250
5420
  const selectedComponentConfig = selectedItem && config.components[selectedItem.type];
@@ -5257,8 +5427,6 @@ function Puck({
5257
5427
  state: appState,
5258
5428
  dispatch,
5259
5429
  config,
5260
- componentState,
5261
- resolveData,
5262
5430
  plugins: plugins || [],
5263
5431
  overrides: loadedOverrides,
5264
5432
  history,
@@ -5270,9 +5438,11 @@ function Puck({
5270
5438
  duplicate: true,
5271
5439
  insert: true,
5272
5440
  edit: true
5273
- }, permissions)
5441
+ }, permissions),
5442
+ getPermissions: () => ({}),
5443
+ refreshPermissions: () => null
5274
5444
  },
5275
- children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5445
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(appContext.Consumer, { children: ({ resolveData }) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5276
5446
  DragDropContext,
5277
5447
  {
5278
5448
  autoScrollerOptions: { disabled: dnd == null ? void 0 : dnd.disableAutoScroll },
@@ -5362,90 +5532,115 @@ function Puck({
5362
5532
  }
5363
5533
  ) }) }),
5364
5534
  children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("header", { className: getLayoutClassName("header"), children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: getLayoutClassName("headerInner"), children: [
5365
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: getLayoutClassName("headerToggle"), children: [
5366
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5367
- "div",
5368
- {
5369
- className: getLayoutClassName(
5370
- "leftSideBarToggle"
5371
- ),
5372
- children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5373
- IconButton,
5535
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
5536
+ "div",
5537
+ {
5538
+ className: getLayoutClassName("headerToggle"),
5539
+ children: [
5540
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5541
+ "div",
5374
5542
  {
5375
- onClick: () => {
5376
- toggleSidebars("left");
5377
- },
5378
- title: "Toggle left sidebar",
5379
- children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(PanelLeft, { focusable: "false" })
5543
+ className: getLayoutClassName(
5544
+ "leftSideBarToggle"
5545
+ ),
5546
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5547
+ IconButton,
5548
+ {
5549
+ onClick: () => {
5550
+ toggleSidebars("left");
5551
+ },
5552
+ title: "Toggle left sidebar",
5553
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(PanelLeft, { focusable: "false" })
5554
+ }
5555
+ )
5380
5556
  }
5381
- )
5382
- }
5383
- ),
5384
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5385
- "div",
5386
- {
5387
- className: getLayoutClassName(
5388
- "rightSideBarToggle"
5389
5557
  ),
5390
- children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5391
- IconButton,
5558
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5559
+ "div",
5392
5560
  {
5393
- onClick: () => {
5394
- toggleSidebars("right");
5395
- },
5396
- title: "Toggle right sidebar",
5397
- children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(PanelRight, { focusable: "false" })
5561
+ className: getLayoutClassName(
5562
+ "rightSideBarToggle"
5563
+ ),
5564
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5565
+ IconButton,
5566
+ {
5567
+ onClick: () => {
5568
+ toggleSidebars("right");
5569
+ },
5570
+ title: "Toggle right sidebar",
5571
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(PanelRight, { focusable: "false" })
5572
+ }
5573
+ )
5398
5574
  }
5399
5575
  )
5400
- }
5401
- )
5402
- ] }),
5403
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: getLayoutClassName("headerTitle"), children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(Heading, { rank: "2", size: "xs", children: [
5404
- headerTitle || rootProps.title || "Page",
5405
- headerPath && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [
5406
- " ",
5407
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5408
- "code",
5409
- {
5410
- className: getLayoutClassName("headerPath"),
5411
- children: headerPath
5412
- }
5413
- )
5414
- ] })
5415
- ] }) }),
5416
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: getLayoutClassName("headerTools"), children: [
5417
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: getLayoutClassName("menuButton"), children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5418
- IconButton,
5419
- {
5420
- onClick: () => {
5421
- return setMenuOpen(!menuOpen);
5422
- },
5423
- title: "Toggle menu bar",
5424
- children: menuOpen ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ChevronUp, { focusable: "false" }) : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ChevronDown, { focusable: "false" })
5425
- }
5426
- ) }),
5427
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5428
- MenuBar,
5429
- {
5430
- appState,
5431
- data,
5432
- dispatch,
5433
- onPublish,
5434
- menuOpen,
5435
- renderHeaderActions: () => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(CustomHeaderActions, { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5436
- Button,
5576
+ ]
5577
+ }
5578
+ ),
5579
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5580
+ "div",
5581
+ {
5582
+ className: getLayoutClassName("headerTitle"),
5583
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(Heading, { rank: "2", size: "xs", children: [
5584
+ headerTitle || rootProps.title || "Page",
5585
+ headerPath && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [
5586
+ " ",
5587
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5588
+ "code",
5589
+ {
5590
+ className: getLayoutClassName(
5591
+ "headerPath"
5592
+ ),
5593
+ children: headerPath
5594
+ }
5595
+ )
5596
+ ] })
5597
+ ] })
5598
+ }
5599
+ ),
5600
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
5601
+ "div",
5602
+ {
5603
+ className: getLayoutClassName("headerTools"),
5604
+ children: [
5605
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5606
+ "div",
5437
5607
  {
5438
- onClick: () => {
5439
- onPublish && onPublish(data);
5440
- },
5441
- icon: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Globe, { size: "14px" }),
5442
- children: "Publish"
5608
+ className: getLayoutClassName("menuButton"),
5609
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5610
+ IconButton,
5611
+ {
5612
+ onClick: () => {
5613
+ return setMenuOpen(!menuOpen);
5614
+ },
5615
+ title: "Toggle menu bar",
5616
+ children: menuOpen ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ChevronUp, { focusable: "false" }) : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ChevronDown, { focusable: "false" })
5617
+ }
5618
+ )
5443
5619
  }
5444
- ) }),
5445
- setMenuOpen
5446
- }
5447
- )
5448
- ] })
5620
+ ),
5621
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5622
+ MenuBar,
5623
+ {
5624
+ appState,
5625
+ dispatch,
5626
+ onPublish,
5627
+ menuOpen,
5628
+ renderHeaderActions: () => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(CustomHeaderActions, { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5629
+ Button,
5630
+ {
5631
+ onClick: () => {
5632
+ onPublish && onPublish(data);
5633
+ },
5634
+ icon: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Globe, { size: "14px" }),
5635
+ children: "Publish"
5636
+ }
5637
+ ) }),
5638
+ setMenuOpen
5639
+ }
5640
+ )
5641
+ ]
5642
+ }
5643
+ )
5449
5644
  ] }) })
5450
5645
  }
5451
5646
  ),
@@ -5470,7 +5665,7 @@ function Puck({
5470
5665
  }
5471
5666
  )
5472
5667
  }
5473
- )
5668
+ ) })
5474
5669
  }
5475
5670
  ),
5476
5671
  /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { id: "puck-portal-root", className: getClassName27("portal") })
@@ -5619,24 +5814,15 @@ var usePuck = () => {
5619
5814
  history,
5620
5815
  dispatch,
5621
5816
  selectedItem: currentItem,
5622
- globalPermissions
5817
+ getPermissions,
5818
+ refreshPermissions
5623
5819
  } = useAppContext();
5624
5820
  return {
5625
5821
  appState,
5626
5822
  config,
5627
5823
  dispatch,
5628
- getPermissions: ({
5629
- item,
5630
- type
5631
- } = {}) => {
5632
- return getPermissions({
5633
- selectedItem: item || currentItem,
5634
- type,
5635
- globalPermissions: globalPermissions || {},
5636
- config,
5637
- appState
5638
- });
5639
- },
5824
+ getPermissions,
5825
+ refreshPermissions,
5640
5826
  history: {
5641
5827
  back: history.back,
5642
5828
  forward: history.forward,
@@ -5663,11 +5849,13 @@ var usePuck = () => {
5663
5849
  DropZoneProvider,
5664
5850
  FieldLabel,
5665
5851
  FieldLabelInternal,
5852
+ Group,
5666
5853
  IconButton,
5667
5854
  Puck,
5668
5855
  Render,
5669
5856
  dropZoneContext,
5670
5857
  migrate,
5858
+ overrideKeys,
5671
5859
  resolveAllData,
5672
5860
  transformProps,
5673
5861
  usePuck