sk-chart-duo 0.1.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/LICENSE +21 -0
- package/README.md +156 -0
- package/dist/index.cjs +1310 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +520 -0
- package/dist/index.d.ts +520 -0
- package/dist/index.js +1272 -0
- package/dist/index.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/exporter.ts","../src/core/chart-base.ts","../src/core/svg-renderer.ts","../src/charts/fold-bar/geometry.ts","../src/theme/default-theme.ts","../src/theme/presets.ts","../src/charts/fold-bar/defaults.ts","../src/charts/fold-bar/interaction.ts","../src/charts/fold-bar/defs-builder.ts","../src/charts/fold-bar/render.ts","../src/charts/fold-bar/index.ts","../src/scale/linear-scale.ts","../src/scale/power-scale.ts","../src/scale/band-scale.ts"],"sourcesContent":["export const VERSION = '0.1.0';\r\n\r\nexport { ChartBase } from './core/chart-base';\r\nexport type { DownloadOptions, ExportOptions } from './core/exporter';\r\nexport type { BaseConfig, ChartEventMap, ColumnEventPayload, ContainerLike } from './core/types';\r\n\r\nexport { FoldBarChart } from './charts/fold-bar';\r\nexport { defaultTooltipFormatter, defaultValueFormat, niceScale } from './charts/fold-bar/defaults';\r\nexport type { FoldBarOptions, FoldBarModel, NiceScale } from './charts/fold-bar/defaults';\r\nexport type {\r\n FoldBarAxisConfig,\r\n FoldBarChartConfig,\r\n FoldBarDatum,\r\n FoldBarFoldConfig,\r\n FoldBarScaleConfig,\r\n FoldBarStateConfig,\r\n FoldBarStyleConfig,\r\n FoldBarTitleConfig,\r\n FoldBarTooltipConfig,\r\n FoldBarXAxisConfig,\r\n FoldBarXAxisTitleConfig,\r\n ThemeRef,\r\n TooltipFormatter,\r\n TooltipPart,\r\n TooltipTone,\r\n XAxisBottomFormatter,\r\n XAxisLabelFormatter,\r\n} from './charts/fold-bar/types';\r\nexport type {\r\n BarGeometry,\r\n FlapGeometry,\r\n FoldBarLayout,\r\n Padding,\r\n PillGeometry,\r\n PlotRect,\r\n RectGeometry,\r\n} from './charts/fold-bar/geometry';\r\nexport { registerTheme, getTheme, isThemePack } from './theme/presets';\r\nexport type { ThemePack, ThemeFormats } from './theme/presets';\r\nexport type {\r\n DeepPartialTokens,\r\n FoldBarThemeTokens,\r\n ResolvedFoldBarStyle,\r\n} from './theme/default-theme';\r\n\r\nexport { createLinearScale } from './scale/linear-scale';\r\nexport type { ScaleOptions } from './scale/linear-scale';\r\nexport { createPowerScale } from './scale/power-scale';\r\nexport type { PowerScaleOptions } from './scale/power-scale';\r\nexport { createBandScale } from './scale/band-scale';\r\nexport type { BandScale } from './scale/band-scale';\r\n","export interface ExportOptions {\r\n /** 'png' rasterizes through a canvas; 'svg' returns the vector markup as a data URL. */\r\n type?: 'png' | 'svg';\r\n /** Pixel-density multiplier for PNG output. */\r\n scale?: number;\r\n /** Canvas backdrop painted before drawing the SVG; omit for transparency. */\r\n background?: string;\r\n}\r\n\r\nexport interface DownloadOptions extends ExportOptions {\r\n filename?: string;\r\n}\r\n\r\n/** Standalone SVG markup: explicit pixel size + xmlns so the string renders anywhere. */\r\nexport function svgToMarkup(svg: SVGSVGElement): string {\r\n const clone = svg.cloneNode(true) as SVGSVGElement;\r\n const size = viewBoxSize(svg);\r\n if (size) {\r\n clone.setAttribute('width', String(size.width));\r\n clone.setAttribute('height', String(size.height));\r\n }\r\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n return new XMLSerializer().serializeToString(clone);\r\n}\r\n\r\nexport function svgToDataUrl(svg: SVGSVGElement): string {\r\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgToMarkup(svg))}`;\r\n}\r\n\r\nexport async function svgToPngDataUrl(\r\n svg: SVGSVGElement,\r\n scale = 2,\r\n background?: string,\r\n): Promise<string> {\r\n const size = viewBoxSize(svg) ?? { width: svg.clientWidth, height: svg.clientHeight };\r\n if (!size.width || !size.height) throw new Error('sk-chart: cannot measure SVG for raster export');\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.round(size.width * scale);\r\n canvas.height = Math.round(size.height * scale);\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) throw new Error('sk-chart: canvas 2d context unavailable');\r\n\r\n const url = URL.createObjectURL(new Blob([svgToMarkup(svg)], { type: 'image/svg+xml;charset=utf-8' }));\r\n try {\r\n const image = await loadImage(url);\r\n if (background) {\r\n ctx.fillStyle = background;\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n }\r\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n return canvas.toDataURL('image/png');\r\n } finally {\r\n URL.revokeObjectURL(url);\r\n }\r\n}\r\n\r\nfunction viewBoxSize(svg: SVGSVGElement): { width: number; height: number } | null {\r\n const [, , w, h] = (svg.getAttribute('viewBox') ?? '').split(/[\\s,]+/).map(Number);\r\n return Number.isFinite(w) && Number.isFinite(h) && w > 0 && h > 0 ? { width: w, height: h } : null;\r\n}\r\n\r\nfunction loadImage(url: string): Promise<HTMLImageElement> {\r\n return new Promise((resolve, reject) => {\r\n const image = new Image();\r\n image.onload = () => resolve(image);\r\n image.onerror = () => reject(new Error('sk-chart: failed to rasterize SVG'));\r\n image.src = url;\r\n });\r\n}\r\n\r\nexport function triggerDownload(href: string, filename: string): void {\r\n const anchor = document.createElement('a');\r\n anchor.href = href;\r\n anchor.download = filename;\r\n document.body.appendChild(anchor);\r\n anchor.click();\r\n anchor.remove();\r\n}\r\n","import {\r\n svgToDataUrl,\r\n svgToMarkup,\r\n svgToPngDataUrl,\r\n triggerDownload,\r\n type DownloadOptions,\r\n type ExportOptions,\r\n} from './exporter';\r\nimport type { BaseConfig, ChartEventMap, ContainerLike } from './types';\r\n\r\n// Handler erasure point: concrete payload types are enforced at the on/off/emit boundary.\r\ntype AnyHandler = (payload: any) => void;\r\n\r\n/**\r\n * Shared lifecycle for all chart classes: container resolution, config merge,\r\n * full-rebuild update/resize, event bus and teardown.\r\n *\r\n * E is the chart-type-specific event map, so each chart declares its own events\r\n * without touching core.\r\n */\r\nexport abstract class ChartBase<\r\n C extends BaseConfig,\r\n E extends object = ChartEventMap,\r\n> {\r\n protected container: HTMLElement;\r\n protected config: C;\r\n protected svg: SVGSVGElement | null = null;\r\n private handlers = new Map<string, Set<AnyHandler>>();\r\n private destroyed = false;\r\n\r\n constructor(container: ContainerLike, config: C) {\r\n const element =\r\n typeof container === 'string' ? document.querySelector<HTMLElement>(container) : container;\r\n if (!element) {\r\n throw new Error(`sk-chart: container \"${String(container)}\" not found`);\r\n }\r\n this.container = element;\r\n this.config = config;\r\n }\r\n\r\n get isDestroyed(): boolean {\r\n return this.destroyed;\r\n }\r\n\r\n on<K extends keyof E & string>(event: K, handler: (payload: E[K]) => void): this {\r\n if (this.destroyed) return this;\r\n const set = this.handlers.get(event) ?? new Set<AnyHandler>();\r\n this.handlers.set(event, set);\r\n set.add(handler as AnyHandler);\r\n return this;\r\n }\r\n\r\n off<K extends keyof E & string>(event: K, handler: (payload: E[K]) => void): this {\r\n this.handlers.get(event)?.delete(handler as AnyHandler);\r\n return this;\r\n }\r\n\r\n protected emit<K extends keyof E & string>(event: K, payload: E[K]): void {\r\n this.handlers.get(event)?.forEach((handler) => handler(payload));\r\n }\r\n\r\n /** Merges the partial config and rebuilds the chart. */\r\n update(config: Partial<C>): void {\r\n if (this.destroyed) return;\r\n this.config = { ...this.config, ...config };\r\n this.renderChart();\r\n }\r\n\r\n /** Changes the viewBox design space and rebuilds (userSpaceOnUse coordinates depend on it). */\r\n resize(width: number, height: number): void {\r\n this.update({ width, height } as Partial<C>);\r\n }\r\n\r\n /** Standalone SVG markup (embedded style + defs included), renderable as-is. */\r\n toSVGString(): string {\r\n return svgToMarkup(this.requireSvg());\r\n }\r\n\r\n /** Data URL of the current chart; PNG is rasterized through canvas at `scale` (default 2x). */\r\n async getDataURL(options: ExportOptions = {}): Promise<string> {\r\n const { type = 'png', scale = 2, background } = options;\r\n const svg = this.requireSvg();\r\n return type === 'svg' ? svgToDataUrl(svg) : svgToPngDataUrl(svg, scale, background);\r\n }\r\n\r\n /** Triggers a browser download of the chart, PNG at 2x by default. */\r\n async download(options: DownloadOptions = {}): Promise<void> {\r\n const { filename = 'sk-chart', type = 'png', scale, background } = options;\r\n const url = await this.getDataURL({ type, scale, background });\r\n triggerDownload(url, `${filename}.${type}`);\r\n }\r\n\r\n private requireSvg(): SVGSVGElement {\r\n if (this.destroyed || !this.svg) throw new Error('sk-chart: chart is not rendered');\r\n return this.svg;\r\n }\r\n\r\n destroy(): void {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n this.onDestroy();\r\n this.svg?.remove();\r\n this.svg = null;\r\n this.handlers.clear();\r\n }\r\n\r\n /** Subclasses build (or rebuild) the SVG and attach it to the container. */\r\n protected abstract renderChart(): void;\r\n\r\n /** Subclass teardown hook, called before the SVG is removed. */\r\n protected onDestroy(): void {}\r\n}\r\n","export const SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\nexport function createSvgElement<K extends keyof SVGElementTagNameMap>(\r\n tag: K,\r\n attrs: Record<string, string | number> = {},\r\n): SVGElementTagNameMap[K] {\r\n const node = document.createElementNS(SVG_NS, tag);\r\n for (const [key, value] of Object.entries(attrs)) {\r\n node.setAttribute(key, String(value));\r\n }\r\n return node;\r\n}\r\n\r\nexport type GradientStop = readonly [offset: number, color: string];\r\n\r\nexport function addStops<T extends SVGElement>(gradient: T, stops: readonly GradientStop[]): T {\r\n for (const [offset, color] of stops) {\r\n gradient.appendChild(createSvgElement('stop', { offset, 'stop-color': color }));\r\n }\r\n return gradient;\r\n}\r\n\r\nlet uidCounter = 0;\r\n\r\n/** Per-instance unique prefix isolating SVG defs ids and class names across chart instances. */\r\nexport function createUid(prefix = 'skc'): string {\r\n uidCounter += 1;\r\n return `${prefix}${uidCounter.toString(36)}${Math.random().toString(36).slice(2, 7)}`;\r\n}\r\n\r\nexport function scopedId(uid: string, name: string): string {\r\n return `${uid}-${name}`;\r\n}\r\n\r\nexport function urlRef(uid: string, name: string): string {\r\n return `url(#${scopedId(uid, name)})`;\r\n}\r\n\r\nexport function clearElement(node: Element): void {\r\n while (node.firstChild) {\r\n node.removeChild(node.firstChild);\r\n }\r\n}\r\n","export interface Padding {\r\n top: number;\r\n right: number;\r\n bottom: number;\r\n left: number;\r\n}\r\n\r\nexport interface FoldBarLayoutInput {\r\n /** viewBox design-space width. */\r\n width: number;\r\n /** viewBox design-space height. */\r\n height: number;\r\n padding: Padding;\r\n /** Distance from plot bottom up to the bar top of a zero value. */\r\n stairBottomOffset: number;\r\n /** Distance from plot top down to the tallest bar's top. */\r\n stairTopOffset: number;\r\n /** Horizontal run reserved for the paper fold between columns. */\r\n foldRun: number;\r\n /** Gap between a bar and its fold zone. */\r\n barGap: number;\r\n /** Power applied to normalized values when mapping to bar height. */\r\n exponent: number;\r\n /** Axis domain maximum; bars normalize against it so ticks map truthfully. */\r\n domainMax: number;\r\n values: number[];\r\n}\r\n\r\nexport interface PlotRect {\r\n left: number;\r\n right: number;\r\n top: number;\r\n bottom: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface FoldBarLayout {\r\n plot: PlotRect;\r\n count: number;\r\n colWidth: number;\r\n barWidth: number;\r\n /** Bar top y when value is 0. */\r\n stairBase: number;\r\n /** Bar top y of the domain maximum (top tick). */\r\n stairTop: number;\r\n /** Maximum data value. */\r\n maxValue: number;\r\n /** Axis domain maximum the bars normalize against. */\r\n domainMax: number;\r\n barTopOf: (value: number) => number;\r\n}\r\n\r\nexport function computeLayout(input: FoldBarLayoutInput): FoldBarLayout {\r\n const left = input.padding.left;\r\n const right = input.width - input.padding.right;\r\n const top = input.padding.top;\r\n const bottom = input.height - input.padding.bottom;\r\n const count = input.values.length;\r\n const colWidth = count > 0 ? (right - left) / count : 0;\r\n const barWidth = colWidth - input.foldRun - input.barGap;\r\n const stairBase = bottom - input.stairBottomOffset;\r\n const stairTop = top + input.stairTopOffset;\r\n const maxValue = count > 0 ? Math.max(...input.values) : 0;\r\n const domainMax = Math.max(input.domainMax, maxValue);\r\n const span = stairBase - stairTop;\r\n\r\n const barTopOf = (value: number): number => {\r\n if (domainMax <= 0) return stairBase;\r\n const t = Math.pow(Math.max(0, value / domainMax), input.exponent);\r\n return stairBase - t * span;\r\n };\r\n\r\n return {\r\n plot: { left, right, top, bottom, width: right - left, height: bottom - top },\r\n count,\r\n colWidth,\r\n barWidth,\r\n stairBase,\r\n stairTop,\r\n maxValue,\r\n domainMax,\r\n barTopOf,\r\n };\r\n}\r\n\r\nexport interface BarGeometry {\r\n /** Leading edge of the column band (hit area / grid line). */\r\n colStart: number;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n centerX: number;\r\n}\r\n\r\nexport function barGeometry(layout: FoldBarLayout, index: number, value: number): BarGeometry {\r\n const colStart = layout.plot.left + index * layout.colWidth;\r\n const x = colStart + 1;\r\n const y = layout.barTopOf(value);\r\n return {\r\n colStart,\r\n x,\r\n y,\r\n width: layout.barWidth,\r\n height: layout.plot.bottom - y,\r\n centerX: x + layout.barWidth / 2,\r\n };\r\n}\r\n\r\nexport interface FlapGeometry {\r\n /** SVG polygon points attribute. */\r\n points: string;\r\n /** Crease segment: from current bar top to next bar top. */\r\n crease: { x1: number; y1: number; x2: number; y2: number };\r\n /** y range for the userSpaceOnUse fold gradient. */\r\n gradientY: [number, number];\r\n}\r\n\r\n/** Fold flap connecting column index to column index+1. Null for the last column. */\r\nexport function flapGeometry(\r\n layout: FoldBarLayout,\r\n index: number,\r\n values: number[],\r\n): FlapGeometry | null {\r\n if (index >= values.length - 1) return null;\r\n const x0 = layout.plot.left + index * layout.colWidth + 1 + layout.barWidth;\r\n const x1 = layout.plot.left + (index + 1) * layout.colWidth + 2;\r\n const y0 = layout.barTopOf(values[index]);\r\n const y1 = layout.barTopOf(values[index + 1]);\r\n const bottom = layout.plot.bottom;\r\n return {\r\n points: `${x0},${y0} ${x1},${y1} ${x1},${bottom} ${x0},${bottom}`,\r\n crease: { x1: x0, y1: y0, x2: x1, y2: y1 },\r\n gradientY: [y0, bottom],\r\n };\r\n}\r\n\r\nexport interface PillOptions {\r\n width: number;\r\n height: number;\r\n rx: number;\r\n /** Offset of the pill top relative to the bar top. */\r\n offsetY: number;\r\n shadow: { width: number; height: number; rx: number; offsetY: number };\r\n}\r\n\r\nexport interface PillGeometry {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n rx: number;\r\n shadowX: number;\r\n shadowY: number;\r\n shadowWidth: number;\r\n shadowHeight: number;\r\n shadowRx: number;\r\n}\r\n\r\nexport function pillGeometry(\r\n centerX: number,\r\n barTop: number,\r\n pill: PillOptions,\r\n): PillGeometry {\r\n return {\r\n x: centerX - pill.width / 2,\r\n y: barTop + pill.offsetY,\r\n width: pill.width,\r\n height: pill.height,\r\n rx: pill.rx,\r\n shadowX: centerX - pill.shadow.width / 2,\r\n shadowY: barTop + pill.shadow.offsetY,\r\n shadowWidth: pill.shadow.width,\r\n shadowHeight: pill.shadow.height,\r\n shadowRx: pill.shadow.rx,\r\n };\r\n}\r\n\r\n/** Vertical grid line x positions: one per column boundary. */\r\nexport function gridLineXs(layout: FoldBarLayout): number[] {\r\n return Array.from({ length: layout.count + 1 }, (_, i) => layout.plot.left + i * layout.colWidth);\r\n}\r\n\r\nexport interface TooltipPlacementOptions {\r\n /** Horizontal anchor of the tooltip relative to bar width. */\r\n anchorRatio: number;\r\n /** Vertical offset of the tooltip top relative to the bar top (negative = above). */\r\n offsetY: number;\r\n /** The tooltip never moves above this y. */\r\n minY: number;\r\n}\r\n\r\nexport function tooltipPlacement(\r\n layout: FoldBarLayout,\r\n bar: BarGeometry,\r\n tipWidth: number,\r\n options: TooltipPlacementOptions,\r\n): { x: number; y: number } {\r\n const rawX = bar.x + bar.width * options.anchorRatio;\r\n const y = Math.max(bar.y + options.offsetY, options.minY);\r\n const { left, right } = layout.plot;\r\n // A tooltip wider than the plot is pinned to its left edge.\r\n const x = Math.min(Math.max(rawX, left), Math.max(left, right - tipWidth));\r\n return { x, y };\r\n}\r\n\r\nexport interface RectGeometry {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\n/** Full-column hover hit area. */\r\nexport function hitRect(layout: FoldBarLayout, index: number): RectGeometry {\r\n return {\r\n x: layout.plot.left + index * layout.colWidth,\r\n y: layout.plot.top,\r\n width: layout.colWidth,\r\n height: layout.plot.height,\r\n };\r\n}\r\n\r\n/** Wash backdrop above an active bar; height clamped to non-negative. */\r\nexport function washRect(bar: BarGeometry, washTop: number): RectGeometry {\r\n return {\r\n x: bar.x,\r\n y: washTop,\r\n width: bar.width,\r\n height: Math.max(0, bar.y - washTop),\r\n };\r\n}\r\n","import type { GradientStop } from '../core/svg-renderer';\r\nimport type {\r\n DropShadowStyle,\r\n FoldBarStyleConfig,\r\n PillStyle,\r\n StripePatternStyle,\r\n} from '../charts/fold-bar/types';\r\n\r\nexport interface ResolvedFoldBarStyle {\r\n stripePattern: StripePatternStyle;\r\n barGradientActive: GradientStop[];\r\n barGradientNormal: GradientStop[];\r\n foldGradient: GradientStop[];\r\n creaseGradient: GradientStop[];\r\n washTop: number;\r\n washGradient: GradientStop[];\r\n washEnabled: boolean;\r\n pill: PillStyle;\r\n shadow: DropShadowStyle;\r\n fadeMask: { start: number; end: number };\r\n fadeEnabled: boolean;\r\n labelY: number;\r\n numberY: number;\r\n labelXOffset: number;\r\n}\r\n\r\nexport interface FoldBarThemeTokens {\r\n fontFamily: string;\r\n title: { fill: string; fontSize: number; fontWeight: number; letterSpacing: string };\r\n axis: { fill: string; fontSize: number; fontWeight: number };\r\n label: { fill: string; activeFill: string; fontSize: number; fontWeight: number };\r\n number: {\r\n fill: string;\r\n activeFill: string;\r\n fontSize: number;\r\n fontWeight: number;\r\n letterSpacing: string;\r\n };\r\n grid: { stroke: string; strokeWidth: number };\r\n tooltip: {\r\n bg: string;\r\n stroke: string;\r\n fill: string;\r\n strongFill: string;\r\n softFill: string;\r\n fontSize: number;\r\n };\r\n transition: { state: string; tip: string };\r\n}\r\n\r\nconst BAR_GRADIENT_ACTIVE: GradientStop[] = [\r\n [0, '#2A2FC8'],\r\n [0.07, '#2A55E2'],\r\n [0.22, '#2C62EC'],\r\n [0.42, '#3184F7'],\r\n [0.62, '#77ABF5'],\r\n [0.82, '#C5DAF5'],\r\n [1, '#EAF1FA'],\r\n];\r\n\r\nconst BAR_GRADIENT_NORMAL: GradientStop[] = [\r\n [0, '#2B3AD6'],\r\n [0.07, '#2C60EC'],\r\n [0.22, '#2F76F2'],\r\n [0.42, '#4C93F8'],\r\n [0.62, '#87B5F6'],\r\n [0.82, '#CDDDF5'],\r\n [1, '#EBF2FA'],\r\n];\r\n\r\nconst DEFAULT_STYLE: ResolvedFoldBarStyle = {\r\n stripePattern: {\r\n enabled: true,\r\n size: 7.1,\r\n lineWidth: 2.1,\r\n lineColor: '#fff',\r\n lineOpacity: 0.93,\r\n rotation: 45,\r\n },\r\n barGradientActive: BAR_GRADIENT_ACTIVE,\r\n barGradientNormal: BAR_GRADIENT_NORMAL,\r\n foldGradient: [\r\n [0, '#8FB2F8'],\r\n [0.14, '#A6C2FA'],\r\n [0.38, '#C6DAFA'],\r\n [0.68, '#E6EDFB'],\r\n [1, '#F4F7FC'],\r\n ],\r\n creaseGradient: [\r\n [0, 'rgba(255,255,255,0)'],\r\n [0.18, 'rgba(255,255,255,.62)'],\r\n [0.55, 'rgba(255,255,255,.18)'],\r\n [1, 'rgba(255,255,255,0)'],\r\n ],\r\n washTop: 115,\r\n washGradient: [\r\n [0, 'rgba(222,240,254,0)'],\r\n [0.55, 'rgba(222,240,254,.55)'],\r\n [1, 'rgba(214,238,254,1)'],\r\n ],\r\n washEnabled: true,\r\n pill: {\r\n enabled: true,\r\n width: 26,\r\n height: 7,\r\n rx: 3.5,\r\n offsetY: -13,\r\n gradient: [\r\n [0, '#EFF7FF'],\r\n [0.45, '#BBD9FF'],\r\n [1, '#7FB2FF'],\r\n ],\r\n shadow: { width: 24, height: 1.4, rx: 0.7, offsetY: -7.5, color: '#4A78D8', opacity: 0.75 },\r\n },\r\n shadow: { dx: 0, dy: 3, blur: 5, color: '#1B3560', opacity: 0.14 },\r\n fadeMask: { start: 344, end: 360 },\r\n fadeEnabled: true,\r\n labelY: 85,\r\n numberY: 117,\r\n labelXOffset: 0,\r\n};\r\n\r\nexport const DEFAULT_THEME_TOKENS: FoldBarThemeTokens = {\r\n fontFamily:\r\n '-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Inter\",\"Helvetica Neue\",\"PingFang SC\",\"Microsoft YaHei\",Arial,sans-serif',\r\n title: { fill: '#14161F', fontSize: 21, fontWeight: 700, letterSpacing: '-0.2px' },\r\n axis: { fill: '#9AA1AC', fontSize: 11, fontWeight: 500 },\r\n label: { fill: '#C4CAD3', activeFill: '#242A36', fontSize: 11.5, fontWeight: 500 },\r\n number: {\r\n fill: '#C9CED6',\r\n activeFill: '#15181F',\r\n fontSize: 27,\r\n fontWeight: 600,\r\n letterSpacing: '-0.6px',\r\n },\r\n grid: { stroke: '#E9EBEF', strokeWidth: 1 },\r\n tooltip: {\r\n bg: '#fff',\r\n stroke: 'rgba(20,35,70,.07)',\r\n fill: '#79839A',\r\n strongFill: '#171B26',\r\n softFill: '#C3C8D4',\r\n fontSize: 10.5,\r\n },\r\n transition: { state: '.32s ease', tip: 'transform .34s cubic-bezier(.22,.61,.36,1)' },\r\n};\r\n\r\n/** Group-wise merge of two partial style configs; `top` wins over `base`. */\r\nexport function mergeStyleConfigs(\r\n base?: FoldBarStyleConfig,\r\n top?: FoldBarStyleConfig,\r\n): FoldBarStyleConfig | undefined {\r\n if (!base) return top;\r\n if (!top) return base;\r\n return {\r\n ...base,\r\n ...top,\r\n stripePattern: { ...base.stripePattern, ...top.stripePattern },\r\n barGradient: { ...base.barGradient, ...top.barGradient },\r\n pill: {\r\n ...base.pill,\r\n ...top.pill,\r\n shadow: { ...base.pill?.shadow, ...top.pill?.shadow },\r\n },\r\n shadow: { ...base.shadow, ...top.shadow },\r\n fadeMask: { ...base.fadeMask, ...top.fadeMask },\r\n };\r\n}\r\n\r\n/** Merges user style (over an optional pack base), then over the prototype-derived defaults. */\r\nexport function resolveStyle(\r\n style?: FoldBarStyleConfig,\r\n base?: FoldBarStyleConfig,\r\n): ResolvedFoldBarStyle {\r\n const merged = mergeStyleConfigs(base, style);\r\n if (!merged) return DEFAULT_STYLE;\r\n return {\r\n stripePattern: { ...DEFAULT_STYLE.stripePattern, ...merged.stripePattern },\r\n barGradientActive: merged.barGradient?.active ?? DEFAULT_STYLE.barGradientActive,\r\n barGradientNormal: merged.barGradient?.normal ?? DEFAULT_STYLE.barGradientNormal,\r\n foldGradient: merged.foldGradient ?? DEFAULT_STYLE.foldGradient,\r\n creaseGradient: merged.creaseGradient ?? DEFAULT_STYLE.creaseGradient,\r\n washTop: merged.washTop ?? DEFAULT_STYLE.washTop,\r\n washGradient: merged.washGradient ?? DEFAULT_STYLE.washGradient,\r\n washEnabled: merged.washEnabled ?? true,\r\n pill: {\r\n ...DEFAULT_STYLE.pill,\r\n ...merged.pill,\r\n gradient: merged.pill?.gradient ?? DEFAULT_STYLE.pill.gradient,\r\n shadow: { ...DEFAULT_STYLE.pill.shadow, ...merged.pill?.shadow },\r\n },\r\n shadow: { ...DEFAULT_STYLE.shadow, ...merged.shadow },\r\n fadeMask: { ...DEFAULT_STYLE.fadeMask, ...merged.fadeMask },\r\n fadeEnabled: merged.fadeMask?.enabled ?? true,\r\n labelY: merged.labelY ?? DEFAULT_STYLE.labelY,\r\n numberY: merged.numberY ?? DEFAULT_STYLE.numberY,\r\n labelXOffset: merged.labelXOffset ?? DEFAULT_STYLE.labelXOffset,\r\n };\r\n}\r\n\r\n/** Top-level optional theme override; nested token groups are partially overridable. */\r\nexport type DeepPartialTokens = {\r\n [K in keyof FoldBarThemeTokens]?: FoldBarThemeTokens[K] extends object\r\n ? Partial<FoldBarThemeTokens[K]>\r\n : FoldBarThemeTokens[K];\r\n};\r\n\r\n/** Group-wise merge of two partial token configs; `top` wins over `base`. */\r\nexport function mergeTokens(\r\n base?: DeepPartialTokens,\r\n top?: DeepPartialTokens,\r\n): DeepPartialTokens | undefined {\r\n if (!base) return top;\r\n if (!top) return base;\r\n return {\r\n fontFamily: top.fontFamily ?? base.fontFamily,\r\n title: { ...base.title, ...top.title },\r\n axis: { ...base.axis, ...top.axis },\r\n label: { ...base.label, ...top.label },\r\n number: { ...base.number, ...top.number },\r\n grid: { ...base.grid, ...top.grid },\r\n tooltip: { ...base.tooltip, ...top.tooltip },\r\n transition: { ...base.transition, ...top.transition },\r\n };\r\n}\r\n\r\n/** Merges partial theme tokens over the defaults, group by group. */\r\nexport function resolveTokens(theme?: DeepPartialTokens): FoldBarThemeTokens {\r\n if (!theme) return DEFAULT_THEME_TOKENS;\r\n return {\r\n fontFamily: theme.fontFamily ?? DEFAULT_THEME_TOKENS.fontFamily,\r\n title: { ...DEFAULT_THEME_TOKENS.title, ...theme.title },\r\n axis: { ...DEFAULT_THEME_TOKENS.axis, ...theme.axis },\r\n label: { ...DEFAULT_THEME_TOKENS.label, ...theme.label },\r\n number: { ...DEFAULT_THEME_TOKENS.number, ...theme.number },\r\n grid: { ...DEFAULT_THEME_TOKENS.grid, ...theme.grid },\r\n tooltip: { ...DEFAULT_THEME_TOKENS.tooltip, ...theme.tooltip },\r\n transition: { ...DEFAULT_THEME_TOKENS.transition, ...theme.transition },\r\n };\r\n}\r\n\r\n/** Scoped stylesheet embedded inside each chart's SVG, isolating instances from each other. */\r\nexport function buildScopedCss(uid: string, tokens: FoldBarThemeTokens): string {\r\n const c = (name: string) => `.${uid}-${name}`;\r\n return [\r\n `${c('root')}{display:block;width:100%;height:auto;font-family:${tokens.fontFamily}}`,\r\n `${c('title')}{font-size:${tokens.title.fontSize}px;font-weight:${tokens.title.fontWeight};fill:${tokens.title.fill};letter-spacing:${tokens.title.letterSpacing}}`,\r\n `${c('axis')}{font-size:${tokens.axis.fontSize}px;font-weight:${tokens.axis.fontWeight};fill:${tokens.axis.fill};font-variant-numeric:tabular-nums}`,\r\n `${c('lbl')}{font-size:${tokens.label.fontSize}px;font-weight:${tokens.label.fontWeight};fill:${tokens.label.fill};transition:fill .3s ease}`,\r\n `${c('num')}{font-size:${tokens.number.fontSize}px;font-weight:${tokens.number.fontWeight};fill:${tokens.number.fill};letter-spacing:${tokens.number.letterSpacing};font-variant-numeric:tabular-nums;transition:fill .3s ease}`,\r\n `${c('col')}.${uid}-active ${c('lbl')}{fill:${tokens.label.activeFill}}`,\r\n `${c('col')}.${uid}-active ${c('num')}{fill:${tokens.number.activeFill}}`,\r\n `${c('stripes')}{opacity:1;transition:opacity ${tokens.transition.state}}`,\r\n `${c('col')}.${uid}-active ${c('stripes')}{opacity:0}`,\r\n `${c('wash')}{opacity:0;transition:opacity ${tokens.transition.state}}`,\r\n `${c('col')}.${uid}-active ${c('wash')}{opacity:1}`,\r\n `${c('hit')}{fill:transparent;cursor:pointer}`,\r\n `${c('tip')}{transition:${tokens.transition.tip};pointer-events:none}`,\r\n `${c('tip')} text{font-size:${tokens.tooltip.fontSize}px;font-weight:400;fill:${tokens.tooltip.fill};font-variant-numeric:tabular-nums}`,\r\n `${c('tip')} ${c('b')}{font-weight:700;fill:${tokens.tooltip.strongFill}}`,\r\n `${c('tip')} ${c('s')}{fill:${tokens.tooltip.softFill}}`,\r\n `@media (prefers-reduced-motion: reduce){${c('lbl')},${c('num')},${c('stripes')},${c('wash')},${c('tip')}{transition:none}}`,\r\n ].join('\\n');\r\n}\r\n","import type { FoldBarStyleConfig } from '../charts/fold-bar/types';\r\nimport type { DeepPartialTokens } from './default-theme';\r\n\r\nexport interface ThemeFormats {\r\n valueFormat?: (value: number) => string;\r\n tickFormat?: (value: number) => string;\r\n}\r\n\r\n/** A theme bundle: visual style, typography tokens and default formatters. */\r\nexport interface ThemePack {\r\n style?: FoldBarStyleConfig;\r\n tokens?: DeepPartialTokens;\r\n formats?: ThemeFormats;\r\n}\r\n\r\n/** Runtime type guard: pack keys are disjoint from DeepPartialTokens keys. */\r\nexport function isThemePack(value: object): value is ThemePack {\r\n return 'style' in value || 'tokens' in value || 'formats' in value;\r\n}\r\n\r\nconst registry = new Map<string, ThemePack>();\r\n\r\n/** Registers (or replaces) a named theme pack usable via `config.theme`. */\r\nexport function registerTheme(name: string, pack: ThemePack): void {\r\n registry.set(name, pack);\r\n}\r\n\r\nexport function getTheme(name: string): ThemePack | undefined {\r\n return registry.get(name);\r\n}\r\n\r\nconst DARK_STYLE: FoldBarStyleConfig = {\r\n barGradient: {\r\n normal: [\r\n [0, '#5B8CFF'],\r\n [0.07, '#4A7AF2'],\r\n [0.22, '#3E68DE'],\r\n [0.42, '#3255C2'],\r\n [0.62, '#27408F'],\r\n [0.82, '#1B2C5E'],\r\n [1, '#111B3A'],\r\n ],\r\n active: [\r\n [0, '#7BA2FF'],\r\n [0.07, '#6A93F8'],\r\n [0.22, '#5A80E8'],\r\n [0.42, '#4A6ACC'],\r\n [0.62, '#38529E'],\r\n [0.82, '#263868'],\r\n [1, '#172142'],\r\n ],\r\n },\r\n foldGradient: [\r\n [0, '#3A4E7E'],\r\n [0.14, '#334572'],\r\n [0.38, '#2A3A60'],\r\n [0.68, '#1F2C4C'],\r\n [1, '#18223C'],\r\n ],\r\n creaseGradient: [\r\n [0, 'rgba(255,255,255,0)'],\r\n [0.18, 'rgba(255,255,255,.28)'],\r\n [0.55, 'rgba(255,255,255,.10)'],\r\n [1, 'rgba(255,255,255,0)'],\r\n ],\r\n stripePattern: { lineColor: '#6E86B8', lineOpacity: 0.16 },\r\n washGradient: [\r\n [0, 'rgba(96,146,255,0)'],\r\n [0.55, 'rgba(96,146,255,.24)'],\r\n [1, 'rgba(84,130,250,.48)'],\r\n ],\r\n pill: {\r\n gradient: [\r\n [0, '#4E669E'],\r\n [0.45, '#3A507F'],\r\n [1, '#2A3B61'],\r\n ],\r\n shadow: { color: '#000814', opacity: 0.8 },\r\n },\r\n shadow: { color: '#000000', opacity: 0.5 },\r\n};\r\n\r\nconst DARK_TOKENS: DeepPartialTokens = {\r\n title: { fill: '#F1F5FC' },\r\n axis: { fill: '#5D6880' },\r\n label: { fill: '#4E5871', activeFill: '#F1F5FC' },\r\n number: { fill: '#566179', activeFill: '#FFFFFF' },\r\n grid: { stroke: '#222C42' },\r\n tooltip: {\r\n bg: '#1A2236',\r\n stroke: 'rgba(255,255,255,.10)',\r\n fill: '#93A0BC',\r\n strongFill: '#FFFFFF',\r\n softFill: '#46536F',\r\n },\r\n};\r\n\r\nregisterTheme('light', {});\r\nregisterTheme('dark', { style: DARK_STYLE, tokens: DARK_TOKENS });\r\n","import type { Padding } from './geometry';\r\nimport { barGeometry, computeLayout, flapGeometry, type BarGeometry, type FlapGeometry, type FoldBarLayout } from './geometry';\r\nimport {\r\n mergeTokens,\r\n resolveStyle,\r\n resolveTokens,\r\n type DeepPartialTokens,\r\n type FoldBarThemeTokens,\r\n type ResolvedFoldBarStyle,\r\n} from '../../theme/default-theme';\r\nimport { getTheme, isThemePack, type ThemePack } from '../../theme/presets';\r\nimport type {\r\n FoldBarChartConfig,\r\n FoldBarDatum,\r\n ThemeRef,\r\n TooltipFormatter,\r\n TooltipPart,\r\n XAxisBottomFormatter,\r\n XAxisLabelFormatter,\r\n} from './types';\r\n\r\nexport interface FoldBarOptions {\r\n width: number;\r\n height: number;\r\n xField: string;\r\n yField: string;\r\n valueFormat: (value: number) => string;\r\n ariaLabel: string;\r\n padding: Padding;\r\n stair: { bottomOffset: number; topOffset: number };\r\n scale: { exponent: number };\r\n fold: { run: number; creaseColor: string; creaseWidth: number };\r\n axis: {\r\n ticks: number[];\r\n tickFormat: (value: number) => string;\r\n /** Axis domain maximum; bars normalize against it so ticks map truthfully. */\r\n domainMax: number;\r\n };\r\n xAxis: {\r\n labelFormat: XAxisLabelFormatter;\r\n bottomLabels?: XAxisBottomFormatter;\r\n title: { text: string; x?: number; y?: number };\r\n showLine: boolean;\r\n showTick: boolean;\r\n showGrid: boolean;\r\n };\r\n tooltip: {\r\n enabled: boolean;\r\n formatter: TooltipFormatter;\r\n height: number;\r\n radius: number;\r\n paddingX: number;\r\n anchorRatio: number;\r\n offsetY: number;\r\n minY: number;\r\n fixedWidth?: number;\r\n };\r\n state: { defaultActive: number };\r\n title: { text: string; x: number; y: number };\r\n style: ResolvedFoldBarStyle;\r\n tokens: FoldBarThemeTokens;\r\n}\r\n\r\n/** Default header value formatter, matching the prototype's `65.2k` labels. */\r\nexport const defaultValueFormat = (value: number): string => `${value.toFixed(1)}k`;\r\n\r\n/** Neutral default tooltip: category label plus formatted value. */\r\nexport function defaultTooltipFormatter(datum: FoldBarDatum): TooltipPart[] {\r\n return [\r\n { text: `${datum.label} `, tone: 'n' },\r\n { text: defaultValueFormat(datum.value), tone: 'b' },\r\n ];\r\n}\r\n\r\nexport interface NiceScale {\r\n /** Nice axis maximum; bars normalize against it. */\r\n axisMax: number;\r\n step: number;\r\n /** Nice tick values in descending order (topmost first), zero excluded. */\r\n ticks: number[];\r\n}\r\n\r\nfunction cleanNumber(value: number): number {\r\n return Number(value.toPrecision(12));\r\n}\r\n\r\n/** d3-style nice tick generation: step = multiplier × 10^power, keeping at most targetCount top ticks. */\r\nexport function niceScale(maxValue: number, targetCount = 5): NiceScale {\r\n if (!Number.isFinite(maxValue) || maxValue <= 0) return { axisMax: 0, step: 0, ticks: [] };\r\n const rawStep = maxValue / targetCount;\r\n const power = Math.floor(Math.log10(rawStep));\r\n const base = Math.pow(10, power);\r\n const error = rawStep / base;\r\n const multiplier =\r\n error >= Math.sqrt(50) ? 10 : error >= Math.sqrt(10) ? 5 : error >= Math.SQRT2 ? 2 : 1;\r\n const step = cleanNumber(multiplier * base);\r\n const axisMax = cleanNumber(Math.ceil(maxValue / step - 1e-9) * step);\r\n const intervalCount = Math.round(axisMax / step);\r\n const ascending = Array.from({ length: intervalCount }, (_, i) => cleanNumber((i + 1) * step));\r\n return { axisMax, step, ticks: ascending.slice(-targetCount).reverse() };\r\n}\r\n\r\n/** Maps config.theme (preset name | inline pack | legacy tokens partial) to merge layers. */\r\nfunction resolveThemeRef(theme?: ThemeRef): { pack?: ThemePack; userTokens?: DeepPartialTokens } {\r\n if (!theme) return {};\r\n if (typeof theme === 'string') {\r\n const pack = getTheme(theme);\r\n if (!pack) console.warn(`sk-chart: unknown theme \"${theme}\"; falling back to defaults`);\r\n return { pack: pack ?? {} };\r\n }\r\n if (isThemePack(theme)) return { pack: theme };\r\n return { userTokens: theme };\r\n}\r\n\r\nexport function resolveOptions(config: FoldBarChartConfig): FoldBarOptions {\r\n const width = config.width ?? 860;\r\n const height = config.height ?? 386;\r\n const yField = config.yField ?? 'value';\r\n const maxValue = config.data.reduce((max, d) => Math.max(max, Number(d[yField]) || 0), 0);\r\n const rawExponent = config.scale?.exponent ?? 1;\r\n let exponent = rawExponent;\r\n if (!Number.isFinite(exponent) || exponent <= 0) {\r\n console.warn(`sk-chart: invalid scale.exponent ${rawExponent}; falling back to 1`);\r\n exponent = 1;\r\n }\r\n const requestedActive = config.state?.defaultActive ?? config.data.length - 1;\r\n const defaultActive = Math.min(\r\n Math.max(requestedActive, -1),\r\n Math.max(0, config.data.length - 1),\r\n );\r\n const { pack, userTokens } = resolveThemeRef(config.theme);\r\n const tokens = resolveTokens(mergeTokens(pack?.tokens, userTokens));\r\n const nice = niceScale(maxValue);\r\n const ticks = config.axis?.ticks ?? nice.ticks;\r\n const domainMax = Math.max(nice.axisMax, maxValue, ...ticks);\r\n const bottomLabels = config.xAxis?.bottomLabels;\r\n const bottomRows = bottomLabels\r\n ? config.data.reduce((max, d, i) => {\r\n const out = bottomLabels(d, i, config.data);\r\n return Math.max(max, Array.isArray(out) ? out.length : 1);\r\n }, 0)\r\n : 0;\r\n const titleText = config.xAxis?.title?.text ?? '';\r\n const axisRows = bottomRows + (titleText ? 1 : 0);\r\n const rowHeight = tokens.axis.fontSize + 4;\r\n // 32 = axis line + tick marks + breathing room under the dissolving bars.\r\n const defaultBottom = axisRows > 0 ? Math.max(26, 32 + axisRows * rowHeight) : 26;\r\n const xField = config.xField ?? 'label';\r\n return {\r\n width,\r\n height,\r\n xField,\r\n yField,\r\n valueFormat: config.valueFormat ?? pack?.formats?.valueFormat ?? defaultValueFormat,\r\n ariaLabel: config.ariaLabel ?? 'fold bar chart',\r\n padding: { top: 64, right: 29, bottom: defaultBottom, left: 73, ...config.padding },\r\n stair: { bottomOffset: 30, topOffset: 74, ...config.stair },\r\n scale: { exponent },\r\n fold: {\r\n run: config.fold?.run ?? 20,\r\n creaseColor: config.fold?.creaseColor ?? 'rgba(255,255,255,.85)',\r\n creaseWidth: config.fold?.creaseWidth ?? 1.2,\r\n },\r\n axis: {\r\n ticks,\r\n tickFormat: config.axis?.tickFormat ?? pack?.formats?.tickFormat ?? ((v) => `${v}k`),\r\n domainMax,\r\n },\r\n xAxis: {\r\n labelFormat: config.xAxis?.labelFormat ?? ((d) => String(d[xField] ?? '')),\r\n bottomLabels,\r\n title: {\r\n text: titleText,\r\n x: config.xAxis?.title?.x,\r\n y: config.xAxis?.title?.y,\r\n },\r\n showLine: config.xAxis?.showLine ?? false,\r\n showTick: config.xAxis?.showTick ?? false,\r\n showGrid: config.xAxis?.showGrid ?? true,\r\n },\r\n tooltip: {\r\n enabled: config.tooltip?.enabled ?? true,\r\n formatter: config.tooltip?.formatter ?? defaultTooltipFormatter,\r\n height: config.tooltip?.height ?? 28,\r\n radius: config.tooltip?.radius ?? 9,\r\n paddingX: config.tooltip?.paddingX ?? 12,\r\n anchorRatio: config.tooltip?.anchorRatio ?? 0.42,\r\n offsetY: config.tooltip?.offsetY ?? -30,\r\n minY: config.tooltip?.minY ?? 140,\r\n fixedWidth: config.tooltip?.fixedWidth,\r\n },\r\n state: { defaultActive },\r\n title: {\r\n text: config.title?.text ?? '',\r\n x: config.title?.x ?? 36,\r\n y: config.title?.y ?? 52,\r\n },\r\n style: resolveStyle(config.style, pack?.style),\r\n tokens,\r\n };\r\n}\r\n\r\nexport interface FoldBarModel {\r\n data: FoldBarDatum[];\r\n labels: string[];\r\n values: number[];\r\n layout: FoldBarLayout;\r\n bars: BarGeometry[];\r\n flaps: (FlapGeometry | null)[];\r\n /** Fade band that dissolves bar bottoms; derived from plot.bottom unless user-overridden. */\r\n fade: { start: number; end: number };\r\n options: FoldBarOptions;\r\n}\r\n\r\n/** Precomputes all geometry for the current config, shared by rendering and interaction. */\r\nexport function createModel(config: FoldBarChartConfig, options: FoldBarOptions): FoldBarModel {\r\n const data = config.data;\r\n const labels = data.map((d, i) => options.xAxis.labelFormat(d, i, data));\r\n const raw = data.map((d) => Number(d[options.yField]));\r\n if (raw.some((v) => Number.isNaN(v) || v < 0)) {\r\n console.warn('sk-chart: FoldBarChart data contains NaN or negative values; they render as zero.');\r\n }\r\n const values = raw.map((v) => v || 0);\r\n const layout = computeLayout({\r\n width: options.width,\r\n height: options.height,\r\n padding: options.padding,\r\n stairBottomOffset: options.stair.bottomOffset,\r\n stairTopOffset: options.stair.topOffset,\r\n foldRun: options.fold.run,\r\n barGap: 1,\r\n exponent: options.scale.exponent,\r\n domainMax: options.axis.domainMax,\r\n values,\r\n });\r\n const bars = values.map((v, i) => barGeometry(layout, i, v));\r\n const flaps = values.map((_, i) => flapGeometry(layout, i, values));\r\n const fade = config.style?.fadeMask\r\n ? options.style.fadeMask\r\n : { start: layout.plot.bottom - 16, end: layout.plot.bottom };\r\n return { data, labels, values, layout, bars, flaps, fade, options };\r\n}\r\n","import { createSvgElement, scopedId } from '../../core/svg-renderer';\r\nimport type { ChartEventMap } from '../../core/types';\r\nimport type { FoldBarModel } from './defaults';\r\nimport { tooltipPlacement } from './geometry';\r\nimport type { TooltipHandle } from './render';\r\nimport type { FoldBarDatum, TooltipPart } from './types';\r\n\r\nexport interface InteractionHost {\r\n emit: <K extends keyof ChartEventMap<FoldBarDatum>>(\r\n event: K,\r\n payload: ChartEventMap<FoldBarDatum>[K],\r\n ) => void;\r\n}\r\n\r\nexport interface InteractionContext {\r\n uid: string;\r\n columns: SVGGElement[];\r\n columnsLayer: SVGGElement;\r\n tooltip: TooltipHandle;\r\n model: FoldBarModel;\r\n host: InteractionHost;\r\n}\r\n\r\nexport interface InteractionHandle {\r\n setActive(index: number): void;\r\n getActive(): number;\r\n destroy(): void;\r\n}\r\n\r\n/**\r\n * Text metrics used to size and center the tooltip. Safe under jsdom (returns zeros).\r\n * x/y are cleared first: getBBox reports the ink at the baseline written by the previous\r\n * render, and reusing it as the centering offset makes the text drift on every hover.\r\n */\r\nexport function measureTooltipText(text: SVGTextElement): { width: number; centerY: number } {\r\n text.setAttribute('x', '0');\r\n text.setAttribute('y', '0');\r\n let width = 0;\r\n let centerY = 0;\r\n if (typeof text.getComputedTextLength === 'function') {\r\n try {\r\n width = text.getComputedTextLength();\r\n } catch {\r\n width = 0;\r\n }\r\n }\r\n if (typeof text.getBBox === 'function') {\r\n try {\r\n const box = text.getBBox();\r\n centerY = box.y + box.height / 2;\r\n } catch {\r\n centerY = 0;\r\n }\r\n }\r\n return { width, centerY };\r\n}\r\n\r\nfunction renderTooltipText(uid: string, text: SVGTextElement, parts: TooltipPart[]): void {\r\n text.textContent = '';\r\n for (const part of parts) {\r\n const attrs: Record<string, string> = {};\r\n if (part.tone && part.tone !== 'n') {\r\n attrs.class = scopedId(uid, part.tone);\r\n }\r\n const tspan = createSvgElement('tspan', attrs);\r\n tspan.textContent = part.text;\r\n text.appendChild(tspan);\r\n }\r\n}\r\n\r\nexport function attachInteraction(ctx: InteractionContext): InteractionHandle {\r\n const { uid, columns, columnsLayer, tooltip, model, host } = ctx;\r\n const { options, layout, bars, data } = model;\r\n let active = -1;\r\n\r\n const cleanup: Array<() => void> = [];\r\n function listen(\r\n target: EventTarget,\r\n type: string,\r\n fn: EventListener,\r\n opts?: AddEventListenerOptions,\r\n ): void {\r\n target.addEventListener(type, fn, opts);\r\n cleanup.push(() => target.removeEventListener(type, fn, opts));\r\n }\r\n\r\n function renderTip(index: number): void {\r\n if (!options.tooltip.enabled) return;\r\n const parts = options.tooltip.formatter(data[index], index, data);\r\n renderTooltipText(uid, tooltip.text, parts);\r\n const measured = measureTooltipText(tooltip.text);\r\n const width =\r\n options.tooltip.fixedWidth ?? measured.width + options.tooltip.paddingX * 2;\r\n tooltip.rect.setAttribute('width', String(width));\r\n tooltip.text.setAttribute('x', String(width / 2));\r\n tooltip.text.setAttribute(\r\n 'y',\r\n String(options.tooltip.height / 2 - measured.centerY),\r\n );\r\n const pos = tooltipPlacement(layout, bars[index], width, options.tooltip);\r\n tooltip.group.setAttribute('transform', `translate(${pos.x},${pos.y})`);\r\n }\r\n\r\n function setActive(index: number): void {\r\n if (index === active || index < 0 || index >= columns.length) return;\r\n active = index;\r\n columns.forEach((col, i) => {\r\n col.classList.toggle(`${uid}-active`, i === index);\r\n col.setAttribute('aria-selected', String(i === index));\r\n });\r\n renderTip(index);\r\n }\r\n\r\n columns.forEach((col, i) => {\r\n listen(col, 'mouseenter', () => {\r\n setActive(i);\r\n host.emit('column:enter', { index: i, datum: data[i] });\r\n });\r\n listen(col, 'click', () => {\r\n host.emit('column:click', { index: i, datum: data[i] });\r\n });\r\n listen(col, 'touchstart', () => setActive(i), { passive: true });\r\n });\r\n\r\n const releaseTouch = () => setActive(options.state.defaultActive);\r\n listen(columnsLayer, 'touchend', releaseTouch, { passive: true });\r\n listen(columnsLayer, 'touchcancel', releaseTouch, { passive: true });\r\n\r\n listen(columnsLayer, 'mouseleave', () => {\r\n if (active >= 0) {\r\n host.emit('column:leave', { index: active, datum: data[active] });\r\n }\r\n setActive(options.state.defaultActive);\r\n });\r\n\r\n const svg = columnsLayer.ownerSVGElement;\r\n if (svg) {\r\n svg.setAttribute('tabindex', '0');\r\n listen(svg, 'keydown', (event) => {\r\n const key = (event as KeyboardEvent).key;\r\n if (key === 'ArrowRight') {\r\n setActive(Math.min(active + 1, columns.length - 1));\r\n event.preventDefault();\r\n } else if (key === 'ArrowLeft') {\r\n setActive(Math.max(active - 1, 0));\r\n event.preventDefault();\r\n } else if (key === 'Home') {\r\n setActive(0);\r\n event.preventDefault();\r\n } else if (key === 'End') {\r\n setActive(columns.length - 1);\r\n event.preventDefault();\r\n } else if ((key === 'Enter' || key === ' ') && active >= 0) {\r\n host.emit('column:click', { index: active, datum: data[active] });\r\n event.preventDefault();\r\n }\r\n });\r\n }\r\n\r\n // First activation must not animate in from the origin.\r\n tooltip.group.style.transition = 'none';\r\n setActive(options.state.defaultActive);\r\n requestAnimationFrame(() => {\r\n tooltip.group.style.transition = '';\r\n });\r\n\r\n return {\r\n setActive,\r\n getActive: () => active,\r\n destroy: () => cleanup.forEach((fn) => fn()),\r\n };\r\n}\r\n","import { addStops, createSvgElement, scopedId, urlRef } from '../../core/svg-renderer';\r\nimport type { ResolvedFoldBarStyle } from '../../theme/default-theme';\r\n\r\nexport interface DefsContext {\r\n uid: string;\r\n width: number;\r\n height: number;\r\n plotBottom: number;\r\n barCount: number;\r\n /** Which bar is painted with the active gradient stops. */\r\n gradientIndex: number;\r\n /** Per-flap gradient y range (bar top -> plot bottom), aligned with columns; last is null. */\r\n flapGradientYs: ([number, number] | null)[];\r\n /** Fade band that dissolves bar bottoms; follows plot.bottom unless user-overridden. */\r\n fade: { start: number; end: number };\r\n style: ResolvedFoldBarStyle;\r\n}\r\n\r\n/** Builds the full <defs> block. Every id is scoped under ctx.uid for multi-instance safety. */\r\nexport function buildDefs(ctx: DefsContext): SVGDefsElement {\r\n const { uid, style } = ctx;\r\n const defs = createSvgElement('defs');\r\n\r\n // Diagonal \"lined paper\" stripes laid over inactive bars.\r\n if (style.stripePattern.enabled) {\r\n const pattern = createSvgElement('pattern', {\r\n id: scopedId(uid, 'stripes'),\r\n width: style.stripePattern.size,\r\n height: style.stripePattern.size,\r\n patternUnits: 'userSpaceOnUse',\r\n patternTransform: `rotate(${style.stripePattern.rotation})`,\r\n });\r\n pattern.appendChild(\r\n createSvgElement('rect', {\r\n width: style.stripePattern.size,\r\n height: style.stripePattern.size,\r\n fill: 'none',\r\n }),\r\n );\r\n pattern.appendChild(\r\n createSvgElement('rect', {\r\n width: style.stripePattern.lineWidth,\r\n height: style.stripePattern.size,\r\n fill: style.stripePattern.lineColor,\r\n 'fill-opacity': style.stripePattern.lineOpacity,\r\n }),\r\n );\r\n defs.appendChild(pattern);\r\n }\r\n\r\n // Bar body gradients (per bar, vertical over its own bounding box).\r\n for (let i = 0; i < ctx.barCount; i++) {\r\n const stops = i === ctx.gradientIndex ? style.barGradientActive : style.barGradientNormal;\r\n defs.appendChild(\r\n addStops(\r\n createSvgElement('linearGradient', { id: scopedId(uid, `bar${i}`), x1: 0, y1: 0, x2: 0, y2: 1 }),\r\n stops,\r\n ),\r\n );\r\n }\r\n\r\n // Folded flap gradients (userSpaceOnUse so the lit crease sits at each flap's own top).\r\n for (let i = 0; i < ctx.barCount; i++) {\r\n const range = ctx.flapGradientYs[i];\r\n if (!range) continue;\r\n defs.appendChild(\r\n addStops(\r\n createSvgElement('linearGradient', {\r\n id: scopedId(uid, `fold${i}`),\r\n gradientUnits: 'userSpaceOnUse',\r\n x1: 0,\r\n y1: range[0],\r\n x2: 0,\r\n y2: range[1],\r\n }),\r\n style.foldGradient,\r\n ),\r\n );\r\n }\r\n\r\n // Specular highlight along the crease (horizontal over the flap's bounding box).\r\n defs.appendChild(\r\n addStops(\r\n createSvgElement('linearGradient', { id: scopedId(uid, 'crease'), x1: 0, y1: 0, x2: 1, y2: 0 }),\r\n style.creaseGradient,\r\n ),\r\n );\r\n\r\n // Active column wash backdrop.\r\n if (style.washEnabled) {\r\n defs.appendChild(\r\n addStops(\r\n createSvgElement('linearGradient', { id: scopedId(uid, 'wash'), x1: 0, y1: 0, x2: 0, y2: 1 }),\r\n style.washGradient,\r\n ),\r\n );\r\n }\r\n\r\n // Pill handle.\r\n if (style.pill.enabled) {\r\n defs.appendChild(\r\n addStops(\r\n createSvgElement('linearGradient', { id: scopedId(uid, 'pill'), x1: 0, y1: 0, x2: 0, y2: 1 }),\r\n style.pill.gradient,\r\n ),\r\n );\r\n }\r\n\r\n // Soft shadow under the tooltip paper.\r\n const filter = createSvgElement('filter', {\r\n id: scopedId(uid, 'soft'),\r\n x: '-40%',\r\n y: '-40%',\r\n width: '180%',\r\n height: '200%',\r\n });\r\n filter.appendChild(\r\n createSvgElement('feDropShadow', {\r\n dx: style.shadow.dx,\r\n dy: style.shadow.dy,\r\n stdDeviation: style.shadow.blur,\r\n 'flood-color': style.shadow.color,\r\n 'flood-opacity': style.shadow.opacity,\r\n }),\r\n );\r\n defs.appendChild(filter);\r\n\r\n // The sheet dissolves instead of hitting a hard baseline.\r\n if (style.fadeEnabled) {\r\n defs.appendChild(\r\n addStops(\r\n createSvgElement('linearGradient', {\r\n id: scopedId(uid, 'fadeGrad'),\r\n gradientUnits: 'userSpaceOnUse',\r\n x1: 0,\r\n y1: ctx.fade.start,\r\n x2: 0,\r\n y2: ctx.fade.end,\r\n }),\r\n [\r\n [0, '#fff'],\r\n [1, '#000'],\r\n ],\r\n ),\r\n );\r\n const mask = createSvgElement('mask', {\r\n id: scopedId(uid, 'fade'),\r\n maskUnits: 'userSpaceOnUse',\r\n x: 0,\r\n y: 0,\r\n width: ctx.width,\r\n height: ctx.height,\r\n });\r\n mask.appendChild(\r\n createSvgElement('rect', {\r\n x: 0,\r\n y: 0,\r\n width: ctx.width,\r\n height: ctx.height,\r\n fill: urlRef(uid, 'fadeGrad'),\r\n }),\r\n );\r\n defs.appendChild(mask);\r\n }\r\n\r\n return defs;\r\n}\r\n","import { createSvgElement, scopedId, urlRef } from '../../core/svg-renderer';\r\nimport { buildScopedCss } from '../../theme/default-theme';\r\nimport type { FoldBarModel } from './defaults';\r\nimport { buildDefs } from './defs-builder';\r\nimport { gridLineXs, hitRect, pillGeometry, washRect } from './geometry';\r\n\r\nexport interface TooltipHandle {\r\n group: SVGGElement;\r\n rect: SVGRectElement;\r\n text: SVGTextElement;\r\n}\r\n\r\nexport interface FoldBarRenderResult {\r\n svg: SVGSVGElement;\r\n columns: SVGGElement[];\r\n columnsLayer: SVGGElement;\r\n tooltip: TooltipHandle;\r\n}\r\n\r\n/** Builds the full SVG scene from a precomputed model. Pure DOM output, no event wiring. */\r\nexport function renderFoldBar(uid: string, model: FoldBarModel): FoldBarRenderResult {\r\n const { options, layout, bars, flaps, labels, values, data } = model;\r\n const { style, tokens } = options;\r\n\r\n const svg = createSvgElement('svg', {\r\n class: scopedId(uid, 'root'),\r\n viewBox: `0 0 ${options.width} ${options.height}`,\r\n role: 'img',\r\n 'aria-label': options.ariaLabel,\r\n });\r\n\r\n const styleEl = createSvgElement('style');\r\n styleEl.textContent = buildScopedCss(uid, tokens);\r\n svg.appendChild(styleEl);\r\n\r\n svg.appendChild(\r\n buildDefs({\r\n uid,\r\n width: options.width,\r\n height: options.height,\r\n plotBottom: layout.plot.bottom,\r\n barCount: values.length,\r\n gradientIndex: options.state.defaultActive,\r\n flapGradientYs: flaps.map((flap) => (flap ? flap.gradientY : null)),\r\n fade: model.fade,\r\n style,\r\n }),\r\n );\r\n\r\n if (options.title.text) {\r\n const title = createSvgElement('text', {\r\n class: scopedId(uid, 'title'),\r\n x: options.title.x,\r\n y: options.title.y,\r\n });\r\n title.textContent = options.title.text;\r\n svg.appendChild(title);\r\n }\r\n\r\n // Y axis tick labels at truthful scale positions + optional vertical column dividers.\r\n const grid = createSvgElement('g');\r\n options.axis.ticks.forEach((tick) => {\r\n const label = createSvgElement('text', {\r\n class: scopedId(uid, 'axis'),\r\n x: layout.plot.left - 15,\r\n y: layout.barTopOf(tick) + 4,\r\n 'text-anchor': 'end',\r\n });\r\n label.textContent = options.axis.tickFormat(tick);\r\n grid.appendChild(label);\r\n });\r\n if (options.xAxis.showGrid) {\r\n for (const x of gridLineXs(layout)) {\r\n grid.appendChild(\r\n createSvgElement('line', {\r\n x1: x,\r\n x2: x,\r\n y1: layout.plot.top,\r\n y2: layout.plot.bottom,\r\n stroke: tokens.grid.stroke,\r\n 'stroke-width': tokens.grid.strokeWidth,\r\n }),\r\n );\r\n }\r\n }\r\n svg.appendChild(grid);\r\n\r\n // Columns layer: the fade mask dissolves the baseline unless opted out.\r\n const columnsLayer = createSvgElement(\r\n 'g',\r\n style.fadeEnabled ? { mask: urlRef(uid, 'fade'), role: 'list' } : { role: 'list' },\r\n );\r\n svg.appendChild(columnsLayer);\r\n\r\n const columns: SVGGElement[] = [];\r\n values.forEach((value, i) => {\r\n const bar = bars[i];\r\n const col = createSvgElement('g', {\r\n class: scopedId(uid, 'col'),\r\n 'data-i': i,\r\n role: 'listitem',\r\n 'aria-selected': 'false',\r\n 'aria-label': `${labels[i]} ${options.valueFormat(value)}`,\r\n });\r\n\r\n if (style.washEnabled) {\r\n col.appendChild(\r\n createSvgElement('rect', {\r\n class: scopedId(uid, 'wash'),\r\n ...washRect(bar, style.washTop),\r\n fill: urlRef(uid, 'wash'),\r\n }),\r\n );\r\n }\r\n\r\n col.appendChild(\r\n createSvgElement('rect', {\r\n x: bar.x,\r\n y: bar.y,\r\n width: bar.width,\r\n height: bar.height,\r\n fill: urlRef(uid, `bar${i}`),\r\n }),\r\n );\r\n\r\n if (style.stripePattern.enabled) {\r\n col.appendChild(\r\n createSvgElement('rect', {\r\n class: scopedId(uid, 'stripes'),\r\n x: bar.x,\r\n y: bar.y,\r\n width: bar.width,\r\n height: bar.height,\r\n fill: urlRef(uid, 'stripes'),\r\n }),\r\n );\r\n }\r\n\r\n const flap = flaps[i];\r\n if (flap) {\r\n col.appendChild(\r\n createSvgElement('polygon', { points: flap.points, fill: urlRef(uid, `fold${i}`) }),\r\n );\r\n col.appendChild(\r\n createSvgElement('polygon', { points: flap.points, fill: urlRef(uid, 'crease') }),\r\n );\r\n col.appendChild(\r\n createSvgElement('line', {\r\n x1: flap.crease.x1,\r\n y1: flap.crease.y1,\r\n x2: flap.crease.x2,\r\n y2: flap.crease.y2,\r\n stroke: options.fold.creaseColor,\r\n 'stroke-width': options.fold.creaseWidth,\r\n }),\r\n );\r\n }\r\n\r\n if (style.pill.enabled) {\r\n const pill = pillGeometry(bar.centerX, bar.y, style.pill);\r\n col.appendChild(\r\n createSvgElement('rect', {\r\n x: pill.x,\r\n y: pill.y,\r\n width: pill.width,\r\n height: pill.height,\r\n rx: pill.rx,\r\n fill: urlRef(uid, 'pill'),\r\n }),\r\n );\r\n col.appendChild(\r\n createSvgElement('rect', {\r\n x: pill.shadowX,\r\n y: pill.shadowY,\r\n width: pill.shadowWidth,\r\n height: pill.shadowHeight,\r\n rx: pill.shadowRx,\r\n fill: style.pill.shadow.color,\r\n 'fill-opacity': style.pill.shadow.opacity,\r\n }),\r\n );\r\n }\r\n\r\n const labelX = bar.centerX + style.labelXOffset;\r\n const label = createSvgElement('text', {\r\n class: scopedId(uid, 'lbl'),\r\n x: labelX,\r\n y: style.labelY,\r\n 'text-anchor': 'middle',\r\n });\r\n label.textContent = labels[i];\r\n col.appendChild(label);\r\n\r\n const num = createSvgElement('text', {\r\n class: scopedId(uid, 'num'),\r\n x: labelX,\r\n y: style.numberY,\r\n 'text-anchor': 'middle',\r\n });\r\n num.textContent = options.valueFormat(value);\r\n col.appendChild(num);\r\n\r\n col.appendChild(\r\n createSvgElement('rect', { class: scopedId(uid, 'hit'), ...hitRect(layout, i) }),\r\n );\r\n\r\n columnsLayer.appendChild(col);\r\n columns.push(col);\r\n });\r\n\r\n // X axis layer: outside the fade mask, non-interactive.\r\n const { xAxis } = options;\r\n if (xAxis.showLine || xAxis.showTick || xAxis.bottomLabels || xAxis.title.text) {\r\n const axisLayer = createSvgElement('g', {\r\n class: scopedId(uid, 'xaxis'),\r\n 'pointer-events': 'none',\r\n 'aria-hidden': 'true',\r\n });\r\n // Axis band hangs off plot.bottom so it never overlaps the dissolving bar tails.\r\n const axisLineY = layout.plot.bottom + 4;\r\n if (xAxis.showLine) {\r\n axisLayer.appendChild(\r\n createSvgElement('line', {\r\n x1: layout.plot.left,\r\n x2: layout.plot.right,\r\n y1: axisLineY,\r\n y2: axisLineY,\r\n stroke: tokens.grid.stroke,\r\n 'stroke-width': tokens.grid.strokeWidth,\r\n }),\r\n );\r\n }\r\n const rowHeight = tokens.axis.fontSize + 4;\r\n if (xAxis.showTick) {\r\n for (const x of gridLineXs(layout)) {\r\n axisLayer.appendChild(\r\n createSvgElement('line', {\r\n x1: x,\r\n x2: x,\r\n y1: axisLineY,\r\n y2: axisLineY + 4,\r\n stroke: tokens.grid.stroke,\r\n 'stroke-width': tokens.grid.strokeWidth,\r\n }),\r\n );\r\n }\r\n }\r\n let bottomRows = 0;\r\n if (xAxis.bottomLabels) {\r\n const format = xAxis.bottomLabels;\r\n bars.forEach((bar, i) => {\r\n const out = format(data[i], i, data);\r\n const lines = Array.isArray(out) ? out : [out];\r\n bottomRows = Math.max(bottomRows, lines.length);\r\n lines.forEach((line, row) => {\r\n const text = createSvgElement('text', {\r\n class: scopedId(uid, 'axis'),\r\n x: bar.centerX,\r\n y: layout.plot.bottom + 20 + row * rowHeight,\r\n 'text-anchor': 'middle',\r\n });\r\n text.textContent = line;\r\n axisLayer.appendChild(text);\r\n });\r\n });\r\n }\r\n if (xAxis.title.text) {\r\n const title = createSvgElement('text', {\r\n class: scopedId(uid, 'axis'),\r\n x: xAxis.title.x ?? (layout.plot.left + layout.plot.right) / 2,\r\n y: xAxis.title.y ?? layout.plot.bottom + 26 + bottomRows * rowHeight,\r\n 'text-anchor': 'middle',\r\n });\r\n title.textContent = xAxis.title.text;\r\n axisLayer.appendChild(title);\r\n }\r\n svg.appendChild(axisLayer);\r\n }\r\n\r\n const group = createSvgElement('g', {\r\n class: scopedId(uid, 'tip'),\r\n filter: urlRef(uid, 'soft'),\r\n });\r\n const rect = createSvgElement('rect', {\r\n x: 0,\r\n y: 0,\r\n height: options.tooltip.height,\r\n rx: options.tooltip.radius,\r\n fill: tokens.tooltip.bg,\r\n stroke: tokens.tooltip.stroke,\r\n });\r\n const text = createSvgElement('text', { x: 0, y: 0, 'text-anchor': 'middle' });\r\n group.appendChild(rect);\r\n group.appendChild(text);\r\n svg.appendChild(group);\r\n\r\n return { svg, columns, columnsLayer, tooltip: { group, rect, text } };\r\n}\r\n","import { ChartBase } from '../../core/chart-base';\r\nimport { createUid } from '../../core/svg-renderer';\r\nimport type { ChartEventMap, ContainerLike } from '../../core/types';\r\nimport { createModel, resolveOptions, type FoldBarModel } from './defaults';\r\nimport { attachInteraction, type InteractionHandle } from './interaction';\r\nimport { renderFoldBar, type FoldBarRenderResult } from './render';\r\nimport type { FoldBarChartConfig, FoldBarDatum } from './types';\r\n\r\n/**\r\n * Fold-paper funnel bar chart: gradient columns joined by folded flaps,\r\n * striped idle state, wash highlight on the active column.\r\n */\r\nexport class FoldBarChart extends ChartBase<\r\n FoldBarChartConfig,\r\n ChartEventMap<FoldBarDatum>\r\n> {\r\n private uid = createUid();\r\n private model: FoldBarModel | null = null;\r\n private rendered: FoldBarRenderResult | null = null;\r\n private interaction: InteractionHandle | null = null;\r\n\r\n constructor(container: ContainerLike, config: FoldBarChartConfig) {\r\n super(container, config);\r\n this.renderChart();\r\n }\r\n\r\n /** Currently active (highlighted) column index. */\r\n get activeIndex(): number {\r\n return this.interaction?.getActive() ?? -1;\r\n }\r\n\r\n /** Programmatically highlight a column. */\r\n setActive(index: number): void {\r\n this.interaction?.setActive(index);\r\n }\r\n\r\n protected renderChart(): void {\r\n this.interaction?.destroy();\r\n this.interaction = null;\r\n this.rendered?.svg.remove();\r\n\r\n const options = resolveOptions(this.config);\r\n this.model = createModel(this.config, options);\r\n this.rendered = renderFoldBar(this.uid, this.model);\r\n this.container.appendChild(this.rendered.svg);\r\n this.svg = this.rendered.svg;\r\n\r\n this.interaction = this.model.data.length\r\n ? attachInteraction({\r\n uid: this.uid,\r\n columns: this.rendered.columns,\r\n columnsLayer: this.rendered.columnsLayer,\r\n tooltip: this.rendered.tooltip,\r\n model: this.model,\r\n host: { emit: (event, payload) => this.emit(event, payload) },\r\n })\r\n : null;\r\n }\r\n\r\n protected onDestroy(): void {\r\n this.interaction?.destroy();\r\n this.interaction = null;\r\n }\r\n}\r\n\r\nexport type { FoldBarChartConfig };\r\n","export interface ScaleOptions {\r\n domain: [number, number];\r\n range: [number, number];\r\n}\r\n\r\n/** Maps values from domain to range linearly. A degenerate domain maps everything to range[0]. */\r\nexport function createLinearScale({\r\n domain: [d0, d1],\r\n range: [r0, r1],\r\n}: ScaleOptions): (value: number) => number {\r\n const span = d1 - d0;\r\n if (span === 0) return () => r0;\r\n const k = (r1 - r0) / span;\r\n return (value: number) => r0 + (value - d0) * k;\r\n}\r\n","import type { ScaleOptions } from './linear-scale';\r\n\r\nexport interface PowerScaleOptions extends ScaleOptions {\r\n /** Power applied to the normalized value. 1 behaves exactly like a linear scale. */\r\n exponent?: number;\r\n}\r\n\r\n/**\r\n * Maps values from domain to range through t^exponent, where t is the normalized\r\n * value clamped to [0, +inf). exponent < 1 emphasizes large values, > 1 compresses them.\r\n */\r\nexport function createPowerScale({\r\n domain: [d0, d1],\r\n range: [r0, r1],\r\n exponent = 1,\r\n}: PowerScaleOptions): (value: number) => number {\r\n const span = d1 - d0;\r\n if (span === 0) return () => r0;\r\n return (value: number) => {\r\n const t = Math.max(0, (value - d0) / span);\r\n return r0 + Math.pow(t, exponent) * (r1 - r0);\r\n };\r\n}\r\n","export interface BandScale {\r\n /** Full width of one band, including padding. */\r\n step: number;\r\n /** Usable width inside a band. */\r\n bandwidth: number;\r\n /** Leading edge of the band at index. */\r\n position: (index: number) => number;\r\n /** Center of the band at index. */\r\n center: (index: number) => number;\r\n}\r\n\r\n/** Splits range into count equal bands. paddingRatio is the fraction of each step left empty. */\r\nexport function createBandScale(\r\n count: number,\r\n range: [number, number],\r\n paddingRatio = 0,\r\n): BandScale {\r\n const [r0, r1] = range;\r\n const step = count > 0 ? (r1 - r0) / count : 0;\r\n const bandwidth = step * (1 - paddingRatio);\r\n const offset = (step - bandwidth) / 2;\r\n return {\r\n step,\r\n bandwidth,\r\n position: (index) => r0 + index * step + offset,\r\n center: (index) => r0 + index * step + step / 2,\r\n };\r\n}\r\n"],"mappings":"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","names":["text"]}
|