@fayz-ai/admin 0.22.1 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CommandPalette-GQ6SPITD.js → CommandPalette-ANZWU27U.js} +5 -5
- package/dist/CommandPalette-ANZWU27U.js.map +1 -0
- package/dist/ScheduleEditor-KU4UUG6Q.js +7 -0
- package/dist/ScheduleEditor-KU4UUG6Q.js.map +1 -0
- package/dist/SubscriptionPage-4EJCCS4I.js +8 -0
- package/dist/{SubscriptionPage-Y23PH6US.js.map → SubscriptionPage-4EJCCS4I.js.map} +1 -1
- package/dist/app/AdminShell.d.ts +2 -0
- package/dist/app/AdminShell.d.ts.map +1 -1
- package/dist/app/WrongAppGate.d.ts +46 -0
- package/dist/app/WrongAppGate.d.ts.map +1 -0
- package/dist/app/admin-app.d.ts.map +1 -1
- package/dist/app/app-config-cache.d.ts +13 -0
- package/dist/app/app-config-cache.d.ts.map +1 -0
- package/dist/app/contextual-nav.store.d.ts +7 -5
- package/dist/app/contextual-nav.store.d.ts.map +1 -1
- package/dist/app/nav-serving.d.ts +40 -0
- package/dist/app/nav-serving.d.ts.map +1 -0
- package/dist/app/nav-waiting.d.ts +23 -0
- package/dist/app/nav-waiting.d.ts.map +1 -0
- package/dist/app/rail-preset.d.ts +38 -0
- package/dist/app/rail-preset.d.ts.map +1 -0
- package/dist/app/scaffold.d.ts.map +1 -1
- package/dist/app/useAppPreset.d.ts +81 -0
- package/dist/app/useAppPreset.d.ts.map +1 -0
- package/dist/app/useDomainTenant.d.ts +32 -0
- package/dist/app/useDomainTenant.d.ts.map +1 -0
- package/dist/app/useTenantShell.d.ts +35 -0
- package/dist/app/useTenantShell.d.ts.map +1 -0
- package/dist/billing/index.js +2 -2
- package/dist/{chunk-YBLLTHYP.js → chunk-LB5SV4ZZ.js} +6 -6
- package/dist/{chunk-YBLLTHYP.js.map → chunk-LB5SV4ZZ.js.map} +1 -1
- package/dist/{ScheduleEditor-B7PLFGVM.js → chunk-NXFFJY2X.js} +44 -8
- package/dist/chunk-NXFFJY2X.js.map +1 -0
- package/dist/{chunk-NB6X5O5L.js → chunk-R4HQ2HS2.js} +22 -6
- package/dist/chunk-R4HQ2HS2.js.map +1 -0
- package/dist/{chunk-CTCK5JUQ.js → chunk-U3VX52SE.js} +4 -5
- package/dist/chunk-U3VX52SE.js.map +1 -0
- package/dist/{chunk-WJ3H3RJN.js → chunk-UQ2NTFQC.js} +4 -2
- package/dist/chunk-UQ2NTFQC.js.map +1 -0
- package/dist/{chunk-5GWUM4SM.js → chunk-W5IBKM3K.js} +3 -2
- package/dist/chunk-W5IBKM3K.js.map +1 -0
- package/dist/{chunk-ZKOWNGZT.js → chunk-XJB76FHA.js} +216 -72
- package/dist/chunk-XJB76FHA.js.map +1 -0
- package/dist/components/RightRail.d.ts.map +1 -1
- package/dist/components/chat/AgentAvatar.d.ts +6 -1
- package/dist/components/chat/AgentAvatar.d.ts.map +1 -1
- package/dist/components/chat/AssistantInvite.d.ts.map +1 -1
- package/dist/components/chat/ChatConversation.d.ts.map +1 -1
- package/dist/components/chat/ChatFab.d.ts.map +1 -1
- package/dist/components/layout/CommandPalette.d.ts +5 -1
- package/dist/components/layout/CommandPalette.d.ts.map +1 -1
- package/dist/components/layout/PrintChrome.d.ts.map +1 -1
- package/dist/components/right-rail.d.ts +2 -0
- package/dist/components/right-rail.d.ts.map +1 -1
- package/dist/components/settings/AddModulesPanel.d.ts +45 -0
- package/dist/components/settings/AddModulesPanel.d.ts.map +1 -0
- package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
- package/dist/components/settings/ConnectedModulesSettings.d.ts +5 -0
- package/dist/components/settings/ConnectedModulesSettings.d.ts.map +1 -0
- package/dist/components/settings/ModuleCard.d.ts +26 -0
- package/dist/components/settings/ModuleCard.d.ts.map +1 -0
- package/dist/components/settings/ModulesSettings.d.ts +48 -0
- package/dist/components/settings/ModulesSettings.d.ts.map +1 -0
- package/dist/components/settings/SettingsPage.d.ts.map +1 -1
- package/dist/components/settings/module-catalog.d.ts +58 -0
- package/dist/components/settings/module-catalog.d.ts.map +1 -0
- package/dist/crud/CrudFormPage.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderDetailView.d.ts +44 -0
- package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
- package/dist/directory/AppSwitcher.d.ts +6 -2
- package/dist/directory/AppSwitcher.d.ts.map +1 -1
- package/dist/hooks/useAppConfig.d.ts +8 -0
- package/dist/hooks/useAppConfig.d.ts.map +1 -1
- package/dist/hooks/useChat.d.ts.map +1 -1
- package/dist/hooks/useLayout.d.ts +4 -1
- package/dist/hooks/useLayout.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2069 -980
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-surface.d.ts +8 -1
- package/dist/lib/agent-surface.d.ts.map +1 -1
- package/dist/lib/ai-tool-handlers.d.ts.map +1 -1
- package/dist/lib/brand.d.ts +45 -0
- package/dist/lib/brand.d.ts.map +1 -1
- package/dist/lib/search-targets.d.ts.map +1 -1
- package/dist/org/OrgMark.d.ts +41 -0
- package/dist/org/OrgMark.d.ts.map +1 -0
- package/dist/org/WorkspaceChooser.d.ts +1 -0
- package/dist/org/WorkspaceChooser.d.ts.map +1 -1
- package/dist/org/WorkspaceChooserGate.d.ts.map +1 -1
- package/dist/org/WorkspaceSwitching.d.ts.map +1 -1
- package/dist/org/context.d.ts +13 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/index.d.ts +2 -0
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +4 -4
- package/dist/org/switching.store.d.ts.map +1 -1
- package/dist/org/workspace-search.d.ts +27 -0
- package/dist/org/workspace-search.d.ts.map +1 -0
- package/dist/permissions/index.js +1 -1
- package/dist/permissions/store.d.ts +12 -0
- package/dist/permissions/store.d.ts.map +1 -1
- package/dist/setup/SetupAgentSurface.d.ts.map +1 -1
- package/dist/stores/app-config.store.d.ts +5 -1
- package/dist/stores/app-config.store.d.ts.map +1 -1
- package/dist/theme/dark.d.ts.map +1 -1
- package/dist/theme/light.d.ts.map +1 -1
- package/dist/theme/tokens.d.ts +13 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/utils.d.ts.map +1 -1
- package/dist/units/UnitSwitcher.d.ts +10 -1
- package/dist/units/UnitSwitcher.d.ts.map +1 -1
- package/package.json +6 -6
- package/dist/CommandPalette-GQ6SPITD.js.map +0 -1
- package/dist/ScheduleEditor-B7PLFGVM.js.map +0 -1
- package/dist/SubscriptionPage-Y23PH6US.js +0 -8
- package/dist/chunk-5GWUM4SM.js.map +0 -1
- package/dist/chunk-CTCK5JUQ.js.map +0 -1
- package/dist/chunk-NB6X5O5L.js.map +0 -1
- package/dist/chunk-RKXZ7RUG.js +0 -20
- package/dist/chunk-RKXZ7RUG.js.map +0 -1
- package/dist/chunk-WJ3H3RJN.js.map +0 -1
- 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
|
-
|
|
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-
|
|
297
|
-
//# sourceMappingURL=CommandPalette-
|
|
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\">↑↓</kbd>\n <span>{t('layout.commandPalette.navigate')}</span>\n <kbd className=\"rounded border border-border bg-muted px-1 py-0.5 font-medium\">↵</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-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"SubscriptionPage-4EJCCS4I.js"}
|
package/dist/app/AdminShell.d.ts
CHANGED
|
@@ -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":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAGhB,KAAK,gBAAgB,
|
|
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;
|
|
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"}
|
|
@@ -10,12 +10,14 @@ export interface ContextualNav {
|
|
|
10
10
|
backTo?: string;
|
|
11
11
|
backLabel?: string;
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* Texto do campo de busca da rail. Declarar isto LIGA a busca; omitir deixa a
|
|
14
|
+
* rail como era.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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.
|
|
19
21
|
*/
|
|
20
22
|
searchPlaceholder?: string;
|
|
21
23
|
}
|
|
@@ -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;IAClB
|
|
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;
|
|
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"}
|
package/dist/billing/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { NO_TRIAL, TrialWidget, effectivePlan, paidPlanIds, resolvePlanBadge, resolveTrial, useBillingStore, useTrial } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
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 {
|
|
3
|
-
import { useTenantOptional, useOrgAdapterOptional } from './chunk-
|
|
4
|
-
import { usePermissionsStore } from './chunk-
|
|
5
|
-
import { useOrganizationStore } from './chunk-
|
|
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-
|
|
531
|
-
//# sourceMappingURL=chunk-
|
|
530
|
+
//# sourceMappingURL=chunk-LB5SV4ZZ.js.map
|
|
531
|
+
//# sourceMappingURL=chunk-LB5SV4ZZ.js.map
|