@fayz-ai/admin 0.22.1 → 0.23.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 (124) hide show
  1. package/dist/{CommandPalette-GQ6SPITD.js → CommandPalette-ANZWU27U.js} +5 -5
  2. package/dist/CommandPalette-ANZWU27U.js.map +1 -0
  3. package/dist/ScheduleEditor-KU4UUG6Q.js +7 -0
  4. package/dist/ScheduleEditor-KU4UUG6Q.js.map +1 -0
  5. package/dist/SubscriptionPage-4EJCCS4I.js +8 -0
  6. package/dist/{SubscriptionPage-Y23PH6US.js.map → SubscriptionPage-4EJCCS4I.js.map} +1 -1
  7. package/dist/app/AdminShell.d.ts +2 -0
  8. package/dist/app/AdminShell.d.ts.map +1 -1
  9. package/dist/app/WrongAppGate.d.ts +46 -0
  10. package/dist/app/WrongAppGate.d.ts.map +1 -0
  11. package/dist/app/admin-app.d.ts.map +1 -1
  12. package/dist/app/app-config-cache.d.ts +13 -0
  13. package/dist/app/app-config-cache.d.ts.map +1 -0
  14. package/dist/app/contextual-nav.store.d.ts +7 -5
  15. package/dist/app/contextual-nav.store.d.ts.map +1 -1
  16. package/dist/app/nav-serving.d.ts +40 -0
  17. package/dist/app/nav-serving.d.ts.map +1 -0
  18. package/dist/app/nav-waiting.d.ts +23 -0
  19. package/dist/app/nav-waiting.d.ts.map +1 -0
  20. package/dist/app/rail-preset.d.ts +38 -0
  21. package/dist/app/rail-preset.d.ts.map +1 -0
  22. package/dist/app/scaffold.d.ts.map +1 -1
  23. package/dist/app/useAppPreset.d.ts +81 -0
  24. package/dist/app/useAppPreset.d.ts.map +1 -0
  25. package/dist/app/useDomainTenant.d.ts +32 -0
  26. package/dist/app/useDomainTenant.d.ts.map +1 -0
  27. package/dist/app/useTenantShell.d.ts +35 -0
  28. package/dist/app/useTenantShell.d.ts.map +1 -0
  29. package/dist/billing/index.js +2 -2
  30. package/dist/{chunk-YBLLTHYP.js → chunk-LB5SV4ZZ.js} +6 -6
  31. package/dist/{chunk-YBLLTHYP.js.map → chunk-LB5SV4ZZ.js.map} +1 -1
  32. package/dist/{ScheduleEditor-B7PLFGVM.js → chunk-NXFFJY2X.js} +44 -8
  33. package/dist/chunk-NXFFJY2X.js.map +1 -0
  34. package/dist/{chunk-NB6X5O5L.js → chunk-R4HQ2HS2.js} +22 -6
  35. package/dist/chunk-R4HQ2HS2.js.map +1 -0
  36. package/dist/{chunk-CTCK5JUQ.js → chunk-U3VX52SE.js} +4 -5
  37. package/dist/chunk-U3VX52SE.js.map +1 -0
  38. package/dist/{chunk-WJ3H3RJN.js → chunk-UQ2NTFQC.js} +4 -2
  39. package/dist/chunk-UQ2NTFQC.js.map +1 -0
  40. package/dist/{chunk-5GWUM4SM.js → chunk-W5IBKM3K.js} +3 -2
  41. package/dist/chunk-W5IBKM3K.js.map +1 -0
  42. package/dist/{chunk-ZKOWNGZT.js → chunk-XJB76FHA.js} +216 -72
  43. package/dist/chunk-XJB76FHA.js.map +1 -0
  44. package/dist/components/RightRail.d.ts.map +1 -1
  45. package/dist/components/chat/AgentAvatar.d.ts +6 -1
  46. package/dist/components/chat/AgentAvatar.d.ts.map +1 -1
  47. package/dist/components/chat/AssistantInvite.d.ts.map +1 -1
  48. package/dist/components/chat/ChatConversation.d.ts.map +1 -1
  49. package/dist/components/chat/ChatFab.d.ts.map +1 -1
  50. package/dist/components/layout/CommandPalette.d.ts +5 -1
  51. package/dist/components/layout/CommandPalette.d.ts.map +1 -1
  52. package/dist/components/layout/PrintChrome.d.ts.map +1 -1
  53. package/dist/components/right-rail.d.ts +2 -0
  54. package/dist/components/right-rail.d.ts.map +1 -1
  55. package/dist/components/settings/AddModulesPanel.d.ts +45 -0
  56. package/dist/components/settings/AddModulesPanel.d.ts.map +1 -0
  57. package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
  58. package/dist/components/settings/ConnectedModulesSettings.d.ts +5 -0
  59. package/dist/components/settings/ConnectedModulesSettings.d.ts.map +1 -0
  60. package/dist/components/settings/ModuleCard.d.ts +26 -0
  61. package/dist/components/settings/ModuleCard.d.ts.map +1 -0
  62. package/dist/components/settings/ModulesSettings.d.ts +48 -0
  63. package/dist/components/settings/ModulesSettings.d.ts.map +1 -0
  64. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  65. package/dist/components/settings/module-catalog.d.ts +58 -0
  66. package/dist/components/settings/module-catalog.d.ts.map +1 -0
  67. package/dist/crud/CrudFormPage.d.ts.map +1 -1
  68. package/dist/crud/archetypes/OrderDetailView.d.ts +44 -0
  69. package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
  70. package/dist/directory/AppSwitcher.d.ts +6 -2
  71. package/dist/directory/AppSwitcher.d.ts.map +1 -1
  72. package/dist/hooks/useAppConfig.d.ts +8 -0
  73. package/dist/hooks/useAppConfig.d.ts.map +1 -1
  74. package/dist/hooks/useChat.d.ts.map +1 -1
  75. package/dist/hooks/useLayout.d.ts +4 -1
  76. package/dist/hooks/useLayout.d.ts.map +1 -1
  77. package/dist/index.d.ts +4 -1
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +2069 -980
  80. package/dist/index.js.map +1 -1
  81. package/dist/lib/agent-surface.d.ts +8 -1
  82. package/dist/lib/agent-surface.d.ts.map +1 -1
  83. package/dist/lib/ai-tool-handlers.d.ts.map +1 -1
  84. package/dist/lib/brand.d.ts +45 -0
  85. package/dist/lib/brand.d.ts.map +1 -1
  86. package/dist/lib/search-targets.d.ts.map +1 -1
  87. package/dist/org/OrgMark.d.ts +41 -0
  88. package/dist/org/OrgMark.d.ts.map +1 -0
  89. package/dist/org/WorkspaceChooser.d.ts +1 -0
  90. package/dist/org/WorkspaceChooser.d.ts.map +1 -1
  91. package/dist/org/WorkspaceChooserGate.d.ts.map +1 -1
  92. package/dist/org/WorkspaceSwitching.d.ts.map +1 -1
  93. package/dist/org/context.d.ts +13 -1
  94. package/dist/org/context.d.ts.map +1 -1
  95. package/dist/org/index.d.ts +2 -0
  96. package/dist/org/index.d.ts.map +1 -1
  97. package/dist/org/index.js +4 -4
  98. package/dist/org/switching.store.d.ts.map +1 -1
  99. package/dist/org/workspace-search.d.ts +27 -0
  100. package/dist/org/workspace-search.d.ts.map +1 -0
  101. package/dist/permissions/index.js +1 -1
  102. package/dist/permissions/store.d.ts +12 -0
  103. package/dist/permissions/store.d.ts.map +1 -1
  104. package/dist/setup/SetupAgentSurface.d.ts.map +1 -1
  105. package/dist/stores/app-config.store.d.ts +5 -1
  106. package/dist/stores/app-config.store.d.ts.map +1 -1
  107. package/dist/theme/dark.d.ts.map +1 -1
  108. package/dist/theme/light.d.ts.map +1 -1
  109. package/dist/theme/tokens.d.ts +13 -0
  110. package/dist/theme/tokens.d.ts.map +1 -1
  111. package/dist/theme/utils.d.ts.map +1 -1
  112. package/dist/units/UnitSwitcher.d.ts +10 -1
  113. package/dist/units/UnitSwitcher.d.ts.map +1 -1
  114. package/package.json +6 -6
  115. package/dist/CommandPalette-GQ6SPITD.js.map +0 -1
  116. package/dist/ScheduleEditor-B7PLFGVM.js.map +0 -1
  117. package/dist/SubscriptionPage-Y23PH6US.js +0 -8
  118. package/dist/chunk-5GWUM4SM.js.map +0 -1
  119. package/dist/chunk-CTCK5JUQ.js.map +0 -1
  120. package/dist/chunk-NB6X5O5L.js.map +0 -1
  121. package/dist/chunk-RKXZ7RUG.js +0 -20
  122. package/dist/chunk-RKXZ7RUG.js.map +0 -1
  123. package/dist/chunk-WJ3H3RJN.js.map +0 -1
  124. package/dist/chunk-ZKOWNGZT.js.map +0 -1
