camox 0.46.0 → 0.48.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 (82) hide show
  1. package/dist/core/createApp.d.ts +19 -6
  2. package/dist/core/createApp.js +7 -2
  3. package/dist/core/createBlock.js +54 -43
  4. package/dist/core/createCollection.d.ts +25 -7
  5. package/dist/core/createCollection.js +28 -9
  6. package/dist/core/createLayout.d.ts +98 -71
  7. package/dist/core/createLayout.js +10 -16
  8. package/dist/core/derivedRoutes.js +1 -1
  9. package/dist/core/editing/BlockEditingRuntime.d.ts +3 -2
  10. package/dist/core/editing/CompleteBlockEditingRuntime.js +2 -1
  11. package/dist/core/editing/createEditableBlock.d.ts +59 -19
  12. package/dist/core/editing/createEditableBlock.js +162 -151
  13. package/dist/core/editing/useLatestRecord.js +7 -7
  14. package/dist/core/layoutContext.d.ts +54 -0
  15. package/dist/core/layoutContext.js +66 -0
  16. package/dist/core/lib/contentType.d.ts +91 -4
  17. package/dist/core/lib/contentType.js +84 -7
  18. package/dist/core/lib/recordScope.js +19 -17
  19. package/dist/core/lib/reference.d.ts +6 -2
  20. package/dist/core/recordItem.js +55 -2
  21. package/dist/core/requestContext.d.ts +18 -0
  22. package/dist/core/structuredData.d.ts +126 -0
  23. package/dist/core/structuredData.js +40 -0
  24. package/dist/features/canvas/canvasCamera.js +21 -6
  25. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +1 -1
  26. package/dist/features/canvas/useCanvasCamera.js +16 -11
  27. package/dist/features/content/ContentCollection.js +13 -7
  28. package/dist/features/content/collection-form.js +6 -2
  29. package/dist/features/content/components/MissingFromLocale.js +1 -1
  30. package/dist/features/og/pageImage.js +89 -0
  31. package/dist/features/page/CuratedPageContent.js +45 -32
  32. package/dist/features/page/DerivedPageContent.js +49 -22
  33. package/dist/features/page/SharedLayoutContent.js +26 -22
  34. package/dist/features/preview/CamoxPreview.js +176 -145
  35. package/dist/features/preview/components/AddBlockSheet.js +1 -0
  36. package/dist/features/preview/components/BlockActionsPopover.js +8 -6
  37. package/dist/features/preview/components/PageInfo.js +244 -264
  38. package/dist/features/preview/components/PageTree.js +63 -53
  39. package/dist/features/preview/components/PreviewToolbar.js +74 -85
  40. package/dist/features/preview/components/RecordCard.js +50 -34
  41. package/dist/features/preview/components/RecordCombobox.js +12 -5
  42. package/dist/features/preview/components/ReferenceFieldEditor.js +4 -2
  43. package/dist/features/preview/components/ReferenceListFieldEditor.js +24 -19
  44. package/dist/features/preview/components/RepeatableItemsList.js +62 -46
  45. package/dist/features/preview/components/SelectionEditor.js +3 -2
  46. package/dist/features/preview/components/useFieldWriter.js +2 -4
  47. package/dist/features/preview/components/useRecordView.js +2 -2
  48. package/dist/features/preview/entityName.js +11 -0
  49. package/dist/features/preview/pageRecord.js +17 -18
  50. package/dist/features/provider/CamoxProvider.js +8 -16
  51. package/dist/features/provider/CoreCamoxProvider.js +1 -6
  52. package/dist/features/provider/signInShortcut.js +60 -0
  53. package/dist/features/routes/pageRuntime.d.ts +15 -1
  54. package/dist/features/routes/pageRuntime.js +35 -38
  55. package/dist/features/runtime/RuntimeChrome.js +2 -2
  56. package/dist/features/runtime/breadcrumbs.js +68 -0
  57. package/dist/features/runtime/livePages.js +3 -2
  58. package/dist/features/runtime/pageApp.js +11 -39
  59. package/dist/features/runtime/pageGraph.js +92 -0
  60. package/dist/features/runtime/projectLogo.js +110 -0
  61. package/dist/features/runtime/runtime.d.ts +11 -6
  62. package/dist/features/runtime/runtime.js +278 -55
  63. package/dist/features/runtime/runtimeRoutes.d.ts +1 -0
  64. package/dist/features/runtime/runtimeRoutes.js +1 -0
  65. package/dist/features/runtime/structuredData.js +213 -0
  66. package/dist/features/studio/components/ChatSidebar.js +5 -5
  67. package/dist/features/studio/components/ProjectMenu.js +127 -100
  68. package/dist/features/studio/components/SocialProfilesDialog.js +342 -0
  69. package/dist/features/studio/components/ThreadMessages.js +2 -2
  70. package/dist/features/vite/blockBoilerplate.js +3 -2
  71. package/dist/features/vite/layoutGeneration.js +3 -2
  72. package/dist/features/vite/vite.js +1 -0
  73. package/dist/lib/queries.d.ts +4 -0
  74. package/dist/lib/queries.js +1 -0
  75. package/dist/lib/studio-reads.js +3 -1
  76. package/dist/package.js +1 -1
  77. package/dist/studio.css +1 -1
  78. package/package.json +5 -4
  79. package/skills/camox/references/block-definitions.md +105 -25
  80. package/skills/camox/references/layout-definitions.md +53 -17
  81. package/skills/camox/references/routed-layouts.md +17 -14
  82. package/dist/features/provider/LocalhostPreviewProvider.js +0 -158
