{"version":3,"file":"index.d.ts","sources":["../src/model/interfaces.ts","../src/elements/ArcSlice.ts","../src/model/layout.ts","../src/data.ts","../src/controllers/VennDiagramController.ts","../src/controllers/EulerDiagramController.ts"],"sourcesContent":["export interface ITextLocation {\n  text: { x: number; y: number };\n}\n\nexport interface ICircle {\n  r: number;\n  cx: number;\n  cy: number;\n}\nexport interface IEllipse {\n  rx: number;\n  ry: number;\n  rotation: number;\n  cx: number;\n  cy: number;\n}\n\nexport interface ITextCircle extends ICircle, ITextLocation {\n  align: 'start' | 'end' | 'middle';\n  verticalAlign: 'top' | 'bottom';\n}\nexport interface ITextEllipse extends IEllipse, ITextLocation {\n  align: 'start' | 'end' | 'middle';\n  verticalAlign: 'top' | 'bottom';\n}\n\n// could be slice\nexport interface IArc {\n  x2: number;\n  y2: number;\n  sweep: boolean;\n  large: boolean;\n\n  ref: number;\n  mode: 'i' | 'o';\n}\n\nexport interface IArcSlice {\n  sets: readonly number[];\n  x1: number;\n  y1: number;\n  arcs: readonly IArc[];\n  path?: string;\n}\n\nexport interface ITextArcSlice extends IArcSlice, ITextLocation {}\n\nexport interface IVennDiagramLayout {\n  sets: (ITextCircle | ITextEllipse)[];\n  intersections: ITextArcSlice[];\n}\n\nexport function isEllipse(d: ICircle | IEllipse): d is IEllipse {\n  return typeof (d as IEllipse).rx === 'number';\n}\n\nexport interface IBoundingBox {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n","import {\n  Element,\n  BarElement,\n  VisualElement,\n  CommonElementOptions,\n  ScriptableAndArrayOptions,\n  ChartType,\n  CommonHoverOptions,\n  ScriptableContext,\n} from 'chart.js';\nimport { ITextArcSlice, ICircle, IEllipse, isEllipse } from '../model/interfaces';\nimport generateArcSlicePath from '../model/generateArcSlicePath';\nimport { dist, DEG2RAD } from '../model/math';\n\nexport interface IArcSliceOptions extends CommonElementOptions, Record<string, unknown> {}\n\nexport interface IArcSliceProps extends ITextArcSlice {\n  refs: (ICircle | IEllipse)[];\n}\n\nexport class ArcSlice extends Element<IArcSliceProps, IArcSliceOptions> implements VisualElement {\n  static readonly id = 'arcSlice';\n\n  /**\n   * @hidden\n   */\n  static readonly defaults = /* #__PURE__ */ { ...BarElement.defaults, backgroundColor: '#efefef' };\n\n  /**\n   * @hidden\n   */\n  static readonly defaultRoutes = /* #__PURE__ */ {\n    borderColor: 'borderColor',\n  };\n\n  /**\n   * @hidden\n   */\n  inRange(mouseX: number, mouseY: number): boolean {\n    const props = this.getProps(['arcs', 'refs', 'sets']);\n\n    const usedSets = new Set(props.sets);\n\n    function checkRef(p: { cx: number; cy: number }, ref: IEllipse | ICircle, inside: boolean) {\n      if (isEllipse(ref)) {\n        // (x−a)2 + (y−b)2 = r2\n        const a = ref.rotation * DEG2RAD;\n        const x = p.cx - ref.cx;\n        const y = p.cy - ref.cy;\n        const d =\n          (x * Math.cos(a) + y * Math.sin(a)) ** 2 / ref.rx ** 2 +\n          (x * Math.sin(a) - y * Math.cos(a)) ** 2 / ref.ry ** 2;\n        if ((inside && d > 1) || (!inside && d < 1)) {\n          return false;\n        }\n      } else {\n        // (x−a)2 + (y−b)2 = r2\n        const d = dist(p, ref);\n        if ((inside && d > ref.r) || (!inside && d < ref.r)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    for (const arc of props.arcs ?? []) {\n      const ref = props.refs[arc.ref];\n      const p = {\n        cx: Number.isNaN(mouseX) ? ref.cx : mouseX,\n        cy: Number.isNaN(mouseY) ? ref.cy : mouseY,\n      };\n\n      usedSets.delete(arc.ref);\n\n      if (!checkRef(p, ref, arc.mode === 'i')) {\n        return false;\n      }\n    }\n\n    const remaining = Array.from(usedSets);\n    for (let i = 0; i < remaining.length; i += 1) {\n      const ref = props.refs[remaining[i]];\n      const p = {\n        cx: Number.isNaN(mouseX) ? ref.cx : mouseX,\n        cy: Number.isNaN(mouseY) ? ref.cy : mouseY,\n      };\n\n      if (!checkRef(p, ref, true)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * @hidden\n   */\n  inXRange(mouseX: number): boolean {\n    return this.inRange(mouseX, Number.NaN);\n  }\n\n  /**\n   * @hidden\n   */\n  inYRange(mouseY: number): boolean {\n    return this.inRange(Number.NaN, mouseY);\n  }\n\n  /**\n   * @hidden\n   */\n  getCenterPoint(): { x: number; y: number } {\n    const arc = this.getProps(['text']);\n    return arc.text;\n  }\n\n  /**\n   * @hidden\n   */\n  tooltipPosition(): { x: number; y: number } {\n    return this.getCenterPoint();\n  }\n\n  /**\n   * @hidden\n   */\n\n  hasValue(): boolean {\n    return true;\n  }\n\n  /**\n   * @hidden\n   */\n  draw(ctx: CanvasRenderingContext2D): void {\n    ctx.save();\n    const options = this.options as unknown as IArcSliceOptions;\n    const props = this.getProps(['x1', 'y1', 'arcs', 'refs']);\n\n    ctx.beginPath();\n    let path: Path2D | undefined;\n    if (window.Path2D) {\n      path = new Path2D(generateArcSlicePath(props, props.refs));\n    } else {\n      // try old school\n      // M ${s.x1 - p},${s.y1 - p} ${s.arcs\n      //   .map((arc) => {\n      //     return `A ${rx - p} ${ry - p} ${rot} ${arc.large ? 1 : 0} ${arc.sweep ? 1 : 0} ${arc.x2 - p} ${arc.y2 - p}`;\n      //   }\n      ctx.beginPath();\n      ctx.moveTo(props.x1, props.y1);\n      for (const arc of props.arcs) {\n        const ref = props.refs[arc.ref];\n        const rx = isEllipse(ref) ? ref.rx : ref.r;\n        const ry = isEllipse(ref) ? ref.ry : ref.r;\n        const rot = isEllipse(ref) ? ref.rotation : 0;\n        // no proper angle rotation\n        ctx.ellipse(ref.cx, ref.cy, rx, ry, rot, 0, Math.PI * 2, !arc.sweep);\n      }\n      ctx.closePath();\n    }\n\n    if (options.backgroundColor) {\n      ctx.fillStyle = options.backgroundColor;\n      if (path) {\n        ctx.fill(path);\n      } else {\n        ctx.fill();\n      }\n    }\n    if (options.borderColor) {\n      ctx.strokeStyle = options.borderColor;\n      ctx.lineWidth = options.borderWidth;\n      if (path) {\n        ctx.stroke(path);\n      } else {\n        ctx.stroke();\n      }\n    }\n\n    ctx.restore();\n  }\n}\n\ndeclare module 'chart.js' {\n  export interface ElementOptionsByType<TType extends ChartType> {\n    arcSlice: ScriptableAndArrayOptions<IArcSliceOptions & CommonHoverOptions, ScriptableContext<TType>>;\n  }\n}\n","import venn0 from './data/venn0.json';\nimport venn1 from './data/venn1.json';\nimport venn2 from './data/venn2.json';\nimport venn3 from './data/venn3.json';\nimport venn4 from './data/venn4.json';\nimport venn5 from './data/venn5.json';\nimport { ITextEllipse, ITextArcSlice, ITextCircle, isEllipse, IBoundingBox } from './interfaces';\n\n// could be slice of three\n\nexport interface IVennDiagramLayout {\n  sets: (ITextCircle | ITextEllipse)[];\n  intersections: ITextArcSlice[];\n}\n\ninterface ILayout {\n  sets: (ITextCircle | ITextEllipse)[];\n  intersections: ITextArcSlice[];\n  bb: IBoundingBox;\n}\n\nexport default function layout(sets: number, bb: IBoundingBox): IVennDiagramLayout {\n  const lookup = [venn0, venn1, venn2, venn3, venn4, venn5];\n  const r = lookup[Math.min(lookup.length - 1, sets)] as ILayout;\n  const f = Math.min(bb.width / r.bb.width, bb.height / r.bb.height);\n  const x = f * -r.bb.x + (bb.width - f * r.bb.width) / 2 + bb.x;\n  const y = f * -r.bb.y + (bb.height - f * r.bb.height) / 2 + bb.y;\n  const mx = (v: number) => x + f * v;\n  const my = (v: number) => y + f * v;\n\n  return {\n    sets: r.sets.map((c) => ({\n      ...c,\n      cx: mx(c.cx),\n      cy: my(c.cy),\n      text: {\n        x: mx(c.text.x),\n        y: my(c.text.y),\n      },\n      ...(isEllipse(c)\n        ? {\n            rx: c.rx * f,\n            ry: c.ry * f,\n          }\n        : {\n            r: c.r * f,\n          }),\n    })),\n    intersections: r.intersections.map((c) => ({\n      text: {\n        x: mx(c.text.x),\n        y: my(c.text.y),\n      },\n      x1: mx(c.x1),\n      y1: my(c.y1),\n      sets: c.sets,\n      arcs: c.arcs.map((a) => ({ ...a, x2: mx(a.x2), y2: my(a.y2) })),\n    })),\n  };\n}\n","export interface IGenerateOptions {\n  label?: string;\n}\n\nexport interface IRawSet<T> {\n  label: string;\n  values: readonly T[];\n}\n\nexport interface ISet<T> {\n  label: string;\n  sets: readonly string[];\n  value: number;\n  values: readonly T[];\n  degree: number;\n}\n\nfunction generateSubset<T>(\n  members: IRawSet<T>[],\n  notMembers: IRawSet<T>[],\n  lookup: ReadonlyMap<IRawSet<T>, Set<T>>\n): ISet<T> {\n  const sets = members.map((s) => s.label);\n  const label = sets.join(' ∩ ');\n  const others = members.slice(1).map((s) => lookup.get(s));\n  const not = notMembers.map((s) => lookup.get(s));\n  const values: T[] = members[0].values.filter(\n    (v) => others.every((o) => o != null && o.has(v)) && not.every((o) => o != null && !o.has(v))\n  );\n\n  return {\n    sets,\n    label,\n    value: values.length,\n    values,\n    degree: sets.length,\n  };\n}\n\nexport function extractSets<T>(\n  data: readonly IRawSet<T>[],\n  options: IGenerateOptions = {}\n): { labels: string[]; datasets: [{ label: string; data: ISet<T>[] }] } {\n  const sets: ISet<T>[] = [];\n  const lookup = new Map(data.map((s) => [s, new Set(s.values)]));\n  const base = data.slice(0, 5);\n  switch (base.length) {\n    case 1:\n      sets.push(generateSubset([base[0]], [], lookup));\n      break;\n    case 2:\n      sets.push(\n        generateSubset([base[0]], [base[1]], lookup),\n        generateSubset([base[1]], [base[0]], lookup),\n        generateSubset([base[0], base[1]], [], lookup)\n      );\n      break;\n    case 3:\n      sets.push(\n        generateSubset([base[0]], [base[1], base[2]], lookup),\n        generateSubset([base[1]], [base[0], base[2]], lookup),\n        generateSubset([base[2]], [base[0], base[1]], lookup),\n        generateSubset([base[0], base[1]], [base[2]], lookup),\n        generateSubset([base[0], base[2]], [base[1]], lookup),\n        generateSubset([base[1], base[2]], [base[0]], lookup),\n        generateSubset([base[0], base[1], base[2]], [], lookup)\n      );\n      break;\n    case 4:\n      sets.push(\n        generateSubset([base[0]], [base[1], base[2], base[3]], lookup),\n        generateSubset([base[1]], [base[0], base[2], base[3]], lookup),\n        generateSubset([base[2]], [base[0], base[1], base[3]], lookup),\n        generateSubset([base[3]], [base[0], base[1], base[2]], lookup),\n        generateSubset([base[0], base[1]], [base[2], base[3]], lookup),\n        generateSubset([base[0], base[2]], [base[1], base[3]], lookup),\n        generateSubset([base[0], base[3]], [base[1], base[2]], lookup),\n        generateSubset([base[1], base[2]], [base[0], base[3]], lookup),\n        generateSubset([base[1], base[3]], [base[0], base[2]], lookup),\n        generateSubset([base[2], base[3]], [base[0], base[1]], lookup),\n        generateSubset([base[0], base[1], base[2]], [base[3]], lookup),\n        generateSubset([base[0], base[1], base[3]], [base[2]], lookup),\n        generateSubset([base[0], base[2], base[3]], [base[1]], lookup),\n        generateSubset([base[1], base[2], base[3]], [base[0]], lookup),\n        generateSubset([base[0], base[1], base[2], base[3]], [], lookup)\n      );\n      break;\n    case 5:\n      sets.push(\n        generateSubset([base[0]], [base[1], base[2], base[3], base[4]], lookup),\n        generateSubset([base[1]], [base[0], base[2], base[3], base[4]], lookup),\n        generateSubset([base[2]], [base[0], base[1], base[3], base[4]], lookup),\n        generateSubset([base[3]], [base[0], base[1], base[2], base[4]], lookup),\n        generateSubset([base[4]], [base[0], base[1], base[2], base[3]], lookup),\n\n        generateSubset([base[0], base[1]], [base[2], base[3], base[4]], lookup),\n        generateSubset([base[0], base[2]], [base[1], base[3], base[4]], lookup),\n        generateSubset([base[0], base[3]], [base[1], base[2], base[4]], lookup),\n        generateSubset([base[0], base[4]], [base[1], base[2], base[3]], lookup),\n        generateSubset([base[1], base[2]], [base[0], base[3], base[4]], lookup),\n        generateSubset([base[1], base[3]], [base[0], base[2], base[4]], lookup),\n        generateSubset([base[1], base[4]], [base[0], base[2], base[3]], lookup),\n        generateSubset([base[2], base[3]], [base[0], base[1], base[4]], lookup),\n        generateSubset([base[2], base[4]], [base[0], base[1], base[3]], lookup),\n        generateSubset([base[3], base[4]], [base[0], base[1], base[2]], lookup),\n\n        generateSubset([base[0], base[1], base[2]], [base[3], base[4]], lookup),\n        generateSubset([base[0], base[1], base[3]], [base[2], base[4]], lookup),\n        generateSubset([base[0], base[1], base[4]], [base[2], base[3]], lookup),\n        generateSubset([base[0], base[2], base[3]], [base[1], base[4]], lookup),\n        generateSubset([base[0], base[2], base[4]], [base[1], base[3]], lookup),\n        generateSubset([base[0], base[3], base[4]], [base[1], base[2]], lookup),\n        generateSubset([base[1], base[2], base[3]], [base[0], base[4]], lookup),\n        generateSubset([base[1], base[2], base[4]], [base[0], base[3]], lookup),\n        generateSubset([base[1], base[3], base[4]], [base[0], base[2]], lookup),\n        generateSubset([base[2], base[3], base[4]], [base[0], base[1]], lookup),\n\n        generateSubset([base[0], base[1], base[2], base[3]], [base[4]], lookup),\n        generateSubset([base[0], base[1], base[2], base[4]], [base[3]], lookup),\n        generateSubset([base[0], base[1], base[3], base[4]], [base[2]], lookup),\n        generateSubset([base[0], base[2], base[3], base[4]], [base[1]], lookup),\n        generateSubset([base[1], base[2], base[3], base[4]], [base[0]], lookup),\n\n        generateSubset([base[0], base[1], base[2], base[3], base[4]], [], lookup)\n      );\n      break;\n  }\n  return {\n    labels: sets.map((s) => s.label),\n    datasets: [\n      {\n        label: options.label || 'Venn Diagram',\n        data: sets,\n      },\n    ],\n  };\n}\n","import {\n  Chart,\n  DatasetController,\n  TooltipItem,\n  UpdateMode,\n  ChartItem,\n  ScriptableAndArrayOptions,\n  ControllerDatasetOptions,\n  CommonHoverOptions,\n  ChartConfiguration,\n  LinearScale,\n  ScriptableContext,\n  Scale,\n  CoreChartOptions,\n  CartesianScaleTypeRegistry,\n} from 'chart.js';\nimport { ArcSlice, IArcSliceOptions } from '../elements';\nimport layout, { IVennDiagramLayout } from '../model/layout';\nimport type { IArcSlice, IBoundingBox, ICircle, IEllipse } from '../model/interfaces';\nimport patchController from './patchController';\nimport type { ISet } from '../data';\n\nexport class VennDiagramController extends DatasetController<'venn', ArcSlice> {\n  static readonly id: string = 'venn';\n\n  /**\n   * @hidden\n   */\n  static readonly defaults = {\n    dataElementType: ArcSlice.id,\n  };\n\n  /**\n   * @hidden\n   */\n  static readonly overrides: any = {\n    plugins: {\n      tooltip: {\n        callbacks: {\n          title() {\n            // Title doesn't make sense for scatter since we format the data as a point\n            return '';\n          },\n          label(item: TooltipItem<'venn'>) {\n            const labels = item.chart.data.labels as string[];\n            const d = item.chart.data.datasets?.[item.datasetIndex].data?.[item.dataIndex] as any;\n            return `${labels[item.dataIndex]}: ${d ? d.values || d.value.toLocaleString() : ''}`;\n          },\n        },\n      },\n    },\n    scales: {\n      x: {\n        type: 'linear',\n        min: -1,\n        max: 1,\n        display: false,\n        ticks: {\n          callback: String,\n        },\n      },\n      y: {\n        type: 'linear',\n        min: -1,\n        max: 1,\n        display: false,\n        ticks: {\n          callback: String,\n        },\n      },\n    },\n  };\n\n  /**\n   * @hidden\n   */\n  initialize(): void {\n    super.initialize();\n    this.enableOptionSharing = true;\n  }\n\n  /**\n   * @hidden\n   */\n  update(mode: UpdateMode): void {\n    super.update(mode);\n    const meta = this._cachedMeta;\n    const slices = (meta.data || []) as unknown as ArcSlice[];\n    this.updateElements(slices, 0, slices.length, mode);\n  }\n\n  protected computeLayout(size: IBoundingBox): IVennDiagramLayout {\n    const nSets = Math.log2(this._cachedMeta.data.length + 1);\n    return layout(nSets, size);\n  }\n\n  /**\n   * @hidden\n   */\n  updateElements(slices: ArcSlice[], start: number, count: number, mode: UpdateMode): void {\n    const xScale = this._cachedMeta.xScale as Scale & { left: number; right: number };\n    const yScale = this._cachedMeta.yScale as Scale & { top: number; bottom: number };\n\n    const w = xScale.right - xScale.left;\n    const h = yScale.bottom - yScale.top;\n\n    const l = this.computeLayout({\n      x: xScale.left,\n      y: yScale.top,\n      width: w,\n      height: h,\n    });\n    (this._cachedMeta as any)._layout = l;\n    (this._cachedMeta as any)._setLayoutFont = {\n      ...(xScale as any)._resolveTickFontOptions(0),\n      color: (xScale as any).options.ticks.color,\n    };\n    (this._cachedMeta as any)._labelLayoutFont = {\n      ...(yScale as any)._resolveTickFontOptions(0),\n      color: (yScale as any).options.ticks.color,\n    };\n\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts) as any;\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n\n    for (let i = start; i < start + count; i += 1) {\n      const slice = slices[i];\n      const properties: IArcSlice & { options?: IArcSliceOptions; refs: (ICircle | IEllipse)[] } = {\n        refs: l.sets,\n        ...l.intersections[i],\n      };\n      if (includeOptions) {\n        properties.options = sharedOptions || (this.resolveDataElementOptions(i, mode) as unknown as IArcSliceOptions);\n      }\n      this.updateElement(slice, i, properties as any, mode);\n    }\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n\n  /**\n   * @hidden\n   */\n  draw(): void {\n    const meta = this._cachedMeta;\n    const elements = meta.data;\n\n    const { ctx } = this.chart;\n    elements.forEach((elem) => elem.draw(ctx));\n\n    this.drawLabels(ctx);\n  }\n\n  private drawLabels(ctx: CanvasRenderingContext2D): void {\n    const meta = this._cachedMeta;\n\n    ctx.save();\n\n    const l = (meta as any)._layout as IVennDiagramLayout;\n    const setLayoutScale = meta.xScale as LinearScale;\n    const setLayoutFont = (meta as any)._setLayoutFont;\n    const labelLayoutScale = meta.yScale as LinearScale;\n    const labelLayoutFont = (meta as any)._labelLayoutFont;\n\n    if (labelLayoutScale?.options.ticks.display) {\n      // set labels\n      ctx.font = labelLayoutFont.string;\n      ctx.fillStyle = labelLayoutFont.color;\n      ctx.textBaseline = 'middle';\n\n      const labels = this.chart.data.labels as string[];\n      const cb = labelLayoutScale?.options.ticks.callback;\n      l.sets.forEach((set, i) => {\n        ctx.textAlign = set.align === 'middle' ? 'center' : (set.align ?? 'start');\n        ctx.textBaseline = set.verticalAlign ?? 'alphabetic';\n        const l = String(cb ? cb.call(labelLayoutScale, labels[i], i, []) : labels[i]);\n        ctx.fillText(l, set.text.x, set.text.y);\n      });\n    }\n\n    if (setLayoutScale?.options.ticks.display) {\n      ctx.font = setLayoutFont.string;\n      ctx.fillStyle = setLayoutFont.color;\n      ctx.textBaseline = 'middle';\n      ctx.textAlign = 'center';\n      ctx.textBaseline = 'middle';\n\n      const values = (this.getDataset() as any).data as { value: number }[];\n      const cb = setLayoutScale?.options.ticks.callback;\n      l.intersections.forEach((intersection, i) => {\n        const l = String(cb ? cb.call(setLayoutScale, values[i].value, i, []) : values[i].value.toLocaleString());\n        ctx.fillText(l, intersection.text.x, intersection.text.y);\n      });\n    }\n\n    ctx.restore();\n  }\n}\n\nexport interface IVennDiagramControllerDatasetOptions\n  extends ControllerDatasetOptions,\n    ScriptableAndArrayOptions<IArcSliceOptions, ScriptableContext<'venn'>>,\n    ScriptableAndArrayOptions<CommonHoverOptions, ScriptableContext<'venn'>> {}\n\ndeclare module 'chart.js' {\n  interface ChartTypeRegistry {\n    venn: {\n      chartOptions: CoreChartOptions<'venn'>;\n      datasetOptions: IVennDiagramControllerDatasetOptions;\n      defaultDataPoint: number | ISet<number>;\n      metaExtensions: Record<string, never>;\n      parsedDataType: { x: number; y: number };\n      scales: keyof CartesianScaleTypeRegistry;\n    };\n  }\n}\n\nexport class VennDiagramChart<DATA extends unknown[] = number[], LABEL = string> extends Chart<'venn', DATA, LABEL> {\n  static id = VennDiagramController.id as 'venn';\n\n  constructor(item: ChartItem, config: Omit<ChartConfiguration<'venn', DATA, LABEL>, 'type'>) {\n    super(item, patchController('venn', config, VennDiagramController, ArcSlice, [LinearScale]));\n  }\n}\n","import { CartesianScaleTypeRegistry, Chart, ChartConfiguration, ChartItem, CoreChartOptions } from 'chart.js';\nimport type { IVennDiagramLayout } from '../model/layout';\nimport { VennDiagramController, IVennDiagramControllerDatasetOptions } from './VennDiagramController';\nimport euler from '../model/euler';\nimport type { IBoundingBox } from '../model/interfaces';\nimport patchController from './patchController';\nimport { ArcSlice } from '../elements';\nimport type { ISet } from '../data';\n\nexport class EulerDiagramController extends VennDiagramController {\n  static readonly id = 'euler';\n\n  /**\n   * @hidden\n   */\n  static readonly defaults = VennDiagramController.defaults;\n\n  protected computeLayout(size: IBoundingBox): IVennDiagramLayout {\n    const sets = (this as any)._data as readonly { sets: readonly string[]; value: number }[];\n    return euler(sets, size);\n  }\n}\n\nexport type IEulerDiagramControllerDatasetOptions = IVennDiagramControllerDatasetOptions;\n\ndeclare module 'chart.js' {\n  interface ChartTypeRegistry {\n    euler: {\n      chartOptions: CoreChartOptions<'euler'>;\n      datasetOptions: IEulerDiagramControllerDatasetOptions;\n      defaultDataPoint: number | ISet<number>;\n      metaExtensions: Record<string, never>;\n      parsedDataType: { x: number; y: number };\n      scales: keyof CartesianScaleTypeRegistry;\n    };\n  }\n}\n\nexport class EulerDiagramChart<DATA extends unknown[] = number[], LABEL = string> extends Chart<'euler', DATA, LABEL> {\n  static id = EulerDiagramController.id;\n\n  constructor(item: ChartItem, config: Omit<ChartConfiguration<'euler', DATA, LABEL>, 'type'>) {\n    super(item, patchController('euler', config, EulerDiagramController, ArcSlice));\n  }\n}\n"],"names":[],"mappings":";;;;;;;;;AAAO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AAEO;AACP;AACA;AACA;AACA;AACA;;ACnDO;AACP;AACO;AACP;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCO;AACP;AACA;AACA;;ACJO;AACP;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;ACfO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;ACjCO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;"}