@fayz-ai/ui 0.36.0 → 0.37.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-N7JP63VB.js → chunk-2KHWQYBC.js} +5 -5
- package/dist/{chunk-N7JP63VB.js.map → chunk-2KHWQYBC.js.map} +1 -1
- package/dist/{chunk-UCNY76FQ.js → chunk-5MXNQ6HZ.js} +6 -5
- package/dist/chunk-5MXNQ6HZ.js.map +1 -0
- package/dist/{chunk-XR3WXB6N.js → chunk-7SEWMFO3.js} +80 -13
- package/dist/chunk-7SEWMFO3.js.map +1 -0
- package/dist/{chunk-CUCIVYCV.js → chunk-BJNV7RJQ.js} +4 -4
- package/dist/{chunk-CUCIVYCV.js.map → chunk-BJNV7RJQ.js.map} +1 -1
- package/dist/chunk-FKYFYGAS.js +143 -0
- package/dist/chunk-FKYFYGAS.js.map +1 -0
- package/dist/{chunk-OB2ULDBD.js → chunk-IN2DFMJV.js} +4 -4
- package/dist/{chunk-OB2ULDBD.js.map → chunk-IN2DFMJV.js.map} +1 -1
- package/dist/{chunk-XQTGXHT6.js → chunk-N6LNCYOT.js} +3 -3
- package/dist/{chunk-XQTGXHT6.js.map → chunk-N6LNCYOT.js.map} +1 -1
- package/dist/{chunk-7W6WRDDF.js → chunk-RRFRIKPF.js} +291 -154
- package/dist/chunk-RRFRIKPF.js.map +1 -0
- package/dist/{chunk-GLRLWBBF.js → chunk-ZJ7C2P64.js} +17 -102
- package/dist/chunk-ZJ7C2P64.js.map +1 -0
- package/dist/dashboard/index.js +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -15
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/ModulePage.d.ts.map +1 -1
- package/dist/layout/SaveBar.d.ts.map +1 -1
- package/dist/layout/index.js +4 -4
- package/dist/primitives/choice-list.d.ts +56 -0
- package/dist/primitives/choice-list.d.ts.map +1 -0
- package/dist/primitives/filter-chip.d.ts +7 -1
- package/dist/primitives/filter-chip.d.ts.map +1 -1
- package/dist/primitives/filter-menu.d.ts +2 -0
- package/dist/primitives/filter-menu.d.ts.map +1 -1
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +6 -6
- package/dist/primitives/list-filter-bar.d.ts +4 -1
- package/dist/primitives/list-filter-bar.d.ts.map +1 -1
- package/dist/primitives/search-select.d.ts +5 -1
- package/dist/primitives/search-select.d.ts.map +1 -1
- package/dist/wizard/index.js +3 -3
- package/package.json +2 -2
- package/dist/chunk-7W6WRDDF.js.map +0 -1
- package/dist/chunk-GLRLWBBF.js.map +0 -1
- package/dist/chunk-OKZ6WQB3.js +0 -57
- package/dist/chunk-OKZ6WQB3.js.map +0 -1
- package/dist/chunk-UCNY76FQ.js.map +0 -1
- package/dist/chunk-XR3WXB6N.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/switch.tsx","../src/primitives/confirm-dialog.tsx","../src/primitives/step-progress.tsx","../src/primitives/option-select.tsx","../src/primitives/image-drop.tsx","../src/primitives/color-palette.tsx"],"names":["React","Switch","React2","jsxs","jsx","React3","React5","X"],"mappings":"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","file":"chunk-GLRLWBBF.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Switch — ligar/desligar algo que vale IMEDIATAMENTE.\n//\n// É a diferença para o checkbox, e é o que decide qual usar: checkbox é uma\n// escolha que só existe quando o formulário for salvo (\"aceito os termos\");\n// switch é um interruptor — mexeu, mudou. Uma lista onde cada linha liga um\n// disparo é o segundo caso, e desenhá-lo como checkbox faz procurar o botão\n// Salvar que nunca vem.\n//\n// Sem Radix: é um <button role=\"switch\"> com aria-checked, que é exatamente o\n// contrato que o leitor de tela espera. Uma dependência a mais para animar um\n// círculo de 16px não se paga.\n// ---------------------------------------------------------------------------\n\nexport interface SwitchProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n /** 'sm' para linhas de lista, 'md' para formulários. */\n size?: 'sm' | 'md'\n /** Texto ao lado. Clicar nele também alterna — é área de toque de graça. */\n label?: React.ReactNode\n}\n\nconst TRACK = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n}\n\nconst THUMB = {\n sm: 'h-3 w-3 data-[on=true]:translate-x-3',\n md: 'h-4 w-4 data-[on=true]:translate-x-4',\n}\n\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { checked, onCheckedChange, size = 'sm', label, className, disabled, ...rest },\n ref,\n) {\n const control = (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={(e) => {\n // stopPropagation: o switch vive dentro de linhas clicáveis, e ligar\n // algo não deve navegar para outro lugar ao mesmo tempo.\n e.stopPropagation()\n rest.onClick?.(e)\n if (!disabled) onCheckedChange(!checked)\n }}\n className={cn(\n 'relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n TRACK[size],\n checked ? 'bg-primary' : 'bg-muted-foreground/30',\n className,\n )}\n {...rest}\n >\n <span\n data-on={checked}\n className={cn(\n 'pointer-events-none ml-0.5 inline-block rounded-full bg-background shadow-sm transition-transform',\n THUMB[size],\n )}\n />\n </button>\n )\n\n if (label == null) return control\n\n return (\n <label\n className={cn(\n 'inline-flex items-center gap-2 text-xs text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {control}\n <span>{label}</span>\n </label>\n )\n})\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { AlertTriangle, Info, CheckCircle2, XCircle } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\n\ntype ConfirmVariant = 'default' | 'destructive' | 'warning' | 'success'\n\ninterface ConfirmDialogProps {\n open: boolean\n onConfirm: () => void\n onCancel: () => void\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n variant?: ConfirmVariant\n loading?: boolean\n}\n\nconst VARIANT_CONFIG: Record<\n ConfirmVariant,\n {\n icon: React.ElementType\n iconBg: string\n iconColor: string\n buttonVariant: 'default' | 'destructive'\n }\n> = {\n default: {\n icon: Info,\n iconBg: 'bg-info/10',\n iconColor: 'text-info',\n buttonVariant: 'default',\n },\n destructive: {\n icon: XCircle,\n iconBg: 'bg-destructive/10',\n iconColor: 'text-destructive',\n buttonVariant: 'destructive',\n },\n warning: {\n icon: AlertTriangle,\n iconBg: 'bg-warning/10',\n iconColor: 'text-warning',\n buttonVariant: 'destructive',\n },\n success: {\n icon: CheckCircle2,\n iconBg: 'bg-success/10',\n iconColor: 'text-success',\n buttonVariant: 'default',\n },\n}\n\nexport function ConfirmDialog({\n open,\n onConfirm,\n onCancel,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n loading = false,\n}: ConfirmDialogProps) {\n const config = VARIANT_CONFIG[variant]\n const Icon = config.icon\n\n React.useEffect(() => {\n if (!open) return\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCancel()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onCancel])\n\n if (!open) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-[2px] animate-fade-in\"\n onClick={onCancel}\n />\n\n <div\n className=\"relative z-10 w-full max-w-sm mx-4 rounded-modal border border-border bg-card shadow-lg animate-zoom-in\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"confirm-title\"\n aria-describedby={description ? 'confirm-desc' : undefined}\n >\n <div className=\"p-6\">\n <div className=\"flex gap-4\">\n <div className={cn('flex h-10 w-10 items-center justify-center rounded-full shrink-0', config.iconBg)}>\n <Icon className={cn('h-5 w-5', config.iconColor)} />\n </div>\n <div className=\"min-w-0 pt-0.5\">\n <h3 id=\"confirm-title\" className=\"text-sm font-semibold text-foreground\">\n {title}\n </h3>\n {description && (\n <p id=\"confirm-desc\" className=\"text-xs text-muted-foreground mt-1 leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-5\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={config.buttonVariant} size=\"sm\" onClick={onConfirm} disabled={loading}>\n {loading ? 'Processing...' : confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface StepProgressProps {\n /** How many steps the flow has. */\n total: number\n /** Zero-based index of the step on screen. */\n current: number\n /** Jump to a step. Only offered for steps already visited. */\n onSelect?: (index: number) => void\n className?: string\n 'aria-label'?: string\n}\n\n/**\n * Segmented progress rail — one bar per step, filled up to the current one.\n *\n * A single continuous bar tells you how far along you are; segments also tell you\n * how much is LEFT, which is what stops someone abandoning a form they think is\n * endless. Sits at the bottom of the wizard column, above the footer.\n */\nexport function StepProgress({ total, current, onSelect, className, ...rest }: StepProgressProps) {\n return (\n <div\n role=\"progressbar\"\n aria-label={rest['aria-label']}\n aria-valuemin={1}\n aria-valuemax={total}\n aria-valuenow={Math.min(current + 1, total)}\n className={cn('flex w-full items-center gap-2', className)}\n >\n {Array.from({ length: total }, (_, i) => {\n const done = i <= current\n // Only steps already behind you are clickable — jumping forward would skip\n // the validation the wizard runs on the way out of each step.\n const clickable = Boolean(onSelect) && i < current\n return (\n <button\n key={i}\n type=\"button\"\n tabIndex={clickable ? 0 : -1}\n aria-hidden={!clickable}\n disabled={!clickable}\n onClick={clickable ? () => onSelect?.(i) : undefined}\n className={cn(\n 'h-[2px] flex-1 rounded-full transition-colors duration-300',\n done ? 'bg-foreground' : 'bg-border',\n clickable && 'cursor-pointer hover:bg-foreground/70',\n )}\n />\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface SelectableOption {\n value: string\n label: React.ReactNode\n /** Second line under the label — the sentence that makes the choice obvious. */\n hint?: React.ReactNode\n icon?: React.ReactNode\n}\n\ninterface SharedProps {\n options: ReadonlyArray<SelectableOption>\n /** A string in single mode, a list in `multi` mode. */\n value?: string | string[]\n onChange: (value: string | string[]) => void\n multi?: boolean\n disabled?: boolean\n /**\n * Bind 1–9 to the first nine options and print the digit on each one.\n *\n * Off by default: two shortcut-bound groups on one screen would both answer to\n * \"1\". The caller decides which group owns the keys.\n */\n shortcuts?: boolean\n className?: string\n 'aria-label'?: string\n}\n\n/** Toggle in multi mode, replace in single mode. */\nfunction nextValue(current: string | string[] | undefined, picked: string, multi: boolean): string | string[] {\n if (!multi) return picked\n const list = Array.isArray(current) ? current : current ? [current] : []\n return list.includes(picked) ? list.filter((v) => v !== picked) : [...list, picked]\n}\n\nfunction isSelected(current: string | string[] | undefined, option: string): boolean {\n return Array.isArray(current) ? current.includes(option) : current === option\n}\n\n/** Only the first nine get a digit — a two-key shortcut is slower than the mouse. */\nconst MAX_SHORTCUTS = 9\n\n/**\n * 1–9 pick the matching option. Ignored while a field has focus, so typing \"2\"\n * into \"how many chairs\" answers the question instead of jumping the form.\n */\nfunction useOptionShortcuts(\n options: ReadonlyArray<SelectableOption>,\n enabled: boolean,\n pick: (value: string) => void,\n) {\n const pickRef = React.useRef(pick)\n pickRef.current = pick\n const values = options.slice(0, MAX_SHORTCUTS).map((o) => o.value).join('\u0000')\n\n React.useEffect(() => {\n if (!enabled) return\n const list = values.split('\u0000').filter(Boolean)\n if (list.length === 0) return\n function onKey(e: KeyboardEvent) {\n if (e.metaKey || e.ctrlKey || e.altKey) return\n const el = e.target as HTMLElement | null\n const tag = el?.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el?.isContentEditable) return\n const index = Number(e.key) - 1\n if (!Number.isInteger(index) || index < 0 || index >= list.length) return\n e.preventDefault()\n pickRef.current(list[index]!)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [enabled, values])\n}\n\n/** The digit badge printed on a shortcut-bound option. */\nfunction KeyHint({ index, selected, corner }: { index: number; selected: boolean; corner?: boolean }) {\n return (\n <kbd\n aria-hidden\n className={cn(\n 'hidden h-5 min-w-[1.25rem] shrink-0 items-center justify-center rounded border px-1 font-mono text-[10px] font-semibold sm:inline-flex',\n // Parked in the corner rather than in the reading line: the shortcut is\n // an accelerator, not part of the answer, and inline it pushed every\n // label right and split the logo from the name it belongs to.\n corner && 'absolute right-2 top-2',\n selected\n ? 'border-primary/40 bg-primary/10 text-primary'\n : 'border-border bg-muted text-muted-foreground',\n )}\n >\n {index + 1}\n </kbd>\n )\n}\n\nexport interface OptionCardsProps extends SharedProps {\n /** Cards per row on wide screens. One column reads as a list — use it for long hints. */\n columns?: 1 | 2 | 3\n}\n\nconst COLUMNS: Record<1 | 2 | 3, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/**\n * Card picker — the answer surface for a question with a handful of options that\n * each need a sentence of explanation.\n *\n * Radix has no radio-group in this package and a native radio list cannot carry a\n * hint line, so this is a button grid with `role=\"radio\"`/`\"checkbox\"` semantics\n * layered back on.\n */\nexport function OptionCards({\n options, value, onChange, multi = false, disabled, shortcuts = false, columns = 2, className, ...rest\n}: OptionCardsProps) {\n useOptionShortcuts(options, shortcuts && !disabled, (picked) => onChange(nextValue(value, picked, multi)))\n return (\n <div\n role={multi ? 'group' : 'radiogroup'}\n aria-label={rest['aria-label']}\n className={cn('grid gap-2.5', COLUMNS[columns], className)}\n >\n {options.map((option, index) => {\n const selected = isSelected(value, option.value)\n const corner = shortcuts && index < MAX_SHORTCUTS\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multi ? 'checkbox' : 'radio'}\n aria-checked={selected}\n disabled={disabled}\n onClick={() => onChange(nextValue(value, option.value, multi))}\n className={cn(\n 'group relative flex items-start gap-3 rounded-lg border bg-card p-4 text-left transition-all',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:pointer-events-none disabled:opacity-50',\n selected\n ? 'border-primary ring-2 ring-primary/15'\n : 'border-border hover:-translate-y-px hover:border-foreground/25 hover:shadow-button',\n )}\n >\n {/* One thing in the corner. Once an option is picked its digit has\n done its job, and a check beside a number is two marks arguing\n about the same fact. */}\n {corner && selected && <Check className=\"absolute right-2 top-2 h-4 w-4 text-primary\" />}\n {corner && !selected && <KeyHint index={index} selected={false} corner />}\n {option.icon && <span className=\"mt-0.5 shrink-0 text-muted-foreground\">{option.icon}</span>}\n <span className={cn('min-w-0 flex-1', corner && 'pr-5')}>\n <span className=\"block text-sm font-semibold text-foreground\">{option.label}</span>\n {option.hint && (\n <span className=\"mt-0.5 block text-xs leading-relaxed text-muted-foreground\">{option.hint}</span>\n )}\n </span>\n {!corner && selected && <Check className=\"mt-0.5 h-4 w-4 shrink-0 text-primary\" />}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport type OptionChipsProps = SharedProps\n\n/**\n * Pill picker — same selection model as OptionCards, for lists long enough that\n * cards would push the question off screen (industries, channels, price bands).\n */\nexport function OptionChips({\n options, value, onChange, multi = false, disabled, shortcuts = false, className, ...rest\n}: OptionChipsProps) {\n useOptionShortcuts(options, shortcuts && !disabled, (picked) => onChange(nextValue(value, picked, multi)))\n return (\n <div\n role={multi ? 'group' : 'radiogroup'}\n aria-label={rest['aria-label']}\n className={cn('flex flex-wrap gap-2', className)}\n >\n {options.map((option, index) => {\n const selected = isSelected(value, option.value)\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multi ? 'checkbox' : 'radio'}\n aria-checked={selected}\n disabled={disabled}\n onClick={() => onChange(nextValue(value, option.value, multi))}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-4 py-2 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:pointer-events-none disabled:opacity-50',\n selected\n ? 'border-primary bg-primary/5 text-foreground'\n : 'border-border bg-card text-muted-foreground hover:border-foreground/25 hover:text-foreground',\n )}\n >\n {option.icon}\n {shortcuts && index < MAX_SHORTCUTS && <KeyHint index={index} selected={selected} />}\n {option.label}\n {selected && <Check className=\"h-3.5 w-3.5 text-primary\" />}\n </button>\n )\n })}\n </div>\n )\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport * as React from 'react'\nimport { ImagePlus, Loader2, X } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface ImageDropProps {\n /** Current image. Uncontrolled after the first upload — the component keeps what it uploaded. */\n value?: string\n /** Receives the file, returns the stored URL. Omit to render a read-only preview. */\n onUpload?: (file: File) => Promise<string>\n onChange?: (url: string | undefined) => void\n label?: string\n hint?: string\n accept?: string\n /** Cap in bytes, checked before `onUpload` runs. Default 5 MB. */\n maxBytes?: number\n shape?: 'square' | 'circle'\n disabled?: boolean\n /** Shown when the picked file is over `maxBytes`. `{max}` is replaced with the cap in MB. */\n tooLargeLabel?: string\n removeLabel?: string\n className?: string\n}\n\nconst DEFAULT_MAX_BYTES = 5 * 1024 * 1024\n\n/**\n * Image picker with preview — click or drop a file, see it, replace or clear it.\n *\n * Generalised from the CRUD form's image slot so surfaces that have no entity\n * behind them (workspace logo during setup, before the tenant row exists) get the\n * same affordance without importing the CRUD stack.\n */\nexport function ImageDrop({\n value,\n onUpload,\n onChange,\n label,\n hint,\n accept = 'image/*',\n maxBytes = DEFAULT_MAX_BYTES,\n shape = 'square',\n disabled,\n tooLargeLabel = 'File is larger than {max} MB.',\n removeLabel = 'Remove image',\n className,\n}: ImageDropProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [url, setUrl] = React.useState<string | undefined>(value)\n const [busy, setBusy] = React.useState(false)\n const [dragging, setDragging] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n\n React.useEffect(() => { setUrl(value) }, [value])\n\n const editable = Boolean(onUpload) && !disabled\n\n const handleFile = React.useCallback(\n async (file: File | undefined) => {\n if (!file || !onUpload) return\n if (file.size > maxBytes) {\n setError(tooLargeLabel.replace('{max}', String(Math.round(maxBytes / 1024 / 1024))))\n return\n }\n setBusy(true)\n setError(null)\n try {\n const next = await onUpload(file)\n setUrl(next)\n onChange?.(next)\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n },\n [onUpload, onChange, maxBytes, tooLargeLabel],\n )\n\n const pick = () => { if (editable && !busy) inputRef.current?.click() }\n\n const clear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setUrl(undefined)\n setError(null)\n onChange?.(undefined)\n }\n\n return (\n <div className={cn('flex items-center gap-4', className)}>\n <div\n onClick={pick}\n onKeyDown={(e) => { if (editable && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); pick() } }}\n onDragOver={(e) => { if (editable) { e.preventDefault(); setDragging(true) } }}\n onDragLeave={() => setDragging(false)}\n onDrop={(e) => {\n if (!editable) return\n e.preventDefault()\n setDragging(false)\n void handleFile(e.dataTransfer.files?.[0])\n }}\n role={editable ? 'button' : undefined}\n tabIndex={editable ? 0 : undefined}\n className={cn(\n 'relative flex h-20 w-20 shrink-0 items-center justify-center overflow-hidden border-2 text-muted-foreground transition-colors',\n shape === 'circle' ? 'rounded-full' : 'rounded-xl',\n url ? 'border-solid border-border' : 'border-dashed border-border',\n dragging && 'border-primary text-primary',\n editable && 'cursor-pointer hover:border-primary/40 hover:text-primary/60',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n )}\n >\n {url ? <img src={url} alt=\"\" className=\"h-full w-full object-cover\" /> : <ImagePlus className=\"h-5 w-5\" />}\n {busy && (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/70\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </span>\n )}\n {url && editable && !busy && (\n <button\n type=\"button\"\n onClick={clear}\n aria-label={removeLabel}\n className=\"absolute right-0 top-0 flex h-5 w-5 items-center justify-center rounded-bl-lg bg-background/90 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n {editable && (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n void handleFile(file)\n }}\n />\n )}\n </div>\n <div className=\"min-w-0\">\n {label && <p className=\"text-sm font-medium text-foreground\">{label}</p>}\n {hint && !error && <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">{hint}</p>}\n {error && <p className=\"mt-0.5 text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface ColorPaletteProps {\n /** Hex values, most prominent first. Shorter than `slots` is normal. */\n value?: ReadonlyArray<string>\n onChange: (colors: string[]) => void\n slots?: number\n /** One per slot, in order. Falls back to the slot number. */\n labels?: ReadonlyArray<string>\n removeLabel?: string\n className?: string\n}\n\nconst DEFAULT_SLOTS = 4\nconst FALLBACK_SWATCH = '#000000'\n\n/**\n * A fixed row of colour slots, each a swatch that opens the native picker plus a\n * hex field that accepts a paste.\n *\n * Slots rather than an add/remove list on purpose: brand colours arrive from a\n * crawl in a known order (primary, secondary, accent), and a positional row is\n * what makes \"the second one is wrong\" a one-click fix instead of a rebuild of\n * the whole palette.\n */\nexport function ColorPalette({\n value,\n onChange,\n slots = DEFAULT_SLOTS,\n labels,\n removeLabel = 'Remover cor',\n className,\n}: ColorPaletteProps) {\n const colors = React.useMemo(() => {\n const next = Array.from({ length: slots }, (_, i) => value?.[i] ?? '')\n return next\n }, [value, slots])\n\n // Trailing blanks are absence, not answers — a palette of two colours must\n // come back as two, or every consumer has to filter it again.\n const commit = (next: string[]) => {\n const trimmed = [...next]\n while (trimmed.length > 0 && !trimmed[trimmed.length - 1]) trimmed.pop()\n onChange(trimmed)\n }\n\n const setSlot = (index: number, hex: string) => {\n const next = [...colors]\n next[index] = hex\n commit(next)\n }\n\n return (\n <div className={cn('flex gap-2', className)}>\n {colors.map((color, index) => (\n <div key={index} className=\"flex-1 space-y-1\">\n <label className=\"group relative block cursor-pointer\">\n <div\n className={cn(\n 'h-10 rounded-lg border transition-colors',\n color ? 'border-border' : 'border-dashed border-border bg-muted/40',\n )}\n style={color ? { backgroundColor: color } : undefined}\n />\n <input\n type=\"color\"\n value={color || FALLBACK_SWATCH}\n aria-label={labels?.[index] ?? `Cor ${index + 1}`}\n onChange={(e) => setSlot(index, e.target.value)}\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n />\n {color && (\n <button\n type=\"button\"\n aria-label={removeLabel}\n onClick={(e) => {\n // The swatch is inside the label, so a click would reopen the picker.\n e.preventDefault()\n e.stopPropagation()\n setSlot(index, '')\n }}\n className=\"absolute -right-1.5 -top-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-foreground/80 text-background opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100\"\n >\n <X className=\"h-2.5 w-2.5\" />\n </button>\n )}\n </label>\n <input\n type=\"text\"\n value={color.toUpperCase()}\n placeholder={labels?.[index] ?? `${index + 1}`}\n onChange={(e) => setSlot(index, normalizeHex(e.target.value))}\n className=\"w-full truncate bg-transparent text-center text-[10px] text-muted-foreground outline-none placeholder:text-muted-foreground/50\"\n />\n </div>\n ))}\n </div>\n )\n}\n\n/** Tolerates a pasted `1F7A3D`, `#1f7a3d` or `rgb(...)`-free junk mid-typing. */\nexport function normalizeHex(raw: string): string {\n const cleaned = raw.replace(/[^0-9a-fA-F#]/g, '')\n const withHash = cleaned.startsWith('#') ? cleaned : `#${cleaned}`\n return withHash.slice(0, 7)\n}\n"]}
|
package/dist/chunk-OKZ6WQB3.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { clsx } from 'clsx';
|
|
2
|
-
import { twMerge } from 'tailwind-merge';
|
|
3
|
-
import * as React from 'react';
|
|
4
|
-
import { Slot } from '@radix-ui/react-slot';
|
|
5
|
-
import { cva } from 'class-variance-authority';
|
|
6
|
-
import { jsx } from 'react/jsx-runtime';
|
|
7
|
-
|
|
8
|
-
// src/lib/cn.ts
|
|
9
|
-
function cn(...inputs) {
|
|
10
|
-
return twMerge(clsx(inputs));
|
|
11
|
-
}
|
|
12
|
-
var buttonVariants = cva(
|
|
13
|
-
"inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-button text-sm font-semibold ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
14
|
-
{
|
|
15
|
-
variants: {
|
|
16
|
-
variant: {
|
|
17
|
-
// Polaris primary — near-black brand with the stronger primary bevel
|
|
18
|
-
default: "bg-primary text-primary-foreground border border-primary shadow-button-primary hover:bg-primary/90 active:shadow-button-inset",
|
|
19
|
-
destructive: "bg-destructive text-destructive-foreground border border-destructive shadow-button-primary hover:bg-destructive/90 active:shadow-button-inset",
|
|
20
|
-
// Default/secondary surface — white with hairline + bevel
|
|
21
|
-
outline: "border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset",
|
|
22
|
-
secondary: "border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset",
|
|
23
|
-
ghost: "hover:bg-muted hover:text-foreground",
|
|
24
|
-
link: "text-info underline-offset-4 hover:underline"
|
|
25
|
-
},
|
|
26
|
-
size: {
|
|
27
|
-
// Polaris button sizes: md 30px, sm 26px, lg 36px
|
|
28
|
-
default: "h-[30px] px-3 py-1",
|
|
29
|
-
sm: "h-[26px] rounded-button px-2.5 text-xs",
|
|
30
|
-
lg: "h-9 rounded-button px-4 text-sm",
|
|
31
|
-
icon: "h-[30px] w-[30px]"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
defaultVariants: {
|
|
35
|
-
variant: "default",
|
|
36
|
-
size: "default"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
);
|
|
40
|
-
var Button = React.forwardRef(
|
|
41
|
-
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
42
|
-
const Comp = asChild ? Slot : "button";
|
|
43
|
-
return /* @__PURE__ */ jsx(
|
|
44
|
-
Comp,
|
|
45
|
-
{
|
|
46
|
-
className: cn(buttonVariants({ variant, size, className })),
|
|
47
|
-
ref,
|
|
48
|
-
...props
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
);
|
|
53
|
-
Button.displayName = "Button";
|
|
54
|
-
|
|
55
|
-
export { Button, buttonVariants, cn };
|
|
56
|
-
//# sourceMappingURL=chunk-OKZ6WQB3.js.map
|
|
57
|
-
//# sourceMappingURL=chunk-OKZ6WQB3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/cn.ts","../src/primitives/button.tsx"],"names":[],"mappings":";;;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,sSAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA;AAAA,QAEP,OAAA,EACE,+HAAA;AAAA,QACF,WAAA,EACE,+IAAA;AAAA;AAAA,QAEF,OAAA,EACE,sGAAA;AAAA,QACF,SAAA,EACE,sGAAA;AAAA,QACF,KAAA,EAAO,sCAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA,IAAA,EAAM;AAAA;AAAA,QAEJ,OAAA,EAAS,oBAAA;AAAA,QACT,EAAA,EAAI,wCAAA;AAAA,QACJ,EAAA,EAAI,iCAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAQA,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAChE,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAC9B,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,QAC1D,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-OKZ6WQB3.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-button text-sm font-semibold ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n // Polaris primary — near-black brand with the stronger primary bevel\n default:\n 'bg-primary text-primary-foreground border border-primary shadow-button-primary hover:bg-primary/90 active:shadow-button-inset',\n destructive:\n 'bg-destructive text-destructive-foreground border border-destructive shadow-button-primary hover:bg-destructive/90 active:shadow-button-inset',\n // Default/secondary surface — white with hairline + bevel\n outline:\n 'border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset',\n secondary:\n 'border border-border bg-card text-foreground shadow-button hover:bg-muted active:shadow-button-inset',\n ghost: 'hover:bg-muted hover:text-foreground',\n link: 'text-info underline-offset-4 hover:underline',\n },\n size: {\n // Polaris button sizes: md 30px, sm 26px, lg 36px\n default: 'h-[30px] px-3 py-1',\n sm: 'h-[26px] rounded-button px-2.5 text-xs',\n lg: 'h-9 rounded-button px-4 text-sm',\n icon: 'h-[30px] w-[30px]',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/card.tsx","../src/primitives/dropdown.tsx","../src/primitives/checkbox.tsx","../src/primitives/data-table.tsx","../src/hooks/useIsWide.ts","../src/primitives/skeleton.tsx","../src/primitives/popover.tsx","../src/primitives/filter-menu.tsx","../src/primitives/page-toolbar.tsx"],"names":["React","jsx","React3","Check","React4","jsxs","_","React5","React6","React7","ChevronRight","React8","ToolbarButton","ToolbarAction","Fragment","ListFilter"],"mappings":"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","file":"chunk-UCNY76FQ.js","sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../lib/cn'\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'fayz-glass-surface rounded-card border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1 p-4', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-sm font-semibold leading-tight tracking-tight',\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-xs text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-4 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-4 pt-0', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\n\nimport { cn } from '../lib/cn'\n\nconst Dropdown = DropdownMenuPrimitive.Root\n\nconst DropdownTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownGroup = DropdownMenuPrimitive.Group\n\nconst DropdownPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownSub = DropdownMenuPrimitive.Sub\n\nconst DropdownRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-button px-2 py-1.5 text-sm outline-none focus:bg-muted data-[state=open]:bg-muted',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n // Portaled, like DropdownContent. Without it the submenu renders inside the\n // parent panel's DOM — and that panel is `overflow-hidden`, so the submenu\n // was clipped to its box: a flyout you could open and never reach.\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'fayz-glass-surface z-[110] min-w-[8rem] overflow-hidden rounded-card border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-[110] min-w-[8rem] overflow-hidden rounded-card border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button px-2 py-1.5 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'px-2 py-1.5 text-sm font-semibold',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nDropdownSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-xs tracking-widest opacity-60', className)}\n {...props}\n />\n )\n}\nDropdownShortcut.displayName = 'DropdownShortcut'\n\nexport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownCheckboxItem,\n DropdownRadioItem,\n DropdownLabel,\n DropdownSeparator,\n DropdownShortcut,\n DropdownGroup,\n DropdownPortal,\n DropdownSub,\n DropdownSubContent,\n DropdownSubTrigger,\n DropdownRadioGroup,\n}\n","import * as React from 'react'\nimport { Check, Minus } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\ntype CheckboxColor = 'primary' | 'success' | 'warning' | 'destructive'\n\ninterface CheckboxProps {\n checked?: boolean\n onChange?: (checked: boolean) => void\n disabled?: boolean\n className?: string\n color?: CheckboxColor\n id?: string\n /** Some but not all of what this box stands for is checked (a table header\n * over a partly selected page). Painted filled with a dash, and announced as\n * \"mixed\" — an empty box would claim nothing is selected. */\n indeterminate?: boolean\n /** -1 keeps it out of the tab order, for a box that only PAINTS the state of\n * a row that is itself the control. */\n tabIndex?: number\n 'aria-label'?: string\n 'data-testid'?: string\n}\n\nconst COLOR_CLASSES: Record<CheckboxColor, string> = {\n primary: 'border-primary bg-primary text-primary-foreground',\n success: 'border-success bg-success text-white dark:border-success dark:bg-success',\n warning: 'border-warning bg-warning text-white',\n destructive: 'border-destructive bg-destructive text-destructive-foreground',\n}\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n ({ checked = false, onChange, disabled, className, color = 'primary', id, indeterminate = false, ...props }, ref) => {\n const filled = checked || indeterminate\n return (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n disabled={disabled}\n onClick={() => onChange?.(!checked)}\n className={cn(\n 'peer inline-flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[5px] border-2 transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n filled\n ? `${COLOR_CLASSES[color]} shadow-sm`\n : 'border-muted-foreground/40 bg-background hover:border-muted-foreground/60',\n className,\n )}\n {...props}\n >\n {indeterminate\n ? <Minus className=\"h-3.5 w-3.5\" strokeWidth={3} />\n : checked && <Check className=\"h-3.5 w-3.5\" strokeWidth={3} />}\n </button>\n )\n },\n)\nCheckbox.displayName = 'Checkbox'\n\nexport { Checkbox }\nexport type { CheckboxColor, CheckboxProps }\n","import * as React from 'react'\nimport {\n type ColumnDef,\n type SortingState,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\n\nimport { cn } from '../lib/cn'\nimport { Checkbox } from './checkbox'\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n loading?: boolean\n skeletonRows?: number\n emptyMessage?: React.ReactNode\n onRowClick?: (row: TData) => void\n /** Visual variant: 'card' (white bg, card wrapper — default), 'flat'\n * (transparent bg, still bordered), or 'bare' — no wrapper chrome at all,\n * for a table already inside a card that owns the border and radius. */\n variant?: 'card' | 'flat' | 'bare'\n /** Compact mode: smaller padding and font size */\n compact?: boolean\n /**\n * Qual coluna está ordenada e para que lado, quando quem ordena é OUTRO\n * controle (o menu \"Ordenar\" da barra de ferramentas).\n *\n * Marca o cabeçalho sem torná-lo clicável: com a ordenação fora da tabela,\n * a seta é INFORMAÇÃO (\"está ordenado por isto, assim\"), não um botão. Sem\n * ela, mudar a ordem por um menu que fecha em seguida não deixava rastro\n * nenhum na tela.\n */\n sortIndicator?: { columnId: string; dir: 'asc' | 'desc' }\n /**\n * Turns on the checkbox column on the left. Selection is CONTROLLED by ids:\n * what a bulk action needs is \"which records\", and the table's own row indexes\n * stop meaning that the moment the list refetches, sorts or pages.\n */\n selectable?: boolean\n selectedIds?: string[]\n onSelectedIdsChange?: (ids: string[]) => void\n /** Row identity for selection. Defaults to `row.id`. */\n getRowId?: (row: TData) => string\n /**\n * Classe por LINHA — o que permite uma linha dizer que não é como as outras.\n *\n * O caso que a pediu: a ocorrência PREVISTA de uma recorrência, que aparece\n * na lista ao lado das contas de verdade e precisa ler como previsão, não\n * como dívida. Pintar isso célula a célula funcionaria e teria que ser\n * repetido em cada coluna, inclusive nas que ainda não existem.\n */\n rowClassName?: (row: TData) => string | undefined\n}\n\nfunction DataTable<TData, TValue>({\n columns,\n data,\n loading = false,\n skeletonRows = 3,\n emptyMessage = 'No results.',\n onRowClick,\n variant = 'card',\n compact = false,\n sortIndicator,\n selectable = false,\n selectedIds,\n onSelectedIdsChange,\n getRowId,\n rowClassName,\n}: DataTableProps<TData, TValue>) {\n const t = useTranslation()\n const isCard = variant === 'card'\n // Rounded box and scroll container must be SEPARATE elements: a scroll\n // container paints its content over its own border-radius, which squared\n // the corners the moment a row background met them.\n const wrapperCls = isCard\n ? 'overflow-hidden rounded-card border bg-card shadow-sm'\n : variant === 'bare'\n ? ''\n : 'overflow-hidden rounded-lg border'\n // 'bare' sits below something else inside its parent card (a search/tools\n // toolbar), so its header is a mid-card band: no rounding, and it keeps the\n // card's own surface rather than starting a new tinted block.\n const headerCls = isCard\n ? 'border-b bg-muted/50'\n : variant === 'bare'\n ? 'border-b bg-muted/30 rounded-none'\n : 'border-b bg-muted/30'\n const thCls = compact ? 'px-3 py-1.5 text-left text-[11px] font-medium text-muted-foreground' : 'px-4 py-2.5 text-left font-medium text-muted-foreground'\n const tdCls = compact ? 'px-3 py-1.5 align-middle text-xs' : 'px-4 py-3 align-middle'\n const tableCls = compact ? 'w-full text-xs min-w-max' : 'w-full text-sm min-w-max'\n const rowHoverCls = isCard ? 'hover:bg-muted/30' : 'hover:bg-muted/20'\n const [sorting, setSorting] = React.useState<SortingState>([])\n\n const rowId = React.useCallback(\n (row: TData) => (getRowId ? getRowId(row) : String((row as { id?: unknown }).id ?? '')),\n [getRowId],\n )\n const selected = React.useMemo(() => new Set(selectedIds ?? []), [selectedIds])\n const pageIds = React.useMemo(() => data.map(rowId), [data, rowId])\n const selectedOnPage = pageIds.filter((id) => selected.has(id)).length\n const allOnPageSelected = pageIds.length > 0 && selectedOnPage === pageIds.length\n\n const toggleRow = React.useCallback((id: string) => {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelectedIdsChange?.([...next])\n }, [selected, onSelectedIdsChange])\n // The header box acts on THIS page only — it must not silently drop a\n // selection made on another page, nor claim to have selected rows that were\n // never loaded.\n const toggleAllOnPage = React.useCallback(() => {\n const next = new Set(selected)\n if (allOnPageSelected) pageIds.forEach((id) => next.delete(id))\n else pageIds.forEach((id) => next.add(id))\n onSelectedIdsChange?.([...next])\n }, [selected, allOnPageSelected, pageIds, onSelectedIdsChange])\n\n // Built here rather than asked of every caller: the column is pure chrome, and\n // a hand-rolled copy per list is where the checkbox column drifts.\n const selectionColumn = React.useMemo<ColumnDef<TData, TValue>>(() => ({\n id: '__select__',\n enableSorting: false,\n header: () => (\n <Checkbox\n checked={allOnPageSelected}\n indeterminate={selectedOnPage > 0 && !allOnPageSelected}\n onChange={toggleAllOnPage}\n aria-label={t('crud.list.selectAllRows')}\n />\n ),\n cell: ({ row }) => {\n const id = rowId(row.original)\n return (\n <Checkbox\n checked={selected.has(id)}\n onChange={() => toggleRow(id)}\n aria-label={t('crud.list.selectRow')}\n />\n )\n },\n // `toggleAllOnPage` is in the deps because it closes over the CURRENT page's\n // ids: turning the page with nothing selected changes no other dep, and the\n // memo would hand the header a button that ticks the previous page's rows.\n }), [allOnPageSelected, selectedOnPage, selected, rowId, toggleRow, toggleAllOnPage, t])\n\n const allColumns = React.useMemo(\n () => (selectable ? [selectionColumn, ...columns] : columns),\n [selectable, selectionColumn, columns],\n )\n\n const table = useReactTable({\n data,\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n })\n\n if (loading) {\n return (\n <div className={wrapperCls}>\n <div className=\"overflow-x-auto\">\n <table className={tableCls}>\n <thead>\n <tr className={headerCls}>\n {allColumns.map((_, i) => (\n <th key={i} className={thCls}>\n <div className=\"h-3.5 w-20 animate-pulse rounded bg-muted\" />\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <tr key={i} className=\"border-b last:border-0\">\n {allColumns.map((_, j) => (\n <td key={j} className={tdCls}>\n <div className=\"h-3.5 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )\n }\n\n // Uma tabela VAZIA não tem colunas para percorrer, e mantê-la só para\n // hospedar o aviso punha o aviso dentro de um scroller mais largo que a tela:\n // `colSpan` centraliza no meio da TABELA, não no meio do celular, e o \"Crie\n // sua primeira fatura\" nascia cortado, alcançável só arrastando de lado.\n // Sem linhas, o cabeçalho também não informa nada acionável — ele descreve\n // colunas que não existem ainda. Some a tabela, some o scroll, e o aviso\n // ocupa a largura visível, que é onde ele deveria estar desde o começo.\n const showEmptyBlock = !loading && table.getRowModel().rows.length === 0\n if (showEmptyBlock) {\n return (\n <div className={wrapperCls}>\n <div className=\"flex min-h-64 w-full items-center justify-center px-4 py-10 text-center text-muted-foreground\">\n {emptyMessage}\n </div>\n </div>\n )\n }\n\n return (\n <div className={wrapperCls}>\n <div className=\"overflow-x-auto\">\n <table className={tableCls}>\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id} className={headerCls}>\n {headerGroup.headers.map((header) => {\n const sorted = header.column.getIsSorted()\n return (\n <th\n key={header.id}\n className={cn(thCls, header.column.id === '__select__' && 'w-10 pr-0')}\n >\n {header.isPlaceholder ? null : sortIndicator?.columnId === header.column.id ? (\n <span className=\"inline-flex items-center gap-1 text-foreground\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sortIndicator.dir === 'desc'\n ? <ArrowDown className=\"h-3 w-3\" />\n : <ArrowUp className=\"h-3 w-3\" />}\n </span>\n ) : header.column.getCanSort() ? (\n <button\n className=\"flex items-center gap-1 hover:text-foreground transition-colors\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sorted === 'asc' ? (\n <ArrowUp className=\"h-3 w-3\" />\n ) : sorted === 'desc' ? (\n <ArrowDown className=\"h-3 w-3\" />\n ) : (\n <ArrowUpDown className=\"h-3 w-3 opacity-40\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </th>\n )\n })}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => {\n const isSelected = selectable && selected.has(rowId(row.original))\n return (\n <tr\n key={row.id}\n className={cn(\n `border-b last:border-0 transition-colors ${rowHoverCls}`,\n onRowClick && 'cursor-pointer',\n isSelected && 'bg-muted/40',\n rowClassName?.(row.original),\n )}\n onClick={() => onRowClick?.(row.original)}\n data-selected={isSelected || undefined}\n >\n {row.getVisibleCells().map((cell) => {\n const isSelectCell = cell.column.id === '__select__'\n return (\n <td\n key={cell.id}\n className={cn(tdCls, isSelectCell && 'w-10 pr-0')}\n // Ticking a box is not opening the record: without this\n // the row's own click handler fired underneath and the\n // list navigated away from the selection just made.\n onClick={isSelectCell ? (e) => e.stopPropagation() : undefined}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n )\n })}\n </tr>\n )\n })\n ) : (\n <tr>\n {/* Height, not just padding: an empty table that collapses to one\n thin row reads as a rendering glitch rather than \"nothing\n here yet\". `emptyMessage` takes a node so callers can hand in\n a full empty state (icon, headline, create action). */}\n <td colSpan={allColumns.length} className=\"h-64 px-6 text-center align-middle text-muted-foreground\">\n {emptyMessage}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n\nexport { DataTable, type DataTableProps }\n","import * as React from 'react'\n\n/** The one breakpoint the shell actually branches on. */\nexport const WIDE_QUERY = '(min-width: 768px)'\n\n/**\n * Real width, not CSS.\n *\n * Some decisions cannot be made with a `md:hidden`: hiding is not unmounting,\n * and no portal respects `display: none` — two mounted copies of a page send\n * TWO sets of buttons to the shell's header bar, and the action appears twice.\n * `matchMedia` already answers correctly on the first render, so choosing here\n * does not flash.\n *\n * Prefer a CSS breakpoint when the choice is only about what is visible. Reach\n * for this when the choice changes what exists, or what a component decides.\n */\nexport function useIsWide(query: string = WIDE_QUERY): boolean {\n const [wide, setWide] = React.useState(\n () => (typeof window === 'undefined' ? true : window.matchMedia(query).matches),\n )\n React.useEffect(() => {\n const mq = window.matchMedia(query)\n const onChange = () => setWide(mq.matches)\n mq.addEventListener('change', onChange)\n return () => mq.removeEventListener('change', onChange)\n }, [query])\n return wide\n}\n","import { cn } from '../lib/cn'\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('animate-pulse rounded-md bg-muted', className)}\n {...props}\n />\n )\n}\n\n/**\n * Skeleton loader that mimics a table with rows and columns.\n * Drop-in replacement for \"Loading...\" text in list views.\n */\nfunction TableSkeleton({ columns = 4, rows = 2 }: { columns?: number; rows?: number }) {\n return (\n <div className=\"rounded-lg border overflow-hidden\">\n <div className=\"border-b bg-muted/30 flex gap-4 px-4 py-2.5\">\n {Array.from({ length: columns }).map((_, i) => (\n <Skeleton key={i} className=\"h-3 flex-1 rounded bg-muted-foreground/10\" />\n ))}\n </div>\n <div className=\"divide-y\">\n {Array.from({ length: rows }).map((_, r) => (\n <div key={r} className=\"flex items-center gap-4 px-4 py-3.5\">\n {Array.from({ length: columns }).map((_, c) => (\n <Skeleton\n key={c}\n className={cn(\n 'h-3 rounded',\n c === 0 ? 'flex-[2]' : 'flex-1',\n )}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport { Skeleton, TableSkeleton }\n","import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../lib/cn'\n\nconst Popover = PopoverPrimitive.Root\nconst PopoverTrigger = PopoverPrimitive.Trigger\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'start', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-[110] w-72 rounded-xl border bg-popover p-0 text-popover-foreground shadow-lg outline-none',\n 'data-[state=open]:animate-zoom-in data-[state=closed]:animate-zoom-out',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverContent }\n","import * as React from 'react'\nimport { Check, ChevronRight, ListFilter, X } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\n\n// ---------------------------------------------------------------------------\n// FilterMenu — o filtro das telas de trabalho, padronizado (Linear-like).\n//\n// Um botão redondo no subheader (à direita, ao lado de Exibição/Exportar) abre\n// um menu VERTICAL: um campo por linha (Responsável ▸, Período ▸, Etiquetas ▸…).\n// PASSAR O MOUSE (ou clicar) num campo abre as opções dele num flyout à\n// ESQUERDA da lista — o desenho do Linear. Sem chips arredondados dentro:\n// opção é LINHA, com ícone/retrato, rótulo e o check do que está marcado.\n//\n// O menu não conhece os VALORES de nenhum filtro — cada tela desenha a página\n// do seu campo (`render`), porque só ela sabe se aquilo é lista, multi com\n// busca ou gente com retrato. O que o menu padroniza é a moldura: o gatilho,\n// a lista de campos, a navegação e o \"Limpar\".\n// ---------------------------------------------------------------------------\n\n/**\n * O gatilho redondo da barra: 32px, contorno fino, ícone e nada mais.\n *\n * Uma definição só porque eram quatro — o filtro do funil, o das listas, o de\n * Análises e o \"Customize\" do dashboard —, e as quatro derivaram: o mesmo\n * produto mostrava um botão-texto sublinhado numa tela e um botão redondo na\n * seguinte para o mesmo gesto.\n */\nexport const TOOLBAR_ICON_TRIGGER =\n 'relative flex h-8 w-8 shrink-0 items-center justify-center rounded-full border bg-card ' +\n 'text-muted-foreground shadow-button transition-colors hover:bg-muted hover:text-foreground'\n\n/** A bolinha de \"há algo em pé aqui\", no canto do gatilho. */\nexport const TOOLBAR_ICON_DOT = 'absolute right-0 top-0 h-2 w-2 rounded-full bg-primary'\n\nexport interface FilterMenuField {\n id: string\n label: string\n icon?: React.ComponentType<{ className?: string }>\n /** Quantos valores este campo tem ativos — vira o selo da linha. */\n activeCount?: number\n /** Liga a busca na primeira linha do flyout; a query chega no `render`. */\n searchable?: boolean\n searchPlaceholder?: string\n /** As opções do campo. `close` fecha o popover (single-select); `query` é o\n * texto da busca do flyout — quem filtra as linhas é a tela, que as conhece. */\n render: (close: () => void, query: string) => React.ReactNode\n}\n\nexport interface FilterMenuProps {\n fields: FilterMenuField[]\n /** Título do gatilho e do menu. */\n label?: string\n /** Total de filtros ativos — liga a bolinha do gatilho. */\n activeCount?: number\n onClear?: () => void\n clearLabel?: string\n /** Conteúdo fixo no topo da página raiz (ex.: a busca da tela). */\n header?: React.ReactNode\n align?: 'start' | 'end'\n className?: string\n}\n\n/** A linha padrão de OPÇÃO dentro da página de um campo. */\nexport function FilterMenuRow({ active, onClick, children }: {\n active?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex w-full items-center gap-2 rounded-button px-2 py-1.5 text-left text-xs transition-colors hover:bg-muted\"\n >\n {children}\n {active && <Check className=\"ml-auto h-3 w-3 shrink-0 text-muted-foreground\" />}\n </button>\n )\n}\n\nexport function FilterMenu({ fields, label = 'Filtros', activeCount = 0, onClear, clearLabel = 'Limpar filtros', header, align = 'end', className }: FilterMenuProps) {\n const [open, setOpen] = React.useState(false)\n const [hovered, setHoveredRaw] = React.useState<string | null>(null)\n const [query, setQuery] = React.useState('')\n const setHovered = React.useCallback((id: string | null) => { setHoveredRaw(id); setQuery('') }, [])\n const close = React.useCallback(() => setOpen(false), [])\n return (\n <Popover open={open} onOpenChange={(o) => { setOpen(o); if (!o) setHovered(null) }}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n className={cn(TOOLBAR_ICON_TRIGGER, className)}\n >\n <ListFilter className=\"h-4 w-4\" />\n {/* No canto de cima-direita do BOTÃO, não em cima do ícone. */}\n {activeCount > 0 && <span className={TOOLBAR_ICON_DOT} />}\n </button>\n </PopoverTrigger>\n {/* A lista de CAMPOS fica sob o gatilho (direita); as OPÇÕES de um campo\n abrem num flyout à ESQUERDA, no hover — exatamente o desenho do\n Linear. `overflow-visible` porque o flyout mora fora da caixa. */}\n <PopoverContent align={align} className=\"relative w-64 overflow-visible p-1.5\">\n {header && <div className=\"p-1 pb-2\">{header}</div>}\n {fields.map((f) => {\n const Icon = f.icon\n const openHere = hovered === f.id\n return (\n <button\n key={f.id}\n type=\"button\"\n onMouseEnter={() => setHovered(f.id)}\n onClick={() => setHovered(openHere ? null : f.id)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-button px-2 py-1.5 text-left text-xs transition-colors hover:bg-muted',\n openHere && 'bg-muted',\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />}\n {f.label}\n <span className=\"ml-auto flex items-center gap-1.5\">\n {(f.activeCount ?? 0) > 0 && <span className=\"h-1.5 w-1.5 rounded-full bg-primary\" />}\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground/60\" />\n </span>\n </button>\n )\n })}\n {/* O flyout: ancorado no PRÓPRIO popover (right: 100%), nunca por cima\n da lista de campos. Um só, do campo sob o mouse; busca na primeira\n linha quando o campo tem gente/opção demais para ler. */}\n {hovered && (() => {\n const f = fields.find((x) => x.id === hovered)\n if (!f) return null\n return (\n <div\n className=\"absolute top-0 z-50 w-64 rounded-card border bg-popover p-1.5 shadow-lg\"\n style={{ right: 'calc(100% + 6px)' }}\n >\n {f.searchable && (\n <>\n <input\n autoFocus\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={f.searchPlaceholder ?? 'Filtrar…'}\n className=\"w-full bg-transparent px-2 py-1.5 text-xs outline-none placeholder:text-muted-foreground\"\n />\n <div className=\"mb-1 border-t border-border\" />\n </>\n )}\n <div className=\"max-h-64 overflow-y-auto\">{f.render(close, query)}</div>\n </div>\n )\n })()}\n {onClear && activeCount > 0 && (\n <>\n <div className=\"my-1 border-t border-border\" />\n <button\n type=\"button\"\n onClick={() => { onClear(); setOpen(false) }}\n className=\"flex w-full items-center gap-2 rounded-button px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3.5 w-3.5\" /> {clearLabel}\n </button>\n </>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import * as React from 'react'\nimport { Calendar, Check, ChevronDown, ListFilter, RefreshCw } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from './dropdown'\nimport { useIsWide } from '../hooks/useIsWide'\nimport { Popover, PopoverTrigger, PopoverContent } from './popover'\nimport { TOOLBAR_ICON_TRIGGER } from './filter-menu'\nimport { PageViewBar } from '../layout/ModulePage'\n\n// ---------------------------------------------------------------------------\n// PageToolbar — a barra do que a tela está MOSTRANDO.\n//\n// A barra da shell carrega o que se FAZ numa tela (Novo, Importar, Salvar).\n// Esta carrega a pergunta que a tela responde: qual período, quais filtros,\n// quais cartões.\n//\n// ── Ela deixou de FLUTUAR ──────────────────────────────────────────────────\n//\n// Era uma pílula de vidro pairando sobre a grade, com alça de arrastar e uma\n// posição guardada no localStorage — e estava em todo dashboard, em Análises,\n// em quatro telas de Marketing e em duas de Jornada. Três defeitos, nessa\n// ordem de gravidade:\n//\n// 1. Ela COBRIA o conteúdo. \"Onde ela não atrapalha\" não existe, e a saída\n// era pedir ao usuário que resolvesse com a alça — trabalho de layout\n// terceirizado para quem só queria ver o número.\n// 2. Era uma QUARTA gramática de filtro no produto, ao lado da barra da\n// lista, das pastilhas do CRUD e do menu do funil. A mesma pergunta\n// (\"como recorto esta tela?\") mudava de forma conforme a página.\n// 3. Arrastável e persistida, ela aparecia em lugar diferente para cada\n// pessoa — e num print, num suporte ou num vídeo, nunca no mesmo canto.\n//\n// Agora ela é a MESMA banda do funil (PageViewBar): presa ao topo da página,\n// no fluxo, com o que está aplicado à esquerda e os controles encostados à\n// direita — o desenho que /sales/pipeline já usava. Ver ListFilterBar, que é\n// o par disto do lado das listas.\n// ---------------------------------------------------------------------------\n\n/**\n * O gatilho padrão da barra: sem contorno, com o rótulo sublinhado tracejado.\n *\n * Contornados, os três viravam três caixas arredondadas dentro de outra caixa\n * arredondada — a borda do vidro e a dos botões disputavam a mesma leitura, e a\n * barra parecia um grupo de botões e não um controle. O tracejado é o traço\n * clássico de \"este valor se troca\": diz que clica sem desenhar mais um limite.\n */\nexport type ToolbarSurface = 'bar' | 'panel'\n\ninterface ToolbarSurfaceValue {\n surface: ToolbarSurface\n /**\n * Fecha o painel que hospeda este controle.\n *\n * Um controle que TERMINA (\"Aplicar\") não tem como se despedir sozinho: ele\n * só conhece o próprio popover, que no painel nem chega a existir. Sem isto,\n * aplicar deixava o painel aberto por cima do resultado que a pessoa acabou\n * de pedir para ver. No-op na faixa larga, onde cada controle fecha o seu.\n */\n close: () => void\n}\n\nconst ToolbarSurfaceContext = React.createContext<ToolbarSurfaceValue>({\n surface: 'bar',\n close: () => {},\n})\n\nexport function useToolbarSurface(): ToolbarSurface {\n return React.useContext(ToolbarSurfaceContext).surface\n}\n\n/** Fecha o painel do celular. No-op quando o controle está na faixa larga. */\nexport function useToolbarPanelClose(): () => void {\n return React.useContext(ToolbarSurfaceContext).close\n}\n\nexport const ToolbarButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof Button> & { icon?: React.ElementType; caret?: boolean }\n>(function ToolbarButton({ icon: Icon, caret = true, children, className, ...props }, ref) {\n const panel = useToolbarSurface() === 'panel'\n // No painel cada controle é uma LINHA de ponta a ponta, com contorno, como\n // os campos de data logo acima. Solto e fantasma no meio da coluna ele não\n // tinha limite visível nem largura previsível: três deles centralizados em\n // larguras diferentes leem como três textos, não como três campos. O\n // sublinhado tracejado sai junto — ele diz \"este valor se troca\" numa faixa\n // onde não há caixa; dentro de uma caixa, é um segundo contorno.\n if (panel) {\n return (\n <Button\n ref={ref}\n variant=\"outline\"\n className={cn('h-10 w-full justify-between gap-2 px-3 font-normal', className)}\n {...props}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n <span className=\"truncate\">{children}</span>\n </span>\n {caret ? <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n </Button>\n )\n }\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n // Sem fundo no hover: um retângulo arredondado aparecendo atrás do\n // rótulo desenha, no hover, exatamente o botão que o repouso não tem.\n // O que muda é o texto e o traço — mais firmes, e o tracejado vira\n // contínuo, que é o mesmo \"agora sim, clique\" sem inventar caixa.\n 'group gap-1.5 border-0 bg-transparent px-2 font-medium text-muted-foreground shadow-none',\n 'hover:bg-transparent hover:text-foreground',\n className,\n )}\n {...props}\n >\n {Icon ? <Icon className=\"h-3 w-3 shrink-0 opacity-70\" /> : null}\n <span className=\"inline-flex items-center gap-1.5 border-b border-dashed border-muted-foreground/40 pb-px transition-colors group-hover:border-solid group-hover:border-foreground\">\n {children}\n </span>\n {caret ? <ChevronDown className=\"h-3 w-3 shrink-0 opacity-60\" /> : null}\n </Button>\n )\n})\n\n/**\n * O gatilho de COMANDO da barra — Exportar, Imprimir, Novo.\n *\n * Mesma matéria do ToolbarButton acima (sem contorno, sem fundo, fantasma) e\n * sem o sublinhado tracejado: o tracejado promete \"este valor se troca\", e\n * imprimir não é um valor. Eram botões contornados no meio de uma barra sem\n * contorno nenhum — duas caixas arredondadas ao lado de três rótulos soltos,\n * que é o desenho que faz a barra parecer duas barras.\n */\nexport const ToolbarAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof Button> & { icon?: React.ElementType; caret?: boolean }\n>(function ToolbarAction({ icon: Icon, caret = false, children, className, ...props }, ref) {\n const panel = useToolbarSurface() === 'panel'\n // Mesma linha de ponta a ponta, sem seta e com o rótulo CENTRADO: um comando\n // não é um valor em aberto — a seta prometeria outra coisa a escolher, e o\n // alinhamento à esquerda o faria ler como mais um campo da lista acima, que\n // é justamente o que ele não é.\n if (panel) {\n return (\n <Button\n ref={ref}\n variant=\"outline\"\n className={cn('h-10 w-full justify-center gap-2 px-3 font-normal', className)}\n {...props}\n >\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n <span className=\"truncate\">{children}</span>\n </Button>\n )\n }\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n 'gap-1.5 border-0 bg-transparent px-2 font-medium text-muted-foreground shadow-none',\n 'hover:bg-transparent hover:text-foreground',\n className,\n )}\n {...props}\n >\n {Icon ? <Icon className=\"h-3 w-3 shrink-0 opacity-70\" /> : null}\n {children}\n {caret ? <ChevronDown className=\"h-3 w-3 shrink-0 opacity-60\" /> : null}\n </Button>\n )\n})\n\nexport interface RangeOption {\n value: string\n label: string\n}\n\nexport interface RangeControlProps {\n options: RangeOption[]\n value: string\n onChange: (value: string) => void\n /** Rótulo do gatilho quando não é nenhum dos presets (ex.: \"Personalizado\"). */\n label?: string\n /** \"21 jul – 19 ago\" — a janela que os números realmente cobrem. Um nome de\n * preset sozinho deixa a dúvida se \"este mês\" já inclui hoje. */\n span?: string\n /** Itens extras no fim do menu (ex.: abrir uma janela personalizada). */\n extra?: React.ReactNode\n /** Desenhado ao lado do gatilho (ex.: os dois seletores de data). */\n children?: React.ReactNode\n icon?: React.ElementType\n className?: string\n}\n\n/**\n * O controle de período — um só, para o dashboard e para as análises.\n *\n * Puramente apresentacional: quem tem o estado (o contexto de analytics, o de\n * dashboard) passa opções e valor. Eram dois desenhos para a mesma escolha, um\n * segmentado de 7d/30d/90d e um menu de presets, e trocar de tela trocava a\n * gramática do controle sem trocar o que ele faz.\n */\nexport function RangeControl({\n options, value, onChange, label, span, extra, children, icon = Calendar, className,\n}: RangeControlProps) {\n const current = options.find((o) => o.value === value)\n return (\n <div className={cn('flex items-center gap-1.5', className)}>\n <Dropdown>\n <DropdownTrigger asChild>\n <ToolbarButton icon={icon}>\n {label ?? current?.label ?? value}\n {span ? <span className=\"font-normal text-muted-foreground\">{span}</span> : null}\n </ToolbarButton>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-56\">\n {options.map((o) => (\n <DropdownItem key={o.value} onSelect={() => onChange(o.value)}>\n {o.label}\n {o.value === value ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n ))}\n {extra}\n </DropdownContent>\n </Dropdown>\n {children}\n </div>\n )\n}\n\n/**\n * Onde os controles da barra estão sendo desenhados.\n *\n * `bar` é a faixa estreita: cada controle é um gatilho que abre o seu próprio\n * popover. `panel` é o painel do celular, ancorado no header e sobre o escurecer — ali um\n * popover dentro de outro é uma camada a mais para atravessar, e o que o\n * controle tem a oferecer cabe ABERTO. Os slots são ReactNode opacos para a\n * barra, então quem precisa saber lê daqui em vez de receber por prop.\n */\nexport interface PageToolbarProps {\n /** O período. */\n range?: React.ReactNode\n /** Filtros gerais e comparação — o que estreita a pergunta. */\n filters?: React.ReactNode\n /** Filtros aplicados, como pastilhas removíveis. */\n chips?: React.ReactNode\n /** Quais componentes aparecem. */\n customize?: React.ReactNode\n /** Extras da tela (exportar, um relatório novo). */\n actions?: React.ReactNode\n onRefresh?: () => void\n refreshLabel?: string\n /** Título do painel recolhido no celular. Padrão: \"Filtros\". */\n filtersTitle?: string\n className?: string\n}\n\nexport function PageToolbar({\n range, filters, chips, customize, actions, onRefresh, refreshLabel,\n filtersTitle, className,\n}: PageToolbarProps) {\n // Numa tela larga cada controle é o seu próprio gatilho, lado a lado. Num\n // telefone de 375px o nome da tela e quatro controles não dividem a mesma\n // linha: o período saía cortado (\"Últimos 30…\") e o resto ia para fora da\n // tela, onde deixa de existir. Ali eles se recolhem atrás de UM botão — o\n // mesmo botão de filtro do resto do produto.\n const wide = useIsWide()\n const [open, setOpen] = React.useState(false)\n const panelSurface = React.useMemo<ToolbarSurfaceValue>(\n () => ({ surface: 'panel', close: () => setOpen(false) }),\n [],\n )\n if (!range && !filters && !chips && !customize && !actions && !onRefresh) return null\n\n const refresh = onRefresh ? (\n <Button\n variant=\"ghost\" size=\"sm\" onClick={onRefresh}\n aria-label={refreshLabel}\n className=\"w-[26px] shrink-0 border-0 bg-transparent p-0 text-muted-foreground shadow-none hover:bg-transparent hover:text-foreground\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n </Button>\n ) : null\n\n const controls = <>{range}{filters}{customize}{actions}</>\n\n return (\n // A banda do funil, não uma faixa própria: é onde este produto já põe \"o\n // que estou vendo\" — modos à esquerda, recorte à direita. Fora de um módulo\n // com faixa, PageViewBar desenha a mesma linha inline.\n <PageViewBar>\n {/* O que está aplicado AGORA, à esquerda e sem abrir nada: é a razão de\n a tela mostrar estes números e não outros. Rola na horizontal em vez\n de embrulhar — a banda tem uma linha. */}\n <div\n data-print=\"hide\"\n className=\"scrollbar-none flex min-w-0 items-center gap-1 overflow-x-auto\"\n >\n {chips}\n </div>\n {/* Uma barra de controle não vai para o papel, e `no-print` por\n `className` não chega até aqui. */}\n <div data-print=\"hide\" className={cn('flex shrink-0 items-center justify-end gap-1.5', className)}>\n {wide ? (\n <>\n {controls}\n {refresh}\n </>\n ) : (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={filtersTitle ?? 'Filtros'}\n title={filtersTitle ?? 'Filtros'}\n className={TOOLBAR_ICON_TRIGGER}\n >\n <ListFilter className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n {/* Popover e não DropdownMenu: o painel tem campo de busca, e o\n typeahead do menu do Radix engole o que se digita nele. Os\n controles vêm ABERTOS, em vez de atrás de mais uma camada. */}\n <PopoverContent\n align=\"end\"\n sideOffset={8}\n className=\"flex max-h-[70vh] w-[min(22rem,calc(100vw-1.5rem))] flex-col gap-3 overflow-y-auto p-3\"\n >\n <ToolbarSurfaceContext.Provider value={panelSurface}>\n {controls}\n </ToolbarSurfaceContext.Provider>\n </PopoverContent>\n </Popover>\n )}\n {!wide && refresh}\n </div>\n </PageViewBar>\n )\n}\n"]}
|