charts-core 1.0.3 → 1.0.5

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.
@@ -65,7 +65,7 @@ const H = (t) => {
65
65
  config: { margin: a }
66
66
  } = t, r = e.range()[0] - e(0);
67
67
  return { x: 0, y: e.range()[0] - r, width: "100%", height: r + a.bottom };
68
- }, F = (t, e) => ({
68
+ }, S = (t, e) => ({
69
69
  ...t,
70
70
  ...e,
71
71
  margin: {
@@ -100,7 +100,7 @@ const H = (t) => {
100
100
  ...t.selection,
101
101
  ...e == null ? void 0 : e.selection
102
102
  }
103
- }), I = (t, e = {}) => {
103
+ }), B = (t, e = {}) => {
104
104
  const a = t.node(), r = C(a), o = (c, d) => N(r, c, {
105
105
  x1: "0%",
106
106
  y1: "0%",
@@ -163,7 +163,7 @@ const H = (t) => {
163
163
  r.remove();
164
164
  }
165
165
  };
166
- }, k = "sc-charts__range-tooltip", B = w.timeFormat("%b %e, %I:%M %p"), j = (t) => {
166
+ }, k = "sc-charts__range-tooltip", D = w.timeFormat("%b %e, %I:%M %p"), j = (t) => {
167
167
  const e = w.format(",.2f");
168
168
  return `${t < 0 ? "-" : ""}$${e(Math.abs(t))}`;
169
169
  }, J = `
@@ -202,11 +202,11 @@ const P = (t) => {
202
202
  const p = (l / Math.abs(o.value) * 100).toFixed(2);
203
203
  $ = `${j(l)} (${p}%)`;
204
204
  }
205
- h ? v = h({ left: o.date, right: s.date, direction: m }) : v = `${B(o.date)} to ${B(s.date)}`, a.textContent = $, r.textContent = v, requestAnimationFrame(() => {
205
+ h ? v = h({ left: o.date, right: s.date, direction: m }) : v = `${D(o.date)} to ${D(s.date)}`, a.textContent = $, r.textContent = v, requestAnimationFrame(() => {
206
206
  const p = e.getBoundingClientRect(), f = t.wrapperNode.getBoundingClientRect(), y = t.x(o.date), x = t.x(s.date);
207
207
  let L = (y + x) / 2 - p.width / 2;
208
- const R = 0, S = f.width - p.width;
209
- L < R && (L = R), L > S && (L = S), e.style.left = `${L}px`, e.style.top = `${c}px`;
208
+ const F = 0, R = f.width - p.width;
209
+ L < F && (L = F), L > R && (L = R), e.style.left = `${L}px`, e.style.top = `${c}px`;
210
210
  });
211
211
  }
212
212
  d !== void 0 && (e.style.display = d ? "none" : "block");
@@ -237,14 +237,18 @@ const ae = (t) => {
237
237
  o === "remove" ? e.classList.remove(`${b}${s}`) : e.classList.add(`${b}${s}`);
238
238
  },
239
239
  update({ hidden: o, dataItem: s }) {
240
- s && (a.textContent = O(s.value), r.textContent = Q(s.date), requestAnimationFrame(() => {
241
- const n = e.getBoundingClientRect(), c = te(
242
- n,
243
- t.x(s.date),
244
- t.width - t.config.margin.right
245
- );
246
- c && (e.style.left = c + "px");
247
- })), o !== void 0 && (e.style.display = o ? "none" : "block");
240
+ if (s) {
241
+ const { sumFormatter: n, timeFormatter: c } = t.config.hover;
242
+ a.textContent = n ? n(s.value) : O(s.value), r.textContent = c ? c(s.date) : Q(s.date), requestAnimationFrame(() => {
243
+ const d = e.getBoundingClientRect(), i = te(
244
+ d,
245
+ t.x(s.date),
246
+ t.width - t.config.margin.right
247
+ );
248
+ i && (e.style.left = i + "px");
249
+ });
250
+ }
251
+ o !== void 0 && (e.style.display = o ? "none" : "block");
248
252
  },
249
253
  destroy() {
250
254
  e.remove();
@@ -266,7 +270,9 @@ const ae = (t) => {
266
270
  enable: !0,
267
271
  range: "1m",
268
272
  transitionDuration: 150,
269
- transitionName: "default"
273
+ transitionName: "default",
274
+ sumFormatter: null,
275
+ timeFormatter: null
270
276
  },
271
277
  selection: {
272
278
  enable: !0,
@@ -397,7 +403,7 @@ const ae = (t) => {
397
403
  const n = A(t.svg, {
398
404
  className: "sc-charts__hover-circle",
399
405
  hidden: !0
400
- }), c = I(t.svg), d = I(t.svg), i = M(t, {
406
+ }), c = B(t.svg), d = B(t.svg), i = M(t, {
401
407
  baseClassName: "sc-charts__range-line",
402
408
  id: `${t.chartId}-sc-charts__range-line`,
403
409
  clip: { x: 0, y: 0, width: "0", height: "0" }
@@ -505,7 +511,7 @@ const ae = (t) => {
505
511
  width: "100%",
506
512
  height: "100%"
507
513
  };
508
- }, D = (t, e) => {
514
+ }, I = (t, e) => {
509
515
  var d;
510
516
  const {
511
517
  x: a,
@@ -624,7 +630,7 @@ const ae = (t) => {
624
630
  );
625
631
  e.append("rect").attr("width", s - c.left - c.right).attr("height", n - c.top - c.bottom).attr("x", c.left).attr("y", c.top).attr("fill", "transparent").on("mousemove", function(m) {
626
632
  const [$] = w.pointer(m, this), v = h($);
627
- !u && d.enable ? (t.action = "hover", D(t, v)) : (t.action = u ? "selection" : "none", z(t)), l && i.enable && (t.action = "selection", de(t, l, v));
633
+ !u && d.enable ? (t.action = "hover", I(t, v)) : (t.action = u ? "selection" : "none", z(t)), l && i.enable && (t.action = "selection", de(t, l, v));
628
634
  }).on("mouseleave", () => {
629
635
  t.action = "none", u = !1, l = null, z(t), X(t);
630
636
  }).on("mousedown", function(m) {
@@ -635,7 +641,7 @@ const ae = (t) => {
635
641
  }
636
642
  }).on("mouseup", function(m) {
637
643
  const [$] = w.pointer(m, this), v = h($);
638
- u = !1, l = null, t.action = "hover", i.enable && X(t), d.enable && D(t, v);
644
+ u = !1, l = null, t.action = "hover", i.enable && X(t), d.enable && I(t, v);
639
645
  });
640
646
  }, ge = (t, e, a) => {
641
647
  const { margin: r } = e, o = w.scaleTime(), s = w.extent(t, (n) => new Date(n.date));
@@ -651,13 +657,13 @@ const ae = (t) => {
651
657
  return console.error(`chartId is required and must be a valid id
652
658
  (only letters, numbers or underscores. The first character must be a letter)`), null;
653
659
  const r = a.append("div"), o = r.append("svg"), s = a.node();
654
- let n = s.getBoundingClientRect(), c = n.width, d = n.height, i = F({ ...re }, e.config), l = e.data;
660
+ let n = s.getBoundingClientRect(), c = n.width, d = n.height, i = S({ ...re }, e.config), l = e.data;
655
661
  const u = () => {
656
662
  n = s.getBoundingClientRect(), c = n.width, d = n.height, h({ data: l, config: i });
657
663
  };
658
664
  window.addEventListener("resize", u);
659
665
  const h = (g, m = !1) => {
660
- m && g.config && (i = F(i, g.config)), m && g.data && (l = g.data);
666
+ m && g.config && (i = S(i, g.config)), m && g.data && (l = g.data);
661
667
  const $ = l.map((x) => ({ date: new Date(x.date), value: x.value })).sort((x, E) => x.date.getTime() - E.date.getTime()), v = ge($, i, c), p = ue($, i, d);
662
668
  r.attr("class", `sc-charts sc-charts__${i.theme}`), o.attr("preserveAspectRatio", "xMinYMin meet").attr("viewBox", `0 0 ${c} ${d}`).style("width", "100%").style("height", "100%").selectAll("*").remove();
663
669
  const f = {
@@ -1 +1 @@
1
- {"version":3,"file":"charts-core.js","sources":["../src/components/line-chart/axes/y-axis.ts","../src/components/line-chart/axes/x-axis.ts","../src/components/line-chart/axes/grid.ts","../src/components/line-chart/axes/index.ts","../src/components/line-chart/utils/index.ts","../src/components/line-chart/elements/range-border.ts","../src/components/line-chart/elements/circle-point.ts","../src/components/line-chart/elements/hover-line.ts","../src/components/line-chart/elements/range-tooltip.ts","../src/components/line-chart/elements/hover-tooltip.ts","../src/components/line-chart/constants.ts","../src/components/line-chart/elements/main-line-area.ts","../src/components/line-chart/elements/range-line-area.ts","../src/components/line-chart/elements/data-line.ts","../src/components/line-chart/elements/highlight-line.ts","../src/components/line-chart/elements/index.ts","../src/components/line-chart/interactions/hover/utils.ts","../src/components/line-chart/interactions/hover/index.ts","../src/components/line-chart/interactions/selection.ts","../src/components/line-chart/interactions/index.ts","../src/components/line-chart/scales/index.ts","../src/components/line-chart/index.ts"],"sourcesContent":["import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nexport const renderYAxis = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, y, width } = context\n const { margin, yAxis } = config\n const { customTicks, tickFormat, tickValues, ticks, isShow } = yAxis\n\n if (!isShow) return null\n\n svg\n .append('g')\n .attr('transform', `translate(${width - margin.right},0)`)\n .call((g) => {\n let axis = d3.axisRight(y)\n if (customTicks) {\n if (tickFormat) {\n axis = axis.tickFormat(tickFormat)\n }\n if (ticks) {\n axis = Array.isArray(ticks) ? axis.ticks(...ticks) : axis.ticks(ticks)\n }\n if (tickValues) {\n axis = axis.tickValues(tickValues)\n }\n } else {\n axis = axis.tickFormat((d) => {\n const num = Number(d)\n const sign = num < 0 ? '-' : ''\n const formatted = d3.format('.0s')(Math.abs(num))\n return `${sign}${formatted}`\n })\n }\n g.call(axis)\n })\n .call((g) => {\n let ticks: ParsedDataPoint['value'][] = []\n g.selectAll('.tick').each((d) => ticks.push(d as ParsedDataPoint['value']))\n context.yTicks = ticks\n })\n .call((g) => g.select('.domain').remove())\n .call((g) => g.selectAll('.tick line').remove())\n .call((g) => g.selectAll('.tick text').classed('sc-charts__y-axis-tick', true))\n .attr('font-family', 'inherit')\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nexport const renderXAxis = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, x, height } = context\n const { margin, xAxis } = config\n const { isShow, tickValues, tickFormat, customTicks, ticks } = xAxis\n\n if (!isShow) return null\n\n svg\n .append('g')\n .attr('transform', `translate(0,${height - margin.bottom})`)\n .call((g) => {\n let axis = d3.axisBottom(x)\n if (customTicks) {\n if (tickFormat) {\n axis = axis.tickFormat(tickFormat)\n }\n if (ticks) {\n axis = Array.isArray(ticks) ? axis.ticks(...ticks) : axis.ticks(ticks)\n }\n if (tickValues) {\n axis = axis.tickValues(tickValues)\n }\n } else {\n axis.ticks(5)\n }\n g.call(axis)\n })\n .call((g) => g.select('.domain').remove())\n .call((g) => {\n let ticks: ParsedDataPoint['date'][] = []\n g.selectAll('.tick').each((d) => ticks.push(d as ParsedDataPoint['date']))\n context.xTicks = ticks\n })\n .call((g) => g.selectAll('.tick line').remove())\n .call((g) => g.selectAll('.tick text').classed('sc-charts__x-axis-tick', true))\n .attr('font-family', 'inherit')\n}\n","import { ChartContext } from '../types'\n\nconst renderHorizontalStyles = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, y, width } = context\n const {\n margin,\n grid: { horizontalStyle },\n } = config\n\n if (horizontalStyle === 'none') return\n\n if (horizontalStyle.startsWith('zero-line')) {\n const line = svg\n .append('line')\n .attr('x1', 0 + margin.left)\n .attr('x2', width - margin.right)\n .attr('y1', y(0))\n .attr('y2', y(0))\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (horizontalStyle === 'zero-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n }\n\n if (horizontalStyle.startsWith('every-line')) {\n const ticks = context.yTicks || y.ticks()\n\n ticks.forEach((tick) => {\n const line = svg\n .append('line')\n .attr('x1', 0 + margin.left)\n .attr('x2', width - margin.right)\n .attr('y1', y(tick))\n .attr('y2', y(tick))\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (horizontalStyle === 'every-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n })\n }\n}\n\nconst renderVerticalStyles = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, x, height } = context\n const {\n margin,\n grid: { verticalStyle },\n } = config\n\n if (verticalStyle === 'none') return\n\n if (verticalStyle.startsWith('every-line')) {\n const ticks = context.xTicks || x.ticks()\n\n ticks.forEach((tick) => {\n const line = svg\n .append('line')\n .attr('x1', x(tick))\n .attr('x2', x(tick))\n .attr('y1', margin.top)\n .attr('y2', height - margin.bottom)\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (verticalStyle === 'every-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n })\n }\n}\n\nexport const renderGrid = (context: Omit<ChartContext, 'elements'>) => {\n renderHorizontalStyles(context)\n renderVerticalStyles(context)\n}\n","import { ChartContext } from '../types'\nimport { renderYAxis } from './y-axis'\nimport { renderXAxis } from './x-axis'\nimport { renderGrid } from './grid.ts'\n\nexport const createAxes = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, width, height } = context\n const { margin, logo } = config\n\n // x axis\n renderXAxis(context)\n\n // y axis\n renderYAxis(context)\n\n if (logo) {\n svg\n .append('image')\n .attr('xlink:href', config.theme === 'dark' ? logo.picDarkTheme : logo.picLightTheme)\n .attr('width', logo.width)\n .attr('height', logo.height)\n .attr('x', logo.x ?? (width - margin.left - margin.right) / 2 - logo.width / 2 + margin.left)\n .attr('y', logo.y ?? (height - margin.top - margin.bottom) / 2 - logo.height / 2 + margin.top)\n }\n\n // grid\n renderGrid(context)\n}\n","import * as d3 from 'd3'\nimport { ChartConfig, ChartConfigContext, ChartContext } from '../types'\n\nexport const createGradient = (\n defs:\n | d3.Selection<d3.BaseType, unknown, null, undefined>\n | d3.Selection<SVGDefsElement, unknown, null, undefined>,\n gradientId: string,\n options: {\n x1: string\n x2: string\n y1: string\n y2: string\n stops: { offset: string; stopColor: string }[]\n }\n): d3.Selection<SVGLinearGradientElement, unknown, null, undefined> => {\n let gradient: d3.Selection<SVGLinearGradientElement, unknown, null, undefined> =\n defs.select<SVGLinearGradientElement>(`#${gradientId}`)\n\n if (gradient.empty()) {\n gradient = defs\n .append<SVGLinearGradientElement>('linearGradient')\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('id', gradientId)\n }\n\n gradient\n .attr('x1', options.x1)\n .attr('y1', options.x2)\n .attr('x2', options.y1)\n .attr('y2', options.y2)\n\n options.stops.forEach(({ offset, stopColor }) => {\n gradient.append('stop').attr('offset', offset).attr('stop-color', stopColor)\n })\n\n return gradient\n}\n\nexport const getDefs = (svg: SVGSVGElement) => {\n const defsSelection = d3.select(svg).select('defs')\n const defs = defsSelection.empty() ? d3.select(svg).append('defs') : defsSelection\n\n return defs\n}\n\nexport const getBelowZeroClip = (ctx: Omit<ChartContext, 'elements'>) => {\n const {\n y,\n config: { margin },\n } = ctx\n const clipHeight = y.range()[0] - y(0)\n\n return { x: 0, y: y.range()[0] - clipHeight, width: '100%', height: clipHeight + margin.bottom }\n}\n\nexport const mergeConfig = (base: ChartConfigContext, patch?: ChartConfig): ChartConfigContext => ({\n ...base,\n ...patch,\n margin: {\n ...base.margin,\n ...patch?.margin,\n },\n logo:\n base.logo && patch?.logo\n ? {\n width: patch.logo.width ?? base.logo.width,\n height: patch.logo.height ?? base.logo.height,\n picLightTheme: patch.logo.picLightTheme ?? base.logo.picLightTheme,\n picDarkTheme: patch.logo.picDarkTheme ?? base.logo.picDarkTheme,\n x: patch.logo.x ?? base.logo.x,\n y: patch.logo.y ?? base.logo.y,\n }\n : base.logo,\n\n xAxis: {\n ...base.xAxis,\n ...patch?.xAxis,\n },\n yAxis: {\n ...base.yAxis,\n ...patch?.yAxis,\n },\n grid: {\n ...base.grid,\n ...patch?.grid,\n },\n hover: {\n ...base.hover,\n ...patch?.hover,\n },\n selection: {\n ...base.selection,\n ...patch?.selection,\n },\n})\n","import { Parent, ElementOptions, ChartElements } from './types'\nimport { createGradient, getDefs } from '../utils'\n\nexport const renderBorderRangeLine = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['rangeBorderLeft'] => {\n const svg = parent.node() as SVGSVGElement\n const defs = getDefs(svg)\n\n const createBorderGradient = (gradientId: string, mainColor: string) => {\n return createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'rgba(255, 255, 255, 0)' },\n { offset: '20%', stopColor: mainColor },\n { offset: '60%', stopColor: mainColor },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n }\n\n createBorderGradient('gradient-range-borders-up', 'var(--sc-color-selection-up)')\n createBorderGradient('gradient-range-borders-down', 'var(--sc-color-selection-down)')\n\n const baseClassName = 'sc-charts__border-range-line'\n\n const item = parent\n .append('line')\n .classed(baseClassName, true)\n .style('display', options.hidden ? 'none' : 'block')\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ x1, x2, y1, y2, hidden }) {\n if (x1 !== undefined) item.attr('x1', x1)\n if (x2 !== undefined) item.attr('x2', x2)\n if (y1 !== undefined) item.attr('y1', y1)\n if (y2 !== undefined) item.attr('y2', y2)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n\n destroy() {\n item.remove()\n },\n }\n}\n","import { Parent, ElementOptions, ChartElements } from './types'\n\nexport const renderCirclePoint = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['hoverCircle'] => {\n const item = parent\n .append('circle')\n .attr('r', options.radius || 4)\n .style('display', options.hidden ? 'none' : 'block')\n\n const baseClassName = options.className || ''\n if (baseClassName) item.classed(baseClassName, true)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ cx, cy, hidden, fill }) {\n if (cx !== undefined) item.attr('cx', cx)\n if (cy !== undefined) item.attr('cy', cy)\n if (fill !== undefined) item.attr('fill', fill)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n\n destroy() {\n item.remove()\n },\n }\n}\n","import { createGradient, getDefs } from '../utils'\nimport { Parent, ElementOptions, ChartElements } from './types'\n\nexport const renderHoverLine = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['hoverLine'] => {\n const baseClassName = 'sc-charts__hover-line'\n const item = parent\n .append('line')\n .style('display', options.hidden ? 'none' : 'block')\n .classed(baseClassName, true)\n const svg = parent.node() as SVGSVGElement\n const defs = getDefs(svg)\n\n const createBorderGradient = (gradientId: string, mainColor: string) => {\n return createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'rgba(255, 255, 255, 0)' },\n { offset: '15%', stopColor: mainColor },\n { offset: '75%', stopColor: mainColor },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n }\n\n createBorderGradient('hover-line-gradient', 'var(--sc-color-hover-line)')\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ x1, x2, y1, y2, hidden }) {\n if (x1 !== undefined) item.attr('x1', x1)\n if (x2 !== undefined) item.attr('x2', x2)\n if (y1 !== undefined) item.attr('y1', y1)\n if (y2 !== undefined) item.attr('y2', y2)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartElements } from './types'\nimport { ChartContext } from '../types'\n\nconst BASE_CLASSNAME = 'sc-charts__range-tooltip'\n\nconst timeFormat = d3.timeFormat('%b %e, %I:%M %p')\nconst sumFormat = (sum: number) => {\n const fmt = d3.format(',.2f')\n return `${sum < 0 ? '-' : ''}$${fmt(Math.abs(sum))}`\n}\n\nconst icon = `\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 0.5C5.71442 0.5 4.45772 0.881218 3.3888 1.59545C2.31988 2.30968 1.48676 3.32484 0.994786 4.51256C0.502816 5.70028 0.374095 7.00721 0.624899 8.26809C0.875703 9.52896 1.49477 10.6872 2.40381 11.5962C3.31285 12.5052 4.47104 13.1243 5.73192 13.3751C6.99279 13.6259 8.29973 13.4972 9.48744 13.0052C10.6752 12.5132 11.6903 11.6801 12.4046 10.6112C13.1188 9.54229 13.5 8.28558 13.5 7C13.4982 5.27665 12.8128 3.62441 11.5942 2.40582C10.3756 1.18722 8.72335 0.50182 7 0.5ZM9.35375 6.85375C9.30732 6.90024 9.25217 6.93712 9.19147 6.96228C9.13077 6.98744 9.06571 7.00039 9 7.00039C8.93429 7.00039 8.86923 6.98744 8.80853 6.96228C8.74783 6.93712 8.69269 6.90024 8.64625 6.85375L7.5 5.70687V9.5C7.5 9.63261 7.44732 9.75979 7.35356 9.85355C7.25979 9.94732 7.13261 10 7 10C6.86739 10 6.74022 9.94732 6.64645 9.85355C6.55268 9.75979 6.5 9.63261 6.5 9.5V5.70687L5.35375 6.85375C5.25993 6.94757 5.13268 7.00028 5 7.00028C4.86732 7.00028 4.74007 6.94757 4.64625 6.85375C4.55243 6.75993 4.49972 6.63268 4.49972 6.5C4.49972 6.36732 4.55243 6.24007 4.64625 6.14625L6.64625 4.14625C6.69269 4.09976 6.74783 4.06288 6.80853 4.03772C6.86923 4.01256 6.9343 3.99961 7 3.99961C7.06571 3.99961 7.13077 4.01256 7.19147 4.03772C7.25217 4.06288 7.30732 4.09976 7.35375 4.14625L9.35375 6.14625C9.40024 6.19269 9.43712 6.24783 9.46228 6.30853C9.48744 6.36923 9.5004 6.43429 9.5004 6.5C9.5004 6.56571 9.48744 6.63077 9.46228 6.69147C9.43712 6.75217 9.40024 6.80731 9.35375 6.85375Z\" \n fill=\"currentColor\"/>\n </svg>\n`\n\nfunction createTooltipElements(container: HTMLDivElement) {\n const tooltip = document.createElement('div')\n tooltip.className = BASE_CLASSNAME\n container.append(tooltip)\n\n const wrapper = document.createElement('div')\n wrapper.className = `${BASE_CLASSNAME}-container`\n tooltip.style.position = 'absolute'\n tooltip.style.top = '0'\n tooltip.style.pointerEvents = 'none'\n tooltip.style.display = 'none'\n tooltip.append(wrapper)\n\n const sumWrapper = document.createElement('div')\n sumWrapper.className = `${BASE_CLASSNAME}-sum`\n wrapper.append(sumWrapper)\n\n const iconNode = document.createElement('div')\n iconNode.className = `${BASE_CLASSNAME}-sum-icon`\n iconNode.innerHTML = icon\n sumWrapper.append(iconNode)\n\n const sumNode = document.createElement('div')\n sumWrapper.append(sumNode)\n\n const timeNode = document.createElement('div')\n timeNode.className = `${BASE_CLASSNAME}-time`\n wrapper.append(timeNode)\n\n return { wrapper: tooltip, sumNode, timeNode }\n}\n\nexport const renderRangeTooltip = (\n context: Omit<ChartContext, 'elements'>\n): ChartElements['rangeTooltip'] => {\n const { wrapper, sumNode, timeNode } = createTooltipElements(context.wrapperNode)\n\n return {\n className(action, mod) {\n if (action === 'remove') {\n wrapper.classList.remove(`${BASE_CLASSNAME}${mod}`)\n } else {\n wrapper.classList.add(`${BASE_CLASSNAME}${mod}`)\n }\n },\n update({ leftPoint, rightPoint, x, y, hidden, closest }) {\n if (leftPoint && rightPoint && closest && x !== undefined) {\n const delta = rightPoint.value - leftPoint.value\n const { sumFormatter, timeFormatter } = context.config.selection\n\n const selectionCenter = (context.x(rightPoint.date) + context.x(leftPoint.date)) / 2\n const direction = context.x(closest.date) < selectionCenter ? 'left' : 'right'\n\n let valueText = ''\n let dateText = ''\n\n if (!sumFormatter) {\n const percent = ((delta / Math.abs(leftPoint.value)) * 100).toFixed(2)\n valueText = `${sumFormat(delta)} (${percent}%)`\n } else {\n valueText = sumFormatter({ left: leftPoint.value, right: rightPoint.value, direction })\n }\n\n if (!timeFormatter) {\n dateText = `${timeFormat(leftPoint.date)} to ${timeFormat(rightPoint.date)}`\n } else {\n dateText = timeFormatter({ left: leftPoint.date, right: rightPoint.date, direction })\n }\n\n sumNode.textContent = valueText\n timeNode.textContent = dateText\n\n requestAnimationFrame(() => {\n const tooltipRect = wrapper.getBoundingClientRect()\n const containerRect = context.wrapperNode.getBoundingClientRect()\n\n const leftX = context.x(leftPoint.date)\n const rightX = context.x(rightPoint.date)\n const selectionCenterX = (leftX + rightX) / 2\n\n let tooltipX = selectionCenterX - tooltipRect.width / 2\n\n const minX = 0\n const maxX = containerRect.width - tooltipRect.width\n\n if (tooltipX < minX) tooltipX = minX\n if (tooltipX > maxX) tooltipX = maxX\n\n wrapper.style.left = `${tooltipX}px`\n wrapper.style.top = `${y}px`\n })\n }\n\n if (hidden !== undefined) {\n wrapper.style.display = hidden ? 'none' : 'block'\n }\n },\n destroy() {\n wrapper.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartElements } from './types'\nimport { ChartContext } from '../types'\n\nconst BASE_CLASSNAME = 'sc-charts__hover-tooltip'\nconst TOOLTIP_OFFSET_PX = 16\n\nconst timeFormat = d3.timeFormat('%a, %b %d, %-I:%M %p')\nconst sumFormat = (sum: number) => {\n const fmt = d3.format(',.2f')\n return `${sum < 0 ? '-' : ''}$${fmt(Math.abs(sum))}`\n}\n\nfunction createTooltipElements(container: HTMLDivElement) {\n const tooltip = document.createElement('div')\n tooltip.className = `${BASE_CLASSNAME}-container`\n tooltip.style.position = 'absolute'\n tooltip.style.top = '0'\n tooltip.style.pointerEvents = 'none'\n tooltip.style.display = 'none'\n container.appendChild(tooltip)\n\n const sumNode = document.createElement('div')\n sumNode.className = `${BASE_CLASSNAME}-sum`\n tooltip.appendChild(sumNode)\n\n const timeNode = document.createElement('div')\n timeNode.className = `${BASE_CLASSNAME}-time`\n tooltip.appendChild(timeNode)\n\n return { wrapper: tooltip, sumNode, timeNode }\n}\n\nfunction calcTooltipPosition(\n tooltipDimensions: DOMRect,\n initX: number,\n maxX: number\n): number | null {\n if (!tooltipDimensions) return null\n\n const fitsRight = initX + TOOLTIP_OFFSET_PX + tooltipDimensions.width < maxX\n\n const tooltipX = fitsRight\n ? initX + TOOLTIP_OFFSET_PX\n : initX - TOOLTIP_OFFSET_PX - tooltipDimensions.width\n\n return tooltipX\n}\n\nexport const renderHoverTooltip = (\n context: Omit<ChartContext, 'elements'>\n): ChartElements['hoverTooltip'] => {\n const { wrapper, sumNode, timeNode } = createTooltipElements(context.wrapperNode)\n\n return {\n className(action, mod) {\n if (action === 'remove') {\n wrapper.classList.remove(`${BASE_CLASSNAME}${mod}`)\n } else {\n wrapper.classList.add(`${BASE_CLASSNAME}${mod}`)\n }\n },\n\n update({ hidden, dataItem }) {\n if (dataItem) {\n sumNode.textContent = sumFormat(dataItem.value)\n timeNode.textContent = timeFormat(dataItem.date)\n\n requestAnimationFrame(() => {\n const tooltipDimensions = wrapper.getBoundingClientRect()\n const tooltipX = calcTooltipPosition(\n tooltipDimensions,\n context.x(dataItem.date),\n context.width - context.config.margin.right\n )\n if (tooltipX) wrapper.style.left = tooltipX + 'px'\n })\n }\n\n if (hidden !== undefined) {\n wrapper.style.display = hidden ? 'none' : 'block'\n }\n },\n\n destroy() {\n wrapper.remove()\n },\n }\n}\n","import { ChartConfigContext, ChartContext } from './types'\nimport * as d3 from 'd3'\n\nexport const defaultConfig: ChartConfigContext = {\n margin: { top: 10, right: 30, bottom: 20, left: 10 },\n theme: 'light',\n logo: {\n width: 406,\n height: 113,\n x: null,\n y: null,\n picDarkTheme: null,\n picLightTheme: null,\n },\n hasMainLineArea: false,\n hover: {\n enable: true,\n range: '1m',\n transitionDuration: 150,\n transitionName: 'default',\n },\n selection: {\n enable: true,\n sumFormatter: null,\n timeFormatter: null,\n },\n xAxis: {\n customTicks: false,\n tickFormat: null,\n ticks: null,\n tickValues: null,\n isShow: false,\n },\n yAxis: {\n customTicks: false,\n tickFormat: null,\n ticks: null,\n tickValues: null,\n isShow: true,\n },\n grid: {\n horizontalStyle: 'zero-line-dashed',\n verticalStyle: 'none',\n },\n enableBelowZeroLine: false,\n curveTension: 1,\n}\n\nexport const curveFunction = (ctx: Omit<ChartContext, 'elements'>) =>\n d3.curveCardinal.tension(ctx.config.curveTension)\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartElements } from './types'\nimport { createGradient, getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderMainLineArea = (\n ctx: Omit<ChartContext, 'elements'>\n): ChartElements['mainLineArea'] => {\n const { svg, data, x, y, config } = ctx\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const gradientId = 'main-line-area-gradient'\n\n createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-main-line)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n\n const areaGen = d3\n .area<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y0(y.range()[0])\n .y1((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const baseClassName = 'sc-charts__main-line-area'\n\n const item = svg\n .append('path')\n .datum(data)\n .attr('d', areaGen)\n .attr('class', baseClassName)\n .classed(`${baseClassName}_hidden`, !config.hasMainLineArea)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', areaGen)\n if (hidden !== undefined) {\n if (!config.hasMainLineArea) return null\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartElements, ClipProps } from './types'\nimport { createGradient, getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderRangeLineArea = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { clip?: ClipProps } = {}\n): ChartElements['rangeLineArea'] => {\n const baseClassName = 'sc-charts__range-line-area'\n const { svg, x, y, config, data, chartId } = ctx\n const { clip: initClip } = options\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const gradientId = 'range-line-area-gradient'\n\n createGradient(defs, gradientId + '_up', {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-selection-up)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n createGradient(defs, gradientId + '_down', {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-selection-down)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n\n const areaGen = d3\n .area<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y0(y.range()[0])\n .y1((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .datum(data)\n .attr('d', areaGen)\n .attr('class', baseClassName)\n .classed(`${baseClassName}_hidden`, !config.hasMainLineArea)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, hidden, clip }) {\n if (data !== undefined) item.datum(data).attr('d', areaGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartFabricElement, ClipProps, DataLineUpdateProps } from './types'\nimport { getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderDataLine = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { baseClassName: string; id: string; clip?: ClipProps }\n): ChartFabricElement<Partial<DataLineUpdateProps>> => {\n const { svg, data, x, y, chartId } = ctx\n const { baseClassName, id, clip: initClip } = options\n\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const lineGen = d3\n .line<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .classed(baseClassName, true)\n .datum(data)\n .attr('d', lineGen)\n .attr('id', id)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, clip, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', lineGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartFabricElement, ClipProps, DataLineUpdateProps } from './types'\nimport { getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderHighlightLine = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { baseClassName: string; id: string; clip?: ClipProps }\n): ChartFabricElement<Partial<DataLineUpdateProps>> => {\n const { svg, data, x, y, chartId, config } = ctx\n const { baseClassName, id, clip: initClip } = options\n\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const lineGen = d3\n .line<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .classed(baseClassName, true)\n .datum(data)\n .attr('d', lineGen)\n .attr('id', id)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, clip, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', lineGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n if (config.hover.transitionName === 'default') {\n clipRect\n .transition()\n .duration(config.hover.transitionDuration)\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n .ease(d3.easeLinear)\n } else {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import { ChartElements } from './types'\nimport { renderBorderRangeLine } from './range-border'\nimport { renderCirclePoint } from './circle-point'\nimport { renderHoverLine } from './hover-line'\nimport { ChartContext } from '../types'\nimport { renderRangeTooltip } from './range-tooltip'\nimport { renderHoverTooltip } from './hover-tooltip'\nimport { renderMainLineArea } from './main-line-area'\nimport { renderRangeLineArea } from './range-line-area'\nimport { renderDataLine } from './data-line'\nimport { getBelowZeroClip } from '../utils'\nimport { renderHighlightLine } from './highlight-line'\n\n// render each elements by order\nexport const createElements = (context: Omit<ChartContext, 'elements'>): ChartElements => {\n const mainLine = renderDataLine(context, {\n baseClassName: `sc-charts__main-line`,\n id: `${context.chartId}-sc-charts__main-line`,\n })\n const mainLineArea = renderMainLineArea(context)\n\n const hoverLine = renderHoverLine(context.svg)\n const highlightLine = renderHighlightLine(context, {\n baseClassName: `sc-charts__highlight-line`,\n id: `${context.chartId}-sc-charts__highlight-line`,\n clip: { x: 0, y: 0, width: '0', height: '0' },\n })\n\n let belowZeroLine = null\n\n if (context.config.enableBelowZeroLine) {\n belowZeroLine = renderDataLine(context, {\n baseClassName: `sc-charts__below-zero-line`,\n id: `${context.chartId}-sc-charts__below-zero-line`,\n clip: getBelowZeroClip(context),\n })\n }\n\n const hoverCircle = renderCirclePoint(context.svg, {\n className: 'sc-charts__hover-circle',\n hidden: true,\n })\n const rangeBorderLeft = renderBorderRangeLine(context.svg)\n const rangeBorderRight = renderBorderRangeLine(context.svg)\n const rangeLine = renderDataLine(context, {\n baseClassName: `sc-charts__range-line`,\n id: `${context.chartId}-sc-charts__range-line`,\n clip: { x: 0, y: 0, width: '0', height: '0' },\n })\n const rangeCircleLeft = renderCirclePoint(context.svg, {\n className: 'sc-charts__range-circle-left',\n hidden: true,\n })\n const rangeCircleRight = renderCirclePoint(context.svg, {\n className: 'sc-charts__range-circle-right',\n hidden: true,\n })\n const rangeTooltip = renderRangeTooltip(context)\n const hoverTooltip = renderHoverTooltip(context)\n const rangeLineArea = renderRangeLineArea(context)\n\n return {\n hoverLine,\n hoverCircle,\n rangeBorderLeft,\n rangeBorderRight,\n rangeLine,\n rangeLineArea,\n rangeCircleLeft,\n rangeCircleRight,\n mainLine,\n rangeTooltip,\n highlightLine,\n hoverTooltip,\n mainLineArea,\n belowZeroLine,\n }\n}\n","import { ScaleTime } from 'd3'\nimport { HoverRange } from '../../types'\n\nexport const getClipForRange = (\n hoverRange: HoverRange,\n closestDate: Date,\n x: ScaleTime<number, number, never>\n) => {\n const match = hoverRange.match(/^(\\d+)([dMhmw])$/)\n\n if (!match) {\n console.warn('Invalid hoverRange:', hoverRange)\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n }\n\n const [, amountStr, unit] = match\n const amount = parseInt(amountStr, 10)\n\n const [domainStart, domainEnd] = x.domain()\n\n let cursor = new Date(domainStart)\n\n while (cursor < domainEnd) {\n let next = new Date(cursor)\n\n switch (unit) {\n case 'M':\n next.setMinutes(next.getMinutes() + amount)\n break\n case 'h':\n next.setHours(next.getHours() + amount)\n break\n case 'd':\n next.setDate(next.getDate() + amount)\n break\n case 'w':\n next.setDate(next.getDate() + amount * 7)\n break\n case 'm':\n next = new Date(cursor.getFullYear(), cursor.getMonth() + amount, 1)\n break\n default:\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n }\n\n if (closestDate >= cursor && closestDate < next) {\n const xStart = x(cursor)\n const xEnd = x(next)\n return {\n x: xStart,\n y: 0,\n width: xEnd - xStart,\n height: '100%',\n }\n }\n\n cursor = new Date(next)\n }\n\n if (closestDate.getTime() === domainEnd.getTime()) {\n let prev = new Date(domainEnd)\n\n switch (unit) {\n case 'M':\n prev.setMinutes(prev.getMinutes() - amount)\n break\n case 'h':\n prev.setHours(prev.getHours() - amount)\n break\n case 'd':\n prev.setDate(prev.getDate() - amount)\n break\n case 'w':\n prev.setDate(prev.getDate() - amount * 7)\n break\n case 'm':\n prev = new Date(domainEnd.getFullYear(), domainEnd.getMonth() - amount, 1)\n break\n }\n\n const xStart = x(prev)\n const xEnd = x(domainEnd)\n return {\n x: xStart,\n y: 0,\n width: xEnd - xStart,\n height: '100%',\n }\n }\n\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n}\n","import { ChartContext, ParsedDataPoint } from '../../types'\nimport { getBelowZeroClip } from '../../utils'\nimport { getClipForRange } from './utils'\n\nexport const renderHoverItems = (ctx: ChartContext, closest: ParsedDataPoint) => {\n const {\n x,\n y,\n elements,\n config: { margin },\n height,\n } = ctx\n\n elements.hoverLine.update({\n x1: x(closest.date),\n x2: x(closest.date),\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.hoverCircle.update({\n cx: x(closest.date),\n cy: y(closest.value),\n hidden: false,\n })\n\n elements.hoverTooltip.update({\n dataItem: closest,\n hidden: false,\n })\n\n const baseClip = getClipForRange(ctx.config.hover.range, closest.date, x)\n\n elements.highlightLine.update({\n clip: baseClip,\n hidden: false,\n })\n\n elements.belowZeroLine?.update({\n clip: {\n ...baseClip,\n y: y(0),\n height: y.range()[0] - y(0) + margin.bottom,\n },\n })\n\n elements.mainLine.className('add', '_muted')\n}\n\nexport const hideHoverItems = (ctx: ChartContext) => {\n const { elements } = ctx\n elements.hoverLine.update({ hidden: true })\n elements.hoverCircle.update({ hidden: true })\n elements.highlightLine.update({ hidden: true })\n elements.mainLine.className('remove', '_muted')\n elements.hoverTooltip.update({ hidden: true })\n if (ctx.action !== 'selection') {\n elements.belowZeroLine?.update({\n clip: getBelowZeroClip(ctx),\n })\n }\n}\n","import { ChartElements } from '../elements/types'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nconst controlIsGrowingClasses = (elements: ChartElements, isGrowing: boolean) => {\n const names: (keyof Required<\n Pick<\n ChartElements,\n | 'rangeBorderLeft'\n | 'rangeBorderRight'\n | 'rangeCircleLeft'\n | 'rangeCircleRight'\n | 'rangeLine'\n | 'rangeLineArea'\n | 'rangeTooltip'\n >\n >)[] = [\n 'rangeBorderLeft',\n 'rangeBorderRight',\n 'rangeCircleLeft',\n 'rangeCircleRight',\n 'rangeLine',\n 'rangeLineArea',\n 'rangeTooltip',\n ]\n\n names.forEach((name) => {\n if (isGrowing) {\n elements[name].className('remove', '_down')\n elements[name].className('add', '_up')\n } else {\n elements[name].className('remove', '_up')\n elements[name].className('add', '_down')\n }\n })\n}\n\nexport const renderSelectionItems = (\n ctx: ChartContext,\n startPoint: ParsedDataPoint,\n closest: ParsedDataPoint\n) => {\n const {\n x,\n y,\n config: { margin },\n height,\n elements,\n } = ctx\n\n const leftPoint = x(startPoint.date) < x(closest.date) ? startPoint : closest\n const rightPoint = x(startPoint.date) >= x(closest.date) ? startPoint : closest\n const isGrowing = rightPoint.value - leftPoint.value >= 0\n const xLeft = x(leftPoint.date)\n const xRight = x(rightPoint.date)\n const selectionWidth = xRight - xLeft\n\n elements.rangeBorderLeft.update({\n x1: xLeft,\n x2: xLeft,\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.rangeBorderRight.update({\n x1: xRight,\n x2: xRight,\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.rangeCircleLeft.update({\n cx: xLeft,\n cy: y(leftPoint.value),\n hidden: false,\n })\n\n elements.rangeCircleRight.update({\n cx: xRight,\n cy: y(rightPoint.value),\n hidden: false,\n })\n\n elements.rangeLine.update({\n clip: {\n x: xLeft,\n y: 0,\n width: selectionWidth,\n height: y.range()[0],\n },\n hidden: false,\n })\n\n elements.rangeLineArea.update({\n clip: {\n x: xLeft,\n y: 0,\n width: selectionWidth,\n height: y.range()[0],\n },\n hidden: false,\n })\n\n elements.rangeTooltip.update({\n rightPoint,\n leftPoint,\n closest,\n x: xLeft + selectionWidth / 2,\n y: 0,\n hidden: false,\n })\n\n elements.belowZeroLine?.update({\n hidden: true,\n })\n\n elements.mainLineArea.update({ hidden: true })\n\n controlIsGrowingClasses(elements, isGrowing)\n elements.mainLine.className('add', '_selected-muted')\n}\n\nexport const hideSelectionItems = (ctx: ChartContext) => {\n const { elements } = ctx\n elements.rangeLine.update({ hidden: true })\n elements.rangeLineArea.update({ hidden: true })\n elements.rangeBorderLeft.update({ hidden: true })\n elements.rangeBorderRight.update({ hidden: true })\n elements.rangeCircleLeft.update({ hidden: true })\n elements.rangeCircleRight.update({ hidden: true })\n elements.rangeTooltip.update({ hidden: true })\n elements.mainLine.className('remove', '_selected-muted')\n elements.mainLineArea.update({ hidden: false })\n elements.belowZeroLine?.update({ hidden: false })\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { hideHoverItems, renderHoverItems } from './hover'\nimport { hideSelectionItems, renderSelectionItems } from './selection'\n\nexport const setupInteractions = (ctx: ChartContext) => {\n const { svg, data, x, config, width, height } = ctx\n const { margin, hover, selection } = config\n let startPoint: ParsedDataPoint | null = null\n let isDragging = false\n\n const findClosest = (mouseX: number) => {\n return data.reduce((a, b) =>\n Math.abs(x(a.date) - mouseX) < Math.abs(x(b.date) - mouseX) ? a : b\n )\n }\n\n const overlay = svg\n .append('rect')\n .attr('width', width - margin.left - margin.right)\n .attr('height', height - margin.top - margin.bottom)\n .attr('x', margin.left)\n .attr('y', margin.top)\n .attr('fill', 'transparent')\n\n overlay\n .on('mousemove', function (event) {\n const [mouseX] = d3.pointer(event, this)\n const closest = findClosest(mouseX)\n\n if (!isDragging && hover.enable) {\n ctx.action = 'hover'\n renderHoverItems(ctx, closest)\n } else {\n ctx.action = isDragging ? 'selection' : 'none'\n hideHoverItems(ctx)\n }\n\n if (startPoint && selection.enable) {\n ctx.action = 'selection'\n renderSelectionItems(ctx, startPoint, closest)\n }\n })\n .on('mouseleave', () => {\n ctx.action = 'none'\n isDragging = false\n startPoint = null\n hideHoverItems(ctx)\n hideSelectionItems(ctx)\n })\n .on('mousedown', function (event) {\n if (selection.enable) {\n isDragging = true\n ctx.action = 'selection'\n const [mouseX] = d3.pointer(event, this)\n startPoint = findClosest(mouseX)\n }\n })\n .on('mouseup', function (event) {\n const [mouseX] = d3.pointer(event, this)\n const closest = findClosest(mouseX)\n isDragging = false\n startPoint = null\n ctx.action = 'hover'\n\n if (selection.enable) hideSelectionItems(ctx)\n if (hover.enable) renderHoverItems(ctx, closest)\n })\n}\n","import * as d3 from 'd3'\nimport { ChartConfigContext, ParsedDataPoint } from '../types'\n\nexport const createXScale = (\n data: ParsedDataPoint[],\n config: ChartConfigContext,\n width: number\n) => {\n const { margin } = config\n\n const scale = d3.scaleTime()\n\n const xExtent = d3.extent(data, (d) => new Date(d.date))\n\n if (xExtent[0] == null || xExtent[1] == null) return scale\n\n return scale.domain([xExtent[0], xExtent[1]]).range([margin.left, width - margin.right])\n}\n\nexport const createYScale = (\n data: ParsedDataPoint[],\n config: ChartConfigContext,\n height: number\n) => {\n const { margin } = config\n\n const yMax = d3.max(data, (d) => d.value) ?? 0\n const yMin = d3.min(data, (d) => d.value) ?? 0\n\n return d3\n .scaleLinear()\n .domain([yMin, yMax])\n .range([height - margin.bottom, margin.top])\n}\n","import * as d3 from 'd3'\nimport { createAxes } from './axes'\nimport { createElements } from './elements'\nimport { setupInteractions } from './interactions'\nimport { ChartContext, ParsedDataPoint, LineChartOptions, RenderLineChartOptions } from './types'\nimport { defaultConfig } from './constants'\nimport { mergeConfig } from './utils'\nimport { createYScale, createXScale } from './scales'\nimport '../../css/line-chart.css'\n\nexport const createLineChart = (selector: string, initialOptions: LineChartOptions) => {\n const container = d3.select(selector)\n if (container.empty()) {\n console.error(`Element with selector ${selector} not found!`)\n return null\n }\n if (!initialOptions.chartId || !/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(initialOptions.chartId)) {\n console.error(`chartId is required and must be a valid id \n (only letters, numbers or underscores. The first character must be a letter)`)\n return null\n }\n\n const wrapper = container.append('div')\n const svg = wrapper.append('svg')\n\n const containerNode = container.node() as HTMLElement\n let boundingRect = containerNode.getBoundingClientRect()\n let width = boundingRect.width\n let height = boundingRect.height\n let currentConfig = mergeConfig({ ...defaultConfig }, initialOptions.config)\n let currentData = initialOptions.data\n\n const handleResize = () => {\n boundingRect = containerNode.getBoundingClientRect()\n width = boundingRect.width\n height = boundingRect.height\n render({ data: currentData, config: currentConfig })\n }\n\n window.addEventListener('resize', handleResize)\n\n const render = (options: RenderLineChartOptions, isUpdate = false) => {\n if (isUpdate && options.config) {\n currentConfig = mergeConfig(currentConfig, options.config)\n }\n if (isUpdate && options.data) {\n currentData = options.data\n }\n\n const data: ParsedDataPoint[] = currentData\n .map((d) => ({ date: new Date(d.date), value: d.value }))\n .sort((a, b) => a.date.getTime() - b.date.getTime())\n\n const x = createXScale(data, currentConfig, width)\n const y = createYScale(data, currentConfig, height)\n\n wrapper.attr('class', `sc-charts sc-charts__${currentConfig.theme}`)\n svg\n .attr('preserveAspectRatio', 'xMinYMin meet')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .style('width', '100%')\n .style('height', '100%')\n .selectAll('*')\n .remove()\n\n const preContext: Omit<ChartContext, 'elements'> = {\n chartId: initialOptions.chartId,\n svg,\n wrapperNode: wrapper.node()!,\n data,\n x,\n y,\n config: currentConfig,\n action: 'none',\n width,\n height,\n }\n\n createAxes(preContext)\n\n const context: ChartContext = {\n ...preContext,\n elements: createElements(preContext),\n }\n setupInteractions(context)\n }\n\n render(initialOptions)\n\n return {\n update: (options: RenderLineChartOptions) => render(options, true),\n destroy: () => {\n window.removeEventListener('resize', handleResize)\n svg.remove()\n },\n }\n}\n"],"names":["renderYAxis","context","svg","config","y","width","margin","yAxis","customTicks","tickFormat","tickValues","ticks","isShow","g","axis","d3","d","num","sign","formatted","renderXAxis","x","height","xAxis","renderHorizontalStyles","horizontalStyle","line","tick","renderVerticalStyles","verticalStyle","renderGrid","createAxes","logo","createGradient","defs","gradientId","options","gradient","offset","stopColor","getDefs","defsSelection","getBelowZeroClip","ctx","clipHeight","mergeConfig","base","patch","renderBorderRangeLine","parent","createBorderGradient","mainColor","baseClassName","item","action","mod","x1","x2","y1","y2","hidden","renderCirclePoint","cx","cy","fill","renderHoverLine","BASE_CLASSNAME","timeFormat","sumFormat","sum","fmt","icon","createTooltipElements","container","tooltip","wrapper","sumWrapper","iconNode","sumNode","timeNode","renderRangeTooltip","leftPoint","rightPoint","closest","delta","sumFormatter","timeFormatter","selectionCenter","direction","valueText","dateText","percent","tooltipRect","containerRect","leftX","rightX","tooltipX","minX","maxX","TOOLTIP_OFFSET_PX","calcTooltipPosition","tooltipDimensions","initX","renderHoverTooltip","dataItem","defaultConfig","curveFunction","renderMainLineArea","data","svgNode","areaGen","renderRangeLineArea","chartId","initClip","clipId","clipRect","clip","renderDataLine","id","lineGen","renderHighlightLine","createElements","mainLine","mainLineArea","hoverLine","highlightLine","belowZeroLine","hoverCircle","rangeBorderLeft","rangeBorderRight","rangeLine","rangeCircleLeft","rangeCircleRight","rangeTooltip","hoverTooltip","rangeLineArea","getClipForRange","hoverRange","closestDate","match","amountStr","unit","amount","domainStart","domainEnd","cursor","next","xStart","xEnd","prev","renderHoverItems","elements","baseClip","_a","hideHoverItems","controlIsGrowingClasses","isGrowing","name","renderSelectionItems","startPoint","xLeft","xRight","selectionWidth","hideSelectionItems","setupInteractions","hover","selection","isDragging","findClosest","mouseX","a","b","event","createXScale","scale","xExtent","createYScale","yMax","yMin","createLineChart","selector","initialOptions","containerNode","boundingRect","currentConfig","currentData","handleResize","render","isUpdate","preContext"],"mappings":";AAGa,MAAAA,IAAc,CAACC,MAA4C;AACtE,QAAM,EAAE,KAAAC,GAAK,QAAAC,GAAQ,GAAAC,GAAG,OAAAC,EAAU,IAAAJ,GAC5B,EAAE,QAAAK,GAAQ,OAAAC,EAAA,IAAUJ,GACpB,EAAE,aAAAK,GAAa,YAAAC,GAAY,YAAAC,GAAY,OAAAC,GAAO,QAAAC,MAAWL;AAE3D,MAAA,CAACK,EAAe,QAAA;AAEpB,EAAAV,EACG,OAAO,GAAG,EACV,KAAK,aAAa,aAAaG,IAAQC,EAAO,KAAK,KAAK,EACxD,KAAK,CAACO,MAAM;AACP,QAAAC,IAAOC,EAAG,UAAUX,CAAC;AACzB,IAAII,KACEC,MACKK,IAAAA,EAAK,WAAWL,CAAU,IAE/BE,MACKG,IAAA,MAAM,QAAQH,CAAK,IAAIG,EAAK,MAAM,GAAGH,CAAK,IAAIG,EAAK,MAAMH,CAAK,IAEnED,MACKI,IAAAA,EAAK,WAAWJ,CAAU,MAG5BI,IAAAA,EAAK,WAAW,CAACE,MAAM;AACtB,YAAAC,IAAM,OAAOD,CAAC,GACdE,IAAOD,IAAM,IAAI,MAAM,IACvBE,IAAYJ,EAAG,OAAO,KAAK,EAAE,KAAK,IAAIE,CAAG,CAAC;AACzC,aAAA,GAAGC,CAAI,GAAGC,CAAS;AAAA,IAAA,CAC3B,GAEHN,EAAE,KAAKC,CAAI;AAAA,EAAA,CACZ,EACA,KAAK,CAACD,MAAM;AACX,QAAIF,IAAoC,CAAC;AACvC,IAAAE,EAAA,UAAU,OAAO,EAAE,KAAK,CAACG,MAAML,EAAM,KAAKK,CAA6B,CAAC,GAC1Ef,EAAQ,SAASU;AAAAA,EAClB,CAAA,EACA,KAAK,CAACE,MAAMA,EAAE,OAAO,SAAS,EAAE,OAAQ,CAAA,EACxC,KAAK,CAACA,MAAMA,EAAE,UAAU,YAAY,EAAE,OAAQ,CAAA,EAC9C,KAAK,CAACA,MAAMA,EAAE,UAAU,YAAY,EAAE,QAAQ,0BAA0B,EAAI,CAAC,EAC7E,KAAK,eAAe,SAAS;AAClC,GCzCaO,IAAc,CAACnB,MAA4C;AACtE,QAAM,EAAE,KAAAC,GAAK,QAAAC,GAAQ,GAAAkB,GAAG,QAAAC,EAAW,IAAArB,GAC7B,EAAE,QAAAK,GAAQ,OAAAiB,EAAA,IAAUpB,GACpB,EAAE,QAAAS,GAAQ,YAAAF,GAAY,YAAAD,GAAY,aAAAD,GAAa,OAAAG,MAAUY;AAE3D,MAAA,CAACX,EAAe,QAAA;AAEpB,EAAAV,EACG,OAAO,GAAG,EACV,KAAK,aAAa,eAAeoB,IAAShB,EAAO,MAAM,GAAG,EAC1D,KAAK,CAACO,MAAM;AACP,QAAAC,IAAOC,EAAG,WAAWM,CAAC;AAC1B,IAAIb,KACEC,MACKK,IAAAA,EAAK,WAAWL,CAAU,IAE/BE,MACKG,IAAA,MAAM,QAAQH,CAAK,IAAIG,EAAK,MAAM,GAAGH,CAAK,IAAIG,EAAK,MAAMH,CAAK,IAEnED,MACKI,IAAAA,EAAK,WAAWJ,CAAU,MAGnCI,EAAK,MAAM,CAAC,GAEdD,EAAE,KAAKC,CAAI;AAAA,EACZ,CAAA,EACA,KAAK,CAACD,MAAMA,EAAE,OAAO,SAAS,EAAE,OAAQ,CAAA,EACxC,KAAK,CAACA,MAAM;AACX,QAAIF,IAAmC,CAAC;AACtC,IAAAE,EAAA,UAAU,OAAO,EAAE,KAAK,CAACG,MAAML,EAAM,KAAKK,CAA4B,CAAC,GACzEf,EAAQ,SAASU;AAAAA,EAAA,CAClB,EACA,KAAK,CAACE,MAAMA,EAAE,UAAU,YAAY,EAAE,QAAQ,EAC9C,KAAK,CAACA,MAAMA,EAAE,UAAU,YAAY,EAAE,QAAQ,0BAA0B,EAAI,CAAC,EAC7E,KAAK,eAAe,SAAS;AAClC,GCrCMW,IAAyB,CAACvB,MAA4C;AAC1E,QAAM,EAAE,KAAAC,GAAK,QAAAC,GAAQ,GAAAC,GAAG,OAAAC,EAAU,IAAAJ,GAC5B;AAAA,IACJ,QAAAK;AAAA,IACA,MAAM,EAAE,iBAAAmB,EAAgB;AAAA,EAAA,IACtBtB;AAEJ,MAAIsB,MAAoB,QAEpB;AAAA,QAAAA,EAAgB,WAAW,WAAW,GAAG;AAC3C,YAAMC,IAAOxB,EACV,OAAO,MAAM,EACb,KAAK,MAAM,IAAII,EAAO,IAAI,EAC1B,KAAK,MAAMD,IAAQC,EAAO,KAAK,EAC/B,KAAK,MAAMF,EAAE,CAAC,CAAC,EACf,KAAK,MAAMA,EAAE,CAAC,CAAC,EACf,KAAK,UAAU,gCAAgC,EAC/C,KAAK,gBAAgB,CAAC;AAEzB,MAAIqB,MAAoB,sBACjBC,EAAA,KAAK,oBAAoB,KAAK;AAAA,IACrC;AAGE,IAAAD,EAAgB,WAAW,YAAY,MAC3BxB,EAAQ,UAAUG,EAAE,MAAM,GAElC,QAAQ,CAACuB,MAAS;AACtB,YAAMD,IAAOxB,EACV,OAAO,MAAM,EACb,KAAK,MAAM,IAAII,EAAO,IAAI,EAC1B,KAAK,MAAMD,IAAQC,EAAO,KAAK,EAC/B,KAAK,MAAMF,EAAEuB,CAAI,CAAC,EAClB,KAAK,MAAMvB,EAAEuB,CAAI,CAAC,EAClB,KAAK,UAAU,gCAAgC,EAC/C,KAAK,gBAAgB,CAAC;AAEzB,MAAIF,MAAoB,uBACjBC,EAAA,KAAK,oBAAoB,KAAK;AAAA,IACrC,CACD;AAAA;AAEL,GAEME,IAAuB,CAAC3B,MAA4C;AACxE,QAAM,EAAE,KAAAC,GAAK,QAAAC,GAAQ,GAAAkB,GAAG,QAAAC,EAAW,IAAArB,GAC7B;AAAA,IACJ,QAAAK;AAAA,IACA,MAAM,EAAE,eAAAuB,EAAc;AAAA,EAAA,IACpB1B;AAEJ,EAAI0B,MAAkB,UAElBA,EAAc,WAAW,YAAY,MACzB5B,EAAQ,UAAUoB,EAAE,MAAM,GAElC,QAAQ,CAACM,MAAS;AACtB,UAAMD,IAAOxB,EACV,OAAO,MAAM,EACb,KAAK,MAAMmB,EAAEM,CAAI,CAAC,EAClB,KAAK,MAAMN,EAAEM,CAAI,CAAC,EAClB,KAAK,MAAMrB,EAAO,GAAG,EACrB,KAAK,MAAMgB,IAAShB,EAAO,MAAM,EACjC,KAAK,UAAU,gCAAgC,EAC/C,KAAK,gBAAgB,CAAC;AAEzB,IAAIuB,MAAkB,uBACfH,EAAA,KAAK,oBAAoB,KAAK;AAAA,EACrC,CACD;AAEL,GAEaI,IAAa,CAAC7B,MAA4C;AACrE,EAAAuB,EAAuBvB,CAAO,GAC9B2B,EAAqB3B,CAAO;AAC9B,GCzEa8B,IAAa,CAAC9B,MAA4C;AACrE,QAAM,EAAE,KAAAC,GAAK,QAAAC,GAAQ,OAAAE,GAAO,QAAAiB,EAAW,IAAArB,GACjC,EAAE,QAAAK,GAAQ,MAAA0B,EAAA,IAAS7B;AAGzB,EAAAiB,EAAYnB,CAAO,GAGnBD,EAAYC,CAAO,GAEf+B,KAEC9B,EAAA,OAAO,OAAO,EACd,KAAK,cAAcC,EAAO,UAAU,SAAS6B,EAAK,eAAeA,EAAK,aAAa,EACnF,KAAK,SAASA,EAAK,KAAK,EACxB,KAAK,UAAUA,EAAK,MAAM,EAC1B,KAAK,KAAKA,EAAK,MAAM3B,IAAQC,EAAO,OAAOA,EAAO,SAAS,IAAI0B,EAAK,QAAQ,IAAI1B,EAAO,IAAI,EAC3F,KAAK,KAAK0B,EAAK,MAAMV,IAAShB,EAAO,MAAMA,EAAO,UAAU,IAAI0B,EAAK,SAAS,IAAI1B,EAAO,GAAG,GAIjGwB,EAAW7B,CAAO;AACpB,GCxBagC,IAAiB,CAC5BC,GAGAC,GACAC,MAOqE;AACrE,MAAIC,IACFH,EAAK,OAAiC,IAAIC,CAAU,EAAE;AAEpD,SAAAE,EAAS,YACAA,IAAAH,EACR,OAAiC,gBAAgB,EACjD,KAAK,iBAAiB,gBAAgB,EACtC,KAAK,MAAMC,CAAU,IAG1BE,EACG,KAAK,MAAMD,EAAQ,EAAE,EACrB,KAAK,MAAMA,EAAQ,EAAE,EACrB,KAAK,MAAMA,EAAQ,EAAE,EACrB,KAAK,MAAMA,EAAQ,EAAE,GAExBA,EAAQ,MAAM,QAAQ,CAAC,EAAE,QAAAE,GAAQ,WAAAC,QAAgB;AACtC,IAAAF,EAAA,OAAO,MAAM,EAAE,KAAK,UAAUC,CAAM,EAAE,KAAK,cAAcC,CAAS;AAAA,EAAA,CAC5E,GAEMF;AACT,GAEaG,IAAU,CAACtC,MAAuB;AAC7C,QAAMuC,IAAgB1B,EAAG,OAAOb,CAAG,EAAE,OAAO,MAAM;AAG3C,SAFMuC,EAAc,MAAA,IAAU1B,EAAG,OAAOb,CAAG,EAAE,OAAO,MAAM,IAAIuC;AAGvE,GAEaC,IAAmB,CAACC,MAAwC;AACjE,QAAA;AAAA,IACJ,GAAAvC;AAAA,IACA,QAAQ,EAAE,QAAAE,EAAO;AAAA,EAAA,IACfqC,GACEC,IAAaxC,EAAE,MAAA,EAAQ,CAAC,IAAIA,EAAE,CAAC;AAErC,SAAO,EAAE,GAAG,GAAG,GAAGA,EAAE,MAAM,EAAE,CAAC,IAAIwC,GAAY,OAAO,QAAQ,QAAQA,IAAatC,EAAO,OAAO;AACjG,GAEauC,IAAc,CAACC,GAA0BC,OAA6C;AAAA,EACjG,GAAGD;AAAA,EACH,GAAGC;AAAA,EACH,QAAQ;AAAA,IACN,GAAGD,EAAK;AAAA,IACR,GAAGC,KAAA,gBAAAA,EAAO;AAAA,EACZ;AAAA,EACA,MACED,EAAK,SAAQC,KAAA,QAAAA,EAAO,QAChB;AAAA,IACE,OAAOA,EAAM,KAAK,SAASD,EAAK,KAAK;AAAA,IACrC,QAAQC,EAAM,KAAK,UAAUD,EAAK,KAAK;AAAA,IACvC,eAAeC,EAAM,KAAK,iBAAiBD,EAAK,KAAK;AAAA,IACrD,cAAcC,EAAM,KAAK,gBAAgBD,EAAK,KAAK;AAAA,IACnD,GAAGC,EAAM,KAAK,KAAKD,EAAK,KAAK;AAAA,IAC7B,GAAGC,EAAM,KAAK,KAAKD,EAAK,KAAK;AAAA,MAE/BA,EAAK;AAAA,EAEX,OAAO;AAAA,IACL,GAAGA,EAAK;AAAA,IACR,GAAGC,KAAA,gBAAAA,EAAO;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,IACL,GAAGD,EAAK;AAAA,IACR,GAAGC,KAAA,gBAAAA,EAAO;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,GAAGD,EAAK;AAAA,IACR,GAAGC,KAAA,gBAAAA,EAAO;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,IACL,GAAGD,EAAK;AAAA,IACR,GAAGC,KAAA,gBAAAA,EAAO;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,IACT,GAAGD,EAAK;AAAA,IACR,GAAGC,KAAA,gBAAAA,EAAO;AAAA,EAAA;AAEd,IC5FaC,IAAwB,CACnCC,GACAb,IAA0B,OACW;AAC/B,QAAAlC,IAAM+C,EAAO,KAAK,GAClBf,IAAOM,EAAQtC,CAAG,GAElBgD,IAAuB,CAACf,GAAoBgB,MACzClB,EAAeC,GAAMC,GAAY;AAAA,IACtC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,EAAE,QAAQ,MAAM,WAAW,yBAAyB;AAAA,MACpD,EAAE,QAAQ,OAAO,WAAWgB,EAAU;AAAA,MACtC,EAAE,QAAQ,OAAO,WAAWA,EAAU;AAAA,MACtC,EAAE,QAAQ,QAAQ,WAAW,yBAAyB;AAAA,IAAA;AAAA,EACxD,CACD;AAGH,EAAAD,EAAqB,6BAA6B,8BAA8B,GAChFA,EAAqB,+BAA+B,gCAAgC;AAEpF,QAAME,IAAgB,gCAEhBC,IAAOJ,EACV,OAAO,MAAM,EACb,QAAQG,GAAe,EAAI,EAC3B,MAAM,WAAWhB,EAAQ,SAAS,SAAS,OAAO;AAE9C,SAAA;AAAA,IACL,UAAUkB,GAAQC,GAAK;AACjB,MAAAD,MAAW,WAAeD,EAAA,QAAQ,GAAGD,CAAa,GAAGG,CAAG,IAAI,EAAK,MAC3D,QAAQ,GAAGH,CAAa,GAAGG,CAAG,IAAI,EAAI;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,IAAAC,GAAI,IAAAC,GAAI,IAAAC,GAAI,IAAAC,GAAI,QAAAC,KAAU;AACjC,MAAIJ,MAAO,UAAgBH,EAAA,KAAK,MAAMG,CAAE,GACpCC,MAAO,UAAgBJ,EAAA,KAAK,MAAMI,CAAE,GACpCC,MAAO,UAAgBL,EAAA,KAAK,MAAMK,CAAE,GACpCC,MAAO,UAAgBN,EAAA,KAAK,MAAMM,CAAE,GACpCC,MAAW,UAAWP,EAAK,MAAM,WAAWO,IAAS,SAAS,OAAO;AAAA,IAC3E;AAAA,IAEA,UAAU;AACR,MAAAP,EAAK,OAAO;AAAA,IAAA;AAAA,EAEhB;AACF,GClDaQ,IAAoB,CAC/BZ,GACAb,IAA0B,OACO;AACjC,QAAMiB,IAAOJ,EACV,OAAO,QAAQ,EACf,KAAK,KAAKb,EAAQ,UAAU,CAAC,EAC7B,MAAM,WAAWA,EAAQ,SAAS,SAAS,OAAO,GAE/CgB,IAAgBhB,EAAQ,aAAa;AAC3C,SAAIgB,KAAeC,EAAK,QAAQD,GAAe,EAAI,GAE5C;AAAA,IACL,UAAUE,GAAQC,GAAK;AACjB,MAAAD,MAAW,WAAeD,EAAA,QAAQ,GAAGD,CAAa,GAAGG,CAAG,IAAI,EAAK,MAC3D,QAAQ,GAAGH,CAAa,GAAGG,CAAG,IAAI,EAAI;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,IAAAO,GAAI,IAAAC,GAAI,QAAAH,GAAQ,MAAAI,KAAQ;AAC/B,MAAIF,MAAO,UAAgBT,EAAA,KAAK,MAAMS,CAAE,GACpCC,MAAO,UAAgBV,EAAA,KAAK,MAAMU,CAAE,GACpCC,MAAS,UAAgBX,EAAA,KAAK,QAAQW,CAAI,GAC1CJ,MAAW,UAAWP,EAAK,MAAM,WAAWO,IAAS,SAAS,OAAO;AAAA,IAC3E;AAAA,IAEA,UAAU;AACR,MAAAP,EAAK,OAAO;AAAA,IAAA;AAAA,EAEhB;AACF,GC3BaY,IAAkB,CAC7BhB,GACAb,IAA0B,OACK;AAC/B,QAAMgB,IAAgB,yBAChBC,IAAOJ,EACV,OAAO,MAAM,EACb,MAAM,WAAWb,EAAQ,SAAS,SAAS,OAAO,EAClD,QAAQgB,GAAe,EAAI,GACxBlD,IAAM+C,EAAO,KAAK,GAClBf,IAAOM,EAAQtC,CAAG;AAiBxB,UAf6B,CAACiC,GAAoBgB,MACzClB,EAAeC,GAAMC,GAAY;AAAA,IACtC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,EAAE,QAAQ,MAAM,WAAW,yBAAyB;AAAA,MACpD,EAAE,QAAQ,OAAO,WAAWgB,EAAU;AAAA,MACtC,EAAE,QAAQ,OAAO,WAAWA,EAAU;AAAA,MACtC,EAAE,QAAQ,QAAQ,WAAW,yBAAyB;AAAA,IAAA;AAAA,EACxD,CACD,GAGkB,uBAAuB,4BAA4B,GAEjE;AAAA,IACL,UAAUG,GAAQC,GAAK;AACjB,MAAAD,MAAW,WAAeD,EAAA,QAAQ,GAAGD,CAAa,GAAGG,CAAG,IAAI,EAAK,MAC3D,QAAQ,GAAGH,CAAa,GAAGG,CAAG,IAAI,EAAI;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,IAAAC,GAAI,IAAAC,GAAI,IAAAC,GAAI,IAAAC,GAAI,QAAAC,KAAU;AACjC,MAAIJ,MAAO,UAAgBH,EAAA,KAAK,MAAMG,CAAE,GACpCC,MAAO,UAAgBJ,EAAA,KAAK,MAAMI,CAAE,GACpCC,MAAO,UAAgBL,EAAA,KAAK,MAAMK,CAAE,GACpCC,MAAO,UAAgBN,EAAA,KAAK,MAAMM,CAAE,GACpCC,MAAW,UAAWP,EAAK,MAAM,WAAWO,IAAS,SAAS,OAAO;AAAA,IAC3E;AAAA,IACA,UAAU;AACR,MAAAP,EAAK,OAAO;AAAA,IAAA;AAAA,EAEhB;AACF,GC5CMa,IAAiB,4BAEjBC,IAAapD,EAAG,WAAW,iBAAiB,GAC5CqD,IAAY,CAACC,MAAgB;AAC3B,QAAAC,IAAMvD,EAAG,OAAO,MAAM;AACrB,SAAA,GAAGsD,IAAM,IAAI,MAAM,EAAE,IAAIC,EAAI,KAAK,IAAID,CAAG,CAAC,CAAC;AACpD,GAEME,IAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAOb,SAASC,EAAsBC,GAA2B;AAClD,QAAAC,IAAU,SAAS,cAAc,KAAK;AAC5C,EAAAA,EAAQ,YAAYR,GACpBO,EAAU,OAAOC,CAAO;AAElB,QAAAC,IAAU,SAAS,cAAc,KAAK;AACpC,EAAAA,EAAA,YAAY,GAAGT,CAAc,cACrCQ,EAAQ,MAAM,WAAW,YACzBA,EAAQ,MAAM,MAAM,KACpBA,EAAQ,MAAM,gBAAgB,QAC9BA,EAAQ,MAAM,UAAU,QACxBA,EAAQ,OAAOC,CAAO;AAEhB,QAAAC,IAAa,SAAS,cAAc,KAAK;AACpC,EAAAA,EAAA,YAAY,GAAGV,CAAc,QACxCS,EAAQ,OAAOC,CAAU;AAEnB,QAAAC,IAAW,SAAS,cAAc,KAAK;AACpC,EAAAA,EAAA,YAAY,GAAGX,CAAc,aACtCW,EAAS,YAAYN,GACrBK,EAAW,OAAOC,CAAQ;AAEpB,QAAAC,IAAU,SAAS,cAAc,KAAK;AAC5C,EAAAF,EAAW,OAAOE,CAAO;AAEnB,QAAAC,IAAW,SAAS,cAAc,KAAK;AACpC,SAAAA,EAAA,YAAY,GAAGb,CAAc,SACtCS,EAAQ,OAAOI,CAAQ,GAEhB,EAAE,SAASL,GAAS,SAAAI,GAAS,UAAAC,EAAS;AAC/C;AAEa,MAAAC,IAAqB,CAChC/E,MACkC;AAClC,QAAM,EAAE,SAAA0E,GAAS,SAAAG,GAAS,UAAAC,EAAa,IAAAP,EAAsBvE,EAAQ,WAAW;AAEzE,SAAA;AAAA,IACL,UAAUqD,GAAQC,GAAK;AACrB,MAAID,MAAW,WACbqB,EAAQ,UAAU,OAAO,GAAGT,CAAc,GAAGX,CAAG,EAAE,IAElDoB,EAAQ,UAAU,IAAI,GAAGT,CAAc,GAAGX,CAAG,EAAE;AAAA,IAEnD;AAAA,IACA,OAAO,EAAE,WAAA0B,GAAW,YAAAC,GAAY,GAAA7D,GAAG,GAAAjB,GAAG,QAAAwD,GAAQ,SAAAuB,KAAW;AACvD,UAAIF,KAAaC,KAAcC,KAAW9D,MAAM,QAAW;AACnD,cAAA+D,IAAQF,EAAW,QAAQD,EAAU,OACrC,EAAE,cAAAI,GAAc,eAAAC,EAAc,IAAIrF,EAAQ,OAAO,WAEjDsF,KAAmBtF,EAAQ,EAAEiF,EAAW,IAAI,IAAIjF,EAAQ,EAAEgF,EAAU,IAAI,KAAK,GAC7EO,IAAYvF,EAAQ,EAAEkF,EAAQ,IAAI,IAAII,IAAkB,SAAS;AAEvE,YAAIE,IAAY,IACZC,IAAW;AAEf,YAAKL;AAIS,UAAAI,IAAAJ,EAAa,EAAE,MAAMJ,EAAU,OAAO,OAAOC,EAAW,OAAO,WAAAM,GAAW;AAAA,aAJrE;AACX,gBAAAG,KAAYP,IAAQ,KAAK,IAAIH,EAAU,KAAK,IAAK,KAAK,QAAQ,CAAC;AACrE,UAAAQ,IAAY,GAAGrB,EAAUgB,CAAK,CAAC,KAAKO,CAAO;AAAA,QAAA;AAK7C,QAAKL,IAGQI,IAAAJ,EAAc,EAAE,MAAML,EAAU,MAAM,OAAOC,EAAW,MAAM,WAAAM,GAAW,IAFzEE,IAAA,GAAGvB,EAAWc,EAAU,IAAI,CAAC,OAAOd,EAAWe,EAAW,IAAI,CAAC,IAK5EJ,EAAQ,cAAcW,GACtBV,EAAS,cAAcW,GAEvB,sBAAsB,MAAM;AACpB,gBAAAE,IAAcjB,EAAQ,sBAAsB,GAC5CkB,IAAgB5F,EAAQ,YAAY,sBAAsB,GAE1D6F,IAAQ7F,EAAQ,EAAEgF,EAAU,IAAI,GAChCc,IAAS9F,EAAQ,EAAEiF,EAAW,IAAI;AAGpC,cAAAc,KAFsBF,IAAQC,KAAU,IAEVH,EAAY,QAAQ;AAEtD,gBAAMK,IAAO,GACPC,IAAOL,EAAc,QAAQD,EAAY;AAE3C,UAAAI,IAAWC,MAAiBD,IAAAC,IAC5BD,IAAWE,MAAiBF,IAAAE,IAExBvB,EAAA,MAAM,OAAO,GAAGqB,CAAQ,MACxBrB,EAAA,MAAM,MAAM,GAAGvE,CAAC;AAAA,QAAA,CACzB;AAAA,MAAA;AAGH,MAAIwD,MAAW,WACLe,EAAA,MAAM,UAAUf,IAAS,SAAS;AAAA,IAE9C;AAAA,IACA,UAAU;AACR,MAAAe,EAAQ,OAAO;AAAA,IAAA;AAAA,EAEnB;AACF,GCpHMT,IAAiB,4BACjBiC,IAAoB,IAEpBhC,IAAapD,EAAG,WAAW,sBAAsB,GACjDqD,IAAY,CAACC,MAAgB;AAC3B,QAAAC,IAAMvD,EAAG,OAAO,MAAM;AACrB,SAAA,GAAGsD,IAAM,IAAI,MAAM,EAAE,IAAIC,EAAI,KAAK,IAAID,CAAG,CAAC,CAAC;AACpD;AAEA,SAASG,GAAsBC,GAA2B;AAClD,QAAAC,IAAU,SAAS,cAAc,KAAK;AACpC,EAAAA,EAAA,YAAY,GAAGR,CAAc,cACrCQ,EAAQ,MAAM,WAAW,YACzBA,EAAQ,MAAM,MAAM,KACpBA,EAAQ,MAAM,gBAAgB,QAC9BA,EAAQ,MAAM,UAAU,QACxBD,EAAU,YAAYC,CAAO;AAEvB,QAAAI,IAAU,SAAS,cAAc,KAAK;AACpC,EAAAA,EAAA,YAAY,GAAGZ,CAAc,QACrCQ,EAAQ,YAAYI,CAAO;AAErB,QAAAC,IAAW,SAAS,cAAc,KAAK;AACpC,SAAAA,EAAA,YAAY,GAAGb,CAAc,SACtCQ,EAAQ,YAAYK,CAAQ,GAErB,EAAE,SAASL,GAAS,SAAAI,GAAS,UAAAC,EAAS;AAC/C;AAEA,SAASqB,GACPC,GACAC,GACAJ,GACe;AACX,SAACG,IAEaC,IAAQH,IAAoBE,EAAkB,QAAQH,IAGpEI,IAAQH,IACRG,IAAQH,IAAoBE,EAAkB,QANnB;AASjC;AAEa,MAAAE,KAAqB,CAChCtG,MACkC;AAClC,QAAM,EAAE,SAAA0E,GAAS,SAAAG,GAAS,UAAAC,EAAa,IAAAP,GAAsBvE,EAAQ,WAAW;AAEzE,SAAA;AAAA,IACL,UAAUqD,GAAQC,GAAK;AACrB,MAAID,MAAW,WACbqB,EAAQ,UAAU,OAAO,GAAGT,CAAc,GAAGX,CAAG,EAAE,IAElDoB,EAAQ,UAAU,IAAI,GAAGT,CAAc,GAAGX,CAAG,EAAE;AAAA,IAEnD;AAAA,IAEA,OAAO,EAAE,QAAAK,GAAQ,UAAA4C,KAAY;AAC3B,MAAIA,MACM1B,EAAA,cAAcV,EAAUoC,EAAS,KAAK,GACrCzB,EAAA,cAAcZ,EAAWqC,EAAS,IAAI,GAE/C,sBAAsB,MAAM;AACpB,cAAAH,IAAoB1B,EAAQ,sBAAsB,GAClDqB,IAAWI;AAAA,UACfC;AAAA,UACApG,EAAQ,EAAEuG,EAAS,IAAI;AAAA,UACvBvG,EAAQ,QAAQA,EAAQ,OAAO,OAAO;AAAA,QACxC;AACA,QAAI+F,MAAUrB,EAAQ,MAAM,OAAOqB,IAAW;AAAA,MAAA,CAC/C,IAGCpC,MAAW,WACLe,EAAA,MAAM,UAAUf,IAAS,SAAS;AAAA,IAE9C;AAAA,IAEA,UAAU;AACR,MAAAe,EAAQ,OAAO;AAAA,IAAA;AAAA,EAEnB;AACF,GCrFa8B,KAAoC;AAAA,EAC/C,QAAQ,EAAE,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAG;AAAA,EACnD,OAAO;AAAA,EACP,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,GAAG;AAAA,IACH,GAAG;AAAA,IACH,cAAc;AAAA,IACd,eAAe;AAAA,EACjB;AAAA,EACA,iBAAiB;AAAA,EACjB,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,EAClB;AAAA,EACA,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EACA,qBAAqB;AAAA,EACrB,cAAc;AAChB,GAEaC,IAAgB,CAAC/D,MAC5B5B,EAAG,cAAc,QAAQ4B,EAAI,OAAO,YAAY,GC3CrCgE,KAAqB,CAChChE,MACkC;AAClC,QAAM,EAAE,KAAAzC,GAAK,MAAA0G,GAAM,GAAAvF,GAAG,GAAAjB,GAAG,QAAAD,MAAWwC,GAC9BkE,IAAU3G,EAAI,KAAK,GACnBgC,IAAOM,EAAQqE,CAAO;AAI5B,EAAA5E,EAAeC,GAFI,2BAEc;AAAA,IAC/B,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,EAAE,QAAQ,MAAM,WAAW,4BAA4B;AAAA,MACvD,EAAE,QAAQ,QAAQ,WAAW,yBAAyB;AAAA,IAAA;AAAA,EACxD,CACD;AAED,QAAM4E,IAAU/F,EACb,KAAsB,EACtB,EAAE,CAACC,MAAMK,EAAEL,EAAE,IAAI,CAAC,EAClB,GAAGZ,EAAE,MAAQ,EAAA,CAAC,CAAC,EACf,GAAG,CAACY,MAAMZ,EAAEY,EAAE,KAAK,CAAC,EACpB,MAAM0F,EAAc/D,CAAG,CAAC,GAErBS,IAAgB,6BAEhBC,IAAOnD,EACV,OAAO,MAAM,EACb,MAAM0G,CAAI,EACV,KAAK,KAAKE,CAAO,EACjB,KAAK,SAAS1D,CAAa,EAC3B,QAAQ,GAAGA,CAAa,WAAW,CAACjD,EAAO,eAAe;AAEtD,SAAA;AAAA,IACL,UAAUmD,GAAQC,GAAK;AACjB,MAAAD,MAAW,WAAeD,EAAA,QAAQ,GAAGD,CAAa,GAAGG,CAAG,IAAI,EAAK,MAC3D,QAAQ,GAAGH,CAAa,GAAGG,CAAG,IAAI,EAAI;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,MAAAqD,GAAM,QAAAhD,KAAU;AAEvB,UADIgD,MAAS,UAAgBvD,EAAA,MAAMuD,CAAI,EAAE,KAAK,KAAKE,CAAO,GACtDlD,MAAW,QAAW;AACpB,YAAA,CAACzD,EAAO,gBAAwB,QAAA;AACpC,QAAAkD,EAAK,QAAQ,GAAGD,CAAa,WAAWQ,CAAM;AAAA,MAAA;AAAA,IAElD;AAAA,IACA,UAAU;AACR,MAAAP,EAAK,OAAO;AAAA,IAAA;AAAA,EAEhB;AACF,GCpDa0D,KAAsB,CACjCpE,GACAP,IAAgC,OACG;AACnC,QAAMgB,IAAgB,8BAChB,EAAE,KAAAlD,GAAK,GAAAmB,GAAG,GAAAjB,GAAG,QAAAD,GAAQ,MAAAyG,GAAM,SAAAI,MAAYrE,GACvC,EAAE,MAAMsE,EAAA,IAAa7E,GACrByE,IAAU3G,EAAI,KAAK,GACnBgC,IAAOM,EAAQqE,CAAO,GAEtB1E,IAAa;AAEJ,EAAAF,EAAAC,GAAMC,IAAa,OAAO;AAAA,IACvC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,EAAE,QAAQ,MAAM,WAAW,+BAA+B;AAAA,MAC1D,EAAE,QAAQ,QAAQ,WAAW,yBAAyB;AAAA,IAAA;AAAA,EACxD,CACD,GACcF,EAAAC,GAAMC,IAAa,SAAS;AAAA,IACzC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,EAAE,QAAQ,MAAM,WAAW,iCAAiC;AAAA,MAC5D,EAAE,QAAQ,QAAQ,WAAW,yBAAyB;AAAA,IAAA;AAAA,EACxD,CACD;AAED,QAAM2E,IAAU/F,EACb,KAAsB,EACtB,EAAE,CAACC,MAAMK,EAAEL,EAAE,IAAI,CAAC,EAClB,GAAGZ,EAAE,MAAQ,EAAA,CAAC,CAAC,EACf,GAAG,CAACY,MAAMZ,EAAEY,EAAE,KAAK,CAAC,EACpB,MAAM0F,EAAc/D,CAAG,CAAC,GAErBuE,IAAS,GAAGF,CAAO,SAAS5D,CAAa,IAGzC+D,IAFWjF,EAAK,OAAO,UAAU,EAAE,KAAK,MAAMgF,CAAM,EAGvD,OAAO,MAAM,EACb,KAAK,MAAKD,KAAA,gBAAAA,EAAU,MAAK,CAAC,EAC1B,KAAK,MAAKA,KAAA,gBAAAA,EAAU,MAAK,CAAC,EAC1B,KAAK,UAASA,KAAA,gBAAAA,EAAU,UAAS,MAAM,EACvC,KAAK,WAAUA,KAAA,gBAAAA,EAAU,WAAU,MAAM,GAEtC5D,IAAOnD,EACV,OAAO,MAAM,EACb,MAAM0G,CAAI,EACV,KAAK,KAAKE,CAAO,EACjB,KAAK,SAAS1D,CAAa,EAC3B,QAAQ,GAAGA,CAAa,WAAW,CAACjD,EAAO,eAAe,EAC1D,KAAK,aAAa,QAAQ+G,CAAM,GAAG;AAE/B,SAAA;AAAA,IACL,UAAU5D,GAAQC,GAAK;AACjB,MAAAD,MAAW,WAAeD,EAAA,QAAQ,GAAGD,CAAa,GAAGG,CAAG,IAAI,EAAK,MAC3D,QAAQ,GAAGH,CAAa,GAAGG,CAAG,IAAI,EAAI;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,MAAAqD,GAAM,QAAAhD,GAAQ,MAAAwD,KAAQ;AACzBR,MAAAA,MAAS,UAAgBvD,EAAA,MAAMuD,CAAI,EAAE,KAAK,KAAKE,CAAO,GACtDlD,MAAW,UACbP,EAAK,QAAQ,GAAGD,CAAa,WAAWQ,CAAM,GAE5CwD,MAAS,UACXD,EACG,KAAK,KAAKC,EAAK,CAAC,EAChB,KAAK,KAAKA,EAAK,CAAC,EAChB,KAAK,SAASA,EAAK,KAAK,EACxB,KAAK,UAAUA,EAAK,MAAM;AAAA,IAEjC;AAAA,IACA,UAAU;AACR,MAAA/D,EAAK,OAAO;AAAA,IAAA;AAAA,EAEhB;AACF,GChFagE,IAAiB,CAC5B1E,GACAP,MACqD;AACrD,QAAM,EAAE,KAAAlC,GAAK,MAAA0G,GAAM,GAAAvF,GAAG,GAAAjB,GAAG,SAAA4G,MAAYrE,GAC/B,EAAE,eAAAS,GAAe,IAAAkE,GAAI,MAAML,EAAa,IAAA7E,GAExCyE,IAAU3G,EAAI,KAAK,GACnBgC,IAAOM,EAAQqE,CAAO,GAEtBU,IAAUxG,EACb,OACA,EAAE,CAACC,MAAMK,EAAEL,EAAE,IAAI,CAAC,EAClB,EAAE,CAACA,MAAMZ,EAAEY,EAAE,KAAK,CAAC,EACnB,MAAM0F,EAAc/D,CAAG,CAAC,GAErBuE,IAAS,GAAGF,CAAO,SAAS5D,CAAa,IAGzC+D,IAFWjF,EAAK,OAAO,UAAU,EAAE,KAAK,MAAMgF,CAAM,EAGvD,OAAO,MAAM,EACb,KAAK,MAAKD,KAAA,gBAAAA,EAAU,MAAK,CAAC,EAC1B,KAAK,MAAKA,KAAA,gBAAAA,EAAU,MAAK,CAAC,EAC1B,KAAK,UAASA,KAAA,gBAAAA,EAAU,UAAS,MAAM,EACvC,KAAK,WAAUA,KAAA,gBAAAA,EAAU,WAAU,MAAM,GAEtC5D,IAAOnD,EACV,OAAO,MAAM,EACb,QAAQkD,GAAe,EAAI,EAC3B,MAAMwD,CAAI,EACV,KAAK,KAAKW,CAAO,EACjB,KAAK,MAAMD,CAAE,EACb,KAAK,aAAa,QAAQJ,CAAM,GAAG;AAE/B,SAAA;AAAA,IACL,UAAU5D,GAAQC,GAAK;AACjB,MAAAD,MAAW,WAAeD,EAAA,QAAQ,GAAGD,CAAa,GAAGG,CAAG,IAAI,EAAK,MAC3D,QAAQ,GAAGH,CAAa,GAAGG,CAAG,IAAI,EAAI;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,MAAAqD,GAAM,MAAAQ,GAAM,QAAAxD,KAAU;AACzBgD,MAAAA,MAAS,UAAgBvD,EAAA,MAAMuD,CAAI,EAAE,KAAK,KAAKW,CAAO,GACtD3D,MAAW,UACbP,EAAK,QAAQ,GAAGD,CAAa,WAAWQ,CAAM,GAE5CwD,MAAS,UACXD,EACG,KAAK,KAAKC,EAAK,CAAC,EAChB,KAAK,KAAKA,EAAK,CAAC,EAChB,KAAK,SAASA,EAAK,KAAK,EACxB,KAAK,UAAUA,EAAK,MAAM;AAAA,IAEjC;AAAA,IACA,UAAU;AACR,MAAA/D,EAAK,OAAO;AAAA,IAAA;AAAA,EAEhB;AACF,GCxDamE,KAAsB,CACjC7E,GACAP,MACqD;AACrD,QAAM,EAAE,KAAAlC,GAAK,MAAA0G,GAAM,GAAAvF,GAAG,GAAAjB,GAAG,SAAA4G,GAAS,QAAA7G,MAAWwC,GACvC,EAAE,eAAAS,GAAe,IAAAkE,GAAI,MAAML,EAAa,IAAA7E,GAExCyE,IAAU3G,EAAI,KAAK,GACnBgC,IAAOM,EAAQqE,CAAO,GAEtBU,IAAUxG,EACb,OACA,EAAE,CAACC,MAAMK,EAAEL,EAAE,IAAI,CAAC,EAClB,EAAE,CAACA,MAAMZ,EAAEY,EAAE,KAAK,CAAC,EACnB,MAAM0F,EAAc/D,CAAG,CAAC,GAErBuE,IAAS,GAAGF,CAAO,SAAS5D,CAAa,IAGzC+D,IAFWjF,EAAK,OAAO,UAAU,EAAE,KAAK,MAAMgF,CAAM,EAGvD,OAAO,MAAM,EACb,KAAK,MAAKD,KAAA,gBAAAA,EAAU,MAAK,CAAC,EAC1B,KAAK,MAAKA,KAAA,gBAAAA,EAAU,MAAK,CAAC,EAC1B,KAAK,UAASA,KAAA,gBAAAA,EAAU,UAAS,MAAM,EACvC,KAAK,WAAUA,KAAA,gBAAAA,EAAU,WAAU,MAAM,GAEtC5D,IAAOnD,EACV,OAAO,MAAM,EACb,QAAQkD,GAAe,EAAI,EAC3B,MAAMwD,CAAI,EACV,KAAK,KAAKW,CAAO,EACjB,KAAK,MAAMD,CAAE,EACb,KAAK,aAAa,QAAQJ,CAAM,GAAG;AAE/B,SAAA;AAAA,IACL,UAAU5D,GAAQC,GAAK;AACjB,MAAAD,MAAW,WAAeD,EAAA,QAAQ,GAAGD,CAAa,GAAGG,CAAG,IAAI,EAAK,MAC3D,QAAQ,GAAGH,CAAa,GAAGG,CAAG,IAAI,EAAI;AAAA,IAClD;AAAA,IACA,OAAO,EAAE,MAAAqD,GAAM,MAAAQ,GAAM,QAAAxD,KAAU;AACzBgD,MAAAA,MAAS,UAAgBvD,EAAA,MAAMuD,CAAI,EAAE,KAAK,KAAKW,CAAO,GACtD3D,MAAW,UACbP,EAAK,QAAQ,GAAGD,CAAa,WAAWQ,CAAM,GAE5CwD,MAAS,WACPjH,EAAO,MAAM,mBAAmB,YAClCgH,EACG,WAAW,EACX,SAAShH,EAAO,MAAM,kBAAkB,EACxC,KAAK,KAAKiH,EAAK,CAAC,EAChB,KAAK,KAAKA,EAAK,CAAC,EAChB,KAAK,SAASA,EAAK,KAAK,EACxB,KAAK,UAAUA,EAAK,MAAM,EAC1B,KAAKrG,EAAG,UAAU,IAErBoG,EACG,KAAK,KAAKC,EAAK,CAAC,EAChB,KAAK,KAAKA,EAAK,CAAC,EAChB,KAAK,SAASA,EAAK,KAAK,EACxB,KAAK,UAAUA,EAAK,MAAM;AAAA,IAGnC;AAAA,IACA,UAAU;AACR,MAAA/D,EAAK,OAAO;AAAA,IAAA;AAAA,EAEhB;AACF,GC3DaoE,KAAiB,CAACxH,MAA2D;AAClF,QAAAyH,IAAWL,EAAepH,GAAS;AAAA,IACvC,eAAe;AAAA,IACf,IAAI,GAAGA,EAAQ,OAAO;AAAA,EAAA,CACvB,GACK0H,IAAehB,GAAmB1G,CAAO,GAEzC2H,IAAY3D,EAAgBhE,EAAQ,GAAG,GACvC4H,IAAgBL,GAAoBvH,GAAS;AAAA,IACjD,eAAe;AAAA,IACf,IAAI,GAAGA,EAAQ,OAAO;AAAA,IACtB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,IAAI;AAAA,EAAA,CAC7C;AAED,MAAI6H,IAAgB;AAEhB,EAAA7H,EAAQ,OAAO,wBACjB6H,IAAgBT,EAAepH,GAAS;AAAA,IACtC,eAAe;AAAA,IACf,IAAI,GAAGA,EAAQ,OAAO;AAAA,IACtB,MAAMyC,EAAiBzC,CAAO;AAAA,EAAA,CAC/B;AAGG,QAAA8H,IAAclE,EAAkB5D,EAAQ,KAAK;AAAA,IACjD,WAAW;AAAA,IACX,QAAQ;AAAA,EAAA,CACT,GACK+H,IAAkBhF,EAAsB/C,EAAQ,GAAG,GACnDgI,IAAmBjF,EAAsB/C,EAAQ,GAAG,GACpDiI,IAAYb,EAAepH,GAAS;AAAA,IACxC,eAAe;AAAA,IACf,IAAI,GAAGA,EAAQ,OAAO;AAAA,IACtB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,IAAI;AAAA,EAAA,CAC7C,GACKkI,IAAkBtE,EAAkB5D,EAAQ,KAAK;AAAA,IACrD,WAAW;AAAA,IACX,QAAQ;AAAA,EAAA,CACT,GACKmI,IAAmBvE,EAAkB5D,EAAQ,KAAK;AAAA,IACtD,WAAW;AAAA,IACX,QAAQ;AAAA,EAAA,CACT,GACKoI,IAAerD,EAAmB/E,CAAO,GACzCqI,IAAe/B,GAAmBtG,CAAO,GACzCsI,IAAgBxB,GAAoB9G,CAAO;AAE1C,SAAA;AAAA,IACL,WAAA2H;AAAA,IACA,aAAAG;AAAA,IACA,iBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,eAAAK;AAAA,IACA,iBAAAJ;AAAA,IACA,kBAAAC;AAAA,IACA,UAAAV;AAAA,IACA,cAAAW;AAAA,IACA,eAAAR;AAAA,IACA,cAAAS;AAAA,IACA,cAAAX;AAAA,IACA,eAAAG;AAAA,EACF;AACF,GC1EaU,KAAkB,CAC7BC,GACAC,GACArH,MACG;AACG,QAAAsH,IAAQF,EAAW,MAAM,kBAAkB;AAEjD,MAAI,CAACE;AACK,mBAAA,KAAK,uBAAuBF,CAAU,GACvC;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAGF,QAAM,CAAG,EAAAG,GAAWC,CAAI,IAAIF,GACtBG,IAAS,SAASF,GAAW,EAAE,GAE/B,CAACG,GAAaC,CAAS,IAAI3H,EAAE,OAAO;AAEtC,MAAA4H,IAAS,IAAI,KAAKF,CAAW;AAEjC,SAAOE,IAASD,KAAW;AACrB,QAAAE,IAAO,IAAI,KAAKD,CAAM;AAE1B,YAAQJ,GAAM;AAAA,MACZ,KAAK;AACH,QAAAK,EAAK,WAAWA,EAAK,WAAW,IAAIJ,CAAM;AAC1C;AAAA,MACF,KAAK;AACH,QAAAI,EAAK,SAASA,EAAK,SAAS,IAAIJ,CAAM;AACtC;AAAA,MACF,KAAK;AACH,QAAAI,EAAK,QAAQA,EAAK,QAAQ,IAAIJ,CAAM;AACpC;AAAA,MACF,KAAK;AACH,QAAAI,EAAK,QAAQA,EAAK,QAAQ,IAAIJ,IAAS,CAAC;AACxC;AAAA,MACF,KAAK;AACI,QAAAI,IAAA,IAAI,KAAKD,EAAO,YAAA,GAAeA,EAAO,SAAA,IAAaH,GAAQ,CAAC;AACnE;AAAA,MACF;AACS,eAAA;AAAA,UACL,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,IAAA;AAGA,QAAAJ,KAAeO,KAAUP,IAAcQ,GAAM;AACzC,YAAAC,IAAS9H,EAAE4H,CAAM,GACjBG,IAAO/H,EAAE6H,CAAI;AACZ,aAAA;AAAA,QACL,GAAGC;AAAA,QACH,GAAG;AAAA,QACH,OAAOC,IAAOD;AAAA,QACd,QAAQ;AAAA,MACV;AAAA,IAAA;AAGO,IAAAF,IAAA,IAAI,KAAKC,CAAI;AAAA,EAAA;AAGxB,MAAIR,EAAY,QAAA,MAAcM,EAAU,WAAW;AAC7C,QAAAK,IAAO,IAAI,KAAKL,CAAS;AAE7B,YAAQH,GAAM;AAAA,MACZ,KAAK;AACH,QAAAQ,EAAK,WAAWA,EAAK,WAAW,IAAIP,CAAM;AAC1C;AAAA,MACF,KAAK;AACH,QAAAO,EAAK,SAASA,EAAK,SAAS,IAAIP,CAAM;AACtC;AAAA,MACF,KAAK;AACH,QAAAO,EAAK,QAAQA,EAAK,QAAQ,IAAIP,CAAM;AACpC;AAAA,MACF,KAAK;AACH,QAAAO,EAAK,QAAQA,EAAK,QAAQ,IAAIP,IAAS,CAAC;AACxC;AAAA,MACF,KAAK;AACI,QAAAO,IAAA,IAAI,KAAKL,EAAU,YAAA,GAAeA,EAAU,SAAA,IAAaF,GAAQ,CAAC;AACzE;AAAA,IAAA;AAGE,UAAAK,IAAS9H,EAAEgI,CAAI,GACfD,IAAO/H,EAAE2H,CAAS;AACjB,WAAA;AAAA,MACL,GAAGG;AAAA,MACH,GAAG;AAAA,MACH,OAAOC,IAAOD;AAAA,MACd,QAAQ;AAAA,IACV;AAAA,EAAA;AAGK,SAAA;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF,GCtGaG,IAAmB,CAAC3G,GAAmBwC,MAA6B;;AACzE,QAAA;AAAA,IACJ,GAAA9D;AAAA,IACA,GAAAjB;AAAA,IACA,UAAAmJ;AAAA,IACA,QAAQ,EAAE,QAAAjJ,EAAO;AAAA,IACjB,QAAAgB;AAAA,EAAA,IACEqB;AAEJ,EAAA4G,EAAS,UAAU,OAAO;AAAA,IACxB,IAAIlI,EAAE8D,EAAQ,IAAI;AAAA,IAClB,IAAI9D,EAAE8D,EAAQ,IAAI;AAAA,IAClB,IAAI7E,EAAO;AAAA,IACX,IAAIgB,IAAShB,EAAO;AAAA,IACpB,QAAQ;AAAA,EAAA,CACT,GAEDiJ,EAAS,YAAY,OAAO;AAAA,IAC1B,IAAIlI,EAAE8D,EAAQ,IAAI;AAAA,IAClB,IAAI/E,EAAE+E,EAAQ,KAAK;AAAA,IACnB,QAAQ;AAAA,EAAA,CACT,GAEDoE,EAAS,aAAa,OAAO;AAAA,IAC3B,UAAUpE;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AAEK,QAAAqE,IAAWhB,GAAgB7F,EAAI,OAAO,MAAM,OAAOwC,EAAQ,MAAM9D,CAAC;AAExE,EAAAkI,EAAS,cAAc,OAAO;AAAA,IAC5B,MAAMC;AAAA,IACN,QAAQ;AAAA,EAAA,CACT,IAEDC,IAAAF,EAAS,kBAAT,QAAAE,EAAwB,OAAO;AAAA,IAC7B,MAAM;AAAA,MACJ,GAAGD;AAAA,MACH,GAAGpJ,EAAE,CAAC;AAAA,MACN,QAAQA,EAAE,QAAQ,CAAC,IAAIA,EAAE,CAAC,IAAIE,EAAO;AAAA,IAAA;AAAA,EACvC,IAGOiJ,EAAA,SAAS,UAAU,OAAO,QAAQ;AAC7C,GAEaG,IAAiB,CAAC/G,MAAsB;;AAC7C,QAAA,EAAE,UAAA4G,MAAa5G;AACrB,EAAA4G,EAAS,UAAU,OAAO,EAAE,QAAQ,IAAM,GAC1CA,EAAS,YAAY,OAAO,EAAE,QAAQ,IAAM,GAC5CA,EAAS,cAAc,OAAO,EAAE,QAAQ,IAAM,GACrCA,EAAA,SAAS,UAAU,UAAU,QAAQ,GAC9CA,EAAS,aAAa,OAAO,EAAE,QAAQ,IAAM,GACzC5G,EAAI,WAAW,iBACjB8G,IAAAF,EAAS,kBAAT,QAAAE,EAAwB,OAAO;AAAA,IAC7B,MAAM/G,EAAiBC,CAAG;AAAA,EAAA;AAGhC,GC3DMgH,KAA0B,CAACJ,GAAyBK,MAAuB;AAsBzE,EAVC;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAEM,QAAQ,CAACC,MAAS;AACtB,IAAID,KACFL,EAASM,CAAI,EAAE,UAAU,UAAU,OAAO,GAC1CN,EAASM,CAAI,EAAE,UAAU,OAAO,KAAK,MAErCN,EAASM,CAAI,EAAE,UAAU,UAAU,KAAK,GACxCN,EAASM,CAAI,EAAE,UAAU,OAAO,OAAO;AAAA,EACzC,CACD;AACH,GAEaC,KAAuB,CAClCnH,GACAoH,GACA5E,MACG;;AACG,QAAA;AAAA,IACJ,GAAA9D;AAAA,IACA,GAAAjB;AAAA,IACA,QAAQ,EAAE,QAAAE,EAAO;AAAA,IACjB,QAAAgB;AAAA,IACA,UAAAiI;AAAA,EAAA,IACE5G,GAEEsC,IAAY5D,EAAE0I,EAAW,IAAI,IAAI1I,EAAE8D,EAAQ,IAAI,IAAI4E,IAAa5E,GAChED,IAAa7D,EAAE0I,EAAW,IAAI,KAAK1I,EAAE8D,EAAQ,IAAI,IAAI4E,IAAa5E,GAClEyE,IAAY1E,EAAW,QAAQD,EAAU,SAAS,GAClD+E,IAAQ3I,EAAE4D,EAAU,IAAI,GACxBgF,IAAS5I,EAAE6D,EAAW,IAAI,GAC1BgF,IAAiBD,IAASD;AAEhC,EAAAT,EAAS,gBAAgB,OAAO;AAAA,IAC9B,IAAIS;AAAA,IACJ,IAAIA;AAAA,IACJ,IAAI1J,EAAO;AAAA,IACX,IAAIgB,IAAShB,EAAO;AAAA,IACpB,QAAQ;AAAA,EAAA,CACT,GAEDiJ,EAAS,iBAAiB,OAAO;AAAA,IAC/B,IAAIU;AAAA,IACJ,IAAIA;AAAA,IACJ,IAAI3J,EAAO;AAAA,IACX,IAAIgB,IAAShB,EAAO;AAAA,IACpB,QAAQ;AAAA,EAAA,CACT,GAEDiJ,EAAS,gBAAgB,OAAO;AAAA,IAC9B,IAAIS;AAAA,IACJ,IAAI5J,EAAE6E,EAAU,KAAK;AAAA,IACrB,QAAQ;AAAA,EAAA,CACT,GAEDsE,EAAS,iBAAiB,OAAO;AAAA,IAC/B,IAAIU;AAAA,IACJ,IAAI7J,EAAE8E,EAAW,KAAK;AAAA,IACtB,QAAQ;AAAA,EAAA,CACT,GAEDqE,EAAS,UAAU,OAAO;AAAA,IACxB,MAAM;AAAA,MACJ,GAAGS;AAAA,MACH,GAAG;AAAA,MACH,OAAOE;AAAA,MACP,QAAQ9J,EAAE,MAAM,EAAE,CAAC;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,EAAA,CACT,GAEDmJ,EAAS,cAAc,OAAO;AAAA,IAC5B,MAAM;AAAA,MACJ,GAAGS;AAAA,MACH,GAAG;AAAA,MACH,OAAOE;AAAA,MACP,QAAQ9J,EAAE,MAAM,EAAE,CAAC;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,EAAA,CACT,GAEDmJ,EAAS,aAAa,OAAO;AAAA,IAC3B,YAAArE;AAAA,IACA,WAAAD;AAAA,IACA,SAAAE;AAAA,IACA,GAAG6E,IAAQE,IAAiB;AAAA,IAC5B,GAAG;AAAA,IACH,QAAQ;AAAA,EAAA,CACT,IAEDT,IAAAF,EAAS,kBAAT,QAAAE,EAAwB,OAAO;AAAA,IAC7B,QAAQ;AAAA,EAAA,IAGVF,EAAS,aAAa,OAAO,EAAE,QAAQ,IAAM,GAE7CI,GAAwBJ,GAAUK,CAAS,GAClCL,EAAA,SAAS,UAAU,OAAO,iBAAiB;AACtD,GAEaY,IAAqB,CAACxH,MAAsB;;AACjD,QAAA,EAAE,UAAA4G,MAAa5G;AACrB,EAAA4G,EAAS,UAAU,OAAO,EAAE,QAAQ,IAAM,GAC1CA,EAAS,cAAc,OAAO,EAAE,QAAQ,IAAM,GAC9CA,EAAS,gBAAgB,OAAO,EAAE,QAAQ,IAAM,GAChDA,EAAS,iBAAiB,OAAO,EAAE,QAAQ,IAAM,GACjDA,EAAS,gBAAgB,OAAO,EAAE,QAAQ,IAAM,GAChDA,EAAS,iBAAiB,OAAO,EAAE,QAAQ,IAAM,GACjDA,EAAS,aAAa,OAAO,EAAE,QAAQ,IAAM,GACpCA,EAAA,SAAS,UAAU,UAAU,iBAAiB,GACvDA,EAAS,aAAa,OAAO,EAAE,QAAQ,IAAO,IAC9CE,IAAAF,EAAS,kBAAT,QAAAE,EAAwB,OAAO,EAAE,QAAQ;AAC3C,GClIaW,KAAoB,CAACzH,MAAsB;AACtD,QAAM,EAAE,KAAAzC,GAAK,MAAA0G,GAAM,GAAAvF,GAAG,QAAAlB,GAAQ,OAAAE,GAAO,QAAAiB,MAAWqB,GAC1C,EAAE,QAAArC,GAAQ,OAAA+J,GAAO,WAAAC,EAAc,IAAAnK;AACrC,MAAI4J,IAAqC,MACrCQ,IAAa;AAEX,QAAAC,IAAc,CAACC,MACZ7D,EAAK;AAAA,IAAO,CAAC8D,GAAGC,MACrB,KAAK,IAAItJ,EAAEqJ,EAAE,IAAI,IAAID,CAAM,IAAI,KAAK,IAAIpJ,EAAEsJ,EAAE,IAAI,IAAIF,CAAM,IAAIC,IAAIC;AAAA,EACpE;AAYC,EATazK,EACb,OAAO,MAAM,EACb,KAAK,SAASG,IAAQC,EAAO,OAAOA,EAAO,KAAK,EAChD,KAAK,UAAUgB,IAAShB,EAAO,MAAMA,EAAO,MAAM,EAClD,KAAK,KAAKA,EAAO,IAAI,EACrB,KAAK,KAAKA,EAAO,GAAG,EACpB,KAAK,QAAQ,aAAa,EAG1B,GAAG,aAAa,SAAUsK,GAAO;AAChC,UAAM,CAACH,CAAM,IAAI1J,EAAG,QAAQ6J,GAAO,IAAI,GACjCzF,IAAUqF,EAAYC,CAAM;AAE9B,IAAA,CAACF,KAAcF,EAAM,UACvB1H,EAAI,SAAS,SACb2G,EAAiB3G,GAAKwC,CAAO,MAEzBxC,EAAA,SAAS4H,IAAa,cAAc,QACxCb,EAAe/G,CAAG,IAGhBoH,KAAcO,EAAU,WAC1B3H,EAAI,SAAS,aACQmH,GAAAnH,GAAKoH,GAAY5E,CAAO;AAAA,EAC/C,CACD,EACA,GAAG,cAAc,MAAM;AACtB,IAAAxC,EAAI,SAAS,QACA4H,IAAA,IACAR,IAAA,MACbL,EAAe/G,CAAG,GAClBwH,EAAmBxH,CAAG;AAAA,EACvB,CAAA,EACA,GAAG,aAAa,SAAUiI,GAAO;AAChC,QAAIN,EAAU,QAAQ;AACP,MAAAC,IAAA,IACb5H,EAAI,SAAS;AACb,YAAM,CAAC8H,CAAM,IAAI1J,EAAG,QAAQ6J,GAAO,IAAI;AACvC,MAAAb,IAAaS,EAAYC,CAAM;AAAA,IAAA;AAAA,EAElC,CAAA,EACA,GAAG,WAAW,SAAUG,GAAO;AAC9B,UAAM,CAACH,CAAM,IAAI1J,EAAG,QAAQ6J,GAAO,IAAI,GACjCzF,IAAUqF,EAAYC,CAAM;AACrB,IAAAF,IAAA,IACAR,IAAA,MACbpH,EAAI,SAAS,SAET2H,EAAU,UAAQH,EAAmBxH,CAAG,GACxC0H,EAAM,UAAyBf,EAAA3G,GAAKwC,CAAO;AAAA,EAAA,CAChD;AACL,GCjEa0F,KAAe,CAC1BjE,GACAzG,GACAE,MACG;AACG,QAAA,EAAE,QAAAC,MAAWH,GAEb2K,IAAQ/J,EAAG,UAAU,GAErBgK,IAAUhK,EAAG,OAAO6F,GAAM,CAAC5F,MAAM,IAAI,KAAKA,EAAE,IAAI,CAAC;AAEnD,SAAA+J,EAAQ,CAAC,KAAK,QAAQA,EAAQ,CAAC,KAAK,OAAaD,IAE9CA,EAAM,OAAO,CAACC,EAAQ,CAAC,GAAGA,EAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAACzK,EAAO,MAAMD,IAAQC,EAAO,KAAK,CAAC;AACzF,GAEa0K,KAAe,CAC1BpE,GACAzG,GACAmB,MACG;AACG,QAAA,EAAE,QAAAhB,MAAWH,GAEb8K,IAAOlK,EAAG,IAAI6F,GAAM,CAAC5F,MAAMA,EAAE,KAAK,KAAK,GACvCkK,IAAOnK,EAAG,IAAI6F,GAAM,CAAC5F,MAAMA,EAAE,KAAK,KAAK;AAE7C,SAAOD,EACJ,YAAY,EACZ,OAAO,CAACmK,GAAMD,CAAI,CAAC,EACnB,MAAM,CAAC3J,IAAShB,EAAO,QAAQA,EAAO,GAAG,CAAC;AAC/C,GCvBa6K,KAAkB,CAACC,GAAkBC,MAAqC;AAC/E,QAAA5G,IAAY1D,EAAG,OAAOqK,CAAQ;AAChC,MAAA3G,EAAU;AACJ,mBAAA,MAAM,yBAAyB2G,CAAQ,aAAa,GACrD;AAEL,MAAA,CAACC,EAAe,WAAW,CAAC,4BAA4B,KAAKA,EAAe,OAAO;AACrF,mBAAQ,MAAM;AAAA,mFACiE,GACxE;AAGH,QAAA1G,IAAUF,EAAU,OAAO,KAAK,GAChCvE,IAAMyE,EAAQ,OAAO,KAAK,GAE1B2G,IAAgB7G,EAAU,KAAK;AACjC,MAAA8G,IAAeD,EAAc,sBAAsB,GACnDjL,IAAQkL,EAAa,OACrBjK,IAASiK,EAAa,QACtBC,IAAgB3I,EAAY,EAAE,GAAG4D,GAAc,GAAG4E,EAAe,MAAM,GACvEI,IAAcJ,EAAe;AAEjC,QAAMK,IAAe,MAAM;AACzB,IAAAH,IAAeD,EAAc,sBAAsB,GACnDjL,IAAQkL,EAAa,OACrBjK,IAASiK,EAAa,QACtBI,EAAO,EAAE,MAAMF,GAAa,QAAQD,GAAe;AAAA,EACrD;AAEO,SAAA,iBAAiB,UAAUE,CAAY;AAE9C,QAAMC,IAAS,CAACvJ,GAAiCwJ,IAAW,OAAU;AAChE,IAAAA,KAAYxJ,EAAQ,WACNoJ,IAAA3I,EAAY2I,GAAepJ,EAAQ,MAAM,IAEvDwJ,KAAYxJ,EAAQ,SACtBqJ,IAAcrJ,EAAQ;AAGxB,UAAMwE,IAA0B6E,EAC7B,IAAI,CAACzK,OAAO,EAAE,MAAM,IAAI,KAAKA,EAAE,IAAI,GAAG,OAAOA,EAAE,MAAM,EAAE,EACvD,KAAK,CAAC0J,GAAGC,MAAMD,EAAE,KAAK,QAAA,IAAYC,EAAE,KAAK,QAAA,CAAS,GAE/CtJ,IAAIwJ,GAAajE,GAAM4E,GAAenL,CAAK,GAC3CD,IAAI4K,GAAapE,GAAM4E,GAAelK,CAAM;AAElD,IAAAqD,EAAQ,KAAK,SAAS,wBAAwB6G,EAAc,KAAK,EAAE,GAEhEtL,EAAA,KAAK,uBAAuB,eAAe,EAC3C,KAAK,WAAW,OAAOG,CAAK,IAAIiB,CAAM,EAAE,EACxC,MAAM,SAAS,MAAM,EACrB,MAAM,UAAU,MAAM,EACtB,UAAU,GAAG,EACb,OAAO;AAEV,UAAMuK,IAA6C;AAAA,MACjD,SAASR,EAAe;AAAA,MACxB,KAAAnL;AAAA,MACA,aAAayE,EAAQ,KAAK;AAAA,MAC1B,MAAAiC;AAAA,MACA,GAAAvF;AAAA,MACA,GAAAjB;AAAA,MACA,QAAQoL;AAAA,MACR,QAAQ;AAAA,MACR,OAAAnL;AAAA,MACA,QAAAiB;AAAA,IACF;AAEA,IAAAS,EAAW8J,CAAU;AAErB,UAAM5L,IAAwB;AAAA,MAC5B,GAAG4L;AAAA,MACH,UAAUpE,GAAeoE,CAAU;AAAA,IACrC;AACA,IAAAzB,GAAkBnK,CAAO;AAAA,EAC3B;AAEA,SAAA0L,EAAON,CAAc,GAEd;AAAA,IACL,QAAQ,CAACjJ,MAAoCuJ,EAAOvJ,GAAS,EAAI;AAAA,IACjE,SAAS,MAAM;AACN,aAAA,oBAAoB,UAAUsJ,CAAY,GACjDxL,EAAI,OAAO;AAAA,IAAA;AAAA,EAEf;AACF;"}
1
+ {"version":3,"file":"charts-core.js","sources":["../src/components/line-chart/axes/y-axis.ts","../src/components/line-chart/axes/x-axis.ts","../src/components/line-chart/axes/grid.ts","../src/components/line-chart/axes/index.ts","../src/components/line-chart/utils/index.ts","../src/components/line-chart/elements/range-border.ts","../src/components/line-chart/elements/circle-point.ts","../src/components/line-chart/elements/hover-line.ts","../src/components/line-chart/elements/range-tooltip.ts","../src/components/line-chart/elements/hover-tooltip.ts","../src/components/line-chart/constants.ts","../src/components/line-chart/elements/main-line-area.ts","../src/components/line-chart/elements/range-line-area.ts","../src/components/line-chart/elements/data-line.ts","../src/components/line-chart/elements/highlight-line.ts","../src/components/line-chart/elements/index.ts","../src/components/line-chart/interactions/hover/utils.ts","../src/components/line-chart/interactions/hover/index.ts","../src/components/line-chart/interactions/selection.ts","../src/components/line-chart/interactions/index.ts","../src/components/line-chart/scales/index.ts","../src/components/line-chart/index.ts"],"sourcesContent":["import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nexport const renderYAxis = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, y, width } = context\n const { margin, yAxis } = config\n const { customTicks, tickFormat, tickValues, ticks, isShow } = yAxis\n\n if (!isShow) return null\n\n svg\n .append('g')\n .attr('transform', `translate(${width - margin.right},0)`)\n .call((g) => {\n let axis = d3.axisRight(y)\n if (customTicks) {\n if (tickFormat) {\n axis = axis.tickFormat(tickFormat)\n }\n if (ticks) {\n axis = Array.isArray(ticks) ? axis.ticks(...ticks) : axis.ticks(ticks)\n }\n if (tickValues) {\n axis = axis.tickValues(tickValues)\n }\n } else {\n axis = axis.tickFormat((d) => {\n const num = Number(d)\n const sign = num < 0 ? '-' : ''\n const formatted = d3.format('.0s')(Math.abs(num))\n return `${sign}${formatted}`\n })\n }\n g.call(axis)\n })\n .call((g) => {\n let ticks: ParsedDataPoint['value'][] = []\n g.selectAll('.tick').each((d) => ticks.push(d as ParsedDataPoint['value']))\n context.yTicks = ticks\n })\n .call((g) => g.select('.domain').remove())\n .call((g) => g.selectAll('.tick line').remove())\n .call((g) => g.selectAll('.tick text').classed('sc-charts__y-axis-tick', true))\n .attr('font-family', 'inherit')\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nexport const renderXAxis = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, x, height } = context\n const { margin, xAxis } = config\n const { isShow, tickValues, tickFormat, customTicks, ticks } = xAxis\n\n if (!isShow) return null\n\n svg\n .append('g')\n .attr('transform', `translate(0,${height - margin.bottom})`)\n .call((g) => {\n let axis = d3.axisBottom(x)\n if (customTicks) {\n if (tickFormat) {\n axis = axis.tickFormat(tickFormat)\n }\n if (ticks) {\n axis = Array.isArray(ticks) ? axis.ticks(...ticks) : axis.ticks(ticks)\n }\n if (tickValues) {\n axis = axis.tickValues(tickValues)\n }\n } else {\n axis.ticks(5)\n }\n g.call(axis)\n })\n .call((g) => g.select('.domain').remove())\n .call((g) => {\n let ticks: ParsedDataPoint['date'][] = []\n g.selectAll('.tick').each((d) => ticks.push(d as ParsedDataPoint['date']))\n context.xTicks = ticks\n })\n .call((g) => g.selectAll('.tick line').remove())\n .call((g) => g.selectAll('.tick text').classed('sc-charts__x-axis-tick', true))\n .attr('font-family', 'inherit')\n}\n","import { ChartContext } from '../types'\n\nconst renderHorizontalStyles = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, y, width } = context\n const {\n margin,\n grid: { horizontalStyle },\n } = config\n\n if (horizontalStyle === 'none') return\n\n if (horizontalStyle.startsWith('zero-line')) {\n const line = svg\n .append('line')\n .attr('x1', 0 + margin.left)\n .attr('x2', width - margin.right)\n .attr('y1', y(0))\n .attr('y2', y(0))\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (horizontalStyle === 'zero-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n }\n\n if (horizontalStyle.startsWith('every-line')) {\n const ticks = context.yTicks || y.ticks()\n\n ticks.forEach((tick) => {\n const line = svg\n .append('line')\n .attr('x1', 0 + margin.left)\n .attr('x2', width - margin.right)\n .attr('y1', y(tick))\n .attr('y2', y(tick))\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (horizontalStyle === 'every-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n })\n }\n}\n\nconst renderVerticalStyles = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, x, height } = context\n const {\n margin,\n grid: { verticalStyle },\n } = config\n\n if (verticalStyle === 'none') return\n\n if (verticalStyle.startsWith('every-line')) {\n const ticks = context.xTicks || x.ticks()\n\n ticks.forEach((tick) => {\n const line = svg\n .append('line')\n .attr('x1', x(tick))\n .attr('x2', x(tick))\n .attr('y1', margin.top)\n .attr('y2', height - margin.bottom)\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (verticalStyle === 'every-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n })\n }\n}\n\nexport const renderGrid = (context: Omit<ChartContext, 'elements'>) => {\n renderHorizontalStyles(context)\n renderVerticalStyles(context)\n}\n","import { ChartContext } from '../types'\nimport { renderYAxis } from './y-axis'\nimport { renderXAxis } from './x-axis'\nimport { renderGrid } from './grid.ts'\n\nexport const createAxes = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, width, height } = context\n const { margin, logo } = config\n\n // x axis\n renderXAxis(context)\n\n // y axis\n renderYAxis(context)\n\n if (logo) {\n svg\n .append('image')\n .attr('xlink:href', config.theme === 'dark' ? logo.picDarkTheme : logo.picLightTheme)\n .attr('width', logo.width)\n .attr('height', logo.height)\n .attr('x', logo.x ?? (width - margin.left - margin.right) / 2 - logo.width / 2 + margin.left)\n .attr('y', logo.y ?? (height - margin.top - margin.bottom) / 2 - logo.height / 2 + margin.top)\n }\n\n // grid\n renderGrid(context)\n}\n","import * as d3 from 'd3'\nimport { ChartConfig, ChartConfigContext, ChartContext } from '../types'\n\nexport const createGradient = (\n defs:\n | d3.Selection<d3.BaseType, unknown, null, undefined>\n | d3.Selection<SVGDefsElement, unknown, null, undefined>,\n gradientId: string,\n options: {\n x1: string\n x2: string\n y1: string\n y2: string\n stops: { offset: string; stopColor: string }[]\n }\n): d3.Selection<SVGLinearGradientElement, unknown, null, undefined> => {\n let gradient: d3.Selection<SVGLinearGradientElement, unknown, null, undefined> =\n defs.select<SVGLinearGradientElement>(`#${gradientId}`)\n\n if (gradient.empty()) {\n gradient = defs\n .append<SVGLinearGradientElement>('linearGradient')\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('id', gradientId)\n }\n\n gradient\n .attr('x1', options.x1)\n .attr('y1', options.x2)\n .attr('x2', options.y1)\n .attr('y2', options.y2)\n\n options.stops.forEach(({ offset, stopColor }) => {\n gradient.append('stop').attr('offset', offset).attr('stop-color', stopColor)\n })\n\n return gradient\n}\n\nexport const getDefs = (svg: SVGSVGElement) => {\n const defsSelection = d3.select(svg).select('defs')\n const defs = defsSelection.empty() ? d3.select(svg).append('defs') : defsSelection\n\n return defs\n}\n\nexport const getBelowZeroClip = (ctx: Omit<ChartContext, 'elements'>) => {\n const {\n y,\n config: { margin },\n } = ctx\n const clipHeight = y.range()[0] - y(0)\n\n return { x: 0, y: y.range()[0] - clipHeight, width: '100%', height: clipHeight + margin.bottom }\n}\n\nexport const mergeConfig = (base: ChartConfigContext, patch?: ChartConfig): ChartConfigContext => ({\n ...base,\n ...patch,\n margin: {\n ...base.margin,\n ...patch?.margin,\n },\n logo:\n base.logo && patch?.logo\n ? {\n width: patch.logo.width ?? base.logo.width,\n height: patch.logo.height ?? base.logo.height,\n picLightTheme: patch.logo.picLightTheme ?? base.logo.picLightTheme,\n picDarkTheme: patch.logo.picDarkTheme ?? base.logo.picDarkTheme,\n x: patch.logo.x ?? base.logo.x,\n y: patch.logo.y ?? base.logo.y,\n }\n : base.logo,\n\n xAxis: {\n ...base.xAxis,\n ...patch?.xAxis,\n },\n yAxis: {\n ...base.yAxis,\n ...patch?.yAxis,\n },\n grid: {\n ...base.grid,\n ...patch?.grid,\n },\n hover: {\n ...base.hover,\n ...patch?.hover,\n },\n selection: {\n ...base.selection,\n ...patch?.selection,\n },\n})\n","import { Parent, ElementOptions, ChartElements } from './types'\nimport { createGradient, getDefs } from '../utils'\n\nexport const renderBorderRangeLine = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['rangeBorderLeft'] => {\n const svg = parent.node() as SVGSVGElement\n const defs = getDefs(svg)\n\n const createBorderGradient = (gradientId: string, mainColor: string) => {\n return createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'rgba(255, 255, 255, 0)' },\n { offset: '20%', stopColor: mainColor },\n { offset: '60%', stopColor: mainColor },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n }\n\n createBorderGradient('gradient-range-borders-up', 'var(--sc-color-selection-up)')\n createBorderGradient('gradient-range-borders-down', 'var(--sc-color-selection-down)')\n\n const baseClassName = 'sc-charts__border-range-line'\n\n const item = parent\n .append('line')\n .classed(baseClassName, true)\n .style('display', options.hidden ? 'none' : 'block')\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ x1, x2, y1, y2, hidden }) {\n if (x1 !== undefined) item.attr('x1', x1)\n if (x2 !== undefined) item.attr('x2', x2)\n if (y1 !== undefined) item.attr('y1', y1)\n if (y2 !== undefined) item.attr('y2', y2)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n\n destroy() {\n item.remove()\n },\n }\n}\n","import { Parent, ElementOptions, ChartElements } from './types'\n\nexport const renderCirclePoint = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['hoverCircle'] => {\n const item = parent\n .append('circle')\n .attr('r', options.radius || 4)\n .style('display', options.hidden ? 'none' : 'block')\n\n const baseClassName = options.className || ''\n if (baseClassName) item.classed(baseClassName, true)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ cx, cy, hidden, fill }) {\n if (cx !== undefined) item.attr('cx', cx)\n if (cy !== undefined) item.attr('cy', cy)\n if (fill !== undefined) item.attr('fill', fill)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n\n destroy() {\n item.remove()\n },\n }\n}\n","import { createGradient, getDefs } from '../utils'\nimport { Parent, ElementOptions, ChartElements } from './types'\n\nexport const renderHoverLine = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['hoverLine'] => {\n const baseClassName = 'sc-charts__hover-line'\n const item = parent\n .append('line')\n .style('display', options.hidden ? 'none' : 'block')\n .classed(baseClassName, true)\n const svg = parent.node() as SVGSVGElement\n const defs = getDefs(svg)\n\n const createBorderGradient = (gradientId: string, mainColor: string) => {\n return createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'rgba(255, 255, 255, 0)' },\n { offset: '15%', stopColor: mainColor },\n { offset: '75%', stopColor: mainColor },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n }\n\n createBorderGradient('hover-line-gradient', 'var(--sc-color-hover-line)')\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ x1, x2, y1, y2, hidden }) {\n if (x1 !== undefined) item.attr('x1', x1)\n if (x2 !== undefined) item.attr('x2', x2)\n if (y1 !== undefined) item.attr('y1', y1)\n if (y2 !== undefined) item.attr('y2', y2)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartElements } from './types'\nimport { ChartContext } from '../types'\n\nconst BASE_CLASSNAME = 'sc-charts__range-tooltip'\n\nconst timeFormat = d3.timeFormat('%b %e, %I:%M %p')\nconst sumFormat = (sum: number) => {\n const fmt = d3.format(',.2f')\n return `${sum < 0 ? '-' : ''}$${fmt(Math.abs(sum))}`\n}\n\nconst icon = `\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 0.5C5.71442 0.5 4.45772 0.881218 3.3888 1.59545C2.31988 2.30968 1.48676 3.32484 0.994786 4.51256C0.502816 5.70028 0.374095 7.00721 0.624899 8.26809C0.875703 9.52896 1.49477 10.6872 2.40381 11.5962C3.31285 12.5052 4.47104 13.1243 5.73192 13.3751C6.99279 13.6259 8.29973 13.4972 9.48744 13.0052C10.6752 12.5132 11.6903 11.6801 12.4046 10.6112C13.1188 9.54229 13.5 8.28558 13.5 7C13.4982 5.27665 12.8128 3.62441 11.5942 2.40582C10.3756 1.18722 8.72335 0.50182 7 0.5ZM9.35375 6.85375C9.30732 6.90024 9.25217 6.93712 9.19147 6.96228C9.13077 6.98744 9.06571 7.00039 9 7.00039C8.93429 7.00039 8.86923 6.98744 8.80853 6.96228C8.74783 6.93712 8.69269 6.90024 8.64625 6.85375L7.5 5.70687V9.5C7.5 9.63261 7.44732 9.75979 7.35356 9.85355C7.25979 9.94732 7.13261 10 7 10C6.86739 10 6.74022 9.94732 6.64645 9.85355C6.55268 9.75979 6.5 9.63261 6.5 9.5V5.70687L5.35375 6.85375C5.25993 6.94757 5.13268 7.00028 5 7.00028C4.86732 7.00028 4.74007 6.94757 4.64625 6.85375C4.55243 6.75993 4.49972 6.63268 4.49972 6.5C4.49972 6.36732 4.55243 6.24007 4.64625 6.14625L6.64625 4.14625C6.69269 4.09976 6.74783 4.06288 6.80853 4.03772C6.86923 4.01256 6.9343 3.99961 7 3.99961C7.06571 3.99961 7.13077 4.01256 7.19147 4.03772C7.25217 4.06288 7.30732 4.09976 7.35375 4.14625L9.35375 6.14625C9.40024 6.19269 9.43712 6.24783 9.46228 6.30853C9.48744 6.36923 9.5004 6.43429 9.5004 6.5C9.5004 6.56571 9.48744 6.63077 9.46228 6.69147C9.43712 6.75217 9.40024 6.80731 9.35375 6.85375Z\" \n fill=\"currentColor\"/>\n </svg>\n`\n\nfunction createTooltipElements(container: HTMLDivElement) {\n const tooltip = document.createElement('div')\n tooltip.className = BASE_CLASSNAME\n container.append(tooltip)\n\n const wrapper = document.createElement('div')\n wrapper.className = `${BASE_CLASSNAME}-container`\n tooltip.style.position = 'absolute'\n tooltip.style.top = '0'\n tooltip.style.pointerEvents = 'none'\n tooltip.style.display = 'none'\n tooltip.append(wrapper)\n\n const sumWrapper = document.createElement('div')\n sumWrapper.className = `${BASE_CLASSNAME}-sum`\n wrapper.append(sumWrapper)\n\n const iconNode = document.createElement('div')\n iconNode.className = `${BASE_CLASSNAME}-sum-icon`\n iconNode.innerHTML = icon\n sumWrapper.append(iconNode)\n\n const sumNode = document.createElement('div')\n sumWrapper.append(sumNode)\n\n const timeNode = document.createElement('div')\n timeNode.className = `${BASE_CLASSNAME}-time`\n wrapper.append(timeNode)\n\n return { wrapper: tooltip, sumNode, timeNode }\n}\n\nexport const renderRangeTooltip = (\n context: Omit<ChartContext, 'elements'>\n): ChartElements['rangeTooltip'] => {\n const { wrapper, sumNode, timeNode } = createTooltipElements(context.wrapperNode)\n\n return {\n className(action, mod) {\n if (action === 'remove') {\n wrapper.classList.remove(`${BASE_CLASSNAME}${mod}`)\n } else {\n wrapper.classList.add(`${BASE_CLASSNAME}${mod}`)\n }\n },\n update({ leftPoint, rightPoint, x, y, hidden, closest }) {\n if (leftPoint && rightPoint && closest && x !== undefined) {\n const delta = rightPoint.value - leftPoint.value\n const { sumFormatter, timeFormatter } = context.config.selection\n\n const selectionCenter = (context.x(rightPoint.date) + context.x(leftPoint.date)) / 2\n const direction = context.x(closest.date) < selectionCenter ? 'left' : 'right'\n\n let valueText = ''\n let dateText = ''\n\n if (!sumFormatter) {\n const percent = ((delta / Math.abs(leftPoint.value)) * 100).toFixed(2)\n valueText = `${sumFormat(delta)} (${percent}%)`\n } else {\n valueText = sumFormatter({ left: leftPoint.value, right: rightPoint.value, direction })\n }\n\n if (!timeFormatter) {\n dateText = `${timeFormat(leftPoint.date)} to ${timeFormat(rightPoint.date)}`\n } else {\n dateText = timeFormatter({ left: leftPoint.date, right: rightPoint.date, direction })\n }\n\n sumNode.textContent = valueText\n timeNode.textContent = dateText\n\n requestAnimationFrame(() => {\n const tooltipRect = wrapper.getBoundingClientRect()\n const containerRect = context.wrapperNode.getBoundingClientRect()\n\n const leftX = context.x(leftPoint.date)\n const rightX = context.x(rightPoint.date)\n const selectionCenterX = (leftX + rightX) / 2\n\n let tooltipX = selectionCenterX - tooltipRect.width / 2\n\n const minX = 0\n const maxX = containerRect.width - tooltipRect.width\n\n if (tooltipX < minX) tooltipX = minX\n if (tooltipX > maxX) tooltipX = maxX\n\n wrapper.style.left = `${tooltipX}px`\n wrapper.style.top = `${y}px`\n })\n }\n\n if (hidden !== undefined) {\n wrapper.style.display = hidden ? 'none' : 'block'\n }\n },\n destroy() {\n wrapper.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartElements } from './types'\nimport { ChartContext } from '../types'\n\nconst BASE_CLASSNAME = 'sc-charts__hover-tooltip'\nconst TOOLTIP_OFFSET_PX = 16\n\nconst defaultTimeFormatter = d3.timeFormat('%a, %b %d, %-I:%M %p')\nconst defaultSumFormatter = (sum: number) => {\n const fmt = d3.format(',.2f')\n return `${sum < 0 ? '-' : ''}$${fmt(Math.abs(sum))}`\n}\n\nfunction createTooltipElements(container: HTMLDivElement) {\n const tooltip = document.createElement('div')\n tooltip.className = `${BASE_CLASSNAME}-container`\n tooltip.style.position = 'absolute'\n tooltip.style.top = '0'\n tooltip.style.pointerEvents = 'none'\n tooltip.style.display = 'none'\n container.appendChild(tooltip)\n\n const sumNode = document.createElement('div')\n sumNode.className = `${BASE_CLASSNAME}-sum`\n tooltip.appendChild(sumNode)\n\n const timeNode = document.createElement('div')\n timeNode.className = `${BASE_CLASSNAME}-time`\n tooltip.appendChild(timeNode)\n\n return { wrapper: tooltip, sumNode, timeNode }\n}\n\nfunction calcTooltipPosition(\n tooltipDimensions: DOMRect,\n initX: number,\n maxX: number\n): number | null {\n if (!tooltipDimensions) return null\n\n const fitsRight = initX + TOOLTIP_OFFSET_PX + tooltipDimensions.width < maxX\n\n const tooltipX = fitsRight\n ? initX + TOOLTIP_OFFSET_PX\n : initX - TOOLTIP_OFFSET_PX - tooltipDimensions.width\n\n return tooltipX\n}\n\nexport const renderHoverTooltip = (\n context: Omit<ChartContext, 'elements'>\n): ChartElements['hoverTooltip'] => {\n const { wrapper, sumNode, timeNode } = createTooltipElements(context.wrapperNode)\n\n return {\n className(action, mod) {\n if (action === 'remove') {\n wrapper.classList.remove(`${BASE_CLASSNAME}${mod}`)\n } else {\n wrapper.classList.add(`${BASE_CLASSNAME}${mod}`)\n }\n },\n\n update({ hidden, dataItem }) {\n if (dataItem) {\n const { sumFormatter, timeFormatter } = context.config.hover\n sumNode.textContent = sumFormatter\n ? sumFormatter(dataItem.value)\n : defaultSumFormatter(dataItem.value)\n timeNode.textContent = timeFormatter\n ? timeFormatter(dataItem.date)\n : defaultTimeFormatter(dataItem.date)\n\n requestAnimationFrame(() => {\n const tooltipDimensions = wrapper.getBoundingClientRect()\n const tooltipX = calcTooltipPosition(\n tooltipDimensions,\n context.x(dataItem.date),\n context.width - context.config.margin.right\n )\n if (tooltipX) wrapper.style.left = tooltipX + 'px'\n })\n }\n\n if (hidden !== undefined) {\n wrapper.style.display = hidden ? 'none' : 'block'\n }\n },\n\n destroy() {\n wrapper.remove()\n },\n }\n}\n","import { ChartConfigContext, ChartContext } from './types'\nimport * as d3 from 'd3'\n\nexport const defaultConfig: ChartConfigContext = {\n margin: { top: 10, right: 30, bottom: 20, left: 10 },\n theme: 'light',\n logo: {\n width: 406,\n height: 113,\n x: null,\n y: null,\n picDarkTheme: null,\n picLightTheme: null,\n },\n hasMainLineArea: false,\n hover: {\n enable: true,\n range: '1m',\n transitionDuration: 150,\n transitionName: 'default',\n sumFormatter: null,\n timeFormatter: null,\n },\n selection: {\n enable: true,\n sumFormatter: null,\n timeFormatter: null,\n },\n xAxis: {\n customTicks: false,\n tickFormat: null,\n ticks: null,\n tickValues: null,\n isShow: false,\n },\n yAxis: {\n customTicks: false,\n tickFormat: null,\n ticks: null,\n tickValues: null,\n isShow: true,\n },\n grid: {\n horizontalStyle: 'zero-line-dashed',\n verticalStyle: 'none',\n },\n enableBelowZeroLine: false,\n curveTension: 1,\n}\n\nexport const curveFunction = (ctx: Omit<ChartContext, 'elements'>) =>\n d3.curveCardinal.tension(ctx.config.curveTension)\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartElements } from './types'\nimport { createGradient, getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderMainLineArea = (\n ctx: Omit<ChartContext, 'elements'>\n): ChartElements['mainLineArea'] => {\n const { svg, data, x, y, config } = ctx\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const gradientId = 'main-line-area-gradient'\n\n createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-main-line)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n\n const areaGen = d3\n .area<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y0(y.range()[0])\n .y1((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const baseClassName = 'sc-charts__main-line-area'\n\n const item = svg\n .append('path')\n .datum(data)\n .attr('d', areaGen)\n .attr('class', baseClassName)\n .classed(`${baseClassName}_hidden`, !config.hasMainLineArea)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', areaGen)\n if (hidden !== undefined) {\n if (!config.hasMainLineArea) return null\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartElements, ClipProps } from './types'\nimport { createGradient, getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderRangeLineArea = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { clip?: ClipProps } = {}\n): ChartElements['rangeLineArea'] => {\n const baseClassName = 'sc-charts__range-line-area'\n const { svg, x, y, config, data, chartId } = ctx\n const { clip: initClip } = options\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const gradientId = 'range-line-area-gradient'\n\n createGradient(defs, gradientId + '_up', {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-selection-up)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n createGradient(defs, gradientId + '_down', {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-selection-down)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n\n const areaGen = d3\n .area<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y0(y.range()[0])\n .y1((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .datum(data)\n .attr('d', areaGen)\n .attr('class', baseClassName)\n .classed(`${baseClassName}_hidden`, !config.hasMainLineArea)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, hidden, clip }) {\n if (data !== undefined) item.datum(data).attr('d', areaGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartFabricElement, ClipProps, DataLineUpdateProps } from './types'\nimport { getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderDataLine = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { baseClassName: string; id: string; clip?: ClipProps }\n): ChartFabricElement<Partial<DataLineUpdateProps>> => {\n const { svg, data, x, y, chartId } = ctx\n const { baseClassName, id, clip: initClip } = options\n\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const lineGen = d3\n .line<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .classed(baseClassName, true)\n .datum(data)\n .attr('d', lineGen)\n .attr('id', id)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, clip, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', lineGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartFabricElement, ClipProps, DataLineUpdateProps } from './types'\nimport { getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderHighlightLine = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { baseClassName: string; id: string; clip?: ClipProps }\n): ChartFabricElement<Partial<DataLineUpdateProps>> => {\n const { svg, data, x, y, chartId, config } = ctx\n const { baseClassName, id, clip: initClip } = options\n\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const lineGen = d3\n .line<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .classed(baseClassName, true)\n .datum(data)\n .attr('d', lineGen)\n .attr('id', id)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, clip, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', lineGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n if (config.hover.transitionName === 'default') {\n clipRect\n .transition()\n .duration(config.hover.transitionDuration)\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n .ease(d3.easeLinear)\n } else {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import { ChartElements } from './types'\nimport { renderBorderRangeLine } from './range-border'\nimport { renderCirclePoint } from './circle-point'\nimport { renderHoverLine } from './hover-line'\nimport { ChartContext } from '../types'\nimport { renderRangeTooltip } from './range-tooltip'\nimport { renderHoverTooltip } from './hover-tooltip'\nimport { renderMainLineArea } from './main-line-area'\nimport { renderRangeLineArea } from './range-line-area'\nimport { renderDataLine } from './data-line'\nimport { getBelowZeroClip } from '../utils'\nimport { renderHighlightLine } from './highlight-line'\n\n// render each elements by order\nexport const createElements = (context: Omit<ChartContext, 'elements'>): ChartElements => {\n const mainLine = renderDataLine(context, {\n baseClassName: `sc-charts__main-line`,\n id: `${context.chartId}-sc-charts__main-line`,\n })\n const mainLineArea = renderMainLineArea(context)\n\n const hoverLine = renderHoverLine(context.svg)\n const highlightLine = renderHighlightLine(context, {\n baseClassName: `sc-charts__highlight-line`,\n id: `${context.chartId}-sc-charts__highlight-line`,\n clip: { x: 0, y: 0, width: '0', height: '0' },\n })\n\n let belowZeroLine = null\n\n if (context.config.enableBelowZeroLine) {\n belowZeroLine = renderDataLine(context, {\n baseClassName: `sc-charts__below-zero-line`,\n id: `${context.chartId}-sc-charts__below-zero-line`,\n clip: getBelowZeroClip(context),\n })\n }\n\n const hoverCircle = renderCirclePoint(context.svg, {\n className: 'sc-charts__hover-circle',\n hidden: true,\n })\n const rangeBorderLeft = renderBorderRangeLine(context.svg)\n const rangeBorderRight = renderBorderRangeLine(context.svg)\n const rangeLine = renderDataLine(context, {\n baseClassName: `sc-charts__range-line`,\n id: `${context.chartId}-sc-charts__range-line`,\n clip: { x: 0, y: 0, width: '0', height: '0' },\n })\n const rangeCircleLeft = renderCirclePoint(context.svg, {\n className: 'sc-charts__range-circle-left',\n hidden: true,\n })\n const rangeCircleRight = renderCirclePoint(context.svg, {\n className: 'sc-charts__range-circle-right',\n hidden: true,\n })\n const rangeTooltip = renderRangeTooltip(context)\n const hoverTooltip = renderHoverTooltip(context)\n const rangeLineArea = renderRangeLineArea(context)\n\n return {\n hoverLine,\n hoverCircle,\n rangeBorderLeft,\n rangeBorderRight,\n rangeLine,\n rangeLineArea,\n rangeCircleLeft,\n rangeCircleRight,\n mainLine,\n rangeTooltip,\n highlightLine,\n hoverTooltip,\n mainLineArea,\n belowZeroLine,\n }\n}\n","import { ScaleTime } from 'd3'\nimport { HoverRange } from '../../types'\n\nexport const getClipForRange = (\n hoverRange: HoverRange,\n closestDate: Date,\n x: ScaleTime<number, number, never>\n) => {\n const match = hoverRange.match(/^(\\d+)([dMhmw])$/)\n\n if (!match) {\n console.warn('Invalid hoverRange:', hoverRange)\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n }\n\n const [, amountStr, unit] = match\n const amount = parseInt(amountStr, 10)\n\n const [domainStart, domainEnd] = x.domain()\n\n let cursor = new Date(domainStart)\n\n while (cursor < domainEnd) {\n let next = new Date(cursor)\n\n switch (unit) {\n case 'M':\n next.setMinutes(next.getMinutes() + amount)\n break\n case 'h':\n next.setHours(next.getHours() + amount)\n break\n case 'd':\n next.setDate(next.getDate() + amount)\n break\n case 'w':\n next.setDate(next.getDate() + amount * 7)\n break\n case 'm':\n next = new Date(cursor.getFullYear(), cursor.getMonth() + amount, 1)\n break\n default:\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n }\n\n if (closestDate >= cursor && closestDate < next) {\n const xStart = x(cursor)\n const xEnd = x(next)\n return {\n x: xStart,\n y: 0,\n width: xEnd - xStart,\n height: '100%',\n }\n }\n\n cursor = new Date(next)\n }\n\n if (closestDate.getTime() === domainEnd.getTime()) {\n let prev = new Date(domainEnd)\n\n switch (unit) {\n case 'M':\n prev.setMinutes(prev.getMinutes() - amount)\n break\n case 'h':\n prev.setHours(prev.getHours() - amount)\n break\n case 'd':\n prev.setDate(prev.getDate() - amount)\n break\n case 'w':\n prev.setDate(prev.getDate() - amount * 7)\n break\n case 'm':\n prev = new Date(domainEnd.getFullYear(), domainEnd.getMonth() - amount, 1)\n break\n }\n\n const xStart = x(prev)\n const xEnd = x(domainEnd)\n return {\n x: xStart,\n y: 0,\n width: xEnd - xStart,\n height: '100%',\n }\n }\n\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n}\n","import { ChartContext, ParsedDataPoint } from '../../types'\nimport { getBelowZeroClip } from '../../utils'\nimport { getClipForRange } from './utils'\n\nexport const renderHoverItems = (ctx: ChartContext, closest: ParsedDataPoint) => {\n const {\n x,\n y,\n elements,\n config: { margin },\n height,\n } = ctx\n\n elements.hoverLine.update({\n x1: x(closest.date),\n x2: x(closest.date),\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.hoverCircle.update({\n cx: x(closest.date),\n cy: y(closest.value),\n hidden: false,\n })\n\n elements.hoverTooltip.update({\n dataItem: closest,\n hidden: false,\n })\n\n const baseClip = getClipForRange(ctx.config.hover.range, closest.date, x)\n\n elements.highlightLine.update({\n clip: baseClip,\n hidden: false,\n })\n\n elements.belowZeroLine?.update({\n clip: {\n ...baseClip,\n y: y(0),\n height: y.range()[0] - y(0) + margin.bottom,\n },\n })\n\n elements.mainLine.className('add', '_muted')\n}\n\nexport const hideHoverItems = (ctx: ChartContext) => {\n const { elements } = ctx\n elements.hoverLine.update({ hidden: true })\n elements.hoverCircle.update({ hidden: true })\n elements.highlightLine.update({ hidden: true })\n elements.mainLine.className('remove', '_muted')\n elements.hoverTooltip.update({ hidden: true })\n if (ctx.action !== 'selection') {\n elements.belowZeroLine?.update({\n clip: getBelowZeroClip(ctx),\n })\n }\n}\n","import { ChartElements } from '../elements/types'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nconst controlIsGrowingClasses = (elements: ChartElements, isGrowing: boolean) => {\n const names: (keyof Required<\n Pick<\n ChartElements,\n | 'rangeBorderLeft'\n | 'rangeBorderRight'\n | 'rangeCircleLeft'\n | 'rangeCircleRight'\n | 'rangeLine'\n | 'rangeLineArea'\n | 'rangeTooltip'\n >\n >)[] = [\n 'rangeBorderLeft',\n 'rangeBorderRight',\n 'rangeCircleLeft',\n 'rangeCircleRight',\n 'rangeLine',\n 'rangeLineArea',\n 'rangeTooltip',\n ]\n\n names.forEach((name) => {\n if (isGrowing) {\n elements[name].className('remove', '_down')\n elements[name].className('add', '_up')\n } else {\n elements[name].className('remove', '_up')\n elements[name].className('add', '_down')\n }\n })\n}\n\nexport const renderSelectionItems = (\n ctx: ChartContext,\n startPoint: ParsedDataPoint,\n closest: ParsedDataPoint\n) => {\n const {\n x,\n y,\n config: { margin },\n height,\n elements,\n } = ctx\n\n const leftPoint = x(startPoint.date) < x(closest.date) ? startPoint : closest\n const rightPoint = x(startPoint.date) >= x(closest.date) ? startPoint : closest\n const isGrowing = rightPoint.value - leftPoint.value >= 0\n const xLeft = x(leftPoint.date)\n const xRight = x(rightPoint.date)\n const selectionWidth = xRight - xLeft\n\n elements.rangeBorderLeft.update({\n x1: xLeft,\n x2: xLeft,\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.rangeBorderRight.update({\n x1: xRight,\n x2: xRight,\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.rangeCircleLeft.update({\n cx: xLeft,\n cy: y(leftPoint.value),\n hidden: false,\n })\n\n elements.rangeCircleRight.update({\n cx: xRight,\n cy: y(rightPoint.value),\n hidden: false,\n })\n\n elements.rangeLine.update({\n clip: {\n x: xLeft,\n y: 0,\n width: selectionWidth,\n height: y.range()[0],\n },\n hidden: false,\n })\n\n elements.rangeLineArea.update({\n clip: {\n x: xLeft,\n y: 0,\n width: selectionWidth,\n height: y.range()[0],\n },\n hidden: false,\n })\n\n elements.rangeTooltip.update({\n rightPoint,\n leftPoint,\n closest,\n x: xLeft + selectionWidth / 2,\n y: 0,\n hidden: false,\n })\n\n elements.belowZeroLine?.update({\n hidden: true,\n })\n\n elements.mainLineArea.update({ hidden: true })\n\n controlIsGrowingClasses(elements, isGrowing)\n elements.mainLine.className('add', '_selected-muted')\n}\n\nexport const hideSelectionItems = (ctx: ChartContext) => {\n const { elements } = ctx\n elements.rangeLine.update({ hidden: true })\n elements.rangeLineArea.update({ hidden: true })\n elements.rangeBorderLeft.update({ hidden: true })\n elements.rangeBorderRight.update({ hidden: true })\n elements.rangeCircleLeft.update({ hidden: true })\n elements.rangeCircleRight.update({ hidden: true })\n elements.rangeTooltip.update({ hidden: true })\n elements.mainLine.className('remove', '_selected-muted')\n elements.mainLineArea.update({ hidden: false })\n elements.belowZeroLine?.update({ hidden: false })\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { hideHoverItems, renderHoverItems } from './hover'\nimport { hideSelectionItems, renderSelectionItems } from './selection'\n\nexport const setupInteractions = (ctx: ChartContext) => {\n const { svg, data, x, config, width, height } = ctx\n const { margin, hover, selection } = config\n let startPoint: ParsedDataPoint | null = null\n let isDragging = false\n\n const findClosest = (mouseX: number) => {\n return data.reduce((a, b) =>\n Math.abs(x(a.date) - mouseX) < Math.abs(x(b.date) - mouseX) ? a : b\n )\n }\n\n const overlay = svg\n .append('rect')\n .attr('width', width - margin.left - margin.right)\n .attr('height', height - margin.top - margin.bottom)\n .attr('x', margin.left)\n .attr('y', margin.top)\n .attr('fill', 'transparent')\n\n overlay\n .on('mousemove', function (event) {\n const [mouseX] = d3.pointer(event, this)\n const closest = findClosest(mouseX)\n\n if (!isDragging && hover.enable) {\n ctx.action = 'hover'\n renderHoverItems(ctx, closest)\n } else {\n ctx.action = isDragging ? 'selection' : 'none'\n hideHoverItems(ctx)\n }\n\n if (startPoint && selection.enable) {\n ctx.action = 'selection'\n renderSelectionItems(ctx, startPoint, closest)\n }\n })\n .on('mouseleave', () => {\n ctx.action = 'none'\n isDragging = false\n startPoint = null\n hideHoverItems(ctx)\n hideSelectionItems(ctx)\n })\n .on('mousedown', function (event) {\n if (selection.enable) {\n isDragging = true\n ctx.action = 'selection'\n const [mouseX] = d3.pointer(event, this)\n startPoint = findClosest(mouseX)\n }\n })\n .on('mouseup', function (event) {\n const [mouseX] = d3.pointer(event, this)\n const closest = findClosest(mouseX)\n isDragging = false\n startPoint = null\n ctx.action = 'hover'\n\n if (selection.enable) hideSelectionItems(ctx)\n if (hover.enable) renderHoverItems(ctx, closest)\n })\n}\n","import * as d3 from 'd3'\nimport { ChartConfigContext, ParsedDataPoint } from '../types'\n\nexport const createXScale = (\n data: ParsedDataPoint[],\n config: ChartConfigContext,\n width: number\n) => {\n const { margin } = config\n\n const scale = d3.scaleTime()\n\n const xExtent = d3.extent(data, (d) => new Date(d.date))\n\n if (xExtent[0] == null || xExtent[1] == null) return scale\n\n return scale.domain([xExtent[0], xExtent[1]]).range([margin.left, width - margin.right])\n}\n\nexport const createYScale = (\n data: ParsedDataPoint[],\n config: ChartConfigContext,\n height: number\n) => {\n const { margin } = config\n\n const yMax = d3.max(data, (d) => d.value) ?? 0\n const yMin = d3.min(data, (d) => d.value) ?? 0\n\n return d3\n .scaleLinear()\n .domain([yMin, yMax])\n .range([height - margin.bottom, margin.top])\n}\n","import * as d3 from 'd3'\nimport { createAxes } from './axes'\nimport { createElements } from './elements'\nimport { setupInteractions } from './interactions'\nimport { ChartContext, ParsedDataPoint, LineChartOptions, RenderLineChartOptions } from './types'\nimport { defaultConfig } from './constants'\nimport { mergeConfig } from './utils'\nimport { createYScale, createXScale } from './scales'\nimport '../../css/line-chart.css'\n\nexport const createLineChart = (selector: string, initialOptions: LineChartOptions) => {\n const container = d3.select(selector)\n if (container.empty()) {\n console.error(`Element with selector ${selector} not found!`)\n return null\n }\n if (!initialOptions.chartId || !/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(initialOptions.chartId)) {\n console.error(`chartId is required and must be a valid id \n (only letters, numbers or underscores. The first character must be a letter)`)\n return null\n }\n\n const wrapper = container.append('div')\n const svg = wrapper.append('svg')\n\n const containerNode = container.node() as HTMLElement\n let boundingRect = containerNode.getBoundingClientRect()\n let width = boundingRect.width\n let height = boundingRect.height\n let currentConfig = mergeConfig({ ...defaultConfig }, initialOptions.config)\n let currentData = initialOptions.data\n\n const handleResize = () => {\n boundingRect = containerNode.getBoundingClientRect()\n width = boundingRect.width\n height = boundingRect.height\n render({ data: currentData, config: currentConfig })\n }\n\n window.addEventListener('resize', handleResize)\n\n const render = (options: RenderLineChartOptions, isUpdate = false) => {\n if (isUpdate && options.config) {\n currentConfig = mergeConfig(currentConfig, options.config)\n }\n if (isUpdate && options.data) {\n currentData = options.data\n }\n\n const data: ParsedDataPoint[] = currentData\n .map((d) => ({ date: new Date(d.date), value: d.value }))\n .sort((a, b) => a.date.getTime() - b.date.getTime())\n\n const x = createXScale(data, currentConfig, width)\n const y = createYScale(data, currentConfig, height)\n\n wrapper.attr('class', `sc-charts sc-charts__${currentConfig.theme}`)\n svg\n .attr('preserveAspectRatio', 'xMinYMin meet')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .style('width', '100%')\n .style('height', '100%')\n .selectAll('*')\n .remove()\n\n const preContext: Omit<ChartContext, 'elements'> = {\n chartId: initialOptions.chartId,\n svg,\n wrapperNode: wrapper.node()!,\n data,\n x,\n y,\n config: currentConfig,\n action: 'none',\n width,\n height,\n }\n\n createAxes(preContext)\n\n const context: ChartContext = {\n ...preContext,\n elements: createElements(preContext),\n }\n setupInteractions(context)\n }\n\n render(initialOptions)\n\n return {\n update: (options: RenderLineChartOptions) => render(options, true),\n destroy: () => {\n window.removeEventListener('resize', handleResize)\n svg.remove()\n },\n }\n}\n"],"names":["renderYAxis","context","svg","config","y","width","margin","yAxis","customTicks","tickFormat","tickValues","ticks","isShow","g","axis","d3","d","num","sign","formatted","renderXAxis","x","height","xAxis","renderHorizontalStyles","horizontalStyle","line","tick","renderVerticalStyles","verticalStyle","renderGrid","createAxes","logo","createGradient","defs","gradientId","options","gradient","offset","stopColor","getDefs","defsSelection","getBelowZeroClip","ctx","clipHeight","mergeConfig","base","patch","renderBorderRangeLine","parent","createBorderGradient","mainColor","baseClassName","item","action","mod","x1","x2","y1","y2","hidden","renderCirclePoint","cx","cy","fill","renderHoverLine","BASE_CLASSNAME","timeFormat","sumFormat","sum","fmt","icon","createTooltipElements","container","tooltip","wrapper","sumWrapper","iconNode","sumNode","timeNode","renderRangeTooltip","leftPoint","rightPoint","closest","delta","sumFormatter","timeFormatter","selectionCenter","direction","valueText","dateText","percent","tooltipRect","containerRect","leftX","rightX","tooltipX","minX","maxX","TOOLTIP_OFFSET_PX","defaultTimeFormatter","defaultSumFormatter","calcTooltipPosition","tooltipDimensions","initX","renderHoverTooltip","dataItem","defaultConfig","curveFunction","renderMainLineArea","data","svgNode","areaGen","renderRangeLineArea","chartId","initClip","clipId","clipRect","clip","renderDataLine","id","lineGen","renderHighlightLine","createElements","mainLine","mainLineArea","hoverLine","highlightLine","belowZeroLine","hoverCircle","rangeBorderLeft","rangeBorderRight","rangeLine","rangeCircleLeft","rangeCircleRight","rangeTooltip","hoverTooltip","rangeLineArea","getClipForRange","hoverRange","closestDate","match","amountStr","unit","amount","domainStart","domainEnd","cursor","next","xStart","xEnd","prev","renderHoverItems","elements","baseClip","_a","hideHoverItems","controlIsGrowingClasses","isGrowing","name","renderSelectionItems","startPoint","xLeft","xRight","selectionWidth","hideSelectionItems","setupInteractions","hover","selection","isDragging","findClosest","mouseX","a","b","event","createXScale","scale","xExtent","createYScale","yMax","yMin","createLineChart","selector","initialOptions","containerNode","boundingRect","currentConfig","currentData","handleResize","render","isUpdate","preContext"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- (function(k,L){typeof exports=="object"&&typeof module<"u"?L(exports,require("d3")):typeof define=="function"&&define.amd?define(["exports","d3"],L):(k=typeof globalThis<"u"?globalThis:k||self,L(k.ChartsCore={},k.d3))})(this,function(k,L){"use strict";function V(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const a in t)if(a!=="default"){const r=Object.getOwnPropertyDescriptor(t,a);Object.defineProperty(e,a,r.get?r:{enumerable:!0,get:()=>t[a]})}}return e.default=t,Object.freeze(e)}const w=V(L),j=t=>{const{svg:e,config:a,y:r,width:o}=t,{margin:s,yAxis:n}=a,{customTicks:c,tickFormat:d,tickValues:i,ticks:l,isShow:g}=n;if(!g)return null;e.append("g").attr("transform",`translate(${o-s.right},0)`).call(h=>{let u=w.axisRight(r);c?(d&&(u=u.tickFormat(d)),l&&(u=Array.isArray(l)?u.ticks(...l):u.ticks(l)),i&&(u=u.tickValues(i))):u=u.tickFormat(m=>{const $=Number(m),v=$<0?"-":"",p=w.format(".0s")(Math.abs($));return`${v}${p}`}),h.call(u)}).call(h=>{let u=[];h.selectAll(".tick").each(m=>u.push(m)),t.yTicks=u}).call(h=>h.select(".domain").remove()).call(h=>h.selectAll(".tick line").remove()).call(h=>h.selectAll(".tick text").classed("sc-charts__y-axis-tick",!0)).attr("font-family","inherit")},O=t=>{const{svg:e,config:a,x:r,height:o}=t,{margin:s,xAxis:n}=a,{isShow:c,tickValues:d,tickFormat:i,customTicks:l,ticks:g}=n;if(!c)return null;e.append("g").attr("transform",`translate(0,${o-s.bottom})`).call(h=>{let u=w.axisBottom(r);l?(i&&(u=u.tickFormat(i)),g&&(u=Array.isArray(g)?u.ticks(...g):u.ticks(g)),d&&(u=u.tickValues(d))):u.ticks(5),h.call(u)}).call(h=>h.select(".domain").remove()).call(h=>{let u=[];h.selectAll(".tick").each(m=>u.push(m)),t.xTicks=u}).call(h=>h.selectAll(".tick line").remove()).call(h=>h.selectAll(".tick text").classed("sc-charts__x-axis-tick",!0)).attr("font-family","inherit")},W=t=>{const{svg:e,config:a,y:r,width:o}=t,{margin:s,grid:{horizontalStyle:n}}=a;if(n!=="none"){if(n.startsWith("zero-line")){const c=e.append("line").attr("x1",0+s.left).attr("x2",o-s.right).attr("y1",r(0)).attr("y2",r(0)).attr("stroke","var(--sc-color-axis-zero-line)").attr("stroke-width",1);n==="zero-line-dashed"&&c.attr("stroke-dasharray","4 4")}n.startsWith("every-line")&&(t.yTicks||r.ticks()).forEach(d=>{const i=e.append("line").attr("x1",0+s.left).attr("x2",o-s.right).attr("y1",r(d)).attr("y2",r(d)).attr("stroke","var(--sc-color-axis-zero-line)").attr("stroke-width",1);n==="every-line-dashed"&&i.attr("stroke-dasharray","4 4")})}},Y=t=>{const{svg:e,config:a,x:r,height:o}=t,{margin:s,grid:{verticalStyle:n}}=a;n!=="none"&&n.startsWith("every-line")&&(t.xTicks||r.ticks()).forEach(d=>{const i=e.append("line").attr("x1",r(d)).attr("x2",r(d)).attr("y1",s.top).attr("y2",o-s.bottom).attr("stroke","var(--sc-color-axis-zero-line)").attr("stroke-width",1);n==="every-line-dashed"&&i.attr("stroke-dasharray","4 4")})},q=t=>{W(t),Y(t)},P=t=>{const{svg:e,config:a,width:r,height:o}=t,{margin:s,logo:n}=a;O(t),j(t),n&&e.append("image").attr("xlink:href",a.theme==="dark"?n.picDarkTheme:n.picLightTheme).attr("width",n.width).attr("height",n.height).attr("x",n.x??(r-s.left-s.right)/2-n.width/2+s.left).attr("y",n.y??(o-s.top-s.bottom)/2-n.height/2+s.top),q(t)},_=(t,e,a)=>{let r=t.select(`#${e}`);return r.empty()&&(r=t.append("linearGradient").attr("gradientUnits","userSpaceOnUse").attr("id",e)),r.attr("x1",a.x1).attr("y1",a.x2).attr("x2",a.y1).attr("y2",a.y2),a.stops.forEach(({offset:o,stopColor:s})=>{r.append("stop").attr("offset",o).attr("stop-color",s)}),r},b=t=>{const e=w.select(t).select("defs");return e.empty()?w.select(t).append("defs"):e},R=t=>{const{y:e,config:{margin:a}}=t,r=e.range()[0]-e(0);return{x:0,y:e.range()[0]-r,width:"100%",height:r+a.bottom}},D=(t,e)=>({...t,...e,margin:{...t.margin,...e==null?void 0:e.margin},logo:t.logo&&(e!=null&&e.logo)?{width:e.logo.width??t.logo.width,height:e.logo.height??t.logo.height,picLightTheme:e.logo.picLightTheme??t.logo.picLightTheme,picDarkTheme:e.logo.picDarkTheme??t.logo.picDarkTheme,x:e.logo.x??t.logo.x,y:e.logo.y??t.logo.y}:t.logo,xAxis:{...t.xAxis,...e==null?void 0:e.xAxis},yAxis:{...t.yAxis,...e==null?void 0:e.yAxis},grid:{...t.grid,...e==null?void 0:e.grid},hover:{...t.hover,...e==null?void 0:e.hover},selection:{...t.selection,...e==null?void 0:e.selection}}),F=(t,e={})=>{const a=t.node(),r=b(a),o=(c,d)=>_(r,c,{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"rgba(255, 255, 255, 0)"},{offset:"20%",stopColor:d},{offset:"60%",stopColor:d},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]});o("gradient-range-borders-up","var(--sc-color-selection-up)"),o("gradient-range-borders-down","var(--sc-color-selection-down)");const s="sc-charts__border-range-line",n=t.append("line").classed(s,!0).style("display",e.hidden?"none":"block");return{className(c,d){c==="remove"?n.classed(`${s}${d}`,!1):n.classed(`${s}${d}`,!0)},update({x1:c,x2:d,y1:i,y2:l,hidden:g}){c!==void 0&&n.attr("x1",c),d!==void 0&&n.attr("x2",d),i!==void 0&&n.attr("y1",i),l!==void 0&&n.attr("y2",l),g!==void 0&&n.style("display",g?"none":"block")},destroy(){n.remove()}}},M=(t,e={})=>{const a=t.append("circle").attr("r",e.radius||4).style("display",e.hidden?"none":"block"),r=e.className||"";return r&&a.classed(r,!0),{className(o,s){o==="remove"?a.classed(`${r}${s}`,!1):a.classed(`${r}${s}`,!0)},update({cx:o,cy:s,hidden:n,fill:c}){o!==void 0&&a.attr("cx",o),s!==void 0&&a.attr("cy",s),c!==void 0&&a.attr("fill",c),n!==void 0&&a.style("display",n?"none":"block")},destroy(){a.remove()}}},U=(t,e={})=>{const a="sc-charts__hover-line",r=t.append("line").style("display",e.hidden?"none":"block").classed(a,!0),o=t.node(),s=b(o);return((c,d)=>_(s,c,{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"rgba(255, 255, 255, 0)"},{offset:"15%",stopColor:d},{offset:"75%",stopColor:d},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]}))("hover-line-gradient","var(--sc-color-hover-line)"),{className(c,d){c==="remove"?r.classed(`${a}${d}`,!1):r.classed(`${a}${d}`,!0)},update({x1:c,x2:d,y1:i,y2:l,hidden:g}){c!==void 0&&r.attr("x1",c),d!==void 0&&r.attr("x2",d),i!==void 0&&r.attr("y1",i),l!==void 0&&r.attr("y2",l),g!==void 0&&r.style("display",g?"none":"block")},destroy(){r.remove()}}},C="sc-charts__range-tooltip",I=w.timeFormat("%b %e, %I:%M %p"),J=t=>{const e=w.format(",.2f");return`${t<0?"-":""}$${e(Math.abs(t))}`},K=`
1
+ (function(k,L){typeof exports=="object"&&typeof module<"u"?L(exports,require("d3")):typeof define=="function"&&define.amd?define(["exports","d3"],L):(k=typeof globalThis<"u"?globalThis:k||self,L(k.ChartsCore={},k.d3))})(this,function(k,L){"use strict";function V(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const a in e)if(a!=="default"){const r=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:()=>e[a]})}}return t.default=e,Object.freeze(t)}const w=V(L),j=e=>{const{svg:t,config:a,y:r,width:o}=e,{margin:s,yAxis:n}=a,{customTicks:c,tickFormat:d,tickValues:i,ticks:l,isShow:g}=n;if(!g)return null;t.append("g").attr("transform",`translate(${o-s.right},0)`).call(h=>{let u=w.axisRight(r);c?(d&&(u=u.tickFormat(d)),l&&(u=Array.isArray(l)?u.ticks(...l):u.ticks(l)),i&&(u=u.tickValues(i))):u=u.tickFormat(m=>{const $=Number(m),v=$<0?"-":"",p=w.format(".0s")(Math.abs($));return`${v}${p}`}),h.call(u)}).call(h=>{let u=[];h.selectAll(".tick").each(m=>u.push(m)),e.yTicks=u}).call(h=>h.select(".domain").remove()).call(h=>h.selectAll(".tick line").remove()).call(h=>h.selectAll(".tick text").classed("sc-charts__y-axis-tick",!0)).attr("font-family","inherit")},O=e=>{const{svg:t,config:a,x:r,height:o}=e,{margin:s,xAxis:n}=a,{isShow:c,tickValues:d,tickFormat:i,customTicks:l,ticks:g}=n;if(!c)return null;t.append("g").attr("transform",`translate(0,${o-s.bottom})`).call(h=>{let u=w.axisBottom(r);l?(i&&(u=u.tickFormat(i)),g&&(u=Array.isArray(g)?u.ticks(...g):u.ticks(g)),d&&(u=u.tickValues(d))):u.ticks(5),h.call(u)}).call(h=>h.select(".domain").remove()).call(h=>{let u=[];h.selectAll(".tick").each(m=>u.push(m)),e.xTicks=u}).call(h=>h.selectAll(".tick line").remove()).call(h=>h.selectAll(".tick text").classed("sc-charts__x-axis-tick",!0)).attr("font-family","inherit")},W=e=>{const{svg:t,config:a,y:r,width:o}=e,{margin:s,grid:{horizontalStyle:n}}=a;if(n!=="none"){if(n.startsWith("zero-line")){const c=t.append("line").attr("x1",0+s.left).attr("x2",o-s.right).attr("y1",r(0)).attr("y2",r(0)).attr("stroke","var(--sc-color-axis-zero-line)").attr("stroke-width",1);n==="zero-line-dashed"&&c.attr("stroke-dasharray","4 4")}n.startsWith("every-line")&&(e.yTicks||r.ticks()).forEach(d=>{const i=t.append("line").attr("x1",0+s.left).attr("x2",o-s.right).attr("y1",r(d)).attr("y2",r(d)).attr("stroke","var(--sc-color-axis-zero-line)").attr("stroke-width",1);n==="every-line-dashed"&&i.attr("stroke-dasharray","4 4")})}},Y=e=>{const{svg:t,config:a,x:r,height:o}=e,{margin:s,grid:{verticalStyle:n}}=a;n!=="none"&&n.startsWith("every-line")&&(e.xTicks||r.ticks()).forEach(d=>{const i=t.append("line").attr("x1",r(d)).attr("x2",r(d)).attr("y1",s.top).attr("y2",o-s.bottom).attr("stroke","var(--sc-color-axis-zero-line)").attr("stroke-width",1);n==="every-line-dashed"&&i.attr("stroke-dasharray","4 4")})},q=e=>{W(e),Y(e)},P=e=>{const{svg:t,config:a,width:r,height:o}=e,{margin:s,logo:n}=a;O(e),j(e),n&&t.append("image").attr("xlink:href",a.theme==="dark"?n.picDarkTheme:n.picLightTheme).attr("width",n.width).attr("height",n.height).attr("x",n.x??(r-s.left-s.right)/2-n.width/2+s.left).attr("y",n.y??(o-s.top-s.bottom)/2-n.height/2+s.top),q(e)},_=(e,t,a)=>{let r=e.select(`#${t}`);return r.empty()&&(r=e.append("linearGradient").attr("gradientUnits","userSpaceOnUse").attr("id",t)),r.attr("x1",a.x1).attr("y1",a.x2).attr("x2",a.y1).attr("y2",a.y2),a.stops.forEach(({offset:o,stopColor:s})=>{r.append("stop").attr("offset",o).attr("stop-color",s)}),r},b=e=>{const t=w.select(e).select("defs");return t.empty()?w.select(e).append("defs"):t},F=e=>{const{y:t,config:{margin:a}}=e,r=t.range()[0]-t(0);return{x:0,y:t.range()[0]-r,width:"100%",height:r+a.bottom}},R=(e,t)=>({...e,...t,margin:{...e.margin,...t==null?void 0:t.margin},logo:e.logo&&(t!=null&&t.logo)?{width:t.logo.width??e.logo.width,height:t.logo.height??e.logo.height,picLightTheme:t.logo.picLightTheme??e.logo.picLightTheme,picDarkTheme:t.logo.picDarkTheme??e.logo.picDarkTheme,x:t.logo.x??e.logo.x,y:t.logo.y??e.logo.y}:e.logo,xAxis:{...e.xAxis,...t==null?void 0:t.xAxis},yAxis:{...e.yAxis,...t==null?void 0:t.yAxis},grid:{...e.grid,...t==null?void 0:t.grid},hover:{...e.hover,...t==null?void 0:t.hover},selection:{...e.selection,...t==null?void 0:t.selection}}),D=(e,t={})=>{const a=e.node(),r=b(a),o=(c,d)=>_(r,c,{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"rgba(255, 255, 255, 0)"},{offset:"20%",stopColor:d},{offset:"60%",stopColor:d},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]});o("gradient-range-borders-up","var(--sc-color-selection-up)"),o("gradient-range-borders-down","var(--sc-color-selection-down)");const s="sc-charts__border-range-line",n=e.append("line").classed(s,!0).style("display",t.hidden?"none":"block");return{className(c,d){c==="remove"?n.classed(`${s}${d}`,!1):n.classed(`${s}${d}`,!0)},update({x1:c,x2:d,y1:i,y2:l,hidden:g}){c!==void 0&&n.attr("x1",c),d!==void 0&&n.attr("x2",d),i!==void 0&&n.attr("y1",i),l!==void 0&&n.attr("y2",l),g!==void 0&&n.style("display",g?"none":"block")},destroy(){n.remove()}}},M=(e,t={})=>{const a=e.append("circle").attr("r",t.radius||4).style("display",t.hidden?"none":"block"),r=t.className||"";return r&&a.classed(r,!0),{className(o,s){o==="remove"?a.classed(`${r}${s}`,!1):a.classed(`${r}${s}`,!0)},update({cx:o,cy:s,hidden:n,fill:c}){o!==void 0&&a.attr("cx",o),s!==void 0&&a.attr("cy",s),c!==void 0&&a.attr("fill",c),n!==void 0&&a.style("display",n?"none":"block")},destroy(){a.remove()}}},U=(e,t={})=>{const a="sc-charts__hover-line",r=e.append("line").style("display",t.hidden?"none":"block").classed(a,!0),o=e.node(),s=b(o);return((c,d)=>_(s,c,{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"rgba(255, 255, 255, 0)"},{offset:"15%",stopColor:d},{offset:"75%",stopColor:d},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]}))("hover-line-gradient","var(--sc-color-hover-line)"),{className(c,d){c==="remove"?r.classed(`${a}${d}`,!1):r.classed(`${a}${d}`,!0)},update({x1:c,x2:d,y1:i,y2:l,hidden:g}){c!==void 0&&r.attr("x1",c),d!==void 0&&r.attr("x2",d),i!==void 0&&r.attr("y1",i),l!==void 0&&r.attr("y2",l),g!==void 0&&r.style("display",g?"none":"block")},destroy(){r.remove()}}},C="sc-charts__range-tooltip",B=w.timeFormat("%b %e, %I:%M %p"),J=e=>{const t=w.format(",.2f");return`${e<0?"-":""}$${t(Math.abs(e))}`},K=`
2
2
  <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