@@ -1,13 +1,14 @@
1
- import { markWorkspaceSwitch, clearOrgSnapshot, useTenant, useTenantOptional, setAutoPick } from './chunk-NB6X5O5L.js';
2
- import { persistOrgId, getPersistedOrgId } from './chunk-5GWUM4SM.js';
1
+ import { markWorkspaceSwitch, clearOrgSnapshot, useTenant, useTenantOptional, setAutoPick } from './chunk-R4HQ2HS2.js';
2
+ import { persistOrgId, cn, getPersistedOrgId } from './chunk-W5IBKM3K.js';
3
3
  import { createClient } from '@supabase/supabase-js';
4
- import { getActiveUnitId, getActiveTenantId, setGlobalSupabaseClient, useTranslation } from '@fayz-ai/core';
4
+ import { EMPTY_APP_CONFIG, getActiveUnitId, getActiveTenantId, setGlobalSupabaseClient, useTranslation, getSupabaseClientOptional as getSupabaseClientOptional$1 } from '@fayz-ai/core';
5
5
  import { createDedupedFetch } from '@fayz-ai/sdk';
6
- import * as React2 from 'react';
7
- import { cn, Checkbox, Button } from '@fayz-ai/ui';
8
- import { Check, Building2, ShieldCheck } from 'lucide-react';
9
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
+ import * as React from 'react';
7
+ import { useState, useEffect } from 'react';
8
+ import { Building2, Check, ShieldCheck } from 'lucide-react';
10
9
  import { create } from 'zustand';
