@joanroucoux/cairn-ui 0.8.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +99 -0
- package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs +57 -53
- package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-alert.mjs +155 -47
- package/fesm2022/joanroucoux-cairn-ui-alert.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-amount.mjs +220 -110
- package/fesm2022/joanroucoux-cairn-ui-amount.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-async.mjs +392 -216
- package/fesm2022/joanroucoux-cairn-ui-async.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-avatar.mjs +145 -68
- package/fesm2022/joanroucoux-cairn-ui-avatar.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-back-link.mjs +87 -47
- package/fesm2022/joanroucoux-cairn-ui-back-link.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-badge.mjs +83 -43
- package/fesm2022/joanroucoux-cairn-ui-badge.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-button.mjs +184 -104
- package/fesm2022/joanroucoux-cairn-ui-button.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-card.mjs +232 -137
- package/fesm2022/joanroucoux-cairn-ui-card.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs +298 -102
- package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-control.mjs +4 -17
- package/fesm2022/joanroucoux-cairn-ui-control.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-delta.mjs +150 -83
- package/fesm2022/joanroucoux-cairn-ui-delta.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-dialog.mjs +508 -471
- package/fesm2022/joanroucoux-cairn-ui-dialog.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-donut.mjs +255 -157
- package/fesm2022/joanroucoux-cairn-ui-donut.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-drawer.mjs +303 -0
- package/fesm2022/joanroucoux-cairn-ui-drawer.mjs.map +1 -0
- package/fesm2022/joanroucoux-cairn-ui-empty.mjs +76 -35
- package/fesm2022/joanroucoux-cairn-ui-empty.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-external-link.mjs +40 -31
- package/fesm2022/joanroucoux-cairn-ui-external-link.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-fact.mjs +188 -79
- package/fesm2022/joanroucoux-cairn-ui-fact.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-field.mjs +309 -173
- package/fesm2022/joanroucoux-cairn-ui-field.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs +165 -87
- package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-group-header.mjs +269 -0
- package/fesm2022/joanroucoux-cairn-ui-group-header.mjs.map +1 -0
- package/fesm2022/joanroucoux-cairn-ui-input.mjs +205 -85
- package/fesm2022/joanroucoux-cairn-ui-input.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs +838 -512
- package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-menu.mjs +401 -225
- package/fesm2022/joanroucoux-cairn-ui-menu.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-meter.mjs +143 -57
- package/fesm2022/joanroucoux-cairn-ui-meter.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-motion.mjs +367 -399
- package/fesm2022/joanroucoux-cairn-ui-motion.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs +73 -44
- package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-result-group.mjs +191 -0
- package/fesm2022/joanroucoux-cairn-ui-result-group.mjs.map +1 -0
- package/fesm2022/joanroucoux-cairn-ui-row.mjs +376 -146
- package/fesm2022/joanroucoux-cairn-ui-row.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-segmented.mjs +183 -81
- package/fesm2022/joanroucoux-cairn-ui-segmented.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-select-pill.mjs +233 -0
- package/fesm2022/joanroucoux-cairn-ui-select-pill.mjs.map +1 -0
- package/fesm2022/joanroucoux-cairn-ui-select.mjs +121 -67
- package/fesm2022/joanroucoux-cairn-ui-select.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs +129 -51
- package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs +80 -39
- package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-stat.mjs +85 -55
- package/fesm2022/joanroucoux-cairn-ui-stat.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-switch.mjs +48 -35
- package/fesm2022/joanroucoux-cairn-ui-switch.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs +113 -69
- package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-table.mjs +1036 -310
- package/fesm2022/joanroucoux-cairn-ui-table.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui-toast.mjs +240 -127
- package/fesm2022/joanroucoux-cairn-ui-toast.mjs.map +1 -1
- package/fesm2022/joanroucoux-cairn-ui.mjs +0 -4
- package/package.json +17 -1
- package/styles/motion.css +1 -13
- package/styles/tokens.css +35 -64
- package/types/joanroucoux-cairn-ui-action-bar.d.ts +9 -14
- package/types/joanroucoux-cairn-ui-alert.d.ts +29 -15
- package/types/joanroucoux-cairn-ui-amount.d.ts +64 -32
- package/types/joanroucoux-cairn-ui-async.d.ts +85 -38
- package/types/joanroucoux-cairn-ui-avatar.d.ts +34 -22
- package/types/joanroucoux-cairn-ui-back-link.d.ts +20 -15
- package/types/joanroucoux-cairn-ui-badge.d.ts +22 -14
- package/types/joanroucoux-cairn-ui-button.d.ts +36 -18
- package/types/joanroucoux-cairn-ui-card.d.ts +48 -23
- package/types/joanroucoux-cairn-ui-choice-chips.d.ts +91 -35
- package/types/joanroucoux-cairn-ui-control.d.ts +9 -18
- package/types/joanroucoux-cairn-ui-delta.d.ts +46 -24
- package/types/joanroucoux-cairn-ui-dialog.d.ts +124 -57
- package/types/joanroucoux-cairn-ui-donut.d.ts +83 -46
- package/types/joanroucoux-cairn-ui-drawer.d.ts +73 -0
- package/types/joanroucoux-cairn-ui-empty.d.ts +20 -13
- package/types/joanroucoux-cairn-ui-external-link.d.ts +6 -10
- package/types/joanroucoux-cairn-ui-fact.d.ts +49 -25
- package/types/joanroucoux-cairn-ui-field.d.ts +72 -49
- package/types/joanroucoux-cairn-ui-filter-chips.d.ts +35 -20
- package/types/joanroucoux-cairn-ui-group-header.d.ts +58 -0
- package/types/joanroucoux-cairn-ui-input.d.ts +59 -37
- package/types/joanroucoux-cairn-ui-line-chart.d.ts +199 -89
- package/types/joanroucoux-cairn-ui-menu.d.ts +81 -44
- package/types/joanroucoux-cairn-ui-meter.d.ts +44 -22
- package/types/joanroucoux-cairn-ui-motion.d.ts +61 -75
- package/types/joanroucoux-cairn-ui-nav-item.d.ts +15 -13
- package/types/joanroucoux-cairn-ui-result-group.d.ts +52 -0
- package/types/joanroucoux-cairn-ui-row.d.ts +79 -37
- package/types/joanroucoux-cairn-ui-segmented.d.ts +51 -27
- package/types/joanroucoux-cairn-ui-select-pill.d.ts +52 -0
- package/types/joanroucoux-cairn-ui-select.d.ts +28 -18
- package/types/joanroucoux-cairn-ui-skeleton.d.ts +35 -18
- package/types/joanroucoux-cairn-ui-stale-link.d.ts +23 -16
- package/types/joanroucoux-cairn-ui-stat.d.ts +26 -21
- package/types/joanroucoux-cairn-ui-switch.d.ts +7 -11
- package/types/joanroucoux-cairn-ui-tab-bar.d.ts +20 -17
- package/types/joanroucoux-cairn-ui-table.d.ts +251 -89
- package/types/joanroucoux-cairn-ui-toast.d.ts +46 -36
- package/types/joanroucoux-cairn-ui.d.ts +1 -2
- package/fesm2022/joanroucoux-cairn-ui.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"joanroucoux-cairn-ui-line-chart.mjs","sources":["../../../projects/ui/line-chart/internal/chart-axis.ts","../../../projects/ui/line-chart/internal/chart-interaction.ts","../../../projects/ui/line-chart/internal/chart-layout.ts","../../../projects/ui/line-chart/internal/chart-scale.ts","../../../projects/ui/line-chart/internal/observe-size.ts","../../../projects/ui/line-chart/internal/start-label.ts","../../../projects/ui/line-chart/internal/transition.ts","../../../projects/ui/line-chart/internal/viewport.ts","../../../projects/ui/line-chart/line-chart.ts","../../../projects/ui/line-chart/joanroucoux-cairn-ui-line-chart.ts"],"sourcesContent":["import type { PlottedPoint } from './chart-scale';\n\nexport const axisTicks = <T extends PlottedPoint>(points: readonly T[], maxTicks = 5): T[] => {\n if (points.length <= maxTicks) {\n return [...points];\n }\n\n const count = Math.max(3, Math.min(maxTicks, points.length));\n const step = (points.length - 1) / (count - 1);\n\n const indexes = new Set<number>();\n\n for (let tick = 0; tick < count; tick++) {\n indexes.add(Math.round(tick * step));\n }\n\n return [...indexes].sort((a, b) => a - b).map((index) => points[index] as T);\n};\n\nexport const isCoreTick = (index: number, count: number): boolean => {\n if (count <= 3) {\n return true;\n }\n\n const middle = Math.floor((count - 1) / 2);\n\n return index === 0 || index === count - 1 || index === middle;\n};\n\nexport type TickLabel = { text: string; classes: string };\n\nconst firstOfEachRun = (labels: readonly string[], included: (index: number) => boolean): boolean[] => {\n let previous: string | null = null;\n\n return labels.map((text, index) => {\n if (!included(index)) {\n return false;\n }\n\n const distinct = text !== previous;\n\n previous = text;\n\n return distinct;\n });\n};\n\nexport const tickLabels = (\n ticks: readonly { t: number }[],\n format: (time: number) => string,\n mode: 3 | 5 | 'auto',\n): (TickLabel | null)[] => {\n const labels = ticks.map((tick) => format(tick.t));\n const count = labels.length;\n const core = (index: number): boolean => isCoreTick(index, count);\n const everyTick = firstOfEachRun(labels, () => true);\n const coreTicks = firstOfEachRun(labels, core);\n\n return labels.map((text, index) => {\n const wide = mode === 3 ? coreTicks[index]! : everyTick[index]!;\n const narrow = coreTicks[index]!;\n\n if (!wide && !narrow) {\n return null;\n }\n\n const classes =\n mode === 'auto' ? `${narrow ? '' : 'max-sm:hidden'} ${wide ? '' : 'sm:hidden'}`.trim() : wide ? '' : 'hidden';\n\n return { text, classes };\n });\n};\n","import type { PlottedPoint } from './chart-scale';\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(Math.max(value, min), max);\n\nexport const nearestPointIndex = (points: readonly PlottedPoint[], x: number): number => {\n let nearest = 0;\n let nearestDistance = Infinity;\n\n points.forEach((point, index) => {\n const distance = Math.abs(point.x - x);\n\n if (distance < nearestDistance) {\n nearestDistance = distance;\n nearest = index;\n }\n });\n\n return nearest;\n};\n\nexport type KeyNavigation = { index: number | null; preventDefault: boolean };\n\nexport const navigateIndex = (key: string, current: number | null, last: number): KeyNavigation | null => {\n switch (key) {\n case 'ArrowRight':\n return { index: clamp((current ?? -1) + 1, 0, last), preventDefault: true };\n case 'ArrowLeft':\n return { index: clamp((current ?? last + 1) - 1, 0, last), preventDefault: true };\n case 'Home':\n return { index: 0, preventDefault: true };\n case 'End':\n return { index: last, preventDefault: true };\n case 'Escape':\n return { index: null, preventDefault: false };\n default:\n return null;\n }\n};\n","export const START_LABEL_HEIGHT = 16;\n\nconst AXIS_ROW = 17;\n\nexport const TOOLTIP_SIZES = ['compact', 'large'] as const;\nexport type TooltipSize = (typeof TOOLTIP_SIZES)[number];\n\nexport const TOOLTIP_CLASSES: Record<TooltipSize, { box: string; value: string; delta: string }> = {\n compact: { box: '-top-3 px-2.5', value: 'text-label', delta: 'text-caption' },\n large: { box: 'top-0 px-3', value: 'text-body', delta: 'text-label' },\n};\n\nconst PLOT_PADDING_RATIO = 16 / 240;\nconst SPARKLINE_PADDING = 4;\nconst START_LABEL_BASELINE_OFFSET = 4;\nconst TOOLTIP_OFFSET = 14;\nconst TOOLTIP_FLIP_RATIO = 0.55;\n\nexport const plotHeightFor = (height: number, sparkline: boolean, axisGap: number | 'auto', wide: boolean): number =>\n sparkline ? height : Math.max(height - resolveGap(axisGap, wide) - AXIS_ROW, 1);\n\nexport const plotPaddingFor = (plotHeight: number, sparkline: boolean): number =>\n sparkline ? SPARKLINE_PADDING : plotHeight * PLOT_PADDING_RATIO;\n\nexport const startLabelBaseline = (boxBottom: number): number => boxBottom - START_LABEL_BASELINE_OFFSET;\n\nexport const tooltipPlacement = (ratio: number): string => {\n const flipped = ratio > TOOLTIP_FLIP_RATIO;\n\n return `left: calc(${ratio * 100}% ${flipped ? '-' : '+'} ${TOOLTIP_OFFSET}px); transform: ${flipped ? 'translateX(-100%)' : 'none'}`;\n};\n\nexport const deltaTone = (delta: number): string =>\n delta > 0 ? 'text-(--positive)' : delta < 0 ? 'text-(--negative)' : 'text-(--muted-foreground)';\n\nexport const DEFAULT_WIDTH = 640;\nexport const DEFAULT_HEIGHT = 240;\n\nexport const identityValue = (value: number): string => `${value}`;\nexport const identityDelta = (delta: number): string => `${delta > 0 ? '+' : ''}${delta}`;\nexport const identityTime = (time: number): string => new Date(time).toISOString();\n\nexport type AxisTicks = 3 | 5 | 'auto';\n\nexport const parseAxisTicks = (value: AxisTicks | string): AxisTicks =>\n value === 'auto' ? 'auto' : (Number(value) as 3 | 5);\n\nconst resolveGap = (gap: number | 'auto', wide: boolean): number => (gap === 'auto' ? (wide ? 16 : 12) : gap);\n\nconst resolveTooltip = (size: TooltipSize | 'auto', wide: boolean): TooltipSize =>\n size === 'auto' ? (wide ? 'large' : 'compact') : size;\n\nexport const tooltipClassesFor = (size: TooltipSize | 'auto', wide: boolean): (typeof TOOLTIP_CLASSES)[TooltipSize] =>\n TOOLTIP_CLASSES[resolveTooltip(size, wide)];\n","import { scaleLinear } from 'd3-scale';\nimport { curveMonotoneX, line } from 'd3-shape';\n\nexport type ChartPoint = {\n t: number;\n v: number;\n};\n\nexport type PlottedPoint = ChartPoint & { x: number; y: number };\n\nexport type ChartGeometry = {\n line: string;\n end: { x: number; y: number };\n start: { y: number };\n points: PlottedPoint[];\n plotBottom: number;\n plotTop: number;\n};\n\nexport type GeometryPadding = { x?: number; top?: number; bottom?: number };\n\nexport const CURVE = curveMonotoneX;\n\nexport const buildGeometry = (\n points: ChartPoint[],\n width: number,\n height: number,\n padding: GeometryPadding = {},\n): ChartGeometry | null => {\n if (points.length === 0) {\n return null;\n }\n\n const { x: paddingX = 4, top: paddingTop = 4, bottom: paddingBottom = 4 } = padding;\n const plotTop = paddingTop;\n const plotBottom = height - paddingBottom;\n\n const times = points.map((point) => point.t);\n const values = points.map((point) => point.v);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n\n const x = scaleLinear()\n .domain([Math.min(...times), Math.max(...times)])\n .range([paddingX, width - paddingX]);\n\n const y =\n minValue === maxValue\n ? () => (plotTop + plotBottom) / 2\n : scaleLinear().domain([minValue, maxValue]).range([plotBottom, plotTop]);\n\n const toX = (point: ChartPoint): number => (points.length === 1 ? paddingX : x(point.t));\n\n const lineGenerator = line<ChartPoint>()\n .x(toX)\n .y((point) => y(point.v))\n .curve(CURVE);\n\n const first = points[0] as ChartPoint;\n const last = points.at(-1) as ChartPoint;\n\n return {\n line: lineGenerator(points) as string,\n end: { x: toX(last), y: y(last.v) },\n start: { y: y(first.v) },\n points: points.map((point) => ({ ...point, x: toX(point), y: y(point.v) })),\n plotBottom,\n plotTop,\n };\n};\n","import type { DestroyRef } from '@angular/core';\n\nexport type Size = { width: number; height: number };\n\nexport const observeSize = (element: Element, destroyRef: DestroyRef, measured: (size: Size) => void): void => {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n const { clientWidth: width, clientHeight: height } = element;\n\n if (width > 0 && height > 0) {\n measured({ width, height });\n }\n\n const observer = new ResizeObserver(([entry]) => {\n if (entry) {\n measured({ width: entry.contentRect.width, height: entry.contentRect.height });\n }\n });\n\n observer.observe(element);\n destroyRef.onDestroy(() => observer.disconnect());\n};\n","import type { PlottedPoint } from './chart-scale';\n\nexport type StartLabelBox = { width: number; height: number };\nexport type StartLabelSize = { width: number; height: number };\nexport type StartLabelPlacement = { x: number; y: number; anchor: 'start' | 'end' };\n\nconst LINE_GAP = 6;\nconst COLLISION_MARGIN = 6;\nconst EDGE_TOLERANCE = 3;\n\ntype Slot = { anchor: 'start' | 'end'; x: number; y: number; top: number; bottom: number };\n\nconst candidateSlots = (startY: number, box: StartLabelBox, label: StartLabelSize): Slot[] => {\n const aboveTop = startY - LINE_GAP - label.height;\n const aboveBottom = startY - LINE_GAP;\n const belowTop = startY + LINE_GAP;\n const belowBottom = startY + LINE_GAP + label.height;\n\n const slots: Slot[] = [\n { anchor: 'end', x: box.width, y: aboveBottom, top: aboveTop, bottom: aboveBottom },\n { anchor: 'end', x: box.width, y: belowBottom, top: belowTop, bottom: belowBottom },\n { anchor: 'start', x: 0, y: aboveBottom, top: aboveTop, bottom: aboveBottom },\n { anchor: 'start', x: 0, y: belowBottom, top: belowTop, bottom: belowBottom },\n { anchor: 'end', x: box.width, y: label.height, top: 0, bottom: label.height },\n { anchor: 'start', x: 0, y: label.height, top: 0, bottom: label.height },\n { anchor: 'end', x: box.width, y: box.height, top: box.height - label.height, bottom: box.height },\n { anchor: 'start', x: 0, y: box.height, top: box.height - label.height, bottom: box.height },\n ];\n\n return slots.filter((slot) => slot.top >= -EDGE_TOLERANCE && slot.bottom <= box.height + EDGE_TOLERANCE);\n};\n\nconst hitsFor = (slot: Slot, label: StartLabelSize, points: readonly PlottedPoint[]): number => {\n const left = slot.anchor === 'end' ? slot.x - label.width : slot.x;\n const right = slot.anchor === 'end' ? slot.x : slot.x + label.width;\n const top = slot.top - COLLISION_MARGIN;\n const bottom = slot.bottom + COLLISION_MARGIN;\n\n return points.filter((point) => point.x >= left && point.x <= right && point.y >= top && point.y <= bottom).length;\n};\n\nexport const placeStartLabel = (\n points: readonly PlottedPoint[],\n startY: number,\n box: StartLabelBox,\n label: StartLabelSize,\n): StartLabelPlacement => {\n let best: { slot: Slot; hits: number } | null = null;\n\n for (const slot of candidateSlots(startY, box, label)) {\n const hits = hitsFor(slot, label, points);\n\n if (!best || hits < best.hits) {\n best = { slot, hits };\n }\n if (hits === 0) {\n break;\n }\n }\n\n if (!best) {\n return { anchor: 'end', x: box.width, y: label.height };\n }\n\n const { anchor, x, y } = best.slot;\n\n return { anchor, x, y };\n};\n","import type { ChartGeometry, ChartPoint } from './chart-scale';\n\nexport const TRANSITION_SAMPLES = 120;\nexport const TRANSITION_DURATION = 260;\n\nexport type Vertex = { x: number; y: number };\n\nexport type ShapeTransition = { xs: number[]; from: number[]; to: number[] };\n\nexport const easeOutQuint = (t: number): number => 1 - (1 - t) ** 5;\n\nexport const durationFrom = (value: string): number => {\n const match = /^\\s*([\\d.]+)(ms|s)\\s*$/.exec(value);\n const duration = match ? Number(match[1]) * (match[2] === 's' ? 1000 : 1) : Number.NaN;\n\n return Number.isFinite(duration) ? duration : TRANSITION_DURATION;\n};\n\nexport const sameSeries = (a: readonly ChartPoint[], b: readonly ChartPoint[] | null): boolean =>\n a === b ||\n (b !== null &&\n a.length === b.length &&\n a.every((point, index) => point.t === b[index]!.t && point.v === b[index]!.v));\n\nconst monotoneTangents = (xs: readonly number[], ys: readonly number[]): number[] => {\n const n = xs.length;\n const slopes: number[] = [];\n\n for (let i = 0; i < n - 1; i++) {\n const dx = xs[i + 1]! - xs[i]!;\n\n slopes.push(dx === 0 ? 0 : (ys[i + 1]! - ys[i]!) / dx);\n }\n\n const tangents = new Array<number>(n).fill(0);\n tangents[0] = slopes[0]!;\n tangents[n - 1] = slopes[n - 2]!;\n\n for (let i = 1; i < n - 1; i++) {\n const a = slopes[i - 1]!;\n const b = slopes[i]!;\n\n tangents[i] = a * b <= 0 ? 0 : (a + b) / 2;\n }\n\n for (let i = 0; i < n - 1; i++) {\n const slope = slopes[i]!;\n\n if (slope === 0) {\n tangents[i] = 0;\n tangents[i + 1] = 0;\n continue;\n }\n\n const a = tangents[i]! / slope;\n const b = tangents[i + 1]! / slope;\n const s = a * a + b * b;\n\n if (s > 9) {\n const t = 3 / Math.sqrt(s);\n\n tangents[i] = t * a * slope;\n tangents[i + 1] = t * b * slope;\n }\n }\n\n return tangents;\n};\n\nconst sampleMonotone = (points: readonly Vertex[], sampleXs: readonly number[]): number[] => {\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n const tangents = monotoneTangents(xs, ys);\n\n let segment = 0;\n\n return sampleXs.map((x) => {\n while (segment < xs.length - 2 && x > xs[segment + 1]!) {\n segment++;\n }\n\n const x0 = xs[segment]!;\n const x1 = xs[segment + 1]!;\n const dx = x1 - x0;\n const f = dx === 0 ? 0 : (x - x0) / dx;\n const f2 = f * f;\n const f3 = f2 * f;\n const y0 = ys[segment]!;\n const y1 = ys[segment + 1]!;\n const m0 = tangents[segment]!;\n const m1 = tangents[segment + 1]!;\n\n return (2 * f3 - 3 * f2 + 1) * y0 + (f3 - 2 * f2 + f) * m0 * dx + (-2 * f3 + 3 * f2) * y1 + (f3 - f2) * m1 * dx;\n });\n};\n\nexport const polyline = (xs: readonly number[], ys: readonly number[]): string =>\n xs.map((x, index) => `${index === 0 ? 'M' : 'L'}${x.toFixed(2)},${ys[index]!.toFixed(2)}`).join(' ');\n\nexport const shapeTransition = (from: readonly Vertex[], to: readonly Vertex[]): ShapeTransition => {\n const left = to[0]!.x;\n const right = to.at(-1)!.x;\n const xs = Array.from(\n { length: TRANSITION_SAMPLES },\n (_, index) => left + ((right - left) * index) / (TRANSITION_SAMPLES - 1),\n );\n\n return { xs, from: sampleMonotone(from, xs), to: sampleMonotone(to, xs) };\n};\n\nexport const shapeAt = (transition: ShapeTransition, progress: number): number[] =>\n transition.from.map((fromY, index) => fromY + (transition.to[index]! - fromY) * progress);\n\nexport const animateShape = (\n from: readonly Vertex[],\n to: readonly Vertex[],\n duration: number,\n draw: (shape: Vertex[], line: string) => void,\n done: () => void,\n): (() => void) => {\n const transition = shapeTransition(from, to);\n const start = performance.now();\n let frame = 0;\n\n const step = (now: number): void => {\n const t = Math.min(1, Math.max(0, (now - start) / duration));\n\n if (t === 1) {\n done();\n return;\n }\n\n const ys = shapeAt(transition, easeOutQuint(t));\n\n draw(\n transition.xs.map((x, index) => ({ x, y: ys[index]! })),\n polyline(transition.xs, ys),\n );\n frame = requestAnimationFrame(step);\n };\n\n frame = requestAnimationFrame(step);\n\n return () => cancelAnimationFrame(frame);\n};\n\nexport type ShapeView = {\n hold: (geometry: ChartGeometry | null) => void;\n draw: (line: string, end: Vertex) => void;\n};\n\nexport type ShapeMotionOptions = { reduced: boolean; duration: () => number; rangeKey: string | null };\n\nexport class ShapeMotion {\n readonly #view: ShapeView;\n #points: readonly ChartPoint[] | null = null;\n #rangeKey: string | null = null;\n #target: ChartGeometry | null = null;\n #held: ChartGeometry | null = null;\n #drawn: readonly Vertex[] | null = null;\n #stop: (() => void) | null = null;\n\n constructor(view: ShapeView) {\n this.#view = view;\n }\n\n follow(points: readonly ChartPoint[], geometry: ChartGeometry | null, options: ShapeMotionOptions): void {\n const newSeries = !sameSeries(points, this.#points);\n const newRange = options.rangeKey === null || options.rangeKey !== this.#rangeKey;\n\n this.#points = points;\n if (newSeries) {\n this.#rangeKey = options.rangeKey;\n }\n\n if (this.#stop && !newSeries && !options.reduced && geometry?.line === this.#target?.line) {\n this.#target = geometry;\n return;\n }\n\n const from = this.#drawn;\n const held = this.#held ?? this.#target;\n\n this.#target = geometry;\n this.stop();\n\n if (\n !newSeries ||\n !newRange ||\n !geometry ||\n !from ||\n from.length < 2 ||\n geometry.points.length < 2 ||\n options.reduced\n ) {\n this.#settle(geometry);\n return;\n }\n\n const duration = options.duration();\n\n if (duration <= 0) {\n this.#settle(geometry);\n return;\n }\n\n this.#hold(held);\n this.#stop = animateShape(\n from,\n geometry.points,\n duration,\n (shape, line) => this.#draw(shape, line, shape.at(-1)!),\n () => this.#settle(geometry),\n );\n }\n\n stop(): void {\n this.#stop?.();\n this.#stop = null;\n }\n\n #hold(geometry: ChartGeometry | null): void {\n this.#held = geometry;\n this.#view.hold(geometry);\n }\n\n #settle(geometry: ChartGeometry | null): void {\n this.#stop = null;\n this.#hold(null);\n this.#drawn = null;\n\n if (geometry) {\n this.#draw(geometry.points, geometry.line, geometry.end);\n }\n }\n\n #draw(shape: readonly Vertex[], line: string, end: Vertex): void {\n this.#drawn = shape;\n this.#view.draw(line, end);\n }\n}\n","import { DestroyRef, type Signal, inject, signal } from '@angular/core';\n\nconst WIDE_QUERY = '(min-width: 64rem)';\n\nexport const wideViewport = (): Signal<boolean> => {\n const query = typeof matchMedia === 'function' ? matchMedia(WIDE_QUERY) : null;\n const wide = signal(query?.matches ?? false);\n const onChange = (event: { matches: boolean }): void => wide.set(event.matches);\n\n if (query) {\n query.onchange = onChange;\n inject(DestroyRef).onDestroy(() => (query.onchange = null));\n }\n\n return wide;\n};\n","import {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\n\nimport { injectReducedMotion } from '@joanroucoux/cairn-ui/motion';\n\nimport { axisTicks, tickLabels } from './internal/chart-axis';\nimport { navigateIndex, nearestPointIndex } from './internal/chart-interaction';\nimport {\n type AxisTicks,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n START_LABEL_HEIGHT,\n deltaTone,\n identityDelta,\n identityTime,\n identityValue,\n parseAxisTicks,\n plotHeightFor,\n plotPaddingFor,\n startLabelBaseline,\n tooltipClassesFor,\n tooltipPlacement,\n} from './internal/chart-layout';\nimport { type ChartGeometry, type ChartPoint, type PlottedPoint, buildGeometry } from './internal/chart-scale';\nimport { observeSize } from './internal/observe-size';\nimport { placeStartLabel } from './internal/start-label';\nimport { ShapeMotion, durationFrom } from './internal/transition';\nimport { wideViewport } from './internal/viewport';\n\nexport type { AxisTicks, ChartPoint };\nexport type { TooltipSize } from './internal/chart-layout';\n\ntype PlotRef = ElementRef<SVGSVGElement>;\ntype LineRef = ElementRef<SVGPathElement>;\ntype EndRef = ElementRef<SVGCircleElement>;\n\n/**\n * Value over time: a monotone curve with a dashed line at the starting value and a tooltip.\n *\n * Axis labels are never repeated: a tick whose `axisFormat` text equals the previous drawn label is\n * not rendered. The first tick always is, so only the last edge label can drop. With `axisTicks=\"3\"`\n * only the first, middle and last ticks count; with `auto` every tick counts from `sm` up and the\n * three core ticks below it. Tick positions are unchanged.\n *\n * A new series interpolates from the drawn curve, fading the start label and the dashed line. With\n * `rangeKey` bound, only a series that comes with a new key does so: a new series under the same key\n * (a reload after a buy) is drawn at once, with no fade. The key may change before its series arrives.\n *\n * @example\n * <ui-line-chart [points]=\"points\" label=\"Net worth over one month\" startLabel=\"Since\" [valueFormat]=\"formatEur\" />\n */\n@Component({\n selector: 'ui-line-chart',\n template: `\n <div class=\"relative h-full\">\n <svg\n #svgRef\n class=\"block h-full w-full touch-pan-y overflow-visible\"\n role=\"img\"\n [attr.aria-label]=\"label()\"\n [attr.height]=\"effectiveHeight()\"\n [attr.tabindex]=\"sparkline() ? null : 0\"\n [attr.viewBox]=\"'0 0 ' + effectiveWidth() + ' ' + effectiveHeight()\"\n [attr.width]=\"effectiveWidth()\"\n (keydown)=\"onKeydown($event)\"\n (pointerleave)=\"onPointerLeave()\"\n (pointermove)=\"onPointerMove($event)\"\n >\n @if (shown(); as shape) {\n <path\n #lineRef\n class=\"stroke-(--foreground)\"\n data-chart-line\n fill=\"none\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [attr.d]=\"shape.line\"\n [attr.stroke-width]=\"sparkline() ? 1.5 : 2\"\n />\n\n @if (!sparkline()) {\n <line\n class=\"stroke-(--border) transition-opacity ease-(--ease-out)\"\n data-chart-start-line\n stroke-dasharray=\"3 4\"\n stroke-width=\"1\"\n x1=\"0\"\n [attr.x2]=\"effectiveWidth()\"\n [attr.y1]=\"shape.start.y\"\n [attr.y2]=\"shape.start.y\"\n [class]=\"startFade()\"\n />\n\n @if (startLabelInfo(); as info) {\n <text\n class=\"text-caption fill-(--subtle-foreground) tabular-nums transition-opacity ease-(--ease-out)\"\n data-chart-start-label\n [attr.text-anchor]=\"info.placement.anchor\"\n [attr.x]=\"info.placement.x\"\n [attr.y]=\"info.placement.y\"\n [class]=\"startFade()\"\n >\n {{ info.label }}\n </text>\n }\n\n <circle\n #endRef\n class=\"fill-(--foreground) stroke-(--card) [paint-order:stroke]\"\n data-chart-end\n r=\"4\"\n stroke-width=\"6\"\n [attr.cx]=\"shape.end.x\"\n [attr.cy]=\"shape.end.y\"\n />\n\n @for (tick of ticks(); track tick.t; let index = $index; let first = $first; let last = $last) {\n @if (tickTexts()[index]; as label) {\n <text\n class=\"text-caption fill-(--subtle-foreground) tabular-nums\"\n data-chart-axis-tick\n [attr.text-anchor]=\"first ? 'start' : last ? 'end' : 'middle'\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"effectiveHeight() - 4\"\n [class]=\"label.classes\"\n >\n {{ label.text }}\n </text>\n }\n }\n\n @if (active(); as point) {\n <line\n class=\"stroke-(--border)\"\n data-chart-crosshair\n stroke-width=\"1\"\n y1=\"0\"\n [attr.x1]=\"point.x\"\n [attr.x2]=\"point.x\"\n [attr.y2]=\"plotHeight()\"\n />\n <circle\n class=\"fill-(--foreground) stroke-(--card) [paint-order:stroke]\"\n data-chart-active\n r=\"5\"\n stroke-width=\"6\"\n [attr.cx]=\"point.x\"\n [attr.cy]=\"point.y\"\n />\n }\n }\n }\n </svg>\n\n @if (active(); as point) {\n <div\n class=\"rounded-container pointer-events-none absolute bg-(--elevated) py-2 whitespace-nowrap [font-variant-numeric:var(--numeric)] shadow-[0_4px_16px_rgb(0_0_0/0.12),inset_0_0_0_1px_var(--border)]\"\n data-testid=\"chart-tooltip\"\n role=\"status\"\n [class]=\"tooltipClasses().box\"\n [style]=\"tooltipStyle(point)\"\n >\n <p class=\"font-medium text-(--foreground)\" [class]=\"tooltipClasses().value\">\n {{ tooltipFormat()?.(point) ?? valueFormat()(point.v) }}\n </p>\n @if (tooltipDelta()) {\n <p data-chart-delta [class]=\"deltaClasses(point)\">{{ deltaFormat()(deltaFor(point)) }}</p>\n }\n <p class=\"text-caption text-(--subtle-foreground)\" data-chart-date>{{ timeFormat()(point.t) }}</p>\n </div>\n }\n @if (points().length > 0) {\n <div class=\"sr-only\">\n <table>\n <caption [textContent]=\"label()\"></caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ timeColumnLabel() }}</th>\n <th scope=\"col\">{{ valueColumnLabel() }}</th>\n </tr>\n </thead>\n <tbody>\n @for (point of points(); track point.t) {\n <tr>\n <td>{{ timeFormat()(point.t) }}</td>\n <td>{{ valueFormat()(point.v) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n `,\n host: {\n class: 'block h-full',\n },\n})\nexport class UiLineChart {\n readonly points = input.required<ChartPoint[]>();\n readonly label = input.required<string>();\n readonly valueFormat = input<(value: number) => string>(identityValue);\n readonly tooltipFormat = input<(point: ChartPoint) => string>();\n readonly deltaFormat = input<(delta: number) => string>(identityDelta);\n readonly timeFormat = input<(time: number) => string>(identityTime);\n readonly axisFormat = input<(time: number) => string>(identityTime);\n readonly startLabel = input('');\n readonly timeColumnLabel = input('Time');\n readonly valueColumnLabel = input('Value');\n readonly sparkline = input(false, { transform: booleanAttribute });\n readonly tooltip = input<'compact' | 'large' | 'auto'>('compact');\n readonly tooltipDelta = input(true, { transform: booleanAttribute });\n readonly axisGap = input<number | 'auto'>(12);\n readonly axisTicks = input<AxisTicks, AxisTicks | string>('auto', { transform: parseAxisTicks });\n readonly rangeKey = input<string | null>(null);\n\n #destroyRef = inject(DestroyRef);\n #host = inject<ElementRef<HTMLElement>>(ElementRef);\n #wide = wideViewport();\n #reducedMotion = injectReducedMotion();\n #motion = new ShapeMotion({\n hold: (geometry) => {\n this.held.set(geometry);\n this.activeIndex.update((index) => (geometry ? null : index));\n },\n draw: (line, end) => {\n this.lineRef()?.nativeElement.setAttribute('d', line);\n this.endRef()?.nativeElement.setAttribute('cx', String(end.x));\n this.endRef()?.nativeElement.setAttribute('cy', String(end.y));\n },\n });\n\n protected readonly svgRef = viewChild.required<PlotRef>('svgRef');\n protected readonly lineRef = viewChild<LineRef>('lineRef');\n protected readonly endRef = viewChild<EndRef>('endRef');\n protected readonly activeIndex = signal<number | null>(null);\n protected readonly held = signal<ChartGeometry | null>(null);\n protected readonly measuredSize = signal<{ width: number; height: number } | null>(null);\n\n protected readonly effectiveWidth = computed(() => this.measuredSize()?.width ?? DEFAULT_WIDTH);\n protected readonly effectiveHeight = computed(() => this.measuredSize()?.height ?? DEFAULT_HEIGHT);\n\n protected readonly plotHeight = computed(() =>\n plotHeightFor(this.effectiveHeight(), this.sparkline(), this.axisGap(), this.#wide()),\n );\n\n protected readonly tooltipStyle = (point: PlottedPoint): string => tooltipPlacement(point.x / this.effectiveWidth());\n\n protected readonly tooltipClasses = computed(() => tooltipClassesFor(this.tooltip(), this.#wide()));\n\n protected readonly geometry = computed(() => {\n const plotHeight = this.plotHeight();\n const padding = plotPaddingFor(plotHeight, this.sparkline());\n\n return buildGeometry(this.points(), this.effectiveWidth(), plotHeight, { x: 0, top: padding, bottom: padding });\n });\n\n protected readonly shown = computed(() => this.held() ?? this.geometry());\n\n protected readonly startFade = computed(() =>\n this.held() ? 'opacity-0 duration-(--duration-exit)' : 'duration-(--duration-fast)',\n );\n\n protected readonly ticks = computed(() => axisTicks(this.geometry()!.points));\n\n protected readonly tickTexts = computed(() => tickLabels(this.ticks(), this.axisFormat(), this.axisTicks()));\n\n protected readonly active = computed<PlottedPoint | null>(() => {\n const geometry = this.geometry();\n const index = this.activeIndex();\n\n return geometry && index !== null && !this.held() ? (geometry.points[index] as PlottedPoint) : null;\n });\n\n protected readonly startLabelInfo = computed(() => {\n const text = this.startLabel();\n const geometry = this.shown();\n\n if (!text || !geometry) {\n return null;\n }\n\n const label = `${text} ${this.valueFormat()(geometry.points[0]!.v)}`;\n const size = { width: label.length * 0.56 * 12 + 8, height: START_LABEL_HEIGHT };\n const placement = placeStartLabel(\n geometry.points,\n geometry.start.y,\n { width: this.effectiveWidth(), height: this.plotHeight() },\n size,\n );\n\n return { label, placement: { ...placement, y: startLabelBaseline(placement.y) } };\n });\n\n #renderRef = afterNextRender(() => {\n this.#destroyRef.onDestroy(() => this.#renderRef.destroy());\n observeSize(this.svgRef().nativeElement, this.#destroyRef, (size) => this.measuredSize.set(size));\n });\n\n constructor() {\n effect(() => {\n const points = this.points();\n const geometry = this.geometry();\n const reduced = this.#reducedMotion();\n\n untracked(() =>\n this.#motion.follow(points, geometry, {\n reduced,\n rangeKey: this.rangeKey(),\n duration: () => durationFrom(getComputedStyle(this.#host.nativeElement).getPropertyValue('--duration-base')),\n }),\n );\n });\n\n this.#destroyRef.onDestroy(() => this.#motion.stop());\n }\n\n protected deltaFor(point: PlottedPoint): number {\n return point.v - this.points()[0]!.v;\n }\n\n protected deltaClasses(point: PlottedPoint): string {\n return `${this.tooltipClasses().delta} ${deltaTone(this.deltaFor(point))}`;\n }\n\n protected onPointerMove(event: PointerEvent): void {\n const geometry = this.geometry();\n\n if (this.sparkline() || !geometry || geometry.points.length === 0) {\n return;\n }\n\n const rect = this.svgRef().nativeElement.getBoundingClientRect();\n const ratio = rect.width === 0 ? 1 : this.effectiveWidth() / rect.width;\n const x = (event.clientX - rect.left) * ratio;\n\n this.activeIndex.set(nearestPointIndex(geometry.points, x));\n }\n\n protected onPointerLeave(): void {\n this.activeIndex.set(null);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const geometry = this.geometry();\n\n if (this.sparkline() || !geometry || geometry.points.length === 0) {\n return;\n }\n\n const navigation = navigateIndex(event.key, this.activeIndex(), geometry.points.length - 1);\n\n if (!navigation) {\n return;\n }\n\n if (navigation.preventDefault) {\n event.preventDefault();\n }\n\n this.activeIndex.set(navigation.index);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAEO,MAAM,SAAS,GAAG,CAAyB,MAAoB,EAAE,QAAQ,GAAG,CAAC,KAAS;AAC3F,IAAA,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE;AAC7B,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC;IACpB;AAEA,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC5D,IAAA,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;AAE9C,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;AAEjC,IAAA,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE;AACvC,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACtC;AAEA,IAAA,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAM,CAAC;AAC9E,CAAC;AAEM,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,KAAa,KAAa;AAClE,IAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;AAE1C,IAAA,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,MAAM;AAC/D,CAAC;AAID,MAAM,cAAc,GAAG,CAAC,MAAyB,EAAE,QAAoC,KAAe;IACpG,IAAI,QAAQ,GAAkB,IAAI;IAElC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ;QAElC,QAAQ,GAAG,IAAI;AAEf,QAAA,OAAO,QAAQ;AACjB,IAAA,CAAC,CAAC;AACJ,CAAC;AAEM,MAAM,UAAU,GAAG,CACxB,KAA+B,EAC/B,MAAgC,EAChC,IAAoB,KACI;AACxB,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClD,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM;AAC3B,IAAA,MAAM,IAAI,GAAG,CAAC,KAAa,KAAc,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;IACjE,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IACpD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;IAE9C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAE,GAAG,SAAS,CAAC,KAAK,CAAE;AAC/D,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAE;AAEhC,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;AACpB,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,OAAO,GACX,IAAI,KAAK,MAAM,GAAG,CAAA,EAAG,MAAM,GAAG,EAAE,GAAG,eAAe,CAAA,CAAA,EAAI,IAAI,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,QAAQ;AAE/G,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;AAC1B,IAAA,CAAC,CAAC;AACJ,CAAC;;ACrED,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,KAAa,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;AAE/F,MAAM,iBAAiB,GAAG,CAAC,MAA+B,EAAE,CAAS,KAAY;IACtF,IAAI,OAAO,GAAG,CAAC;IACf,IAAI,eAAe,GAAG,QAAQ;IAE9B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtC,QAAA,IAAI,QAAQ,GAAG,eAAe,EAAE;YAC9B,eAAe,GAAG,QAAQ;YAC1B,OAAO,GAAG,KAAK;QACjB;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,OAAO;AAChB,CAAC;AAIM,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,OAAsB,EAAE,IAAY,KAA0B;IACvG,QAAQ,GAAG;AACT,QAAA,KAAK,YAAY;YACf,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE;AAC7E,QAAA,KAAK,WAAW;YACd,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE;AACnF,QAAA,KAAK,MAAM;YACT,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE;AAC3C,QAAA,KAAK,KAAK;YACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;AAC9C,QAAA,KAAK,QAAQ;YACX,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE;AAC/C,QAAA;AACE,YAAA,OAAO,IAAI;;AAEjB,CAAC;;ACrCM,MAAM,kBAAkB,GAAG,EAAE;AAEpC,MAAM,QAAQ,GAAG,EAAE;AAEZ,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU;AAGnD,MAAM,eAAe,GAAuE;AACjG,IAAA,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE;AAC7E,IAAA,KAAK,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE;CACtE;AAED,MAAM,kBAAkB,GAAG,EAAE,GAAG,GAAG;AACnC,MAAM,iBAAiB,GAAG,CAAC;AAC3B,MAAM,2BAA2B,GAAG,CAAC;AACrC,MAAM,cAAc,GAAG,EAAE;AACzB,MAAM,kBAAkB,GAAG,IAAI;AAExB,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,SAAkB,EAAE,OAAwB,EAAE,IAAa,KACvG,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC;AAE1E,MAAM,cAAc,GAAG,CAAC,UAAkB,EAAE,SAAkB,KACnE,SAAS,GAAG,iBAAiB,GAAG,UAAU,GAAG,kBAAkB;AAE1D,MAAM,kBAAkB,GAAG,CAAC,SAAiB,KAAa,SAAS,GAAG,2BAA2B;AAEjG,MAAM,gBAAgB,GAAG,CAAC,KAAa,KAAY;AACxD,IAAA,MAAM,OAAO,GAAG,KAAK,GAAG,kBAAkB;IAE1C,OAAO,CAAA,WAAA,EAAc,KAAK,GAAG,GAAG,CAAA,EAAA,EAAK,OAAO,GAAG,GAAG,GAAG,GAAG,CAAA,CAAA,EAAI,cAAc,CAAA,gBAAA,EAAmB,OAAO,GAAG,mBAAmB,GAAG,MAAM,CAAA,CAAE;AACvI,CAAC;AAEM,MAAM,SAAS,GAAG,CAAC,KAAa,KACrC,KAAK,GAAG,CAAC,GAAG,mBAAmB,GAAG,KAAK,GAAG,CAAC,GAAG,mBAAmB,GAAG,2BAA2B;AAE1F,MAAM,aAAa,GAAG,GAAG;AACzB,MAAM,cAAc,GAAG,GAAG;AAE1B,MAAM,aAAa,GAAG,CAAC,KAAa,KAAa,CAAA,EAAG,KAAK,CAAA,CAAE;AAC3D,MAAM,aAAa,GAAG,CAAC,KAAa,KAAa,CAAA,EAAG,KAAK,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE;AAClF,MAAM,YAAY,GAAG,CAAC,IAAY,KAAa,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;AAI3E,MAAM,cAAc,GAAG,CAAC,KAAyB,KACtD,KAAK,KAAK,MAAM,GAAG,MAAM,GAAI,MAAM,CAAC,KAAK,CAAW;AAEtD,MAAM,UAAU,GAAG,CAAC,GAAoB,EAAE,IAAa,MAAc,GAAG,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC;AAE7G,MAAM,cAAc,GAAG,CAAC,IAA0B,EAAE,IAAa,KAC/D,IAAI,KAAK,MAAM,IAAI,IAAI,GAAG,OAAO,GAAG,SAAS,IAAI,IAAI;AAEhD,MAAM,iBAAiB,GAAG,CAAC,IAA0B,EAAE,IAAa,KACzE,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;AChCtC,MAAM,KAAK,GAAG,cAAc;AAE5B,MAAM,aAAa,GAAG,CAC3B,MAAoB,EACpB,KAAa,EACb,MAAc,EACd,OAAA,GAA2B,EAAE,KACL;AACxB,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,QAAA,OAAO,IAAI;IACb;IAEA,MAAM,EAAE,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,GAAG,CAAC,EAAE,GAAG,OAAO;IACnF,MAAM,OAAO,GAAG,UAAU;AAC1B,IAAA,MAAM,UAAU,GAAG,MAAM,GAAG,aAAa;AAEzC,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;AAC5C,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IAEpC,MAAM,CAAC,GAAG,WAAW;AAClB,SAAA,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;SAC/C,KAAK,CAAC,CAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;AAEtC,IAAA,MAAM,CAAC,GACL,QAAQ,KAAK;UACT,MAAM,CAAC,OAAO,GAAG,UAAU,IAAI;UAC/B,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE7E,MAAM,GAAG,GAAG,CAAC,KAAiB,MAAc,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,aAAa,GAAG,IAAI;SACvB,CAAC,CAAC,GAAG;AACL,SAAA,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;SACvB,KAAK,CAAC,KAAK,CAAC;AAEf,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAe;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAe;IAExC,OAAO;AACL,QAAA,IAAI,EAAE,aAAa,CAAC,MAAM,CAAW;AACrC,QAAA,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QACnC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AACxB,QAAA,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3E,UAAU;QACV,OAAO;KACR;AACH,CAAC;;ACjEM,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,UAAsB,EAAE,QAA8B,KAAU;AAC5G,IAAA,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;QACzC;IACF;IAEA,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO;IAE5D,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;AAC3B,QAAA,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC7B;IAEA,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,KAAI;QAC9C,IAAI,KAAK,EAAE;AACT,YAAA,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAChF;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;IACzB,UAAU,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;AACnD,CAAC;;ACjBD,MAAM,QAAQ,GAAG,CAAC;AAClB,MAAM,gBAAgB,GAAG,CAAC;AAC1B,MAAM,cAAc,GAAG,CAAC;AAIxB,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,GAAkB,EAAE,KAAqB,KAAY;IAC3F,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM;AACjD,IAAA,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ;AACrC,IAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ;IAClC,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC,MAAM;AAEpD,IAAA,MAAM,KAAK,GAAW;QACpB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;QACnF,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;AACnF,QAAA,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;AAC7E,QAAA,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;QAC7E,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;QAC9E,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;AACxE,QAAA,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;AAClG,QAAA,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;KAC7F;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,cAAc,CAAC;AAC1G,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,IAAU,EAAE,KAAqB,EAAE,MAA+B,KAAY;IAC7F,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;AACnE,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,gBAAgB;AACvC,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,gBAAgB;AAE7C,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM;AACpH,CAAC;AAEM,MAAM,eAAe,GAAG,CAC7B,MAA+B,EAC/B,MAAc,EACd,GAAkB,EAClB,KAAqB,KACE;IACvB,IAAI,IAAI,GAAwC,IAAI;AAEpD,IAAA,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;QAEzC,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAC7B,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;QACvB;AACA,QAAA,IAAI,IAAI,KAAK,CAAC,EAAE;YACd;QACF;IACF;IAEA,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE;IACzD;IAEA,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI;AAElC,IAAA,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE;AACzB,CAAC;;ACjEM,MAAM,kBAAkB,GAAG,GAAG;AAC9B,MAAM,mBAAmB,GAAG,GAAG;AAM/B,MAAM,YAAY,GAAG,CAAC,CAAS,KAAa,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AAE5D,MAAM,YAAY,GAAG,CAAC,KAAa,KAAY;IACpD,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;AAClD,IAAA,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG;AAEtF,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,mBAAmB;AACnE,CAAC;AAEM,MAAM,UAAU,GAAG,CAAC,CAAwB,EAAE,CAA+B,KAClF,CAAC,KAAK,CAAC;KACN,CAAC,KAAK,IAAI;AACT,QAAA,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AACrB,QAAA,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,CAAC;AAElF,MAAM,gBAAgB,GAAG,CAAC,EAAqB,EAAE,EAAqB,KAAc;AAClF,IAAA,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM;IACnB,MAAM,MAAM,GAAa,EAAE;AAE3B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC9B,QAAA,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE;AAE9B,QAAA,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC;IACxD;AAEA,IAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE;AACxB,IAAA,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE;AAEhC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE;AACxB,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE;QAEpB,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5C;AAEA,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE;AAExB,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;AACf,YAAA,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;YACnB;QACF;QAEA,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,GAAG,KAAK;QAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,KAAK;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAEvB,QAAA,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE1B,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;YAC3B,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;QACjC;IACF;AAEA,IAAA,OAAO,QAAQ;AACjB,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,MAAyB,EAAE,QAA2B,KAAc;AAC1F,IAAA,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;AACzC,IAAA,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC;IAEzC,IAAI,OAAO,GAAG,CAAC;AAEf,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACxB,QAAA,OAAO,OAAO,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,GAAG,CAAC,CAAE,EAAE;AACtD,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAE;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,CAAC,CAAE;AAC3B,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE;AAClB,QAAA,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;AACtC,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC;AAChB,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC;AACjB,QAAA,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAE;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,CAAC,CAAE;AAC3B,QAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAE;QAEjC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;AACjH,IAAA,CAAC,CAAC;AACJ,CAAC;AAEM,MAAM,QAAQ,GAAG,CAAC,EAAqB,EAAE,EAAqB,KACnE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAA,EAAG,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,CAAA,EAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,KAAK,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAE/F,MAAM,eAAe,GAAG,CAAC,IAAuB,EAAE,EAAqB,KAAqB;IACjG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;AAC1B,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CACnB,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAC9B,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,KAAK,kBAAkB,GAAG,CAAC,CAAC,CACzE;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;AAC3E,CAAC;AAEM,MAAM,OAAO,GAAG,CAAC,UAA2B,EAAE,QAAgB,KACnE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAE,GAAG,KAAK,IAAI,QAAQ,CAAC;AAEpF,MAAM,YAAY,GAAG,CAC1B,IAAuB,EACvB,EAAqB,EACrB,QAAgB,EAChB,IAA6C,EAC7C,IAAgB,KACA;IAChB,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;AAC5C,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;IAC/B,IAAI,KAAK,GAAG,CAAC;AAEb,IAAA,MAAM,IAAI,GAAG,CAAC,GAAW,KAAU;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI,QAAQ,CAAC,CAAC;AAE5D,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACX,YAAA,IAAI,EAAE;YACN;QACF;QAEA,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAE/C,QAAA,IAAI,CACF,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAE,EAAE,CAAC,CAAC,EACvD,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAC5B;AACD,QAAA,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;AACrC,IAAA,CAAC;AAED,IAAA,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;AAEnC,IAAA,OAAO,MAAM,oBAAoB,CAAC,KAAK,CAAC;AAC1C,CAAC;MASY,WAAW,CAAA;AACb,IAAA,KAAK;IACd,OAAO,GAAiC,IAAI;IAC5C,SAAS,GAAkB,IAAI;IAC/B,OAAO,GAAyB,IAAI;IACpC,KAAK,GAAyB,IAAI;IAClC,MAAM,GAA6B,IAAI;IACvC,KAAK,GAAwB,IAAI;AAEjC,IAAA,WAAA,CAAY,IAAe,EAAA;AACzB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;AAEA,IAAA,MAAM,CAAC,MAA6B,EAAE,QAA8B,EAAE,OAA2B,EAAA;QAC/F,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;AACnD,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS;AAEjF,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;QACrB,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ;QACnC;QAEA,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,QAAQ,EAAE,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;AACzF,YAAA,IAAI,CAAC,OAAO,GAAG,QAAQ;YACvB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;AAEvC,QAAA,IAAI,CAAC,OAAO,GAAG,QAAQ;QACvB,IAAI,CAAC,IAAI,EAAE;AAEX,QAAA,IACE,CAAC,SAAS;AACV,YAAA,CAAC,QAAQ;AACT,YAAA,CAAC,QAAQ;AACT,YAAA,CAAC,IAAI;YACL,IAAI,CAAC,MAAM,GAAG,CAAC;AACf,YAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAC1B,OAAO,CAAC,OAAO,EACf;AACA,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtB;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE;AAEnC,QAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;AACjB,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtB;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,YAAY,CACvB,IAAI,EACJ,QAAQ,CAAC,MAAM,EACf,QAAQ,EACR,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EACvD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAC7B;IACH;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,KAAK,IAAI;AACd,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;AAEA,IAAA,KAAK,CAAC,QAA8B,EAAA;AAClC,QAAA,IAAI,CAAC,KAAK,GAAG,QAAQ;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC3B;AAEA,IAAA,OAAO,CAAC,QAA8B,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAChB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;QAElB,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;QAC1D;IACF;AAEA,IAAA,KAAK,CAAC,KAAwB,EAAE,IAAY,EAAE,GAAW,EAAA;AACvD,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;IAC5B;AACD;;AC9OD,MAAM,UAAU,GAAG,oBAAoB;AAEhC,MAAM,YAAY,GAAG,MAAsB;AAChD,IAAA,MAAM,KAAK,GAAG,OAAO,UAAU,KAAK,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,IAAI;IAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK;6EAAC;AAC5C,IAAA,MAAM,QAAQ,GAAG,CAAC,KAA2B,KAAW,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;IAE/E,IAAI,KAAK,EAAE;AACT,QAAA,KAAK,CAAC,QAAQ,GAAG,QAAQ;AACzB,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,OAAO,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC7D;AAEA,IAAA,OAAO,IAAI;AACb,CAAC;;ACiCD;;;;;;;;;;;;;;AAcG;MAoJU,WAAW,CAAA;IACb,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAAgB;IACvC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAU;IAChC,WAAW,GAAG,KAAK,CAA4B,aAAa;oFAAC;AAC7D,IAAA,aAAa,GAAG,KAAK;iGAAiC;IACtD,WAAW,GAAG,KAAK,CAA4B,aAAa;oFAAC;IAC7D,UAAU,GAAG,KAAK,CAA2B,YAAY;mFAAC;IAC1D,UAAU,GAAG,KAAK,CAA2B,YAAY;mFAAC;IAC1D,UAAU,GAAG,KAAK,CAAC,EAAE;mFAAC;IACtB,eAAe,GAAG,KAAK,CAAC,MAAM;wFAAC;IAC/B,gBAAgB,GAAG,KAAK,CAAC,OAAO;yFAAC;IACjC,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACzD,OAAO,GAAG,KAAK,CAA+B,SAAS;gFAAC;IACxD,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC3D,OAAO,GAAG,KAAK,CAAkB,EAAE;gFAAC;IACpC,SAAS,GAAG,KAAK,CAAgC,MAAM,iFAAI,SAAS,EAAE,cAAc,EAAA,CAAG;IACvF,QAAQ,GAAG,KAAK,CAAgB,IAAI;iFAAC;AAE9C,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,KAAK,GAAG,MAAM,CAA0B,UAAU,CAAC;IACnD,KAAK,GAAG,YAAY,EAAE;IACtB,cAAc,GAAG,mBAAmB,EAAE;IACtC,OAAO,GAAG,IAAI,WAAW,CAAC;AACxB,QAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;AACjB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC;QAC/D,CAAC;AACD,QAAA,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAI;AAClB,YAAA,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC;AACrD,YAAA,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9D,YAAA,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;AACF,KAAA,CAAC;AAEiB,IAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAU,QAAQ;+EAAC;IAC9C,OAAO,GAAG,SAAS,CAAU,SAAS;gFAAC;IACvC,MAAM,GAAG,SAAS,CAAS,QAAQ;+EAAC;IACpC,WAAW,GAAG,MAAM,CAAgB,IAAI;oFAAC;IACzC,IAAI,GAAG,MAAM,CAAuB,IAAI;6EAAC;IACzC,YAAY,GAAG,MAAM,CAA2C,IAAI;qFAAC;AAErE,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,aAAa;uFAAC;AAC5E,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,IAAI,cAAc;wFAAC;IAE/E,UAAU,GAAG,QAAQ,CAAC,MACvC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;mFACtF;AAEkB,IAAA,YAAY,GAAG,CAAC,KAAmB,KAAa,gBAAgB,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AAEjG,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;uFAAC;AAEhF,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;QACpC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAE5D,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACjH,CAAC;iFAAC;AAEiB,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;8EAAC;AAEtD,IAAA,SAAS,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,IAAI,EAAE,GAAG,sCAAsC,GAAG,4BAA4B;kFACpF;AAEkB,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAG,CAAC,MAAM,CAAC;8EAAC;IAE1D,SAAS,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;kFAAC;AAEzF,IAAA,MAAM,GAAG,QAAQ,CAAsB,MAAK;AAC7D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;QAEhC,OAAO,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAkB,GAAG,IAAI;IACrG,CAAC;+EAAC;AAEiB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE;AAE7B,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;AACtB,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,KAAK,GAAG,CAAA,EAAG,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE;AACpE,QAAA,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE;AAChF,QAAA,MAAM,SAAS,GAAG,eAAe,CAC/B,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,KAAK,CAAC,CAAC,EAChB,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAC3D,IAAI,CACL;AAED,QAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;IACnF,CAAC;uFAAC;AAEF,IAAA,UAAU,GAAG,eAAe,CAAC,MAAK;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC3D,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnG,IAAA,CAAC,CAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;AAErC,YAAA,SAAS,CAAC,MACR,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE;gBACpC,OAAO;AACP,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,gBAAA,QAAQ,EAAE,MAAM,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;AAC7G,aAAA,CAAC,CACH;AACH,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD;AAEU,IAAA,QAAQ,CAAC,KAAmB,EAAA;AACpC,QAAA,OAAO,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;IACtC;AAEU,IAAA,YAAY,CAAC,KAAmB,EAAA;AACxC,QAAA,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAA,CAAA,EAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;IAC5E;AAEU,IAAA,aAAa,CAAC,KAAmB,EAAA;AACzC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEhC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACjE;QACF;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK;AACvE,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK;AAE7C,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D;IAEU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEhC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACjE;QACF;QAEA,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAE3F,IAAI,CAAC,UAAU,EAAE;YACf;QACF;AAEA,QAAA,IAAI,UAAU,CAAC,cAAc,EAAE;YAC7B,KAAK,CAAC,cAAc,EAAE;QACxB;QAEA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;IACxC;uGAnKW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAjJZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4IT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAKU,WAAW,EAAA,UAAA,EAAA,CAAA;kBAnJvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4IT,EAAA,CAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,cAAc;AACtB,qBAAA;AACF,iBAAA;0pDAmCyD,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAChB,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACX,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACtPxD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"joanroucoux-cairn-ui-line-chart.mjs","names":[],"sources":["../../../projects/ui/line-chart/internal/chart-axis.ts","../../../projects/ui/line-chart/internal/chart-interaction.ts","../../../projects/ui/line-chart/internal/chart-layout.ts","../../../projects/ui/line-chart/internal/chart-scale.ts","../../../projects/ui/line-chart/internal/observe-size.ts","../../../projects/ui/line-chart/internal/start-label.ts","../../../projects/ui/line-chart/internal/transition.ts","../../../projects/ui/line-chart/internal/viewport.ts","../../../projects/ui/line-chart/line-chart.ts"],"sourcesContent":["import type { PlottedPoint } from './chart-scale';\n\nexport const axisTicks = <T extends PlottedPoint>(points: readonly T[], maxTicks = 5): T[] => {\n if (points.length <= maxTicks) {\n return [...points];\n }\n\n const count = Math.max(3, Math.min(maxTicks, points.length));\n const step = (points.length - 1) / (count - 1);\n\n const indexes = new Set<number>();\n\n for (let tick = 0; tick < count; tick++) {\n indexes.add(Math.round(tick * step));\n }\n\n return [...indexes].sort((a, b) => a - b).map((index) => points[index] as T);\n};\n\nexport const isCoreTick = (index: number, count: number): boolean => {\n if (count <= 3) {\n return true;\n }\n\n const middle = Math.floor((count - 1) / 2);\n\n return index === 0 || index === count - 1 || index === middle;\n};\n\nexport type TickLabel = { text: string; classes: string };\n\nconst firstOfEachRun = (labels: readonly string[], included: (index: number) => boolean): boolean[] => {\n let previous: string | null = null;\n\n return labels.map((text, index) => {\n if (!included(index)) {\n return false;\n }\n\n const distinct = text !== previous;\n\n previous = text;\n\n return distinct;\n });\n};\n\nexport const tickLabels = (\n ticks: readonly { t: number }[],\n format: (time: number) => string,\n mode: 3 | 5 | 'auto',\n): (TickLabel | null)[] => {\n const labels = ticks.map((tick) => format(tick.t));\n const count = labels.length;\n const core = (index: number): boolean => isCoreTick(index, count);\n const everyTick = firstOfEachRun(labels, () => true);\n const coreTicks = firstOfEachRun(labels, core);\n\n return labels.map((text, index) => {\n const wide = mode === 3 ? coreTicks[index]! : everyTick[index]!;\n const narrow = coreTicks[index]!;\n\n if (!wide && !narrow) {\n return null;\n }\n\n const classes =\n mode === 'auto' ? `${narrow ? '' : 'max-sm:hidden'} ${wide ? '' : 'sm:hidden'}`.trim() : wide ? '' : 'hidden';\n\n return { text, classes };\n });\n};\n","import type { PlottedPoint } from './chart-scale';\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(Math.max(value, min), max);\n\nexport const nearestPointIndex = (points: readonly PlottedPoint[], x: number): number => {\n let nearest = 0;\n let nearestDistance = Infinity;\n\n points.forEach((point, index) => {\n const distance = Math.abs(point.x - x);\n\n if (distance < nearestDistance) {\n nearestDistance = distance;\n nearest = index;\n }\n });\n\n return nearest;\n};\n\nexport type KeyNavigation = { index: number | null; preventDefault: boolean };\n\nexport const navigateIndex = (key: string, current: number | null, last: number): KeyNavigation | null => {\n switch (key) {\n case 'ArrowRight':\n return { index: clamp((current ?? -1) + 1, 0, last), preventDefault: true };\n case 'ArrowLeft':\n return { index: clamp((current ?? last + 1) - 1, 0, last), preventDefault: true };\n case 'Home':\n return { index: 0, preventDefault: true };\n case 'End':\n return { index: last, preventDefault: true };\n case 'Escape':\n return { index: null, preventDefault: false };\n default:\n return null;\n }\n};\n","export const START_LABEL_HEIGHT = 16;\n\nconst AXIS_ROW = 17;\n\nexport const TOOLTIP_SIZES = ['compact', 'large'] as const;\nexport type TooltipSize = (typeof TOOLTIP_SIZES)[number];\n\nexport const TOOLTIP_CLASSES: Record<TooltipSize, { box: string; value: string; delta: string }> = {\n compact: { box: '-top-3 px-2.5', value: 'text-label', delta: 'text-caption' },\n large: { box: 'top-0 px-3', value: 'text-body', delta: 'text-label' },\n};\n\nconst PLOT_PADDING_RATIO = 16 / 240;\nconst SPARKLINE_PADDING = 4;\nconst START_LABEL_BASELINE_OFFSET = 4;\nconst TOOLTIP_OFFSET = 14;\nconst TOOLTIP_FLIP_RATIO = 0.55;\n\nexport const plotHeightFor = (height: number, sparkline: boolean, axisGap: number | 'auto', wide: boolean): number =>\n sparkline ? height : Math.max(height - resolveGap(axisGap, wide) - AXIS_ROW, 1);\n\nexport const plotPaddingFor = (plotHeight: number, sparkline: boolean): number =>\n sparkline ? SPARKLINE_PADDING : plotHeight * PLOT_PADDING_RATIO;\n\nexport const startLabelBaseline = (boxBottom: number): number => boxBottom - START_LABEL_BASELINE_OFFSET;\n\nexport const tooltipPlacement = (ratio: number): string => {\n const flipped = ratio > TOOLTIP_FLIP_RATIO;\n\n return `left: calc(${ratio * 100}% ${flipped ? '-' : '+'} ${TOOLTIP_OFFSET}px); transform: ${flipped ? 'translateX(-100%)' : 'none'}`;\n};\n\nexport const deltaTone = (delta: number): string =>\n delta > 0 ? 'text-(--positive)' : delta < 0 ? 'text-(--negative)' : 'text-(--muted-foreground)';\n\nexport const DEFAULT_WIDTH = 640;\nexport const DEFAULT_HEIGHT = 240;\n\nexport const identityValue = (value: number): string => `${value}`;\nexport const identityDelta = (delta: number): string => `${delta > 0 ? '+' : ''}${delta}`;\nexport const identityTime = (time: number): string => new Date(time).toISOString();\n\nexport type AxisTicks = 3 | 5 | 'auto';\n\nexport const parseAxisTicks = (value: AxisTicks | string): AxisTicks =>\n value === 'auto' ? 'auto' : (Number(value) as 3 | 5);\n\nconst resolveGap = (gap: number | 'auto', wide: boolean): number => (gap === 'auto' ? (wide ? 16 : 12) : gap);\n\nconst resolveTooltip = (size: TooltipSize | 'auto', wide: boolean): TooltipSize =>\n size === 'auto' ? (wide ? 'large' : 'compact') : size;\n\nexport const tooltipClassesFor = (size: TooltipSize | 'auto', wide: boolean): (typeof TOOLTIP_CLASSES)[TooltipSize] =>\n TOOLTIP_CLASSES[resolveTooltip(size, wide)];\n","import { scaleLinear } from 'd3-scale';\nimport { curveMonotoneX, line } from 'd3-shape';\n\nexport type ChartPoint = {\n t: number;\n v: number;\n};\n\nexport type PlottedPoint = ChartPoint & { x: number; y: number };\n\nexport type ChartGeometry = {\n line: string;\n end: { x: number; y: number };\n start: { y: number };\n points: PlottedPoint[];\n plotBottom: number;\n plotTop: number;\n};\n\nexport type GeometryPadding = { x?: number; top?: number; bottom?: number };\n\nexport const CURVE = curveMonotoneX;\n\nexport const buildGeometry = (\n points: ChartPoint[],\n width: number,\n height: number,\n padding: GeometryPadding = {},\n): ChartGeometry | null => {\n if (points.length === 0) {\n return null;\n }\n\n const { x: paddingX = 4, top: paddingTop = 4, bottom: paddingBottom = 4 } = padding;\n const plotTop = paddingTop;\n const plotBottom = height - paddingBottom;\n\n const times = points.map((point) => point.t);\n const values = points.map((point) => point.v);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n\n const x = scaleLinear()\n .domain([Math.min(...times), Math.max(...times)])\n .range([paddingX, width - paddingX]);\n\n const y =\n minValue === maxValue\n ? () => (plotTop + plotBottom) / 2\n : scaleLinear().domain([minValue, maxValue]).range([plotBottom, plotTop]);\n\n const toX = (point: ChartPoint): number => (points.length === 1 ? paddingX : x(point.t));\n\n const lineGenerator = line<ChartPoint>()\n .x(toX)\n .y((point) => y(point.v))\n .curve(CURVE);\n\n const first = points[0] as ChartPoint;\n const last = points.at(-1) as ChartPoint;\n\n return {\n line: lineGenerator(points) as string,\n end: { x: toX(last), y: y(last.v) },\n start: { y: y(first.v) },\n points: points.map((point) => ({ ...point, x: toX(point), y: y(point.v) })),\n plotBottom,\n plotTop,\n };\n};\n","import type { DestroyRef } from '@angular/core';\n\nexport type Size = { width: number; height: number };\n\nexport const observeSize = (element: Element, destroyRef: DestroyRef, measured: (size: Size) => void): void => {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n const { clientWidth: width, clientHeight: height } = element;\n\n if (width > 0 && height > 0) {\n measured({ width, height });\n }\n\n const observer = new ResizeObserver(([entry]) => {\n if (entry) {\n measured({ width: entry.contentRect.width, height: entry.contentRect.height });\n }\n });\n\n observer.observe(element);\n destroyRef.onDestroy(() => observer.disconnect());\n};\n","import type { PlottedPoint } from './chart-scale';\n\nexport type StartLabelBox = { width: number; height: number };\nexport type StartLabelSize = { width: number; height: number };\nexport type StartLabelPlacement = { x: number; y: number; anchor: 'start' | 'end' };\n\nconst LINE_GAP = 6;\nconst COLLISION_MARGIN = 6;\nconst EDGE_TOLERANCE = 3;\n\ntype Slot = { anchor: 'start' | 'end'; x: number; y: number; top: number; bottom: number };\n\nconst candidateSlots = (startY: number, box: StartLabelBox, label: StartLabelSize): Slot[] => {\n const aboveTop = startY - LINE_GAP - label.height;\n const aboveBottom = startY - LINE_GAP;\n const belowTop = startY + LINE_GAP;\n const belowBottom = startY + LINE_GAP + label.height;\n\n const slots: Slot[] = [\n { anchor: 'end', x: box.width, y: aboveBottom, top: aboveTop, bottom: aboveBottom },\n { anchor: 'end', x: box.width, y: belowBottom, top: belowTop, bottom: belowBottom },\n { anchor: 'start', x: 0, y: aboveBottom, top: aboveTop, bottom: aboveBottom },\n { anchor: 'start', x: 0, y: belowBottom, top: belowTop, bottom: belowBottom },\n { anchor: 'end', x: box.width, y: label.height, top: 0, bottom: label.height },\n { anchor: 'start', x: 0, y: label.height, top: 0, bottom: label.height },\n { anchor: 'end', x: box.width, y: box.height, top: box.height - label.height, bottom: box.height },\n { anchor: 'start', x: 0, y: box.height, top: box.height - label.height, bottom: box.height },\n ];\n\n return slots.filter((slot) => slot.top >= -EDGE_TOLERANCE && slot.bottom <= box.height + EDGE_TOLERANCE);\n};\n\nconst hitsFor = (slot: Slot, label: StartLabelSize, points: readonly PlottedPoint[]): number => {\n const left = slot.anchor === 'end' ? slot.x - label.width : slot.x;\n const right = slot.anchor === 'end' ? slot.x : slot.x + label.width;\n const top = slot.top - COLLISION_MARGIN;\n const bottom = slot.bottom + COLLISION_MARGIN;\n\n return points.filter((point) => point.x >= left && point.x <= right && point.y >= top && point.y <= bottom).length;\n};\n\nexport const placeStartLabel = (\n points: readonly PlottedPoint[],\n startY: number,\n box: StartLabelBox,\n label: StartLabelSize,\n): StartLabelPlacement => {\n let best: { slot: Slot; hits: number } | null = null;\n\n for (const slot of candidateSlots(startY, box, label)) {\n const hits = hitsFor(slot, label, points);\n\n if (!best || hits < best.hits) {\n best = { slot, hits };\n }\n if (hits === 0) {\n break;\n }\n }\n\n if (!best) {\n return { anchor: 'end', x: box.width, y: label.height };\n }\n\n const { anchor, x, y } = best.slot;\n\n return { anchor, x, y };\n};\n","import type { ChartGeometry, ChartPoint } from './chart-scale';\n\nexport const TRANSITION_SAMPLES = 120;\nexport const TRANSITION_DURATION = 260;\n\nexport type Vertex = { x: number; y: number };\n\nexport type ShapeTransition = { xs: number[]; from: number[]; to: number[] };\n\nexport const easeOutQuint = (t: number): number => 1 - (1 - t) ** 5;\n\nexport const durationFrom = (value: string): number => {\n const match = /^\\s*([\\d.]+)(ms|s)\\s*$/.exec(value);\n const duration = match ? Number(match[1]) * (match[2] === 's' ? 1000 : 1) : Number.NaN;\n\n return Number.isFinite(duration) ? duration : TRANSITION_DURATION;\n};\n\nexport const sameSeries = (a: readonly ChartPoint[], b: readonly ChartPoint[] | null): boolean =>\n a === b ||\n (b !== null &&\n a.length === b.length &&\n a.every((point, index) => point.t === b[index]!.t && point.v === b[index]!.v));\n\nconst monotoneTangents = (xs: readonly number[], ys: readonly number[]): number[] => {\n const n = xs.length;\n const slopes: number[] = [];\n\n for (let i = 0; i < n - 1; i++) {\n const dx = xs[i + 1]! - xs[i]!;\n\n slopes.push(dx === 0 ? 0 : (ys[i + 1]! - ys[i]!) / dx);\n }\n\n const tangents = new Array<number>(n).fill(0);\n tangents[0] = slopes[0]!;\n tangents[n - 1] = slopes[n - 2]!;\n\n for (let i = 1; i < n - 1; i++) {\n const a = slopes[i - 1]!;\n const b = slopes[i]!;\n\n tangents[i] = a * b <= 0 ? 0 : (a + b) / 2;\n }\n\n for (let i = 0; i < n - 1; i++) {\n const slope = slopes[i]!;\n\n if (slope === 0) {\n tangents[i] = 0;\n tangents[i + 1] = 0;\n continue;\n }\n\n const a = tangents[i]! / slope;\n const b = tangents[i + 1]! / slope;\n const s = a * a + b * b;\n\n if (s > 9) {\n const t = 3 / Math.sqrt(s);\n\n tangents[i] = t * a * slope;\n tangents[i + 1] = t * b * slope;\n }\n }\n\n return tangents;\n};\n\nconst sampleMonotone = (points: readonly Vertex[], sampleXs: readonly number[]): number[] => {\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n const tangents = monotoneTangents(xs, ys);\n\n let segment = 0;\n\n return sampleXs.map((x) => {\n while (segment < xs.length - 2 && x > xs[segment + 1]!) {\n segment++;\n }\n\n const x0 = xs[segment]!;\n const x1 = xs[segment + 1]!;\n const dx = x1 - x0;\n const f = dx === 0 ? 0 : (x - x0) / dx;\n const f2 = f * f;\n const f3 = f2 * f;\n const y0 = ys[segment]!;\n const y1 = ys[segment + 1]!;\n const m0 = tangents[segment]!;\n const m1 = tangents[segment + 1]!;\n\n return (2 * f3 - 3 * f2 + 1) * y0 + (f3 - 2 * f2 + f) * m0 * dx + (-2 * f3 + 3 * f2) * y1 + (f3 - f2) * m1 * dx;\n });\n};\n\nexport const polyline = (xs: readonly number[], ys: readonly number[]): string =>\n xs.map((x, index) => `${index === 0 ? 'M' : 'L'}${x.toFixed(2)},${ys[index]!.toFixed(2)}`).join(' ');\n\nexport const shapeTransition = (from: readonly Vertex[], to: readonly Vertex[]): ShapeTransition => {\n const left = to[0]!.x;\n const right = to.at(-1)!.x;\n const xs = Array.from(\n { length: TRANSITION_SAMPLES },\n (_, index) => left + ((right - left) * index) / (TRANSITION_SAMPLES - 1),\n );\n\n return { xs, from: sampleMonotone(from, xs), to: sampleMonotone(to, xs) };\n};\n\nexport const shapeAt = (transition: ShapeTransition, progress: number): number[] =>\n transition.from.map((fromY, index) => fromY + (transition.to[index]! - fromY) * progress);\n\nexport const animateShape = (\n from: readonly Vertex[],\n to: readonly Vertex[],\n duration: number,\n draw: (shape: Vertex[], line: string) => void,\n done: () => void,\n): (() => void) => {\n const transition = shapeTransition(from, to);\n const start = performance.now();\n let frame = 0;\n\n const step = (now: number): void => {\n const t = Math.min(1, Math.max(0, (now - start) / duration));\n\n if (t === 1) {\n done();\n return;\n }\n\n const ys = shapeAt(transition, easeOutQuint(t));\n\n draw(\n transition.xs.map((x, index) => ({ x, y: ys[index]! })),\n polyline(transition.xs, ys),\n );\n frame = requestAnimationFrame(step);\n };\n\n frame = requestAnimationFrame(step);\n\n return () => cancelAnimationFrame(frame);\n};\n\nexport type ShapeView = {\n hold: (geometry: ChartGeometry | null) => void;\n draw: (line: string, end: Vertex) => void;\n};\n\nexport type ShapeMotionOptions = { reduced: boolean; duration: () => number; rangeKey: string | null };\n\nexport class ShapeMotion {\n readonly #view: ShapeView;\n #points: readonly ChartPoint[] | null = null;\n #rangeKey: string | null = null;\n #target: ChartGeometry | null = null;\n #held: ChartGeometry | null = null;\n #drawn: readonly Vertex[] | null = null;\n #stop: (() => void) | null = null;\n\n constructor(view: ShapeView) {\n this.#view = view;\n }\n\n follow(points: readonly ChartPoint[], geometry: ChartGeometry | null, options: ShapeMotionOptions): void {\n const newSeries = !sameSeries(points, this.#points);\n const newRange = options.rangeKey === null || options.rangeKey !== this.#rangeKey;\n\n this.#points = points;\n if (newSeries) {\n this.#rangeKey = options.rangeKey;\n }\n\n if (this.#stop && !newSeries && !options.reduced && geometry?.line === this.#target?.line) {\n this.#target = geometry;\n return;\n }\n\n const from = this.#drawn;\n const held = this.#held ?? this.#target;\n\n this.#target = geometry;\n this.stop();\n\n if (\n !newSeries ||\n !newRange ||\n !geometry ||\n !from ||\n from.length < 2 ||\n geometry.points.length < 2 ||\n options.reduced\n ) {\n this.#settle(geometry);\n return;\n }\n\n const duration = options.duration();\n\n if (duration <= 0) {\n this.#settle(geometry);\n return;\n }\n\n this.#hold(held);\n this.#stop = animateShape(\n from,\n geometry.points,\n duration,\n (shape, line) => this.#draw(shape, line, shape.at(-1)!),\n () => this.#settle(geometry),\n );\n }\n\n stop(): void {\n this.#stop?.();\n this.#stop = null;\n }\n\n #hold(geometry: ChartGeometry | null): void {\n this.#held = geometry;\n this.#view.hold(geometry);\n }\n\n #settle(geometry: ChartGeometry | null): void {\n this.#stop = null;\n this.#hold(null);\n this.#drawn = null;\n\n if (geometry) {\n this.#draw(geometry.points, geometry.line, geometry.end);\n }\n }\n\n #draw(shape: readonly Vertex[], line: string, end: Vertex): void {\n this.#drawn = shape;\n this.#view.draw(line, end);\n }\n}\n","import { DestroyRef, type Signal, inject, signal } from '@angular/core';\n\nconst WIDE_QUERY = '(min-width: 64rem)';\n\nexport const wideViewport = (): Signal<boolean> => {\n const query = typeof matchMedia === 'function' ? matchMedia(WIDE_QUERY) : null;\n const wide = signal(query?.matches ?? false);\n const onChange = (event: { matches: boolean }): void => wide.set(event.matches);\n\n if (query) {\n query.onchange = onChange;\n inject(DestroyRef).onDestroy(() => (query.onchange = null));\n }\n\n return wide;\n};\n","import {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\n\nimport { injectReducedMotion } from '@joanroucoux/cairn-ui/motion';\n\nimport { axisTicks, tickLabels } from './internal/chart-axis';\nimport { navigateIndex, nearestPointIndex } from './internal/chart-interaction';\nimport {\n type AxisTicks,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n START_LABEL_HEIGHT,\n deltaTone,\n identityDelta,\n identityTime,\n identityValue,\n parseAxisTicks,\n plotHeightFor,\n plotPaddingFor,\n startLabelBaseline,\n tooltipClassesFor,\n tooltipPlacement,\n} from './internal/chart-layout';\nimport { type ChartGeometry, type ChartPoint, type PlottedPoint, buildGeometry } from './internal/chart-scale';\nimport { observeSize } from './internal/observe-size';\nimport { placeStartLabel } from './internal/start-label';\nimport { ShapeMotion, durationFrom } from './internal/transition';\nimport { wideViewport } from './internal/viewport';\n\nexport type { AxisTicks, ChartPoint };\nexport type { TooltipSize } from './internal/chart-layout';\n\ntype PlotRef = ElementRef<SVGSVGElement>;\ntype LineRef = ElementRef<SVGPathElement>;\ntype EndRef = ElementRef<SVGCircleElement>;\n\n/**\n * Value over time: a monotone curve with a dashed line at the starting value and a tooltip.\n *\n * Axis labels are never repeated: a tick whose `axisFormat` text equals the previous drawn label is\n * not rendered, so only the last edge label can drop.\n *\n * A new series animates from the drawn curve. With `rangeKey` bound, only a series that comes with\n * a new key does: a new series under the same key (a reload) is drawn at once. The key may change\n * before its series arrives.\n *\n * @example\n * <ui-line-chart [points]=\"points\" label=\"Net worth over one month\" startLabel=\"Since\" [valueFormat]=\"formatEur\" />\n */\n@Component({\n selector: 'ui-line-chart',\n template: `\n <div class=\"relative h-full\">\n <svg\n #svgRef\n class=\"block h-full w-full touch-none overflow-visible\"\n role=\"img\"\n [attr.aria-label]=\"label()\"\n [attr.height]=\"effectiveHeight()\"\n [attr.tabindex]=\"sparkline() ? null : 0\"\n [attr.viewBox]=\"'0 0 ' + effectiveWidth() + ' ' + effectiveHeight()\"\n [attr.width]=\"effectiveWidth()\"\n (keydown)=\"onKeydown($event)\"\n (pointercancel)=\"onPointerLeave()\"\n (pointerdown)=\"onPointerMove($event)\"\n (pointerleave)=\"onPointerLeave()\"\n (pointermove)=\"onPointerMove($event)\"\n >\n @if (shown(); as shape) {\n <path\n #lineRef\n class=\"stroke-(--foreground)\"\n data-chart-line\n fill=\"none\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [attr.d]=\"shape.line\"\n [attr.stroke-width]=\"sparkline() ? 1.5 : 2\"\n />\n\n @if (!sparkline()) {\n <line\n class=\"stroke-(--border) transition-opacity ease-(--ease-out)\"\n data-chart-start-line\n stroke-dasharray=\"3 4\"\n stroke-width=\"1\"\n x1=\"0\"\n [attr.x2]=\"effectiveWidth()\"\n [attr.y1]=\"shape.start.y\"\n [attr.y2]=\"shape.start.y\"\n [class]=\"startFade()\"\n />\n\n @if (startLabelInfo(); as info) {\n <text\n class=\"text-caption fill-(--subtle-foreground) tabular-nums transition-opacity ease-(--ease-out)\"\n data-chart-start-label\n [attr.text-anchor]=\"info.placement.anchor\"\n [attr.x]=\"info.placement.x\"\n [attr.y]=\"info.placement.y\"\n [class]=\"startFade()\"\n >\n {{ info.label }}\n </text>\n }\n\n <circle\n #endRef\n class=\"fill-(--foreground) stroke-(--card) [paint-order:stroke]\"\n data-chart-end\n r=\"4\"\n stroke-width=\"6\"\n [attr.cx]=\"shape.end.x\"\n [attr.cy]=\"shape.end.y\"\n />\n\n @for (tick of ticks(); track tick.t; let index = $index; let first = $first; let last = $last) {\n @if (tickTexts()[index]; as label) {\n <text\n class=\"text-caption fill-(--subtle-foreground) tabular-nums\"\n data-chart-axis-tick\n [attr.text-anchor]=\"first ? 'start' : last ? 'end' : 'middle'\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"effectiveHeight() - 4\"\n [class]=\"label.classes\"\n >\n {{ label.text }}\n </text>\n }\n }\n\n @if (active(); as point) {\n <line\n class=\"stroke-(--border)\"\n data-chart-crosshair\n stroke-width=\"1\"\n y1=\"0\"\n [attr.x1]=\"point.x\"\n [attr.x2]=\"point.x\"\n [attr.y2]=\"plotHeight()\"\n />\n <circle\n class=\"fill-(--foreground) stroke-(--card) [paint-order:stroke]\"\n data-chart-active\n r=\"5\"\n stroke-width=\"6\"\n [attr.cx]=\"point.x\"\n [attr.cy]=\"point.y\"\n />\n }\n }\n }\n </svg>\n\n @if (active(); as point) {\n <div\n class=\"rounded-container pointer-events-none absolute bg-(--elevated) py-2 whitespace-nowrap [font-variant-numeric:var(--numeric)] shadow-[0_4px_16px_rgb(0_0_0/0.12),inset_0_0_0_1px_var(--border)]\"\n data-testid=\"chart-tooltip\"\n role=\"status\"\n [class]=\"tooltipClasses().box\"\n [style]=\"tooltipStyle(point)\"\n >\n <p class=\"font-medium text-(--foreground)\" [class]=\"tooltipClasses().value\">\n {{ tooltipFormat()?.(point) ?? valueFormat()(point.v) }}\n </p>\n @if (tooltipDelta()) {\n <p data-chart-delta [class]=\"deltaClasses(point)\">\n {{ deltaFormat()(deltaFor(point)) }}{{ spacedDeltaSuffix() }}\n </p>\n }\n <p class=\"text-caption text-(--subtle-foreground)\" data-chart-date>{{ timeFormat()(point.t) }}</p>\n </div>\n }\n @if (points().length > 0) {\n <div class=\"sr-only\">\n <table>\n <caption [textContent]=\"label()\"></caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ timeColumnLabel() }}</th>\n <th scope=\"col\">{{ valueColumnLabel() }}</th>\n </tr>\n </thead>\n <tbody>\n @for (point of points(); track point.t) {\n <tr>\n <td>{{ timeFormat()(point.t) }}</td>\n <td>{{ valueFormat()(point.v) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n `,\n host: {\n class: 'block h-full',\n },\n})\nexport class UiLineChart {\n readonly points = input.required<ChartPoint[]>();\n readonly label = input.required<string>();\n readonly valueFormat = input<(value: number) => string>(identityValue);\n readonly tooltipFormat = input<(point: ChartPoint) => string>();\n readonly deltaFormat = input<(delta: number) => string>(identityDelta);\n readonly deltaSuffix = input('');\n readonly timeFormat = input<(time: number) => string>(identityTime);\n readonly axisFormat = input<(time: number) => string>(identityTime);\n readonly startLabel = input('');\n readonly timeColumnLabel = input('Time');\n readonly valueColumnLabel = input('Value');\n readonly sparkline = input(false, { transform: booleanAttribute });\n readonly tooltip = input<'compact' | 'large' | 'auto'>('compact');\n readonly tooltipDelta = input(true, { transform: booleanAttribute });\n readonly axisGap = input<number | 'auto'>(12);\n readonly axisTicks = input<AxisTicks, AxisTicks | string>('auto', { transform: parseAxisTicks });\n readonly rangeKey = input<string | null>(null);\n\n #destroyRef = inject(DestroyRef);\n #host = inject<ElementRef<HTMLElement>>(ElementRef);\n #wide = wideViewport();\n #reducedMotion = injectReducedMotion();\n #motion = new ShapeMotion({\n hold: (geometry) => {\n this.held.set(geometry);\n this.activeIndex.update((index) => (geometry ? null : index));\n },\n draw: (line, end) => {\n this.lineRef()?.nativeElement.setAttribute('d', line);\n this.endRef()?.nativeElement.setAttribute('cx', String(end.x));\n this.endRef()?.nativeElement.setAttribute('cy', String(end.y));\n },\n });\n\n protected readonly svgRef = viewChild.required<PlotRef>('svgRef');\n protected readonly lineRef = viewChild<LineRef>('lineRef');\n protected readonly endRef = viewChild<EndRef>('endRef');\n protected readonly activeIndex = signal<number | null>(null);\n protected readonly held = signal<ChartGeometry | null>(null);\n protected readonly measuredSize = signal<{ width: number; height: number } | null>(null);\n\n protected readonly spacedDeltaSuffix = computed(() => (this.deltaSuffix() ? ` ${this.deltaSuffix()}` : ''));\n\n protected readonly effectiveWidth = computed(() => this.measuredSize()?.width ?? DEFAULT_WIDTH);\n protected readonly effectiveHeight = computed(() => this.measuredSize()?.height ?? DEFAULT_HEIGHT);\n\n protected readonly plotHeight = computed(() =>\n plotHeightFor(this.effectiveHeight(), this.sparkline(), this.axisGap(), this.#wide()),\n );\n\n protected readonly tooltipStyle = (point: PlottedPoint): string => tooltipPlacement(point.x / this.effectiveWidth());\n\n protected readonly tooltipClasses = computed(() => tooltipClassesFor(this.tooltip(), this.#wide()));\n\n protected readonly geometry = computed(() => {\n const plotHeight = this.plotHeight();\n const padding = plotPaddingFor(plotHeight, this.sparkline());\n\n return buildGeometry(this.points(), this.effectiveWidth(), plotHeight, { x: 0, top: padding, bottom: padding });\n });\n\n protected readonly shown = computed(() => this.held() ?? this.geometry());\n\n protected readonly startFade = computed(() =>\n this.held() ? 'opacity-0 duration-(--duration-exit)' : 'duration-(--duration-fast)',\n );\n\n protected readonly ticks = computed(() => axisTicks(this.geometry()!.points));\n\n protected readonly tickTexts = computed(() => tickLabels(this.ticks(), this.axisFormat(), this.axisTicks()));\n\n protected readonly active = computed<PlottedPoint | null>(() => {\n const geometry = this.geometry();\n const index = this.activeIndex();\n\n return geometry && index !== null && !this.held() ? (geometry.points[index] as PlottedPoint) : null;\n });\n\n protected readonly startLabelInfo = computed(() => {\n const text = this.startLabel();\n const geometry = this.shown();\n\n if (!text || !geometry) {\n return null;\n }\n\n const label = `${text} ${this.valueFormat()(geometry.points[0]!.v)}`;\n const size = { width: label.length * 0.56 * 12 + 8, height: START_LABEL_HEIGHT };\n const placement = placeStartLabel(\n geometry.points,\n geometry.start.y,\n { width: this.effectiveWidth(), height: this.plotHeight() },\n size,\n );\n\n return { label, placement: { ...placement, y: startLabelBaseline(placement.y) } };\n });\n\n #renderRef = afterNextRender(() => {\n this.#destroyRef.onDestroy(() => this.#renderRef.destroy());\n observeSize(this.svgRef().nativeElement, this.#destroyRef, (size) => this.measuredSize.set(size));\n });\n\n constructor() {\n effect(() => {\n const points = this.points();\n const geometry = this.geometry();\n const reduced = this.#reducedMotion();\n\n untracked(() =>\n this.#motion.follow(points, geometry, {\n reduced,\n rangeKey: this.rangeKey(),\n duration: () => durationFrom(getComputedStyle(this.#host.nativeElement).getPropertyValue('--duration-base')),\n }),\n );\n });\n\n this.#destroyRef.onDestroy(() => this.#motion.stop());\n }\n\n protected deltaFor(point: PlottedPoint): number {\n return point.v - this.points()[0]!.v;\n }\n\n protected deltaClasses(point: PlottedPoint): string {\n return `${this.tooltipClasses().delta} ${deltaTone(this.deltaFor(point))}`;\n }\n\n protected onPointerMove(event: PointerEvent): void {\n const geometry = this.geometry();\n\n if (this.sparkline() || !geometry || geometry.points.length === 0) {\n return;\n }\n\n const rect = this.svgRef().nativeElement.getBoundingClientRect();\n const ratio = rect.width === 0 ? 1 : this.effectiveWidth() / rect.width;\n const x = (event.clientX - rect.left) * ratio;\n\n this.activeIndex.set(nearestPointIndex(geometry.points, x));\n }\n\n protected onPointerLeave(): void {\n this.activeIndex.set(null);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const geometry = this.geometry();\n\n if (this.sparkline() || !geometry || geometry.points.length === 0) {\n return;\n }\n\n const navigation = navigateIndex(event.key, this.activeIndex(), geometry.points.length - 1);\n\n if (!navigation) {\n return;\n }\n\n if (navigation.preventDefault) {\n event.preventDefault();\n }\n\n this.activeIndex.set(navigation.index);\n }\n}\n"],"mappings":"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"}
|