3
3
  <path d="M7 0.5C5.71442 0.5 4.45772 0.881218 3.3888 1.59545C2.31988 2.30968 1.48676 3.32484 0.994786 4.51256C0.502816 5.70028 0.374095 7.00721 0.624899 8.26809C0.875703 9.52896 1.49477 10.6872 2.40381 11.5962C3.31285 12.5052 4.47104 13.1243 5.73192 13.3751C6.99279 13.6259 8.29973 13.4972 9.48744 13.0052C10.6752 12.5132 11.6903 11.6801 12.4046 10.6112C13.1188 9.54229 13.5 8.28558 13.5 7C13.4982 5.27665 12.8128 3.62441 11.5942 2.40582C10.3756 1.18722 8.72335 0.50182 7 0.5ZM9.35375 6.85375C9.30732 6.90024 9.25217 6.93712 9.19147 6.96228C9.13077 6.98744 9.06571 7.00039 9 7.00039C8.93429 7.00039 8.86923 6.98744 8.80853 6.96228C8.74783 6.93712 8.69269 6.90024 8.64625 6.85375L7.5 5.70687V9.5C7.5 9.63261 7.44732 9.75979 7.35356 9.85355C7.25979 9.94732 7.13261 10 7 10C6.86739 10 6.74022 9.94732 6.64645 9.85355C6.55268 9.75979 6.5 9.63261 6.5 9.5V5.70687L5.35375 6.85375C5.25993 6.94757 5.13268 7.00028 5 7.00028C4.86732 7.00028 4.74007 6.94757 4.64625 6.85375C4.55243 6.75993 4.49972 6.63268 4.49972 6.5C4.49972 6.36732 4.55243 6.24007 4.64625 6.14625L6.64625 4.14625C6.69269 4.09976 6.74783 4.06288 6.80853 4.03772C6.86923 4.01256 6.9343 3.99961 7 3.99961C7.06571 3.99961 7.13077 4.01256 7.19147 4.03772C7.25217 4.06288 7.30732 4.09976 7.35375 4.14625L9.35375 6.14625C9.40024 6.19269 9.43712 6.24783 9.46228 6.30853C9.48744 6.36923 9.5004 6.43429 9.5004 6.5C9.5004 6.56571 9.48744 6.63077 9.46228 6.69147C9.43712 6.75217 9.40024 6.80731 9.35375 6.85375Z"
