@fayz-ai/ui 0.25.0 → 0.26.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/{chunk-XKFYX3DG.js → chunk-425EWIQL.js} +4 -4
- package/dist/{chunk-XKFYX3DG.js.map → chunk-425EWIQL.js.map} +1 -1
- package/dist/{chunk-RRNMNFLF.js → chunk-43DUMVRU.js} +10 -4
- package/dist/chunk-43DUMVRU.js.map +1 -0
- package/dist/{chunk-OQVFOBKU.js → chunk-BKTN6HDM.js} +5 -5
- package/dist/{chunk-OQVFOBKU.js.map → chunk-BKTN6HDM.js.map} +1 -1
- package/dist/{chunk-UP7WVKSU.js → chunk-SGK3K3AQ.js} +3 -3
- package/dist/{chunk-UP7WVKSU.js.map → chunk-SGK3K3AQ.js.map} +1 -1
- package/dist/{chunk-HO2P2XB4.js → chunk-STWAQCYV.js} +3 -3
- package/dist/{chunk-HO2P2XB4.js.map → chunk-STWAQCYV.js.map} +1 -1
- package/dist/{chunk-L4TXDKMN.js → chunk-Z32UKXDM.js} +3 -3
- package/dist/{chunk-L4TXDKMN.js.map → chunk-Z32UKXDM.js.map} +1 -1
- package/dist/dashboard/index.js +3 -3
- package/dist/index.js +9 -9
- package/dist/layout/Sidebar.d.ts +4 -0
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/index.js +3 -3
- package/dist/layout/rail-flyout.d.ts +4 -0
- package/dist/layout/rail-flyout.d.ts.map +1 -1
- package/dist/primitives/index.js +4 -4
- package/package.json +2 -2
- package/dist/chunk-RRNMNFLF.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { usePageRailSlot, useModuleHeaderActionsSlot, useRegisterPageActions, useHasPageHeaderHost, useCrossModuleBack, useBackHandler, PageHeaderCrumb, usePageHeader, useHasPageHeaderBack, PageTitlePortal } from './chunk-
|
|
1
|
+
import { usePageRailSlot, useModuleHeaderActionsSlot, useRegisterPageActions, useHasPageHeaderHost, useCrossModuleBack, useBackHandler, PageHeaderCrumb, usePageHeader, useHasPageHeaderBack, PageTitlePortal } from './chunk-43DUMVRU.js';
|
|
2
2
|
import { cn } from './chunk-OKZ6WQB3.js';
|
|
3
3
|
import { ICON_MAP } from './chunk-OWN3GFDG.js';
|
|
4
4
|
import * as React3 from 'react';
|
|
@@ -627,5 +627,5 @@ function ModulePage({ title: _title, subtitle, nav, children, className, headerA
|
|
|
627
627
|
}
|
|
628
628
|
|
|
629
629
|
export { BackStyleProvider, HeaderTabs, ModuleLayoutProvider, ModulePage, NavTransitionProvider, PageHeaderActions, PageRail, PageTabs, PageTransition, RailNavItem, SegmentedControl, Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, SubpageHeader, useBackStyle, useModuleLayout, useNavTransition };
|
|
630
|
-
//# sourceMappingURL=chunk-
|
|
631
|
-
//# sourceMappingURL=chunk-
|
|
630
|
+
//# sourceMappingURL=chunk-SGK3K3AQ.js.map
|
|
631
|
+
//# sourceMappingURL=chunk-SGK3K3AQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/sheet.tsx","../src/primitives/header-tabs.tsx","../src/primitives/segmented-control.tsx","../src/layout/PageTransition.tsx","../src/layout/ModulePage.tsx"],"names":["React","jsx","jsxs","React2","Fragment","kids"],"mappings":"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","file":"chunk-UP7WVKSU.js","sourcesContent":["import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Inject sheet animations once (module-level side effect)\n// ---------------------------------------------------------------------------\n\nconst STYLE_ID = 'saas-sheet-styles'\nif (typeof document !== 'undefined' && !document.getElementById(STYLE_ID)) {\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = `\n @keyframes saas-sheet-fade-in { from { opacity: 0 } to { opacity: 1 } }\n @keyframes saas-sheet-fade-out { from { opacity: 1 } to { opacity: 0 } }\n @keyframes saas-sheet-slide-in { from { transform: translateX(100%) } to { transform: translateX(0) } }\n @keyframes saas-sheet-slide-out { from { transform: translateX(0) } to { transform: translateX(100%) } }\n .saas-sheet-overlay[data-state=\"open\"] { animation: saas-sheet-fade-in 200ms ease-out }\n .saas-sheet-overlay[data-state=\"closed\"] { animation: saas-sheet-fade-out 150ms ease-in }\n .saas-sheet-content[data-state=\"open\"] { animation: saas-sheet-slide-in 280ms cubic-bezier(0.16, 1, 0.3, 1) }\n .saas-sheet-content[data-state=\"closed\"] { animation: saas-sheet-slide-out 200ms ease-in }\n `\n document.head.appendChild(style)\n}\n\n// ---------------------------------------------------------------------------\n// Root, Trigger, Close — re-exported from Radix\n// ---------------------------------------------------------------------------\n\nconst Sheet = DialogPrimitive.Root\nconst SheetTrigger = DialogPrimitive.Trigger\nconst SheetClose = DialogPrimitive.Close\nconst SheetPortal = DialogPrimitive.Portal\n\n// ---------------------------------------------------------------------------\n// Overlay\n// ---------------------------------------------------------------------------\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'saas-sheet-overlay fixed inset-0 z-[100] bg-black/40 backdrop-blur-[2px]',\n className\n )}\n {...props}\n />\n))\nSheetOverlay.displayName = 'SheetOverlay'\n\n// ---------------------------------------------------------------------------\n// Content — slides in from the right\n// ---------------------------------------------------------------------------\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n /** Width class override — defaults to max-w-md */\n width?: string\n /** Hide the built-in close button */\n hideClose?: boolean\n /** Overlay style: \"blur\" (default), \"dim\" (no blur), \"none\" (transparent) */\n overlay?: 'blur' | 'dim' | 'none'\n }\n>(({ className, children, width, hideClose, overlay = 'blur', onPointerDownOutside, onInteractOutside, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay className={overlay === 'none' ? 'bg-transparent backdrop-blur-0' : overlay === 'dim' ? 'backdrop-blur-0' : undefined} />\n <DialogPrimitive.Content\n ref={ref}\n // Same passthrough Modal grants: a portaled dropdown (date picker,\n // combobox, status list) lands outside the sheet's DOM, and picking from\n // one must not read as clicking away from the sheet.\n onPointerDownOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onPointerDownOutside?.(e)\n }}\n onInteractOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onInteractOutside?.(e)\n }}\n className={cn(\n 'fayz-glass-surface saas-sheet-content fixed inset-y-0 right-0 z-[100] flex flex-col border-l bg-card shadow-2xl outline-none',\n 'w-full',\n width ?? 'max-w-md',\n className\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = 'SheetContent'\n\n// ---------------------------------------------------------------------------\n// Header — top section with title + description\n// ---------------------------------------------------------------------------\n\nfunction SheetHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex flex-col gap-1 px-5 py-4 border-b shrink-0', className)}\n {...props}\n />\n )\n}\nSheetHeader.displayName = 'SheetHeader'\n\n// ---------------------------------------------------------------------------\n// Footer — bottom section for actions\n// ---------------------------------------------------------------------------\n\nfunction SheetFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex items-center gap-2 px-5 py-3 border-t shrink-0', className)}\n {...props}\n />\n )\n}\nSheetFooter.displayName = 'SheetFooter'\n\n// ---------------------------------------------------------------------------\n// Title\n// ---------------------------------------------------------------------------\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-sm font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nSheetTitle.displayName = 'SheetTitle'\n\n// ---------------------------------------------------------------------------\n// Description\n// ---------------------------------------------------------------------------\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-xs text-muted-foreground', className)}\n {...props}\n />\n))\nSheetDescription.displayName = 'SheetDescription'\n\n// ---------------------------------------------------------------------------\n// Body — scrollable content area\n// ---------------------------------------------------------------------------\n\nfunction SheetBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex-1 overflow-y-auto px-5 py-5', className)}\n {...props}\n />\n )\n}\nSheetBody.displayName = 'SheetBody'\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetBody,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface HeaderTab<T extends string = string> {\n value: T\n label: React.ReactNode\n /** Rendered before the label (already-sized lucide component or node). */\n icon?: React.ComponentType<{ className?: string }>\n /** Small trailing count chip — omit for none (0 still renders). */\n count?: number\n /** Trailing adornment (e.g. a plan-gate badge). Rendered after the count. */\n badge?: React.ReactNode\n /**\n * A control that belongs to THIS tab — the menu of actions for the cardápio\n * the tab names, say.\n *\n * Sibling of the tab button, never inside it: a button inside a button is\n * invalid, and the click would have to be untangled from the tab's own. It\n * still reads as part of the tab because it sits in the same box, before the\n * next tab's gap.\n */\n trailing?: React.ReactNode\n /**\n * Esta aba nomeia algo DESLIGADO — um cardápio desativado, uma unidade\n * fechada. Fica fraca, com o mesmo peso que a interface dá ao que existe mas\n * não está no ar. Continua clicável: desligado é um estado, não um bloqueio.\n */\n dim?: boolean\n}\n\nexport interface HeaderTabsProps<T extends string = string> {\n tabs: ReadonlyArray<HeaderTab<T>>\n value: T\n onChange: (value: T) => void\n className?: string\n 'aria-label'?: string\n /**\n * The strip IS the band, rather than sitting inside one under a title.\n *\n * Rows stretch to the strip's full height and the active underline hangs on\n * its bottom edge, so a caller that gives the strip `self-stretch -mb-px`\n * inside a bordered header lands the underline ON that border. Default (off)\n * keeps the underline 6px under the label, which is right when a title sits\n * above and the band is only as tall as the labels.\n */\n fill?: boolean\n /**\n * Stamp each tab with `data-tour=\"<anchorPrefix>.<value>\"` so a guided tour\n * can point at it. Only the MODULE nav band passes this ('modnav') — a\n * record's own tab strip stays unanchored, so the namespace never collides.\n */\n anchorPrefix?: string\n}\n\n/**\n * The list-header tab strip: plain text tabs where only the active one is\n * marked, by an underline beneath it.\n *\n * It used to be a bordered group with the active item raised onto a card — a\n * control with a box around it, which at the top of a page reads as a widget\n * sitting on the content instead of as the page's own navigation. Tabs are\n * navigation: the quietest thing that can still say \"you are here\" is a rule\n * under one word, so the page title above and the action buttons beside it stay\n * the loud parts of the row.\n *\n * Distinct from SegmentedControl on purpose. SegmentedControl is a compact\n * inline toggle (7d/30d) that inverts to a solid foreground pill — a choice you\n * flip inside a card; this switches what the page is showing.\n */\nexport function HeaderTabs<T extends string = string>({\n tabs, value, onChange, className, fill, anchorPrefix, ...rest\n}: HeaderTabsProps<T>) {\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n 'inline-flex max-w-full gap-5 overflow-x-auto scrollbar-none',\n fill ? 'items-stretch' : 'items-center',\n className,\n )}\n >\n {tabs.map((tab) => {\n const active = tab.value === value\n const Icon = tab.icon\n // Com um controle próprio (o \"⋯\" de um cardápio), a aba passa a ser uma\n // CAIXA: o botão e o controle dividem o mesmo sublinhado e a mesma\n // altura, senão o controle fica boiando ao lado de uma aba que termina\n // antes dele. Sem controle, a aba continua sendo só o botão.\n const box = cn(\n 'relative flex shrink-0 items-center gap-1.5 whitespace-nowrap text-sm transition-colors',\n fill ? 'h-full' : 'pb-1.5',\n active ? 'font-medium text-foreground' : 'text-muted-foreground hover:text-foreground',\n tab.dim && 'opacity-50 hover:opacity-100',\n )\n const inner = (\n <>\n {Icon ? <Icon className=\"h-4 w-4 shrink-0\" /> : null}\n <span>{tab.label}</span>\n {tab.count != null && (\n <span className={cn(\n 'ml-0.5 rounded-full px-1.5 text-[11px] tabular-nums',\n active ? 'bg-muted text-foreground' : 'bg-muted/70 text-muted-foreground',\n )}>\n {tab.count}\n </span>\n )}\n {tab.badge}\n </>\n )\n const underline = active\n ? <span className=\"absolute inset-x-0 bottom-0 h-0.5 rounded-full bg-foreground\" />\n : null\n\n if (!tab.trailing) {\n return (\n <button\n key={tab.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n data-tour={anchorPrefix ? `${anchorPrefix}.${tab.value}` : undefined}\n onClick={() => onChange(tab.value)}\n className={box}\n >\n {inner}\n {underline}\n </button>\n )\n }\n\n return (\n <div key={tab.value} className={box}>\n {/* O botão perde o `pb` e o sublinhado: os dois são da caixa agora,\n que é o que mantém rótulo, contagem e controle na mesma linha e\n sobre o mesmo traço. */}\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n data-tour={anchorPrefix ? `${anchorPrefix}.${tab.value}` : undefined}\n onClick={() => onChange(tab.value)}\n className=\"flex items-center gap-1.5 whitespace-nowrap\"\n >\n {inner}\n </button>\n {tab.trailing}\n {underline}\n </div>\n )\n })}\n </div>\n )\n}\n\nexport interface PageTabsProps<T extends string = string> extends Omit<HeaderTabsProps<T>, 'className'> {\n /** Right side of the band (e.g. a status filter or a secondary action). */\n actions?: React.ReactNode\n /** Applied to the band, not to the tab strip. */\n className?: string\n}\n\n/**\n * A page's tab band: the tab strip closed by a hairline that runs edge to edge,\n * directly under the shell bar — the sub-header of a screen whose sections are\n * tabs (a module, a record with several faces).\n *\n * ── THE RULE ────────────────────────────────────────────────────────────────\n * **This is the only way a screen switches what it is showing.** Not a rounded\n * pill group floating in the body, not a bordered pair of buttons beside the\n * search field, not a strip of chips — five screens of the same product had\n * grown four different shapes in four different positions for one question, and\n * a person moving between them re-learned the control every time.\n *\n * It scales where the alternatives do not: ten tabs (Financeiro) read the same\n * as two (Reservas), the rule ties the band to the shell bar so the control is\n * at the same height on every screen, and `count`/`badge` carry the numbers and\n * status dots that a pill group has nowhere to put.\n *\n * `SegmentedControl` (and a bare `TabsList`) stays for what it was built for: a\n * compact toggle INSIDE a card or beside a single control — a date range, a\n * chart's unit. If it is the first thing at the top of the page, it is wrong.\n * The one exception is a screen that already spends the band on module\n * sub-navigation; there the secondary view mode goes in `actions`, on the right\n * of the same band, so there is still one band and one place to look.\n *\n * The rule bleeds past the page padding and pays it back as inset, so it lines\n * up with the shell bar above instead of stopping 24px short of both sides; the\n * strip's `-mb-px` puts the active underline ON the rule rather than floating\n * above it. Bleed values match the shell's page padding (`p-3` / `md:px-6\n * md:pt-4`) — change one and this has to follow, or the rule stops short of the\n * edge or overshoots it.\n *\n * The bleed is vertical too, and for the same reason: the underline has to land\n * on the rule, so the space under a label is fixed at 6px, and leaving the whole\n * page padding above it left the labels pinned to the bottom of their own band.\n * The band cancels that padding and pays back its own, which is what centers the\n * labels between the shell bar and the rule.\n */\nexport function PageTabs<T extends string = string>({ actions, className, ...props }: PageTabsProps<T>) {\n return (\n <div\n // Fica NA TELA enquanto a página rola: a faixa diz em que aba você está,\n // e essa pergunta continua valendo na linha 200 da tabela — voltar ao\n // topo só para trocar de aba é o que ela existe para evitar. Opaca, e\n // pintada com a superfície que a shell publica (`--page-surface`):\n // emoldurada é `content`, sem moldura é `background`, e escolher errado\n // deixa o conteúdo aparecendo por baixo do texto das abas.\n style={{ background: 'var(--page-surface, hsl(var(--background)))' }}\n className={cn(\n 'sticky top-0 z-20 -mx-3 -mt-3 mb-4 flex flex-wrap items-end justify-between gap-3 border-b border-border px-3 pt-2 md:-mx-6 md:-mt-4 md:px-6',\n // 48px no desktop, a mesma altura do subcabeçalho dos painéis do\n // assistente à direita (TasksFilterBar, NotebookPanel). Eram 34 aqui e\n // 48 lá: os dois fios que fecham as duas faixas paravam em alturas\n // diferentes, lado a lado na mesma tela. `min-h` e não `h` porque a\n // faixa QUEBRA — doze abas no Financeiro — e uma altura fixa cortaria a\n // segunda linha.\n 'md:min-h-[2.5rem]',\n className,\n )}\n >\n <HeaderTabs {...props} className=\"-mb-px\" />\n {/* `ml-auto` e não só o `justify-between` do pai: quando a faixa QUEBRA\n — doze abas no Financeiro —, o slot vira o único item da segunda\n linha e o `justify-between` o deixa encostado à esquerda, debaixo das\n abas erradas, com cara de controle perdido. Encostado à direita ele\n continua sendo \"o lado direito da faixa\" nas duas situações. */}\n {actions && <div className=\"ml-auto flex shrink-0 items-center gap-2 pb-1.5\">{actions}</div>}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface SegmentedOption<T extends string = string> {\n value: T\n label: React.ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n /** Options as plain values (label = value) or `{ value, label }` objects. */\n options: ReadonlyArray<T | SegmentedOption<T>>\n value: T\n onChange: (value: T) => void\n /** Matches the equivalent Button heights: sm = 26px, md = 30px. */\n size?: 'sm' | 'md'\n className?: string\n 'aria-label'?: string\n}\n\nconst SIZE: Record<'sm' | 'md', { container: string; segment: string }> = {\n sm: { container: 'h-[26px]', segment: 'px-2.5 text-xs' },\n md: { container: 'h-[30px]', segment: 'px-3 text-sm' },\n}\n\n/**\n * Canonical segmented (pill) control — same chrome as Button (rounded-button\n * radius, hairline border + shadow-button bevel on a card surface). Use this for\n * any 7d/30d/90d-style toggle so every surface stays visually consistent instead\n * of hand-rolling a styled toggle group.\n */\nexport function SegmentedControl<T extends string = string>({\n options, value, onChange, size = 'sm', className, ...rest\n}: SegmentedControlProps<T>) {\n const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o)) as SegmentedOption<T>[]\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n // `fz-segmented`: gancho para a faixa do cabeçalho trocar este chrome\n // de cartão pelo de faixa (ver .fz-on-band em styles.css).\n 'fz-segmented inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button',\n SIZE[size].container,\n className,\n )}\n >\n {items.map((item) => {\n const active = item.value === value\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.value)}\n className={cn(\n 'flex h-full items-center rounded-button font-semibold transition-colors',\n SIZE[size].segment,\n active ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted/60',\n )}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// PageTransition — the single, SDK-owned animation applied to every nested\n// navigation (route changes in the shell + module-internal view changes).\n// Plugins never implement transitions themselves; they render content and the\n// shell/ModulePage wrap it in <PageTransition>. The style is provided app-wide\n// via NavTransitionProvider so different products/repos can ship a different\n// feel (slide | fade | none | future custom) without touching plugins.\n// ---------------------------------------------------------------------------\n\nexport type NavTransition = 'slide' | 'fade' | 'none'\n\nconst NavTransitionContext = React.createContext<NavTransition>('slide')\n\nexport function NavTransitionProvider({ value, children }: { value: NavTransition; children: React.ReactNode }) {\n return <NavTransitionContext.Provider value={value}>{children}</NavTransitionContext.Provider>\n}\n\nexport function useNavTransition(): NavTransition {\n return React.useContext(NavTransitionContext)\n}\n\nfunction resolveTransitionClass(transition: NavTransition, direction?: 'forward' | 'back'): string {\n if (transition === 'none') return ''\n if (transition === 'fade') return 'saas-page-enter'\n // slide (default) — direction-aware, falls back to a plain enter.\n if (direction === 'back') return 'saas-nav-back'\n if (direction === 'forward') return 'saas-nav-forward'\n return 'saas-page-enter'\n}\n\n/**\n * Wraps content and re-fires the active transition whenever `transitionKey`\n * changes (the key swap forces the node to remount, restarting the CSS\n * animation). Direction is optional and only used by the 'slide' transition.\n */\nexport function PageTransition({\n transitionKey,\n direction,\n className,\n children,\n}: {\n transitionKey: string | number\n direction?: 'forward' | 'back'\n className?: string\n children: React.ReactNode\n}) {\n const transition = useNavTransition()\n const animClass = resolveTransitionClass(transition, direction)\n return (\n <div key={transitionKey} className={cn(animClass, className)}>\n {children}\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronDown, ChevronRight, ChevronLeft, Crown, type LucideIcon } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { ICON_MAP } from '../icons'\nimport { useModuleHeaderActionsSlot, usePageRailSlot } from './AppShell'\nimport { PageTabs, type HeaderTab } from '../primitives/header-tabs'\nimport { SegmentedControl } from '../primitives/segmented-control'\nimport { PageTransition } from './PageTransition'\nimport { useBackHandler } from './SaveBar'\nimport { usePageHeader, useHasPageHeaderHost, useHasPageHeaderBack, useRegisterPageActions, PageTitlePortal } from '../stores/page-header.store'\nimport { PageHeaderCrumb } from '../primitives/page-header'\nimport { useCrossModuleBack } from './useCrossModuleBack'\n\n// ---------------------------------------------------------------------------\n// PageHeaderActions — portals a page's primary action button(s) into the shell\n// top-bar's right-aligned actions slot. Falls back to a right-aligned inline row\n// when there's no slot (e.g. topbar layout). Any page can use it:\n// <PageHeaderActions><Button>New campaign</Button></PageHeaderActions>\n// ---------------------------------------------------------------------------\n\n/**\n * A coluna de menu desta página — as seções de um módulo, os links de\n * Configurações — entregue à shell em vez de desenhada no corpo.\n *\n * A shell a põe ANTES da barra de página, encostada no topo do quadro. Desenhada\n * aqui dentro, ela nascia abaixo de uma barra que atravessava a largura toda:\n * o menu ficava empurrado para baixo do título da tela que ele mesmo governa. Do\n * lado de fora, a barra começa onde o conteúdo começa, que é o que ela nomeia.\n *\n * Sem shell (modal, layout minimal) desenha no lugar, como qualquer fallback.\n */\nexport function PageRail({ children }: { children: React.ReactNode }) {\n const slot = usePageRailSlot()\n if (slot) return createPortal(children, slot)\n return <>{children}</>\n}\n\nexport function PageHeaderActions({ children }: { children: React.ReactNode }) {\n const slot = useModuleHeaderActionsSlot()\n // The bar reads this to decide whether it exists at all — see the store. It\n // has to be registered before the portal target is asked for, not after.\n useRegisterPageActions()\n if (slot) return createPortal(children, slot)\n return <div className=\"mb-4 flex items-center justify-end gap-2\">{children}</div>\n}\n\nexport interface ModuleNavItem {\n id: string\n label: string\n icon?: string\n active?: boolean\n onClick?: () => void\n /** Where tapping the PARENT lands. Without it the shell prefers the child\n * whose id ends in `-list`: a group called \"Contas a Pagar\" opens the\n * accounts, not a blank form for a new one. */\n defaultChild?: boolean\n /** Feature id for the access gate. When set, `useModuleNavAccess` (in\n * @fayz-ai/admin) resolves this link's role (hide) and plan (Crown) state. */\n feature?: string\n /** Freemium discovery: the user's role allows this link but their plan does\n * not entitle `feature`. Renders a small Crown badge (same vocabulary as the\n * Sidebar top-level nav); the click still navigates and the gated CONTENT\n * shows the UpgradePrompt. Typically set by `useModuleNavAccess`. */\n premium?: boolean\n /**\n * O que este item é, para quem desenha navegação.\n *\n * `'action'` marca a filha que abre um FORMULÁRIO (\"Novo\", \"Entrada\",\n * \"Saída\"). Ela não entra em controle de navegação nenhum: um formulário é\n * subpágina, a subpágina toma a barra e ESCONDE a faixa — então o controle\n * desaparecia no clique, que é o oposto do que um controle de navegação faz.\n * O caminho para o formulário é o botão de cabeçalho da lista, que já existe\n * em todas essas telas (\"Nova entrada\", \"Novo Produto\").\n *\n * Padrão `'view'`: uma tela que fica na faixa e a mantém.\n */\n kind?: 'view' | 'action'\n children?: ModuleNavItem[]\n}\n\n// ---------------------------------------------------------------------------\n// PremiumBadge — the small Crown affordance shared by every module-nav renderer\n// (rail, mobile tabs, GHL header). Same vocabulary as the Sidebar top-level nav\n// so a plan-gated sub-module link reads identically wherever it appears.\n// ---------------------------------------------------------------------------\n\nfunction PremiumBadge({ className }: { className?: string }) {\n const t = useTranslation()\n const tip = t('upgrade.badgeTooltip')\n return (\n <span title={tip} aria-label={tip} className={cn('inline-flex shrink-0', className)}>\n <Crown className=\"h-3.5 w-3.5 text-amber-500\" aria-hidden />\n </span>\n )\n}\n\nexport interface ModulePageProps {\n title: string\n subtitle?: string\n nav: ModuleNavItem[]\n children: React.ReactNode\n className?: string\n /** Optional action element rendered next to the title (e.g. settings gear) */\n headerAction?: React.ReactNode\n /** Show the title/subtitle header. Default: true */\n showHeader?: boolean\n /** Optional content pinned to the bottom of the sidebar (e.g. \"Powered by X\") */\n sidebarFooter?: React.ReactNode\n /** How the module-internal nav renders. Falls back to the ModuleLayout context\n * (set by the app shell from its layout), then 'rail'. */\n navVariant?: ModuleNavVariant\n /** Active sub-view id — drives the SDK page transition when it changes.\n * Plugins pass their `useModuleNavigation().view`; they no longer animate themselves. */\n viewKey?: string\n /** Navigation direction for the transition (from `useModuleNavigation`). */\n direction?: 'forward' | 'back'\n}\n\n// ---------------------------------------------------------------------------\n// ModuleLayout context — lets the app shell decide how every module's internal\n// navigation renders ('rail' for topbar products, 'tabs' for sidebar/GHL-style\n// products), so plugins stay agnostic and products feel distinct.\n// ---------------------------------------------------------------------------\n\n/**\n * Onde a sub-navegação de um módulo mora.\n * rail — coluna à esquerda, dentro da página.\n * tabs — faixa de abas na primeira linha do corpo (HeaderTabs).\n * sidebar — em lugar nenhum da página: a sidebar da shell carrega as sub-views\n * como filhas do item do módulo. Para módulos cujas sub-views são\n * DESTINOS (Funil, Leads, Orçamentos) e não recortes de uma mesma\n * tela — listar as duas coisas seria a mesma navegação duas vezes.\n */\nexport type ModuleNavVariant = 'rail' | 'tabs' | 'sidebar'\n\nconst ModuleLayoutContext = React.createContext<ModuleNavVariant>('rail')\n\nexport function ModuleLayoutProvider({ variant, children }: { variant: ModuleNavVariant; children: React.ReactNode }) {\n return <ModuleLayoutContext.Provider value={variant}>{children}</ModuleLayoutContext.Provider>\n}\n\nexport function useModuleLayout(): ModuleNavVariant {\n return React.useContext(ModuleLayoutContext)\n}\n\n/**\n * Uma linha de trilha de página — a coluna de seções de um módulo, os links de\n * Configurações. Exportada porque essas duas colunas são a MESMA coisa e\n * estavam desenhadas duas vezes: o item ativo do módulo vinha tingido da marca\n * e o de Configurações, cinza. Duas gramáticas para \"você está aqui\".\n */\nexport function RailNavItem({ item }: { item: ModuleNavItem }) {\n const [expanded, setExpanded] = React.useState(true)\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const hasActiveChild = hasChildren && item.children!.some((c) => c.active)\n const isActive = item.active || hasActiveChild\n\n return (\n <div>\n <button\n type=\"button\"\n // Every module sub-nav entry is a tour anchor for free, the same way\n // Sidebar does `nav.<route>` — this is how a guided tour can point at\n // \"Contas a Pagar\" without the plugin lifting a finger.\n data-tour={`modnav.${item.id}`}\n onClick={() => hasChildren ? setExpanded(!expanded) : item.onClick?.()}\n className={cn(\n 'flex items-center gap-2 w-full rounded-md px-2.5 py-1.5 text-sm transition-colors',\n isActive\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n <span className=\"flex-1 text-left truncate\">{item.label}</span>\n {item.premium && <PremiumBadge className=\"ml-1\" />}\n {hasChildren && (\n expanded\n ? <ChevronDown className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n : <ChevronRight className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n )}\n </button>\n {hasChildren && expanded && (\n <div className=\"ml-4 mt-0.5 space-y-0.5 border-l pl-2\">\n {item.children!.map((child) => (\n <button\n key={child.id}\n type=\"button\"\n data-tour={`modnav.${child.id}`}\n onClick={child.onClick}\n className={cn(\n 'flex items-center w-full rounded-md px-2.5 py-1 text-xs transition-colors',\n child.active\n ? 'text-primary font-medium bg-primary/5'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n <span className=\"flex-1 text-left truncate\">{child.label}</span>\n {child.premium && <PremiumBadge className=\"ml-1\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Horizontal scrollable tabs for mobile — with expandable children */\n/**\n * Where a parent tab goes when tapped.\n *\n * It used to only expand, so \"Contas a Pagar\" answered with a choice between\n * \"Novo\" and \"Lista\" — and a group named after a set of records should open the\n * records, not ask. The create route stays reachable in the row that opens\n * underneath, which is the right weight for it.\n */\nfunction defaultChildOf(item: ModuleNavItem): ModuleNavItem | undefined {\n // Mesma regra do desktop: ação abre formulário, formulário esconde a faixa.\n const kids = (item.children ?? []).filter((c) => c.kind !== 'action')\n return (\n kids.find((c) => c.defaultChild)\n ?? kids.find((c) => /(^|-)list$/i.test(c.id))\n ?? kids.find((c) => !/(^|-)(new|novo|nova|create)$/i.test(c.id))\n ?? kids[0]\n )\n}\n\nfunction MobileTabs({ nav }: { nav: ModuleNavItem[] }) {\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [expandedId, setExpandedId] = React.useState<string | null>(null)\n\n // Auto-scroll to active tab on mount\n React.useEffect(() => {\n const container = scrollRef.current\n if (!container) return\n const activeEl = container.querySelector('[data-active=\"true\"]') as HTMLElement\n if (activeEl) {\n const left = activeEl.offsetLeft - container.offsetWidth / 2 + activeEl.offsetWidth / 2\n container.scrollTo({ left: Math.max(0, left), behavior: 'smooth' })\n }\n }, [nav])\n\n return (\n <div className=\"md:hidden -mx-1 mb-4 no-print\">\n <div ref={scrollRef} className=\"flex gap-1 px-1 pb-2 overflow-x-auto scrollbar-none\">\n {nav.map((item) => {\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const isActive = item.active || item.children?.some((c) => c.active)\n const isExpanded = expandedId === item.id\n\n return (\n <button\n key={item.id}\n type=\"button\"\n data-active={isActive || undefined}\n onClick={() => {\n if (hasChildren) {\n // Land somewhere useful AND show the siblings: the group opens\n // its list, and the row underneath keeps the rest reachable.\n if (!isExpanded) defaultChildOf(item)?.onClick?.()\n setExpandedId(isExpanded ? null : item.id)\n } else {\n item.onClick?.()\n setExpandedId(null)\n }\n }}\n className={cn(\n // This strip is the most-tapped control in most modules and it\n // was 28px tall — a third under the comfortable minimum. Height\n // and text step up on touch; the desktop rail is unaffected.\n 'flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full px-4 text-sm font-medium transition-colors',\n 'min-h-[2.75rem] active:scale-[0.98]',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-muted-foreground hover:text-foreground'\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5\" />}\n {item.label}\n {item.premium && <PremiumBadge />}\n {hasChildren && <ChevronDown className={cn('h-2.5 w-2.5 transition-transform', isExpanded && 'rotate-180')} />}\n </button>\n )\n })}\n </div>\n\n {/* Expanded children dropdown */}\n {expandedId && (() => {\n const item = nav.find((n) => n.id === expandedId)\n const shown = (item?.children ?? []).filter((c) => c.kind !== 'action')\n if (shown.length < 2) return null\n return (\n <div className=\"flex gap-1 px-2 pb-2 animate-in fade-in-0 slide-in-from-top-1\">\n {shown.map((child) => (\n <button\n key={child.id}\n type=\"button\"\n onClick={() => { child.onClick?.(); setExpandedId(null) }}\n className={cn(\n 'whitespace-nowrap rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors shrink-0',\n child.active\n ? 'bg-foreground/10 text-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {child.label}\n {child.premium && <PremiumBadge />}\n </button>\n ))}\n </div>\n )\n })()}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SubpageHeader\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Back-button style — the SINGLE, app-wide affordance for returning from a\n// detail/subpage. Set once by the product via <BackStyleProvider>, NOT chosen\n// per-plugin (mirrors NavTransitionProvider for page transitions). Plugins just\n// pass `onBack` + `parentLabel` to SubpageHeader and inherit whatever style the\n// app picked:\n// 'link' → subtle \"← Back to {parent}\" above the title (default)\n// 'breadcrumb' → \"{parent} › Title\"\n// 'icon' → square chevron button beside the title\n// ---------------------------------------------------------------------------\n\nexport type BackButtonStyle = 'link' | 'breadcrumb' | 'icon'\n\nconst BackStyleContext = React.createContext<BackButtonStyle>('link')\n\nexport function BackStyleProvider({ style, children }: { style: BackButtonStyle; children: React.ReactNode }) {\n return <BackStyleContext.Provider value={style}>{children}</BackStyleContext.Provider>\n}\n\nexport function useBackStyle(): BackButtonStyle {\n return React.useContext(BackStyleContext)\n}\n\nexport interface SubpageHeaderProps {\n /** Page title */\n title: string\n /** Short description */\n subtitle?: string\n /** Lucide icon name */\n icon?: string\n /** Back button handler */\n onBack?: () => void\n /** Parent label (e.g. \"Invoices\") — used by every back style (\"Back to Invoices\", breadcrumb root, etc.) */\n parentLabel?: string\n /** Actions rendered on the right */\n actions?: React.ReactNode\n /** Override the app-wide back style for this one header. Rarely needed. */\n backStyle?: BackButtonStyle\n /** Keep the header where it renders instead of hoisting the back link into\n * the shell bar. For a detail opened INSIDE a tab the page never changed, so\n * the bar must keep saying where the user still is. */\n inline?: boolean\n}\n\nexport function SubpageHeader({ title, subtitle, icon, onBack, parentLabel, actions, backStyle, inline }: SubpageHeaderProps) {\n const t = useTranslation()\n const appStyle = useBackStyle()\n const hasShellBar = useHasPageHeaderHost() && !inline\n\n // Defer to the global navigation history when the user came from another\n // module, so the back link points at the actual previous page. Within the\n // same module the page's own onBack/parentLabel pass through unchanged.\n const cross = useCrossModuleBack(onBack, parentLabel)\n\n // …exceto quando o cabeçalho é `inline`. Aí ele não é uma PÁGINA: é um\n // detalhe aberto dentro de uma aba, e a rota nunca mudou. O histórico global\n // ainda aponta para de onde a pessoa veio ANTES de abrir a ficha — então,\n // quem chegasse ao cliente vindo da Agenda via, dentro da aba de gravações,\n // um \"← Voltar para Agenda\" que ao ser clicado saía do cliente inteiro em vez\n // de fechar a gravação. O voltar de um detalhe inline é sempre local.\n const effectiveOnBack = inline ? onBack : cross.onBack\n const effectiveParentLabel = inline ? parentLabel : cross.parentLabel\n\n // Wire this page's back action into the app-wide Escape key (no per-plugin code).\n useBackHandler(effectiveOnBack)\n const Icon = icon ? (ICON_MAP[icon] ?? null) : null\n\n // ---------------------------------------------------------------------------\n // Com barra de shell, o cabeçalho SOBE: \"← Título\" vai para a barra e aqui\n // fica só o que ela não carrega (subtítulo, ações).\n //\n // Era esta a origem do título duplicado — a barra escrevia \"Financeiro\" e a\n // página, uma linha abaixo, \"‹ Voltar para Contas a Pagar / Contas a Pagar\".\n // Três linhas para dizer duas coisas. Os estilos 'link' | 'breadcrumb' |\n // 'icon' continuam existindo para quem não tem barra (modal, layout minimal).\n // ---------------------------------------------------------------------------\n // Detalhe aberto DENTRO de uma aba: o mesmo \"← Pai / Título\" que a barra da\n // shell desenha, só que aqui, em tamanho de linha.\n //\n // Antes esta situação caía no estilo 'link', que é um cabeçalho de PÁGINA:\n // \"← Voltar para Gravações\" numa linha e, embaixo, um <h2 text-xl font-bold>.\n // Dentro da ficha do cliente isso dava dois títulos grandes empilhados — o\n // nome da pessoa e o da gravação — e um voltar com desenho que não existe em\n // nenhum outro lugar do app. `PageHeaderCrumb` é o MESMO componente do\n // \"← Clientes / Patricia Braga\" lá de cima: um desenho de voltar, não dois.\n if (inline && effectiveOnBack) {\n return (\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <PageHeaderCrumb title={title} parentLabel={effectiveParentLabel} onBack={effectiveOnBack} />\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n )\n }\n\n if (hasShellBar) {\n return (\n <ShellSubpageHeader\n title={title}\n subtitle={subtitle}\n icon={Icon}\n onBack={effectiveOnBack}\n parentLabel={effectiveParentLabel}\n actions={actions}\n />\n )\n }\n // Breadcrumb/link need a parent label; without one we fall back to the icon button.\n const style: BackButtonStyle = !effectiveOnBack ? 'icon' : (backStyle ?? appStyle)\n const effectiveStyle: BackButtonStyle = style !== 'icon' && !effectiveParentLabel ? 'icon' : style\n\n const titleBlock = (\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n {effectiveStyle === 'icon' && effectiveOnBack && (\n <button\n onClick={effectiveOnBack}\n className=\"flex h-8 w-8 items-center justify-center rounded-lg border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n )}\n {Icon && (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-muted\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n )}\n <div>\n <h2 className=\"text-xl font-bold\">{title}</h2>\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n </div>\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n )\n\n if (effectiveStyle === 'breadcrumb') {\n return (\n <div className=\"space-y-4 mb-6\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <button onClick={effectiveOnBack} className=\"hover:text-foreground transition-colors\">{effectiveParentLabel}</button>\n <ChevronRight className=\"h-3.5 w-3.5\" />\n <span className=\"text-foreground font-medium\">{title}</span>\n </div>\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n {subtitle && <p className=\"text-sm text-muted-foreground -mt-2\">{subtitle}</p>}\n </div>\n )\n }\n\n if (effectiveStyle === 'link') {\n return (\n <div className=\"space-y-3 mb-6\">\n <button\n onClick={effectiveOnBack}\n className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n {t('crud.detail.backTo', { entities: effectiveParentLabel as string })}\n </button>\n {titleBlock}\n </div>\n )\n }\n\n // icon (default fallback)\n return <div className=\"space-y-4 mb-6\">{titleBlock}</div>\n}\n\n/**\n * SubpageHeader quando existe barra de shell: o título e o voltar vão para a\n * barra; o corpo fica com o subtítulo e as ações — as duas coisas que a barra\n * não tem onde pôr.\n *\n * Renderiza um <div> vazio? Não: quando não sobra nada, não sobra elemento\n * nenhum, para a página não começar com uma margem fantasma.\n */\nfunction ShellSubpageHeader({\n title, subtitle, icon: Icon, onBack, parentLabel, actions,\n}: {\n title: string\n subtitle?: string\n icon: LucideIcon | null\n onBack?: () => void\n parentLabel?: string\n actions?: React.ReactNode\n}) {\n // Mesmo traço que PageHeader — \"← Pai / Título\". Desenhado por PORTAL: o\n // título pode ser um nó do plugin (o status de um orçamento), e entregue à\n // shell por um store ele perdia os providers que o escreveram.\n usePageHeader(true, { back: !!onBack })\n const crumb = (\n <PageTitlePortal>\n <div className=\"flex min-w-0 items-center gap-2\">\n {Icon && !onBack && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <PageHeaderCrumb title={title} parentLabel={parentLabel} onBack={onBack} />\n </div>\n </PageTitlePortal>\n )\n\n // `subtitle` continua na API (o chamador declara), mas não é desenhado: a\n // barra nomeia a tela e a frase abaixo dela era uma linha inteira antes do\n // conteúdo, dizendo o que o conteúdo já diz.\n if (!actions) return crumb\n // As ações vão para a direita da barra — o mesmo canto de toda tela do\n // produto. Aqui embaixo elas abriam uma linha só delas entre o nome da tela e\n // o conteúdo, e cada página escolhia a altura dessa linha.\n return <>{crumb}<PageHeaderActions><div className=\"no-print flex shrink-0 items-center gap-2\">{actions}</div></PageHeaderActions></>\n}\n\n// ---------------------------------------------------------------------------\n// ModuleHeader — a module's horizontal sub-nav (Painel · Funil · Leads · …).\n//\n// Renders the SAME `PageTabs` band as every other screen whose sections are\n// tabs (the course record, list views' tab strip): the first row of the page\n// body, tabs on the left, closed by a full-bleed hairline. It used to be tabs\n// portalled into the shell's top bar, which put it next to the page title — a\n// second navigation surface, in a different position and a different visual\n// language from the tab strip one click away on any list. One tab language,\n// one position.\n// ---------------------------------------------------------------------------\n\nfunction ModuleHeader({ nav }: { nav: ModuleNavItem[] }) {\n // Clicar num pai leva à filha padrão — mas as OUTRAS filhas continuam\n // existindo, e é aí que estava o buraco: a faixa desenhava só os pais, então\n // \"Estoque\" caía em Histórico e Entrada, Saída, Contagens e Auditoria de Uso\n // não tinham como ser abertas por menu nenhum. O mesmo valia para \"Novo\" em\n // Produtos e para qualquer par de telas irmãs num grupo. `MobileTabs` já\n // abria as filhas numa segunda fileira; o desktop não tinha nada.\n //\n // As filhas vão para o slot `actions` da MESMA faixa, e não para uma fileira\n // própria abaixo dela. É a exceção que a regra do `PageTabs` enuncia: a tela\n // que já gasta a faixa com sub-navegação de módulo põe o nível secundário à\n // direita da mesma faixa, \"so there is still one band and one place to look\".\n // Uma tira de pílulas solta no corpo é literalmente o que aquela regra\n // proíbe — e, na prática, ficava tão discreta que passava por decoração.\n function defaultChild(item: ModuleNavItem) {\n // Mesma regra do desktop: ação abre formulário, formulário esconde a faixa.\n const kids = (item.children ?? []).filter((c) => c.kind !== 'action')\n return kids.find((c) => /list/i.test(c.id) || /^list$/i.test(c.label)) ?? kids[kids.length - 1]\n }\n\n const activeItem = nav.find((item) => item.active || item.children?.some((c) => c.active))\n\n const tabs: HeaderTab[] = nav.map((item) => ({\n value: item.id,\n label: item.label,\n icon: item.icon ? (ICON_MAP[item.icon] ?? undefined) : undefined,\n // Plan-gated views keep their upgrade marker — dropping it would hide the\n // only signal that the tab costs an upgrade.\n badge: item.premium ? <PremiumBadge /> : undefined,\n }))\n\n const onChange = (id: string) => {\n const item = nav.find((n) => n.id === id)\n if (!item) return\n const hasChildren = item.children && item.children.length > 0\n if (hasChildren) defaultChild(item)?.onClick?.()\n else item.onClick?.()\n }\n\n // Só VISTAS. As filhas de ação (\"Novo\", \"Entrada\") abrem formulário, e\n // formulário é subpágina: a barra passa a ser dela e a faixa some junto com\n // este controle. Clicar numa aba e ver a aba sumir é o sintoma; a causa é ter\n // posto ação dentro de navegação. Elas continuam alcançáveis pelo botão de\n // cabeçalho da lista, que é onde o resto do produto já as põe.\n //\n // E com uma vista só não há o que navegar: um controle de um segmento é\n // decoração que ocupa a faixa.\n const kids = (activeItem?.children ?? []).filter((c) => c.kind !== 'action')\n // Qual filha está aberta. Nenhuma marcada acontece num detalhe alcançado a\n // partir de uma delas; aí a primeira segura o controle em vez de ele aparecer\n // sem nada selecionado.\n const activeKid = kids.find((c) => c.active)?.id ?? kids[0]?.id\n\n const childControl = kids.length > 1 ? (\n <SegmentedControl\n size=\"sm\"\n aria-label={activeItem?.label}\n options={kids.map((c) => ({ value: c.id, label: c.label }))}\n value={activeKid ?? ''}\n onChange={(id: string) => kids.find((c) => c.id === id)?.onClick?.()}\n />\n ) : undefined\n\n return (\n <PageTabs\n tabs={tabs}\n value={activeItem?.id ?? nav[0]?.id ?? ''}\n onChange={onChange}\n actions={childControl}\n anchorPrefix=\"modnav\"\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// ModulePage\n// ---------------------------------------------------------------------------\n\n// `title` stays in the props (every caller declares it, and it is what the route\n// registers in the nav) but no variant prints it any more — the shell bar does.\nexport function ModulePage({ title: _title, subtitle, nav, children, className, headerAction, showHeader = true, sidebarFooter, navVariant, viewKey, direction }: ModulePageProps) {\n const ctxVariant = useModuleLayout()\n const variant = navVariant ?? ctxVariant\n const transitionKey = viewKey ?? 'view'\n // A subpage claimed the bar (\"← Contas a Pagar / Nova\"): the band steps aside\n // for as long as it is up. The tab strip marks WHERE YOU ARE, and on a form\n // opened from a tab you are no longer in any of them — the same reason the\n // orders detail shows no strip. The back link is the way out; the strip\n // beside it was a second, contradictory one.\n const onSubpage = useHasPageHeaderBack()\n\n // Sidebar variant — the shell's sidebar lists this module's sub-views as\n // children of its nav entry, so the page renders NO sub-nav of its own.\n if (variant === 'sidebar') {\n return (\n <>\n {showHeader && headerAction && <PageHeaderActions>{headerAction}</PageHeaderActions>}\n <PageTransition transitionKey={transitionKey} direction={direction} className={cn('min-w-0', className)}>\n {children}\n </PageTransition>\n </>\n )\n }\n\n // Tabs variant — the module sub-nav is the first row of the content area (the\n // same slot and primitive every list uses), actions go to the shell's right\n // slot, and the shell owns the page title.\n if (variant === 'tabs') {\n return (\n <>\n {!onSubpage && <ModuleHeader nav={nav} />}\n {/* Header actions belong to the module overview only; internal sub-views\n (showHeader=false) carry their own actions. */}\n {showHeader && headerAction && <PageHeaderActions>{headerAction}</PageHeaderActions>}\n <PageTransition transitionKey={transitionKey} direction={direction} className={cn('min-w-0', className)}>\n {children}\n </PageTransition>\n </>\n )\n }\n\n // Rail variant (default) — left sub-nav column, handed to the shell so it\n // reaches the top of the frame instead of starting under the page bar.\n return (\n <div className={cn('min-w-0', className)}>\n <PageRail>\n <div className=\"hidden w-48 shrink-0 flex-col overflow-y-auto border-r border-border p-3 no-print md:flex\">\n {/* No heading over the links: the page bar to the right already says\n \"Estoque\", and the rail was printing the same word in caps. */}\n <nav className=\"space-y-0.5\">\n {nav.map((item) => (\n <RailNavItem key={item.id} item={item} />\n ))}\n </nav>\n {sidebarFooter && <div className=\"mt-auto pt-3\">{sidebarFooter}</div>}\n </div>\n </PageRail>\n\n {/* Content */}\n <div className=\"min-w-0\">\n {/* O cabeçalho da página NÃO mora aqui: quem nomeia a tela é a barra da\n shell, em todos os layouts, e a trilha ao lado é navegação. Esta\n coluna desenhava um <h1> com o mesmo nome que a barra — o módulo\n aparecia escrito três vezes (barra, caps na trilha, título) antes de\n qualquer conteúdo. Sobra o subtítulo, que a barra não carrega. */}\n {showHeader && headerAction && <PageHeaderActions>{headerAction}</PageHeaderActions>}\n {/* Mobile tabs — hidden on a subpage for the same reason the `tabs`\n variant hides its strip: a form or a record reached FROM a tab is not\n one of the tabs, so leaving the strip up marks a place the user is no\n longer at, one line under a back link that says so. The guard existed\n and only the tabs variant was applying it. */}\n {!onSubpage && <MobileTabs nav={nav} />}\n <PageTransition transitionKey={transitionKey} direction={direction}>\n {children}\n </PageTransition>\n </div>\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/primitives/sheet.tsx","../src/primitives/header-tabs.tsx","../src/primitives/segmented-control.tsx","../src/layout/PageTransition.tsx","../src/layout/ModulePage.tsx"],"names":["React","jsx","jsxs","React2","Fragment","kids"],"mappings":"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","file":"chunk-SGK3K3AQ.js","sourcesContent":["import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Inject sheet animations once (module-level side effect)\n// ---------------------------------------------------------------------------\n\nconst STYLE_ID = 'saas-sheet-styles'\nif (typeof document !== 'undefined' && !document.getElementById(STYLE_ID)) {\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = `\n @keyframes saas-sheet-fade-in { from { opacity: 0 } to { opacity: 1 } }\n @keyframes saas-sheet-fade-out { from { opacity: 1 } to { opacity: 0 } }\n @keyframes saas-sheet-slide-in { from { transform: translateX(100%) } to { transform: translateX(0) } }\n @keyframes saas-sheet-slide-out { from { transform: translateX(0) } to { transform: translateX(100%) } }\n .saas-sheet-overlay[data-state=\"open\"] { animation: saas-sheet-fade-in 200ms ease-out }\n .saas-sheet-overlay[data-state=\"closed\"] { animation: saas-sheet-fade-out 150ms ease-in }\n .saas-sheet-content[data-state=\"open\"] { animation: saas-sheet-slide-in 280ms cubic-bezier(0.16, 1, 0.3, 1) }\n .saas-sheet-content[data-state=\"closed\"] { animation: saas-sheet-slide-out 200ms ease-in }\n `\n document.head.appendChild(style)\n}\n\n// ---------------------------------------------------------------------------\n// Root, Trigger, Close — re-exported from Radix\n// ---------------------------------------------------------------------------\n\nconst Sheet = DialogPrimitive.Root\nconst SheetTrigger = DialogPrimitive.Trigger\nconst SheetClose = DialogPrimitive.Close\nconst SheetPortal = DialogPrimitive.Portal\n\n// ---------------------------------------------------------------------------\n// Overlay\n// ---------------------------------------------------------------------------\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'saas-sheet-overlay fixed inset-0 z-[100] bg-black/40 backdrop-blur-[2px]',\n className\n )}\n {...props}\n />\n))\nSheetOverlay.displayName = 'SheetOverlay'\n\n// ---------------------------------------------------------------------------\n// Content — slides in from the right\n// ---------------------------------------------------------------------------\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n /** Width class override — defaults to max-w-md */\n width?: string\n /** Hide the built-in close button */\n hideClose?: boolean\n /** Overlay style: \"blur\" (default), \"dim\" (no blur), \"none\" (transparent) */\n overlay?: 'blur' | 'dim' | 'none'\n }\n>(({ className, children, width, hideClose, overlay = 'blur', onPointerDownOutside, onInteractOutside, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay className={overlay === 'none' ? 'bg-transparent backdrop-blur-0' : overlay === 'dim' ? 'backdrop-blur-0' : undefined} />\n <DialogPrimitive.Content\n ref={ref}\n // Same passthrough Modal grants: a portaled dropdown (date picker,\n // combobox, status list) lands outside the sheet's DOM, and picking from\n // one must not read as clicking away from the sheet.\n onPointerDownOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onPointerDownOutside?.(e)\n }}\n onInteractOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-modal-passthrough]') || target.closest('[data-radix-popper-content-wrapper]')) {\n e.preventDefault()\n }\n onInteractOutside?.(e)\n }}\n className={cn(\n 'fayz-glass-surface saas-sheet-content fixed inset-y-0 right-0 z-[100] flex flex-col border-l bg-card shadow-2xl outline-none',\n 'w-full',\n width ?? 'max-w-md',\n className\n )}\n {...props}\n >\n {children}\n {!hideClose && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = 'SheetContent'\n\n// ---------------------------------------------------------------------------\n// Header — top section with title + description\n// ---------------------------------------------------------------------------\n\nfunction SheetHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex flex-col gap-1 px-5 py-4 border-b shrink-0', className)}\n {...props}\n />\n )\n}\nSheetHeader.displayName = 'SheetHeader'\n\n// ---------------------------------------------------------------------------\n// Footer — bottom section for actions\n// ---------------------------------------------------------------------------\n\nfunction SheetFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex items-center gap-2 px-5 py-3 border-t shrink-0', className)}\n {...props}\n />\n )\n}\nSheetFooter.displayName = 'SheetFooter'\n\n// ---------------------------------------------------------------------------\n// Title\n// ---------------------------------------------------------------------------\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-sm font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n))\nSheetTitle.displayName = 'SheetTitle'\n\n// ---------------------------------------------------------------------------\n// Description\n// ---------------------------------------------------------------------------\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-xs text-muted-foreground', className)}\n {...props}\n />\n))\nSheetDescription.displayName = 'SheetDescription'\n\n// ---------------------------------------------------------------------------\n// Body — scrollable content area\n// ---------------------------------------------------------------------------\n\nfunction SheetBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex-1 overflow-y-auto px-5 py-5', className)}\n {...props}\n />\n )\n}\nSheetBody.displayName = 'SheetBody'\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetBody,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface HeaderTab<T extends string = string> {\n value: T\n label: React.ReactNode\n /** Rendered before the label (already-sized lucide component or node). */\n icon?: React.ComponentType<{ className?: string }>\n /** Small trailing count chip — omit for none (0 still renders). */\n count?: number\n /** Trailing adornment (e.g. a plan-gate badge). Rendered after the count. */\n badge?: React.ReactNode\n /**\n * A control that belongs to THIS tab — the menu of actions for the cardápio\n * the tab names, say.\n *\n * Sibling of the tab button, never inside it: a button inside a button is\n * invalid, and the click would have to be untangled from the tab's own. It\n * still reads as part of the tab because it sits in the same box, before the\n * next tab's gap.\n */\n trailing?: React.ReactNode\n /**\n * Esta aba nomeia algo DESLIGADO — um cardápio desativado, uma unidade\n * fechada. Fica fraca, com o mesmo peso que a interface dá ao que existe mas\n * não está no ar. Continua clicável: desligado é um estado, não um bloqueio.\n */\n dim?: boolean\n}\n\nexport interface HeaderTabsProps<T extends string = string> {\n tabs: ReadonlyArray<HeaderTab<T>>\n value: T\n onChange: (value: T) => void\n className?: string\n 'aria-label'?: string\n /**\n * The strip IS the band, rather than sitting inside one under a title.\n *\n * Rows stretch to the strip's full height and the active underline hangs on\n * its bottom edge, so a caller that gives the strip `self-stretch -mb-px`\n * inside a bordered header lands the underline ON that border. Default (off)\n * keeps the underline 6px under the label, which is right when a title sits\n * above and the band is only as tall as the labels.\n */\n fill?: boolean\n /**\n * Stamp each tab with `data-tour=\"<anchorPrefix>.<value>\"` so a guided tour\n * can point at it. Only the MODULE nav band passes this ('modnav') — a\n * record's own tab strip stays unanchored, so the namespace never collides.\n */\n anchorPrefix?: string\n}\n\n/**\n * The list-header tab strip: plain text tabs where only the active one is\n * marked, by an underline beneath it.\n *\n * It used to be a bordered group with the active item raised onto a card — a\n * control with a box around it, which at the top of a page reads as a widget\n * sitting on the content instead of as the page's own navigation. Tabs are\n * navigation: the quietest thing that can still say \"you are here\" is a rule\n * under one word, so the page title above and the action buttons beside it stay\n * the loud parts of the row.\n *\n * Distinct from SegmentedControl on purpose. SegmentedControl is a compact\n * inline toggle (7d/30d) that inverts to a solid foreground pill — a choice you\n * flip inside a card; this switches what the page is showing.\n */\nexport function HeaderTabs<T extends string = string>({\n tabs, value, onChange, className, fill, anchorPrefix, ...rest\n}: HeaderTabsProps<T>) {\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n 'inline-flex max-w-full gap-5 overflow-x-auto scrollbar-none',\n fill ? 'items-stretch' : 'items-center',\n className,\n )}\n >\n {tabs.map((tab) => {\n const active = tab.value === value\n const Icon = tab.icon\n // Com um controle próprio (o \"⋯\" de um cardápio), a aba passa a ser uma\n // CAIXA: o botão e o controle dividem o mesmo sublinhado e a mesma\n // altura, senão o controle fica boiando ao lado de uma aba que termina\n // antes dele. Sem controle, a aba continua sendo só o botão.\n const box = cn(\n 'relative flex shrink-0 items-center gap-1.5 whitespace-nowrap text-sm transition-colors',\n fill ? 'h-full' : 'pb-1.5',\n active ? 'font-medium text-foreground' : 'text-muted-foreground hover:text-foreground',\n tab.dim && 'opacity-50 hover:opacity-100',\n )\n const inner = (\n <>\n {Icon ? <Icon className=\"h-4 w-4 shrink-0\" /> : null}\n <span>{tab.label}</span>\n {tab.count != null && (\n <span className={cn(\n 'ml-0.5 rounded-full px-1.5 text-[11px] tabular-nums',\n active ? 'bg-muted text-foreground' : 'bg-muted/70 text-muted-foreground',\n )}>\n {tab.count}\n </span>\n )}\n {tab.badge}\n </>\n )\n const underline = active\n ? <span className=\"absolute inset-x-0 bottom-0 h-0.5 rounded-full bg-foreground\" />\n : null\n\n if (!tab.trailing) {\n return (\n <button\n key={tab.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n data-tour={anchorPrefix ? `${anchorPrefix}.${tab.value}` : undefined}\n onClick={() => onChange(tab.value)}\n className={box}\n >\n {inner}\n {underline}\n </button>\n )\n }\n\n return (\n <div key={tab.value} className={box}>\n {/* O botão perde o `pb` e o sublinhado: os dois são da caixa agora,\n que é o que mantém rótulo, contagem e controle na mesma linha e\n sobre o mesmo traço. */}\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n data-tour={anchorPrefix ? `${anchorPrefix}.${tab.value}` : undefined}\n onClick={() => onChange(tab.value)}\n className=\"flex items-center gap-1.5 whitespace-nowrap\"\n >\n {inner}\n </button>\n {tab.trailing}\n {underline}\n </div>\n )\n })}\n </div>\n )\n}\n\nexport interface PageTabsProps<T extends string = string> extends Omit<HeaderTabsProps<T>, 'className'> {\n /** Right side of the band (e.g. a status filter or a secondary action). */\n actions?: React.ReactNode\n /** Applied to the band, not to the tab strip. */\n className?: string\n}\n\n/**\n * A page's tab band: the tab strip closed by a hairline that runs edge to edge,\n * directly under the shell bar — the sub-header of a screen whose sections are\n * tabs (a module, a record with several faces).\n *\n * ── THE RULE ────────────────────────────────────────────────────────────────\n * **This is the only way a screen switches what it is showing.** Not a rounded\n * pill group floating in the body, not a bordered pair of buttons beside the\n * search field, not a strip of chips — five screens of the same product had\n * grown four different shapes in four different positions for one question, and\n * a person moving between them re-learned the control every time.\n *\n * It scales where the alternatives do not: ten tabs (Financeiro) read the same\n * as two (Reservas), the rule ties the band to the shell bar so the control is\n * at the same height on every screen, and `count`/`badge` carry the numbers and\n * status dots that a pill group has nowhere to put.\n *\n * `SegmentedControl` (and a bare `TabsList`) stays for what it was built for: a\n * compact toggle INSIDE a card or beside a single control — a date range, a\n * chart's unit. If it is the first thing at the top of the page, it is wrong.\n * The one exception is a screen that already spends the band on module\n * sub-navigation; there the secondary view mode goes in `actions`, on the right\n * of the same band, so there is still one band and one place to look.\n *\n * The rule bleeds past the page padding and pays it back as inset, so it lines\n * up with the shell bar above instead of stopping 24px short of both sides; the\n * strip's `-mb-px` puts the active underline ON the rule rather than floating\n * above it. Bleed values match the shell's page padding (`p-3` / `md:px-6\n * md:pt-4`) — change one and this has to follow, or the rule stops short of the\n * edge or overshoots it.\n *\n * The bleed is vertical too, and for the same reason: the underline has to land\n * on the rule, so the space under a label is fixed at 6px, and leaving the whole\n * page padding above it left the labels pinned to the bottom of their own band.\n * The band cancels that padding and pays back its own, which is what centers the\n * labels between the shell bar and the rule.\n */\nexport function PageTabs<T extends string = string>({ actions, className, ...props }: PageTabsProps<T>) {\n return (\n <div\n // Fica NA TELA enquanto a página rola: a faixa diz em que aba você está,\n // e essa pergunta continua valendo na linha 200 da tabela — voltar ao\n // topo só para trocar de aba é o que ela existe para evitar. Opaca, e\n // pintada com a superfície que a shell publica (`--page-surface`):\n // emoldurada é `content`, sem moldura é `background`, e escolher errado\n // deixa o conteúdo aparecendo por baixo do texto das abas.\n style={{ background: 'var(--page-surface, hsl(var(--background)))' }}\n className={cn(\n 'sticky top-0 z-20 -mx-3 -mt-3 mb-4 flex flex-wrap items-end justify-between gap-3 border-b border-border px-3 pt-2 md:-mx-6 md:-mt-4 md:px-6',\n // 48px no desktop, a mesma altura do subcabeçalho dos painéis do\n // assistente à direita (TasksFilterBar, NotebookPanel). Eram 34 aqui e\n // 48 lá: os dois fios que fecham as duas faixas paravam em alturas\n // diferentes, lado a lado na mesma tela. `min-h` e não `h` porque a\n // faixa QUEBRA — doze abas no Financeiro — e uma altura fixa cortaria a\n // segunda linha.\n 'md:min-h-[2.5rem]',\n className,\n )}\n >\n <HeaderTabs {...props} className=\"-mb-px\" />\n {/* `ml-auto` e não só o `justify-between` do pai: quando a faixa QUEBRA\n — doze abas no Financeiro —, o slot vira o único item da segunda\n linha e o `justify-between` o deixa encostado à esquerda, debaixo das\n abas erradas, com cara de controle perdido. Encostado à direita ele\n continua sendo \"o lado direito da faixa\" nas duas situações. */}\n {actions && <div className=\"ml-auto flex shrink-0 items-center gap-2 pb-1.5\">{actions}</div>}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface SegmentedOption<T extends string = string> {\n value: T\n label: React.ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n /** Options as plain values (label = value) or `{ value, label }` objects. */\n options: ReadonlyArray<T | SegmentedOption<T>>\n value: T\n onChange: (value: T) => void\n /** Matches the equivalent Button heights: sm = 26px, md = 30px. */\n size?: 'sm' | 'md'\n className?: string\n 'aria-label'?: string\n}\n\nconst SIZE: Record<'sm' | 'md', { container: string; segment: string }> = {\n sm: { container: 'h-[26px]', segment: 'px-2.5 text-xs' },\n md: { container: 'h-[30px]', segment: 'px-3 text-sm' },\n}\n\n/**\n * Canonical segmented (pill) control — same chrome as Button (rounded-button\n * radius, hairline border + shadow-button bevel on a card surface). Use this for\n * any 7d/30d/90d-style toggle so every surface stays visually consistent instead\n * of hand-rolling a styled toggle group.\n */\nexport function SegmentedControl<T extends string = string>({\n options, value, onChange, size = 'sm', className, ...rest\n}: SegmentedControlProps<T>) {\n const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o)) as SegmentedOption<T>[]\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n // `fz-segmented`: gancho para a faixa do cabeçalho trocar este chrome\n // de cartão pelo de faixa (ver .fz-on-band em styles.css).\n 'fz-segmented inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button',\n SIZE[size].container,\n className,\n )}\n >\n {items.map((item) => {\n const active = item.value === value\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.value)}\n className={cn(\n 'flex h-full items-center rounded-button font-semibold transition-colors',\n SIZE[size].segment,\n active ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted/60',\n )}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// PageTransition — the single, SDK-owned animation applied to every nested\n// navigation (route changes in the shell + module-internal view changes).\n// Plugins never implement transitions themselves; they render content and the\n// shell/ModulePage wrap it in <PageTransition>. The style is provided app-wide\n// via NavTransitionProvider so different products/repos can ship a different\n// feel (slide | fade | none | future custom) without touching plugins.\n// ---------------------------------------------------------------------------\n\nexport type NavTransition = 'slide' | 'fade' | 'none'\n\nconst NavTransitionContext = React.createContext<NavTransition>('slide')\n\nexport function NavTransitionProvider({ value, children }: { value: NavTransition; children: React.ReactNode }) {\n return <NavTransitionContext.Provider value={value}>{children}</NavTransitionContext.Provider>\n}\n\nexport function useNavTransition(): NavTransition {\n return React.useContext(NavTransitionContext)\n}\n\nfunction resolveTransitionClass(transition: NavTransition, direction?: 'forward' | 'back'): string {\n if (transition === 'none') return ''\n if (transition === 'fade') return 'saas-page-enter'\n // slide (default) — direction-aware, falls back to a plain enter.\n if (direction === 'back') return 'saas-nav-back'\n if (direction === 'forward') return 'saas-nav-forward'\n return 'saas-page-enter'\n}\n\n/**\n * Wraps content and re-fires the active transition whenever `transitionKey`\n * changes (the key swap forces the node to remount, restarting the CSS\n * animation). Direction is optional and only used by the 'slide' transition.\n */\nexport function PageTransition({\n transitionKey,\n direction,\n className,\n children,\n}: {\n transitionKey: string | number\n direction?: 'forward' | 'back'\n className?: string\n children: React.ReactNode\n}) {\n const transition = useNavTransition()\n const animClass = resolveTransitionClass(transition, direction)\n return (\n <div key={transitionKey} className={cn(animClass, className)}>\n {children}\n </div>\n )\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { ChevronDown, ChevronRight, ChevronLeft, Crown, type LucideIcon } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { ICON_MAP } from '../icons'\nimport { useModuleHeaderActionsSlot, usePageRailSlot } from './AppShell'\nimport { PageTabs, type HeaderTab } from '../primitives/header-tabs'\nimport { SegmentedControl } from '../primitives/segmented-control'\nimport { PageTransition } from './PageTransition'\nimport { useBackHandler } from './SaveBar'\nimport { usePageHeader, useHasPageHeaderHost, useHasPageHeaderBack, useRegisterPageActions, PageTitlePortal } from '../stores/page-header.store'\nimport { PageHeaderCrumb } from '../primitives/page-header'\nimport { useCrossModuleBack } from './useCrossModuleBack'\n\n// ---------------------------------------------------------------------------\n// PageHeaderActions — portals a page's primary action button(s) into the shell\n// top-bar's right-aligned actions slot. Falls back to a right-aligned inline row\n// when there's no slot (e.g. topbar layout). Any page can use it:\n// <PageHeaderActions><Button>New campaign</Button></PageHeaderActions>\n// ---------------------------------------------------------------------------\n\n/**\n * A coluna de menu desta página — as seções de um módulo, os links de\n * Configurações — entregue à shell em vez de desenhada no corpo.\n *\n * A shell a põe ANTES da barra de página, encostada no topo do quadro. Desenhada\n * aqui dentro, ela nascia abaixo de uma barra que atravessava a largura toda:\n * o menu ficava empurrado para baixo do título da tela que ele mesmo governa. Do\n * lado de fora, a barra começa onde o conteúdo começa, que é o que ela nomeia.\n *\n * Sem shell (modal, layout minimal) desenha no lugar, como qualquer fallback.\n */\nexport function PageRail({ children }: { children: React.ReactNode }) {\n const slot = usePageRailSlot()\n if (slot) return createPortal(children, slot)\n return <>{children}</>\n}\n\nexport function PageHeaderActions({ children }: { children: React.ReactNode }) {\n const slot = useModuleHeaderActionsSlot()\n // The bar reads this to decide whether it exists at all — see the store. It\n // has to be registered before the portal target is asked for, not after.\n useRegisterPageActions()\n if (slot) return createPortal(children, slot)\n return <div className=\"mb-4 flex items-center justify-end gap-2\">{children}</div>\n}\n\nexport interface ModuleNavItem {\n id: string\n label: string\n icon?: string\n active?: boolean\n onClick?: () => void\n /** Where tapping the PARENT lands. Without it the shell prefers the child\n * whose id ends in `-list`: a group called \"Contas a Pagar\" opens the\n * accounts, not a blank form for a new one. */\n defaultChild?: boolean\n /** Feature id for the access gate. When set, `useModuleNavAccess` (in\n * @fayz-ai/admin) resolves this link's role (hide) and plan (Crown) state. */\n feature?: string\n /** Freemium discovery: the user's role allows this link but their plan does\n * not entitle `feature`. Renders a small Crown badge (same vocabulary as the\n * Sidebar top-level nav); the click still navigates and the gated CONTENT\n * shows the UpgradePrompt. Typically set by `useModuleNavAccess`. */\n premium?: boolean\n /**\n * O que este item é, para quem desenha navegação.\n *\n * `'action'` marca a filha que abre um FORMULÁRIO (\"Novo\", \"Entrada\",\n * \"Saída\"). Ela não entra em controle de navegação nenhum: um formulário é\n * subpágina, a subpágina toma a barra e ESCONDE a faixa — então o controle\n * desaparecia no clique, que é o oposto do que um controle de navegação faz.\n * O caminho para o formulário é o botão de cabeçalho da lista, que já existe\n * em todas essas telas (\"Nova entrada\", \"Novo Produto\").\n *\n * Padrão `'view'`: uma tela que fica na faixa e a mantém.\n */\n kind?: 'view' | 'action'\n children?: ModuleNavItem[]\n}\n\n// ---------------------------------------------------------------------------\n// PremiumBadge — the small Crown affordance shared by every module-nav renderer\n// (rail, mobile tabs, GHL header). Same vocabulary as the Sidebar top-level nav\n// so a plan-gated sub-module link reads identically wherever it appears.\n// ---------------------------------------------------------------------------\n\nfunction PremiumBadge({ className }: { className?: string }) {\n const t = useTranslation()\n const tip = t('upgrade.badgeTooltip')\n return (\n <span title={tip} aria-label={tip} className={cn('inline-flex shrink-0', className)}>\n <Crown className=\"h-3.5 w-3.5 text-amber-500\" aria-hidden />\n </span>\n )\n}\n\nexport interface ModulePageProps {\n title: string\n subtitle?: string\n nav: ModuleNavItem[]\n children: React.ReactNode\n className?: string\n /** Optional action element rendered next to the title (e.g. settings gear) */\n headerAction?: React.ReactNode\n /** Show the title/subtitle header. Default: true */\n showHeader?: boolean\n /** Optional content pinned to the bottom of the sidebar (e.g. \"Powered by X\") */\n sidebarFooter?: React.ReactNode\n /** How the module-internal nav renders. Falls back to the ModuleLayout context\n * (set by the app shell from its layout), then 'rail'. */\n navVariant?: ModuleNavVariant\n /** Active sub-view id — drives the SDK page transition when it changes.\n * Plugins pass their `useModuleNavigation().view`; they no longer animate themselves. */\n viewKey?: string\n /** Navigation direction for the transition (from `useModuleNavigation`). */\n direction?: 'forward' | 'back'\n}\n\n// ---------------------------------------------------------------------------\n// ModuleLayout context — lets the app shell decide how every module's internal\n// navigation renders ('rail' for topbar products, 'tabs' for sidebar/GHL-style\n// products), so plugins stay agnostic and products feel distinct.\n// ---------------------------------------------------------------------------\n\n/**\n * Onde a sub-navegação de um módulo mora.\n * rail — coluna à esquerda, dentro da página.\n * tabs — faixa de abas na primeira linha do corpo (HeaderTabs).\n * sidebar — em lugar nenhum da página: a sidebar da shell carrega as sub-views\n * como filhas do item do módulo. Para módulos cujas sub-views são\n * DESTINOS (Funil, Leads, Orçamentos) e não recortes de uma mesma\n * tela — listar as duas coisas seria a mesma navegação duas vezes.\n */\nexport type ModuleNavVariant = 'rail' | 'tabs' | 'sidebar'\n\nconst ModuleLayoutContext = React.createContext<ModuleNavVariant>('rail')\n\nexport function ModuleLayoutProvider({ variant, children }: { variant: ModuleNavVariant; children: React.ReactNode }) {\n return <ModuleLayoutContext.Provider value={variant}>{children}</ModuleLayoutContext.Provider>\n}\n\nexport function useModuleLayout(): ModuleNavVariant {\n return React.useContext(ModuleLayoutContext)\n}\n\n/**\n * Uma linha de trilha de página — a coluna de seções de um módulo, os links de\n * Configurações. Exportada porque essas duas colunas são a MESMA coisa e\n * estavam desenhadas duas vezes: o item ativo do módulo vinha tingido da marca\n * e o de Configurações, cinza. Duas gramáticas para \"você está aqui\".\n */\nexport function RailNavItem({ item }: { item: ModuleNavItem }) {\n const [expanded, setExpanded] = React.useState(true)\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const hasActiveChild = hasChildren && item.children!.some((c) => c.active)\n const isActive = item.active || hasActiveChild\n\n return (\n <div>\n <button\n type=\"button\"\n // Every module sub-nav entry is a tour anchor for free, the same way\n // Sidebar does `nav.<route>` — this is how a guided tour can point at\n // \"Contas a Pagar\" without the plugin lifting a finger.\n data-tour={`modnav.${item.id}`}\n onClick={() => hasChildren ? setExpanded(!expanded) : item.onClick?.()}\n className={cn(\n 'flex items-center gap-2 w-full rounded-md px-2.5 py-1.5 text-sm transition-colors',\n isActive\n ? 'bg-primary/10 text-primary font-medium'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" />}\n <span className=\"flex-1 text-left truncate\">{item.label}</span>\n {item.premium && <PremiumBadge className=\"ml-1\" />}\n {hasChildren && (\n expanded\n ? <ChevronDown className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n : <ChevronRight className=\"h-3.5 w-3.5 shrink-0 opacity-50\" />\n )}\n </button>\n {hasChildren && expanded && (\n <div className=\"ml-4 mt-0.5 space-y-0.5 border-l pl-2\">\n {item.children!.map((child) => (\n <button\n key={child.id}\n type=\"button\"\n data-tour={`modnav.${child.id}`}\n onClick={child.onClick}\n className={cn(\n 'flex items-center w-full rounded-md px-2.5 py-1 text-xs transition-colors',\n child.active\n ? 'text-primary font-medium bg-primary/5'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n <span className=\"flex-1 text-left truncate\">{child.label}</span>\n {child.premium && <PremiumBadge className=\"ml-1\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Horizontal scrollable tabs for mobile — with expandable children */\n/**\n * Where a parent tab goes when tapped.\n *\n * It used to only expand, so \"Contas a Pagar\" answered with a choice between\n * \"Novo\" and \"Lista\" — and a group named after a set of records should open the\n * records, not ask. The create route stays reachable in the row that opens\n * underneath, which is the right weight for it.\n */\nfunction defaultChildOf(item: ModuleNavItem): ModuleNavItem | undefined {\n // Mesma regra do desktop: ação abre formulário, formulário esconde a faixa.\n const kids = (item.children ?? []).filter((c) => c.kind !== 'action')\n return (\n kids.find((c) => c.defaultChild)\n ?? kids.find((c) => /(^|-)list$/i.test(c.id))\n ?? kids.find((c) => !/(^|-)(new|novo|nova|create)$/i.test(c.id))\n ?? kids[0]\n )\n}\n\nfunction MobileTabs({ nav }: { nav: ModuleNavItem[] }) {\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [expandedId, setExpandedId] = React.useState<string | null>(null)\n\n // Auto-scroll to active tab on mount\n React.useEffect(() => {\n const container = scrollRef.current\n if (!container) return\n const activeEl = container.querySelector('[data-active=\"true\"]') as HTMLElement\n if (activeEl) {\n const left = activeEl.offsetLeft - container.offsetWidth / 2 + activeEl.offsetWidth / 2\n container.scrollTo({ left: Math.max(0, left), behavior: 'smooth' })\n }\n }, [nav])\n\n return (\n <div className=\"md:hidden -mx-1 mb-4 no-print\">\n <div ref={scrollRef} className=\"flex gap-1 px-1 pb-2 overflow-x-auto scrollbar-none\">\n {nav.map((item) => {\n const Icon = item.icon ? (ICON_MAP[item.icon] ?? null) : null\n const hasChildren = item.children && item.children.length > 0\n const isActive = item.active || item.children?.some((c) => c.active)\n const isExpanded = expandedId === item.id\n\n return (\n <button\n key={item.id}\n type=\"button\"\n data-active={isActive || undefined}\n onClick={() => {\n if (hasChildren) {\n // Land somewhere useful AND show the siblings: the group opens\n // its list, and the row underneath keeps the rest reachable.\n if (!isExpanded) defaultChildOf(item)?.onClick?.()\n setExpandedId(isExpanded ? null : item.id)\n } else {\n item.onClick?.()\n setExpandedId(null)\n }\n }}\n className={cn(\n // This strip is the most-tapped control in most modules and it\n // was 28px tall — a third under the comfortable minimum. Height\n // and text step up on touch; the desktop rail is unaffected.\n 'flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full px-4 text-sm font-medium transition-colors',\n 'min-h-[2.75rem] active:scale-[0.98]',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-muted-foreground hover:text-foreground'\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5\" />}\n {item.label}\n {item.premium && <PremiumBadge />}\n {hasChildren && <ChevronDown className={cn('h-2.5 w-2.5 transition-transform', isExpanded && 'rotate-180')} />}\n </button>\n )\n })}\n </div>\n\n {/* Expanded children dropdown */}\n {expandedId && (() => {\n const item = nav.find((n) => n.id === expandedId)\n const shown = (item?.children ?? []).filter((c) => c.kind !== 'action')\n if (shown.length < 2) return null\n return (\n <div className=\"flex gap-1 px-2 pb-2 animate-in fade-in-0 slide-in-from-top-1\">\n {shown.map((child) => (\n <button\n key={child.id}\n type=\"button\"\n onClick={() => { child.onClick?.(); setExpandedId(null) }}\n className={cn(\n 'whitespace-nowrap rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors shrink-0',\n child.active\n ? 'bg-foreground/10 text-foreground'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {child.label}\n {child.premium && <PremiumBadge />}\n </button>\n ))}\n </div>\n )\n })()}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SubpageHeader\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Back-button style — the SINGLE, app-wide affordance for returning from a\n// detail/subpage. Set once by the product via <BackStyleProvider>, NOT chosen\n// per-plugin (mirrors NavTransitionProvider for page transitions). Plugins just\n// pass `onBack` + `parentLabel` to SubpageHeader and inherit whatever style the\n// app picked:\n// 'link' → subtle \"← Back to {parent}\" above the title (default)\n// 'breadcrumb' → \"{parent} › Title\"\n// 'icon' → square chevron button beside the title\n// ---------------------------------------------------------------------------\n\nexport type BackButtonStyle = 'link' | 'breadcrumb' | 'icon'\n\nconst BackStyleContext = React.createContext<BackButtonStyle>('link')\n\nexport function BackStyleProvider({ style, children }: { style: BackButtonStyle; children: React.ReactNode }) {\n return <BackStyleContext.Provider value={style}>{children}</BackStyleContext.Provider>\n}\n\nexport function useBackStyle(): BackButtonStyle {\n return React.useContext(BackStyleContext)\n}\n\nexport interface SubpageHeaderProps {\n /** Page title */\n title: string\n /** Short description */\n subtitle?: string\n /** Lucide icon name */\n icon?: string\n /** Back button handler */\n onBack?: () => void\n /** Parent label (e.g. \"Invoices\") — used by every back style (\"Back to Invoices\", breadcrumb root, etc.) */\n parentLabel?: string\n /** Actions rendered on the right */\n actions?: React.ReactNode\n /** Override the app-wide back style for this one header. Rarely needed. */\n backStyle?: BackButtonStyle\n /** Keep the header where it renders instead of hoisting the back link into\n * the shell bar. For a detail opened INSIDE a tab the page never changed, so\n * the bar must keep saying where the user still is. */\n inline?: boolean\n}\n\nexport function SubpageHeader({ title, subtitle, icon, onBack, parentLabel, actions, backStyle, inline }: SubpageHeaderProps) {\n const t = useTranslation()\n const appStyle = useBackStyle()\n const hasShellBar = useHasPageHeaderHost() && !inline\n\n // Defer to the global navigation history when the user came from another\n // module, so the back link points at the actual previous page. Within the\n // same module the page's own onBack/parentLabel pass through unchanged.\n const cross = useCrossModuleBack(onBack, parentLabel)\n\n // …exceto quando o cabeçalho é `inline`. Aí ele não é uma PÁGINA: é um\n // detalhe aberto dentro de uma aba, e a rota nunca mudou. O histórico global\n // ainda aponta para de onde a pessoa veio ANTES de abrir a ficha — então,\n // quem chegasse ao cliente vindo da Agenda via, dentro da aba de gravações,\n // um \"← Voltar para Agenda\" que ao ser clicado saía do cliente inteiro em vez\n // de fechar a gravação. O voltar de um detalhe inline é sempre local.\n const effectiveOnBack = inline ? onBack : cross.onBack\n const effectiveParentLabel = inline ? parentLabel : cross.parentLabel\n\n // Wire this page's back action into the app-wide Escape key (no per-plugin code).\n useBackHandler(effectiveOnBack)\n const Icon = icon ? (ICON_MAP[icon] ?? null) : null\n\n // ---------------------------------------------------------------------------\n // Com barra de shell, o cabeçalho SOBE: \"← Título\" vai para a barra e aqui\n // fica só o que ela não carrega (subtítulo, ações).\n //\n // Era esta a origem do título duplicado — a barra escrevia \"Financeiro\" e a\n // página, uma linha abaixo, \"‹ Voltar para Contas a Pagar / Contas a Pagar\".\n // Três linhas para dizer duas coisas. Os estilos 'link' | 'breadcrumb' |\n // 'icon' continuam existindo para quem não tem barra (modal, layout minimal).\n // ---------------------------------------------------------------------------\n // Detalhe aberto DENTRO de uma aba: o mesmo \"← Pai / Título\" que a barra da\n // shell desenha, só que aqui, em tamanho de linha.\n //\n // Antes esta situação caía no estilo 'link', que é um cabeçalho de PÁGINA:\n // \"← Voltar para Gravações\" numa linha e, embaixo, um <h2 text-xl font-bold>.\n // Dentro da ficha do cliente isso dava dois títulos grandes empilhados — o\n // nome da pessoa e o da gravação — e um voltar com desenho que não existe em\n // nenhum outro lugar do app. `PageHeaderCrumb` é o MESMO componente do\n // \"← Clientes / Patricia Braga\" lá de cima: um desenho de voltar, não dois.\n if (inline && effectiveOnBack) {\n return (\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <PageHeaderCrumb title={title} parentLabel={effectiveParentLabel} onBack={effectiveOnBack} />\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n )\n }\n\n if (hasShellBar) {\n return (\n <ShellSubpageHeader\n title={title}\n subtitle={subtitle}\n icon={Icon}\n onBack={effectiveOnBack}\n parentLabel={effectiveParentLabel}\n actions={actions}\n />\n )\n }\n // Breadcrumb/link need a parent label; without one we fall back to the icon button.\n const style: BackButtonStyle = !effectiveOnBack ? 'icon' : (backStyle ?? appStyle)\n const effectiveStyle: BackButtonStyle = style !== 'icon' && !effectiveParentLabel ? 'icon' : style\n\n const titleBlock = (\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n {effectiveStyle === 'icon' && effectiveOnBack && (\n <button\n onClick={effectiveOnBack}\n className=\"flex h-8 w-8 items-center justify-center rounded-lg border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n )}\n {Icon && (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-muted\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n )}\n <div>\n <h2 className=\"text-xl font-bold\">{title}</h2>\n {subtitle && <p className=\"text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n </div>\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n )\n\n if (effectiveStyle === 'breadcrumb') {\n return (\n <div className=\"space-y-4 mb-6\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <button onClick={effectiveOnBack} className=\"hover:text-foreground transition-colors\">{effectiveParentLabel}</button>\n <ChevronRight className=\"h-3.5 w-3.5\" />\n <span className=\"text-foreground font-medium\">{title}</span>\n </div>\n {actions && <div className=\"no-print\">{actions}</div>}\n </div>\n {subtitle && <p className=\"text-sm text-muted-foreground -mt-2\">{subtitle}</p>}\n </div>\n )\n }\n\n if (effectiveStyle === 'link') {\n return (\n <div className=\"space-y-3 mb-6\">\n <button\n onClick={effectiveOnBack}\n className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n {t('crud.detail.backTo', { entities: effectiveParentLabel as string })}\n </button>\n {titleBlock}\n </div>\n )\n }\n\n // icon (default fallback)\n return <div className=\"space-y-4 mb-6\">{titleBlock}</div>\n}\n\n/**\n * SubpageHeader quando existe barra de shell: o título e o voltar vão para a\n * barra; o corpo fica com o subtítulo e as ações — as duas coisas que a barra\n * não tem onde pôr.\n *\n * Renderiza um <div> vazio? Não: quando não sobra nada, não sobra elemento\n * nenhum, para a página não começar com uma margem fantasma.\n */\nfunction ShellSubpageHeader({\n title, subtitle, icon: Icon, onBack, parentLabel, actions,\n}: {\n title: string\n subtitle?: string\n icon: LucideIcon | null\n onBack?: () => void\n parentLabel?: string\n actions?: React.ReactNode\n}) {\n // Mesmo traço que PageHeader — \"← Pai / Título\". Desenhado por PORTAL: o\n // título pode ser um nó do plugin (o status de um orçamento), e entregue à\n // shell por um store ele perdia os providers que o escreveram.\n usePageHeader(true, { back: !!onBack })\n const crumb = (\n <PageTitlePortal>\n <div className=\"flex min-w-0 items-center gap-2\">\n {Icon && !onBack && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <PageHeaderCrumb title={title} parentLabel={parentLabel} onBack={onBack} />\n </div>\n </PageTitlePortal>\n )\n\n // `subtitle` continua na API (o chamador declara), mas não é desenhado: a\n // barra nomeia a tela e a frase abaixo dela era uma linha inteira antes do\n // conteúdo, dizendo o que o conteúdo já diz.\n if (!actions) return crumb\n // As ações vão para a direita da barra — o mesmo canto de toda tela do\n // produto. Aqui embaixo elas abriam uma linha só delas entre o nome da tela e\n // o conteúdo, e cada página escolhia a altura dessa linha.\n return <>{crumb}<PageHeaderActions><div className=\"no-print flex shrink-0 items-center gap-2\">{actions}</div></PageHeaderActions></>\n}\n\n// ---------------------------------------------------------------------------\n// ModuleHeader — a module's horizontal sub-nav (Painel · Funil · Leads · …).\n//\n// Renders the SAME `PageTabs` band as every other screen whose sections are\n// tabs (the course record, list views' tab strip): the first row of the page\n// body, tabs on the left, closed by a full-bleed hairline. It used to be tabs\n// portalled into the shell's top bar, which put it next to the page title — a\n// second navigation surface, in a different position and a different visual\n// language from the tab strip one click away on any list. One tab language,\n// one position.\n// ---------------------------------------------------------------------------\n\nfunction ModuleHeader({ nav }: { nav: ModuleNavItem[] }) {\n // Clicar num pai leva à filha padrão — mas as OUTRAS filhas continuam\n // existindo, e é aí que estava o buraco: a faixa desenhava só os pais, então\n // \"Estoque\" caía em Histórico e Entrada, Saída, Contagens e Auditoria de Uso\n // não tinham como ser abertas por menu nenhum. O mesmo valia para \"Novo\" em\n // Produtos e para qualquer par de telas irmãs num grupo. `MobileTabs` já\n // abria as filhas numa segunda fileira; o desktop não tinha nada.\n //\n // As filhas vão para o slot `actions` da MESMA faixa, e não para uma fileira\n // própria abaixo dela. É a exceção que a regra do `PageTabs` enuncia: a tela\n // que já gasta a faixa com sub-navegação de módulo põe o nível secundário à\n // direita da mesma faixa, \"so there is still one band and one place to look\".\n // Uma tira de pílulas solta no corpo é literalmente o que aquela regra\n // proíbe — e, na prática, ficava tão discreta que passava por decoração.\n function defaultChild(item: ModuleNavItem) {\n // Mesma regra do desktop: ação abre formulário, formulário esconde a faixa.\n const kids = (item.children ?? []).filter((c) => c.kind !== 'action')\n return kids.find((c) => /list/i.test(c.id) || /^list$/i.test(c.label)) ?? kids[kids.length - 1]\n }\n\n const activeItem = nav.find((item) => item.active || item.children?.some((c) => c.active))\n\n const tabs: HeaderTab[] = nav.map((item) => ({\n value: item.id,\n label: item.label,\n icon: item.icon ? (ICON_MAP[item.icon] ?? undefined) : undefined,\n // Plan-gated views keep their upgrade marker — dropping it would hide the\n // only signal that the tab costs an upgrade.\n badge: item.premium ? <PremiumBadge /> : undefined,\n }))\n\n const onChange = (id: string) => {\n const item = nav.find((n) => n.id === id)\n if (!item) return\n const hasChildren = item.children && item.children.length > 0\n if (hasChildren) defaultChild(item)?.onClick?.()\n else item.onClick?.()\n }\n\n // Só VISTAS. As filhas de ação (\"Novo\", \"Entrada\") abrem formulário, e\n // formulário é subpágina: a barra passa a ser dela e a faixa some junto com\n // este controle. Clicar numa aba e ver a aba sumir é o sintoma; a causa é ter\n // posto ação dentro de navegação. Elas continuam alcançáveis pelo botão de\n // cabeçalho da lista, que é onde o resto do produto já as põe.\n //\n // E com uma vista só não há o que navegar: um controle de um segmento é\n // decoração que ocupa a faixa.\n const kids = (activeItem?.children ?? []).filter((c) => c.kind !== 'action')\n // Qual filha está aberta. Nenhuma marcada acontece num detalhe alcançado a\n // partir de uma delas; aí a primeira segura o controle em vez de ele aparecer\n // sem nada selecionado.\n const activeKid = kids.find((c) => c.active)?.id ?? kids[0]?.id\n\n const childControl = kids.length > 1 ? (\n <SegmentedControl\n size=\"sm\"\n aria-label={activeItem?.label}\n options={kids.map((c) => ({ value: c.id, label: c.label }))}\n value={activeKid ?? ''}\n onChange={(id: string) => kids.find((c) => c.id === id)?.onClick?.()}\n />\n ) : undefined\n\n return (\n <PageTabs\n tabs={tabs}\n value={activeItem?.id ?? nav[0]?.id ?? ''}\n onChange={onChange}\n actions={childControl}\n anchorPrefix=\"modnav\"\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// ModulePage\n// ---------------------------------------------------------------------------\n\n// `title` stays in the props (every caller declares it, and it is what the route\n// registers in the nav) but no variant prints it any more — the shell bar does.\nexport function ModulePage({ title: _title, subtitle, nav, children, className, headerAction, showHeader = true, sidebarFooter, navVariant, viewKey, direction }: ModulePageProps) {\n const ctxVariant = useModuleLayout()\n const variant = navVariant ?? ctxVariant\n const transitionKey = viewKey ?? 'view'\n // A subpage claimed the bar (\"← Contas a Pagar / Nova\"): the band steps aside\n // for as long as it is up. The tab strip marks WHERE YOU ARE, and on a form\n // opened from a tab you are no longer in any of them — the same reason the\n // orders detail shows no strip. The back link is the way out; the strip\n // beside it was a second, contradictory one.\n const onSubpage = useHasPageHeaderBack()\n\n // Sidebar variant — the shell's sidebar lists this module's sub-views as\n // children of its nav entry, so the page renders NO sub-nav of its own.\n if (variant === 'sidebar') {\n return (\n <>\n {showHeader && headerAction && <PageHeaderActions>{headerAction}</PageHeaderActions>}\n <PageTransition transitionKey={transitionKey} direction={direction} className={cn('min-w-0', className)}>\n {children}\n </PageTransition>\n </>\n )\n }\n\n // Tabs variant — the module sub-nav is the first row of the content area (the\n // same slot and primitive every list uses), actions go to the shell's right\n // slot, and the shell owns the page title.\n if (variant === 'tabs') {\n return (\n <>\n {!onSubpage && <ModuleHeader nav={nav} />}\n {/* Header actions belong to the module overview only; internal sub-views\n (showHeader=false) carry their own actions. */}\n {showHeader && headerAction && <PageHeaderActions>{headerAction}</PageHeaderActions>}\n <PageTransition transitionKey={transitionKey} direction={direction} className={cn('min-w-0', className)}>\n {children}\n </PageTransition>\n </>\n )\n }\n\n // Rail variant (default) — left sub-nav column, handed to the shell so it\n // reaches the top of the frame instead of starting under the page bar.\n return (\n <div className={cn('min-w-0', className)}>\n <PageRail>\n <div className=\"hidden w-48 shrink-0 flex-col overflow-y-auto border-r border-border p-3 no-print md:flex\">\n {/* No heading over the links: the page bar to the right already says\n \"Estoque\", and the rail was printing the same word in caps. */}\n <nav className=\"space-y-0.5\">\n {nav.map((item) => (\n <RailNavItem key={item.id} item={item} />\n ))}\n </nav>\n {sidebarFooter && <div className=\"mt-auto pt-3\">{sidebarFooter}</div>}\n </div>\n </PageRail>\n\n {/* Content */}\n <div className=\"min-w-0\">\n {/* O cabeçalho da página NÃO mora aqui: quem nomeia a tela é a barra da\n shell, em todos os layouts, e a trilha ao lado é navegação. Esta\n coluna desenhava um <h1> com o mesmo nome que a barra — o módulo\n aparecia escrito três vezes (barra, caps na trilha, título) antes de\n qualquer conteúdo. Sobra o subtítulo, que a barra não carrega. */}\n {showHeader && headerAction && <PageHeaderActions>{headerAction}</PageHeaderActions>}\n {/* Mobile tabs — hidden on a subpage for the same reason the `tabs`\n variant hides its strip: a form or a record reached FROM a tab is not\n one of the tabs, so leaving the strip up marks a place the user is no\n longer at, one line under a back link that says so. The guard existed\n and only the tabs variant was applying it. */}\n {!onSubpage && <MobileTabs nav={nav} />}\n <PageTransition transitionKey={transitionKey} direction={direction}>\n {children}\n </PageTransition>\n </div>\n </div>\n )\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useModuleHeaderActionsSlot, useModuleHeaderSlot } from './chunk-
|
|
1
|
+
import { useModuleHeaderActionsSlot, useModuleHeaderSlot } from './chunk-43DUMVRU.js';
|
|
2
2
|
import { cn, Button } from './chunk-OKZ6WQB3.js';
|
|
3
3
|
import * as React10 from 'react';
|
|
4
4
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
@@ -1049,5 +1049,5 @@ function PageToolbar({
|
|
|
1049
1049
|
}
|
|
1050
1050
|
|
|
1051
1051
|
export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, DataTable, Dropdown, DropdownCheckboxItem, DropdownContent, DropdownGroup, DropdownItem, DropdownLabel, DropdownPortal, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownShortcut, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, Hint, PageActionBar, PageToolbar, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, RangeControl, Skeleton, TableSkeleton, ToolbarAction, ToolbarButton, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, WIDE_QUERY, setActionsMenuLabel, useIsWide, useToolbarPanelClose, useToolbarSurface };
|
|
1052
|
-
//# sourceMappingURL=chunk-
|
|
1053
|
-
//# sourceMappingURL=chunk-
|
|
1052
|
+
//# sourceMappingURL=chunk-STWAQCYV.js.map
|
|
1053
|
+
//# sourceMappingURL=chunk-STWAQCYV.js.map
|