@measured/puck-plugin-heading-analyzer 0.19.0-canary.0ea6ce4 → 0.19.0-canary.59cb0d9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +1243 -195
  2. package/dist/index.mjs +1237 -199
  3. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -55,6 +55,26 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
55
55
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
56
56
  mod
57
57
  ));
58
+ var __async = (__this, __arguments, generator) => {
59
+ return new Promise((resolve, reject) => {
60
+ var fulfilled = (value) => {
61
+ try {
62
+ step(generator.next(value));
63
+ } catch (e) {
64
+ reject(e);
65
+ }
66
+ };
67
+ var rejected = (value) => {
68
+ try {
69
+ step(generator.throw(value));
70
+ } catch (e) {
71
+ reject(e);
72
+ }
73
+ };
74
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
75
+ step((generator = generator.apply(__this, __arguments)).next());
76
+ });
77
+ };
58
78
 
59
79
  // ../tsup-config/react-import.js
60
80
  import React from "react";
@@ -126,19 +146,55 @@ var require_classnames = __commonJS({
126
146
  }
127
147
  });
128
148
 
149
+ // ../../node_modules/fast-deep-equal/index.js
150
+ var require_fast_deep_equal = __commonJS({
151
+ "../../node_modules/fast-deep-equal/index.js"(exports, module) {
152
+ "use strict";
153
+ init_react_import();
154
+ module.exports = function equal(a, b) {
155
+ if (a === b) return true;
156
+ if (a && b && typeof a == "object" && typeof b == "object") {
157
+ if (a.constructor !== b.constructor) return false;
158
+ var length, i, keys;
159
+ if (Array.isArray(a)) {
160
+ length = a.length;
161
+ if (length != b.length) return false;
162
+ for (i = length; i-- !== 0; )
163
+ if (!equal(a[i], b[i])) return false;
164
+ return true;
165
+ }
166
+ if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
167
+ if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
168
+ if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
169
+ keys = Object.keys(a);
170
+ length = keys.length;
171
+ if (length !== Object.keys(b).length) return false;
172
+ for (i = length; i-- !== 0; )
173
+ if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
174
+ for (i = length; i-- !== 0; ) {
175
+ var key = keys[i];
176
+ if (!equal(a[key], b[key])) return false;
177
+ }
178
+ return true;
179
+ }
180
+ return a !== a && b !== b;
181
+ };
182
+ }
183
+ });
184
+
129
185
  // index.ts
130
186
  init_react_import();
131
187
 
132
188
  // src/HeadingAnalyzer.tsx
133
189
  init_react_import();
134
- import { useEffect as useEffect4, useState as useState5 } from "react";
190
+ import { useEffect as useEffect6, useState } from "react";
135
191
 
136
192
  // css-module:/home/runner/work/puck/puck/packages/plugin-heading-analyzer/src/HeadingAnalyzer.module.css#css-module
137
193
  init_react_import();
138
194
  var HeadingAnalyzer_module_default = { "HeadingAnalyzer": "_HeadingAnalyzer_116v6_1", "HeadingAnalyzer-cssWarning": "_HeadingAnalyzer-cssWarning_116v6_5", "HeadingAnalyzerItem": "_HeadingAnalyzerItem_116v6_9", "HeadingAnalyzerItem--missing": "_HeadingAnalyzerItem--missing_116v6_13" };
139
195
 
140
196
  // src/HeadingAnalyzer.tsx
141
- import { usePuck } from "@measured/puck";
197
+ import { createUsePuck } from "@measured/puck";
142
198
 
143
199
  // ../core/components/SidebarSection/index.tsx
144
200
  init_react_import();