4
4
  fill="currentColor"/>
5
5
  </svg>
6
- `;function Q(t){const e=document.createElement("div");e.className=C,t.append(e);const a=document.createElement("div");a.className=`${C}-container`,e.style.position="absolute",e.style.top="0",e.style.pointerEvents="none",e.style.display="none",e.append(a);const r=document.createElement("div");r.className=`${C}-sum`,a.append(r);const o=document.createElement("div");o.className=`${C}-sum-icon`,o.innerHTML=K,r.append(o);const s=document.createElement("div");r.append(s);const n=document.createElement("div");return n.className=`${C}-time`,a.append(n),{wrapper:e,sumNode:s,timeNode:n}}const ee=t=>{const{wrapper:e,sumNode:a,timeNode:r}=Q(t.wrapperNode);return{className(o,s){o==="remove"?e.classList.remove(`${C}${s}`):e.classList.add(`${C}${s}`)},update({leftPoint:o,rightPoint:s,x:n,y:c,hidden:d,closest:i}){if(o&&s&&i&&n!==void 0){const l=s.value-o.value,{sumFormatter:g,timeFormatter:h}=t.config.selection,u=(t.x(s.date)+t.x(o.date))/2,m=t.x(i.date)<u?"left":"right";let $="",v="";if(g)$=g({left:o.value,right:s.value,direction:m});else{const p=(l/Math.abs(o.value)*100).toFixed(2);$=`${J(l)} (${p}%)`}h?v=h({left:o.date,right:s.date,direction:m}):v=`${I(o.date)} to ${I(s.date)}`,a.textContent=$,r.textContent=v,requestAnimationFrame(()=>{const p=e.getBoundingClientRect(),f=t.wrapperNode.getBoundingClientRect(),y=t.x(o.date),x=t.x(s.date);let A=(y+x)/2-p.width/2;const H=0,Z=f.width-p.width;A<H&&(A=H),A>Z&&(A=Z),e.style.left=`${A}px`,e.style.top=`${c}px`})}d!==void 0&&(e.style.display=d?"none":"block")},destroy(){e.remove()}}},N="sc-charts__hover-tooltip",S=16,te=w.timeFormat("%a, %b %d, %-I:%M %p"),ae=t=>{const e=w.format(",.2f");return`${t<0?"-":""}$${e(Math.abs(t))}`};function re(t){const e=document.createElement("div");e.className=`${N}-container`,e.style.position="absolute",e.style.top="0",e.style.pointerEvents="none",e.style.display="none",t.appendChild(e);const a=document.createElement("div");a.className=`${N}-sum`,e.appendChild(a);const r=document.createElement("div");return r.className=`${N}-time`,e.appendChild(r),{wrapper:e,sumNode:a,timeNode:r}}function se(t,e,a){return t?e+S+t.width<a?e+S:e-S-t.width:null}const ne=t=>{const{wrapper:e,sumNode:a,timeNode:r}=re(t.wrapperNode);return{className(o,s){o==="remove"?e.classList.remove(`${N}${s}`):e.classList.add(`${N}${s}`)},update({hidden:o,dataItem:s}){s&&(a.textContent=ae(s.value),r.textContent=te(s.date),requestAnimationFrame(()=>{const n=e.getBoundingClientRect(),c=se(n,t.x(s.date),t.width-t.config.margin.right);c&&(e.style.left=c+"px")})),o!==void 0&&(e.style.display=o?"none":"block")},destroy(){e.remove()}}},oe={margin:{top:10,right:30,bottom:20,left:10},theme:"light",logo:{width:406,height:113,x:null,y:null,picDarkTheme:null,picLightTheme:null},hasMainLineArea:!1,hover:{enable:!0,range:"1m",transitionDuration:150,transitionName:"default"},selection:{enable:!0,sumFormatter:null,timeFormatter:null},xAxis:{customTicks:!1,tickFormat:null,ticks:null,tickValues:null,isShow:!1},yAxis:{customTicks:!1,tickFormat:null,ticks:null,tickValues:null,isShow:!0},grid:{horizontalStyle:"zero-line-dashed",verticalStyle:"none"},enableBelowZeroLine:!1,curveTension:1},T=t=>w.curveCardinal.tension(t.config.curveTension),ie=t=>{const{svg:e,data:a,x:r,y:o,config:s}=t,n=e.node(),c=b(n);_(c,"main-line-area-gradient",{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"var(--sc-color-main-line)"},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]});const i=w.area().x(h=>r(h.date)).y0(o.range()[0]).y1(h=>o(h.value)).curve(T(t)),l="sc-charts__main-line-area",g=e.append("path").datum(a).attr("d",i).attr("class",l).classed(`${l}_hidden`,!s.hasMainLineArea);return{className(h,u){h==="remove"?g.classed(`${l}${u}`,!1):g.classed(`${l}${u}`,!0)},update({data:h,hidden:u}){if(h!==void 0&&g.datum(h).attr("d",i),u!==void 0){if(!s.hasMainLineArea)return null;g.classed(`${l}_hidden`,u)}},destroy(){g.remove()}}},le=(t,e={})=>{const a="sc-charts__range-line-area",{svg:r,x:o,y:s,config:n,data:c,chartId:d}=t,{clip:i}=e,l=r.node(),g=b(l),h="range-line-area-gradient";_(g,h+"_up",{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"var(--sc-color-selection-up)"},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]}),_(g,h+"_down",{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"var(--sc-color-selection-down)"},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]});const u=w.area().x(f=>o(f.date)).y0(s.range()[0]).y1(f=>s(f.value)).curve(T(t)),m=`${d}-clip-${a}`,v=g.append("clipPath").attr("id",m).append("rect").attr("x",(i==null?void 0:i.x)||0).attr("y",(i==null?void 0:i.y)||0).attr("width",(i==null?void 0:i.width)||"100%").attr("height",(i==null?void 0:i.height)||"100%"),p=r.append("path").datum(c).attr("d",u).attr("class",a).classed(`${a}_hidden`,!n.hasMainLineArea).attr("clip-path",`url(#${m})`);return{className(f,y){f==="remove"?p.classed(`${a}${y}`,!1):p.classed(`${a}${y}`,!0)},update({data:f,hidden:y,clip:x}){f!==void 0&&p.datum(f).attr("d",u),y!==void 0&&p.classed(`${a}_hidden`,y),x!==void 0&&v.attr("x",x.x).attr("y",x.y).attr("width",x.width).attr("height",x.height)},destroy(){p.remove()}}},E=(t,e)=>{const{svg:a,data:r,x:o,y:s,chartId:n}=t,{baseClassName:c,id:d,clip:i}=e,l=a.node(),g=b(l),h=w.line().x(p=>o(p.date)).y(p=>s(p.value)).curve(T(t)),u=`${n}-clip-${c}`,$=g.append("clipPath").attr("id",u).append("rect").attr("x",(i==null?void 0:i.x)||0).attr("y",(i==null?void 0:i.y)||0).attr("width",(i==null?void 0:i.width)||"100%").attr("height",(i==null?void 0:i.height)||"100%"),v=a.append("path").classed(c,!0).datum(r).attr("d",h).attr("id",d).attr("clip-path",`url(#${u})`);return{className(p,f){p==="remove"?v.classed(`${c}${f}`,!1):v.classed(`${c}${f}`,!0)},update({data:p,clip:f,hidden:y}){p!==void 0&&v.datum(p).attr("d",h),y!==void 0&&v.classed(`${c}_hidden`,y),f!==void 0&&$.attr("x",f.x).attr("y",f.y).attr("width",f.width).attr("height",f.height)},destroy(){v.remove()}}},ce=(t,e)=>{const{svg:a,data:r,x:o,y:s,chartId:n,config:c}=t,{baseClassName:d,id:i,clip:l}=e,g=a.node(),h=b(g),u=w.line().x(f=>o(f.date)).y(f=>s(f.value)).curve(T(t)),m=`${n}-clip-${d}`,v=h.append("clipPath").attr("id",m).append("rect").attr("x",(l==null?void 0:l.x)||0).attr("y",(l==null?void 0:l.y)||0).attr("width",(l==null?void 0:l.width)||"100%").attr("height",(l==null?void 0:l.height)||"100%"),p=a.append("path").classed(d,!0).datum(r).attr("d",u).attr("id",i).attr("clip-path",`url(#${m})`);return{className(f,y){f==="remove"?p.classed(`${d}${y}`,!1):p.classed(`${d}${y}`,!0)},update({data:f,clip:y,hidden:x}){f!==void 0&&p.datum(f).attr("d",u),x!==void 0&&p.classed(`${d}_hidden`,x),y!==void 0&&(c.hover.transitionName==="default"?v.transition().duration(c.hover.transitionDuration).attr("x",y.x).attr("y",y.y).attr("width",y.width).attr("height",y.height).ease(w.easeLinear):v.attr("x",y.x).attr("y",y.y).attr("width",y.width).attr("height",y.height))},destroy(){p.remove()}}},de=t=>{const e=E(t,{baseClassName:"sc-charts__main-line",id:`${t.chartId}-sc-charts__main-line`}),a=ie(t),r=U(t.svg),o=ce(t,{baseClassName:"sc-charts__highlight-line",id:`${t.chartId}-sc-charts__highlight-line`,clip:{x:0,y:0,width:"0",height:"0"}});let s=null;t.config.enableBelowZeroLine&&(s=E(t,{baseClassName:"sc-charts__below-zero-line",id:`${t.chartId}-sc-charts__below-zero-line`,clip:R(t)}));const n=M(t.svg,{className:"sc-charts__hover-circle",hidden:!0}),c=F(t.svg),d=F(t.svg),i=E(t,{baseClassName:"sc-charts__range-line",id:`${t.chartId}-sc-charts__range-line`,clip:{x:0,y:0,width:"0",height:"0"}}),l=M(t.svg,{className:"sc-charts__range-circle-left",hidden:!0}),g=M(t.svg,{className:"sc-charts__range-circle-right",hidden:!0}),h=ee(t),u=ne(t),m=le(t);return{hoverLine:r,hoverCircle:n,rangeBorderLeft:c,rangeBorderRight:d,rangeLine:i,rangeLineArea:m,rangeCircleLeft:l,rangeCircleRight:g,mainLine:e,rangeTooltip:h,highlightLine:o,hoverTooltip:u,mainLineArea:a,belowZeroLine:s}},he=(t,e,a)=>{const r=t.match(/^(\d+)([dMhmw])$/);if(!r)return console.warn("Invalid hoverRange:",t),{x:0,y:0,width:"100%",height:"100%"};const[,o,s]=r,n=parseInt(o,10),[c,d]=a.domain();let i=new Date(c);for(;i<d;){let l=new Date(i);switch(s){case"M":l.setMinutes(l.getMinutes()+n);break;case"h":l.setHours(l.getHours()+n);break;case"d":l.setDate(l.getDate()+n);break;case"w":l.setDate(l.getDate()+n*7);break;case"m":l=new Date(i.getFullYear(),i.getMonth()+n,1);break;default:return{x:0,y:0,width:"100%",height:"100%"}}if(e>=i&&e<l){const g=a(i),h=a(l);return{x:g,y:0,width:h-g,height:"100%"}}i=new Date(l)}if(e.getTime()===d.getTime()){let l=new Date(d);switch(s){case"M":l.setMinutes(l.getMinutes()-n);break;case"h":l.setHours(l.getHours()-n);break;case"d":l.setDate(l.getDate()-n);break;case"w":l.setDate(l.getDate()-n*7);break;case"m":l=new Date(d.getFullYear(),d.getMonth()-n,1);break}const g=a(l),h=a(d);return{x:g,y:0,width:h-g,height:"100%"}}return{x:0,y:0,width:"100%",height:"100%"}},B=(t,e)=>{var d;const{x:a,y:r,elements:o,config:{margin:s},height:n}=t;o.hoverLine.update({x1:a(e.date),x2:a(e.date),y1:s.top,y2:n-s.bottom,hidden:!1}),o.hoverCircle.update({cx:a(e.date),cy:r(e.value),hidden:!1}),o.hoverTooltip.update({dataItem:e,hidden:!1});const c=he(t.config.hover.range,e.date,a);o.highlightLine.update({clip:c,hidden:!1}),(d=o.belowZeroLine)==null||d.update({clip:{...c,y:r(0),height:r.range()[0]-r(0)+s.bottom}}),o.mainLine.className("add","_muted")},z=t=>{var a;const{elements:e}=t;e.hoverLine.update({hidden:!0}),e.hoverCircle.update({hidden:!0}),e.highlightLine.update({hidden:!0}),e.mainLine.className("remove","_muted"),e.hoverTooltip.update({hidden:!0}),t.action!=="selection"&&((a=e.belowZeroLine)==null||a.update({clip:R(t)}))},ue=(t,e)=>{["rangeBorderLeft","rangeBorderRight","rangeCircleLeft","rangeCircleRight","rangeLine","rangeLineArea","rangeTooltip"].forEach(r=>{e?(t[r].className("remove","_down"),t[r].className("add","_up")):(t[r].className("remove","_up"),t[r].className("add","_down"))})},ge=(t,e,a)=>{var m;const{x:r,y:o,config:{margin:s},height:n,elements:c}=t,d=r(e.date)<r(a.date)?e:a,i=r(e.date)>=r(a.date)?e:a,l=i.value-d.value>=0,g=r(d.date),h=r(i.date),u=h-g;c.rangeBorderLeft.update({x1:g,x2:g,y1:s.top,y2:n-s.bottom,hidden:!1}),c.rangeBorderRight.update({x1:h,x2:h,y1:s.top,y2:n-s.bottom,hidden:!1}),c.rangeCircleLeft.update({cx:g,cy:o(d.value),hidden:!1}),c.rangeCircleRight.update({cx:h,cy:o(i.value),hidden:!1}),c.rangeLine.update({clip:{x:g,y:0,width:u,height:o.range()[0]},hidden:!1}),c.rangeLineArea.update({clip:{x:g,y:0,width:u,height:o.range()[0]},hidden:!1}),c.rangeTooltip.update({rightPoint:i,leftPoint:d,closest:a,x:g+u/2,y:0,hidden:!1}),(m=c.belowZeroLine)==null||m.update({hidden:!0}),c.mainLineArea.update({hidden:!0}),ue(c,l),c.mainLine.className("add","_selected-muted")},X=t=>{var a;const{elements:e}=t;e.rangeLine.update({hidden:!0}),e.rangeLineArea.update({hidden:!0}),e.rangeBorderLeft.update({hidden:!0}),e.rangeBorderRight.update({hidden:!0}),e.rangeCircleLeft.update({hidden:!0}),e.rangeCircleRight.update({hidden:!0}),e.rangeTooltip.update({hidden:!0}),e.mainLine.className("remove","_selected-muted"),e.mainLineArea.update({hidden:!1}),(a=e.belowZeroLine)==null||a.update({hidden:!1})},me=t=>{const{svg:e,data:a,x:r,config:o,width:s,height:n}=t,{margin:c,hover:d,selection:i}=o;let l=null,g=!1;const h=m=>a.reduce(($,v)=>Math.abs(r($.date)-m)<Math.abs(r(v.date)-m)?$:v);e.append("rect").attr("width",s-c.left-c.right).attr("height",n-c.top-c.bottom).attr("x",c.left).attr("y",c.top).attr("fill","transparent").on("mousemove",function(m){const[$]=w.pointer(m,this),v=h($);!g&&d.enable?(t.action="hover",B(t,v)):(t.action=g?"selection":"none",z(t)),l&&i.enable&&(t.action="selection",ge(t,l,v))}).on("mouseleave",()=>{t.action="none",g=!1,l=null,z(t),X(t)}).on("mousedown",function(m){if(i.enable){g=!0,t.action="selection";const[$]=w.pointer(m,this);l=h($)}}).on("mouseup",function(m){const[$]=w.pointer(m,this),v=h($);g=!1,l=null,t.action="hover",i.enable&&X(t),d.enable&&B(t,v)})},fe=(t,e,a)=>{const{margin:r}=e,o=w.scaleTime(),s=w.extent(t,n=>new Date(n.date));return s[0]==null||s[1]==null?o:o.domain([s[0],s[1]]).range([r.left,a-r.right])},pe=(t,e,a)=>{const{margin:r}=e,o=w.max(t,n=>n.value)??0,s=w.min(t,n=>n.value)??0;return w.scaleLinear().domain([s,o]).range([a-r.bottom,r.top])},ve=(t,e)=>{const a=w.select(t);if(a.empty())return console.error(`Element with selector ${t} not found!`),null;if(!e.chartId||!/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(e.chartId))return console.error(`chartId is required and must be a valid id
7
- (only letters, numbers or underscores. The first character must be a letter)`),null;const r=a.append("div"),o=r.append("svg"),s=a.node();let n=s.getBoundingClientRect(),c=n.width,d=n.height,i=D({...oe},e.config),l=e.data;const g=()=>{n=s.getBoundingClientRect(),c=n.width,d=n.height,h({data:l,config:i})};window.addEventListener("resize",g);const h=(u,m=!1)=>{m&&u.config&&(i=D(i,u.config)),m&&u.data&&(l=u.data);const $=l.map(x=>({date:new Date(x.date),value:x.value})).sort((x,G)=>x.date.getTime()-G.date.getTime()),v=fe($,i,c),p=pe($,i,d);r.attr("class",`sc-charts sc-charts__${i.theme}`),o.attr("preserveAspectRatio","xMinYMin meet").attr("viewBox",`0 0 ${c} ${d}`).style("width","100%").style("height","100%").selectAll("*").remove();const f={chartId:e.chartId,svg:o,wrapperNode:r.node(),data:$,x:v,y:p,config:i,action:"none",width:c,height:d};P(f);const y={...f,elements:de(f)};me(y)};return h(e),{update:u=>h(u,!0),destroy:()=>{window.removeEventListener("resize",g),o.remove()}}};k.createLineChart=ve,Object.defineProperty(k,Symbol.toStringTag,{value:"Module"})});
6
+ `;function Q(e){const t=document.createElement("div");t.className=C,e.append(t);const a=document.createElement("div");a.className=`${C}-container`,t.style.position="absolute",t.style.top="0",t.style.pointerEvents="none",t.style.display="none",t.append(a);const r=document.createElement("div");r.className=`${C}-sum`,a.append(r);const o=document.createElement("div");o.className=`${C}-sum-icon`,o.innerHTML=K,r.append(o);const s=document.createElement("div");r.append(s);const n=document.createElement("div");return n.className=`${C}-time`,a.append(n),{wrapper:t,sumNode:s,timeNode:n}}const ee=e=>{const{wrapper:t,sumNode:a,timeNode:r}=Q(e.wrapperNode);return{className(o,s){o==="remove"?t.classList.remove(`${C}${s}`):t.classList.add(`${C}${s}`)},update({leftPoint:o,rightPoint:s,x:n,y:c,hidden:d,closest:i}){if(o&&s&&i&&n!==void 0){const l=s.value-o.value,{sumFormatter:g,timeFormatter:h}=e.config.selection,u=(e.x(s.date)+e.x(o.date))/2,m=e.x(i.date)<u?"left":"right";let $="",v="";if(g)$=g({left:o.value,right:s.value,direction:m});else{const p=(l/Math.abs(o.value)*100).toFixed(2);$=`${J(l)} (${p}%)`}h?v=h({left:o.date,right:s.date,direction:m}):v=`${B(o.date)} to ${B(s.date)}`,a.textContent=$,r.textContent=v,requestAnimationFrame(()=>{const p=t.getBoundingClientRect(),f=e.wrapperNode.getBoundingClientRect(),y=e.x(o.date),x=e.x(s.date);let T=(y+x)/2-p.width/2;const H=0,Z=f.width-p.width;T<H&&(T=H),T>Z&&(T=Z),t.style.left=`${T}px`,t.style.top=`${c}px`})}d!==void 0&&(t.style.display=d?"none":"block")},destroy(){t.remove()}}},N="sc-charts__hover-tooltip",S=16,te=w.timeFormat("%a, %b %d, %-I:%M %p"),ae=e=>{const t=w.format(",.2f");return`${e<0?"-":""}$${t(Math.abs(e))}`};function re(e){const t=document.createElement("div");t.className=`${N}-container`,t.style.position="absolute",t.style.top="0",t.style.pointerEvents="none",t.style.display="none",e.appendChild(t);const a=document.createElement("div");a.className=`${N}-sum`,t.appendChild(a);const r=document.createElement("div");return r.className=`${N}-time`,t.appendChild(r),{wrapper:t,sumNode:a,timeNode:r}}function se(e,t,a){return e?t+S+e.width<a?t+S:t-S-e.width:null}const ne=e=>{const{wrapper:t,sumNode:a,timeNode:r}=re(e.wrapperNode);return{className(o,s){o==="remove"?t.classList.remove(`${N}${s}`):t.classList.add(`${N}${s}`)},update({hidden:o,dataItem:s}){if(s){const{sumFormatter:n,timeFormatter:c}=e.config.hover;a.textContent=n?n(s.value):ae(s.value),r.textContent=c?c(s.date):te(s.date),requestAnimationFrame(()=>{const d=t.getBoundingClientRect(),i=se(d,e.x(s.date),e.width-e.config.margin.right);i&&(t.style.left=i+"px")})}o!==void 0&&(t.style.display=o?"none":"block")},destroy(){t.remove()}}},oe={margin:{top:10,right:30,bottom:20,left:10},theme:"light",logo:{width:406,height:113,x:null,y:null,picDarkTheme:null,picLightTheme:null},hasMainLineArea:!1,hover:{enable:!0,range:"1m",transitionDuration:150,transitionName:"default",sumFormatter:null,timeFormatter:null},selection:{enable:!0,sumFormatter:null,timeFormatter:null},xAxis:{customTicks:!1,tickFormat:null,ticks:null,tickValues:null,isShow:!1},yAxis:{customTicks:!1,tickFormat:null,ticks:null,tickValues:null,isShow:!0},grid:{horizontalStyle:"zero-line-dashed",verticalStyle:"none"},enableBelowZeroLine:!1,curveTension:1},A=e=>w.curveCardinal.tension(e.config.curveTension),ie=e=>{const{svg:t,data:a,x:r,y:o,config:s}=e,n=t.node(),c=b(n);_(c,"main-line-area-gradient",{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"var(--sc-color-main-line)"},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]});const i=w.area().x(h=>r(h.date)).y0(o.range()[0]).y1(h=>o(h.value)).curve(A(e)),l="sc-charts__main-line-area",g=t.append("path").datum(a).attr("d",i).attr("class",l).classed(`${l}_hidden`,!s.hasMainLineArea);return{className(h,u){h==="remove"?g.classed(`${l}${u}`,!1):g.classed(`${l}${u}`,!0)},update({data:h,hidden:u}){if(h!==void 0&&g.datum(h).attr("d",i),u!==void 0){if(!s.hasMainLineArea)return null;g.classed(`${l}_hidden`,u)}},destroy(){g.remove()}}},le=(e,t={})=>{const a="sc-charts__range-line-area",{svg:r,x:o,y:s,config:n,data:c,chartId:d}=e,{clip:i}=t,l=r.node(),g=b(l),h="range-line-area-gradient";_(g,h+"_up",{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"var(--sc-color-selection-up)"},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]}),_(g,h+"_down",{x1:"0%",y1:"0%",x2:"0%",y2:"100%",stops:[{offset:"0%",stopColor:"var(--sc-color-selection-down)"},{offset:"100%",stopColor:"rgba(255, 255, 255, 0)"}]});const u=w.area().x(f=>o(f.date)).y0(s.range()[0]).y1(f=>s(f.value)).curve(A(e)),m=`${d}-clip-${a}`,v=g.append("clipPath").attr("id",m).append("rect").attr("x",(i==null?void 0:i.x)||0).attr("y",(i==null?void 0:i.y)||0).attr("width",(i==null?void 0:i.width)||"100%").attr("height",(i==null?void 0:i.height)||"100%"),p=r.append("path").datum(c).attr("d",u).attr("class",a).classed(`${a}_hidden`,!n.hasMainLineArea).attr("clip-path",`url(#${m})`);return{className(f,y){f==="remove"?p.classed(`${a}${y}`,!1):p.classed(`${a}${y}`,!0)},update({data:f,hidden:y,clip:x}){f!==void 0&&p.datum(f).attr("d",u),y!==void 0&&p.classed(`${a}_hidden`,y),x!==void 0&&v.attr("x",x.x).attr("y",x.y).attr("width",x.width).attr("height",x.height)},destroy(){p.remove()}}},E=(e,t)=>{const{svg:a,data:r,x:o,y:s,chartId:n}=e,{baseClassName:c,id:d,clip:i}=t,l=a.node(),g=b(l),h=w.line().x(p=>o(p.date)).y(p=>s(p.value)).curve(A(e)),u=`${n}-clip-${c}`,$=g.append("clipPath").attr("id",u).append("rect").attr("x",(i==null?void 0:i.x)||0).attr("y",(i==null?void 0:i.y)||0).attr("width",(i==null?void 0:i.width)||"100%").attr("height",(i==null?void 0:i.height)||"100%"),v=a.append("path").classed(c,!0).datum(r).attr("d",h).attr("id",d).attr("clip-path",`url(#${u})`);return{className(p,f){p==="remove"?v.classed(`${c}${f}`,!1):v.classed(`${c}${f}`,!0)},update({data:p,clip:f,hidden:y}){p!==void 0&&v.datum(p).attr("d",h),y!==void 0&&v.classed(`${c}_hidden`,y),f!==void 0&&$.attr("x",f.x).attr("y",f.y).attr("width",f.width).attr("height",f.height)},destroy(){v.remove()}}},ce=(e,t)=>{const{svg:a,data:r,x:o,y:s,chartId:n,config:c}=e,{baseClassName:d,id:i,clip:l}=t,g=a.node(),h=b(g),u=w.line().x(f=>o(f.date)).y(f=>s(f.value)).curve(A(e)),m=`${n}-clip-${d}`,v=h.append("clipPath").attr("id",m).append("rect").attr("x",(l==null?void 0:l.x)||0).attr("y",(l==null?void 0:l.y)||0).attr("width",(l==null?void 0:l.width)||"100%").attr("height",(l==null?void 0:l.height)||"100%"),p=a.append("path").classed(d,!0).datum(r).attr("d",u).attr("id",i).attr("clip-path",`url(#${m})`);return{className(f,y){f==="remove"?p.classed(`${d}${y}`,!1):p.classed(`${d}${y}`,!0)},update({data:f,clip:y,hidden:x}){f!==void 0&&p.datum(f).attr("d",u),x!==void 0&&p.classed(`${d}_hidden`,x),y!==void 0&&(c.hover.transitionName==="default"?v.transition().duration(c.hover.transitionDuration).attr("x",y.x).attr("y",y.y).attr("width",y.width).attr("height",y.height).ease(w.easeLinear):v.attr("x",y.x).attr("y",y.y).attr("width",y.width).attr("height",y.height))},destroy(){p.remove()}}},de=e=>{const t=E(e,{baseClassName:"sc-charts__main-line",id:`${e.chartId}-sc-charts__main-line`}),a=ie(e),r=U(e.svg),o=ce(e,{baseClassName:"sc-charts__highlight-line",id:`${e.chartId}-sc-charts__highlight-line`,clip:{x:0,y:0,width:"0",height:"0"}});let s=null;e.config.enableBelowZeroLine&&(s=E(e,{baseClassName:"sc-charts__below-zero-line",id:`${e.chartId}-sc-charts__below-zero-line`,clip:F(e)}));const n=M(e.svg,{className:"sc-charts__hover-circle",hidden:!0}),c=D(e.svg),d=D(e.svg),i=E(e,{baseClassName:"sc-charts__range-line",id:`${e.chartId}-sc-charts__range-line`,clip:{x:0,y:0,width:"0",height:"0"}}),l=M(e.svg,{className:"sc-charts__range-circle-left",hidden:!0}),g=M(e.svg,{className:"sc-charts__range-circle-right",hidden:!0}),h=ee(e),u=ne(e),m=le(e);return{hoverLine:r,hoverCircle:n,rangeBorderLeft:c,rangeBorderRight:d,rangeLine:i,rangeLineArea:m,rangeCircleLeft:l,rangeCircleRight:g,mainLine:t,rangeTooltip:h,highlightLine:o,hoverTooltip:u,mainLineArea:a,belowZeroLine:s}},he=(e,t,a)=>{const r=e.match(/^(\d+)([dMhmw])$/);if(!r)return console.warn("Invalid hoverRange:",e),{x:0,y:0,width:"100%",height:"100%"};const[,o,s]=r,n=parseInt(o,10),[c,d]=a.domain();let i=new Date(c);for(;i<d;){let l=new Date(i);switch(s){case"M":l.setMinutes(l.getMinutes()+n);break;case"h":l.setHours(l.getHours()+n);break;case"d":l.setDate(l.getDate()+n);break;case"w":l.setDate(l.getDate()+n*7);break;case"m":l=new Date(i.getFullYear(),i.getMonth()+n,1);break;default:return{x:0,y:0,width:"100%",height:"100%"}}if(t>=i&&t<l){const g=a(i),h=a(l);return{x:g,y:0,width:h-g,height:"100%"}}i=new Date(l)}if(t.getTime()===d.getTime()){let l=new Date(d);switch(s){case"M":l.setMinutes(l.getMinutes()-n);break;case"h":l.setHours(l.getHours()-n);break;case"d":l.setDate(l.getDate()-n);break;case"w":l.setDate(l.getDate()-n*7);break;case"m":l=new Date(d.getFullYear(),d.getMonth()-n,1);break}const g=a(l),h=a(d);return{x:g,y:0,width:h-g,height:"100%"}}return{x:0,y:0,width:"100%",height:"100%"}},I=(e,t)=>{var d;const{x:a,y:r,elements:o,config:{margin:s},height:n}=e;o.hoverLine.update({x1:a(t.date),x2:a(t.date),y1:s.top,y2:n-s.bottom,hidden:!1}),o.hoverCircle.update({cx:a(t.date),cy:r(t.value),hidden:!1}),o.hoverTooltip.update({dataItem:t,hidden:!1});const c=he(e.config.hover.range,t.date,a);o.highlightLine.update({clip:c,hidden:!1}),(d=o.belowZeroLine)==null||d.update({clip:{...c,y:r(0),height:r.range()[0]-r(0)+s.bottom}}),o.mainLine.className("add","_muted")},z=e=>{var a;const{elements:t}=e;t.hoverLine.update({hidden:!0}),t.hoverCircle.update({hidden:!0}),t.highlightLine.update({hidden:!0}),t.mainLine.className("remove","_muted"),t.hoverTooltip.update({hidden:!0}),e.action!=="selection"&&((a=t.belowZeroLine)==null||a.update({clip:F(e)}))},ue=(e,t)=>{["rangeBorderLeft","rangeBorderRight","rangeCircleLeft","rangeCircleRight","rangeLine","rangeLineArea","rangeTooltip"].forEach(r=>{t?(e[r].className("remove","_down"),e[r].className("add","_up")):(e[r].className("remove","_up"),e[r].className("add","_down"))})},ge=(e,t,a)=>{var m;const{x:r,y:o,config:{margin:s},height:n,elements:c}=e,d=r(t.date)<r(a.date)?t:a,i=r(t.date)>=r(a.date)?t:a,l=i.value-d.value>=0,g=r(d.date),h=r(i.date),u=h-g;c.rangeBorderLeft.update({x1:g,x2:g,y1:s.top,y2:n-s.bottom,hidden:!1}),c.rangeBorderRight.update({x1:h,x2:h,y1:s.top,y2:n-s.bottom,hidden:!1}),c.rangeCircleLeft.update({cx:g,cy:o(d.value),hidden:!1}),c.rangeCircleRight.update({cx:h,cy:o(i.value),hidden:!1}),c.rangeLine.update({clip:{x:g,y:0,width:u,height:o.range()[0]},hidden:!1}),c.rangeLineArea.update({clip:{x:g,y:0,width:u,height:o.range()[0]},hidden:!1}),c.rangeTooltip.update({rightPoint:i,leftPoint:d,closest:a,x:g+u/2,y:0,hidden:!1}),(m=c.belowZeroLine)==null||m.update({hidden:!0}),c.mainLineArea.update({hidden:!0}),ue(c,l),c.mainLine.className("add","_selected-muted")},X=e=>{var a;const{elements:t}=e;t.rangeLine.update({hidden:!0}),t.rangeLineArea.update({hidden:!0}),t.rangeBorderLeft.update({hidden:!0}),t.rangeBorderRight.update({hidden:!0}),t.rangeCircleLeft.update({hidden:!0}),t.rangeCircleRight.update({hidden:!0}),t.rangeTooltip.update({hidden:!0}),t.mainLine.className("remove","_selected-muted"),t.mainLineArea.update({hidden:!1}),(a=t.belowZeroLine)==null||a.update({hidden:!1})},me=e=>{const{svg:t,data:a,x:r,config:o,width:s,height:n}=e,{margin:c,hover:d,selection:i}=o;let l=null,g=!1;const h=m=>a.reduce(($,v)=>Math.abs(r($.date)-m)<Math.abs(r(v.date)-m)?$:v);t.append("rect").attr("width",s-c.left-c.right).attr("height",n-c.top-c.bottom).attr("x",c.left).attr("y",c.top).attr("fill","transparent").on("mousemove",function(m){const[$]=w.pointer(m,this),v=h($);!g&&d.enable?(e.action="hover",I(e,v)):(e.action=g?"selection":"none",z(e)),l&&i.enable&&(e.action="selection",ge(e,l,v))}).on("mouseleave",()=>{e.action="none",g=!1,l=null,z(e),X(e)}).on("mousedown",function(m){if(i.enable){g=!0,e.action="selection";const[$]=w.pointer(m,this);l=h($)}}).on("mouseup",function(m){const[$]=w.pointer(m,this),v=h($);g=!1,l=null,e.action="hover",i.enable&&X(e),d.enable&&I(e,v)})},fe=(e,t,a)=>{const{margin:r}=t,o=w.scaleTime(),s=w.extent(e,n=>new Date(n.date));return s[0]==null||s[1]==null?o:o.domain([s[0],s[1]]).range([r.left,a-r.right])},pe=(e,t,a)=>{const{margin:r}=t,o=w.max(e,n=>n.value)??0,s=w.min(e,n=>n.value)??0;return w.scaleLinear().domain([s,o]).range([a-r.bottom,r.top])},ve=(e,t)=>{const a=w.select(e);if(a.empty())return console.error(`Element with selector ${e} not found!`),null;if(!t.chartId||!/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(t.chartId))return console.error(`chartId is required and must be a valid id
7
+ (only letters, numbers or underscores. The first character must be a letter)`),null;const r=a.append("div"),o=r.append("svg"),s=a.node();let n=s.getBoundingClientRect(),c=n.width,d=n.height,i=R({...oe},t.config),l=t.data;const g=()=>{n=s.getBoundingClientRect(),c=n.width,d=n.height,h({data:l,config:i})};window.addEventListener("resize",g);const h=(u,m=!1)=>{m&&u.config&&(i=R(i,u.config)),m&&u.data&&(l=u.data);const $=l.map(x=>({date:new Date(x.date),value:x.value})).sort((x,G)=>x.date.getTime()-G.date.getTime()),v=fe($,i,c),p=pe($,i,d);r.attr("class",`sc-charts sc-charts__${i.theme}`),o.attr("preserveAspectRatio","xMinYMin meet").attr("viewBox",`0 0 ${c} ${d}`).style("width","100%").style("height","100%").selectAll("*").remove();const f={chartId:t.chartId,svg:o,wrapperNode:r.node(),data:$,x:v,y:p,config:i,action:"none",width:c,height:d};P(f);const y={...f,elements:de(f)};me(y)};return h(t),{update:u=>h(u,!0),destroy:()=>{window.removeEventListener("resize",g),o.remove()}}};k.createLineChart=ve,Object.defineProperty(k,Symbol.toStringTag,{value:"Module"})});
8
8
  //# sourceMappingURL=charts-core.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"charts-core.umd.cjs","sources":["../src/components/line-chart/axes/y-axis.ts","../src/components/line-chart/axes/x-axis.ts","../src/components/line-chart/axes/grid.ts","../src/components/line-chart/axes/index.ts","../src/components/line-chart/utils/index.ts","../src/components/line-chart/elements/range-border.ts","../src/components/line-chart/elements/circle-point.ts","../src/components/line-chart/elements/hover-line.ts","../src/components/line-chart/elements/range-tooltip.ts","../src/components/line-chart/elements/hover-tooltip.ts","../src/components/line-chart/constants.ts","../src/components/line-chart/elements/main-line-area.ts","../src/components/line-chart/elements/range-line-area.ts","../src/components/line-chart/elements/data-line.ts","../src/components/line-chart/elements/highlight-line.ts","../src/components/line-chart/elements/index.ts","../src/components/line-chart/interactions/hover/utils.ts","../src/components/line-chart/interactions/hover/index.ts","../src/components/line-chart/interactions/selection.ts","../src/components/line-chart/interactions/index.ts","../src/components/line-chart/scales/index.ts","../src/components/line-chart/index.ts"],"sourcesContent":["import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nexport const renderYAxis = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, y, width } = context\n const { margin, yAxis } = config\n const { customTicks, tickFormat, tickValues, ticks, isShow } = yAxis\n\n if (!isShow) return null\n\n svg\n .append('g')\n .attr('transform', `translate(${width - margin.right},0)`)\n .call((g) => {\n let axis = d3.axisRight(y)\n if (customTicks) {\n if (tickFormat) {\n axis = axis.tickFormat(tickFormat)\n }\n if (ticks) {\n axis = Array.isArray(ticks) ? axis.ticks(...ticks) : axis.ticks(ticks)\n }\n if (tickValues) {\n axis = axis.tickValues(tickValues)\n }\n } else {\n axis = axis.tickFormat((d) => {\n const num = Number(d)\n const sign = num < 0 ? '-' : ''\n const formatted = d3.format('.0s')(Math.abs(num))\n return `${sign}${formatted}`\n })\n }\n g.call(axis)\n })\n .call((g) => {\n let ticks: ParsedDataPoint['value'][] = []\n g.selectAll('.tick').each((d) => ticks.push(d as ParsedDataPoint['value']))\n context.yTicks = ticks\n })\n .call((g) => g.select('.domain').remove())\n .call((g) => g.selectAll('.tick line').remove())\n .call((g) => g.selectAll('.tick text').classed('sc-charts__y-axis-tick', true))\n .attr('font-family', 'inherit')\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nexport const renderXAxis = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, x, height } = context\n const { margin, xAxis } = config\n const { isShow, tickValues, tickFormat, customTicks, ticks } = xAxis\n\n if (!isShow) return null\n\n svg\n .append('g')\n .attr('transform', `translate(0,${height - margin.bottom})`)\n .call((g) => {\n let axis = d3.axisBottom(x)\n if (customTicks) {\n if (tickFormat) {\n axis = axis.tickFormat(tickFormat)\n }\n if (ticks) {\n axis = Array.isArray(ticks) ? axis.ticks(...ticks) : axis.ticks(ticks)\n }\n if (tickValues) {\n axis = axis.tickValues(tickValues)\n }\n } else {\n axis.ticks(5)\n }\n g.call(axis)\n })\n .call((g) => g.select('.domain').remove())\n .call((g) => {\n let ticks: ParsedDataPoint['date'][] = []\n g.selectAll('.tick').each((d) => ticks.push(d as ParsedDataPoint['date']))\n context.xTicks = ticks\n })\n .call((g) => g.selectAll('.tick line').remove())\n .call((g) => g.selectAll('.tick text').classed('sc-charts__x-axis-tick', true))\n .attr('font-family', 'inherit')\n}\n","import { ChartContext } from '../types'\n\nconst renderHorizontalStyles = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, y, width } = context\n const {\n margin,\n grid: { horizontalStyle },\n } = config\n\n if (horizontalStyle === 'none') return\n\n if (horizontalStyle.startsWith('zero-line')) {\n const line = svg\n .append('line')\n .attr('x1', 0 + margin.left)\n .attr('x2', width - margin.right)\n .attr('y1', y(0))\n .attr('y2', y(0))\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (horizontalStyle === 'zero-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n }\n\n if (horizontalStyle.startsWith('every-line')) {\n const ticks = context.yTicks || y.ticks()\n\n ticks.forEach((tick) => {\n const line = svg\n .append('line')\n .attr('x1', 0 + margin.left)\n .attr('x2', width - margin.right)\n .attr('y1', y(tick))\n .attr('y2', y(tick))\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (horizontalStyle === 'every-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n })\n }\n}\n\nconst renderVerticalStyles = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, x, height } = context\n const {\n margin,\n grid: { verticalStyle },\n } = config\n\n if (verticalStyle === 'none') return\n\n if (verticalStyle.startsWith('every-line')) {\n const ticks = context.xTicks || x.ticks()\n\n ticks.forEach((tick) => {\n const line = svg\n .append('line')\n .attr('x1', x(tick))\n .attr('x2', x(tick))\n .attr('y1', margin.top)\n .attr('y2', height - margin.bottom)\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (verticalStyle === 'every-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n })\n }\n}\n\nexport const renderGrid = (context: Omit<ChartContext, 'elements'>) => {\n renderHorizontalStyles(context)\n renderVerticalStyles(context)\n}\n","import { ChartContext } from '../types'\nimport { renderYAxis } from './y-axis'\nimport { renderXAxis } from './x-axis'\nimport { renderGrid } from './grid.ts'\n\nexport const createAxes = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, width, height } = context\n const { margin, logo } = config\n\n // x axis\n renderXAxis(context)\n\n // y axis\n renderYAxis(context)\n\n if (logo) {\n svg\n .append('image')\n .attr('xlink:href', config.theme === 'dark' ? logo.picDarkTheme : logo.picLightTheme)\n .attr('width', logo.width)\n .attr('height', logo.height)\n .attr('x', logo.x ?? (width - margin.left - margin.right) / 2 - logo.width / 2 + margin.left)\n .attr('y', logo.y ?? (height - margin.top - margin.bottom) / 2 - logo.height / 2 + margin.top)\n }\n\n // grid\n renderGrid(context)\n}\n","import * as d3 from 'd3'\nimport { ChartConfig, ChartConfigContext, ChartContext } from '../types'\n\nexport const createGradient = (\n defs:\n | d3.Selection<d3.BaseType, unknown, null, undefined>\n | d3.Selection<SVGDefsElement, unknown, null, undefined>,\n gradientId: string,\n options: {\n x1: string\n x2: string\n y1: string\n y2: string\n stops: { offset: string; stopColor: string }[]\n }\n): d3.Selection<SVGLinearGradientElement, unknown, null, undefined> => {\n let gradient: d3.Selection<SVGLinearGradientElement, unknown, null, undefined> =\n defs.select<SVGLinearGradientElement>(`#${gradientId}`)\n\n if (gradient.empty()) {\n gradient = defs\n .append<SVGLinearGradientElement>('linearGradient')\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('id', gradientId)\n }\n\n gradient\n .attr('x1', options.x1)\n .attr('y1', options.x2)\n .attr('x2', options.y1)\n .attr('y2', options.y2)\n\n options.stops.forEach(({ offset, stopColor }) => {\n gradient.append('stop').attr('offset', offset).attr('stop-color', stopColor)\n })\n\n return gradient\n}\n\nexport const getDefs = (svg: SVGSVGElement) => {\n const defsSelection = d3.select(svg).select('defs')\n const defs = defsSelection.empty() ? d3.select(svg).append('defs') : defsSelection\n\n return defs\n}\n\nexport const getBelowZeroClip = (ctx: Omit<ChartContext, 'elements'>) => {\n const {\n y,\n config: { margin },\n } = ctx\n const clipHeight = y.range()[0] - y(0)\n\n return { x: 0, y: y.range()[0] - clipHeight, width: '100%', height: clipHeight + margin.bottom }\n}\n\nexport const mergeConfig = (base: ChartConfigContext, patch?: ChartConfig): ChartConfigContext => ({\n ...base,\n ...patch,\n margin: {\n ...base.margin,\n ...patch?.margin,\n },\n logo:\n base.logo && patch?.logo\n ? {\n width: patch.logo.width ?? base.logo.width,\n height: patch.logo.height ?? base.logo.height,\n picLightTheme: patch.logo.picLightTheme ?? base.logo.picLightTheme,\n picDarkTheme: patch.logo.picDarkTheme ?? base.logo.picDarkTheme,\n x: patch.logo.x ?? base.logo.x,\n y: patch.logo.y ?? base.logo.y,\n }\n : base.logo,\n\n xAxis: {\n ...base.xAxis,\n ...patch?.xAxis,\n },\n yAxis: {\n ...base.yAxis,\n ...patch?.yAxis,\n },\n grid: {\n ...base.grid,\n ...patch?.grid,\n },\n hover: {\n ...base.hover,\n ...patch?.hover,\n },\n selection: {\n ...base.selection,\n ...patch?.selection,\n },\n})\n","import { Parent, ElementOptions, ChartElements } from './types'\nimport { createGradient, getDefs } from '../utils'\n\nexport const renderBorderRangeLine = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['rangeBorderLeft'] => {\n const svg = parent.node() as SVGSVGElement\n const defs = getDefs(svg)\n\n const createBorderGradient = (gradientId: string, mainColor: string) => {\n return createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'rgba(255, 255, 255, 0)' },\n { offset: '20%', stopColor: mainColor },\n { offset: '60%', stopColor: mainColor },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n }\n\n createBorderGradient('gradient-range-borders-up', 'var(--sc-color-selection-up)')\n createBorderGradient('gradient-range-borders-down', 'var(--sc-color-selection-down)')\n\n const baseClassName = 'sc-charts__border-range-line'\n\n const item = parent\n .append('line')\n .classed(baseClassName, true)\n .style('display', options.hidden ? 'none' : 'block')\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ x1, x2, y1, y2, hidden }) {\n if (x1 !== undefined) item.attr('x1', x1)\n if (x2 !== undefined) item.attr('x2', x2)\n if (y1 !== undefined) item.attr('y1', y1)\n if (y2 !== undefined) item.attr('y2', y2)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n\n destroy() {\n item.remove()\n },\n }\n}\n","import { Parent, ElementOptions, ChartElements } from './types'\n\nexport const renderCirclePoint = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['hoverCircle'] => {\n const item = parent\n .append('circle')\n .attr('r', options.radius || 4)\n .style('display', options.hidden ? 'none' : 'block')\n\n const baseClassName = options.className || ''\n if (baseClassName) item.classed(baseClassName, true)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ cx, cy, hidden, fill }) {\n if (cx !== undefined) item.attr('cx', cx)\n if (cy !== undefined) item.attr('cy', cy)\n if (fill !== undefined) item.attr('fill', fill)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n\n destroy() {\n item.remove()\n },\n }\n}\n","import { createGradient, getDefs } from '../utils'\nimport { Parent, ElementOptions, ChartElements } from './types'\n\nexport const renderHoverLine = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['hoverLine'] => {\n const baseClassName = 'sc-charts__hover-line'\n const item = parent\n .append('line')\n .style('display', options.hidden ? 'none' : 'block')\n .classed(baseClassName, true)\n const svg = parent.node() as SVGSVGElement\n const defs = getDefs(svg)\n\n const createBorderGradient = (gradientId: string, mainColor: string) => {\n return createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'rgba(255, 255, 255, 0)' },\n { offset: '15%', stopColor: mainColor },\n { offset: '75%', stopColor: mainColor },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n }\n\n createBorderGradient('hover-line-gradient', 'var(--sc-color-hover-line)')\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ x1, x2, y1, y2, hidden }) {\n if (x1 !== undefined) item.attr('x1', x1)\n if (x2 !== undefined) item.attr('x2', x2)\n if (y1 !== undefined) item.attr('y1', y1)\n if (y2 !== undefined) item.attr('y2', y2)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartElements } from './types'\nimport { ChartContext } from '../types'\n\nconst BASE_CLASSNAME = 'sc-charts__range-tooltip'\n\nconst timeFormat = d3.timeFormat('%b %e, %I:%M %p')\nconst sumFormat = (sum: number) => {\n const fmt = d3.format(',.2f')\n return `${sum < 0 ? '-' : ''}$${fmt(Math.abs(sum))}`\n}\n\nconst icon = `\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 0.5C5.71442 0.5 4.45772 0.881218 3.3888 1.59545C2.31988 2.30968 1.48676 3.32484 0.994786 4.51256C0.502816 5.70028 0.374095 7.00721 0.624899 8.26809C0.875703 9.52896 1.49477 10.6872 2.40381 11.5962C3.31285 12.5052 4.47104 13.1243 5.73192 13.3751C6.99279 13.6259 8.29973 13.4972 9.48744 13.0052C10.6752 12.5132 11.6903 11.6801 12.4046 10.6112C13.1188 9.54229 13.5 8.28558 13.5 7C13.4982 5.27665 12.8128 3.62441 11.5942 2.40582C10.3756 1.18722 8.72335 0.50182 7 0.5ZM9.35375 6.85375C9.30732 6.90024 9.25217 6.93712 9.19147 6.96228C9.13077 6.98744 9.06571 7.00039 9 7.00039C8.93429 7.00039 8.86923 6.98744 8.80853 6.96228C8.74783 6.93712 8.69269 6.90024 8.64625 6.85375L7.5 5.70687V9.5C7.5 9.63261 7.44732 9.75979 7.35356 9.85355C7.25979 9.94732 7.13261 10 7 10C6.86739 10 6.74022 9.94732 6.64645 9.85355C6.55268 9.75979 6.5 9.63261 6.5 9.5V5.70687L5.35375 6.85375C5.25993 6.94757 5.13268 7.00028 5 7.00028C4.86732 7.00028 4.74007 6.94757 4.64625 6.85375C4.55243 6.75993 4.49972 6.63268 4.49972 6.5C4.49972 6.36732 4.55243 6.24007 4.64625 6.14625L6.64625 4.14625C6.69269 4.09976 6.74783 4.06288 6.80853 4.03772C6.86923 4.01256 6.9343 3.99961 7 3.99961C7.06571 3.99961 7.13077 4.01256 7.19147 4.03772C7.25217 4.06288 7.30732 4.09976 7.35375 4.14625L9.35375 6.14625C9.40024 6.19269 9.43712 6.24783 9.46228 6.30853C9.48744 6.36923 9.5004 6.43429 9.5004 6.5C9.5004 6.56571 9.48744 6.63077 9.46228 6.69147C9.43712 6.75217 9.40024 6.80731 9.35375 6.85375Z\" \n fill=\"currentColor\"/>\n </svg>\n`\n\nfunction createTooltipElements(container: HTMLDivElement) {\n const tooltip = document.createElement('div')\n tooltip.className = BASE_CLASSNAME\n container.append(tooltip)\n\n const wrapper = document.createElement('div')\n wrapper.className = `${BASE_CLASSNAME}-container`\n tooltip.style.position = 'absolute'\n tooltip.style.top = '0'\n tooltip.style.pointerEvents = 'none'\n tooltip.style.display = 'none'\n tooltip.append(wrapper)\n\n const sumWrapper = document.createElement('div')\n sumWrapper.className = `${BASE_CLASSNAME}-sum`\n wrapper.append(sumWrapper)\n\n const iconNode = document.createElement('div')\n iconNode.className = `${BASE_CLASSNAME}-sum-icon`\n iconNode.innerHTML = icon\n sumWrapper.append(iconNode)\n\n const sumNode = document.createElement('div')\n sumWrapper.append(sumNode)\n\n const timeNode = document.createElement('div')\n timeNode.className = `${BASE_CLASSNAME}-time`\n wrapper.append(timeNode)\n\n return { wrapper: tooltip, sumNode, timeNode }\n}\n\nexport const renderRangeTooltip = (\n context: Omit<ChartContext, 'elements'>\n): ChartElements['rangeTooltip'] => {\n const { wrapper, sumNode, timeNode } = createTooltipElements(context.wrapperNode)\n\n return {\n className(action, mod) {\n if (action === 'remove') {\n wrapper.classList.remove(`${BASE_CLASSNAME}${mod}`)\n } else {\n wrapper.classList.add(`${BASE_CLASSNAME}${mod}`)\n }\n },\n update({ leftPoint, rightPoint, x, y, hidden, closest }) {\n if (leftPoint && rightPoint && closest && x !== undefined) {\n const delta = rightPoint.value - leftPoint.value\n const { sumFormatter, timeFormatter } = context.config.selection\n\n const selectionCenter = (context.x(rightPoint.date) + context.x(leftPoint.date)) / 2\n const direction = context.x(closest.date) < selectionCenter ? 'left' : 'right'\n\n let valueText = ''\n let dateText = ''\n\n if (!sumFormatter) {\n const percent = ((delta / Math.abs(leftPoint.value)) * 100).toFixed(2)\n valueText = `${sumFormat(delta)} (${percent}%)`\n } else {\n valueText = sumFormatter({ left: leftPoint.value, right: rightPoint.value, direction })\n }\n\n if (!timeFormatter) {\n dateText = `${timeFormat(leftPoint.date)} to ${timeFormat(rightPoint.date)}`\n } else {\n dateText = timeFormatter({ left: leftPoint.date, right: rightPoint.date, direction })\n }\n\n sumNode.textContent = valueText\n timeNode.textContent = dateText\n\n requestAnimationFrame(() => {\n const tooltipRect = wrapper.getBoundingClientRect()\n const containerRect = context.wrapperNode.getBoundingClientRect()\n\n const leftX = context.x(leftPoint.date)\n const rightX = context.x(rightPoint.date)\n const selectionCenterX = (leftX + rightX) / 2\n\n let tooltipX = selectionCenterX - tooltipRect.width / 2\n\n const minX = 0\n const maxX = containerRect.width - tooltipRect.width\n\n if (tooltipX < minX) tooltipX = minX\n if (tooltipX > maxX) tooltipX = maxX\n\n wrapper.style.left = `${tooltipX}px`\n wrapper.style.top = `${y}px`\n })\n }\n\n if (hidden !== undefined) {\n wrapper.style.display = hidden ? 'none' : 'block'\n }\n },\n destroy() {\n wrapper.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartElements } from './types'\nimport { ChartContext } from '../types'\n\nconst BASE_CLASSNAME = 'sc-charts__hover-tooltip'\nconst TOOLTIP_OFFSET_PX = 16\n\nconst timeFormat = d3.timeFormat('%a, %b %d, %-I:%M %p')\nconst sumFormat = (sum: number) => {\n const fmt = d3.format(',.2f')\n return `${sum < 0 ? '-' : ''}$${fmt(Math.abs(sum))}`\n}\n\nfunction createTooltipElements(container: HTMLDivElement) {\n const tooltip = document.createElement('div')\n tooltip.className = `${BASE_CLASSNAME}-container`\n tooltip.style.position = 'absolute'\n tooltip.style.top = '0'\n tooltip.style.pointerEvents = 'none'\n tooltip.style.display = 'none'\n container.appendChild(tooltip)\n\n const sumNode = document.createElement('div')\n sumNode.className = `${BASE_CLASSNAME}-sum`\n tooltip.appendChild(sumNode)\n\n const timeNode = document.createElement('div')\n timeNode.className = `${BASE_CLASSNAME}-time`\n tooltip.appendChild(timeNode)\n\n return { wrapper: tooltip, sumNode, timeNode }\n}\n\nfunction calcTooltipPosition(\n tooltipDimensions: DOMRect,\n initX: number,\n maxX: number\n): number | null {\n if (!tooltipDimensions) return null\n\n const fitsRight = initX + TOOLTIP_OFFSET_PX + tooltipDimensions.width < maxX\n\n const tooltipX = fitsRight\n ? initX + TOOLTIP_OFFSET_PX\n : initX - TOOLTIP_OFFSET_PX - tooltipDimensions.width\n\n return tooltipX\n}\n\nexport const renderHoverTooltip = (\n context: Omit<ChartContext, 'elements'>\n): ChartElements['hoverTooltip'] => {\n const { wrapper, sumNode, timeNode } = createTooltipElements(context.wrapperNode)\n\n return {\n className(action, mod) {\n if (action === 'remove') {\n wrapper.classList.remove(`${BASE_CLASSNAME}${mod}`)\n } else {\n wrapper.classList.add(`${BASE_CLASSNAME}${mod}`)\n }\n },\n\n update({ hidden, dataItem }) {\n if (dataItem) {\n sumNode.textContent = sumFormat(dataItem.value)\n timeNode.textContent = timeFormat(dataItem.date)\n\n requestAnimationFrame(() => {\n const tooltipDimensions = wrapper.getBoundingClientRect()\n const tooltipX = calcTooltipPosition(\n tooltipDimensions,\n context.x(dataItem.date),\n context.width - context.config.margin.right\n )\n if (tooltipX) wrapper.style.left = tooltipX + 'px'\n })\n }\n\n if (hidden !== undefined) {\n wrapper.style.display = hidden ? 'none' : 'block'\n }\n },\n\n destroy() {\n wrapper.remove()\n },\n }\n}\n","import { ChartConfigContext, ChartContext } from './types'\nimport * as d3 from 'd3'\n\nexport const defaultConfig: ChartConfigContext = {\n margin: { top: 10, right: 30, bottom: 20, left: 10 },\n theme: 'light',\n logo: {\n width: 406,\n height: 113,\n x: null,\n y: null,\n picDarkTheme: null,\n picLightTheme: null,\n },\n hasMainLineArea: false,\n hover: {\n enable: true,\n range: '1m',\n transitionDuration: 150,\n transitionName: 'default',\n },\n selection: {\n enable: true,\n sumFormatter: null,\n timeFormatter: null,\n },\n xAxis: {\n customTicks: false,\n tickFormat: null,\n ticks: null,\n tickValues: null,\n isShow: false,\n },\n yAxis: {\n customTicks: false,\n tickFormat: null,\n ticks: null,\n tickValues: null,\n isShow: true,\n },\n grid: {\n horizontalStyle: 'zero-line-dashed',\n verticalStyle: 'none',\n },\n enableBelowZeroLine: false,\n curveTension: 1,\n}\n\nexport const curveFunction = (ctx: Omit<ChartContext, 'elements'>) =>\n d3.curveCardinal.tension(ctx.config.curveTension)\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartElements } from './types'\nimport { createGradient, getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderMainLineArea = (\n ctx: Omit<ChartContext, 'elements'>\n): ChartElements['mainLineArea'] => {\n const { svg, data, x, y, config } = ctx\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const gradientId = 'main-line-area-gradient'\n\n createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-main-line)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n\n const areaGen = d3\n .area<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y0(y.range()[0])\n .y1((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const baseClassName = 'sc-charts__main-line-area'\n\n const item = svg\n .append('path')\n .datum(data)\n .attr('d', areaGen)\n .attr('class', baseClassName)\n .classed(`${baseClassName}_hidden`, !config.hasMainLineArea)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', areaGen)\n if (hidden !== undefined) {\n if (!config.hasMainLineArea) return null\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartElements, ClipProps } from './types'\nimport { createGradient, getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderRangeLineArea = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { clip?: ClipProps } = {}\n): ChartElements['rangeLineArea'] => {\n const baseClassName = 'sc-charts__range-line-area'\n const { svg, x, y, config, data, chartId } = ctx\n const { clip: initClip } = options\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const gradientId = 'range-line-area-gradient'\n\n createGradient(defs, gradientId + '_up', {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-selection-up)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n createGradient(defs, gradientId + '_down', {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-selection-down)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n\n const areaGen = d3\n .area<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y0(y.range()[0])\n .y1((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .datum(data)\n .attr('d', areaGen)\n .attr('class', baseClassName)\n .classed(`${baseClassName}_hidden`, !config.hasMainLineArea)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, hidden, clip }) {\n if (data !== undefined) item.datum(data).attr('d', areaGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartFabricElement, ClipProps, DataLineUpdateProps } from './types'\nimport { getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderDataLine = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { baseClassName: string; id: string; clip?: ClipProps }\n): ChartFabricElement<Partial<DataLineUpdateProps>> => {\n const { svg, data, x, y, chartId } = ctx\n const { baseClassName, id, clip: initClip } = options\n\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const lineGen = d3\n .line<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .classed(baseClassName, true)\n .datum(data)\n .attr('d', lineGen)\n .attr('id', id)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, clip, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', lineGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartFabricElement, ClipProps, DataLineUpdateProps } from './types'\nimport { getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderHighlightLine = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { baseClassName: string; id: string; clip?: ClipProps }\n): ChartFabricElement<Partial<DataLineUpdateProps>> => {\n const { svg, data, x, y, chartId, config } = ctx\n const { baseClassName, id, clip: initClip } = options\n\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const lineGen = d3\n .line<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .classed(baseClassName, true)\n .datum(data)\n .attr('d', lineGen)\n .attr('id', id)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, clip, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', lineGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n if (config.hover.transitionName === 'default') {\n clipRect\n .transition()\n .duration(config.hover.transitionDuration)\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n .ease(d3.easeLinear)\n } else {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import { ChartElements } from './types'\nimport { renderBorderRangeLine } from './range-border'\nimport { renderCirclePoint } from './circle-point'\nimport { renderHoverLine } from './hover-line'\nimport { ChartContext } from '../types'\nimport { renderRangeTooltip } from './range-tooltip'\nimport { renderHoverTooltip } from './hover-tooltip'\nimport { renderMainLineArea } from './main-line-area'\nimport { renderRangeLineArea } from './range-line-area'\nimport { renderDataLine } from './data-line'\nimport { getBelowZeroClip } from '../utils'\nimport { renderHighlightLine } from './highlight-line'\n\n// render each elements by order\nexport const createElements = (context: Omit<ChartContext, 'elements'>): ChartElements => {\n const mainLine = renderDataLine(context, {\n baseClassName: `sc-charts__main-line`,\n id: `${context.chartId}-sc-charts__main-line`,\n })\n const mainLineArea = renderMainLineArea(context)\n\n const hoverLine = renderHoverLine(context.svg)\n const highlightLine = renderHighlightLine(context, {\n baseClassName: `sc-charts__highlight-line`,\n id: `${context.chartId}-sc-charts__highlight-line`,\n clip: { x: 0, y: 0, width: '0', height: '0' },\n })\n\n let belowZeroLine = null\n\n if (context.config.enableBelowZeroLine) {\n belowZeroLine = renderDataLine(context, {\n baseClassName: `sc-charts__below-zero-line`,\n id: `${context.chartId}-sc-charts__below-zero-line`,\n clip: getBelowZeroClip(context),\n })\n }\n\n const hoverCircle = renderCirclePoint(context.svg, {\n className: 'sc-charts__hover-circle',\n hidden: true,\n })\n const rangeBorderLeft = renderBorderRangeLine(context.svg)\n const rangeBorderRight = renderBorderRangeLine(context.svg)\n const rangeLine = renderDataLine(context, {\n baseClassName: `sc-charts__range-line`,\n id: `${context.chartId}-sc-charts__range-line`,\n clip: { x: 0, y: 0, width: '0', height: '0' },\n })\n const rangeCircleLeft = renderCirclePoint(context.svg, {\n className: 'sc-charts__range-circle-left',\n hidden: true,\n })\n const rangeCircleRight = renderCirclePoint(context.svg, {\n className: 'sc-charts__range-circle-right',\n hidden: true,\n })\n const rangeTooltip = renderRangeTooltip(context)\n const hoverTooltip = renderHoverTooltip(context)\n const rangeLineArea = renderRangeLineArea(context)\n\n return {\n hoverLine,\n hoverCircle,\n rangeBorderLeft,\n rangeBorderRight,\n rangeLine,\n rangeLineArea,\n rangeCircleLeft,\n rangeCircleRight,\n mainLine,\n rangeTooltip,\n highlightLine,\n hoverTooltip,\n mainLineArea,\n belowZeroLine,\n }\n}\n","import { ScaleTime } from 'd3'\nimport { HoverRange } from '../../types'\n\nexport const getClipForRange = (\n hoverRange: HoverRange,\n closestDate: Date,\n x: ScaleTime<number, number, never>\n) => {\n const match = hoverRange.match(/^(\\d+)([dMhmw])$/)\n\n if (!match) {\n console.warn('Invalid hoverRange:', hoverRange)\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n }\n\n const [, amountStr, unit] = match\n const amount = parseInt(amountStr, 10)\n\n const [domainStart, domainEnd] = x.domain()\n\n let cursor = new Date(domainStart)\n\n while (cursor < domainEnd) {\n let next = new Date(cursor)\n\n switch (unit) {\n case 'M':\n next.setMinutes(next.getMinutes() + amount)\n break\n case 'h':\n next.setHours(next.getHours() + amount)\n break\n case 'd':\n next.setDate(next.getDate() + amount)\n break\n case 'w':\n next.setDate(next.getDate() + amount * 7)\n break\n case 'm':\n next = new Date(cursor.getFullYear(), cursor.getMonth() + amount, 1)\n break\n default:\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n }\n\n if (closestDate >= cursor && closestDate < next) {\n const xStart = x(cursor)\n const xEnd = x(next)\n return {\n x: xStart,\n y: 0,\n width: xEnd - xStart,\n height: '100%',\n }\n }\n\n cursor = new Date(next)\n }\n\n if (closestDate.getTime() === domainEnd.getTime()) {\n let prev = new Date(domainEnd)\n\n switch (unit) {\n case 'M':\n prev.setMinutes(prev.getMinutes() - amount)\n break\n case 'h':\n prev.setHours(prev.getHours() - amount)\n break\n case 'd':\n prev.setDate(prev.getDate() - amount)\n break\n case 'w':\n prev.setDate(prev.getDate() - amount * 7)\n break\n case 'm':\n prev = new Date(domainEnd.getFullYear(), domainEnd.getMonth() - amount, 1)\n break\n }\n\n const xStart = x(prev)\n const xEnd = x(domainEnd)\n return {\n x: xStart,\n y: 0,\n width: xEnd - xStart,\n height: '100%',\n }\n }\n\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n}\n","import { ChartContext, ParsedDataPoint } from '../../types'\nimport { getBelowZeroClip } from '../../utils'\nimport { getClipForRange } from './utils'\n\nexport const renderHoverItems = (ctx: ChartContext, closest: ParsedDataPoint) => {\n const {\n x,\n y,\n elements,\n config: { margin },\n height,\n } = ctx\n\n elements.hoverLine.update({\n x1: x(closest.date),\n x2: x(closest.date),\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.hoverCircle.update({\n cx: x(closest.date),\n cy: y(closest.value),\n hidden: false,\n })\n\n elements.hoverTooltip.update({\n dataItem: closest,\n hidden: false,\n })\n\n const baseClip = getClipForRange(ctx.config.hover.range, closest.date, x)\n\n elements.highlightLine.update({\n clip: baseClip,\n hidden: false,\n })\n\n elements.belowZeroLine?.update({\n clip: {\n ...baseClip,\n y: y(0),\n height: y.range()[0] - y(0) + margin.bottom,\n },\n })\n\n elements.mainLine.className('add', '_muted')\n}\n\nexport const hideHoverItems = (ctx: ChartContext) => {\n const { elements } = ctx\n elements.hoverLine.update({ hidden: true })\n elements.hoverCircle.update({ hidden: true })\n elements.highlightLine.update({ hidden: true })\n elements.mainLine.className('remove', '_muted')\n elements.hoverTooltip.update({ hidden: true })\n if (ctx.action !== 'selection') {\n elements.belowZeroLine?.update({\n clip: getBelowZeroClip(ctx),\n })\n }\n}\n","import { ChartElements } from '../elements/types'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nconst controlIsGrowingClasses = (elements: ChartElements, isGrowing: boolean) => {\n const names: (keyof Required<\n Pick<\n ChartElements,\n | 'rangeBorderLeft'\n | 'rangeBorderRight'\n | 'rangeCircleLeft'\n | 'rangeCircleRight'\n | 'rangeLine'\n | 'rangeLineArea'\n | 'rangeTooltip'\n >\n >)[] = [\n 'rangeBorderLeft',\n 'rangeBorderRight',\n 'rangeCircleLeft',\n 'rangeCircleRight',\n 'rangeLine',\n 'rangeLineArea',\n 'rangeTooltip',\n ]\n\n names.forEach((name) => {\n if (isGrowing) {\n elements[name].className('remove', '_down')\n elements[name].className('add', '_up')\n } else {\n elements[name].className('remove', '_up')\n elements[name].className('add', '_down')\n }\n })\n}\n\nexport const renderSelectionItems = (\n ctx: ChartContext,\n startPoint: ParsedDataPoint,\n closest: ParsedDataPoint\n) => {\n const {\n x,\n y,\n config: { margin },\n height,\n elements,\n } = ctx\n\n const leftPoint = x(startPoint.date) < x(closest.date) ? startPoint : closest\n const rightPoint = x(startPoint.date) >= x(closest.date) ? startPoint : closest\n const isGrowing = rightPoint.value - leftPoint.value >= 0\n const xLeft = x(leftPoint.date)\n const xRight = x(rightPoint.date)\n const selectionWidth = xRight - xLeft\n\n elements.rangeBorderLeft.update({\n x1: xLeft,\n x2: xLeft,\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.rangeBorderRight.update({\n x1: xRight,\n x2: xRight,\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.rangeCircleLeft.update({\n cx: xLeft,\n cy: y(leftPoint.value),\n hidden: false,\n })\n\n elements.rangeCircleRight.update({\n cx: xRight,\n cy: y(rightPoint.value),\n hidden: false,\n })\n\n elements.rangeLine.update({\n clip: {\n x: xLeft,\n y: 0,\n width: selectionWidth,\n height: y.range()[0],\n },\n hidden: false,\n })\n\n elements.rangeLineArea.update({\n clip: {\n x: xLeft,\n y: 0,\n width: selectionWidth,\n height: y.range()[0],\n },\n hidden: false,\n })\n\n elements.rangeTooltip.update({\n rightPoint,\n leftPoint,\n closest,\n x: xLeft + selectionWidth / 2,\n y: 0,\n hidden: false,\n })\n\n elements.belowZeroLine?.update({\n hidden: true,\n })\n\n elements.mainLineArea.update({ hidden: true })\n\n controlIsGrowingClasses(elements, isGrowing)\n elements.mainLine.className('add', '_selected-muted')\n}\n\nexport const hideSelectionItems = (ctx: ChartContext) => {\n const { elements } = ctx\n elements.rangeLine.update({ hidden: true })\n elements.rangeLineArea.update({ hidden: true })\n elements.rangeBorderLeft.update({ hidden: true })\n elements.rangeBorderRight.update({ hidden: true })\n elements.rangeCircleLeft.update({ hidden: true })\n elements.rangeCircleRight.update({ hidden: true })\n elements.rangeTooltip.update({ hidden: true })\n elements.mainLine.className('remove', '_selected-muted')\n elements.mainLineArea.update({ hidden: false })\n elements.belowZeroLine?.update({ hidden: false })\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { hideHoverItems, renderHoverItems } from './hover'\nimport { hideSelectionItems, renderSelectionItems } from './selection'\n\nexport const setupInteractions = (ctx: ChartContext) => {\n const { svg, data, x, config, width, height } = ctx\n const { margin, hover, selection } = config\n let startPoint: ParsedDataPoint | null = null\n let isDragging = false\n\n const findClosest = (mouseX: number) => {\n return data.reduce((a, b) =>\n Math.abs(x(a.date) - mouseX) < Math.abs(x(b.date) - mouseX) ? a : b\n )\n }\n\n const overlay = svg\n .append('rect')\n .attr('width', width - margin.left - margin.right)\n .attr('height', height - margin.top - margin.bottom)\n .attr('x', margin.left)\n .attr('y', margin.top)\n .attr('fill', 'transparent')\n\n overlay\n .on('mousemove', function (event) {\n const [mouseX] = d3.pointer(event, this)\n const closest = findClosest(mouseX)\n\n if (!isDragging && hover.enable) {\n ctx.action = 'hover'\n renderHoverItems(ctx, closest)\n } else {\n ctx.action = isDragging ? 'selection' : 'none'\n hideHoverItems(ctx)\n }\n\n if (startPoint && selection.enable) {\n ctx.action = 'selection'\n renderSelectionItems(ctx, startPoint, closest)\n }\n })\n .on('mouseleave', () => {\n ctx.action = 'none'\n isDragging = false\n startPoint = null\n hideHoverItems(ctx)\n hideSelectionItems(ctx)\n })\n .on('mousedown', function (event) {\n if (selection.enable) {\n isDragging = true\n ctx.action = 'selection'\n const [mouseX] = d3.pointer(event, this)\n startPoint = findClosest(mouseX)\n }\n })\n .on('mouseup', function (event) {\n const [mouseX] = d3.pointer(event, this)\n const closest = findClosest(mouseX)\n isDragging = false\n startPoint = null\n ctx.action = 'hover'\n\n if (selection.enable) hideSelectionItems(ctx)\n if (hover.enable) renderHoverItems(ctx, closest)\n })\n}\n","import * as d3 from 'd3'\nimport { ChartConfigContext, ParsedDataPoint } from '../types'\n\nexport const createXScale = (\n data: ParsedDataPoint[],\n config: ChartConfigContext,\n width: number\n) => {\n const { margin } = config\n\n const scale = d3.scaleTime()\n\n const xExtent = d3.extent(data, (d) => new Date(d.date))\n\n if (xExtent[0] == null || xExtent[1] == null) return scale\n\n return scale.domain([xExtent[0], xExtent[1]]).range([margin.left, width - margin.right])\n}\n\nexport const createYScale = (\n data: ParsedDataPoint[],\n config: ChartConfigContext,\n height: number\n) => {\n const { margin } = config\n\n const yMax = d3.max(data, (d) => d.value) ?? 0\n const yMin = d3.min(data, (d) => d.value) ?? 0\n\n return d3\n .scaleLinear()\n .domain([yMin, yMax])\n .range([height - margin.bottom, margin.top])\n}\n","import * as d3 from 'd3'\nimport { createAxes } from './axes'\nimport { createElements } from './elements'\nimport { setupInteractions } from './interactions'\nimport { ChartContext, ParsedDataPoint, LineChartOptions, RenderLineChartOptions } from './types'\nimport { defaultConfig } from './constants'\nimport { mergeConfig } from './utils'\nimport { createYScale, createXScale } from './scales'\nimport '../../css/line-chart.css'\n\nexport const createLineChart = (selector: string, initialOptions: LineChartOptions) => {\n const container = d3.select(selector)\n if (container.empty()) {\n console.error(`Element with selector ${selector} not found!`)\n return null\n }\n if (!initialOptions.chartId || !/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(initialOptions.chartId)) {\n console.error(`chartId is required and must be a valid id \n (only letters, numbers or underscores. The first character must be a letter)`)\n return null\n }\n\n const wrapper = container.append('div')\n const svg = wrapper.append('svg')\n\n const containerNode = container.node() as HTMLElement\n let boundingRect = containerNode.getBoundingClientRect()\n let width = boundingRect.width\n let height = boundingRect.height\n let currentConfig = mergeConfig({ ...defaultConfig }, initialOptions.config)\n let currentData = initialOptions.data\n\n const handleResize = () => {\n boundingRect = containerNode.getBoundingClientRect()\n width = boundingRect.width\n height = boundingRect.height\n render({ data: currentData, config: currentConfig })\n }\n\n window.addEventListener('resize', handleResize)\n\n const render = (options: RenderLineChartOptions, isUpdate = false) => {\n if (isUpdate && options.config) {\n currentConfig = mergeConfig(currentConfig, options.config)\n }\n if (isUpdate && options.data) {\n currentData = options.data\n }\n\n const data: ParsedDataPoint[] = currentData\n .map((d) => ({ date: new Date(d.date), value: d.value }))\n .sort((a, b) => a.date.getTime() - b.date.getTime())\n\n const x = createXScale(data, currentConfig, width)\n const y = createYScale(data, currentConfig, height)\n\n wrapper.attr('class', `sc-charts sc-charts__${currentConfig.theme}`)\n svg\n .attr('preserveAspectRatio', 'xMinYMin meet')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .style('width', '100%')\n .style('height', '100%')\n .selectAll('*')\n .remove()\n\n const preContext: Omit<ChartContext, 'elements'> = {\n chartId: initialOptions.chartId,\n svg,\n wrapperNode: wrapper.node()!,\n data,\n x,\n y,\n config: currentConfig,\n action: 'none',\n width,\n height,\n }\n\n createAxes(preContext)\n\n const context: ChartContext = {\n ...preContext,\n elements: createElements(preContext),\n }\n setupInteractions(context)\n }\n\n render(initialOptions)\n\n return {\n update: (options: RenderLineChartOptions) => render(options, true),\n destroy: () => {\n window.removeEventListener('resize', handleResize)\n svg.remove()\n },\n }\n}\n"],"names":["renderYAxis","context","svg","config","y","width","margin","yAxis","customTicks","tickFormat","tickValues","ticks","isShow","g","axis","d3","d","num","sign","formatted","renderXAxis","x","height","xAxis","renderHorizontalStyles","horizontalStyle","line","tick","renderVerticalStyles","verticalStyle","renderGrid","createAxes","logo","createGradient","defs","gradientId","options","gradient","offset","stopColor","getDefs","defsSelection","getBelowZeroClip","ctx","clipHeight","mergeConfig","base","patch","renderBorderRangeLine","parent","createBorderGradient","mainColor","baseClassName","item","action","mod","x1","x2","y1","y2","hidden","renderCirclePoint","cx","cy","fill","renderHoverLine","BASE_CLASSNAME","timeFormat","sumFormat","sum","fmt","icon","createTooltipElements","container","tooltip","wrapper","sumWrapper","iconNode","sumNode","timeNode","renderRangeTooltip","leftPoint","rightPoint","closest","delta","sumFormatter","timeFormatter","selectionCenter","direction","valueText","dateText","percent","tooltipRect","containerRect","leftX","rightX","tooltipX","minX","maxX","TOOLTIP_OFFSET_PX","calcTooltipPosition","tooltipDimensions","initX","renderHoverTooltip","dataItem","defaultConfig","curveFunction","renderMainLineArea","data","svgNode","areaGen","renderRangeLineArea","chartId","initClip","clipId","clipRect","clip","renderDataLine","id","lineGen","renderHighlightLine","createElements","mainLine","mainLineArea","hoverLine","highlightLine","belowZeroLine","hoverCircle","rangeBorderLeft","rangeBorderRight","rangeLine","rangeCircleLeft","rangeCircleRight","rangeTooltip","hoverTooltip","rangeLineArea","getClipForRange","hoverRange","closestDate","match","amountStr","unit","amount","domainStart","domainEnd","cursor","next","xStart","xEnd","prev","renderHoverItems","elements","baseClip","_a","hideHoverItems","controlIsGrowingClasses","isGrowing","name","renderSelectionItems","startPoint","xLeft","xRight","selectionWidth","hideSelectionItems","setupInteractions","hover","selection","isDragging","findClosest","mouseX","a","b","event","createXScale","scale","xExtent","createYScale","yMax","yMin","createLineChart","selector","initialOptions","containerNode","boundingRect","currentConfig","currentData","handleResize","render","isUpdate","preContext"],"mappings":"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"}