@@ -0,0 +1,213 @@
1
+ import { isArticle, isCreativeWork, isWebPageKind } from "../../core/structuredData.js";
2
+ import { isPageUrlMarker, linkedRecordId } from "@camox/api-contract";
3
+ import { createSchemaOrgGraph, defineBreadcrumb, defineOrganization, defineWebPage, defineWebSite } from "@unhead/schema-org";
4
+
5
+ //#region src/features/runtime/structuredData.ts
6
+ /**
7
+ * A value of a node the API evaluated, with the absolute URL of each page its markers name.
8
+ * Only the runtime knows the website's address.
9
+ */
10
+ function withPageUrls(value, pageUrl) {
11
+ if (isPageUrlMarker(value)) return pageUrl(value);
12
+ if (Array.isArray(value)) return value.map((entry) => withPageUrls(entry, pageUrl));
13
+ if (typeof value === "object" && value !== null) return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, withPageUrls(entry, pageUrl)]));
14
+ return value;
15
+ }
16
+ /** The `@id`s of the site's nodes, derived from the website's address. */
17
+ function siteNodeIds(siteUrl) {
18
+ return {
19
+ organization: `${siteUrl}#identity`,
20
+ website: `${siteUrl}#website`
21
+ };
22
+ }
23
+ /** The Organization publishing the website, and the WebSite itself. */
24
+ function siteNodes(site, inLanguage) {
25
+ const ids = siteNodeIds(site.url);
26
+ return [defineOrganization({
27
+ "@id": ids.organization,
28
+ name: site.name,
29
+ url: site.url,
30
+ logo: {
31
+ url: site.logo.url,
32
+ width: site.logo.width,
33
+ height: site.logo.height
34
+ },
35
+ ...site.socialProfiles.length > 0 && { sameAs: [...site.socialProfiles] }
36
+ }), defineWebSite({
37
+ "@id": ids.website,
38
+ name: site.name,
39
+ url: site.url,
40
+ inLanguage,
41
+ publisher: { "@id": ids.organization }
42
+ })];
43
+ }
44
+ /** The `@id`s of a page's nodes, derived from its URL. */
45
+ function pageNodeIds(pageUrl) {
46
+ return {
47
+ page: `${pageUrl}#webpage`,
48
+ mainEntity: `${pageUrl}#main-entity`
49
+ };
50
+ }
51
+ /**
52
+ * The page's own node, part of the WebSite, of the kind its layout says, or a plain WebPage,
53
+ * linking its main entity and the records it mentions.
54
+ */
55
+ function pageNode(page, site, declared, { mainEntity, mentions }) {
56
+ const kind = declared && isWebPageKind(declared) ? declared : void 0;
57
+ return defineWebPage({
58
+ ...kind,
59
+ "@type": kind?.["@type"] ?? "WebPage",
60
+ "@id": pageNodeIds(page.url).page,
61
+ url: page.url,
62
+ name: page.name,
63
+ ...page.description && { description: page.description },
64
+ inLanguage: page.inLanguage,
65
+ isPartOf: { "@id": siteNodeIds(site.url).website },
66
+ ...page.image && { primaryImageOfPage: { url: page.image } },
67
+ ...page.datePublished && { datePublished: page.datePublished.toISOString() },
68
+ ...page.dateModified && { dateModified: page.dateModified.toISOString() },
69
+ ...mainEntity && { mainEntity: { "@id": mainEntity } },
70
+ ...mentions.length > 0 && { mentions: mentions.map((id) => ({ "@id": id })) }
71
+ });
72
+ }
73
+ /**
74
+ * The thing a page is about, as its own node, filled from the page where its layout leaves
75
+ * properties out: its name or headline, description, URL and image for every type, and its
76
+ * dates, publisher and language for creative works.
77
+ */
78
+ function mainEntityNode(entity, page, site, id) {
79
+ const work = isCreativeWork(entity);
80
+ return {
81
+ ...isArticle(entity) ? { headline: page.name } : { name: page.name },
82
+ ...page.description && { description: page.description },
83
+ url: page.url,
84
+ ...page.image && { image: page.image },
85
+ ...work && {
86
+ ...page.datePublished && { datePublished: page.datePublished.toISOString() },
87
+ ...page.dateModified && { dateModified: page.dateModified.toISOString() },
88
+ publisher: { "@id": siteNodeIds(site.url).organization },
89
+ inLanguage: page.inLanguage
90
+ },
91
+ ...entity,
92
+ "@id": id,
93
+ mainEntityOfPage: { "@id": pageNodeIds(page.url).page }
94
+ };
95
+ }
96
+ /** The page's breadcrumb, which the page node links. None for a page without crumbs. */
97
+ function breadcrumbNodes(page) {
98
+ if (!page.breadcrumb?.length) return [];
99
+ return [defineBreadcrumb({
100
+ "@id": `${page.url}#breadcrumb`,
101
+ itemListElement: page.breadcrumb.map((crumb) => ({
102
+ name: crumb.name,
103
+ item: crumb.url
104
+ }))
105
+ })];
106
+ }
107
+ /**
108
+ * The things the page's blocks show, each its own node, linked to the page: creative works are
109
+ * part of it, and it is about anything else. Every placement's nodes have their own `@id`s.
110
+ */
111
+ function blockNodes(page, blocks = []) {
112
+ const pageId = { "@id": pageNodeIds(page.url).page };
113
+ return blocks.flatMap(({ id, nodes }) => nodes.map((node, index) => ({
114
+ ...node,
115
+ "@id": `${page.url}#block-${id}-${index}`,
116
+ [isCreativeWork(node) ? "isPartOf" : "subjectOf"]: pageId
117
+ })));
118
+ }
119
+ /**
120
+ * The records a graph places: links to records with nodes become their `@id`s and place the
121
+ * records, and links to records without nodes read as their titles, or are left out.
122
+ */
123
+ function recordPlacement(records) {
124
+ const placed = /* @__PURE__ */ new Set();
125
+ const pending = [];
126
+ const place = (id) => {
127
+ if (placed.has(id)) return;
128
+ placed.add(id);
129
+ pending.push(id);
130
+ };
131
+ const link = (value) => {
132
+ const id = linkedRecordId(value);
133
+ if (id !== void 0) {
134
+ if (!records?.nodes[id]) return records?.titles?.[id];
135
+ place(id);
136
+ return { "@id": records.id(id) };
137
+ }
138
+ if (Array.isArray(value)) return value.map(link).filter((entry) => entry !== void 0);
139
+ if (typeof value === "object" && value !== null) return Object.fromEntries(Object.entries(value).flatMap(([key, entry]) => {
140
+ const linked = link(entry);
141
+ return linked === void 0 ? [] : [[key, linked]];
142
+ }));
143
+ return value;
144
+ };
145
+ return {
146
+ placed,
147
+ place,
148
+ /** A value with its links resolved. */
149
+ link: (value) => link(value),
150
+ /** The nodes of the records placed since last asked, and of those they link in turn. */
151
+ nodes: () => {
152
+ const nodes = [];
153
+ for (let id = pending.shift(); id !== void 0; id = pending.shift()) {
154
+ const { "@id": _own, ...node } = records.nodes[id];
155
+ nodes.push({
156
+ ...link(node),
157
+ "@id": records.id(id)
158
+ });
159
+ }
160
+ return nodes;
161
+ }
162
+ };
163
+ }
164
+ /** Every node a page's graph holds, before they are resolved and linked. */
165
+ function graphNodes({ site, page, declared, blocks, records }) {
166
+ const placement = recordPlacement(records);
167
+ const linked = declared && placement.link(declared);
168
+ const blockList = blockNodes(page, blocks).map(placement.link);
169
+ const mainRecord = !declared && records?.main && records.nodes[records.main] && records.main;
170
+ let mainEntity;
171
+ if (linked && !isWebPageKind(linked)) mainEntity = mainEntityNode(linked, page, site, pageNodeIds(page.url).mainEntity);
172
+ if (mainRecord) placement.place(mainRecord);
173
+ const placedRecords = placement.nodes();
174
+ if (mainRecord) {
175
+ const index = placedRecords.findIndex((node) => node["@id"] === records.id(mainRecord));
176
+ const [node] = placedRecords.splice(index, 1);
177
+ mainEntity = mainEntityNode(node, page, site, records.id(mainRecord));
178
+ }
179
+ const mentions = (records?.referenced ?? []).filter((id) => records.nodes[id] && !placement.placed.has(id));
180
+ for (const id of mentions) placement.place(id);
181
+ const recordNodes = [...placedRecords, ...placement.nodes()];
182
+ return [
183
+ ...siteNodes(site, page.inLanguage),
184
+ pageNode(page, site, linked, {
185
+ mainEntity: mainEntity?.["@id"],
186
+ mentions: mentions.map((id) => records.id(id))
187
+ }),
188
+ ...mainEntity ? [mainEntity] : [],
189
+ ...breadcrumbNodes(page),
190
+ ...blockList,
191
+ ...recordNodes
192
+ ];
193
+ }
194
+ /** A page's graph, resolved into JSON-LD. */
195
+ function buildPageGraph(input) {
196
+ const graph = createSchemaOrgGraph();
197
+ graph.push(graphNodes(input));
198
+ return {
199
+ "@context": "https://schema.org",
200
+ "@graph": graph.resolveGraph({
201
+ host: input.site.url,
202
+ url: input.page.url,
203
+ inLanguage: input.page.inLanguage
204
+ })
205
+ };
206
+ }
207
+ /** JSON-LD as a script's text: `<` is escaped, so content can't close the script. */
208
+ function serializeStructuredData(data) {
209
+ return JSON.stringify(data).replaceAll("<", "\\u003c");
210
+ }
211
+
212
+ //#endregion
213
+ export { buildPageGraph, serializeStructuredData, siteNodeIds, withPageUrls };
@@ -14,8 +14,8 @@ import { EMPTY_THREAD_VIEW } from "@camox/api-contract/threads";
14
14
 
