camox 0.43.0 → 0.44.0

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 (63) hide show
  1. package/bin/camox.mjs +9 -1
  2. package/dist/core/components/lexical/InlineStylesPlugin.js +22 -6
  3. package/dist/core/components/lexical/SelectionBroadcaster.js +4 -4
  4. package/dist/core/components/lexical/SidebarLexicalEditor.js +15 -15
  5. package/dist/core/createApp.d.ts +28 -2
  6. package/dist/core/createBlock.js +24 -10
  7. package/dist/core/editing/createEditableBlock.d.ts +135 -1
  8. package/dist/core/editing/createEditableBlock.js +209 -74
  9. package/dist/core/lib/contentType.d.ts +5 -0
  10. package/dist/core/lib/contentType.js +11 -0
  11. package/dist/core/lib/fieldTypes.js +1 -0
  12. package/dist/core/lib/iconTypes.d.ts +13 -0
  13. package/dist/core/lib/icons.d.ts +6 -0
  14. package/dist/core/lib/icons.js +130 -0
  15. package/dist/core/lib/lexicalState.js +6 -6
  16. package/dist/core/lib/modifierFormats.js +1 -1
  17. package/dist/core/lib/textStyles.d.ts +1 -1
  18. package/dist/core/lib/textStyles.js +3 -3
  19. package/dist/features/content/components/AssetCard.js +104 -68
  20. package/dist/features/preview/CamoxPreview.js +120 -95
  21. package/dist/features/preview/commentsEnabled.js +2 -2
  22. package/dist/features/preview/components/AssetLightbox.js +17 -6
  23. package/dist/features/preview/components/AttachedComments.js +224 -87
  24. package/dist/features/preview/components/CommentTargetQuote.js +22 -21
  25. package/dist/features/preview/components/DerivedLayoutDialog.js +36 -21
  26. package/dist/features/preview/components/FieldOverlayStyles.js +29 -9
  27. package/dist/features/preview/components/FieldToolbar.js +8 -8
  28. package/dist/features/preview/components/IconFieldEditor.js +231 -0
  29. package/dist/features/preview/components/ItemFieldsEditor.js +21 -14
  30. package/dist/features/preview/components/OverlayTracker.js +1 -1
  31. package/dist/features/preview/components/PagePicker.js +44 -44
  32. package/dist/features/preview/components/PreviewPanel.js +1 -1
  33. package/dist/features/preview/components/PreviewToolbar.js +224 -225
  34. package/dist/features/preview/components/SendFeedbackDialog.js +83 -0
  35. package/dist/features/preview/overlayHighlights.js +54 -0
  36. package/dist/features/preview/previewCommentsStore.js +54 -34
  37. package/dist/features/preview/previewSelection.js +28 -23
  38. package/dist/features/preview/usePageComments.js +39 -0
  39. package/dist/features/provider/CoreCamoxProvider.js +37 -5
  40. package/dist/features/provider/LocalhostPreviewProvider.js +81 -45
  41. package/dist/features/provider/components/CommandPalette.js +35 -84
  42. package/dist/features/runtime/pageApp.js +32 -28
  43. package/dist/features/runtime/pageServer.js +4 -1
  44. package/dist/features/runtime/runtime.d.ts +2 -0
  45. package/dist/features/runtime/runtime.js +25 -0
  46. package/dist/features/studio/components/EnvironmentMenu.js +75 -63
  47. package/dist/features/vite/auth.js +1 -50
  48. package/dist/features/vite/iconGeneration.js +16 -0
  49. package/dist/features/vite/vite.d.ts +4 -2
  50. package/dist/features/vite/vite.js +19 -2
  51. package/dist/lib/auth.js +39 -16
  52. package/dist/lib/preview-handoff.js +13 -0
  53. package/dist/lib/queries.js +12 -1
  54. package/dist/lib/use-project-room.js +5 -2
  55. package/dist/studio-overlays.css +19 -15
  56. package/dist/studio.css +1 -1
  57. package/package.json +5 -4
  58. package/skills/camox/SKILL.md +6 -0
  59. package/skills/camox/references/block-definitions.md +27 -0
  60. package/skills/camox/references/cli-common.md +14 -0
  61. package/skills/camox/references/cli-content.md +11 -0
  62. package/skills/camox/references/field-styling.md +4 -4
  63. package/skills/camoxify/SKILL.md +14 -0
