@drawnagency/primitives 0.1.75 → 0.1.77

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 (83) hide show
  1. package/dist/chunk-2G2S36SY.js +13 -0
  2. package/dist/{chunk-7T2WQSWF.js → chunk-63BQQNZO.js} +9 -9
  3. package/dist/chunk-REM2NH7K.js +44 -0
  4. package/dist/{chunk-U4E6S4PX.js → chunk-RO4E5UJI.js} +53 -39
  5. package/dist/{chunk-NKVZGPR6.js → chunk-YP7IHMC3.js} +1 -1
  6. package/dist/collab/provider-registry.d.ts +4 -0
  7. package/dist/collab/provider-registry.d.ts.map +1 -0
  8. package/dist/collab/provider-registry.js +9 -0
  9. package/dist/collab/rebase.d.ts +37 -0
  10. package/dist/collab/rebase.d.ts.map +1 -0
  11. package/dist/collab/rebase.js +64 -0
  12. package/dist/collab/recovery.d.ts +89 -0
  13. package/dist/collab/recovery.d.ts.map +1 -0
  14. package/dist/collab/types.d.ts +93 -0
  15. package/dist/collab/types.d.ts.map +1 -0
  16. package/dist/collab/types.js +19 -0
  17. package/dist/components/editor/AudienceIndicator.d.ts +3 -1
  18. package/dist/components/editor/AudienceIndicator.d.ts.map +1 -1
  19. package/dist/components/editor/ChildBlockWrapper.d.ts +7 -0
  20. package/dist/components/editor/ChildBlockWrapper.d.ts.map +1 -1
  21. package/dist/components/editor/ConflictDialog.d.ts +14 -0
  22. package/dist/components/editor/ConflictDialog.d.ts.map +1 -0
  23. package/dist/components/editor/IndicatorPill.d.ts +4 -1
  24. package/dist/components/editor/IndicatorPill.d.ts.map +1 -1
  25. package/dist/components/editor/LockBadge.d.ts +7 -0
  26. package/dist/components/editor/LockBadge.d.ts.map +1 -0
  27. package/dist/components/editor/PresenceAvatars.d.ts +9 -0
  28. package/dist/components/editor/PresenceAvatars.d.ts.map +1 -0
  29. package/dist/components/editor/SectionWrapper.d.ts +1 -1
  30. package/dist/components/editor/SectionWrapper.d.ts.map +1 -1
  31. package/dist/components/editor/StatusIndicator.d.ts +3 -1
  32. package/dist/components/editor/StatusIndicator.d.ts.map +1 -1
  33. package/dist/components/editor/index.js +92 -44
  34. package/dist/components/primitives/index.js +3 -3
  35. package/dist/components/sections/Container/Container.d.ts.map +1 -1
  36. package/dist/components/sections/brand-guide.js +3 -3
  37. package/dist/components/sections/register-schemas.js +9 -9
  38. package/dist/components/sections/register.js +9 -9
  39. package/dist/components/shell/EditorShell.d.ts +3 -1
  40. package/dist/components/shell/EditorShell.d.ts.map +1 -1
  41. package/dist/hooks/useCollabSession.d.ts +23 -0
  42. package/dist/hooks/useCollabSession.d.ts.map +1 -0
  43. package/dist/hooks/useEditorPersistence.d.ts +21 -1
  44. package/dist/hooks/useEditorPersistence.d.ts.map +1 -1
  45. package/dist/hooks/useEditorPublish.d.ts +39 -2
  46. package/dist/hooks/useEditorPublish.d.ts.map +1 -1
  47. package/dist/index.d.ts +2 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +44 -22
  50. package/dist/lib/dexie.d.ts +12 -0
  51. package/dist/lib/dexie.d.ts.map +1 -1
  52. package/dist/lib/dexie.js +27 -0
  53. package/dist/lib/index.js +12 -12
  54. package/dist/lib/registry.d.ts +10 -0
  55. package/dist/lib/registry.d.ts.map +1 -1
  56. package/dist/schemas/index.js +1 -1
  57. package/dist/types/database.d.ts +70 -0
  58. package/dist/types/database.d.ts.map +1 -1
  59. package/package.json +13 -1
  60. package/src/collab/provider-registry.ts +14 -0
  61. package/src/collab/rebase.ts +140 -0
  62. package/src/collab/recovery.ts +149 -0
  63. package/src/collab/types.ts +96 -0
  64. package/src/components/editor/AudienceIndicator.tsx +4 -1
  65. package/src/components/editor/ChildBlockWrapper.tsx +15 -1
  66. package/src/components/editor/ConflictDialog.tsx +61 -0
  67. package/src/components/editor/IndicatorPill.tsx +12 -6
  68. package/src/components/editor/LockBadge.tsx +31 -0
  69. package/src/components/editor/PresenceAvatars.tsx +53 -0
  70. package/src/components/editor/SectionWrapper.tsx +60 -29
  71. package/src/components/editor/StatusIndicator.tsx +4 -0
  72. package/src/components/sections/Container/Container.tsx +6 -4
  73. package/src/components/shell/EditorShell.tsx +561 -18
  74. package/src/hooks/useCollabSession.ts +220 -0
  75. package/src/hooks/useEditorPersistence.ts +104 -1
  76. package/src/hooks/useEditorPublish.ts +205 -63
  77. package/src/index.ts +2 -0
  78. package/src/lib/dexie.ts +44 -0
  79. package/src/lib/registry.ts +8 -0
  80. package/src/types/database.ts +55 -0
  81. package/dist/{chunk-Q3T23HVW.js → chunk-B2DLHZKC.js} +4 -4
  82. package/dist/{chunk-T7MP7ANP.js → chunk-UUCOJL7O.js} +0 -0
  83. package/dist/{chunk-ZRWGV5O6.js → chunk-XFDEUK37.js} +3 -3
