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.
- package/dist/core/createApp.d.ts +19 -6
- package/dist/core/createApp.js +7 -2
- package/dist/core/createBlock.js +54 -43
- package/dist/core/createCollection.d.ts +25 -7
- package/dist/core/createCollection.js +28 -9
- package/dist/core/createLayout.d.ts +98 -71
- package/dist/core/createLayout.js +10 -16
- package/dist/core/derivedRoutes.js +1 -1
- package/dist/core/editing/BlockEditingRuntime.d.ts +3 -2
- package/dist/core/editing/CompleteBlockEditingRuntime.js +2 -1
- package/dist/core/editing/createEditableBlock.d.ts +59 -19
- package/dist/core/editing/createEditableBlock.js +162 -151
- package/dist/core/editing/useLatestRecord.js +7 -7
- package/dist/core/layoutContext.d.ts +54 -0
- package/dist/core/layoutContext.js +66 -0
- package/dist/core/lib/contentType.d.ts +91 -4
- package/dist/core/lib/contentType.js +84 -7
- package/dist/core/lib/recordScope.js +19 -17
- package/dist/core/lib/reference.d.ts +6 -2
- package/dist/core/recordItem.js +55 -2
- package/dist/core/requestContext.d.ts +18 -0
- package/dist/core/structuredData.d.ts +126 -0
- package/dist/core/structuredData.js +40 -0
- package/dist/features/canvas/canvasCamera.js +21 -6
- package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +1 -1
- package/dist/features/canvas/useCanvasCamera.js +16 -11
- package/dist/features/content/ContentCollection.js +13 -7
- package/dist/features/content/collection-form.js +6 -2
- package/dist/features/content/components/MissingFromLocale.js +1 -1
- package/dist/features/og/pageImage.js +89 -0
- package/dist/features/page/CuratedPageContent.js +45 -32
- package/dist/features/page/DerivedPageContent.js +49 -22
- package/dist/features/page/SharedLayoutContent.js +26 -22
- package/dist/features/preview/CamoxPreview.js +176 -145
- package/dist/features/preview/components/AddBlockSheet.js +1 -0
- package/dist/features/preview/components/BlockActionsPopover.js +8 -6
- package/dist/features/preview/components/PageInfo.js +244 -264
- package/dist/features/preview/components/PageTree.js +63 -53
- package/dist/features/preview/components/PreviewToolbar.js +74 -85
- package/dist/features/preview/components/RecordCard.js +50 -34
- package/dist/features/preview/components/RecordCombobox.js +12 -5
- package/dist/features/preview/components/ReferenceFieldEditor.js +4 -2
- package/dist/features/preview/components/ReferenceListFieldEditor.js +24 -19
- package/dist/features/preview/components/RepeatableItemsList.js +62 -46
- package/dist/features/preview/components/SelectionEditor.js +3 -2
- package/dist/features/preview/components/useFieldWriter.js +2 -4
- package/dist/features/preview/components/useRecordView.js +2 -2
- package/dist/features/preview/entityName.js +11 -0
- package/dist/features/preview/pageRecord.js +17 -18
- package/dist/features/provider/CamoxProvider.js +8 -16
- package/dist/features/provider/CoreCamoxProvider.js +1 -6
- package/dist/features/provider/signInShortcut.js +60 -0
- package/dist/features/routes/pageRuntime.d.ts +15 -1
- package/dist/features/routes/pageRuntime.js +35 -38
- package/dist/features/runtime/RuntimeChrome.js +2 -2
- package/dist/features/runtime/breadcrumbs.js +68 -0
- package/dist/features/runtime/livePages.js +3 -2
- package/dist/features/runtime/pageApp.js +11 -39
- package/dist/features/runtime/pageGraph.js +92 -0
- package/dist/features/runtime/projectLogo.js +110 -0
- package/dist/features/runtime/runtime.d.ts +11 -6
- package/dist/features/runtime/runtime.js +278 -55
- package/dist/features/runtime/runtimeRoutes.d.ts +1 -0
- package/dist/features/runtime/runtimeRoutes.js +1 -0
- package/dist/features/runtime/structuredData.js +213 -0
- package/dist/features/studio/components/ChatSidebar.js +5 -5
- package/dist/features/studio/components/ProjectMenu.js +127 -100
- package/dist/features/studio/components/SocialProfilesDialog.js +342 -0
- package/dist/features/studio/components/ThreadMessages.js +2 -2
- package/dist/features/vite/blockBoilerplate.js +3 -2
- package/dist/features/vite/layoutGeneration.js +3 -2
- package/dist/features/vite/vite.js +1 -0
- package/dist/lib/queries.d.ts +4 -0
- package/dist/lib/queries.js +1 -0
- package/dist/lib/studio-reads.js +3 -1
- package/dist/package.js +1 -1
- package/dist/studio.css +1 -1
- package/package.json +5 -4
- package/skills/camox/references/block-definitions.md +105 -25
- package/skills/camox/references/layout-definitions.md +53 -17
- package/skills/camox/references/routed-layouts.md +17 -14
- 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
|
|
18
|
-
*
|
|
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:
|
|
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-
|
|
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-
|
|
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(
|
|
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
|
|
159
|
-
if ($[
|
|
160
|
-
|
|
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
|
-
$[
|
|
165
|
-
$[
|
|
166
|
-
} else
|
|
167
|
-
const
|
|
168
|
-
let
|
|
169
|
-
if ($[
|
|
170
|
-
|
|
171
|
-
href:
|
|
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]
|
|
185
|
-
t17 = /* @__PURE__ */
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
$[
|
|
190
|
-
$[
|
|
191
|
-
} else
|
|
192
|
-
const
|
|
193
|
-
let
|
|
194
|
-
if ($[
|
|
195
|
-
|
|
196
|
-
href:
|
|
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]
|
|
210
|
-
t21 = /* @__PURE__ */
|
|
211
|
-
|
|
212
|
-
|
|
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 ($[
|
|
219
|
-
t22 = /* @__PURE__ */ jsxs(
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
$[
|
|
225
|
-
$[
|
|
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(
|
|
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
|
-
|
|
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
|
|
249
|
-
if ($[
|
|
250
|
-
|
|
251
|
-
render:
|
|
258
|
+
let t27;
|
|
259
|
+
if ($[41] === Symbol.for("react.memo_cache_sentinel")) {
|
|
260
|
+
t27 = /* @__PURE__ */ jsxs(DropdownMenuItem, {
|
|
261
|
+
render: t25,
|
|
252
262
|
children: [
|
|
253
|
-
|
|
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
|
-
$[
|
|
262
|
-
} else
|
|
263
|
-
let
|
|
264
|
-
if ($[
|
|
265
|
-
|
|
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
|
-
|
|
283
|
+
t13,
|
|
274
284
|
t23,
|
|
275
|
-
|
|
285
|
+
t24,
|
|
286
|
+
t27
|
|
276
287
|
]
|
|
277
288
|
});
|
|
278
|
-
$[
|
|
279
|
-
$[
|
|
280
|
-
$[
|
|
281
|
-
} else
|
|
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 ($[
|
|
291
|
-
t29 = /* @__PURE__ */
|
|
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
|
-
$[
|
|
297
|
-
$[
|
|
298
|
-
$[
|
|
299
|
-
} else
|
|
300
|
-
let
|
|
301
|
-
if ($[
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|