camox 0.40.0 → 0.41.1

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 (108) hide show
  1. package/dist/components/PlatformLabel.js +62 -0
  2. package/dist/core/components/lexical/GradientNode.js +126 -0
  3. package/dist/core/components/lexical/InlineLexicalEditor.js +37 -56
  4. package/dist/core/components/lexical/InlineStylesPlugin.js +183 -0
  5. package/dist/core/components/lexical/SelectionBroadcaster.js +49 -46
  6. package/dist/core/components/lexical/SidebarLexicalEditor.js +197 -151
  7. package/dist/core/components/lexical/editorConfig.js +25 -7
  8. package/dist/core/components/lexical/selectTextLink.js +21 -0
  9. package/dist/core/createApp.d.ts +30 -17
  10. package/dist/core/createApp.js +14 -3
  11. package/dist/core/createBlock.d.ts +2 -2
  12. package/dist/core/createBlock.js +17 -28
  13. package/dist/core/createLayout.d.ts +48 -4
  14. package/dist/core/createLayout.js +51 -23
  15. package/dist/core/derivedRoutes.js +36 -0
  16. package/dist/core/editing/BlockEditingRuntime.js +4 -4
  17. package/dist/core/editing/CompleteBlockEditingRuntime.js +5 -5
  18. package/dist/core/editing/createEditableBlock.d.ts +9 -8
  19. package/dist/core/editing/createEditableBlock.js +265 -403
  20. package/dist/core/hooks/useIsEditable.js +4 -7
  21. package/dist/core/hooks/useRequireDraftSource.js +7 -11
  22. package/dist/core/lib/lexicalReact.d.ts +1 -26
  23. package/dist/core/lib/lexicalReact.js +46 -60
  24. package/dist/core/lib/lexicalState.js +164 -81
  25. package/dist/core/lib/modifierFormats.js +4 -15
  26. package/dist/core/lib/textStyles.d.ts +27 -0
  27. package/dist/core/lib/textStyles.js +47 -0
  28. package/dist/features/navigation/navigation.d.ts +2 -0
  29. package/dist/features/navigation/navigation.js +51 -46
  30. package/dist/features/page/DerivedPageContent.js +61 -0
  31. package/dist/features/page/PublishedPageContent.js +52 -83
  32. package/dist/features/page/SharedLayoutContent.js +66 -0
  33. package/dist/features/preview/CamoxPreview.d.ts +16 -1
  34. package/dist/features/preview/CamoxPreview.js +246 -290
  35. package/dist/features/preview/DerivedPreview.js +134 -0
  36. package/dist/features/preview/EditablePageExperience.js +25 -8
  37. package/dist/features/preview/components/AddBlockSidebar.js +43 -33
  38. package/dist/features/preview/components/AssetLightbox.js +1 -1
  39. package/dist/features/preview/components/BlockActionsPopover.js +8 -8
  40. package/dist/features/preview/components/BlockThumbnail.js +192 -0
  41. package/dist/features/preview/components/CreatePageModal.js +123 -115
  42. package/dist/features/preview/components/DerivedLayoutDialog.js +100 -0
  43. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +5 -0
  44. package/dist/features/preview/components/DerivedLayoutSidebar.js +160 -0
  45. package/dist/features/preview/components/DerivedPageInfoSidebar.js +57 -0
  46. package/dist/features/preview/components/FieldToolbar.js +42 -20
  47. package/dist/features/preview/components/Frame.js +133 -140
  48. package/dist/features/preview/components/LeftSidebar.js +42 -38
  49. package/dist/features/preview/components/LinkFieldEditor.js +3 -4
  50. package/dist/features/preview/components/MobilePreviewDrawer.js +4 -4
  51. package/dist/features/preview/components/Overlays.js +59 -47
  52. package/dist/features/preview/components/PageEditorSidebar.js +194 -203
  53. package/dist/features/preview/components/PageInfoSidebar.js +63 -55
  54. package/dist/features/preview/components/PageNavigatorSidebar.js +34 -483
  55. package/dist/features/preview/components/PagePicker.js +205 -153
  56. package/dist/features/preview/components/PageTree.js +366 -340
  57. package/dist/features/preview/components/PreviewActivation.js +78 -0
  58. package/dist/features/preview/components/PreviewPanel.js +98 -68
  59. package/dist/features/preview/components/PreviewToolbar.js +224 -241
  60. package/dist/features/preview/components/PreviewToolbarSpacer.js +43 -0
  61. package/dist/features/preview/components/PublicationRow.js +425 -0
  62. package/dist/features/preview/components/PublishDialog.js +180 -97
  63. package/dist/features/preview/components/RightSidebar.js +19 -34
  64. package/dist/features/preview/components/previewStyles.js +8 -0
  65. package/dist/features/preview/components/useUpdateBlockPosition.js +7 -13
  66. package/dist/features/preview/previewConstants.js +8 -0
  67. package/dist/features/preview/previewStore.js +18 -39
  68. package/dist/features/preview/publication.js +71 -0
  69. package/dist/features/provider/AuthenticatedCamoxProvider.js +2 -1
  70. package/dist/features/provider/CoreCamoxProvider.js +11 -2
  71. package/dist/features/provider/LocalhostPreviewProvider.js +6 -7
  72. package/dist/features/provider/useAdminShortcuts.js +5 -4
  73. package/dist/features/routes/pageRuntime.d.ts +10 -0
  74. package/dist/features/routes/pageRuntime.js +7 -9
  75. package/dist/features/runtime/PreviewDocumentContext.js +7 -0
  76. package/dist/features/runtime/RuntimeChrome.js +149 -0
  77. package/dist/features/runtime/SharedChromeContext.js +7 -0
  78. package/dist/features/runtime/navigationRequest.js +21 -0
  79. package/dist/features/runtime/navigationTarget.js +23 -0
  80. package/dist/features/runtime/pageApp.js +196 -121
  81. package/dist/features/runtime/pageNavigation.js +79 -130
  82. package/dist/features/runtime/runtime.d.ts +11 -0
  83. package/dist/features/runtime/runtime.js +183 -47
  84. package/dist/features/runtime/studioApp.d.ts +2 -11
  85. package/dist/features/runtime/studioApp.js +14 -177
  86. package/dist/features/studio/CamoxStudio.js +27 -13
  87. package/dist/features/studio/components/Navbar.js +80 -74
  88. package/dist/features/studio/components/UserButton.js +4 -4
  89. package/dist/features/studio/studioTheme.js +25 -0
  90. package/dist/features/studio/useTheme.js +94 -109
  91. package/dist/features/vite/appGeneration.js +12 -3
  92. package/dist/features/vite/definitionsSync.js +4 -2
  93. package/dist/features/vite/layoutGeneration.js +38 -0
  94. package/dist/features/vite/runtimeDev.js +3 -1
  95. package/dist/lib/auth.js +15 -13
  96. package/dist/lib/normalized-data.js +4 -4
  97. package/dist/lib/platform.js +13 -0
  98. package/dist/lib/utils.js +90 -38
  99. package/dist/studio-overlays.css +5 -40
  100. package/dist/studio.css +1 -1
  101. package/package.json +8 -4
  102. package/skills/camox/SKILL.md +2 -0
  103. package/skills/camox/references/block-definitions.md +31 -12
  104. package/skills/camox/references/layout-definitions.md +2 -0
  105. package/dist/core/lib/modifiers.js +0 -24
  106. package/dist/features/preview/components/DraftSwitchDialog.js +0 -66
  107. package/dist/features/preview/previewQueryFns.js +0 -23
  108. package/dist/features/runtime/studioNavigation.js +0 -120
