@collabdt/core 0.0.54 → 0.0.55
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/components/AppSidebarContent.d.ts.map +1 -1
- package/dist/core/components/AppSidebarContent.js +29 -2
- package/dist/core/components/AppSidebarContent.js.map +1 -1
- package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.d.ts.map +1 -1
- package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js +152 -156
- package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js.map +1 -1
- package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
- package/dist/core/components/organizationConfig/src/organizationConfigContent.js +146 -150
- package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
- package/dist/core/components/support/BugReportDialog.d.ts +7 -0
- package/dist/core/components/support/BugReportDialog.d.ts.map +1 -0
- package/dist/core/components/support/BugReportDialog.js +117 -0
- package/dist/core/components/support/BugReportDialog.js.map +1 -0
- package/dist/core/components/support/FeatureRequestDialog.d.ts +8 -0
- package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -0
- package/dist/core/components/support/FeatureRequestDialog.js +116 -0
- package/dist/core/components/support/FeatureRequestDialog.js.map +1 -0
- package/dist/core/components/support/SupportMenu.d.ts +10 -0
- package/dist/core/components/support/SupportMenu.d.ts.map +1 -0
- package/dist/core/components/support/SupportMenu.js +78 -0
- package/dist/core/components/support/SupportMenu.js.map +1 -0
- package/dist/core/components/ui/Navbar.d.ts.map +1 -1
- package/dist/core/components/ui/Navbar.js +15 -23
- package/dist/core/components/ui/Navbar.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/utils/potreeLoader.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js +1 -1
- package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/components/support/BugReportDialog.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useTranslations } from \"next-intl\";\r\n\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n} from \"../ui/Dialog\";\r\n\r\nimport { Button } from \"../ui/Button\";\r\nimport { Textarea } from \"../ui/Textarea\";\r\nimport { Input } from \"../ui/Input\";\r\n\r\nimport * as LR from \"lucide-react\";\r\nexport function BugReportDialog({\r\n open,\r\n onOpenChange,\r\n onCaptureScreenshot,\r\n}: {\r\n open: boolean;\r\n onOpenChange: (v: boolean) => void;\r\n onCaptureScreenshot?: () => Promise<string | null>;\r\n}) {\r\n const t = useTranslations(\"supportDialog\");\r\n\r\n const [title, setTitle] = React.useState(\"\");\r\n const [description, setDescription] = React.useState(\"\");\r\n const [repro, setRepro] = React.useState(\"\");\r\n const [screenshot, setScreenshot] = React.useState<string | null>(null);\r\n\r\n const reset = () => {\r\n setTitle(\"\");\r\n setDescription(\"\");\r\n setRepro(\"\");\r\n setScreenshot(null);\r\n };\r\n\r\n const capture = async () => {\r\n if (!onCaptureScreenshot) return;\r\n const img = await onCaptureScreenshot();\r\n setScreenshot(img);\r\n };\r\n\r\n const submit = async () => {\r\n await fetch(\"/api/github-issue\", {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({\r\n title,\r\n description,\r\n type: \"bug\",\r\n labels: [\"bug\"],\r\n meta: {\r\n url: window.location.href,\r\n userAgent: navigator.userAgent,\r\n timestamp: new Date().toISOString(),\r\n viewer: \"Map\",\r\n },\r\n }),\r\n });\r\n\r\n reset();\r\n onOpenChange(false);\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onOpenChange={(v) => {\r\n onOpenChange(v);\r\n if (!v) reset();\r\n }}\r\n >\r\n <DialogContent className=\"sm:max-w-[520px]\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center gap-2\">\r\n <LR.Bug className=\"h-5 w-5\" />\r\n {t(\"bugTitle\")}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <div className=\"space-y-3\">\r\n <Input\r\n placeholder={t(\"bugTitle\")}\r\n value={title}\r\n onChange={(e) => setTitle(e.target.value)}\r\n />\r\n\r\n <Textarea\r\n placeholder={t(\"descriptionPlaceholder\")}\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n />\r\n\r\n <Textarea\r\n placeholder={t(\"reproPlaceholder\")}\r\n value={repro}\r\n onChange={(e) => setRepro(e.target.value)}\r\n />\r\n\r\n <div className=\"flex gap-2 items-center\"> \r\n <Button onClick={capture} variant=\"secondary\"> \r\n {t(\"captureScreenshot\")} \r\n </Button> \r\n {screenshot && ( \r\n <span className=\"text-sm text-muted-foreground\"> \r\n {t(\"screenshotAttached\")} \r\n </span> )} \r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2\">\r\n <Button\r\n variant=\"secondary\"\r\n onClick={() => onOpenChange(false)}\r\n >\r\n {t(\"cancel\")}\r\n </Button>\r\n\r\n <Button onClick={submit}>\r\n {t(\"submit\")}\r\n </Button>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
type Props = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare function FeatureRequestDialog({ open, onOpenChange }: Props): React.JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=FeatureRequestDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeatureRequestDialog.d.ts","sourceRoot":"","sources":["../../../../src/core/components/support/FeatureRequestDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,qBAoGjE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { useTranslations } from "next-intl";
|
|
5
|
+
import {
|
|
6
|
+
Dialog,
|
|
7
|
+
DialogContent,
|
|
8
|
+
DialogHeader,
|
|
9
|
+
DialogTitle
|
|
10
|
+
} from "../ui/Dialog";
|
|
11
|
+
import { Button } from "../ui/Button";
|
|
12
|
+
import { Input } from "../ui/Input";
|
|
13
|
+
import { Textarea } from "../ui/Textarea";
|
|
14
|
+
import * as LR from "lucide-react";
|
|
15
|
+
function FeatureRequestDialog({ open, onOpenChange }) {
|
|
16
|
+
const t = useTranslations("supportDialog");
|
|
17
|
+
const [title, setTitle] = React.useState("");
|
|
18
|
+
const [description, setDescription] = React.useState("");
|
|
19
|
+
const [loading, setLoading] = React.useState(false);
|
|
20
|
+
const reset = () => {
|
|
21
|
+
setTitle("");
|
|
22
|
+
setDescription("");
|
|
23
|
+
};
|
|
24
|
+
const submit = async () => {
|
|
25
|
+
if (!title.trim() || !description.trim()) return;
|
|
26
|
+
try {
|
|
27
|
+
setLoading(true);
|
|
28
|
+
await fetch("/api/github-issue", {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "Content-Type": "application/json" },
|
|
31
|
+
body: JSON.stringify({
|
|
32
|
+
title,
|
|
33
|
+
description,
|
|
34
|
+
type: "feature",
|
|
35
|
+
labels: ["feature"],
|
|
36
|
+
meta: {
|
|
37
|
+
url: window.location.href,
|
|
38
|
+
userAgent: navigator.userAgent,
|
|
39
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
40
|
+
viewer: "BIM"
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
reset();
|
|
45
|
+
onOpenChange(false);
|
|
46
|
+
} catch (err) {
|
|
47
|
+
console.error("Feature request failed:", err);
|
|
48
|
+
} finally {
|
|
49
|
+
setLoading(false);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return /* @__PURE__ */ jsx(
|
|
53
|
+
Dialog,
|
|
54
|
+
{
|
|
55
|
+
open,
|
|
56
|
+
onOpenChange: (v) => {
|
|
57
|
+
onOpenChange(v);
|
|
58
|
+
if (!v) reset();
|
|
59
|
+
},
|
|
60
|
+
children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-[520px]", children: [
|
|
61
|
+
/* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2", children: [
|
|
62
|
+
/* @__PURE__ */ jsx(LR.SquarePlus, { className: "h-5 w-5" }),
|
|
63
|
+
t("featureTitle")
|
|
64
|
+
] }) }),
|
|
65
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4 mt-2", children: [
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
Input,
|
|
68
|
+
{
|
|
69
|
+
placeholder: t("featureTitle"),
|
|
70
|
+
value: title,
|
|
71
|
+
onChange: (e) => setTitle(e.target.value)
|
|
72
|
+
}
|
|
73
|
+
),
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
Textarea,
|
|
76
|
+
{
|
|
77
|
+
placeholder: t("descriptionPlaceholder"),
|
|
78
|
+
value: description,
|
|
79
|
+
onChange: (e) => setDescription(e.target.value),
|
|
80
|
+
rows: 5
|
|
81
|
+
}
|
|
82
|
+
),
|
|
83
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground", children: [
|
|
84
|
+
" ",
|
|
85
|
+
t("wantToBuild"),
|
|
86
|
+
" ",
|
|
87
|
+
/* @__PURE__ */ jsx("a", { href: "https://docs.collabdt.org/docs/plugins/overview", target: "_blank", rel: "noreferrer", className: "underline hover:text-foreground", children: t("pluginDocumentation") })
|
|
88
|
+
] }),
|
|
89
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
90
|
+
/* @__PURE__ */ jsx(
|
|
91
|
+
Button,
|
|
92
|
+
{
|
|
93
|
+
variant: "secondary",
|
|
94
|
+
onClick: () => onOpenChange(false),
|
|
95
|
+
disabled: loading,
|
|
96
|
+
children: t("cancel")
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
/* @__PURE__ */ jsx(
|
|
100
|
+
Button,
|
|
101
|
+
{
|
|
102
|
+
onClick: submit,
|
|
103
|
+
disabled: !title.trim() || !description.trim() || loading,
|
|
104
|
+
children: loading ? "..." : t("submit")
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
] })
|
|
108
|
+
] })
|
|
109
|
+
] })
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
export {
|
|
114
|
+
FeatureRequestDialog
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=FeatureRequestDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/components/support/FeatureRequestDialog.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useTranslations } from \"next-intl\";\r\n\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogTitle,\r\n} from \"../ui/Dialog\";\r\n\r\nimport { Button } from \"../ui/Button\";\r\nimport { Input } from \"../ui/Input\";\r\nimport { Textarea } from \"../ui/Textarea\";\r\n\r\nimport * as LR from \"lucide-react\";\r\n\r\ntype Props = {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n};\r\n\r\nexport function FeatureRequestDialog({ open, onOpenChange }: Props) {\r\n const t = useTranslations(\"supportDialog\");\r\n\r\n const [title, setTitle] = React.useState(\"\");\r\n const [description, setDescription] = React.useState(\"\");\r\n const [loading, setLoading] = React.useState(false);\r\n\r\n const reset = () => {\r\n setTitle(\"\");\r\n setDescription(\"\");\r\n };\r\n\r\n const submit = async () => {\r\n if (!title.trim() || !description.trim()) return;\r\n\r\n try {\r\n setLoading(true);\r\n\r\n await fetch(\"/api/github-issue\", {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({\r\n title,\r\n description,\r\n type: \"feature\",\r\n labels: [\"feature\"],\r\n meta: {\r\n url: window.location.href,\r\n userAgent: navigator.userAgent,\r\n timestamp: new Date().toISOString(),\r\n viewer: \"BIM\",\r\n },\r\n }),\r\n });\r\n\r\n reset();\r\n onOpenChange(false);\r\n } catch (err) {\r\n console.error(\"Feature request failed:\", err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onOpenChange={(v) => {\r\n onOpenChange(v);\r\n if (!v) reset();\r\n }}\r\n >\r\n <DialogContent className=\"sm:max-w-[520px]\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center gap-2\">\r\n <LR.SquarePlus className=\"h-5 w-5\" />\r\n {t(\"featureTitle\")}\r\n </DialogTitle>\r\n </DialogHeader>\r\n\r\n <div className=\"space-y-4 mt-2\">\r\n <Input\r\n placeholder={t(\"featureTitle\")}\r\n value={title}\r\n onChange={(e) => setTitle(e.target.value)}\r\n />\r\n\r\n <Textarea\r\n placeholder={t(\"descriptionPlaceholder\")}\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n rows={5}\r\n />\r\n\r\n <div className=\"text-sm text-muted-foreground\"> {t(\"wantToBuild\")}{\" \"} \r\n <a href=\"https://docs.collabdt.org/docs/plugins/overview\" target=\"_blank\" rel=\"noreferrer\" className=\"underline hover:text-foreground\" > \r\n {t(\"pluginDocumentation\")}\r\n </a> \r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2\">\r\n <Button\r\n variant=\"secondary\"\r\n onClick={() => onOpenChange(false)}\r\n disabled={loading}\r\n >\r\n {t(\"cancel\")}\r\n </Button>\r\n\r\n <Button\r\n onClick={submit}\r\n disabled={!title.trim() || !description.trim() || loading}\r\n >\r\n {loading ? \"...\" : t(\"submit\")}\r\n </Button>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
type Props = {
|
|
3
|
+
item: any;
|
|
4
|
+
isCollapsed: boolean;
|
|
5
|
+
onOpenBug: () => void;
|
|
6
|
+
onOpenFeature: () => void;
|
|
7
|
+
};
|
|
8
|
+
export declare function SupportMenu({ item, isCollapsed, onOpenBug, onOpenFeature, }: Props): React.JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=SupportMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupportMenu.d.ts","sourceRoot":"","sources":["../../../../src/core/components/support/SupportMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,GAAG,CAAC;IACV,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,WAAW,EACX,SAAS,EACT,aAAa,GACd,EAAE,KAAK,qBA2DP"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as LR from "lucide-react";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { useTranslations } from "next-intl";
|
|
5
|
+
import {
|
|
6
|
+
DropdownMenu,
|
|
7
|
+
DropdownMenuTrigger,
|
|
8
|
+
DropdownMenuContent,
|
|
9
|
+
DropdownMenuItem
|
|
10
|
+
} from "../ui/DropdownMenu";
|
|
11
|
+
import { SidebarMenuButton } from "../ui/Sidebar";
|
|
12
|
+
function SupportMenu({
|
|
13
|
+
item,
|
|
14
|
+
isCollapsed,
|
|
15
|
+
onOpenBug,
|
|
16
|
+
onOpenFeature
|
|
17
|
+
}) {
|
|
18
|
+
const t = useTranslations("supportMenu");
|
|
19
|
+
const [menuOpen, setMenuOpen] = React.useState(false);
|
|
20
|
+
const openDialogAfterMenuCloses = (callback) => {
|
|
21
|
+
setMenuOpen(false);
|
|
22
|
+
requestAnimationFrame(() => {
|
|
23
|
+
callback();
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ jsxs(DropdownMenu, { open: menuOpen, onOpenChange: setMenuOpen, children: [
|
|
27
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
28
|
+
SidebarMenuButton,
|
|
29
|
+
{
|
|
30
|
+
title: item.tooltip,
|
|
31
|
+
className: `text-xs flex items-center gap-2 w-full ${isCollapsed ? "justify-center p-2" : "justify-start p-2"}`,
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsx(LR.LifeBuoy, { className: "h-4 w-4" }),
|
|
34
|
+
!isCollapsed && /* @__PURE__ */ jsx("span", { children: item.title })
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
) }),
|
|
38
|
+
/* @__PURE__ */ jsxs(DropdownMenuContent, { align: "start", children: [
|
|
39
|
+
/* @__PURE__ */ jsxs(
|
|
40
|
+
DropdownMenuItem,
|
|
41
|
+
{
|
|
42
|
+
onSelect: () => window.open(
|
|
43
|
+
"mailto:support@collabdt.org?subject=Support Request",
|
|
44
|
+
"_self"
|
|
45
|
+
),
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ jsx(LR.Send, { className: "mr-2 h-4 w-4" }),
|
|
48
|
+
t("contactTeam")
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
),
|
|
52
|
+
/* @__PURE__ */ jsxs(
|
|
53
|
+
DropdownMenuItem,
|
|
54
|
+
{
|
|
55
|
+
onSelect: () => openDialogAfterMenuCloses(onOpenFeature),
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ jsx(LR.SquarePlus, { className: "mr-2 h-4 w-4" }),
|
|
58
|
+
t("suggestFeature")
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
/* @__PURE__ */ jsxs(
|
|
63
|
+
DropdownMenuItem,
|
|
64
|
+
{
|
|
65
|
+
onSelect: () => openDialogAfterMenuCloses(onOpenBug),
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ jsx(LR.Bug, { className: "mr-2 h-4 w-4" }),
|
|
68
|
+
t("reportBug")
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
] })
|
|
73
|
+
] });
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
SupportMenu
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=SupportMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/components/support/SupportMenu.tsx"],"sourcesContent":["import * as LR from \"lucide-react\";\r\nimport * as React from \"react\";\r\nimport { useTranslations } from \"next-intl\";\r\n\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n} from \"../ui/DropdownMenu\";\r\n\r\nimport { SidebarMenuButton } from \"../ui/Sidebar\";\r\n\r\ntype Props = {\r\n item: any;\r\n isCollapsed: boolean;\r\n onOpenBug: () => void;\r\n onOpenFeature: () => void;\r\n};\r\n\r\nexport function SupportMenu({\r\n item,\r\n isCollapsed,\r\n onOpenBug,\r\n onOpenFeature,\r\n}: Props) {\r\n const t = useTranslations(\"supportMenu\");\r\n const [menuOpen, setMenuOpen] = React.useState(false);\r\n\r\n const openDialogAfterMenuCloses = (callback: () => void) => {\r\n setMenuOpen(false);\r\n\r\n requestAnimationFrame(() => {\r\n callback();\r\n });\r\n };\r\n\r\n return (\r\n <DropdownMenu open={menuOpen} onOpenChange={setMenuOpen}>\r\n <DropdownMenuTrigger asChild>\r\n <SidebarMenuButton\r\n title={item.tooltip}\r\n className={`text-xs flex items-center gap-2 w-full ${\r\n isCollapsed ? \"justify-center p-2\" : \"justify-start p-2\"\r\n }`}\r\n >\r\n <LR.LifeBuoy className=\"h-4 w-4\" />\r\n {!isCollapsed && <span>{item.title}</span>}\r\n </SidebarMenuButton>\r\n </DropdownMenuTrigger>\r\n\r\n <DropdownMenuContent align=\"start\">\r\n <DropdownMenuItem\r\n onSelect={() =>\r\n window.open(\r\n \"mailto:support@collabdt.org?subject=Support Request\",\r\n \"_self\"\r\n )\r\n }\r\n >\r\n <LR.Send className=\"mr-2 h-4 w-4\" />\r\n {t(\"contactTeam\")}\r\n </DropdownMenuItem>\r\n\r\n <DropdownMenuItem\r\n onSelect={() =>\r\n openDialogAfterMenuCloses(onOpenFeature)\r\n }\r\n >\r\n <LR.SquarePlus className=\"mr-2 h-4 w-4\" />\r\n {t(\"suggestFeature\")}\r\n </DropdownMenuItem>\r\n\r\n <DropdownMenuItem\r\n onSelect={() =>\r\n openDialogAfterMenuCloses(onOpenBug)\r\n }\r\n >\r\n <LR.Bug className=\"mr-2 h-4 w-4\" />\r\n {t(\"reportBug\")}\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n}\r\n\r\n"],"mappings":"AAwCQ,SAME,KANF;AAxCR,YAAY,QAAQ;AACpB,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAEhC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,yBAAyB;AAS3B,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,IAAI,gBAAgB,aAAa;AACvC,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,KAAK;AAEpD,QAAM,4BAA4B,CAAC,aAAyB;AAC1D,gBAAY,KAAK;AAEjB,0BAAsB,MAAM;AAC1B,eAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SACE,qBAAC,gBAAa,MAAM,UAAU,cAAc,aAC1C;AAAA,wBAAC,uBAAoB,SAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,KAAK;AAAA,QACZ,WAAW,0CACT,cAAc,uBAAuB,mBACvC;AAAA,QAEA;AAAA,8BAAC,GAAG,UAAH,EAAY,WAAU,WAAU;AAAA,UAChC,CAAC,eAAe,oBAAC,UAAM,eAAK,OAAM;AAAA;AAAA;AAAA,IACrC,GACF;AAAA,IAEA,qBAAC,uBAAoB,OAAM,SACzB;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MACR,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,UAGF;AAAA,gCAAC,GAAG,MAAH,EAAQ,WAAU,gBAAe;AAAA,YACjC,EAAE,aAAa;AAAA;AAAA;AAAA,MAClB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MACR,0BAA0B,aAAa;AAAA,UAGzC;AAAA,gCAAC,GAAG,YAAH,EAAc,WAAU,gBAAe;AAAA,YACvC,EAAE,gBAAgB;AAAA;AAAA;AAAA,MACrB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MACR,0BAA0B,SAAS;AAAA,UAGrC;AAAA,gCAAC,GAAG,KAAH,EAAO,WAAU,gBAAe;AAAA,YAChC,EAAE,WAAW;AAAA;AAAA;AAAA,MAChB;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Navbar.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/Navbar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Navbar.d.ts","sourceRoot":"","sources":["../../../../src/core/components/ui/Navbar.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IACvB,MAAM,EAAE,QAAQ,CAAA;IAChB,UAAU,CAAC,EAAE,GAAG,CAAA;IAChB,IAAI,EAAE,GAAG,CAAA;IACT,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,aAAa,EACb,KAAK,EACL,MAAM,EACN,UAAU,EACV,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,cAAqB,GACtB,EAAE,WAAW,+BA8Kb"}
|
|
@@ -6,7 +6,6 @@ import { useTranslations } from "next-intl";
|
|
|
6
6
|
import Link from "next/link";
|
|
7
7
|
import { useState, useEffect } from "react";
|
|
8
8
|
import { Button } from "./Button";
|
|
9
|
-
import LanguageToggle from "./LanguageToggle";
|
|
10
9
|
import { CdtIcon } from "./Icons/CdtIcon";
|
|
11
10
|
import { Language } from "../../types/dbTypes";
|
|
12
11
|
function Navbar({
|
|
@@ -21,7 +20,6 @@ function Navbar({
|
|
|
21
20
|
showNavigation = true
|
|
22
21
|
}) {
|
|
23
22
|
const tNav = useTranslations("HomePage.nav");
|
|
24
|
-
const tHero = useTranslations("HomePage.hero");
|
|
25
23
|
const nextLocale = locale === Language.En ? Language.Fr : Language.En;
|
|
26
24
|
const [onMobile, setOnMobile] = useState(false);
|
|
27
25
|
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
|
|
@@ -89,7 +87,6 @@ function Navbar({
|
|
|
89
87
|
)) }),
|
|
90
88
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-shrink-0 ml-auto", children: [
|
|
91
89
|
/* @__PURE__ */ jsxs("div", { className: `${onMobile ? "hidden" : "flex"} items-center gap-3`, children: [
|
|
92
|
-
/* @__PURE__ */ jsx(LanguageToggle, { language: nextLocale, onToggle: onToggleLanguage }),
|
|
93
90
|
/* @__PURE__ */ jsx(
|
|
94
91
|
Button,
|
|
95
92
|
{
|
|
@@ -106,8 +103,7 @@ function Navbar({
|
|
|
106
103
|
{
|
|
107
104
|
size: "sm",
|
|
108
105
|
className: "btn-nav-cta rounded-md px-5 text-sm",
|
|
109
|
-
asChild: true
|
|
110
|
-
children: /* @__PURE__ */ jsx("a", { href: "/cdt", target: "_blank", rel: "noopener noreferrer", children: tHero("platformButton") })
|
|
106
|
+
asChild: true
|
|
111
107
|
}
|
|
112
108
|
)
|
|
113
109
|
] }),
|
|
@@ -150,29 +146,25 @@ function Navbar({
|
|
|
150
146
|
},
|
|
151
147
|
section
|
|
152
148
|
)),
|
|
153
|
-
/* @__PURE__ */
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
),
|
|
167
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(LanguageToggle, { language: nextLocale, onToggle: onToggleLanguage }) })
|
|
168
|
-
] }),
|
|
149
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 px-4 py-2 pt-3", children: /* @__PURE__ */ jsxs(
|
|
150
|
+
Button,
|
|
151
|
+
{
|
|
152
|
+
variant: "ghost",
|
|
153
|
+
onClick: onToggleTheme,
|
|
154
|
+
className: "flex-1 p-2 rounded-lg transition-colors flex items-center justify-center gap-2",
|
|
155
|
+
style: { color: "var(--hp-on-surface-variant)" },
|
|
156
|
+
children: [
|
|
157
|
+
theme === "dark" ? /* @__PURE__ */ jsx(Sun, { className: "w-4 h-4" }) : /* @__PURE__ */ jsx(Moon, { className: "w-4 h-4" }),
|
|
158
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm", children: theme === "dark" ? "Light" : "Dark" })
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
) }),
|
|
169
162
|
/* @__PURE__ */ jsx("div", { className: "pt-2 px-1", children: /* @__PURE__ */ jsx(
|
|
170
163
|
Button,
|
|
171
164
|
{
|
|
172
165
|
size: "sm",
|
|
173
166
|
className: "btn-sovereign w-full rounded-md",
|
|
174
|
-
asChild: true
|
|
175
|
-
children: /* @__PURE__ */ jsx("a", { href: "/cdt", target: "_blank", rel: "noopener noreferrer", children: tHero("platformButton") })
|
|
167
|
+
asChild: true
|
|
176
168
|
}
|
|
177
169
|
) })
|
|
178
170
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/components/ui/Navbar.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { Moon, Sun, Menu, X } from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport Link from 'next/link'\r\nimport { useState, useEffect } from 'react'\r\nimport { Button } from './Button'\r\nimport LanguageToggle from './LanguageToggle'\r\nimport { CdtIcon } from './Icons/CdtIcon'\r\nimport { Language } from '../../types/dbTypes'\r\n\r\ninterface NavbarProps {\r\n activeSection: string\r\n theme: 'light' | 'dark'\r\n locale: Language\r\n navOpacity?: any\r\n navY: any\r\n onToggleTheme: () => void\r\n onToggleLanguage: () => void\r\n onScrollToSection: (id: string) => void\r\n showNavigation?: boolean\r\n}\r\n\r\nexport default function Navbar({\r\n activeSection,\r\n theme,\r\n locale,\r\n navOpacity,\r\n navY,\r\n onToggleTheme,\r\n onToggleLanguage,\r\n onScrollToSection,\r\n showNavigation = true,\r\n}: NavbarProps) {\r\n const tNav = useTranslations('HomePage.nav')\r\n const tHero = useTranslations('HomePage.hero')\r\n const nextLocale = locale === Language.En ? Language.Fr : Language.En\r\n const [onMobile, setOnMobile] = useState(false)\r\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\r\n const [currentSection, setCurrentSection] = useState(activeSection)\r\n\r\n useEffect(() => {\r\n const checkMobile = () => setOnMobile(window.innerWidth < 640)\r\n checkMobile()\r\n window.addEventListener('resize', checkMobile)\r\n return () => window.removeEventListener('resize', checkMobile)\r\n }, [])\r\n\r\n useEffect(() => {\r\n setCurrentSection(activeSection)\r\n }, [activeSection])\r\n\r\n return (\r\n <motion.nav\r\n style={{ y: navY }}\r\n className=\"glass-nav fixed top-0 left-0 right-0 z-50\"\r\n >\r\n <div className=\"container mx-auto px-6 py-4\">\r\n <div className=\"flex items-center gap-6\">\r\n {/* Logo */}\r\n <motion.div\r\n initial={{ opacity: 0, x: -20 }}\r\n animate={{ opacity: 1, x: 0 }}\r\n className=\"flex-shrink-0\"\r\n >\r\n <Link href=\"#hero\" className=\"flex items-center gap-3 group\">\r\n <CdtIcon className=\"w-8 h-8\" />\r\n <span\r\n className=\"font-display font-bold tracking-tight max-xs:text-sm max-xs:text-nowrap transition-colors duration-200\"\r\n style={{ color: 'var(--hp-on-surface)' }}\r\n >\r\n {onMobile ? 'CDT' : 'Collab Digital Twins'}\r\n </span>\r\n </Link>\r\n </motion.div>\r\n\r\n {/* Nav links */}\r\n {showNavigation && (\r\n <div className={`${onMobile ? 'hidden' : 'flex'} items-center gap-1 flex-1 justify-center`}>\r\n {['about', 'contributors', 'contact'].map((section) => (\r\n <button\r\n key={section}\r\n onClick={() => {\r\n setCurrentSection(section)\r\n onScrollToSection(section)\r\n }}\r\n className=\"relative px-4 py-2 rounded-lg text-sm font-medium transition-all capitalize font-display\"\r\n style={{\r\n color: currentSection === section\r\n ? 'var(--hp-primary-container)'\r\n : 'var(--hp-on-surface-variant)',\r\n fontWeight: currentSection === section ? 700 : 500,\r\n }}\r\n >\r\n {tNav(section as any)}\r\n {currentSection === section && (\r\n <motion.div\r\n layoutId=\"activeSection\"\r\n className=\"absolute -bottom-[17px] left-2 right-2 h-[2px]\"\r\n style={{ background: 'var(--hp-primary-container)' }}\r\n />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Right actions */}\r\n <div className=\"flex items-center gap-3 flex-shrink-0 ml-auto\">\r\n <div className={`${onMobile ? 'hidden' : 'flex'} items-center gap-3`}>\r\n <LanguageToggle language={nextLocale} onToggle={onToggleLanguage} />\r\n\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onToggleTheme}\r\n className=\"p-2 rounded-lg transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n aria-label=\"Toggle theme\"\r\n >\r\n {theme === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\r\n </Button>\r\n\r\n <Button\r\n size=\"sm\"\r\n className=\"btn-nav-cta rounded-md px-5 text-sm\"\r\n asChild\r\n >\r\n <a href=\"/cdt\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n {tHero('platformButton')}\r\n </a>\r\n </Button>\r\n </div>\r\n\r\n {/* Mobile toggle */}\r\n <Button\r\n variant=\"ghost\"\r\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\r\n className=\"lg:hidden p-2 rounded-lg transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n aria-label=\"Toggle menu\"\r\n >\r\n {mobileMenuOpen ? <X className=\"w-5 h-5\" /> : <Menu className=\"w-5 h-5\" />}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Mobile menu */}\r\n <AnimatePresence>\r\n {mobileMenuOpen && (\r\n <motion.div\r\n initial={{ opacity: 0, height: 0 }}\r\n animate={{ opacity: 1, height: 'auto' }}\r\n exit={{ opacity: 0, height: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"lg:hidden overflow-hidden\"\r\n >\r\n <div className=\"py-4 space-y-1 mt-4\" style={{ borderTop: '1px solid rgba(255,255,255,0.04)' }}>\r\n {showNavigation &&\r\n ['about', 'contributors', 'contact'].map((section) => (\r\n <button\r\n key={section}\r\n onClick={() => {\r\n setCurrentSection(section)\r\n onScrollToSection(section)\r\n setMobileMenuOpen(false)\r\n }}\r\n className=\"block w-full text-left px-4 py-2.5 rounded-lg text-sm font-medium transition-all capitalize font-display\"\r\n style={{\r\n color: currentSection === section\r\n ? 'var(--hp-primary-container)'\r\n : 'var(--hp-on-surface-variant)',\r\n background: currentSection === section\r\n ? 'rgba(239, 145, 97, 0.08)'\r\n : 'transparent',\r\n }}\r\n >\r\n {tNav(section as any)}\r\n </button>\r\n ))}\r\n\r\n <div className=\"flex items-center gap-2 px-4 py-2 pt-3\">\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onToggleTheme}\r\n className=\"flex-1 p-2 rounded-lg transition-colors flex items-center justify-center gap-2\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {theme === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\r\n <span className=\"text-sm\">{theme === 'dark' ? 'Light' : 'Dark'}</span>\r\n </Button>\r\n <div className=\"flex-1\">\r\n <LanguageToggle language={nextLocale} onToggle={onToggleLanguage} />\r\n </div>\r\n </div>\r\n\r\n <div className=\"pt-2 px-1\">\r\n <Button\r\n size=\"sm\"\r\n className=\"btn-sovereign w-full rounded-md\"\r\n asChild\r\n >\r\n <a href=\"/cdt\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n {tHero('platformButton')}\r\n </a>\r\n </Button>\r\n </div>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </motion.nav>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/components/ui/Navbar.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport { motion, AnimatePresence } from 'framer-motion'\r\nimport { Moon, Sun, Menu, X } from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport Link from 'next/link'\r\nimport { useState, useEffect } from 'react'\r\nimport { Button } from './Button'\r\nimport { CdtIcon } from './Icons/CdtIcon'\r\nimport { Language } from '../../types/dbTypes'\r\n\r\ninterface NavbarProps {\r\n activeSection: string\r\n theme: 'light' | 'dark'\r\n locale: Language\r\n navOpacity?: any\r\n navY: any\r\n onToggleTheme: () => void\r\n onToggleLanguage: () => void\r\n onScrollToSection: (id: string) => void\r\n showNavigation?: boolean\r\n}\r\n\r\nexport default function Navbar({\r\n activeSection,\r\n theme,\r\n locale,\r\n navOpacity,\r\n navY,\r\n onToggleTheme,\r\n onToggleLanguage,\r\n onScrollToSection,\r\n showNavigation = true,\r\n}: NavbarProps) {\r\n const tNav = useTranslations('HomePage.nav')\r\n // const tHero = useTranslations('HomePage.hero')\r\n const nextLocale = locale === Language.En ? Language.Fr : Language.En\r\n const [onMobile, setOnMobile] = useState(false)\r\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\r\n const [currentSection, setCurrentSection] = useState(activeSection)\r\n\r\n useEffect(() => {\r\n const checkMobile = () => setOnMobile(window.innerWidth < 640)\r\n checkMobile()\r\n window.addEventListener('resize', checkMobile)\r\n return () => window.removeEventListener('resize', checkMobile)\r\n }, [])\r\n\r\n useEffect(() => {\r\n setCurrentSection(activeSection)\r\n }, [activeSection])\r\n\r\n return (\r\n <motion.nav\r\n style={{ y: navY }}\r\n className=\"glass-nav fixed top-0 left-0 right-0 z-50\"\r\n >\r\n <div className=\"container mx-auto px-6 py-4\">\r\n <div className=\"flex items-center gap-6\">\r\n {/* Logo */}\r\n <motion.div\r\n initial={{ opacity: 0, x: -20 }}\r\n animate={{ opacity: 1, x: 0 }}\r\n className=\"flex-shrink-0\"\r\n >\r\n <Link href=\"#hero\" className=\"flex items-center gap-3 group\">\r\n <CdtIcon className=\"w-8 h-8\" />\r\n <span\r\n className=\"font-display font-bold tracking-tight max-xs:text-sm max-xs:text-nowrap transition-colors duration-200\"\r\n style={{ color: 'var(--hp-on-surface)' }}\r\n >\r\n {onMobile ? 'CDT' : 'Collab Digital Twins'}\r\n </span>\r\n </Link>\r\n </motion.div>\r\n\r\n {/* Nav links */}\r\n {showNavigation && (\r\n <div className={`${onMobile ? 'hidden' : 'flex'} items-center gap-1 flex-1 justify-center`}>\r\n {['about', 'contributors', 'contact'].map((section) => (\r\n <button\r\n key={section}\r\n onClick={() => {\r\n setCurrentSection(section)\r\n onScrollToSection(section)\r\n }}\r\n className=\"relative px-4 py-2 rounded-lg text-sm font-medium transition-all capitalize font-display\"\r\n style={{\r\n color: currentSection === section\r\n ? 'var(--hp-primary-container)'\r\n : 'var(--hp-on-surface-variant)',\r\n fontWeight: currentSection === section ? 700 : 500,\r\n }}\r\n >\r\n {tNav(section as any)}\r\n {currentSection === section && (\r\n <motion.div\r\n layoutId=\"activeSection\"\r\n className=\"absolute -bottom-[17px] left-2 right-2 h-[2px]\"\r\n style={{ background: 'var(--hp-primary-container)' }}\r\n />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Right actions */}\r\n <div className=\"flex items-center gap-3 flex-shrink-0 ml-auto\">\r\n <div className={`${onMobile ? 'hidden' : 'flex'} items-center gap-3`}>\r\n \r\n\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onToggleTheme}\r\n className=\"p-2 rounded-lg transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n aria-label=\"Toggle theme\"\r\n >\r\n {theme === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\r\n </Button>\r\n\r\n <Button\r\n size=\"sm\"\r\n className=\"btn-nav-cta rounded-md px-5 text-sm\"\r\n asChild\r\n >\r\n \r\n </Button>\r\n </div>\r\n\r\n {/* Mobile toggle */}\r\n <Button\r\n variant=\"ghost\"\r\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\r\n className=\"lg:hidden p-2 rounded-lg transition-colors\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n aria-label=\"Toggle menu\"\r\n >\r\n {mobileMenuOpen ? <X className=\"w-5 h-5\" /> : <Menu className=\"w-5 h-5\" />}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Mobile menu */}\r\n <AnimatePresence>\r\n {mobileMenuOpen && (\r\n <motion.div\r\n initial={{ opacity: 0, height: 0 }}\r\n animate={{ opacity: 1, height: 'auto' }}\r\n exit={{ opacity: 0, height: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"lg:hidden overflow-hidden\"\r\n >\r\n <div className=\"py-4 space-y-1 mt-4\" style={{ borderTop: '1px solid rgba(255,255,255,0.04)' }}>\r\n {showNavigation &&\r\n ['about', 'contributors', 'contact'].map((section) => (\r\n <button\r\n key={section}\r\n onClick={() => {\r\n setCurrentSection(section)\r\n onScrollToSection(section)\r\n setMobileMenuOpen(false)\r\n }}\r\n className=\"block w-full text-left px-4 py-2.5 rounded-lg text-sm font-medium transition-all capitalize font-display\"\r\n style={{\r\n color: currentSection === section\r\n ? 'var(--hp-primary-container)'\r\n : 'var(--hp-on-surface-variant)',\r\n background: currentSection === section\r\n ? 'rgba(239, 145, 97, 0.08)'\r\n : 'transparent',\r\n }}\r\n >\r\n {tNav(section as any)}\r\n </button>\r\n ))}\r\n\r\n <div className=\"flex items-center gap-2 px-4 py-2 pt-3\">\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onToggleTheme}\r\n className=\"flex-1 p-2 rounded-lg transition-colors flex items-center justify-center gap-2\"\r\n style={{ color: 'var(--hp-on-surface-variant)' }}\r\n >\r\n {theme === 'dark' ? <Sun className=\"w-4 h-4\" /> : <Moon className=\"w-4 h-4\" />}\r\n <span className=\"text-sm\">{theme === 'dark' ? 'Light' : 'Dark'}</span>\r\n </Button>\r\n \r\n </div>\r\n\r\n <div className=\"pt-2 px-1\">\r\n <Button\r\n size=\"sm\"\r\n className=\"btn-sovereign w-full rounded-md\"\r\n asChild\r\n >\r\n \r\n </Button>\r\n </div>\r\n </div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </div>\r\n </motion.nav>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"potreeLoader.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/pointcloud/utils/potreeLoader.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"potreeLoader.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/pointcloud/utils/potreeLoader.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,iBAYrC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,QAInC;AAGD,wBAAsB,aAAa,kBAyBlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/pointcloud/utils/potreeLoader.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nexport function loadScript(src: string) {\r\n return new Promise<void>((resolve, reject) => {\r\n const s = document.createElement('script');\r\n s.src = src; s.async = false; s.onload = () => resolve(); s.onerror = reject;\r\n document.head.appendChild(s);\r\n });\r\n}\r\n\r\nexport function loadCss(href: string) {\r\n const l = document.createElement('link');\r\n l.rel = 'stylesheet'; l.href = href;\r\n document.head.appendChild(l);\r\n}\r\n\r\n\r\nexport async function loadAllAssets() {\r\n const LIB_PATH = \"/vendors/potree\"\r\n\r\n //load CSS in parralel\r\n loadCss(`${LIB_PATH}/jquery-ui/jquery-ui.min.css`);\r\n loadCss(`${LIB_PATH}/openlayers3/ol.css`);\r\n loadCss(`${LIB_PATH}/spectrum/spectrum.css`);\r\n loadCss(`${LIB_PATH}/jstree/themes/mixed/style.css`);\r\n\r\n //load scripts in order to avoid error\r\n await loadScript(`${LIB_PATH}/jquery/jquery-3.1.1.min.js`);\r\n await loadScript(`${LIB_PATH}/spectrum/spectrum.js`);\r\n await loadScript(`${LIB_PATH}/jquery-ui/jquery-ui.min.js`);\r\n await loadScript(`${LIB_PATH}/other/BinaryHeap.js`);\r\n await loadScript(`${LIB_PATH}/tween/tween.min.js`);\r\n await loadScript(`${LIB_PATH}/d3/d3.js`);\r\n await loadScript(`${LIB_PATH}/proj4/proj4.js`);\r\n await loadScript(`${LIB_PATH}/openlayers3/ol.js`);\r\n await loadScript(`${LIB_PATH}/i18next/i18next.js`);\r\n await loadScript(`${LIB_PATH}/jstree/jstree.js`);\r\n await loadScript(`${LIB_PATH}/potree/potree.js`);\r\n await loadScript(`${LIB_PATH}/plasio/js/laslaz.js`);\r\n\r\n const Potree = (window as any).Potree;\r\n if (!Potree) throw new Error('Potree failed to initialize');\r\n}"],"mappings":"AAGO,SAAS,WAAW,KAAa;AACtC,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,IAAI,SAAS,cAAc,QAAQ;AACzC,MAAE,MAAM;
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/pointcloud/utils/potreeLoader.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nexport function loadScript(src: string) {\r\n return new Promise<void>((resolve, reject) => {\r\n const s = document.createElement('script');\r\n s.src = new URL(src, window.location.href).href; // ← ensure absolute\r\n s.async = false;\r\n s.onload = () => resolve();\r\n s.onerror = reject;\r\n document.head.appendChild(s);\r\n\r\n // s.src = src; s.async = false; s.onload = () => resolve(); s.onerror = reject;\r\n // document.head.appendChild(s);\r\n });\r\n}\r\n\r\nexport function loadCss(href: string) {\r\n const l = document.createElement('link');\r\n l.rel = 'stylesheet'; l.href = href;\r\n document.head.appendChild(l);\r\n}\r\n\r\n\r\nexport async function loadAllAssets() {\r\n const LIB_PATH = \"/vendors/potree\"\r\n\r\n //load CSS in parralel\r\n loadCss(`${LIB_PATH}/jquery-ui/jquery-ui.min.css`);\r\n loadCss(`${LIB_PATH}/openlayers3/ol.css`);\r\n loadCss(`${LIB_PATH}/spectrum/spectrum.css`);\r\n loadCss(`${LIB_PATH}/jstree/themes/mixed/style.css`);\r\n\r\n //load scripts in order to avoid error\r\n await loadScript(`${LIB_PATH}/jquery/jquery-3.1.1.min.js`);\r\n await loadScript(`${LIB_PATH}/spectrum/spectrum.js`);\r\n await loadScript(`${LIB_PATH}/jquery-ui/jquery-ui.min.js`);\r\n await loadScript(`${LIB_PATH}/other/BinaryHeap.js`);\r\n await loadScript(`${LIB_PATH}/tween/tween.min.js`);\r\n await loadScript(`${LIB_PATH}/d3/d3.js`);\r\n await loadScript(`${LIB_PATH}/proj4/proj4.js`);\r\n await loadScript(`${LIB_PATH}/openlayers3/ol.js`);\r\n await loadScript(`${LIB_PATH}/i18next/i18next.js`);\r\n await loadScript(`${LIB_PATH}/jstree/jstree.js`);\r\n await loadScript(`${LIB_PATH}/potree/potree.js`);\r\n await loadScript(`${LIB_PATH}/plasio/js/laslaz.js`);\r\n\r\n const Potree = (window as any).Potree;\r\n if (!Potree) throw new Error('Potree failed to initialize');\r\n}"],"mappings":"AAGO,SAAS,WAAW,KAAa;AACtC,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,IAAI,SAAS,cAAc,QAAQ;AACzC,MAAE,MAAM,IAAI,IAAI,KAAK,OAAO,SAAS,IAAI,EAAE;AAC3C,MAAE,QAAQ;AACV,MAAE,SAAS,MAAM,QAAQ;AACzB,MAAE,UAAU;AACZ,aAAS,KAAK,YAAY,CAAC;AAAA,EAI7B,CAAC;AACH;AAEO,SAAS,QAAQ,MAAc;AACpC,QAAM,IAAI,SAAS,cAAc,MAAM;AACvC,IAAE,MAAM;AAAc,IAAE,OAAO;AAC/B,WAAS,KAAK,YAAY,CAAC;AAC7B;AAGA,eAAsB,gBAAgB;AAClC,QAAM,WAAW;AAGjB,UAAQ,GAAG,QAAQ,8BAA8B;AACjD,UAAQ,GAAG,QAAQ,qBAAqB;AACxC,UAAQ,GAAG,QAAQ,wBAAwB;AAC3C,UAAQ,GAAG,QAAQ,gCAAgC;AAGnD,QAAM,WAAW,GAAG,QAAQ,6BAA6B;AACzD,QAAM,WAAW,GAAG,QAAQ,uBAAuB;AACnD,QAAM,WAAW,GAAG,QAAQ,6BAA6B;AACzD,QAAM,WAAW,GAAG,QAAQ,sBAAsB;AAClD,QAAM,WAAW,GAAG,QAAQ,qBAAqB;AACjD,QAAM,WAAW,GAAG,QAAQ,WAAW;AACvC,QAAM,WAAW,GAAG,QAAQ,iBAAiB;AAC7C,QAAM,WAAW,GAAG,QAAQ,oBAAoB;AAChD,QAAM,WAAW,GAAG,QAAQ,qBAAqB;AACjD,QAAM,WAAW,GAAG,QAAQ,mBAAmB;AAC/C,QAAM,WAAW,GAAG,QAAQ,mBAAmB;AAC/C,QAAM,WAAW,GAAG,QAAQ,sBAAsB;AAElD,QAAM,SAAU,OAAe;AAC/B,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6BAA6B;AAC9D;","names":[]}
|