15
15
  //#region src/features/studio/components/ChatSidebar.tsx
16
16
  /**
17
- * Where an editor works with Camox's agent in a thread, beside every studio page except the
18
- * preview, which only hides it: the studio keeps following the editor's runs there. It follows
17
+ * Where an editor works with Camox's agent in a thread, beside the Canvas. Elsewhere in the
18
+ * studio it is only hidden: the studio keeps following the editor's runs there. It follows
19
19
  * where the studio is: the editor's own Live thread on Live, and the draft's thread in a draft.
20
20
  * When the Live thread starts a draft, the studio enters it with the thread.
21
21
  */
@@ -25,14 +25,14 @@ function ChatSidebar(t0) {
25
25
  const hidden = t1 === void 0 ? false : t1;
26
26
  let t2;
27
27
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
28
- t2 = { width: 250 };
28
+ t2 = { width: 265 };
29
29
  $[0] = t2;
30
30
  } else t2 = $[0];
31
31
  let t3;
32
32
  let t4;
33
33
  if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
34
34
  t3 = /* @__PURE__ */ jsxs("header", {
35
- className: "border-border box-content flex h-8 min-w-0 items-center gap-2 border-b px-3 py-2",
35
+ className: "border-border box-content flex h-8 min-w-0 items-center gap-2 border-b px-2 py-2",
36
36
  children: [/* @__PURE__ */ jsx(CamoxMark, {}), /* @__PURE__ */ jsx("h2", {
37
37
  className: "truncate text-sm font-medium",
38
38
  children: "Chat"
@@ -235,7 +235,7 @@ function Thread(t0) {
235
235
  if ($[21] !== error) {
236
236
  t9 = error && /* @__PURE__ */ jsx("p", {
237
237
  role: "alert",
238
- className: "text-destructive px-4 pt-2 text-sm",
238
+ className: "text-destructive px-2 pt-2 text-sm",
239
239
  children: error
240
240
  });
241
241
  $[21] = error;
@@ -5,11 +5,12 @@ import { reads, useReadQuery } from "../../../lib/studio-reads.js";
5
5
  import { buildFaviconUrl } from "../../routes/pageRuntime.js";
6
6
  import { version } from "../../../package.js";
7
7
  import { FaviconDialog } from "./FaviconDialog.js";
8
+ import { SocialProfilesDialog } from "./SocialProfilesDialog.js";
8
9
  import { c } from "react/compiler-runtime";
9
10
  import * as React from "react";
10
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
12
  import { Button } from "@camox/ui/button";
12
- import { ChevronDown, ImageIcon, Info, Settings, Users } from "lucide-react";
13
+ import { AtSign, ChevronDown, ImageIcon, Info, Settings, Users } from "lucide-react";
13
14
  import { Skeleton } from "@camox/ui/skeleton";
14
15
  import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "@camox/ui/dropdown-menu";
15
16
 
@@ -48,7 +49,7 @@ const Favicon = (t0) => {
48
49
  return t4;
49
50
  };
50
51
  const ProjectMenu = () => {
51
- const $ = c(53);
52
+ const $ = c(58);
52
53
  const authCtx = React.useContext(AuthContext);
53
54
  let t0;
54
55
  if ($[0] !== authCtx.projectUuid) {
@@ -58,6 +59,7 @@ const ProjectMenu = () => {
58
59
  } else t0 = $[1];
59
60
  const { data: project } = useReadQuery(t0);
60
61
  const [isFaviconDialogOpen, setIsFaviconDialogOpen] = React.useState(false);
62
+ const [isSocialProfilesDialogOpen, setIsSocialProfilesDialogOpen] = React.useState(false);
61
63
  if (!project) {
62
64
  let t1;
63
65
  if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
@@ -142,115 +144,123 @@ const ProjectMenu = () => {
142
144
  $[18] = t10;
143
145
  } else t10 = $[18];
144
146
  let t11;
145
- let t12;
146
147
  if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
147
148
  t11 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
148
149
  onClick: () => setIsFaviconDialogOpen(true),
149
150
  children: [/* @__PURE__ */ jsx(ImageIcon, {}), "Set favicon…"]
150
151
  });
151
- t12 = /* @__PURE__ */ jsx(DropdownMenuSeparator, {});
152
152
  $[19] = t11;
153
+ } else t11 = $[19];
154
+ let t12;
155
+ let t13;
156
+ if ($[20] === Symbol.for("react.memo_cache_sentinel")) {
157
+ t12 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
158
+ onClick: () => setIsSocialProfilesDialogOpen(true),
159
+ children: [/* @__PURE__ */ jsx(AtSign, {}), "Social profiles…"]
160
+ });
161
+ t13 = /* @__PURE__ */ jsx(DropdownMenuSeparator, {});
153
162
  $[20] = t12;
163
+ $[21] = t13;
154
164
  } else {
155
- t11 = $[19];
156
165
  t12 = $[20];
166
+ t13 = $[21];
157
167
  }
158
- let t13;
159
- if ($[21] !== project.organizationSlug) {
160
- t13 = /* @__PURE__ */ jsx(DropdownMenuLabel, {
168
+ let t14;
169
+ if ($[22] !== project.organizationSlug) {
170
+ t14 = /* @__PURE__ */ jsx(DropdownMenuLabel, {
161
171
  className: "text-muted-foreground text-xs font-normal",
162
172
  children: project.organizationSlug
163
173
  });
164
- $[21] = project.organizationSlug;
165
- $[22] = t13;
166
- } else t13 = $[22];
167
- const t14 = authCtx ? `${authCtx.authenticationUrl}/${project.organizationSlug}/members` : "#";
168
- let t15;
169
- if ($[23] !== t14) {
170
- t15 = /* @__PURE__ */ jsx("a", {
171
- href: t14,
174
+ $[22] = project.organizationSlug;
175
+ $[23] = t14;
176
+ } else t14 = $[23];
177
+ const t15 = authCtx ? `${authCtx.authenticationUrl}/${project.organizationSlug}/members` : "#";
178
+ let t16;
179
+ if ($[24] !== t15) {
180
+ t16 = /* @__PURE__ */ jsx("a", {
181
+ href: t15,
172
182
  target: "_blank",
173
183
  rel: "noopener noreferrer"
174
184
  });
175
- $[23] = t14;
176
185
  $[24] = t15;
177
- } else t15 = $[24];
178
- let t16;
179
- if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
180
- t16 = /* @__PURE__ */ jsx(Users, {});
181
186
  $[25] = t16;
182
187
  } else t16 = $[25];
183
188
  let t17;
184
- if ($[26] !== t15) {
185
- t17 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
186
- render: t15,
187
- children: [t16, "Team members"]
189
+ if ($[26] === Symbol.for("react.memo_cache_sentinel")) {
190
+ t17 = /* @__PURE__ */ jsx(Users, {});
191
+ $[26] = t17;
192
+ } else t17 = $[26];
193
+ let t18;
194
+ if ($[27] !== t16) {
195
+ t18 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
196
+ render: t16,
197
+ children: [t17, "Team members"]
188
198
  });
189
- $[26] = t15;
190
- $[27] = t17;
191
- } else t17 = $[27];
192
- const t18 = authCtx ? `${authCtx.authenticationUrl}/${project.organizationSlug}/settings` : "#";
193
- let t19;
194
- if ($[28] !== t18) {
195
- t19 = /* @__PURE__ */ jsx("a", {
196
- href: t18,
199
+ $[27] = t16;
200
+ $[28] = t18;
201
+ } else t18 = $[28];
202
+ const t19 = authCtx ? `${authCtx.authenticationUrl}/${project.organizationSlug}/settings` : "#";
203
+ let t20;
204
+ if ($[29] !== t19) {
205
+ t20 = /* @__PURE__ */ jsx("a", {
206
+ href: t19,
197
207
  target: "_blank",
198
208
  rel: "noopener noreferrer"
199
209
  });
200
- $[28] = t18;
201
210
  $[29] = t19;
202
- } else t19 = $[29];
203
- let t20;
204
- if ($[30] === Symbol.for("react.memo_cache_sentinel")) {
205
- t20 = /* @__PURE__ */ jsx(Settings, { className: "h-4 w-4" });
206
211
  $[30] = t20;
207
212
  } else t20 = $[30];
208
213
  let t21;
209
- if ($[31] !== t19) {
210
- t21 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
211
- render: t19,
212
- children: [t20, "Team settings"]
213
- });
214
- $[31] = t19;
215
- $[32] = t21;
216
- } else t21 = $[32];
214
+ if ($[31] === Symbol.for("react.memo_cache_sentinel")) {
215
+ t21 = /* @__PURE__ */ jsx(Settings, { className: "h-4 w-4" });
216
+ $[31] = t21;
217
+ } else t21 = $[31];
217
218
  let t22;
218
- if ($[33] !== t13 || $[34] !== t17 || $[35] !== t21) {
219
- t22 = /* @__PURE__ */ jsxs(DropdownMenuGroup, { children: [
220
- t13,
221
- t17,
222
- t21
219
+ if ($[32] !== t20) {
220
+ t22 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
221
+ render: t20,
222
+ children: [t21, "Team settings"]
223
+ });
224
+ $[32] = t20;
225
+ $[33] = t22;
226
+ } else t22 = $[33];
227
+ let t23;
228
+ if ($[34] !== t14 || $[35] !== t18 || $[36] !== t22) {
229
+ t23 = /* @__PURE__ */ jsxs(DropdownMenuGroup, { children: [
230
+ t14,
231
+ t18,
232
+ t22
223
233
  ] });
224
- $[33] = t13;
225
- $[34] = t17;
226
- $[35] = t21;
234
+ $[34] = t14;
235
+ $[35] = t18;
227
236
  $[36] = t22;
228
- } else t22 = $[36];
229
- let t23;
230
- if ($[37] === Symbol.for("react.memo_cache_sentinel")) {
231
- t23 = /* @__PURE__ */ jsx(DropdownMenuSeparator, {});
232
237
  $[37] = t23;
233
238
  } else t23 = $[37];
234
239
  let t24;
235
- let t25;
236
240
  if ($[38] === Symbol.for("react.memo_cache_sentinel")) {
237
- t24 = /* @__PURE__ */ jsx(Link$1, {
241
+ t24 = /* @__PURE__ */ jsx(DropdownMenuSeparator, {});
242
+ $[38] = t24;
243
+ } else t24 = $[38];
244
+ let t25;
245
+ let t26;
246
+ if ($[39] === Symbol.for("react.memo_cache_sentinel")) {
247
+ t25 = /* @__PURE__ */ jsx(Link$1, {
238
248
  to: "https://camox.dev",
239
249
  target: "_blank"
240
250
  });
241
- t25 = /* @__PURE__ */ jsx(Info, { className: "h-4 w-4" });
242
- $[38] = t24;
251
+ t26 = /* @__PURE__ */ jsx(Info, { className: "h-4 w-4" });
243
252
  $[39] = t25;
253
+ $[40] = t26;
244
254
  } else {
245
- t24 = $[38];
246
255
  t25 = $[39];
256
+ t26 = $[40];
247
257
  }
248
- let t26;
249
- if ($[40] === Symbol.for("react.memo_cache_sentinel")) {
250
- t26 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
251
- render: t24,
258
+ let t27;
259
+ if ($[41] === Symbol.for("react.memo_cache_sentinel")) {
260
+ t27 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
261
+ render: t25,
252
262
  children: [
253
- t25,
263
+ t26,
254
264
  "Powered by Camox",
255
265
  /* @__PURE__ */ jsxs("span", {
256
266
  className: "text-muted-foreground ml-auto",
@@ -258,11 +268,11 @@ const ProjectMenu = () => {
258
268
  })
259
269
  ]
260
270
  });
261
- $[40] = t26;
262
- } else t26 = $[40];
263
- let t27;
264
- if ($[41] !== t10 || $[42] !== t22) {
265
- t27 = /* @__PURE__ */ jsxs(DropdownMenuContent, {
271
+ $[41] = t27;
272
+ } else t27 = $[41];
273
+ let t28;
274
+ if ($[42] !== t10 || $[43] !== t23) {
275
+ t28 = /* @__PURE__ */ jsxs(DropdownMenuContent, {
266
276
  className: "w-72",
267
277
  align: "start",
268
278
  side: "bottom",
@@ -270,41 +280,58 @@ const ProjectMenu = () => {
270
280
  t10,
271
281
  t11,
272
282
  t12,
273
- t22,
283
+ t13,
274
284
  t23,
275
- t26
285
+ t24,
286
+ t27
276
287
  ]
277
288
  });
278
- $[41] = t10;
279
- $[42] = t22;
280
- $[43] = t27;
281
- } else t27 = $[43];
282
- let t28;
283
- if ($[44] !== t27 || $[45] !== t6) {
284
- t28 = /* @__PURE__ */ jsxs(DropdownMenu, { children: [t6, t27] });
285
- $[44] = t27;
286
- $[45] = t6;
287
- $[46] = t28;
288
- } else t28 = $[46];
289
+ $[42] = t10;
290
+ $[43] = t23;
291
+ $[44] = t28;
292
+ } else t28 = $[44];
289
293
  let t29;
290
- if ($[47] !== isFaviconDialogOpen || $[48] !== project) {
291
- t29 = /* @__PURE__ */ jsx(FaviconDialog, {
294
+ if ($[45] !== t28 || $[46] !== t6) {
295
+ t29 = /* @__PURE__ */ jsxs(DropdownMenu, { children: [t6, t28] });
296
+ $[45] = t28;
297
+ $[46] = t6;
298
+ $[47] = t29;
299
+ } else t29 = $[47];
300
+ let t30;
301
+ if ($[48] !== isFaviconDialogOpen || $[49] !== project) {
302
+ t30 = /* @__PURE__ */ jsx(FaviconDialog, {
292
303
  project,
293
304
  open: isFaviconDialogOpen,
294
305
  onOpenChange: setIsFaviconDialogOpen
295
306
  });
296
- $[47] = isFaviconDialogOpen;
297
- $[48] = project;
298
- $[49] = t29;
299
- } else t29 = $[49];
300
- let t30;
301
- if ($[50] !== t28 || $[51] !== t29) {
302
- t30 = /* @__PURE__ */ jsxs(Fragment, { children: [t28, t29] });
303
- $[50] = t28;
304
- $[51] = t29;
305
- $[52] = t30;
306
- } else t30 = $[52];
307
- return t30;
307
+ $[48] = isFaviconDialogOpen;
308
+ $[49] = project;
309
+ $[50] = t30;
310
+ } else t30 = $[50];
311
+ let t31;
312
+ if ($[51] !== isSocialProfilesDialogOpen || $[52] !== project) {
313
+ t31 = /* @__PURE__ */ jsx(SocialProfilesDialog, {
314
+ project,
315
+ open: isSocialProfilesDialogOpen,
316
+ onOpenChange: setIsSocialProfilesDialogOpen
317
+ });
318
+ $[51] = isSocialProfilesDialogOpen;
319
+ $[52] = project;
320
+ $[53] = t31;
321
+ } else t31 = $[53];
322
+ let t32;
323
+ if ($[54] !== t29 || $[55] !== t30 || $[56] !== t31) {
324
+ t32 = /* @__PURE__ */ jsxs(Fragment, { children: [
325
+ t29,
326
+ t30,
327
+ t31
328
+ ] });
329
+ $[54] = t29;
330
+ $[55] = t30;
331
+ $[56] = t31;
332
+ $[57] = t32;
333
+ } else t32 = $[57];
334
+ return t32;
308
335
  };
309
336
 
310
337
  //#endregion