@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.
Files changed (28) hide show
  1. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  2. package/dist/core/components/AppSidebarContent.js +29 -2
  3. package/dist/core/components/AppSidebarContent.js.map +1 -1
  4. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.d.ts.map +1 -1
  5. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js +152 -156
  6. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js.map +1 -1
  7. package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
  8. package/dist/core/components/organizationConfig/src/organizationConfigContent.js +146 -150
  9. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  10. package/dist/core/components/support/BugReportDialog.d.ts +7 -0
  11. package/dist/core/components/support/BugReportDialog.d.ts.map +1 -0
  12. package/dist/core/components/support/BugReportDialog.js +117 -0
  13. package/dist/core/components/support/BugReportDialog.js.map +1 -0
  14. package/dist/core/components/support/FeatureRequestDialog.d.ts +8 -0
  15. package/dist/core/components/support/FeatureRequestDialog.d.ts.map +1 -0
  16. package/dist/core/components/support/FeatureRequestDialog.js +116 -0
  17. package/dist/core/components/support/FeatureRequestDialog.js.map +1 -0
  18. package/dist/core/components/support/SupportMenu.d.ts +10 -0
  19. package/dist/core/components/support/SupportMenu.d.ts.map +1 -0
  20. package/dist/core/components/support/SupportMenu.js +78 -0
  21. package/dist/core/components/support/SupportMenu.js.map +1 -0
  22. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  23. package/dist/core/components/ui/Navbar.js +15 -23
  24. package/dist/core/components/ui/Navbar.js.map +1 -1
  25. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.d.ts.map +1 -1
  26. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js +1 -1
  27. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js.map +1 -1
  28. 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":"AAaA,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,+BAoLb"}
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__ */ jsxs("div", { className: "flex items-center gap-2 px-4 py-2 pt-3", children: [
154
- /* @__PURE__ */ jsxs(
155
- Button,
156
- {
157
- variant: "ghost",
158
- onClick: onToggleTheme,
159
- className: "flex-1 p-2 rounded-lg transition-colors flex items-center justify-center gap-2",
160
- style: { color: "var(--hp-on-surface-variant)" },
161
- children: [
162
- theme === "dark" ? /* @__PURE__ */ jsx(Sun, { className: "w-4 h-4" }) : /* @__PURE__ */ jsx(Moon, { className: "w-4 h-4" }),
163
- /* @__PURE__ */ jsx("span", { className: "text-sm", children: theme === "dark" ? "Light" : "Dark" })
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":";AAqEY,SACE,KADF;AAhEZ,SAAS,QAAQ,uBAAuB;AACxC,SAAS,MAAM,KAAK,MAAM,SAAS;AACnC,SAAS,uBAAuB;AAChC,OAAO,UAAU;AACjB,SAAS,UAAU,iBAAiB;AACpC,SAAS,cAAc;AACvB,OAAO,oBAAoB;AAC3B,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAcV,SAAR,OAAwB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAgB;AACd,QAAM,OAAO,gBAAgB,cAAc;AAC3C,QAAM,QAAQ,gBAAgB,eAAe;AAC7C,QAAM,aAAa,WAAW,SAAS,KAAK,SAAS,KAAK,SAAS;AACnE,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,aAAa;AAElE,YAAU,MAAM;AACd,UAAM,cAAc,MAAM,YAAY,OAAO,aAAa,GAAG;AAC7D,gBAAY;AACZ,WAAO,iBAAiB,UAAU,WAAW;AAC7C,WAAO,MAAM,OAAO,oBAAoB,UAAU,WAAW;AAAA,EAC/D,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,sBAAkB,aAAa;AAAA,EACjC,GAAG,CAAC,aAAa,CAAC;AAElB,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB,WAAU;AAAA,MAEV,+BAAC,SAAI,WAAU,+BACb;AAAA,6BAAC,SAAI,WAAU,2BAEb;AAAA;AAAA,YAAC,OAAO;AAAA,YAAP;AAAA,cACC,SAAS,EAAE,SAAS,GAAG,GAAG,IAAI;AAAA,cAC9B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,cAC5B,WAAU;AAAA,cAEV,+BAAC,QAAK,MAAK,SAAQ,WAAU,iCAC3B;AAAA,oCAAC,WAAQ,WAAU,WAAU;AAAA,gBAC7B;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,OAAO,uBAAuB;AAAA,oBAEtC,qBAAW,QAAQ;AAAA;AAAA,gBACtB;AAAA,iBACF;AAAA;AAAA,UACF;AAAA,UAGC,kBACC,oBAAC,SAAI,WAAW,GAAG,WAAW,WAAW,MAAM,6CAC5C,WAAC,SAAS,gBAAgB,SAAS,EAAE,IAAI,CAAC,YACzC;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS,MAAM;AACb,kCAAkB,OAAO;AACzB,kCAAkB,OAAO;AAAA,cAC3B;AAAA,cACA,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,OAAO,mBAAmB,UACtB,gCACA;AAAA,gBACJ,YAAY,mBAAmB,UAAU,MAAM;AAAA,cACjD;AAAA,cAEC;AAAA,qBAAK,OAAc;AAAA,gBACnB,mBAAmB,WAClB;AAAA,kBAAC,OAAO;AAAA,kBAAP;AAAA,oBACC,UAAS;AAAA,oBACT,WAAU;AAAA,oBACV,OAAO,EAAE,YAAY,8BAA8B;AAAA;AAAA,gBACrD;AAAA;AAAA;AAAA,YAnBG;AAAA,UAqBP,CACD,GACH;AAAA,UAIF,qBAAC,SAAI,WAAU,iDACb;AAAA,iCAAC,SAAI,WAAW,GAAG,WAAW,WAAW,MAAM,uBAC7C;AAAA,kCAAC,kBAAe,UAAU,YAAY,UAAU,kBAAkB;AAAA,cAElE;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,OAAO,EAAE,OAAO,+BAA+B;AAAA,kBAC/C,cAAW;AAAA,kBAEV,oBAAU,SAAS,oBAAC,OAAI,WAAU,WAAU,IAAK,oBAAC,QAAK,WAAU,WAAU;AAAA;AAAA,cAC9E;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAO;AAAA,kBAEP,8BAAC,OAAE,MAAK,QAAO,QAAO,UAAS,KAAI,uBAChC,gBAAM,gBAAgB,GACzB;AAAA;AAAA,cACF;AAAA,eACF;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS,MAAM,kBAAkB,CAAC,cAAc;AAAA,gBAChD,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,+BAA+B;AAAA,gBAC/C,cAAW;AAAA,gBAEV,2BAAiB,oBAAC,KAAE,WAAU,WAAU,IAAK,oBAAC,QAAK,WAAU,WAAU;AAAA;AAAA,YAC1E;AAAA,aACF;AAAA,WACF;AAAA,QAGA,oBAAC,mBACE,4BACC;AAAA,UAAC,OAAO;AAAA,UAAP;AAAA,YACC,SAAS,EAAE,SAAS,GAAG,QAAQ,EAAE;AAAA,YACjC,SAAS,EAAE,SAAS,GAAG,QAAQ,OAAO;AAAA,YACtC,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE;AAAA,YAC9B,YAAY,EAAE,UAAU,IAAI;AAAA,YAC5B,WAAU;AAAA,YAEV,+BAAC,SAAI,WAAU,uBAAsB,OAAO,EAAE,WAAW,mCAAmC,GACzF;AAAA,gCACC,CAAC,SAAS,gBAAgB,SAAS,EAAE,IAAI,CAAC,YACxC;AAAA,gBAAC;AAAA;AAAA,kBAEC,SAAS,MAAM;AACb,sCAAkB,OAAO;AACzB,sCAAkB,OAAO;AACzB,sCAAkB,KAAK;AAAA,kBACzB;AAAA,kBACA,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,OAAO,mBAAmB,UACtB,gCACA;AAAA,oBACJ,YAAY,mBAAmB,UAC3B,6BACA;AAAA,kBACN;AAAA,kBAEC,eAAK,OAAc;AAAA;AAAA,gBAhBf;AAAA,cAiBP,CACD;AAAA,cAEH,qBAAC,SAAI,WAAU,0CACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,WAAU;AAAA,oBACV,OAAO,EAAE,OAAO,+BAA+B;AAAA,oBAE9C;AAAA,gCAAU,SAAS,oBAAC,OAAI,WAAU,WAAU,IAAK,oBAAC,QAAK,WAAU,WAAU;AAAA,sBAC5E,oBAAC,UAAK,WAAU,WAAW,oBAAU,SAAS,UAAU,QAAO;AAAA;AAAA;AAAA,gBACjE;AAAA,gBACA,oBAAC,SAAI,WAAU,UACb,8BAAC,kBAAe,UAAU,YAAY,UAAU,kBAAkB,GACpE;AAAA,iBACF;AAAA,cAEA,oBAAC,SAAI,WAAU,aACb;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAO;AAAA,kBAEP,8BAAC,OAAE,MAAK,QAAO,QAAO,UAAS,KAAI,uBAChC,gBAAM,gBAAgB,GACzB;AAAA;AAAA,cACF,GACF;AAAA,eACF;AAAA;AAAA,QACF,GAEJ;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;","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,iBAMrC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,QAInC;AAGD,wBAAsB,aAAa,kBAyBlC"}
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,7 +1,7 @@
1
1
  function loadScript(src) {
2
2
  return new Promise((resolve, reject) => {
3
3
  const s = document.createElement("script");
4
- s.src = src;
4
+ s.src = new URL(src, window.location.href).href;
5
5
  s.async = false;
6
6
  s.onload = () => resolve();
7
7
  s.onerror = reject;
@@ -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;AAAK,MAAE,QAAQ;AAAO,MAAE,SAAS,MAAM,QAAQ;AAAG,MAAE,UAAU;AACtE,aAAS,KAAK,YAAY,CAAC;AAAA,EAC7B,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":[]}
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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@collabdt/core",
3
- "version": "0.0.54",
3
+ "version": "0.0.55",
4
4
  "description": "CDT Core contains all the core technology for your CDT platform",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",