10
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
11
+ import { cn as cn$1, Checkbox, Button } from '@fayz-ai/ui';
11
12
 
12
13
  var _client = null;
13
14
  function requestUrl(input) {
@@ -922,6 +923,89 @@ function createMockOrgAdapter(defaultProfiles) {
922
923
  }
923
924
  };
924
925
  }
926
+ var initialState = {
927
+ config: EMPTY_APP_CONFIG,
928
+ tenantId: null,
929
+ initializing: true,
930
+ stale: false,
931
+ error: null
932
+ };
933
+ var useAppConfigStore = create((set) => ({
934
+ ...initialState,
935
+ setConfig: (config, tenantId) => set({
936
+ config,
937
+ tenantId: tenantId === void 0 ? config.tenant_id ?? null : tenantId,
938
+ initializing: false,
939
+ stale: false,
940
+ error: null
941
+ }),
942
+ // Não limpa o que está em tela: quem espera desenha esqueleto, e um esqueleto
943
+ // sobre a última resposta é melhor que um branco.
944
+ beginTenant: (tenantId) => set({ tenantId, initializing: true, error: null }),
945
+ setStale: (stale) => set({ stale }),
946
+ setError: (error) => set({ error, initializing: false, stale: false }),
947
+ reset: () => set(initialState)
948
+ }));
949
+ function activePluginIds(config) {
950
+ return [...new Set(config.plugins.filter((p) => p.status === "active").map((p) => p.plugin))];
951
+ }
952
+ function hasPlugin(config, plugin, facet) {
953
+ const wanted = facet ?? "";
954
+ return config.plugins.some(
955
+ (p) => p.plugin === plugin && (p.facet ?? "") === wanted && p.status === "active"
956
+ );
957
+ }
958
+ function orgInitials(name) {
959
+ const words = name.trim().split(/\s+/).filter(Boolean);
960
+ if (!words.length) return "?";
961
+ if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
962
+ return (words[0][0] + words[words.length - 1][0]).toUpperCase();
963
+ }
964
+ function OrgMark({ name, logoUrl, className, tone = "sidebar", current = false }) {
965
+ const identity = useAppConfigStore((state) => state.config.branding?.identity);
966
+ const pick = (key) => typeof identity?.[key] === "string" ? identity[key] : void 0;
967
+ const src = (current ? pick("markUrl") : void 0) ?? logoUrl;
968
+ const base = cn(
969
+ "shrink-0 overflow-hidden rounded-lg ring-1 ring-inset",
970
+ tone === "popover" ? "ring-black/5" : "ring-white/10",
971
+ className ?? "h-6 w-6"
972
+ );
973
+ if (src) return /* @__PURE__ */ jsx("img", { src, alt: "", className: cn(base, "object-cover") });
974
+ return /* @__PURE__ */ jsx(
975
+ "span",
976
+ {
977
+ "aria-hidden": true,
978
+ className: cn(
979
+ base,
980
+ "flex items-center justify-center text-[10px] font-semibold uppercase leading-none tracking-tight",
981
+ tone === "popover" ? "bg-muted text-foreground" : "bg-sidebar-accent text-sidebar-accent-foreground"
982
+ ),
983
+ children: orgInitials(name) || /* @__PURE__ */ jsx(Building2, { className: "h-3.5 w-3.5" })
984
+ }
985
+ );
986
+ }
987
+
988
+ // src/org/workspace-search.ts
989
+ var WORKSPACE_SEARCH_THRESHOLD = 8;
990
+ var WORKSPACE_VISIBLE_LIMIT = 7;
991
+ function foldName(value) {
992
+ return value.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase();
993
+ }
994
+ function searchWorkspaces(all, query, currentId, limit = WORKSPACE_VISIBLE_LIMIT) {
995
+ const searchable = all.length > WORKSPACE_SEARCH_THRESHOLD;
996
+ if (!searchable) return { visible: all, hidden: 0, searchable: false };
997
+ const q = foldName(query.trim());
998
+ const matched = q ? all.filter((w) => foldName(w.orgName).includes(q)) : all;
999
+ const current = all.find((w) => w.orgId === currentId);
1000
+ const head = current && !matched.includes(current) ? [current] : [];
1001
+ const rest = matched.filter((w) => w.orgId !== current?.orgId);
1002
+ const ordered = current && matched.includes(current) ? [current, ...rest] : [...head, ...rest];
1003
+ return {
1004
+ visible: ordered.slice(0, limit),
1005
+ hidden: Math.max(0, ordered.length - limit),
1006
+ searchable: true
1007
+ };
1008
+ }
925
1009
  function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