@@ -0,0 +1,54 @@
1
+ //#region src/features/preview/overlayHighlights.ts
2
+ const states = ["hovered", "focused"];
3
+ /** Detached borders represent their parent, not the portal div's DOM depth. */
4
+ function targetOf(element) {
5
+ return element.hasAttribute("data-camox-detached") ? element.parentElement ?? element : element;
6
+ }
7
+ function depthOf(element) {
8
+ let depth = 0;
9
+ for (let parent = element.parentElement; parent; parent = parent.parentElement) depth++;
10
+ return depth;
11
+ }
12
+ /**
13
+ * Local and remote interactions publish the same candidate attributes. Resolve
14
+ * them together, independently for hover and selection, before the browser paints.
15
+ * Equal-depth candidates (e.g. a sidebar-hovered list) use document order.
16
+ */
17
+ function observeOverlayHighlights(document) {
18
+ const Observer = document.defaultView?.MutationObserver;
19
+ if (!Observer) return () => {};
20
+ const winners = /* @__PURE__ */ new Map();
21
+ const update = () => {
22
+ for (const state of states) {
23
+ let winner;
24
+ let deepest = -1;
25
+ for (const candidate of document.querySelectorAll(`[data-camox-${state}]`)) {
26
+ const depth = depthOf(targetOf(candidate));
27
+ if (depth <= deepest) continue;
28
+ deepest = depth;
29
+ winner = candidate;
30
+ }
31
+ const previous = winners.get(state);
32
+ if (previous === winner) continue;
33
+ previous?.removeAttribute(`data-camox-highlight-${state}`);
34
+ winner?.setAttribute(`data-camox-highlight-${state}`, "");
35
+ if (winner) winners.set(state, winner);
36
+ else winners.delete(state);
37
+ }
38
+ };
39
+ const observer = new Observer(update);
40
+ observer.observe(document, {
41
+ subtree: true,
42
+ childList: true,
43
+ attributes: true,
44
+ attributeFilter: states.map((state) => `data-camox-${state}`)
45
+ });
46
+ update();
47
+ return () => {
48
+ observer.disconnect();
49
+ for (const [state, winner] of winners) winner.removeAttribute(`data-camox-highlight-${state}`);
50
+ };
51
+ }
52
+
53
+ //#endregion
54
+ export { observeOverlayHighlights };
@@ -1,55 +1,78 @@
1
1
  import { previewStore } from "./previewStore.js";
2
+ import { fieldTypesDictionary } from "../../core/lib/fieldTypes.js";
2
3
  import { createStore } from "@xstate/store-react";
3
4
 
4
5
  //#region src/features/preview/previewCommentsStore.ts
