@fayz-ai/ui 0.16.0 → 0.18.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-6BJTH3L6.js → chunk-DFOAKWYB.js} +3 -3
- package/dist/{chunk-6BJTH3L6.js.map → chunk-DFOAKWYB.js.map} +1 -1
- package/dist/{chunk-PZU7XC2M.js → chunk-OBIU37AX.js} +5 -2
- package/dist/chunk-OBIU37AX.js.map +1 -0
- package/dist/{chunk-SDPYDWWV.js → chunk-Z2ITFPGL.js} +15 -6
- package/dist/chunk-Z2ITFPGL.js.map +1 -0
- package/dist/{chunk-5VF45NLE.js → chunk-ZLPYNHXH.js} +54 -19
- package/dist/chunk-ZLPYNHXH.js.map +1 -0
- package/dist/dashboard/OnboardingWidget.d.ts +7 -1
- package/dist/dashboard/OnboardingWidget.d.ts.map +1 -1
- package/dist/dashboard/SidebarOnboarding.d.ts +7 -1
- package/dist/dashboard/SidebarOnboarding.d.ts.map +1 -1
- package/dist/dashboard/index.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +255 -7
- package/dist/index.js.map +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/index.js +2 -2
- package/dist/primitives/index.js +2 -2
- package/dist/primitives/page-actions.d.ts.map +1 -1
- package/dist/styles.css +22 -0
- package/dist/tour/TourSpotlight.d.ts +29 -0
- package/dist/tour/TourSpotlight.d.ts.map +1 -0
- package/dist/tour/index.d.ts +4 -0
- package/dist/tour/index.d.ts.map +1 -0
- package/dist/tour/tour.store.d.ts +22 -0
- package/dist/tour/tour.store.d.ts.map +1 -0
- package/dist/tour/types.d.ts +28 -0
- package/dist/tour/types.d.ts.map +1 -0
- package/package.json +2 -2
- package/dist/chunk-5VF45NLE.js.map +0 -1
- package/dist/chunk-PZU7XC2M.js.map +0 -1
- package/dist/chunk-SDPYDWWV.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/Avatar.tsx","../src/analytics/range.ts","../src/analytics/derive.ts","../src/analytics/batch.ts","../src/analytics/context.tsx","../src/analytics/AnalyticsCard.tsx","../src/analytics/AnalyticsGrid.tsx","../src/analytics/AnalyticsControls.tsx"],"names":["React","value","jsx","React3","React4","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '../lib/cn'\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full',\n className\n )}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-muted',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import type { AnalyticsDateRange, AnalyticsCompare } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Date ranges and their comparison windows.\n//\n// All arithmetic is done on LOCAL calendar days and serialized as YYYY-MM-DD.\n// Using toISOString() here would silently shift every range by the UTC offset —\n// in America/Sao_Paulo \"today\" would start at 21:00 yesterday, which is exactly\n// how a dashboard ends up disagreeing with the orders list by one day.\n// ---------------------------------------------------------------------------\n\nexport type AnalyticsRangePreset =\n | 'today' | 'yesterday' | 'last_7_days' | 'last_30_days' | 'last_90_days'\n | 'this_month' | 'last_month' | 'this_quarter' | 'this_year' | 'custom'\n\nexport function toDayString(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nexport function parseDay(s: string): Date {\n // Noon avoids the DST edge where midnight does not exist on a spring-forward day.\n const [y, m, d] = s.split('-').map(Number)\n return new Date(y ?? 1970, (m ?? 1) - 1, d ?? 1, 12, 0, 0, 0)\n}\n\nfunction shiftDays(d: Date, days: number): Date {\n const next = new Date(d)\n next.setDate(next.getDate() + days)\n return next\n}\n\n/** Inclusive whole-day count, so a single-day range compares against one day. */\nexport function rangeLengthDays(range: AnalyticsDateRange): number {\n const from = parseDay(range.from)\n const to = parseDay(range.to)\n return Math.max(1, Math.round((to.getTime() - from.getTime()) / 86_400_000) + 1)\n}\n\nexport function resolveRangePreset(preset: AnalyticsRangePreset, today = new Date()): AnalyticsDateRange {\n const base = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 12)\n switch (preset) {\n case 'today':\n return { from: toDayString(base), to: toDayString(base) }\n case 'yesterday': {\n const y = shiftDays(base, -1)\n return { from: toDayString(y), to: toDayString(y) }\n }\n // \"Last 7 days\" includes today, so it spans today minus six — not minus\n // seven, which would be eight days of data under a seven-day label.\n case 'last_7_days':\n return { from: toDayString(shiftDays(base, -6)), to: toDayString(base) }\n case 'last_30_days':\n return { from: toDayString(shiftDays(base, -29)), to: toDayString(base) }\n case 'last_90_days':\n return { from: toDayString(shiftDays(base, -89)), to: toDayString(base) }\n case 'this_month':\n return {\n from: toDayString(new Date(base.getFullYear(), base.getMonth(), 1, 12)),\n to: toDayString(base),\n }\n case 'last_month': {\n const first = new Date(base.getFullYear(), base.getMonth() - 1, 1, 12)\n const last = new Date(base.getFullYear(), base.getMonth(), 0, 12)\n return { from: toDayString(first), to: toDayString(last) }\n }\n case 'this_quarter': {\n const q = Math.floor(base.getMonth() / 3)\n return {\n from: toDayString(new Date(base.getFullYear(), q * 3, 1, 12)),\n to: toDayString(base),\n }\n }\n case 'this_year':\n return { from: toDayString(new Date(base.getFullYear(), 0, 1, 12)), to: toDayString(base) }\n default:\n return { from: toDayString(shiftDays(base, -29)), to: toDayString(base) }\n }\n}\n\n/**\n * The window a range is compared against.\n *\n * 'previous_period' is the same NUMBER OF DAYS ending the day before `from`, so\n * a 7-day range compares against the 7 days before it — never an overlapping\n * window, which would double-count the boundary day in both halves.\n */\nexport function comparisonRange(\n range: AnalyticsDateRange,\n compare: AnalyticsCompare | undefined,\n): AnalyticsDateRange | null {\n if (!compare || compare === 'none') return null\n\n if (compare === 'previous_year') {\n const from = parseDay(range.from)\n const to = parseDay(range.to)\n from.setFullYear(from.getFullYear() - 1)\n to.setFullYear(to.getFullYear() - 1)\n return { from: toDayString(from), to: toDayString(to) }\n }\n\n const days = rangeLengthDays(range)\n const prevTo = shiftDays(parseDay(range.from), -1)\n const prevFrom = shiftDays(prevTo, -(days - 1))\n return { from: toDayString(prevFrom), to: toDayString(prevTo) }\n}\n\n/**\n * Bucket size that keeps a chart readable across the chosen range: hours for a\n * single day, days for a quarter, months for a year. A fixed 'day' grain turns\n * a 12-month range into 365 unreadable ticks.\n */\nexport function autoGrain(range: AnalyticsDateRange): 'hour' | 'day' | 'week' | 'month' {\n const days = rangeLengthDays(range)\n if (days <= 2) return 'hour'\n if (days <= 62) return 'day'\n if (days <= 180) return 'week'\n return 'month'\n}\n","import type {\n AnalyticsCardDef, AnalyticsMeasure, AnalyticsResult, AnalyticsRow,\n AnalyticsSummary, AnalyticsFormat, AnalyticsGrain,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Pure derivations shared by every analytics surface.\n//\n// These live apart from the components on purpose: the overview tile, the\n// report viewer and the CSV export must agree to the last decimal, and the only\n// way to guarantee that is for all three to call the same function rather than\n// each formatting \"close enough\" in its own JSX.\n// ---------------------------------------------------------------------------\n\n/**\n * A readable message out of anything a data layer throws.\n *\n * Supabase/PostgREST reject with a PLAIN OBJECT ({message, details, hint,\n * code}), not an Error — so the usual `err instanceof Error ? err.message :\n * String(err)` renders the literal text \"[object Object]\" and hides the one\n * piece of information the user needed.\n */\nexport function errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message\n if (typeof err === 'string') return err\n if (err && typeof err === 'object') {\n const e = err as Record<string, unknown>\n const parts = [e.message, e.details, e.hint]\n .filter((p): p is string => typeof p === 'string' && p.trim().length > 0)\n if (parts.length > 0) return [...new Set(parts)].join(' — ')\n try { return JSON.stringify(err) } catch { return 'Unknown error' }\n }\n return String(err)\n}\n\n/**\n * True when the failure is \"the analytics engine was never installed\" rather\n * than \"this query is wrong\" — a missing function, view or schema-cache entry.\n * Worth separating: one is a migration a developer has to run, the other is a\n * bug in a card, and telling a user \"unknown error\" for the first wastes an\n * afternoon.\n */\nexport function isEngineMissing(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as Record<string, unknown>\n const code = typeof e.code === 'string' ? e.code : ''\n // 42883 undefined_function · 42P01 undefined_table · PGRST202 no such\n // function in the schema cache.\n if (['42883', '42P01', 'PGRST202'].includes(code)) return true\n const message = typeof e.message === 'string' ? e.message.toLowerCase() : ''\n // \"permission denied for function analytics_run\" names the engine too, but it\n // is installed — the caller is not allowed in. Sending that user to run a\n // migration is the wrong afternoon.\n if (message.includes('permission denied') || code === '42501') return false\n return message.includes('analytics_run') || message.includes('plg_shop_rep_')\n}\n\nexport function num(value: unknown): number {\n if (value == null) return 0\n const n = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(n) ? n : 0\n}\n\n/**\n * Resolve 'ratio' measures from the two measures they reference.\n *\n * Deliberately done HERE and not in SQL: a ratio aggregated per group and then\n * averaged is not the ratio of the totals. Average order value over a week is\n * sum(total)/count(orders) — not the mean of each day's average, which weights\n * a 1-order Sunday the same as a 400-order Friday.\n */\nexport function resolveRatios(\n summary: AnalyticsSummary | undefined,\n measures: AnalyticsMeasure[] = [],\n): AnalyticsSummary {\n const out: AnalyticsSummary = { ...(summary ?? {}) }\n for (const m of measures) {\n if (m.agg !== 'ratio' || !m.ratioOf) continue\n const [numeratorKey, denominatorKey] = m.ratioOf\n const denominator = num(out[denominatorKey])\n out[m.key] = denominator === 0 ? 0 : (num(out[numeratorKey]) / denominator) * (m.scale ?? 1)\n }\n return out\n}\n\n/** Apply ratio measures to every row of a grouped result, not just the rollup. */\nexport function resolveRowRatios(rows: AnalyticsRow[], measures: AnalyticsMeasure[] = []): AnalyticsRow[] {\n const ratios = measures.filter((m) => m.agg === 'ratio' && m.ratioOf)\n if (ratios.length === 0) return rows\n return rows.map((row) => ({ ...row, ...resolveRatios(row as AnalyticsSummary, ratios) }))\n}\n\n/**\n * Percentage change, or null when there is no honest answer.\n *\n * Growth from zero is not \"+100%\" and not \"+∞\" — it is undefined, and printing\n * a number there is how a dashboard claims a trend it cannot know. The card\n * shows a dash instead.\n */\nexport function deltaPercent(current: number, previous: number | undefined | null): number | null {\n if (previous == null || previous === 0) return null\n return ((current - previous) / Math.abs(previous)) * 100\n}\n\nexport function trendOf(current: number, previous: number | undefined | null): 'up' | 'down' | 'neutral' | undefined {\n if (previous == null) return undefined\n if (current > previous) return 'up'\n if (current < previous) return 'down'\n return 'neutral'\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsCurrency {\n code?: string\n locale?: string\n symbol?: string\n}\n\n/** Compact form for card headlines: 1.2K, 3.4M. */\nexport function formatCompact(value: number, locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: 1 }).format(value)\n}\n\nexport function formatAnalyticsValue(\n value: unknown,\n format: AnalyticsFormat | undefined,\n currency?: AnalyticsCurrency,\n opts?: { compact?: boolean },\n): string {\n const locale = currency?.locale ?? 'pt-BR'\n\n if (format === 'date') {\n if (!value) return '—'\n const d = new Date(String(value))\n return Number.isNaN(d.getTime()) ? String(value) : d.toLocaleDateString(locale)\n }\n if (format === 'text' || typeof value === 'string' && format == null) {\n return value == null || value === '' ? '—' : String(value)\n }\n\n const n = num(value)\n switch (format) {\n case 'currency':\n return opts?.compact && Math.abs(n) >= 10_000\n ? `${currency?.symbol ?? 'R$'}${formatCompact(n, locale)}`\n : new Intl.NumberFormat(locale, {\n style: 'currency', currency: currency?.code ?? 'BRL', maximumFractionDigits: 2,\n }).format(n)\n case 'percent':\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)}%`\n case 'duration':\n return formatDuration(n)\n default:\n return opts?.compact && Math.abs(n) >= 10_000\n ? formatCompact(n, locale)\n : new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)\n }\n}\n\n/** Durations are stored in HOURS (the read models emit hours_to_fulfillment). */\nexport function formatDuration(hours: number): string {\n if (!Number.isFinite(hours) || hours <= 0) return '0s'\n const totalMinutes = Math.round(hours * 60)\n if (totalMinutes < 1) return `${Math.round(hours * 3600)}s`\n if (totalMinutes < 60) return `${totalMinutes}min`\n const h = Math.floor(totalMinutes / 60)\n const m = totalMinutes % 60\n if (h < 24) return m ? `${h}h ${m}min` : `${h}h`\n const d = Math.floor(h / 24)\n return `${d}d ${h % 24}h`\n}\n\n/** Axis tick for a bucketed timestamp — short, locale-aware, grain-aware. */\nexport function formatBucket(value: unknown, grain: AnalyticsGrain | undefined, locale = 'pt-BR'): string {\n if (value == null) return '—'\n const d = new Date(String(value))\n if (Number.isNaN(d.getTime())) return String(value)\n switch (grain) {\n case 'hour': return d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n case 'month': return d.toLocaleDateString(locale, { month: 'short', year: '2-digit' })\n case 'quarter': return `Q${Math.floor(d.getMonth() / 3) + 1} ${d.getFullYear()}`\n case 'year': return String(d.getFullYear())\n default: return d.toLocaleDateString(locale, { day: '2-digit', month: 'short' })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shaping — result rows into what each viz wants\n// ---------------------------------------------------------------------------\n\nexport interface BreakdownRow {\n label: string\n value: number\n /** Share of the largest row (0–1), for the inline bar width. */\n share: number\n formatted: string\n}\n\n/**\n * Rows for the \"sessions by device type\" style list. Bars are scaled to the\n * LARGEST row, not to the total: with one dominant category every other bar\n * collapses to an invisible sliver and the list stops communicating rank.\n */\nexport function toBreakdown(\n rows: AnalyticsRow[],\n categoryKey: string,\n measureKey: string,\n format: AnalyticsFormat | undefined,\n currency?: AnalyticsCurrency,\n limit?: number,\n): BreakdownRow[] {\n const mapped = rows.map((row) => ({\n label: row[categoryKey] == null || row[categoryKey] === '' ? '—' : String(row[categoryKey]),\n value: num(row[measureKey]),\n }))\n const max = mapped.reduce((m, r) => Math.max(m, Math.abs(r.value)), 0)\n const sliced = limit ? mapped.slice(0, limit) : mapped\n return sliced.map((r) => ({\n ...r,\n share: max === 0 ? 0 : Math.abs(r.value) / max,\n formatted: formatAnalyticsValue(r.value, format, currency),\n }))\n}\n\n/** The measures a card actually renders, in the order the viz asked for. */\nexport function vizMeasures(card: AnalyticsCardDef): AnalyticsMeasure[] {\n const all = card.query.measures ?? []\n const wanted = card.viz.measures\n if (!wanted?.length) return all\n return wanted\n .map((key) => all.find((m) => m.key === key))\n .filter((m): m is AnalyticsMeasure => Boolean(m))\n}\n\n/** The dimension a chart/breakdown puts on its category axis. */\nexport function vizCategory(card: AnalyticsCardDef) {\n // A hidden dimension carries an id, not a label — an axis of UUIDs is not a\n // category axis, so it can never be the default.\n const dims = (card.query.dimensions ?? []).filter((d) => !d.hidden)\n if (card.viz.categoryKey) return dims.find((d) => d.key === card.viz.categoryKey) ?? dims[0]\n return dims[0]\n}\n\n/**\n * Chart rows with the category axis pre-formatted.\n *\n * recharts renders whatever string it is handed, so bucketed timestamps must be\n * humanised BEFORE they reach it — otherwise the x-axis reads\n * \"2026-08-01T00:00:00+00:00\".\n */\nexport function toChartData(\n rows: AnalyticsRow[],\n categoryKey: string,\n grain: AnalyticsGrain | undefined,\n locale = 'pt-BR',\n): Array<Record<string, string | number>> {\n return rows.map((row) => {\n const out: Record<string, string | number> = {}\n for (const [k, v] of Object.entries(row)) {\n if (k === categoryKey) continue\n out[k] = typeof v === 'number' ? v : num(v)\n }\n out[categoryKey] = grain\n ? formatBucket(row[categoryKey], grain, locale)\n : (row[categoryKey] == null || row[categoryKey] === '' ? '—' : String(row[categoryKey]))\n return out\n })\n}\n\n/** Sparkline series for a KPI: the headline measure across the time buckets. */\nexport function toSpark(result: AnalyticsResult | null, measureKey: string): number[] | undefined {\n if (!result?.rows?.length || result.rows.length < 2) return undefined\n return result.rows.map((row) => num(row[measureKey]))\n}\n","import type {\n AnalyticsCardDef, AnalyticsProvider, AnalyticsQueryState, AnalyticsResult,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Two round-trip savings, wrapped around any provider.\n//\n// 1. DE-DUPLICATION. Identical queries issued in the same tick share one\n// request: the report viewer renders the chart and the table from the SAME\n// card, and an overview can hold two cards over one query.\n//\n// 2. BATCHING. Cards fetch themselves — the right ownership (a tile added to a\n// pack must not require editing a page-level query) and the reason an\n// overview of twenty-two tiles, most also asking for a comparison window,\n// issued FORTY-ONE requests, and issued them all again on every change of\n// date range. Everything queued within one frame leaves as a single\n// `runMany`; a provider that cannot answer several at once is unaffected and\n// still gets N calls.\n//\n// Deliberately transport-agnostic and outside React: what to coalesce is a\n// property of the queries, not of the render, and keeping it here is what lets\n// it be tested without mounting twenty-two cards.\n// ---------------------------------------------------------------------------\n\n/**\n * How long a queued query waits for its neighbours before going out.\n *\n * Long enough to catch every card of one render, short enough that nobody\n * perceives it — the request it joins takes two orders of magnitude longer.\n */\nexport const BATCH_WINDOW_MS = 16\n\ninterface Pending {\n card: AnalyticsCardDef\n state: AnalyticsQueryState\n resolve: (result: AnalyticsResult) => void\n reject: (error: unknown) => void\n}\n\nexport interface BatchingProviderOptions {\n /** Coalescing window. Exposed for tests; production uses the default. */\n windowMs?: number\n /**\n * Part of every de-duplication key. The surface bumps it on ↻ so a refresh\n * is not served the in-flight promise it is trying to replace.\n */\n refreshToken?: number\n}\n\nexport function createBatchingProvider(\n provider: AnalyticsProvider,\n options: BatchingProviderOptions = {},\n): AnalyticsProvider {\n const windowMs = options.windowMs ?? BATCH_WINDOW_MS\n const inflight = new Map<string, Promise<AnalyticsResult>>()\n let queue: Pending[] = []\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const flush = () => {\n timer = null\n const batch = queue\n queue = []\n if (batch.length === 0) return\n\n const individually = () => {\n for (const p of batch) provider.run(p.card, p.state).then(p.resolve, p.reject)\n }\n\n // One card is not a batch — routing it through runMany would only add a\n // layer between it and the identical single request.\n if (batch.length === 1 || !provider.runMany) { individually(); return }\n\n // Guarded because the feature check above can LIE. Providers reach here\n // through createSafeDataProvider, whose Proxy answers every property with a\n // function, so `runMany` is truthy even where the underlying provider has\n // none — and the throw lands synchronously, before any promise exists to\n // reject. Falling back keeps such a provider working at N requests instead\n // of blanking the surface.\n let batchCall: Promise<Array<AnalyticsResult | Error>>\n try {\n batchCall = provider.runMany(batch.map(({ card, state }) => ({ card, state })))\n } catch {\n individually()\n return\n }\n\n batchCall.then(\n (results) => batch.forEach((p, i) => {\n const result = results[i]\n // A provider that returns fewer answers than questions has mismatched\n // the two, and resolving with `undefined` would render a card of zeroes\n // that looks like real data.\n if (!result) p.reject(new Error('analytics: batch returned no result for this card'))\n else if (result instanceof Error) p.reject(result)\n else p.resolve(result)\n }),\n (error: unknown) => batch.forEach((p) => p.reject(error)),\n )\n }\n\n return {\n run(card, state) {\n const key = JSON.stringify([card.id, state, options.refreshToken ?? 0])\n const existing = inflight.get(key)\n if (existing) return existing\n\n const promise = new Promise<AnalyticsResult>((resolve, reject) => {\n queue.push({ card, state, resolve, reject })\n // A timeout and not a microtask: React does not guarantee that every\n // card's effect lands in one synchronous flush, and a microtask firing\n // between two of them splits one dashboard into several batches.\n if (timer == null) timer = setTimeout(flush, windowMs)\n }).finally(() => {\n // Held only for the duration of the request: this is de-duplication,\n // not caching. Keeping results would mean a stale dashboard after a\n // write, which is a worse bug than an extra fetch.\n inflight.delete(key)\n })\n\n inflight.set(key, promise)\n return promise\n },\n\n // Passed through so a caller that already has a batch of its own (an export\n // of every card, say) still reaches the provider's own batching.\n runMany: provider.runMany ? (requests) => provider.runMany!(requests) : undefined,\n }\n}\n","import * as React from 'react'\nimport type {\n AnalyticsCardDef, AnalyticsProvider, AnalyticsQueryState, AnalyticsResult,\n AnalyticsCompare, AnalyticsDateRange, AnalyticsGrain, AnalyticsRow,\n} from '@fayz-ai/core'\nimport { comparisonRange, resolveRangePreset, autoGrain, type AnalyticsRangePreset } from './range'\nimport { resolveRatios, resolveRowRatios, errorMessage, isEngineMissing, type AnalyticsCurrency } from './derive'\nimport { createBatchingProvider } from './batch'\n\n// ---------------------------------------------------------------------------\n// One page-level state for every card on the surface.\n//\n// The range, the comparison and the filters belong to the PAGE, not to each\n// tile: the control bar at the top of the overview must move all fourteen cards\n// at once, and a report opened from a card has to inherit what the user was\n// looking at. Card-local state would mean fourteen date pickers disagreeing.\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsContextValue {\n provider: AnalyticsProvider\n currency: AnalyticsCurrency\n state: AnalyticsQueryState\n preset: AnalyticsRangePreset\n setPreset: (preset: AnalyticsRangePreset) => void\n setDateRange: (range: AnalyticsDateRange) => void\n setCompare: (compare: AnalyticsCompare) => void\n setFilter: (key: string, value: unknown) => void\n setFilters: (filters: Record<string, unknown>) => void\n clearFilters: () => void\n setPage: (page: number) => void\n setPageSize: (pageSize: number) => void\n setSort: (sortBy: string, sortDir: 'asc' | 'desc') => void\n setSearch: (search: string) => void\n /** Bumped to force every mounted card to refetch (the ↻ button). */\n refreshToken: number\n refresh: () => void\n /** Open a card as a full-page report. Absent ⇒ cards render no open affordance. */\n onOpenCard?: (card: AnalyticsCardDef) => void\n /** \"Created by\" shown on cards a pack did not attribute individually. */\n createdBy?: string\n}\n\nconst AnalyticsContext = React.createContext<AnalyticsContextValue | null>(null)\n\nexport function useAnalyticsContext(): AnalyticsContextValue {\n const ctx = React.useContext(AnalyticsContext)\n if (!ctx) throw new Error('useAnalyticsContext must be used inside <AnalyticsContextProvider>')\n return ctx\n}\n\n/** Non-throwing variant for primitives that may render outside a surface. */\nexport function useAnalyticsContextOptional(): AnalyticsContextValue | null {\n return React.useContext(AnalyticsContext)\n}\n\nexport interface AnalyticsContextProviderProps {\n provider: AnalyticsProvider\n currency?: AnalyticsCurrency\n defaultPreset?: AnalyticsRangePreset\n defaultCompare?: AnalyticsCompare\n defaultPageSize?: number\n onOpenCard?: (card: AnalyticsCardDef) => void\n createdBy?: string\n children: React.ReactNode\n}\n\nexport function AnalyticsContextProvider({\n provider, currency, defaultPreset = 'last_30_days', defaultCompare = 'previous_period',\n defaultPageSize = 50, onOpenCard, createdBy, children,\n}: AnalyticsContextProviderProps) {\n const [preset, setPresetState] = React.useState<AnalyticsRangePreset>(defaultPreset)\n const [refreshToken, setRefreshToken] = React.useState(0)\n const [state, setState] = React.useState<AnalyticsQueryState>(() => ({\n dateRange: resolveRangePreset(defaultPreset),\n compare: defaultCompare,\n filters: {},\n page: 1,\n pageSize: defaultPageSize,\n }))\n\n const setPreset = React.useCallback((next: AnalyticsRangePreset) => {\n setPresetState(next)\n if (next !== 'custom') {\n setState((s) => ({ ...s, dateRange: resolveRangePreset(next), page: 1 }))\n }\n }, [])\n\n const setDateRange = React.useCallback((dateRange: AnalyticsDateRange) => {\n setPresetState('custom')\n setState((s) => ({ ...s, dateRange, page: 1 }))\n }, [])\n\n const setCompare = React.useCallback((compare: AnalyticsCompare) => {\n setState((s) => ({ ...s, compare }))\n }, [])\n\n const setFilter = React.useCallback((key: string, value: unknown) => {\n setState((s) => {\n const filters = { ...s.filters }\n // An empty value REMOVES the filter rather than sending \"\" downstream,\n // which a provider would otherwise translate into `col = ''`.\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) delete filters[key]\n else filters[key] = value\n return { ...s, filters, page: 1 }\n })\n }, [])\n\n const setFilters = React.useCallback((filters: Record<string, unknown>) => {\n setState((s) => ({ ...s, filters, page: 1 }))\n }, [])\n\n const clearFilters = React.useCallback(() => {\n setState((s) => ({ ...s, filters: {}, page: 1 }))\n }, [])\n\n const setPage = React.useCallback((page: number) => {\n setState((s) => ({ ...s, page: Math.max(1, page) }))\n }, [])\n\n const setPageSize = React.useCallback((pageSize: number) => {\n // Changing page size while on page 7 lands you somewhere arbitrary, so the\n // pager resets — the user asked for \"show more\", not \"jump elsewhere\".\n setState((s) => ({ ...s, pageSize, page: 1 }))\n }, [])\n\n const setSort = React.useCallback((sortBy: string, sortDir: 'asc' | 'desc') => {\n setState((s) => ({ ...s, sortBy, sortDir, page: 1 }))\n }, [])\n\n const setSearch = React.useCallback((search: string) => {\n setState((s) => ({ ...s, search, page: 1 }))\n }, [])\n\n const refresh = React.useCallback(() => setRefreshToken((t) => t + 1), [])\n\n // Coalescing lives in batch.ts, not here: what to merge is a property of the\n // queries, not of the render.\n const batched = React.useMemo<AnalyticsProvider>(\n () => createBatchingProvider(provider, { refreshToken }),\n [provider, refreshToken],\n )\n\n const value = React.useMemo<AnalyticsContextValue>(() => ({\n provider: batched,\n currency: currency ?? { code: 'BRL', locale: 'pt-BR', symbol: 'R$' },\n state, preset, setPreset, setDateRange, setCompare, setFilter, setFilters, clearFilters,\n setPage, setPageSize, setSort, setSearch,\n refreshToken, refresh, onOpenCard, createdBy,\n }), [batched, currency, state, preset, setPreset, setDateRange, setCompare, setFilter,\n setFilters, clearFilters, setPage, setPageSize, setSort, setSearch,\n refreshToken, refresh, onOpenCard, createdBy])\n\n return <AnalyticsContext.Provider value={value}>{children}</AnalyticsContext.Provider>\n}\n\n// ---------------------------------------------------------------------------\n// Per-card fetching\n// ---------------------------------------------------------------------------\n\nexport interface UseAnalyticsCardResult {\n result: AnalyticsResult | null\n /** Rollup with ratio measures resolved. Empty object until loaded. */\n summary: Record<string, number>\n /** Same for the comparison window, or null when not comparing. */\n previousSummary: Record<string, number> | null\n loading: boolean\n error: string | null\n /** The failure is a missing migration, not a bad card. */\n engineMissing: boolean\n refetch: () => void\n}\n\n/** Resolve 'auto' grains against the active range before the query is built. */\nfunction withResolvedGrain(card: AnalyticsCardDef, range: AnalyticsDateRange): AnalyticsCardDef {\n const dims = card.query.dimensions\n if (!dims?.some((d) => d.grain === 'auto')) return card\n const grain: AnalyticsGrain = autoGrain(range)\n return {\n ...card,\n query: {\n ...card.query,\n dimensions: dims.map((d) => (d.grain === 'auto' ? { ...d, grain } : d)),\n },\n }\n}\n\nexport function useAnalyticsCard(\n card: AnalyticsCardDef,\n options?: { stateOverride?: Partial<AnalyticsQueryState>; enabled?: boolean },\n): UseAnalyticsCardResult {\n const { provider, state, refreshToken } = useAnalyticsContext()\n const [result, setResult] = React.useState<AnalyticsResult | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [engineMissing, setEngineMissing] = React.useState(false)\n\n const enabled = (options?.enabled ?? true) && card.available !== false\n const merged = React.useMemo<AnalyticsQueryState>(\n () => ({ ...state, ...options?.stateOverride }),\n [state, options?.stateOverride],\n )\n const resolved = React.useMemo(() => withResolvedGrain(card, merged.dateRange), [card, merged.dateRange])\n\n // Serialized query identity — the effect must rerun when the QUERY changes,\n // not when React hands us a new object with identical contents.\n const key = React.useMemo(\n () => JSON.stringify([resolved.id, merged, refreshToken]),\n [resolved.id, merged, refreshToken],\n )\n\n React.useEffect(() => {\n if (!enabled) { setResult(null); return }\n let cancelled = false\n setLoading(true)\n setError(null)\n setEngineMissing(false)\n\n const comparison = resolved.compare ? comparisonRange(merged.dateRange, merged.compare) : null\n\n Promise.all([\n provider.run(resolved, merged),\n comparison\n ? provider.run(resolved, { ...merged, dateRange: comparison }).catch(() => null)\n : Promise.resolve(null),\n ])\n .then(([current, previous]) => {\n if (cancelled) return\n setResult({\n ...current,\n rows: resolveRowRatios(current.rows, resolved.query.measures),\n previous: previous\n ? { rows: previous.rows, summary: previous.summary }\n : undefined,\n })\n })\n .catch((err: unknown) => {\n if (cancelled) return\n setResult(null)\n setError(errorMessage(err))\n setEngineMissing(isEngineMissing(err))\n })\n .finally(() => { if (!cancelled) setLoading(false) })\n\n // The comparison fetch is allowed to fail on its own (.catch above): a\n // missing previous window costs a trend chip, it must not blank the card.\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, enabled, provider])\n\n const refetch = React.useCallback(() => {\n setResult(null)\n setLoading(true)\n }, [])\n\n const summary = React.useMemo(\n () => resolveRatios(result?.summary, resolved.query.measures),\n [result?.summary, resolved.query.measures],\n )\n const previousSummary = React.useMemo(\n () => (result?.previous ? resolveRatios(result.previous.summary, resolved.query.measures) : null),\n [result?.previous, resolved.query.measures],\n )\n\n return { result, summary, previousSummary, loading, error, engineMissing, refetch }\n}\n\n/**\n * Fetch EVERY row the card's current query returns, not just the page on\n * screen — what an export needs.\n *\n * The viewer paginates at 50, and a spreadsheet holding 50 of 4,000 leads is\n * worse than no spreadsheet: nothing on the file says it is a fragment, so it\n * gets mailed to an accountant as if it were the whole month. Pages through the\n * same provider with the same filters, the same range and the same sort, so the\n * file and the screen answer the same question.\n *\n * `compare` is dropped: the previous window costs a round trip and never lands\n * in the file.\n */\nexport function useAnalyticsCardRows(\n card: AnalyticsCardDef,\n): (limit?: number) => Promise<AnalyticsRow[]> {\n const { provider, state } = useAnalyticsContext()\n return React.useCallback(async (limit = EXPORT_ROW_CAP) => {\n const resolved = withResolvedGrain(card, state.dateRange)\n const rows: AnalyticsRow[] = []\n for (let page = 1; rows.length < limit; page++) {\n const res = await provider.run(resolved, {\n ...state, compare: 'none', page, pageSize: EXPORT_PAGE_SIZE,\n })\n rows.push(...resolveRowRatios(res.rows, resolved.query.measures))\n if (res.rows.length < EXPORT_PAGE_SIZE || rows.length >= (res.total ?? rows.length)) break\n }\n return rows.slice(0, limit)\n }, [provider, state, card])\n}\n\n/** One round trip per thousand rows — big enough that most exports are one\n * call, small enough that a mistyped filter does not pull a whole table. */\nconst EXPORT_PAGE_SIZE = 1000\n/** Hard stop. Past this a spreadsheet is the wrong tool and the browser says so\n * by freezing; the file is truncated rather than the tab lost. */\nconst EXPORT_ROW_CAP = 20000\n","import * as React from 'react'\nimport { ArrowUpRight, Info, TrendingUp, TrendingDown, Construction, DatabaseZap, AlertCircle } from 'lucide-react'\nimport type {\n AnalyticsCardDef, AnalyticsColumnDef, AnalyticsFormat, AnalyticsMeasure, AnalyticsRow,\n} from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { Card, CardContent } from '../primitives/card'\nimport { Hint } from '../primitives/hint'\nimport { Skeleton } from '../primitives/skeleton'\nimport { ChartWidget } from '../dashboard/ChartWidget'\nimport { Sparkline } from '../dashboard/Sparkline'\nimport type { ChartSeries, ChartType } from '../dashboard/types'\nimport { useAnalyticsContext, useAnalyticsCard } from './context'\nimport {\n formatAnalyticsValue, deltaPercent, trendOf, toBreakdown, toChartData,\n toSpark, vizMeasures, vizCategory, num, type AnalyticsCurrency,\n} from './derive'\n\n// ---------------------------------------------------------------------------\n// The card — one AnalyticsCardDef, rendered at tile size.\n//\n// Every viz shares the same chrome (title, the ⓘ that explains what the number\n// means, the ↗ that opens the same definition as a full report) because they\n// are the same object. The arrow is not navigation between two features; it is\n// a zoom level.\n// ---------------------------------------------------------------------------\n\nconst CHART_TYPES: Record<string, ChartType> = { line: 'line', bar: 'bar', area: 'area', donut: 'pie' }\n\nexport interface AnalyticsCardProps {\n card: AnalyticsCardDef\n className?: string\n /** Hide the ↗ affordance (the viewer renders the same card full-size). */\n hideOpen?: boolean\n}\n\nfunction CardChrome({\n card, hideOpen, children, dense,\n}: { card: AnalyticsCardDef; hideOpen?: boolean; children: React.ReactNode; dense?: boolean }) {\n const { onOpenCard } = useAnalyticsContext()\n const canOpen = Boolean(onOpenCard) && !hideOpen\n\n return (\n <Card className=\"group flex h-full flex-col\">\n <div className={cn('flex items-start justify-between gap-2', dense ? 'px-4 pt-3' : 'px-5 pt-4')}>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium text-muted-foreground\">{card.name}</span>\n {card.description ? (\n <Hint label={card.description} side=\"top\">\n <span\n tabIndex={0}\n role=\"note\"\n aria-label={card.description}\n className=\"shrink-0 text-muted-foreground/60 hover:text-muted-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </span>\n </Hint>\n ) : null}\n </div>\n {canOpen ? (\n <Hint label=\"Open as report\" side=\"top\">\n <button\n type=\"button\"\n onClick={() => onOpenCard?.(card)}\n aria-label={`Open ${card.name} as a report`}\n className=\"shrink-0 rounded-md p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n >\n <ArrowUpRight className=\"h-4 w-4\" />\n </button>\n </Hint>\n ) : null}\n </div>\n <CardContent className={cn('flex-1', dense ? 'p-4 pt-2' : 'p-5 pt-2')}>{children}</CardContent>\n </Card>\n )\n}\n\nfunction TrendChip({ current, previous }: { current: number; previous: number | null | undefined }) {\n const delta = deltaPercent(current, previous)\n const trend = trendOf(current, previous)\n // No previous window, or a previous of zero: there is no honest percentage to\n // print, so the card shows a dash rather than inventing \"+100%\".\n if (!trend || trend === 'neutral' || delta == null) {\n return <span className=\"text-xs text-muted-foreground\">—</span>\n }\n const Icon = trend === 'up' ? TrendingUp : TrendingDown\n return (\n <span className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n trend === 'up' ? 'text-emerald-600' : 'text-rose-600',\n )}>\n <Icon className=\"h-3 w-3\" />\n {`${delta > 0 ? '+' : ''}${delta.toFixed(1)}%`}\n </span>\n )\n}\n\nfunction BreakdownList({\n rows, categoryKey, measure, currency, limit,\n}: {\n rows: AnalyticsRow[]; categoryKey: string; measure: AnalyticsMeasure\n currency: AnalyticsCurrency; limit?: number\n}) {\n const items = toBreakdown(rows, categoryKey, measure.key, measure.format, currency, limit)\n if (items.length === 0) return <EmptyState />\n return (\n <ul className=\"space-y-2.5\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"flex items-center gap-3 text-sm\">\n <span className=\"w-2/5 truncate text-muted-foreground\" title={item.label}>{item.label}</span>\n <span className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\" role=\"presentation\">\n <span\n className=\"block h-full rounded-full bg-[hsl(var(--chart-1,var(--info)))]\"\n style={{ width: `${Math.max(item.share * 100, item.value === 0 ? 0 : 2)}%` }}\n />\n </span>\n <span className=\"shrink-0 tabular-nums font-medium\">{item.formatted}</span>\n </li>\n ))}\n </ul>\n )\n}\n\n/**\n * A column's type vocabulary is wider than the value formatter's: 'person',\n * 'email', 'select' and 'boolean' have no numeric shape, so they fall back to\n * text rather than to nothing. `undefined` would be worse than imprecise — an\n * unformatted NULL takes the numeric branch and prints \"0\", so a customer with\n * no name recorded showed up in the table as a zero.\n */\nconst VALUE_FORMATS = new Set<string>(['number', 'currency', 'percent', 'duration', 'date', 'text'])\nfunction columnFormat(type: AnalyticsColumnDef['type']): AnalyticsFormat {\n return VALUE_FORMATS.has(type) ? (type as AnalyticsFormat) : 'text'\n}\n\nfunction MiniTable({\n rows, card, currency, limit,\n}: { rows: AnalyticsRow[]; card: AnalyticsCardDef; currency: AnalyticsCurrency; limit?: number }) {\n // Hidden dimensions are grouped on, not shown: the tile would otherwise lead\n // with a column of UUIDs.\n const dims = (card.query.dimensions ?? []).filter((d) => !d.hidden)\n const measures = vizMeasures(card)\n const aggregated = [\n ...dims.map((d) => ({ key: d.key, label: d.label, format: d.format, align: 'left' as const })),\n ...measures.map((m) => ({ key: m.key, label: m.label, format: m.format, align: 'right' as const })),\n ]\n // A DETAIL card has neither dimensions nor measures — it reads the view row by\n // row, and `card.columns` is the only thing that says what a row looks like.\n // Building the header from dimensions alone left such a card with zero columns:\n // a table of empty rows under a title, which reads as \"no data\" while the\n // request came back 200 with everything in it.\n const cols = aggregated.length > 0\n ? aggregated\n : (card.columns ?? [])\n .filter((c) => c.visible !== false)\n .map((c) => ({\n key: c.key,\n label: c.label,\n format: columnFormat(c.type),\n align: c.align === 'right' ? ('right' as const) : ('left' as const),\n }))\n const shown = limit ? rows.slice(0, limit) : rows\n if (shown.length === 0 || cols.length === 0) return <EmptyState />\n\n return (\n <div className=\"-mx-1 overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b text-xs text-muted-foreground\">\n {cols.map((c) => (\n <th key={c.key} className={cn('px-1 pb-2 font-medium', c.align === 'right' ? 'text-right' : 'text-left')}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {shown.map((row, i) => (\n <tr key={i} className=\"border-b border-border/50 last:border-0\">\n {cols.map((c) => (\n <td key={c.key} className={cn('px-1 py-2', c.align === 'right' ? 'text-right tabular-nums' : 'truncate')}>\n {formatAnalyticsValue(row[c.key], c.format, currency)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction EmptyState({ label = 'No data for this date range' }: { label?: string }) {\n return (\n <div className=\"flex h-full min-h-[80px] items-center justify-center text-center text-sm text-muted-foreground\">\n {label}\n </div>\n )\n}\n\nexport function AnalyticsCard({ card, className, hideOpen }: AnalyticsCardProps) {\n const { currency } = useAnalyticsContext()\n const { result, summary, previousSummary, loading, error, engineMissing } = useAnalyticsCard(card)\n const measures = vizMeasures(card)\n const category = vizCategory(card)\n const rows = result?.rows ?? []\n\n const body = (() => {\n if (card.available === false) {\n return (\n <div className=\"flex h-full min-h-[80px] flex-col items-center justify-center gap-2 text-center\">\n <Construction className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-xs text-muted-foreground\">Not connected yet</p>\n </div>\n )\n }\n if (loading && !result) {\n return (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-7 w-24\" />\n <Skeleton className=\"h-4 w-16\" />\n </div>\n )\n }\n if (engineMissing) {\n // A missing migration is not a broken card, and saying \"error\" here sends\n // someone hunting through a card definition that is perfectly fine.\n return (\n <div className=\"flex h-full min-h-[80px] flex-col items-center justify-center gap-1.5 text-center\">\n <DatabaseZap className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-xs font-medium\">Analytics engine not installed</p>\n <p className=\"text-[11px] text-muted-foreground\">Run migration 0039 on this project.</p>\n </div>\n )\n }\n if (error) {\n return (\n <div className=\"flex h-full min-h-[60px] items-start gap-1.5 text-xs text-destructive\">\n <AlertCircle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"break-words\">{error}</span>\n </div>\n )\n }\n\n switch (card.viz.type) {\n case 'kpi': {\n const measure = measures[0]\n if (!measure) return <EmptyState />\n const value = num(summary[measure.key])\n const previous = previousSummary ? num(previousSummary[measure.key]) : null\n const spark = card.viz.spark ? toSpark(result, measure.key) : undefined\n return (\n <div className=\"flex h-full flex-col justify-between gap-2\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-2xl font-semibold tracking-tight tabular-nums\">\n {formatAnalyticsValue(value, measure.format, currency, { compact: true })}\n </span>\n <TrendChip current={value} previous={previous} />\n </div>\n {spark ? (\n <Sparkline\n data={spark} color=\"hsl(var(--chart-1,var(--info)))\"\n width={120} height={28} padding={2} className=\"h-7 w-full\"\n />\n ) : null}\n </div>\n )\n }\n\n case 'breakdown': {\n const measure = measures[0]\n if (!measure || !category) return <EmptyState />\n return (\n <BreakdownList\n rows={rows} categoryKey={category.key} measure={measure}\n currency={currency} limit={card.viz.limit}\n />\n )\n }\n\n case 'table':\n return <MiniTable rows={rows} card={card} currency={currency} limit={card.viz.limit ?? 5} />\n\n case 'funnel': {\n // A funnel is a breakdown whose bars are shares of the FIRST step, so\n // each stage reads as \"of everyone who started, this many got here\".\n const measure = measures[0]\n if (!measure || !category) return <EmptyState />\n const first = num(rows[0]?.[measure.key]) || 1\n return (\n <ul className=\"space-y-2.5\">\n {rows.map((row, i) => {\n const value = num(row[measure.key])\n return (\n <li key={i} className=\"text-sm\">\n <div className=\"mb-1 flex items-baseline justify-between gap-2\">\n <span className=\"truncate text-muted-foreground\">{String(row[category.key] ?? '—')}</span>\n <span className=\"shrink-0 tabular-nums font-medium\">\n {formatAnalyticsValue(value, measure.format, currency)}\n <span className=\"ml-1.5 text-xs text-muted-foreground\">\n {((value / first) * 100).toFixed(0)}%\n </span>\n </span>\n </div>\n <span className=\"block h-1.5 overflow-hidden rounded-full bg-muted\">\n <span className=\"block h-full rounded-full bg-[hsl(var(--chart-1,var(--info)))]\" style={{ width: `${(value / first) * 100}%` }} />\n </span>\n </li>\n )\n })}\n </ul>\n )\n }\n\n default: {\n if (rows.length === 0) return <EmptyState />\n if (!category) return <EmptyState />\n const chartType = CHART_TYPES[card.viz.type] ?? 'line'\n const data = toChartData(rows, category.key, category.grain, currency.locale)\n const series: ChartSeries[] = measures.map((m) => ({ dataKey: m.key, label: m.label }))\n return (\n <ChartWidget\n type={chartType}\n data={data}\n series={series}\n categoryKey={category.key}\n height={card.viz.height ?? 200}\n className=\"border-0 bg-transparent shadow-none [&>div]:p-0\"\n />\n )\n }\n }\n })()\n\n const dense = card.viz.type === 'kpi'\n return (\n <div className={className}>\n <CardChrome card={card} hideOpen={hideOpen} dense={dense}>{body}</CardChrome>\n </div>\n )\n}\n","import * as React from 'react'\nimport type { AnalyticsCardDef, AnalyticsFilterDef } from '@fayz-ai/core'\nimport { DashboardGrid } from '../dashboard/DashboardGrid'\nimport { AnalyticsCard } from './AnalyticsCard'\n\n// ---------------------------------------------------------------------------\n// The overview grid. Reuses DashboardGrid rather than growing a second\n// four-column layout that would drift out of alignment with the app home.\n// ---------------------------------------------------------------------------\n\n/** Default span by viz: a KPI is a quarter, a chart a half, a table a full row. */\nfunction defaultSpan(card: AnalyticsCardDef): 1 | 2 | 3 | 4 {\n if (card.dashboard?.span) return card.dashboard.span\n switch (card.viz.type) {\n case 'kpi': return 1\n case 'table': return 4\n default: return 2\n }\n}\n\nexport interface AnalyticsGridProps {\n cards: AnalyticsCardDef[]\n className?: string\n}\n\nexport function AnalyticsGrid({ cards, className }: AnalyticsGridProps) {\n const items = React.useMemo(\n () => cards.map((card) => ({\n id: card.id,\n span: defaultSpan(card),\n node: <AnalyticsCard card={card} />,\n })),\n [cards],\n )\n return <DashboardGrid items={items} className={className} />\n}\n\n/**\n * Every filter offered by the cards on screen, de-duplicated by key.\n *\n * The control bar shows the union rather than the intersection: a filter that\n * only narrows three of fourteen cards is still worth offering, and hiding it\n * until every card supports it would leave the picker permanently empty.\n */\nexport function collectFilters(cards: AnalyticsCardDef[]): AnalyticsFilterDef[] {\n const byKey = new Map<string, AnalyticsFilterDef>()\n for (const card of cards) {\n for (const filter of card.query.filters ?? []) {\n if (!byKey.has(filter.key)) byKey.set(filter.key, filter)\n }\n }\n return [...byKey.values()]\n}\n","import * as React from 'react'\nimport { Check, GitCompareArrows, SlidersHorizontal, Search, ChevronRight, X } from 'lucide-react'\nimport type { AnalyticsFilterDef, AnalyticsFilterOption } from '@fayz-ai/core'\nimport { useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { Button } from '../primitives/button'\nimport { Input } from '../primitives/input'\nimport { DatePicker } from '../primitives/date-picker'\nimport { Popover, PopoverTrigger, PopoverContent } from '../primitives/popover'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownSeparator } from '../primitives/dropdown'\nimport { PageToolbar, RangeControl, ToolbarButton } from '../primitives/page-toolbar'\nimport { useAnalyticsContext } from './context'\nimport { parseDay, type AnalyticsRangePreset } from './range'\n\n// ---------------------------------------------------------------------------\n// The one control bar every analytics surface shares.\n//\n// Range, comparison and filters sit here rather than on each card because they\n// describe the QUESTION, not the chart: changing \"last 7 days\" has to move\n// everything on screen at once, or two tiles end up answering about different\n// weeks and the page silently lies.\n//\n// Chrome is deliberately the same 26px toolbar the dashboard uses (Button `sm`,\n// SegmentedControl, DatePicker `toolbar`) — this bar sits above the very same\n// card grid as the app home, and a taller, lighter-weight row of its own read\n// as a different product bolted on top.\n// ---------------------------------------------------------------------------\n\nconst PRESETS: AnalyticsRangePreset[] = [\n 'today', 'yesterday', 'last_7_days', 'last_30_days', 'last_90_days',\n 'this_month', 'last_month', 'this_quarter', 'this_year',\n]\n\nconst COMPARE_OPTIONS = ['previous_period', 'previous_year', 'none'] as const\n\n/** \"15 jul – 13 ago\" — the window the numbers below actually cover. */\nfunction formatSpan(from: string, to: string, locale: string): string {\n const opts: Intl.DateTimeFormatOptions = { day: '2-digit', month: 'short' }\n const a = parseDay(from)\n const b = parseDay(to)\n const fmt = (d: Date) => d.toLocaleDateString(locale, {\n ...opts,\n // The year only earns its space when the range leaves the current one.\n ...(d.getFullYear() === new Date().getFullYear() ? {} : { year: 'numeric' }),\n })\n return from === to ? fmt(a) : `${fmt(a)} – ${fmt(b)}`\n}\n\n// ---------------------------------------------------------------------------\n// Filter picker — categorized, searchable, staged behind Apply.\n// ---------------------------------------------------------------------------\n\nfunction useFilterOptions(filter: AnalyticsFilterDef): AnalyticsFilterOption[] {\n const [options, setOptions] = React.useState<AnalyticsFilterOption[]>(\n Array.isArray(filter.options) ? filter.options : [],\n )\n React.useEffect(() => {\n if (typeof filter.options !== 'function') {\n setOptions(Array.isArray(filter.options) ? filter.options : [])\n return\n }\n let cancelled = false\n void filter.options().then((next) => { if (!cancelled) setOptions(next) }).catch(() => {})\n return () => { cancelled = true }\n }, [filter.options])\n return options\n}\n\nfunction FilterValues({\n filter, draft, onChange,\n}: { filter: AnalyticsFilterDef; draft: Record<string, unknown>; onChange: (key: string, value: unknown) => void }) {\n const t = useTranslation()\n const options = useFilterOptions(filter)\n const current = draft[filter.key]\n\n if (filter.type === 'text' || filter.type === 'number') {\n return (\n <Input\n type={filter.type === 'number' ? 'number' : 'text'}\n value={current == null ? '' : String(current)}\n placeholder={filter.placeholder}\n onChange={(e) => onChange(filter.key, e.target.value)}\n className=\"h-8 text-sm\"\n />\n )\n }\n\n if (filter.type === 'boolean') {\n return (\n <div className=\"space-y-1\">\n {[{ label: t('common.yes'), value: 'true' }, { label: t('common.no'), value: 'false' }].map((o) => (\n <label key={o.value} className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted\">\n <input\n type=\"radio\"\n name={filter.key}\n checked={String(current) === o.value}\n onChange={() => onChange(filter.key, o.value)}\n className=\"h-3.5 w-3.5\"\n />\n {o.label}\n </label>\n ))}\n </div>\n )\n }\n\n const multi = filter.type === 'multiselect'\n const selected = new Set(Array.isArray(current) ? current.map(String) : current != null ? [String(current)] : [])\n\n if (options.length === 0) {\n return <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">{t('analytics.filters.noOptions')}</p>\n }\n\n return (\n <div className=\"max-h-56 space-y-0.5 overflow-y-auto\">\n {options.map((o) => (\n <label key={o.value} className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted\">\n <input\n type={multi ? 'checkbox' : 'radio'}\n name={filter.key}\n checked={selected.has(o.value)}\n onChange={() => {\n if (!multi) { onChange(filter.key, selected.has(o.value) ? undefined : o.value); return }\n const next = new Set(selected)\n if (next.has(o.value)) next.delete(o.value)\n else next.add(o.value)\n onChange(filter.key, [...next])\n }}\n className=\"h-3.5 w-3.5\"\n />\n <span className=\"truncate\">{o.label}</span>\n </label>\n ))}\n </div>\n )\n}\n\nexport interface AnalyticsFilterPickerProps {\n /** Every filter offered on this surface, from the cards in view. */\n filters: AnalyticsFilterDef[]\n}\n\nexport function AnalyticsFilterPicker({ filters }: AnalyticsFilterPickerProps) {\n const t = useTranslation()\n const { state, setFilters, clearFilters } = useAnalyticsContext()\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [openGroup, setOpenGroup] = React.useState<string | null>(null)\n // Staged: edits do not hit the query until Apply, so a five-filter change is\n // one refetch instead of five — and Clear can be abandoned by closing.\n const [draft, setDraft] = React.useState<Record<string, unknown>>(state.filters)\n\n React.useEffect(() => { if (open) setDraft(state.filters) }, [open, state.filters])\n\n const groups = React.useMemo(() => {\n const q = search.trim().toLowerCase()\n const matching = q ? filters.filter((f) => f.label.toLowerCase().includes(q)) : filters\n const map = new Map<string, AnalyticsFilterDef[]>()\n for (const f of matching) {\n const key = f.group ?? t('analytics.filters.general')\n map.set(key, [...(map.get(key) ?? []), f])\n }\n return [...map.entries()].sort(([a], [b]) => a.localeCompare(b))\n }, [filters, search, t])\n\n const activeCount = Object.keys(state.filters).length\n if (filters.length === 0) return null\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <ToolbarButton icon={SlidersHorizontal} caret={false}>\n {t('analytics.filters')}\n {activeCount > 0 ? (\n <span className=\"ml-0.5 rounded-full bg-primary px-1.5 text-[10px] font-semibold text-primary-foreground\">\n {activeCount}\n </span>\n ) : null}\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-80 p-0\">\n <div className=\"border-b p-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('analytics.filters.search')}\n className=\"h-8 pl-8 text-sm\"\n />\n </div>\n </div>\n\n <div className=\"max-h-80 overflow-y-auto p-1\">\n {groups.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-muted-foreground\">{t('analytics.filters.none')}</p>\n ) : (\n groups.map(([group, groupFilters]) => (\n <div key={group}>\n <button\n type=\"button\"\n onClick={() => setOpenGroup((g) => (g === group ? null : group))}\n aria-expanded={openGroup === group}\n className=\"flex w-full items-center justify-between rounded-md px-2 py-2 text-sm hover:bg-muted\"\n >\n <span className=\"font-medium\">{group}</span>\n <ChevronRight className={cn('h-3.5 w-3.5 text-muted-foreground transition-transform', openGroup === group && 'rotate-90')} />\n </button>\n {openGroup === group ? (\n <div className=\"space-y-3 px-2 pb-3 pt-1\">\n {groupFilters.map((f) => (\n <div key={f.key}>\n <p className=\"mb-1 text-xs font-medium text-muted-foreground\">{f.label}</p>\n <FilterValues\n filter={f}\n draft={draft}\n onChange={(key, value) => setDraft((d) => {\n const next = { ...d }\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) delete next[key]\n else next[key] = value\n return next\n })}\n />\n </div>\n ))}\n </div>\n ) : null}\n </div>\n ))\n )}\n </div>\n\n <div className=\"flex items-center justify-between gap-2 border-t p-2\">\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => { setDraft({}); clearFilters(); setOpen(false) }}\n >\n {t('analytics.filters.clear')}\n </Button>\n <Button size=\"sm\" onClick={() => { setFilters(draft); setOpen(false) }}>\n {t('analytics.filters.apply')}\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Range control — presets, and the custom window they cannot express\n// ---------------------------------------------------------------------------\n\nfunction AnalyticsRangeControl() {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const { state, preset, setPreset, setDateRange } = useAnalyticsContext()\n const custom = preset === 'custom'\n const span = formatSpan(state.dateRange.from, state.dateRange.to, locale)\n\n // O MESMO controle de período que o dashboard usa (RangeControl); o que é\n // próprio daqui — a janela resolvida e o par de seletores do personalizado —\n // entra pelos vãos dele.\n return (\n <RangeControl\n options={PRESETS.map((p) => ({ value: p, label: t(`analytics.range.${p}`) }))}\n value={preset}\n onChange={(p) => setPreset(p as AnalyticsRangePreset)}\n label={custom ? t('analytics.range.custom') : undefined}\n // The resolved window, always. A preset name alone leaves the merchant\n // guessing whether \"this month\" already includes today.\n span={custom ? undefined : span}\n extra={\n <>\n <DropdownSeparator />\n {/* Re-committing the range the user is already on is what flips the\n bar into custom mode: `setDateRange` is the only path that sets the\n preset to 'custom', so opening the two pickers cannot be done by\n flipping a flag without also telling the query state. */}\n <DropdownItem onSelect={() => setDateRange({ ...state.dateRange })}>\n {t('analytics.range.custom')}\n {custom ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n </>\n }\n >\n {custom ? (\n <>\n <DatePicker\n variant=\"toolbar\"\n value={state.dateRange.from}\n // A start after the end is not a range, it is an empty answer the\n // page would render as \"no data\". Dragging one past the other moves\n // the other with it instead.\n onChange={(from) => setDateRange({\n from,\n to: from > state.dateRange.to ? from : state.dateRange.to,\n })}\n />\n <span className=\"text-xs text-muted-foreground\">–</span>\n <DatePicker\n variant=\"toolbar\"\n value={state.dateRange.to}\n onChange={(to) => setDateRange({\n from: to < state.dateRange.from ? to : state.dateRange.from,\n to,\n })}\n />\n </>\n ) : null}\n </RangeControl>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The bar\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsControlsProps {\n /** Filters offered in the picker — usually the union across visible cards. */\n filters?: AnalyticsFilterDef[]\n /** Hide the comparison control on surfaces where it means nothing. */\n showCompare?: boolean\n /** Right-aligned extras (e.g. Export, New report). */\n actions?: React.ReactNode\n /** Which cards/widgets show — same slot the dashboard fills. */\n customize?: React.ReactNode\n /** Solta a barra do topo (impressão, dentro de um modal). */\n sticky?: boolean\n className?: string\n}\n\nexport function AnalyticsControls({ filters = [], showCompare = true, actions, customize, sticky, className }: AnalyticsControlsProps) {\n const t = useTranslation()\n const { state, setCompare, refresh } = useAnalyticsContext()\n const compare = state.compare ?? 'none'\n\n const activeFilters = Object.entries(state.filters)\n const filterLabel = (key: string) => filters.find((f) => f.key === key)?.label ?? key\n\n return (\n // Sem cromo próprio: a superfície, o encosto à direita e o comportamento\n // grudado no topo vêm de PageToolbar — a mesma barra do dashboard. Aqui só\n // se diz O QUE ela carrega.\n <PageToolbar\n className={className}\n sticky={sticky}\n moveLabel={t('analytics.moveBar')}\n range={<AnalyticsRangeControl />}\n filters={\n <>\n {showCompare ? (\n <Dropdown>\n <DropdownTrigger asChild>\n <ToolbarButton\n icon={GitCompareArrows}\n // A comparison that is OFF should not look like a set filter; a\n // comparison that is on is what every trend chip on the page is\n // measured against, and worth reading at a glance.\n className={compare === 'none' ? 'text-muted-foreground' : undefined}\n >\n {t(`analytics.compare.${compare}`)}\n </ToolbarButton>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-48\">\n {COMPARE_OPTIONS.map((c) => (\n <DropdownItem key={c} onSelect={() => setCompare(c)}>\n {t(`analytics.compare.${c}`)}\n {compare === c ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\n ) : null}\n <AnalyticsFilterPicker filters={filters} />\n </>\n }\n /* Applied filters stay visible as removable chips: a filter you cannot\n see is a filter you forget you set, and every number below is wrong in\n a way the page never explains. */\n chips={activeFilters.map(([key, value]) => (\n <ActiveFilterChip key={key} label={filterLabel(key)} value={value} filterKey={key} />\n ))}\n customize={customize}\n actions={actions}\n onRefresh={refresh}\n refreshLabel={t('analytics.refresh')}\n />\n )\n}\n\nfunction ActiveFilterChip({ label, value, filterKey }: { label: string; value: unknown; filterKey: string }) {\n const t = useTranslation()\n const { setFilter } = useAnalyticsContext()\n // A single-valued filter shows the value; a multiselect shows how many, since\n // six statuses spelled out push every other chip off the row.\n const text = Array.isArray(value)\n ? (value.length === 1 ? String(value[0]) : t('analytics.filters.selected', { count: value.length }))\n : String(value)\n return (\n <span className=\"inline-flex h-[26px] shrink-0 items-center gap-1 rounded-full border border-primary/30 bg-primary/10 py-1 pl-2.5 pr-1 text-xs font-medium text-primary\">\n <span className=\"opacity-70\">{label}:</span>\n <span className=\"max-w-[10rem] truncate\">{text}</span>\n <button\n type=\"button\"\n onClick={() => setFilter(filterKey, undefined)}\n aria-label={`${t('analytics.filters.remove')}: ${label}`}\n className=\"rounded-full p-0.5 transition-colors hover:bg-primary/20\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/primitives/Avatar.tsx","../src/analytics/range.ts","../src/analytics/derive.ts","../src/analytics/batch.ts","../src/analytics/context.tsx","../src/analytics/AnalyticsCard.tsx","../src/analytics/AnalyticsGrid.tsx","../src/analytics/AnalyticsControls.tsx","../src/tour/tour.store.ts","../src/tour/TourSpotlight.tsx","../src/tour/types.ts"],"names":["React","value","jsx","React3","React4","jsxs","React5","Fragment","X"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '../lib/cn'\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full',\n className\n )}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-muted',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import type { AnalyticsDateRange, AnalyticsCompare } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Date ranges and their comparison windows.\n//\n// All arithmetic is done on LOCAL calendar days and serialized as YYYY-MM-DD.\n// Using toISOString() here would silently shift every range by the UTC offset —\n// in America/Sao_Paulo \"today\" would start at 21:00 yesterday, which is exactly\n// how a dashboard ends up disagreeing with the orders list by one day.\n// ---------------------------------------------------------------------------\n\nexport type AnalyticsRangePreset =\n | 'today' | 'yesterday' | 'last_7_days' | 'last_30_days' | 'last_90_days'\n | 'this_month' | 'last_month' | 'this_quarter' | 'this_year' | 'custom'\n\nexport function toDayString(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\nexport function parseDay(s: string): Date {\n // Noon avoids the DST edge where midnight does not exist on a spring-forward day.\n const [y, m, d] = s.split('-').map(Number)\n return new Date(y ?? 1970, (m ?? 1) - 1, d ?? 1, 12, 0, 0, 0)\n}\n\nfunction shiftDays(d: Date, days: number): Date {\n const next = new Date(d)\n next.setDate(next.getDate() + days)\n return next\n}\n\n/** Inclusive whole-day count, so a single-day range compares against one day. */\nexport function rangeLengthDays(range: AnalyticsDateRange): number {\n const from = parseDay(range.from)\n const to = parseDay(range.to)\n return Math.max(1, Math.round((to.getTime() - from.getTime()) / 86_400_000) + 1)\n}\n\nexport function resolveRangePreset(preset: AnalyticsRangePreset, today = new Date()): AnalyticsDateRange {\n const base = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 12)\n switch (preset) {\n case 'today':\n return { from: toDayString(base), to: toDayString(base) }\n case 'yesterday': {\n const y = shiftDays(base, -1)\n return { from: toDayString(y), to: toDayString(y) }\n }\n // \"Last 7 days\" includes today, so it spans today minus six — not minus\n // seven, which would be eight days of data under a seven-day label.\n case 'last_7_days':\n return { from: toDayString(shiftDays(base, -6)), to: toDayString(base) }\n case 'last_30_days':\n return { from: toDayString(shiftDays(base, -29)), to: toDayString(base) }\n case 'last_90_days':\n return { from: toDayString(shiftDays(base, -89)), to: toDayString(base) }\n case 'this_month':\n return {\n from: toDayString(new Date(base.getFullYear(), base.getMonth(), 1, 12)),\n to: toDayString(base),\n }\n case 'last_month': {\n const first = new Date(base.getFullYear(), base.getMonth() - 1, 1, 12)\n const last = new Date(base.getFullYear(), base.getMonth(), 0, 12)\n return { from: toDayString(first), to: toDayString(last) }\n }\n case 'this_quarter': {\n const q = Math.floor(base.getMonth() / 3)\n return {\n from: toDayString(new Date(base.getFullYear(), q * 3, 1, 12)),\n to: toDayString(base),\n }\n }\n case 'this_year':\n return { from: toDayString(new Date(base.getFullYear(), 0, 1, 12)), to: toDayString(base) }\n default:\n return { from: toDayString(shiftDays(base, -29)), to: toDayString(base) }\n }\n}\n\n/**\n * The window a range is compared against.\n *\n * 'previous_period' is the same NUMBER OF DAYS ending the day before `from`, so\n * a 7-day range compares against the 7 days before it — never an overlapping\n * window, which would double-count the boundary day in both halves.\n */\nexport function comparisonRange(\n range: AnalyticsDateRange,\n compare: AnalyticsCompare | undefined,\n): AnalyticsDateRange | null {\n if (!compare || compare === 'none') return null\n\n if (compare === 'previous_year') {\n const from = parseDay(range.from)\n const to = parseDay(range.to)\n from.setFullYear(from.getFullYear() - 1)\n to.setFullYear(to.getFullYear() - 1)\n return { from: toDayString(from), to: toDayString(to) }\n }\n\n const days = rangeLengthDays(range)\n const prevTo = shiftDays(parseDay(range.from), -1)\n const prevFrom = shiftDays(prevTo, -(days - 1))\n return { from: toDayString(prevFrom), to: toDayString(prevTo) }\n}\n\n/**\n * Bucket size that keeps a chart readable across the chosen range: hours for a\n * single day, days for a quarter, months for a year. A fixed 'day' grain turns\n * a 12-month range into 365 unreadable ticks.\n */\nexport function autoGrain(range: AnalyticsDateRange): 'hour' | 'day' | 'week' | 'month' {\n const days = rangeLengthDays(range)\n if (days <= 2) return 'hour'\n if (days <= 62) return 'day'\n if (days <= 180) return 'week'\n return 'month'\n}\n","import type {\n AnalyticsCardDef, AnalyticsMeasure, AnalyticsResult, AnalyticsRow,\n AnalyticsSummary, AnalyticsFormat, AnalyticsGrain,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Pure derivations shared by every analytics surface.\n//\n// These live apart from the components on purpose: the overview tile, the\n// report viewer and the CSV export must agree to the last decimal, and the only\n// way to guarantee that is for all three to call the same function rather than\n// each formatting \"close enough\" in its own JSX.\n// ---------------------------------------------------------------------------\n\n/**\n * A readable message out of anything a data layer throws.\n *\n * Supabase/PostgREST reject with a PLAIN OBJECT ({message, details, hint,\n * code}), not an Error — so the usual `err instanceof Error ? err.message :\n * String(err)` renders the literal text \"[object Object]\" and hides the one\n * piece of information the user needed.\n */\nexport function errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message\n if (typeof err === 'string') return err\n if (err && typeof err === 'object') {\n const e = err as Record<string, unknown>\n const parts = [e.message, e.details, e.hint]\n .filter((p): p is string => typeof p === 'string' && p.trim().length > 0)\n if (parts.length > 0) return [...new Set(parts)].join(' — ')\n try { return JSON.stringify(err) } catch { return 'Unknown error' }\n }\n return String(err)\n}\n\n/**\n * True when the failure is \"the analytics engine was never installed\" rather\n * than \"this query is wrong\" — a missing function, view or schema-cache entry.\n * Worth separating: one is a migration a developer has to run, the other is a\n * bug in a card, and telling a user \"unknown error\" for the first wastes an\n * afternoon.\n */\nexport function isEngineMissing(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as Record<string, unknown>\n const code = typeof e.code === 'string' ? e.code : ''\n // 42883 undefined_function · 42P01 undefined_table · PGRST202 no such\n // function in the schema cache.\n if (['42883', '42P01', 'PGRST202'].includes(code)) return true\n const message = typeof e.message === 'string' ? e.message.toLowerCase() : ''\n // \"permission denied for function analytics_run\" names the engine too, but it\n // is installed — the caller is not allowed in. Sending that user to run a\n // migration is the wrong afternoon.\n if (message.includes('permission denied') || code === '42501') return false\n return message.includes('analytics_run') || message.includes('plg_shop_rep_')\n}\n\nexport function num(value: unknown): number {\n if (value == null) return 0\n const n = typeof value === 'number' ? value : Number(value)\n return Number.isFinite(n) ? n : 0\n}\n\n/**\n * Resolve 'ratio' measures from the two measures they reference.\n *\n * Deliberately done HERE and not in SQL: a ratio aggregated per group and then\n * averaged is not the ratio of the totals. Average order value over a week is\n * sum(total)/count(orders) — not the mean of each day's average, which weights\n * a 1-order Sunday the same as a 400-order Friday.\n */\nexport function resolveRatios(\n summary: AnalyticsSummary | undefined,\n measures: AnalyticsMeasure[] = [],\n): AnalyticsSummary {\n const out: AnalyticsSummary = { ...(summary ?? {}) }\n for (const m of measures) {\n if (m.agg !== 'ratio' || !m.ratioOf) continue\n const [numeratorKey, denominatorKey] = m.ratioOf\n const denominator = num(out[denominatorKey])\n out[m.key] = denominator === 0 ? 0 : (num(out[numeratorKey]) / denominator) * (m.scale ?? 1)\n }\n return out\n}\n\n/** Apply ratio measures to every row of a grouped result, not just the rollup. */\nexport function resolveRowRatios(rows: AnalyticsRow[], measures: AnalyticsMeasure[] = []): AnalyticsRow[] {\n const ratios = measures.filter((m) => m.agg === 'ratio' && m.ratioOf)\n if (ratios.length === 0) return rows\n return rows.map((row) => ({ ...row, ...resolveRatios(row as AnalyticsSummary, ratios) }))\n}\n\n/**\n * Percentage change, or null when there is no honest answer.\n *\n * Growth from zero is not \"+100%\" and not \"+∞\" — it is undefined, and printing\n * a number there is how a dashboard claims a trend it cannot know. The card\n * shows a dash instead.\n */\nexport function deltaPercent(current: number, previous: number | undefined | null): number | null {\n if (previous == null || previous === 0) return null\n return ((current - previous) / Math.abs(previous)) * 100\n}\n\nexport function trendOf(current: number, previous: number | undefined | null): 'up' | 'down' | 'neutral' | undefined {\n if (previous == null) return undefined\n if (current > previous) return 'up'\n if (current < previous) return 'down'\n return 'neutral'\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsCurrency {\n code?: string\n locale?: string\n symbol?: string\n}\n\n/** Compact form for card headlines: 1.2K, 3.4M. */\nexport function formatCompact(value: number, locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: 1 }).format(value)\n}\n\nexport function formatAnalyticsValue(\n value: unknown,\n format: AnalyticsFormat | undefined,\n currency?: AnalyticsCurrency,\n opts?: { compact?: boolean },\n): string {\n const locale = currency?.locale ?? 'pt-BR'\n\n if (format === 'date') {\n if (!value) return '—'\n const d = new Date(String(value))\n return Number.isNaN(d.getTime()) ? String(value) : d.toLocaleDateString(locale)\n }\n if (format === 'text' || typeof value === 'string' && format == null) {\n return value == null || value === '' ? '—' : String(value)\n }\n\n const n = num(value)\n switch (format) {\n case 'currency':\n return opts?.compact && Math.abs(n) >= 10_000\n ? `${currency?.symbol ?? 'R$'}${formatCompact(n, locale)}`\n : new Intl.NumberFormat(locale, {\n style: 'currency', currency: currency?.code ?? 'BRL', maximumFractionDigits: 2,\n }).format(n)\n case 'percent':\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)}%`\n case 'duration':\n return formatDuration(n)\n default:\n return opts?.compact && Math.abs(n) >= 10_000\n ? formatCompact(n, locale)\n : new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)\n }\n}\n\n/** Durations are stored in HOURS (the read models emit hours_to_fulfillment). */\nexport function formatDuration(hours: number): string {\n if (!Number.isFinite(hours) || hours <= 0) return '0s'\n const totalMinutes = Math.round(hours * 60)\n if (totalMinutes < 1) return `${Math.round(hours * 3600)}s`\n if (totalMinutes < 60) return `${totalMinutes}min`\n const h = Math.floor(totalMinutes / 60)\n const m = totalMinutes % 60\n if (h < 24) return m ? `${h}h ${m}min` : `${h}h`\n const d = Math.floor(h / 24)\n return `${d}d ${h % 24}h`\n}\n\n/** Axis tick for a bucketed timestamp — short, locale-aware, grain-aware. */\nexport function formatBucket(value: unknown, grain: AnalyticsGrain | undefined, locale = 'pt-BR'): string {\n if (value == null) return '—'\n const d = new Date(String(value))\n if (Number.isNaN(d.getTime())) return String(value)\n switch (grain) {\n case 'hour': return d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n case 'month': return d.toLocaleDateString(locale, { month: 'short', year: '2-digit' })\n case 'quarter': return `Q${Math.floor(d.getMonth() / 3) + 1} ${d.getFullYear()}`\n case 'year': return String(d.getFullYear())\n default: return d.toLocaleDateString(locale, { day: '2-digit', month: 'short' })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shaping — result rows into what each viz wants\n// ---------------------------------------------------------------------------\n\nexport interface BreakdownRow {\n label: string\n value: number\n /** Share of the largest row (0–1), for the inline bar width. */\n share: number\n formatted: string\n}\n\n/**\n * Rows for the \"sessions by device type\" style list. Bars are scaled to the\n * LARGEST row, not to the total: with one dominant category every other bar\n * collapses to an invisible sliver and the list stops communicating rank.\n */\nexport function toBreakdown(\n rows: AnalyticsRow[],\n categoryKey: string,\n measureKey: string,\n format: AnalyticsFormat | undefined,\n currency?: AnalyticsCurrency,\n limit?: number,\n): BreakdownRow[] {\n const mapped = rows.map((row) => ({\n label: row[categoryKey] == null || row[categoryKey] === '' ? '—' : String(row[categoryKey]),\n value: num(row[measureKey]),\n }))\n const max = mapped.reduce((m, r) => Math.max(m, Math.abs(r.value)), 0)\n const sliced = limit ? mapped.slice(0, limit) : mapped\n return sliced.map((r) => ({\n ...r,\n share: max === 0 ? 0 : Math.abs(r.value) / max,\n formatted: formatAnalyticsValue(r.value, format, currency),\n }))\n}\n\n/** The measures a card actually renders, in the order the viz asked for. */\nexport function vizMeasures(card: AnalyticsCardDef): AnalyticsMeasure[] {\n const all = card.query.measures ?? []\n const wanted = card.viz.measures\n if (!wanted?.length) return all\n return wanted\n .map((key) => all.find((m) => m.key === key))\n .filter((m): m is AnalyticsMeasure => Boolean(m))\n}\n\n/** The dimension a chart/breakdown puts on its category axis. */\nexport function vizCategory(card: AnalyticsCardDef) {\n // A hidden dimension carries an id, not a label — an axis of UUIDs is not a\n // category axis, so it can never be the default.\n const dims = (card.query.dimensions ?? []).filter((d) => !d.hidden)\n if (card.viz.categoryKey) return dims.find((d) => d.key === card.viz.categoryKey) ?? dims[0]\n return dims[0]\n}\n\n/**\n * Chart rows with the category axis pre-formatted.\n *\n * recharts renders whatever string it is handed, so bucketed timestamps must be\n * humanised BEFORE they reach it — otherwise the x-axis reads\n * \"2026-08-01T00:00:00+00:00\".\n */\nexport function toChartData(\n rows: AnalyticsRow[],\n categoryKey: string,\n grain: AnalyticsGrain | undefined,\n locale = 'pt-BR',\n): Array<Record<string, string | number>> {\n return rows.map((row) => {\n const out: Record<string, string | number> = {}\n for (const [k, v] of Object.entries(row)) {\n if (k === categoryKey) continue\n out[k] = typeof v === 'number' ? v : num(v)\n }\n out[categoryKey] = grain\n ? formatBucket(row[categoryKey], grain, locale)\n : (row[categoryKey] == null || row[categoryKey] === '' ? '—' : String(row[categoryKey]))\n return out\n })\n}\n\n/** Sparkline series for a KPI: the headline measure across the time buckets. */\nexport function toSpark(result: AnalyticsResult | null, measureKey: string): number[] | undefined {\n if (!result?.rows?.length || result.rows.length < 2) return undefined\n return result.rows.map((row) => num(row[measureKey]))\n}\n","import type {\n AnalyticsCardDef, AnalyticsProvider, AnalyticsQueryState, AnalyticsResult,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Two round-trip savings, wrapped around any provider.\n//\n// 1. DE-DUPLICATION. Identical queries issued in the same tick share one\n// request: the report viewer renders the chart and the table from the SAME\n// card, and an overview can hold two cards over one query.\n//\n// 2. BATCHING. Cards fetch themselves — the right ownership (a tile added to a\n// pack must not require editing a page-level query) and the reason an\n// overview of twenty-two tiles, most also asking for a comparison window,\n// issued FORTY-ONE requests, and issued them all again on every change of\n// date range. Everything queued within one frame leaves as a single\n// `runMany`; a provider that cannot answer several at once is unaffected and\n// still gets N calls.\n//\n// Deliberately transport-agnostic and outside React: what to coalesce is a\n// property of the queries, not of the render, and keeping it here is what lets\n// it be tested without mounting twenty-two cards.\n// ---------------------------------------------------------------------------\n\n/**\n * How long a queued query waits for its neighbours before going out.\n *\n * Long enough to catch every card of one render, short enough that nobody\n * perceives it — the request it joins takes two orders of magnitude longer.\n */\nexport const BATCH_WINDOW_MS = 16\n\ninterface Pending {\n card: AnalyticsCardDef\n state: AnalyticsQueryState\n resolve: (result: AnalyticsResult) => void\n reject: (error: unknown) => void\n}\n\nexport interface BatchingProviderOptions {\n /** Coalescing window. Exposed for tests; production uses the default. */\n windowMs?: number\n /**\n * Part of every de-duplication key. The surface bumps it on ↻ so a refresh\n * is not served the in-flight promise it is trying to replace.\n */\n refreshToken?: number\n}\n\nexport function createBatchingProvider(\n provider: AnalyticsProvider,\n options: BatchingProviderOptions = {},\n): AnalyticsProvider {\n const windowMs = options.windowMs ?? BATCH_WINDOW_MS\n const inflight = new Map<string, Promise<AnalyticsResult>>()\n let queue: Pending[] = []\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const flush = () => {\n timer = null\n const batch = queue\n queue = []\n if (batch.length === 0) return\n\n const individually = () => {\n for (const p of batch) provider.run(p.card, p.state).then(p.resolve, p.reject)\n }\n\n // One card is not a batch — routing it through runMany would only add a\n // layer between it and the identical single request.\n if (batch.length === 1 || !provider.runMany) { individually(); return }\n\n // Guarded because the feature check above can LIE. Providers reach here\n // through createSafeDataProvider, whose Proxy answers every property with a\n // function, so `runMany` is truthy even where the underlying provider has\n // none — and the throw lands synchronously, before any promise exists to\n // reject. Falling back keeps such a provider working at N requests instead\n // of blanking the surface.\n let batchCall: Promise<Array<AnalyticsResult | Error>>\n try {\n batchCall = provider.runMany(batch.map(({ card, state }) => ({ card, state })))\n } catch {\n individually()\n return\n }\n\n batchCall.then(\n (results) => batch.forEach((p, i) => {\n const result = results[i]\n // A provider that returns fewer answers than questions has mismatched\n // the two, and resolving with `undefined` would render a card of zeroes\n // that looks like real data.\n if (!result) p.reject(new Error('analytics: batch returned no result for this card'))\n else if (result instanceof Error) p.reject(result)\n else p.resolve(result)\n }),\n (error: unknown) => batch.forEach((p) => p.reject(error)),\n )\n }\n\n return {\n run(card, state) {\n const key = JSON.stringify([card.id, state, options.refreshToken ?? 0])\n const existing = inflight.get(key)\n if (existing) return existing\n\n const promise = new Promise<AnalyticsResult>((resolve, reject) => {\n queue.push({ card, state, resolve, reject })\n // A timeout and not a microtask: React does not guarantee that every\n // card's effect lands in one synchronous flush, and a microtask firing\n // between two of them splits one dashboard into several batches.\n if (timer == null) timer = setTimeout(flush, windowMs)\n }).finally(() => {\n // Held only for the duration of the request: this is de-duplication,\n // not caching. Keeping results would mean a stale dashboard after a\n // write, which is a worse bug than an extra fetch.\n inflight.delete(key)\n })\n\n inflight.set(key, promise)\n return promise\n },\n\n // Passed through so a caller that already has a batch of its own (an export\n // of every card, say) still reaches the provider's own batching.\n runMany: provider.runMany ? (requests) => provider.runMany!(requests) : undefined,\n }\n}\n","import * as React from 'react'\nimport type {\n AnalyticsCardDef, AnalyticsProvider, AnalyticsQueryState, AnalyticsResult,\n AnalyticsCompare, AnalyticsDateRange, AnalyticsGrain, AnalyticsRow,\n} from '@fayz-ai/core'\nimport { comparisonRange, resolveRangePreset, autoGrain, type AnalyticsRangePreset } from './range'\nimport { resolveRatios, resolveRowRatios, errorMessage, isEngineMissing, type AnalyticsCurrency } from './derive'\nimport { createBatchingProvider } from './batch'\n\n// ---------------------------------------------------------------------------\n// One page-level state for every card on the surface.\n//\n// The range, the comparison and the filters belong to the PAGE, not to each\n// tile: the control bar at the top of the overview must move all fourteen cards\n// at once, and a report opened from a card has to inherit what the user was\n// looking at. Card-local state would mean fourteen date pickers disagreeing.\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsContextValue {\n provider: AnalyticsProvider\n currency: AnalyticsCurrency\n state: AnalyticsQueryState\n preset: AnalyticsRangePreset\n setPreset: (preset: AnalyticsRangePreset) => void\n setDateRange: (range: AnalyticsDateRange) => void\n setCompare: (compare: AnalyticsCompare) => void\n setFilter: (key: string, value: unknown) => void\n setFilters: (filters: Record<string, unknown>) => void\n clearFilters: () => void\n setPage: (page: number) => void\n setPageSize: (pageSize: number) => void\n setSort: (sortBy: string, sortDir: 'asc' | 'desc') => void\n setSearch: (search: string) => void\n /** Bumped to force every mounted card to refetch (the ↻ button). */\n refreshToken: number\n refresh: () => void\n /** Open a card as a full-page report. Absent ⇒ cards render no open affordance. */\n onOpenCard?: (card: AnalyticsCardDef) => void\n /** \"Created by\" shown on cards a pack did not attribute individually. */\n createdBy?: string\n}\n\nconst AnalyticsContext = React.createContext<AnalyticsContextValue | null>(null)\n\nexport function useAnalyticsContext(): AnalyticsContextValue {\n const ctx = React.useContext(AnalyticsContext)\n if (!ctx) throw new Error('useAnalyticsContext must be used inside <AnalyticsContextProvider>')\n return ctx\n}\n\n/** Non-throwing variant for primitives that may render outside a surface. */\nexport function useAnalyticsContextOptional(): AnalyticsContextValue | null {\n return React.useContext(AnalyticsContext)\n}\n\nexport interface AnalyticsContextProviderProps {\n provider: AnalyticsProvider\n currency?: AnalyticsCurrency\n defaultPreset?: AnalyticsRangePreset\n defaultCompare?: AnalyticsCompare\n defaultPageSize?: number\n onOpenCard?: (card: AnalyticsCardDef) => void\n createdBy?: string\n children: React.ReactNode\n}\n\nexport function AnalyticsContextProvider({\n provider, currency, defaultPreset = 'last_30_days', defaultCompare = 'previous_period',\n defaultPageSize = 50, onOpenCard, createdBy, children,\n}: AnalyticsContextProviderProps) {\n const [preset, setPresetState] = React.useState<AnalyticsRangePreset>(defaultPreset)\n const [refreshToken, setRefreshToken] = React.useState(0)\n const [state, setState] = React.useState<AnalyticsQueryState>(() => ({\n dateRange: resolveRangePreset(defaultPreset),\n compare: defaultCompare,\n filters: {},\n page: 1,\n pageSize: defaultPageSize,\n }))\n\n const setPreset = React.useCallback((next: AnalyticsRangePreset) => {\n setPresetState(next)\n if (next !== 'custom') {\n setState((s) => ({ ...s, dateRange: resolveRangePreset(next), page: 1 }))\n }\n }, [])\n\n const setDateRange = React.useCallback((dateRange: AnalyticsDateRange) => {\n setPresetState('custom')\n setState((s) => ({ ...s, dateRange, page: 1 }))\n }, [])\n\n const setCompare = React.useCallback((compare: AnalyticsCompare) => {\n setState((s) => ({ ...s, compare }))\n }, [])\n\n const setFilter = React.useCallback((key: string, value: unknown) => {\n setState((s) => {\n const filters = { ...s.filters }\n // An empty value REMOVES the filter rather than sending \"\" downstream,\n // which a provider would otherwise translate into `col = ''`.\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) delete filters[key]\n else filters[key] = value\n return { ...s, filters, page: 1 }\n })\n }, [])\n\n const setFilters = React.useCallback((filters: Record<string, unknown>) => {\n setState((s) => ({ ...s, filters, page: 1 }))\n }, [])\n\n const clearFilters = React.useCallback(() => {\n setState((s) => ({ ...s, filters: {}, page: 1 }))\n }, [])\n\n const setPage = React.useCallback((page: number) => {\n setState((s) => ({ ...s, page: Math.max(1, page) }))\n }, [])\n\n const setPageSize = React.useCallback((pageSize: number) => {\n // Changing page size while on page 7 lands you somewhere arbitrary, so the\n // pager resets — the user asked for \"show more\", not \"jump elsewhere\".\n setState((s) => ({ ...s, pageSize, page: 1 }))\n }, [])\n\n const setSort = React.useCallback((sortBy: string, sortDir: 'asc' | 'desc') => {\n setState((s) => ({ ...s, sortBy, sortDir, page: 1 }))\n }, [])\n\n const setSearch = React.useCallback((search: string) => {\n setState((s) => ({ ...s, search, page: 1 }))\n }, [])\n\n const refresh = React.useCallback(() => setRefreshToken((t) => t + 1), [])\n\n // Coalescing lives in batch.ts, not here: what to merge is a property of the\n // queries, not of the render.\n const batched = React.useMemo<AnalyticsProvider>(\n () => createBatchingProvider(provider, { refreshToken }),\n [provider, refreshToken],\n )\n\n const value = React.useMemo<AnalyticsContextValue>(() => ({\n provider: batched,\n currency: currency ?? { code: 'BRL', locale: 'pt-BR', symbol: 'R$' },\n state, preset, setPreset, setDateRange, setCompare, setFilter, setFilters, clearFilters,\n setPage, setPageSize, setSort, setSearch,\n refreshToken, refresh, onOpenCard, createdBy,\n }), [batched, currency, state, preset, setPreset, setDateRange, setCompare, setFilter,\n setFilters, clearFilters, setPage, setPageSize, setSort, setSearch,\n refreshToken, refresh, onOpenCard, createdBy])\n\n return <AnalyticsContext.Provider value={value}>{children}</AnalyticsContext.Provider>\n}\n\n// ---------------------------------------------------------------------------\n// Per-card fetching\n// ---------------------------------------------------------------------------\n\nexport interface UseAnalyticsCardResult {\n result: AnalyticsResult | null\n /** Rollup with ratio measures resolved. Empty object until loaded. */\n summary: Record<string, number>\n /** Same for the comparison window, or null when not comparing. */\n previousSummary: Record<string, number> | null\n loading: boolean\n error: string | null\n /** The failure is a missing migration, not a bad card. */\n engineMissing: boolean\n refetch: () => void\n}\n\n/** Resolve 'auto' grains against the active range before the query is built. */\nfunction withResolvedGrain(card: AnalyticsCardDef, range: AnalyticsDateRange): AnalyticsCardDef {\n const dims = card.query.dimensions\n if (!dims?.some((d) => d.grain === 'auto')) return card\n const grain: AnalyticsGrain = autoGrain(range)\n return {\n ...card,\n query: {\n ...card.query,\n dimensions: dims.map((d) => (d.grain === 'auto' ? { ...d, grain } : d)),\n },\n }\n}\n\nexport function useAnalyticsCard(\n card: AnalyticsCardDef,\n options?: { stateOverride?: Partial<AnalyticsQueryState>; enabled?: boolean },\n): UseAnalyticsCardResult {\n const { provider, state, refreshToken } = useAnalyticsContext()\n const [result, setResult] = React.useState<AnalyticsResult | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [engineMissing, setEngineMissing] = React.useState(false)\n\n const enabled = (options?.enabled ?? true) && card.available !== false\n const merged = React.useMemo<AnalyticsQueryState>(\n () => ({ ...state, ...options?.stateOverride }),\n [state, options?.stateOverride],\n )\n const resolved = React.useMemo(() => withResolvedGrain(card, merged.dateRange), [card, merged.dateRange])\n\n // Serialized query identity — the effect must rerun when the QUERY changes,\n // not when React hands us a new object with identical contents.\n const key = React.useMemo(\n () => JSON.stringify([resolved.id, merged, refreshToken]),\n [resolved.id, merged, refreshToken],\n )\n\n React.useEffect(() => {\n if (!enabled) { setResult(null); return }\n let cancelled = false\n setLoading(true)\n setError(null)\n setEngineMissing(false)\n\n const comparison = resolved.compare ? comparisonRange(merged.dateRange, merged.compare) : null\n\n Promise.all([\n provider.run(resolved, merged),\n comparison\n ? provider.run(resolved, { ...merged, dateRange: comparison }).catch(() => null)\n : Promise.resolve(null),\n ])\n .then(([current, previous]) => {\n if (cancelled) return\n setResult({\n ...current,\n rows: resolveRowRatios(current.rows, resolved.query.measures),\n previous: previous\n ? { rows: previous.rows, summary: previous.summary }\n : undefined,\n })\n })\n .catch((err: unknown) => {\n if (cancelled) return\n setResult(null)\n setError(errorMessage(err))\n setEngineMissing(isEngineMissing(err))\n })\n .finally(() => { if (!cancelled) setLoading(false) })\n\n // The comparison fetch is allowed to fail on its own (.catch above): a\n // missing previous window costs a trend chip, it must not blank the card.\n return () => { cancelled = true }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, enabled, provider])\n\n const refetch = React.useCallback(() => {\n setResult(null)\n setLoading(true)\n }, [])\n\n const summary = React.useMemo(\n () => resolveRatios(result?.summary, resolved.query.measures),\n [result?.summary, resolved.query.measures],\n )\n const previousSummary = React.useMemo(\n () => (result?.previous ? resolveRatios(result.previous.summary, resolved.query.measures) : null),\n [result?.previous, resolved.query.measures],\n )\n\n return { result, summary, previousSummary, loading, error, engineMissing, refetch }\n}\n\n/**\n * Fetch EVERY row the card's current query returns, not just the page on\n * screen — what an export needs.\n *\n * The viewer paginates at 50, and a spreadsheet holding 50 of 4,000 leads is\n * worse than no spreadsheet: nothing on the file says it is a fragment, so it\n * gets mailed to an accountant as if it were the whole month. Pages through the\n * same provider with the same filters, the same range and the same sort, so the\n * file and the screen answer the same question.\n *\n * `compare` is dropped: the previous window costs a round trip and never lands\n * in the file.\n */\nexport function useAnalyticsCardRows(\n card: AnalyticsCardDef,\n): (limit?: number) => Promise<AnalyticsRow[]> {\n const { provider, state } = useAnalyticsContext()\n return React.useCallback(async (limit = EXPORT_ROW_CAP) => {\n const resolved = withResolvedGrain(card, state.dateRange)\n const rows: AnalyticsRow[] = []\n for (let page = 1; rows.length < limit; page++) {\n const res = await provider.run(resolved, {\n ...state, compare: 'none', page, pageSize: EXPORT_PAGE_SIZE,\n })\n rows.push(...resolveRowRatios(res.rows, resolved.query.measures))\n if (res.rows.length < EXPORT_PAGE_SIZE || rows.length >= (res.total ?? rows.length)) break\n }\n return rows.slice(0, limit)\n }, [provider, state, card])\n}\n\n/** One round trip per thousand rows — big enough that most exports are one\n * call, small enough that a mistyped filter does not pull a whole table. */\nconst EXPORT_PAGE_SIZE = 1000\n/** Hard stop. Past this a spreadsheet is the wrong tool and the browser says so\n * by freezing; the file is truncated rather than the tab lost. */\nconst EXPORT_ROW_CAP = 20000\n","import * as React from 'react'\nimport { ArrowUpRight, Info, TrendingUp, TrendingDown, Construction, DatabaseZap, AlertCircle } from 'lucide-react'\nimport type {\n AnalyticsCardDef, AnalyticsColumnDef, AnalyticsFormat, AnalyticsMeasure, AnalyticsRow,\n} from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { Card, CardContent } from '../primitives/card'\nimport { Hint } from '../primitives/hint'\nimport { Skeleton } from '../primitives/skeleton'\nimport { ChartWidget } from '../dashboard/ChartWidget'\nimport { Sparkline } from '../dashboard/Sparkline'\nimport type { ChartSeries, ChartType } from '../dashboard/types'\nimport { useAnalyticsContext, useAnalyticsCard } from './context'\nimport {\n formatAnalyticsValue, deltaPercent, trendOf, toBreakdown, toChartData,\n toSpark, vizMeasures, vizCategory, num, type AnalyticsCurrency,\n} from './derive'\n\n// ---------------------------------------------------------------------------\n// The card — one AnalyticsCardDef, rendered at tile size.\n//\n// Every viz shares the same chrome (title, the ⓘ that explains what the number\n// means, the ↗ that opens the same definition as a full report) because they\n// are the same object. The arrow is not navigation between two features; it is\n// a zoom level.\n// ---------------------------------------------------------------------------\n\nconst CHART_TYPES: Record<string, ChartType> = { line: 'line', bar: 'bar', area: 'area', donut: 'pie' }\n\nexport interface AnalyticsCardProps {\n card: AnalyticsCardDef\n className?: string\n /** Hide the ↗ affordance (the viewer renders the same card full-size). */\n hideOpen?: boolean\n}\n\nfunction CardChrome({\n card, hideOpen, children, dense,\n}: { card: AnalyticsCardDef; hideOpen?: boolean; children: React.ReactNode; dense?: boolean }) {\n const { onOpenCard } = useAnalyticsContext()\n const canOpen = Boolean(onOpenCard) && !hideOpen\n\n return (\n <Card className=\"group flex h-full flex-col\">\n <div className={cn('flex items-start justify-between gap-2', dense ? 'px-4 pt-3' : 'px-5 pt-4')}>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium text-muted-foreground\">{card.name}</span>\n {card.description ? (\n <Hint label={card.description} side=\"top\">\n <span\n tabIndex={0}\n role=\"note\"\n aria-label={card.description}\n className=\"shrink-0 text-muted-foreground/60 hover:text-muted-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </span>\n </Hint>\n ) : null}\n </div>\n {canOpen ? (\n <Hint label=\"Open as report\" side=\"top\">\n <button\n type=\"button\"\n onClick={() => onOpenCard?.(card)}\n aria-label={`Open ${card.name} as a report`}\n className=\"shrink-0 rounded-md p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring group-hover:opacity-100\"\n >\n <ArrowUpRight className=\"h-4 w-4\" />\n </button>\n </Hint>\n ) : null}\n </div>\n <CardContent className={cn('flex-1', dense ? 'p-4 pt-2' : 'p-5 pt-2')}>{children}</CardContent>\n </Card>\n )\n}\n\nfunction TrendChip({ current, previous }: { current: number; previous: number | null | undefined }) {\n const delta = deltaPercent(current, previous)\n const trend = trendOf(current, previous)\n // No previous window, or a previous of zero: there is no honest percentage to\n // print, so the card shows a dash rather than inventing \"+100%\".\n if (!trend || trend === 'neutral' || delta == null) {\n return <span className=\"text-xs text-muted-foreground\">—</span>\n }\n const Icon = trend === 'up' ? TrendingUp : TrendingDown\n return (\n <span className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n trend === 'up' ? 'text-emerald-600' : 'text-rose-600',\n )}>\n <Icon className=\"h-3 w-3\" />\n {`${delta > 0 ? '+' : ''}${delta.toFixed(1)}%`}\n </span>\n )\n}\n\nfunction BreakdownList({\n rows, categoryKey, measure, currency, limit,\n}: {\n rows: AnalyticsRow[]; categoryKey: string; measure: AnalyticsMeasure\n currency: AnalyticsCurrency; limit?: number\n}) {\n const items = toBreakdown(rows, categoryKey, measure.key, measure.format, currency, limit)\n if (items.length === 0) return <EmptyState />\n return (\n <ul className=\"space-y-2.5\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"flex items-center gap-3 text-sm\">\n <span className=\"w-2/5 truncate text-muted-foreground\" title={item.label}>{item.label}</span>\n <span className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\" role=\"presentation\">\n <span\n className=\"block h-full rounded-full bg-[hsl(var(--chart-1,var(--info)))]\"\n style={{ width: `${Math.max(item.share * 100, item.value === 0 ? 0 : 2)}%` }}\n />\n </span>\n <span className=\"shrink-0 tabular-nums font-medium\">{item.formatted}</span>\n </li>\n ))}\n </ul>\n )\n}\n\n/**\n * A column's type vocabulary is wider than the value formatter's: 'person',\n * 'email', 'select' and 'boolean' have no numeric shape, so they fall back to\n * text rather than to nothing. `undefined` would be worse than imprecise — an\n * unformatted NULL takes the numeric branch and prints \"0\", so a customer with\n * no name recorded showed up in the table as a zero.\n */\nconst VALUE_FORMATS = new Set<string>(['number', 'currency', 'percent', 'duration', 'date', 'text'])\nfunction columnFormat(type: AnalyticsColumnDef['type']): AnalyticsFormat {\n return VALUE_FORMATS.has(type) ? (type as AnalyticsFormat) : 'text'\n}\n\nfunction MiniTable({\n rows, card, currency, limit,\n}: { rows: AnalyticsRow[]; card: AnalyticsCardDef; currency: AnalyticsCurrency; limit?: number }) {\n // Hidden dimensions are grouped on, not shown: the tile would otherwise lead\n // with a column of UUIDs.\n const dims = (card.query.dimensions ?? []).filter((d) => !d.hidden)\n const measures = vizMeasures(card)\n const aggregated = [\n ...dims.map((d) => ({ key: d.key, label: d.label, format: d.format, align: 'left' as const })),\n ...measures.map((m) => ({ key: m.key, label: m.label, format: m.format, align: 'right' as const })),\n ]\n // A DETAIL card has neither dimensions nor measures — it reads the view row by\n // row, and `card.columns` is the only thing that says what a row looks like.\n // Building the header from dimensions alone left such a card with zero columns:\n // a table of empty rows under a title, which reads as \"no data\" while the\n // request came back 200 with everything in it.\n const cols = aggregated.length > 0\n ? aggregated\n : (card.columns ?? [])\n .filter((c) => c.visible !== false)\n .map((c) => ({\n key: c.key,\n label: c.label,\n format: columnFormat(c.type),\n align: c.align === 'right' ? ('right' as const) : ('left' as const),\n }))\n const shown = limit ? rows.slice(0, limit) : rows\n if (shown.length === 0 || cols.length === 0) return <EmptyState />\n\n return (\n <div className=\"-mx-1 overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b text-xs text-muted-foreground\">\n {cols.map((c) => (\n <th key={c.key} className={cn('px-1 pb-2 font-medium', c.align === 'right' ? 'text-right' : 'text-left')}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {shown.map((row, i) => (\n <tr key={i} className=\"border-b border-border/50 last:border-0\">\n {cols.map((c) => (\n <td key={c.key} className={cn('px-1 py-2', c.align === 'right' ? 'text-right tabular-nums' : 'truncate')}>\n {formatAnalyticsValue(row[c.key], c.format, currency)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction EmptyState({ label = 'No data for this date range' }: { label?: string }) {\n return (\n <div className=\"flex h-full min-h-[80px] items-center justify-center text-center text-sm text-muted-foreground\">\n {label}\n </div>\n )\n}\n\nexport function AnalyticsCard({ card, className, hideOpen }: AnalyticsCardProps) {\n const { currency } = useAnalyticsContext()\n const { result, summary, previousSummary, loading, error, engineMissing } = useAnalyticsCard(card)\n const measures = vizMeasures(card)\n const category = vizCategory(card)\n const rows = result?.rows ?? []\n\n const body = (() => {\n if (card.available === false) {\n return (\n <div className=\"flex h-full min-h-[80px] flex-col items-center justify-center gap-2 text-center\">\n <Construction className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-xs text-muted-foreground\">Not connected yet</p>\n </div>\n )\n }\n if (loading && !result) {\n return (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-7 w-24\" />\n <Skeleton className=\"h-4 w-16\" />\n </div>\n )\n }\n if (engineMissing) {\n // A missing migration is not a broken card, and saying \"error\" here sends\n // someone hunting through a card definition that is perfectly fine.\n return (\n <div className=\"flex h-full min-h-[80px] flex-col items-center justify-center gap-1.5 text-center\">\n <DatabaseZap className=\"h-5 w-5 text-muted-foreground\" />\n <p className=\"text-xs font-medium\">Analytics engine not installed</p>\n <p className=\"text-[11px] text-muted-foreground\">Run migration 0039 on this project.</p>\n </div>\n )\n }\n if (error) {\n return (\n <div className=\"flex h-full min-h-[60px] items-start gap-1.5 text-xs text-destructive\">\n <AlertCircle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"break-words\">{error}</span>\n </div>\n )\n }\n\n switch (card.viz.type) {\n case 'kpi': {\n const measure = measures[0]\n if (!measure) return <EmptyState />\n const value = num(summary[measure.key])\n const previous = previousSummary ? num(previousSummary[measure.key]) : null\n const spark = card.viz.spark ? toSpark(result, measure.key) : undefined\n return (\n <div className=\"flex h-full flex-col justify-between gap-2\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-2xl font-semibold tracking-tight tabular-nums\">\n {formatAnalyticsValue(value, measure.format, currency, { compact: true })}\n </span>\n <TrendChip current={value} previous={previous} />\n </div>\n {spark ? (\n <Sparkline\n data={spark} color=\"hsl(var(--chart-1,var(--info)))\"\n width={120} height={28} padding={2} className=\"h-7 w-full\"\n />\n ) : null}\n </div>\n )\n }\n\n case 'breakdown': {\n const measure = measures[0]\n if (!measure || !category) return <EmptyState />\n return (\n <BreakdownList\n rows={rows} categoryKey={category.key} measure={measure}\n currency={currency} limit={card.viz.limit}\n />\n )\n }\n\n case 'table':\n return <MiniTable rows={rows} card={card} currency={currency} limit={card.viz.limit ?? 5} />\n\n case 'funnel': {\n // A funnel is a breakdown whose bars are shares of the FIRST step, so\n // each stage reads as \"of everyone who started, this many got here\".\n const measure = measures[0]\n if (!measure || !category) return <EmptyState />\n const first = num(rows[0]?.[measure.key]) || 1\n return (\n <ul className=\"space-y-2.5\">\n {rows.map((row, i) => {\n const value = num(row[measure.key])\n return (\n <li key={i} className=\"text-sm\">\n <div className=\"mb-1 flex items-baseline justify-between gap-2\">\n <span className=\"truncate text-muted-foreground\">{String(row[category.key] ?? '—')}</span>\n <span className=\"shrink-0 tabular-nums font-medium\">\n {formatAnalyticsValue(value, measure.format, currency)}\n <span className=\"ml-1.5 text-xs text-muted-foreground\">\n {((value / first) * 100).toFixed(0)}%\n </span>\n </span>\n </div>\n <span className=\"block h-1.5 overflow-hidden rounded-full bg-muted\">\n <span className=\"block h-full rounded-full bg-[hsl(var(--chart-1,var(--info)))]\" style={{ width: `${(value / first) * 100}%` }} />\n </span>\n </li>\n )\n })}\n </ul>\n )\n }\n\n default: {\n if (rows.length === 0) return <EmptyState />\n if (!category) return <EmptyState />\n const chartType = CHART_TYPES[card.viz.type] ?? 'line'\n const data = toChartData(rows, category.key, category.grain, currency.locale)\n const series: ChartSeries[] = measures.map((m) => ({ dataKey: m.key, label: m.label }))\n return (\n <ChartWidget\n type={chartType}\n data={data}\n series={series}\n categoryKey={category.key}\n height={card.viz.height ?? 200}\n className=\"border-0 bg-transparent shadow-none [&>div]:p-0\"\n />\n )\n }\n }\n })()\n\n const dense = card.viz.type === 'kpi'\n return (\n <div className={className}>\n <CardChrome card={card} hideOpen={hideOpen} dense={dense}>{body}</CardChrome>\n </div>\n )\n}\n","import * as React from 'react'\nimport type { AnalyticsCardDef, AnalyticsFilterDef } from '@fayz-ai/core'\nimport { DashboardGrid } from '../dashboard/DashboardGrid'\nimport { AnalyticsCard } from './AnalyticsCard'\n\n// ---------------------------------------------------------------------------\n// The overview grid. Reuses DashboardGrid rather than growing a second\n// four-column layout that would drift out of alignment with the app home.\n// ---------------------------------------------------------------------------\n\n/** Default span by viz: a KPI is a quarter, a chart a half, a table a full row. */\nfunction defaultSpan(card: AnalyticsCardDef): 1 | 2 | 3 | 4 {\n if (card.dashboard?.span) return card.dashboard.span\n switch (card.viz.type) {\n case 'kpi': return 1\n case 'table': return 4\n default: return 2\n }\n}\n\nexport interface AnalyticsGridProps {\n cards: AnalyticsCardDef[]\n className?: string\n}\n\nexport function AnalyticsGrid({ cards, className }: AnalyticsGridProps) {\n const items = React.useMemo(\n () => cards.map((card) => ({\n id: card.id,\n span: defaultSpan(card),\n node: <AnalyticsCard card={card} />,\n })),\n [cards],\n )\n return <DashboardGrid items={items} className={className} />\n}\n\n/**\n * Every filter offered by the cards on screen, de-duplicated by key.\n *\n * The control bar shows the union rather than the intersection: a filter that\n * only narrows three of fourteen cards is still worth offering, and hiding it\n * until every card supports it would leave the picker permanently empty.\n */\nexport function collectFilters(cards: AnalyticsCardDef[]): AnalyticsFilterDef[] {\n const byKey = new Map<string, AnalyticsFilterDef>()\n for (const card of cards) {\n for (const filter of card.query.filters ?? []) {\n if (!byKey.has(filter.key)) byKey.set(filter.key, filter)\n }\n }\n return [...byKey.values()]\n}\n","import * as React from 'react'\nimport { Check, GitCompareArrows, SlidersHorizontal, Search, ChevronRight, X } from 'lucide-react'\nimport type { AnalyticsFilterDef, AnalyticsFilterOption } from '@fayz-ai/core'\nimport { useTranslation, getCurrentLocale } from '@fayz-ai/core'\nimport { cn } from '../lib/cn'\nimport { Button } from '../primitives/button'\nimport { Input } from '../primitives/input'\nimport { DatePicker } from '../primitives/date-picker'\nimport { Popover, PopoverTrigger, PopoverContent } from '../primitives/popover'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownSeparator } from '../primitives/dropdown'\nimport { PageToolbar, RangeControl, ToolbarButton } from '../primitives/page-toolbar'\nimport { useAnalyticsContext } from './context'\nimport { parseDay, type AnalyticsRangePreset } from './range'\n\n// ---------------------------------------------------------------------------\n// The one control bar every analytics surface shares.\n//\n// Range, comparison and filters sit here rather than on each card because they\n// describe the QUESTION, not the chart: changing \"last 7 days\" has to move\n// everything on screen at once, or two tiles end up answering about different\n// weeks and the page silently lies.\n//\n// Chrome is deliberately the same 26px toolbar the dashboard uses (Button `sm`,\n// SegmentedControl, DatePicker `toolbar`) — this bar sits above the very same\n// card grid as the app home, and a taller, lighter-weight row of its own read\n// as a different product bolted on top.\n// ---------------------------------------------------------------------------\n\nconst PRESETS: AnalyticsRangePreset[] = [\n 'today', 'yesterday', 'last_7_days', 'last_30_days', 'last_90_days',\n 'this_month', 'last_month', 'this_quarter', 'this_year',\n]\n\nconst COMPARE_OPTIONS = ['previous_period', 'previous_year', 'none'] as const\n\n/** \"15 jul – 13 ago\" — the window the numbers below actually cover. */\nfunction formatSpan(from: string, to: string, locale: string): string {\n const opts: Intl.DateTimeFormatOptions = { day: '2-digit', month: 'short' }\n const a = parseDay(from)\n const b = parseDay(to)\n const fmt = (d: Date) => d.toLocaleDateString(locale, {\n ...opts,\n // The year only earns its space when the range leaves the current one.\n ...(d.getFullYear() === new Date().getFullYear() ? {} : { year: 'numeric' }),\n })\n return from === to ? fmt(a) : `${fmt(a)} – ${fmt(b)}`\n}\n\n// ---------------------------------------------------------------------------\n// Filter picker — categorized, searchable, staged behind Apply.\n// ---------------------------------------------------------------------------\n\nfunction useFilterOptions(filter: AnalyticsFilterDef): AnalyticsFilterOption[] {\n const [options, setOptions] = React.useState<AnalyticsFilterOption[]>(\n Array.isArray(filter.options) ? filter.options : [],\n )\n React.useEffect(() => {\n if (typeof filter.options !== 'function') {\n setOptions(Array.isArray(filter.options) ? filter.options : [])\n return\n }\n let cancelled = false\n void filter.options().then((next) => { if (!cancelled) setOptions(next) }).catch(() => {})\n return () => { cancelled = true }\n }, [filter.options])\n return options\n}\n\nfunction FilterValues({\n filter, draft, onChange,\n}: { filter: AnalyticsFilterDef; draft: Record<string, unknown>; onChange: (key: string, value: unknown) => void }) {\n const t = useTranslation()\n const options = useFilterOptions(filter)\n const current = draft[filter.key]\n\n if (filter.type === 'text' || filter.type === 'number') {\n return (\n <Input\n type={filter.type === 'number' ? 'number' : 'text'}\n value={current == null ? '' : String(current)}\n placeholder={filter.placeholder}\n onChange={(e) => onChange(filter.key, e.target.value)}\n className=\"h-8 text-sm\"\n />\n )\n }\n\n if (filter.type === 'boolean') {\n return (\n <div className=\"space-y-1\">\n {[{ label: t('common.yes'), value: 'true' }, { label: t('common.no'), value: 'false' }].map((o) => (\n <label key={o.value} className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted\">\n <input\n type=\"radio\"\n name={filter.key}\n checked={String(current) === o.value}\n onChange={() => onChange(filter.key, o.value)}\n className=\"h-3.5 w-3.5\"\n />\n {o.label}\n </label>\n ))}\n </div>\n )\n }\n\n const multi = filter.type === 'multiselect'\n const selected = new Set(Array.isArray(current) ? current.map(String) : current != null ? [String(current)] : [])\n\n if (options.length === 0) {\n return <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">{t('analytics.filters.noOptions')}</p>\n }\n\n return (\n <div className=\"max-h-56 space-y-0.5 overflow-y-auto\">\n {options.map((o) => (\n <label key={o.value} className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-muted\">\n <input\n type={multi ? 'checkbox' : 'radio'}\n name={filter.key}\n checked={selected.has(o.value)}\n onChange={() => {\n if (!multi) { onChange(filter.key, selected.has(o.value) ? undefined : o.value); return }\n const next = new Set(selected)\n if (next.has(o.value)) next.delete(o.value)\n else next.add(o.value)\n onChange(filter.key, [...next])\n }}\n className=\"h-3.5 w-3.5\"\n />\n <span className=\"truncate\">{o.label}</span>\n </label>\n ))}\n </div>\n )\n}\n\nexport interface AnalyticsFilterPickerProps {\n /** Every filter offered on this surface, from the cards in view. */\n filters: AnalyticsFilterDef[]\n}\n\nexport function AnalyticsFilterPicker({ filters }: AnalyticsFilterPickerProps) {\n const t = useTranslation()\n const { state, setFilters, clearFilters } = useAnalyticsContext()\n const [open, setOpen] = React.useState(false)\n const [search, setSearch] = React.useState('')\n const [openGroup, setOpenGroup] = React.useState<string | null>(null)\n // Staged: edits do not hit the query until Apply, so a five-filter change is\n // one refetch instead of five — and Clear can be abandoned by closing.\n const [draft, setDraft] = React.useState<Record<string, unknown>>(state.filters)\n\n React.useEffect(() => { if (open) setDraft(state.filters) }, [open, state.filters])\n\n const groups = React.useMemo(() => {\n const q = search.trim().toLowerCase()\n const matching = q ? filters.filter((f) => f.label.toLowerCase().includes(q)) : filters\n const map = new Map<string, AnalyticsFilterDef[]>()\n for (const f of matching) {\n const key = f.group ?? t('analytics.filters.general')\n map.set(key, [...(map.get(key) ?? []), f])\n }\n return [...map.entries()].sort(([a], [b]) => a.localeCompare(b))\n }, [filters, search, t])\n\n const activeCount = Object.keys(state.filters).length\n if (filters.length === 0) return null\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <ToolbarButton icon={SlidersHorizontal} caret={false}>\n {t('analytics.filters')}\n {activeCount > 0 ? (\n <span className=\"ml-0.5 rounded-full bg-primary px-1.5 text-[10px] font-semibold text-primary-foreground\">\n {activeCount}\n </span>\n ) : null}\n </ToolbarButton>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-80 p-0\">\n <div className=\"border-b p-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('analytics.filters.search')}\n className=\"h-8 pl-8 text-sm\"\n />\n </div>\n </div>\n\n <div className=\"max-h-80 overflow-y-auto p-1\">\n {groups.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-sm text-muted-foreground\">{t('analytics.filters.none')}</p>\n ) : (\n groups.map(([group, groupFilters]) => (\n <div key={group}>\n <button\n type=\"button\"\n onClick={() => setOpenGroup((g) => (g === group ? null : group))}\n aria-expanded={openGroup === group}\n className=\"flex w-full items-center justify-between rounded-md px-2 py-2 text-sm hover:bg-muted\"\n >\n <span className=\"font-medium\">{group}</span>\n <ChevronRight className={cn('h-3.5 w-3.5 text-muted-foreground transition-transform', openGroup === group && 'rotate-90')} />\n </button>\n {openGroup === group ? (\n <div className=\"space-y-3 px-2 pb-3 pt-1\">\n {groupFilters.map((f) => (\n <div key={f.key}>\n <p className=\"mb-1 text-xs font-medium text-muted-foreground\">{f.label}</p>\n <FilterValues\n filter={f}\n draft={draft}\n onChange={(key, value) => setDraft((d) => {\n const next = { ...d }\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) delete next[key]\n else next[key] = value\n return next\n })}\n />\n </div>\n ))}\n </div>\n ) : null}\n </div>\n ))\n )}\n </div>\n\n <div className=\"flex items-center justify-between gap-2 border-t p-2\">\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => { setDraft({}); clearFilters(); setOpen(false) }}\n >\n {t('analytics.filters.clear')}\n </Button>\n <Button size=\"sm\" onClick={() => { setFilters(draft); setOpen(false) }}>\n {t('analytics.filters.apply')}\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Range control — presets, and the custom window they cannot express\n// ---------------------------------------------------------------------------\n\nfunction AnalyticsRangeControl() {\n const t = useTranslation()\n const locale = getCurrentLocale()\n const { state, preset, setPreset, setDateRange } = useAnalyticsContext()\n const custom = preset === 'custom'\n const span = formatSpan(state.dateRange.from, state.dateRange.to, locale)\n\n // O MESMO controle de período que o dashboard usa (RangeControl); o que é\n // próprio daqui — a janela resolvida e o par de seletores do personalizado —\n // entra pelos vãos dele.\n return (\n <RangeControl\n options={PRESETS.map((p) => ({ value: p, label: t(`analytics.range.${p}`) }))}\n value={preset}\n onChange={(p) => setPreset(p as AnalyticsRangePreset)}\n label={custom ? t('analytics.range.custom') : undefined}\n // The resolved window, always. A preset name alone leaves the merchant\n // guessing whether \"this month\" already includes today.\n span={custom ? undefined : span}\n extra={\n <>\n <DropdownSeparator />\n {/* Re-committing the range the user is already on is what flips the\n bar into custom mode: `setDateRange` is the only path that sets the\n preset to 'custom', so opening the two pickers cannot be done by\n flipping a flag without also telling the query state. */}\n <DropdownItem onSelect={() => setDateRange({ ...state.dateRange })}>\n {t('analytics.range.custom')}\n {custom ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n </>\n }\n >\n {custom ? (\n <>\n <DatePicker\n variant=\"toolbar\"\n value={state.dateRange.from}\n // A start after the end is not a range, it is an empty answer the\n // page would render as \"no data\". Dragging one past the other moves\n // the other with it instead.\n onChange={(from) => setDateRange({\n from,\n to: from > state.dateRange.to ? from : state.dateRange.to,\n })}\n />\n <span className=\"text-xs text-muted-foreground\">–</span>\n <DatePicker\n variant=\"toolbar\"\n value={state.dateRange.to}\n onChange={(to) => setDateRange({\n from: to < state.dateRange.from ? to : state.dateRange.from,\n to,\n })}\n />\n </>\n ) : null}\n </RangeControl>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The bar\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsControlsProps {\n /** Filters offered in the picker — usually the union across visible cards. */\n filters?: AnalyticsFilterDef[]\n /** Hide the comparison control on surfaces where it means nothing. */\n showCompare?: boolean\n /** Right-aligned extras (e.g. Export, New report). */\n actions?: React.ReactNode\n /** Which cards/widgets show — same slot the dashboard fills. */\n customize?: React.ReactNode\n /** Solta a barra do topo (impressão, dentro de um modal). */\n sticky?: boolean\n className?: string\n}\n\nexport function AnalyticsControls({ filters = [], showCompare = true, actions, customize, sticky, className }: AnalyticsControlsProps) {\n const t = useTranslation()\n const { state, setCompare, refresh } = useAnalyticsContext()\n const compare = state.compare ?? 'none'\n\n const activeFilters = Object.entries(state.filters)\n const filterLabel = (key: string) => filters.find((f) => f.key === key)?.label ?? key\n\n return (\n // Sem cromo próprio: a superfície, o encosto à direita e o comportamento\n // grudado no topo vêm de PageToolbar — a mesma barra do dashboard. Aqui só\n // se diz O QUE ela carrega.\n <PageToolbar\n className={className}\n sticky={sticky}\n moveLabel={t('analytics.moveBar')}\n range={<AnalyticsRangeControl />}\n filters={\n <>\n {showCompare ? (\n <Dropdown>\n <DropdownTrigger asChild>\n <ToolbarButton\n icon={GitCompareArrows}\n // A comparison that is OFF should not look like a set filter; a\n // comparison that is on is what every trend chip on the page is\n // measured against, and worth reading at a glance.\n className={compare === 'none' ? 'text-muted-foreground' : undefined}\n >\n {t(`analytics.compare.${compare}`)}\n </ToolbarButton>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-48\">\n {COMPARE_OPTIONS.map((c) => (\n <DropdownItem key={c} onSelect={() => setCompare(c)}>\n {t(`analytics.compare.${c}`)}\n {compare === c ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n ))}\n </DropdownContent>\n </Dropdown>\n ) : null}\n <AnalyticsFilterPicker filters={filters} />\n </>\n }\n /* Applied filters stay visible as removable chips: a filter you cannot\n see is a filter you forget you set, and every number below is wrong in\n a way the page never explains. */\n chips={activeFilters.map(([key, value]) => (\n <ActiveFilterChip key={key} label={filterLabel(key)} value={value} filterKey={key} />\n ))}\n customize={customize}\n actions={actions}\n onRefresh={refresh}\n refreshLabel={t('analytics.refresh')}\n />\n )\n}\n\nfunction ActiveFilterChip({ label, value, filterKey }: { label: string; value: unknown; filterKey: string }) {\n const t = useTranslation()\n const { setFilter } = useAnalyticsContext()\n // A single-valued filter shows the value; a multiselect shows how many, since\n // six statuses spelled out push every other chip off the row.\n const text = Array.isArray(value)\n ? (value.length === 1 ? String(value[0]) : t('analytics.filters.selected', { count: value.length }))\n : String(value)\n return (\n <span className=\"inline-flex h-[26px] shrink-0 items-center gap-1 rounded-full border border-primary/30 bg-primary/10 py-1 pl-2.5 pr-1 text-xs font-medium text-primary\">\n <span className=\"opacity-70\">{label}:</span>\n <span className=\"max-w-[10rem] truncate\">{text}</span>\n <button\n type=\"button\"\n onClick={() => setFilter(filterKey, undefined)}\n aria-label={`${t('analytics.filters.remove')}: ${label}`}\n className=\"rounded-full p-0.5 transition-colors hover:bg-primary/20\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n )\n}\n","import { create } from 'zustand'\nimport type { TourDef, TourStopDef } from './types'\n\n/**\n * The running tour.\n *\n * A store rather than a provider because everything that starts a tour is\n * somewhere else: a checklist item in the rail, the agent's tool executor, a\n * \"show me how\" link inside an empty state. None of them share a React parent\n * with the overlay, and threading a callback through the shell to reach them\n * would put the tour in the shell's props forever.\n */\n\n/** Set by the host once — the tour cannot know an app's router. */\nlet navigator: ((path: string) => void) | undefined\nexport function setTourNavigator(fn: ((path: string) => void) | undefined): void {\n navigator = fn\n}\nexport function getTourNavigator(): ((path: string) => void) | undefined {\n return navigator\n}\n\nexport interface TourState {\n tour: TourDef | null\n index: number\n /** Why the last tour ended — read by whoever started it (the agent reports back). */\n lastOutcome: { tourId: string; completed: boolean } | null\n start: (tour: TourDef) => void\n next: () => void\n prev: () => void\n goTo: (index: number) => void\n /** `completed` distinguishes finishing from skipping; both close the overlay. */\n stop: (completed?: boolean) => void\n}\n\nexport const useTourStore = create<TourState>((set, get) => ({\n tour: null,\n index: 0,\n lastOutcome: null,\n\n start: (tour) => {\n if (!tour.stops.length) return\n set({ tour, index: 0, lastOutcome: null })\n },\n\n next: () => {\n const { tour, index } = get()\n if (!tour) return\n if (index >= tour.stops.length - 1) {\n get().stop(true)\n return\n }\n set({ index: index + 1 })\n },\n\n prev: () => set((s) => ({ index: Math.max(0, s.index - 1) })),\n\n goTo: (index) => set((s) => (s.tour ? { index: Math.min(Math.max(0, index), s.tour.stops.length - 1) } : s)),\n\n stop: (completed = false) =>\n set((s) => ({\n tour: null,\n index: 0,\n lastOutcome: s.tour ? { tourId: s.tour.id, completed } : s.lastOutcome,\n })),\n}))\n\n/** The stop on screen right now, if any. */\nexport function currentStop(state: TourState): TourStopDef | undefined {\n return state.tour?.stops[state.index]\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { useTourStore, getTourNavigator } from './tour.store'\n\nexport interface TourSpotlightProps {\n labels?: Partial<typeof DEFAULT_LABELS>\n className?: string\n}\n\nconst DEFAULT_LABELS = {\n next: 'Próximo',\n waiting: 'Faça agora — eu espero',\n back: 'Voltar',\n done: 'Entendi',\n skip: 'Pular',\n stepOf: '{current} de {total}',\n notFound: 'Essa parte não está nesta tela — siga em frente que eu te mostro depois.',\n}\n\n/** Padding around the highlighted element, so the ring never touches the label. */\n// `~=` and not `=`: one element may answer to SEVERAL anchors — the caret that\n// hides an action menu stands in for every action folded behind it — so the\n// attribute is a whitespace-separated list, matched the way `class` is.\nconst PAD = 8\n/** How long we wait for a stop's anchor to appear before giving up on it. */\nconst ANCHOR_TIMEOUT_MS = 4000\nconst BUBBLE_WIDTH = 300\nconst GAP = 14\n\ninterface Rect { top: number; left: number; width: number; height: number }\n\nfunction readRect(el: Element): Rect {\n const r = el.getBoundingClientRect()\n return { top: r.top - PAD, left: r.left - PAD, width: r.width + PAD * 2, height: r.height + PAD * 2 }\n}\n\n/**\n * The tour overlay: dim everything, cut a hole around one element, and put a\n * label next to it.\n *\n * The hole is FOUR dim panels rather than one panel with a mask, and that is the\n * whole trick: a masked overlay still swallows the click, so the \"click New\n * product\" stop would highlight a button nobody could press. With four panels\n * the hole is genuinely empty — the element underneath stays live, and somebody\n * being taught to use the app can actually use it while being taught.\n *\n * Mounted once by the shell. It renders nothing until a tour is running.\n */\nexport function TourSpotlight({ labels, className }: TourSpotlightProps) {\n const l = { ...DEFAULT_LABELS, ...labels }\n const tour = useTourStore((s) => s.tour)\n const index = useTourStore((s) => s.index)\n const next = useTourStore((s) => s.next)\n const prev = useTourStore((s) => s.prev)\n const stop = useTourStore((s) => s.stop)\n\n const stopDef = tour?.stops[index]\n const [rect, setRect] = React.useState<Rect | null>(null)\n const [missing, setMissing] = React.useState(false)\n\n // Navigate first, then hunt for the anchor. Both halves live in one effect\n // because the hunt has to restart when the route lands, and a stop whose\n // element is still being fetched is normal — it is a page that just mounted.\n React.useEffect(() => {\n if (!stopDef) return\n setRect(null)\n setMissing(false)\n if (stopDef.route) getTourNavigator()?.(stopDef.route)\n\n let raf = 0\n const deadline = Date.now() + ANCHOR_TIMEOUT_MS\n const hunt = () => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(stopDef.anchor)}\"]`)\n if (el) {\n el.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth' })\n setRect(readRect(el))\n return\n }\n if (Date.now() > deadline) {\n setMissing(true)\n return\n }\n raf = requestAnimationFrame(hunt)\n }\n raf = requestAnimationFrame(hunt)\n return () => cancelAnimationFrame(raf)\n }, [stopDef?.anchor, stopDef?.route, tour?.id])\n\n // Follow the element: a sticky header that collapses on scroll, a sidebar\n // that finishes its transition, a table that finishes loading — all of them\n // move the target after the first measurement.\n //\n // And notice when it LEAVES. On a handover stop the control disappearing is\n // the whole point: they clicked it, the form opened, and the light is now\n // ringing an empty rectangle with no \"next\" button under it — which is where\n // this got stuck the first time somebody used it. Gone means done; the\n // overlay steps aside and the run keeps waiting on the sensor.\n React.useEffect(() => {\n if (!stopDef || missing) return\n const anchor = stopDef.anchor\n const handover = Boolean(stopDef.waitForUser)\n let frame = 0\n let absent = 0\n const sync = () => {\n const el = document.querySelector(`[data-tour~=\"${CSS.escape(anchor)}\"]`)\n if (el) {\n absent = 0\n setRect(readRect(el))\n return\n }\n if (!handover) return\n // A couple of beats, not one: a re-render can drop the node for a frame,\n // and stepping aside on that would look like the tour giving up.\n absent += 1\n if (absent >= 3) stop(false)\n }\n const onFrame = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(sync)\n }\n window.addEventListener('scroll', onFrame, true)\n window.addEventListener('resize', onFrame)\n const interval = window.setInterval(sync, 400)\n return () => {\n cancelAnimationFrame(frame)\n window.clearInterval(interval)\n window.removeEventListener('scroll', onFrame, true)\n window.removeEventListener('resize', onFrame)\n }\n }, [stopDef?.anchor, stopDef?.waitForUser, missing, stop])\n\n React.useEffect(() => {\n if (!tour) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') stop(false)\n if (e.key === 'ArrowRight' && !tour.stops[index]?.waitForUser) next()\n if (e.key === 'ArrowLeft') prev()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [tour, index, next, prev, stop])\n\n if (!tour || !stopDef || typeof document === 'undefined') return null\n\n const total = tour.stops.length\n const isLast = index === total - 1\n const bubble = placeBubble(rect, stopDef.placement)\n\n const body = (\n <div className={cn('pointer-events-none fixed inset-0 z-[120]', className)} role=\"dialog\" aria-modal=\"false\">\n {rect && !missing ? (\n <>\n {/* Four panels, not a mask — the hole has to be a real hole. */}\n <Dim style={{ top: 0, left: 0, width: '100%', height: Math.max(0, rect.top) }} onClick={() => stop(false)} />\n <Dim style={{ top: rect.top, left: 0, width: Math.max(0, rect.left), height: rect.height }} onClick={() => stop(false)} />\n <Dim\n style={{ top: rect.top, left: rect.left + rect.width, right: 0, height: rect.height }}\n onClick={() => stop(false)}\n />\n <Dim style={{ top: rect.top + rect.height, left: 0, width: '100%', bottom: 0 }} onClick={() => stop(false)} />\n <div\n aria-hidden\n className=\"fz-spotlight-ring pointer-events-none absolute motion-safe:transition-[top,left,width,height] motion-safe:duration-300\"\n style={{ top: rect.top, left: rect.left, width: rect.width, height: rect.height }}\n />\n </>\n ) : (\n <Dim style={{ inset: 0 }} onClick={() => stop(false)} />\n )}\n\n <div\n className={cn(\n 'pointer-events-auto absolute w-[300px] max-w-[calc(100vw-24px)] rounded-xl border border-border bg-popover p-4 text-popover-foreground shadow-2xl',\n 'motion-safe:animate-in motion-safe:fade-in motion-safe:zoom-in-95 motion-safe:duration-200',\n )}\n style={bubble}\n >\n <button\n type=\"button\"\n onClick={() => stop(false)}\n aria-label={l.skip}\n className=\"absolute right-2 top-2 rounded-md p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n <p className=\"pr-6 text-sm font-semibold leading-snug\">{stopDef.title}</p>\n {(missing ? l.notFound : stopDef.body) && (\n <p className=\"mt-1.5 text-[13px] leading-relaxed text-muted-foreground\">\n {missing ? l.notFound : stopDef.body}\n </p>\n )}\n <div className=\"mt-3 flex items-center gap-2\">\n <span className=\"text-[11px] tabular-nums text-muted-foreground\">\n {l.stepOf.replace('{current}', String(index + 1)).replace('{total}', String(total))}\n </span>\n <span className=\"flex-1\" />\n {/* A handover stop has no \"next\": the person is meant to use the\n control under the light, and the tour moves when the work lands.\n Offering a button here is what turns a walkthrough into a slide\n deck somebody clicks past. */}\n {stopDef.waitForUser && (\n <span className=\"inline-flex items-center gap-1.5 text-[12px] font-medium text-primary\">\n <span className=\"relative flex h-1.5 w-1.5\">\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-primary/70\" />\n <span className=\"relative inline-flex h-1.5 w-1.5 rounded-full bg-primary\" />\n </span>\n {l.waiting}\n </span>\n )}\n {index > 0 && !stopDef.waitForUser && (\n <button\n type=\"button\"\n onClick={prev}\n className=\"rounded-button px-2.5 py-1.5 text-[12.5px] font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {l.back}\n </button>\n )}\n {!stopDef.waitForUser && (\n <button\n type=\"button\"\n onClick={next}\n className=\"rounded-button bg-primary px-3 py-1.5 text-[12.5px] font-semibold text-primary-foreground shadow-button-primary transition-colors hover:bg-primary/90\"\n >\n {isLast ? l.done : l.next}\n </button>\n )}\n </div>\n </div>\n </div>\n )\n\n return createPortal(body, document.body)\n}\n\n/**\n * One quarter of the dim.\n *\n * The colour is an inline style rather than a utility class on purpose: this\n * overlay is the whole affordance, and a Tailwind build that does not happen to\n * scan this file would drop the class and leave a tour that highlights nothing\n * — silently, with no error. Nothing here is themeable anyway; a scrim is a\n * scrim in both palettes.\n */\nfunction Dim({ style, onClick }: { style: React.CSSProperties; onClick: () => void }) {\n return (\n <div\n onClick={onClick}\n className=\"pointer-events-auto absolute motion-safe:transition-all motion-safe:duration-300\"\n style={{ backgroundColor: 'rgb(0 0 0 / 0.55)', ...style }}\n />\n )\n}\n\n/**\n * Where the label goes. Below the target by default, above when there is no\n * room below, and dead centre when there is no target at all.\n */\nfunction placeBubble(rect: Rect | null, placement: string | undefined): React.CSSProperties {\n if (typeof window === 'undefined' || !rect) {\n return { top: '50%', left: '50%', transform: 'translate(-50%, -50%)' }\n }\n const vw = window.innerWidth\n const vh = window.innerHeight\n const belowRoom = vh - (rect.top + rect.height)\n const rightRoom = vw - (rect.left + rect.width)\n\n let side = placement && placement !== 'auto' ? placement : belowRoom > 220 ? 'bottom' : rect.top > 220 ? 'top' : rightRoom > 340 ? 'right' : 'left'\n if (side === 'bottom' && belowRoom < 180) side = 'top'\n if (side === 'top' && rect.top < 180) side = 'bottom'\n\n const clampX = (x: number) => Math.min(Math.max(12, x), Math.max(12, vw - BUBBLE_WIDTH - 12))\n const clampY = (y: number) => Math.min(Math.max(12, y), Math.max(12, vh - 190))\n\n switch (side) {\n case 'top':\n return { left: clampX(rect.left + rect.width / 2 - BUBBLE_WIDTH / 2), bottom: Math.max(12, vh - rect.top + GAP) }\n case 'left':\n return { left: Math.max(12, rect.left - BUBBLE_WIDTH - GAP), top: clampY(rect.top) }\n case 'right':\n return { left: clampX(rect.left + rect.width + GAP), top: clampY(rect.top) }\n default:\n return { left: clampX(rect.left + rect.width / 2 - BUBBLE_WIDTH / 2), top: clampY(rect.top + rect.height + GAP) }\n }\n}\n","/**\n * Tour shapes.\n *\n * Mirrors `TourDef` in @fayz-ai/core so the UI kit stays importable on its own\n * (it does not depend on core), and so a plugin's declared tour and a tour the\n * agent invents at runtime are the same object.\n */\nexport interface TourStopDef {\n /** Matches `data-tour=\"<anchor>\"` in the document. */\n anchor: string\n title: string\n body?: string\n /** Navigate here before looking for the anchor. */\n route?: string\n placement?: 'top' | 'bottom' | 'left' | 'right' | 'auto'\n /** Wait for the person to use the control instead of offering \"next\". */\n waitForUser?: boolean\n}\n\nexport interface TourDef {\n id: string\n title?: string\n stops: TourStopDef[]\n}\n\n/** Spread onto the element a tour points at: `<Button {...tourAnchor('shop.new')} />`. */\nexport function tourAnchor(anchor: string): { 'data-tour': string } {\n return { 'data-tour': anchor }\n}\n"]}
|