@solidxai/core-ui 0.1.19 → 0.1.20-beta.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 (43) hide show
  1. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.d.ts.map +1 -1
  2. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js +3 -10
  3. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.js.map +1 -1
  4. package/dist/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx +3 -8
  5. package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
  6. package/dist/components/layout/AdminHeaderActions.js +1 -29
  7. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  8. package/dist/components/layout/AdminHeaderActions.tsx +0 -42
  9. package/dist/components/layout/SolidAiStudioLayout.d.ts +0 -1
  10. package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
  11. package/dist/components/layout/SolidAiStudioLayout.js +9 -161
  12. package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
  13. package/dist/components/layout/SolidAiStudioLayout.tsx +7 -136
  14. package/dist/routes/AppEventListener.d.ts.map +1 -1
  15. package/dist/routes/AppEventListener.js +3 -3
  16. package/dist/routes/AppEventListener.js.map +1 -1
  17. package/dist/routes/AppEventListener.tsx +1 -2
  18. package/dist/routes/pages/admin/core/AgentHubTagsField.css +21 -0
  19. package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts +17 -0
  20. package/dist/routes/pages/admin/core/AgentHubTagsField.d.ts.map +1 -0
  21. package/dist/routes/pages/admin/core/AgentHubTagsField.js +171 -0
  22. package/dist/routes/pages/admin/core/AgentHubTagsField.js.map +1 -0
  23. package/dist/routes/pages/admin/core/AgentHubTagsField.tsx +125 -0
  24. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.css +7 -0
  25. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -1
  26. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +65 -52
  27. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -1
  28. package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +53 -11
  29. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.d.ts.map +1 -1
  30. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js +14 -69
  31. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.js.map +1 -1
  32. package/dist/routes/pages/admin/core/AgentSkillRegistryEditorPage.tsx +15 -83
  33. package/dist/routes/pages/admin/core/AgentToolActivationDialog.d.ts +11 -0
  34. package/dist/routes/pages/admin/core/AgentToolActivationDialog.d.ts.map +1 -0
  35. package/dist/routes/pages/admin/core/AgentToolActivationDialog.js +166 -0
  36. package/dist/routes/pages/admin/core/AgentToolActivationDialog.js.map +1 -0
  37. package/dist/routes/pages/admin/core/AgentToolActivationDialog.tsx +140 -0
  38. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.css +26 -0
  39. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.d.ts.map +1 -1
  40. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js +94 -71
  41. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.js.map +1 -1
  42. package/dist/routes/pages/admin/core/AgentToolRegistryEditorPage.tsx +60 -52
  43. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AgentResourceCardWidget.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAerF,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,EAAE,OAAO,EAAE,EAAE,0BAA0B,2CA8B9E"}
1
+ {"version":3,"file":"AgentResourceCardWidget.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAUrF,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,EAAE,OAAO,EAAE,EAAE,0BAA0B,2CA8B9E"}
@@ -2,17 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { SolidMaterialSymbol } from "../../../../../common/SolidMaterialSymbol";
3
3
  import styles from "./AgentRegistryCardWidget.module.css";
4
4
  function toTags(value) {
5
- if (Array.isArray(value))
6
- return value.map(String).map(function (tag) { return tag.trim(); }).filter(Boolean);
7
- if (typeof value !== "string" || !value.trim())
5
+ if (!Array.isArray(value))
8
6
  return [];
9
- try {
10
- var parsed = JSON.parse(value);
11
- return Array.isArray(parsed) ? parsed.map(String).map(function (tag) { return tag.trim(); }).filter(Boolean) : [];
12
- }
13
- catch (_a) {
14
- return value === "{}" ? [] : value.split(",").map(function (tag) { return tag.trim(); }).filter(Boolean);
15
- }
7
+ return value.map(function (tag) { return typeof tag === "object" && tag ? tag.name : tag; })
8
+ .filter(function (name) { return typeof name === "string"; }).map(function (name) { return name.trim(); }).filter(Boolean);
16
9
  }
17
10
  /** Compact shared card renderer for agent skill and tool records. */
