@photon-ai/pho-ui 4.10.0 → 4.12.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.
Files changed (58) hide show
  1. package/dist/chunks/animated-height-zr7BmFY1.js +56 -0
  2. package/dist/chunks/animated-height-zr7BmFY1.js.map +1 -0
  3. package/dist/chunks/{bar-chart-HsoFFaPb.js → bar-chart-By5gWQqP.js} +2 -2
  4. package/dist/chunks/{bar-chart-HsoFFaPb.js.map → bar-chart-By5gWQqP.js.map} +1 -1
  5. package/dist/chunks/basic-page-CJ11ekjH.js +2217 -0
  6. package/dist/chunks/basic-page-CJ11ekjH.js.map +1 -0
  7. package/dist/chunks/{chart-BrIXaMue.js → chart-Dx3rjeFn.js} +527 -490
  8. package/dist/chunks/chart-Dx3rjeFn.js.map +1 -0
  9. package/dist/chunks/{chat-B0WIgEyM.js → chat-CU3XVm99.js} +2 -2
  10. package/dist/chunks/{chat-B0WIgEyM.js.map → chat-CU3XVm99.js.map} +1 -1
  11. package/dist/chunks/{checkbox-CLPmblNA.js → checkbox-CwvoEJhd.js} +2 -2
  12. package/dist/chunks/{checkbox-CLPmblNA.js.map → checkbox-CwvoEJhd.js.map} +1 -1
  13. package/dist/chunks/choice-card-_Ocs0iUj.js +17 -0
  14. package/dist/chunks/choice-card-_Ocs0iUj.js.map +1 -0
  15. package/dist/chunks/{command-iYvU6Mhf.js → command-D5g49VqR.js} +3 -3
  16. package/dist/chunks/{command-iYvU6Mhf.js.map → command-D5g49VqR.js.map} +1 -1
  17. package/dist/chunks/{data-table-B1dmrN6r.js → data-table-Ce_c6T73.js} +3 -3
  18. package/dist/chunks/{data-table-B1dmrN6r.js.map → data-table-Ce_c6T73.js.map} +1 -1
  19. package/dist/chunks/{dialog-MPvem7yV.js → dialog-ChS0tdHa.js} +120 -116
  20. package/dist/chunks/dialog-ChS0tdHa.js.map +1 -0
  21. package/dist/chunks/{filter-bar-B-oYYBsU.js → filter-bar-CMkvhvgL.js} +2 -2
  22. package/dist/chunks/{filter-bar-B-oYYBsU.js.map → filter-bar-CMkvhvgL.js.map} +1 -1
  23. package/dist/chunks/{input-DjvZoF8v.js → input-fFWvPJOf.js} +2 -1
  24. package/dist/chunks/{input-DjvZoF8v.js.map → input-fFWvPJOf.js.map} +1 -1
  25. package/dist/chunks/{line-chart-Bv25WyGp.js → line-chart-CAe09fqr.js} +2 -2
  26. package/dist/chunks/{line-chart-Bv25WyGp.js.map → line-chart-CAe09fqr.js.map} +1 -1
  27. package/dist/components/bar-chart.js +1 -1
  28. package/dist/components/chart.js +1 -1
  29. package/dist/components/chat.js +1 -1
  30. package/dist/components/checkbox.js +1 -1
  31. package/dist/components/command.js +1 -1
  32. package/dist/components/data-table.js +1 -1
  33. package/dist/components/dialog.js +1 -1
  34. package/dist/components/field.js +34 -29
  35. package/dist/components/field.js.map +1 -1
  36. package/dist/components/filter-bar.js +1 -1
  37. package/dist/components/input.js +1 -1
  38. package/dist/components/line-chart.js +1 -1
  39. package/dist/components/radio-group.js +64 -59
  40. package/dist/components/radio-group.js.map +1 -1
  41. package/dist/index.js +9 -9
  42. package/dist/sections/basic-page.js +2 -2
  43. package/dist/src/components/dialog/dialog.d.ts +9 -1
  44. package/dist/src/components/field/field.d.ts +11 -1
  45. package/dist/src/components/radio-group/radio-card.d.ts +11 -4
  46. package/dist/src/sections/basic-page/basic-page.d.ts +230 -15
  47. package/dist/src/sections/basic-page/index.d.ts +1 -1
  48. package/dist/src/utils/animated-height.d.ts +16 -7
  49. package/dist/src/utils/choice-card.d.ts +8 -1
  50. package/package.json +1 -1
  51. package/dist/chunks/animated-height-I44sUq0n.js +0 -48
  52. package/dist/chunks/animated-height-I44sUq0n.js.map +0 -1
  53. package/dist/chunks/basic-page-DzT8yecB.js +0 -1801
  54. package/dist/chunks/basic-page-DzT8yecB.js.map +0 -1
  55. package/dist/chunks/chart-BrIXaMue.js.map +0 -1
  56. package/dist/chunks/choice-card-BVNP1NB6.js +0 -17
  57. package/dist/chunks/choice-card-BVNP1NB6.js.map +0 -1
  58. package/dist/chunks/dialog-MPvem7yV.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"chart-BrIXaMue.js","names":[],"sources":["../../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/curve/linear.js","../../../../node_modules/.pnpm/d3-shape@3.2.0/node_modules/d3-shape/src/curve/monotone.js","../../src/components/chart/color.ts","../../src/components/chart/format.ts","../../src/components/chart/legend.tsx","../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/ascending.js","../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/descending.js","../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/bisector.js","../../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/ticks.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/interval.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/millisecond.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/duration.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/second.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/minute.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/hour.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/day.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/week.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/month.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/year.js","../../../../node_modules/.pnpm/d3-time@3.1.0/node_modules/d3-time/src/ticks.js","../../src/components/chart/scale.ts","../../src/components/chart/shell.tsx","../../src/components/chart/skeleton.tsx","../../src/components/chart/theme.ts","../../src/components/chart/tooltip.tsx","../../src/components/chart/use-measure.ts","../../src/components/chart/chart.tsx"],"sourcesContent":["function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // falls through\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","import type { ChartColor } from \"./types\";\n\n/** The categorical slots, in the order series take them. */\nexport const CHART_SLOTS = [\n \"chart-1\",\n \"chart-2\",\n \"chart-3\",\n \"chart-4\",\n \"chart-5\",\n \"chart-6\",\n] as const satisfies ReadonlyArray<ChartColor>;\n\n/**\n * The CSS value for a series colour: the named colour, or the categorical\n * slot at `index` when the series names none. Slots are an ordered,\n * validated set — a seventh series wraps, so fold a long tail into\n * \"Other\" before it gets there.\n */\nexport function chartColor(\n color: ChartColor | undefined,\n index: number,\n): string {\n const name = color ?? CHART_SLOTS[index % CHART_SLOTS.length]!;\n const token = name.startsWith(\"chart-\") ? name : `chart-${name}`;\n return `var(--color-pho-${token})`;\n}\n","import type { ChartDatum } from \"./types\";\n\n/**\n * The default number format: grouped digits for a value someone reads\n * (\"12,001\"), compact for an axis tick (\"12K\") where room is short.\n */\nexport function numberFormatter(\n locale: string | undefined,\n compact = false,\n): (value: number) => string {\n const format = new Intl.NumberFormat(\n locale,\n compact\n ? { notation: \"compact\", maximumFractionDigits: 1 }\n : { maximumFractionDigits: 2 },\n );\n return (value) => format.format(value);\n}\n\n/** A number under a series key, or nothing: missing, null, or not a number. */\nexport function readValue(datum: object, key: string): number | null {\n const value = (datum as Record<string, unknown>)[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\n/** \"Inbound and outbound\", \"p50, p90 and p99\". */\nexport function joinNames(names: ReadonlyArray<string>): string {\n if (names.length <= 1) return names[0] ?? \"\";\n return `${names.slice(0, -1).join(\", \")} and ${names[names.length - 1]}`;\n}\n\nexport interface DescribedSeries {\n key: string;\n label: string;\n /** Bars sum to a total; lines run between a low and a high. */\n kind: \"bar\" | \"line\";\n}\n\ninterface DescribeOptions<T extends ChartDatum> {\n data: ReadonlyArray<T>;\n series: ReadonlyArray<DescribedSeries>;\n valueFormat: (value: number) => string;\n timeFormat: (date: Date) => string;\n}\n\n/**\n * What the figure says about itself to assistive tech: which series, over\n * what range, and for each one the total (bars) or the low and high\n * (lines), plus where it peaked.\n */\nexport function describeChart<T extends ChartDatum>({\n data,\n series,\n valueFormat,\n timeFormat,\n}: DescribeOptions<T>): string {\n if (data.length === 0) return \"No data to show.\";\n const first = data[0]!;\n const last = data[data.length - 1]!;\n const range =\n data.length > 1\n ? `${timeFormat(new Date(first.x))} to ${timeFormat(new Date(last.x))}`\n : timeFormat(new Date(first.x));\n const parts = [`${joinNames(series.map((s) => s.label))}, ${range}.`];\n for (const s of series) {\n let total = 0;\n let min = Infinity;\n let max = -Infinity;\n let peakAt: Date | null = null;\n let seen = 0;\n for (const datum of data) {\n const value = readValue(datum, s.key);\n if (value == null) continue;\n seen++;\n total += value;\n if (value < min) min = value;\n if (value > max) {\n max = value;\n peakAt = new Date(datum.x);\n }\n }\n if (seen === 0) {\n parts.push(`${s.label}: no values.`);\n continue;\n }\n const peak = peakAt\n ? `, peak ${valueFormat(max)} at ${timeFormat(peakAt)}`\n : \"\";\n parts.push(\n s.kind === \"bar\"\n ? `${s.label}: ${valueFormat(total)} in total${peak}.`\n : `${s.label}: from ${valueFormat(min)} to ${valueFormat(max)}${peak}.`,\n );\n }\n return parts.join(\" \");\n}\n","import { type ComponentProps } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** A legend or tooltip key mirrors its mark: a square for a bar, a stroke for a line. */\nexport type ChartSwatchKind = \"rect\" | \"line\";\n\nexport interface ChartSwatchProps {\n /** A CSS colour value — what `chartColor` returns. */\n color: string;\n kind?: ChartSwatchKind;\n dashed?: boolean;\n}\n\nexport function ChartSwatch({\n color,\n kind = \"rect\",\n dashed,\n}: ChartSwatchProps) {\n if (kind === \"line\") {\n return (\n <svg aria-hidden width=\"14\" height=\"6\" className=\"shrink-0\">\n <line\n x1=\"1\"\n x2=\"13\"\n y1=\"3\"\n y2=\"3\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray={dashed ? \"3 3\" : undefined}\n />\n </svg>\n );\n }\n return (\n <span\n aria-hidden\n className=\"inline-block size-2 shrink-0 rounded-[2px]\"\n style={{ background: color }}\n />\n );\n}\n\nexport interface ChartLegendItem {\n label: string;\n /** A CSS colour value — what `chartColor` returns. */\n color: string;\n kind?: ChartSwatchKind;\n dashed?: boolean;\n}\n\nexport interface ChartLegendProps extends Omit<\n ComponentProps<\"ul\">,\n \"children\"\n> {\n items: ReadonlyArray<ChartLegendItem>;\n}\n\n/**\n * The legend a chart of two or more series carries below the plot: a key\n * per series, in series order, wrapping when the row runs out. Text stays\n * in the UI ink; the swatch alone carries the colour.\n */\nexport function ChartLegend({ items, className, ...props }: ChartLegendProps) {\n return (\n <ul\n className={cn(\n \"text-pho-secondary flex flex-wrap gap-x-4 gap-y-1 text-xs\",\n className,\n )}\n {...props}\n >\n {items.map((item) => (\n <li key={item.label} className=\"flex items-center gap-1.5\">\n <ChartSwatch\n color={item.color}\n kind={item.kind}\n dashed={item.dashed}\n />\n {item.label}\n </li>\n ))}\n </ul>\n );\n}\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","const t0 = new Date, t1 = new Date;\n\nexport function timeInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = (date) => {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = (date) => {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = (date) => {\n const d0 = interval(date), d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = (date, step) => {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = (start, stop, step) => {\n const range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n let previous;\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = (test) => {\n return timeInterval((date) => {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, (date, step) => {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = (start, end) => {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = (step) => {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? (d) => field(d) % step === 0\n : (d) => interval.count(0, d) % step === 0);\n };\n }\n\n return interval;\n}\n","import {timeInterval} from \"./interval.js\";\n\nexport const millisecond = timeInterval(() => {\n // noop\n}, (date, step) => {\n date.setTime(+date + step);\n}, (start, end) => {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = (k) => {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return timeInterval((date) => {\n date.setTime(Math.floor(date / k) * k);\n }, (date, step) => {\n date.setTime(+date + step * k);\n }, (start, end) => {\n return (end - start) / k;\n });\n};\n\nexport const milliseconds = millisecond.range;\n","export const durationSecond = 1000;\nexport const durationMinute = durationSecond * 60;\nexport const durationHour = durationMinute * 60;\nexport const durationDay = durationHour * 24;\nexport const durationWeek = durationDay * 7;\nexport const durationMonth = durationDay * 30;\nexport const durationYear = durationDay * 365;\n","import {timeInterval} from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nexport const second = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds());\n}, (date, step) => {\n date.setTime(+date + step * durationSecond);\n}, (start, end) => {\n return (end - start) / durationSecond;\n}, (date) => {\n return date.getUTCSeconds();\n});\n\nexport const seconds = second.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeMinute = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getMinutes();\n});\n\nexport const timeMinutes = timeMinute.range;\n\nexport const utcMinute = timeInterval((date) => {\n date.setUTCSeconds(0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getUTCMinutes();\n});\n\nexport const utcMinutes = utcMinute.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeHour = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getHours();\n});\n\nexport const timeHours = timeHour.range;\n\nexport const utcHour = timeInterval((date) => {\n date.setUTCMinutes(0, 0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getUTCHours();\n});\n\nexport const utcHours = utcHour.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nexport const timeDay = timeInterval(\n date => date.setHours(0, 0, 0, 0),\n (date, step) => date.setDate(date.getDate() + step),\n (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,\n date => date.getDate() - 1\n);\n\nexport const timeDays = timeDay.range;\n\nexport const utcDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return date.getUTCDate() - 1;\n});\n\nexport const utcDays = utcDay.range;\n\nexport const unixDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return Math.floor(date / durationDay);\n});\n\nexport const unixDays = unixDay.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction timeWeekday(i) {\n return timeInterval((date) => {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setDate(date.getDate() + step * 7);\n }, (start, end) => {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport const timeSunday = timeWeekday(0);\nexport const timeMonday = timeWeekday(1);\nexport const timeTuesday = timeWeekday(2);\nexport const timeWednesday = timeWeekday(3);\nexport const timeThursday = timeWeekday(4);\nexport const timeFriday = timeWeekday(5);\nexport const timeSaturday = timeWeekday(6);\n\nexport const timeSundays = timeSunday.range;\nexport const timeMondays = timeMonday.range;\nexport const timeTuesdays = timeTuesday.range;\nexport const timeWednesdays = timeWednesday.range;\nexport const timeThursdays = timeThursday.range;\nexport const timeFridays = timeFriday.range;\nexport const timeSaturdays = timeSaturday.range;\n\nfunction utcWeekday(i) {\n return timeInterval((date) => {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, (start, end) => {\n return (end - start) / durationWeek;\n });\n}\n\nexport const utcSunday = utcWeekday(0);\nexport const utcMonday = utcWeekday(1);\nexport const utcTuesday = utcWeekday(2);\nexport const utcWednesday = utcWeekday(3);\nexport const utcThursday = utcWeekday(4);\nexport const utcFriday = utcWeekday(5);\nexport const utcSaturday = utcWeekday(6);\n\nexport const utcSundays = utcSunday.range;\nexport const utcMondays = utcMonday.range;\nexport const utcTuesdays = utcTuesday.range;\nexport const utcWednesdays = utcWednesday.range;\nexport const utcThursdays = utcThursday.range;\nexport const utcFridays = utcFriday.range;\nexport const utcSaturdays = utcSaturday.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeMonth = timeInterval((date) => {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setMonth(date.getMonth() + step);\n}, (start, end) => {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, (date) => {\n return date.getMonth();\n});\n\nexport const timeMonths = timeMonth.range;\n\nexport const utcMonth = timeInterval((date) => {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, (start, end) => {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, (date) => {\n return date.getUTCMonth();\n});\n\nexport const utcMonths = utcMonth.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeYear = timeInterval((date) => {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setFullYear(date.getFullYear() + step);\n}, (start, end) => {\n return end.getFullYear() - start.getFullYear();\n}, (date) => {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\ntimeYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport const timeYears = timeYear.range;\n\nexport const utcYear = timeInterval((date) => {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, (start, end) => {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, (date) => {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport const utcYears = utcYear.range;\n","import {bisector, tickStep} from \"d3-array\";\nimport {durationDay, durationHour, durationMinute, durationMonth, durationSecond, durationWeek, durationYear} from \"./duration.js\";\nimport {millisecond} from \"./millisecond.js\";\nimport {second} from \"./second.js\";\nimport {timeMinute, utcMinute} from \"./minute.js\";\nimport {timeHour, utcHour} from \"./hour.js\";\nimport {timeDay, unixDay} from \"./day.js\";\nimport {timeSunday, utcSunday} from \"./week.js\";\nimport {timeMonth, utcMonth} from \"./month.js\";\nimport {timeYear, utcYear} from \"./year.js\";\n\nfunction ticker(year, month, week, day, hour, minute) {\n\n const tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function ticks(start, stop, count) {\n const reverse = stop < start;\n if (reverse) [start, stop] = [stop, start];\n const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n\n function tickInterval(start, stop, count) {\n const target = Math.abs(stop - start) / count;\n const i = bisector(([,, step]) => step).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n return t.every(step);\n }\n\n return [ticks, tickInterval];\n}\n\nconst [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\nconst [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n\nexport {utcTicks, utcTickInterval, timeTicks, timeTickInterval};\n","import { tickStep, ticks } from \"d3-array\";\nimport { timeDay, timeTicks, timeYear } from \"d3-time\";\n\n/** Epoch milliseconds for a datum's `x`. */\nexport function toTime(x: Date | number): number {\n return typeof x === \"number\" ? x : x.getTime();\n}\n\n/**\n * A y domain on round numbers with three to five ticks, the last tick on\n * or above the data's high end so the top of the plot is labelled.\n * `count` is the tick count that produced them, for a scale's `.ticks()`.\n *\n * When `integer` is set — or when both ends are whole numbers — the step\n * stays ≥ 1 so a count axis never labels 0.5 / 1.5.\n */\nexport function niceLinearDomain(\n min: number,\n max: number,\n options?: { integer?: boolean },\n): { domain: [number, number]; ticks: number[]; count: number } {\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return { domain: [0, 1], ticks: [0, 1], count: 1 };\n }\n if (min > max) [min, max] = [max, min];\n const integer =\n options?.integer ?? (Number.isInteger(min) && Number.isInteger(max));\n if (min === max) {\n // A flat series still needs room to sit in.\n if (max === 0) {\n return integer\n ? { domain: [0, 1], ticks: [0, 1], count: 1 }\n : { domain: [0, 1], ticks: [0, 0.5, 1], count: 2 };\n }\n if (max > 0) min = 0;\n else max = 0;\n }\n for (let count = 4; count >= 2; count--) {\n const step = integer\n ? wholeTickStep(min, max, count)\n : tickStep(min, max, count);\n const lo = Math.floor(min / step) * step;\n const hi = Math.ceil(max / step) * step;\n const values = integer ? rangeTicks(lo, hi, step) : ticks(lo, hi, count);\n if (values.length <= 5 || count === 2) {\n // A whole-number step can differ from d3's own for `count`; the\n // interval count asks a scale for the same lines back.\n return {\n domain: [lo, hi],\n ticks: values,\n count: integer ? Math.max(1, values.length - 1) : count,\n };\n }\n }\n return { domain: [min, max], ticks: [min, max], count: 1 };\n}\n\n/** A 1-2-5 step that is never a fraction. */\nfunction wholeTickStep(min: number, max: number, count: number): number {\n const raw = tickStep(min, max, count);\n if (raw <= 1) return 1;\n if (Number.isInteger(raw)) return raw;\n const exp = Math.floor(Math.log10(raw));\n const mag = 10 ** exp;\n const n = raw / mag;\n const nice = n <= 1 ? 1 : n <= 2 ? 2 : n <= 5 ? 5 : 10;\n return nice * mag;\n}\n\nfunction rangeTicks(lo: number, hi: number, step: number): number[] {\n const values: number[] = [];\n for (let at = lo; at <= hi + step / 2; at += step) values.push(at);\n return values;\n}\n\n/** The gap between buckets, in ms — the median step, so one hole doesn't skew it. */\nexport function bucketSpan(times: ReadonlyArray<number>): number {\n if (times.length < 2) return 0;\n const steps = [];\n for (let i = 1; i < times.length; i++) steps.push(times[i]! - times[i - 1]!);\n steps.sort((a, b) => a - b);\n return steps[Math.floor(steps.length / 2)]!;\n}\n\nconst DAY = 86_400_000;\n\n/**\n * Time ticks for a plot `width` px wide: one every ~96px, on the round\n * boundaries d3-time picks (5 minutes, an hour, a day, a month…).\n */\nexport function timeAxisTicks(\n start: number,\n stop: number,\n width: number,\n): Date[] {\n if (stop <= start || width <= 0) return [new Date(start)];\n const count = Math.max(2, Math.floor(width / 96));\n const chosen = timeTicks(new Date(start), new Date(stop), count);\n // d3's every-nth-day interval counts from the first of the month, so a\n // two-day step reads Aug 29, Aug 31, Sep 1, Sep 3. Re-step multi-day\n // ticks evenly from the first one instead.\n if (chosen.length > 2 && chosen.every((t) => isMidnight(t))) {\n const gaps = chosen.slice(1).map((t, i) => timeDay.count(chosen[i]!, t));\n const step = Math.max(...gaps);\n if (step > 1 && gaps.some((gap) => gap !== step)) {\n return timeDay.range(chosen[0]!, new Date(stop + 1), step);\n }\n }\n return chosen;\n}\n\nfunction isMidnight(date: Date): boolean {\n return timeDay(date).getTime() === date.getTime();\n}\n\n/**\n * Labels a tick by the boundary it sits on: a time within a day, a date at\n * midnight, month and year at a new year. `Intl` does the wording, so the\n * labels follow the locale.\n */\nexport function timeTickFormatter(locale?: string): (date: Date) => string {\n const time = new Intl.DateTimeFormat(locale, {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n const day = new Intl.DateTimeFormat(locale, {\n month: \"short\",\n day: \"numeric\",\n });\n const year = new Intl.DateTimeFormat(locale, {\n month: \"short\",\n year: \"numeric\",\n });\n return (date) => {\n if (timeDay(date).getTime() < date.getTime()) return time.format(date);\n if (timeYear(date).getTime() < date.getTime()) return day.format(date);\n return year.format(date);\n };\n}\n\n/**\n * The tooltip's heading for a bucket: the date alone when buckets are a\n * day or longer, date and time below that.\n */\nexport function bucketTimeFormatter(\n locale: string | undefined,\n span: number,\n): (date: Date) => string {\n const format = new Intl.DateTimeFormat(\n locale,\n span >= DAY\n ? { month: \"short\", day: \"numeric\" }\n : { month: \"short\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\" },\n );\n return (date) => format.format(date);\n}\n\n/** Estimated width of a tick label at the axis's 11px, with breathing room. */\nfunction labelWidth(label: string): number {\n return label.length * 6.5 + 16;\n}\n\n/** Keep every nth tick so the labels fit the width without touching. */\nexport function thinTicks<T>(\n values: ReadonlyArray<T>,\n labelOf: (value: T) => string,\n width: number,\n): T[] {\n if (values.length < 2) return [...values];\n const widest = Math.max(...values.map((value) => labelWidth(labelOf(value))));\n const fit = Math.max(1, Math.floor(width / widest));\n const every = Math.ceil(values.length / fit);\n if (every <= 1) return [...values];\n return values.filter((_, index) => index % every === 0);\n}\n\n/** The index of the position nearest `px` in an ascending list. */\nexport function nearestIndex(positions: ReadonlyArray<number>, px: number) {\n if (positions.length === 0) return -1;\n let lo = 0;\n let hi = positions.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (positions[mid]! < px) lo = mid + 1;\n else hi = mid;\n }\n if (lo > 0 && px - positions[lo - 1]! < positions[lo]! - px) return lo - 1;\n return lo;\n}\n","import {\n useId,\n type ComponentProps,\n type CSSProperties,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** The bands around the plot, and the inner box the marks draw in. */\nexport interface ChartLayout {\n width: number;\n height: number;\n left: number;\n top: number;\n right: number;\n bottom: number;\n innerWidth: number;\n innerHeight: number;\n /** The same bands in the shape visx takes. */\n margin: { top: number; right: number; bottom: number; left: number };\n}\n\nconst TOP = 8;\nconst RIGHT = 8;\nconst X_AXIS = 22;\n\n/** The plot's box for a measured width and the y-axis labels it must fit. */\nexport function chartLayout(\n width: number,\n height: number,\n yLabels: ReadonlyArray<string>,\n): ChartLayout {\n const widest = yLabels.reduce((max, label) => Math.max(max, label.length), 0);\n const left = Math.ceil(widest * 6.5) + 10;\n const bottom = height - X_AXIS;\n return {\n width,\n height,\n left,\n top: TOP,\n right: width - RIGHT,\n bottom,\n innerWidth: Math.max(0, width - left - RIGHT),\n innerHeight: Math.max(0, bottom - TOP),\n margin: { top: TOP, right: RIGHT, bottom: X_AXIS, left },\n };\n}\n\n/**\n * The surface a stacked segment's gap is cut in: the nearest registered\n * surface, the card by default. Read once here so the stroke below and\n * the hover rings agree.\n */\nconst SURFACE_STYLE = {\n \"--pho-chart-surface\":\n \"var(--pho-surface, var(--background-color-pho-primary))\",\n} as CSSProperties;\n\nexport interface ChartShellProps extends Omit<\n ComponentProps<\"div\">,\n \"children\"\n> {\n /** The figure's `aria-label`. */\n label: string;\n /** The figure's spoken summary. */\n description: string;\n height: number;\n containerRef: RefObject<HTMLDivElement | null>;\n legend?: ReactNode;\n loading?: boolean;\n empty?: ReactNode;\n /** The frame says `empty` instead of drawing. */\n showEmpty?: boolean;\n /** What stands in for the plot while the first data is on its way. */\n placeholder?: ReactNode;\n /**\n * The figure itself — the svg and its tooltip. Presentational to\n * assistive tech: the frame's label and description speak for it.\n */\n children?: ReactNode;\n}\n\n/**\n * The frame every chart draws in: a fixed-height plot box holding the\n * figure (`role=\"img\"`, labelled and described for assistive tech), the\n * legend on its own line below. Width comes from the parent; `height`\n * covers the plot and the x-axis band, so a card never grows a nested\n * scroll.\n */\nexport function ChartShell({\n label,\n description,\n height,\n containerRef,\n legend,\n loading,\n empty,\n showEmpty,\n placeholder,\n className,\n children,\n ...props\n}: ChartShellProps) {\n const descriptionId = useId();\n return (\n <div\n data-chart=\"\"\n className={cn(\"flex w-full min-w-0 flex-col gap-3\", className)}\n {...props}\n >\n <div\n ref={containerRef}\n aria-busy={loading || undefined}\n className={cn(\n \"relative w-full transition-opacity duration-150 ease-out\",\n loading && \"opacity-50\",\n )}\n style={{ height }}\n >\n <div\n // A drawn figure is `role=\"img\"`; there is no <img> to reach\n // for, and the svg is visx's, so the role sits on its box.\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role\n role=\"img\"\n aria-label={label}\n aria-describedby={descriptionId}\n // The 2px gap between stacked segments is a stroke in the\n // surface colour on every segment: one pixel shaved off each\n // side of a boundary, and nothing drawn that isn't surface.\n className=\"animate-pho-chart-in relative size-full select-none [&_.visx-bar-stack_.visx-bar]:stroke-(--pho-chart-surface) [&_.visx-bar-stack_.visx-bar]:stroke-2 [&_svg]:block [&_svg]:overflow-visible\"\n style={SURFACE_STYLE}\n >\n {children}\n </div>\n <p id={descriptionId} className=\"sr-only\">\n {description}\n </p>\n {placeholder}\n {showEmpty && (\n <div className=\"text-pho-description absolute inset-0 flex items-center justify-center text-xs\">\n {empty}\n </div>\n )}\n </div>\n {legend}\n </div>\n );\n}\n","import { Skeleton } from \"../skeleton\";\nimport { cn } from \"../../utils/cn\";\nimport type { ChartLayout } from \"./shell\";\n\n/**\n * Heights for the column bones, as a share of the plot: a made-up week\n * or two that reads as a chart without pretending to be one. Fixed, so\n * the placeholder is the same on the server and the browser.\n */\nconst BARS = [\n 0.42, 0.58, 0.5, 0.7, 0.62, 0.8, 0.66, 0.9, 0.72, 0.56, 0.76, 0.64,\n];\n\n/** The grid rows, as a share of the plot from the top; the last is the baseline. */\nconst ROWS = [0, 1 / 3, 2 / 3, 1];\n\n/** Time labels along the bottom band. */\nconst X_LABELS = 5;\n\n/**\n * Bones in the shape of a chart, for a first load with nothing to hold:\n * the frame's own coordinate system — hairline rows, a baseline, a label\n * bone at every row on the left and a few along the bottom — with a\n * dozen columns standing on the baseline in the plot's box. A refetch\n * never shows this; the chart keeps its last render at half opacity.\n */\nexport function ChartSkeleton({ layout }: { layout: ChartLayout }) {\n const { margin } = layout;\n return (\n <div\n aria-hidden\n data-chart-skeleton=\"\"\n className=\"absolute inset-0 grid\"\n style={{\n gridTemplateColumns: `${margin.left}px 1fr ${margin.right}px`,\n gridTemplateRows: `${margin.top}px 1fr ${margin.bottom}px`,\n }}\n >\n <div className=\"relative col-start-1 row-start-2\">\n {ROWS.map((share) => (\n <Skeleton\n key={share}\n data-bone=\"y\"\n className=\"absolute right-2 h-2.5 w-4 -translate-y-1/2\"\n style={{ top: `${share * 100}%` }}\n />\n ))}\n </div>\n <div className=\"relative col-start-2 row-start-2\">\n {ROWS.map((share, index) => (\n <div\n key={share}\n data-bone={index === ROWS.length - 1 ? \"baseline\" : \"grid\"}\n className={cn(\n \"absolute inset-x-0 border-t\",\n index === ROWS.length - 1\n ? \"border-pho-chart-crosshair\"\n : \"border-pho-chart-grid\",\n )}\n style={{ top: `${share * 100}%` }}\n />\n ))}\n <div className=\"absolute inset-0 flex items-end justify-between gap-2\">\n {BARS.map((share, index) => (\n <Skeleton\n key={index}\n data-bone=\"bar\"\n className=\"w-full max-w-6 rounded-t-[4px] rounded-b-none\"\n style={{ height: `${share * 100}%` }}\n />\n ))}\n </div>\n </div>\n <div className=\"col-start-2 row-start-3 flex items-center justify-between px-1\">\n {Array.from({ length: X_LABELS }, (_, index) => (\n <Skeleton key={index} data-bone=\"x\" className=\"h-2.5 w-8\" />\n ))}\n </div>\n </div>\n );\n}\n","import { buildChartTheme, type XYChartTheme } from \"@visx/xychart\";\n\n/**\n * The tick label: the axis's 11px in description ink, tabular so a column\n * of numbers lines up, in the page's own font rather than visx's stack.\n */\nconst LABEL = {\n fontFamily: \"inherit\",\n fontSize: 11,\n fontWeight: 400,\n letterSpacing: 0,\n fill: \"var(--text-color-pho-description)\",\n style: { fontVariantNumeric: \"tabular-nums\" },\n} as const;\n\n/**\n * The visx theme for a chart's furniture: gridlines one step off the\n * surface, description-ink ticks, and the series colours in part order\n * as the fallback palette. Everything is a CSS custom property, so the\n * theme follows light and dark without a second copy.\n */\nexport function buildPhoTheme(colors: ReadonlyArray<string>): XYChartTheme {\n return buildChartTheme({\n backgroundColor: \"var(--pho-surface, var(--background-color-pho-primary))\",\n colors: [...colors],\n gridColor: \"var(--color-pho-chart-grid)\",\n gridColorDark: \"var(--color-pho-chart-crosshair)\",\n // Labels hang this far off the plot; the tick lines themselves are hidden.\n tickLength: 4,\n svgLabelSmall: LABEL,\n svgLabelBig: LABEL,\n htmlLabel: {\n fontFamily: \"inherit\",\n fontSize: 11,\n fontWeight: 400,\n letterSpacing: 0,\n color: \"var(--text-color-pho-description)\",\n },\n });\n}\n","import { type ReactNode } from \"react\";\nimport { ChartSwatch, type ChartSwatchKind } from \"./legend\";\nimport type { ChartBreakdownItem } from \"./types\";\n\nexport interface ChartTooltipRow {\n label: string;\n value: string;\n color: string;\n kind?: ChartSwatchKind;\n dashed?: boolean;\n}\n\nexport interface ChartTooltipProps {\n /** The snapped x of the hovered bucket, in container px. */\n x: number;\n /** The container's width — the tooltip flips to the left past the middle. */\n width: number;\n /** Where the tooltip's top sits — the plot's top. */\n top: number;\n heading: string;\n rows: ReadonlyArray<ChartTooltipRow>;\n breakdown?: ReadonlyArray<ChartBreakdownItem>;\n breakdownTitle?: ReactNode;\n valueFormat: (value: number) => string;\n /** Said in place of the rows when no series has a value in this bucket. */\n empty?: ReactNode;\n}\n\n/**\n * The readout for one bucket: its time, then every series' value (values\n * lead, in primary ink; labels follow), then the bucket's breakdown when\n * it carries one, or `empty` when there is no value to list. Presentational — the figure's description already\n * speaks the data — and it never takes the pointer.\n */\nexport function ChartTooltip({\n x,\n width,\n top,\n heading,\n rows,\n breakdown,\n breakdownTitle,\n valueFormat,\n empty,\n}: ChartTooltipProps) {\n const flip = x > width / 2;\n return (\n <div\n aria-hidden\n data-chart-tooltip=\"\"\n className=\"bg-pho-primary shadow-pho-lg ring-pho-secondary rounded-base pointer-events-none absolute z-10 max-w-72 min-w-40 px-3 py-2 text-xs ring-1 ring-inset\"\n style={flip ? { right: width - x + 12, top } : { left: x + 12, top }}\n >\n <div className=\"text-pho-primary font-medium\">{heading}</div>\n {rows.length === 0 && empty != null && (\n <div className=\"text-pho-description mt-1\">{empty}</div>\n )}\n <ul className=\"mt-1 flex flex-col gap-0.5\">\n {rows.map((row) => (\n <li\n key={row.label}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-pho-secondary flex min-w-0 items-center gap-1.5\">\n <ChartSwatch\n color={row.color}\n kind={row.kind}\n dashed={row.dashed}\n />\n <span className=\"truncate\">{row.label}</span>\n </span>\n <span className=\"text-pho-primary font-medium tabular-nums\">\n {row.value}\n </span>\n </li>\n ))}\n </ul>\n {breakdown != null && breakdown.length > 0 && (\n <div className=\"border-pho-secondary mt-2 border-t pt-2\">\n {breakdownTitle != null && (\n <div className=\"text-pho-description mb-1\">{breakdownTitle}</div>\n )}\n <ul className=\"flex flex-col gap-0.5\">\n {breakdown.map((item) => (\n <li\n key={item.label}\n className=\"flex items-center justify-between gap-4\"\n >\n <span className=\"text-pho-secondary truncate\">\n {item.label}\n </span>\n <span className=\"text-pho-primary tabular-nums\">\n {valueFormat(item.value)}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","import {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\n// React 18 warns that useLayoutEffect does nothing on the server (19 dropped\n// the warning); a plain effect there keeps a server render quiet.\nexport const useIsomorphicLayoutEffect =\n typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\n/**\n * The width of the element the ref lands on, kept current through a\n * ResizeObserver. Nothing runs on the server: the first render is 0 wide\n * and the plot fills in once the browser has measured. A `fixed` width\n * skips measuring altogether.\n */\nexport function useMeasuredWidth<T extends HTMLElement>(\n fixed?: number,\n): [RefObject<T | null>, number] {\n const ref = useRef<T>(null);\n const [width, setWidth] = useState(0);\n useIsomorphicLayoutEffect(() => {\n if (fixed != null) return;\n const element = ref.current;\n if (element == null) return;\n setWidth(element.getBoundingClientRect().width);\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const next = entries[0]?.contentRect.width;\n if (next != null) setWidth(next);\n });\n observer.observe(element);\n return () => observer.disconnect();\n }, [fixed]);\n return [ref, fixed ?? width];\n}\n","import {\n Children,\n Fragment,\n isValidElement,\n useCallback,\n useContext,\n useId,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { curveLinear, curveMonotoneX } from \"d3-shape\";\nimport { useAnimate, useReducedMotion } from \"motion/react\";\nimport {\n AreaSeries,\n Axis,\n BarGroup,\n BarSeries,\n BarStack,\n DataContext,\n DataProvider,\n Grid,\n LineSeries,\n TooltipContext,\n TooltipProvider,\n XYChart,\n} from \"@visx/xychart\";\nimport {\n FADE_ENTRANCE,\n RISE_PX,\n SPAN_SCALE,\n SPRING_ENTRANCE,\n} from \"../../motion\";\nimport { chartColor } from \"./color\";\nimport { describeChart, numberFormatter, readValue } from \"./format\";\nimport { ChartLegend } from \"./legend\";\nimport {\n bucketSpan,\n bucketTimeFormatter,\n nearestIndex,\n niceLinearDomain,\n thinTicks,\n timeAxisTicks,\n timeTickFormatter,\n toTime,\n} from \"./scale\";\nimport { ChartShell, chartLayout, type ChartLayout } from \"./shell\";\nimport { ChartSkeleton } from \"./skeleton\";\nimport { buildPhoTheme } from \"./theme\";\nimport { ChartTooltip, type ChartTooltipRow } from \"./tooltip\";\nimport type {\n ChartBarProps,\n ChartColor,\n ChartCurve,\n ChartDatum,\n ChartGaps,\n ChartLineProps,\n ChartProps,\n} from \"./types\";\nimport { useIsomorphicLayoutEffect, useMeasuredWidth } from \"./use-measure\";\n\n/**\n * Chart — buckets over time, drawn as the parts it is given: `Chart.Bar`\n * for columns, `Chart.Line` for lines, mixed when a page wants a daily\n * count under its rolling average. The root owns everything the parts\n * share: the frame, the scales, the axes and grid, the tooltip, the\n * legend and the figure's spoken summary. Built on @visx/xychart.\n *\n * Design notes:\n * - Bars are thin: a column never fills its band and never runs past\n * 24px; the leftover is air. The data end is rounded (4px), the\n * baseline end square — in a stack only the top part gets the corners,\n * and a 2px stroke in the surface colour separates segments instead of\n * a border. Side by side, bars sit 2px apart inside the same slot.\n * - Lines are 2px with round joins, straight by default: a curve invents\n * values between samples, so `curve=\"monotone\"` is a choice the page\n * makes for a smooth-by-nature quantity. `area` washes the surface\n * under a line at 10%. A bucket with no value breaks the line, unless\n * the part asks for `gaps=\"connect\"`: then the line joins its\n * neighbours across the hole, for a measure with no reading there\n * rather than a reading of nothing (a percentile in an hour with no\n * requests). Hover still lands on the hole, and `emptyBucket` names it.\n * - Charts with bars run on a band scale, buckets centred in equal bands;\n * lines alone run edge to edge on a time scale. Either way the x-axis\n * labels the round times that fit, and the y-axis three to five round\n * numbers with a hairline grid.\n * - Hover snaps to the nearest bucket: bars lift it with the ghost wash,\n * lines get a crosshair and a surface-ringed point per series, and one\n * tooltip lists every part with a value plus the bucket's `breakdown`.\n * - Data arrives the way a page section does, on the entrance spring and\n * fade `Reveal` uses. A chart that mounts with data rises from its\n * base; data that follows the bones slides in from the left, the same\n * reveal turned along the time axis. A range switch follows the range:\n * a wider span opens outward from inside the plot, a narrower one\n * closes inward from outside it (clipped to the plot); the same span\n * slides in again. A first load with nothing to hold shows bones in\n * the chart's shape, coordinate system included; a refetch keeps the\n * last render at half opacity. Reduced motion makes every arrival\n * static.\n * - The figure is `role=\"img\"` with the `label` and a spoken summary; the\n * legend is real text below the plot, present for two or more parts.\n * Marks register with visx after mount, so a server render carries the\n * frame, the legend and the summary, and the plot fills on hydration.\n */\n\nconst BAR_MAX = 24;\nconst RADIUS = 4;\nconst LINE_WIDTH = 2;\nconst POINT_RADIUS = 4;\nconst SURFACE = \"var(--pho-chart-surface)\";\nconst WASH = \"var(--background-color-pho-ghost-hover)\";\nconst CROSSHAIR = \"var(--color-pho-chart-crosshair)\";\n\n/* ---------------------------------- parts --------------------------------- */\n\n/**\n * `Chart.Bar` — one bar series. Renders nothing itself: the root reads\n * its props and draws the columns among the other parts.\n */\nexport function ChartBar(_props: ChartBarProps): null {\n return null;\n}\nChartBar.displayName = \"Chart.Bar\";\nChartBar.chartPart = \"bar\" as const;\n\n/**\n * `Chart.Line` — one line series. Renders nothing itself: the root reads\n * its props and draws the line among the other parts.\n */\nexport function ChartLine(_props: ChartLineProps): null {\n return null;\n}\nChartLine.displayName = \"Chart.Line\";\nChartLine.chartPart = \"line\" as const;\n\ninterface Part {\n kind: \"bar\" | \"line\";\n dataKey: string;\n label: string;\n color?: ChartColor;\n dashed?: boolean;\n curve: ChartCurve;\n area?: boolean;\n gaps?: ChartGaps;\n}\n\n/** What a part element is, by the marker on its component rather than its identity: a hot reload or a second copy of the library must not lose the parts. */\nfunction partKind(type: unknown): \"bar\" | \"line\" | undefined {\n return (type as { chartPart?: \"bar\" | \"line\" } | null)?.chartPart;\n}\n\n/** The parts among `children`, in order; fragments are looked through. */\nfunction collectParts(children: ReactNode, into: Part[] = []): Part[] {\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n const kind = partKind(child.type);\n if (child.type === Fragment) {\n collectParts((child.props as { children?: ReactNode }).children, into);\n } else if (kind === \"bar\") {\n const p = child.props as ChartBarProps;\n into.push({\n kind: \"bar\",\n dataKey: p.dataKey,\n label: p.label,\n color: p.color,\n curve: \"linear\",\n });\n } else if (kind === \"line\") {\n const p = child.props as ChartLineProps;\n into.push({\n kind: \"line\",\n dataKey: p.dataKey,\n label: p.label,\n color: p.color,\n dashed: p.dashed,\n curve: p.curve ?? \"linear\",\n area: p.area,\n gaps: p.gaps ?? \"break\",\n });\n }\n });\n return into;\n}\n\n/* -------------------------------- accessors ------------------------------- */\n// visx registers a series again whenever an accessor's identity changes,\n// so these are made once per key and shared.\n\ntype Datum = object;\ntype Accessor = (d: Datum) => number;\n\nconst xAccessor: Accessor = (d) => toTime((d as ChartDatum).x);\n\nconst barAccessors = new Map<string, Accessor>();\n/** A bar's value; a hole reads as zero so the segments above still stack. */\nfunction barAccessor(key: string): Accessor {\n let fn = barAccessors.get(key);\n if (fn == null) {\n fn = (d) => readValue(d, key) ?? 0;\n barAccessors.set(key, fn);\n }\n return fn;\n}\n\nconst lineAccessors = new Map<string, Accessor>();\n/** A line's value; a hole reads as NaN so the line breaks there. */\nfunction lineAccessor(key: string): Accessor {\n let fn = lineAccessors.get(key);\n if (fn == null) {\n fn = (d) => readValue(d, key) ?? NaN;\n lineAccessors.set(key, fn);\n }\n return fn;\n}\n\nconst fillAccessors = new Map<string, (d: Datum) => string>();\n/** A bar's fill: its colour, or nothing for an empty bucket so no sliver shows. */\nfunction fillAccessor(key: string, color: string): (d: Datum) => string {\n const id = `${key} ${color}`;\n let fn = fillAccessors.get(id);\n if (fn == null) {\n fn = (d) => (readValue(d, key) ? color : \"transparent\");\n fillAccessors.set(id, fn);\n }\n return fn;\n}\n\n/* --------------------------------- scales --------------------------------- */\n\ntype Positioner = (value: number | Date) => number | undefined;\n\n/** A value's x: the middle of its band, or its point on the time scale. */\nfunction xPositioner(scale: unknown): Positioner {\n const s = scale as ((v: number | Date) => number | undefined) & {\n bandwidth?: () => number;\n };\n const half = typeof s.bandwidth === \"function\" ? s.bandwidth() / 2 : 0;\n return (value) => {\n const x = s(value);\n return typeof x === \"number\" && Number.isFinite(x) ? x + half : undefined;\n };\n}\n\nfunction yPositioner(scale: unknown): Positioner {\n const s = scale as (v: number) => number | undefined;\n return (value) => {\n const y = s(Number(value));\n return typeof y === \"number\" && Number.isFinite(y) ? y : undefined;\n };\n}\n\n/** A band scale's step; a continuous scale has none. */\nfunction stepOf(scale: unknown): number {\n const s = scale as { step?: () => number };\n return typeof s.step === \"function\" ? s.step() : 0;\n}\n\ninterface BandLayout {\n /** The bands' padding: what keeps a bar thin and, in a group, apart. */\n paddingInner: number;\n paddingOuter: number;\n /** The padding inside a group of bars, for visx's group scale. */\n groupPadding: number;\n}\n\n/**\n * How much of each band the bars take. Buckets are centred in equal\n * bands (`paddingOuter` is half the inner padding, so every step is the\n * same width and the tooltip's snapping matches the marks). The bar slot\n * is capped at 24px with a 2px gap; a group spends 2px between its bars,\n * a stack 2px on its surface stroke, so the visible mark stays in the\n * slot.\n */\nfunction bandLayout(\n innerWidth: number,\n count: number,\n groups: number,\n stacked: boolean,\n): BandLayout {\n const step = count > 0 ? innerWidth / count : 0;\n const gap = step >= 6 ? 2 : step >= 3 ? 1 : 0;\n const slot = Math.max(1, Math.min(BAR_MAX, step - gap));\n const inner = Math.min(2, gap);\n const target = stacked ? slot + inner : groups > 1 ? slot + 2 * inner : slot;\n const bandwidth = Math.min(step, target);\n const paddingInner = step > 0 ? 1 - bandwidth / step : 0;\n // A group's band scale pads inside and outside alike; this keeps the\n // gaps between bars at `inner` px.\n const groupPadding =\n groups > 1 && bandwidth > inner\n ? Math.min(0.5, (inner * groups) / (bandwidth - inner))\n : 0;\n return { paddingInner, paddingOuter: paddingInner / 2, groupPadding };\n}\n\n/* --------------------------------- layers --------------------------------- */\n\n/**\n * visx makes its scales once a series has registered, and hands out a\n * placeholder before that: nothing is drawn against it, on the server or\n * in the first client frame.\n */\nfunction Registered({ children }: { children: ReactNode }) {\n const { dataRegistry } = useContext(DataContext);\n const ready =\n dataRegistry?.entries().some((entry) => entry.data.length > 0) ?? false;\n return ready ? <>{children}</> : null;\n}\n\n/**\n * The hovered bucket's index, when visx has one and it still exists.\n *\n * Without a `gaps=\"connect\"` line, every registered series shares the same\n * unfiltered array, so visx's own `nearestDatum.index` already is the\n * bucket's place in `data` — used as-is, bounds-checked against the\n * current length so a hover from before the data shrank can't outlive it.\n *\n * A connect line is registered under its own filtered (holes removed)\n * array instead, so that bounds-check alone isn't enough: visx compares x\n * *and* y distance across series to pick the nearest one, so a hole —\n * nothing is registered there — can lose to a neighbouring visible point\n * whenever the pointer sits far from that point's height, not only near\n * the boundary between them. Once any line connects, the bucket is found\n * by x position alone instead, against every bucket in the full data —\n * the same read `HoverWash`'s wash and `HoverMarks`' crosshair already do\n * in the other direction. A bucket is a bucket, hole or not, and the\n * nearest one by x is always the right one.\n */\nfunction useHoveredIndex(\n data: ReadonlyArray<ChartDatum>,\n xScale: unknown,\n hasConnectedLines: boolean,\n): number | null {\n const tooltip = useContext(TooltipContext);\n if (!tooltip?.tooltipOpen) return null;\n if (hasConnectedLines) {\n const left = tooltip.tooltipLeft;\n if (left == null || xScale == null || data.length === 0) return null;\n const positioner = xPositioner(xScale);\n const positions: number[] = [];\n for (const d of data) {\n const x = positioner(toTime(d.x));\n if (x == null) return null;\n positions.push(x);\n }\n return nearestIndex(positions, left);\n }\n const index = tooltip.tooltipData?.nearestDatum?.index;\n return index != null && index >= 0 && index < data.length ? index : null;\n}\n\ninterface LayerProps {\n data: ReadonlyArray<ChartDatum>;\n layout: ChartLayout;\n /** See `useHoveredIndex`. */\n hasConnectedLines: boolean;\n}\n\n/** The time labels along the bottom; the end labels tuck inside the plot. */\nfunction BottomAxis({\n values,\n format,\n layout,\n}: {\n values: ReadonlyArray<number | Date>;\n format: (value: number | Date) => string;\n layout: ChartLayout;\n}) {\n const { xScale } = useContext(DataContext);\n const tickLabelProps = useCallback(\n (raw: unknown) => {\n const value = raw as number | Date;\n const x = xPositioner(xScale)(value) ?? layout.left;\n const half = (format(value).length * 6.5) / 2;\n const textAnchor =\n x - half < layout.left\n ? \"start\"\n : x + half > layout.right\n ? \"end\"\n : \"middle\";\n return { textAnchor } as const;\n },\n [xScale, format, layout.left, layout.right],\n );\n return (\n <Axis\n orientation=\"bottom\"\n tickValues={[...values]}\n tickFormat={(value: unknown) => format(value as number | Date)}\n hideAxisLine\n hideTicks\n tickLabelProps={tickLabelProps}\n />\n );\n}\n\n/** The ghost wash under the hovered bucket's column. */\nfunction HoverWash({ data, layout, hasConnectedLines }: LayerProps) {\n const { xScale } = useContext(DataContext);\n const index = useHoveredIndex(data, xScale, hasConnectedLines);\n if (index == null || xScale == null) return null;\n const cx = xPositioner(xScale)(toTime(data[index]!.x));\n const step = stepOf(xScale);\n if (cx == null) return null;\n return (\n <rect\n data-hover-wash=\"\"\n x={cx - step / 2}\n y={layout.top}\n width={step}\n height={layout.innerHeight}\n fill={WASH}\n />\n );\n}\n\n/** The bars' baseline, a touch stronger than the grid so they stand on something. */\nfunction ZeroLine({ layout }: { layout: ChartLayout }) {\n const { yScale } = useContext(DataContext);\n const y = yScale ? yPositioner(yScale)(0) : undefined;\n if (y == null) return null;\n return (\n <line\n data-zero=\"\"\n x1={layout.left}\n x2={layout.right}\n y1={y}\n y2={y}\n stroke={CROSSHAIR}\n />\n );\n}\n\n/** The crosshair on a line chart, and a surface-ringed point per line at the hovered bucket. */\nfunction HoverMarks({\n data,\n layout,\n lines,\n crosshair,\n hasConnectedLines,\n}: LayerProps & {\n lines: ReadonlyArray<{ dataKey: string; color: string }>;\n crosshair: boolean;\n}) {\n const { xScale, yScale } = useContext(DataContext);\n const index = useHoveredIndex(data, xScale, hasConnectedLines);\n if (index == null || xScale == null || yScale == null) return null;\n const datum = data[index]!;\n const cx = xPositioner(xScale)(toTime(datum.x));\n if (cx == null) return null;\n const y = yPositioner(yScale);\n return (\n <g data-hover=\"\">\n {crosshair && (\n <line\n x1={cx}\n x2={cx}\n y1={layout.top}\n y2={layout.bottom}\n stroke={CROSSHAIR}\n />\n )}\n {lines.length > 0 && (\n <g data-points=\"\">\n {lines.map((line) => {\n const value = readValue(datum, line.dataKey);\n const cy = value == null ? undefined : y(value);\n if (cy == null) return null;\n return (\n <circle\n key={line.dataKey}\n cx={cx}\n cy={cy}\n r={POINT_RADIUS}\n fill={line.color}\n // The surface ring keeps a dot legible where lines cross.\n stroke={SURFACE}\n strokeWidth={2}\n />\n );\n })}\n </g>\n )}\n </g>\n );\n}\n\n/**\n * The marks' arrival, on `SPRING_ENTRANCE` and `FADE_ENTRANCE` like a\n * `Reveal`. A chart that mounts with data rises from its base (scaleY\n * from 0 at the bottom of what it draws). Data that follows an empty\n * plot — the bones, or a cleared range — slides in from the left by the\n * reveal's own distance, the arrival turned along the time axis. From\n * there a change follows what the range did: a wider span opens outward\n * (scaleX from `SPAN_SCALE` about the middle), a narrower one closes\n * inward (from its inverse, clipped to the plot so nothing crosses the\n * axes), the same span slides in again. A refetch that lands mid-flight\n * restarts it. The layout effect sets the first frame before paint, so\n * new marks never flash at full size first. Static under reduced motion.\n */\nfunction Rise({\n data,\n range,\n layout,\n children,\n}: {\n data: ReadonlyArray<unknown>;\n /** The span of time the data covers, in ms; 0 with no data. */\n range: number;\n layout: ChartLayout;\n children: ReactNode;\n}) {\n const reduceMotion = useReducedMotion();\n const [scope, animate] = useAnimate<SVGGElement>();\n const clipId = useId();\n // The span last shown, 0 for an empty plot; nothing before the mount.\n const shown = useRef<number | null>(null);\n useIsomorphicLayoutEffect(() => {\n const node = scope.current;\n const previous = shown.current;\n shown.current = range;\n if (data.length === 0 || reduceMotion || node == null) return;\n const fade = { opacity: FADE_ENTRANCE };\n const controls =\n previous == null\n ? animate(\n node,\n { scaleY: [0, 1], scaleX: 1, x: 0, opacity: [0, 1], originY: 1 },\n { scaleY: SPRING_ENTRANCE, ...fade },\n )\n : previous === 0 || range === previous\n ? animate(\n node,\n { x: [-RISE_PX, 0], scaleX: 1, scaleY: 1, opacity: [0, 1] },\n { x: SPRING_ENTRANCE, ...fade },\n )\n : animate(\n node,\n {\n scaleX: [range > previous ? SPAN_SCALE : 1 / SPAN_SCALE, 1],\n scaleY: 1,\n x: 0,\n opacity: [0, 1],\n originX: 0.5,\n },\n { scaleX: SPRING_ENTRANCE, ...fade },\n );\n return () => controls.stop();\n }, [data, range, reduceMotion]);\n // A breath of room so a stroke on the plot's edge is never shaved.\n const pad = 4;\n return (\n <g clipPath={`url(#${clipId})`}>\n <defs>\n <clipPath id={clipId}>\n <rect\n x={layout.left - pad}\n y={layout.top - pad}\n width={layout.innerWidth + 2 * pad}\n height={layout.innerHeight + 2 * pad}\n />\n </clipPath>\n </defs>\n <g ref={scope} data-marks=\"\">\n {children}\n </g>\n </g>\n );\n}\n\n/** The readout beside the hovered bucket: finite part values, then the breakdown. */\nfunction HoverTooltip({\n data,\n layout,\n parts,\n colors,\n width,\n headingFormat,\n valueFormat,\n breakdownTitle,\n emptyBucket,\n hasConnectedLines,\n}: LayerProps & {\n parts: ReadonlyArray<Part>;\n colors: ReadonlyArray<string>;\n width: number;\n headingFormat: (date: Date) => string;\n valueFormat: (value: number) => string;\n breakdownTitle?: ReactNode;\n emptyBucket?: ReactNode;\n}) {\n const { xScale } = useContext(DataContext);\n const index = useHoveredIndex(data, xScale, hasConnectedLines);\n if (index == null || xScale == null) return null;\n const datum = data[index]!;\n const x = xPositioner(xScale)(toTime(datum.x));\n if (x == null) return null;\n return (\n <ChartTooltip\n x={x}\n width={width}\n top={layout.top}\n heading={headingFormat(new Date(datum.x))}\n rows={parts.flatMap<ChartTooltipRow>((part, i) => {\n const value = readValue(datum, part.dataKey);\n return value == null\n ? []\n : [\n {\n label: part.label,\n value: valueFormat(value),\n color: colors[i]!,\n kind: part.kind === \"bar\" ? \"rect\" : \"line\",\n dashed: part.dashed,\n },\n ];\n })}\n breakdown={datum.breakdown}\n breakdownTitle={breakdownTitle}\n valueFormat={valueFormat}\n empty={emptyBucket}\n />\n );\n}\n\n/* ---------------------------------- root ---------------------------------- */\n\n// visx wraps a left label to the margin's width; the margin is sized to\n// the labels here, so a label never wraps.\nconst LEFT_TICK_LABEL = {\n dx: \"-0.35em\",\n dy: \"0.35em\",\n width: undefined,\n} as const;\n\nexport function Chart<T extends ChartDatum>({\n data,\n children,\n label,\n description,\n height = 200,\n width: fixedWidth,\n valueFormat,\n timeFormat,\n locale,\n legend,\n baseline = \"zero\",\n stacked = false,\n breakdownTitle,\n loading,\n empty = \"Nothing here yet.\",\n emptyBucket,\n className,\n ...props\n}: ChartProps<T>) {\n const [containerRef, width] = useMeasuredWidth<HTMLDivElement>(fixedWidth);\n const parts = useMemo(() => collectParts(children), [children]);\n\n const model = useMemo(() => {\n const times = data.map((d) => toTime(d.x));\n const span = bucketSpan(times);\n const axisFormat = valueFormat ?? numberFormatter(locale, true);\n const fullFormat = valueFormat ?? numberFormatter(locale);\n const headingFormat = timeFormat ?? bucketTimeFormatter(locale, span);\n const colors = parts.map((part, index) => chartColor(part.color, index));\n const bars = parts.filter((part) => part.kind === \"bar\");\n const lines = parts\n .map((part, index) => ({ ...part, color: colors[index]! }))\n .filter((part) => part.kind === \"line\");\n let min = Infinity;\n let max = -Infinity;\n const consider = (value: number) => {\n if (value < min) min = value;\n if (value > max) max = value;\n };\n if (stacked && bars.length > 1) {\n for (const d of data) {\n let positive = 0;\n let negative = 0;\n for (const bar of bars) {\n const value = readValue(d, bar.dataKey);\n if (value == null) continue;\n if (value > 0) positive += value;\n else negative += value;\n }\n consider(positive);\n consider(negative);\n }\n } else {\n for (const bar of bars) {\n for (const d of data) {\n const value = readValue(d, bar.dataKey);\n if (value != null) consider(value);\n }\n }\n }\n for (const line of lines) {\n for (const d of data) {\n const value = readValue(d, line.dataKey);\n if (value != null) consider(value);\n }\n }\n if (min === Infinity) {\n min = 0;\n max = 0;\n }\n // Columns rise from zero, so a chart with bars always keeps it.\n if (baseline === \"zero\" || bars.length > 0) {\n min = Math.min(0, min);\n max = Math.max(0, max);\n }\n const y = niceLinearDomain(min, max);\n return {\n times,\n span,\n colors,\n bars,\n lines,\n hasBars: bars.length > 0,\n axisFormat,\n fullFormat,\n headingFormat,\n y,\n yLabels: y.ticks.map(axisFormat),\n described:\n description ??\n describeChart({\n data,\n series: parts.map((part) => ({\n key: part.dataKey,\n label: part.label,\n kind: part.kind,\n })),\n valueFormat: fullFormat,\n timeFormat: headingFormat,\n }),\n };\n }, [\n data,\n parts,\n stacked,\n baseline,\n valueFormat,\n timeFormat,\n locale,\n description,\n ]);\n\n const n = data.length;\n const t0 = model.times[0] ?? 0;\n const t1 = model.times[n - 1] ?? 0;\n // The span the buckets cover: their spread plus the last bucket itself.\n const range = n > 0 ? t1 - t0 + model.span : 0;\n const layout = useMemo(\n () => chartLayout(width, height, model.yLabels),\n [width, height, model.yLabels],\n );\n const band = useMemo(\n () => bandLayout(layout.innerWidth, n, model.bars.length, stacked),\n [layout.innerWidth, n, model.bars.length, stacked],\n );\n\n // Bars need a band; lines alone run edge to edge on time.\n const xScale = useMemo(\n () =>\n model.hasBars\n ? {\n type: \"band\" as const,\n domain: model.times,\n paddingInner: band.paddingInner,\n paddingOuter: band.paddingOuter,\n }\n : {\n type: \"time\" as const,\n domain: t1 > t0 ? [t0, t1] : [t0 - 1, t0 + 1],\n },\n [model.hasBars, model.times, band.paddingInner, band.paddingOuter, t0, t1],\n );\n const yScale = useMemo(\n () => ({\n type: \"linear\" as const,\n domain: model.y.domain,\n zero: false,\n nice: false,\n }),\n [model.y.domain],\n );\n const theme = useMemo(() => buildPhoTheme(model.colors), [model.colors]);\n\n const xTicks = useMemo(() => {\n const format = timeTickFormatter(locale);\n if (n === 0 || layout.innerWidth <= 0) {\n return { values: [] as Array<number | Date>, format: () => \"\" };\n }\n const ticks = thinTicks(\n timeAxisTicks(t0, t1, layout.innerWidth),\n format,\n layout.innerWidth,\n );\n if (!model.hasBars) {\n return {\n values: ticks as Array<number | Date>,\n format: (value: number | Date) => format(new Date(value)),\n };\n }\n // A band takes only its own values: each round tick lands on the\n // nearest bucket, and keeps the round time as its label.\n const labels = new Map<number, string>();\n for (const tick of ticks) {\n const at = model.times[nearestIndex(model.times, tick.getTime())]!;\n if (!labels.has(at)) labels.set(at, format(tick));\n }\n return {\n values: [...labels.keys()] as Array<number | Date>,\n format: (value: number | Date) =>\n labels.get(toTime(value)) ?? format(new Date(value)),\n };\n }, [n, t0, t1, layout.innerWidth, locale, model.hasBars, model.times]);\n\n const showLegend = legend ?? parts.length > 1;\n const showEmpty = n === 0 && !loading;\n // Bones only when there is no last render to hold.\n const showSkeleton = n === 0 && loading === true;\n const zeroAtEdge = model.y.domain[0] >= 0 || model.y.domain[1] <= 0;\n const series = data as T[];\n // A connecting line is handed only the buckets it has a value for, so\n // the path runs straight across the holes; hover and the tooltip keep\n // the full data, and land on a hole like any other bucket.\n const lineData = useMemo(() => {\n const out = new Map<string, T[]>();\n for (const line of model.lines) {\n if (line.gaps === \"connect\") {\n out.set(\n line.dataKey,\n series.filter((d) => readValue(d, line.dataKey) != null),\n );\n }\n }\n return out;\n }, [model.lines, series]);\n const hasConnectedLines = lineData.size > 0;\n\n const barMarks = (() => {\n const { bars } = model;\n if (bars.length === 0) return null;\n const last = bars.length - 1;\n const marks = bars.map((bar, i) => {\n const color = model.colors[parts.indexOf(bar)]!;\n const rounded = !stacked || i === last;\n return (\n <BarSeries\n key={bar.dataKey}\n dataKey={bar.dataKey}\n data={series}\n xAccessor={xAccessor}\n yAccessor={barAccessor(bar.dataKey)}\n colorAccessor={fillAccessor(bar.dataKey, color)}\n radius={rounded ? RADIUS : undefined}\n radiusTop={rounded}\n data-series={bar.dataKey}\n />\n );\n });\n if (bars.length === 1) return marks;\n return stacked ? (\n <BarStack>{marks}</BarStack>\n ) : (\n <BarGroup padding={band.groupPadding}>{marks}</BarGroup>\n );\n })();\n\n const lineMarks = model.lines.map((line) => {\n const curve = line.curve === \"monotone\" ? curveMonotoneX : curveLinear;\n const dash = line.dashed ? \"4 4\" : undefined;\n const points = lineData.get(line.dataKey) ?? series;\n return line.area ? (\n <AreaSeries\n key={line.dataKey}\n dataKey={line.dataKey}\n data={points}\n xAccessor={xAccessor}\n yAccessor={lineAccessor(line.dataKey)}\n curve={curve}\n fill={line.color}\n fillOpacity={0.1}\n lineProps={{\n stroke: line.color,\n strokeWidth: LINE_WIDTH,\n strokeLinejoin: \"round\",\n strokeDasharray: dash,\n }}\n data-series={line.dataKey}\n />\n ) : (\n <LineSeries\n key={line.dataKey}\n dataKey={line.dataKey}\n data={points}\n xAccessor={xAccessor}\n yAccessor={lineAccessor(line.dataKey)}\n curve={curve}\n stroke={line.color}\n strokeWidth={LINE_WIDTH}\n strokeLinejoin=\"round\"\n strokeDasharray={dash}\n data-series={line.dataKey}\n />\n );\n });\n\n return (\n <ChartShell\n label={label}\n description={model.described}\n height={height}\n containerRef={containerRef}\n loading={loading}\n empty={empty}\n showEmpty={showEmpty}\n placeholder={showSkeleton ? <ChartSkeleton layout={layout} /> : null}\n className={className}\n legend={\n showLegend ? (\n <ChartLegend\n items={parts.map((part, index) => ({\n label: part.label,\n color: model.colors[index]!,\n kind: part.kind === \"bar\" ? \"rect\" : \"line\",\n dashed: part.dashed,\n }))}\n />\n ) : null\n }\n {...props}\n >\n {width > 0 && !showEmpty && (\n <DataProvider\n xScale={xScale}\n yScale={yScale}\n theme={theme}\n initialDimensions={{ width, height, margin: layout.margin }}\n >\n <TooltipProvider hideTooltipDebounceMs={0}>\n <XYChart\n width={width}\n height={height}\n margin={layout.margin}\n accessibilityLabel={label}\n >\n <Registered>\n <Grid rows columns={false} numTicks={model.y.count} />\n </Registered>\n <Axis\n orientation=\"left\"\n tickValues={model.y.ticks}\n tickFormat={(value: unknown) => model.axisFormat(Number(value))}\n hideAxisLine\n hideTicks\n tickLabelProps={LEFT_TICK_LABEL}\n />\n <BottomAxis\n values={xTicks.values}\n format={xTicks.format}\n layout={layout}\n />\n {model.hasBars && (\n <HoverWash\n data={data}\n layout={layout}\n hasConnectedLines={hasConnectedLines}\n />\n )}\n <Rise data={data} range={range} layout={layout}>\n {barMarks}\n {lineMarks}\n </Rise>\n {model.hasBars && zeroAtEdge && (\n <Registered>\n <ZeroLine layout={layout} />\n </Registered>\n )}\n <HoverMarks\n data={data}\n layout={layout}\n lines={model.lines}\n crosshair={!model.hasBars}\n hasConnectedLines={hasConnectedLines}\n />\n </XYChart>\n <HoverTooltip\n data={data}\n layout={layout}\n parts={parts}\n colors={model.colors}\n width={width}\n headingFormat={model.headingFormat}\n valueFormat={model.fullFormat}\n breakdownTitle={breakdownTitle}\n emptyBucket={emptyBucket}\n hasConnectedLines={hasConnectedLines}\n />\n </TooltipProvider>\n </DataProvider>\n )}\n </ChartShell>\n );\n}\n\nChart.displayName = \"Chart\";\nChart.Bar = ChartBar;\nChart.Line = ChartLine;\n"],"x_google_ignoreList":[0,1,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- "use client";
2
- import { n as a } from "./use-press-pulse-IbNstUT0.js";
3
- var s = "group outline-pho-brand flex flex-1 cursor-pointer items-start gap-2.5 rounded-base p-3 text-base text-pho-secondary ring-1 ring-pho-primary ring-inset transition-[box-shadow,background-color] duration-150 ease-out select-none hover:bg-pho-ghost-hover data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:hover:bg-transparent data-[checked]:ring-2 data-[checked]:ring-pho-brand has-[[data-checked]]:ring-2 has-[[data-checked]]:ring-pho-brand focus-visible:outline-2 focus-visible:outline-offset-2 has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2", o = "flex-col gap-1.5", r = 0.98, t = a, i = {
4
- type: "spring",
5
- stiffness: 500,
6
- damping: 30,
7
- mass: 0.5
8
- };
9
- export {
10
- i as a,
11
- o as i,
12
- r as n,
13
- t as r,
14
- s as t
15
- };
16
-
17
- //# sourceMappingURL=choice-card-BVNP1NB6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"choice-card-BVNP1NB6.js","names":[],"sources":["../../src/utils/choice-card.ts"],"sourcesContent":["import type { Transition } from \"motion/react\";\nimport { CONTROL_PRESS_SPRING } from \"./use-press-pulse\";\n\n/**\n * Shared surface for `RadioCard` / `CheckboxCard` — a bordered, selectable\n * tile. Applied to the radio/checkbox root itself so the whole tile is the\n * hit target. Hover fills (`bg-pho-ghost-hover`); selected uses the brand\n * ring. Press feedback lives on this surface (see `usePressPulse`).\n */\nexport const CHOICE_CARD_BASE =\n \"group outline-pho-brand flex flex-1 cursor-pointer items-start gap-2.5 rounded-base p-3 text-base text-pho-secondary ring-1 ring-pho-primary ring-inset transition-[box-shadow,background-color] duration-150 ease-out select-none hover:bg-pho-ghost-hover data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:hover:bg-transparent data-[checked]:ring-2 data-[checked]:ring-pho-brand has-[[data-checked]]:ring-2 has-[[data-checked]]:ring-pho-brand focus-visible:outline-2 focus-visible:outline-offset-2 has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2\";\n\n/** Stacked icon above the copy — tighter than the checkbox/radio row gap. */\nexport const CHOICE_CARD_WITH_ICON = \"flex-col gap-1.5\";\n\n/** Same press as Select's default trigger — field-sized, not Button's whileTap. */\nexport const CHOICE_CARD_PRESS_SCALE = 0.98;\nexport const CHOICE_CARD_PRESS_TRANSITION: Transition = CONTROL_PRESS_SPRING;\n\n/** Selection pop for a radio dot / checkbox glyph — quick and slightly bouncy. */\nexport const CHOICE_INDICATOR_POP_TRANSITION: Transition = {\n type: \"spring\",\n stiffness: 500,\n damping: 30,\n mass: 0.5,\n};\n"],"mappings":";;AASA,IAAa,IACX,klBAGW,IAAwB,oBAGxB,IAA0B,MAC1B,IAA2C,GAG3C,IAA8C;AAAA,EACzD,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AACR"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialog-MPvem7yV.js","names":[],"sources":["../../src/components/dialog/dialog.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentProps,\n type ElementType,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from \"react\";\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\";\nimport { AnimatedHeight } from \"../../utils/animated-height\";\nimport { cn } from \"../../utils/cn\";\nimport { ScrollArea } from \"../scroll-area\";\nimport { Button, type ButtonProps } from \"../button/button\";\nimport { CloseButton } from \"../button/close-button\";\n\n/** Override Base UI's `string | (state) => string` className with plain string. */\ntype StyledProps<T extends ElementType> = Omit<\n ComponentProps<T>,\n \"className\"\n> & {\n className?: string;\n};\n\n/* ========================== Async pending context ========================== */\n\n/** Imperative actions exposed by Base UI's `actionsRef`. */\ninterface RootActions {\n unmount: () => void;\n close: () => void;\n}\n\ninterface DialogPendingContextValue {\n /** True while a `Dialog.Action` promise is in flight. */\n pending: boolean;\n beginPending: () => void;\n endPending: () => void;\n /** Close the dialog imperatively (used by `Dialog.Action` on resolve). */\n close: () => void;\n}\n\nconst DialogPendingContext = createContext<DialogPendingContextValue | null>(\n null,\n);\n\n/**\n * Whether the surrounding dialog has a `Dialog.Action` promise in flight —\n * use it to disable secondary actions (Cancel etc.) while work is pending.\n * Returns `false` outside a `Dialog.Root`.\n */\nexport function useDialogPending(): boolean {\n return useContext(DialogPendingContext)?.pending ?? false;\n}\n\ntype RootProps = ComponentProps<typeof BaseDialog.Root>;\n\n/**\n * `Dialog.Root` with async awareness: while a `Dialog.Action` promise is\n * pending, every close request (outside press, Escape, `Dialog.Close`) is\n * cancelled so the dialog stays open until the work settles. Props pass\n * through to Base UI's `Dialog.Root` unchanged.\n */\nfunction Root({ onOpenChange, actionsRef, ...props }: RootProps) {\n const [pending, setPending] = useState(false);\n // Guard reads a ref so a resolve → close() in the same tick isn't blocked\n // by a not-yet-flushed state update.\n const pendingRef = useRef(false);\n const internalActionsRef = useRef<RootActions | null>(null);\n\n // Keep a caller-supplied actionsRef working alongside our internal one.\n useEffect(() => {\n if (!actionsRef) return;\n actionsRef.current = internalActionsRef.current;\n return () => {\n actionsRef.current = null;\n };\n }, [actionsRef]);\n\n const handleOpenChange = useCallback<NonNullable<RootProps[\"onOpenChange\"]>>(\n (open, eventDetails) => {\n if (!open && pendingRef.current) {\n eventDetails.cancel();\n return;\n }\n onOpenChange?.(open, eventDetails);\n },\n [onOpenChange],\n );\n\n const contextValue = useMemo<DialogPendingContextValue>(\n () => ({\n pending,\n beginPending: () => {\n pendingRef.current = true;\n setPending(true);\n },\n endPending: () => {\n pendingRef.current = false;\n setPending(false);\n },\n close: () => internalActionsRef.current?.close(),\n }),\n [pending],\n );\n\n return (\n <DialogPendingContext.Provider value={contextValue}>\n <BaseDialog.Root\n actionsRef={internalActionsRef}\n onOpenChange={handleOpenChange}\n {...props}\n />\n </DialogPendingContext.Provider>\n );\n}\n\nconst Trigger = BaseDialog.Trigger;\nconst Portal = BaseDialog.Portal;\nconst Close = BaseDialog.Close;\n\n/* ============================== Dialog.Action ============================== */\n\nexport interface DialogActionProps extends Omit<ButtonProps, \"onClick\"> {\n /**\n * Confirm handler. Return a promise to keep the dialog open while it runs:\n * the button shows `loading`, all dismissal is locked, and the dialog\n * closes when the promise resolves. On rejection the dialog stays open —\n * surface errors inside the handler. A non-promise return closes\n * immediately, like `Dialog.Close`.\n */\n onClick?: (\n event: ReactMouseEvent<HTMLButtonElement>,\n ) => void | Promise<unknown>;\n}\n\nfunction isThenable(value: unknown): value is Promise<unknown> {\n return (\n value != null && typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\n/**\n * The confirm button of an action row, with native promise support — a\n * `Button` that runs its (possibly async) `onClick` and closes the dialog\n * when the work settles successfully.\n */\nfunction Action({ onClick, loading, disabled, ...props }: DialogActionProps) {\n const pendingContext = useContext(DialogPendingContext);\n const [busy, setBusy] = useState(false);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n function handleClick(event: ReactMouseEvent<HTMLButtonElement>) {\n if (busy || loading) return;\n const result = onClick?.(event);\n if (!isThenable(result)) {\n pendingContext?.close();\n return;\n }\n setBusy(true);\n pendingContext?.beginPending();\n result.then(\n () => {\n pendingContext?.endPending();\n if (mountedRef.current) setBusy(false);\n pendingContext?.close();\n },\n (error: unknown) => {\n pendingContext?.endPending();\n if (mountedRef.current) setBusy(false);\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\"\n ) {\n console.error(\"Dialog.Action: async onClick rejected —\", error);\n }\n },\n );\n }\n\n const inert = busy || loading;\n return (\n <Button\n {...props}\n disabled={disabled || inert}\n loading={inert}\n onClick={handleClick}\n />\n );\n}\n\nfunction Backdrop({\n className,\n ...props\n}: StyledProps<typeof BaseDialog.Backdrop>) {\n return (\n <BaseDialog.Backdrop\n className={cn(\n \"bg-pho-overlay fixed inset-0 z-50 transition-opacity duration-200 ease-out\",\n \"data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Popup({ className, ...props }: StyledProps<typeof BaseDialog.Popup>) {\n return (\n <BaseDialog.Popup\n className={cn(\n // Floating layer: bg-pho-primary + border-pho-secondary hairline, elevation kept.\n \"border-pho-secondary bg-pho-primary shadow-pho-xl fixed top-1/2 left-1/2 z-50 w-[calc(100%-2rem)] max-w-lg -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-lg border outline-none\",\n // Global height cap — the inset panel's footprint (inset-4 /\n // sm:inset-8). A flex column so the body region can shrink and\n // scroll while header and actions stay pinned.\n \"flex max-h-[calc(100dvh-2rem)] flex-col sm:max-h-[calc(100dvh-4rem)]\",\n // Opacity + scale only — leave translate centering alone (no transition-all).\n \"transition-[opacity,scale] duration-200 ease-out\",\n \"data-[starting-style]:scale-95 data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-95 data-[ending-style]:opacity-0 data-[ending-style]:duration-150\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Title({ className, ...props }: StyledProps<typeof BaseDialog.Title>) {\n return (\n <BaseDialog.Title\n className={cn(\n \"text-pho-primary font-display text-display-sm font-medium text-balance\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Description({\n className,\n ...props\n}: StyledProps<typeof BaseDialog.Description>) {\n return (\n <BaseDialog.Description\n className={cn(\n \"text-pho-description text-display-xs font-normal\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Header icon chrome: secondary ink, a hair of extra air before the title.\n * Panel dialogs use 32px (`size-8`); fullscreen gates step up to 48px\n * (`size-12`) so the glyph reads at viewport scale.\n */\nfunction DialogHeaderIcon({\n children,\n size = \"md\",\n}: {\n children: ReactNode;\n size?: \"md\" | \"lg\";\n}) {\n return (\n <span\n aria-hidden\n className={cn(\n \"text-pho-secondary mb-1\",\n size === \"lg\" ? \"[&>svg]:size-12\" : \"[&>svg]:size-8\",\n )}\n >\n {children}\n </span>\n );\n}\n\ninterface ContentProps extends Omit<\n StyledProps<typeof BaseDialog.Popup>,\n \"title\"\n> {\n /**\n * Decorative icon above the title — typically a Tabler outline icon.\n * Rendered aria-hidden in secondary ink at 32px (`[&>svg]:size-8`). Pass a\n * styled node to override the ink; the size is owned by the slot.\n */\n icon?: ReactNode;\n /** Heading rendered in the panel header. */\n title?: ReactNode;\n /** Supporting text under the title. */\n description?: ReactNode;\n /**\n * Consequence bullets rendered as a list at the top of the body — one item\n * per outcome (what is deleted, what survives, who loses access). Use on\n * destructive confirms where the one-line description undersells the\n * impact; keep each item to a single short sentence. Wrap the load-bearing\n * figure in `<strong>` (\"<strong>3 members</strong> lose access\") — the\n * list styles it (secondary ink, medium weight); no classes needed.\n */\n consequences?: ReactNode[];\n /**\n * Final cautionary line under `consequences` — error ink at description\n * size (e.g. \"It cannot be undone. Please be certain.\"). Reserve it for\n * irreversible actions; keep it short.\n */\n warning?: ReactNode;\n /**\n * Footer action row (Cancel / Confirm, etc.). Iron rule: when `actions` is\n * set, the header close button is never shown — dismiss via the actions.\n */\n actions?: ReactNode;\n /**\n * Header close control. Only applies when `actions` is absent.\n * @default true\n */\n showClose?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Convenience panel: renders the portal, backdrop, and styled popup with an\n * optional header (title/description + close) and optional action row. For\n * full control, compose the parts directly (`Dialog.Portal` /\n * `Dialog.Backdrop` / `Dialog.Popup`).\n */\nfunction Content({\n icon,\n title,\n description,\n consequences,\n warning,\n actions,\n showClose = true,\n children,\n className,\n ...props\n}: ContentProps) {\n // Iron rule: action dialogs dismiss via their actions — never a header X.\n const showCloseButton = actions == null && showClose;\n const hasHeader = Boolean(icon || title || description || showCloseButton);\n const hasConsequences = consequences != null && consequences.length > 0;\n // The scrollable middle region — actions stay pinned below it.\n const hasScrollBody = hasConsequences || warning != null || children != null;\n\n return (\n <Portal>\n <Backdrop />\n <Popup className={className} {...props}>\n {hasHeader && (\n <div className=\"flex shrink-0 flex-col gap-2 px-6 pt-6\">\n {icon && <DialogHeaderIcon>{icon}</DialogHeaderIcon>}\n {(title || showCloseButton) && (\n // Title row height = title only. Close is out of flow, centered\n // on the row, and may paint outside it (no clip, no stretch).\n <div className=\"relative\">\n {title ? (\n <Title className={showCloseButton ? \"pr-12\" : undefined}>\n {title}\n </Title>\n ) : (\n <div className=\"h-[1.625rem]\" aria-hidden=\"true\" />\n )}\n {showCloseButton && (\n <Close\n render={\n <CloseButton className=\"absolute top-1/2 right-0 z-10 -translate-y-1/2\" />\n }\n />\n )}\n </div>\n )}\n {description && <Description>{description}</Description>}\n </div>\n )}\n {hasScrollBody && (\n <ScrollArea.Root className=\"min-h-0 flex-1\">\n <ScrollArea.Viewport>\n <ScrollArea.Content className=\"flex flex-col gap-5 px-6 py-5\">\n {hasConsequences && (\n <ul className=\"text-pho-description text-md [&_strong]:text-pho-secondary space-y-1 [&_strong]:font-medium\">\n {consequences.map((item, index) => (\n // Hand-drawn marker: a 4px dot on the first line's center —\n // quieter than the browser disc, ink tracks the text.\n <li\n key={index}\n className=\"relative pl-4 before:absolute before:top-2.5 before:left-1 before:size-1 before:rounded-full before:bg-current\"\n >\n {item}\n </li>\n ))}\n </ul>\n )}\n {warning != null && (\n <p className=\"text-pho-error text-display-xs font-medium\">\n {warning}\n </p>\n )}\n {children}\n </ScrollArea.Content>\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Root>\n )}\n {actions != null && (\n <div\n className={cn(\n \"flex shrink-0 items-center justify-end gap-2 px-6 pb-5\",\n !hasScrollBody && \"pt-5\",\n )}\n >\n {actions}\n </div>\n )}\n </Popup>\n </Portal>\n );\n}\n\n/* =========================== Dialog.InsetContent =========================== */\n\n/**\n * Near-fullscreen popup — the viewport minus a breathing ring, floating over\n * a backdrop (the page stays visible through the gap, so it dims like any\n * floating layer). Still a card: border, elevation, rounded corners; the\n * scale gesture stays but shrinks to 98% — at this size 95% reads like a jump.\n */\nfunction InsetPopup({\n className,\n ...props\n}: StyledProps<typeof BaseDialog.Popup>) {\n return (\n <BaseDialog.Popup\n className={cn(\n \"border-pho-secondary bg-pho-primary shadow-pho-xl fixed inset-4 z-50 flex flex-col overflow-hidden rounded-lg border outline-none sm:inset-8\",\n \"transition-[opacity,scale] duration-200 ease-out\",\n \"data-[starting-style]:scale-[0.98] data-[starting-style]:opacity-0\",\n \"data-[ending-style]:scale-[0.98] data-[ending-style]:opacity-0 data-[ending-style]:duration-150\",\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface InsetContentProps extends Omit<\n StyledProps<typeof BaseDialog.Popup>,\n \"title\"\n> {\n /** Decorative icon above the title — same treatment as `Content`. */\n icon?: ReactNode;\n /** Heading rendered in the panel header. */\n title?: ReactNode;\n /** Supporting text under the title. */\n description?: ReactNode;\n /**\n * Bottom action row. Iron rule as `Content`: when `actions` is set, the\n * header close button is never shown — dismiss via the actions.\n */\n actions?: ReactNode;\n /**\n * Header close control. Only applies when `actions` is absent.\n * @default true\n */\n showClose?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Convenience near-fullscreen panel: header pinned on top, body filling and\n * scrolling on its own, optional action row pinned at the bottom. Sits\n * between `Content` (a focused card) and `FullscreenContent` (a page\n * takeover): use it for roomy working surfaces — pickers, editors, previews —\n * that still want the page peeking through an edge.\n */\nfunction InsetContent({\n icon,\n title,\n description,\n actions,\n showClose = true,\n children,\n className,\n ...props\n}: InsetContentProps) {\n // Iron rule: action dialogs dismiss via their actions — never a header X.\n const showCloseButton = actions == null && showClose;\n const hasHeader = Boolean(icon || title || description || showCloseButton);\n\n return (\n <Portal>\n <Backdrop />\n <InsetPopup className={className} {...props}>\n {hasHeader && (\n <div className=\"flex shrink-0 flex-col gap-2 px-6 pt-6\">\n {icon && <DialogHeaderIcon>{icon}</DialogHeaderIcon>}\n {(title || showCloseButton) && (\n <div className=\"relative\">\n {title ? (\n <Title className={showCloseButton ? \"pr-12\" : undefined}>\n {title}\n </Title>\n ) : (\n <div className=\"h-[1.625rem]\" aria-hidden=\"true\" />\n )}\n {showCloseButton && (\n <Close\n render={\n <CloseButton className=\"absolute top-1/2 right-0 z-10 -translate-y-1/2\" />\n }\n />\n )}\n </div>\n )}\n {description && <Description>{description}</Description>}\n </div>\n )}\n <ScrollArea.Root className=\"min-h-0 flex-1\">\n <ScrollArea.Viewport>\n <ScrollArea.Content className=\"px-6 py-5\">\n {children}\n </ScrollArea.Content>\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Root>\n {actions != null && (\n <div className=\"flex shrink-0 items-center justify-end gap-2 px-6 pb-5\">\n {actions}\n </div>\n )}\n </InsetPopup>\n </Portal>\n );\n}\n\n/* ========================= Dialog.FullscreenContent ======================== */\n\n/**\n * Full-viewport popup — a page-surface takeover instead of a floating card.\n * No backdrop: the popup itself is the layer. Fade only; scale is a floating-\n * card gesture and reads wrong at viewport size.\n */\nfunction FullscreenPopup({\n className,\n ...props\n}: StyledProps<typeof BaseDialog.Popup>) {\n return (\n <BaseDialog.Popup\n className={cn(\n \"bg-pho-page fixed inset-0 z-50 overflow-y-auto outline-none\",\n \"transition-opacity duration-200 ease-out\",\n \"data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface FullscreenContentProps extends Omit<\n StyledProps<typeof BaseDialog.Popup>,\n \"title\"\n> {\n /**\n * Decorative icon above the title — same chrome as `Content`, but 48px\n * (`size-12`) for viewport-scale gates.\n */\n icon?: ReactNode;\n /** Heading of the takeover. */\n title?: ReactNode;\n /** Supporting text under the title. */\n description?: ReactNode;\n /**\n * Action row under the body. Iron rule as `Content`: when `actions` is set,\n * the corner close button is never shown — dismiss via the actions.\n */\n actions?: ReactNode;\n /**\n * Corner close control. Only applies when `actions` is absent.\n * @default true\n */\n showClose?: boolean;\n /**\n * Classes on the viewport-centering frame (the `min-h-full` flex host).\n * Use to drop the default optical `pb-20` when the stack grows (e.g. a\n * captcha) so true center stays put: `frameClassName=\"pb-6\"`.\n */\n frameClassName?: string;\n children?: ReactNode;\n}\n\n/**\n * Convenience full-screen panel: the whole viewport becomes the dialog, with\n * a centered column at the standalone-flow width (28rem — the same measure as\n * onboarding / invite cards). Column height follows its content through\n * `AnimatedHeight` (same spring as the Card shell), so step swaps — phone →\n * OTP → captcha — glide instead of jumping. Use for gates the visitor must\n * deal with before the page behind makes sense (e.g. binding a phone number);\n * prefer `Content` for everything conversational.\n */\nfunction FullscreenContent({\n icon,\n title,\n description,\n actions,\n showClose = true,\n frameClassName,\n children,\n className,\n ...props\n}: FullscreenContentProps) {\n // Iron rule: action dialogs dismiss via their actions — never a corner X.\n const showCloseButton = actions == null && showClose;\n\n return (\n <Portal>\n <FullscreenPopup className={className} {...props}>\n {showCloseButton && (\n <Close\n render={<CloseButton className=\"fixed top-4 right-4 z-10\" />}\n />\n )}\n {/* Default `pb-20` optically lifts the column above true center. */}\n <div\n className={cn(\n \"flex min-h-full items-center justify-center px-6 pt-6 pb-20\",\n frameClassName,\n )}\n >\n {/* Width stays on the outer host; AnimatedHeight measures the\n header + body stack and springs its own height on content\n changes. The action row sits below it, outside the clip: while\n the body grows the container is shorter than its content for a\n few frames, and a row inside it would be cut off at the bottom\n (a pressed \"Send code\" turning grey right as a captcha mounts).\n Outside, the row rides the spring instead. */}\n <div className=\"w-full max-w-md\">\n <AnimatedHeight className=\"flex flex-col gap-5\">\n {(icon || title || description) && (\n <div className=\"flex flex-col gap-2\">\n {icon && (\n <DialogHeaderIcon size=\"lg\">{icon}</DialogHeaderIcon>\n )}\n {title && <Title>{title}</Title>}\n {description && <Description>{description}</Description>}\n </div>\n )}\n {children}\n </AnimatedHeight>\n {actions != null && (\n <div className=\"mt-5 flex items-center justify-end gap-2\">\n {actions}\n </div>\n )}\n </div>\n </div>\n </FullscreenPopup>\n </Portal>\n );\n}\n\n/**\n * Modal dialog built on Base UI `Dialog`. Controlled or uncontrolled via\n * `Dialog.Root` (`open` / `onOpenChange` / `defaultOpen`). `Dialog.Action`\n * adds native promise support: an async confirm keeps the dialog open and\n * undismissable until the work resolves.\n */\nexport const Dialog = {\n Root,\n Trigger,\n Portal,\n Backdrop,\n Popup,\n InsetPopup,\n FullscreenPopup,\n Title,\n Description,\n Close,\n Action,\n Content,\n InsetContent,\n FullscreenContent,\n};\n"],"mappings":";;;;;;;;;AA6CA,IAAM,IAAuB,EAC3B,IACF;AAOA,SAAgB,KAA4B;AAC1C,SAAO,EAAW,CAAoB,GAAG,WAAW;AACtD;AAUA,SAAS,EAAK,EAAE,cAAA,GAAc,YAAA,GAAY,GAAG,EAAA,GAAoB;AAC/D,QAAM,CAAC,GAAS,CAAA,IAAc,EAAS,EAAK,GAGtC,IAAa,EAAO,EAAK,GACzB,IAAqB,EAA2B,IAAI;AAG1D,EAAA,EAAA,MAAgB;AACd,QAAK;AACL,aAAA,EAAW,UAAU,EAAmB,SACxC,MAAa;AACX,QAAA,EAAW,UAAU;AAAA,MACvB;AAAA,EACF,GAAG,CAAC,CAAU,CAAC;AAEf,QAAM,IAAmB,EAAA,CACtB,GAAM,MAAiB;AACtB,QAAI,CAAC,KAAQ,EAAW,SAAS;AAC/B,MAAA,EAAa,OAAO;AACpB;AAAA,IACF;AACA,IAAA,IAAe,GAAM,CAAY;AAAA,EACnC,GACA,CAAC,CAAY,CACf,GAEM,IAAe,EAAA,OACZ;AAAA,IACL,SAAA;AAAA,IACA,cAAA,MAAoB;AAClB,MAAA,EAAW,UAAU,IACrB,EAAW,EAAI;AAAA,IACjB;AAAA,IACA,YAAA,MAAkB;AAChB,MAAA,EAAW,UAAU,IACrB,EAAW,EAAK;AAAA,IAClB;AAAA,IACA,OAAA,MAAa,EAAmB,SAAS,MAAM;AAAA,EACjD,IACA,CAAC,CAAO,CACV;AAEA,SACE,gBAAA,EAAC,EAAqB,UAAtB;AAAA,IAA+B,OAAO;AAAA,IACpC,UAAA,gBAAA,EAAC,EAAW,MAAZ;AAAA,MACE,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,GAAI;AAAA,IACL,CAAA;AAAA,EAC4B,CAAA;AAEnC;AAEA,IAAM,IAAU,EAAW,SACrB,IAAS,EAAW,QACpB,IAAQ,EAAW;AAiBzB,SAAS,EAAW,GAA2C;AAC7D,SACE,KAAS,QAAQ,OAAQ,EAA6B,QAAS;AAEnE;AAOA,SAAS,EAAO,EAAE,SAAA,GAAS,SAAA,GAAS,UAAA,GAAU,GAAG,EAAA,GAA4B;AAC3E,QAAM,IAAiB,EAAW,CAAoB,GAChD,CAAC,GAAM,CAAA,IAAW,EAAS,EAAK,GAChC,IAAa,EAAO,EAAI;AAE9B,EAAA,EAAA,OACE,EAAW,UAAU,IACrB,MAAa;AACX,IAAA,EAAW,UAAU;AAAA,EACvB,IACC,CAAC,CAAC;AAEL,WAAS,EAAY,GAA2C;AAC9D,QAAI,KAAQ,EAAS;AACrB,UAAM,IAAS,IAAU,CAAK;AAC9B,QAAI,CAAC,EAAW,CAAM,GAAG;AACvB,MAAA,GAAgB,MAAM;AACtB;AAAA,IACF;AACA,IAAA,EAAQ,EAAI,GACZ,GAAgB,aAAa,GAC7B,EAAO,KAAA,MACC;AACJ,MAAA,GAAgB,WAAW,GACvB,EAAW,WAAS,EAAQ,EAAK,GACrC,GAAgB,MAAM;AAAA,IACxB,GAAA,CACC,MAAmB;AAClB,MAAA,GAAgB,WAAW,GACvB,EAAW,WAAS,EAAQ,EAAK,GAEnC,OAAO,UAAY,OAAA,QAAA,IAAA,aACO,gBAE1B,QAAQ,MAAM,2CAA2C,CAAK;AAAA,IAElE,CACF;AAAA,EACF;AAEA,QAAM,IAAQ,KAAQ;AACtB,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,GAAI;AAAA,IACJ,UAAU,KAAY;AAAA,IACtB,SAAS;AAAA,IACT,SAAS;AAAA,EACV,CAAA;AAEL;AAEA,SAAS,EAAS,EAChB,WAAA,GACA,GAAG,EAAA,GACuC;AAC1C,SACE,gBAAA,EAAC,EAAW,UAAZ;AAAA,IACE,WAAW,EACT,8EACA,kGACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAA+C;AAC5E,SACE,gBAAA,EAAC,EAAW,OAAZ;AAAA,IACE,WAAW,EAET,+LAIA,wEAEA,oDACA,kEACA,+FACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,WAAA,GAAW,GAAG,EAAA,GAA+C;AAC5E,SACE,gBAAA,EAAC,EAAW,OAAZ;AAAA,IACE,WAAW,EACT,0EACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAEA,SAAS,EAAY,EACnB,WAAA,GACA,GAAG,EAAA,GAC0C;AAC7C,SACE,gBAAA,EAAC,EAAW,aAAZ;AAAA,IACE,WAAW,EACT,oDACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAOA,SAAS,EAAiB,EACxB,UAAA,GACA,MAAA,IAAO,KAAA,GAIN;AACD,SACE,gBAAA,EAAC,QAAD;AAAA,IACE,eAAA;AAAA,IACA,WAAW,EACT,2BACA,MAAS,OAAO,oBAAoB,gBACtC;AAAA,IAEC,UAAA;AAAA,EACG,CAAA;AAEV;AAkDA,SAAS,EAAQ,EACf,MAAA,GACA,OAAA,GACA,aAAA,GACA,cAAA,GACA,SAAA,GACA,SAAA,GACA,WAAA,IAAY,IACZ,UAAA,GACA,WAAA,GACA,GAAG,EAAA,GACY;AAEf,QAAM,IAAkB,KAAW,QAAQ,GACrC,IAAY,GAAQ,KAAQ,KAAS,KAAe,IACpD,IAAkB,KAAgB,QAAQ,EAAa,SAAS,GAEhE,IAAgB,KAAmB,KAAW,QAAQ,KAAY;AAExE,SACE,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD,CAAW,CAAA,GACX,gBAAA,EAAC,GAAD;AAAA,IAAkB,WAAA;AAAA,IAAW,GAAI;AAAA,IAAjC,UAAA;AAAA,MACG,KACC,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA;AAAA,UACG,KAAQ,gBAAA,EAAC,GAAD,EAAA,UAAmB,EAAuB,CAAA;AAAA,WACjD,KAAS,MAGT,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA,CACG,IACC,gBAAA,EAAC,GAAD;AAAA,cAAO,WAAW,IAAkB,UAAU;AAAA,cAC3C,UAAA;AAAA,YACI,CAAA,IAEP,gBAAA,EAAC,OAAD;AAAA,cAAK,WAAU;AAAA,cAAe,eAAY;AAAA,YAAQ,CAAA,GAEnD,KACC,gBAAA,EAAC,GAAD,EACE,QACE,gBAAA,EAAC,GAAD,EAAa,WAAU,iDAAkD,CAAA,EAE5E,CAAA,CAEA;AAAA;UAEN,KAAe,gBAAA,EAAC,GAAD,EAAA,UAAc,EAAyB,CAAA;AAAA,QACpD;AAAA;MAEN,KACC,gBAAA,EAAC,EAAW,MAAZ;AAAA,QAAiB,WAAU;AAAA,QAA3B,UAAA,CACE,gBAAA,EAAC,EAAW,UAAZ,EAAA,UACE,gBAAA,EAAC,EAAW,SAAZ;AAAA,UAAoB,WAAU;AAAA,UAA9B,UAAA;AAAA,YACG,KACC,gBAAA,EAAC,MAAD;AAAA,cAAI,WAAU;AAAA,cACX,UAAA,EAAa,IAAA,CAAK,GAAM,MAGvB,gBAAA,EAAC,MAAD;AAAA,gBAEE,WAAU;AAAA,gBAET,UAAA;AAAA,cACC,GAJG,CAIH,CACL;AAAA,YACC,CAAA;AAAA,YAEL,KAAW,QACV,gBAAA,EAAC,KAAD;AAAA,cAAG,WAAU;AAAA,cACV,UAAA;AAAA,YACA,CAAA;AAAA,YAEJ;AAAA,UACiB;AAAA,QACD,CAAA,EAAA,CAAA,GACrB,gBAAA,EAAC,EAAW,WAAZ,EAAA,UACE,gBAAA,EAAC,EAAW,OAAZ,CAAmB,CAAA,EACC,CAAA,CACP;AAAA;MAElB,KAAW,QACV,gBAAA,EAAC,OAAD;AAAA,QACE,WAAW,EACT,0DACA,CAAC,KAAiB,MACpB;AAAA,QAEC,UAAA;AAAA,MACE,CAAA;AAAA,IAEF;AAAA,EACD,CAAA,CAAA,EAAA,CAAA;AAEZ;AAUA,SAAS,EAAW,EAClB,WAAA,GACA,GAAG,EAAA,GACoC;AACvC,SACE,gBAAA,EAAC,EAAW,OAAZ;AAAA,IACE,WAAW,EACT,gJACA,oDACA,sEACA,mGACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AAgCA,SAAS,EAAa,EACpB,MAAA,GACA,OAAA,GACA,aAAA,GACA,SAAA,GACA,WAAA,IAAY,IACZ,UAAA,GACA,WAAA,GACA,GAAG,EAAA,GACiB;AAEpB,QAAM,IAAkB,KAAW,QAAQ;AAG3C,SACE,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD,CAAW,CAAA,GACX,gBAAA,EAAC,GAAD;AAAA,IAAuB,WAAA;AAAA,IAAW,GAAI;AAAA,IAAtC,UAAA;AAAA,MALc,GAAQ,KAAQ,KAAS,KAAe,MAOlD,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA;AAAA,UACG,KAAQ,gBAAA,EAAC,GAAD,EAAA,UAAmB,EAAuB,CAAA;AAAA,WACjD,KAAS,MACT,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA,CACG,IACC,gBAAA,EAAC,GAAD;AAAA,cAAO,WAAW,IAAkB,UAAU;AAAA,cAC3C,UAAA;AAAA,YACI,CAAA,IAEP,gBAAA,EAAC,OAAD;AAAA,cAAK,WAAU;AAAA,cAAe,eAAY;AAAA,YAAQ,CAAA,GAEnD,KACC,gBAAA,EAAC,GAAD,EACE,QACE,gBAAA,EAAC,GAAD,EAAa,WAAU,iDAAkD,CAAA,EAE5E,CAAA,CAEA;AAAA;UAEN,KAAe,gBAAA,EAAC,GAAD,EAAA,UAAc,EAAyB,CAAA;AAAA,QACpD;AAAA;MAEP,gBAAA,EAAC,EAAW,MAAZ;AAAA,QAAiB,WAAU;AAAA,QAA3B,UAAA,CACE,gBAAA,EAAC,EAAW,UAAZ,EAAA,UACE,gBAAA,EAAC,EAAW,SAAZ;AAAA,UAAoB,WAAU;AAAA,UAC3B,UAAA;AAAA,QACiB,CAAA,EACD,CAAA,GACrB,gBAAA,EAAC,EAAW,WAAZ,EAAA,UACE,gBAAA,EAAC,EAAW,OAAZ,CAAmB,CAAA,EACC,CAAA,CACP;AAAA;MAChB,KAAW,QACV,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QACZ,UAAA;AAAA,MACE,CAAA;AAAA,IAEG;AAAA,EACN,CAAA,CAAA,EAAA,CAAA;AAEZ;AASA,SAAS,EAAgB,EACvB,WAAA,GACA,GAAG,EAAA,GACoC;AACvC,SACE,gBAAA,EAAC,EAAW,OAAZ;AAAA,IACE,WAAW,EACT,+DACA,4CACA,kGACA,CACF;AAAA,IACA,GAAI;AAAA,EACL,CAAA;AAEL;AA2CA,SAAS,EAAkB,EACzB,MAAA,GACA,OAAA,GACA,aAAA,GACA,SAAA,GACA,WAAA,IAAY,IACZ,gBAAA,GACA,UAAA,GACA,WAAA,GACA,GAAG,EAAA,GACsB;AAEzB,QAAM,IAAkB,KAAW,QAAQ;AAE3C,SACE,gBAAA,EAAC,GAAD,EAAA,UACE,gBAAA,EAAC,GAAD;AAAA,IAA4B,WAAA;AAAA,IAAW,GAAI;AAAA,IAA3C,UAAA,CACG,KACC,gBAAA,EAAC,GAAD,EACE,QAAQ,gBAAA,EAAC,GAAD,EAAa,WAAU,2BAA4B,CAAA,EAC5D,CAAA,GAGH,gBAAA,EAAC,OAAD;AAAA,MACE,WAAW,EACT,+DACA,CACF;AAAA,MASA,UAAA,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,UAAgB,WAAU;AAAA,UAA1B,UAAA,EACI,KAAQ,KAAS,MACjB,gBAAA,EAAC,OAAD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAA;AAAA,cACG,KACC,gBAAA,EAAC,GAAD;AAAA,gBAAkB,MAAK;AAAA,gBAAM,UAAA;AAAA,cAAuB,CAAA;AAAA,cAErD,KAAS,gBAAA,EAAC,GAAD,EAAA,UAAQ,EAAa,CAAA;AAAA,cAC9B,KAAe,gBAAA,EAAC,GAAD,EAAA,UAAc,EAAyB,CAAA;AAAA,YACpD;AAAA,UAEN,CAAA,GAAA,CACa;AAAA,QACf,CAAA,GAAA,KAAW,QACV,gBAAA,EAAC,OAAD;AAAA,UAAK,WAAU;AAAA,UACZ,UAAA;AAAA,QACE,CAAA,CAEJ;AAAA;IACF,CAAA,CACU;AAAA,EACX,CAAA,EAAA,CAAA;AAEZ;AAQA,IAAa,KAAS;AAAA,EACpB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AACF"}