@fayz-ai/admin 0.22.0 → 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 (129) 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-KYMUCZRW.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 +11 -0
  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/TrialWidget.d.ts +1 -1
  30. package/dist/billing/TrialWidget.d.ts.map +1 -1
  31. package/dist/billing/index.js +2 -2
  32. package/dist/{chunk-CRB4ZUFH.js → chunk-LB5SV4ZZ.js} +6 -6
  33. package/dist/{chunk-CRB4ZUFH.js.map → chunk-LB5SV4ZZ.js.map} +1 -1
  34. package/dist/{ScheduleEditor-B7PLFGVM.js → chunk-NXFFJY2X.js} +44 -8
  35. package/dist/chunk-NXFFJY2X.js.map +1 -0
  36. package/dist/{chunk-NB6X5O5L.js → chunk-R4HQ2HS2.js} +22 -6
  37. package/dist/chunk-R4HQ2HS2.js.map +1 -0
  38. package/dist/{chunk-SHHWE7R2.js → chunk-U3VX52SE.js} +5 -6
  39. package/dist/chunk-U3VX52SE.js.map +1 -0
  40. package/dist/{chunk-WJ3H3RJN.js → chunk-UQ2NTFQC.js} +4 -2
  41. package/dist/chunk-UQ2NTFQC.js.map +1 -0
  42. package/dist/{chunk-5GWUM4SM.js → chunk-W5IBKM3K.js} +3 -2
  43. package/dist/chunk-W5IBKM3K.js.map +1 -0
  44. package/dist/{chunk-ZKOWNGZT.js → chunk-XJB76FHA.js} +216 -72
  45. package/dist/chunk-XJB76FHA.js.map +1 -0
  46. package/dist/components/RightRail.d.ts.map +1 -1
  47. package/dist/components/chat/AgentAvatar.d.ts +6 -1
  48. package/dist/components/chat/AgentAvatar.d.ts.map +1 -1
  49. package/dist/components/chat/AssistantInvite.d.ts.map +1 -1
  50. package/dist/components/chat/ChatConversation.d.ts.map +1 -1
  51. package/dist/components/chat/ChatFab.d.ts.map +1 -1
  52. package/dist/components/layout/CommandPalette.d.ts +5 -1
  53. package/dist/components/layout/CommandPalette.d.ts.map +1 -1
  54. package/dist/components/layout/PrintChrome.d.ts.map +1 -1
  55. package/dist/components/right-rail.d.ts +2 -0
  56. package/dist/components/right-rail.d.ts.map +1 -1
  57. package/dist/components/settings/AddModulesPanel.d.ts +45 -0
  58. package/dist/components/settings/AddModulesPanel.d.ts.map +1 -0
  59. package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
  60. package/dist/components/settings/ConnectedModulesSettings.d.ts +5 -0
  61. package/dist/components/settings/ConnectedModulesSettings.d.ts.map +1 -0
  62. package/dist/components/settings/ModuleCard.d.ts +26 -0
  63. package/dist/components/settings/ModuleCard.d.ts.map +1 -0
  64. package/dist/components/settings/ModulesSettings.d.ts +48 -0
  65. package/dist/components/settings/ModulesSettings.d.ts.map +1 -0
  66. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  67. package/dist/components/settings/module-catalog.d.ts +58 -0
  68. package/dist/components/settings/module-catalog.d.ts.map +1 -0
  69. package/dist/crud/CrudFormPage.d.ts.map +1 -1
  70. package/dist/crud/archetypes/OrderDetailRail.d.ts.map +1 -1
  71. package/dist/crud/archetypes/OrderDetailView.d.ts +44 -0
  72. package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
  73. package/dist/directory/AppSwitcher.d.ts +6 -2
  74. package/dist/directory/AppSwitcher.d.ts.map +1 -1
  75. package/dist/handbook/NotebookPanel.d.ts.map +1 -1
  76. package/dist/hooks/useAppConfig.d.ts +8 -0
  77. package/dist/hooks/useAppConfig.d.ts.map +1 -1
  78. package/dist/hooks/useChat.d.ts.map +1 -1
  79. package/dist/hooks/useLayout.d.ts +4 -1
  80. package/dist/hooks/useLayout.d.ts.map +1 -1
  81. package/dist/index.d.ts +4 -1
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +2171 -1030
  84. package/dist/index.js.map +1 -1
  85. package/dist/lib/agent-surface.d.ts +8 -1
  86. package/dist/lib/agent-surface.d.ts.map +1 -1
  87. package/dist/lib/ai-tool-handlers.d.ts.map +1 -1
  88. package/dist/lib/brand.d.ts +45 -0
  89. package/dist/lib/brand.d.ts.map +1 -1
  90. package/dist/lib/search-targets.d.ts.map +1 -1
  91. package/dist/org/OrgMark.d.ts +41 -0
  92. package/dist/org/OrgMark.d.ts.map +1 -0
  93. package/dist/org/WorkspaceChooser.d.ts +1 -0
  94. package/dist/org/WorkspaceChooser.d.ts.map +1 -1
  95. package/dist/org/WorkspaceChooserGate.d.ts.map +1 -1
  96. package/dist/org/WorkspaceSwitching.d.ts.map +1 -1
  97. package/dist/org/context.d.ts +13 -1
  98. package/dist/org/context.d.ts.map +1 -1
  99. package/dist/org/index.d.ts +2 -0
  100. package/dist/org/index.d.ts.map +1 -1
  101. package/dist/org/index.js +4 -4
  102. package/dist/org/switching.store.d.ts.map +1 -1
  103. package/dist/org/workspace-search.d.ts +27 -0
  104. package/dist/org/workspace-search.d.ts.map +1 -0
  105. package/dist/permissions/index.js +1 -1
  106. package/dist/permissions/store.d.ts +12 -0
  107. package/dist/permissions/store.d.ts.map +1 -1
  108. package/dist/setup/SetupAgentSurface.d.ts.map +1 -1
  109. package/dist/stores/app-config.store.d.ts +5 -1
  110. package/dist/stores/app-config.store.d.ts.map +1 -1
  111. package/dist/tasks/components/TasksFilterBar.d.ts.map +1 -1
  112. package/dist/theme/dark.d.ts.map +1 -1
  113. package/dist/theme/light.d.ts.map +1 -1
  114. package/dist/theme/tokens.d.ts +13 -0
  115. package/dist/theme/tokens.d.ts.map +1 -1
  116. package/dist/theme/utils.d.ts.map +1 -1
  117. package/dist/units/UnitSwitcher.d.ts +10 -1
  118. package/dist/units/UnitSwitcher.d.ts.map +1 -1
  119. package/package.json +6 -6
  120. package/dist/CommandPalette-GQ6SPITD.js.map +0 -1
  121. package/dist/ScheduleEditor-B7PLFGVM.js.map +0 -1
  122. package/dist/SubscriptionPage-KYMUCZRW.js +0 -8
  123. package/dist/chunk-5GWUM4SM.js.map +0 -1
  124. package/dist/chunk-NB6X5O5L.js.map +0 -1
  125. package/dist/chunk-RKXZ7RUG.js +0 -20
  126. package/dist/chunk-RKXZ7RUG.js.map +0 -1
  127. package/dist/chunk-SHHWE7R2.js.map +0 -1
  128. package/dist/chunk-WJ3H3RJN.js.map +0 -1
  129. package/dist/chunk-ZKOWNGZT.js.map +0 -1
