@augmenting-integrations/ui 0.2.1 → 1.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.
Files changed (165) hide show
  1. package/dist/components/chrome/Logo.cjs +52 -0
  2. package/dist/components/chrome/Logo.cjs.map +1 -0
  3. package/dist/components/chrome/Logo.js +28 -0
  4. package/dist/components/chrome/Logo.js.map +1 -0
  5. package/dist/components/chrome/RoleSwitcher.cjs +98 -0
  6. package/dist/components/chrome/RoleSwitcher.cjs.map +1 -0
  7. package/dist/components/chrome/RoleSwitcher.js +64 -0
  8. package/dist/components/chrome/RoleSwitcher.js.map +1 -0
  9. package/dist/components/chrome/ThemeSwitcher.cjs +129 -0
  10. package/dist/components/chrome/ThemeSwitcher.cjs.map +1 -0
  11. package/dist/components/chrome/ThemeSwitcher.js +100 -0
  12. package/dist/components/chrome/ThemeSwitcher.js.map +1 -0
  13. package/dist/components/shells/AppShell.cjs +128 -0
  14. package/dist/components/shells/AppShell.cjs.map +1 -0
  15. package/dist/components/shells/AppShell.d.ts +1 -7
  16. package/dist/components/shells/AppShell.d.ts.map +1 -1
  17. package/dist/components/shells/AppShell.js +94 -0
  18. package/dist/components/shells/AppShell.js.map +1 -0
  19. package/dist/components/shells/PublicShell.cjs +87 -0
  20. package/dist/components/shells/PublicShell.cjs.map +1 -0
  21. package/dist/components/shells/PublicShell.d.ts +1 -11
  22. package/dist/components/shells/PublicShell.d.ts.map +1 -1
  23. package/dist/components/shells/PublicShell.js +53 -0
  24. package/dist/components/shells/PublicShell.js.map +1 -0
  25. package/dist/components/shells/StudioShell.cjs +49 -0
  26. package/dist/components/shells/StudioShell.cjs.map +1 -0
  27. package/dist/components/shells/StudioShell.js +25 -0
  28. package/dist/components/shells/StudioShell.js.map +1 -0
  29. package/dist/components/ui/avatar.cjs +131 -0
  30. package/dist/components/ui/avatar.cjs.map +1 -0
  31. package/dist/components/ui/avatar.js +102 -0
  32. package/dist/components/ui/avatar.js.map +1 -0
  33. package/dist/components/ui/badge.cjs +69 -0
  34. package/dist/components/ui/badge.cjs.map +1 -0
  35. package/dist/components/ui/badge.js +44 -0
  36. package/dist/components/ui/badge.js.map +1 -0
  37. package/dist/components/ui/button.cjs +82 -0
  38. package/dist/components/ui/button.cjs.map +1 -0
  39. package/dist/components/ui/button.js +57 -0
  40. package/dist/components/ui/button.js.map +1 -0
  41. package/dist/components/ui/card.cjs +114 -0
  42. package/dist/components/ui/card.cjs.map +1 -0
  43. package/dist/components/ui/card.js +84 -0
  44. package/dist/components/ui/card.js.map +1 -0
  45. package/dist/components/ui/checkbox.cjs +57 -0
  46. package/dist/components/ui/checkbox.cjs.map +1 -0
  47. package/dist/components/ui/checkbox.js +33 -0
  48. package/dist/components/ui/checkbox.js.map +1 -0
  49. package/dist/components/ui/dialog.cjs +172 -0
  50. package/dist/components/ui/dialog.cjs.map +1 -0
  51. package/dist/components/ui/dialog.js +139 -0
  52. package/dist/components/ui/dialog.js.map +1 -0
  53. package/dist/components/ui/dropdown-menu.cjs +250 -0
  54. package/dist/components/ui/dropdown-menu.cjs.map +1 -0
  55. package/dist/components/ui/dropdown-menu.js +212 -0
  56. package/dist/components/ui/dropdown-menu.js.map +1 -0
  57. package/dist/components/ui/input.cjs +46 -0
  58. package/dist/components/ui/input.cjs.map +1 -0
  59. package/dist/components/ui/input.js +22 -0
  60. package/dist/components/ui/input.js.map +1 -0
  61. package/dist/components/ui/label.cjs +48 -0
  62. package/dist/components/ui/label.cjs.map +1 -0
  63. package/dist/components/ui/label.js +24 -0
  64. package/dist/components/ui/label.js.map +1 -0
  65. package/dist/components/ui/select.cjs +201 -0
  66. package/dist/components/ui/select.cjs.map +1 -0
  67. package/dist/components/ui/select.js +168 -0
  68. package/dist/components/ui/select.js.map +1 -0
  69. package/dist/components/ui/separator.cjs +52 -0
  70. package/dist/components/ui/separator.cjs.map +1 -0
  71. package/dist/components/ui/separator.js +28 -0
  72. package/dist/components/ui/separator.js.map +1 -0
  73. package/dist/components/ui/sheet.cjs +154 -0
  74. package/dist/components/ui/sheet.cjs.map +1 -0
  75. package/dist/components/ui/sheet.js +123 -0
  76. package/dist/components/ui/sheet.js.map +1 -0
  77. package/dist/components/ui/table.cjs +134 -0
  78. package/dist/components/ui/table.cjs.map +1 -0
  79. package/dist/components/ui/table.js +103 -0
  80. package/dist/components/ui/table.js.map +1 -0
  81. package/dist/components/ui/tabs.cjs +121 -0
  82. package/dist/components/ui/tabs.cjs.map +1 -0
  83. package/dist/components/ui/tabs.js +93 -0
  84. package/dist/components/ui/tabs.js.map +1 -0
  85. package/dist/components/ui/textarea.cjs +43 -0
  86. package/dist/components/ui/textarea.cjs.map +1 -0
  87. package/dist/components/ui/textarea.js +19 -0
  88. package/dist/components/ui/textarea.js.map +1 -0
  89. package/dist/index.cjs +92 -0
  90. package/dist/index.cjs.map +1 -0
  91. package/dist/index.js +25 -16
  92. package/dist/index.js.map +1 -1
  93. package/dist/lib/utils.cjs +33 -0
  94. package/dist/lib/utils.cjs.map +1 -0
  95. package/dist/lib/utils.js +5 -2
  96. package/dist/lib/utils.js.map +1 -1
  97. package/dist/providers/MockProvider.cjs +83 -0
  98. package/dist/providers/MockProvider.cjs.map +1 -0
  99. package/dist/providers/MockProvider.js +49 -0
  100. package/dist/providers/MockProvider.js.map +1 -0
  101. package/dist/providers/QueryProvider.cjs +52 -0
  102. package/dist/providers/QueryProvider.cjs.map +1 -0
  103. package/dist/providers/QueryProvider.js +18 -0
  104. package/dist/providers/QueryProvider.js.map +1 -0
  105. package/dist/providers/SessionProvider.cjs +37 -0
  106. package/dist/providers/SessionProvider.cjs.map +1 -0
  107. package/dist/providers/SessionProvider.js +13 -0
  108. package/dist/providers/SessionProvider.js.map +1 -0
  109. package/dist/providers/ThemeProvider.cjs +92 -0
  110. package/dist/providers/ThemeProvider.cjs.map +1 -0
  111. package/dist/providers/ThemeProvider.js +57 -0
  112. package/dist/providers/ThemeProvider.js.map +1 -0
  113. package/package.json +7 -5
  114. package/dist/components/chrome/Logo.jsx +0 -19
  115. package/dist/components/chrome/Logo.jsx.map +0 -1
  116. package/dist/components/chrome/RoleSwitcher.jsx +0 -32
  117. package/dist/components/chrome/RoleSwitcher.jsx.map +0 -1
  118. package/dist/components/chrome/ThemeSwitcher.jsx +0 -43
  119. package/dist/components/chrome/ThemeSwitcher.jsx.map +0 -1
  120. package/dist/components/shells/AppShell.jsx +0 -67
  121. package/dist/components/shells/AppShell.jsx.map +0 -1
  122. package/dist/components/shells/PublicShell.jsx +0 -42
  123. package/dist/components/shells/PublicShell.jsx.map +0 -1
  124. package/dist/components/shells/StudioShell.jsx +0 -20
  125. package/dist/components/shells/StudioShell.jsx.map +0 -1
  126. package/dist/components/ui/avatar.jsx +0 -24
  127. package/dist/components/ui/avatar.jsx.map +0 -1
  128. package/dist/components/ui/badge.jsx +0 -25
  129. package/dist/components/ui/badge.jsx.map +0 -1
  130. package/dist/components/ui/button.jsx +0 -36
  131. package/dist/components/ui/button.jsx.map +0 -1
  132. package/dist/components/ui/card.jsx +0 -25
  133. package/dist/components/ui/card.jsx.map +0 -1
  134. package/dist/components/ui/checkbox.jsx +0 -14
  135. package/dist/components/ui/checkbox.jsx.map +0 -1
  136. package/dist/components/ui/dialog.jsx +0 -52
  137. package/dist/components/ui/dialog.jsx.map +0 -1
  138. package/dist/components/ui/dropdown-menu.jsx +0 -71
  139. package/dist/components/ui/dropdown-menu.jsx.map +0 -1
  140. package/dist/components/ui/input.jsx +0 -7
  141. package/dist/components/ui/input.jsx.map +0 -1
  142. package/dist/components/ui/label.jsx +0 -9
  143. package/dist/components/ui/label.jsx.map +0 -1
  144. package/dist/components/ui/select.jsx +0 -63
  145. package/dist/components/ui/select.jsx.map +0 -1
  146. package/dist/components/ui/separator.jsx +0 -9
  147. package/dist/components/ui/separator.jsx.map +0 -1
  148. package/dist/components/ui/sheet.jsx +0 -50
  149. package/dist/components/ui/sheet.jsx.map +0 -1
  150. package/dist/components/ui/table.jsx +0 -31
  151. package/dist/components/ui/table.jsx.map +0 -1
  152. package/dist/components/ui/tabs.jsx +0 -30
  153. package/dist/components/ui/tabs.jsx.map +0 -1
  154. package/dist/components/ui/textarea.jsx +0 -7
  155. package/dist/components/ui/textarea.jsx.map +0 -1
  156. package/dist/index.mjs +0 -1562
  157. package/dist/index.mjs.map +0 -1
  158. package/dist/providers/MockProvider.jsx +0 -59
  159. package/dist/providers/MockProvider.jsx.map +0 -1
  160. package/dist/providers/QueryProvider.jsx +0 -12
  161. package/dist/providers/QueryProvider.jsx.map +0 -1
  162. package/dist/providers/SessionProvider.jsx +0 -6
  163. package/dist/providers/SessionProvider.jsx.map +0 -1
  164. package/dist/providers/ThemeProvider.jsx +0 -44
  165. package/dist/providers/ThemeProvider.jsx.map +0 -1
@@ -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":[]}