@@ -0,0 +1,14 @@
1
+ export interface ConflictItem {
2
+ sectionId: string;
3
+ label: string;
4
+ }
5
+ /** Presented on 409 recovery when a section the editor changed was ALSO changed
6
+ * remotely. The user picks which side wins per section; the losing local copy
7
+ * is always snapshotted to Dexie either way (stored, not user-recoverable via
8
+ * the UI). Defaults every conflict to "mine" so a blind Continue never silently
9
+ * drops local work. */
10
+ export declare function ConflictDialog({ conflicts, onResolve, }: {
11
+ conflicts: ConflictItem[];
12
+ onResolve: (choices: Record<string, "mine" | "theirs">) => void;
13
+ }): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=ConflictDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConflictDialog.d.ts","sourceRoot":"","sources":["../../../src/components/editor/ConflictDialog.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;wBAIwB;AACxB,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,SAAS,GACV,EAAE;IACD,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,KAAK,IAAI,CAAC;CACjE,2CAwCA"}
@@ -12,7 +12,10 @@ interface IndicatorPillProps {
12
12
  className?: string;
13
13
  buttonClassName?: string;
14
14
  ariaLabel?: string;
15
+ /** Display-only mode: dots/label still render but the popovers never open
16
+ * (e.g. while another editor holds the section lock). */
17
+ disabled?: boolean;
15
18
  }