@@ -292,142 +348,519 @@ var ChevronRight = createLucideIcon("ChevronRight", [
292
348
 
293
349
  // ../core/lib/use-breadcrumbs.ts
294
350
  init_react_import();
295
- import { useContext as useContext2, useMemo as useMemo2 } from "react";
351
+ import { useMemo } from "react";
296
352
 
297
- // ../core/components/DropZone/context.tsx
353
+ // ../core/store/index.ts
298
354
  init_react_import();
299
- import {
300
- createContext as createContext2,
301
- useCallback as useCallback3,
302
- useMemo,
303
- useState as useState4
304
- } from "react";
305
355
 
306
- // ../core/components/Puck/context.tsx
356
+ // ../core/reducer/index.ts
307
357
  init_react_import();
308
- import {
309
- createContext,
310
- useContext,
311
- useEffect as useEffect3,
312
- useState as useState3
313
- } from "react";
314
358
 
315
- // ../core/lib/get-item.ts
359
+ // ../core/reducer/data.ts
360
+ init_react_import();
361
+
362
+ // ../core/lib/reorder.ts
316
363
  init_react_import();
364
+ var reorder = (list, startIndex, endIndex) => {
365
+ const result = Array.from(list);
366
+ const [removed] = result.splice(startIndex, 1);
367
+ result.splice(endIndex, 0, removed);
368
+ return result;
369
+ };
317
370
 
318
371
  // ../core/lib/root-droppable-id.ts
319
372
  init_react_import();
320
- var rootDroppableId = "default-zone";
373
+ var rootAreaId = "root";
374
+ var rootZone = "default-zone";
375
+ var rootDroppableId = `${rootAreaId}:${rootZone}`;
376
+
377
+ // ../core/lib/insert.ts
378
+ init_react_import();
379
+ var insert = (list, index, item) => {
380
+ const result = Array.from(list);
381
+ result.splice(index, 0, item);
382
+ return result;
383
+ };
384
+
385
+ // ../core/lib/remove.ts
386
+ init_react_import();
387
+ var remove = (list, index) => {
388
+ const result = Array.from(list);
389
+ result.splice(index, 1);
390
+ return result;
391
+ };
321
392
 
322
393
  // ../core/lib/setup-zone.ts
323
394
  init_react_import();
395
+ var setupZone = (data, zoneKey) => {
396
+ if (zoneKey === rootDroppableId) {
397
+ return data;
398
+ }
399
+ const newData = __spreadProps(__spreadValues({}, data), {
400
+ zones: data.zones ? __spreadValues({}, data.zones) : {}
401
+ });
402
+ newData.zones[zoneKey] = newData.zones[zoneKey] || [];
403
+ return newData;
404
+ };
324
405
 
325
- // ../core/components/ViewportControls/default-viewports.ts
406
+ // ../core/lib/replace.ts
326
407
  init_react_import();
327
- var defaultViewports = [
328
- { width: 360, height: "auto", icon: "Smartphone", label: "Small" },
329
- { width: 768, height: "auto", icon: "Tablet", label: "Medium" },
330
- { width: 1280, height: "auto", icon: "Monitor", label: "Large" }
331
- ];
408
+ var replace = (list, index, newItem) => {
409
+ const result = Array.from(list);
410
+ result.splice(index, 1);
411
+ result.splice(index, 0, newItem);
412
+ return result;
413
+ };
332
414
 
333
- // ../core/lib/use-resolved-permissions.ts
415
+ // ../core/lib/get-item.ts
334
416
  init_react_import();
335
- import { useCallback, useEffect, useState } from "react";
417
+ function getItem(selector, data, dynamicProps = {}) {
418
+ if (!selector.zone || selector.zone === rootDroppableId) {
419
+ const item2 = data.content[selector.index];
420
+ return (item2 == null ? void 0 : item2.props) ? __spreadProps(__spreadValues({}, item2), { props: dynamicProps[item2.props.id] || item2.props }) : void 0;
421
+ }
422
+ const item = setupZone(data, selector.zone).zones[selector.zone][selector.index];
423
+ return (item == null ? void 0 : item.props) ? __spreadProps(__spreadValues({}, item), { props: dynamicProps[item.props.id] || item.props }) : void 0;
424
+ }
336
425
 
337
- // ../core/lib/flatten-data.ts
426
+ // ../core/lib/reduce-related-zones.ts
338
427
  init_react_import();
339
428
 
340
- // ../core/lib/get-changed.ts
429
+ // ../core/lib/generate-id.ts
341
430
  init_react_import();
342
431
 
343
- // ../core/lib/use-resolved-data.ts
432
+ // ../../node_modules/uuid/dist/esm-node/index.js
344
433
  init_react_import();
345
- import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
346
434
 
347
- // ../core/lib/resolve-component-data.ts
435
+ // ../../node_modules/uuid/dist/esm-node/rng.js
348
436
  init_react_import();
437
+ import crypto from "crypto";
438
+ var rnds8Pool = new Uint8Array(256);
439
+ var poolPtr = rnds8Pool.length;
440
+ function rng() {
441
+ if (poolPtr > rnds8Pool.length - 16) {
442
+ crypto.randomFillSync(rnds8Pool);
443
+ poolPtr = 0;
444
+ }
445
+ return rnds8Pool.slice(poolPtr, poolPtr += 16);
446
+ }
349
447
 
350
- // ../core/lib/apply-dynamic-props.ts
448
+ // ../../node_modules/uuid/dist/esm-node/stringify.js
351
449
  init_react_import();
450
+ var byteToHex = [];
451
+ for (let i = 0; i < 256; ++i) {
452
+ byteToHex.push((i + 256).toString(16).slice(1));
453
+ }
454
+ function unsafeStringify(arr, offset = 0) {
455
+ return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
456
+ }
352
457
 
353
- // ../core/lib/resolve-root-data.ts
458
+ // ../../node_modules/uuid/dist/esm-node/v4.js
354
459
  init_react_import();
355
460
 
356
- // ../core/components/Puck/context.tsx
357
- import { jsx as jsx2 } from "react/jsx-runtime";
358
- var defaultAppState = {
359
- data: { content: [], root: {} },
360
- ui: {
361
- leftSideBarVisible: true,
362
- rightSideBarVisible: true,
363
- arrayState: {},
364
- itemSelector: null,
365
- componentList: {},
366
- isDragging: false,
367
- previewMode: "edit",
368
- viewports: {
369
- current: {
370
- width: defaultViewports[0].width,
371
- height: defaultViewports[0].height || "auto"
461
+ // ../../node_modules/uuid/dist/esm-node/native.js
462
+ init_react_import();
463
+ import crypto2 from "crypto";
464
+ var native_default = {
465
+ randomUUID: crypto2.randomUUID
466
+ };
467
+
468
+ // ../../node_modules/uuid/dist/esm-node/v4.js
469
+ function v4(options, buf, offset) {
470
+ if (native_default.randomUUID && !buf && !options) {
471
+ return native_default.randomUUID();
472
+ }
473
+ options = options || {};
474
+ const rnds = options.random || (options.rng || rng)();
475
+ rnds[6] = rnds[6] & 15 | 64;
476
+ rnds[8] = rnds[8] & 63 | 128;
477
+ if (buf) {
478
+ offset = offset || 0;
479
+ for (let i = 0; i < 16; ++i) {
480
+ buf[offset + i] = rnds[i];
481
+ }
482
+ return buf;
483
+ }
484
+ return unsafeStringify(rnds);
485
+ }
486
+ var v4_default = v4;
487
+
488
+ // ../core/lib/generate-id.ts
489
+ var generateId = (type) => type ? `${type}-${v4_default()}` : v4_default();
490
+
491
+ // ../core/lib/get-zone-id.ts
492
+ init_react_import();
493
+ var getZoneId = (zoneCompound) => {
494
+ if (!zoneCompound) {
495
+ return [];
496
+ }
497
+ if (zoneCompound && zoneCompound.indexOf(":") > -1) {
498
+ return zoneCompound.split(":");
499
+ }
500
+ return [rootDroppableId, zoneCompound];
501
+ };
502
+
503
+ // ../core/lib/reduce-related-zones.ts
504
+ function reduceRelatedZones(item, data, fn) {
505
+ return __spreadProps(__spreadValues({}, data), {
506
+ zones: Object.keys(data.zones || {}).reduce(
507
+ (acc, key) => {
508
+ const [parentId] = getZoneId(key);
509
+ if (parentId === item.props.id) {
510
+ const zones = data.zones;
511
+ return fn(acc, key, zones[key]);
512
+ }
513
+ return __spreadProps(__spreadValues({}, acc), { [key]: data.zones[key] });
372
514
  },
373
- options: [],
374
- controlsVisible: true
515
+ {}
516
+ )
517
+ });
518
+ }
519
+ var findRelatedByZoneId = (zoneId, data) => {
520
+ const [zoneParentId] = getZoneId(zoneId);
521
+ return (data.zones[zoneId] || []).reduce(
522
+ (acc, zoneItem) => {
523
+ const related = findRelatedByItem(zoneItem, data);
524
+ if (zoneItem.props.id === zoneParentId) {
525
+ return __spreadProps(__spreadValues(__spreadValues({}, acc), related), { [zoneId]: zoneItem });
526
+ }
527
+ return __spreadValues(__spreadValues({}, acc), related);
375
528
  },
376
- field: { focus: null }
529
+ {}
530
+ );
531
+ };
532
+ var findRelatedByItem = (item, data) => {
533
+ return Object.keys(data.zones || {}).reduce(
534
+ (acc, zoneId) => {
535
+ const [zoneParentId] = getZoneId(zoneId);
536
+ if (item.props.id === zoneParentId) {
537
+ const related = findRelatedByZoneId(zoneId, data);
538
+ return __spreadProps(__spreadValues(__spreadValues({}, acc), related), {
539
+ [zoneId]: data.zones[zoneId]
540
+ });
541
+ }
542
+ return acc;
543
+ },
544
+ {}
545
+ );
546
+ };
547
+ var removeRelatedZones = (item, data) => {
548
+ const newData = __spreadValues({}, data);
549
+ const related = findRelatedByItem(item, data);
550
+ Object.keys(related).forEach((key) => {
551
+ delete newData.zones[key];
552
+ });
553
+ return newData;
554
+ };
555
+ function duplicateRelatedZones(item, data, newId) {
556
+ return reduceRelatedZones(item, data, (acc, key, zone) => {
557
+ const dupedZone = zone.map((zoneItem) => __spreadProps(__spreadValues({}, zoneItem), {
558
+ props: __spreadProps(__spreadValues({}, zoneItem.props), { id: generateId(zoneItem.type) })
559
+ }));
560
+ const dupeOfDupes = dupedZone.reduce(
561
+ (dupeOfDupes2, item2, index) => __spreadValues(__spreadValues({}, dupeOfDupes2), duplicateRelatedZones(zone[index], data, item2.props.id).zones),
562
+ acc
563
+ );
564
+ const [_, zoneId] = getZoneId(key);
565
+ return __spreadProps(__spreadValues({}, dupeOfDupes), {
566
+ [key]: zone,
567
+ [`${newId}:${zoneId}`]: dupedZone
568
+ });
569
+ });
570
+ }
571
+
572
+ // ../core/reducer/data.ts
573
+ var zoneCache = {};
574
+ var replaceAction = (data, action) => {
575
+ if (action.destinationZone === rootDroppableId) {
576
+ return __spreadProps(__spreadValues({}, data), {
577
+ content: replace(data.content, action.destinationIndex, action.data)
578
+ });
377
579
  }
580
+ const newData = setupZone(data, action.destinationZone);
581
+ return __spreadProps(__spreadValues({}, newData), {
582
+ zones: __spreadProps(__spreadValues({}, newData.zones), {
583
+ [action.destinationZone]: replace(
584
+ newData.zones[action.destinationZone],
585
+ action.destinationIndex,
586
+ action.data
587
+ )
588
+ })
589
+ });
378
590
  };
379
- var defaultContext = {
380
- state: defaultAppState,
381
- dispatch: () => null,
382
- config: { components: {} },
383
- componentState: {},
384
- setComponentState: () => {
385
- },
386
- resolveData: () => {
387
- },
388
- plugins: [],
389
- overrides: {},
390
- history: {},
391
- viewports: defaultViewports,
392
- zoomConfig: {
393
- autoZoom: 1,
394
- rootHeight: 0,
395
- zoom: 1
396
- },
397
- setZoomConfig: () => null,
398
- status: "LOADING",
399
- setStatus: () => null,
400
- iframe: {},
401
- globalPermissions: {},
402
- getPermissions: () => ({}),
403
- refreshPermissions: () => null,
404
- metadata: {}
405
- };
406
- var appContext = createContext(defaultContext);
407
- function useAppContext() {
408
- const mainContext = useContext(appContext);
409
- return __spreadProps(__spreadValues({}, mainContext), {
410
- // Helpers
411
- setUi: (ui, recordHistory) => {
412
- return mainContext.dispatch({
413
- type: "setUi",
414
- ui,
415
- recordHistory
591
+ function insertAction(data, action, config) {
592
+ const emptyComponentData = {
593
+ type: action.componentType,
594
+ props: __spreadProps(__spreadValues({}, config.components[action.componentType].defaultProps || {}), {
595
+ id: action.id || generateId(action.componentType)
596
+ })
597
+ };
598
+ if (action.destinationZone === rootDroppableId) {
599
+ return __spreadProps(__spreadValues({}, data), {
600
+ content: insert(
601
+ data.content,
602
+ action.destinationIndex,
603
+ emptyComponentData
604
+ )
605
+ });
606
+ }
607
+ const newData = setupZone(data, action.destinationZone);
608
+ return __spreadProps(__spreadValues({}, data), {
609
+ zones: __spreadProps(__spreadValues({}, newData.zones), {
610
+ [action.destinationZone]: insert(
611
+ newData.zones[action.destinationZone],
612
+ action.destinationIndex,
613
+ emptyComponentData
614
+ )
615
+ })
616
+ });
617
+ }
618
+ var reorderAction = (data, action) => {
619
+ if (action.destinationZone === rootDroppableId) {
620
+ return __spreadProps(__spreadValues({}, data), {
621
+ content: reorder(
622
+ data.content,
623
+ action.sourceIndex,
624
+ action.destinationIndex
625
+ )
626
+ });
627
+ }
628
+ const newData = setupZone(data, action.destinationZone);
629
+ return __spreadProps(__spreadValues({}, data), {
630
+ zones: __spreadProps(__spreadValues({}, newData.zones), {
631
+ [action.destinationZone]: reorder(
632
+ newData.zones[action.destinationZone],
633
+ action.sourceIndex,
634
+ action.destinationIndex
635
+ )
636
+ })
637
+ });
638
+ };
639
+ function reduceData(data, action, config) {
640
+ if (action.type === "insert") {
641
+ return insertAction(data, action, config);
642
+ }
643
+ if (action.type === "duplicate") {
644
+ const item = getItem(
645
+ { index: action.sourceIndex, zone: action.sourceZone },
646
+ data
647
+ );
648
+ const newItem = __spreadProps(__spreadValues({}, item), {
649
+ props: __spreadProps(__spreadValues({}, item.props), {
650
+ id: generateId(item.type)
651
+ })
652
+ });
653
+ const dataWithRelatedDuplicated = duplicateRelatedZones(
654
+ item,
655
+ data,
656
+ newItem.props.id
657
+ );
658
+ if (action.sourceZone === rootDroppableId) {
659
+ return __spreadProps(__spreadValues({}, dataWithRelatedDuplicated), {
660
+ content: insert(data.content, action.sourceIndex + 1, newItem)
416
661
  });
417
662
  }
418
- });
663
+ return __spreadProps(__spreadValues({}, dataWithRelatedDuplicated), {
664
+ zones: __spreadProps(__spreadValues({}, dataWithRelatedDuplicated.zones), {
665
+ [action.sourceZone]: insert(
666
+ dataWithRelatedDuplicated.zones[action.sourceZone],
667
+ action.sourceIndex + 1,
668
+ newItem
669
+ )
670
+ })
671
+ });
672
+ }
673
+ if (action.type === "reorder") {
674
+ return reorderAction(data, action);
675
+ }
676
+ if (action.type === "move") {
677
+ if (action.sourceZone === action.destinationZone && action.sourceIndex === action.destinationIndex) {
678
+ return data;
679
+ }
680
+ const newData = setupZone(
681
+ setupZone(data, action.sourceZone),
682
+ action.destinationZone
683
+ );
684
+ const item = getItem(
685
+ { zone: action.sourceZone, index: action.sourceIndex },
686
+ newData
687
+ );
688
+ if (action.sourceZone === action.destinationZone) {
689
+ return reorderAction(data, __spreadProps(__spreadValues({}, action), { type: "reorder" }));
690
+ }
691
+ if (action.sourceZone === rootDroppableId) {
692
+ return __spreadProps(__spreadValues({}, newData), {
693
+ content: remove(newData.content, action.sourceIndex),
694
+ zones: __spreadProps(__spreadValues({}, newData.zones), {
695
+ [action.destinationZone]: insert(
696
+ newData.zones[action.destinationZone],
697
+ action.destinationIndex,
698
+ item
699
+ )
700
+ })
701
+ });
702
+ }
703
+ if (action.destinationZone === rootDroppableId) {
704
+ return __spreadProps(__spreadValues({}, newData), {
705
+ content: insert(newData.content, action.destinationIndex, item),
706
+ zones: __spreadProps(__spreadValues({}, newData.zones), {
707
+ [action.sourceZone]: remove(
708
+ newData.zones[action.sourceZone],
709
+ action.sourceIndex
710
+ )
711
+ })
712
+ });
713
+ }
714
+ return __spreadProps(__spreadValues({}, newData), {
715
+ zones: __spreadProps(__spreadValues({}, newData.zones), {
716
+ [action.sourceZone]: remove(
717
+ newData.zones[action.sourceZone],
718
+ action.sourceIndex
719
+ ),
720
+ [action.destinationZone]: insert(
721
+ newData.zones[action.destinationZone],
722
+ action.destinationIndex,
723
+ item
724
+ )
725
+ })
726
+ });
727
+ }
728
+ if (action.type === "replace") {
729
+ return replaceAction(data, action);
730
+ }
731
+ if (action.type === "remove") {
732
+ const item = getItem({ index: action.index, zone: action.zone }, data);
733
+ const dataWithRelatedRemoved = setupZone(
734
+ removeRelatedZones(item, data),
735
+ action.zone
736
+ );
737
+ if (action.zone === rootDroppableId) {
738
+ return __spreadProps(__spreadValues({}, dataWithRelatedRemoved), {
739
+ content: remove(data.content, action.index)
740
+ });
741
+ }
742
+ return __spreadProps(__spreadValues({}, dataWithRelatedRemoved), {
743
+ zones: __spreadProps(__spreadValues({}, dataWithRelatedRemoved.zones), {
744
+ [action.zone]: remove(
745
+ dataWithRelatedRemoved.zones[action.zone],
746
+ action.index
747
+ )
748
+ })
749
+ });
750
+ }
751
+ if (action.type === "registerZone") {
752
+ if (zoneCache[action.zone]) {
753
+ return __spreadProps(__spreadValues({}, data), {
754
+ zones: __spreadProps(__spreadValues({}, data.zones), {
755
+ [action.zone]: zoneCache[action.zone]
756
+ })
757
+ });
758
+ }
759
+ return setupZone(data, action.zone);
760
+ }
761
+ if (action.type === "unregisterZone") {
762
+ const _zones = __spreadValues({}, data.zones || {});
763
+ if (_zones[action.zone]) {
764
+ zoneCache[action.zone] = _zones[action.zone];
765
+ delete _zones[action.zone];
766
+ }
767
+ return __spreadProps(__spreadValues({}, data), { zones: _zones });
768
+ }
769
+ if (action.type === "setData") {
770
+ if (typeof action.data === "object") {
771
+ return __spreadValues(__spreadValues({}, data), action.data);
772
+ }
773
+ return __spreadValues(__spreadValues({}, data), action.data(data));
774
+ }
775
+ return data;
419
776
  }
420
777
 
778
+ // ../core/reducer/state.ts
779
+ init_react_import();
780
+ var reduceUi = (ui, action) => {
781
+ if (action.type === "setUi") {
782
+ if (typeof action.ui === "object") {
783
+ return __spreadValues(__spreadValues({}, ui), action.ui);
784
+ }
785
+ return __spreadValues(__spreadValues({}, ui), action.ui(ui));
786
+ }
787
+ if (action.type === "duplicate") {
788
+ return __spreadProps(__spreadValues({}, ui), {
789
+ itemSelector: { index: action.sourceIndex + 1, zone: action.sourceZone }
790
+ });
791
+ }
792
+ if (action.type === "remove") {
793
+ return __spreadProps(__spreadValues({}, ui), {
794
+ itemSelector: null
795
+ });
796
+ }
797
+ return ui;
798
+ };
799
+
800
+ // ../core/reducer/actions.tsx
801
+ init_react_import();
802
+
803
+ // ../core/reducer/index.ts
804
+ function storeInterceptor(reducer, record, onAction) {
805
+ return (state, action) => {
806
+ const newAppState = reducer(state, action);
807
+ const isValidType = ![
808
+ "registerZone",
809
+ "unregisterZone",
810
+ "setData",
811
+ "setUi",
812
+ "set"
813
+ ].includes(action.type);
814
+ if (typeof action.recordHistory !== "undefined" ? action.recordHistory : isValidType) {
815
+ if (record) record(newAppState);
816
+ }
817
+ onAction == null ? void 0 : onAction(action, newAppState, state);
818
+ return newAppState;
819
+ };
820
+ }
821
+ var setAction = (state, action) => {
822
+ if (typeof action.state === "object") {
823
+ return __spreadValues(__spreadValues({}, state), action.state);
824
+ }
825
+ return __spreadValues(__spreadValues({}, state), action.state(state));
826
+ };
827
+ function createReducer({
828
+ config,
829
+ record,
830
+ onAction
831
+ }) {
832
+ return storeInterceptor(
833
+ (state, action) => {
834
+ const data = reduceData(state.data, action, config);
835
+ const ui = reduceUi(state.ui, action);
836
+ if (action.type === "set") {
837
+ return setAction(state, action);
838
+ }
839
+ return { data, ui };
840
+ },
841
+ record,
842
+ onAction
843
+ );
844
+ }
845
+
846
+ // ../core/components/ViewportControls/default-viewports.ts
847
+ init_react_import();
848
+ var defaultViewports = [
849
+ { width: 360, height: "auto", icon: "Smartphone", label: "Small" },
850
+ { width: 768, height: "auto", icon: "Tablet", label: "Medium" },
851
+ { width: 1280, height: "auto", icon: "Monitor", label: "Large" }
852
+ ];
853
+
421
854
  // ../../node_modules/zustand/esm/vanilla.mjs
422
855
  init_react_import();
423
856
  var createStoreImpl = (createState) => {
424
857
  let state;
425
858
  const listeners = /* @__PURE__ */ new Set();
426
- const setState = (partial, replace) => {
859
+ const setState = (partial, replace2) => {
427
860
  const nextState = typeof partial === "function" ? partial(state) : partial;
428
861
  if (!Object.is(nextState, state)) {
429
862
  const previousState = state;
430
- state = (replace != null ? replace : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState);
863
+ state = (replace2 != null ? replace2 : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState);
431
864
  listeners.forEach((listener) => listener(state, previousState));
432
865
  }
433
866
  };
@@ -443,94 +876,701 @@ var createStoreImpl = (createState) => {
443
876
  };
444
877
  var createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
445
878
 
446
- // ../core/components/DropZone/context.tsx
447
- import { Fragment, jsx as jsx3 } from "react/jsx-runtime";
448
- var dropZoneContext = createContext2(null);
449
- var ZoneStoreContext = createContext2(
450
- createStore(() => ({
451
- zoneDepthIndex: {},
452
- nextZoneDepthIndex: {},
453
- areaDepthIndex: {},
454
- nextAreaDepthIndex: {},
455
- draggedItem: null,
456
- previewIndex: {}
457
- }))
458
- );
459
-
460
- // ../core/lib/get-zone-id.ts
879
+ // ../../node_modules/zustand/esm/react.mjs
461
880
  init_react_import();
462
- var getZoneId = (zoneCompound) => {
463
- if (!zoneCompound) {
464
- return [];
465
- }
466
- if (zoneCompound && zoneCompound.indexOf(":") > -1) {
467
- return zoneCompound.split(":");
468
- }
469
- return [rootDroppableId, zoneCompound];
881
+ import React2 from "react";
882
+ var identity = (arg) => arg;
883
+ function useStore(api, selector = identity) {
884
+ const slice = React2.useSyncExternalStore(
885
+ api.subscribe,
886
+ () => selector(api.getState()),
887
+ () => selector(api.getInitialState())
888
+ );
889
+ React2.useDebugValue(slice);
890
+ return slice;
891
+ }
892
+ var createImpl = (createState) => {
893
+ const api = createStore(createState);
894
+ const useBoundStore = (selector) => useStore(api, selector);
895
+ Object.assign(useBoundStore, api);
896
+ return useBoundStore;
470
897
  };
898
+ var create = (createState) => createState ? createImpl(createState) : createImpl;
471
899
 
472
- // ../core/lib/use-breadcrumbs.ts
473
- var convertPathDataToBreadcrumbs = (selectedItem, pathData, data) => {
474
- const id = selectedItem ? selectedItem == null ? void 0 : selectedItem.props.id : "";
475
- const currentPathData = pathData && id && pathData[id] ? __spreadValues({}, pathData[id]) : { label: "Page", path: [] };
476
- if (!id) {
477
- return [];
478
- }
479
- return currentPathData == null ? void 0 : currentPathData.path.reduce((acc, zoneCompound) => {
480
- const [area] = getZoneId(zoneCompound);
481
- if (area === rootDroppableId) {
482
- return [
483
- {
484
- label: "Page",
485
- selector: null
900
+ // ../../node_modules/zustand/esm/middleware.mjs
901
+ init_react_import();
902
+ var subscribeWithSelectorImpl = (fn) => (set, get, api) => {
903
+ const origSubscribe = api.subscribe;
904
+ api.subscribe = (selector, optListener, options) => {
905
+ let listener = selector;
906
+ if (optListener) {
907
+ const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;
908
+ let currentSlice = selector(api.getState());
909
+ listener = (state) => {
910
+ const nextSlice = selector(state);
911
+ if (!equalityFn(currentSlice, nextSlice)) {
912
+ const previousSlice = currentSlice;
913
+ optListener(currentSlice = nextSlice, previousSlice);
486
914
  }
487
- ];
915
+ };
916
+ if (options == null ? void 0 : options.fireImmediately) {
917
+ optListener(currentSlice, currentSlice);
918
+ }
919
+ }
920
+ return origSubscribe(listener);
921
+ };
922
+ const initialState = fn(set, get, api);
923
+ return initialState;
924
+ };
925
+ var subscribeWithSelector = subscribeWithSelectorImpl;
926
+
927
+ // ../core/lib/resolve-data.ts
928
+ init_react_import();
929
+
930
+ // ../core/lib/resolve-component-data.ts
931
+ init_react_import();
932
+
933
+ // ../core/lib/get-changed.ts
934
+ init_react_import();
935
+ var getChanged = (newItem, oldItem) => {
936
+ return newItem ? Object.keys(newItem.props || {}).reduce((acc, item) => {
937
+ const newItemProps = (newItem == null ? void 0 : newItem.props) || {};
938
+ const oldItemProps = (oldItem == null ? void 0 : oldItem.props) || {};
939
+ return __spreadProps(__spreadValues({}, acc), {
940
+ [item]: oldItemProps[item] !== newItemProps[item]
941
+ });
942
+ }, {}) : {};
943
+ };
944
+
945
+ // ../core/lib/resolve-component-data.ts
946
+ var cache = { lastChange: {} };
947
+ var resolveComponentData = (_0, _1, ..._2) => __async(void 0, [_0, _1, ..._2], function* (item, config, metadata = {}, onResolveStart, onResolveEnd) {
948
+ const configForItem = config.components[item.type];
949
+ if (configForItem.resolveData) {
950
+ const { item: oldItem = null, resolved = {} } = cache.lastChange[item.props.id] || {};
951
+ if (item && item === oldItem) {
952
+ return resolved;
488
953
  }
489
- const parentZoneCompound = acc.length > 0 ? acc[acc.length - 1].zoneCompound : rootDroppableId;
490
- let parentZone = data.content;
491
- if (parentZoneCompound && parentZoneCompound !== rootDroppableId) {
492
- parentZone = data.zones[parentZoneCompound];
954
+ const changed = getChanged(item, oldItem);
955
+ if (onResolveStart) {
956
+ onResolveStart(item);
493
957
  }
494
- if (!parentZone) {
495
- return acc;
958
+ const { props: resolvedProps, readOnly = {} } = yield configForItem.resolveData(item, {
959
+ changed,
960
+ lastData: oldItem,
961
+ metadata
962
+ });
963
+ const resolvedItem = __spreadProps(__spreadValues({}, item), {
964
+ props: __spreadValues(__spreadValues({}, item.props), resolvedProps)
965
+ });
966
+ if (Object.keys(readOnly).length) {
967
+ resolvedItem.readOnly = readOnly;
968
+ }
969
+ cache.lastChange[item.props.id] = {
970
+ item,
971
+ resolved: resolvedItem
972
+ };
973
+ if (onResolveEnd) {
974
+ onResolveEnd(resolvedItem);
496
975
  }
497
- const itemIndex = parentZone.findIndex(
498
- (queryItem) => queryItem.props.id === area
976
+ return resolvedItem;
977
+ }
978
+ return item;
979
+ });
980
+
981
+ // ../core/lib/apply-dynamic-props.ts
982
+ init_react_import();
983
+ var applyDynamicProps = (data, dynamicProps, rootData) => {
984
+ return __spreadProps(__spreadValues({}, data), {
985
+ root: rootData ? __spreadValues(__spreadValues({}, data.root), rootData ? rootData : {}) : data.root,
986
+ content: data.content.map((item) => {
987
+ return dynamicProps[item.props.id] ? __spreadValues(__spreadValues({}, item), dynamicProps[item.props.id]) : item;
988
+ }),
989
+ zones: Object.keys(data.zones || {}).reduce((acc, zoneKey) => {
990
+ return __spreadProps(__spreadValues({}, acc), {
991
+ [zoneKey]: data.zones[zoneKey].map((item) => {
992
+ return dynamicProps[item.props.id] ? __spreadValues(__spreadValues({}, item), dynamicProps[item.props.id]) : item;
993
+ })
994
+ });
995
+ }, {})
996
+ });
997
+ };
998
+
999
+ // ../core/lib/resolve-root-data.ts
1000
+ init_react_import();
1001
+ var cache2 = {};
1002
+ function resolveRootData(data, config, metadata) {
1003
+ return __async(this, null, function* () {
1004
+ var _a, _b, _c, _d, _e;
1005
+ if (((_a = config.root) == null ? void 0 : _a.resolveData) && data.root.props) {
1006
+ if (((_b = cache2.lastChange) == null ? void 0 : _b.original) === data.root) {
1007
+ return cache2.lastChange.resolved;
1008
+ }
1009
+ const changed = getChanged(data.root, (_c = cache2.lastChange) == null ? void 0 : _c.original);
1010
+ const rootWithProps = data.root;
1011
+ const resolvedRoot = yield (_e = config.root) == null ? void 0 : _e.resolveData(rootWithProps, {
1012
+ changed,
1013
+ lastData: ((_d = cache2.lastChange) == null ? void 0 : _d.original) || {},
1014
+ metadata: metadata || {}
1015
+ });
1016
+ cache2.lastChange = {
1017
+ original: data.root,
1018
+ resolved: resolvedRoot
1019
+ };
1020
+ return __spreadProps(__spreadValues(__spreadValues({}, data.root), resolvedRoot), {
1021
+ props: __spreadValues(__spreadValues({}, data.root.props), resolvedRoot.props)
1022
+ });
1023
+ }
1024
+ return data.root;
1025
+ });
1026
+ }
1027
+
1028
+ // ../core/lib/flatten-data.ts
1029
+ init_react_import();
1030
+ var flattenData = (data) => {
1031
+ return Object.keys(data.zones || {}).reduce(
1032
+ (acc, zone) => [...acc, ...data.zones[zone]],
1033
+ data.content
1034
+ );
1035
+ };
1036
+
1037
+ // ../core/lib/resolve-data.ts
1038
+ var import_fast_deep_equal = __toESM(require_fast_deep_equal());
1039
+ var resolveData = (newAppState, appStoreData) => {
1040
+ const {
1041
+ state: appState,
1042
+ config,
1043
+ dispatch,
1044
+ resolveDataRuns,
1045
+ setComponentLoading,
1046
+ unsetComponentLoading,
1047
+ metadata,
1048
+ permissions
1049
+ } = appStoreData;
1050
+ const deferredSetStates = {};
1051
+ const _setComponentLoading = (id, loading, defer = 0) => {
1052
+ if (deferredSetStates[id]) {
1053
+ clearTimeout(deferredSetStates[id]);
1054
+ delete deferredSetStates[id];
1055
+ }
1056
+ deferredSetStates[id] = setTimeout(() => {
1057
+ if (loading) {
1058
+ setComponentLoading(id);
1059
+ } else {
1060
+ unsetComponentLoading(id);
1061
+ }
1062
+ delete deferredSetStates[id];
1063
+ }, defer);
1064
+ };
1065
+ const runResolvers = () => __async(void 0, null, function* () {
1066
+ const newData = newAppState.data;
1067
+ const flatContent = flattenData(newData).filter(
1068
+ (item) => {
1069
+ var _a;
1070
+ return !!((_a = config.components[item.type]) == null ? void 0 : _a.resolveData);
1071
+ }
499
1072
  );
500
- const item = parentZone[itemIndex];
501
- if (!item) {
502
- return acc;
1073
+ const applyIfChange = (dynamicDataMap, dynamicRoot) => {
1074
+ const processed = applyDynamicProps(
1075
+ __spreadValues({}, appState.data),
1076
+ dynamicDataMap,
1077
+ dynamicRoot
1078
+ );
1079
+ const processedAppState = __spreadProps(__spreadValues({}, appState), { data: processed });
1080
+ const containsChanges = !(0, import_fast_deep_equal.default)(appState, processedAppState);
1081
+ if (containsChanges) {
1082
+ dispatch({
1083
+ type: "set",
1084
+ state: (prev) => __spreadProps(__spreadValues({}, prev), {
1085
+ data: applyDynamicProps(prev.data, dynamicDataMap, dynamicRoot),
1086
+ ui: resolveDataRuns > 0 ? __spreadValues(__spreadValues({}, prev.ui), newAppState.ui) : prev.ui
1087
+ }),
1088
+ recordHistory: resolveDataRuns > 0
1089
+ });
1090
+ }
1091
+ };
1092
+ const promises = [];
1093
+ promises.push(
1094
+ (() => __async(void 0, null, function* () {
1095
+ _setComponentLoading("puck-root", true, 50);
1096
+ const dynamicRoot = yield resolveRootData(newData, config, metadata);
1097
+ applyIfChange({}, dynamicRoot);
1098
+ _setComponentLoading("puck-root", false);
1099
+ }))()
1100
+ );
1101
+ flatContent.forEach((item) => {
1102
+ promises.push(
1103
+ (() => __async(void 0, null, function* () {
1104
+ permissions.resolvePermissions({ item }, true);
1105
+ const dynamicData = yield resolveComponentData(
1106
+ item,
1107
+ config,
1108
+ metadata,
1109
+ (item2) => {
1110
+ _setComponentLoading(item2.props.id, true, 50);
1111
+ },
1112
+ (item2) => {
1113
+ deferredSetStates[item2.props.id];
1114
+ _setComponentLoading(item2.props.id, false);
1115
+ }
1116
+ );
1117
+ const dynamicDataMap = { [item.props.id]: dynamicData };
1118
+ applyIfChange(dynamicDataMap);
1119
+ }))()
1120
+ );
1121
+ });
1122
+ yield Promise.all(promises);
1123
+ });
1124
+ return runResolvers();
1125
+ };
1126
+
1127
+ // ../core/store/index.ts
1128
+ import { createContext, useContext } from "react";
1129
+
1130
+ // ../core/store/slices/history.ts
1131
+ init_react_import();
1132
+ import { useEffect as useEffect2 } from "react";
1133
+
1134
+ // ../core/lib/use-hotkey.ts
1135
+ init_react_import();
1136
+ import { useEffect } from "react";
1137
+ var useHotkeyStore = create()(
1138
+ subscribeWithSelector((set) => ({
1139
+ held: {},
1140
+ hold: (key) => set((s) => s.held[key] ? s : { held: __spreadProps(__spreadValues({}, s.held), { [key]: true }) }),
1141
+ release: (key) => set((s) => s.held[key] ? { held: __spreadProps(__spreadValues({}, s.held), { [key]: false }) } : s),
1142
+ reset: (held = {}) => set(() => ({ held })),
1143
+ triggers: {}
1144
+ }))
1145
+ );
1146
+
1147
+ // ../core/store/slices/history.ts
1148
+ var EMPTY_HISTORY_INDEX = 0;
1149
+ function debounce(func, timeout = 300) {
1150
+ let timer;
1151
+ return (...args) => {
1152
+ clearTimeout(timer);
1153
+ timer = setTimeout(() => {
1154
+ func(...args);
1155
+ }, timeout);
1156
+ };
1157
+ }
1158
+ var tidyState = (state) => {
1159
+ return __spreadProps(__spreadValues({}, state), {
1160
+ ui: __spreadProps(__spreadValues({}, state.ui), {
1161
+ field: {
1162
+ focus: null
1163
+ }
1164
+ })
1165
+ });
1166
+ };
1167
+ var createHistorySlice = (set, get) => {
1168
+ const record = debounce((state) => {
1169
+ const { histories, index } = get().history;
1170
+ const history = {
1171
+ state,
1172
+ id: generateId("history")
1173
+ };
1174
+ const newHistories = [...histories.slice(0, index + 1), history];
1175
+ set({
1176
+ history: __spreadProps(__spreadValues({}, get().history), {
1177
+ histories: newHistories,
1178
+ index: newHistories.length - 1
1179
+ })
1180
+ });
1181
+ }, 250);
1182
+ return {
1183
+ initialAppState: {},
1184
+ index: EMPTY_HISTORY_INDEX,
1185
+ histories: [],
1186
+ hasPast: () => get().history.index > EMPTY_HISTORY_INDEX,
1187
+ hasFuture: () => get().history.index < get().history.histories.length - 1,
1188
+ prevHistory: () => {
1189
+ const { history } = get();
1190
+ return history.hasPast() ? history.histories[history.index - 1] : null;
1191
+ },
1192
+ nextHistory: () => {
1193
+ const s = get().history;
1194
+ return s.hasFuture() ? s.histories[s.index + 1] : null;
1195
+ },
1196
+ currentHistory: () => get().history.histories[get().history.index],
1197
+ back: () => {
1198
+ var _a;
1199
+ const { history, dispatch } = get();
1200
+ if (history.hasPast()) {
1201
+ const state = tidyState(
1202
+ ((_a = history.prevHistory()) == null ? void 0 : _a.state) || history.initialAppState
1203
+ );
1204
+ dispatch({
1205
+ type: "set",
1206
+ state
1207
+ });
1208
+ set({ history: __spreadProps(__spreadValues({}, history), { index: history.index - 1 }) });
1209
+ }
1210
+ },
1211
+ forward: () => {
1212
+ var _a;
1213
+ const { history, dispatch } = get();
1214
+ if (history.hasFuture()) {
1215
+ const state = (_a = history.nextHistory()) == null ? void 0 : _a.state;
1216
+ dispatch({ type: "set", state: state ? tidyState(state) : {} });
1217
+ set({ history: __spreadProps(__spreadValues({}, history), { index: history.index + 1 }) });
1218
+ }
1219
+ },
1220
+ setHistories: (histories) => {
1221
+ var _a;
1222
+ const { dispatch, history } = get();
1223
+ dispatch({
1224
+ type: "set",
1225
+ state: ((_a = history.histories[history.histories.length - 1]) == null ? void 0 : _a.state) || history.initialAppState
1226
+ });
1227
+ set({ history: __spreadProps(__spreadValues({}, history), { histories, index: histories.length - 1 }) });
1228
+ },
1229
+ setHistoryIndex: (index) => {
1230
+ var _a;
1231
+ const { dispatch, history } = get();
1232
+ dispatch({
1233
+ type: "set",
1234
+ state: ((_a = history.histories[history.index]) == null ? void 0 : _a.state) || history.initialAppState
1235
+ });
1236
+ set({ history: __spreadProps(__spreadValues({}, history), { index }) });
1237
+ },
1238
+ record
1239
+ };
1240
+ };
1241
+
1242
+ // ../core/store/slices/nodes.ts
1243
+ init_react_import();
1244
+ var import_fast_deep_equal2 = __toESM(require_fast_deep_equal());
1245
+ import { useEffect as useEffect3 } from "react";
1246
+ var partialDeepEqual = (newItem, existingItem) => {
1247
+ const filteredExistingItem = Object.keys(newItem).reduce(
1248
+ (acc, key) => __spreadProps(__spreadValues({}, acc), { [key]: existingItem[key] }),
1249
+ {}
1250
+ );
1251
+ return (0, import_fast_deep_equal2.default)(newItem, filteredExistingItem);
1252
+ };
1253
+ var createNodesSlice = (set, get) => ({
1254
+ nodes: {},
1255
+ registerNode: (id, node) => {
1256
+ const s = get().nodes;
1257
+ if (s.nodes[id] && partialDeepEqual(node, s.nodes[id])) {
1258
+ return;
503
1259
  }
504
- return [
505
- ...acc,
506
- {
507
- label: item.type.toString(),
508
- selector: {
509
- index: itemIndex,
510
- zone: parentZoneCompound
1260
+ const emptyNode = {
1261
+ id,
1262
+ methods: { sync: () => null },
1263
+ data: { props: { id }, type: "unknown" },
1264
+ parentId: "",
1265
+ zone: "",
1266
+ path: [],
1267
+ element: null,
1268
+ index: -1
1269
+ };
1270
+ const existingNode = s.nodes[id];
1271
+ set({
1272
+ nodes: __spreadProps(__spreadValues({}, s), {
1273
+ nodes: __spreadProps(__spreadValues({}, s.nodes), {
1274
+ [id]: __spreadProps(__spreadValues(__spreadValues(__spreadValues({}, emptyNode), existingNode), node), {
1275
+ id
1276
+ })
1277
+ })
1278
+ })
1279
+ });
1280
+ },
1281
+ unregisterNode: (id) => {
1282
+ const s = get().nodes;
1283
+ const existingNode = s.nodes[id];
1284
+ if (existingNode) {
1285
+ const newNodes = __spreadValues({}, s.nodes);
1286
+ delete newNodes[id];
1287
+ set({
1288
+ nodes: __spreadProps(__spreadValues({}, s), {
1289
+ nodes: newNodes
1290
+ })
1291
+ });
1292
+ }
1293
+ }
1294
+ });
1295
+
1296
+ // ../core/store/slices/permissions.ts
1297
+ init_react_import();
1298
+ import { useEffect as useEffect4 } from "react";
1299
+ var createPermissionsSlice = (set, get) => {
1300
+ const resolvePermissions = (..._0) => __async(void 0, [..._0], function* (params = {}, force) {
1301
+ const { state, permissions } = get();
1302
+ const { cache: cache3, globalPermissions } = permissions;
1303
+ const resolveDataForItem = (item2, force2 = false) => __async(void 0, null, function* () {
1304
+ var _a, _b, _c;
1305
+ const {
1306
+ config,
1307
+ state: appState,
1308
+ setComponentLoading,
1309
+ unsetComponentLoading
1310
+ } = get();
1311
+ const componentConfig = item2.type === "root" ? config.root : config.components[item2.type];
1312
+ if (!componentConfig) {
1313
+ return;
1314
+ }
1315
+ const initialPermissions = __spreadValues(__spreadValues({}, globalPermissions), componentConfig.permissions);
1316
+ if (componentConfig.resolvePermissions) {
1317
+ const changed = getChanged(item2, (_a = cache3[item2.props.id]) == null ? void 0 : _a.lastData);
1318
+ if (Object.values(changed).some((el) => el === true) || force2) {
1319
+ setComponentLoading(item2.props.id);
1320
+ const resolvedPermissions = yield componentConfig.resolvePermissions(
1321
+ item2,
1322
+ {
1323
+ changed,
1324
+ lastPermissions: ((_b = cache3[item2.props.id]) == null ? void 0 : _b.lastPermissions) || null,
1325
+ permissions: initialPermissions,
1326
+ appState,
1327
+ lastData: ((_c = cache3[item2.props.id]) == null ? void 0 : _c.lastData) || null
1328
+ }
1329
+ );
1330
+ const latest = get().permissions;
1331
+ set({
1332
+ permissions: __spreadProps(__spreadValues({}, latest), {
1333
+ cache: __spreadProps(__spreadValues({}, latest.cache), {
1334
+ [item2.props.id]: {
1335
+ lastData: item2,
1336
+ lastPermissions: resolvedPermissions
1337
+ }
1338
+ }),
1339
+ resolvedPermissions: __spreadProps(__spreadValues({}, latest.resolvedPermissions), {
1340
+ [item2.props.id]: resolvedPermissions
1341
+ })
1342
+ })
1343
+ });
1344
+ unsetComponentLoading(item2.props.id);
1345
+ }
1346
+ }
1347
+ });
1348
+ const resolveDataForRoot = (force2 = false) => {
1349
+ const { state: appState } = get();
1350
+ resolveDataForItem(
1351
+ // Shim the root data in by conforming to component data shape
1352
+ {
1353
+ type: "root",
1354
+ props: __spreadProps(__spreadValues({}, appState.data.root.props), { id: "puck-root" })
511
1355
  },
512
- zoneCompound
1356
+ force2
1357
+ );
1358
+ };
1359
+ const { item, type, root } = params;
1360
+ if (item) {
1361
+ yield resolveDataForItem(item, force);
1362
+ } else if (type) {
1363
+ flattenData(state.data).filter((item2) => item2.type === type).map((item2) => __async(void 0, null, function* () {
1364
+ yield resolveDataForItem(item2, force);
1365
+ }));
1366
+ } else if (root) {
1367
+ resolveDataForRoot(force);
1368
+ } else {
1369
+ resolveDataForRoot(force);
1370
+ flattenData(state.data).map((item2) => __async(void 0, null, function* () {
1371
+ yield resolveDataForItem(item2, force);
1372
+ }));
1373
+ }
1374
+ });
1375
+ const refreshPermissions = (params) => resolvePermissions(params, true);
1376
+ return {
1377
+ cache: {},
1378
+ globalPermissions: {
1379
+ drag: true,
1380
+ edit: true,
1381
+ delete: true,
1382
+ duplicate: true,
1383
+ insert: true
1384
+ },
1385
+ resolvedPermissions: {},
1386
+ getPermissions: ({ item, type, root } = {}) => {
1387
+ const { config, permissions } = get();
1388
+ const { globalPermissions, resolvedPermissions } = permissions;
1389
+ if (item) {
1390
+ const componentConfig = config.components[item.type];
1391
+ const initialPermissions = __spreadValues(__spreadValues({}, globalPermissions), componentConfig == null ? void 0 : componentConfig.permissions);
1392
+ const resolvedForItem = resolvedPermissions[item.props.id];
1393
+ return resolvedForItem ? __spreadValues(__spreadValues({}, globalPermissions), resolvedForItem) : initialPermissions;
1394
+ } else if (type) {
1395
+ const componentConfig = config.components[type];
1396
+ return __spreadValues(__spreadValues({}, globalPermissions), componentConfig == null ? void 0 : componentConfig.permissions);
1397
+ } else if (root) {
1398
+ const rootConfig = config.root;
1399
+ const initialPermissions = __spreadValues(__spreadValues({}, globalPermissions), rootConfig == null ? void 0 : rootConfig.permissions);
1400
+ const resolvedForItem = resolvedPermissions["puck-root"];
1401
+ return resolvedForItem ? __spreadValues(__spreadValues({}, globalPermissions), resolvedForItem) : initialPermissions;
513
1402
  }
514
- ];
515
- }, []);
1403
+ return globalPermissions;
1404
+ },
1405
+ resolvePermissions,
1406
+ refreshPermissions
1407
+ };
1408
+ };
1409
+
1410
+ // ../core/store/slices/fields.ts
1411
+ init_react_import();
1412
+ import { useCallback, useEffect as useEffect5 } from "react";
1413
+ var createFieldsStore = (_set, _get) => {
1414
+ return {
1415
+ fields: {},
1416
+ loading: false,
1417
+ lastResolvedData: {}
1418
+ };
516
1419
  };
1420
+
1421
+ // ../core/store/index.ts
1422
+ var defaultAppState = {
1423
+ data: { content: [], root: {}, zones: {} },
1424
+ ui: {
1425
+ leftSideBarVisible: true,
1426
+ rightSideBarVisible: true,
1427
+ arrayState: {},
1428
+ itemSelector: null,
1429
+ componentList: {},
1430
+ isDragging: false,
1431
+ previewMode: "edit",
1432
+ viewports: {
1433
+ current: {
1434
+ width: defaultViewports[0].width,
1435
+ height: defaultViewports[0].height || "auto"
1436
+ },
1437
+ options: [],
1438
+ controlsVisible: true
1439
+ },
1440
+ field: { focus: null }
1441
+ }
1442
+ };
1443
+ var defaultPageFields = {
1444
+ title: { type: "text" }
1445
+ };
1446
+ var createAppStore = (initialAppStore) => create()(
1447
+ subscribeWithSelector((set, get) => __spreadProps(__spreadValues({
1448
+ state: defaultAppState,
1449
+ config: { components: {} },
1450
+ componentState: {},
1451
+ plugins: [],
1452
+ overrides: {},
1453
+ viewports: defaultViewports,
1454
+ zoomConfig: {
1455
+ autoZoom: 1,
1456
+ rootHeight: 0,
1457
+ zoom: 1
1458
+ },
1459
+ status: "LOADING",
1460
+ iframe: {},
1461
+ metadata: {}
1462
+ }, initialAppStore), {
1463
+ fields: createFieldsStore(set, get),
1464
+ history: createHistorySlice(set, get),
1465
+ nodes: createNodesSlice(set, get),
1466
+ permissions: createPermissionsSlice(set, get),
1467
+ getComponentConfig: (type) => {
1468
+ var _a;
1469
+ const { config, selectedItem } = get();
1470
+ const rootFields = ((_a = config.root) == null ? void 0 : _a.fields) || defaultPageFields;
1471
+ return type && type !== "root" ? config.components[type] : selectedItem ? config.components[selectedItem.type] : __spreadProps(__spreadValues({}, config.root), { fields: rootFields });
1472
+ },
1473
+ dispatch: (action) => set((s) => {
1474
+ var _a, _b;
1475
+ const { record } = get().history;
1476
+ const dispatch = createReducer({ config: s.config, record });
1477
+ const state = dispatch(s.state, action);
1478
+ const selectedItem = state.ui.itemSelector ? getItem(state.ui.itemSelector, state.data) : null;
1479
+ (_b = (_a = get()).onAction) == null ? void 0 : _b.call(_a, action, state, get().state);
1480
+ return __spreadProps(__spreadValues({}, s), { state, selectedItem });
1481
+ }),
1482
+ setZoomConfig: (zoomConfig) => set({ zoomConfig }),
1483
+ setStatus: (status) => set({ status }),
1484
+ setComponentState: (componentState) => set({ componentState }),
1485
+ setComponentLoading: (id) => {
1486
+ var _a;
1487
+ const { setComponentState, componentState } = get();
1488
+ setComponentState(__spreadProps(__spreadValues({}, componentState), {
1489
+ [id]: __spreadProps(__spreadValues({}, componentState[id]), {
1490
+ loadingCount: (((_a = componentState[id]) == null ? void 0 : _a.loadingCount) || 0) + 1
1491
+ })
1492
+ }));
1493
+ },
1494
+ unsetComponentLoading: (id) => {
1495
+ var _a;
1496
+ const { setComponentState, componentState } = get();
1497
+ setComponentState(__spreadProps(__spreadValues({}, componentState), {
1498
+ [id]: __spreadProps(__spreadValues({}, componentState[id]), {
1499
+ loadingCount: Math.max(
1500
+ (((_a = componentState[id]) == null ? void 0 : _a.loadingCount) || 0) - 1,
1501
+ 0
1502
+ )
1503
+ })
1504
+ }));
1505
+ },
1506
+ // Helper
1507
+ setUi: (ui, recordHistory) => set((s) => {
1508
+ const dispatch = createReducer({
1509
+ config: s.config,
1510
+ record: () => {
1511
+ }
1512
+ });
1513
+ const state = dispatch(s.state, {
1514
+ type: "setUi",
1515
+ ui,
1516
+ recordHistory
1517
+ });
1518
+ const selectedItem = state.ui.itemSelector ? getItem(state.ui.itemSelector, state.data) : null;
1519
+ return __spreadProps(__spreadValues({}, s), { state, selectedItem });
1520
+ }),
1521
+ resolveDataRuns: 0,
1522
+ resolveData: (newAppState) => set((s) => {
1523
+ resolveData(newAppState, get());
1524
+ return __spreadProps(__spreadValues({}, s), { resolveDataRuns: s.resolveDataRuns + 1 });
1525
+ })
1526
+ }))
1527
+ );
1528
+ var appStoreContext = createContext(createAppStore());
1529
+ function useAppStore(selector) {
1530
+ const context = useContext(appStoreContext);
1531
+ return useStore(context, selector);
1532
+ }
1533
+ function useAppStoreApi() {
1534
+ return useContext(appStoreContext);
1535
+ }
1536
+
1537
+ // ../core/lib/use-breadcrumbs.ts
517
1538
  var useBreadcrumbs = (renderCount) => {
518
- const {
519
- state: { data },
520
- selectedItem
521
- } = useAppContext();
522
- const dzContext = useContext2(dropZoneContext);
523
- return useMemo2(() => {
524
- const breadcrumbs = convertPathDataToBreadcrumbs(
525
- selectedItem,
526
- dzContext == null ? void 0 : dzContext.pathData,
527
- data
528
- );
1539
+ const selectedId = useAppStore((s) => {
1540
+ var _a;
1541
+ return (_a = s.selectedItem) == null ? void 0 : _a.props.id;
1542
+ });
1543
+ const config = useAppStore((s) => s.config);
1544
+ const path = useAppStore((s) => {
1545
+ var _a;
1546
+ return (_a = s.nodes.nodes[selectedId]) == null ? void 0 : _a.path;
1547
+ });
1548
+ const appStore = useAppStoreApi();
1549
+ return useMemo(() => {
1550
+ const breadcrumbs = (path == null ? void 0 : path.map((zoneCompound) => {
1551
+ var _a, _b;
1552
+ const [componentId] = zoneCompound.split(":");
1553
+ if (componentId === "root") {
1554
+ return {
1555
+ label: "Page",
1556
+ selector: null
1557
+ };
1558
+ }
1559
+ const node = appStore.getState().nodes.nodes[componentId];
1560
+ const label = node ? (_b = (_a = config.components[node.data.type]) == null ? void 0 : _a.label) != null ? _b : node.data.type : "Component";
1561
+ return {
1562
+ label,
1563
+ selector: node ? {
1564
+ index: node.index,
1565
+ zone: node.path[node.path.length - 1]
1566
+ } : null
1567
+ };
1568
+ })) || [];
529
1569
  if (renderCount) {
530
1570
  return breadcrumbs.slice(breadcrumbs.length - renderCount);
531
1571
  }
532
1572
  return breadcrumbs;
533
- }, [selectedItem, dzContext == null ? void 0 : dzContext.pathData, renderCount]);
1573
+ }, [path, renderCount]);
534
1574
  };
535
1575
 
536
1576
  // ../core/components/Loader/index.tsx
@@ -542,18 +1582,12 @@ init_react_import();
542
1582
  // ../core/lib/filter.ts
543
1583
  init_react_import();
544
1584
 
545
- // ../core/lib/reorder.ts
546
- init_react_import();
547
-
548
- // ../core/lib/replace.ts
549
- init_react_import();
550
-
551
1585
  // css-module:/home/runner/work/puck/puck/packages/core/components/Loader/styles.module.css#css-module
552
1586
  init_react_import();
553
1587
  var styles_module_default3 = { "Loader": "_Loader_nacdm_13", "loader-animation": "_loader-animation_nacdm_1" };
554
1588
 
555
1589
  // ../core/components/Loader/index.tsx
556
- import { jsx as jsx4 } from "react/jsx-runtime";
1590
+ import { jsx as jsx2 } from "react/jsx-runtime";
557
1591
  var getClassName2 = get_class_name_factory_default("Loader", styles_module_default3);
558
1592
  var Loader = (_a) => {
559
1593
  var _b = _a, {
@@ -563,7 +1597,7 @@ var Loader = (_a) => {
563
1597
  "color",
564
1598
  "size"
565
1599
  ]);
566
- return /* @__PURE__ */ jsx4(
1600
+ return /* @__PURE__ */ jsx2(
567
1601
  "span",
568
1602
  __spreadValues({
569
1603
  className: getClassName2(),
@@ -578,7 +1612,7 @@ var Loader = (_a) => {
578
1612
  };
579
1613
 
580
1614
  // ../core/components/SidebarSection/index.tsx
581
- import { jsx as jsx5, jsxs } from "react/jsx-runtime";
1615
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
582
1616
  var getClassName3 = get_class_name_factory_default("SidebarSection", styles_module_default);
583
1617
  var SidebarSection = ({
584
1618
  children,
@@ -589,7 +1623,7 @@ var SidebarSection = ({
589
1623
  noPadding,
590
1624
  isLoading
591
1625
  }) => {
592
- const { setUi } = useAppContext();
1626
+ const setUi = useAppStore((s) => s.setUi);
593
1627
  const breadcrumbs = useBreadcrumbs(1);
594
1628
  return /* @__PURE__ */ jsxs(
595
1629
  "div",
@@ -597,9 +1631,9 @@ var SidebarSection = ({
597
1631
  className: getClassName3({ noBorderTop, noPadding }),
598
1632
  style: { background },
599
1633
  children: [
600
- /* @__PURE__ */ jsx5("div", { className: getClassName3("title"), children: /* @__PURE__ */ jsxs("div", { className: getClassName3("breadcrumbs"), children: [
1634
+ /* @__PURE__ */ jsx3("div", { className: getClassName3("title"), children: /* @__PURE__ */ jsxs("div", { className: getClassName3("breadcrumbs"), children: [
601
1635
  showBreadcrumbs ? breadcrumbs.map((breadcrumb, i) => /* @__PURE__ */ jsxs("div", { className: getClassName3("breadcrumb"), children: [
602
- /* @__PURE__ */ jsx5(
1636
+ /* @__PURE__ */ jsx3(
603
1637
  "button",
604
1638
  {
605
1639
  type: "button",
@@ -608,12 +1642,12 @@ var SidebarSection = ({
608
1642
  children: breadcrumb.label
609
1643
  }
610
1644
  ),
611
- /* @__PURE__ */ jsx5(ChevronRight, { size: 16 })
1645
+ /* @__PURE__ */ jsx3(ChevronRight, { size: 16 })
612
1646
  ] }, i)) : null,
613
- /* @__PURE__ */ jsx5("div", { className: getClassName3("heading"), children: /* @__PURE__ */ jsx5(Heading, { rank: "2", size: "xs", children: title }) })
1647
+ /* @__PURE__ */ jsx3("div", { className: getClassName3("heading"), children: /* @__PURE__ */ jsx3(Heading, { rank: "2", size: "xs", children: title }) })
614
1648
  ] }) }),
615
- /* @__PURE__ */ jsx5("div", { className: getClassName3("content"), children }),
616
- isLoading && /* @__PURE__ */ jsx5("div", { className: getClassName3("loadingOverlay"), children: /* @__PURE__ */ jsx5(Loader, { size: 32 }) })
1649
+ /* @__PURE__ */ jsx3("div", { className: getClassName3("content"), children }),
1650
+ isLoading && /* @__PURE__ */ jsx3("div", { className: getClassName3("loadingOverlay"), children: /* @__PURE__ */ jsx3(Loader, { size: 32 }) })
617
1651
  ]
618
1652
  }
619
1653
  );
@@ -627,18 +1661,18 @@ init_react_import();
627
1661
  var styles_module_default4 = { "OutlineList": "_OutlineList_w4lzv_1", "OutlineListItem": "_OutlineListItem_w4lzv_25", "OutlineListItem--clickable": "_OutlineListItem--clickable_w4lzv_45" };
628
1662
 
629
1663
  // ../core/components/OutlineList/index.tsx
630
- import { jsx as jsx6 } from "react/jsx-runtime";
1664
+ import { jsx as jsx4 } from "react/jsx-runtime";
631
1665
  var getClassName4 = get_class_name_factory_default("OutlineList", styles_module_default4);
632
1666
  var getClassNameItem = get_class_name_factory_default("OutlineListItem", styles_module_default4);
633
1667
  var OutlineList = ({ children }) => {
634
- return /* @__PURE__ */ jsx6("ul", { className: getClassName4(), children });
1668
+ return /* @__PURE__ */ jsx4("ul", { className: getClassName4(), children });
635
1669
  };
636
- OutlineList.Clickable = ({ children }) => /* @__PURE__ */ jsx6("div", { className: getClassNameItem({ clickable: true }), children });
1670
+ OutlineList.Clickable = ({ children }) => /* @__PURE__ */ jsx4("div", { className: getClassNameItem({ clickable: true }), children });
637
1671
  OutlineList.Item = ({
638
1672
  children,
639
1673
  onClick
640
1674
  }) => {
641
- return /* @__PURE__ */ jsx6(
1675
+ return /* @__PURE__ */ jsx4(
642
1676
  "li",
643
1677
  {
644
1678
  className: getClassNameItem({ clickable: !!onClick }),
@@ -672,7 +1706,7 @@ var getFrame = () => {
672
1706
 
673
1707
  // src/HeadingAnalyzer.tsx
674
1708
  import ReactFromJSONModule from "react-from-json";
675
- import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs2 } from "react/jsx-runtime";
1709
+ import { Fragment, jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
676
1710
  var getClassName5 = get_class_name_factory_default("HeadingAnalyzer", HeadingAnalyzer_module_default);
677
1711
  var getClassNameItem2 = get_class_name_factory_default("HeadingAnalyzerItem", HeadingAnalyzer_module_default);
678
1712
  var ReactFromJSON = ReactFromJSONModule.default || ReactFromJSONModule;
@@ -680,6 +1714,9 @@ var getOutline = ({ frame } = {}) => {
680
1714
  const headings = (frame == null ? void 0 : frame.querySelectorAll("h1,h2,h3,h4,h5,h6")) || [];
681
1715
  const _outline = [];
682
1716
  headings.forEach((item, i) => {
1717
+ if (item.closest("[data-dnd-dragging]")) {
1718
+ return;
1719
+ }
683
1720
  _outline.push({
684
1721
  rank: parseInt(item.tagName.split("H")[1]),
685
1722
  text: item.textContent,
@@ -722,10 +1759,11 @@ function buildHierarchy(frame) {
722
1759
  }
723
1760
  return root.children;
724
1761
  }
1762
+ var usePuck = createUsePuck();
725
1763
  var HeadingAnalyzer = () => {
726
- const { appState } = usePuck();
727
- const [hierarchy, setHierarchy] = useState5([]);
728
- useEffect4(() => {
1764
+ const data = usePuck((s) => s.appState.data);
1765
+ const [hierarchy, setHierarchy] = useState([]);
1766
+ useEffect6(() => {
729
1767
  const frame = getFrame();
730
1768
  const entry = frame == null ? void 0 : frame.querySelector(`[data-puck-entry]`);
731
1769
  if (!entry) return;
@@ -737,7 +1775,7 @@ var HeadingAnalyzer = () => {
737
1775
  return () => {
738
1776
  observer.disconnect();
739
1777
  };
740
- }, [appState.data]);
1778
+ }, [data]);
741
1779
  return /* @__PURE__ */ jsxs2("div", { className: getClassName5(), children: [
742
1780
  /* @__PURE__ */ jsxs2(
743
1781
  "small",
@@ -751,19 +1789,19 @@ var HeadingAnalyzer = () => {
751
1789
  children: [
752
1790
  "Heading analyzer styles not loaded. Please review the",
753
1791
  " ",
754
- /* @__PURE__ */ jsx7("a", { href: "https://github.com/measuredco/puck/blob/main/packages/plugin-heading-analyzer/README.md", children: "README" }),
1792
+ /* @__PURE__ */ jsx5("a", { href: "https://github.com/measuredco/puck/blob/main/packages/plugin-heading-analyzer/README.md", children: "README" }),
755
1793
  "."
756
1794
  ]
757
1795
  }
758
1796
  ),
759
- hierarchy.length === 0 && /* @__PURE__ */ jsx7("div", { children: "No headings." }),
760
- /* @__PURE__ */ jsx7(OutlineList, { children: /* @__PURE__ */ jsx7(
1797
+ hierarchy.length === 0 && /* @__PURE__ */ jsx5("div", { children: "No headings." }),
1798
+ /* @__PURE__ */ jsx5(OutlineList, { children: /* @__PURE__ */ jsx5(
761
1799
  ReactFromJSON,
762
1800
  {
763
1801
  mapping: {
764
- Root: (props) => /* @__PURE__ */ jsx7(Fragment2, { children: props.children }),
1802
+ Root: (props) => /* @__PURE__ */ jsx5(Fragment, { children: props.children }),
765
1803
  OutlineListItem: (props) => /* @__PURE__ */ jsxs2(OutlineList.Item, { children: [
766
- /* @__PURE__ */ jsx7(OutlineList.Clickable, { children: /* @__PURE__ */ jsx7(
1804
+ /* @__PURE__ */ jsx5(OutlineList.Clickable, { children: /* @__PURE__ */ jsx5(
767
1805
  "small",
768
1806
  {
769
1807
  className: getClassNameItem2({ missing: props.missing }),
@@ -781,13 +1819,13 @@ var HeadingAnalyzer = () => {
781
1819
  }, 2e3);
782
1820
  }
783
1821
  },
784
- children: props.missing ? /* @__PURE__ */ jsxs2(Fragment2, { children: [
1822
+ children: props.missing ? /* @__PURE__ */ jsxs2(Fragment, { children: [
785
1823
  /* @__PURE__ */ jsxs2("b", { children: [
786
1824
  "H",
787
1825
  props.rank
788
1826
  ] }),
789
1827
  ": Missing"
790
- ] }) : /* @__PURE__ */ jsxs2(Fragment2, { children: [
1828
+ ] }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
791
1829
  /* @__PURE__ */ jsxs2("b", { children: [
792
1830
  "H",
793
1831
  props.rank
@@ -797,7 +1835,7 @@ var HeadingAnalyzer = () => {
797
1835
  ] })
798
1836
  }
799
1837
  ) }),
800
- /* @__PURE__ */ jsx7(OutlineList, { children: props.children })
1838
+ /* @__PURE__ */ jsx5(OutlineList, { children: props.children })
801
1839
  ] })
802
1840
  },
803
1841
  entry: {
@@ -819,9 +1857,9 @@ var HeadingAnalyzer = () => {
819
1857
  };
820
1858
  var headingAnalyzer = {
821
1859
  overrides: {
822
- fields: ({ children, itemSelector }) => /* @__PURE__ */ jsxs2(Fragment2, { children: [
1860
+ fields: ({ children, itemSelector }) => /* @__PURE__ */ jsxs2(Fragment, { children: [
823
1861
  children,
824
- /* @__PURE__ */ jsx7("div", { style: { display: itemSelector ? "none" : "block" }, children: /* @__PURE__ */ jsx7(SidebarSection, { title: "Heading Outline", children: /* @__PURE__ */ jsx7(HeadingAnalyzer, {}) }) })
1862
+ /* @__PURE__ */ jsx5("div", { style: { display: itemSelector ? "none" : "block" }, children: /* @__PURE__ */ jsx5(SidebarSection, { title: "Heading Outline", children: /* @__PURE__ */ jsx5(HeadingAnalyzer, {}) }) })
825
1863
  ] })
826
1864
  }
827
1865
  };