5
- function revealCommentTarget(target) {
6
+ /** Resolve against the current definition, including nested repeater ancestry. */
7
+ function getCommentTargetFieldType(target, bundle, app) {
8
+ if (target.kind !== "block-field" && target.kind !== "item-field") return;
9
+ if (bundle.block.id !== target.blockId) return;
10
+ let schema = app.getBlockById(bundle.block.type)?._internal.contentSchema;
11
+ if (target.kind === "item-field") {
12
+ const path = [];
13
+ const visited = /* @__PURE__ */ new Set();
14
+ let itemId = target.itemId;
15
+ while (itemId != null) {
16
+ if (visited.has(itemId)) return;
17
+ visited.add(itemId);
18
+ const item = bundle.repeatableItems.find((entry) => entry.id === itemId);
19
+ if (!item) return;
20
+ path.unshift(item.fieldName);
21
+ itemId = item.parentItemId;
22
+ }
23
+ for (const fieldName of path) schema = schema?.properties?.[fieldName]?.items;
24
+ }
25
+ const fieldType = schema?.properties?.[target.fieldName]?.fieldType;
26
+ if (fieldType && Object.hasOwn(fieldTypesDictionary, fieldType)) return fieldType;
27
+ }
28
+ /** Field types belong to the current app, never to persisted comment targets. */
29
+ function revealCommentTarget(target, fieldType) {
6
30
  previewStore.send({
7
31
  type: "setCommentMode",
8
32
  enabled: false
9
33
  });
10
34
  previewStore.send({ type: "closeAddBlockSidebar" });
11
35
  previewStore.send({ type: "clearPeekedBlock" });
12
- if (target.blockId == null) {
36
+ if (target.kind === "page") {
13
37
  previewStore.send({
14
38
  type: "setSelection",
15
39
  selection: null
16
40
  });
17
41
  return;
18
42
  }
19
- if (target.fieldName != null) {
43
+ if ((target.kind === "block-field" || target.kind === "item-field") && fieldType) {
20
44
  previewStore.send({
21
45
  type: "setSelection",
22
- selection: target.itemId == null ? {
23
- type: "block-field",
46
+ selection: target.kind === "item-field" ? {
47
+ type: "item-field",
24
48
  blockId: target.blockId,
49
+ itemId: target.itemId,
25
50
  fieldName: target.fieldName,
26
- fieldType: target.fieldType ?? "String"
51
+ fieldType
27
52
  } : {
28
- type: "item-field",
53
+ type: "block-field",
29
54
  blockId: target.blockId,
30
- itemId: target.itemId,
31
55
  fieldName: target.fieldName,
32
- fieldType: target.fieldType ?? "String"
56
+ fieldType
33
57
  }
34
58
  });
35
59
  return;
36
60
  }
37
61
  previewStore.send({
38
62
  type: "setSelection",
39
- selection: target.itemId == null ? {
40
- type: "block",
41
- blockId: target.blockId
42
- } : {
63
+ selection: "itemId" in target ? {
43
64
  type: "item",
44
65
  blockId: target.blockId,
45
66
  itemId: target.itemId
67
+ } : {
68
+ type: "block",
69
+ blockId: target.blockId
46
70
  }
47
71
  });
48
72
  }
49
- /** UI prototype only: comments live in memory, scoped to their originating page. */
73
+ /** Server comments belong to the query cache; this store holds composer UI only. */
50
74
  const previewCommentsStore = createStore({
51
75
  context: {
52
- comments: [],
53
76
  draft: null,
54
77
  activeId: null,
55
78
  focusTarget: null
@@ -58,6 +81,7 @@ const previewCommentsStore = createStore({
58
81
  startComment: (context, event) => ({
59
82
  ...context,
60
83
  draft: {
84
+ id: crypto.randomUUID(),
61
85
  pageId: event.pageId,
62
86
  target: event.target,
63
87
  message: ""
@@ -69,27 +93,23 @@ const previewCommentsStore = createStore({
69
93
  ...context,
70
94
  focusTarget: null
71
95
  }),
72
- setMessage: (context, event) => ({
73
- ...context,
74
- draft: context.draft ? {
75
- ...context.draft,
76
- message: event.message
77
- } : null
78
- }),
79
- postComment: (context, event) => {
80
- const draft = context.draft;
81
- if (!draft?.message.trim()) return context;
96
+ setMessage: (context, event) => {
97
+ if (!context.draft || context.draft.message === event.message) return context;
98
+ return {
99
+ ...context,
100
+ draft: {
101
+ ...context.draft,
102
+ id: crypto.randomUUID(),
103
+ message: event.message
104
+ }
105
+ };
106
+ },
107
+ postSucceeded: (context, event) => {
108
+ if (context.draft?.id !== event.draft.id) return context;
82
109
  return {
83
110
  ...context,
84
- comments: [...context.comments, {
85
- ...draft,
86
- id: event.id,
87
- message: draft.message.trim(),
88
- author: event.author,
89
- createdAt: event.createdAt
90
- }],
91
111
  draft: null,
92
- activeId: event.id,
112
+ activeId: event.draft.id,
93
113
  focusTarget: null
94
114
  };
95
115
  },
@@ -112,4 +132,4 @@ const previewCommentsStore = createStore({
112
132
  });
113
133
 
114
134
  //#endregion
115
- export { previewCommentsStore, revealCommentTarget };
135
+ export { getCommentTargetFieldType, previewCommentsStore, revealCommentTarget };
@@ -5,6 +5,30 @@ import { createContext, useContext } from "react";
5
5
 
6
6
  //#region src/features/preview/previewSelection.ts
7
7
  const PreviewPageContext = createContext(null);
8
+ function commentTarget(selection) {
9
+ switch (selection.type) {
10
+ case "block": return {
11
+ kind: "block",
12
+ blockId: selection.blockId
13
+ };
14
+ case "item": return {
15
+ kind: "item",
16
+ blockId: selection.blockId,
17
+ itemId: selection.itemId
18
+ };
19
+ case "block-field": return {
20
+ kind: "block-field",
21
+ blockId: selection.blockId,
22
+ fieldName: selection.fieldName
23
+ };
24
+ case "item-field": return {
25
+ kind: "item-field",
26
+ blockId: selection.blockId,
27
+ itemId: selection.itemId,
28
+ fieldName: selection.fieldName
29
+ };
30
+ }
31
+ }
8
32
  /** Both editing and commenting use the target already known by the editable component. */
9
33
  function selectPreviewTarget(selection, pageId, event) {
10
34
  const snapshot = previewStore.getSnapshot();
@@ -27,39 +51,20 @@ function selectPreviewTarget(selection, pageId, event) {
27
51
  event.preventDefault();
28
52
  event.stopPropagation();
29
53
  if (pageId === null) return;
30
- const element = event.currentTarget;
31
- const rect = element.getBoundingClientRect();
32
- const field = selection.type === "block-field" || selection.type === "item-field";
33
- const itemId = "itemId" in selection ? selection.itemId : void 0;
34
- const attribute = field ? "data-camox-field-id" : selection.type === "item" ? "data-camox-repeater-item-id" : element.hasAttribute("data-camox-comment-block-id") ? "data-camox-comment-block-id" : "data-camox-block-id";
35
- const id = field ? [
36
- selection.blockId,
37
- itemId,
38
- selection.fieldName
39
- ].filter((part) => part != null).join("__") : String(itemId ?? selection.blockId);
40
- const target = {
41
- blockId: selection.blockId,
42
- itemId,
43
- fieldName: field ? selection.fieldName : void 0,
44
- fieldType: field ? selection.fieldType : void 0,
45
- selector: `[${attribute}="${CSS.escape(id)}"]`,
46
- label: field ? `Field · ${selection.fieldName}` : `${selection.type === "item" ? "Item" : "Block"} · ${id}`,
47
- x: event.clientX == null ? .5 : Math.max(0, Math.min(1, (event.clientX - rect.left) / (rect.width || 1))),
48
- y: event.clientY == null ? .5 : Math.max(0, Math.min(1, (event.clientY - rect.top) / (rect.height || 1)))
49
- };
54
+ const target = commentTarget(selection);
50
55
  previewCommentsStore.send({
51
56
  type: "startComment",
52
57
  pageId,
53
58
  target,
54
59
  focusComposer: true
55
60
  });
56
- revealCommentTarget(target);
61
+ revealCommentTarget(target, "fieldType" in selection ? selection.fieldType : void 0);
57
62
  }
58
63
  function usePreviewSelection() {
59
64
  const $ = c(3);
60
- if ($[0] !== "5c1128621012a50122fc348fb93c4181c8f52e6cf8c887d22b4d96421b55a5a6") {
65
+ if ($[0] !== "5d794da8ed357c0619bb8d670a0c5261637b093c5e0fce67e7cdf572e265bb4e") {
61
66
  for (let $i = 0; $i < 3; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
62
- $[0] = "5c1128621012a50122fc348fb93c4181c8f52e6cf8c887d22b4d96421b55a5a6";
67
+ $[0] = "5d794da8ed357c0619bb8d670a0c5261637b093c5e0fce67e7cdf572e265bb4e";
63
68
  }
64
69
  const pageId = useContext(PreviewPageContext);
65
70
  let t0;
@@ -0,0 +1,39 @@
1
+ import { commentQueries } from "../../lib/queries.js";
2
+ import { areCommentsEnabled } from "./commentsEnabled.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { useQuery } from "@tanstack/react-query";
5
+
6
+ //#region src/features/preview/usePageComments.ts
7
+ function usePageComments(pageId) {
8
+ const $ = c(8);
9
+ if ($[0] !== "53184284ca58f3bc8c3a79ab856fb86253dedefa1ff319d9aac05c62162bf3b0") {
10
+ for (let $i = 0; $i < 8; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
11
+ $[0] = "53184284ca58f3bc8c3a79ab856fb86253dedefa1ff319d9aac05c62162bf3b0";
12
+ }
13
+ let t0;
14
+ if ($[1] !== pageId) {
15
+ t0 = commentQueries.list(pageId ?? 0);
16
+ $[1] = pageId;
17
+ $[2] = t0;
18
+ } else t0 = $[2];
19
+ let t1;
20
+ if ($[3] !== pageId) {
21
+ t1 = areCommentsEnabled() && pageId != null;
22
+ $[3] = pageId;
23
+ $[4] = t1;
24
+ } else t1 = $[4];
25
+ let t2;
26
+ if ($[5] !== t0 || $[6] !== t1) {
27
+ t2 = {
28
+ ...t0,
29
+ enabled: t1
30
+ };
31
+ $[5] = t0;
32
+ $[6] = t1;
33
+ $[7] = t2;
34
+ } else t2 = $[7];
35
+ return useQuery(t2);
36
+ }
37
+
38
+ //#endregion
39
+ export { usePageComments };
@@ -4,7 +4,7 @@ import { CamoxAppProvider } from "./components/CamoxAppContext.js";
4
4
  import { projectQueries } from "../../lib/queries.js";
5
5
  import { useQueryClient } from "@tanstack/react-query";
6
6
  import * as React from "react";
7
- import { jsx } from "react/jsx-runtime";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
8
 
9
9
  //#region src/features/provider/CoreCamoxProvider.tsx
10
10
  function isLocalhostPreview() {
@@ -25,8 +25,31 @@ function CoreCamoxProvider({ apiUrl, authenticationUrl, camoxApp, children, envi
25
25
  queryClient.setQueryData(projectQueries.getBySlug(projectSlug).queryKey, initialProject);
26
26
  seededProject.current = initialProject;
27
27
  }
28
- useProcessOtt(authClient);
29
- return /* @__PURE__ */ jsx(AuthContext.Provider, {
28
+ const { ready, error } = useProcessOtt(authClient, {
29
+ projectSlug,
30
+ environmentName,
31
+ apiUrl
32
+ });
33
+ const [isPreviewHandoff, setIsPreviewHandoff] = React.useState(false);
34
+ React.useEffect(() => {
35
+ setIsPreviewHandoff(new URL(window.location.href).searchParams.has("camox-preview"));
36
+ }, []);
37
+ if (error) return /* @__PURE__ */ jsx("div", {
38
+ role: "alert",
39
+ "data-camox-preview": "error",
40
+ children: error
41
+ });
42
+ if (isPreviewHandoff && !ready) return /* @__PURE__ */ jsx("div", {
43
+ role: "status",
44
+ "data-camox-preview": "pending",
45
+ children: "Signing in to draft preview…"
46
+ });
47
+ if (isPreviewHandoff && !initialAuthenticated) return /* @__PURE__ */ jsx("div", {
48
+ role: "alert",
49
+ "data-camox-preview": "error",
50
+ children: "Draft preview is not authenticated. Run camox preview again for a fresh link."
51
+ });
52
+ return /* @__PURE__ */ jsxs(AuthContext.Provider, {
30
53
  value: {
31
54
  authClient,
32
55
  authenticationUrl,
@@ -35,10 +58,19 @@ function CoreCamoxProvider({ apiUrl, authenticationUrl, camoxApp, children, envi
35
58
  environmentName,
36
59
  initialAuthenticated
37
60
  },
38
- children: /* @__PURE__ */ jsx(CamoxAppProvider, {
61
+ children: [isPreviewHandoff && /* @__PURE__ */ jsxs("div", {
62
+ role: "status",
63
+ "data-camox-preview": "ready",
64
+ children: [
65
+ "Draft preview · ",
66
+ projectSlug,
67
+ " · ",
68
+ environmentName
69
+ ]
70
+ }), /* @__PURE__ */ jsx(CamoxAppProvider, {
39
71
  app: camoxApp,
40
72
  children
41
- })
73
+ })]
42
74
  });
43
75
  }
44
76
 
@@ -13,15 +13,15 @@ import studioCssUrl from "virtual:camox-studio-css";
13
13
 
14
14
  //#region src/features/provider/LocalhostPreviewProvider.tsx
15
15
  function LocalhostPreviewProvider(t0) {
16
- const $ = c(21);
17
- if ($[0] !== "fddfba0cee29e4fb721206c13e16fbe407ae9aeb750c2a716d0ba1347b862953") {
18
- for (let $i = 0; $i < 21; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
19
- $[0] = "fddfba0cee29e4fb721206c13e16fbe407ae9aeb750c2a716d0ba1347b862953";
16
+ const $ = c(31);
17
+ if ($[0] !== "197882bd626662aebba1ae79edba0ab6d320481729dba64af237363088a51e3f") {
18
+ for (let $i = 0; $i < 31; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
19
+ $[0] = "197882bd626662aebba1ae79edba0ab6d320481729dba64af237363088a51e3f";
20
20
  }
21
21
  const { children } = t0;
22
22
  const signInRedirect = useSignInRedirect();
23
23
  const { resolvedTheme } = useApplyTheme();
24
- const [isSignInDialogOpen, setIsSignInDialogOpen] = React.useState(false);
24
+ const [signInReason, setSignInReason] = React.useState(null);
25
25
  useAdminShortcuts();
26
26
  let t1;
27
27
  let t2;
@@ -33,7 +33,7 @@ function LocalhostPreviewProvider(t0) {
33
33
  aliases: ["Enter edit mode", "Edit mode"],
34
34
  groupLabel: "Preview",
35
35
  checkIfAvailable: _temp,
36
- execute: () => setIsSignInDialogOpen(true),
36
+ execute: () => setSignInReason("edit"),
37
37
  shortcut: EDIT_MODE_SHORTCUT
38
38
  }];
39
39
  actionsStore.send({
@@ -81,9 +81,14 @@ function LocalhostPreviewProvider(t0) {
81
81
  } else t5 = $[6];
82
82
  let t6;
83
83
  if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
84
- t6 = { onEditModeChange: (checked) => {
85
- if (checked) setIsSignInDialogOpen(true);
86
- } };
84
+ t6 = {
85
+ onEditModeChange: (checked) => {
86
+ if (checked) setSignInReason("edit");
87
+ },
88
+ onCommentModeChange: (enabled) => {
89
+ if (enabled) setSignInReason("feedback");
90
+ }
91
+ };
87
92
  $[7] = t6;
88
93
  } else t6 = $[7];
89
94
  let t7;
@@ -98,54 +103,85 @@ function LocalhostPreviewProvider(t0) {
98
103
  $[8] = children;
99
104
  $[9] = t7;
100
105
  } else t7 = $[9];
101
- let t8;
102
- if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
103
- t8 = /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [/* @__PURE__ */ jsx(AlertDialogTitle, { children: "Sign in to edit" }), /* @__PURE__ */ jsx(AlertDialogDescription, { children: "You need to sign in before you can enable edit mode." })] });
104
- $[10] = t8;
105
- } else t8 = $[10];
106
+ const t8 = signInReason !== null;
106
107
  let t9;
107
- if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
108
- t9 = /* @__PURE__ */ jsx(AlertDialogCancel, {
108
+ if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
109
+ t9 = (open) => {
110
+ if (!open) setSignInReason(null);
111
+ };
112
+ $[10] = t9;
113
+ } else t9 = $[10];
114
+ const t10 = signInReason === "feedback" ? "Sign in to leave feedback" : "Sign in to edit";
115
+ let t11;
116
+ if ($[11] !== t10) {
117
+ t11 = /* @__PURE__ */ jsx(AlertDialogTitle, { children: t10 });
118
+ $[11] = t10;
119
+ $[12] = t11;
120
+ } else t11 = $[12];
121
+ const t12 = signInReason === "feedback" ? "You need to sign in before you can leave feedback for agents." : "You need to sign in before you can enable edit mode.";
122
+ let t13;
123
+ if ($[13] !== t12) {
124
+ t13 = /* @__PURE__ */ jsx(AlertDialogDescription, { children: t12 });
125
+ $[13] = t12;
126
+ $[14] = t13;
127
+ } else t13 = $[14];
128
+ let t14;
129
+ if ($[15] !== t11 || $[16] !== t13) {
130
+ t14 = /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [t11, t13] });
131
+ $[15] = t11;
132
+ $[16] = t13;
133
+ $[17] = t14;
134
+ } else t14 = $[17];
135
+ let t15;
136
+ if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
137
+ t15 = /* @__PURE__ */ jsx(AlertDialogCancel, {
109
138
  variant: "outline",
110
139
  size: "default",
111
140
  children: "Cancel"
112
141
  });
113
- $[11] = t9;
114
- } else t9 = $[11];
115
- let t10;
116
- if ($[12] !== signInRedirect) {
117
- t10 = /* @__PURE__ */ jsxs(AlertDialogContent, { children: [t8, /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [t9, /* @__PURE__ */ jsx(AlertDialogAction, {
142
+ $[18] = t15;
143
+ } else t15 = $[18];
144
+ let t16;
145
+ if ($[19] !== signInRedirect) {
146
+ t16 = /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [t15, /* @__PURE__ */ jsx(AlertDialogAction, {
118
147
  onClick: signInRedirect,
119
148
  children: "Sign in"
120
- })] })] });
121
- $[12] = signInRedirect;
122
- $[13] = t10;
123
- } else t10 = $[13];
124
- let t11;
125
- if ($[14] !== isSignInDialogOpen || $[15] !== t10) {
126
- t11 = /* @__PURE__ */ jsx(AlertDialog, {
127
- open: isSignInDialogOpen,
128
- onOpenChange: setIsSignInDialogOpen,
129
- children: t10
149
+ })] });
150
+ $[19] = signInRedirect;
151
+ $[20] = t16;
152
+ } else t16 = $[20];
153
+ let t17;
154
+ if ($[21] !== t14 || $[22] !== t16) {
155
+ t17 = /* @__PURE__ */ jsxs(AlertDialogContent, { children: [t14, t16] });
156
+ $[21] = t14;
157
+ $[22] = t16;
158
+ $[23] = t17;
159
+ } else t17 = $[23];
160
+ let t18;
161
+ if ($[24] !== t17 || $[25] !== t8) {
162
+ t18 = /* @__PURE__ */ jsx(AlertDialog, {
163
+ open: t8,
164
+ onOpenChange: t9,
165
+ children: t17
130
166
  });
131
- $[14] = isSignInDialogOpen;
132
- $[15] = t10;
133
- $[16] = t11;
134
- } else t11 = $[16];
135
- let t12;
136
- if ($[17] !== t11 || $[18] !== t5 || $[19] !== t7) {
137
- t12 = /* @__PURE__ */ jsxs(Fragment, { children: [
167
+ $[24] = t17;
168
+ $[25] = t8;
169
+ $[26] = t18;
170
+ } else t18 = $[26];
171
+ let t19;
172
+ if ($[27] !== t18 || $[28] !== t5 || $[29] !== t7) {
173
+ t19 = /* @__PURE__ */ jsxs(Fragment, { children: [
138
174
  t3,
139
175
  t5,
140
176
  t7,
141
- t11
177
+ t18
142
178
  ] });
143
- $[17] = t11;
144
- $[18] = t5;
145
- $[19] = t7;
146
- $[20] = t12;
147
- } else t12 = $[20];
148
- return t12;
179
+ $[27] = t18;
180
+ $[28] = t5;
181
+ $[29] = t7;
182
+ $[30] = t19;
183
+ } else t19 = $[30];
184
+ return t19;
149
185
  }
150
186
  function _temp2(action) {
151
187
  return action.id;