16
- export declare function IndicatorPill({ dots, label, hoverContent, clickContent, className, buttonClassName, ariaLabel, }: IndicatorPillProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function IndicatorPill({ dots, label, hoverContent, clickContent, className, buttonClassName, ariaLabel, disabled, }: IndicatorPillProps): import("react/jsx-runtime").JSX.Element;
17
20
  export {};
18
21
  //# sourceMappingURL=IndicatorPill.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IndicatorPill.d.ts","sourceRoot":"","sources":["../../../src/components/editor/IndicatorPill.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAItE,UAAU,MAAM;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,eAAe,EACf,SAAS,GACV,EAAE,kBAAkB,2CA6FpB"}
1
+ {"version":3,"file":"IndicatorPill.d.ts","sourceRoot":"","sources":["../../../src/components/editor/IndicatorPill.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAItE,UAAU,MAAM;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;8DAC0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,eAAe,EACf,SAAS,EACT,QAAQ,GACT,EAAE,kBAAkB,2CA+FpB"}
@@ -0,0 +1,7 @@
1
+ interface LockBadgeProps {
2
+ email: string;
3
+ onTakeover?: () => void;
4
+ }
5
+ export declare function LockBadge({ email, onTakeover }: LockBadgeProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=LockBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LockBadge.d.ts","sourceRoot":"","sources":["../../../src/components/editor/LockBadge.tsx"],"names":[],"mappings":"AAGA,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAKD,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,cAAc,2CAmB9D"}
@@ -0,0 +1,9 @@
1
+ import type { CollabPeer, CollabStatus } from "../../collab/types";
2
+ interface PresenceAvatarsProps {
3
+ peers: CollabPeer[];
4
+ selfUserId: string | null;
5
+ status: CollabStatus;
6
+ }
7
+ export declare function PresenceAvatars({ peers, selfUserId, status }: PresenceAvatarsProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};
9
+ //# sourceMappingURL=PresenceAvatars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresenceAvatars.d.ts","sourceRoot":"","sources":["../../../src/components/editor/PresenceAvatars.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAuBnE,UAAU,oBAAoB;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,oBAAoB,kDAuBlF"}
@@ -1,3 +1,3 @@
1
1
  import type { WrapperProps } from "../../lib/registry";
2
- export declare function SectionWrapper({ sectionId, sectionType, status, dirty, index, isLast, containerId, isContainerBlock, definition, options, audiences, access, onAccessChange, onStatusChange, onSectionChange, onReorder, onRequestInsert, onDelete, onMoveSection, onAddChild, mainStatus, contentDiffersFromMain, isLocalOnly, children, }: WrapperProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function SectionWrapper({ sectionId, sectionType, status, dirty, index, isLast, containerId, isContainerBlock, definition, options, audiences, access, onAccessChange, onStatusChange, onSectionChange, onReorder, onRequestInsert, onDelete, onMoveSection, onAddChild, mainStatus, contentDiffersFromMain, isLocalOnly, lockedBy, onTakeover, onEditIntent, children, }: WrapperProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=SectionWrapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SectionWrapper.d.ts","sourceRoot":"","sources":["../../../src/components/editor/SectionWrapper.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,WAAW,EACX,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,OAAO,EACP,SAAS,EACT,MAAM,EACN,cAAc,EACd,cAAc,EACd,eAAe,EACf,SAAS,EACT,eAAe,EACf,QAAQ,EACR,aAAa,EACb,UAAU,EACV,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,QAAQ,GACT,EAAE,YAAY,2CAqTd"}
1
+ {"version":3,"file":"SectionWrapper.d.ts","sourceRoot":"","sources":["../../../src/components/editor/SectionWrapper.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,WAAW,EACX,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,OAAO,EACP,SAAS,EACT,MAAM,EACN,cAAc,EACd,cAAc,EACd,eAAe,EACf,SAAS,EACT,eAAe,EACf,QAAQ,EACR,aAAa,EACb,UAAU,EACV,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,QAAQ,GACT,EAAE,YAAY,2CAgVd"}
@@ -23,7 +23,9 @@ interface StatusIndicatorProps {
23
23
  status: Status;
24
24
  dirty?: boolean;
25
25
  onChange: (status: Status) => void;
26
+ /** Display-only mode — the pill still shows status but the picker never opens. */
27
+ disabled?: boolean;
26
28
  }
27
- export declare function StatusIndicator({ mainStatus, savedStatus, contentDiffers, isLocalOnly, status, dirty, onChange, }: StatusIndicatorProps): import("react/jsx-runtime").JSX.Element;
29
+ export declare function StatusIndicator({ mainStatus, savedStatus, contentDiffers, isLocalOnly, status, dirty, onChange, disabled, }: StatusIndicatorProps): import("react/jsx-runtime").JSX.Element;
28
30
  export {};
29
31
  //# sourceMappingURL=StatusIndicator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusIndicator.d.ts","sourceRoot":"","sources":["../../../src/components/editor/StatusIndicator.tsx"],"names":[],"mappings":"AAKA,KAAK,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAC9D,KAAK,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAE5C,UAAU,MAAM;IACd,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD,wBAAgB,mBAAmB,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,WAAW,GAAG,YAAY,CAkCvH;AAYD,UAAU,oBAAoB;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,MAAM,EACN,KAAK,EACL,QAAQ,GACT,EAAE,oBAAoB,2CA4CtB"}
1
+ {"version":3,"file":"StatusIndicator.d.ts","sourceRoot":"","sources":["../../../src/components/editor/StatusIndicator.tsx"],"names":[],"mappings":"AAKA,KAAK,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAC9D,KAAK,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAE5C,UAAU,MAAM;IACd,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD,wBAAgB,mBAAmB,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,WAAW,GAAG,YAAY,CAkCvH;AAYD,UAAU,oBAAoB;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,oBAAoB,2CA6CtB"}
@@ -11,9 +11,9 @@ import {
11
11
  buildBlockDropData,
12
12
  canDropBlock,
13
13
  isBlockDragData
14
- } from "../../chunk-Q3T23HVW.js";
15
- import "../../chunk-ZSPCE6MZ.js";
14
+ } from "../../chunk-B2DLHZKC.js";
16
15
  import "../../chunk-5THS4K5D.js";
16
+ import "../../chunk-ZSPCE6MZ.js";
17
17
  import {
18
18
  AddIcon,
19
19
  IconButton
@@ -58,7 +58,8 @@ function IndicatorPill({
58
58
  clickContent,
59
59
  className,
60
60
  buttonClassName,
61
- ariaLabel
61
+ ariaLabel,
62
+ disabled
62
63
  }) {
63
64
  const [hoverOpen, setHoverOpen] = useState(false);
64
65
  const [clickOpen, setClickOpen] = useState(false);
@@ -72,7 +73,7 @@ function IndicatorPill({
72
73
  }, []);
73
74
  function handleMouseEnter() {
74
75
  clearHoverTimeout();
75
- if (!clickOpen && hoverContent) {
76
+ if (!disabled && !clickOpen && hoverContent) {
76
77
  setHoverOpen(true);
77
78
  }
78
79
  }
@@ -83,7 +84,7 @@ function IndicatorPill({
83
84
  }, 150);
84
85
  }
85
86
  function handleClick() {
86
- if (!clickContent) return;
87
+ if (disabled || !clickContent) return;
87
88
  setHoverOpen(false);
88
89
  clearHoverTimeout();
89
90
  setClickOpen((v) => !v);
@@ -100,15 +101,17 @@ function IndicatorPill({
100
101
  onClick: handleClick,
101
102
  onMouseEnter: handleMouseEnter,
102
103
  onMouseLeave: handleMouseLeave,
103
- "aria-haspopup": clickContent ? "true" : void 0,
104
- "aria-expanded": clickContent ? clickOpen : void 0,
104
+ "aria-haspopup": !disabled && clickContent ? "true" : void 0,
105
+ "aria-expanded": !disabled && clickContent ? clickOpen : void 0,
106
+ "aria-disabled": disabled || void 0,
105
107
  "aria-label": ariaLabel,
106
108
  className: cn(
107
109
  // align-middle keeps the inline-flex pill centred in its line box regardless of
108
110
  // whether it leads with a status/audience dot — without it, the dot-less variant's
109
111
  // text baseline sits ~2px lower than the dotted variant, misaligning the two pills.
110
- "cursor-pointer inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium align-middle",
111
- "border border-base-200 hover:bg-base-accent",
112
+ "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium align-middle",
113
+ "border border-base-200",
114
+ disabled ? "cursor-default opacity-60" : "cursor-pointer hover:bg-base-accent",
112
115
  buttonClassName
113
116
  ),
114
117
  children: [
@@ -206,7 +209,8 @@ function StatusIndicator({
206
209
  isLocalOnly,
207
210
  status,
208
211
  dirty,
209
- onChange
212
+ onChange,
213
+ disabled
210
214
  }) {
211
215
  const display = deriveStatusDisplay({ mainStatus, savedStatus, contentDiffers, isLocalOnly });
212
216
  const pillDots = display.dots.map((d) => ({
@@ -221,6 +225,7 @@ function StatusIndicator({
221
225
  label: labelText,
222
226
  ariaLabel: display.description,
223
227
  buttonClassName: "text-base-contrast-light",
228
+ disabled,
224
229
  clickContent: (onClose) => /* @__PURE__ */ jsx3("ul", { role: "radiogroup", "aria-label": "Section status", className: "w-full overflow-hidden py-1", children: STATUSES.map((s) => {
225
230
  const checked = s === status;
226
231
  return /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsxs3(
@@ -253,7 +258,7 @@ function StatusIndicator({
253
258
  // src/components/editor/AudienceIndicator.tsx
254
259
  import { Check as Check2 } from "lucide-react";
255
260
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
256
- function AudienceIndicator({ access, audiences, onChange }) {
261
+ function AudienceIndicator({ access, audiences, onChange, disabled }) {
257
262
  const selected = audiences.filter((a) => access.includes(a.name));
258
263
  const visibleDots = selected.slice(0, 3);
259
264
  function toggle(name) {
@@ -273,6 +278,7 @@ function AudienceIndicator({ access, audiences, onChange }) {
273
278
  dots: pillDots,
274
279
  label: labelText,
275
280
  buttonClassName: selected.length === 0 ? "text-base-contrast-light" : void 0,
281
+ disabled,
276
282
  clickContent: audiences.length === 0 ? /* @__PURE__ */ jsx4("div", { className: "px-3 py-2 text-xs text-base-contrast-light whitespace-nowrap", children: "No audiences configured. Add audiences in Site Settings \u2192 Viewer Access." }) : /* @__PURE__ */ jsx4("ul", { role: "list", className: "w-full overflow-hidden py-1", children: audiences.map((a) => {
277
283
  const checked = access.includes(a.name);
278
284
  return /* @__PURE__ */ jsx4("li", { children: /* @__PURE__ */ jsxs4(
@@ -313,9 +319,34 @@ function AudienceIndicator({ access, audiences, onChange }) {
313
319
  import { useState as useState4, useRef as useRef2, useEffect } from "react";
314
320
  import { ArrowRightLeft, Plus } from "lucide-react";
315
321
 
322
+ // src/components/editor/LockBadge.tsx
323
+ import { Lock } from "lucide-react";
324
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
325
+ function LockBadge({ email, onTakeover }) {
326
+ return /* @__PURE__ */ jsxs5("span", { className: "pointer-events-auto inline-flex items-center gap-1.5 rounded-full bg-status-modified-bg px-2 py-0.5 text-xs font-medium text-status-modified-text align-middle", children: [
327
+ /* @__PURE__ */ jsx5(Lock, { size: 12, strokeWidth: 2.5, "aria-hidden": "true" }),
328
+ /* @__PURE__ */ jsxs5("span", { className: "whitespace-nowrap", children: [
329
+ email,
330
+ " is editing"
331
+ ] }),
332
+ onTakeover && /* @__PURE__ */ jsx5(
333
+ "button",
334
+ {
335
+ type: "button",
336
+ onClick: onTakeover,
337
+ className: cn(
338
+ "cursor-pointer rounded px-1.5 py-0.5 font-semibold",
339
+ "bg-status-modified-text/10 hover:bg-status-modified-text/20"
340
+ ),
341
+ children: "Take over"
342
+ }
343
+ )
344
+ ] });
345
+ }
346
+
316
347
  // src/components/shell/EditorContext.tsx
317
348
  import { createContext, useContext, useState as useState2, useCallback as useCallback2 } from "react";
318
- import { jsx as jsx5 } from "react/jsx-runtime";
349
+ import { jsx as jsx6 } from "react/jsx-runtime";
319
350
  var EditorContext = createContext(null);
320
351
  function useEditorContext() {
321
352
  const context = useContext(EditorContext);
@@ -327,7 +358,7 @@ function useEditorContext() {
327
358
 
328
359
  // src/components/shell/EditorModalContext.tsx
329
360
  import { createContext as createContext2, useContext as useContext2, useState as useState3, useCallback as useCallback3 } from "react";
330
- import { jsx as jsx6 } from "react/jsx-runtime";
361
+ import { jsx as jsx7 } from "react/jsx-runtime";
331
362
  var EditorModalContext = createContext2(null);
332
363
  function useEditorModal() {
333
364
  const context = useContext2(EditorModalContext);
@@ -338,7 +369,7 @@ function useEditorModal() {
338
369
  }
339
370
 
340
371
  // src/components/editor/SectionWrapper.tsx
341
- import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
372
+ import { Fragment as Fragment2, jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
342
373
  function SectionWrapper({
343
374
  sectionId,
344
375
  sectionType,
@@ -363,8 +394,12 @@ function SectionWrapper({
363
394
  mainStatus,
364
395
  contentDiffersFromMain,
365
396
  isLocalOnly,
397
+ lockedBy,
398
+ onTakeover,
399
+ onEditIntent,
366
400
  children
367
401
  }) {
402
+ const isLocked = !!lockedBy;
368
403
  const { isEditMode, showAllChrome } = useEditorContext();
369
404
  const { openModal } = useEditorModal();
370
405
  const [isActive, setIsActive] = useState4(false);
@@ -384,7 +419,10 @@ function SectionWrapper({
384
419
  useEffect(() => {
385
420
  const block = blockRef.current;
386
421
  if (!block) return;
387
- const onFocusIn = () => setIsActive(true);
422
+ const onFocusIn = () => {
423
+ setIsActive(true);
424
+ if (!isLocked && onEditIntent) void onEditIntent();
425
+ };
388
426
  const onFocusOut = (e) => {
389
427
  if (!block.contains(e.relatedTarget)) setIsActive(false);
390
428
  };
@@ -394,7 +432,7 @@ function SectionWrapper({
394
432
  block.removeEventListener("focusin", onFocusIn);
395
433
  block.removeEventListener("focusout", onFocusOut);
396
434
  };
397
- }, []);
435
+ }, [isLocked, onEditIntent]);
398
436
  useEffect(() => {
399
437
  const block = blockRef.current;
400
438
  const handle = handleRef.current;
@@ -462,14 +500,14 @@ function SectionWrapper({
462
500
  cancelled = true;
463
501
  cleanup?.();
464
502
  };
465
- }, [sectionId, index, containerId, isContainerBlock, isEditMode]);
503
+ }, [sectionId, index, containerId, isContainerBlock, isEditMode, isLocked]);
466
504
  function handleSettingsClick() {
467
505
  if (!onSectionChange) return;
468
506
  if (definition.settingsForm) {
469
507
  const CustomForm = definition.settingsForm;
470
508
  openModal(
471
509
  `${definition.label} Settings`,
472
- /* @__PURE__ */ jsx7(
510
+ /* @__PURE__ */ jsx8(
473
511
  CustomForm,
474
512
  {
475
513
  ...options ?? {},
@@ -480,7 +518,7 @@ function SectionWrapper({
480
518
  } else if (definition.settings) {
481
519
  openModal(
482
520
  `${definition.label} Settings`,
483
- /* @__PURE__ */ jsx7(
521
+ /* @__PURE__ */ jsx8(
484
522
  SettingsForm,
485
523
  {
486
524
  schema: definition.settings,
@@ -494,14 +532,14 @@ function SectionWrapper({
494
532
  }
495
533
  if (!isEditMode) {
496
534
  if (status && status !== "live") {
497
- return /* @__PURE__ */ jsxs5(
535
+ return /* @__PURE__ */ jsxs6(
498
536
  "div",
499
537
  {
500
538
  className: "relative",
501
539
  "data-section-id": sectionId,
502
540
  "data-section-type": sectionType,
503
541
  children: [
504
- /* @__PURE__ */ jsx7("div", { className: "pointer-events-none absolute right-0 bottom-full z-30 mb-1", children: /* @__PURE__ */ jsxs5(
542
+ /* @__PURE__ */ jsx8("div", { className: "pointer-events-none absolute right-0 bottom-full z-30 mb-1", children: /* @__PURE__ */ jsxs6(
505
543
  "span",
506
544
  {
507
545
  className: cn(
@@ -510,7 +548,7 @@ function SectionWrapper({
510
548
  ),
511
549
  children: [
512
550
  status,
513
- dirty && /* @__PURE__ */ jsx7("span", { className: "ml-1 opacity-70", children: "\xB7 Unsaved" })
551
+ dirty && /* @__PURE__ */ jsx8("span", { className: "ml-1 opacity-70", children: "\xB7 Unsaved" })
514
552
  ]
515
553
  }
516
554
  ) }),
@@ -519,16 +557,17 @@ function SectionWrapper({
519
557
  }
520
558
  );
521
559
  }
522
- return /* @__PURE__ */ jsx7(Fragment2, { children });
560
+ return /* @__PURE__ */ jsx8(Fragment2, { children });
523
561
  }
524
562
  const alwaysShow = showAllChrome || isActive;
525
- return /* @__PURE__ */ jsxs5(
563
+ return /* @__PURE__ */ jsxs6(
526
564
  "div",
527
565
  {
528
566
  ref: blockRef,
529
567
  className: cn(
530
568
  "relative",
531
569
  isDragging && "opacity-50",
570
+ isLocked && "opacity-60",
532
571
  isActive && "outline outline-2 outline-primary/50 rounded-sm",
533
572
  !isActive && showAllChrome && "outline outline-2 outline-primary/20 rounded-sm",
534
573
  !alwaysShow && "group-hover:outline group-hover:outline-2 group-hover:outline-primary/20 group-hover:rounded-sm"
@@ -536,17 +575,17 @@ function SectionWrapper({
536
575
  "data-section-id": sectionId,
537
576
  "data-section-type": sectionType,
538
577
  children: [
539
- onRequestInsert && !isDragging && chromeReady && /* @__PURE__ */ jsx7(
578
+ !isLocked && onRequestInsert && !isDragging && chromeReady && /* @__PURE__ */ jsx8(
540
579
  "div",
541
580
  {
542
581
  className: cn(
543
582
  "absolute -left-16 bottom-full z-30 hover:z-[60] mb-1 hidden xl:block transition-opacity",
544
583
  alwaysShow ? "opacity-100" : "opacity-0 group-hover:opacity-100"
545
584
  ),
546
- children: /* @__PURE__ */ jsx7(InsertButton, { index, onInsert: onRequestInsert })
585
+ children: /* @__PURE__ */ jsx8(InsertButton, { index, onInsert: onRequestInsert })
547
586
  }
548
587
  ),
549
- /* @__PURE__ */ jsxs5(
588
+ !isLocked && /* @__PURE__ */ jsxs6(
550
589
  "div",
551
590
  {
552
591
  className: cn(
@@ -554,26 +593,28 @@ function SectionWrapper({
554
593
  alwaysShow ? "opacity-100" : "opacity-0 group-hover:opacity-100"
555
594
  ),
556
595
  children: [
557
- /* @__PURE__ */ jsxs5("div", { className: "relative -ml-[34px] flex flex-col items-center", children: [
558
- /* @__PURE__ */ jsx7(DragHandle, { ref: handleRef }),
596
+ /* @__PURE__ */ jsxs6("div", { className: "relative -ml-[34px] flex flex-col items-center", children: [
597
+ /* @__PURE__ */ jsx8(DragHandle, { ref: handleRef }),
559
598
  onRequestInsert && !isDragging && chromeReady && // Below xl the gutter can't fit the plus beside the handle, so it
560
599
  // hangs below it (absolute → no row-height contribution: the handle
561
600
  // stays put and the pair stacks DOWN instead of centering).
562
- /* @__PURE__ */ jsx7("div", { className: "absolute top-full xl:hidden", children: /* @__PURE__ */ jsx7(InsertButton, { index, onInsert: onRequestInsert }) })
601
+ /* @__PURE__ */ jsx8("div", { className: "absolute top-full xl:hidden", children: /* @__PURE__ */ jsx8(InsertButton, { index, onInsert: onRequestInsert }) })
563
602
  ] }),
564
- /* @__PURE__ */ jsx7("span", { className: "pointer-events-none select-none whitespace-nowrap text-sm capitalize text-base-contrast-light/80", children: definition.label })
603
+ /* @__PURE__ */ jsx8("span", { className: "pointer-events-none select-none whitespace-nowrap text-sm capitalize text-base-contrast-light/80", children: definition.label })
565
604
  ]
566
605
  }
567
606
  ),
568
- /* @__PURE__ */ jsxs5(
607
+ /* @__PURE__ */ jsxs6(
569
608
  "div",
570
609
  {
571
610
  className: cn(
572
611
  "pointer-events-none absolute right-0 bottom-full z-30 mb-1 flex items-center gap-2 transition-opacity",
573
- alwaysShow ? "opacity-100" : "opacity-0 group-hover:opacity-100"
612
+ // A lock is important state — keep the cluster visible without hover.
613
+ alwaysShow || isLocked ? "opacity-100" : "opacity-0 group-hover:opacity-100"
574
614
  ),
575
615
  children: [
576
- /* @__PURE__ */ jsx7("div", { className: "pointer-events-auto", children: /* @__PURE__ */ jsx7(
616
+ lockedBy && /* @__PURE__ */ jsx8(LockBadge, { email: lockedBy.email, onTakeover }),
617
+ /* @__PURE__ */ jsx8("div", { className: "pointer-events-auto", children: /* @__PURE__ */ jsx8(
577
618
  StatusIndicator,
578
619
  {
579
620
  mainStatus: mainStatus ?? null,
@@ -582,43 +623,45 @@ function SectionWrapper({
582
623
  isLocalOnly: isLocalOnly ?? false,
583
624
  status,
584
625
  dirty,
626
+ disabled: isLocked,
585
627
  onChange: (s) => onStatusChange?.(s)
586
628
  }
587
629
  ) }),
588
- /* @__PURE__ */ jsx7("div", { className: "pointer-events-auto", children: /* @__PURE__ */ jsx7(
630
+ /* @__PURE__ */ jsx8("div", { className: "pointer-events-auto", children: /* @__PURE__ */ jsx8(
589
631
  AudienceIndicator,
590
632
  {
591
633
  access,
592
634
  audiences,
635
+ disabled: isLocked,
593
636
  onChange: (newAccess) => onAccessChange?.(newAccess)
594
637
  }
595
638
  ) }),
596
- onAddChild && /* @__PURE__ */ jsx7(
639
+ !isLocked && onAddChild && /* @__PURE__ */ jsx8(
597
640
  "button",
598
641
  {
599
642
  type: "button",
600
643
  onClick: onAddChild,
601
644
  "aria-label": "Add block",
602
645
  className: "pointer-events-auto cursor-pointer rounded p-1 text-base-contrast-light hover:text-primary",
603
- children: /* @__PURE__ */ jsx7(Plus, { size: 16 })
646
+ children: /* @__PURE__ */ jsx8(Plus, { size: 16 })
604
647
  }
605
648
  ),
606
- hasSettings && /* @__PURE__ */ jsx7(SettingsButton, { onClick: handleSettingsClick }),
607
- onMoveSection && /* @__PURE__ */ jsx7(
649
+ !isLocked && hasSettings && /* @__PURE__ */ jsx8(SettingsButton, { onClick: handleSettingsClick }),
650
+ !isLocked && onMoveSection && /* @__PURE__ */ jsx8(
608
651
  "button",
609
652
  {
610
653
  type: "button",
611
654
  onClick: onMoveSection,
612
655
  "aria-label": "Move to page",
613
656
  className: "pointer-events-auto cursor-pointer rounded p-1 text-base-contrast-light hover:text-primary",
614
- children: /* @__PURE__ */ jsx7(ArrowRightLeft, { size: 16 })
657
+ children: /* @__PURE__ */ jsx8(ArrowRightLeft, { size: 16 })
615
658
  }
616
659
  ),
617
- onDelete && /* @__PURE__ */ jsx7(DeleteButton, { onDelete })
660
+ !isLocked && onDelete && /* @__PURE__ */ jsx8(DeleteButton, { onDelete })
618
661
  ]
619
662
  }
620
663
  ),
621
- closestEdge === "top" && /* @__PURE__ */ jsx7(
664
+ closestEdge === "top" && /* @__PURE__ */ jsx8(
622
665
  "div",
623
666
  {
624
667
  className: "absolute right-0 left-0 z-10 h-0.5 bg-primary",
@@ -628,8 +671,13 @@ function SectionWrapper({
628
671
  }
629
672
  }
630
673
  ),
631
- closestEdge === "bottom" && isLast && /* @__PURE__ */ jsx7("div", { className: "absolute right-0 bottom-0 left-0 z-10 h-0.5 bg-primary" }),
632
- children
674
+ closestEdge === "bottom" && isLast && /* @__PURE__ */ jsx8("div", { className: "absolute right-0 bottom-0 left-0 z-10 h-0.5 bg-primary" }),
675
+ isLocked ? (
676
+ // React 19 supports the boolean `inert` prop — blocks focus, pointer,
677
+ // and edits to another editor's locked content. Only wrapped when
678
+ // locked so the unlocked DOM is unchanged.
679
+ /* @__PURE__ */ jsx8("div", { inert: true, children })
680
+ ) : children
633
681
  ]
634
682
  }
635
683
  );
@@ -2,7 +2,7 @@ import {
2
2
  EditableRichText,
3
3
  LinkPopover,
4
4
  defineHeadingSection
5
- } from "../../chunk-NKVZGPR6.js";
5
+ } from "../../chunk-YP7IHMC3.js";
6
6
  import {
7
7
  EditableGrid,
8
8
  EditablePlainText,
@@ -10,7 +10,7 @@ import {
10
10
  MediaBlock,
11
11
  ResolvedMedia,
12
12
  useEditableCollection
13
- } from "../../chunk-T7MP7ANP.js";
13
+ } from "../../chunk-UUCOJL7O.js";
14
14
  import "../../chunk-ZSPCE6MZ.js";
15
15
  import {
16
16
  DeleteIcon,
@@ -23,8 +23,8 @@ import {
23
23
  cn
24
24
  } from "../../chunk-7EOSDFS3.js";
25
25
  import "../../chunk-4YEOTFVU.js";
26
- import "../../chunk-VKAGMEKE.js";
27
26
  import "../../chunk-SWIHUIFT.js";
27
+ import "../../chunk-VKAGMEKE.js";
28
28
  import "../../chunk-JSBRDJBE.js";
29
29
 
30
30
  // src/components/primitives/EditableList.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../../../src/components/sections/Container/Container.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgB3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAqGzD,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACpD,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;CACzD;AAkDD,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,2CA2LrF"}
1
+ {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../../../src/components/sections/Container/Container.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgB3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAyGzD,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACpD,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;CACzD;AAkDD,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,2CAyLrF"}
@@ -2,17 +2,17 @@ import {
2
2
  ColorItemSchema,
3
3
  ColorSpaceSchema,
4
4
  brandGuideSectionDefs
5
- } from "../../chunk-7T2WQSWF.js";
6
- import "../../chunk-T7MP7ANP.js";
5
+ } from "../../chunk-63BQQNZO.js";
7
6
  import "../../chunk-5THS4K5D.js";
7
+ import "../../chunk-UUCOJL7O.js";
8
8
  import "../../chunk-IFHRHV7S.js";
9
9
  import "../../chunk-S55OZ7F2.js";
10
10
  import "../../chunk-PZJL2S3Z.js";
11
11
  import "../../chunk-WDSVHKAH.js";
12
12
  import "../../chunk-7EOSDFS3.js";
13
13
  import "../../chunk-4YEOTFVU.js";
14
- import "../../chunk-VKAGMEKE.js";
15
14
  import "../../chunk-SWIHUIFT.js";
15
+ import "../../chunk-VKAGMEKE.js";
16
16
  import "../../chunk-JSBRDJBE.js";
17
17
  export {
18
18
  ColorItemSchema,
@@ -1,26 +1,26 @@
1
1
  import {
2
2
  allSectionDefs
3
- } from "../../chunk-U4E6S4PX.js";
4
- import "../../chunk-NKVZGPR6.js";
5
- import "../../chunk-Y4JQGO6G.js";
6
- import "../../chunk-7T2WQSWF.js";
7
- import "../../chunk-T7MP7ANP.js";
8
- import "../../chunk-Q3T23HVW.js";
9
- import "../../chunk-ZSPCE6MZ.js";
3
+ } from "../../chunk-RO4E5UJI.js";
4
+ import "../../chunk-63BQQNZO.js";
5
+ import "../../chunk-B2DLHZKC.js";
10
6
  import "../../chunk-5THS4K5D.js";
7
+ import "../../chunk-YP7IHMC3.js";
8
+ import "../../chunk-UUCOJL7O.js";
9
+ import "../../chunk-ZSPCE6MZ.js";
11
10
  import "../../chunk-IFHRHV7S.js";
11
+ import "../../chunk-Y4JQGO6G.js";
12
12
  import "../../chunk-S55OZ7F2.js";
13
13
  import "../../chunk-PZJL2S3Z.js";
14
- import "../../chunk-53DKVAB6.js";
15
14
  import "../../chunk-WDSVHKAH.js";
15
+ import "../../chunk-53DKVAB6.js";
16
16
  import "../../chunk-7EOSDFS3.js";
17
17
  import "../../chunk-4YEOTFVU.js";
18
18
  import "../../chunk-TZQPOR5A.js";
19
+ import "../../chunk-SWIHUIFT.js";
19
20
  import {
20
21
  registerRichText,
21
22
  registerSchema
22
23
  } from "../../chunk-VKAGMEKE.js";
23
- import "../../chunk-SWIHUIFT.js";
24
24
  import "../../chunk-NSCT3AMV.js";
25
25
  import "../../chunk-JSBRDJBE.js";
26
26
 
@@ -1,25 +1,25 @@
1
1
  import {
2
2
  allSectionDefs
3
- } from "../../chunk-U4E6S4PX.js";
4
- import "../../chunk-NKVZGPR6.js";
5
- import "../../chunk-Y4JQGO6G.js";
6
- import "../../chunk-7T2WQSWF.js";
7
- import "../../chunk-T7MP7ANP.js";
8
- import "../../chunk-Q3T23HVW.js";
9
- import "../../chunk-ZSPCE6MZ.js";
3
+ } from "../../chunk-RO4E5UJI.js";
4
+ import "../../chunk-63BQQNZO.js";
5
+ import "../../chunk-B2DLHZKC.js";
10
6
  import "../../chunk-5THS4K5D.js";
7
+ import "../../chunk-YP7IHMC3.js";
8
+ import "../../chunk-UUCOJL7O.js";
9
+ import "../../chunk-ZSPCE6MZ.js";
11
10
  import "../../chunk-IFHRHV7S.js";
11
+ import "../../chunk-Y4JQGO6G.js";
12
12
  import "../../chunk-S55OZ7F2.js";
13
13
  import "../../chunk-PZJL2S3Z.js";
14
- import "../../chunk-53DKVAB6.js";
15
14
  import "../../chunk-WDSVHKAH.js";
15
+ import "../../chunk-53DKVAB6.js";
16
16
  import "../../chunk-7EOSDFS3.js";
17
17
  import "../../chunk-4YEOTFVU.js";
18
18
  import "../../chunk-TZQPOR5A.js";
19
+ import "../../chunk-SWIHUIFT.js";
19
20
  import {
20
21
  registerSection
21
22
  } from "../../chunk-VKAGMEKE.js";
22
- import "../../chunk-SWIHUIFT.js";
23
23
  import "../../chunk-NSCT3AMV.js";
24
24
  import "../../chunk-JSBRDJBE.js";
25
25
 
@@ -1,4 +1,5 @@
1
1
  import type { Audience } from "../../auth/types";
2
+ import type { CollabBootstrap } from "../../collab/types";
2
3
  export { useMediaLibrary } from "./MediaLibraryContext";
3
4
  interface Props {
4
5
  headSha: string;
@@ -18,6 +19,7 @@ interface Props {
18
19
  role: "owner" | "editor";
19
20
  } | null;
20
21
  chatbotPlatformEnabled?: boolean;
22
+ collabBootstrap?: CollabBootstrap | null;
21
23
  }
22
- export default function EditorShell({ headSha, draftHeadSha, siteId, audiences: initialAudiences, capabilities, currentUser, chatbotPlatformEnabled, }: Props): import("react/jsx-runtime").JSX.Element;
24
+ export default function EditorShell({ headSha, draftHeadSha, siteId, audiences: initialAudiences, capabilities, currentUser, chatbotPlatformEnabled, collabBootstrap, }: Props): import("react/jsx-runtime").JSX.Element;
23
25
  //# sourceMappingURL=EditorShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditorShell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/EditorShell.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AA0EjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAIhB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,YAAY,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,OAAO,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IAIhE,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,EACX,sBAA8B,GAC/B,EAAE,KAAK,2CA08BP"}
1
+ {"version":3,"file":"EditorShell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/EditorShell.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAiDjD,OAAO,KAAK,EAAE,eAAe,EAA2D,MAAM,oBAAoB,CAAC;AAmCnH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAoBxD,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAIhB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,YAAY,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,EAAE,OAAO,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IAIhE,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAKjC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,OAAO,EACP,YAAY,EACZ,MAAM,EACN,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EACZ,WAAW,EACX,sBAA8B,EAC9B,eAAe,GAChB,EAAE,KAAK,2CA27CP"}