1
+ {"version":3,"file":"charts-core.umd.cjs","sources":["../src/components/line-chart/axes/y-axis.ts","../src/components/line-chart/axes/x-axis.ts","../src/components/line-chart/axes/grid.ts","../src/components/line-chart/axes/index.ts","../src/components/line-chart/utils/index.ts","../src/components/line-chart/elements/range-border.ts","../src/components/line-chart/elements/circle-point.ts","../src/components/line-chart/elements/hover-line.ts","../src/components/line-chart/elements/range-tooltip.ts","../src/components/line-chart/elements/hover-tooltip.ts","../src/components/line-chart/constants.ts","../src/components/line-chart/elements/main-line-area.ts","../src/components/line-chart/elements/range-line-area.ts","../src/components/line-chart/elements/data-line.ts","../src/components/line-chart/elements/highlight-line.ts","../src/components/line-chart/elements/index.ts","../src/components/line-chart/interactions/hover/utils.ts","../src/components/line-chart/interactions/hover/index.ts","../src/components/line-chart/interactions/selection.ts","../src/components/line-chart/interactions/index.ts","../src/components/line-chart/scales/index.ts","../src/components/line-chart/index.ts"],"sourcesContent":["import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nexport const renderYAxis = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, y, width } = context\n const { margin, yAxis } = config\n const { customTicks, tickFormat, tickValues, ticks, isShow } = yAxis\n\n if (!isShow) return null\n\n svg\n .append('g')\n .attr('transform', `translate(${width - margin.right},0)`)\n .call((g) => {\n let axis = d3.axisRight(y)\n if (customTicks) {\n if (tickFormat) {\n axis = axis.tickFormat(tickFormat)\n }\n if (ticks) {\n axis = Array.isArray(ticks) ? axis.ticks(...ticks) : axis.ticks(ticks)\n }\n if (tickValues) {\n axis = axis.tickValues(tickValues)\n }\n } else {\n axis = axis.tickFormat((d) => {\n const num = Number(d)\n const sign = num < 0 ? '-' : ''\n const formatted = d3.format('.0s')(Math.abs(num))\n return `${sign}${formatted}`\n })\n }\n g.call(axis)\n })\n .call((g) => {\n let ticks: ParsedDataPoint['value'][] = []\n g.selectAll('.tick').each((d) => ticks.push(d as ParsedDataPoint['value']))\n context.yTicks = ticks\n })\n .call((g) => g.select('.domain').remove())\n .call((g) => g.selectAll('.tick line').remove())\n .call((g) => g.selectAll('.tick text').classed('sc-charts__y-axis-tick', true))\n .attr('font-family', 'inherit')\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nexport const renderXAxis = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, x, height } = context\n const { margin, xAxis } = config\n const { isShow, tickValues, tickFormat, customTicks, ticks } = xAxis\n\n if (!isShow) return null\n\n svg\n .append('g')\n .attr('transform', `translate(0,${height - margin.bottom})`)\n .call((g) => {\n let axis = d3.axisBottom(x)\n if (customTicks) {\n if (tickFormat) {\n axis = axis.tickFormat(tickFormat)\n }\n if (ticks) {\n axis = Array.isArray(ticks) ? axis.ticks(...ticks) : axis.ticks(ticks)\n }\n if (tickValues) {\n axis = axis.tickValues(tickValues)\n }\n } else {\n axis.ticks(5)\n }\n g.call(axis)\n })\n .call((g) => g.select('.domain').remove())\n .call((g) => {\n let ticks: ParsedDataPoint['date'][] = []\n g.selectAll('.tick').each((d) => ticks.push(d as ParsedDataPoint['date']))\n context.xTicks = ticks\n })\n .call((g) => g.selectAll('.tick line').remove())\n .call((g) => g.selectAll('.tick text').classed('sc-charts__x-axis-tick', true))\n .attr('font-family', 'inherit')\n}\n","import { ChartContext } from '../types'\n\nconst renderHorizontalStyles = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, y, width } = context\n const {\n margin,\n grid: { horizontalStyle },\n } = config\n\n if (horizontalStyle === 'none') return\n\n if (horizontalStyle.startsWith('zero-line')) {\n const line = svg\n .append('line')\n .attr('x1', 0 + margin.left)\n .attr('x2', width - margin.right)\n .attr('y1', y(0))\n .attr('y2', y(0))\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (horizontalStyle === 'zero-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n }\n\n if (horizontalStyle.startsWith('every-line')) {\n const ticks = context.yTicks || y.ticks()\n\n ticks.forEach((tick) => {\n const line = svg\n .append('line')\n .attr('x1', 0 + margin.left)\n .attr('x2', width - margin.right)\n .attr('y1', y(tick))\n .attr('y2', y(tick))\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (horizontalStyle === 'every-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n })\n }\n}\n\nconst renderVerticalStyles = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, x, height } = context\n const {\n margin,\n grid: { verticalStyle },\n } = config\n\n if (verticalStyle === 'none') return\n\n if (verticalStyle.startsWith('every-line')) {\n const ticks = context.xTicks || x.ticks()\n\n ticks.forEach((tick) => {\n const line = svg\n .append('line')\n .attr('x1', x(tick))\n .attr('x2', x(tick))\n .attr('y1', margin.top)\n .attr('y2', height - margin.bottom)\n .attr('stroke', 'var(--sc-color-axis-zero-line)')\n .attr('stroke-width', 1)\n\n if (verticalStyle === 'every-line-dashed') {\n line.attr('stroke-dasharray', '4 4')\n }\n })\n }\n}\n\nexport const renderGrid = (context: Omit<ChartContext, 'elements'>) => {\n renderHorizontalStyles(context)\n renderVerticalStyles(context)\n}\n","import { ChartContext } from '../types'\nimport { renderYAxis } from './y-axis'\nimport { renderXAxis } from './x-axis'\nimport { renderGrid } from './grid.ts'\n\nexport const createAxes = (context: Omit<ChartContext, 'elements'>) => {\n const { svg, config, width, height } = context\n const { margin, logo } = config\n\n // x axis\n renderXAxis(context)\n\n // y axis\n renderYAxis(context)\n\n if (logo) {\n svg\n .append('image')\n .attr('xlink:href', config.theme === 'dark' ? logo.picDarkTheme : logo.picLightTheme)\n .attr('width', logo.width)\n .attr('height', logo.height)\n .attr('x', logo.x ?? (width - margin.left - margin.right) / 2 - logo.width / 2 + margin.left)\n .attr('y', logo.y ?? (height - margin.top - margin.bottom) / 2 - logo.height / 2 + margin.top)\n }\n\n // grid\n renderGrid(context)\n}\n","import * as d3 from 'd3'\nimport { ChartConfig, ChartConfigContext, ChartContext } from '../types'\n\nexport const createGradient = (\n defs:\n | d3.Selection<d3.BaseType, unknown, null, undefined>\n | d3.Selection<SVGDefsElement, unknown, null, undefined>,\n gradientId: string,\n options: {\n x1: string\n x2: string\n y1: string\n y2: string\n stops: { offset: string; stopColor: string }[]\n }\n): d3.Selection<SVGLinearGradientElement, unknown, null, undefined> => {\n let gradient: d3.Selection<SVGLinearGradientElement, unknown, null, undefined> =\n defs.select<SVGLinearGradientElement>(`#${gradientId}`)\n\n if (gradient.empty()) {\n gradient = defs\n .append<SVGLinearGradientElement>('linearGradient')\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('id', gradientId)\n }\n\n gradient\n .attr('x1', options.x1)\n .attr('y1', options.x2)\n .attr('x2', options.y1)\n .attr('y2', options.y2)\n\n options.stops.forEach(({ offset, stopColor }) => {\n gradient.append('stop').attr('offset', offset).attr('stop-color', stopColor)\n })\n\n return gradient\n}\n\nexport const getDefs = (svg: SVGSVGElement) => {\n const defsSelection = d3.select(svg).select('defs')\n const defs = defsSelection.empty() ? d3.select(svg).append('defs') : defsSelection\n\n return defs\n}\n\nexport const getBelowZeroClip = (ctx: Omit<ChartContext, 'elements'>) => {\n const {\n y,\n config: { margin },\n } = ctx\n const clipHeight = y.range()[0] - y(0)\n\n return { x: 0, y: y.range()[0] - clipHeight, width: '100%', height: clipHeight + margin.bottom }\n}\n\nexport const mergeConfig = (base: ChartConfigContext, patch?: ChartConfig): ChartConfigContext => ({\n ...base,\n ...patch,\n margin: {\n ...base.margin,\n ...patch?.margin,\n },\n logo:\n base.logo && patch?.logo\n ? {\n width: patch.logo.width ?? base.logo.width,\n height: patch.logo.height ?? base.logo.height,\n picLightTheme: patch.logo.picLightTheme ?? base.logo.picLightTheme,\n picDarkTheme: patch.logo.picDarkTheme ?? base.logo.picDarkTheme,\n x: patch.logo.x ?? base.logo.x,\n y: patch.logo.y ?? base.logo.y,\n }\n : base.logo,\n\n xAxis: {\n ...base.xAxis,\n ...patch?.xAxis,\n },\n yAxis: {\n ...base.yAxis,\n ...patch?.yAxis,\n },\n grid: {\n ...base.grid,\n ...patch?.grid,\n },\n hover: {\n ...base.hover,\n ...patch?.hover,\n },\n selection: {\n ...base.selection,\n ...patch?.selection,\n },\n})\n","import { Parent, ElementOptions, ChartElements } from './types'\nimport { createGradient, getDefs } from '../utils'\n\nexport const renderBorderRangeLine = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['rangeBorderLeft'] => {\n const svg = parent.node() as SVGSVGElement\n const defs = getDefs(svg)\n\n const createBorderGradient = (gradientId: string, mainColor: string) => {\n return createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'rgba(255, 255, 255, 0)' },\n { offset: '20%', stopColor: mainColor },\n { offset: '60%', stopColor: mainColor },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n }\n\n createBorderGradient('gradient-range-borders-up', 'var(--sc-color-selection-up)')\n createBorderGradient('gradient-range-borders-down', 'var(--sc-color-selection-down)')\n\n const baseClassName = 'sc-charts__border-range-line'\n\n const item = parent\n .append('line')\n .classed(baseClassName, true)\n .style('display', options.hidden ? 'none' : 'block')\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ x1, x2, y1, y2, hidden }) {\n if (x1 !== undefined) item.attr('x1', x1)\n if (x2 !== undefined) item.attr('x2', x2)\n if (y1 !== undefined) item.attr('y1', y1)\n if (y2 !== undefined) item.attr('y2', y2)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n\n destroy() {\n item.remove()\n },\n }\n}\n","import { Parent, ElementOptions, ChartElements } from './types'\n\nexport const renderCirclePoint = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['hoverCircle'] => {\n const item = parent\n .append('circle')\n .attr('r', options.radius || 4)\n .style('display', options.hidden ? 'none' : 'block')\n\n const baseClassName = options.className || ''\n if (baseClassName) item.classed(baseClassName, true)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ cx, cy, hidden, fill }) {\n if (cx !== undefined) item.attr('cx', cx)\n if (cy !== undefined) item.attr('cy', cy)\n if (fill !== undefined) item.attr('fill', fill)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n\n destroy() {\n item.remove()\n },\n }\n}\n","import { createGradient, getDefs } from '../utils'\nimport { Parent, ElementOptions, ChartElements } from './types'\n\nexport const renderHoverLine = (\n parent: Parent,\n options: ElementOptions = {}\n): ChartElements['hoverLine'] => {\n const baseClassName = 'sc-charts__hover-line'\n const item = parent\n .append('line')\n .style('display', options.hidden ? 'none' : 'block')\n .classed(baseClassName, true)\n const svg = parent.node() as SVGSVGElement\n const defs = getDefs(svg)\n\n const createBorderGradient = (gradientId: string, mainColor: string) => {\n return createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'rgba(255, 255, 255, 0)' },\n { offset: '15%', stopColor: mainColor },\n { offset: '75%', stopColor: mainColor },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n }\n\n createBorderGradient('hover-line-gradient', 'var(--sc-color-hover-line)')\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ x1, x2, y1, y2, hidden }) {\n if (x1 !== undefined) item.attr('x1', x1)\n if (x2 !== undefined) item.attr('x2', x2)\n if (y1 !== undefined) item.attr('y1', y1)\n if (y2 !== undefined) item.attr('y2', y2)\n if (hidden !== undefined) item.style('display', hidden ? 'none' : 'block')\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartElements } from './types'\nimport { ChartContext } from '../types'\n\nconst BASE_CLASSNAME = 'sc-charts__range-tooltip'\n\nconst timeFormat = d3.timeFormat('%b %e, %I:%M %p')\nconst sumFormat = (sum: number) => {\n const fmt = d3.format(',.2f')\n return `${sum < 0 ? '-' : ''}$${fmt(Math.abs(sum))}`\n}\n\nconst icon = `\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 0.5C5.71442 0.5 4.45772 0.881218 3.3888 1.59545C2.31988 2.30968 1.48676 3.32484 0.994786 4.51256C0.502816 5.70028 0.374095 7.00721 0.624899 8.26809C0.875703 9.52896 1.49477 10.6872 2.40381 11.5962C3.31285 12.5052 4.47104 13.1243 5.73192 13.3751C6.99279 13.6259 8.29973 13.4972 9.48744 13.0052C10.6752 12.5132 11.6903 11.6801 12.4046 10.6112C13.1188 9.54229 13.5 8.28558 13.5 7C13.4982 5.27665 12.8128 3.62441 11.5942 2.40582C10.3756 1.18722 8.72335 0.50182 7 0.5ZM9.35375 6.85375C9.30732 6.90024 9.25217 6.93712 9.19147 6.96228C9.13077 6.98744 9.06571 7.00039 9 7.00039C8.93429 7.00039 8.86923 6.98744 8.80853 6.96228C8.74783 6.93712 8.69269 6.90024 8.64625 6.85375L7.5 5.70687V9.5C7.5 9.63261 7.44732 9.75979 7.35356 9.85355C7.25979 9.94732 7.13261 10 7 10C6.86739 10 6.74022 9.94732 6.64645 9.85355C6.55268 9.75979 6.5 9.63261 6.5 9.5V5.70687L5.35375 6.85375C5.25993 6.94757 5.13268 7.00028 5 7.00028C4.86732 7.00028 4.74007 6.94757 4.64625 6.85375C4.55243 6.75993 4.49972 6.63268 4.49972 6.5C4.49972 6.36732 4.55243 6.24007 4.64625 6.14625L6.64625 4.14625C6.69269 4.09976 6.74783 4.06288 6.80853 4.03772C6.86923 4.01256 6.9343 3.99961 7 3.99961C7.06571 3.99961 7.13077 4.01256 7.19147 4.03772C7.25217 4.06288 7.30732 4.09976 7.35375 4.14625L9.35375 6.14625C9.40024 6.19269 9.43712 6.24783 9.46228 6.30853C9.48744 6.36923 9.5004 6.43429 9.5004 6.5C9.5004 6.56571 9.48744 6.63077 9.46228 6.69147C9.43712 6.75217 9.40024 6.80731 9.35375 6.85375Z\" \n fill=\"currentColor\"/>\n </svg>\n`\n\nfunction createTooltipElements(container: HTMLDivElement) {\n const tooltip = document.createElement('div')\n tooltip.className = BASE_CLASSNAME\n container.append(tooltip)\n\n const wrapper = document.createElement('div')\n wrapper.className = `${BASE_CLASSNAME}-container`\n tooltip.style.position = 'absolute'\n tooltip.style.top = '0'\n tooltip.style.pointerEvents = 'none'\n tooltip.style.display = 'none'\n tooltip.append(wrapper)\n\n const sumWrapper = document.createElement('div')\n sumWrapper.className = `${BASE_CLASSNAME}-sum`\n wrapper.append(sumWrapper)\n\n const iconNode = document.createElement('div')\n iconNode.className = `${BASE_CLASSNAME}-sum-icon`\n iconNode.innerHTML = icon\n sumWrapper.append(iconNode)\n\n const sumNode = document.createElement('div')\n sumWrapper.append(sumNode)\n\n const timeNode = document.createElement('div')\n timeNode.className = `${BASE_CLASSNAME}-time`\n wrapper.append(timeNode)\n\n return { wrapper: tooltip, sumNode, timeNode }\n}\n\nexport const renderRangeTooltip = (\n context: Omit<ChartContext, 'elements'>\n): ChartElements['rangeTooltip'] => {\n const { wrapper, sumNode, timeNode } = createTooltipElements(context.wrapperNode)\n\n return {\n className(action, mod) {\n if (action === 'remove') {\n wrapper.classList.remove(`${BASE_CLASSNAME}${mod}`)\n } else {\n wrapper.classList.add(`${BASE_CLASSNAME}${mod}`)\n }\n },\n update({ leftPoint, rightPoint, x, y, hidden, closest }) {\n if (leftPoint && rightPoint && closest && x !== undefined) {\n const delta = rightPoint.value - leftPoint.value\n const { sumFormatter, timeFormatter } = context.config.selection\n\n const selectionCenter = (context.x(rightPoint.date) + context.x(leftPoint.date)) / 2\n const direction = context.x(closest.date) < selectionCenter ? 'left' : 'right'\n\n let valueText = ''\n let dateText = ''\n\n if (!sumFormatter) {\n const percent = ((delta / Math.abs(leftPoint.value)) * 100).toFixed(2)\n valueText = `${sumFormat(delta)} (${percent}%)`\n } else {\n valueText = sumFormatter({ left: leftPoint.value, right: rightPoint.value, direction })\n }\n\n if (!timeFormatter) {\n dateText = `${timeFormat(leftPoint.date)} to ${timeFormat(rightPoint.date)}`\n } else {\n dateText = timeFormatter({ left: leftPoint.date, right: rightPoint.date, direction })\n }\n\n sumNode.textContent = valueText\n timeNode.textContent = dateText\n\n requestAnimationFrame(() => {\n const tooltipRect = wrapper.getBoundingClientRect()\n const containerRect = context.wrapperNode.getBoundingClientRect()\n\n const leftX = context.x(leftPoint.date)\n const rightX = context.x(rightPoint.date)\n const selectionCenterX = (leftX + rightX) / 2\n\n let tooltipX = selectionCenterX - tooltipRect.width / 2\n\n const minX = 0\n const maxX = containerRect.width - tooltipRect.width\n\n if (tooltipX < minX) tooltipX = minX\n if (tooltipX > maxX) tooltipX = maxX\n\n wrapper.style.left = `${tooltipX}px`\n wrapper.style.top = `${y}px`\n })\n }\n\n if (hidden !== undefined) {\n wrapper.style.display = hidden ? 'none' : 'block'\n }\n },\n destroy() {\n wrapper.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartElements } from './types'\nimport { ChartContext } from '../types'\n\nconst BASE_CLASSNAME = 'sc-charts__hover-tooltip'\nconst TOOLTIP_OFFSET_PX = 16\n\nconst defaultTimeFormatter = d3.timeFormat('%a, %b %d, %-I:%M %p')\nconst defaultSumFormatter = (sum: number) => {\n const fmt = d3.format(',.2f')\n return `${sum < 0 ? '-' : ''}$${fmt(Math.abs(sum))}`\n}\n\nfunction createTooltipElements(container: HTMLDivElement) {\n const tooltip = document.createElement('div')\n tooltip.className = `${BASE_CLASSNAME}-container`\n tooltip.style.position = 'absolute'\n tooltip.style.top = '0'\n tooltip.style.pointerEvents = 'none'\n tooltip.style.display = 'none'\n container.appendChild(tooltip)\n\n const sumNode = document.createElement('div')\n sumNode.className = `${BASE_CLASSNAME}-sum`\n tooltip.appendChild(sumNode)\n\n const timeNode = document.createElement('div')\n timeNode.className = `${BASE_CLASSNAME}-time`\n tooltip.appendChild(timeNode)\n\n return { wrapper: tooltip, sumNode, timeNode }\n}\n\nfunction calcTooltipPosition(\n tooltipDimensions: DOMRect,\n initX: number,\n maxX: number\n): number | null {\n if (!tooltipDimensions) return null\n\n const fitsRight = initX + TOOLTIP_OFFSET_PX + tooltipDimensions.width < maxX\n\n const tooltipX = fitsRight\n ? initX + TOOLTIP_OFFSET_PX\n : initX - TOOLTIP_OFFSET_PX - tooltipDimensions.width\n\n return tooltipX\n}\n\nexport const renderHoverTooltip = (\n context: Omit<ChartContext, 'elements'>\n): ChartElements['hoverTooltip'] => {\n const { wrapper, sumNode, timeNode } = createTooltipElements(context.wrapperNode)\n\n return {\n className(action, mod) {\n if (action === 'remove') {\n wrapper.classList.remove(`${BASE_CLASSNAME}${mod}`)\n } else {\n wrapper.classList.add(`${BASE_CLASSNAME}${mod}`)\n }\n },\n\n update({ hidden, dataItem }) {\n if (dataItem) {\n const { sumFormatter, timeFormatter } = context.config.hover\n sumNode.textContent = sumFormatter\n ? sumFormatter(dataItem.value)\n : defaultSumFormatter(dataItem.value)\n timeNode.textContent = timeFormatter\n ? timeFormatter(dataItem.date)\n : defaultTimeFormatter(dataItem.date)\n\n requestAnimationFrame(() => {\n const tooltipDimensions = wrapper.getBoundingClientRect()\n const tooltipX = calcTooltipPosition(\n tooltipDimensions,\n context.x(dataItem.date),\n context.width - context.config.margin.right\n )\n if (tooltipX) wrapper.style.left = tooltipX + 'px'\n })\n }\n\n if (hidden !== undefined) {\n wrapper.style.display = hidden ? 'none' : 'block'\n }\n },\n\n destroy() {\n wrapper.remove()\n },\n }\n}\n","import { ChartConfigContext, ChartContext } from './types'\nimport * as d3 from 'd3'\n\nexport const defaultConfig: ChartConfigContext = {\n margin: { top: 10, right: 30, bottom: 20, left: 10 },\n theme: 'light',\n logo: {\n width: 406,\n height: 113,\n x: null,\n y: null,\n picDarkTheme: null,\n picLightTheme: null,\n },\n hasMainLineArea: false,\n hover: {\n enable: true,\n range: '1m',\n transitionDuration: 150,\n transitionName: 'default',\n sumFormatter: null,\n timeFormatter: null,\n },\n selection: {\n enable: true,\n sumFormatter: null,\n timeFormatter: null,\n },\n xAxis: {\n customTicks: false,\n tickFormat: null,\n ticks: null,\n tickValues: null,\n isShow: false,\n },\n yAxis: {\n customTicks: false,\n tickFormat: null,\n ticks: null,\n tickValues: null,\n isShow: true,\n },\n grid: {\n horizontalStyle: 'zero-line-dashed',\n verticalStyle: 'none',\n },\n enableBelowZeroLine: false,\n curveTension: 1,\n}\n\nexport const curveFunction = (ctx: Omit<ChartContext, 'elements'>) =>\n d3.curveCardinal.tension(ctx.config.curveTension)\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartElements } from './types'\nimport { createGradient, getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderMainLineArea = (\n ctx: Omit<ChartContext, 'elements'>\n): ChartElements['mainLineArea'] => {\n const { svg, data, x, y, config } = ctx\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const gradientId = 'main-line-area-gradient'\n\n createGradient(defs, gradientId, {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-main-line)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n\n const areaGen = d3\n .area<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y0(y.range()[0])\n .y1((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const baseClassName = 'sc-charts__main-line-area'\n\n const item = svg\n .append('path')\n .datum(data)\n .attr('d', areaGen)\n .attr('class', baseClassName)\n .classed(`${baseClassName}_hidden`, !config.hasMainLineArea)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', areaGen)\n if (hidden !== undefined) {\n if (!config.hasMainLineArea) return null\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartElements, ClipProps } from './types'\nimport { createGradient, getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderRangeLineArea = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { clip?: ClipProps } = {}\n): ChartElements['rangeLineArea'] => {\n const baseClassName = 'sc-charts__range-line-area'\n const { svg, x, y, config, data, chartId } = ctx\n const { clip: initClip } = options\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const gradientId = 'range-line-area-gradient'\n\n createGradient(defs, gradientId + '_up', {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-selection-up)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n createGradient(defs, gradientId + '_down', {\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%',\n stops: [\n { offset: '0%', stopColor: 'var(--sc-color-selection-down)' },\n { offset: '100%', stopColor: 'rgba(255, 255, 255, 0)' },\n ],\n })\n\n const areaGen = d3\n .area<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y0(y.range()[0])\n .y1((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .datum(data)\n .attr('d', areaGen)\n .attr('class', baseClassName)\n .classed(`${baseClassName}_hidden`, !config.hasMainLineArea)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, hidden, clip }) {\n if (data !== undefined) item.datum(data).attr('d', areaGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartFabricElement, ClipProps, DataLineUpdateProps } from './types'\nimport { getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderDataLine = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { baseClassName: string; id: string; clip?: ClipProps }\n): ChartFabricElement<Partial<DataLineUpdateProps>> => {\n const { svg, data, x, y, chartId } = ctx\n const { baseClassName, id, clip: initClip } = options\n\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const lineGen = d3\n .line<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .classed(baseClassName, true)\n .datum(data)\n .attr('d', lineGen)\n .attr('id', id)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, clip, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', lineGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { ChartFabricElement, ClipProps, DataLineUpdateProps } from './types'\nimport { getDefs } from '../utils'\nimport { curveFunction } from '../constants'\n\nexport const renderHighlightLine = (\n ctx: Omit<ChartContext, 'elements'>,\n options: { baseClassName: string; id: string; clip?: ClipProps }\n): ChartFabricElement<Partial<DataLineUpdateProps>> => {\n const { svg, data, x, y, chartId, config } = ctx\n const { baseClassName, id, clip: initClip } = options\n\n const svgNode = svg.node() as SVGSVGElement\n const defs = getDefs(svgNode)\n\n const lineGen = d3\n .line<ParsedDataPoint>()\n .x((d) => x(d.date))\n .y((d) => y(d.value))\n .curve(curveFunction(ctx))\n\n const clipId = `${chartId}-clip-${baseClassName}`\n const clipPath = defs.append('clipPath').attr('id', clipId)\n\n const clipRect = clipPath\n .append('rect')\n .attr('x', initClip?.x || 0)\n .attr('y', initClip?.y || 0)\n .attr('width', initClip?.width || '100%')\n .attr('height', initClip?.height || '100%')\n\n const item = svg\n .append('path')\n .classed(baseClassName, true)\n .datum(data)\n .attr('d', lineGen)\n .attr('id', id)\n .attr('clip-path', `url(#${clipId})`)\n\n return {\n className(action, mod) {\n if (action === 'remove') item.classed(`${baseClassName}${mod}`, false)\n else item.classed(`${baseClassName}${mod}`, true)\n },\n update({ data, clip, hidden }) {\n if (data !== undefined) item.datum(data).attr('d', lineGen)\n if (hidden !== undefined) {\n item.classed(`${baseClassName}_hidden`, hidden)\n }\n if (clip !== undefined) {\n if (config.hover.transitionName === 'default') {\n clipRect\n .transition()\n .duration(config.hover.transitionDuration)\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n .ease(d3.easeLinear)\n } else {\n clipRect\n .attr('x', clip.x)\n .attr('y', clip.y)\n .attr('width', clip.width)\n .attr('height', clip.height)\n }\n }\n },\n destroy() {\n item.remove()\n },\n }\n}\n","import { ChartElements } from './types'\nimport { renderBorderRangeLine } from './range-border'\nimport { renderCirclePoint } from './circle-point'\nimport { renderHoverLine } from './hover-line'\nimport { ChartContext } from '../types'\nimport { renderRangeTooltip } from './range-tooltip'\nimport { renderHoverTooltip } from './hover-tooltip'\nimport { renderMainLineArea } from './main-line-area'\nimport { renderRangeLineArea } from './range-line-area'\nimport { renderDataLine } from './data-line'\nimport { getBelowZeroClip } from '../utils'\nimport { renderHighlightLine } from './highlight-line'\n\n// render each elements by order\nexport const createElements = (context: Omit<ChartContext, 'elements'>): ChartElements => {\n const mainLine = renderDataLine(context, {\n baseClassName: `sc-charts__main-line`,\n id: `${context.chartId}-sc-charts__main-line`,\n })\n const mainLineArea = renderMainLineArea(context)\n\n const hoverLine = renderHoverLine(context.svg)\n const highlightLine = renderHighlightLine(context, {\n baseClassName: `sc-charts__highlight-line`,\n id: `${context.chartId}-sc-charts__highlight-line`,\n clip: { x: 0, y: 0, width: '0', height: '0' },\n })\n\n let belowZeroLine = null\n\n if (context.config.enableBelowZeroLine) {\n belowZeroLine = renderDataLine(context, {\n baseClassName: `sc-charts__below-zero-line`,\n id: `${context.chartId}-sc-charts__below-zero-line`,\n clip: getBelowZeroClip(context),\n })\n }\n\n const hoverCircle = renderCirclePoint(context.svg, {\n className: 'sc-charts__hover-circle',\n hidden: true,\n })\n const rangeBorderLeft = renderBorderRangeLine(context.svg)\n const rangeBorderRight = renderBorderRangeLine(context.svg)\n const rangeLine = renderDataLine(context, {\n baseClassName: `sc-charts__range-line`,\n id: `${context.chartId}-sc-charts__range-line`,\n clip: { x: 0, y: 0, width: '0', height: '0' },\n })\n const rangeCircleLeft = renderCirclePoint(context.svg, {\n className: 'sc-charts__range-circle-left',\n hidden: true,\n })\n const rangeCircleRight = renderCirclePoint(context.svg, {\n className: 'sc-charts__range-circle-right',\n hidden: true,\n })\n const rangeTooltip = renderRangeTooltip(context)\n const hoverTooltip = renderHoverTooltip(context)\n const rangeLineArea = renderRangeLineArea(context)\n\n return {\n hoverLine,\n hoverCircle,\n rangeBorderLeft,\n rangeBorderRight,\n rangeLine,\n rangeLineArea,\n rangeCircleLeft,\n rangeCircleRight,\n mainLine,\n rangeTooltip,\n highlightLine,\n hoverTooltip,\n mainLineArea,\n belowZeroLine,\n }\n}\n","import { ScaleTime } from 'd3'\nimport { HoverRange } from '../../types'\n\nexport const getClipForRange = (\n hoverRange: HoverRange,\n closestDate: Date,\n x: ScaleTime<number, number, never>\n) => {\n const match = hoverRange.match(/^(\\d+)([dMhmw])$/)\n\n if (!match) {\n console.warn('Invalid hoverRange:', hoverRange)\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n }\n\n const [, amountStr, unit] = match\n const amount = parseInt(amountStr, 10)\n\n const [domainStart, domainEnd] = x.domain()\n\n let cursor = new Date(domainStart)\n\n while (cursor < domainEnd) {\n let next = new Date(cursor)\n\n switch (unit) {\n case 'M':\n next.setMinutes(next.getMinutes() + amount)\n break\n case 'h':\n next.setHours(next.getHours() + amount)\n break\n case 'd':\n next.setDate(next.getDate() + amount)\n break\n case 'w':\n next.setDate(next.getDate() + amount * 7)\n break\n case 'm':\n next = new Date(cursor.getFullYear(), cursor.getMonth() + amount, 1)\n break\n default:\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n }\n\n if (closestDate >= cursor && closestDate < next) {\n const xStart = x(cursor)\n const xEnd = x(next)\n return {\n x: xStart,\n y: 0,\n width: xEnd - xStart,\n height: '100%',\n }\n }\n\n cursor = new Date(next)\n }\n\n if (closestDate.getTime() === domainEnd.getTime()) {\n let prev = new Date(domainEnd)\n\n switch (unit) {\n case 'M':\n prev.setMinutes(prev.getMinutes() - amount)\n break\n case 'h':\n prev.setHours(prev.getHours() - amount)\n break\n case 'd':\n prev.setDate(prev.getDate() - amount)\n break\n case 'w':\n prev.setDate(prev.getDate() - amount * 7)\n break\n case 'm':\n prev = new Date(domainEnd.getFullYear(), domainEnd.getMonth() - amount, 1)\n break\n }\n\n const xStart = x(prev)\n const xEnd = x(domainEnd)\n return {\n x: xStart,\n y: 0,\n width: xEnd - xStart,\n height: '100%',\n }\n }\n\n return {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%',\n }\n}\n","import { ChartContext, ParsedDataPoint } from '../../types'\nimport { getBelowZeroClip } from '../../utils'\nimport { getClipForRange } from './utils'\n\nexport const renderHoverItems = (ctx: ChartContext, closest: ParsedDataPoint) => {\n const {\n x,\n y,\n elements,\n config: { margin },\n height,\n } = ctx\n\n elements.hoverLine.update({\n x1: x(closest.date),\n x2: x(closest.date),\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.hoverCircle.update({\n cx: x(closest.date),\n cy: y(closest.value),\n hidden: false,\n })\n\n elements.hoverTooltip.update({\n dataItem: closest,\n hidden: false,\n })\n\n const baseClip = getClipForRange(ctx.config.hover.range, closest.date, x)\n\n elements.highlightLine.update({\n clip: baseClip,\n hidden: false,\n })\n\n elements.belowZeroLine?.update({\n clip: {\n ...baseClip,\n y: y(0),\n height: y.range()[0] - y(0) + margin.bottom,\n },\n })\n\n elements.mainLine.className('add', '_muted')\n}\n\nexport const hideHoverItems = (ctx: ChartContext) => {\n const { elements } = ctx\n elements.hoverLine.update({ hidden: true })\n elements.hoverCircle.update({ hidden: true })\n elements.highlightLine.update({ hidden: true })\n elements.mainLine.className('remove', '_muted')\n elements.hoverTooltip.update({ hidden: true })\n if (ctx.action !== 'selection') {\n elements.belowZeroLine?.update({\n clip: getBelowZeroClip(ctx),\n })\n }\n}\n","import { ChartElements } from '../elements/types'\nimport { ChartContext, ParsedDataPoint } from '../types'\n\nconst controlIsGrowingClasses = (elements: ChartElements, isGrowing: boolean) => {\n const names: (keyof Required<\n Pick<\n ChartElements,\n | 'rangeBorderLeft'\n | 'rangeBorderRight'\n | 'rangeCircleLeft'\n | 'rangeCircleRight'\n | 'rangeLine'\n | 'rangeLineArea'\n | 'rangeTooltip'\n >\n >)[] = [\n 'rangeBorderLeft',\n 'rangeBorderRight',\n 'rangeCircleLeft',\n 'rangeCircleRight',\n 'rangeLine',\n 'rangeLineArea',\n 'rangeTooltip',\n ]\n\n names.forEach((name) => {\n if (isGrowing) {\n elements[name].className('remove', '_down')\n elements[name].className('add', '_up')\n } else {\n elements[name].className('remove', '_up')\n elements[name].className('add', '_down')\n }\n })\n}\n\nexport const renderSelectionItems = (\n ctx: ChartContext,\n startPoint: ParsedDataPoint,\n closest: ParsedDataPoint\n) => {\n const {\n x,\n y,\n config: { margin },\n height,\n elements,\n } = ctx\n\n const leftPoint = x(startPoint.date) < x(closest.date) ? startPoint : closest\n const rightPoint = x(startPoint.date) >= x(closest.date) ? startPoint : closest\n const isGrowing = rightPoint.value - leftPoint.value >= 0\n const xLeft = x(leftPoint.date)\n const xRight = x(rightPoint.date)\n const selectionWidth = xRight - xLeft\n\n elements.rangeBorderLeft.update({\n x1: xLeft,\n x2: xLeft,\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.rangeBorderRight.update({\n x1: xRight,\n x2: xRight,\n y1: margin.top,\n y2: height - margin.bottom,\n hidden: false,\n })\n\n elements.rangeCircleLeft.update({\n cx: xLeft,\n cy: y(leftPoint.value),\n hidden: false,\n })\n\n elements.rangeCircleRight.update({\n cx: xRight,\n cy: y(rightPoint.value),\n hidden: false,\n })\n\n elements.rangeLine.update({\n clip: {\n x: xLeft,\n y: 0,\n width: selectionWidth,\n height: y.range()[0],\n },\n hidden: false,\n })\n\n elements.rangeLineArea.update({\n clip: {\n x: xLeft,\n y: 0,\n width: selectionWidth,\n height: y.range()[0],\n },\n hidden: false,\n })\n\n elements.rangeTooltip.update({\n rightPoint,\n leftPoint,\n closest,\n x: xLeft + selectionWidth / 2,\n y: 0,\n hidden: false,\n })\n\n elements.belowZeroLine?.update({\n hidden: true,\n })\n\n elements.mainLineArea.update({ hidden: true })\n\n controlIsGrowingClasses(elements, isGrowing)\n elements.mainLine.className('add', '_selected-muted')\n}\n\nexport const hideSelectionItems = (ctx: ChartContext) => {\n const { elements } = ctx\n elements.rangeLine.update({ hidden: true })\n elements.rangeLineArea.update({ hidden: true })\n elements.rangeBorderLeft.update({ hidden: true })\n elements.rangeBorderRight.update({ hidden: true })\n elements.rangeCircleLeft.update({ hidden: true })\n elements.rangeCircleRight.update({ hidden: true })\n elements.rangeTooltip.update({ hidden: true })\n elements.mainLine.className('remove', '_selected-muted')\n elements.mainLineArea.update({ hidden: false })\n elements.belowZeroLine?.update({ hidden: false })\n}\n","import * as d3 from 'd3'\nimport { ChartContext, ParsedDataPoint } from '../types'\nimport { hideHoverItems, renderHoverItems } from './hover'\nimport { hideSelectionItems, renderSelectionItems } from './selection'\n\nexport const setupInteractions = (ctx: ChartContext) => {\n const { svg, data, x, config, width, height } = ctx\n const { margin, hover, selection } = config\n let startPoint: ParsedDataPoint | null = null\n let isDragging = false\n\n const findClosest = (mouseX: number) => {\n return data.reduce((a, b) =>\n Math.abs(x(a.date) - mouseX) < Math.abs(x(b.date) - mouseX) ? a : b\n )\n }\n\n const overlay = svg\n .append('rect')\n .attr('width', width - margin.left - margin.right)\n .attr('height', height - margin.top - margin.bottom)\n .attr('x', margin.left)\n .attr('y', margin.top)\n .attr('fill', 'transparent')\n\n overlay\n .on('mousemove', function (event) {\n const [mouseX] = d3.pointer(event, this)\n const closest = findClosest(mouseX)\n\n if (!isDragging && hover.enable) {\n ctx.action = 'hover'\n renderHoverItems(ctx, closest)\n } else {\n ctx.action = isDragging ? 'selection' : 'none'\n hideHoverItems(ctx)\n }\n\n if (startPoint && selection.enable) {\n ctx.action = 'selection'\n renderSelectionItems(ctx, startPoint, closest)\n }\n })\n .on('mouseleave', () => {\n ctx.action = 'none'\n isDragging = false\n startPoint = null\n hideHoverItems(ctx)\n hideSelectionItems(ctx)\n })\n .on('mousedown', function (event) {\n if (selection.enable) {\n isDragging = true\n ctx.action = 'selection'\n const [mouseX] = d3.pointer(event, this)\n startPoint = findClosest(mouseX)\n }\n })\n .on('mouseup', function (event) {\n const [mouseX] = d3.pointer(event, this)\n const closest = findClosest(mouseX)\n isDragging = false\n startPoint = null\n ctx.action = 'hover'\n\n if (selection.enable) hideSelectionItems(ctx)\n if (hover.enable) renderHoverItems(ctx, closest)\n })\n}\n","import * as d3 from 'd3'\nimport { ChartConfigContext, ParsedDataPoint } from '../types'\n\nexport const createXScale = (\n data: ParsedDataPoint[],\n config: ChartConfigContext,\n width: number\n) => {\n const { margin } = config\n\n const scale = d3.scaleTime()\n\n const xExtent = d3.extent(data, (d) => new Date(d.date))\n\n if (xExtent[0] == null || xExtent[1] == null) return scale\n\n return scale.domain([xExtent[0], xExtent[1]]).range([margin.left, width - margin.right])\n}\n\nexport const createYScale = (\n data: ParsedDataPoint[],\n config: ChartConfigContext,\n height: number\n) => {\n const { margin } = config\n\n const yMax = d3.max(data, (d) => d.value) ?? 0\n const yMin = d3.min(data, (d) => d.value) ?? 0\n\n return d3\n .scaleLinear()\n .domain([yMin, yMax])\n .range([height - margin.bottom, margin.top])\n}\n","import * as d3 from 'd3'\nimport { createAxes } from './axes'\nimport { createElements } from './elements'\nimport { setupInteractions } from './interactions'\nimport { ChartContext, ParsedDataPoint, LineChartOptions, RenderLineChartOptions } from './types'\nimport { defaultConfig } from './constants'\nimport { mergeConfig } from './utils'\nimport { createYScale, createXScale } from './scales'\nimport '../../css/line-chart.css'\n\nexport const createLineChart = (selector: string, initialOptions: LineChartOptions) => {\n const container = d3.select(selector)\n if (container.empty()) {\n console.error(`Element with selector ${selector} not found!`)\n return null\n }\n if (!initialOptions.chartId || !/^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(initialOptions.chartId)) {\n console.error(`chartId is required and must be a valid id \n (only letters, numbers or underscores. The first character must be a letter)`)\n return null\n }\n\n const wrapper = container.append('div')\n const svg = wrapper.append('svg')\n\n const containerNode = container.node() as HTMLElement\n let boundingRect = containerNode.getBoundingClientRect()\n let width = boundingRect.width\n let height = boundingRect.height\n let currentConfig = mergeConfig({ ...defaultConfig }, initialOptions.config)\n let currentData = initialOptions.data\n\n const handleResize = () => {\n boundingRect = containerNode.getBoundingClientRect()\n width = boundingRect.width\n height = boundingRect.height\n render({ data: currentData, config: currentConfig })\n }\n\n window.addEventListener('resize', handleResize)\n\n const render = (options: RenderLineChartOptions, isUpdate = false) => {\n if (isUpdate && options.config) {\n currentConfig = mergeConfig(currentConfig, options.config)\n }\n if (isUpdate && options.data) {\n currentData = options.data\n }\n\n const data: ParsedDataPoint[] = currentData\n .map((d) => ({ date: new Date(d.date), value: d.value }))\n .sort((a, b) => a.date.getTime() - b.date.getTime())\n\n const x = createXScale(data, currentConfig, width)\n const y = createYScale(data, currentConfig, height)\n\n wrapper.attr('class', `sc-charts sc-charts__${currentConfig.theme}`)\n svg\n .attr('preserveAspectRatio', 'xMinYMin meet')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .style('width', '100%')\n .style('height', '100%')\n .selectAll('*')\n .remove()\n\n const preContext: Omit<ChartContext, 'elements'> = {\n chartId: initialOptions.chartId,\n svg,\n wrapperNode: wrapper.node()!,\n data,\n x,\n y,\n config: currentConfig,\n action: 'none',\n width,\n height,\n }\n\n createAxes(preContext)\n\n const context: ChartContext = {\n ...preContext,\n elements: createElements(preContext),\n }\n setupInteractions(context)\n }\n\n render(initialOptions)\n\n return {\n update: (options: RenderLineChartOptions) => render(options, true),\n destroy: () => {\n window.removeEventListener('resize', handleResize)\n svg.remove()\n },\n }\n}\n"],"names":["renderYAxis","context","svg","config","y","width","margin","yAxis","customTicks","tickFormat","tickValues","ticks","isShow","g","axis","d3","d","num","sign","formatted","renderXAxis","x","height","xAxis","renderHorizontalStyles","horizontalStyle","line","tick","renderVerticalStyles","verticalStyle","renderGrid","createAxes","logo","createGradient","defs","gradientId","options","gradient","offset","stopColor","getDefs","defsSelection","getBelowZeroClip","ctx","clipHeight","mergeConfig","base","patch","renderBorderRangeLine","parent","createBorderGradient","mainColor","baseClassName","item","action","mod","x1","x2","y1","y2","hidden","renderCirclePoint","cx","cy","fill","renderHoverLine","BASE_CLASSNAME","timeFormat","sumFormat","sum","fmt","icon","createTooltipElements","container","tooltip","wrapper","sumWrapper","iconNode","sumNode","timeNode","renderRangeTooltip","leftPoint","rightPoint","closest","delta","sumFormatter","timeFormatter","selectionCenter","direction","valueText","dateText","percent","tooltipRect","containerRect","leftX","rightX","tooltipX","minX","maxX","TOOLTIP_OFFSET_PX","defaultTimeFormatter","defaultSumFormatter","calcTooltipPosition","tooltipDimensions","initX","renderHoverTooltip","dataItem","defaultConfig","curveFunction","renderMainLineArea","data","svgNode","areaGen","renderRangeLineArea","chartId","initClip","clipId","clipRect","clip","renderDataLine","id","lineGen","renderHighlightLine","createElements","mainLine","mainLineArea","hoverLine","highlightLine","belowZeroLine","hoverCircle","rangeBorderLeft","rangeBorderRight","rangeLine","rangeCircleLeft","rangeCircleRight","rangeTooltip","hoverTooltip","rangeLineArea","getClipForRange","hoverRange","closestDate","match","amountStr","unit","amount","domainStart","domainEnd","cursor","next","xStart","xEnd","prev","renderHoverItems","elements","baseClip","_a","hideHoverItems","controlIsGrowingClasses","isGrowing","name","renderSelectionItems","startPoint","xLeft","xRight","selectionWidth","hideSelectionItems","setupInteractions","hover","selection","isDragging","findClosest","mouseX","a","b","event","createXScale","scale","xExtent","createYScale","yMax","yMin","createLineChart","selector","initialOptions","containerNode","boundingRect","currentConfig","currentData","handleResize","render","isUpdate","preContext"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "charts-core",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -33,6 +33,7 @@
33
33
  "typescript": "~5.7.2",
34
34
  "vite": "^6.2.0",
35
35
  "vue": "^3.5.13",
36
+ "vue-router": "^4.5.1",
36
37
  "vue-tsc": "^2.2.8"
37
38
  },
38
39
  "dependencies": {