@@ -152,9 +152,9 @@ function useRankedCommands(commands, query) {
152
152
  }
153
153
  var GROUP_HEADING = "[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-muted-foreground";
154
154
  var ITEM = "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm outline-none transition-colors aria-selected:bg-muted";
155
- function CommandPalette({ commands = [], open, onOpenChange, onEntitySearch, onEntitySelect }) {
155
+ function CommandPalette({ commands = [], open, onOpenChange, onEntitySearch, onEntitySelect, initialQuery = "" }) {
156
156
  const { t } = useTranslation();
157
- const [search, setSearch] = useState("");
157
+ const [search, setSearch] = useState(initialQuery);
158
158
  const { result, loading, refresh } = useEntitySearch(onEntitySearch, search, open);
159
159
  const rankedCommands = useRankedCommands(commands, search);
160
160
  useEffect(() => {
@@ -168,7 +168,7 @@ function CommandPalette({ commands = [], open, onOpenChange, onEntitySearch, onE
168
168
  return () => document.removeEventListener("keydown", handleKeyDown);
169
169
  }, [open, onOpenChange]);
170
170
  useEffect(() => {
171
- if (!open) setSearch("");
171
+ setSearch(open ? initialQuery : "");
172
172
  }, [open]);
173
173
  const grouped = rankedCommands.reduce((acc, cmd) => {
174
174
  const group = cmd.group ?? "Actions";
@@ -293,5 +293,5 @@ function CommandPalette({ commands = [], open, onOpenChange, onEntitySearch, onE
293
293
  }
294
294
 
295
295
  export { CommandPalette };
296
- //# sourceMappingURL=CommandPalette-GQ6SPITD.js.map
297
- //# sourceMappingURL=CommandPalette-GQ6SPITD.js.map
296
+ //# sourceMappingURL=CommandPalette-ANZWU27U.js.map
297
+ //# sourceMappingURL=CommandPalette-ANZWU27U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/layout/CommandPalette.tsx"],"names":["Fragment"],"mappings":"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","file":"CommandPalette-ANZWU27U.js","sourcesContent":["import * as React from 'react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { Command } from 'cmdk'\nimport * as Dialog from '@radix-ui/react-dialog'\nimport {\n Home, Users, Settings, CreditCard, Bell, Calendar, CalendarCheck2,\n CalendarClock, CalendarX, Package, Activity, BarChart3, FileText, FileCheck2, Mail, Search,\n DollarSign, BadgeDollarSign, CircleDollarSign, Megaphone, ShoppingCart, ShoppingBag, Target,\n Wrench, ClipboardList, ListChecks, Briefcase, UserCog, BookOpen, BookOpenCheck, MessageCircle,\n Globe, Percent, Tag, Tags, Camera, UtensilsCrossed, MapPin, Map, Handshake,\n Contact, Building2, Filter, Plus, List, Shield, User, Box, Sparkles, Loader2, X,\n ListPlus, FolderOpen, Boxes, Landmark, Receipt, Ban, Clock, Clock3, Inbox,\n Star, TrendingUp, UserCheck, UserPlus, UserX, Zap,\n type LucideIcon,\n} from 'lucide-react'\nimport {\n MIN_QUERY_LENGTH, highlightRanges, normalizeQuery, scoreCandidate, foldText,\n type GlobalSearchResult, type SearchHit,\n} from '@fayz-ai/core'\nimport { RefreshButton } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nexport interface CommandItem {\n id: string\n label: string\n icon?: string\n action: () => void\n group?: string\n keywords?: string\n subtitle?: string\n}\n\n/** Runs one global search. `onPartial` paints a cheap early answer, if there is one.\n * `opts.fresh` bypasses every cache — the footer's refresh button uses it. */\nexport type EntitySearchFn = (\n query: string,\n onPartial?: (result: GlobalSearchResult) => void,\n opts?: { fresh?: boolean },\n) => Promise<GlobalSearchResult>\n\ninterface CommandPaletteProps {\n commands?: CommandItem[]\n open: boolean\n onOpenChange: (open: boolean) => void\n onEntitySearch?: EntitySearchFn\n onEntitySelect?: (hit: SearchHit) => void\n /** O que já estava digitado quando a paleta foi aberta a partir da busca do\n * trilho. Escalar de \"onde estou\" para \"em tudo\" não pode custar digitar a\n * mesma palavra duas vezes. */\n initialQuery?: string\n}\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n Home, Users, Settings, CreditCard, Bell, Calendar, CalendarClock, Package, Activity, BarChart3,\n CalendarCheck2, CalendarX, FileText, FileCheck2, Mail, Search, DollarSign, BadgeDollarSign, CircleDollarSign, Megaphone, ShoppingCart, ShoppingBag, Target,\n Wrench, ClipboardList, ListChecks, Briefcase, UserCog, BookOpen, BookOpenCheck, MessageCircle,\n Globe, Percent, Tag, Tags, Camera, UtensilsCrossed, MapPin, Map, Handshake,\n Contact, Building2, Filter, Plus, List, Shield, ListPlus, FolderOpen, User, Box, Boxes, Sparkles, Landmark, Receipt, Ban, Clock, Clock3, Inbox,\n Star, TrendingUp, UserCheck, UserPlus, UserX, Zap,\n}\n\n/** Long enough that a fast typist issues one request per word, not per letter. */\nconst DEBOUNCE_MS = 140\n\n// Highlighting — the matched run, in the record's own spelling\n\nfunction Highlight({ text, query }: { text: string; query: string }) {\n const parts = useMemo(() => {\n const normalized = normalizeQuery(query)\n const ranges = highlightRanges(text, normalized)\n if (ranges.length === 0) return [{ text, hit: false }]\n const out: Array<{ text: string; hit: boolean }> = []\n let cursor = 0\n for (const [from, to] of ranges) {\n if (from > cursor) out.push({ text: text.slice(cursor, from), hit: false })\n out.push({ text: text.slice(from, to), hit: true })\n cursor = to\n }\n if (cursor < text.length) out.push({ text: text.slice(cursor), hit: false })\n return out\n }, [text, query])\n\n return (\n <>\n {parts.map((part, i) =>\n part.hit\n ? <mark key={i} className=\"bg-transparent font-semibold text-foreground\">{part.text}</mark>\n : <React.Fragment key={i}>{part.text}</React.Fragment>,\n )}\n </>\n )\n}\n\n// Records arrive from the server; commands are already in memory. Same scorer,\n// different clocks — commands re-rank per keystroke, records refine as they land.\n\nfunction useEntitySearch(searchFn: EntitySearchFn | undefined, query: string, open: boolean) {\n const [result, setResult] = useState<GlobalSearchResult | null>(null)\n const [loading, setLoading] = useState(false)\n const generation = useRef(0)\n\n useEffect(() => {\n const trimmed = query.trim()\n if (!open || !searchFn || foldText(trimmed).length < MIN_QUERY_LENGTH) {\n setResult(null)\n setLoading(false)\n return\n }\n\n const token = ++generation.current\n setLoading(true)\n\n const timer = setTimeout(() => {\n searchFn(trimmed, (partial) => {\n // A partial must never replace a final answer for this same query.\n if (token === generation.current) setResult((prev) => (prev?.partial === false && prev.query === trimmed ? prev : partial))\n })\n .then((final) => {\n if (token !== generation.current) return\n setResult(final)\n setLoading(false)\n })\n .catch(() => {\n // Keep what is on screen: a failed refresh is not an empty result.\n if (token !== generation.current) return\n setLoading(false)\n })\n }, DEBOUNCE_MS)\n\n return () => clearTimeout(timer)\n }, [query, searchFn, open])\n\n // The footer refresh: same query, every cache bypassed. Returned as a\n // promise so the button spins until the network answer lands.\n const refresh = React.useCallback(async () => {\n const trimmed = query.trim()\n if (!searchFn || foldText(trimmed).length < MIN_QUERY_LENGTH) return\n const token = ++generation.current\n setLoading(true)\n try {\n const final = await searchFn(trimmed, undefined, { fresh: true })\n if (token === generation.current) setResult(final)\n } finally {\n if (token === generation.current) setLoading(false)\n }\n }, [query, searchFn])\n\n return { result, loading, refresh }\n}\n\n/**\n * Commands, ranked by the same ladder records use. cmdk's own filter is OFF:\n * it re-filtered the SERVER's results with its own substring rules, so a record\n * matched by phone, by a note or by an accent-folded name was fetched and then\n * dropped — the list said \"no results\" while the footer counted them.\n */\nfunction useRankedCommands(commands: CommandItem[], query: string): CommandItem[] {\n return useMemo(() => {\n const trimmed = query.trim()\n if (!trimmed) return commands\n const normalized = normalizeQuery(trimmed)\n if (normalized.tokens.length === 0) return commands\n return commands\n .map((cmd) => ({\n cmd,\n score: scoreCandidate(normalized, {\n title: foldText(cmd.label),\n haystack: foldText(`${cmd.label} ${cmd.group ?? ''} ${cmd.keywords ?? ''} ${cmd.subtitle ?? ''}`),\n }),\n }))\n .filter((c) => c.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((c) => c.cmd)\n }, [commands, query])\n}\n\nconst GROUP_HEADING =\n '[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-semibold [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-muted-foreground'\n\nconst ITEM =\n 'flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 text-sm outline-none transition-colors aria-selected:bg-muted'\n\nexport function CommandPalette({ commands = [], open, onOpenChange, onEntitySearch, onEntitySelect, initialQuery = '' }: CommandPaletteProps) {\n const { t } = useTranslation()\n const [search, setSearch] = useState(initialQuery)\n const { result, loading, refresh } = useEntitySearch(onEntitySearch, search, open)\n const rankedCommands = useRankedCommands(commands, search)\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault()\n onOpenChange(!open)\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, onOpenChange])\n\n // Abre com o que o trilho já tinha, e zera ao fechar — o ⌘K seco abre limpo\n // porque quem não escalou de lugar nenhum manda string vazia.\n useEffect(() => {\n setSearch(open ? initialQuery : '')\n // `initialQuery` fora das deps de propósito: ele muda no MESMO commit em\n // que `open` vira true, e reagir a ele depois sobrescreveria o que a\n // pessoa já está digitando dentro da paleta.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n const grouped = rankedCommands.reduce<Record<string, CommandItem[]>>((acc, cmd) => {\n const group = cmd.group ?? 'Actions'\n if (!acc[group]) acc[group] = []\n acc[group].push(cmd)\n return acc\n }, {})\n\n const hasQuery = foldText(search).length >= MIN_QUERY_LENGTH\n // A lookup wants the client, not the page that lists clients.\n const recordGroups = hasQuery ? (result?.groups ?? []) : []\n const recordCount = recordGroups.reduce((n, g) => n + g.hits.length, 0)\n const totalResults = rankedCommands.length + recordCount\n const nothingYet = totalResults === 0\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"saas-overlay fixed inset-0 z-[100] bg-black/40 backdrop-blur-sm\" />\n {/* Search is a PLACE on a phone, not a card floating over one. A centred\n dialog leaves the page showing round the edges, puts the field under\n the thumb's reach, and gives the results a 360px window inside a\n 660px screen. Full-bleed below sm; the desktop card is unchanged. */}\n <Dialog.Content // Desktop position lives in styles.css beside the animation that depends on\n // it — see the note there. Utilities here are the mobile full-bleed only.\n className=\"fayz-glass-surface saas-cmd-palette fixed inset-0 z-[100] flex flex-col overflow-hidden border-border/50 bg-popover shadow-2xl\">\n <Dialog.Title className=\"sr-only\">{t('layout.commandPalette.title')}</Dialog.Title>\n <Dialog.Description className=\"sr-only\">{t('layout.commandPalette.description')}</Dialog.Description>\n\n <Command className=\"flex min-h-0 flex-1 flex-col\" label=\"Command palette\" shouldFilter={false}>\n <div className=\"fz-safe-t flex shrink-0 items-center gap-3 border-b border-border/50 px-4\">\n <Search className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <Command.Input\n placeholder={t('layout.commandPalette.placeholder')}\n className=\"flex h-12 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n autoFocus\n value={search}\n onValueChange={setSearch}\n />\n {loading && <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground\" />}\n <kbd className=\"hidden shrink-0 rounded-md border border-border bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground sm:inline-block\">ESC</kbd>\n {/* Full-bleed on a phone means the page behind is gone, and with it\n every hint that tapping outside would close this. ESC is the\n desktop's way out; this is the phone's. */}\n <Dialog.Close\n aria-label={t('common.close')}\n className=\"fz-tap -mr-2 flex shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors active:bg-muted sm:hidden\"\n >\n <X className=\"h-5 w-5\" />\n </Dialog.Close>\n </div>\n\n <Command.List className=\"fz-scroll-contain min-h-0 flex-1 overflow-y-auto p-1.5 sm:max-h-[360px] sm:flex-none\">\n {nothingYet && (\n <Command.Empty className=\"py-8 text-center text-sm text-muted-foreground\">\n {loading ? t('layout.commandPalette.searching') : t('layout.commandPalette.noResults')}\n </Command.Empty>\n )}\n\n {/* Records first */}\n {recordGroups.map((group) => {\n const GroupIcon = group.icon ? (ICON_MAP[group.icon] ?? User) : User\n return (\n <Command.Group key={`entity:${group.key}`} heading={group.label} className={GROUP_HEADING}>\n {group.hits.map((hit) => {\n const Icon = hit.icon ? (ICON_MAP[hit.icon] ?? GroupIcon) : GroupIcon\n return (\n <Command.Item\n key={hit.uid}\n value={hit.uid}\n onSelect={() => { onEntitySelect?.(hit); onOpenChange(false) }}\n className={ITEM}\n >\n <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <span className=\"block truncate\"><Highlight text={hit.title} query={search} /></span>\n {hit.subtitle && (\n <span className=\"block truncate text-[11px] text-muted-foreground\">\n <Highlight text={hit.subtitle} query={search} />\n </span>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground/40\">{group.label}</span>\n </Command.Item>\n )\n })}\n </Command.Group>\n )\n })}\n\n {/* Pages and actions */}\n {Object.entries(grouped).map(([group, items]) => (\n <Command.Group key={group} heading={group} className={GROUP_HEADING}>\n {items.map((cmd, i) => {\n const Icon = cmd.icon ? (ICON_MAP[cmd.icon] ?? null) : null\n // Command ids are not unique — \"Clientes\" and its \"Lista\"\n // child both mint `page:/clients`. Also the cmdk value.\n const uid = `${group}:${cmd.id}:${i}`\n return (\n <Command.Item\n key={uid}\n value={uid}\n onSelect={() => { cmd.action(); onOpenChange(false) }}\n className={ITEM}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"flex-1\"><Highlight text={cmd.label} query={search} /></span>\n <span className=\"text-[11px] text-muted-foreground/40\">{cmd.group}</span>\n </Command.Item>\n )\n })}\n </Command.Group>\n ))}\n </Command.List>\n\n <div className=\"flex items-center justify-between border-t border-border/50 px-4 py-2\">\n <span className=\"text-xs text-muted-foreground\">\n {loading\n ? t('layout.commandPalette.searching')\n : hasQuery\n ? t('layout.commandPalette.resultCount', { count: String(totalResults), plural: totalResults !== 1 ? 's' : '' })\n : t('layout.commandPalette.commandCount', { count: String(commands.length), plural: commands.length !== 1 ? 's' : '' })}\n </span>\n <div className=\"flex items-center gap-2 text-[10px] text-muted-foreground\">\n {hasQuery && result && (\n <RefreshButton\n onRefresh={refresh}\n fromCache={result.cached}\n label={t('layout.commandPalette.refresh')}\n labelCached={t('layout.commandPalette.refreshCached')}\n className=\"rounded p-1 text-muted-foreground hover:text-foreground\"\n />\n )}\n {/* Arrow-key and Enter hints on a device with neither. They are\n the desktop's affordance; a finger just taps the row. */}\n <span className=\"hidden items-center gap-2 sm:flex\">\n <kbd className=\"rounded border border-border bg-muted px-1 py-0.5 font-medium\">&uarr;&darr;</kbd>\n <span>{t('layout.commandPalette.navigate')}</span>\n <kbd className=\"rounded border border-border bg-muted px-1 py-0.5 font-medium\">&crarr;</kbd>\n <span>{t('layout.commandPalette.open')}</span>\n </span>\n </div>\n </div>\n </Command>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export { ScheduleEditor } from './chunk-NXFFJY2X.js';
2
+ import './chunk-XJB76FHA.js';
3
+ import './chunk-R4HQ2HS2.js';
4
+ import './chunk-UQ2NTFQC.js';
5
+ import './chunk-W5IBKM3K.js';
6
+ //# sourceMappingURL=ScheduleEditor-KU4UUG6Q.js.map
7
+ //# sourceMappingURL=ScheduleEditor-KU4UUG6Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ScheduleEditor-KU4UUG6Q.js"}
@@ -0,0 +1,8 @@
1
+ export { SubscriptionPage } from './chunk-LB5SV4ZZ.js';
2
+ import './chunk-YUHCC7JY.js';
3
+ import './chunk-U3VX52SE.js';
4
+ import './chunk-R4HQ2HS2.js';
5
+ import './chunk-UQ2NTFQC.js';
6
+ import './chunk-W5IBKM3K.js';
7
+ //# sourceMappingURL=SubscriptionPage-4EJCCS4I.js.map
8
+ //# sourceMappingURL=SubscriptionPage-4EJCCS4I.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"SubscriptionPage-KYMUCZRW.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"SubscriptionPage-4EJCCS4I.js"}
@@ -6,6 +6,8 @@ import type { AuthProvider } from '@fayz-ai/core';
6
6
  import { type SetupMode } from '../onboarding';
7
7
  export interface AdminShellProps {
8
8
  appName: string;
9
+ /** A marca desenhada no topo é do inquilino, não do produto (072/074/075). */
10
+ brandedByTenant?: boolean;
9
11
  layout?: 'sidebar' | 'topbar' | 'minimal';
10
12
  logo?: React.ReactNode;
11
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../../src/app/AdminShell.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../../src/app/AdminShell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Esta conta roda ESTE aplicativo?
4
+ *
5
+ * O defeito que isto fecha: trocando de conta dentro do StudioControl era
6
+ * possível cair num RESTAURANTE, e o sistema desenhava Agenda, Check-in e
7
+ * Profissionais para ele — o software de estética fingindo ser o da cozinha.
8
+ * Nada no cliente conferia `app.tenant_apps`, e o seletor de contas lista todas
9
+ * as contas da pessoa, não as que rodam o app aberto.
10
+ *
11
+ * A regra do produto é a inversa: cada conta deriva do aplicativo mais próximo
12
+ * do ofício dela — ChefControl para a cozinha, StudioControl para o estúdio,
13
+ * StoreControl para a loja — e personaliza marca e módulos em cima disso. Um
14
+ * app que se apresenta para quem não o contratou é uma mentira de cara limpa,
15
+ * e é pior que um erro: as telas existem, os dados são reais, e o vocabulário
16
+ * inteiro está errado.
17
+ *
18
+ * ── Por que uma tela e não um redirecionamento ─────────────────────────────
19
+ * A porta certa é um handoff de sessão para outro domínio, que é uma saída da
20
+ * aplicação. Fazê-la sozinho, sem dizer, deixa a pessoa em outro lugar sem
21
+ * saber por quê — ainda mais quando ela acabou de escolher esta conta de
22
+ * propósito. A tela diz o que aconteceu e oferece o caminho.
23
+ *
24
+ * ── Quando ele NÃO bloqueia ────────────────────────────────────────────────
25
+ * Sem `VITE_APP_ID` (um app fora do registro), ou com `apps` vazia (a conta é
26
+ * nova, ou a configuração ainda não chegou), não há o que afirmar. Na dúvida
27
+ * ele deixa passar: um portão que fecha por falta de informação tranca o
28
+ * usuário fora do próprio sistema.
29
+ */
30
+ export declare function useWrongApp(): {
31
+ app: {
32
+ id: string;
33
+ name: string;
34
+ url?: string | null;
35
+ } | null;
36
+ };
37
+ export declare function WrongAppScreen({ app, orgName, onSwitchAccount, }: {
38
+ app: {
39
+ id: string;
40
+ name: string;
41
+ url?: string | null;
42
+ };
43
+ orgName: string;
44
+ onSwitchAccount?: () => void;
45
+ }): React.JSX.Element;
46
+ //# sourceMappingURL=WrongAppGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WrongAppGate.d.ts","sourceRoot":"","sources":["../../src/app/WrongAppGate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,IAAI;IAAE,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,CAgB/F;AAED,wBAAgB,cAAc,CAAC,EAC7B,GAAG,EACH,OAAO,EACP,eAAe,GAChB,EAAE;IACD,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IACtD,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;CAC7B,qBA0BA"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-app.d.ts","sourceRoot":"","sources":["../../src/app/admin-app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,EAGL,KAAK,UAAU,EAGf,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAA;AAsC7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAiD7C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;CAC3E,CA4BA;AAoQD,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBA8HxG;yBA9He,cAAc;;;AAyJ9B,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC,aAAa,CAiCxE"}
1
+ {"version":3,"file":"admin-app.d.ts","sourceRoot":"","sources":["../../src/app/admin-app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,EAGL,KAAK,UAAU,EAGf,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAA;AA0C7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAiD7C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;CAC3E,CA4BA;AA0aD,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBA+KxG;yBA/Ke,cAAc;;;AA0M9B,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC,aAAa,CAWxE"}
@@ -0,0 +1,13 @@
1
+ import type { AppConfig } from '@fayz-ai/core';
2
+ /** Painted without waiting for the network. Beyond this it is still painted, but as stale. */
3
+ export declare const APP_CONFIG_TTL_MS: number;
4
+ /** The last known config for this tenant, or null. Never throws. */
5
+ export declare function readAppConfigSnapshot(tenantId: string): {
6
+ config: AppConfig;
7
+ stale: boolean;
8
+ } | null;
9
+ /** Records what the server just said. Never throws. */
10
+ export declare function writeAppConfigSnapshot(tenantId: string, config: AppConfig): void;
11
+ /** Drops the snapshot — after a write through the config RPCs, or on sign-out. */
12
+ export declare function clearAppConfigSnapshot(tenantId?: string): void;
13
+ //# sourceMappingURL=app-config-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-config-cache.d.ts","sourceRoot":"","sources":["../../src/app/app-config-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAmB9C,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,QAAgB,CAAA;AA0B9C,oEAAoE;AACpE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAiBpG;AAED,uDAAuD;AACvD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAUhF;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAe9D"}
@@ -9,6 +9,17 @@ export interface ContextualNav {
9
9
  /** Where "←" goes. Defaults to the shell's home route. */
10
10
  backTo?: string;
11
11
  backLabel?: string;
12
+ /**
13
+ * Texto do campo de busca da rail. Declarar isto LIGA a busca; omitir deixa a
14
+ * rail como era.
15
+ *
16
+ * Não é enfeite: a rail do analytics tem uma entrada por relatório, e o
17
+ * catálogo do ChefControl já passa de trinta em quatro grupos. Uma lista desse
18
+ * tamanho deixa de ser navegação e vira rolagem — quem sabe o nome do que
19
+ * quer não deveria precisar caçá-lo por categoria. O filtro é por rótulo e
20
+ * preserva os grupos: a heading some junto com o último item dela.
21
+ */
22
+ searchPlaceholder?: string;
12
23
  }
13
24
  interface ContextualNavState {
14
25
  nav: ContextualNav | null;
@@ -1 +1 @@
1
- {"version":3,"file":"contextual-nav.store.d.ts","sourceRoot":"","sources":["../../src/app/contextual-nav.store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAoBjD,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAA;IACZ,oFAAoF;IACpF,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,UAAU,kBAAkB;IAC1B,GAAG,EAAE,aAAa,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAA;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,+EAA+E;IAC/E,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,gBAAgB,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;CAC/C;AAED,eAAO,MAAM,qBAAqB,iFAW/B,CAAA;AAEH;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,GAAG,IAAI,CAEtD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAYhE"}
1
+ {"version":3,"file":"contextual-nav.store.d.ts","sourceRoot":"","sources":["../../src/app/contextual-nav.store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAoBjD,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAA;IACZ,oFAAoF;IACpF,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,UAAU,kBAAkB;IAC1B,GAAG,EAAE,aAAa,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAA;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,+EAA+E;IAC/E,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,gBAAgB,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;CAC/C;AAED,eAAO,MAAM,qBAAqB,iFAW/B,CAAA;AAEH;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,GAAG,IAAI,CAEtD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAYhE"}
@@ -0,0 +1,40 @@
1
+ import type { NavigationItem } from '@fayz-ai/ui';
2
+ /**
3
+ * A rail row that exists only because a plugin serves it leaves WITH the plugin
4
+ * (#280, ADR 0023).
5
+ *
6
+ * Three of the four apps in the fleet call `hideNav()` on every plugin and
7
+ * declare the rail in `FayzAppConfig.pages`, which is how "Financeiro" keeps
8
+ * the app's label and the app's place in the order. Those rows carry no
9
+ * `component`: the screen behind them belongs to a plugin route.
10
+ *
11
+ * So when a tenant turns that module off, the route stops existing and the row
12
+ * is left pointing at nothing — the module still looks present, and clicking it
13
+ * is the only way to find out it is not. That is worse than no row at all.
14
+ *
15
+ * `ownsPage` is already exactly the distinction the rule needs: false means
16
+ * "somebody else's screen".
17
+ */
18
+ export interface ServableNavItem extends Omit<NavigationItem, 'children'> {
19
+ /** True when the app itself supplies the component behind this route. */
20
+ ownsPage?: boolean;
21
+ /** Narrowed so a child carries `ownsPage` too — a group is pruned child-first. */
22
+ children?: ServableNavItem[];
23
+ }
24
+ /** Plugin route paths, with the trailing `/*` of a wildcard stripped. */
25
+ export declare function servedPaths(routes: Array<{
26
+ path: string;
27
+ }>): string[];
28
+ /**
29
+ * Whether a rail row still leads somewhere: the app owns the screen, an active
30
+ * plugin serves the route (`/financial` serves `/financial/payables`), or it is
31
+ * an external link.
32
+ */
33
+ export declare function isServed(item: ServableNavItem, paths: string[]): boolean;
34
+ /**
35
+ * Drops the rows nothing serves any more, children first. A group survives on
36
+ * its children: `/company` owns no screen of its own, it is a heading over
37
+ * twelve that do.
38
+ */
39
+ export declare function pruneUnservedNav<T extends ServableNavItem>(items: T[], paths: string[]): T[];
40
+ //# sourceMappingURL=nav-serving.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-serving.d.ts","sourceRoot":"","sources":["../../src/app/nav-serving.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC;IACvE,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;CAC7B;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,CAErE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAGxE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAQ5F"}
@@ -0,0 +1,23 @@
1
+ export interface NavWaitingInput {
2
+ /** A conta ativa, se já houver uma. */
3
+ activeTenantId: string | null;
4
+ /** O contexto de conta existe? (storybook e testes rodam sem ele) */
5
+ hasTenantContext: boolean;
6
+ /** A primeira leitura de contas terminou — com ou sem sucesso. */
7
+ settled: boolean;
8
+ /** Uma leitura de contas/perfis está em voo. */
9
+ loading: boolean;
10
+ /** A configuração em mãos é a DESTA conta. */
11
+ configReady: boolean;
12
+ /**
13
+ * A pergunta "quem sou eu nesta conta" já foi respondida — com ou sem papel.
14
+ *
15
+ * Sem isto, `resolveAccess` nega (ele falha fechado, e deve) enquanto o
16
+ * perfil não chegou: o rail vinha com uma linha só e o conteúdo dizia
17
+ * "Acesso restrito". Não saber ainda não é não ter direito.
18
+ */
19
+ profileKnown: boolean;
20
+ }
21
+ /** O rail ainda não pode ser desenhado: espere em esqueleto. */
22
+ export declare function isNavWaiting(input: NavWaitingInput): boolean;
23
+ //# sourceMappingURL=nav-waiting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-waiting.d.ts","sourceRoot":"","sources":["../../src/app/nav-waiting.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,qEAAqE;IACrE,gBAAgB,EAAE,OAAO,CAAA;IACzB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAA;IAChB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAA;IACpB;;;;;;OAMG;IACH,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAO5D"}
@@ -0,0 +1,38 @@
1
+ import type { NavigationItem } from '@fayz-ai/ui';
2
+ export interface RailGroup {
3
+ label: string;
4
+ icon?: string;
5
+ /** Prefixos de rota que caem nesta rubrica. */
6
+ under: string[];
7
+ }
8
+ /**
9
+ * O contrário de `under`: a rota que este ofício NÃO põe no rail.
10
+ *
11
+ * É o `hideNav()` que os aplicativos de ofício escrevem em código, em forma de
12
+ * dado. O resto-saas esconde Agenda, CRM e Marketing não porque a conta não os
13
+ * tenha, mas porque no vocabulário dele a Agenda É "Reservas" e o CRM É
14
+ * "Clientes" — mostrar os dois nomes é mostrar o mesmo módulo duas vezes.
15
+ *
16
+ * Sem isto, a regra "quem não foi nomeado vai para o fim" — que existe para um
17
+ * plugin novo não sumir — devolvia cinco linhas soltas embaixo de um rail de
18
+ * sete rubricas curadas.
19
+ */
20
+ export interface RailPreset {
21
+ rail?: RailEntry[];
22
+ hide?: string[];
23
+ }
24
+ export type RailEntry = string | RailGroup;
25
+ export interface RailRow extends Omit<NavigationItem, 'children'> {
26
+ pluginId?: string;
27
+ children?: RailRow[];
28
+ }
29
+ /** `/financial` serve `/financial/payables`; `/fin` não serve `/financial`. */
30
+ export declare function matchesPrefix(route: string, prefix: string): boolean;
31
+ /**
32
+ * Aplica o `rail` do preset às linhas que os plugins contribuíram.
33
+ *
34
+ * Sem preset (lista vazia), devolve as linhas como vieram: é o aplicativo de
35
+ * ofício, que cura pelo `import`, e nada aqui deve mudá-lo.
36
+ */
37
+ export declare function applyRailPreset(rows: RailRow[], rail: RailEntry[] | undefined, hide?: string[]): RailRow[];
38
+ //# sourceMappingURL=rail-preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rail-preset.d.ts","sourceRoot":"","sources":["../../src/app/rail-preset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAmCjD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAE1C,MAAM,WAAW,OAAQ,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACrB;AAKD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EAAE,EACf,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,GACd,OAAO,EAAE,CA4CX"}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/app/scaffold.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,eAAe,CAAA;AAMtB,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,UAAU,CAAA;AA2BzD;;;iFAGiF;AACjF,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAmC7D;AA6DD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,qBA6C9F;yBA7Ce,aAAa;;;AAmD7B,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/app/scaffold.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,eAAe,CAAA;AAQtB,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,UAAU,CAAA;AA2BzD;;;iFAGiF;AACjF,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAmC7D;AA6DD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,qBAW9F;yBAXe,aAAa;;;AA2E7B,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
@@ -0,0 +1,81 @@
1
+ import type { FayzAppConfig } from './config';
2
+ /**
3
+ * O ponto de partida do aplicativo que ESTA conta roda (077).
4
+ *
5
+ * ── O que ele conserta ─────────────────────────────────────────────────────
6
+ * O aplicativo central monta o rail a partir dos plugins ligados, e para um
7
+ * restaurante isso deu quinze linhas planas — Pedidos, Agenda, Cozinha, Salão,
8
+ * Estoque, CRM, Marketing, Reservas, Financeiro… O ChefControl resolveu isso
9
+ * com SETE rubricas e filhos dentro, e esse desenho é conhecimento de produto
10
+ * validado em cliente. Pedir a cada conta que o remonte a partir de plugins
11
+ * soltos é pedir que ela redescubra o que já sabíamos.
12
+ *
13
+ * ── A conta ESTENDE, não recria ────────────────────────────────────────────
14
+ * O preset diz a árvore; `app.tenant_plugins` diz o que desta conta está
15
+ * ligado; e o shell poda o que sobrou apontando para nada (ver nav-serving).
16
+ * Uma rubrica cujos filhos estão todos desligados não desenha — "Operação"
17
+ * some sozinha numa casa sem cozinha, sem mesa e sem reserva.
18
+ *
19
+ * ── Quando a conta roda dois aplicativos ───────────────────────────────────
20
+ * Papa Léguas roda ChefControl e StoreControl sobre os mesmos dados. O preset
21
+ * é o do PRIMEIRO — `app_config()` já os ordena — porque um rail com as duas
22
+ * árvores não é a soma de dois sistemas, é nenhum dos dois.
23
+ */
24
+ export interface AppPreset {
25
+ shell?: {
26
+ layout?: FayzAppConfig['layout'];
27
+ moduleNav?: FayzAppConfig['moduleNav'];
28
+ contentFrame?: boolean;
29
+ navChildConnector?: boolean;
30
+ };
31
+ /**
32
+ * Como este ofício agrupa e ordena o rail (083). Ver ./rail-preset.
33
+ *
34
+ * Uma string é um plugin, com os rótulos DELE; um objeto é uma rubrica, e
35
+ * `under` são prefixos de rota. O preset nunca diz como uma linha se chama —
36
+ * era isso que fazia a árvore de SQL discordar dos plugins.
37
+ */
38
+ rail?: Array<string | {
39
+ label: string;
40
+ icon?: string;
41
+ under: string[];
42
+ }>;
43
+ /**
44
+ * As rotas que este ofício NÃO põe no rail — o `hideNav()` em forma de dado.
45
+ * Ver ./rail-preset.
46
+ */
47
+ hide?: string[];
48
+ /** O que este ofício OFERECE (079). Ver `useOfferedPlugins`. */
49
+ modules?: string[];
50
+ }
51
+ export declare function useAppPreset(): AppPreset;
52
+ /**
53
+ * O catálogo desta conta: a união do que cada ofício que ela roda oferece (079).
54
+ *
55
+ * UNIÃO e não "o primeiro", ao contrário do rail: Papa Léguas roda ChefControl
56
+ * e StoreControl, desenha UM rail (dois não seriam nenhum) mas TEM os dois
57
+ * catálogos — a loja dele existe mesmo com o rail sendo o do restaurante.
58
+ *
59
+ * Vazio quando nenhum aplicativo declarou oferta, e aí o runtime volta a ser o
60
+ * de antes: quem cura é o `import` do aplicativo.
61
+ */
62
+ export declare function useOfferedPlugins(): string[];
63
+ /**
64
+ * A identidade no alto da trilha é da CONTA, não do produto?
65
+ *
66
+ * Sim em dois casos, e são o mesmo caso visto de dois lados:
67
+ *
68
+ * a conta tem marca própria Espaço Facial não abre um software chamado
69
+ * StudioControl: abre o sistema DELES.
70
+ * o pacote não tem produto O aplicativo central não é um produto — ele
71
+ * carrega o ofício de quem entrar. O nome que
72
+ * apareceria ali ("FullControl", "ChefControl")
73
+ * é o do registro `app.apps`, não o do pacote, e
74
+ * empilhá-lo sobre o seletor mostra duas
75
+ * identidades onde só existe uma.
76
+ *
77
+ * Sem `VITE_APP_ID` o pacote não reivindica produto nenhum — é a mesma leitura
78
+ * que o WrongAppGate já usa para não bloquear ninguém.
79
+ */
80
+ export declare function useTenantLedIdentity(hasTenantBrand: boolean): boolean;
81
+ //# sourceMappingURL=useAppPreset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppPreset.d.ts","sourceRoot":"","sources":["../../src/app/useAppPreset.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;QAChC,SAAS,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;QACtC,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAC5B,CAAA;IACD;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACxE;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAgB,YAAY,IAAI,SAAS,CAMxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAU5C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,OAAO,GAAG,OAAO,CAErE"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * De quem é este endereço.
3
+ *
4
+ * Um inquilino com domínio próprio não deveria escolher conta: ele digitou o
5
+ * endereço DELE. O seletor "escolha uma área de trabalho" é a resposta certa
6
+ * para quem entra por `app.fayz.ai` com cinco contas; para quem entra por
7
+ * `sistema.espacofacial.com.br` ele é uma pergunta cuja resposta já está na
8
+ * barra de endereço.
9
+ *
10
+ * A porta é `tenant_branding_public`: anônima de propósito, porque a pergunta
11
+ * vem ANTES da sessão — é ela que dá marca à tela de login e à loja pública.
12
+ * Ela devolve só o recorte público (nome, slug, logo, cor, domínio); nada de
13
+ * módulos, nada de ajustes, nada que não esteja na fachada do prédio.
14
+ *
15
+ * ── Em desenvolvimento ─────────────────────────────────────────────────────
16
+ * `localhost` não tem domínio para resolver, então `?domain=` simula um. Só em
17
+ * DEV: em produção o endereço é a única fonte, e um parâmetro que troca de
18
+ * conta seria uma porta aberta na frente da casa.
19
+ */
20
+ export interface DomainTenant {
21
+ tenantId: string;
22
+ name: string | null;
23
+ slug: string | null;
24
+ logoUrl: string | null;
25
+ primaryColor: string | null;
26
+ }
27
+ export declare function resolveHostname(): string | null;
28
+ export declare function useDomainTenant(): {
29
+ tenant: DomainTenant | null;
30
+ resolving: boolean;
31
+ };
32
+ //# sourceMappingURL=useDomainTenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDomainTenant.d.ts","sourceRoot":"","sources":["../../src/app/useDomainTenant.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAID,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAM/C;AAED,wBAAgB,eAAe,IAAI;IAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAuCrF"}
@@ -0,0 +1,35 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { FayzAppConfig } from './config';
3
+ export interface TenantShell {
4
+ layout: FayzAppConfig['layout'];
5
+ moduleNav: FayzAppConfig['moduleNav'];
6
+ contentFrame: FayzAppConfig['contentFrame'];
7
+ bottomNav: FayzAppConfig['bottomNav'];
8
+ navTransition: FayzAppConfig['navTransition'];
9
+ defaultThemeMode: FayzAppConfig['defaultThemeMode'];
10
+ }
11
+ /**
12
+ * A moldura desta conta, em TRÊS degraus.
13
+ *
14
+ * 1. `shell.*` em tenant_settings o que esta casa pediu
15
+ * 2. `preset.shell` do ofício como este ofício se apresenta
16
+ * 3. a config do pacote o que veio compilado
17
+ *
18
+ * O degrau do meio faltava, e a falta tinha dente: o bloco `shell` do preset
19
+ * existia desde a 077 e NUNCA teve leitor. No aplicativo central isso fazia o
20
+ * `moduleNav: 'sidebar'` do pacote (herdado do FullControl) valer para todo
21
+ * ofício — e `ModulePage` com variante `sidebar` não desenha sub-navegação
22
+ * nenhuma, na promessa de que o rail lista as sub-telas do módulo. O rail não
23
+ * lista: as filhas ali são as telas de PRODUTO da loja, não as abas do Estoque.
24
+ * Resultado: o Estoque abria sem Produtos, Movimentações, Contagens e Receitas.
25
+ */
26
+ export declare function resolveTenantShell(config: FayzAppConfig, settings: unknown, preset?: {
27
+ shell?: Record<string, unknown>;
28
+ }): TenantShell;
29
+ export declare function useTenantShell(config: FayzAppConfig): TenantShell;
30
+ /** A logo do inquilino como nó pronto para o `logo` da casca, ou undefined. */
31
+ export declare function useTenantBrandLogo(): {
32
+ logo?: ReactNode;
33
+ mark?: ReactNode;
34
+ };
35
+ //# sourceMappingURL=useTenantShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTenantShell.d.ts","sourceRoot":"","sources":["../../src/app/useTenantShell.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAqC7C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC/B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IACrC,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IAC3C,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IACrC,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;IAC7C,gBAAgB,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAA;CACpD;AAUD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC3C,WAAW,CAcb;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAIjE;AAgBD,+EAA+E;AAC/E,wBAAgB,kBAAkB,IAAI;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CA2C3E"}
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  export interface TrialWidgetProps {
3
- /** Length of the window, for the progress bar. Matches migration 147. */
3
+ /** Length of the window, for the progress bar. Matches the DB column default (migration 044). */
4
4
  totalDays?: number;
5
5
  /** Where "see the plans" goes. */
6
6
  route?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"TrialWidget.d.ts","sourceRoot":"","sources":["../../src/billing/TrialWidget.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAAE,SAAa,EAAE,KAAgC,EAAE,SAAS,EAAE,EAAE,gBAAgB,4BA6E3G"}
1
+ {"version":3,"file":"TrialWidget.d.ts","sourceRoot":"","sources":["../../src/billing/TrialWidget.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,MAAM,WAAW,gBAAgB;IAC/B,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAAE,SAAc,EAAE,KAAgC,EAAE,SAAS,EAAE,EAAE,gBAAgB,4BA6E5G"}
@@ -1,4 +1,4 @@
1
- export { NO_TRIAL, TrialWidget, effectivePlan, paidPlanIds, resolvePlanBadge, resolveTrial, useBillingStore, useTrial } from '../chunk-SHHWE7R2.js';
2
- import '../chunk-5GWUM4SM.js';
1
+ export { NO_TRIAL, TrialWidget, effectivePlan, paidPlanIds, resolvePlanBadge, resolveTrial, useBillingStore, useTrial } from '../chunk-U3VX52SE.js';
2
+ import '../chunk-W5IBKM3K.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,8 @@
1
1
  import { useTranslation } from './chunk-YUHCC7JY.js';
2
- import { cn, useBillingStore, useTrial, effectivePlan, resolvePlanBadge } from './chunk-SHHWE7R2.js';
3
- import { useTenantOptional, useOrgAdapterOptional } from './chunk-NB6X5O5L.js';
4
- import { usePermissionsStore } from './chunk-WJ3H3RJN.js';
5
- import { useOrganizationStore } from './chunk-5GWUM4SM.js';
2
+ import { useBillingStore, useTrial, effectivePlan, resolvePlanBadge } from './chunk-U3VX52SE.js';
3
+ import { useTenantOptional, useOrgAdapterOptional } from './chunk-R4HQ2HS2.js';
4
+ import { usePermissionsStore } from './chunk-UQ2NTFQC.js';
5
+ import { cn, useOrganizationStore } from './chunk-W5IBKM3K.js';
6
6
  import * as React from 'react';
7
7
  import { Sparkles, Check, Crown, Minus } from 'lucide-react';
8
8
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -527,5 +527,5 @@ function SubscriptionPage({ className }) {
527
527
  }
528
528
 
529
529
  export { AccessProvider, CORE_LIMIT_DECLARATIONS, PlanFeatureItem, SubscriptionPage, checkAccess, entityDerivedLimitDeclarations, featureDisplayName, getAccessSnapshot, getPlanEntitlements, guardLimit, invalidateLimit, resolvePlanCurrency, useAccess, useAccessOptional, useLimit, useLimitGuard, useModuleNavAccess, useUpgradeModalStore };
530
- //# sourceMappingURL=chunk-CRB4ZUFH.js.map
531
- //# sourceMappingURL=chunk-CRB4ZUFH.js.map
530
+ //# sourceMappingURL=chunk-LB5SV4ZZ.js.map
531
+ //# sourceMappingURL=chunk-LB5SV4ZZ.js.map