926
1010
  const t = useTranslation();
927
1011
  const tr = (key, fallback) => {
@@ -929,11 +1013,16 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
929
1013
  return !v || v === key ? fallback : v;
930
1014
  };
931
1015
  const { switchOrg } = useTenant();
932
- const [selected, setSelected] = React2.useState(
1016
+ const [selected, setSelected] = React.useState(
933
1017
  suggestedId ?? memberships[0]?.orgId ?? null
934
1018
  );
935
- const [remember, setRemember] = React2.useState(false);
936
- const [entering, setEntering] = React2.useState(false);
1019
+ const [remember, setRemember] = React.useState(false);
1020
+ const [query, setQuery] = React.useState("");
1021
+ const search = React.useMemo(
1022
+ () => searchWorkspaces(memberships, query, selected, 12),
1023
+ [memberships, query, selected]
1024
+ );
1025
+ const [entering, setEntering] = React.useState(false);
937
1026
  const enter = async (orgId) => {
938
1027
  if (entering) return;
939
1028
  setEntering(true);
@@ -952,46 +1041,60 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
952
1041
  "Voc\xEA tem acesso a mais de uma. Selecione em qual deseja entrar."
953
1042
  ) })
954
1043
  ] }),
955
- /* @__PURE__ */ jsx(
1044
+ search.searchable && /* @__PURE__ */ jsx(
1045
+ "input",
1046
+ {
1047
+ value: query,
1048
+ onChange: (e) => setQuery(e.target.value),
1049
+ placeholder: tr("organization.searchWorkspace", "Buscar conta\u2026"),
1050
+ autoFocus: true,
1051
+ className: "mb-3 w-full rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus:border-primary"
1052
+ }
1053
+ ),
1054
+ /* @__PURE__ */ jsxs(
956
1055
  "div",
957
1056
  {
958
1057
  role: "radiogroup",
959
1058
  "aria-label": tr("organization.workspaces", "Workspaces"),
960
1059
  className: "space-y-2",
961
- children: memberships.map((m) => {
962
- const isSelected = m.orgId === selected;
963
- const isSuggested = m.orgId === suggestedId;
964
- return /* @__PURE__ */ jsxs(
965
- "button",
966
- {
967
- type: "button",
968
- role: "radio",
969
- "aria-checked": isSelected,
970
- disabled: entering,
971
- onClick: () => setSelected(m.orgId),
972
- onDoubleClick: () => void enter(m.orgId),
973
- className: cn(
974
- "flex w-full items-center gap-3 rounded-lg border p-3 text-left transition-colors",
975
- "disabled:opacity-60",
976
- isSelected ? "border-primary bg-primary/5" : "border-border hover:border-primary/50 hover:bg-muted/50"
977
- ),
978
- children: [
979
- /* @__PURE__ */ jsx(WorkspaceMark, { name: m.orgName, logoUrl: m.orgLogoUrl }),
980
- /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
981
- /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium text-foreground", children: m.orgName || m.orgSlug || m.orgId }),
982
- /* @__PURE__ */ jsxs("span", { className: "block truncate text-xs text-muted-foreground", children: [
983
- m.profileName,
984
- isSuggested && ` \xB7 ${tr("organization.lastUsed", "\xFAltimo acesso")}`
985
- ] })
986
- ] }),
987
- isSelected && /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 shrink-0 text-primary" })
988
- ]
989
- },
990
- m.orgId
991
- );
992
- })
1060
+ children: [
1061
+ search.visible.length === 0 && /* @__PURE__ */ jsx("p", { className: "py-6 text-center text-sm text-muted-foreground", children: tr("organization.noWorkspaceMatch", "Nenhuma conta com esse nome.") }),
1062
+ search.visible.map((m) => {
1063
+ const isSelected = m.orgId === selected;
1064
+ const isSuggested = m.orgId === suggestedId;
1065
+ return /* @__PURE__ */ jsxs(
1066
+ "button",
1067
+ {
1068
+ type: "button",
1069
+ role: "radio",
1070
+ "aria-checked": isSelected,
1071
+ disabled: entering,
1072
+ onClick: () => setSelected(m.orgId),
1073
+ onDoubleClick: () => void enter(m.orgId),
1074
+ className: cn$1(
1075
+ "flex w-full items-center gap-3 rounded-lg border p-3 text-left transition-colors",
1076
+ "disabled:opacity-60",
1077
+ isSelected ? "border-primary bg-primary/5" : "border-border hover:border-primary/50 hover:bg-muted/50"
1078
+ ),
1079
+ children: [
1080
+ /* @__PURE__ */ jsx(OrgMark, { name: m.orgName, logoUrl: m.orgLogoUrl, tone: "popover", className: "h-9 w-9" }),
1081
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
1082
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium text-foreground", children: m.orgName || m.orgSlug || m.orgId }),
1083
+ /* @__PURE__ */ jsxs("span", { className: "block truncate text-xs text-muted-foreground", children: [
1084
+ m.profileName,
1085
+ isSuggested && ` \xB7 ${tr("organization.lastUsed", "\xFAltimo acesso")}`
1086
+ ] })
1087
+ ] }),
1088
+ isSelected && /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 shrink-0 text-primary" })
1089
+ ]
1090
+ },
1091
+ m.orgId
1092
+ );
1093
+ })
1094
+ ]
993
1095
  }
