@openrails/billing-ui 0.248.1 → 0.250.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/CHANGELOG.md +37 -0
- package/README.md +40 -35
- package/dist/account/account-billing.d.ts +2 -2
- package/dist/account/cancel-dialog.d.ts +2 -2
- package/dist/account/change-card-dialog.d.ts +2 -2
- package/dist/account/payment-history.d.ts +2 -2
- package/dist/account/payment-methods-panel.d.ts +2 -2
- package/dist/account/section.d.ts +2 -2
- package/dist/account/subscriptions-panel.d.ts +2 -2
- package/dist/admin/context.d.ts +2 -2
- package/dist/admin/lib/queries.d.ts +1 -1
- package/dist/admin/messages.d.ts +3 -3
- package/dist/admin/pages/catalog/psp-links.d.ts +1 -1
- package/dist/admin/theme.d.ts +2 -2
- package/dist/admin/types.d.ts +2 -2
- package/dist/{admin-attempts-lAoW-Urd.js → admin-attempts-DxRHTODq.js} +8 -8
- package/dist/{admin-attempts-lAoW-Urd.js.map → admin-attempts-DxRHTODq.js.map} +1 -1
- package/dist/{admin-auth-DQGHtt0j.js → admin-auth-CiuZ-Hlm.js} +2 -2
- package/dist/{admin-auth-DQGHtt0j.js.map → admin-auth-CiuZ-Hlm.js.map} +1 -1
- package/dist/{admin-badge-DR5-1qd8.js → admin-badge-VCGbnfiN.js} +2 -2
- package/dist/{admin-badge-DR5-1qd8.js.map → admin-badge-VCGbnfiN.js.map} +1 -1
- package/dist/{admin-button-CTL3DgOt.js → admin-button-Oip73Plq.js} +2 -2
- package/dist/{admin-button-CTL3DgOt.js.map → admin-button-Oip73Plq.js.map} +1 -1
- package/dist/{admin-capabilities-BuigAgtm.js → admin-capabilities-BGv7oG8v.js} +2 -2
- package/dist/{admin-capabilities-BuigAgtm.js.map → admin-capabilities-BGv7oG8v.js.map} +1 -1
- package/dist/{admin-card-bzAks3-3.js → admin-card-DGbi6ZHZ.js} +2 -2
- package/dist/{admin-card-bzAks3-3.js.map → admin-card-DGbi6ZHZ.js.map} +1 -1
- package/dist/{admin-catalog-CK6CM9I2.js → admin-catalog-3pPEAuDY.js} +19 -19
- package/dist/{admin-catalog-CK6CM9I2.js.map → admin-catalog-3pPEAuDY.js.map} +1 -1
- package/dist/{admin-customers-D8u5gq3M.js → admin-customers-cnKMEV4q.js} +6 -6
- package/dist/{admin-customers-D8u5gq3M.js.map → admin-customers-cnKMEV4q.js.map} +1 -1
- package/dist/{admin-dashboard-DqqFjOzq.js → admin-dashboard-DfSsUyo-.js} +14 -14
- package/dist/{admin-dashboard-DqqFjOzq.js.map → admin-dashboard-DfSsUyo-.js.map} +1 -1
- package/dist/{admin-data-table-qfXLOFmN.js → admin-data-table-CgeWv__T.js} +6 -6
- package/dist/{admin-data-table-qfXLOFmN.js.map → admin-data-table-CgeWv__T.js.map} +1 -1
- package/dist/{admin-detail-X82kR2f7.js → admin-detail-BATuJjVs.js} +12 -12
- package/dist/{admin-detail-X82kR2f7.js.map → admin-detail-BATuJjVs.js.map} +1 -1
- package/dist/{admin-detail-DUAJQg8G.js → admin-detail-Cq59e14B.js} +15 -15
- package/dist/{admin-detail-DUAJQg8G.js.map → admin-detail-Cq59e14B.js.map} +1 -1
- package/dist/{admin-detail-BHe51ma9.js → admin-detail-DG-YaHhS.js} +11 -11
- package/dist/{admin-detail-BHe51ma9.js.map → admin-detail-DG-YaHhS.js.map} +1 -1
- package/dist/{admin-detail-CGOyqs7s.js → admin-detail-Dc7rU4mM.js} +15 -15
- package/dist/{admin-detail-CGOyqs7s.js.map → admin-detail-Dc7rU4mM.js.map} +1 -1
- package/dist/{admin-dialog-BjuKI5Hp.js → admin-dialog-Ffx95AIT.js} +3 -3
- package/dist/{admin-dialog-BjuKI5Hp.js.map → admin-dialog-Ffx95AIT.js.map} +1 -1
- package/dist/{admin-dom-uMmZzRvU.js → admin-dom-lnNSQ7ke.js} +4 -4
- package/dist/{admin-dom-uMmZzRvU.js.map → admin-dom-lnNSQ7ke.js.map} +1 -1
- package/dist/{admin-dropdown-menu-BW1D_h6s.js → admin-dropdown-menu-CCiW4-oz.js} +2 -2
- package/dist/{admin-dropdown-menu-BW1D_h6s.js.map → admin-dropdown-menu-CCiW4-oz.js.map} +1 -1
- package/dist/{admin-fact-card-DO_fHosg.js → admin-fact-card-D6mZgxpN.js} +2 -2
- package/dist/{admin-fact-card-DO_fHosg.js.map → admin-fact-card-D6mZgxpN.js.map} +1 -1
- package/dist/{admin-health-B4jN2LwR.js → admin-health-CvJX9prw.js} +13 -13
- package/dist/{admin-health-B4jN2LwR.js.map → admin-health-CvJX9prw.js.map} +1 -1
- package/dist/{admin-input-CcfQfJFN.js → admin-input-DO5lvCLL.js} +2 -2
- package/dist/{admin-input-CcfQfJFN.js.map → admin-input-DO5lvCLL.js.map} +1 -1
- package/dist/{admin-label-BiEN5cjb.js → admin-label-BzJpr3lg.js} +2 -2
- package/dist/{admin-label-BiEN5cjb.js.map → admin-label-BzJpr3lg.js.map} +1 -1
- package/dist/{admin-linked-table-row-BsaUruCN.js → admin-linked-table-row-5vFb6rXY.js} +4 -4
- package/dist/{admin-linked-table-row-BsaUruCN.js.map → admin-linked-table-row-5vFb6rXY.js.map} +1 -1
- package/dist/{admin-metering-COFcSPQy.js → admin-metering-BksTFRRP.js} +14 -14
- package/dist/{admin-metering-COFcSPQy.js.map → admin-metering-BksTFRRP.js.map} +1 -1
- package/dist/{admin-ops-B3mcr76u.js → admin-ops-Ch2-BmUp.js} +11 -11
- package/dist/{admin-ops-B3mcr76u.js.map → admin-ops-Ch2-BmUp.js.map} +1 -1
- package/dist/{admin-orders-dxC99Idl.js → admin-orders-8XzHf7b-.js} +8 -8
- package/dist/{admin-orders-dxC99Idl.js.map → admin-orders-8XzHf7b-.js.map} +1 -1
- package/dist/{admin-payments-Bs7HSfP0.js → admin-payments-pNLNIU0X.js} +9 -9
- package/dist/{admin-payments-Bs7HSfP0.js.map → admin-payments-pNLNIU0X.js.map} +1 -1
- package/dist/{admin-price-detail-DRquxpA9.js → admin-price-detail-BeGDPxKX.js} +11 -11
- package/dist/admin-price-detail-BeGDPxKX.js.map +1 -0
- package/dist/{admin-price-wizard-CI7K-2Nz.js → admin-price-wizard-ferZSTfO.js} +7 -7
- package/dist/{admin-price-wizard-CI7K-2Nz.js.map → admin-price-wizard-ferZSTfO.js.map} +1 -1
- package/dist/{admin-range-picker-Dr2M1EZr.js → admin-range-picker-DaIvC1oC.js} +5 -5
- package/dist/{admin-range-picker-Dr2M1EZr.js.map → admin-range-picker-DaIvC1oC.js.map} +1 -1
- package/dist/{admin-reports-CywKLiSA.js → admin-reports-CA-cnNur.js} +8 -8
- package/dist/{admin-reports-CywKLiSA.js.map → admin-reports-CA-cnNur.js.map} +1 -1
- package/dist/{admin-select-DBgprVW6.js → admin-select-CUXvh6j1.js} +2 -2
- package/dist/{admin-select-DBgprVW6.js.map → admin-select-CUXvh6j1.js.map} +1 -1
- package/dist/{admin-settings-Bmoy95uO.js → admin-settings-C6eWFkDn.js} +16 -16
- package/dist/{admin-settings-Bmoy95uO.js.map → admin-settings-C6eWFkDn.js.map} +1 -1
- package/dist/{admin-skeleton-DsM7crYi.js → admin-skeleton-DEY3Q8Dg.js} +2 -2
- package/dist/{admin-skeleton-DsM7crYi.js.map → admin-skeleton-DEY3Q8Dg.js.map} +1 -1
- package/dist/{admin-status-badge-BFPgo71d.js → admin-status-badge-CwqIU8tK.js} +2 -2
- package/dist/{admin-status-badge-BFPgo71d.js.map → admin-status-badge-CwqIU8tK.js.map} +1 -1
- package/dist/{admin-subscriptions-CLYc_HEV.js → admin-subscriptions-lJG_EzMe.js} +9 -9
- package/dist/{admin-subscriptions-CLYc_HEV.js.map → admin-subscriptions-lJG_EzMe.js.map} +1 -1
- package/dist/{admin-switch-BJUxLCsa.js → admin-switch-S4g_ppaU.js} +2 -2
- package/dist/{admin-switch-BJUxLCsa.js.map → admin-switch-S4g_ppaU.js.map} +1 -1
- package/dist/{admin-table-CH9TrXJf.js → admin-table-CWhiCb9d.js} +2 -2
- package/dist/{admin-table-CH9TrXJf.js.map → admin-table-CWhiCb9d.js.map} +1 -1
- package/dist/{admin-tabs-528FJMjt.js → admin-tabs-Cjm5a6UJ.js} +2 -2
- package/dist/{admin-tabs-528FJMjt.js.map → admin-tabs-Cjm5a6UJ.js.map} +1 -1
- package/dist/{admin-textarea-DEz38RaI.js → admin-textarea-DK1Fq31x.js} +2 -2
- package/dist/{admin-textarea-DEz38RaI.js.map → admin-textarea-DK1Fq31x.js.map} +1 -1
- package/dist/{admin-typed-confirm-dialog-DU7m9-O7.js → admin-typed-confirm-dialog-BloZvFPA.js} +6 -6
- package/dist/{admin-typed-confirm-dialog-DU7m9-O7.js.map → admin-typed-confirm-dialog-BloZvFPA.js.map} +1 -1
- package/dist/{admin-utils-BK4Vh1o_.js → admin-utils-DnVY5fYd.js} +3 -3
- package/dist/admin-utils-DnVY5fYd.js.map +1 -0
- package/dist/{admin-widget-viz-Da48c-Zf.js → admin-widget-viz-RCkxUspL.js} +8 -8
- package/dist/{admin-widget-viz-Da48c-Zf.js.map → admin-widget-viz-RCkxUspL.js.map} +1 -1
- package/dist/admin.js +31 -31
- package/dist/admin.js.map +1 -1
- package/dist/appearance.d.ts +7 -7
- package/dist/buy-button.d.ts +12 -18
- package/dist/cart.d.ts +4 -4
- package/dist/client/client.d.ts +12 -20
- package/dist/client/generated/error-codes.d.ts +1 -1
- package/dist/client/generated/routes.d.ts +10 -24
- package/dist/client/generated/wire.d.ts +75 -37
- package/dist/client/index.d.ts +1 -1
- package/dist/client/types.d.ts +17 -18
- package/dist/{client-DoRYitD3.js → client-HWr09qpX.js} +216 -233
- package/dist/client-HWr09qpX.js.map +1 -0
- package/dist/client.js +1 -1
- package/dist/embedded-payment.d.ts +25 -0
- package/dist/{hooks-DCSelDIZ.js → hooks-D9MR20BY.js} +7 -20
- package/dist/hooks-D9MR20BY.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +284 -272
- package/dist/index.js.map +1 -1
- package/dist/locales/de.js +1 -1
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.d.ts +1 -1
- package/dist/locales/en.js +1 -1
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.js +1 -1
- package/dist/locales/es.js.map +1 -1
- package/dist/locales/ja.js +1 -1
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +1 -1
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/zh.js +1 -1
- package/dist/locales/zh.js.map +1 -1
- package/dist/modal.d.ts +12 -3
- package/dist/{order-checkout.d.ts → order-payment.d.ts} +4 -4
- package/dist/product-list.d.ts +10 -16
- package/dist/psp.d.ts +2 -2
- package/dist/react/hooks.d.ts +2 -15
- package/dist/react/index.d.ts +1 -1
- package/dist/react/provider.d.ts +3 -3
- package/dist/react.js +2 -2
- package/dist/save-payment-method.d.ts +2 -2
- package/dist/scope-context.d.ts +4 -4
- package/dist/scope.d.ts +2 -2
- package/dist/tokenized-card-form.d.ts +2 -2
- package/docs/payment-form-contract.md +3 -3
- package/package.json +2 -2
- package/dist/admin-price-detail-DRquxpA9.js.map +0 -1
- package/dist/admin-utils-BK4Vh1o_.js.map +0 -1
- package/dist/client-DoRYitD3.js.map +0 -1
- package/dist/embedded-checkout.d.ts +0 -22
- package/dist/hooks-DCSelDIZ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-widget-viz-Da48c-Zf.js","names":[],"sources":["../src/admin/pages/dashboard/lib.ts","../src/admin/components/ui/chart.tsx","../src/admin/pages/dashboard/widget-viz.tsx"],"sourcesContent":["// Result-shaping helpers for dashboard widgets: unit-aware formatting,\n// time-series pivoting, and deep links (every count tile links to its list).\nimport type {\n MetricsCell,\n MetricsColumn,\n MetricsQuery,\n MetricsRange,\n MetricsResult,\n} from \"#orck/admin/lib/api/metrics\"\nimport { formatNativeAmount } from \"#orck/admin/lib/format\"\n\n// formatMeasure renders one measure cell by its column unit.\nexport function formatMeasure(\n value: MetricsCell,\n unit: string | undefined,\n currency?: string\n): string {\n if (value === null || value === undefined) return \"—\"\n // \"money\" cells are exact decimal strings of native units at the\n // currency's registered scale (a money-unit ratio arrives already rounded).\n if (unit === \"money\") return formatNativeAmount(value, currency ?? \"\")\n const n = typeof value === \"number\" ? value : Number(value)\n if (!Number.isFinite(n)) return String(value)\n switch (unit) {\n case \"ratio\":\n return `${(n * 100).toLocaleString(undefined, { maximumFractionDigits: 2 })}%`\n case \"days\":\n return `${n.toLocaleString(undefined, { maximumFractionDigits: 1 })} d`\n default:\n return n.toLocaleString(undefined, { maximumFractionDigits: 2 })\n }\n}\n\n// formatBucket renders a time-bucket label for the query grain.\nexport function formatBucket(iso: string, grain?: string): string {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n switch (grain) {\n case \"month\":\n case \"quarter\":\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n year: \"numeric\",\n timeZone: \"UTC\",\n })\n case \"year\":\n return d.toLocaleDateString(undefined, {\n year: \"numeric\",\n timeZone: \"UTC\",\n })\n default:\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n timeZone: \"UTC\",\n })\n }\n}\n\nexport interface ColumnIndex {\n time: number\n dims: { name: string; index: number }[]\n measures: { name: string; unit?: string; index: number }[]\n currency: number\n}\n\nexport function indexColumns(columns: MetricsColumn[]): ColumnIndex {\n const idx: ColumnIndex = { time: -1, dims: [], measures: [], currency: -1 }\n columns.forEach((c, i) => {\n if (c.kind === \"time\") idx.time = i\n else if (c.kind === \"dimension\") {\n idx.dims.push({ name: c.name, index: i })\n if (c.name === \"currency\") idx.currency = i\n } else idx.measures.push({ name: c.name, unit: c.unit, index: i })\n })\n return idx\n}\n\nexport interface PivotSeries {\n key: string\n label: string\n measure: string\n dimensions: MetricsCell[]\n unit?: string\n currency?: string\n}\n\nexport function filteredCurrency(query?: MetricsQuery): string | undefined {\n const currencies = query?.filters?.currency\n return currencies?.length === 1 ? currencies[0].trim() : undefined\n}\n\nexport function rowCurrency(\n row: MetricsCell[],\n idx: ColumnIndex,\n fallback?: string\n): string | undefined {\n return idx.currency >= 0\n ? String(row[idx.currency] ?? \"\") || undefined\n : fallback\n}\n\n// Absolute bucket dates differ between periods; stat deltas are defined only\n// for a single value per dimension tuple. Never sum ratios or unlike monies.\nexport function statDelta(\n result: MetricsResult,\n row: MetricsCell[],\n measureIndex: number\n): number | null {\n if (!result.compare_rows || row[measureIndex] === null) return null\n const idx = indexColumns(result.columns)\n const key = (r: MetricsCell[]) =>\n JSON.stringify(idx.dims.map((d) => r[d.index]))\n const currentKey = key(row)\n if (result.rows.filter((r) => key(r) === currentKey).length !== 1) return null\n const previous = result.compare_rows.filter((r) => key(r) === currentKey)\n if (previous.length !== 1 || previous[0][measureIndex] === null) return null\n const prev = Number(previous[0][measureIndex])\n const cur = Number(row[measureIndex])\n return Number.isFinite(prev) && Number.isFinite(cur) && prev !== 0\n ? (cur - prev) / Math.abs(prev)\n : null\n}\n\n// comparedWith names the period a stat's delta compares with: a one-day\n// range compares with yesterday.\nexport function comparedWith(result: MetricsResult): string {\n const span = result.compare_range\n ? Date.parse(result.compare_range.to) -\n Date.parse(result.compare_range.from)\n : 0\n return span === 86_400_000 ? \"yesterday\" : \"previous period\"\n}\n\n// One axis (or donut total) may only combine the same measurement unit and\n// currency. Counts do not become money just because a currency dimension exists.\nexport function groupSeries<T extends PivotSeries>(\n series: T[]\n): { key: string; label: string; series: T[] }[] {\n const groups = new Map<string, { key: string; label: string; series: T[] }>()\n for (const item of series) {\n const currency = item.unit === \"money\" ? item.currency : undefined\n const key = JSON.stringify([item.unit ?? \"number\", currency ?? null])\n let group = groups.get(key)\n if (!group) {\n group = {\n key,\n label:\n item.unit === \"money\"\n ? currency || \"Amount (currency not supplied)\"\n : item.unit || \"Values\",\n series: [],\n }\n groups.set(key, group)\n }\n group.series.push(item)\n }\n return [...groups.values()]\n}\n\nexport interface Pivoted {\n data: Record<string, number | string | null>[]\n series: PivotSeries[]\n}\n\n// exactKey names the pivoted row field that keeps a series' exact wire cell\n// (a money decimal string) beside the Number recharts plots, so tooltips\n// format the exact value rather than a Number-coerced one.\nexport function exactKey(seriesKey: string): string {\n return `${seriesKey}:exact`\n}\n\n// pivotTimeSeries turns tabular rows into recharts rows keyed by bucket, one\n// series per measure × dimension-value combination. Server-zero-filled\n// buckets render as-is; combos absent for a bucket fill 0 so stacks align.\n// A ratio with nothing to divide by is no data, not 0%: it stays null.\nexport function pivotTimeSeries(\n result: MetricsResult,\n currency?: string\n): Pivoted {\n const idx = indexColumns(result.columns)\n if (idx.time < 0) return { data: [], series: [] }\n const buckets = new Map<string, Record<string, number | string | null>>()\n const series = new Map<string, PivotSeries>()\n for (const row of result.rows) {\n const t = String(row[idx.time])\n let entry = buckets.get(t)\n if (!entry) {\n entry = { bucket: formatBucket(t, result.grain), bucketISO: t }\n buckets.set(t, entry)\n }\n const dimensions = idx.dims.map((d) => row[d.index])\n const dimLabel = dimensions\n .map((value) => String(value ?? \"\"))\n .filter(Boolean)\n .join(\" · \")\n for (const m of idx.measures) {\n const identity = JSON.stringify([m.name, ...dimensions])\n let item = series.get(identity)\n if (!item) {\n item = {\n key: `series-${series.size}`,\n label:\n dimLabel && idx.measures.length > 1\n ? `${m.name} · ${dimLabel}`\n : dimLabel || m.name,\n measure: m.name,\n dimensions,\n unit: m.unit,\n currency:\n m.unit === \"money\" ? rowCurrency(row, idx, currency) : undefined,\n }\n series.set(identity, item)\n }\n const cell = row[m.index]\n const empty = m.unit === \"ratio\" ? null : 0\n entry[item.key] = cell === null ? empty : Number(cell)\n entry[exactKey(item.key)] = cell ?? empty\n }\n }\n const data = [...buckets.entries()]\n .sort(([a], [b]) => (a < b ? -1 : 1))\n .map(([, entry]) => entry)\n const keys = [...series.values()]\n for (const entry of data) {\n for (const s of keys)\n if (!(s.key in entry)) {\n const empty = s.unit === \"ratio\" ? null : 0\n entry[s.key] = empty\n entry[exactKey(s.key)] = empty\n }\n }\n return { data, series: keys }\n}\n\n// DonutSlice is one pie slice: the plotted Number beside the exact wire cell\n// (under exactKey) the tooltip formats, as the time-series rows do.\nexport type DonutSlice = PivotSeries & {\n value: number\n [exact: string]: unknown\n}\n\n// donutSlices turns the result's rows into slices for the primary measure,\n// dropping zero slices.\nexport function donutSlices(\n result: MetricsResult,\n currency?: string\n): DonutSlice[] {\n const idx = indexColumns(result.columns)\n const primary = idx.measures[0]\n if (!primary) return []\n return result.rows\n .map((row, i) => {\n const key = `slice-${i}`\n const cell = row[primary.index]\n return {\n key,\n label:\n idx.dims\n .map((d) => String(row[d.index] ?? \"\"))\n .filter(Boolean)\n .join(\" · \") || primary.name,\n measure: primary.name,\n dimensions: idx.dims.map((d) => row[d.index]),\n unit: primary.unit,\n currency:\n primary.unit === \"money\"\n ? rowCurrency(row, idx, currency)\n : undefined,\n value: Number(cell ?? 0),\n [exactKey(key)]: cell ?? 0,\n }\n })\n .filter((slice) => slice.value !== 0)\n}\n\n// chartColor cycles the shadcn --chart-N tokens.\nexport function chartColor(i: number): string {\n return `var(--chart-${(i % 5) + 1})`\n}\n\n// Decline, rebill-failure and NMI history measures open Payments → Health.\nconst HEALTH_MEASURES = new Set([\n \"attempts\",\n \"approved_attempts\",\n \"failed_attempts\",\n \"attempt_failure_rate\",\n \"checkouts\",\n \"failed_checkouts\",\n \"checkout_failure_rate\",\n \"attempts_per_checkout\",\n \"checkout_recovery_rate\",\n \"rebills_due\",\n \"rebills_open\",\n \"rebills_attempted\",\n \"rebill_first_failures\",\n \"rebill_first_failure_rate\",\n \"rebills_missed\",\n \"rebill_missed_rate\",\n \"dunning_recovered\",\n \"dunning_recovery_rate\",\n \"rebill_collection_rate\",\n \"rebill_loss_rate\",\n \"nmi_history_authorizations\",\n \"nmi_history_approved\",\n \"nmi_history_refused\",\n \"nmi_history_refusal_rate\",\n])\n\n// deepLinkFor maps a widget to the admin page carrying the same filter: health\n// measures in any viz open the health page, count stats open their list. Null\n// = no sensible link.\nexport function deepLinkFor(\n query: MetricsQuery,\n viz: string = \"stat\"\n): string | null {\n const measures = query.measures ?? []\n if (measures.some((m) => HEALTH_MEASURES.has(m))) return \"/payments/health\"\n if (viz !== \"stat\") return null\n const status = query.filters?.status?.[0]\n const has = (...names: string[]) => names.some((n) => measures.includes(n))\n if (has(\"subscriptions\", \"billable_subscriptions\")) {\n return status\n ? `/subscriptions?status=${encodeURIComponent(status)}`\n : \"/subscriptions\"\n }\n if (has(\"new_subscriptions\", \"net_new_subscriptions\"))\n return \"/subscriptions?status=active\"\n if (has(\"cancellations\")) return \"/subscriptions?view=recently_canceled\"\n if (\n has(\n \"payment_count\",\n \"refund_count\",\n \"chargeback_count\",\n \"unique_rebilled_customers\"\n )\n )\n return \"/payments\"\n if (has(\"entitled_customers\")) return \"/customers\"\n return null\n}\n\n// ownRange says in words what a saved query's range covers.\nexport function ownRange(range: MetricsRange | undefined): string {\n if (!range) return \"its saved range\"\n if (range.from && range.to) return `${range.from} to ${range.to}`\n const m = /^(\\d+)([dwmy])$/.exec(range.last ?? \"\")\n if (!m) return \"its saved range\"\n if (m[1] === \"1\" && m[2] === \"d\") return \"today\"\n const unit = { d: \"day\", w: \"week\", m: \"month\", y: \"year\" }[m[2]]!\n return `the last ${m[1]} ${unit}${m[1] === \"1\" ? \"\" : \"s\"}`\n}\n","import * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\nimport type { TooltipValueType } from \"recharts\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const\ntype TooltipNameType = number | string\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\")\n }\n\n return context\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\n initialDimension?: {\n width: number\n height: number\n }\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer\n initialDimension={initialDimension}\n >\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme ?? config.color\n )\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ??\n itemConfig.color\n return color ? ` --color-${key}: ${color};` : null\n })\n .join(\"\\n\")}\n}\n`\n )\n .join(\"\\n\"),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: \"line\" | \"dot\" | \"dashed\"\n nameKey?: string\n labelKey?: string\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<\n TooltipValueType,\n TooltipNameType\n >,\n \"accessibilityLayer\"\n >) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === \"string\"\n ? (config[label]?.label ?? label)\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n return (\n <div\n className={cn(\n \"grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey ?? item.name ?? item.dataKey ?? \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color ?? item.payload?.fill ?? item.color\n\n return (\n <div\n key={index}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === \"number\"\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: React.ComponentProps<\"div\"> & {\n hideIcon?: boolean\n nameKey?: string\n} & RechartsPrimitive.DefaultLegendContentProps) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey ?? item.dataKey ?? \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\n// Viz renderers: stat tile with compare delta, line/area/bar (shadcn chart on\n// recharts), donut, table. Input is the raw tabular metrics result; nothing\n// re-queries client-side.\nimport type { ComponentProps } from \"react\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { AnalyticsDownIcon, AnalyticsUpIcon } from \"@hugeicons/core-free-icons\"\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n Line,\n LineChart,\n Pie,\n PieChart,\n XAxis,\n YAxis,\n} from \"recharts\"\n\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"#orck/admin/components/ui/table\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"#orck/admin/components/ui/chart\"\nimport type {\n MetricsResult,\n MetricsQuery,\n WidgetViz as VizType,\n} from \"#orck/admin/lib/api/metrics\"\nimport { cn } from \"#orck/admin/lib/utils\"\n\nimport {\n comparedWith,\n donutSlices,\n chartColor,\n exactKey,\n filteredCurrency,\n groupSeries,\n rowCurrency,\n statDelta,\n type PivotSeries,\n type Pivoted,\n formatBucket,\n formatMeasure,\n indexColumns,\n pivotTimeSeries,\n} from \"./lib\"\n\nexport function WidgetVizView({\n viz,\n result,\n query,\n}: {\n viz: VizType\n result: MetricsResult\n query?: MetricsQuery\n}) {\n const currency = filteredCurrency(query)\n switch (viz) {\n case \"stat\":\n return <StatViz result={result} currency={currency} />\n case \"line\":\n case \"area\":\n case \"bar\":\n return <TimeSeriesViz viz={viz} result={result} currency={currency} />\n case \"donut\":\n return <DonutViz result={result} currency={currency} />\n case \"table\":\n return <TableViz result={result} currency={currency} />\n }\n}\n\nfunction Empty({ label }: { label: string }) {\n return (\n <div className=\"flex h-full min-h-16 items-center justify-center text-sm text-muted-foreground\">\n {label}\n </div>\n )\n}\n\nfunction StatViz({\n result,\n currency: fallback,\n}: {\n result: MetricsResult\n currency?: string\n}) {\n const { text: adminText } = useAdminUI()\n\n const idx = indexColumns(result.columns)\n const primary = idx.measures[0]\n if (!primary) return <Empty label={adminText(\"no measure\")} />\n if (result.rows.length === 0) {\n return (\n <div className=\"text-2xl font-semibold tabular-nums\">\n {formatMeasure(0, primary.unit, fallback)}\n </div>\n )\n }\n // One rendered value per row (rows differ by dims — usually currency).\n const rows = result.rows.slice(0, 3)\n const against = comparedWith(result)\n return (\n <div className=\"flex h-full flex-col justify-center gap-1\">\n {rows.map((row, i) => {\n const currency = rowCurrency(row, idx, fallback)\n const delta = statDelta(result, row, primary.index)\n const dimLabel =\n rows.length > 1\n ? idx.dims\n .map((d) => String(row[d.index] ?? \"\"))\n .filter(Boolean)\n .join(\" ·\")\n : \"\"\n return (\n <div\n key={i}\n className=\"flex flex-wrap items-baseline gap-x-2 gap-y-0.5\"\n >\n <span\n className={cn(\n \"font-semibold tabular-nums\",\n rows.length > 1 ? \"text-lg\" : \"text-3xl\"\n )}\n >\n {formatMeasure(row[primary.index], primary.unit, currency)}\n </span>\n {dimLabel ? (\n <span className=\"text-xs text-muted-foreground\">{dimLabel}</span>\n ) : null}\n {delta !== null ? (\n <span\n className={cn(\n \"flex basis-full items-center gap-1 text-xs font-medium\",\n delta >= 0 ? \"text-settled\" : \"text-failed\"\n )}\n >\n {delta >= 0 ? (\n <HugeiconsIcon icon={AnalyticsUpIcon} className=\"size-3\" />\n ) : (\n <HugeiconsIcon icon={AnalyticsDownIcon} className=\"size-3\" />\n )}\n {`${delta >= 0 ? \"+\" : \"\"}${(delta * 100).toFixed(1)}% vs ${against}`}\n </span>\n ) : null}\n </div>\n )\n })}\n {result.rows.length > 3 ? (\n <span className=\"text-xs text-muted-foreground\">\n +{result.rows.length - 3}\n <AdminMessage id={\" more\"} />\n </span>\n ) : null}\n </div>\n )\n}\n\n// MetricTooltip formats a hovered value from the exact wire cell the series\n// row carries under exactKey (a money decimal string), falling back to the\n// plotted Number only for series that never had one. Exported for tests.\nexport function MetricTooltip({\n series,\n ...props\n}: ComponentProps<typeof ChartTooltipContent> & { series: PivotSeries[] }) {\n const measure = series[0]\n return (\n <ChartTooltipContent\n {...props}\n formatter={(value, name, item) => {\n // item.payload is the pivoted row, which carries each series' exact\n // wire cell beside the Number recharts plots.\n const row = (item as { payload?: unknown }).payload\n const exact =\n row && typeof row === \"object\"\n ? (row as Record<string, unknown>)[exactKey(String(name))]\n : undefined\n const cell =\n typeof exact === \"string\" || typeof exact === \"number\"\n ? exact\n : Number(value)\n return (\n <div className=\"flex w-full items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">\n {series.find((item) => item.key === String(name))?.label ?? name}\n </span>\n <span className=\"font-mono font-medium tabular-nums\">\n {formatMeasure(cell, measure.unit, measure.currency)}\n </span>\n </div>\n )\n }}\n />\n )\n}\n\nfunction TimeSeriesViz({\n viz,\n result,\n currency,\n}: {\n viz: \"line\" | \"area\" | \"bar\"\n result: MetricsResult\n currency?: string\n}) {\n const { text: adminText } = useAdminUI()\n\n const { data, series } = pivotTimeSeries(result, currency)\n if (data.length === 0 || series.length === 0)\n return <Empty label={adminText(\"no data in range\")} />\n const groups = groupSeries(series)\n if (groups.length === 1)\n return <TimeSeriesChart viz={viz} data={data} series={series} />\n return (\n <div className=\"flex h-full flex-col gap-4 overflow-auto\">\n {groups.map((group) => (\n <section key={group.key} className=\"min-h-44 shrink-0\">\n <div className=\"mb-1 text-xs font-medium text-muted-foreground\">\n {group.label}\n </div>\n <div className=\"h-36\">\n <TimeSeriesChart viz={viz} data={data} series={group.series} />\n </div>\n </section>\n ))}\n </div>\n )\n}\n\nfunction TimeSeriesChart({\n viz,\n data,\n series,\n}: Pivoted & { viz: \"line\" | \"area\" | \"bar\" }) {\n const config: ChartConfig = {}\n series.forEach((s, i) => {\n config[s.key] = { label: s.label, color: chartColor(i) }\n })\n const unit = series[0]?.unit\n const tickFormatter = (v: number) =>\n formatMeasure(v, unit, series[0]?.currency)\n const chartProps = { data, margin: { left: 4, right: 4, top: 4, bottom: 0 } }\n const axes = (\n <>\n <CartesianGrid vertical={false} strokeOpacity={0.4} />\n <XAxis\n dataKey=\"bucket\"\n tickLine={false}\n axisLine={false}\n tickMargin={6}\n minTickGap={24}\n />\n <YAxis\n tickLine={false}\n axisLine={false}\n width={unit === \"money\" ? 80 : 52}\n tickFormatter={tickFormatter}\n />\n </>\n )\n const tooltip = <ChartTooltip content={<MetricTooltip series={series} />} />\n return (\n <ChartContainer config={config} className=\"h-full min-h-24 w-full\">\n {viz === \"line\" ? (\n <LineChart {...chartProps}>\n {axes}\n {tooltip}\n {series.map((s, i) => (\n <Line\n key={s.key}\n dataKey={s.key}\n type=\"monotone\"\n stroke={chartColor(i)}\n strokeWidth={2}\n // A rate's empty buckets are gaps; dots keep a lone value visible.\n connectNulls={s.unit === \"ratio\"}\n dot={s.unit === \"ratio\" ? { r: 2.5 } : false}\n />\n ))}\n </LineChart>\n ) : viz === \"area\" ? (\n <AreaChart {...chartProps}>\n {axes}\n {tooltip}\n {series.map((s, i) => (\n <Area\n key={s.key}\n dataKey={s.key}\n type=\"monotone\"\n stackId={s.measure}\n stroke={chartColor(i)}\n fill={chartColor(i)}\n fillOpacity={0.35}\n />\n ))}\n </AreaChart>\n ) : (\n <BarChart {...chartProps}>\n {axes}\n {tooltip}\n {series.map((s, i) => (\n <Bar\n key={s.key}\n dataKey={s.key}\n stackId={s.measure}\n fill={chartColor(i)}\n radius={2}\n />\n ))}\n </BarChart>\n )}\n </ChartContainer>\n )\n}\n\nfunction DonutViz({\n result,\n currency,\n}: {\n result: MetricsResult\n currency?: string\n}) {\n const { text: adminText } = useAdminUI()\n\n const primary = indexColumns(result.columns).measures[0]\n if (!primary) return <Empty label={adminText(\"no measure\")} />\n const slices = donutSlices(result, currency)\n if (slices.length === 0)\n return <Empty label={adminText(\"no data in range\")} />\n const groups = groupSeries(slices)\n const charts = groups.map((group) => {\n const config: ChartConfig = {}\n group.series.forEach((slice, i) => {\n config[slice.key] = { label: slice.label, color: chartColor(i) }\n })\n return (\n <section\n key={group.key}\n className={groups.length > 1 ? \"min-h-44 shrink-0\" : \"h-full\"}\n >\n {groups.length > 1 && (\n <div className=\"mb-1 text-xs font-medium text-muted-foreground\">\n {group.label}\n </div>\n )}\n <ChartContainer\n config={config}\n className={\n groups.length > 1 ? \"h-36 w-full\" : \"h-full min-h-24 w-full\"\n }\n >\n <PieChart>\n <ChartTooltip\n content={<MetricTooltip series={group.series} nameKey=\"key\" />}\n />\n <Pie\n data={group.series}\n dataKey=\"value\"\n nameKey=\"key\"\n innerRadius=\"55%\"\n stroke=\"var(--card)\"\n strokeWidth={2}\n >\n {group.series.map((slice, i) => (\n <Cell key={slice.key} fill={chartColor(i)} />\n ))}\n </Pie>\n </PieChart>\n </ChartContainer>\n </section>\n )\n })\n return (\n <div className=\"flex h-full flex-col gap-4 overflow-auto\">{charts}</div>\n )\n}\n\n// humanizeColumn turns a result column name (first_failure_reason) into a\n// label (First failure reason).\nfunction humanizeColumn(name: string): string {\n const words = name.replaceAll(\"_\", \" \").trim()\n return words.charAt(0).toUpperCase() + words.slice(1)\n}\n\nfunction TableViz({\n result,\n currency: fallback,\n}: {\n result: MetricsResult\n currency?: string\n}) {\n const { text: adminText } = useAdminUI()\n\n const idx = indexColumns(result.columns)\n if (result.rows.length === 0)\n return <Empty label={adminText(\"no data in range\")} />\n return (\n <div className=\"h-full overflow-auto\">\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {result.columns.map((c) => (\n <TableHead\n key={c.name}\n className={cn(\n \"text-xs whitespace-nowrap\",\n c.kind === \"measure\" && \"text-right\"\n )}\n >\n {humanizeColumn(c.name)}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {result.rows.map((row, ri) => (\n <TableRow key={ri}>\n {result.columns.map((c, ci) => {\n const cell = row[ci]\n let rendered: string\n if (c.kind === \"time\")\n rendered = formatBucket(String(cell), result.grain)\n else if (c.kind === \"measure\") {\n const currency = rowCurrency(row, idx, fallback)\n rendered = formatMeasure(cell, c.unit, currency)\n } else\n rendered = cell === null || cell === \"\" ? \"—\" : String(cell)\n return (\n <TableCell\n key={c.name}\n className={cn(\n \"text-xs\",\n c.kind === \"measure\" && \"text-right tabular-nums\"\n )}\n >\n {rendered}\n </TableCell>\n )\n })}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAgB,EACd,GACA,GACA,GACQ;CACR,IAAI,KAAU,MAA6B,OAAO;CAGlD,IAAI,MAAS,SAAS,OAAO,EAAmB,GAAO,KAAY,EAAE;CACrE,IAAM,IAAI,OAAO,KAAU,WAAW,IAAQ,OAAO,CAAK;CAC1D,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO,OAAO,CAAK;CAC5C,QAAQ,GAAR;EACE,KAAK,SACH,OAAO,IAAI,IAAI,IAAA,CAAK,eAAe,KAAA,GAAW,EAAE,uBAAuB,EAAE,CAAC,EAAE;EAC9E,KAAK,QACH,OAAO,GAAG,EAAE,eAAe,KAAA,GAAW,EAAE,uBAAuB,EAAE,CAAC,EAAE;EACtE,SACE,OAAO,EAAE,eAAe,KAAA,GAAW,EAAE,uBAAuB,EAAE,CAAC;CACnE;AACF;AAGA,SAAgB,EAAa,GAAa,GAAwB;CAChE,IAAM,IAAI,IAAI,KAAK,CAAG;CACtB,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO;CACtC,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,WACH,OAAO,EAAE,mBAAmB,KAAA,GAAW;GACrC,OAAO;GACP,MAAM;GACN,UAAU;EACZ,CAAC;EACH,KAAK,QACH,OAAO,EAAE,mBAAmB,KAAA,GAAW;GACrC,MAAM;GACN,UAAU;EACZ,CAAC;EACH,SACE,OAAO,EAAE,mBAAmB,KAAA,GAAW;GACrC,OAAO;GACP,KAAK;GACL,UAAU;EACZ,CAAC;CACL;AACF;AASA,SAAgB,EAAa,GAAuC;CAClE,IAAM,IAAmB;EAAE,MAAM;EAAI,MAAM,CAAC;EAAG,UAAU,CAAC;EAAG,UAAU;CAAG;CAQ1E,OAPA,EAAQ,SAAS,GAAG,MAAM;EACxB,AAAI,EAAE,SAAS,SAAQ,EAAI,OAAO,IACzB,EAAE,SAAS,eAClB,EAAI,KAAK,KAAK;GAAE,MAAM,EAAE;GAAM,OAAO;EAAE,CAAC,GACpC,EAAE,SAAS,eAAY,EAAI,WAAW,MACrC,EAAI,SAAS,KAAK;GAAE,MAAM,EAAE;GAAM,MAAM,EAAE;GAAM,OAAO;EAAE,CAAC;CACnE,CAAC,GACM;AACT;AAWA,SAAgB,EAAiB,GAA0C;CACzE,IAAM,IAAa,GAAO,SAAS;CACnC,OAAO,GAAY,WAAW,IAAI,EAAW,EAAE,CAAC,KAAK,IAAI,KAAA;AAC3D;AAEA,SAAgB,EACd,GACA,GACA,GACoB;CACpB,OAAO,EAAI,YAAY,IACnB,OAAO,EAAI,EAAI,aAAa,EAAE,KAAK,KAAA,IACnC;AACN;AAIA,SAAgB,GACd,GACA,GACA,GACe;CACf,IAAI,CAAC,EAAO,gBAAgB,EAAI,OAAkB,MAAM,OAAO;CAC/D,IAAM,IAAM,EAAa,EAAO,OAAO,GACjC,KAAO,MACX,KAAK,UAAU,EAAI,KAAK,KAAK,MAAM,EAAE,EAAE,MAAM,CAAC,GAC1C,IAAa,EAAI,CAAG;CAC1B,IAAI,EAAO,KAAK,QAAQ,MAAM,EAAI,CAAC,MAAM,CAAU,CAAC,CAAC,WAAW,GAAG,OAAO;CAC1E,IAAM,IAAW,EAAO,aAAa,QAAQ,MAAM,EAAI,CAAC,MAAM,CAAU;CACxE,IAAI,EAAS,WAAW,KAAK,EAAS,EAAE,CAAC,OAAkB,MAAM,OAAO;CACxE,IAAM,IAAO,OAAO,EAAS,EAAE,CAAC,EAAa,GACvC,IAAM,OAAO,EAAI,EAAa;CACpC,OAAO,OAAO,SAAS,CAAI,KAAK,OAAO,SAAS,CAAG,KAAK,MAAS,KAC5D,IAAM,KAAQ,KAAK,IAAI,CAAI,IAC5B;AACN;AAIA,SAAgB,GAAa,GAA+B;CAK1D,QAJa,EAAO,gBAChB,KAAK,MAAM,EAAO,cAAc,EAAE,IAClC,KAAK,MAAM,EAAO,cAAc,IAAI,IACpC,OACY,QAAa,cAAc;AAC7C;AAIA,SAAgB,EACd,GAC+C;CAC/C,IAAM,oBAAS,IAAI,IAAyD;CAC5E,KAAK,IAAM,KAAQ,GAAQ;EACzB,IAAM,IAAW,EAAK,SAAS,UAAU,EAAK,WAAW,KAAA,GACnD,IAAM,KAAK,UAAU,CAAC,EAAK,QAAQ,UAAU,KAAY,IAAI,CAAC,GAChE,IAAQ,EAAO,IAAI,CAAG;EAY1B,AAXK,MACH,IAAQ;GACN;GACA,OACE,EAAK,SAAS,UACV,KAAY,mCACZ,EAAK,QAAQ;GACnB,QAAQ,CAAC;EACX,GACA,EAAO,IAAI,GAAK,CAAK,IAEvB,EAAM,OAAO,KAAK,CAAI;CACxB;CACA,OAAO,CAAC,GAAG,EAAO,OAAO,CAAC;AAC5B;AAUA,SAAgB,EAAS,GAA2B;CAClD,OAAO,GAAG,EAAU;AACtB;AAMA,SAAgB,EACd,GACA,GACS;CACT,IAAM,IAAM,EAAa,EAAO,OAAO;CACvC,IAAI,EAAI,OAAO,GAAG,OAAO;EAAE,MAAM,CAAC;EAAG,QAAQ,CAAC;CAAE;CAChD,IAAM,oBAAU,IAAI,IAAoD,GAClE,oBAAS,IAAI,IAAyB;CAC5C,KAAK,IAAM,KAAO,EAAO,MAAM;EAC7B,IAAM,IAAI,OAAO,EAAI,EAAI,KAAK,GAC1B,IAAQ,EAAQ,IAAI,CAAC;EACzB,AAAK,MACH,IAAQ;GAAE,QAAQ,EAAa,GAAG,EAAO,KAAK;GAAG,WAAW;EAAE,GAC9D,EAAQ,IAAI,GAAG,CAAK;EAEtB,IAAM,IAAa,EAAI,KAAK,KAAK,MAAM,EAAI,EAAE,MAAM,GAC7C,IAAW,EACd,KAAK,MAAU,OAAO,KAAS,EAAE,CAAC,CAAC,CACnC,OAAO,OAAO,CAAC,CACf,KAAK,KAAK;EACb,KAAK,IAAM,KAAK,EAAI,UAAU;GAC5B,IAAM,IAAW,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG,CAAU,CAAC,GACnD,IAAO,EAAO,IAAI,CAAQ;GAC9B,AAAK,MACH,IAAO;IACL,KAAK,UAAU,EAAO;IACtB,OACE,KAAY,EAAI,SAAS,SAAS,IAC9B,GAAG,EAAE,KAAK,KAAK,MACf,KAAY,EAAE;IACpB,SAAS,EAAE;IACX;IACA,MAAM,EAAE;IACR,UACE,EAAE,SAAS,UAAU,EAAY,GAAK,GAAK,CAAQ,IAAI,KAAA;GAC3D,GACA,EAAO,IAAI,GAAU,CAAI;GAE3B,IAAM,IAAO,EAAI,EAAE,QACb,IAAQ,EAAE,SAAS,UAAU,OAAO;GAE1C,AADA,EAAM,EAAK,OAAO,MAAS,OAAO,IAAQ,OAAO,CAAI,GACrD,EAAM,EAAS,EAAK,GAAG,KAAK,KAAQ;EACtC;CACF;CACA,IAAM,IAAO,CAAC,GAAG,EAAQ,QAAQ,CAAC,CAAC,CAChC,MAAM,CAAC,IAAI,CAAC,OAAQ,IAAI,IAAI,KAAK,CAAE,CAAC,CACpC,KAAK,GAAG,OAAW,CAAK,GACrB,IAAO,CAAC,GAAG,EAAO,OAAO,CAAC;CAChC,KAAK,IAAM,KAAS,GAClB,KAAK,IAAM,KAAK,GACd,IAAI,EAAE,EAAE,OAAO,IAAQ;EACrB,IAAM,IAAQ,EAAE,SAAS,UAAU,OAAO;EAE1C,AADA,EAAM,EAAE,OAAO,GACf,EAAM,EAAS,EAAE,GAAG,KAAK;CAC3B;CAEJ,OAAO;EAAE;EAAM,QAAQ;CAAK;AAC9B;AAWA,SAAgB,EACd,GACA,GACc;CACd,IAAM,IAAM,EAAa,EAAO,OAAO,GACjC,IAAU,EAAI,SAAS;CAE7B,OADK,IACE,EAAO,KACX,KAAK,GAAK,MAAM;EACf,IAAM,IAAM,SAAS,KACf,IAAO,EAAI,EAAQ;EACzB,OAAO;GACL;GACA,OACE,EAAI,KACD,KAAK,MAAM,OAAO,EAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CACtC,OAAO,OAAO,CAAC,CACf,KAAK,KAAK,KAAK,EAAQ;GAC5B,SAAS,EAAQ;GACjB,YAAY,EAAI,KAAK,KAAK,MAAM,EAAI,EAAE,MAAM;GAC5C,MAAM,EAAQ;GACd,UACE,EAAQ,SAAS,UACb,EAAY,GAAK,GAAK,CAAQ,IAC9B,KAAA;GACN,OAAO,OAAO,KAAQ,CAAC;IACtB,EAAS,CAAG,IAAI,KAAQ;EAC3B;CACF,CAAC,CAAC,CACD,QAAQ,MAAU,EAAM,UAAU,CAAC,IAvBjB,CAAC;AAwBxB;AAGA,SAAgB,EAAW,GAAmB;CAC5C,OAAO,eAAgB,IAAI,IAAK,EAAE;AACpC;AAGA,IAAM,oBAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAKD,SAAgB,EACd,GACA,IAAc,QACC;CACf,IAAM,IAAW,EAAM,YAAY,CAAC;CACpC,IAAI,EAAS,MAAM,MAAM,EAAgB,IAAI,CAAC,CAAC,GAAG,OAAO;CACzD,IAAI,MAAQ,QAAQ,OAAO;CAC3B,IAAM,IAAS,EAAM,SAAS,SAAS,IACjC,KAAO,GAAG,MAAoB,EAAM,MAAM,MAAM,EAAS,SAAS,CAAC,CAAC;CAmB1E,OAlBI,EAAI,iBAAiB,wBAAwB,IACxC,IACH,yBAAyB,mBAAmB,CAAM,MAClD,mBAEF,EAAI,qBAAqB,uBAAuB,IAC3C,iCACL,EAAI,eAAe,IAAU,0CAE/B,EACE,iBACA,gBACA,oBACA,2BACF,IAEO,cACL,EAAI,oBAAoB,IAAU,eAC/B;AACT;AAGA,SAAgB,EAAS,GAAyC;CAChE,IAAI,CAAC,GAAO,OAAO;CACnB,IAAI,EAAM,QAAQ,EAAM,IAAI,OAAO,GAAG,EAAM,KAAK,MAAM,EAAM;CAC7D,IAAM,IAAI,kBAAkB,KAAK,EAAM,QAAQ,EAAE;CACjD,IAAI,CAAC,GAAG,OAAO;CACf,IAAI,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,OAAO;CACzC,IAAM,IAAO;EAAE,GAAG;EAAO,GAAG;EAAQ,GAAG;EAAS,GAAG;CAAO,EAAE,EAAE;CAC9D,OAAO,YAAY,EAAE,GAAG,GAAG,IAAO,EAAE,OAAO,MAAM,KAAK;AACxD;;;ACxVA,IAAM,IAAS;CAAE,OAAO;CAAI,MAAM;AAAQ,GAEpC,IAAoB;CAAE,OAAO;CAAK,QAAQ;AAAI,GAkB9C,IAAe,EAAM,cAAwC,IAAI;AAEvE,SAAS,IAAW;CAClB,IAAM,IAAU,EAAM,WAAW,CAAY;CAE7C,IAAI,CAAC,GACH,MAAU,MAAM,mDAAmD;CAGrE,OAAO;AACT;AAEA,SAAS,EAAe,EACtB,OACA,cACA,aACA,WACA,sBAAmB,GACnB,GAAG,KAUF;CACD,IAAM,IAAW,EAAM,MAAM,GACvB,IAAU,SAAS,KAAM,EAAS,QAAQ,MAAM,EAAE;CAExD,OACE,kBAAC,EAAa,UAAd;EAAuB,OAAO,EAAE,UAAO;EACrC,UAAA,kBAAC,OAAD;GACE,aAAU;GACV,cAAY;GACZ,WAAW,EACT,+pBACA,CACF;GACA,GAAI;GAPN,UAAA,CASE,kBAAC,GAAD;IAAY,IAAI;IAAiB;GAAS,CAAA,GAC1C,kBAAC,EAAkB,qBAAnB;IACoB;IAEjB;GACoC,CAAA,CACpC;;CACgB,CAAA;AAE3B;AAEA,IAAM,KAAc,EAAE,OAAI,gBAAkD;CAC1E,IAAM,IAAc,OAAO,QAAQ,CAAM,CAAC,CAAC,QACxC,GAAG,OAAY,EAAO,SAAS,EAAO,KACzC;CAMA,OAJK,EAAY,SAKf,kBAAC,SAAD,EACE,yBAAyB,EACvB,QAAQ,OAAO,QAAQ,CAAM,CAAC,CAC3B,KACE,CAAC,GAAO,OAAY;EAC/B,EAAO,eAAe,EAAG;EACzB,EACC,KAAK,CAAC,GAAK,OAAgB;EAC1B,IAAM,IACJ,EAAW,QAAQ,MACnB,EAAW;EACb,OAAO,IAAQ,aAAa,EAAI,IAAI,EAAM,KAAK;CACjD,CAAC,CAAC,CACD,KAAK,IAAI,EAAE;;CAGJ,CAAC,CACA,KAAK,IAAI,EACd,EACD,CAAA,IAvBM;AAyBX,GAEM,IAAe,EAAkB;AAEvC,SAAS,EAAoB,EAC3B,WACA,YACA,cACA,eAAY,OACZ,eAAY,IACZ,mBAAgB,IAChB,UACA,mBACA,mBACA,cACA,UACA,YACA,eAcG;CACH,IAAM,EAAE,cAAW,EAAS,GAEtB,IAAe,EAAM,cAAc;EACvC,IAAI,KAAa,CAAC,GAAS,QACzB,OAAO;EAGT,IAAM,CAAC,KAAQ,GACT,IAAM,GAAG,KAAY,GAAM,WAAW,GAAM,QAAQ,WACpD,IAAa,EAA4B,GAAQ,GAAM,CAAG,GAC1D,IACJ,CAAC,KAAY,OAAO,KAAU,WACzB,EAAO,EAAM,EAAE,SAAS,IACzB,GAAY;EAclB,OAZI,IAEA,kBAAC,OAAD;GAAK,WAAW,EAAG,eAAe,CAAc;GAC7C,UAAA,EAAe,GAAO,CAAO;EAC3B,CAAA,IAIJ,IAIE,kBAAC,OAAD;GAAK,WAAW,EAAG,eAAe,CAAc;GAAI,UAAA;EAAW,CAAA,IAH7D;CAIX,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,IAAI,CAAC,KAAU,CAAC,GAAS,QACvB,OAAO;CAGT,IAAM,IAAY,EAAQ,WAAW,KAAK,MAAc;CAExD,OACE,kBAAC,OAAD;EACE,WAAW,EACT,sHACA,CACF;EAJF,UAAA,CAMI,IAA2B,OAAf,GACd,kBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,EACE,QAAQ,MAAS,EAAK,SAAS,MAAM,CAAC,CACtC,KAAK,GAAM,MAAU;IACpB,IAAM,IAAM,GAAG,KAAW,EAAK,QAAQ,EAAK,WAAW,WACjD,IAAa,EAA4B,GAAQ,GAAM,CAAG,GAC1D,IAAiB,KAAS,EAAK,SAAS,QAAQ,EAAK;IAE3D,OACE,kBAAC,OAAD;KAEE,WAAW,EACT,uGACA,MAAc,SAAS,cACzB;KAEC,UAAA,KAAa,GAAM,UAAU,KAAA,KAAa,EAAK,OAC9C,EAAU,EAAK,OAAO,EAAK,MAAM,GAAM,GAAO,EAAK,OAAO,IAE1D,kBAAA,GAAA,EAAA,UAAA,CACG,GAAY,OACX,kBAAC,EAAW,MAAZ,CAAkB,CAAA,IAElB,CAAC,KACC,kBAAC,OAAD;MACE,WAAW,EACT,kEACA;OACE,eAAe,MAAc;OAC7B,OAAO,MAAc;OACrB,mDACE,MAAc;OAChB,UAAU,KAAa,MAAc;MACvC,CACF;MACA,OACE;OACE,cAAc;OACd,kBAAkB;MACpB;KAEH,CAAA,GAGL,kBAAC,OAAD;MACE,WAAW,EACT,4CACA,IAAY,cAAc,cAC5B;MAJF,UAAA,CAME,kBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACG,IAAY,IAAe,MAC5B,kBAAC,QAAD;QAAM,WAAU;QACb,UAAA,GAAY,SAAS,EAAK;OACvB,CAAA,CACH;MACJ,CAAA,GAAA,EAAK,SAAS,QACb,kBAAC,QAAD;OAAM,WAAU;OACb,UAAA,OAAO,EAAK,SAAU,WACnB,EAAK,MAAM,eAAe,IAC1B,OAAO,EAAK,KAAK;MACjB,CAAA,CAEL;KACL,CAAA,CAAA,EAAA,CAAA;IAED,GAxDE,CAwDF;GAET,CAAC;EACA,CAAA,CACF;;AAET;AA2DA,SAAS,EACP,GACA,GACA,GACA;CACA,IAAI,OAAO,KAAY,aAAY,GACjC;CAGF,IAAM,IACJ,aAAa,KACb,OAAO,EAAQ,WAAY,YAC3B,EAAQ,YAAY,OAChB,EAAQ,UACR,KAAA,GAEF,IAAyB;CAiB7B,OAdE,KAAO,KACP,OAAO,EAAQ,MAAiC,WAEhD,IAAiB,EAAQ,KAEzB,KACA,KAAO,KACP,OAAO,EAAe,MAAwC,aAE9D,IAAiB,EACf,KAIG,KAAkB,IAAS,EAAO,KAAkB,EAAO;AACpE;;;AC7SA,SAAgB,GAAc,EAC5B,QACA,WACA,YAKC;CACD,IAAM,IAAW,EAAiB,CAAK;CACvC,QAAQ,GAAR;EACE,KAAK,QACH,OAAO,kBAAC,IAAD;GAAiB;GAAkB;EAAW,CAAA;EACvD,KAAK;EACL,KAAK;EACL,KAAK,OACH,OAAO,kBAAC,IAAD;GAAoB;GAAa;GAAkB;EAAW,CAAA;EACvE,KAAK,SACH,OAAO,kBAAC,IAAD;GAAkB;GAAkB;EAAW,CAAA;EACxD,KAAK,SACH,OAAO,kBAAC,IAAD;GAAkB;GAAkB;EAAW,CAAA;CAC1D;AACF;AAEA,SAAS,EAAM,EAAE,YAA4B;CAC3C,OACE,kBAAC,OAAD;EAAK,WAAU;EACZ,UAAA;CACE,CAAA;AAET;AAEA,SAAS,GAAQ,EACf,WACA,UAAU,KAIT;CACD,IAAM,EAAE,MAAM,MAAc,EAAW,GAEjC,IAAM,EAAa,EAAO,OAAO,GACjC,IAAU,EAAI,SAAS;CAC7B,IAAI,CAAC,GAAS,OAAO,kBAAC,GAAD,EAAO,OAAO,EAAU,YAAY,EAAI,CAAA;CAC7D,IAAI,EAAO,KAAK,WAAW,GACzB,OACE,kBAAC,OAAD;EAAK,WAAU;EACZ,UAAA,EAAc,GAAG,EAAQ,MAAM,CAAQ;CACrC,CAAA;CAIT,IAAM,IAAO,EAAO,KAAK,MAAM,GAAG,CAAC,GAC7B,IAAU,GAAa,CAAM;CACnC,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACG,EAAK,KAAK,GAAK,MAAM;GACpB,IAAM,IAAW,EAAY,GAAK,GAAK,CAAQ,GACzC,IAAQ,GAAU,GAAQ,GAAK,EAAQ,KAAK,GAC5C,IACJ,EAAK,SAAS,IACV,EAAI,KACD,KAAK,MAAM,OAAO,EAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CACtC,OAAO,OAAO,CAAC,CACf,KAAK,IAAI,IACZ;GACN,OACE,kBAAC,OAAD;IAEE,WAAU;IAFZ,UAAA;KAIE,kBAAC,QAAD;MACE,WAAW,EACT,8BACA,EAAK,SAAS,IAAI,YAAY,UAChC;MAEC,UAAA,EAAc,EAAI,EAAQ,QAAQ,EAAQ,MAAM,CAAQ;KACrD,CAAA;KACL,IACC,kBAAC,QAAD;MAAM,WAAU;MAAiC,UAAA;KAAe,CAAA,IAC9D;KACH,MAAU,OAcP,OAbF,kBAAC,QAAD;MACE,WAAW,EACT,0DACA,KAAS,IAAI,iBAAiB,aAChC;MAJF,UAAA,CAMG,KAAS,IACR,kBAAC,GAAD;OAAe,MAAM;OAAiB,WAAU;MAAU,CAAA,IAE1D,kBAAC,GAAD;OAAe,MAAM;OAAmB,WAAU;MAAU,CAAA,GAE7D,GAAG,KAAS,IAAI,MAAM,MAAM,IAAQ,IAAA,CAAK,QAAQ,CAAC,EAAE,OAAO,GACxD;KACJ,CAAA;IACD;GA7BE,GAAA,CA6BF;EAET,CAAC,GACA,EAAO,KAAK,SAAS,IACpB,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA;IAAgD;IAC5C,EAAO,KAAK,SAAS;IACvB,kBAAC,GAAD,EAAc,IAAI,QAAU,CAAA;GACxB;EACJ,CAAA,IAAA,IACD;;AAET;AAKA,SAAgB,EAAc,EAC5B,WACA,GAAG,KACsE;CACzE,IAAM,IAAU,EAAO;CACvB,OACE,kBAAC,GAAD;EACE,GAAI;EACJ,YAAY,GAAO,GAAM,MAAS;GAGhC,IAAM,IAAO,EAA+B,SACtC,IACJ,KAAO,OAAO,KAAQ,WACjB,EAAgC,EAAS,OAAO,CAAI,CAAC,KACtD,KAAA,GACA,IACJ,OAAO,KAAU,YAAY,OAAO,KAAU,WAC1C,IACA,OAAO,CAAK;GAClB,OACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,QAAD;KAAM,WAAU;KACb,UAAA,EAAO,MAAM,MAAS,EAAK,QAAQ,OAAO,CAAI,CAAC,CAAC,EAAE,SAAS;IACxD,CAAA,GACN,kBAAC,QAAD;KAAM,WAAU;KACb,UAAA,EAAc,GAAM,EAAQ,MAAM,EAAQ,QAAQ;IAC/C,CAAA,CACH;;EAET;CACD,CAAA;AAEL;AAEA,SAAS,GAAc,EACrB,QACA,WACA,eAKC;CACD,IAAM,EAAE,MAAM,MAAc,EAAW,GAEjC,EAAE,SAAM,cAAW,EAAgB,GAAQ,CAAQ;CACzD,IAAI,EAAK,WAAW,KAAK,EAAO,WAAW,GACzC,OAAO,kBAAC,GAAD,EAAO,OAAO,EAAU,kBAAkB,EAAI,CAAA;CACvD,IAAM,IAAS,EAAY,CAAM;CAGjC,OAFI,EAAO,WAAW,IACb,kBAAC,GAAD;EAAsB;EAAW;EAAc;CAAS,CAAA,IAE/D,kBAAC,OAAD;EAAK,WAAU;EACZ,UAAA,EAAO,KAAK,MACX,kBAAC,WAAD;GAAyB,WAAU;GAAnC,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,EAAM;GACJ,CAAA,GACL,kBAAC,OAAD;IAAK,WAAU;IACb,UAAA,kBAAC,GAAD;KAAsB;KAAW;KAAM,QAAQ,EAAM;IAAS,CAAA;GAC3D,CAAA,CACE;EAPK,GAAA,EAAM,GAOX,CACV;CACE,CAAA;AAET;AAEA,SAAS,EAAgB,EACvB,QACA,SACA,aAC6C;CAC7C,IAAM,IAAsB,CAAC;CAC7B,EAAO,SAAS,GAAG,MAAM;EACvB,EAAO,EAAE,OAAO;GAAE,OAAO,EAAE;GAAO,OAAO,EAAW,CAAC;EAAE;CACzD,CAAC;CACD,IAAM,IAAO,EAAO,EAAE,EAAE,MAClB,KAAiB,MACrB,EAAc,GAAG,GAAM,EAAO,EAAE,EAAE,QAAQ,GACtC,IAAa;EAAE;EAAM,QAAQ;GAAE,MAAM;GAAG,OAAO;GAAG,KAAK;GAAG,QAAQ;EAAE;CAAE,GACtE,IACJ,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GAAe,UAAU;GAAO,eAAe;EAAM,CAAA;EACrD,kBAAC,GAAD;GACE,SAAQ;GACR,UAAU;GACV,UAAU;GACV,YAAY;GACZ,YAAY;EACb,CAAA;EACD,kBAAC,GAAD;GACE,UAAU;GACV,UAAU;GACV,OAAO,MAAS,UAAU,KAAK;GAChB;EAChB,CAAA;CACD,EAAA,CAAA,GAEE,IAAU,kBAAC,GAAD,EAAc,SAAS,kBAAC,GAAD,EAAuB,UAAS,CAAA,EAAI,CAAA;CAC3E,OACE,kBAAC,GAAD;EAAwB;EAAQ,WAAU;EACvC,UAAA,MAAQ,SACP,kBAAC,GAAD;GAAW,GAAI;GAAf,UAAA;IACG;IACA;IACA,EAAO,KAAK,GAAG,MACd,kBAAC,GAAD;KAEE,SAAS,EAAE;KACX,MAAK;KACL,QAAQ,EAAW,CAAC;KACpB,aAAa;KAEb,cAAc,EAAE,SAAS;KACzB,KAAK,EAAE,SAAS,WAAU,EAAE,GAAG,IAAI;IACpC,GARM,EAAE,GAQR,CACF;GACQ;EACT,CAAA,IAAA,MAAQ,SACV,kBAAC,GAAD;GAAW,GAAI;GAAf,UAAA;IACG;IACA;IACA,EAAO,KAAK,GAAG,MACd,kBAAC,GAAD;KAEE,SAAS,EAAE;KACX,MAAK;KACL,SAAS,EAAE;KACX,QAAQ,EAAW,CAAC;KACpB,MAAM,EAAW,CAAC;KAClB,aAAa;IACd,GAPM,EAAE,GAOR,CACF;GACQ;EAEX,CAAA,IAAA,kBAAC,GAAD;GAAU,GAAI;GAAd,UAAA;IACG;IACA;IACA,EAAO,KAAK,GAAG,MACd,kBAAC,GAAD;KAEE,SAAS,EAAE;KACX,SAAS,EAAE;KACX,MAAM,EAAW,CAAC;KAClB,QAAQ;IACT,GALM,EAAE,GAKR,CACF;GACO;;CAEE,CAAA;AAEpB;AAEA,SAAS,GAAS,EAChB,WACA,eAIC;CACD,IAAM,EAAE,MAAM,MAAc,EAAW;CAGvC,IAAI,CADY,EAAa,EAAO,OAAO,CAAC,CAAC,SAAS,IACxC,OAAO,kBAAC,GAAD,EAAO,OAAO,EAAU,YAAY,EAAI,CAAA;CAC7D,IAAM,IAAS,EAAY,GAAQ,CAAQ;CAC3C,IAAI,EAAO,WAAW,GACpB,OAAO,kBAAC,GAAD,EAAO,OAAO,EAAU,kBAAkB,EAAI,CAAA;CACvD,IAAM,IAAS,EAAY,CAAM,GAC3B,IAAS,EAAO,KAAK,MAAU;EACnC,IAAM,IAAsB,CAAC;EAI7B,OAHA,EAAM,OAAO,SAAS,GAAO,MAAM;GACjC,EAAO,EAAM,OAAO;IAAE,OAAO,EAAM;IAAO,OAAO,EAAW,CAAC;GAAE;EACjE,CAAC,GAEC,kBAAC,WAAD;GAEE,WAAW,EAAO,SAAS,IAAI,sBAAsB;GAFvD,UAAA,CAIG,EAAO,SAAS,KACf,kBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,EAAM;GACJ,CAAA,GAEP,kBAAC,GAAD;IACU;IACR,WACE,EAAO,SAAS,IAAI,gBAAgB;IAGtC,UAAA,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EACE,SAAS,kBAAC,GAAD;KAAe,QAAQ,EAAM;KAAQ,SAAQ;IAAO,CAAA,EAC9D,CAAA,GACD,kBAAC,IAAD;KACE,MAAM,EAAM;KACZ,SAAQ;KACR,SAAQ;KACR,aAAY;KACZ,QAAO;KACP,aAAa;KAEZ,UAAA,EAAM,OAAO,KAAK,GAAO,MACxB,kBAAC,GAAD,EAAsB,MAAM,EAAW,CAAC,EAAI,GAAjC,EAAM,GAA2B,CAC7C;IACE,CAAA,CACG,EAAA,CAAA;GACI,CAAA,CACT;EAhCF,GAAA,EAAM,GAgCJ;CAEb,CAAC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;EAA4C,UAAA;CAAY,CAAA;AAE3E;AAIA,SAAS,GAAe,GAAsB;CAC5C,IAAM,IAAQ,EAAK,WAAW,KAAK,GAAG,CAAC,CAAC,KAAK;CAC7C,OAAO,EAAM,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAM,MAAM,CAAC;AACtD;AAEA,SAAS,GAAS,EAChB,WACA,UAAU,KAIT;CACD,IAAM,EAAE,MAAM,MAAc,EAAW,GAEjC,IAAM,EAAa,EAAO,OAAO;CAGvC,OAFI,EAAO,KAAK,WAAW,IAClB,kBAAC,GAAD,EAAO,OAAO,EAAU,kBAAkB,EAAI,CAAA,IAErD,kBAAC,OAAD;EAAK,WAAU;EACb,UAAA,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAU,WAAU;GACjB,UAAA,EAAO,QAAQ,KAAK,MACnB,kBAAC,GAAD;IAEE,WAAW,EACT,6BACA,EAAE,SAAS,aAAa,YAC1B;IAEC,UAAA,GAAe,EAAE,IAAI;GACb,GAPJ,EAAE,IAOE,CACZ;EACO,CAAA,EACC,CAAA,GACb,kBAAC,GAAD,EAAA,UACG,EAAO,KAAK,KAAK,GAAK,MACrB,kBAAC,GAAD,EAAA,UACG,EAAO,QAAQ,KAAK,GAAG,MAAO;GAC7B,IAAM,IAAO,EAAI,IACb;GACJ,IAAI,EAAE,SAAS,QACb,IAAW,EAAa,OAAO,CAAI,GAAG,EAAO,KAAK;QAC/C,IAAI,EAAE,SAAS,WAAW;IAC7B,IAAM,IAAW,EAAY,GAAK,GAAK,CAAQ;IAC/C,IAAW,EAAc,GAAM,EAAE,MAAM,CAAQ;GACjD,OACE,IAAW,MAAS,QAAQ,MAAS,KAAK,MAAM,OAAO,CAAI;GAC7D,OACE,kBAAC,GAAD;IAEE,WAAW,EACT,WACA,EAAE,SAAS,aAAa,yBAC1B;IAEC,UAAA;GACQ,GAPJ,EAAE,IAOE;EAEf,CAAC,EACO,GAvBK,CAuBL,CACX,EACQ,CAAA,CACN,EAAA,CAAA;CACJ,CAAA;AAET"}
|
|
1
|
+
{"version":3,"file":"admin-widget-viz-RCkxUspL.js","names":[],"sources":["../src/admin/pages/dashboard/lib.ts","../src/admin/components/ui/chart.tsx","../src/admin/pages/dashboard/widget-viz.tsx"],"sourcesContent":["// Result-shaping helpers for dashboard widgets: unit-aware formatting,\n// time-series pivoting, and deep links (every count tile links to its list).\nimport type {\n MetricsCell,\n MetricsColumn,\n MetricsQuery,\n MetricsRange,\n MetricsResult,\n} from \"#orck/admin/lib/api/metrics\"\nimport { formatNativeAmount } from \"#orck/admin/lib/format\"\n\n// formatMeasure renders one measure cell by its column unit.\nexport function formatMeasure(\n value: MetricsCell,\n unit: string | undefined,\n currency?: string\n): string {\n if (value === null || value === undefined) return \"—\"\n // \"money\" cells are exact decimal strings of native units at the\n // currency's registered scale (a money-unit ratio arrives already rounded).\n if (unit === \"money\") return formatNativeAmount(value, currency ?? \"\")\n const n = typeof value === \"number\" ? value : Number(value)\n if (!Number.isFinite(n)) return String(value)\n switch (unit) {\n case \"ratio\":\n return `${(n * 100).toLocaleString(undefined, { maximumFractionDigits: 2 })}%`\n case \"days\":\n return `${n.toLocaleString(undefined, { maximumFractionDigits: 1 })} d`\n default:\n return n.toLocaleString(undefined, { maximumFractionDigits: 2 })\n }\n}\n\n// formatBucket renders a time-bucket label for the query grain.\nexport function formatBucket(iso: string, grain?: string): string {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n switch (grain) {\n case \"month\":\n case \"quarter\":\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n year: \"numeric\",\n timeZone: \"UTC\",\n })\n case \"year\":\n return d.toLocaleDateString(undefined, {\n year: \"numeric\",\n timeZone: \"UTC\",\n })\n default:\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n timeZone: \"UTC\",\n })\n }\n}\n\nexport interface ColumnIndex {\n time: number\n dims: { name: string; index: number }[]\n measures: { name: string; unit?: string; index: number }[]\n currency: number\n}\n\nexport function indexColumns(columns: MetricsColumn[]): ColumnIndex {\n const idx: ColumnIndex = { time: -1, dims: [], measures: [], currency: -1 }\n columns.forEach((c, i) => {\n if (c.kind === \"time\") idx.time = i\n else if (c.kind === \"dimension\") {\n idx.dims.push({ name: c.name, index: i })\n if (c.name === \"currency\") idx.currency = i\n } else idx.measures.push({ name: c.name, unit: c.unit, index: i })\n })\n return idx\n}\n\nexport interface PivotSeries {\n key: string\n label: string\n measure: string\n dimensions: MetricsCell[]\n unit?: string\n currency?: string\n}\n\nexport function filteredCurrency(query?: MetricsQuery): string | undefined {\n const currencies = query?.filters?.currency\n return currencies?.length === 1 ? currencies[0].trim() : undefined\n}\n\nexport function rowCurrency(\n row: MetricsCell[],\n idx: ColumnIndex,\n fallback?: string\n): string | undefined {\n return idx.currency >= 0\n ? String(row[idx.currency] ?? \"\") || undefined\n : fallback\n}\n\n// Absolute bucket dates differ between periods; stat deltas are defined only\n// for a single value per dimension tuple. Never sum ratios or unlike monies.\nexport function statDelta(\n result: MetricsResult,\n row: MetricsCell[],\n measureIndex: number\n): number | null {\n if (!result.compare_rows || row[measureIndex] === null) return null\n const idx = indexColumns(result.columns)\n const key = (r: MetricsCell[]) =>\n JSON.stringify(idx.dims.map((d) => r[d.index]))\n const currentKey = key(row)\n if (result.rows.filter((r) => key(r) === currentKey).length !== 1) return null\n const previous = result.compare_rows.filter((r) => key(r) === currentKey)\n if (previous.length !== 1 || previous[0][measureIndex] === null) return null\n const prev = Number(previous[0][measureIndex])\n const cur = Number(row[measureIndex])\n return Number.isFinite(prev) && Number.isFinite(cur) && prev !== 0\n ? (cur - prev) / Math.abs(prev)\n : null\n}\n\n// comparedWith names the period a stat's delta compares with: a one-day\n// range compares with yesterday.\nexport function comparedWith(result: MetricsResult): string {\n const span = result.compare_range\n ? Date.parse(result.compare_range.to) -\n Date.parse(result.compare_range.from)\n : 0\n return span === 86_400_000 ? \"yesterday\" : \"previous period\"\n}\n\n// One axis (or donut total) may only combine the same measurement unit and\n// currency. Counts do not become money just because a currency dimension exists.\nexport function groupSeries<T extends PivotSeries>(\n series: T[]\n): { key: string; label: string; series: T[] }[] {\n const groups = new Map<string, { key: string; label: string; series: T[] }>()\n for (const item of series) {\n const currency = item.unit === \"money\" ? item.currency : undefined\n const key = JSON.stringify([item.unit ?? \"number\", currency ?? null])\n let group = groups.get(key)\n if (!group) {\n group = {\n key,\n label:\n item.unit === \"money\"\n ? currency || \"Amount (currency not supplied)\"\n : item.unit || \"Values\",\n series: [],\n }\n groups.set(key, group)\n }\n group.series.push(item)\n }\n return [...groups.values()]\n}\n\nexport interface Pivoted {\n data: Record<string, number | string | null>[]\n series: PivotSeries[]\n}\n\n// exactKey names the pivoted row field that keeps a series' exact wire cell\n// (a money decimal string) beside the Number recharts plots, so tooltips\n// format the exact value rather than a Number-coerced one.\nexport function exactKey(seriesKey: string): string {\n return `${seriesKey}:exact`\n}\n\n// pivotTimeSeries turns tabular rows into recharts rows keyed by bucket, one\n// series per measure × dimension-value combination. Server-zero-filled\n// buckets render as-is; combos absent for a bucket fill 0 so stacks align.\n// A ratio with nothing to divide by is no data, not 0%: it stays null.\nexport function pivotTimeSeries(\n result: MetricsResult,\n currency?: string\n): Pivoted {\n const idx = indexColumns(result.columns)\n if (idx.time < 0) return { data: [], series: [] }\n const buckets = new Map<string, Record<string, number | string | null>>()\n const series = new Map<string, PivotSeries>()\n for (const row of result.rows) {\n const t = String(row[idx.time])\n let entry = buckets.get(t)\n if (!entry) {\n entry = { bucket: formatBucket(t, result.grain), bucketISO: t }\n buckets.set(t, entry)\n }\n const dimensions = idx.dims.map((d) => row[d.index])\n const dimLabel = dimensions\n .map((value) => String(value ?? \"\"))\n .filter(Boolean)\n .join(\" · \")\n for (const m of idx.measures) {\n const identity = JSON.stringify([m.name, ...dimensions])\n let item = series.get(identity)\n if (!item) {\n item = {\n key: `series-${series.size}`,\n label:\n dimLabel && idx.measures.length > 1\n ? `${m.name} · ${dimLabel}`\n : dimLabel || m.name,\n measure: m.name,\n dimensions,\n unit: m.unit,\n currency:\n m.unit === \"money\" ? rowCurrency(row, idx, currency) : undefined,\n }\n series.set(identity, item)\n }\n const cell = row[m.index]\n const empty = m.unit === \"ratio\" ? null : 0\n entry[item.key] = cell === null ? empty : Number(cell)\n entry[exactKey(item.key)] = cell ?? empty\n }\n }\n const data = [...buckets.entries()]\n .sort(([a], [b]) => (a < b ? -1 : 1))\n .map(([, entry]) => entry)\n const keys = [...series.values()]\n for (const entry of data) {\n for (const s of keys)\n if (!(s.key in entry)) {\n const empty = s.unit === \"ratio\" ? null : 0\n entry[s.key] = empty\n entry[exactKey(s.key)] = empty\n }\n }\n return { data, series: keys }\n}\n\n// DonutSlice is one pie slice: the plotted Number beside the exact wire cell\n// (under exactKey) the tooltip formats, as the time-series rows do.\nexport type DonutSlice = PivotSeries & {\n value: number\n [exact: string]: unknown\n}\n\n// donutSlices turns the result's rows into slices for the primary measure,\n// dropping zero slices.\nexport function donutSlices(\n result: MetricsResult,\n currency?: string\n): DonutSlice[] {\n const idx = indexColumns(result.columns)\n const primary = idx.measures[0]\n if (!primary) return []\n return result.rows\n .map((row, i) => {\n const key = `slice-${i}`\n const cell = row[primary.index]\n return {\n key,\n label:\n idx.dims\n .map((d) => String(row[d.index] ?? \"\"))\n .filter(Boolean)\n .join(\" · \") || primary.name,\n measure: primary.name,\n dimensions: idx.dims.map((d) => row[d.index]),\n unit: primary.unit,\n currency:\n primary.unit === \"money\"\n ? rowCurrency(row, idx, currency)\n : undefined,\n value: Number(cell ?? 0),\n [exactKey(key)]: cell ?? 0,\n }\n })\n .filter((slice) => slice.value !== 0)\n}\n\n// chartColor cycles the shadcn --chart-N tokens.\nexport function chartColor(i: number): string {\n return `var(--chart-${(i % 5) + 1})`\n}\n\n// Decline, rebill-failure and NMI history measures open Payments → Health.\nconst HEALTH_MEASURES = new Set([\n \"attempts\",\n \"approved_attempts\",\n \"failed_attempts\",\n \"attempt_failure_rate\",\n \"purchases\",\n \"failed_purchases\",\n \"purchase_failure_rate\",\n \"attempts_per_purchase\",\n \"purchase_recovery_rate\",\n \"rebills_due\",\n \"rebills_open\",\n \"rebills_attempted\",\n \"rebill_first_failures\",\n \"rebill_first_failure_rate\",\n \"rebills_missed\",\n \"rebill_missed_rate\",\n \"dunning_recovered\",\n \"dunning_recovery_rate\",\n \"rebill_collection_rate\",\n \"rebill_loss_rate\",\n \"nmi_history_authorizations\",\n \"nmi_history_approved\",\n \"nmi_history_refused\",\n \"nmi_history_refusal_rate\",\n])\n\n// deepLinkFor maps a widget to the admin page carrying the same filter: health\n// measures in any viz open the health page, count stats open their list. Null\n// = no sensible link.\nexport function deepLinkFor(\n query: MetricsQuery,\n viz: string = \"stat\"\n): string | null {\n const measures = query.measures ?? []\n if (measures.some((m) => HEALTH_MEASURES.has(m))) return \"/payments/health\"\n if (viz !== \"stat\") return null\n const status = query.filters?.status?.[0]\n const has = (...names: string[]) => names.some((n) => measures.includes(n))\n if (has(\"subscriptions\", \"billable_subscriptions\")) {\n return status\n ? `/subscriptions?status=${encodeURIComponent(status)}`\n : \"/subscriptions\"\n }\n if (has(\"new_subscriptions\", \"net_new_subscriptions\"))\n return \"/subscriptions?status=active\"\n if (has(\"cancellations\")) return \"/subscriptions?view=recently_canceled\"\n if (\n has(\n \"payment_count\",\n \"refund_count\",\n \"chargeback_count\",\n \"unique_rebilled_customers\"\n )\n )\n return \"/payments\"\n if (has(\"entitled_customers\")) return \"/customers\"\n return null\n}\n\n// ownRange says in words what a saved query's range covers.\nexport function ownRange(range: MetricsRange | undefined): string {\n if (!range) return \"its saved range\"\n if (range.from && range.to) return `${range.from} to ${range.to}`\n const m = /^(\\d+)([dwmy])$/.exec(range.last ?? \"\")\n if (!m) return \"its saved range\"\n if (m[1] === \"1\" && m[2] === \"d\") return \"today\"\n const unit = { d: \"day\", w: \"week\", m: \"month\", y: \"year\" }[m[2]]!\n return `the last ${m[1]} ${unit}${m[1] === \"1\" ? \"\" : \"s\"}`\n}\n","import * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\nimport type { TooltipValueType } from \"recharts\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const\ntype TooltipNameType = number | string\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\")\n }\n\n return context\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\n initialDimension?: {\n width: number\n height: number\n }\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer\n initialDimension={initialDimension}\n >\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme ?? config.color\n )\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ??\n itemConfig.color\n return color ? ` --color-${key}: ${color};` : null\n })\n .join(\"\\n\")}\n}\n`\n )\n .join(\"\\n\"),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: \"line\" | \"dot\" | \"dashed\"\n nameKey?: string\n labelKey?: string\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<\n TooltipValueType,\n TooltipNameType\n >,\n \"accessibilityLayer\"\n >) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === \"string\"\n ? (config[label]?.label ?? label)\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n return (\n <div\n className={cn(\n \"grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey ?? item.name ?? item.dataKey ?? \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color ?? item.payload?.fill ?? item.color\n\n return (\n <div\n key={index}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === \"number\"\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: React.ComponentProps<\"div\"> & {\n hideIcon?: boolean\n nameKey?: string\n} & RechartsPrimitive.DefaultLegendContentProps) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey ?? item.dataKey ?? \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\n// Viz renderers: stat tile with compare delta, line/area/bar (shadcn chart on\n// recharts), donut, table. Input is the raw tabular metrics result; nothing\n// re-queries client-side.\nimport type { ComponentProps } from \"react\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { AnalyticsDownIcon, AnalyticsUpIcon } from \"@hugeicons/core-free-icons\"\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n Line,\n LineChart,\n Pie,\n PieChart,\n XAxis,\n YAxis,\n} from \"recharts\"\n\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"#orck/admin/components/ui/table\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"#orck/admin/components/ui/chart\"\nimport type {\n MetricsResult,\n MetricsQuery,\n WidgetViz as VizType,\n} from \"#orck/admin/lib/api/metrics\"\nimport { cn } from \"#orck/admin/lib/utils\"\n\nimport {\n comparedWith,\n donutSlices,\n chartColor,\n exactKey,\n filteredCurrency,\n groupSeries,\n rowCurrency,\n statDelta,\n type PivotSeries,\n type Pivoted,\n formatBucket,\n formatMeasure,\n indexColumns,\n pivotTimeSeries,\n} from \"./lib\"\n\nexport function WidgetVizView({\n viz,\n result,\n query,\n}: {\n viz: VizType\n result: MetricsResult\n query?: MetricsQuery\n}) {\n const currency = filteredCurrency(query)\n switch (viz) {\n case \"stat\":\n return <StatViz result={result} currency={currency} />\n case \"line\":\n case \"area\":\n case \"bar\":\n return <TimeSeriesViz viz={viz} result={result} currency={currency} />\n case \"donut\":\n return <DonutViz result={result} currency={currency} />\n case \"table\":\n return <TableViz result={result} currency={currency} />\n }\n}\n\nfunction Empty({ label }: { label: string }) {\n return (\n <div className=\"flex h-full min-h-16 items-center justify-center text-sm text-muted-foreground\">\n {label}\n </div>\n )\n}\n\nfunction StatViz({\n result,\n currency: fallback,\n}: {\n result: MetricsResult\n currency?: string\n}) {\n const { text: adminText } = useAdminUI()\n\n const idx = indexColumns(result.columns)\n const primary = idx.measures[0]\n if (!primary) return <Empty label={adminText(\"no measure\")} />\n if (result.rows.length === 0) {\n return (\n <div className=\"text-2xl font-semibold tabular-nums\">\n {formatMeasure(0, primary.unit, fallback)}\n </div>\n )\n }\n // One rendered value per row (rows differ by dims — usually currency).\n const rows = result.rows.slice(0, 3)\n const against = comparedWith(result)\n return (\n <div className=\"flex h-full flex-col justify-center gap-1\">\n {rows.map((row, i) => {\n const currency = rowCurrency(row, idx, fallback)\n const delta = statDelta(result, row, primary.index)\n const dimLabel =\n rows.length > 1\n ? idx.dims\n .map((d) => String(row[d.index] ?? \"\"))\n .filter(Boolean)\n .join(\" ·\")\n : \"\"\n return (\n <div\n key={i}\n className=\"flex flex-wrap items-baseline gap-x-2 gap-y-0.5\"\n >\n <span\n className={cn(\n \"font-semibold tabular-nums\",\n rows.length > 1 ? \"text-lg\" : \"text-3xl\"\n )}\n >\n {formatMeasure(row[primary.index], primary.unit, currency)}\n </span>\n {dimLabel ? (\n <span className=\"text-xs text-muted-foreground\">{dimLabel}</span>\n ) : null}\n {delta !== null ? (\n <span\n className={cn(\n \"flex basis-full items-center gap-1 text-xs font-medium\",\n delta >= 0 ? \"text-settled\" : \"text-failed\"\n )}\n >\n {delta >= 0 ? (\n <HugeiconsIcon icon={AnalyticsUpIcon} className=\"size-3\" />\n ) : (\n <HugeiconsIcon icon={AnalyticsDownIcon} className=\"size-3\" />\n )}\n {`${delta >= 0 ? \"+\" : \"\"}${(delta * 100).toFixed(1)}% vs ${against}`}\n </span>\n ) : null}\n </div>\n )\n })}\n {result.rows.length > 3 ? (\n <span className=\"text-xs text-muted-foreground\">\n +{result.rows.length - 3}\n <AdminMessage id={\" more\"} />\n </span>\n ) : null}\n </div>\n )\n}\n\n// MetricTooltip formats a hovered value from the exact wire cell the series\n// row carries under exactKey (a money decimal string), falling back to the\n// plotted Number only for series that never had one. Exported for tests.\nexport function MetricTooltip({\n series,\n ...props\n}: ComponentProps<typeof ChartTooltipContent> & { series: PivotSeries[] }) {\n const measure = series[0]\n return (\n <ChartTooltipContent\n {...props}\n formatter={(value, name, item) => {\n // item.payload is the pivoted row, which carries each series' exact\n // wire cell beside the Number recharts plots.\n const row = (item as { payload?: unknown }).payload\n const exact =\n row && typeof row === \"object\"\n ? (row as Record<string, unknown>)[exactKey(String(name))]\n : undefined\n const cell =\n typeof exact === \"string\" || typeof exact === \"number\"\n ? exact\n : Number(value)\n return (\n <div className=\"flex w-full items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">\n {series.find((item) => item.key === String(name))?.label ?? name}\n </span>\n <span className=\"font-mono font-medium tabular-nums\">\n {formatMeasure(cell, measure.unit, measure.currency)}\n </span>\n </div>\n )\n }}\n />\n )\n}\n\nfunction TimeSeriesViz({\n viz,\n result,\n currency,\n}: {\n viz: \"line\" | \"area\" | \"bar\"\n result: MetricsResult\n currency?: string\n}) {\n const { text: adminText } = useAdminUI()\n\n const { data, series } = pivotTimeSeries(result, currency)\n if (data.length === 0 || series.length === 0)\n return <Empty label={adminText(\"no data in range\")} />\n const groups = groupSeries(series)\n if (groups.length === 1)\n return <TimeSeriesChart viz={viz} data={data} series={series} />\n return (\n <div className=\"flex h-full flex-col gap-4 overflow-auto\">\n {groups.map((group) => (\n <section key={group.key} className=\"min-h-44 shrink-0\">\n <div className=\"mb-1 text-xs font-medium text-muted-foreground\">\n {group.label}\n </div>\n <div className=\"h-36\">\n <TimeSeriesChart viz={viz} data={data} series={group.series} />\n </div>\n </section>\n ))}\n </div>\n )\n}\n\nfunction TimeSeriesChart({\n viz,\n data,\n series,\n}: Pivoted & { viz: \"line\" | \"area\" | \"bar\" }) {\n const config: ChartConfig = {}\n series.forEach((s, i) => {\n config[s.key] = { label: s.label, color: chartColor(i) }\n })\n const unit = series[0]?.unit\n const tickFormatter = (v: number) =>\n formatMeasure(v, unit, series[0]?.currency)\n const chartProps = { data, margin: { left: 4, right: 4, top: 4, bottom: 0 } }\n const axes = (\n <>\n <CartesianGrid vertical={false} strokeOpacity={0.4} />\n <XAxis\n dataKey=\"bucket\"\n tickLine={false}\n axisLine={false}\n tickMargin={6}\n minTickGap={24}\n />\n <YAxis\n tickLine={false}\n axisLine={false}\n width={unit === \"money\" ? 80 : 52}\n tickFormatter={tickFormatter}\n />\n </>\n )\n const tooltip = <ChartTooltip content={<MetricTooltip series={series} />} />\n return (\n <ChartContainer config={config} className=\"h-full min-h-24 w-full\">\n {viz === \"line\" ? (\n <LineChart {...chartProps}>\n {axes}\n {tooltip}\n {series.map((s, i) => (\n <Line\n key={s.key}\n dataKey={s.key}\n type=\"monotone\"\n stroke={chartColor(i)}\n strokeWidth={2}\n // A rate's empty buckets are gaps; dots keep a lone value visible.\n connectNulls={s.unit === \"ratio\"}\n dot={s.unit === \"ratio\" ? { r: 2.5 } : false}\n />\n ))}\n </LineChart>\n ) : viz === \"area\" ? (\n <AreaChart {...chartProps}>\n {axes}\n {tooltip}\n {series.map((s, i) => (\n <Area\n key={s.key}\n dataKey={s.key}\n type=\"monotone\"\n stackId={s.measure}\n stroke={chartColor(i)}\n fill={chartColor(i)}\n fillOpacity={0.35}\n />\n ))}\n </AreaChart>\n ) : (\n <BarChart {...chartProps}>\n {axes}\n {tooltip}\n {series.map((s, i) => (\n <Bar\n key={s.key}\n dataKey={s.key}\n stackId={s.measure}\n fill={chartColor(i)}\n radius={2}\n />\n ))}\n </BarChart>\n )}\n </ChartContainer>\n )\n}\n\nfunction DonutViz({\n result,\n currency,\n}: {\n result: MetricsResult\n currency?: string\n}) {\n const { text: adminText } = useAdminUI()\n\n const primary = indexColumns(result.columns).measures[0]\n if (!primary) return <Empty label={adminText(\"no measure\")} />\n const slices = donutSlices(result, currency)\n if (slices.length === 0)\n return <Empty label={adminText(\"no data in range\")} />\n const groups = groupSeries(slices)\n const charts = groups.map((group) => {\n const config: ChartConfig = {}\n group.series.forEach((slice, i) => {\n config[slice.key] = { label: slice.label, color: chartColor(i) }\n })\n return (\n <section\n key={group.key}\n className={groups.length > 1 ? \"min-h-44 shrink-0\" : \"h-full\"}\n >\n {groups.length > 1 && (\n <div className=\"mb-1 text-xs font-medium text-muted-foreground\">\n {group.label}\n </div>\n )}\n <ChartContainer\n config={config}\n className={\n groups.length > 1 ? \"h-36 w-full\" : \"h-full min-h-24 w-full\"\n }\n >\n <PieChart>\n <ChartTooltip\n content={<MetricTooltip series={group.series} nameKey=\"key\" />}\n />\n <Pie\n data={group.series}\n dataKey=\"value\"\n nameKey=\"key\"\n innerRadius=\"55%\"\n stroke=\"var(--card)\"\n strokeWidth={2}\n >\n {group.series.map((slice, i) => (\n <Cell key={slice.key} fill={chartColor(i)} />\n ))}\n </Pie>\n </PieChart>\n </ChartContainer>\n </section>\n )\n })\n return (\n <div className=\"flex h-full flex-col gap-4 overflow-auto\">{charts}</div>\n )\n}\n\n// humanizeColumn turns a result column name (first_failure_reason) into a\n// label (First failure reason).\nfunction humanizeColumn(name: string): string {\n const words = name.replaceAll(\"_\", \" \").trim()\n return words.charAt(0).toUpperCase() + words.slice(1)\n}\n\nfunction TableViz({\n result,\n currency: fallback,\n}: {\n result: MetricsResult\n currency?: string\n}) {\n const { text: adminText } = useAdminUI()\n\n const idx = indexColumns(result.columns)\n if (result.rows.length === 0)\n return <Empty label={adminText(\"no data in range\")} />\n return (\n <div className=\"h-full overflow-auto\">\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {result.columns.map((c) => (\n <TableHead\n key={c.name}\n className={cn(\n \"text-xs whitespace-nowrap\",\n c.kind === \"measure\" && \"text-right\"\n )}\n >\n {humanizeColumn(c.name)}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {result.rows.map((row, ri) => (\n <TableRow key={ri}>\n {result.columns.map((c, ci) => {\n const cell = row[ci]\n let rendered: string\n if (c.kind === \"time\")\n rendered = formatBucket(String(cell), result.grain)\n else if (c.kind === \"measure\") {\n const currency = rowCurrency(row, idx, fallback)\n rendered = formatMeasure(cell, c.unit, currency)\n } else\n rendered = cell === null || cell === \"\" ? \"—\" : String(cell)\n return (\n <TableCell\n key={c.name}\n className={cn(\n \"text-xs\",\n c.kind === \"measure\" && \"text-right tabular-nums\"\n )}\n >\n {rendered}\n </TableCell>\n )\n })}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )\n}\n"],"mappings":"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"}
|
package/dist/admin.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { C as e, E as t, S as n, T as r, a as i, d as a, f as o, g as s, h as c, m as l, n as u, o as d, p as f, r as p, s as m, t as h, u as g, w as _ } from "./admin-utils-
|
|
2
|
-
import { a as v, i as y, n as b, o as ee, r as te, s as x, t as S } from "./admin-dropdown-menu-
|
|
3
|
-
import { t as C } from "./admin-button-
|
|
4
|
-
import { f as w, i as T, l as E, o as ne, t as re } from "./admin-capabilities-
|
|
5
|
-
import { t as D } from "./admin-auth-
|
|
1
|
+
import { C as e, E as t, S as n, T as r, a as i, d as a, f as o, g as s, h as c, m as l, n as u, o as d, p as f, r as p, s as m, t as h, u as g, w as _ } from "./admin-utils-DnVY5fYd.js";
|
|
2
|
+
import { a as v, i as y, n as b, o as ee, r as te, s as x, t as S } from "./admin-dropdown-menu-CCiW4-oz.js";
|
|
3
|
+
import { t as C } from "./admin-button-Oip73Plq.js";
|
|
4
|
+
import { f as w, i as T, l as E, o as ne, t as re } from "./admin-capabilities-BGv7oG8v.js";
|
|
5
|
+
import { t as D } from "./admin-auth-CiuZ-Hlm.js";
|
|
6
6
|
import { f as ie, s as O } from "./admin-format-DoohJ7Fg.js";
|
|
7
7
|
import { t as ae } from "./admin-confirm-katGq0Qo.js";
|
|
8
8
|
import * as k from "react";
|
|
@@ -48,95 +48,95 @@ function q(e, t = "orck") {
|
|
|
48
48
|
var ze = [
|
|
49
49
|
{
|
|
50
50
|
path: "/payments/attempts",
|
|
51
|
-
Component: A(() => import("./admin-attempts-
|
|
51
|
+
Component: A(() => import("./admin-attempts-DxRHTODq.js").then((e) => ({ default: e.AttemptsPage })))
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
path: "/catalog/metering",
|
|
55
|
-
Component: A(() => import("./admin-metering-
|
|
55
|
+
Component: A(() => import("./admin-metering-BksTFRRP.js").then((e) => ({ default: e.CatalogMeteringPage })))
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
path: "/payments/health",
|
|
59
|
-
Component: A(() => import("./admin-health-
|
|
59
|
+
Component: A(() => import("./admin-health-CvJX9prw.js").then((e) => ({ default: e.PaymentHealthPage })))
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
62
|
path: "/payments/cycles",
|
|
63
|
-
Component: A(() => import("./admin-attempts-
|
|
63
|
+
Component: A(() => import("./admin-attempts-DxRHTODq.js").then((e) => ({ default: e.CyclesPage })))
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
66
|
path: "/catalog/prices",
|
|
67
|
-
Component: A(() => import("./admin-catalog-
|
|
67
|
+
Component: A(() => import("./admin-catalog-3pPEAuDY.js").then((e) => ({ default: e.CatalogPricesPage })))
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
path: "/subscriptions",
|
|
71
|
-
Component: A(() => import("./admin-subscriptions-
|
|
71
|
+
Component: A(() => import("./admin-subscriptions-lJG_EzMe.js").then((e) => ({ default: e.SubscriptionsPage })))
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
path: "/catalog/drift",
|
|
75
|
-
Component: A(() => import("./admin-catalog-
|
|
75
|
+
Component: A(() => import("./admin-catalog-3pPEAuDY.js").then((e) => ({ default: e.CatalogDriftPage })))
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
path: "/customers",
|
|
79
|
-
Component: A(() => import("./admin-customers-
|
|
79
|
+
Component: A(() => import("./admin-customers-cnKMEV4q.js").then((e) => ({ default: e.CustomersPage })))
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
path: "/payments",
|
|
83
|
-
Component: A(() => import("./admin-payments-
|
|
83
|
+
Component: A(() => import("./admin-payments-pNLNIU0X.js").then((e) => ({ default: e.PaymentsPage })))
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
path: "/settings",
|
|
87
|
-
Component: A(() => import("./admin-settings-
|
|
87
|
+
Component: A(() => import("./admin-settings-C6eWFkDn.js").then((e) => ({ default: e.SettingsPage })))
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
90
|
path: "/reports",
|
|
91
|
-
Component: A(() => import("./admin-reports-
|
|
91
|
+
Component: A(() => import("./admin-reports-CA-cnNur.js").then((e) => ({ default: e.ReportsPage })))
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
94
|
path: "/catalog",
|
|
95
|
-
Component: A(() => import("./admin-catalog-
|
|
95
|
+
Component: A(() => import("./admin-catalog-3pPEAuDY.js").then((e) => ({ default: e.CatalogProductsPage })))
|
|
96
96
|
},
|
|
97
97
|
{
|
|
98
98
|
path: "/orders",
|
|
99
|
-
Component: A(() => import("./admin-orders-
|
|
99
|
+
Component: A(() => import("./admin-orders-8XzHf7b-.js").then((e) => ({ default: e.OrdersPage })))
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
102
|
path: "/ops",
|
|
103
|
-
Component: A(() => import("./admin-ops-
|
|
103
|
+
Component: A(() => import("./admin-ops-Ch2-BmUp.js").then((e) => ({ default: e.OpsPage })))
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
path: "/",
|
|
107
|
-
Component: A(() => import("./admin-dashboard-
|
|
107
|
+
Component: A(() => import("./admin-dashboard-DfSsUyo-.js").then((e) => ({ default: e.DashboardPage })))
|
|
108
108
|
},
|
|
109
109
|
{
|
|
110
110
|
path: "/customers/:customerId",
|
|
111
|
-
Component: A(() => import("./admin-detail-
|
|
111
|
+
Component: A(() => import("./admin-detail-Dc7rU4mM.js").then((e) => ({ default: e.CustomerDetailPage })))
|
|
112
112
|
},
|
|
113
113
|
{
|
|
114
114
|
path: "/payments/attempts/:id",
|
|
115
|
-
Component: A(() => import("./admin-attempts-
|
|
115
|
+
Component: A(() => import("./admin-attempts-DxRHTODq.js").then((e) => ({ default: e.AttemptDetailPage })))
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
path: "/catalog/metering/:key",
|
|
119
|
-
Component: A(() => import("./admin-metering-
|
|
119
|
+
Component: A(() => import("./admin-metering-BksTFRRP.js").then((e) => ({ default: e.MeterDetailPage })))
|
|
120
120
|
},
|
|
121
121
|
{
|
|
122
122
|
path: "/payments/cycles/:id",
|
|
123
|
-
Component: A(() => import("./admin-attempts-
|
|
123
|
+
Component: A(() => import("./admin-attempts-DxRHTODq.js").then((e) => ({ default: e.CycleDetailPage })))
|
|
124
124
|
},
|
|
125
125
|
{
|
|
126
126
|
path: "/catalog/prices/:id",
|
|
127
|
-
Component: A(() => import("./admin-price-detail-
|
|
127
|
+
Component: A(() => import("./admin-price-detail-BeGDPxKX.js").then((e) => ({ default: e.PriceDetailPage })))
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
path: "/subscriptions/:id",
|
|
131
|
-
Component: A(() => import("./admin-detail-
|
|
131
|
+
Component: A(() => import("./admin-detail-Cq59e14B.js").then((e) => ({ default: e.SubscriptionDetailPage })))
|
|
132
132
|
},
|
|
133
133
|
{
|
|
134
134
|
path: "/payments/:id",
|
|
135
|
-
Component: A(() => import("./admin-detail-
|
|
135
|
+
Component: A(() => import("./admin-detail-BATuJjVs.js").then((e) => ({ default: e.PaymentDetailPage })))
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
path: "/orders/:id",
|
|
139
|
-
Component: A(() => import("./admin-detail-
|
|
139
|
+
Component: A(() => import("./admin-detail-DG-YaHhS.js").then((e) => ({ default: e.OrderDetailPage })))
|
|
140
140
|
}
|
|
141
141
|
];
|
|
142
142
|
function Be(e) {
|
|
@@ -1813,11 +1813,11 @@ var bn = {
|
|
|
1813
1813
|
"New batch": "New batch",
|
|
1814
1814
|
"New cards by AVS result": "New cards by AVS result",
|
|
1815
1815
|
"New cards by CVV result": "New cards by CVV result",
|
|
1816
|
-
"New
|
|
1816
|
+
"New purchase on this rail is refused until another PSP is armed. Existing subscriptions, refunds and webhooks keep using this one.": "New purchase on this rail is refused until another PSP is armed. Existing subscriptions, refunds and webhooks keep using this one.",
|
|
1817
1817
|
"New merchant": "New merchant",
|
|
1818
1818
|
"New plan": "New plan",
|
|
1819
1819
|
"New price": "New price",
|
|
1820
|
-
"New-card
|
|
1820
|
+
"New-card purchase failure rate": "New-card purchase failure rate",
|
|
1821
1821
|
"New-card decline rate": "New-card decline rate",
|
|
1822
1822
|
"New-card decline rate by week": "New-card decline rate by week",
|
|
1823
1823
|
Next: "Next",
|
|
@@ -2109,7 +2109,7 @@ var bn = {
|
|
|
2109
2109
|
"Webhook URL": "Webhook URL",
|
|
2110
2110
|
Webhooks: "Webhooks",
|
|
2111
2111
|
"What the customer asked for": "What the customer asked for",
|
|
2112
|
-
"Which provider would take the money if someone bought this right now, and why the others were passed over. This asks the same question a real
|
|
2112
|
+
"Which provider would take the money if someone bought this right now, and why the others were passed over. This asks the same question a real purchase asks, without starting one.": "Which provider would take the money if someone bought this right now, and why the others were passed over. This asks the same question a real purchase asks, without starting one.",
|
|
2113
2113
|
"Which providers this price has been sent to, and whether their copy still matches yours. Publishing the catalog is what sends it; this page only reports. Verify asks each provider what it currently holds, and changes nothing.": "Which providers this price has been sent to, and whether their copy still matches yours. Publishing the catalog is what sends it; this page only reports. Verify asks each provider what it currently holds, and changes nothing.",
|
|
2114
2114
|
Why: "Why",
|
|
2115
2115
|
"Why it was granted": "Why it was granted",
|