package/dist/lib/auth.js CHANGED
@@ -217,9 +217,9 @@ function useProcessOtt(authClient) {
217
217
  const AuthContext = React.createContext(null);
218
218
  function useAuthContext() {
219
219
  const $ = c(1);
220
- if ($[0] !== "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93") {
220
+ if ($[0] !== "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b") {
221
221
  for (let $i = 0; $i < 1; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
222
- $[0] = "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93";
222
+ $[0] = "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b";
223
223
  }
224
224
  const ctx = React.useContext(AuthContext);
225
225
  if (!ctx) throw new Error("Missing CamoxProvider");
@@ -227,34 +227,36 @@ function useAuthContext() {
227
227
  }
228
228
  function useProjectSlug() {
229
229
  const $ = c(1);
230
- if ($[0] !== "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93") {
230
+ if ($[0] !== "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b") {
231
231
  for (let $i = 0; $i < 1; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
232
- $[0] = "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93";
232
+ $[0] = "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b";
233
233
  }
234
234
  return useAuthContext().projectSlug;
235
235
  }
236
+ const subscribeToHydration = () => () => {};
236
237
  function useAuthState() {
237
- const { authClient } = useAuthContext();
238
+ const { authClient, initialAuthenticated = false } = useAuthContext();
238
239
  const { data: session, isPending } = authClient.useSession();
240
+ const useInitial = !React.useSyncExternalStore(subscribeToHydration, () => true, () => false) || isPending;
239
241
  return {
240
- isAuthenticated: !!session,
241
- isLoading: isPending
242
+ isAuthenticated: useInitial ? initialAuthenticated : !!session,
243
+ isLoading: useInitial && !initialAuthenticated
242
244
  };
243
245
  }
244
246
  function useIsAuthenticated() {
245
247
  const $ = c(1);
246
- if ($[0] !== "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93") {
248
+ if ($[0] !== "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b") {
247
249
  for (let $i = 0; $i < 1; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
248
- $[0] = "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93";
250
+ $[0] = "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b";
249
251
  }
250
252
  const { isAuthenticated } = useAuthState();
251
253
  return isAuthenticated;
252
254
  }
253
255
  function useSignInRedirect(callbackHref) {
254
256
  const $ = c(4);
255
- if ($[0] !== "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93") {
257
+ if ($[0] !== "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b") {
256
258
  for (let $i = 0; $i < 4; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
257
- $[0] = "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93";
259
+ $[0] = "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b";
258
260
  }
259
261
  const { authenticationUrl } = useAuthContext();
260
262
  let t0;
@@ -276,9 +278,9 @@ function useSignInRedirect(callbackHref) {
276
278
  */
277
279
  function useAuthActions() {
278
280
  const $ = c(5);
279
- if ($[0] !== "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93") {
281
+ if ($[0] !== "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b") {
280
282
  for (let $i = 0; $i < 5; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
281
- $[0] = "96393d5626632a69960ca7e18d98e06ae87b8528faab082732a3cc7b48adfd93";
283
+ $[0] = "613abd4be0f81de0bf8df48c671a83e40c3e6ac86dab4c38ebcffe92268b614b";
282
284
  }
283
285
  const { authClient, authenticationUrl } = useAuthContext();
284
286
  let t0;
@@ -11,9 +11,9 @@ const NormalizedDataContext = React.createContext({
11
11
  });
12
12
  const NormalizedDataProvider = (t0) => {
13
13
  const $ = c(13);
14
- if ($[0] !== "9680f54d18eb424030716d5c43a9901462a27cc0d8227fb40b5d6abb9b464a89") {
14
+ if ($[0] !== "28aab7b25bd21e351d34503ab3d745344dc158d8c4a4ad7a8c63e2c8732703bb") {
15
15
  for (let $i = 0; $i < 13; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
16
- $[0] = "9680f54d18eb424030716d5c43a9901462a27cc0d8227fb40b5d6abb9b464a89";
16
+ $[0] = "28aab7b25bd21e351d34503ab3d745344dc158d8c4a4ad7a8c63e2c8732703bb";
17
17
  }
18
18
  const { files, repeatableItems, children } = t0;
19
19
  let t1;
@@ -74,9 +74,9 @@ function useStableArray(next) {
74
74
  }
75
75
  function usePageBlocks(pageStructure, t0) {
76
76
  const $ = c(37);
77
- if ($[0] !== "9680f54d18eb424030716d5c43a9901462a27cc0d8227fb40b5d6abb9b464a89") {
77
+ if ($[0] !== "28aab7b25bd21e351d34503ab3d745344dc158d8c4a4ad7a8c63e2c8732703bb") {
78
78
  for (let $i = 0; $i < 37; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
79
- $[0] = "9680f54d18eb424030716d5c43a9901462a27cc0d8227fb40b5d6abb9b464a89";
79
+ $[0] = "28aab7b25bd21e351d34503ab3d745344dc158d8c4a4ad7a8c63e2c8732703bb";
80
80
  }
81
81
  const source = t0 === void 0 ? "draft" : t0;
82
82
  const blockIds = pageStructure.page.blockIds;
@@ -0,0 +1,13 @@
1
+ //#region src/lib/platform.ts
2
+ function bootstrapPlatform() {
3
+ document.documentElement.dataset.camoxPlatform = /Mac|iPhone|iPad|iPod/i.test(navigator.userAgent) ? "mac" : "other";
4
+ }
5
+ const PLATFORM_SCRIPT = `(${bootstrapPlatform.toString()})();`;
6
+ const PLATFORM_LABEL_CSS = `
7
+ .camox-platform-mac{display:none}
8
+ :root[data-camox-platform="mac"] .camox-platform-mac{display:inline}
9
+ :root[data-camox-platform="mac"] .camox-platform-other{display:none}
10
+ `;
11
+
12
+ //#endregion
13
+ export { PLATFORM_LABEL_CSS, PLATFORM_SCRIPT, bootstrapPlatform };
package/dist/lib/utils.js CHANGED
@@ -1,4 +1,6 @@
1
- import { jsxs } from "react/jsx-runtime";
1
+ import { PlatformLabel } from "../components/PlatformLabel.js";
2
+ import { c } from "react/compiler-runtime";
3
+ import { jsx } from "react/jsx-runtime";
2
4
  import { Kbd } from "@camox/ui/kbd";
3
5
  import { INPUT_BASE_STYLES, INPUT_FOCUS_STYLES, cn } from "@camox/ui/utils";
4
6
 
@@ -21,44 +23,94 @@ function checkIfInputFocused(document = window.document) {
21
23
  */
22
24
  function formatShortcut(shortcut) {
23
25
  if (!shortcut) return null;
24
- const isMac = navigator.userAgent.toUpperCase().indexOf("MAC") >= 0;
25
- const modifiers = [];
26
- if (shortcut.withMeta) modifiers.push(isMac ? "⌘" : "Ctrl");
27
- if (shortcut.withAlt) modifiers.push(isMac ? "⌥" : "Alt");
28
- if (shortcut.withShift) modifiers.push(isMac ? "⇧" : "Shift");
29
- const formattedKey = (() => {
30
- if (shortcut.key === "Enter") return "↵";
31
- if (shortcut.key === "Escape") return "Esc";
32
- if (shortcut.key === "Backspace") return "⌫";
33
- if (shortcut.key === "ArrowUp") return "↑";
34
- if (shortcut.key === "ArrowDown") return "↓";
35
- if (shortcut.key === "ArrowLeft") return "←";
36
- if (shortcut.key === "ArrowRight") return "→";
37
- return shortcut.key.toUpperCase();
38
- })();
39
- return /* @__PURE__ */ jsxs(Kbd, { children: [
40
- modifiers.join(),
41
- " ",
42
- formattedKey
43
- ] });
26
+ return /* @__PURE__ */ jsx(Shortcut, { shortcut });
44
27
  }
45
- /**
46
- * Gets an action's shortcut component by action ID from the actions array.
47
- *
48
- * @param actions - Array of actions from actionsStore
49
- * @param actionId - The ID of the action to get the shortcut for
50
- * @returns React element displaying the keyboard shortcut, or null if not found
51
- *
52
- * @example
53
- * ```tsx
54
- * const actions = useSelector(actionsStore, (state) => state.context.actions);
55
- * getActionShortcut(actions, "cycle-viewport-mode") // Returns formatted shortcut component
56
- * ```
57
- */
58
- function getActionShortcut(actions, actionId) {
59
- const action = actions.find((a) => a.id === actionId);
60
- return action?.shortcut ? formatShortcut(action.shortcut) : null;
28
+ function Shortcut(t0) {
29
+ const $ = c(15);
30
+ if ($[0] !== "45dff80dbc1805709c694dadbd04b0216f01c3a1a826daf47b8bb5bac9e42d9a") {
31
+ for (let $i = 0; $i < 15; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
32
+ $[0] = "45dff80dbc1805709c694dadbd04b0216f01c3a1a826daf47b8bb5bac9e42d9a";
33
+ }
34
+ const { shortcut } = t0;
35
+ let t1;
36
+ bb0: {
37
+ if (shortcut.key === "Enter") {
38
+ t1 = "↵";
39
+ break bb0;
40
+ }
41
+ if (shortcut.key === "Escape") {
42
+ t1 = "Esc";
43
+ break bb0;
44
+ }
45
+ if (shortcut.key === "Backspace") {
46
+ t1 = "⌫";
47
+ break bb0;
48
+ }
49
+ if (shortcut.key === "ArrowUp") {
50
+ t1 = "↑";
51
+ break bb0;
52
+ }
53
+ if (shortcut.key === "ArrowDown") {
54
+ t1 = "↓";
55
+ break bb0;
56
+ }
57
+ if (shortcut.key === "ArrowLeft") {
58
+ t1 = "←";
59
+ break bb0;
60
+ }
61
+ if (shortcut.key === "ArrowRight") {
62
+ t1 = "→";
63
+ break bb0;
64
+ }
65
+ let t2;
66
+ if ($[1] !== shortcut.key) {
67
+ t2 = shortcut.key.toUpperCase();
68
+ $[1] = shortcut.key;
69
+ $[2] = t2;
70
+ } else t2 = $[2];
71
+ t1 = t2;
72
+ }
73
+ const formattedKey = t1;
74
+ let t2;
75
+ if ($[3] !== formattedKey || $[4] !== shortcut.withAlt || $[5] !== shortcut.withMeta || $[6] !== shortcut.withShift) {
76
+ t2 = (mac) => {
77
+ const modifiers = [];
78
+ if (shortcut.withMeta) modifiers.push(mac ? "⌘" : "Ctrl");
79
+ if (shortcut.withAlt) modifiers.push(mac ? "⌥" : "Alt");
80
+ if (shortcut.withShift) modifiers.push(mac ? "⇧" : "Shift");
81
+ return `${modifiers.join()} ${formattedKey}`.trim();
82
+ };
83
+ $[3] = formattedKey;
84
+ $[4] = shortcut.withAlt;
85
+ $[5] = shortcut.withMeta;
86
+ $[6] = shortcut.withShift;
87
+ $[7] = t2;
88
+ } else t2 = $[7];
89
+ const label = t2;
90
+ let t3;
91
+ if ($[8] !== label) {
92
+ t3 = label(true);
93
+ $[8] = label;
94
+ $[9] = t3;
95
+ } else t3 = $[9];
96
+ let t4;
97
+ if ($[10] !== label) {
98
+ t4 = label(false);
99
+ $[10] = label;
100
+ $[11] = t4;
101
+ } else t4 = $[11];
102
+ let t5;
103
+ if ($[12] !== t3 || $[13] !== t4) {
104
+ t5 = /* @__PURE__ */ jsx(Kbd, { children: /* @__PURE__ */ jsx(PlatformLabel, {
105
+ mac: t3,
106
+ other: t4
107
+ }) });
108
+ $[12] = t3;
109
+ $[13] = t4;
110
+ $[14] = t5;
111
+ } else t5 = $[14];
112
+ return t5;
61
113
  }
62
114
 
63
115
  //#endregion
64
- export { INPUT_BASE_STYLES, INPUT_FOCUS_STYLES, checkIfInputFocused, cn, formatShortcut, getActionShortcut };
116
+ export { INPUT_BASE_STYLES, INPUT_FOCUS_STYLES, checkIfInputFocused, cn, formatShortcut };
@@ -4,7 +4,7 @@
4
4
  * State is driven by data attributes on the elements:
5
5
  * - data-camox-hovered: element is hovered
6
6
  * - data-camox-focused: element is focused/selected
7
- * - data-camox-overlay-mode="layout": use layout (purple) colors
7
+ * - data-camox-overlay-mode="synced": use synced-block (purple) colors
8
8
  *
9
9
  * Elements are targeted via their existing data attributes:
10
10
  * - [data-camox-field-id]: Field, Link, Image, Embed
@@ -15,8 +15,6 @@
15
15
  :root {
16
16
  --camox-overlay-color-hover: #f472b6bf; /* pink-400 at 75% */
17
17
  --camox-overlay-color-selected: #f472b6; /* pink-400 */
18
- --camox-overlay-layout-color-hover: #c084fcbf; /* purple-400 at 75% */
19
- --camox-overlay-layout-color-selected: #c084fc; /* purple-400 */
20
18
  --camox-overlay-width-hover: 3px;
21
19
  --camox-overlay-width-selected: 1px;
22
20
  --camox-overlay-inset-field-hover: -1px;
@@ -79,35 +77,10 @@
79
77
  box-shadow: 0 0 0 var(--camox-overlay-width-selected) var(--camox-overlay-color-selected) !important;
80
78
  }
81
79
 
82
- /* ---- Layout mode color overrides ---- */
83
-
84
- [data-camox-field-id][data-camox-field-type][data-camox-overlay-mode="layout"][data-camox-hovered]::after,
85
- [data-camox-block-id][data-camox-overlay-mode="layout"][data-camox-hovered]:not(
86
- [data-camox-detached]
87
- )::after,
88
- [data-camox-repeater-item-id][data-camox-overlay-mode="layout"][data-camox-hovered]::after {
89
- border-color: var(--camox-overlay-layout-color-hover);
90
- }
91
-
92
- [data-camox-field-id][data-camox-field-type][data-camox-overlay-mode="layout"][data-camox-focused]::after,
93
- [data-camox-block-id][data-camox-overlay-mode="layout"][data-camox-focused]:not(
94
- [data-camox-detached]
95
- )::after {
96
- border-color: var(--camox-overlay-layout-color-selected);
97
- }
98
-
99
- [data-camox-field-id]:not(
100
- [data-camox-field-type]
101
- )[data-camox-overlay-mode="layout"][data-camox-hovered] {
102
- box-shadow: 0 0 0 var(--camox-overlay-width-hover) var(--camox-overlay-layout-color-hover) !important;
103
- border-radius: 0 !important;
104
- }
105
-
106
- [data-camox-field-id]:not(
107
- [data-camox-field-type]
108
- )[data-camox-overlay-mode="layout"][data-camox-focused] {
109
- box-shadow: 0 0 0 var(--camox-overlay-width-selected) var(--camox-overlay-layout-color-selected) !important;
110
- border-radius: 0 !important;
80
+ /* Shared data is purple, regardless of whether its placement is in a layout. */
81
+ [data-camox-overlay-mode="synced"] {
82
+ --camox-overlay-color-hover: #c084fcbf;
83
+ --camox-overlay-color-selected: #c084fc;
111
84
  }
112
85
 
113
86
  /* ---- Embed: z-index above click-interceptor ---- */
@@ -130,14 +103,6 @@
130
103
  border: var(--camox-overlay-width-selected) solid var(--camox-overlay-color-selected);
131
104
  }
132
105
 
133
- [data-camox-detached][data-camox-overlay-mode="layout"][data-camox-hovered] {
134
- border-color: var(--camox-overlay-layout-color-hover);
135
- }
136
-
137
- [data-camox-detached][data-camox-overlay-mode="layout"][data-camox-focused] {
138
- border-color: var(--camox-overlay-layout-color-selected);
139
- }
140
-
141
106
  /* ---- Add-block overlay ---- */
142
107
 
143
108
  .camox-sheet-overlay {