18
11
  export function AgentResourceCardWidget(_a) {
@@ -1 +1 @@
1
- {"version":3,"file":"AgentResourceCardWidget.js","sourceRoot":"","sources":["../../../../../../../src/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { SolidKanbanCardWidgetProps } from \"../../../../../../types/solid-core\";\nimport { SolidMaterialSymbol } from \"../../../../../common/SolidMaterialSymbol\";\nimport styles from \"./AgentRegistryCardWidget.module.css\";\n\nfunction toTags(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String).map((tag) => tag.trim()).filter(Boolean);\n if (typeof value !== \"string\" || !value.trim()) return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.map(String).map((tag) => tag.trim()).filter(Boolean) : [];\n } catch {\n return value === \"{}\" ? [] : value.split(\",\").map((tag) => tag.trim()).filter(Boolean);\n }\n}\n\n/** Compact shared card renderer for agent skill and tool records. */\nexport function AgentResourceCardWidget({ rowData }: SolidKanbanCardWidgetProps) {\n const iconName = typeof rowData?.iconName === \"string\" && rowData.iconName.trim()\n ? rowData.iconName.trim()\n : rowData?.type ? \"build\" : \"psychology\";\n const name = typeof rowData?.name === \"string\" && rowData.name.trim() ? rowData.name.trim() : \"Untitled\";\n const description = typeof rowData?.description === \"string\" ? rowData.description.trim() : \"\";\n const tags = toTags(rowData?.tags);\n const status = typeof rowData?.status === \"string\" && rowData.status.trim() ? rowData.status.trim() : \"\";\n const loadError = status === \"load_failed\" && typeof rowData?.lastLoadError === \"string\"\n ? rowData.lastLoadError.trim()\n : \"\";\n const kind = typeof rowData?.type === \"string\" && rowData.type.trim() ? rowData.type.trim() : \"\";\n\n return (\n <article className={styles.card}>\n <div className={styles.header}>\n <div className={styles.iconBadge} aria-label={`${name} icon`}>\n <SolidMaterialSymbol name={iconName} size={22} aria-hidden=\"true\" />\n </div>\n {status && <span className={`${styles.status} ${styles[`status_${status.toLowerCase().replace(/[^a-z0-9]+/g, \"_\")}`] || \"\"}`}>{status.replace(/[_-]+/g, \" \")}</span>}\n </div>\n <div className={styles.heading}><h3 className={styles.title} title={name}>{name}</h3></div>\n <p className={styles.description} title={description || undefined}>{description || \"No description provided.\"}</p>\n {loadError && <p className={styles.loadError} title={loadError}>{loadError}</p>}\n {(kind || tags.length > 0) && <div className={styles.footer}>\n <div className={styles.meta}>{kind && <span className={styles.badge}>{kind.replace(/[_-]+/g, \" \")}</span>}</div>\n {tags.length > 0 && <div className={styles.tags}>{tags.slice(0, 3).map((tag) => <span className={styles.tag} key={tag}>{tag}</span>)}</div>}\n </div>}\n </article>\n );\n}\n"]}
1
+ {"version":3,"file":"AgentResourceCardWidget.js","sourceRoot":"","sources":["../../../../../../../src/components/core/extension/solid-core/agentRegistry/card/AgentResourceCardWidget.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,MAAM,MAAM,sCAAsC,CAAC;AAE1D,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,UAAC,GAAG,IAAK,OAAA,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAA/C,CAA+C,CAAC;SACvE,MAAM,CAAC,UAAC,IAAI,IAAqB,OAAA,OAAO,IAAI,KAAK,QAAQ,EAAxB,CAAwB,CAAC,CAAC,GAAG,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,EAAE,EAAX,CAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3G,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,uBAAuB,CAAC,EAAuC;QAArC,OAAO,aAAA;IAC/C,IAAM,QAAQ,GAAG,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAA,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC/E,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QACzB,CAAC,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;IAC3C,IAAM,IAAI,GAAG,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAA,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IACzG,IAAM,WAAW,GAAG,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAA,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,IAAM,IAAI,GAAG,MAAM,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC,CAAC;IACnC,IAAM,MAAM,GAAG,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAA,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzG,IAAM,SAAS,GAAG,MAAM,KAAK,aAAa,IAAI,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAA,KAAK,QAAQ;QACtF,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE;QAC9B,CAAC,CAAC,EAAE,CAAC;IACP,IAAM,IAAI,GAAG,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAA,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjG,OAAO,CACL,mBAAS,SAAS,EAAE,MAAM,CAAC,IAAI,aAC7B,eAAK,SAAS,EAAE,MAAM,CAAC,MAAM,aAC3B,cAAK,SAAS,EAAE,MAAM,CAAC,SAAS,gBAAc,UAAG,IAAI,UAAO,YAC1D,KAAC,mBAAmB,IAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,GAChE,EACL,MAAM,IAAI,eAAM,SAAS,EAAE,UAAG,MAAM,CAAC,MAAM,cAAI,MAAM,CAAC,iBAAU,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAE,CAAC,IAAI,EAAE,CAAE,YAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAQ,IAChK,EACN,cAAK,SAAS,EAAE,MAAM,CAAC,OAAO,YAAE,aAAI,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,YAAG,IAAI,GAAM,GAAM,EAC3F,YAAG,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,SAAS,YAAG,WAAW,IAAI,0BAA0B,GAAK,EACjH,SAAS,IAAI,YAAG,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,YAAG,SAAS,GAAK,EAC9E,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,eAAK,SAAS,EAAE,MAAM,CAAC,MAAM,aACzD,cAAK,SAAS,EAAE,MAAM,CAAC,IAAI,YAAG,IAAI,IAAI,eAAM,SAAS,EAAE,MAAM,CAAC,KAAK,YAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAQ,GAAO,EAC/G,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,cAAK,SAAS,EAAE,MAAM,CAAC,IAAI,YAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAC,GAAG,IAAK,OAAA,eAAM,SAAS,EAAE,MAAM,CAAC,GAAG,YAAa,GAAG,IAAT,GAAG,CAAc,EAAnD,CAAmD,CAAC,GAAO,IACvI,IACE,CACX,CAAC;AACJ,CAAC","sourcesContent":["import type { SolidKanbanCardWidgetProps } from \"../../../../../../types/solid-core\";\nimport { SolidMaterialSymbol } from \"../../../../../common/SolidMaterialSymbol\";\nimport styles from \"./AgentRegistryCardWidget.module.css\";\n\nfunction toTags(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.map((tag) => typeof tag === \"object\" && tag ? tag.name : tag)\n .filter((name): name is string => typeof name === \"string\").map((name) => name.trim()).filter(Boolean);\n}\n\n/** Compact shared card renderer for agent skill and tool records. */\nexport function AgentResourceCardWidget({ rowData }: SolidKanbanCardWidgetProps) {\n const iconName = typeof rowData?.iconName === \"string\" && rowData.iconName.trim()\n ? rowData.iconName.trim()\n : rowData?.type ? \"build\" : \"psychology\";\n const name = typeof rowData?.name === \"string\" && rowData.name.trim() ? rowData.name.trim() : \"Untitled\";\n const description = typeof rowData?.description === \"string\" ? rowData.description.trim() : \"\";\n const tags = toTags(rowData?.tags);\n const status = typeof rowData?.status === \"string\" && rowData.status.trim() ? rowData.status.trim() : \"\";\n const loadError = status === \"load_failed\" && typeof rowData?.lastLoadError === \"string\"\n ? rowData.lastLoadError.trim()\n : \"\";\n const kind = typeof rowData?.type === \"string\" && rowData.type.trim() ? rowData.type.trim() : \"\";\n\n return (\n <article className={styles.card}>\n <div className={styles.header}>\n <div className={styles.iconBadge} aria-label={`${name} icon`}>\n <SolidMaterialSymbol name={iconName} size={22} aria-hidden=\"true\" />\n </div>\n {status && <span className={`${styles.status} ${styles[`status_${status.toLowerCase().replace(/[^a-z0-9]+/g, \"_\")}`] || \"\"}`}>{status.replace(/[_-]+/g, \" \")}</span>}\n </div>\n <div className={styles.heading}><h3 className={styles.title} title={name}>{name}</h3></div>\n <p className={styles.description} title={description || undefined}>{description || \"No description provided.\"}</p>\n {loadError && <p className={styles.loadError} title={loadError}>{loadError}</p>}\n {(kind || tags.length > 0) && <div className={styles.footer}>\n <div className={styles.meta}>{kind && <span className={styles.badge}>{kind.replace(/[_-]+/g, \" \")}</span>}</div>\n {tags.length > 0 && <div className={styles.tags}>{tags.slice(0, 3).map((tag) => <span className={styles.tag} key={tag}>{tag}</span>)}</div>}\n </div>}\n </article>\n );\n}\n"]}
@@ -3,14 +3,9 @@ import { SolidMaterialSymbol } from "../../../../../common/SolidMaterialSymbol";
3
3
  import styles from "./AgentRegistryCardWidget.module.css";
4
4
 
5
5
  function toTags(value: unknown): string[] {
6
- if (Array.isArray(value)) return value.map(String).map((tag) => tag.trim()).filter(Boolean);
7
- if (typeof value !== "string" || !value.trim()) return [];
8
- try {
9
- const parsed = JSON.parse(value);
10
- return Array.isArray(parsed) ? parsed.map(String).map((tag) => tag.trim()).filter(Boolean) : [];
11
- } catch {
12
- return value === "{}" ? [] : value.split(",").map((tag) => tag.trim()).filter(Boolean);
13
- }
6
+ if (!Array.isArray(value)) return [];
7
+ return value.map((tag) => typeof tag === "object" && tag ? tag.name : tag)
8
+ .filter((name): name is string => typeof name === "string").map((name) => name.trim()).filter(Boolean);
14
9
  }
15
10
 
16
11
  /** Compact shared card renderer for agent skill and tool records. */
@@ -1 +1 @@
1
- {"version":3,"file":"AdminHeaderActions.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"AAaA,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,eAAO,MAAM,iBAAiB,+CAK7B,CAAC;AAYF,eAAO,MAAM,kBAAkB,2BAAiC,uBAAuB,mDAwHtF,CAAC"}
1
+ {"version":3,"file":"AdminHeaderActions.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"AAMA,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,eAAO,MAAM,iBAAiB,+CAK7B,CAAC;AAYF,eAAO,MAAM,kBAAkB,2BAAiC,uBAAuB,mDAqFtF,CAAC"}
@@ -9,13 +9,6 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
9
9
  };
10
10
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
11
  import { useContext, useMemo } from "react";
12
- import { useDispatch, useSelector } from "react-redux";
13
- // import { usePathname } from "../../hooks/usePathname";
14
- import { useRouter } from "../../hooks/useRouter";
15
- import { useSession } from "../../hooks/useSession";
16
- import { env } from "../../adapters/env";
17
- import { hasAnyRole } from "../../helpers/rolesHelper";
18
- import { enterStudioMode } from "../../redux/features/solidStudioSlice";
19
12
  import { LayoutContext } from "./context/layoutcontext";
20
13
  import { BackendReconnectIndicator } from "../common/BackendReconnectIndicator";
21
14
  import { useGetSolidSettingsQuery } from "../../redux/api/solidSettingsApi";
@@ -25,30 +18,12 @@ var ThemeToggleIcon = function () { return (_jsxs("svg", { xmlns: "http://www.w3
25
18
  export var AdminHeaderActions = function (_a) {
26
19
  var variant = _a.variant, _b = _a.className, className = _b === void 0 ? "" : _b;
27
20
  // const pathname = usePathname();
28
- var router = useRouter();
29
- var dispatch = useDispatch();
30
- var session = useSession().data;
31
21
  var _c = useContext(LayoutContext), toggleThemeMode = _c.toggleThemeMode, themeMode = _c.themeMode;
32
22
  var solidSettingsData = useGetSolidSettingsQuery(undefined).data;
33
- var user = session === null || session === void 0 ? void 0 : session.user;
34
- var isAdmin = hasAnyRole(user === null || user === void 0 ? void 0 : user.roles, ["Admin"]);
35
- var isStudioMode = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.isStudioMode) !== null && _b !== void 0 ? _b : false; });
36
- var isDev = env("VITE_SOLIDX_ENV") === "dev";
37
23
  var settingsMap = useMemo(function () { return getSettingsMap(solidSettingsData); }, [solidSettingsData]);
38
24
  var showThemeToggle = (settingsMap === null || settingsMap === void 0 ? void 0 : settingsMap.showThemeToggle) === true || (settingsMap === null || settingsMap === void 0 ? void 0 : settingsMap.showThemeToggle) === "true";
39
25
  // const showBack = /\/admin\/core\/[^/]+\/[^/]+\/form\/[^/]+/.test(pathname);
40
- var actions = __spreadArray(__spreadArray([], (isAdmin && isDev && !isStudioMode
41
- ? [{
42
- key: "studio",
43
- label: "Studio",
44
- onClick: function () {
45
- dispatch(enterStudioMode());
46
- router.push("/studio");
47
- },
48
- title: "Enter SolidX Studio",
49
- icon: _jsx(StudioSparkleIcon, {}),
50
- }]
51
- : []), true), (showThemeToggle
26
+ var actions = __spreadArray([], (showThemeToggle
52
27
  ? [{
53
28
  key: "theme",
54
29
  label: themeMode === "dark" ? "Light Mode" : "Dark Mode",
@@ -64,9 +39,6 @@ export var AdminHeaderActions = function (_a) {
64
39
  return (_jsx("div", { className: "solid-sidebar-mobile-actions md:hidden ".concat(className).trim(), children: actions.map(function (action) { return (_jsx("button", { type: "button", className: "solid-sidebar-mobile-action", onClick: action.onClick, title: action.title, "aria-label": action.title, children: action.label }, action.key)); }) }));
65
40
  }
66
41
  return (_jsxs("div", { className: "solid-admin-header-actions max-md:hidden lg:flex ".concat(className).trim(), children: [_jsx(BackendReconnectIndicator, {}), actions.map(function (action) {
67
- if (action.key === "studio") {
68
- return (_jsxs("button", { type: "button", className: "solid-studio-trigger-btn", onClick: action.onClick, title: action.title, "aria-label": action.title, children: [action.icon, _jsx("span", { className: "solid-studio-trigger-label", children: action.label })] }, action.key));
69
- }
70
42
  if (action.key === "theme") {
71
43
  return (_jsxs("button", { type: "button", className: "solid-admin-theme-toggle", onClick: action.onClick, "aria-label": action.title, title: action.title, children: [action.icon, _jsx("span", { className: "solid-sr-only", children: action.label })] }, action.key));
72
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AdminHeaderActions.js","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ReactNode, useContext, useMemo } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\n// import { usePathname } from \"../../hooks/usePathname\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { env } from \"../../adapters/env\";\nimport { hasAnyRole } from \"../../helpers/rolesHelper\";\nimport { enterStudioMode } from \"../../redux/features/solidStudioSlice\";\nimport { LayoutContext } from \"./context/layoutcontext\";\nimport { BackendReconnectIndicator } from \"../common/BackendReconnectIndicator\";\nimport { useGetSolidSettingsQuery } from \"../../redux/api/solidSettingsApi\";\nimport { getSettingsMap } from \"../../helpers/settingsPayload\";\n\ntype AdminHeaderActionsProps = {\n variant: \"header\" | \"sidebar\";\n className?: string;\n};\n\ntype AdminAction = {\n key: string;\n label: string;\n onClick: () => void;\n title: string;\n icon?: ReactNode;\n};\n\nexport const StudioSparkleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n </svg>\n);\n\nconst ThemeToggleIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const AdminHeaderActions = ({ variant, className = \"\" }: AdminHeaderActionsProps) => {\n // const pathname = usePathname();\n const router = useRouter();\n const dispatch = useDispatch();\n const { data: session } = useSession();\n const { toggleThemeMode, themeMode } = useContext(LayoutContext);\n const { data: solidSettingsData } = useGetSolidSettingsQuery(undefined);\n const user = session?.user;\n const isAdmin = hasAnyRole(user?.roles, [\"Admin\"]);\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const isDev = env(\"VITE_SOLIDX_ENV\") === \"dev\";\n const settingsMap = useMemo(() => getSettingsMap(solidSettingsData), [solidSettingsData]);\n const showThemeToggle = settingsMap?.showThemeToggle === true || settingsMap?.showThemeToggle === \"true\";\n // const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const actions: AdminAction[] = [\n ...(isAdmin && isDev && !isStudioMode\n ? [{\n key: \"studio\",\n label: \"Studio\",\n onClick: () => {\n dispatch(enterStudioMode());\n router.push(\"/studio\");\n },\n title: \"Enter SolidX Studio\",\n icon: <StudioSparkleIcon />,\n }]\n : []),\n ...(showThemeToggle\n ? [{\n key: \"theme\",\n label: themeMode === \"dark\" ? \"Light Mode\" : \"Dark Mode\",\n onClick: toggleThemeMode,\n title: \"Toggle theme\",\n icon: <ThemeToggleIcon />,\n }]\n : []),\n // ...(showBack\n // ? [{\n // key: \"back\",\n // label: \"Back\",\n // onClick: () => router.back(),\n // title: \"Go back\",\n // }]\n // : []),\n ];\n\n if (!actions.length) {\n return null;\n }\n\n if (variant === \"sidebar\") {\n return (\n <div className={`solid-sidebar-mobile-actions md:hidden ${className}`.trim()}>\n {actions.map((action) => (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-sidebar-mobile-action\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.label}\n </button>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`solid-admin-header-actions max-md:hidden lg:flex ${className}`.trim()}>\n <BackendReconnectIndicator />\n {actions.map((action) => {\n if (action.key === \"studio\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-studio-trigger-btn\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.icon}\n <span className=\"solid-studio-trigger-label\">{action.label}</span>\n </button>\n );\n }\n\n if (action.key === \"theme\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={action.onClick}\n aria-label={action.title}\n title={action.title}\n >\n {action.icon}\n <span className=\"solid-sr-only\">{action.label}</span>\n </button>\n );\n }\n\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={action.onClick}\n aria-label={action.title}\n >\n {action.label}\n </button>\n );\n })}\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"AdminHeaderActions.js","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ReactNode, useContext, useMemo } from \"react\";\nimport { LayoutContext } from \"./context/layoutcontext\";\nimport { BackendReconnectIndicator } from \"../common/BackendReconnectIndicator\";\nimport { useGetSolidSettingsQuery } from \"../../redux/api/solidSettingsApi\";\nimport { getSettingsMap } from \"../../helpers/settingsPayload\";\n\ntype AdminHeaderActionsProps = {\n variant: \"header\" | \"sidebar\";\n className?: string;\n};\n\ntype AdminAction = {\n key: string;\n label: string;\n onClick: () => void;\n title: string;\n icon?: ReactNode;\n};\n\nexport const StudioSparkleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n </svg>\n);\n\nconst ThemeToggleIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const AdminHeaderActions = ({ variant, className = \"\" }: AdminHeaderActionsProps) => {\n // const pathname = usePathname();\n const { toggleThemeMode, themeMode } = useContext(LayoutContext);\n const { data: solidSettingsData } = useGetSolidSettingsQuery(undefined);\n const settingsMap = useMemo(() => getSettingsMap(solidSettingsData), [solidSettingsData]);\n const showThemeToggle = settingsMap?.showThemeToggle === true || settingsMap?.showThemeToggle === \"true\";\n // const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const actions: AdminAction[] = [\n ...(showThemeToggle\n ? [{\n key: \"theme\",\n label: themeMode === \"dark\" ? \"Light Mode\" : \"Dark Mode\",\n onClick: toggleThemeMode,\n title: \"Toggle theme\",\n icon: <ThemeToggleIcon />,\n }]\n : []),\n // ...(showBack\n // ? [{\n // key: \"back\",\n // label: \"Back\",\n // onClick: () => router.back(),\n // title: \"Go back\",\n // }]\n // : []),\n ];\n\n if (!actions.length) {\n return null;\n }\n\n if (variant === \"sidebar\") {\n return (\n <div className={`solid-sidebar-mobile-actions md:hidden ${className}`.trim()}>\n {actions.map((action) => (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-sidebar-mobile-action\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.label}\n </button>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`solid-admin-header-actions max-md:hidden lg:flex ${className}`.trim()}>\n <BackendReconnectIndicator />\n {actions.map((action) => {\n if (action.key === \"theme\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={action.onClick}\n aria-label={action.title}\n title={action.title}\n >\n {action.icon}\n <span className=\"solid-sr-only\">{action.label}</span>\n </button>\n );\n }\n\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={action.onClick}\n aria-label={action.title}\n >\n {action.label}\n </button>\n );\n })}\n </div>\n );\n};\n"]}
@@ -1,11 +1,4 @@
1
1
  import { ReactNode, useContext, useMemo } from "react";
2
- import { useDispatch, useSelector } from "react-redux";
3
- // import { usePathname } from "../../hooks/usePathname";
4
- import { useRouter } from "../../hooks/useRouter";
5
- import { useSession } from "../../hooks/useSession";
6
- import { env } from "../../adapters/env";
7
- import { hasAnyRole } from "../../helpers/rolesHelper";
8
- import { enterStudioMode } from "../../redux/features/solidStudioSlice";
9
2
  import { LayoutContext } from "./context/layoutcontext";
10
3
  import { BackendReconnectIndicator } from "../common/BackendReconnectIndicator";
11
4
  import { useGetSolidSettingsQuery } from "../../redux/api/solidSettingsApi";
@@ -43,32 +36,13 @@ const ThemeToggleIcon = () => (
43
36
 
44
37
  export const AdminHeaderActions = ({ variant, className = "" }: AdminHeaderActionsProps) => {
45
38
  // const pathname = usePathname();
46
- const router = useRouter();
47
- const dispatch = useDispatch();
48
- const { data: session } = useSession();
49
39
  const { toggleThemeMode, themeMode } = useContext(LayoutContext);
50
40
  const { data: solidSettingsData } = useGetSolidSettingsQuery(undefined);
51
- const user = session?.user;
52
- const isAdmin = hasAnyRole(user?.roles, ["Admin"]);
53
- const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);
54
- const isDev = env("VITE_SOLIDX_ENV") === "dev";
55
41
  const settingsMap = useMemo(() => getSettingsMap(solidSettingsData), [solidSettingsData]);
56
42
  const showThemeToggle = settingsMap?.showThemeToggle === true || settingsMap?.showThemeToggle === "true";
57
43
  // const showBack = /\/admin\/core\/[^/]+\/[^/]+\/form\/[^/]+/.test(pathname);
58
44
 
59
45
  const actions: AdminAction[] = [
60
- ...(isAdmin && isDev && !isStudioMode
61
- ? [{
62
- key: "studio",
63
- label: "Studio",
64
- onClick: () => {
65
- dispatch(enterStudioMode());
66
- router.push("/studio");
67
- },
68
- title: "Enter SolidX Studio",
69
- icon: <StudioSparkleIcon />,
70
- }]
71
- : []),
72
46
  ...(showThemeToggle
73
47
  ? [{
74
48
  key: "theme",
@@ -115,22 +89,6 @@ export const AdminHeaderActions = ({ variant, className = "" }: AdminHeaderActio
115
89
  <div className={`solid-admin-header-actions max-md:hidden lg:flex ${className}`.trim()}>
116
90
  <BackendReconnectIndicator />
117
91
  {actions.map((action) => {
118
- if (action.key === "studio") {
119
- return (
120
- <button
121
- key={action.key}
122
- type="button"
123
- className="solid-studio-trigger-btn"
124
- onClick={action.onClick}
125
- title={action.title}
126
- aria-label={action.title}
127
- >
128
- {action.icon}
129
- <span className="solid-studio-trigger-label">{action.label}</span>
130
- </button>
131
- );
132
- }
133
-
134
92
  if (action.key === "theme") {
135
93
  return (
136
94
  <button
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
2
  export declare const ChatIcon: () => import("react/jsx-runtime").JSX.Element;
3
3
  export declare function SolidStudio(): React.ReactPortal | null;
4
- export declare function PreviewModePersist(): null;
5
4
  export declare function SolidStudioWrapper({ children }: {
6
5
  children: React.ReactNode;
7
6
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"SolidAiStudioLayout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAmC3D,eAAO,MAAM,QAAQ,+CAIpB,CAAC;AAyBF,wBAAgB,WAAW,6BAmL1B;AASD,wBAAgB,kBAAkB,SAsBjC;AAID,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE7E;AAGD,eAAO,MAAM,mBAAmB,2BAAqB,CAAC;AACtD,eAAO,MAAM,gBAAgB,oBAAc,CAAC"}
1
+ {"version":3,"file":"SolidAiStudioLayout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AA2B3D,eAAO,MAAM,QAAQ,+CAIpB,CAAC;AAyBF,wBAAgB,WAAW,6BAyF1B;AAID,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAE7E;AAGD,eAAO,MAAM,mBAAmB,2BAAqB,CAAC;AACtD,eAAO,MAAM,gBAAgB,oBAAc,CAAC"}
@@ -1,53 +1,15 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __generator = (this && this.__generator) || function (thisArg, body) {
11
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
- function verb(n) { return function (v) { return step([n, v]); }; }
14
- function step(op) {
15
- if (f) throw new TypeError("Generator is already executing.");
16
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
- if (y = 0, t) op = [op[0] & 2, t.value];
19
- switch (op[0]) {
20
- case 0: case 1: t = op; break;
21
- case 4: _.label++; return { value: op[1], done: false };
22
- case 5: _.label++; y = op[1]; op = [0]; continue;
23
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
- default:
25
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
- if (t[2]) _.ops.pop();
30
- _.trys.pop(); continue;
31
- }
32
- op = body.call(thisArg, _);
33
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
- }
36
- };
37
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
38
2
  import { useEffect, useRef, useState } from "react";
39
3
  import { useDispatch, useSelector } from "react-redux";
40
- import { useNavigate, useLocation } from "react-router-dom";
4
+ import { useNavigate } from "react-router-dom";
41
5
  import { exitStudioMode, setStudioView } from "../../redux/features/solidStudioSlice";
42
- import { showToast } from "../../redux/features/toastSlice";
43
6
  import { useSession } from "../../hooks/useSession";
44
- import { getSession, signOut } from "../../adapters/auth/index";
7
+ import { signOut } from "../../adapters/auth/index";
45
8
  import { createPortal } from "react-dom";
46
9
  import { env } from "../../adapters/env";
47
- import { ERROR_MESSAGES } from "../../constants/error-messages";
10
+ import { hasAnyRole } from "../../helpers/rolesHelper";
48
11
  // ── Icons ──────────────────────────────────────────────────────────────────────
49
12
  var DotsIcon = function () { return (_jsxs("svg", { width: "15", height: "15", viewBox: "0 0 16 16", fill: "currentColor", "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "3", r: "1.3" }), _jsx("circle", { cx: "8", cy: "8", r: "1.3" }), _jsx("circle", { cx: "8", cy: "13", r: "1.3" })] })); };
50
- var PreviewIcon = function () { return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M1 7s2.5-5 6-5 6 5 6 5-2.5 5-6 5-6-5-6-5Z", stroke: "currentColor", strokeWidth: "1.3", strokeLinejoin: "round" }), _jsx("circle", { cx: "7", cy: "7", r: "1.8", stroke: "currentColor", strokeWidth: "1.3" })] })); };
51
13
  var LogoutIcon = function () { return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M5 2H2.5A1.5 1.5 0 0 0 1 3.5v7A1.5 1.5 0 0 0 2.5 12H5", stroke: "currentColor", strokeWidth: "1.3", strokeLinecap: "round" }), _jsx("path", { d: "M9 4l3 3-3 3M12 7H5", stroke: "currentColor", strokeWidth: "1.3", strokeLinecap: "round", strokeLinejoin: "round" })] })); };
52
14
  export var ChatIcon = function () { return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) })); };
53
15
  var BackendIcon = function () { return (_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "2.2", y: "3", width: "11.6", height: "4", rx: "1", stroke: "currentColor", strokeWidth: "1.2" }), _jsx("rect", { x: "2.2", y: "9", width: "11.6", height: "4", rx: "1", stroke: "currentColor", strokeWidth: "1.2" }), _jsx("circle", { cx: "4.5", cy: "5", r: "0.7", fill: "currentColor" }), _jsx("circle", { cx: "4.5", cy: "11", r: "0.7", fill: "currentColor" })] })); };
@@ -55,20 +17,17 @@ var FrontendIcon = function () { return (_jsxs("svg", { width: "16", height: "16
55
17
  // ── SolidStudio ────────────────────────────────────────────────────────────────
56
18
  // Single component that renders both the Studio header and the AI panel.
57
19
  // Mount this ONCE at the app root via AppEventListener.
58
- // When studio mode is off it renders nothing.
20
+ // Visible to Admin users in dev environments.
59
21
  export function SolidStudio() {
60
- var _this = this;
22
+ var _a;
61
23
  var isStudioMode = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.isStudioMode) !== null && _b !== void 0 ? _b : false; });
62
24
  var studioView = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.studioView) !== null && _b !== void 0 ? _b : null; });
63
25
  var dispatch = useDispatch();
64
26
  var navigate = useNavigate();
65
- var _a = useLocation(), pathname = _a.pathname, search = _a.search;
66
- var isPreviewMode = new URLSearchParams(search).get("preview") === "true" || (typeof sessionStorage !== "undefined" && sessionStorage.getItem("solid-preview") === "true");
67
- var isPreviewable = pathname !== "/studio" && pathname !== "/landing";
68
27
  var _b = useSession(), data = _b.data, status = _b.status;
69
- var isAuthenticated = status === "authenticated";
28
+ var isAdmin = hasAnyRole((_a = data === null || data === void 0 ? void 0 : data.user) === null || _a === void 0 ? void 0 : _a.roles, ["Admin"]);
29
+ var isDev = env("VITE_SOLIDX_ENV") === "dev";
70
30
  var _c = useState(false), isMenuOpen = _c[0], setIsMenuOpen = _c[1];
71
- var _d = useState(false), isChatRedirecting = _d[0], setIsChatRedirecting = _d[1];
72
31
  var menuRef = useRef(null);
73
32
  // Close the 3-dot menu when clicking outside
74
33
  useEffect(function () {
@@ -88,7 +47,7 @@ export function SolidStudio() {
88
47
  dispatch(exitStudioMode());
89
48
  }
90
49
  }, [status, isStudioMode, dispatch]);
91
- if (!isStudioMode || !isAuthenticated || isPreviewMode)
50
+ if (!isAdmin || !isDev)
92
51
  return null;
93
52
  var handleLogout = function () {
94
53
  setIsMenuOpen(false);
@@ -99,120 +58,9 @@ export function SolidStudio() {
99
58
  dispatch(setStudioView(view));
100
59
  navigate(view === "backend" ? "/admin" : "/landing");
101
60
  };
102
- var handleAiChatClick = function () { return __awaiter(_this, void 0, void 0, function () {
103
- var aiUrl, session, accessToken, apiBaseUrl, response, detail, errorPayload, _a, payload, ssoCode, redirectUrl, error_1, detail;
104
- var _b, _c, _d, _e, _f, _g;
105
- return __generator(this, function (_h) {
106
- switch (_h.label) {
107
- case 0:
108
- if (isChatRedirecting)
109
- return [2 /*return*/];
110
- aiUrl = env("VITE_SOLIDX_AI_URL");
111
- if (!aiUrl)
112
- return [2 /*return*/];
113
- setIsChatRedirecting(true);
114
- _h.label = 1;
115
- case 1:
116
- _h.trys.push([1, 10, 11, 12]);
117
- return [4 /*yield*/, getSession()];
118
- case 2:
119
- session = _h.sent();
120
- accessToken = ((_b = session === null || session === void 0 ? void 0 : session.user) === null || _b === void 0 ? void 0 : _b.accessToken) || ((_c = data === null || data === void 0 ? void 0 : data.user) === null || _c === void 0 ? void 0 : _c.accessToken);
121
- if (!accessToken)
122
- return [2 /*return*/];
123
- apiBaseUrl = env("API_URL", "http://localhost:8080").replace(/\/+$/, "");
124
- return [4 /*yield*/, fetch("".concat(apiBaseUrl, "/api/iam/sso/code"), {
125
- method: "POST",
126
- headers: {
127
- accept: "*/*",
128
- Authorization: "Bearer ".concat(accessToken),
129
- },
130
- body: "",
131
- })];
132
- case 3:
133
- response = _h.sent();
134
- if (!!response.ok) return [3 /*break*/, 8];
135
- detail = "Failed to fetch ssoCode (".concat(response.status, ")");
136
- _h.label = 4;
137
- case 4:
138
- _h.trys.push([4, 6, , 7]);
139
- return [4 /*yield*/, response.json()];
140
- case 5:
141
- errorPayload = _h.sent();
142
- detail =
143
- (errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.message) ||
144
- ((_d = errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.error) === null || _d === void 0 ? void 0 : _d.message) ||
145
- ((_e = errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.data) === null || _e === void 0 ? void 0 : _e.message) ||
146
- detail;
147
- return [3 /*break*/, 7];
148
- case 6:
149
- _a = _h.sent();
150
- return [3 /*break*/, 7];
151
- case 7: throw new Error(detail);
152
- case 8: return [4 /*yield*/, response.json()];
153
- case 9:
154
- payload = _h.sent();
155
- ssoCode = (_f = payload === null || payload === void 0 ? void 0 : payload.ssoCode) !== null && _f !== void 0 ? _f : (_g = payload === null || payload === void 0 ? void 0 : payload.data) === null || _g === void 0 ? void 0 : _g.ssoCode;
156
- if (!ssoCode) {
157
- throw new Error("ssoCode missing in response");
158
- }
159
- redirectUrl = new URL(aiUrl, window.location.origin);
160
- redirectUrl.searchParams.set("ssoCode", String(ssoCode));
161
- window.open(redirectUrl.toString(), "_blank");
162
- return [3 /*break*/, 12];
163
- case 10:
164
- error_1 = _h.sent();
165
- detail = error_1 instanceof Error ? error_1.message : ERROR_MESSAGES.SOMETHING_WRONG;
166
- dispatch(showToast({
167
- severity: "error",
168
- summary: ERROR_MESSAGES.ERROR,
169
- detail: detail,
170
- life: 4000,
171
- }));
172
- console.error("Failed to open AI chat with ssoCode:", error_1);
173
- return [3 /*break*/, 12];
174
- case 11:
175
- setIsChatRedirecting(false);
176
- return [7 /*endfinally*/];
177
- case 12: return [2 /*return*/];
178
- }
179
- });
180
- }); };
181
- var studioUI = (_jsx("div", { className: "solid-studio-island", style: { zIndex: "var(--z-studio)" }, children: _jsxs("div", { className: "solid-studio-island-inner", children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "backend" ? " active" : ""), onClick: function () { return handleViewSwitch("backend"); }, "aria-label": "Backend studio", children: _jsx(BackendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "frontend" ? " active" : ""), onClick: function () { return handleViewSwitch("frontend"); }, "aria-label": "Frontend studio", children: _jsx(FrontendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn", onClick: handleAiChatClick, disabled: isChatRedirecting, "aria-busy": isChatRedirecting, "aria-label": "AI chat", children: _jsx(ChatIcon, {}) }), _jsxs("div", { className: "solid-studio-island-menu", ref: menuRef, children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(isMenuOpen ? " active" : ""), onClick: function () { return setIsMenuOpen(function (o) { return !o; }); }, "aria-label": "Studio options", children: _jsx(DotsIcon, {}) }), isMenuOpen && (_jsxs("div", { className: "solid-studio-island-dropdown", children: [isPreviewable && (_jsxs("button", { type: "button", className: "solid-studio-island-dropdown-item", onClick: function () {
182
- setIsMenuOpen(false);
183
- var params = new URLSearchParams(search);
184
- params.set("preview", "true");
185
- window.open("".concat(pathname, "?").concat(params.toString()), "_blank");
186
- }, children: [_jsx(PreviewIcon, {}), "Preview page"] })), _jsxs("button", { type: "button", className: "solid-studio-island-dropdown-item danger", onClick: handleLogout, children: [_jsx(LogoutIcon, {}), "Logout"] })] }))] })] }) }));
61
+ var studioUI = (_jsx("div", { className: "solid-studio-island", style: { zIndex: "var(--z-studio)" }, children: _jsxs("div", { className: "solid-studio-island-inner", children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "backend" ? " active" : ""), onClick: function () { return handleViewSwitch("backend"); }, "aria-label": "Backend studio", children: _jsx(BackendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "frontend" ? " active" : ""), onClick: function () { return handleViewSwitch("frontend"); }, "aria-label": "Frontend studio", children: _jsx(FrontendIcon, {}) }), _jsxs("div", { className: "solid-studio-island-menu", ref: menuRef, children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(isMenuOpen ? " active" : ""), onClick: function () { return setIsMenuOpen(function (o) { return !o; }); }, "aria-label": "Studio options", children: _jsx(DotsIcon, {}) }), isMenuOpen && (_jsx("div", { className: "solid-studio-island-dropdown", children: _jsxs("button", { type: "button", className: "solid-studio-island-dropdown-item danger", onClick: handleLogout, children: [_jsx(LogoutIcon, {}), "Logout"] }) }))] })] }) }));
187
62
  return typeof document !== "undefined" ? createPortal(studioUI, document.body) : null;
188
63
  }
189
- // ── PreviewModePersist ─────────────────────────────────────────────────────────
190
- // Mount once at the app root alongside SolidStudio.
191
- // sessionStorage is tab-scoped, so preview opened in a new tab stays isolated.
192
- // Closing the tab is the natural way to exit preview mode.
193
- var PREVIEW_KEY = "solid-preview";
194
- export function PreviewModePersist() {
195
- var _a = useLocation(), pathname = _a.pathname, search = _a.search;
196
- var navigate = useNavigate();
197
- // Activate: when URL has ?preview=true, store it in sessionStorage for this tab
198
- useEffect(function () {
199
- var params = new URLSearchParams(search);
200
- if (params.get("preview") === "true") {
201
- sessionStorage.setItem(PREVIEW_KEY, "true");
202
- }
203
- }, [search]);
204
- // Persist: re-inject ?preview=true on every navigation if it was set
205
- useEffect(function () {
206
- if (sessionStorage.getItem(PREVIEW_KEY) !== "true")
207
- return;
208
- var params = new URLSearchParams(search);
209
- if (params.get("preview") === "true")
210
- return;
211
- params.set("preview", "true");
212
- navigate({ pathname: pathname, search: "?".concat(params.toString()) }, { replace: true });
213
- }, [pathname, search, navigate]);
214
- return null;
215
- }
216
64
  // ── SolidStudioWrapper ─────────────────────────────────────────────────────────
217
65
  // Kept for backwards compatibility. Now a pure pass-through.
218
66
  export function SolidStudioWrapper(_a) {
@@ -1 +1 @@
1
- {"version":3,"file":"SolidAiStudioLayout.js","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport { exitStudioMode, setStudioView, type StudioView } from \"../../redux/features/solidStudioSlice\";\nimport { showToast } from \"../../redux/features/toastSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { getSession, signOut } from \"../../adapters/auth/index\";\nimport { createPortal } from \"react-dom\";\nimport { env } from \"../../adapters/env\";\nimport { ERROR_MESSAGES } from \"../../constants/error-messages\";\n\n// ── Icons ──────────────────────────────────────────────────────────────────────\n\nconst DotsIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"3\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.3\" />\n </svg>\n);\n\nconst PreviewIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 7s2.5-5 6-5 6 5 6 5-2.5 5-6 5-6-5-6-5Z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.8\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n);\n\nconst LogoutIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 2H2.5A1.5 1.5 0 0 0 1 3.5v7A1.5 1.5 0 0 0 2.5 12H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n <path d=\"M9 4l3 3-3 3M12 7H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const ChatIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst BackendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2.2\" y=\"3\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"2.2\" y=\"9\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <circle cx=\"4.5\" cy=\"5\" r=\"0.7\" fill=\"currentColor\" />\n <circle cx=\"4.5\" cy=\"11\" r=\"0.7\" fill=\"currentColor\" />\n </svg>\n);\n\nconst FrontendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.8\" y=\"2\" width=\"12.4\" height=\"9.5\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M6 13.5 5 15h6l-1-1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M5.5 5 7.5 7l-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"m10.5 5 2 2-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ── SolidStudio ────────────────────────────────────────────────────────────────\n// Single component that renders both the Studio header and the AI panel.\n// Mount this ONCE at the app root via AppEventListener.\n// When studio mode is off it renders nothing.\n\nexport function SolidStudio() {\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const studioView = useSelector((state: any) => state.solidStudio?.studioView ?? null) as StudioView;\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { pathname, search } = useLocation();\n const isPreviewMode = new URLSearchParams(search).get(\"preview\") === \"true\" || (typeof sessionStorage !== \"undefined\" && sessionStorage.getItem(\"solid-preview\") === \"true\");\n const isPreviewable = pathname !== \"/studio\" && pathname !== \"/landing\";\n const { data, status } = useSession();\n const isAuthenticated = status === \"authenticated\";\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isChatRedirecting, setIsChatRedirecting] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close the 3-dot menu when clicking outside\n useEffect(() => {\n if (!isMenuOpen) return;\n const handler = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isMenuOpen]);\n\n // Auto-exit studio if the user logs out\n useEffect(() => {\n if (status === \"unauthenticated\" && isStudioMode) {\n dispatch(exitStudioMode());\n }\n }, [status, isStudioMode, dispatch]);\n\n if (!isStudioMode || !isAuthenticated || isPreviewMode) return null;\n\n const handleLogout = () => {\n setIsMenuOpen(false);\n dispatch(exitStudioMode());\n signOut({ callbackUrl: \"/auth/login\" });\n };\n\n const handleViewSwitch = (view: StudioView) => {\n dispatch(setStudioView(view));\n navigate(view === \"backend\" ? \"/admin\" : \"/landing\");\n };\n\n const handleAiChatClick = async () => {\n if (isChatRedirecting) return;\n\n const aiUrl = env(\"VITE_SOLIDX_AI_URL\");\n if (!aiUrl) return;\n\n setIsChatRedirecting(true);\n try {\n const session = await getSession();\n const accessToken = session?.user?.accessToken || data?.user?.accessToken;\n if (!accessToken) return;\n\n const apiBaseUrl = env(\"API_URL\", \"http://localhost:8080\").replace(/\\/+$/, \"\");\n const response = await fetch(`${apiBaseUrl}/api/iam/sso/code`, {\n method: \"POST\",\n headers: {\n accept: \"*/*\",\n Authorization: `Bearer ${accessToken}`,\n },\n body: \"\",\n });\n\n if (!response.ok) {\n let detail = `Failed to fetch ssoCode (${response.status})`;\n try {\n const errorPayload = await response.json();\n detail =\n errorPayload?.message ||\n errorPayload?.error?.message ||\n errorPayload?.data?.message ||\n detail;\n } catch {\n // no-op: keep default message\n }\n throw new Error(detail);\n }\n\n const payload = await response.json();\n const ssoCode = payload?.ssoCode ?? payload?.data?.ssoCode;\n if (!ssoCode) {\n throw new Error(\"ssoCode missing in response\");\n }\n\n const redirectUrl = new URL(aiUrl, window.location.origin);\n redirectUrl.searchParams.set(\"ssoCode\", String(ssoCode));\n window.open(redirectUrl.toString(), \"_blank\");\n } catch (error) {\n const detail = error instanceof Error ? error.message : ERROR_MESSAGES.SOMETHING_WRONG;\n dispatch(\n showToast({\n severity: \"error\",\n summary: ERROR_MESSAGES.ERROR,\n detail,\n life: 4000,\n })\n );\n console.error(\"Failed to open AI chat with ssoCode:\", error);\n } finally {\n setIsChatRedirecting(false);\n }\n };\n\n const studioUI = (\n <div className=\"solid-studio-island\" style={{ zIndex: \"var(--z-studio)\" }}>\n <div className=\"solid-studio-island-inner\">\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"backend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"backend\")}\n aria-label=\"Backend studio\"\n >\n <BackendIcon />\n </button>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"frontend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"frontend\")}\n aria-label=\"Frontend studio\"\n >\n <FrontendIcon />\n </button>\n <button\n type=\"button\"\n className=\"solid-studio-island-btn\"\n onClick={handleAiChatClick}\n disabled={isChatRedirecting}\n aria-busy={isChatRedirecting}\n aria-label=\"AI chat\"\n >\n <ChatIcon />\n </button>\n <div className=\"solid-studio-island-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${isMenuOpen ? \" active\" : \"\"}`}\n onClick={() => setIsMenuOpen((o) => !o)}\n aria-label=\"Studio options\"\n >\n <DotsIcon />\n </button>\n {isMenuOpen && (\n <div className=\"solid-studio-island-dropdown\">\n {isPreviewable && (\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item\"\n onClick={() => {\n setIsMenuOpen(false);\n const params = new URLSearchParams(search);\n params.set(\"preview\", \"true\");\n window.open(`${pathname}?${params.toString()}`, \"_blank\");\n }}\n >\n <PreviewIcon />\n Preview page\n </button>\n )}\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item danger\"\n onClick={handleLogout}\n >\n <LogoutIcon />\n Logout\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n return typeof document !== \"undefined\" ? createPortal(studioUI, document.body) : null;\n}\n\n// ── PreviewModePersist ─────────────────────────────────────────────────────────\n// Mount once at the app root alongside SolidStudio.\n// sessionStorage is tab-scoped, so preview opened in a new tab stays isolated.\n// Closing the tab is the natural way to exit preview mode.\n\nconst PREVIEW_KEY = \"solid-preview\";\n\nexport function PreviewModePersist() {\n const { pathname, search } = useLocation();\n const navigate = useNavigate();\n\n // Activate: when URL has ?preview=true, store it in sessionStorage for this tab\n useEffect(() => {\n const params = new URLSearchParams(search);\n if (params.get(\"preview\") === \"true\") {\n sessionStorage.setItem(PREVIEW_KEY, \"true\");\n }\n }, [search]);\n\n // Persist: re-inject ?preview=true on every navigation if it was set\n useEffect(() => {\n if (sessionStorage.getItem(PREVIEW_KEY) !== \"true\") return;\n const params = new URLSearchParams(search);\n if (params.get(\"preview\") === \"true\") return;\n params.set(\"preview\", \"true\");\n navigate({ pathname, search: `?${params.toString()}` }, { replace: true });\n }, [pathname, search, navigate]);\n\n return null;\n}\n\n// ── SolidStudioWrapper ─────────────────────────────────────────────────────────\n// Kept for backwards compatibility. Now a pure pass-through.\nexport function SolidStudioWrapper({ children }: { children: React.ReactNode }) {\n return <>{children}</>;\n}\n\n// Legacy aliases\nexport const SolidAiStudioLayout = SolidStudioWrapper;\nexport const SolidStudioPanel = SolidStudio;\n"]}
1
+ {"version":3,"file":"SolidAiStudioLayout.js","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useNavigate } from \"react-router-dom\";\nimport { exitStudioMode, setStudioView, type StudioView } from \"../../redux/features/solidStudioSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { signOut } from \"../../adapters/auth/index\";\nimport { createPortal } from \"react-dom\";\nimport { env } from \"../../adapters/env\";\nimport { hasAnyRole } from \"../../helpers/rolesHelper\";\n\n// ── Icons ──────────────────────────────────────────────────────────────────────\n\nconst DotsIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"3\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.3\" />\n </svg>\n);\n\nconst LogoutIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 2H2.5A1.5 1.5 0 0 0 1 3.5v7A1.5 1.5 0 0 0 2.5 12H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n <path d=\"M9 4l3 3-3 3M12 7H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const ChatIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst BackendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2.2\" y=\"3\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"2.2\" y=\"9\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <circle cx=\"4.5\" cy=\"5\" r=\"0.7\" fill=\"currentColor\" />\n <circle cx=\"4.5\" cy=\"11\" r=\"0.7\" fill=\"currentColor\" />\n </svg>\n);\n\nconst FrontendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.8\" y=\"2\" width=\"12.4\" height=\"9.5\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M6 13.5 5 15h6l-1-1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M5.5 5 7.5 7l-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"m10.5 5 2 2-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ── SolidStudio ────────────────────────────────────────────────────────────────\n// Single component that renders both the Studio header and the AI panel.\n// Mount this ONCE at the app root via AppEventListener.\n// Visible to Admin users in dev environments.\n\nexport function SolidStudio() {\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const studioView = useSelector((state: any) => state.solidStudio?.studioView ?? null) as StudioView;\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { data, status } = useSession();\n const isAdmin = hasAnyRole(data?.user?.roles, [\"Admin\"]);\n const isDev = env(\"VITE_SOLIDX_ENV\") === \"dev\";\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close the 3-dot menu when clicking outside\n useEffect(() => {\n if (!isMenuOpen) return;\n const handler = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isMenuOpen]);\n\n // Auto-exit studio if the user logs out\n useEffect(() => {\n if (status === \"unauthenticated\" && isStudioMode) {\n dispatch(exitStudioMode());\n }\n }, [status, isStudioMode, dispatch]);\n\n if (!isAdmin || !isDev) return null;\n\n const handleLogout = () => {\n setIsMenuOpen(false);\n dispatch(exitStudioMode());\n signOut({ callbackUrl: \"/auth/login\" });\n };\n\n const handleViewSwitch = (view: StudioView) => {\n dispatch(setStudioView(view));\n navigate(view === \"backend\" ? \"/admin\" : \"/landing\");\n };\n\n const studioUI = (\n <div className=\"solid-studio-island\" style={{ zIndex: \"var(--z-studio)\" }}>\n <div className=\"solid-studio-island-inner\">\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"backend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"backend\")}\n aria-label=\"Backend studio\"\n >\n <BackendIcon />\n </button>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"frontend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"frontend\")}\n aria-label=\"Frontend studio\"\n >\n <FrontendIcon />\n </button>\n <div className=\"solid-studio-island-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${isMenuOpen ? \" active\" : \"\"}`}\n onClick={() => setIsMenuOpen((o) => !o)}\n aria-label=\"Studio options\"\n >\n <DotsIcon />\n </button>\n {isMenuOpen && (\n <div className=\"solid-studio-island-dropdown\">\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item danger\"\n onClick={handleLogout}\n >\n <LogoutIcon />\n Logout\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n return typeof document !== \"undefined\" ? createPortal(studioUI, document.body) : null;\n}\n\n// ── SolidStudioWrapper ─────────────────────────────────────────────────────────\n// Kept for backwards compatibility. Now a pure pass-through.\nexport function SolidStudioWrapper({ children }: { children: React.ReactNode }) {\n return <>{children}</>;\n}\n\n// Legacy aliases\nexport const SolidAiStudioLayout = SolidStudioWrapper;\nexport const SolidStudioPanel = SolidStudio;\n"]}