@augmenting-integrations/ui 0.2.2 → 2.0.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/components/chrome/Logo.cjs +52 -0
- package/dist/components/chrome/Logo.cjs.map +1 -0
- package/dist/components/chrome/Logo.js +28 -0
- package/dist/components/chrome/Logo.js.map +1 -0
- package/dist/components/chrome/RoleSwitcher.cjs +98 -0
- package/dist/components/chrome/RoleSwitcher.cjs.map +1 -0
- package/dist/components/chrome/RoleSwitcher.js +64 -0
- package/dist/components/chrome/RoleSwitcher.js.map +1 -0
- package/dist/components/chrome/ThemeSwitcher.cjs +129 -0
- package/dist/components/chrome/ThemeSwitcher.cjs.map +1 -0
- package/dist/components/chrome/ThemeSwitcher.js +100 -0
- package/dist/components/chrome/ThemeSwitcher.js.map +1 -0
- package/dist/components/shells/AppShell.cjs +128 -0
- package/dist/components/shells/AppShell.cjs.map +1 -0
- package/dist/components/shells/AppShell.d.ts +1 -7
- package/dist/components/shells/AppShell.d.ts.map +1 -1
- package/dist/components/shells/AppShell.js +94 -0
- package/dist/components/shells/AppShell.js.map +1 -0
- package/dist/components/shells/PublicShell.cjs +87 -0
- package/dist/components/shells/PublicShell.cjs.map +1 -0
- package/dist/components/shells/PublicShell.d.ts +1 -11
- package/dist/components/shells/PublicShell.d.ts.map +1 -1
- package/dist/components/shells/PublicShell.js +53 -0
- package/dist/components/shells/PublicShell.js.map +1 -0
- package/dist/components/shells/StudioShell.cjs +49 -0
- package/dist/components/shells/StudioShell.cjs.map +1 -0
- package/dist/components/shells/StudioShell.js +25 -0
- package/dist/components/shells/StudioShell.js.map +1 -0
- package/dist/components/ui/avatar.cjs +131 -0
- package/dist/components/ui/avatar.cjs.map +1 -0
- package/dist/components/ui/avatar.js +102 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.cjs +69 -0
- package/dist/components/ui/badge.cjs.map +1 -0
- package/dist/components/ui/badge.js +44 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/button.cjs +82 -0
- package/dist/components/ui/button.cjs.map +1 -0
- package/dist/components/ui/button.js +57 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/card.cjs +114 -0
- package/dist/components/ui/card.cjs.map +1 -0
- package/dist/components/ui/card.js +84 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/checkbox.cjs +57 -0
- package/dist/components/ui/checkbox.cjs.map +1 -0
- package/dist/components/ui/checkbox.js +33 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/dialog.cjs +172 -0
- package/dist/components/ui/dialog.cjs.map +1 -0
- package/dist/components/ui/dialog.js +139 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/dropdown-menu.cjs +250 -0
- package/dist/components/ui/dropdown-menu.cjs.map +1 -0
- package/dist/components/ui/dropdown-menu.js +212 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/input.cjs +46 -0
- package/dist/components/ui/input.cjs.map +1 -0
- package/dist/components/ui/input.js +22 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.cjs +48 -0
- package/dist/components/ui/label.cjs.map +1 -0
- package/dist/components/ui/label.js +24 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/select.cjs +201 -0
- package/dist/components/ui/select.cjs.map +1 -0
- package/dist/components/ui/select.js +168 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.cjs +52 -0
- package/dist/components/ui/separator.cjs.map +1 -0
- package/dist/components/ui/separator.js +28 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.cjs +154 -0
- package/dist/components/ui/sheet.cjs.map +1 -0
- package/dist/components/ui/sheet.js +123 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/table.cjs +134 -0
- package/dist/components/ui/table.cjs.map +1 -0
- package/dist/components/ui/table.js +103 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.cjs +121 -0
- package/dist/components/ui/tabs.cjs.map +1 -0
- package/dist/components/ui/tabs.js +93 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.cjs +43 -0
- package/dist/components/ui/textarea.cjs.map +1 -0
- package/dist/components/ui/textarea.js +19 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/index.cjs +55 -1651
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +26 -1547
- package/dist/index.js.map +1 -1
- package/dist/lib/utils.cjs +33 -0
- package/dist/lib/utils.cjs.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/providers/MockProvider.cjs +83 -0
- package/dist/providers/MockProvider.cjs.map +1 -0
- package/dist/providers/MockProvider.js +49 -0
- package/dist/providers/MockProvider.js.map +1 -0
- package/dist/providers/QueryProvider.cjs +52 -0
- package/dist/providers/QueryProvider.cjs.map +1 -0
- package/dist/providers/QueryProvider.js +18 -0
- package/dist/providers/QueryProvider.js.map +1 -0
- package/dist/providers/SessionProvider.cjs +37 -0
- package/dist/providers/SessionProvider.cjs.map +1 -0
- package/dist/providers/SessionProvider.js +13 -0
- package/dist/providers/SessionProvider.js.map +1 -0
- package/dist/providers/ThemeProvider.cjs +92 -0
- package/dist/providers/ThemeProvider.cjs.map +1 -0
- package/dist/providers/ThemeProvider.js +57 -0
- package/dist/providers/ThemeProvider.js.map +1 -0
- package/package.json +7 -5
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var Logo_exports = {};
|
|
21
|
+
__export(Logo_exports, {
|
|
22
|
+
Logo: () => Logo
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(Logo_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_brand = require("@augmenting-integrations/brand");
|
|
27
|
+
var import_utils = require("../../lib/utils.js");
|
|
28
|
+
function Logo({
|
|
29
|
+
className,
|
|
30
|
+
showWordmark = true
|
|
31
|
+
}) {
|
|
32
|
+
const brand = (0, import_brand.useBrand)();
|
|
33
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_utils.cn)("inline-flex items-center gap-2 text-primary", className), children: [
|
|
34
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "inline-flex h-8 w-8 shrink-0 items-center justify-center text-current", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { viewBox: "0 0 32 32", className: "h-full w-full", "aria-hidden": "true", children: [
|
|
35
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "2", y: "2", width: "28", height: "28", rx: "6", fill: "currentColor" }),
|
|
36
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
37
|
+
"path",
|
|
38
|
+
{
|
|
39
|
+
d: "M10 22V10h2.6l3.4 6.4L19.4 10H22v12h-2.4v-7.4l-2.8 5.2h-1.6L12.4 14.6V22H10z",
|
|
40
|
+
fill: "var(--primary-foreground)"
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
] }) }),
|
|
44
|
+
showWordmark ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-base font-semibold tracking-tight text-foreground", children: brand.shortName }) : null,
|
|
45
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: brand.name })
|
|
46
|
+
] });
|
|
47
|
+
}
|
|
48
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
49
|
+
0 && (module.exports = {
|
|
50
|
+
Logo
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=Logo.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/chrome/Logo.tsx"],"sourcesContent":["\"use client\";\n\nimport { useBrand } from \"@augmenting-integrations/brand\";\nimport { cn } from \"../../lib/utils.js\";\n\nexport function Logo({\n className,\n showWordmark = true,\n}: {\n className?: string;\n showWordmark?: boolean;\n}) {\n const brand = useBrand();\n return (\n <div className={cn(\"inline-flex items-center gap-2 text-primary\", className)}>\n <span className=\"inline-flex h-8 w-8 shrink-0 items-center justify-center text-current\">\n <svg viewBox=\"0 0 32 32\" className=\"h-full w-full\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"28\" height=\"28\" rx=\"6\" fill=\"currentColor\" />\n <path\n d=\"M10 22V10h2.6l3.4 6.4L19.4 10H22v12h-2.4v-7.4l-2.8 5.2h-1.6L12.4 14.6V22H10z\"\n fill=\"var(--primary-foreground)\"\n />\n </svg>\n </span>\n {showWordmark ? (\n <span className=\"text-base font-semibold tracking-tight text-foreground\">\n {brand.shortName}\n </span>\n ) : null}\n <span className=\"sr-only\">{brand.name}</span>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBQ;AAdR,mBAAyB;AACzB,mBAAmB;AAEZ,SAAS,KAAK;AAAA,EACnB;AAAA,EACA,eAAe;AACjB,GAGG;AACD,QAAM,YAAQ,uBAAS;AACvB,SACE,6CAAC,SAAI,eAAW,iBAAG,+CAA+C,SAAS,GACzE;AAAA,gDAAC,UAAK,WAAU,yEACd,uDAAC,SAAI,SAAQ,aAAY,WAAU,iBAAgB,eAAY,QAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,MAAK,gBAAe;AAAA,MACpE;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,OACF,GACF;AAAA,IACC,eACC,4CAAC,UAAK,WAAU,0DACb,gBAAM,WACT,IACE;AAAA,IACJ,4CAAC,UAAK,WAAU,WAAW,gBAAM,MAAK;AAAA,KACxC;AAEJ;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useBrand } from "@augmenting-integrations/brand";
|
|
4
|
+
import { cn } from "../../lib/utils.js";
|
|
5
|
+
function Logo({
|
|
6
|
+
className,
|
|
7
|
+
showWordmark = true
|
|
8
|
+
}) {
|
|
9
|
+
const brand = useBrand();
|
|
10
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("inline-flex items-center gap-2 text-primary", className), children: [
|
|
11
|
+
/* @__PURE__ */ jsx("span", { className: "inline-flex h-8 w-8 shrink-0 items-center justify-center text-current", children: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 32 32", className: "h-full w-full", "aria-hidden": "true", children: [
|
|
12
|
+
/* @__PURE__ */ jsx("rect", { x: "2", y: "2", width: "28", height: "28", rx: "6", fill: "currentColor" }),
|
|
13
|
+
/* @__PURE__ */ jsx(
|
|
14
|
+
"path",
|
|
15
|
+
{
|
|
16
|
+
d: "M10 22V10h2.6l3.4 6.4L19.4 10H22v12h-2.4v-7.4l-2.8 5.2h-1.6L12.4 14.6V22H10z",
|
|
17
|
+
fill: "var(--primary-foreground)"
|
|
18
|
+
}
|
|
19
|
+
)
|
|
20
|
+
] }) }),
|
|
21
|
+
showWordmark ? /* @__PURE__ */ jsx("span", { className: "text-base font-semibold tracking-tight text-foreground", children: brand.shortName }) : null,
|
|
22
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: brand.name })
|
|
23
|
+
] });
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
Logo
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=Logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/chrome/Logo.tsx"],"sourcesContent":["\"use client\";\n\nimport { useBrand } from \"@augmenting-integrations/brand\";\nimport { cn } from \"../../lib/utils.js\";\n\nexport function Logo({\n className,\n showWordmark = true,\n}: {\n className?: string;\n showWordmark?: boolean;\n}) {\n const brand = useBrand();\n return (\n <div className={cn(\"inline-flex items-center gap-2 text-primary\", className)}>\n <span className=\"inline-flex h-8 w-8 shrink-0 items-center justify-center text-current\">\n <svg viewBox=\"0 0 32 32\" className=\"h-full w-full\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"28\" height=\"28\" rx=\"6\" fill=\"currentColor\" />\n <path\n d=\"M10 22V10h2.6l3.4 6.4L19.4 10H22v12h-2.4v-7.4l-2.8 5.2h-1.6L12.4 14.6V22H10z\"\n fill=\"var(--primary-foreground)\"\n />\n </svg>\n </span>\n {showWordmark ? (\n <span className=\"text-base font-semibold tracking-tight text-foreground\">\n {brand.shortName}\n </span>\n ) : null}\n <span className=\"sr-only\">{brand.name}</span>\n </div>\n );\n}\n"],"mappings":";AAgBQ,SACE,KADF;AAdR,SAAS,gBAAgB;AACzB,SAAS,UAAU;AAEZ,SAAS,KAAK;AAAA,EACnB;AAAA,EACA,eAAe;AACjB,GAGG;AACD,QAAM,QAAQ,SAAS;AACvB,SACE,qBAAC,SAAI,WAAW,GAAG,+CAA+C,SAAS,GACzE;AAAA,wBAAC,UAAK,WAAU,yEACd,+BAAC,SAAI,SAAQ,aAAY,WAAU,iBAAgB,eAAY,QAC7D;AAAA,0BAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,MAAK,gBAAe;AAAA,MACpE;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,OACF,GACF;AAAA,IACC,eACC,oBAAC,UAAK,WAAU,0DACb,gBAAM,WACT,IACE;AAAA,IACJ,oBAAC,UAAK,WAAU,WAAW,gBAAM,MAAK;AAAA,KACxC;AAEJ;","names":[]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var RoleSwitcher_exports = {};
|
|
31
|
+
__export(RoleSwitcher_exports, {
|
|
32
|
+
RoleSwitcher: () => RoleSwitcher
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(RoleSwitcher_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var React = __toESM(require("react"));
|
|
37
|
+
var import_react = require("next-auth/react");
|
|
38
|
+
var import_lucide_react = require("lucide-react");
|
|
39
|
+
var import_utils = require("../../lib/utils.js");
|
|
40
|
+
const ROLES = ["visitor", "sales", "agent", "admin"];
|
|
41
|
+
function RoleSwitcher({ className }) {
|
|
42
|
+
const { data: session, update } = (0, import_react.useSession)();
|
|
43
|
+
const [open, setOpen] = React.useState(false);
|
|
44
|
+
const current = session?.user?.role ?? "visitor";
|
|
45
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_utils.cn)("relative", className), children: [
|
|
46
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
47
|
+
"button",
|
|
48
|
+
{
|
|
49
|
+
type: "button",
|
|
50
|
+
onClick: () => setOpen((o) => !o),
|
|
51
|
+
"aria-haspopup": "menu",
|
|
52
|
+
"aria-expanded": open,
|
|
53
|
+
className: "inline-flex h-9 items-center gap-2 rounded-md border border-border bg-background px-3 text-sm text-foreground transition hover:bg-muted",
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.UserCog, { className: "h-4 w-4" }),
|
|
56
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "font-medium capitalize", children: current })
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
open ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
role: "menu",
|
|
64
|
+
className: "absolute right-0 top-full z-50 mt-2 w-56 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg",
|
|
65
|
+
onMouseLeave: () => setOpen(false),
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Switch role (dev)" }),
|
|
68
|
+
ROLES.map((r) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
69
|
+
"button",
|
|
70
|
+
{
|
|
71
|
+
type: "button",
|
|
72
|
+
role: "menuitem",
|
|
73
|
+
onClick: async () => {
|
|
74
|
+
await (0, import_react.signIn)("credentials", { role: r, redirect: false });
|
|
75
|
+
await update();
|
|
76
|
+
setOpen(false);
|
|
77
|
+
},
|
|
78
|
+
className: (0, import_utils.cn)(
|
|
79
|
+
"flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-sm capitalize transition hover:bg-muted",
|
|
80
|
+
current === r && "bg-muted"
|
|
81
|
+
),
|
|
82
|
+
children: [
|
|
83
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: r }),
|
|
84
|
+
current === r ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs text-muted-foreground", children: "active" }) : null
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
r
|
|
88
|
+
))
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
) : null
|
|
92
|
+
] });
|
|
93
|
+
}
|
|
94
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
95
|
+
0 && (module.exports = {
|
|
96
|
+
RoleSwitcher
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=RoleSwitcher.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/chrome/RoleSwitcher.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { signIn, useSession } from \"next-auth/react\";\nimport { UserCog } from \"lucide-react\";\nimport { cn } from \"../../lib/utils.js\";\n\nconst ROLES = [\"visitor\", \"sales\", \"agent\", \"admin\"] as const;\n\nexport function RoleSwitcher({ className }: { className?: string }) {\n const { data: session, update } = useSession();\n const [open, setOpen] = React.useState(false);\n const current = (session?.user as { role?: string } | undefined)?.role ?? \"visitor\";\n\n return (\n <div className={cn(\"relative\", className)}>\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n className=\"inline-flex h-9 items-center gap-2 rounded-md border border-border bg-background px-3 text-sm text-foreground transition hover:bg-muted\"\n >\n <UserCog className=\"h-4 w-4\" />\n <span className=\"font-medium capitalize\">{current}</span>\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 top-full z-50 mt-2 w-56 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg\"\n onMouseLeave={() => setOpen(false)}\n >\n <div className=\"px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground\">\n Switch role (dev)\n </div>\n {ROLES.map((r) => (\n <button\n key={r}\n type=\"button\"\n role=\"menuitem\"\n onClick={async () => {\n await signIn(\"credentials\", { role: r, redirect: false });\n await update();\n setOpen(false);\n }}\n className={cn(\n \"flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-sm capitalize transition hover:bg-muted\",\n current === r && \"bg-muted\",\n )}\n >\n <span>{r}</span>\n {current === r ? (\n <span className=\"text-xs text-muted-foreground\">active</span>\n ) : null}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBM;AAdN,YAAuB;AACvB,mBAAmC;AACnC,0BAAwB;AACxB,mBAAmB;AAEnB,MAAM,QAAQ,CAAC,WAAW,SAAS,SAAS,OAAO;AAE5C,SAAS,aAAa,EAAE,UAAU,GAA2B;AAClE,QAAM,EAAE,MAAM,SAAS,OAAO,QAAI,yBAAW;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAC5C,QAAM,UAAW,SAAS,MAAwC,QAAQ;AAE1E,SACE,6CAAC,SAAI,eAAW,iBAAG,YAAY,SAAS,GACtC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAChC,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,WAAU;AAAA,QAEV;AAAA,sDAAC,+BAAQ,WAAU,WAAU;AAAA,UAC7B,4CAAC,UAAK,WAAU,0BAA0B,mBAAQ;AAAA;AAAA;AAAA,IACpD;AAAA,IAEC,OACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAc,MAAM,QAAQ,KAAK;AAAA,QAEjC;AAAA,sDAAC,SAAI,WAAU,mEAAkE,+BAEjF;AAAA,UACC,MAAM,IAAI,CAAC,MACV;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAS,YAAY;AACnB,0BAAM,qBAAO,eAAe,EAAE,MAAM,GAAG,UAAU,MAAM,CAAC;AACxD,sBAAM,OAAO;AACb,wBAAQ,KAAK;AAAA,cACf;AAAA,cACA,eAAW;AAAA,gBACT;AAAA,gBACA,YAAY,KAAK;AAAA,cACnB;AAAA,cAEA;AAAA,4DAAC,UAAM,aAAE;AAAA,gBACR,YAAY,IACX,4CAAC,UAAK,WAAU,iCAAgC,oBAAM,IACpD;AAAA;AAAA;AAAA,YAhBC;AAAA,UAiBP,CACD;AAAA;AAAA;AAAA,IACH,IACE;AAAA,KACN;AAEJ;","names":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { signIn, useSession } from "next-auth/react";
|
|
5
|
+
import { UserCog } from "lucide-react";
|
|
6
|
+
import { cn } from "../../lib/utils.js";
|
|
7
|
+
const ROLES = ["visitor", "sales", "agent", "admin"];
|
|
8
|
+
function RoleSwitcher({ className }) {
|
|
9
|
+
const { data: session, update } = useSession();
|
|
10
|
+
const [open, setOpen] = React.useState(false);
|
|
11
|
+
const current = session?.user?.role ?? "visitor";
|
|
12
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
|
|
13
|
+
/* @__PURE__ */ jsxs(
|
|
14
|
+
"button",
|
|
15
|
+
{
|
|
16
|
+
type: "button",
|
|
17
|
+
onClick: () => setOpen((o) => !o),
|
|
18
|
+
"aria-haspopup": "menu",
|
|
19
|
+
"aria-expanded": open,
|
|
20
|
+
className: "inline-flex h-9 items-center gap-2 rounded-md border border-border bg-background px-3 text-sm text-foreground transition hover:bg-muted",
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ jsx(UserCog, { className: "h-4 w-4" }),
|
|
23
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium capitalize", children: current })
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
),
|
|
27
|
+
open ? /* @__PURE__ */ jsxs(
|
|
28
|
+
"div",
|
|
29
|
+
{
|
|
30
|
+
role: "menu",
|
|
31
|
+
className: "absolute right-0 top-full z-50 mt-2 w-56 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg",
|
|
32
|
+
onMouseLeave: () => setOpen(false),
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx("div", { className: "px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground", children: "Switch role (dev)" }),
|
|
35
|
+
ROLES.map((r) => /* @__PURE__ */ jsxs(
|
|
36
|
+
"button",
|
|
37
|
+
{
|
|
38
|
+
type: "button",
|
|
39
|
+
role: "menuitem",
|
|
40
|
+
onClick: async () => {
|
|
41
|
+
await signIn("credentials", { role: r, redirect: false });
|
|
42
|
+
await update();
|
|
43
|
+
setOpen(false);
|
|
44
|
+
},
|
|
45
|
+
className: cn(
|
|
46
|
+
"flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-sm capitalize transition hover:bg-muted",
|
|
47
|
+
current === r && "bg-muted"
|
|
48
|
+
),
|
|
49
|
+
children: [
|
|
50
|
+
/* @__PURE__ */ jsx("span", { children: r }),
|
|
51
|
+
current === r ? /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "active" }) : null
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
r
|
|
55
|
+
))
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
) : null
|
|
59
|
+
] });
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
RoleSwitcher
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=RoleSwitcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/chrome/RoleSwitcher.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { signIn, useSession } from \"next-auth/react\";\nimport { UserCog } from \"lucide-react\";\nimport { cn } from \"../../lib/utils.js\";\n\nconst ROLES = [\"visitor\", \"sales\", \"agent\", \"admin\"] as const;\n\nexport function RoleSwitcher({ className }: { className?: string }) {\n const { data: session, update } = useSession();\n const [open, setOpen] = React.useState(false);\n const current = (session?.user as { role?: string } | undefined)?.role ?? \"visitor\";\n\n return (\n <div className={cn(\"relative\", className)}>\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n className=\"inline-flex h-9 items-center gap-2 rounded-md border border-border bg-background px-3 text-sm text-foreground transition hover:bg-muted\"\n >\n <UserCog className=\"h-4 w-4\" />\n <span className=\"font-medium capitalize\">{current}</span>\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 top-full z-50 mt-2 w-56 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg\"\n onMouseLeave={() => setOpen(false)}\n >\n <div className=\"px-2 py-1 text-xs uppercase tracking-wide text-muted-foreground\">\n Switch role (dev)\n </div>\n {ROLES.map((r) => (\n <button\n key={r}\n type=\"button\"\n role=\"menuitem\"\n onClick={async () => {\n await signIn(\"credentials\", { role: r, redirect: false });\n await update();\n setOpen(false);\n }}\n className={cn(\n \"flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-sm capitalize transition hover:bg-muted\",\n current === r && \"bg-muted\",\n )}\n >\n <span>{r}</span>\n {current === r ? (\n <span className=\"text-xs text-muted-foreground\">active</span>\n ) : null}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";AAgBM,SAOE,KAPF;AAdN,YAAY,WAAW;AACvB,SAAS,QAAQ,kBAAkB;AACnC,SAAS,eAAe;AACxB,SAAS,UAAU;AAEnB,MAAM,QAAQ,CAAC,WAAW,SAAS,SAAS,OAAO;AAE5C,SAAS,aAAa,EAAE,UAAU,GAA2B;AAClE,QAAM,EAAE,MAAM,SAAS,OAAO,IAAI,WAAW;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAC5C,QAAM,UAAW,SAAS,MAAwC,QAAQ;AAE1E,SACE,qBAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GACtC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAChC,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,WAAU;AAAA,QAEV;AAAA,8BAAC,WAAQ,WAAU,WAAU;AAAA,UAC7B,oBAAC,UAAK,WAAU,0BAA0B,mBAAQ;AAAA;AAAA;AAAA,IACpD;AAAA,IAEC,OACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAc,MAAM,QAAQ,KAAK;AAAA,QAEjC;AAAA,8BAAC,SAAI,WAAU,mEAAkE,+BAEjF;AAAA,UACC,MAAM,IAAI,CAAC,MACV;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAS,YAAY;AACnB,sBAAM,OAAO,eAAe,EAAE,MAAM,GAAG,UAAU,MAAM,CAAC;AACxD,sBAAM,OAAO;AACb,wBAAQ,KAAK;AAAA,cACf;AAAA,cACA,WAAW;AAAA,gBACT;AAAA,gBACA,YAAY,KAAK;AAAA,cACnB;AAAA,cAEA;AAAA,oCAAC,UAAM,aAAE;AAAA,gBACR,YAAY,IACX,oBAAC,UAAK,WAAU,iCAAgC,oBAAM,IACpD;AAAA;AAAA;AAAA,YAhBC;AAAA,UAiBP,CACD;AAAA;AAAA;AAAA,IACH,IACE;AAAA,KACN;AAEJ;","names":[]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var ThemeSwitcher_exports = {};
|
|
31
|
+
__export(ThemeSwitcher_exports, {
|
|
32
|
+
ThemeSwitcher: () => ThemeSwitcher
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(ThemeSwitcher_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var React = __toESM(require("react"));
|
|
37
|
+
var import_next_themes = require("next-themes");
|
|
38
|
+
var import_lucide_react = require("lucide-react");
|
|
39
|
+
var import_themes = require("@augmenting-integrations/themes");
|
|
40
|
+
var import_ThemeProvider = require("../../providers/ThemeProvider.js");
|
|
41
|
+
var import_utils = require("../../lib/utils.js");
|
|
42
|
+
var import_dropdown_menu = require("../ui/dropdown-menu.js");
|
|
43
|
+
function ThemeSwitcher({ className }) {
|
|
44
|
+
const { themeName, setThemeName } = (0, import_ThemeProvider.useThemeName)();
|
|
45
|
+
const { resolvedTheme, setTheme } = (0, import_next_themes.useTheme)();
|
|
46
|
+
const mounted = React.useSyncExternalStore(
|
|
47
|
+
() => () => {
|
|
48
|
+
},
|
|
49
|
+
() => true,
|
|
50
|
+
() => false
|
|
51
|
+
);
|
|
52
|
+
if (!mounted) {
|
|
53
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
54
|
+
"div",
|
|
55
|
+
{
|
|
56
|
+
className: (0, import_utils.cn)(
|
|
57
|
+
"h-9 w-[120px] rounded-md border border-border bg-background",
|
|
58
|
+
className
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
const isDark = resolvedTheme === "dark";
|
|
64
|
+
const activeLabel = import_themes.BASE_THEMES.find((t) => t.id === themeName)?.label ?? "Theme";
|
|
65
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_utils.cn)("flex items-center gap-2", className), children: [
|
|
66
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
67
|
+
"button",
|
|
68
|
+
{
|
|
69
|
+
type: "button",
|
|
70
|
+
onClick: () => setTheme(isDark ? "light" : "dark"),
|
|
71
|
+
"aria-label": isDark ? "Switch to light mode" : "Switch to dark mode",
|
|
72
|
+
className: "inline-flex h-9 w-9 items-center justify-center rounded-md border border-border bg-background text-foreground transition hover:bg-muted",
|
|
73
|
+
children: isDark ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Sun, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Moon, { className: "h-4 w-4" })
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dropdown_menu.DropdownMenu, { children: [
|
|
77
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
78
|
+
import_dropdown_menu.DropdownMenuTrigger,
|
|
79
|
+
{
|
|
80
|
+
className: "inline-flex h-9 items-center gap-2 rounded-md border border-border bg-background px-3 text-sm text-foreground transition hover:bg-muted",
|
|
81
|
+
"aria-label": "Switch theme palette",
|
|
82
|
+
children: [
|
|
83
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Palette, { className: "h-4 w-4" }),
|
|
84
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "font-medium", children: activeLabel })
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
),
|
|
88
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dropdown_menu.DropdownMenuContent, { align: "end", sideOffset: 6, className: "w-72 p-1", children: import_themes.BASE_THEMES.map((t) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
89
|
+
import_dropdown_menu.DropdownMenuItem,
|
|
90
|
+
{
|
|
91
|
+
onClick: () => setThemeName(t.id),
|
|
92
|
+
className: (0, import_utils.cn)(
|
|
93
|
+
"items-start gap-3 px-2 py-2",
|
|
94
|
+
themeName === t.id && "bg-muted"
|
|
95
|
+
),
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
98
|
+
"span",
|
|
99
|
+
{
|
|
100
|
+
"aria-hidden": true,
|
|
101
|
+
className: "mt-0.5 inline-flex h-6 w-6 shrink-0 overflow-hidden rounded-full ring-1 ring-border",
|
|
102
|
+
children: [
|
|
103
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "h-full w-1/2", style: { background: t.swatch.primary } }),
|
|
104
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
105
|
+
"span",
|
|
106
|
+
{
|
|
107
|
+
className: "h-full w-1/2",
|
|
108
|
+
style: { background: t.swatch.primaryDark }
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
),
|
|
114
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "flex flex-col", children: [
|
|
115
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm font-medium", children: t.label }),
|
|
116
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xs text-muted-foreground", children: t.description })
|
|
117
|
+
] })
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
t.id
|
|
121
|
+
)) })
|
|
122
|
+
] })
|
|
123
|
+
] });
|
|
124
|
+
}
|
|
125
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
126
|
+
0 && (module.exports = {
|
|
127
|
+
ThemeSwitcher
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=ThemeSwitcher.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/chrome/ThemeSwitcher.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useTheme } from \"next-themes\";\nimport { Moon, Sun, Palette } from \"lucide-react\";\nimport { BASE_THEMES } from \"@augmenting-integrations/themes\";\nimport { useThemeName } from \"../../providers/ThemeProvider.js\";\nimport { cn } from \"../../lib/utils.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu.js\";\n\nexport function ThemeSwitcher({ className }: { className?: string }) {\n const { themeName, setThemeName } = useThemeName();\n const { resolvedTheme, setTheme } = useTheme();\n const mounted = React.useSyncExternalStore(\n () => () => {},\n () => true,\n () => false,\n );\n\n if (!mounted) {\n return (\n <div\n className={cn(\n \"h-9 w-[120px] rounded-md border border-border bg-background\",\n className,\n )}\n />\n );\n }\n\n const isDark = resolvedTheme === \"dark\";\n const activeLabel = BASE_THEMES.find((t) => t.id === themeName)?.label ?? \"Theme\";\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <button\n type=\"button\"\n onClick={() => setTheme(isDark ? \"light\" : \"dark\")}\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-md border border-border bg-background text-foreground transition hover:bg-muted\"\n >\n {isDark ? <Sun className=\"h-4 w-4\" /> : <Moon className=\"h-4 w-4\" />}\n </button>\n\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"inline-flex h-9 items-center gap-2 rounded-md border border-border bg-background px-3 text-sm text-foreground transition hover:bg-muted\"\n aria-label=\"Switch theme palette\"\n >\n <Palette className=\"h-4 w-4\" />\n <span className=\"font-medium\">{activeLabel}</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" sideOffset={6} className=\"w-72 p-1\">\n {BASE_THEMES.map((t) => (\n <DropdownMenuItem\n key={t.id}\n onClick={() => setThemeName(t.id)}\n className={cn(\n \"items-start gap-3 px-2 py-2\",\n themeName === t.id && \"bg-muted\",\n )}\n >\n <span\n aria-hidden\n className=\"mt-0.5 inline-flex h-6 w-6 shrink-0 overflow-hidden rounded-full ring-1 ring-border\"\n >\n <span className=\"h-full w-1/2\" style={{ background: t.swatch.primary }} />\n <span\n className=\"h-full w-1/2\"\n style={{ background: t.swatch.primaryDark }}\n />\n </span>\n <span className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">{t.label}</span>\n <span className=\"text-xs text-muted-foreground\">{t.description}</span>\n </span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BM;AAxBN,YAAuB;AACvB,yBAAyB;AACzB,0BAAmC;AACnC,oBAA4B;AAC5B,2BAA6B;AAC7B,mBAAmB;AACnB,2BAKO;AAEA,SAAS,cAAc,EAAE,UAAU,GAA2B;AACnE,QAAM,EAAE,WAAW,aAAa,QAAI,mCAAa;AACjD,QAAM,EAAE,eAAe,SAAS,QAAI,6BAAS;AAC7C,QAAM,UAAU,MAAM;AAAA,IACpB,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,MAAI,CAAC,SAAS;AACZ,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,SAAS,kBAAkB;AACjC,QAAM,cAAc,0BAAY,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,GAAG,SAAS;AAE1E,SACE,6CAAC,SAAI,eAAW,iBAAG,2BAA2B,SAAS,GACrD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,SAAS,UAAU,MAAM;AAAA,QACjD,cAAY,SAAS,yBAAyB;AAAA,QAC9C,WAAU;AAAA,QAET,mBAAS,4CAAC,2BAAI,WAAU,WAAU,IAAK,4CAAC,4BAAK,WAAU,WAAU;AAAA;AAAA,IACpE;AAAA,IAEA,6CAAC,qCACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,cAAW;AAAA,UAEX;AAAA,wDAAC,+BAAQ,WAAU,WAAU;AAAA,YAC7B,4CAAC,UAAK,WAAU,eAAe,uBAAY;AAAA;AAAA;AAAA,MAC7C;AAAA,MACA,4CAAC,4CAAoB,OAAM,OAAM,YAAY,GAAG,WAAU,YACvD,oCAAY,IAAI,CAAC,MAChB;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,MAAM,aAAa,EAAE,EAAE;AAAA,UAChC,eAAW;AAAA,YACT;AAAA,YACA,cAAc,EAAE,MAAM;AAAA,UACxB;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,gBACX,WAAU;AAAA,gBAEV;AAAA,8DAAC,UAAK,WAAU,gBAAe,OAAO,EAAE,YAAY,EAAE,OAAO,QAAQ,GAAG;AAAA,kBACxE;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,YAAY,EAAE,OAAO,YAAY;AAAA;AAAA,kBAC5C;AAAA;AAAA;AAAA,YACF;AAAA,YACA,6CAAC,UAAK,WAAU,iBACd;AAAA,0DAAC,UAAK,WAAU,uBAAuB,YAAE,OAAM;AAAA,cAC/C,4CAAC,UAAK,WAAU,iCAAiC,YAAE,aAAY;AAAA,eACjE;AAAA;AAAA;AAAA,QApBK,EAAE;AAAA,MAqBT,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { useTheme } from "next-themes";
|
|
5
|
+
import { Moon, Sun, Palette } from "lucide-react";
|
|
6
|
+
import { BASE_THEMES } from "@augmenting-integrations/themes";
|
|
7
|
+
import { useThemeName } from "../../providers/ThemeProvider.js";
|
|
8
|
+
import { cn } from "../../lib/utils.js";
|
|
9
|
+
import {
|
|
10
|
+
DropdownMenu,
|
|
11
|
+
DropdownMenuContent,
|
|
12
|
+
DropdownMenuItem,
|
|
13
|
+
DropdownMenuTrigger
|
|
14
|
+
} from "../ui/dropdown-menu.js";
|
|
15
|
+
function ThemeSwitcher({ className }) {
|
|
16
|
+
const { themeName, setThemeName } = useThemeName();
|
|
17
|
+
const { resolvedTheme, setTheme } = useTheme();
|
|
18
|
+
const mounted = React.useSyncExternalStore(
|
|
19
|
+
() => () => {
|
|
20
|
+
},
|
|
21
|
+
() => true,
|
|
22
|
+
() => false
|
|
23
|
+
);
|
|
24
|
+
if (!mounted) {
|
|
25
|
+
return /* @__PURE__ */ jsx(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
className: cn(
|
|
29
|
+
"h-9 w-[120px] rounded-md border border-border bg-background",
|
|
30
|
+
className
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
const isDark = resolvedTheme === "dark";
|
|
36
|
+
const activeLabel = BASE_THEMES.find((t) => t.id === themeName)?.label ?? "Theme";
|
|
37
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", className), children: [
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
"button",
|
|
40
|
+
{
|
|
41
|
+
type: "button",
|
|
42
|
+
onClick: () => setTheme(isDark ? "light" : "dark"),
|
|
43
|
+
"aria-label": isDark ? "Switch to light mode" : "Switch to dark mode",
|
|
44
|
+
className: "inline-flex h-9 w-9 items-center justify-center rounded-md border border-border bg-background text-foreground transition hover:bg-muted",
|
|
45
|
+
children: isDark ? /* @__PURE__ */ jsx(Sun, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Moon, { className: "h-4 w-4" })
|
|
46
|
+
}
|
|
47
|
+
),
|
|
48
|
+
/* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
49
|
+
/* @__PURE__ */ jsxs(
|
|
50
|
+
DropdownMenuTrigger,
|
|
51
|
+
{
|
|
52
|
+
className: "inline-flex h-9 items-center gap-2 rounded-md border border-border bg-background px-3 text-sm text-foreground transition hover:bg-muted",
|
|
53
|
+
"aria-label": "Switch theme palette",
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsx(Palette, { className: "h-4 w-4" }),
|
|
56
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: activeLabel })
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", sideOffset: 6, className: "w-72 p-1", children: BASE_THEMES.map((t) => /* @__PURE__ */ jsxs(
|
|
61
|
+
DropdownMenuItem,
|
|
62
|
+
{
|
|
63
|
+
onClick: () => setThemeName(t.id),
|
|
64
|
+
className: cn(
|
|
65
|
+
"items-start gap-3 px-2 py-2",
|
|
66
|
+
themeName === t.id && "bg-muted"
|
|
67
|
+
),
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ jsxs(
|
|
70
|
+
"span",
|
|
71
|
+
{
|
|
72
|
+
"aria-hidden": true,
|
|
73
|
+
className: "mt-0.5 inline-flex h-6 w-6 shrink-0 overflow-hidden rounded-full ring-1 ring-border",
|
|
74
|
+
children: [
|
|
75
|
+
/* @__PURE__ */ jsx("span", { className: "h-full w-1/2", style: { background: t.swatch.primary } }),
|
|
76
|
+
/* @__PURE__ */ jsx(
|
|
77
|
+
"span",
|
|
78
|
+
{
|
|
79
|
+
className: "h-full w-1/2",
|
|
80
|
+
style: { background: t.swatch.primaryDark }
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsxs("span", { className: "flex flex-col", children: [
|
|
87
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: t.label }),
|
|
88
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: t.description })
|
|
89
|
+
] })
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
t.id
|
|
93
|
+
)) })
|
|
94
|
+
] })
|
|
95
|
+
] });
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
ThemeSwitcher
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=ThemeSwitcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/chrome/ThemeSwitcher.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useTheme } from \"next-themes\";\nimport { Moon, Sun, Palette } from \"lucide-react\";\nimport { BASE_THEMES } from \"@augmenting-integrations/themes\";\nimport { useThemeName } from \"../../providers/ThemeProvider.js\";\nimport { cn } from \"../../lib/utils.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu.js\";\n\nexport function ThemeSwitcher({ className }: { className?: string }) {\n const { themeName, setThemeName } = useThemeName();\n const { resolvedTheme, setTheme } = useTheme();\n const mounted = React.useSyncExternalStore(\n () => () => {},\n () => true,\n () => false,\n );\n\n if (!mounted) {\n return (\n <div\n className={cn(\n \"h-9 w-[120px] rounded-md border border-border bg-background\",\n className,\n )}\n />\n );\n }\n\n const isDark = resolvedTheme === \"dark\";\n const activeLabel = BASE_THEMES.find((t) => t.id === themeName)?.label ?? \"Theme\";\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <button\n type=\"button\"\n onClick={() => setTheme(isDark ? \"light\" : \"dark\")}\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-md border border-border bg-background text-foreground transition hover:bg-muted\"\n >\n {isDark ? <Sun className=\"h-4 w-4\" /> : <Moon className=\"h-4 w-4\" />}\n </button>\n\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"inline-flex h-9 items-center gap-2 rounded-md border border-border bg-background px-3 text-sm text-foreground transition hover:bg-muted\"\n aria-label=\"Switch theme palette\"\n >\n <Palette className=\"h-4 w-4\" />\n <span className=\"font-medium\">{activeLabel}</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" sideOffset={6} className=\"w-72 p-1\">\n {BASE_THEMES.map((t) => (\n <DropdownMenuItem\n key={t.id}\n onClick={() => setThemeName(t.id)}\n className={cn(\n \"items-start gap-3 px-2 py-2\",\n themeName === t.id && \"bg-muted\",\n )}\n >\n <span\n aria-hidden\n className=\"mt-0.5 inline-flex h-6 w-6 shrink-0 overflow-hidden rounded-full ring-1 ring-border\"\n >\n <span className=\"h-full w-1/2\" style={{ background: t.swatch.primary }} />\n <span\n className=\"h-full w-1/2\"\n style={{ background: t.swatch.primaryDark }}\n />\n </span>\n <span className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">{t.label}</span>\n <span className=\"text-xs text-muted-foreground\">{t.description}</span>\n </span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n"],"mappings":";AA0BM,cAwBE,YAxBF;AAxBN,YAAY,WAAW;AACvB,SAAS,gBAAgB;AACzB,SAAS,MAAM,KAAK,eAAe;AACnC,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,SAAS,cAAc,EAAE,UAAU,GAA2B;AACnE,QAAM,EAAE,WAAW,aAAa,IAAI,aAAa;AACjD,QAAM,EAAE,eAAe,SAAS,IAAI,SAAS;AAC7C,QAAM,UAAU,MAAM;AAAA,IACpB,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,MAAI,CAAC,SAAS;AACZ,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,SAAS,kBAAkB;AACjC,QAAM,cAAc,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,GAAG,SAAS;AAE1E,SACE,qBAAC,SAAI,WAAW,GAAG,2BAA2B,SAAS,GACrD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,SAAS,UAAU,MAAM;AAAA,QACjD,cAAY,SAAS,yBAAyB;AAAA,QAC9C,WAAU;AAAA,QAET,mBAAS,oBAAC,OAAI,WAAU,WAAU,IAAK,oBAAC,QAAK,WAAU,WAAU;AAAA;AAAA,IACpE;AAAA,IAEA,qBAAC,gBACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,cAAW;AAAA,UAEX;AAAA,gCAAC,WAAQ,WAAU,WAAU;AAAA,YAC7B,oBAAC,UAAK,WAAU,eAAe,uBAAY;AAAA;AAAA;AAAA,MAC7C;AAAA,MACA,oBAAC,uBAAoB,OAAM,OAAM,YAAY,GAAG,WAAU,YACvD,sBAAY,IAAI,CAAC,MAChB;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,MAAM,aAAa,EAAE,EAAE;AAAA,UAChC,WAAW;AAAA,YACT;AAAA,YACA,cAAc,EAAE,MAAM;AAAA,UACxB;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,gBACX,WAAU;AAAA,gBAEV;AAAA,sCAAC,UAAK,WAAU,gBAAe,OAAO,EAAE,YAAY,EAAE,OAAO,QAAQ,GAAG;AAAA,kBACxE;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,YAAY,EAAE,OAAO,YAAY;AAAA;AAAA,kBAC5C;AAAA;AAAA;AAAA,YACF;AAAA,YACA,qBAAC,UAAK,WAAU,iBACd;AAAA,kCAAC,UAAK,WAAU,uBAAuB,YAAE,OAAM;AAAA,cAC/C,oBAAC,UAAK,WAAU,iCAAiC,YAAE,aAAY;AAAA,eACjE;AAAA;AAAA;AAAA,QApBK,EAAE;AAAA,MAqBT,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|