994
1096
  ),
1097
+ search.hidden > 0 && /* @__PURE__ */ jsx("p", { className: "mt-3 text-center text-xs text-muted-foreground", children: tr("organization.moreWorkspaces", "mais {n} \u2014 busque pelo nome").replace("{n}", String(search.hidden)) }),
995
1098
  /* @__PURE__ */ jsxs("div", { className: "mt-5 flex items-center gap-2.5 text-sm text-muted-foreground", children: [
996
1099
  /* @__PURE__ */ jsx(
997
1100
  Checkbox,
@@ -1022,20 +1125,71 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
1022
1125
  ) })
1023
1126
  ] }) });
1024
1127
  }
1025
- function WorkspaceMark({ name, logoUrl }) {
1026
- if (logoUrl) {
1027
- return /* @__PURE__ */ jsx("img", { src: logoUrl, alt: "", className: "h-9 w-9 shrink-0 rounded-lg object-cover" });
1028
- }
1029
- const initials = name.split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0]).join("").toUpperCase();
1030
- return /* @__PURE__ */ jsx("span", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-xs font-semibold text-primary", children: initials || /* @__PURE__ */ jsx(Building2, { className: "h-4 w-4" }) });
1128
+ var getSupabaseClientOptional = () => getSupabaseClientOptional$1();
1129
+
1130
+ // src/app/useDomainTenant.ts
1131
+ var LOCAL = /^(localhost|127\.0\.0\.1|\[::1\])$/;
1132
+ function resolveHostname() {
1133
+ if (typeof window === "undefined") return null;
1134
+ const host = window.location.hostname;
1135
+ if (!LOCAL.test(host)) return host;
1136
+ if (!import.meta.env?.DEV) return null;
1137
+ return new URLSearchParams(window.location.search).get("domain");
1138
+ }
1139
+ function useDomainTenant() {
1140
+ const [tenant, setTenant] = useState(null);
1141
+ const [resolving, setResolving] = useState(true);
1142
+ useEffect(() => {
1143
+ const host = resolveHostname();
1144
+ const supabase = getSupabaseClientOptional();
1145
+ if (!host || !supabase) {
1146
+ setResolving(false);
1147
+ return;
1148
+ }
1149
+ let cancelled = false;
1150
+ void (async () => {
1151
+ try {
1152
+ const { data } = await supabase.rpc("tenant_branding_public", { p_domain: host });
1153
+ const row = data;
1154
+ const id = typeof row?.tenant_id === "string" ? row.tenant_id : null;
1155
+ if (!cancelled && id) {
1156
+ setTenant({
1157
+ tenantId: id,
1158
+ name: row?.name ?? null,
1159
+ slug: row?.slug ?? null,
1160
+ logoUrl: row?.logo_url ?? null,
1161
+ primaryColor: row?.primary_color ?? null
1162
+ });
1163
+ }
1164
+ } catch {
1165
+ } finally {
1166
+ if (!cancelled) setResolving(false);
1167
+ }
1168
+ })();
1169
+ return () => {
1170
+ cancelled = true;
1171
+ };
1172
+ }, []);
1173
+ return { tenant, resolving };
1031
1174
  }
1032
1175
  function WorkspaceChooserGate({ fallback, children }) {
1033
1176
  const tenant = useTenantOptional();
1177
+ const { tenant: byDomain, resolving: resolvingDomain } = useDomainTenant();
1178
+ const switchOrg = tenant?.switchOrg;
1179
+ const entering = React.useRef(false);
1180
+ React.useEffect(() => {
1181
+ if (!byDomain || !tenant?.orgsKnown || tenant.org || !switchOrg || entering.current) return;
1182
+ if (!tenant.userOrgs.some((m) => m.orgId === byDomain.tenantId)) return;
1183
+ entering.current = true;
1184
+ void switchOrg(byDomain.tenantId);
1185
+ }, [byDomain, tenant?.orgsKnown, tenant?.org, tenant?.userOrgs, switchOrg]);
1034
1186
  if (!tenant) return /* @__PURE__ */ jsx(Fragment, { children });
1035
1187
  const { org, userOrgs, orgsKnown, settled } = tenant;
1036
1188
  if (org) return /* @__PURE__ */ jsx(Fragment, { children });
1037
1189
  if (!settled) return /* @__PURE__ */ jsx(Fragment, { children: fallback ?? null });
1038
1190
  if (!orgsKnown || userOrgs.length <= 1) return /* @__PURE__ */ jsx(Fragment, { children });
1191
+ if (resolvingDomain) return /* @__PURE__ */ jsx(Fragment, { children: fallback ?? null });
1192
+ if (byDomain && userOrgs.some((m) => m.orgId === byDomain.tenantId)) return /* @__PURE__ */ jsx(Fragment, { children: fallback ?? null });
1039
1193
  return /* @__PURE__ */ jsx(
1040
1194
  WorkspaceChooser,
1041
1195
  {
@@ -1050,6 +1204,10 @@ var useWorkspaceSwitchingStore = create((set) => ({
1050
1204
  markWorkspaceSwitch(target.orgId);
1051
1205
  persistOrgId(target.orgId);
1052
1206
  clearOrgSnapshot();
1207
+ try {
1208
+ localStorage.removeItem("fayz:boot-theme");
1209
+ } catch {
1210
+ }
1053
1211
  set({ target });
1054
1212
  },
1055
1213
  cancel: () => set({ target: null })
@@ -1061,7 +1219,7 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
1061
1219
  const v = t(key);
1062
1220
  return !v || v === key ? fallback : v;
1063
1221
  };
1064
- const steps = React2.useMemo(
1222
+ const steps = React.useMemo(
1065
1223
  () => [
1066
1224
  tr("organization.switching.step1", "Alterando organiza\xE7\xE3o"),
1067
1225
  tr("organization.switching.step2", "Garantindo seguran\xE7a dos dados"),
@@ -1070,10 +1228,10 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
1070
1228
  // eslint-disable-next-line react-hooks/exhaustive-deps
1071
1229
  []
1072
1230
  );
1073
- const [step, setStep] = React2.useState(0);
1074
- const doneRef = React2.useRef(onDone);
1231
+ const [step, setStep] = React.useState(0);
1232
+ const doneRef = React.useRef(onDone);
1075
1233
  doneRef.current = onDone;
1076
- React2.useEffect(() => {
1234
+ React.useEffect(() => {
1077
1235
  const id = window.setInterval(() => {
1078
1236
  setStep((s) => {
1079
1237
  if (s < steps.length - 1) return s + 1;
@@ -1100,7 +1258,7 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
1100
1258
  className: "saas-switch-pulse absolute inset-0 rounded-2xl bg-primary/25"
1101
1259
  }
1102
1260
  ),
1103
- /* @__PURE__ */ jsx(WorkspaceMark2, { name: orgName, logoUrl: orgLogoUrl })
1261
+ /* @__PURE__ */ jsx(OrgMark, { name: orgName, logoUrl: orgLogoUrl, tone: "popover", className: "h-16 w-16 rounded-2xl shadow-sm" })
1104
1262
  ] }),
1105
1263
  /* @__PURE__ */ jsx("p", { className: "mt-7 text-xs font-medium uppercase tracking-[0.14em] text-muted-foreground", children: tr("organization.switching.eyebrow", "Entrando em") }),
1106
1264
  /* @__PURE__ */ jsx("h1", { className: "mt-1.5 text-pretty text-center text-3xl font-semibold leading-tight tracking-tight text-foreground sm:text-4xl", children: orgName }),
@@ -1119,7 +1277,7 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
1119
1277
  /* @__PURE__ */ jsx(
1120
1278
  "span",
1121
1279
  {
1122
- className: cn(
1280
+ className: cn$1(
1123
1281
  "flex h-7 items-center text-base transition-colors duration-300 sm:text-lg",
1124
1282
  // Only ever two states now — done, or happening. Nothing is
1125
1283
  // on screen before its turn, so there is no "ahead" tone.
@@ -1137,20 +1295,6 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
1137
1295
  }
1138
1296
  );
1139
1297
  }
1140
- function WorkspaceMark2({ name, logoUrl }) {
1141
- if (logoUrl) {
1142
- return /* @__PURE__ */ jsx(
1143
- "img",
1144
- {
1145
- src: logoUrl,
1146
- alt: "",
1147
- className: "relative h-16 w-16 rounded-2xl object-cover shadow-sm"
1148
- }
1149
- );
1150
- }
1151
- const initials = name.split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0]).join("").toUpperCase();
1152
- return /* @__PURE__ */ jsx("span", { className: "relative flex h-16 w-16 items-center justify-center rounded-2xl bg-primary text-xl font-semibold text-primary-foreground shadow-sm", children: initials || /* @__PURE__ */ jsx(Building2, { className: "h-7 w-7" }) });
1153
- }
1154
1298
  function WorkspaceSwitchingHost() {
1155
1299
  const target = useWorkspaceSwitchingStore((s) => s.target);
1156
1300
  if (!target) return null;
@@ -1164,6 +1308,6 @@ function WorkspaceSwitchingHost() {
1164
1308
  );
1165
1309
  }
1166
1310
 
1167
- export { WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, createFayzSupabaseClient, createMockOrgAdapter, createSupabaseOrgAdapter, getFayzSupabaseClient, getFayzSupabaseClientOptional, resolveAppId, useWorkspaceSwitchingStore };
1168
- //# sourceMappingURL=chunk-ZKOWNGZT.js.map
1169
- //# sourceMappingURL=chunk-ZKOWNGZT.js.map
1311
+ export { OrgMark, WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, activePluginIds, createFayzSupabaseClient, createMockOrgAdapter, createSupabaseOrgAdapter, getFayzSupabaseClient, getFayzSupabaseClientOptional, getSupabaseClientOptional, hasPlugin, orgInitials, resolveAppId, searchWorkspaces, useAppConfigStore, useWorkspaceSwitchingStore };
1312
+ //# sourceMappingURL=chunk-XJB76FHA.js.map
1313
+ //# sourceMappingURL=chunk-XJB76FHA.js.map