@voila.dev/chart 4.0.107 → 4.0.109
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas/paint-scene.d.ts.map +1 -1
- package/dist/canvas/paint-scene.js +31 -1
- package/dist/canvas/paint-scene.js.map +2 -2
- package/dist/core/marks/area.d.ts.map +1 -1
- package/dist/core/marks/area.js +3 -2
- package/dist/core/marks/area.js.map +2 -2
- package/dist/core/marks/bar.d.ts +5 -0
- package/dist/core/marks/bar.d.ts.map +1 -1
- package/dist/core/marks/bar.js +19 -9
- package/dist/core/marks/bar.js.map +2 -2
- package/dist/core/marks/cell.d.ts.map +1 -1
- package/dist/core/marks/cell.js +2 -1
- package/dist/core/marks/cell.js.map +2 -2
- package/dist/core/marks/dot.d.ts.map +1 -1
- package/dist/core/marks/dot.js +2 -1
- package/dist/core/marks/dot.js.map +2 -2
- package/dist/core/marks/funnel.d.ts.map +1 -1
- package/dist/core/marks/funnel.js +3 -2
- package/dist/core/marks/funnel.js.map +2 -2
- package/dist/core/marks/line.d.ts.map +1 -1
- package/dist/core/marks/line.js +2 -1
- package/dist/core/marks/line.js.map +2 -2
- package/dist/core/marks/polar.d.ts.map +1 -1
- package/dist/core/marks/polar.js +5 -4
- package/dist/core/marks/polar.js.map +2 -2
- package/dist/core/marks/rect.d.ts.map +1 -1
- package/dist/core/marks/rect.js +2 -1
- package/dist/core/marks/rect.js.map +2 -2
- package/dist/core/marks/rule.d.ts +5 -0
- package/dist/core/marks/rule.d.ts.map +1 -1
- package/dist/core/marks/rule.js +15 -1
- package/dist/core/marks/rule.js.map +2 -2
- package/dist/core/marks/shared.d.ts +8 -2
- package/dist/core/marks/shared.d.ts.map +1 -1
- package/dist/core/marks/shared.js +4 -0
- package/dist/core/marks/shared.js.map +2 -2
- package/dist/core/marks/stats/dodge.d.ts.map +1 -1
- package/dist/core/marks/stats/dodge.js +2 -1
- package/dist/core/marks/stats/dodge.js.map +2 -2
- package/dist/core/marks/stats/histogram.d.ts.map +1 -1
- package/dist/core/marks/stats/histogram.js +2 -1
- package/dist/core/marks/stats/histogram.js.map +2 -2
- package/dist/core/marks/stats/waffle.d.ts.map +1 -1
- package/dist/core/marks/stats/waffle.js +3 -2
- package/dist/core/marks/stats/waffle.js.map +2 -2
- package/dist/core/scales/resolve.d.ts.map +1 -1
- package/dist/core/scales/resolve.js +6 -1
- package/dist/core/scales/resolve.js.map +2 -2
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/react/chart-placeholders.d.ts +13 -0
- package/dist/react/chart-placeholders.d.ts.map +1 -0
- package/dist/react/chart-placeholders.js +77 -0
- package/dist/react/chart-placeholders.js.map +7 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +2 -2
- package/dist/react/svg-scene.d.ts +1 -1
- package/dist/react/svg-scene.d.ts.map +1 -1
- package/dist/react/svg-scene.js +53 -10
- package/dist/react/svg-scene.js.map +2 -2
- package/package.json +1 -1
- package/src/canvas/paint-scene.ts +45 -1
- package/src/core/marks/area.ts +2 -1
- package/src/core/marks/bar.ts +25 -8
- package/src/core/marks/cell.ts +2 -1
- package/src/core/marks/dot.ts +2 -1
- package/src/core/marks/funnel.ts +2 -1
- package/src/core/marks/line.ts +2 -1
- package/src/core/marks/polar.ts +4 -3
- package/src/core/marks/rect.ts +2 -1
- package/src/core/marks/rule.ts +26 -1
- package/src/core/marks/shared.ts +15 -2
- package/src/core/marks/stats/dodge.ts +2 -1
- package/src/core/marks/stats/histogram.ts +2 -1
- package/src/core/marks/stats/waffle.ts +2 -1
- package/src/core/scales/resolve.ts +11 -1
- package/src/core/types.ts +2 -0
- package/src/react/chart-placeholders.tsx +93 -0
- package/src/react/index.ts +1 -0
- package/src/react/svg-scene.tsx +72 -11
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/core/marks/stats/histogram.ts"],
|
|
4
|
-
"sourcesContent": ["import { isPlaceable, numericValue, readChannel } from \"#/core/channel.ts\";\nimport { rectY } from \"#/core/marks/rect.ts\";\nimport type { ChartMarkOptions } from \"#/core/marks/shared.ts\";\nimport { tickStep } from \"#/core/ticks.ts\";\nimport type { ChartAccessor, ChartMark, ChartValue } from \"#/core/types.ts\";\n\nexport interface HistogramOptions<TDatum> extends ChartMarkOptions<TDatum> {\n\treadonly x: ChartAccessor<TDatum, ChartValue>;\n\t/** About how many bins: the edges land on round numbers, so the count is approximate. */\n\treadonly bins?: number;\n\treadonly fill?: string;\n\t/** Each bin's share of the total instead of its count. */\n\treadonly normalize?: boolean;\n}\n\nexport interface Bin {\n\treadonly x1: number;\n\treadonly x2: number;\n\treadonly count: number;\n\treadonly series?: ChartValue;\n}\n\n/** Round-edged bins over the values' extent, every value in exactly one. */\nexport function binValues(\n\tvalues: ReadonlyArray<number>,\n\ttarget: number,\n): ReadonlyArray<{ x1: number; x2: number }> {\n\tconst finite = values.filter(Number.isFinite);\n\tif (finite.length === 0) {\n\t\treturn [];\n\t}\n\tconst low = Math.min(...finite);\n\tconst high = Math.max(...finite);\n\tconst step = tickStep(low, high, target) || 1;\n\tconst first = Math.floor(low / step) * step;\n\tconst count = Math.max(\n\t\t1,\n\t\tMath.ceil((high - first) / step + (high === first ? 1 : 0)),\n\t);\n\treturn Array.from({ length: count }, (_unused, index) => ({\n\t\tx1: first + index * step,\n\t\tx2: first + (index + 1) * step,\n\t}));\n}\n\nconst DEFAULT_BINS = 20;\n\n/**\n * Counts per bin, as touching rectangles over a continuous x. With a color\n * channel the series stack inside each bin.\n */\nexport function histogram<TDatum>(\n\tdata: ReadonlyArray<TDatum>,\n\toptions: HistogramOptions<TDatum>,\n): ChartMark {\n\tconst xs = readChannel(data, options.x).map(numericValue);\n\tconst colors = readChannel(data, options.color);\n\tconst edges = binValues(\n\t\txs.filter((value): value is number => value !== undefined),\n\t\toptions.bins ?? DEFAULT_BINS,\n\t);\n\tconst seriesValues =\n\t\toptions.color === undefined\n\t\t\t? [undefined]\n\t\t\t: [\n\t\t\t\t\t...new Map(\n\t\t\t\t\t\tcolors.filter(isPlaceable).map((value) => [String(value), value]),\n\t\t\t\t\t).values(),\n\t\t\t\t];\n\tconst total = xs.filter((value) => value !== undefined).length || 1;\n\tconst bins: Bin[] = [];\n\tfor (const series of seriesValues) {\n\t\tfor (const [binIndex, edge] of edges.entries()) {\n\t\t\tconst last = binIndex === edges.length - 1;\n\t\t\tlet count = 0;\n\t\t\tfor (const [index, x] of xs.entries()) {\n\t\t\t\tconst inSeries =\n\t\t\t\t\tseries === undefined || String(colors[index]) === String(series);\n\t\t\t\tif (\n\t\t\t\t\tinSeries &&\n\t\t\t\t\tx !== undefined &&\n\t\t\t\t\tx >= edge.x1 &&\n\t\t\t\t\t(x < edge.x2 || (last && x <= edge.x2))\n\t\t\t\t) {\n\t\t\t\t\tcount += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbins.push({\n\t\t\t\t...edge,\n\t\t\t\tcount: options.normalize ? count / total : count,\n\t\t\t\tseries,\n\t\t\t});\n\t\t}\n\t}\n\treturn rectY(bins, {\n\t\tid: options.id,\n\t\tlabel: options.label,\n\t\ttip: options.tip,\n\t\topacity: options.opacity,\n\t\tfill: options.fill,\n\t\tx1: (bin) => bin.x1,\n\t\tx2: (bin) => bin.x2,\n\t\ty: (bin) => bin.count,\n\t\t...(options.color === undefined\n\t\t\t? {}\n\t\t\t: { color: (bin: Bin) => bin.series as ChartValue }),\n\t});\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,aAAa,cAAc,mBAAmB;AACvD,SAAS,aAAa;AAEtB,SAAS,gBAAgB;AAoBlB,SAAS,UACf,QACA,QAC4C;AAC5C,QAAM,SAAS,OAAO,OAAO,OAAO,QAAQ;AAC5C,MAAI,OAAO,WAAW,GAAG;AACxB,WAAO,CAAC;AAAA,EACT;AACA,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM;AAC/B,QAAM,OAAO,SAAS,KAAK,MAAM,MAAM,KAAK;AAC5C,QAAM,QAAQ,KAAK,MAAM,MAAM,IAAI,IAAI;AACvC,QAAM,QAAQ,KAAK;AAAA,IAClB;AAAA,IACA,KAAK,MAAM,OAAO,SAAS,QAAQ,SAAS,QAAQ,IAAI,EAAE;AAAA,EAC3D;AACA,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,SAAS,WAAW;AAAA,IACzD,IAAI,QAAQ,QAAQ;AAAA,IACpB,IAAI,SAAS,QAAQ,KAAK;AAAA,EAC3B,EAAE;AACH;AAEA,MAAM,eAAe;AAMd,SAAS,UACf,MACA,SACY;AACZ,QAAM,KAAK,YAAY,MAAM,QAAQ,CAAC,EAAE,IAAI,YAAY;AACxD,QAAM,SAAS,YAAY,MAAM,QAAQ,KAAK;AAC9C,QAAM,QAAQ;AAAA,IACb,GAAG,OAAO,CAAC,UAA2B,UAAU,MAAS;AAAA,IACzD,QAAQ,QAAQ;AAAA,EACjB;AACA,QAAM,eACL,QAAQ,UAAU,SACf,CAAC,MAAS,IACV;AAAA,IACA,GAAG,IAAI;AAAA,MACN,OAAO,OAAO,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,GAAG,KAAK,CAAC;AAAA,IACjE,EAAE,OAAO;AAAA,EACV;AACH,QAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,UAAU,MAAS,EAAE,UAAU;AAClE,QAAM,OAAc,CAAC;AACrB,aAAW,UAAU,cAAc;AAClC,eAAW,CAAC,UAAU,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC/C,YAAM,OAAO,aAAa,MAAM,SAAS;AACzC,UAAI,QAAQ;AACZ,iBAAW,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,GAAG;AACtC,cAAM,WACL,WAAW,UAAa,OAAO,OAAO,KAAK,CAAC,MAAM,OAAO,MAAM;AAChE,YACC,YACA,MAAM,UACN,KAAK,KAAK,OACT,IAAI,KAAK,MAAO,QAAQ,KAAK,KAAK,KAClC;AACD,mBAAS;AAAA,QACV;AAAA,MACD;AACA,WAAK,KAAK;AAAA,QACT,GAAG;AAAA,QACH,OAAO,QAAQ,YAAY,QAAQ,QAAQ;AAAA,QAC3C;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AACA,SAAO,MAAM,MAAM;AAAA,IAClB,IAAI,QAAQ;AAAA,IACZ,OAAO,QAAQ;AAAA,
|
|
4
|
+
"sourcesContent": ["import { isPlaceable, numericValue, readChannel } from \"#/core/channel.ts\";\nimport { rectY } from \"#/core/marks/rect.ts\";\nimport type { ChartMarkOptions } from \"#/core/marks/shared.ts\";\nimport { tickStep } from \"#/core/ticks.ts\";\nimport type { ChartAccessor, ChartMark, ChartValue } from \"#/core/types.ts\";\n\nexport interface HistogramOptions<TDatum> extends ChartMarkOptions<TDatum> {\n\treadonly x: ChartAccessor<TDatum, ChartValue>;\n\t/** About how many bins: the edges land on round numbers, so the count is approximate. */\n\treadonly bins?: number;\n\treadonly fill?: string;\n\t/** Each bin's share of the total instead of its count. */\n\treadonly normalize?: boolean;\n}\n\nexport interface Bin {\n\treadonly x1: number;\n\treadonly x2: number;\n\treadonly count: number;\n\treadonly series?: ChartValue;\n}\n\n/** Round-edged bins over the values' extent, every value in exactly one. */\nexport function binValues(\n\tvalues: ReadonlyArray<number>,\n\ttarget: number,\n): ReadonlyArray<{ x1: number; x2: number }> {\n\tconst finite = values.filter(Number.isFinite);\n\tif (finite.length === 0) {\n\t\treturn [];\n\t}\n\tconst low = Math.min(...finite);\n\tconst high = Math.max(...finite);\n\tconst step = tickStep(low, high, target) || 1;\n\tconst first = Math.floor(low / step) * step;\n\tconst count = Math.max(\n\t\t1,\n\t\tMath.ceil((high - first) / step + (high === first ? 1 : 0)),\n\t);\n\treturn Array.from({ length: count }, (_unused, index) => ({\n\t\tx1: first + index * step,\n\t\tx2: first + (index + 1) * step,\n\t}));\n}\n\nconst DEFAULT_BINS = 20;\n\n/**\n * Counts per bin, as touching rectangles over a continuous x. With a color\n * channel the series stack inside each bin.\n */\nexport function histogram<TDatum>(\n\tdata: ReadonlyArray<TDatum>,\n\toptions: HistogramOptions<TDatum>,\n): ChartMark {\n\tconst xs = readChannel(data, options.x).map(numericValue);\n\tconst colors = readChannel(data, options.color);\n\tconst edges = binValues(\n\t\txs.filter((value): value is number => value !== undefined),\n\t\toptions.bins ?? DEFAULT_BINS,\n\t);\n\tconst seriesValues =\n\t\toptions.color === undefined\n\t\t\t? [undefined]\n\t\t\t: [\n\t\t\t\t\t...new Map(\n\t\t\t\t\t\tcolors.filter(isPlaceable).map((value) => [String(value), value]),\n\t\t\t\t\t).values(),\n\t\t\t\t];\n\tconst total = xs.filter((value) => value !== undefined).length || 1;\n\tconst bins: Bin[] = [];\n\tfor (const series of seriesValues) {\n\t\tfor (const [binIndex, edge] of edges.entries()) {\n\t\t\tconst last = binIndex === edges.length - 1;\n\t\t\tlet count = 0;\n\t\t\tfor (const [index, x] of xs.entries()) {\n\t\t\t\tconst inSeries =\n\t\t\t\t\tseries === undefined || String(colors[index]) === String(series);\n\t\t\t\tif (\n\t\t\t\t\tinSeries &&\n\t\t\t\t\tx !== undefined &&\n\t\t\t\t\tx >= edge.x1 &&\n\t\t\t\t\t(x < edge.x2 || (last && x <= edge.x2))\n\t\t\t\t) {\n\t\t\t\t\tcount += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbins.push({\n\t\t\t\t...edge,\n\t\t\t\tcount: options.normalize ? count / total : count,\n\t\t\t\tseries,\n\t\t\t});\n\t\t}\n\t}\n\treturn rectY(bins, {\n\t\tid: options.id,\n\t\tlabel: options.label,\n\t\t// Bins are not the caller's data: only a plain on/off carries over.\n\t\ttip: typeof options.tip === \"function\" ? undefined : options.tip,\n\t\topacity: options.opacity,\n\t\tfill: options.fill,\n\t\tx1: (bin) => bin.x1,\n\t\tx2: (bin) => bin.x2,\n\t\ty: (bin) => bin.count,\n\t\t...(options.color === undefined\n\t\t\t? {}\n\t\t\t: { color: (bin: Bin) => bin.series as ChartValue }),\n\t});\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,aAAa,cAAc,mBAAmB;AACvD,SAAS,aAAa;AAEtB,SAAS,gBAAgB;AAoBlB,SAAS,UACf,QACA,QAC4C;AAC5C,QAAM,SAAS,OAAO,OAAO,OAAO,QAAQ;AAC5C,MAAI,OAAO,WAAW,GAAG;AACxB,WAAO,CAAC;AAAA,EACT;AACA,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM;AAC/B,QAAM,OAAO,SAAS,KAAK,MAAM,MAAM,KAAK;AAC5C,QAAM,QAAQ,KAAK,MAAM,MAAM,IAAI,IAAI;AACvC,QAAM,QAAQ,KAAK;AAAA,IAClB;AAAA,IACA,KAAK,MAAM,OAAO,SAAS,QAAQ,SAAS,QAAQ,IAAI,EAAE;AAAA,EAC3D;AACA,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,SAAS,WAAW;AAAA,IACzD,IAAI,QAAQ,QAAQ;AAAA,IACpB,IAAI,SAAS,QAAQ,KAAK;AAAA,EAC3B,EAAE;AACH;AAEA,MAAM,eAAe;AAMd,SAAS,UACf,MACA,SACY;AACZ,QAAM,KAAK,YAAY,MAAM,QAAQ,CAAC,EAAE,IAAI,YAAY;AACxD,QAAM,SAAS,YAAY,MAAM,QAAQ,KAAK;AAC9C,QAAM,QAAQ;AAAA,IACb,GAAG,OAAO,CAAC,UAA2B,UAAU,MAAS;AAAA,IACzD,QAAQ,QAAQ;AAAA,EACjB;AACA,QAAM,eACL,QAAQ,UAAU,SACf,CAAC,MAAS,IACV;AAAA,IACA,GAAG,IAAI;AAAA,MACN,OAAO,OAAO,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,GAAG,KAAK,CAAC;AAAA,IACjE,EAAE,OAAO;AAAA,EACV;AACH,QAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,UAAU,MAAS,EAAE,UAAU;AAClE,QAAM,OAAc,CAAC;AACrB,aAAW,UAAU,cAAc;AAClC,eAAW,CAAC,UAAU,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC/C,YAAM,OAAO,aAAa,MAAM,SAAS;AACzC,UAAI,QAAQ;AACZ,iBAAW,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,GAAG;AACtC,cAAM,WACL,WAAW,UAAa,OAAO,OAAO,KAAK,CAAC,MAAM,OAAO,MAAM;AAChE,YACC,YACA,MAAM,UACN,KAAK,KAAK,OACT,IAAI,KAAK,MAAO,QAAQ,KAAK,KAAK,KAClC;AACD,mBAAS;AAAA,QACV;AAAA,MACD;AACA,WAAK,KAAK;AAAA,QACT,GAAG;AAAA,QACH,OAAO,QAAQ,YAAY,QAAQ,QAAQ;AAAA,QAC3C;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AACA,SAAO,MAAM,MAAM;AAAA,IAClB,IAAI,QAAQ;AAAA,IACZ,OAAO,QAAQ;AAAA;AAAA,IAEf,KAAK,OAAO,QAAQ,QAAQ,aAAa,SAAY,QAAQ;AAAA,IAC7D,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,IAAI,CAAC,QAAQ,IAAI;AAAA,IACjB,IAAI,CAAC,QAAQ,IAAI;AAAA,IACjB,GAAG,CAAC,QAAQ,IAAI;AAAA,IAChB,GAAI,QAAQ,UAAU,SACnB,CAAC,IACD,EAAE,OAAO,CAAC,QAAa,IAAI,OAAqB;AAAA,EACpD,CAAC;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waffle.d.ts","sourceRoot":"","sources":["../../../../src/core/marks/stats/waffle.ts"],"names":[],"mappings":"AAMA,OAAO,EACN,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"waffle.d.ts","sourceRoot":"","sources":["../../../../src/core/marks/stats/waffle.ts"],"names":[],"mappings":"AAMA,OAAO,EACN,KAAK,gBAAgB,EAMrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EACX,aAAa,EACb,SAAS,EAET,UAAU,EAEV,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,aAAa,CAAC,MAAM,CAAE,SAAQ,gBAAgB,CAAC,MAAM,CAAC;IACtE,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9C,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9C,gCAAgC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAC7B,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,SAAS,CAiGX"}
|
|
@@ -8,7 +8,8 @@ import {
|
|
|
8
8
|
colorChannel,
|
|
9
9
|
markId,
|
|
10
10
|
paint,
|
|
11
|
-
seriesResolver
|
|
11
|
+
seriesResolver,
|
|
12
|
+
tips
|
|
12
13
|
} from "../shared.js";
|
|
13
14
|
import { categoryKey } from "../../scales/discrete.js";
|
|
14
15
|
const DEFAULT_COLUMNS = 10;
|
|
@@ -89,7 +90,7 @@ function waffleY(data, options) {
|
|
|
89
90
|
paint: paint({ fill: series.color, opacity: options.opacity })
|
|
90
91
|
});
|
|
91
92
|
}
|
|
92
|
-
if (options.tip
|
|
93
|
+
if (tips(options.tip, data[index], index)) {
|
|
93
94
|
points.push({
|
|
94
95
|
key: `${id}:${index}`,
|
|
95
96
|
markId: id,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/core/marks/stats/waffle.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\tchannelLabel,\n\tisPlaceable,\n\tnumericValue,\n\treadChannel,\n} from \"#/core/channel.ts\";\nimport {\n\ttype ChartMarkOptions,\n\tcolorChannel,\n\tmarkId,\n\tpaint,\n\tseriesResolver,\n} from \"#/core/marks/shared.ts\";\nimport { categoryKey } from \"#/core/scales/discrete.ts\";\nimport type {\n\tChartAccessor,\n\tChartMark,\n\tChartPoint,\n\tChartValue,\n\tSceneNode,\n} from \"#/core/types.ts\";\n\nexport interface WaffleOptions<TDatum> extends ChartMarkOptions<TDatum> {\n\treadonly x: ChartAccessor<TDatum, ChartValue>;\n\treadonly y: ChartAccessor<TDatum, ChartValue>;\n\t/** What one cell stands for. */\n\treadonly unit?: number;\n\t/** Cells across a band. */\n\treadonly columns?: number;\n\treadonly fill?: string;\n}\n\nconst DEFAULT_COLUMNS = 10;\nconst CELL_GAP = 1.5;\n\n/**\n * Bars made of countable cells: \"12 missions\" reads as twelve squares. A\n * row of `columns` cells is `columns \u00D7 unit` on the y axis, so the waffle\n * still reads against it; series continue one another inside a column.\n */\nexport function waffleY<TDatum>(\n\tdata: ReadonlyArray<TDatum>,\n\toptions: WaffleOptions<TDatum>,\n): ChartMark {\n\tconst xs = readChannel(data, options.x);\n\tconst values = readChannel(data, options.y).map(numericValue);\n\tconst colors = colorChannel(data, options);\n\tconst unit = options.unit ?? 1;\n\tconst columns = options.columns ?? DEFAULT_COLUMNS;\n\tconst totals = new Map<string, number>();\n\tconst offsets = xs.map((x, index) => {\n\t\tif (!isPlaceable(x)) return 0;\n\t\tconst key = categoryKey(x);\n\t\tconst before = totals.get(key) ?? 0;\n\t\ttotals.set(\n\t\t\tkey,\n\t\t\tbefore + Math.max(0, Math.round((values[index] ?? 0) / unit)),\n\t\t);\n\t\treturn before;\n\t});\n\tconst tallest = Math.max(0, ...totals.values());\n\treturn {\n\t\tid: options.id,\n\t\tcoordinate: \"cartesian\",\n\t\tfocusOrder: \"x\",\n\t\tchannels: {\n\t\t\tx: {\n\t\t\t\tvalues: xs.filter(isPlaceable),\n\t\t\t\tdiscrete: \"band\",\n\t\t\t\tlabel: channelLabel(options.x),\n\t\t\t},\n\t\t\ty: {\n\t\t\t\tvalues: [0, Math.ceil(tallest / columns) * columns * unit],\n\t\t\t\tincludeZero: true,\n\t\t\t\tlabel: channelLabel(options.y) ?? options.label,\n\t\t\t},\n\t\t\tcolor: colors.channel,\n\t\t},\n\t\trender(context) {\n\t\t\tconst id = markId(options.id, \"waffleY\", context);\n\t\t\tconst { x: xScale, y: yScale } = context.scales;\n\t\t\tif (xScale === undefined || yScale === undefined) {\n\t\t\t\treturn { nodes: [] };\n\t\t\t}\n\t\t\tconst seriesOf = seriesResolver(\n\t\t\t\tcolors.values,\n\t\t\t\t{ ...options, fixedColor: options.fill },\n\t\t\t\tid,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst cellWidth = xScale.bandwidth / columns;\n\t\t\tconst rowHeight = Math.abs(yScale.map(columns * unit) - yScale.map(0));\n\t\t\tconst nodes: SceneNode[] = [];\n\t\t\tconst points: ChartPoint[] = [];\n\t\t\tfor (const [index, x] of xs.entries()) {\n\t\t\t\tconst value = values[index];\n\t\t\t\tif (!isPlaceable(x) || value === undefined) continue;\n\t\t\t\tconst series = seriesOf(index);\n\t\t\t\tconst cells = Math.max(0, Math.round(value / unit));\n\t\t\t\tlet top = Number.POSITIVE_INFINITY;\n\t\t\t\tfor (let cell = 0; cell < cells; cell += 1) {\n\t\t\t\t\tconst position = offsets[index] + cell;\n\t\t\t\t\tconst column = position % columns;\n\t\t\t\t\tconst row = Math.floor(position / columns);\n\t\t\t\t\tconst y = yScale.map((row + 1) * columns * unit);\n\t\t\t\t\ttop = Math.min(top, y);\n\t\t\t\t\tnodes.push({\n\t\t\t\t\t\tkind: \"rect\",\n\t\t\t\t\t\tkey: `${id}:${index}:${cell}`,\n\t\t\t\t\t\tseries: series.key,\n\t\t\t\t\t\trole: \"mark\",\n\t\t\t\t\t\tx: xScale.map(x) + column * cellWidth + CELL_GAP / 2,\n\t\t\t\t\t\ty: y + CELL_GAP / 2,\n\t\t\t\t\t\twidth: Math.max(0, cellWidth - CELL_GAP),\n\t\t\t\t\t\theight: Math.max(0, rowHeight - CELL_GAP),\n\t\t\t\t\t\tcorners: [1.5, 1.5, 1.5, 1.5],\n\t\t\t\t\t\tpaint: paint({ fill: series.color, opacity: options.opacity }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (options.tip
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import {\n\tchannelLabel,\n\tisPlaceable,\n\tnumericValue,\n\treadChannel,\n} from \"#/core/channel.ts\";\nimport {\n\ttype ChartMarkOptions,\n\tcolorChannel,\n\tmarkId,\n\tpaint,\n\tseriesResolver,\n\ttips,\n} from \"#/core/marks/shared.ts\";\nimport { categoryKey } from \"#/core/scales/discrete.ts\";\nimport type {\n\tChartAccessor,\n\tChartMark,\n\tChartPoint,\n\tChartValue,\n\tSceneNode,\n} from \"#/core/types.ts\";\n\nexport interface WaffleOptions<TDatum> extends ChartMarkOptions<TDatum> {\n\treadonly x: ChartAccessor<TDatum, ChartValue>;\n\treadonly y: ChartAccessor<TDatum, ChartValue>;\n\t/** What one cell stands for. */\n\treadonly unit?: number;\n\t/** Cells across a band. */\n\treadonly columns?: number;\n\treadonly fill?: string;\n}\n\nconst DEFAULT_COLUMNS = 10;\nconst CELL_GAP = 1.5;\n\n/**\n * Bars made of countable cells: \"12 missions\" reads as twelve squares. A\n * row of `columns` cells is `columns \u00D7 unit` on the y axis, so the waffle\n * still reads against it; series continue one another inside a column.\n */\nexport function waffleY<TDatum>(\n\tdata: ReadonlyArray<TDatum>,\n\toptions: WaffleOptions<TDatum>,\n): ChartMark {\n\tconst xs = readChannel(data, options.x);\n\tconst values = readChannel(data, options.y).map(numericValue);\n\tconst colors = colorChannel(data, options);\n\tconst unit = options.unit ?? 1;\n\tconst columns = options.columns ?? DEFAULT_COLUMNS;\n\tconst totals = new Map<string, number>();\n\tconst offsets = xs.map((x, index) => {\n\t\tif (!isPlaceable(x)) return 0;\n\t\tconst key = categoryKey(x);\n\t\tconst before = totals.get(key) ?? 0;\n\t\ttotals.set(\n\t\t\tkey,\n\t\t\tbefore + Math.max(0, Math.round((values[index] ?? 0) / unit)),\n\t\t);\n\t\treturn before;\n\t});\n\tconst tallest = Math.max(0, ...totals.values());\n\treturn {\n\t\tid: options.id,\n\t\tcoordinate: \"cartesian\",\n\t\tfocusOrder: \"x\",\n\t\tchannels: {\n\t\t\tx: {\n\t\t\t\tvalues: xs.filter(isPlaceable),\n\t\t\t\tdiscrete: \"band\",\n\t\t\t\tlabel: channelLabel(options.x),\n\t\t\t},\n\t\t\ty: {\n\t\t\t\tvalues: [0, Math.ceil(tallest / columns) * columns * unit],\n\t\t\t\tincludeZero: true,\n\t\t\t\tlabel: channelLabel(options.y) ?? options.label,\n\t\t\t},\n\t\t\tcolor: colors.channel,\n\t\t},\n\t\trender(context) {\n\t\t\tconst id = markId(options.id, \"waffleY\", context);\n\t\t\tconst { x: xScale, y: yScale } = context.scales;\n\t\t\tif (xScale === undefined || yScale === undefined) {\n\t\t\t\treturn { nodes: [] };\n\t\t\t}\n\t\t\tconst seriesOf = seriesResolver(\n\t\t\t\tcolors.values,\n\t\t\t\t{ ...options, fixedColor: options.fill },\n\t\t\t\tid,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst cellWidth = xScale.bandwidth / columns;\n\t\t\tconst rowHeight = Math.abs(yScale.map(columns * unit) - yScale.map(0));\n\t\t\tconst nodes: SceneNode[] = [];\n\t\t\tconst points: ChartPoint[] = [];\n\t\t\tfor (const [index, x] of xs.entries()) {\n\t\t\t\tconst value = values[index];\n\t\t\t\tif (!isPlaceable(x) || value === undefined) continue;\n\t\t\t\tconst series = seriesOf(index);\n\t\t\t\tconst cells = Math.max(0, Math.round(value / unit));\n\t\t\t\tlet top = Number.POSITIVE_INFINITY;\n\t\t\t\tfor (let cell = 0; cell < cells; cell += 1) {\n\t\t\t\t\tconst position = offsets[index] + cell;\n\t\t\t\t\tconst column = position % columns;\n\t\t\t\t\tconst row = Math.floor(position / columns);\n\t\t\t\t\tconst y = yScale.map((row + 1) * columns * unit);\n\t\t\t\t\ttop = Math.min(top, y);\n\t\t\t\t\tnodes.push({\n\t\t\t\t\t\tkind: \"rect\",\n\t\t\t\t\t\tkey: `${id}:${index}:${cell}`,\n\t\t\t\t\t\tseries: series.key,\n\t\t\t\t\t\trole: \"mark\",\n\t\t\t\t\t\tx: xScale.map(x) + column * cellWidth + CELL_GAP / 2,\n\t\t\t\t\t\ty: y + CELL_GAP / 2,\n\t\t\t\t\t\twidth: Math.max(0, cellWidth - CELL_GAP),\n\t\t\t\t\t\theight: Math.max(0, rowHeight - CELL_GAP),\n\t\t\t\t\t\tcorners: [1.5, 1.5, 1.5, 1.5],\n\t\t\t\t\t\tpaint: paint({ fill: series.color, opacity: options.opacity }),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (tips(options.tip, data[index], index)) {\n\t\t\t\t\tpoints.push({\n\t\t\t\t\t\tkey: `${id}:${index}`,\n\t\t\t\t\t\tmarkId: id,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tdatum: data[index],\n\t\t\t\t\t\tx: xScale.center(x),\n\t\t\t\t\t\ty: Number.isFinite(top) ? top : yScale.map(0),\n\t\t\t\t\t\txValue: x,\n\t\t\t\t\t\tyValue: value,\n\t\t\t\t\t\tseries: series.key,\n\t\t\t\t\t\tseriesLabel: series.label,\n\t\t\t\t\t\tcolor: series.color,\n\t\t\t\t\t\ttitle: context.formatX(x),\n\t\t\t\t\t\tvalue: context.formatY(value),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { nodes, points };\n\t\t},\n\t};\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/core/scales/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAKxE,OAAO,KAAK,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,EACV,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAC/B;AA6DD,wBAAgB,SAAS,CACxB,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EACrC,OAAO,EAAE,yBAAyB,GAAG,SAAS,EAC9C,IAAI,EAAE,GAAG,GAAG,GAAG,GACb,SAAS,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/core/scales/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAKxE,OAAO,KAAK,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,EACV,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAC/B;AA6DD,wBAAgB,SAAS,CACxB,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EACrC,OAAO,EAAE,yBAAyB,GAAG,SAAS,EAC9C,IAAI,EAAE,GAAG,GAAG,GAAG,GACb,SAAS,GAAG,SAAS,CA8CvB;AAED,wBAAgB,UAAU,CACzB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,yBAAyB,GAAG,SAAS,EAC9C,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GACf,kBAAkB,CAwBpB"}
|
|
@@ -72,7 +72,12 @@ function planScale(channels, options, axis) {
|
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
74
|
if (options?.domain !== void 0) {
|
|
75
|
-
|
|
75
|
+
const [low, high] = options.domain.map(toNumber);
|
|
76
|
+
return {
|
|
77
|
+
kind,
|
|
78
|
+
domain: options.nice === true && kind === "linear" ? niceDomain(low, high) : [low, high],
|
|
79
|
+
label
|
|
80
|
+
};
|
|
76
81
|
}
|
|
77
82
|
const zero = options?.zero ?? channels.some((channel) => channel.includeZero === true);
|
|
78
83
|
const nice = options?.nice ?? (axis === "y" || zero);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/scales/resolve.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ChartPositionScaleOptions } from \"#/core/define-chart.ts\";\nimport { linearScale, logScale, toNumber } from \"#/core/scales/continuous.ts\";\nimport { bandScale, categoryKey, pointScale } from \"#/core/scales/discrete.ts\";\nimport { timeScale } from \"#/core/scales/time.ts\";\nimport { niceDomain } from \"#/core/ticks.ts\";\nimport type {\n\tChartChannel,\n\tChartPositionScale,\n\tChartPositionScaleKind,\n\tChartValue,\n} from \"#/core/types.ts\";\n\n/**\n * What a scale will be once the plot size is known: its kind and its domain,\n * read off every channel the marks put on it. Split from the range so the\n * axes can measure their tick labels before the plot rectangle exists.\n */\nexport interface ScalePlan {\n\treadonly kind: ChartPositionScaleKind;\n\treadonly domain: ReadonlyArray<ChartValue>;\n\treadonly label: string | undefined;\n\t/** The band padding a mark asked for, when the options name none. */\n\treadonly padding?: number;\n\treadonly paddingOuter?: number;\n}\n\nfunction inferKind(\n\tchannels: ReadonlyArray<ChartChannel>,\n\tvalues: ReadonlyArray<ChartValue>,\n): ChartPositionScaleKind {\n\tif (channels.some((channel) => channel.discrete === \"band\")) {\n\t\treturn \"band\";\n\t}\n\tconst askedPoint = channels.some((channel) => channel.discrete === \"point\");\n\tif (values.length > 0 && values.every((value) => value instanceof Date)) {\n\t\treturn askedPoint ? \"point\" : \"time\";\n\t}\n\tif (values.length > 0 && values.every((value) => typeof value === \"number\")) {\n\t\treturn askedPoint ? \"point\" : \"linear\";\n\t}\n\treturn \"point\";\n}\n\nfunction distinct(\n\tvalues: ReadonlyArray<ChartValue>,\n): ReadonlyArray<ChartValue> {\n\tconst seen = new Set<string>();\n\tconst kept: ChartValue[] = [];\n\tfor (const value of values) {\n\t\tconst key = categoryKey(value);\n\t\tif (!seen.has(key)) {\n\t\t\tseen.add(key);\n\t\t\tkept.push(value);\n\t\t}\n\t}\n\treturn kept;\n}\n\nfunction continuousDomain(\n\tvalues: ReadonlyArray<ChartValue>,\n\toptions: { readonly zero: boolean; readonly nice: boolean },\n\tkind: ChartPositionScaleKind,\n): readonly [number, number] {\n\tlet low = Number.POSITIVE_INFINITY;\n\tlet high = Number.NEGATIVE_INFINITY;\n\tfor (const value of values) {\n\t\tconst number = toNumber(value);\n\t\tif (Number.isFinite(number)) {\n\t\t\tlow = Math.min(low, number);\n\t\t\thigh = Math.max(high, number);\n\t\t}\n\t}\n\tif (!Number.isFinite(low)) {\n\t\treturn [0, 1];\n\t}\n\tif (options.zero && kind === \"linear\") {\n\t\tlow = Math.min(low, 0);\n\t\thigh = Math.max(high, 0);\n\t}\n\tif (options.nice && kind === \"linear\") {\n\t\treturn niceDomain(low, high);\n\t}\n\treturn [low, high];\n}\n\nexport function planScale(\n\tchannels: ReadonlyArray<ChartChannel>,\n\toptions: ChartPositionScaleOptions | undefined,\n\taxis: \"x\" | \"y\",\n): ScalePlan | undefined {\n\tif (channels.length === 0) {\n\t\treturn undefined;\n\t}\n\tconst values = channels.flatMap((channel) => channel.values);\n\tconst kind = options?.type ?? inferKind(channels, values);\n\tconst label =\n\t\toptions?.label ?? channels.find((channel) => channel.label)?.label;\n\tif (kind === \"band\" || kind === \"point\") {\n\t\tconst padding = channels.find(\n\t\t\t(channel) => channel.padding !== undefined,\n\t\t)?.padding;\n\t\tconst paddingOuter = channels.find(\n\t\t\t(channel) => channel.paddingOuter !== undefined,\n\t\t)?.paddingOuter;\n\t\treturn {\n\t\t\tkind,\n\t\t\tdomain: options?.domain ?? distinct(values),\n\t\t\tlabel,\n\t\t\tpadding,\n\t\t\tpaddingOuter: paddingOuter ?? padding,\n\t\t};\n\t}\n\tif (options?.domain !== undefined) {\n\t\
|
|
5
|
-
"mappings": "AACA,SAAS,aAAa,UAAU,gBAAgB;AAChD,SAAS,WAAW,aAAa,kBAAkB;AACnD,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAsB3B,SAAS,UACR,UACA,QACyB;AACzB,MAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,aAAa,MAAM,GAAG;AAC5D,WAAO;AAAA,EACR;AACA,QAAM,aAAa,SAAS,KAAK,CAAC,YAAY,QAAQ,aAAa,OAAO;AAC1E,MAAI,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC,UAAU,iBAAiB,IAAI,GAAG;AACxE,WAAO,aAAa,UAAU;AAAA,EAC/B;AACA,MAAI,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,GAAG;AAC5E,WAAO,aAAa,UAAU;AAAA,EAC/B;AACA,SAAO;AACR;AAEA,SAAS,SACR,QAC4B;AAC5B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,OAAqB,CAAC;AAC5B,aAAW,SAAS,QAAQ;AAC3B,UAAM,MAAM,YAAY,KAAK;AAC7B,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AACnB,WAAK,IAAI,GAAG;AACZ,WAAK,KAAK,KAAK;AAAA,IAChB;AAAA,EACD;AACA,SAAO;AACR;AAEA,SAAS,iBACR,QACA,SACA,MAC4B;AAC5B,MAAI,MAAM,OAAO;AACjB,MAAI,OAAO,OAAO;AAClB,aAAW,SAAS,QAAQ;AAC3B,UAAM,SAAS,SAAS,KAAK;AAC7B,QAAI,OAAO,SAAS,MAAM,GAAG;AAC5B,YAAM,KAAK,IAAI,KAAK,MAAM;AAC1B,aAAO,KAAK,IAAI,MAAM,MAAM;AAAA,IAC7B;AAAA,EACD;AACA,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AAC1B,WAAO,CAAC,GAAG,CAAC;AAAA,EACb;AACA,MAAI,QAAQ,QAAQ,SAAS,UAAU;AACtC,UAAM,KAAK,IAAI,KAAK,CAAC;AACrB,WAAO,KAAK,IAAI,MAAM,CAAC;AAAA,EACxB;AACA,MAAI,QAAQ,QAAQ,SAAS,UAAU;AACtC,WAAO,WAAW,KAAK,IAAI;AAAA,EAC5B;AACA,SAAO,CAAC,KAAK,IAAI;AAClB;AAEO,SAAS,UACf,UACA,SACA,MACwB;AACxB,MAAI,SAAS,WAAW,GAAG;AAC1B,WAAO;AAAA,EACR;AACA,QAAM,SAAS,SAAS,QAAQ,CAAC,YAAY,QAAQ,MAAM;AAC3D,QAAM,OAAO,SAAS,QAAQ,UAAU,UAAU,MAAM;AACxD,QAAM,QACL,SAAS,SAAS,SAAS,KAAK,CAAC,YAAY,QAAQ,KAAK,GAAG;AAC9D,MAAI,SAAS,UAAU,SAAS,SAAS;AACxC,UAAM,UAAU,SAAS;AAAA,MACxB,CAAC,YAAY,QAAQ,YAAY;AAAA,IAClC,GAAG;AACH,UAAM,eAAe,SAAS;AAAA,MAC7B,CAAC,YAAY,QAAQ,iBAAiB;AAAA,IACvC,GAAG;AACH,WAAO;AAAA,MACN;AAAA,MACA,QAAQ,SAAS,UAAU,SAAS,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,cAAc,gBAAgB;AAAA,IAC/B;AAAA,EACD;AACA,MAAI,SAAS,WAAW,QAAW;AAClC,
|
|
4
|
+
"sourcesContent": ["import type { ChartPositionScaleOptions } from \"#/core/define-chart.ts\";\nimport { linearScale, logScale, toNumber } from \"#/core/scales/continuous.ts\";\nimport { bandScale, categoryKey, pointScale } from \"#/core/scales/discrete.ts\";\nimport { timeScale } from \"#/core/scales/time.ts\";\nimport { niceDomain } from \"#/core/ticks.ts\";\nimport type {\n\tChartChannel,\n\tChartPositionScale,\n\tChartPositionScaleKind,\n\tChartValue,\n} from \"#/core/types.ts\";\n\n/**\n * What a scale will be once the plot size is known: its kind and its domain,\n * read off every channel the marks put on it. Split from the range so the\n * axes can measure their tick labels before the plot rectangle exists.\n */\nexport interface ScalePlan {\n\treadonly kind: ChartPositionScaleKind;\n\treadonly domain: ReadonlyArray<ChartValue>;\n\treadonly label: string | undefined;\n\t/** The band padding a mark asked for, when the options name none. */\n\treadonly padding?: number;\n\treadonly paddingOuter?: number;\n}\n\nfunction inferKind(\n\tchannels: ReadonlyArray<ChartChannel>,\n\tvalues: ReadonlyArray<ChartValue>,\n): ChartPositionScaleKind {\n\tif (channels.some((channel) => channel.discrete === \"band\")) {\n\t\treturn \"band\";\n\t}\n\tconst askedPoint = channels.some((channel) => channel.discrete === \"point\");\n\tif (values.length > 0 && values.every((value) => value instanceof Date)) {\n\t\treturn askedPoint ? \"point\" : \"time\";\n\t}\n\tif (values.length > 0 && values.every((value) => typeof value === \"number\")) {\n\t\treturn askedPoint ? \"point\" : \"linear\";\n\t}\n\treturn \"point\";\n}\n\nfunction distinct(\n\tvalues: ReadonlyArray<ChartValue>,\n): ReadonlyArray<ChartValue> {\n\tconst seen = new Set<string>();\n\tconst kept: ChartValue[] = [];\n\tfor (const value of values) {\n\t\tconst key = categoryKey(value);\n\t\tif (!seen.has(key)) {\n\t\t\tseen.add(key);\n\t\t\tkept.push(value);\n\t\t}\n\t}\n\treturn kept;\n}\n\nfunction continuousDomain(\n\tvalues: ReadonlyArray<ChartValue>,\n\toptions: { readonly zero: boolean; readonly nice: boolean },\n\tkind: ChartPositionScaleKind,\n): readonly [number, number] {\n\tlet low = Number.POSITIVE_INFINITY;\n\tlet high = Number.NEGATIVE_INFINITY;\n\tfor (const value of values) {\n\t\tconst number = toNumber(value);\n\t\tif (Number.isFinite(number)) {\n\t\t\tlow = Math.min(low, number);\n\t\t\thigh = Math.max(high, number);\n\t\t}\n\t}\n\tif (!Number.isFinite(low)) {\n\t\treturn [0, 1];\n\t}\n\tif (options.zero && kind === \"linear\") {\n\t\tlow = Math.min(low, 0);\n\t\thigh = Math.max(high, 0);\n\t}\n\tif (options.nice && kind === \"linear\") {\n\t\treturn niceDomain(low, high);\n\t}\n\treturn [low, high];\n}\n\nexport function planScale(\n\tchannels: ReadonlyArray<ChartChannel>,\n\toptions: ChartPositionScaleOptions | undefined,\n\taxis: \"x\" | \"y\",\n): ScalePlan | undefined {\n\tif (channels.length === 0) {\n\t\treturn undefined;\n\t}\n\tconst values = channels.flatMap((channel) => channel.values);\n\tconst kind = options?.type ?? inferKind(channels, values);\n\tconst label =\n\t\toptions?.label ?? channels.find((channel) => channel.label)?.label;\n\tif (kind === \"band\" || kind === \"point\") {\n\t\tconst padding = channels.find(\n\t\t\t(channel) => channel.padding !== undefined,\n\t\t)?.padding;\n\t\tconst paddingOuter = channels.find(\n\t\t\t(channel) => channel.paddingOuter !== undefined,\n\t\t)?.paddingOuter;\n\t\treturn {\n\t\t\tkind,\n\t\t\tdomain: options?.domain ?? distinct(values),\n\t\t\tlabel,\n\t\t\tpadding,\n\t\t\tpaddingOuter: paddingOuter ?? padding,\n\t\t};\n\t}\n\tif (options?.domain !== undefined) {\n\t\tconst [low, high] = options.domain.map(toNumber);\n\t\t// An explicit domain still widens to round ticks when asked to: the\n\t\t// data's own maximum as the top of the axis would end it mid-air.\n\t\treturn {\n\t\t\tkind,\n\t\t\tdomain:\n\t\t\t\toptions.nice === true && kind === \"linear\"\n\t\t\t\t\t? niceDomain(low, high)\n\t\t\t\t\t: [low, high],\n\t\t\tlabel,\n\t\t};\n\t}\n\tconst zero =\n\t\toptions?.zero ?? channels.some((channel) => channel.includeZero === true);\n\t// A value axis (y, or the x of horizontal bars) reads best on round\n\t// numbers; a position axis (the x of a scatter) on the data's own extent.\n\tconst nice = options?.nice ?? (axis === \"y\" || zero);\n\treturn {\n\t\tkind,\n\t\tdomain: continuousDomain(values, { zero, nice }, kind),\n\t\tlabel,\n\t};\n}\n\nexport function buildScale(\n\tplan: ScalePlan,\n\toptions: ChartPositionScaleOptions | undefined,\n\trange: readonly [number, number],\n\tlocale: string,\n\ttickCount: number,\n): ChartPositionScale {\n\tconst ordered: readonly [number, number] = options?.reverse\n\t\t? [range[1], range[0]]\n\t\t: range;\n\tif (plan.kind === \"band\" || plan.kind === \"point\") {\n\t\tconst discrete = {\n\t\t\tdomain: plan.domain,\n\t\t\trange: ordered,\n\t\t\tlocale,\n\t\t\tpaddingInner: options?.paddingInner ?? plan.padding,\n\t\t\tpaddingOuter: options?.paddingOuter ?? plan.paddingOuter,\n\t\t};\n\t\treturn plan.kind === \"band\" ? bandScale(discrete) : pointScale(discrete);\n\t}\n\tconst continuous = {\n\t\tdomain: [toNumber(plan.domain[0]), toNumber(plan.domain[1])] as const,\n\t\trange: ordered,\n\t\tlocale,\n\t\ttickCount,\n\t};\n\tif (plan.kind === \"time\") {\n\t\treturn timeScale(continuous);\n\t}\n\treturn plan.kind === \"log\" ? logScale(continuous) : linearScale(continuous);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -64,6 +64,8 @@ export interface ChartPaint {
|
|
|
64
64
|
readonly opacity?: number;
|
|
65
65
|
readonly fillOpacity?: number;
|
|
66
66
|
readonly strokeOpacity?: number;
|
|
67
|
+
/** Fill with diagonal hatching in the fill colour: a value pencilled in, not yet true. */
|
|
68
|
+
readonly hatch?: boolean;
|
|
67
69
|
}
|
|
68
70
|
export interface ChartTextPaint extends ChartPaint {
|
|
69
71
|
readonly fontSize?: number;
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gDAAgD;AAChD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAEhD,iDAAiD;AACjD,MAAM,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,IACrC,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GACvB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAErE,2CAA2C;AAC3C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAMxD,MAAM,MAAM,sBAAsB,GAC/B,QAAQ,GACR,KAAK,GACL,MAAM,GACN,MAAM,GACN,OAAO,CAAC;AAEX;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC;IAC/C,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC,UAAU,CAAC,CAAC;IAC9D,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CACjC;AAMD,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
interface EmptyProps extends React.ComponentProps<"div"> {
|
|
3
|
+
}
|
|
4
|
+
/** In place of a chart with nothing to show. Pass the localized message as children. */
|
|
5
|
+
export declare function ChartEmpty({ style, ...props }: EmptyProps): React.JSX.Element;
|
|
6
|
+
interface SkeletonProps extends React.ComponentProps<"div"> {
|
|
7
|
+
/** What a screen reader hears while the chart loads. */
|
|
8
|
+
readonly label?: string;
|
|
9
|
+
}
|
|
10
|
+
/** A loading placeholder shaped like a bar chart, announced as a status. */
|
|
11
|
+
export declare function ChartSkeleton({ label, style, ...props }: SkeletonProps): React.JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=chart-placeholders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-placeholders.d.ts","sourceRoot":"","sources":["../../src/react/chart-placeholders.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAcpC,UAAU,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;CAAG;AAE3D,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,qBAsBzD;AAUD,UAAU,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IAC1D,wDAAwD;IACxD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,EAC7B,KAAoB,EACpB,KAAK,EACL,GAAG,KAAK,EACR,EAAE,aAAa,qBAiCf"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
const BOX = {
|
|
3
|
+
width: "100%",
|
|
4
|
+
aspectRatio: "16 / 9",
|
|
5
|
+
borderRadius: 8
|
|
6
|
+
};
|
|
7
|
+
function ChartEmpty({ style, ...props }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
"div",
|
|
10
|
+
{
|
|
11
|
+
"data-slot": "chart-empty",
|
|
12
|
+
style: {
|
|
13
|
+
...BOX,
|
|
14
|
+
display: "flex",
|
|
15
|
+
flexDirection: "column",
|
|
16
|
+
alignItems: "center",
|
|
17
|
+
justifyContent: "center",
|
|
18
|
+
gap: 4,
|
|
19
|
+
border: "1px dashed var(--border, color-mix(in oklab, currentColor 25%, transparent))",
|
|
20
|
+
color: "var(--muted-foreground, inherit)",
|
|
21
|
+
fontSize: 14,
|
|
22
|
+
textAlign: "center",
|
|
23
|
+
textWrap: "balance",
|
|
24
|
+
...style
|
|
25
|
+
},
|
|
26
|
+
...props
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
const BAR_HEIGHTS = [40, 70, 55, 90, 65, 80, 50];
|
|
31
|
+
const SKELETON_CSS = `
|
|
32
|
+
@keyframes voila-chart-pulse{50%{opacity:.5}}
|
|
33
|
+
@media (prefers-reduced-motion:no-preference){[data-slot="chart-skeleton-bar"]{animation:voila-chart-pulse 2s cubic-bezier(.4,0,.6,1) infinite}}
|
|
34
|
+
`;
|
|
35
|
+
function ChartSkeleton({
|
|
36
|
+
label = "Chargement",
|
|
37
|
+
style,
|
|
38
|
+
...props
|
|
39
|
+
}) {
|
|
40
|
+
return /* @__PURE__ */ jsxs(
|
|
41
|
+
"div",
|
|
42
|
+
{
|
|
43
|
+
"data-slot": "chart-skeleton",
|
|
44
|
+
role: "status",
|
|
45
|
+
"aria-label": label,
|
|
46
|
+
style: {
|
|
47
|
+
...BOX,
|
|
48
|
+
display: "flex",
|
|
49
|
+
alignItems: "flex-end",
|
|
50
|
+
gap: 8,
|
|
51
|
+
...style
|
|
52
|
+
},
|
|
53
|
+
...props,
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsx("style", { href: "voila-chart-skeleton", precedence: "default", children: SKELETON_CSS }),
|
|
56
|
+
BAR_HEIGHTS.map((height) => /* @__PURE__ */ jsx(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
"data-slot": "chart-skeleton-bar",
|
|
60
|
+
style: {
|
|
61
|
+
width: "100%",
|
|
62
|
+
height: `${height}%`,
|
|
63
|
+
borderRadius: 6,
|
|
64
|
+
background: "var(--muted, color-mix(in oklab, currentColor 10%, transparent))"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
height
|
|
68
|
+
))
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
ChartEmpty,
|
|
75
|
+
ChartSkeleton
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=chart-placeholders.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/react/chart-placeholders.tsx"],
|
|
4
|
+
"sourcesContent": ["import type * as React from \"react\";\n\n/**\n * Stand-ins for a chart: no data yet, or none at all. Sized like the chart\n * they replace (pass the same height), so the page does not jump when the\n * data lands. Styled with the kit's tokens when the page has them.\n */\n\nconst BOX: React.CSSProperties = {\n\twidth: \"100%\",\n\taspectRatio: \"16 / 9\",\n\tborderRadius: 8,\n};\n\ninterface EmptyProps extends React.ComponentProps<\"div\"> {}\n\n/** In place of a chart with nothing to show. Pass the localized message as children. */\nexport function ChartEmpty({ style, ...props }: EmptyProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"chart-empty\"\n\t\t\tstyle={{\n\t\t\t\t...BOX,\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tflexDirection: \"column\",\n\t\t\t\talignItems: \"center\",\n\t\t\t\tjustifyContent: \"center\",\n\t\t\t\tgap: 4,\n\t\t\t\tborder:\n\t\t\t\t\t\"1px dashed var(--border, color-mix(in oklab, currentColor 25%, transparent))\",\n\t\t\t\tcolor: \"var(--muted-foreground, inherit)\",\n\t\t\t\tfontSize: 14,\n\t\t\t\ttextAlign: \"center\",\n\t\t\t\ttextWrap: \"balance\",\n\t\t\t\t...style,\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/** Fixed, not random, so the server and the browser render the same bars. */\nconst BAR_HEIGHTS = [40, 70, 55, 90, 65, 80, 50] as const;\n\nconst SKELETON_CSS = `\n@keyframes voila-chart-pulse{50%{opacity:.5}}\n@media (prefers-reduced-motion:no-preference){[data-slot=\"chart-skeleton-bar\"]{animation:voila-chart-pulse 2s cubic-bezier(.4,0,.6,1) infinite}}\n`;\n\ninterface SkeletonProps extends React.ComponentProps<\"div\"> {\n\t/** What a screen reader hears while the chart loads. */\n\treadonly label?: string;\n}\n\n/** A loading placeholder shaped like a bar chart, announced as a status. */\nexport function ChartSkeleton({\n\tlabel = \"Chargement\",\n\tstyle,\n\t...props\n}: SkeletonProps) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"chart-skeleton\"\n\t\t\trole=\"status\"\n\t\t\taria-label={label}\n\t\t\tstyle={{\n\t\t\t\t...BOX,\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\talignItems: \"flex-end\",\n\t\t\t\tgap: 8,\n\t\t\t\t...style,\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t<style href=\"voila-chart-skeleton\" precedence=\"default\">\n\t\t\t\t{SKELETON_CSS}\n\t\t\t</style>\n\t\t\t{BAR_HEIGHTS.map((height) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={height}\n\t\t\t\t\tdata-slot=\"chart-skeleton-bar\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\theight: `${height}%`,\n\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\"var(--muted, color-mix(in oklab, currentColor 10%, transparent))\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n"],
|
|
5
|
+
"mappings": "AAmBE,cA0CA,YA1CA;AAXF,MAAM,MAA2B;AAAA,EAChC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,cAAc;AACf;AAKO,SAAS,WAAW,EAAE,OAAO,GAAG,MAAM,GAAe;AAC3D,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,OAAO;AAAA,QACN,GAAG;AAAA,QACH,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,QACL,QACC;AAAA,QACD,OAAO;AAAA,QACP,UAAU;AAAA,QACV,WAAW;AAAA,QACX,UAAU;AAAA,QACV,GAAG;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAGA,MAAM,cAAc,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAE/C,MAAM,eAAe;AAAA;AAAA;AAAA;AAWd,SAAS,cAAc;AAAA,EAC7B,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACJ,GAAkB;AACjB,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,OAAO;AAAA,QACN,GAAG;AAAA,QACH,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,GAAG;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,4BAAC,WAAM,MAAK,wBAAuB,YAAW,WAC5C,wBACF;AAAA,QACC,YAAY,IAAI,CAAC,WACjB;AAAA,UAAC;AAAA;AAAA,YAEA,aAAU;AAAA,YACV,OAAO;AAAA,cACN,OAAO;AAAA,cACP,QAAQ,GAAG,MAAM;AAAA,cACjB,cAAc;AAAA,cACd,YACC;AAAA,YACF;AAAA;AAAA,UARK;AAAA,QASN,CACA;AAAA;AAAA;AAAA,EACF;AAEF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type { ChartBrush, ChartBrushRange } from "./brush-contract.js";
|
|
2
2
|
export { Chart } from "./chart.js";
|
|
3
|
+
export { ChartEmpty, ChartSkeleton } from "./chart-placeholders.js";
|
|
3
4
|
export { ChartTooltipContent, type ChartTooltipRenderProps, } from "./chart-tooltip.js";
|
|
4
5
|
export type { ChartRenderer, ChartRendererProps } from "./renderer.js";
|
|
5
6
|
export { SvgRenderer } from "./svg-renderer.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACN,mBAAmB,EACnB,KAAK,uBAAuB,GAC5B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EACN,mBAAmB,EACnB,KAAK,uBAAuB,GAC5B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/react/index.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { Chart } from "./chart.js";
|
|
2
|
+
import { ChartEmpty, ChartSkeleton } from "./chart-placeholders.js";
|
|
2
3
|
import {
|
|
3
4
|
ChartTooltipContent
|
|
4
5
|
} from "./chart-tooltip.js";
|
|
5
6
|
import { SvgRenderer } from "./svg-renderer.js";
|
|
6
7
|
export {
|
|
7
8
|
Chart,
|
|
9
|
+
ChartEmpty,
|
|
10
|
+
ChartSkeleton,
|
|
8
11
|
ChartTooltipContent,
|
|
9
12
|
SvgRenderer
|
|
10
13
|
};
|
package/dist/react/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/react/index.ts"],
|
|
4
|
-
"sourcesContent": ["export type { ChartBrush, ChartBrushRange } from \"#/react/brush-contract.ts\";\nexport { Chart } from \"#/react/chart.tsx\";\nexport {\n\tChartTooltipContent,\n\ttype ChartTooltipRenderProps,\n} from \"#/react/chart-tooltip.tsx\";\nexport type { ChartRenderer, ChartRendererProps } from \"#/react/renderer.ts\";\nexport { SvgRenderer } from \"#/react/svg-renderer.tsx\";\nexport type { ActiveFocus } from \"#/react/use-chart-focus.ts\";\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,aAAa;AACtB;AAAA,EACC;AAAA,OAEM;AAEP,SAAS,mBAAmB;",
|
|
4
|
+
"sourcesContent": ["export type { ChartBrush, ChartBrushRange } from \"#/react/brush-contract.ts\";\nexport { Chart } from \"#/react/chart.tsx\";\nexport { ChartEmpty, ChartSkeleton } from \"#/react/chart-placeholders.tsx\";\nexport {\n\tChartTooltipContent,\n\ttype ChartTooltipRenderProps,\n} from \"#/react/chart-tooltip.tsx\";\nexport type { ChartRenderer, ChartRendererProps } from \"#/react/renderer.ts\";\nexport { SvgRenderer } from \"#/react/svg-renderer.tsx\";\nexport type { ActiveFocus } from \"#/react/use-chart-focus.ts\";\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,aAAa;AACtB,SAAS,YAAY,qBAAqB;AAC1C;AAAA,EACC;AAAA,OAEM;AAEP,SAAS,mBAAmB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svg-scene.d.ts","sourceRoot":"","sources":["../../src/react/svg-scene.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAEX,UAAU,EAGV,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"svg-scene.d.ts","sourceRoot":"","sources":["../../src/react/svg-scene.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAEX,UAAU,EAGV,MAAM,iBAAiB,CAAC;AAgKzB,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,UAAU,GACV,EAAE;IACF,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB,qBAgCA"}
|
package/dist/react/svg-scene.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { roundedBarPath } from "../core/paths.js";
|
|
3
3
|
const BASELINE = {
|
|
4
4
|
top: "hanging",
|
|
@@ -6,9 +6,27 @@ const BASELINE = {
|
|
|
6
6
|
bottom: "text-after-edge",
|
|
7
7
|
alphabetic: "alphabetic"
|
|
8
8
|
};
|
|
9
|
-
|
|
9
|
+
const HATCH_STEP = 6;
|
|
10
|
+
function hatchId(prefix, color) {
|
|
11
|
+
let hash = 5381;
|
|
12
|
+
for (const character of color) {
|
|
13
|
+
hash = (hash << 5) + hash + character.charCodeAt(0) | 0;
|
|
14
|
+
}
|
|
15
|
+
return `${prefix}-hatch-${(hash >>> 0).toString(36)}`;
|
|
16
|
+
}
|
|
17
|
+
function hatchColors(nodes, into = /* @__PURE__ */ new Set()) {
|
|
18
|
+
for (const node of nodes) {
|
|
19
|
+
if (node.kind === "group") {
|
|
20
|
+
hatchColors(node.children, into);
|
|
21
|
+
} else if (node.paint.hatch && node.paint.fill) {
|
|
22
|
+
into.add(node.paint.fill);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return into;
|
|
26
|
+
}
|
|
27
|
+
function paintProps(paint, prefix) {
|
|
10
28
|
return {
|
|
11
|
-
fill: paint.fill ?? "none",
|
|
29
|
+
fill: paint.hatch && paint.fill ? `url(#${hatchId(prefix, paint.fill)})` : paint.fill ?? "none",
|
|
12
30
|
stroke: paint.stroke,
|
|
13
31
|
strokeWidth: paint.strokeWidth,
|
|
14
32
|
strokeDasharray: paint.strokeDasharray,
|
|
@@ -53,7 +71,7 @@ function SceneElement({
|
|
|
53
71
|
{
|
|
54
72
|
...data,
|
|
55
73
|
d: roundedBarPath({ ...node, radius: node.corners }),
|
|
56
|
-
...paintProps(node.paint)
|
|
74
|
+
...paintProps(node.paint, clipPrefix)
|
|
57
75
|
}
|
|
58
76
|
) : /* @__PURE__ */ jsx(
|
|
59
77
|
"rect",
|
|
@@ -63,11 +81,11 @@ function SceneElement({
|
|
|
63
81
|
y: node.y,
|
|
64
82
|
width: node.width,
|
|
65
83
|
height: node.height,
|
|
66
|
-
...paintProps(node.paint)
|
|
84
|
+
...paintProps(node.paint, clipPrefix)
|
|
67
85
|
}
|
|
68
86
|
);
|
|
69
87
|
case "path":
|
|
70
|
-
return /* @__PURE__ */ jsx("path", { ...data, d: node.d, ...paintProps(node.paint) });
|
|
88
|
+
return /* @__PURE__ */ jsx("path", { ...data, d: node.d, ...paintProps(node.paint, clipPrefix) });
|
|
71
89
|
case "circle":
|
|
72
90
|
return /* @__PURE__ */ jsx(
|
|
73
91
|
"circle",
|
|
@@ -76,7 +94,7 @@ function SceneElement({
|
|
|
76
94
|
cx: node.cx,
|
|
77
95
|
cy: node.cy,
|
|
78
96
|
r: node.r,
|
|
79
|
-
...paintProps(node.paint)
|
|
97
|
+
...paintProps(node.paint, clipPrefix)
|
|
80
98
|
}
|
|
81
99
|
);
|
|
82
100
|
case "line":
|
|
@@ -88,7 +106,7 @@ function SceneElement({
|
|
|
88
106
|
y1: node.y1,
|
|
89
107
|
x2: node.x2,
|
|
90
108
|
y2: node.y2,
|
|
91
|
-
...paintProps(node.paint)
|
|
109
|
+
...paintProps(node.paint, clipPrefix)
|
|
92
110
|
}
|
|
93
111
|
);
|
|
94
112
|
case "text":
|
|
@@ -103,7 +121,7 @@ function SceneElement({
|
|
|
103
121
|
fontWeight: node.paint.fontWeight,
|
|
104
122
|
textAnchor: node.paint.textAnchor,
|
|
105
123
|
dominantBaseline: node.paint.baseline ? BASELINE[node.paint.baseline] : void 0,
|
|
106
|
-
...paintProps(node.paint),
|
|
124
|
+
...paintProps(node.paint, clipPrefix),
|
|
107
125
|
children: node.text
|
|
108
126
|
}
|
|
109
127
|
);
|
|
@@ -113,7 +131,32 @@ function SvgSceneNodes({
|
|
|
113
131
|
scene,
|
|
114
132
|
clipPrefix
|
|
115
133
|
}) {
|
|
116
|
-
|
|
134
|
+
const hatches = [...hatchColors(scene.nodes)];
|
|
135
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
136
|
+
hatches.length > 0 ? /* @__PURE__ */ jsx("defs", { children: hatches.map((color) => /* @__PURE__ */ jsx(
|
|
137
|
+
"pattern",
|
|
138
|
+
{
|
|
139
|
+
id: hatchId(clipPrefix, color),
|
|
140
|
+
width: HATCH_STEP,
|
|
141
|
+
height: HATCH_STEP,
|
|
142
|
+
patternUnits: "userSpaceOnUse",
|
|
143
|
+
patternTransform: "rotate(45)",
|
|
144
|
+
children: /* @__PURE__ */ jsx(
|
|
145
|
+
"line",
|
|
146
|
+
{
|
|
147
|
+
x1: 0,
|
|
148
|
+
y1: 0,
|
|
149
|
+
x2: 0,
|
|
150
|
+
y2: HATCH_STEP,
|
|
151
|
+
stroke: color,
|
|
152
|
+
strokeWidth: 1.5
|
|
153
|
+
}
|
|
154
|
+
)
|
|
155
|
+
},
|
|
156
|
+
color
|
|
157
|
+
)) }) : null,
|
|
158
|
+
scene.nodes.map((node) => /* @__PURE__ */ jsx(SceneElement, { node, clipPrefix }, node.key))
|
|
159
|
+
] });
|
|
117
160
|
}
|
|
118
161
|
export {
|
|
119
162
|
SvgSceneNodes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/react/svg-scene.tsx"],
|
|
4
|
-
"sourcesContent": ["import type * as React from \"react\";\nimport { roundedBarPath } from \"#/core/paths.ts\";\nimport type {\n\tChartPaint,\n\tChartScene,\n\tChartTextPaint,\n\tSceneNode,\n} from \"#/core/types.ts\";\n\nconst BASELINE: Record<\n\tNonNullable<ChartTextPaint[\"baseline\"]>,\n\tReact.SVGAttributes<SVGTextElement>[\"dominantBaseline\"]\n> = {\n\ttop: \"hanging\",\n\tmiddle: \"central\",\n\tbottom: \"text-after-edge\",\n\talphabetic: \"alphabetic\",\n};\n\nfunction paintProps(
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type * as React from \"react\";\nimport { roundedBarPath } from \"#/core/paths.ts\";\nimport type {\n\tChartPaint,\n\tChartScene,\n\tChartTextPaint,\n\tSceneNode,\n} from \"#/core/types.ts\";\n\nconst BASELINE: Record<\n\tNonNullable<ChartTextPaint[\"baseline\"]>,\n\tReact.SVGAttributes<SVGTextElement>[\"dominantBaseline\"]\n> = {\n\ttop: \"hanging\",\n\tmiddle: \"central\",\n\tbottom: \"text-after-edge\",\n\talphabetic: \"alphabetic\",\n};\n\nconst HATCH_STEP = 6;\n\n/** A stable id per colour (djb2), the same on the server and in the browser. */\nfunction hatchId(prefix: string, color: string): string {\n\tlet hash = 5381;\n\tfor (const character of color) {\n\t\thash = ((hash << 5) + hash + character.charCodeAt(0)) | 0;\n\t}\n\treturn `${prefix}-hatch-${(hash >>> 0).toString(36)}`;\n}\n\nfunction hatchColors(\n\tnodes: ReadonlyArray<SceneNode>,\n\tinto = new Set<string>(),\n): Set<string> {\n\tfor (const node of nodes) {\n\t\tif (node.kind === \"group\") {\n\t\t\thatchColors(node.children, into);\n\t\t} else if (node.paint.hatch && node.paint.fill) {\n\t\t\tinto.add(node.paint.fill);\n\t\t}\n\t}\n\treturn into;\n}\n\nfunction paintProps(\n\tpaint: ChartPaint,\n\tprefix: string,\n): React.SVGAttributes<SVGElement> {\n\treturn {\n\t\tfill:\n\t\t\tpaint.hatch && paint.fill\n\t\t\t\t? `url(#${hatchId(prefix, paint.fill)})`\n\t\t\t\t: (paint.fill ?? \"none\"),\n\t\tstroke: paint.stroke,\n\t\tstrokeWidth: paint.strokeWidth,\n\t\tstrokeDasharray: paint.strokeDasharray,\n\t\tstrokeLinecap: paint.strokeLinecap,\n\t\tstrokeLinejoin: paint.strokeLinejoin,\n\t\topacity: paint.opacity,\n\t\tfillOpacity: paint.fillOpacity,\n\t\tstrokeOpacity: paint.strokeOpacity,\n\t};\n}\n\nfunction SceneElement({\n\tnode,\n\tclipPrefix,\n}: {\n\tnode: SceneNode;\n\tclipPrefix: string;\n}) {\n\tconst data = { \"data-role\": node.role, \"data-series\": node.series };\n\tswitch (node.kind) {\n\t\tcase \"group\": {\n\t\t\tconst clipId = node.clip ? `${clipPrefix}-${node.key}` : undefined;\n\t\t\treturn (\n\t\t\t\t<g\n\t\t\t\t\t{...data}\n\t\t\t\t\ttransform={\n\t\t\t\t\t\tnode.translate\n\t\t\t\t\t\t\t? `translate(${node.translate.x} ${node.translate.y})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tclipPath={clipId ? `url(#${clipId})` : undefined}\n\t\t\t\t>\n\t\t\t\t\t{node.clip && clipId ? (\n\t\t\t\t\t\t<clipPath id={clipId}>\n\t\t\t\t\t\t\t<rect {...node.clip} />\n\t\t\t\t\t\t</clipPath>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{node.children.map((child) => (\n\t\t\t\t\t\t<SceneElement\n\t\t\t\t\t\t\tkey={child.key}\n\t\t\t\t\t\t\tnode={child}\n\t\t\t\t\t\t\tclipPrefix={clipPrefix}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</g>\n\t\t\t);\n\t\t}\n\t\tcase \"rect\":\n\t\t\treturn node.corners ? (\n\t\t\t\t<path\n\t\t\t\t\t{...data}\n\t\t\t\t\td={roundedBarPath({ ...node, radius: node.corners })}\n\t\t\t\t\t{...paintProps(node.paint, clipPrefix)}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<rect\n\t\t\t\t\t{...data}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\twidth={node.width}\n\t\t\t\t\theight={node.height}\n\t\t\t\t\t{...paintProps(node.paint, clipPrefix)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"path\":\n\t\t\treturn (\n\t\t\t\t<path {...data} d={node.d} {...paintProps(node.paint, clipPrefix)} />\n\t\t\t);\n\t\tcase \"circle\":\n\t\t\treturn (\n\t\t\t\t<circle\n\t\t\t\t\t{...data}\n\t\t\t\t\tcx={node.cx}\n\t\t\t\t\tcy={node.cy}\n\t\t\t\t\tr={node.r}\n\t\t\t\t\t{...paintProps(node.paint, clipPrefix)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"line\":\n\t\t\treturn (\n\t\t\t\t<line\n\t\t\t\t\t{...data}\n\t\t\t\t\tx1={node.x1}\n\t\t\t\t\ty1={node.y1}\n\t\t\t\t\tx2={node.x2}\n\t\t\t\t\ty2={node.y2}\n\t\t\t\t\t{...paintProps(node.paint, clipPrefix)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"text\":\n\t\t\treturn (\n\t\t\t\t<text\n\t\t\t\t\t{...data}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\ttransform={\n\t\t\t\t\t\tnode.rotate\n\t\t\t\t\t\t\t? `rotate(${node.rotate} ${node.x} ${node.y})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tfontSize={node.paint.fontSize}\n\t\t\t\t\tfontWeight={node.paint.fontWeight}\n\t\t\t\t\ttextAnchor={node.paint.textAnchor}\n\t\t\t\t\tdominantBaseline={\n\t\t\t\t\t\tnode.paint.baseline ? BASELINE[node.paint.baseline] : undefined\n\t\t\t\t\t}\n\t\t\t\t\t{...paintProps(node.paint, clipPrefix)}\n\t\t\t\t>\n\t\t\t\t\t{node.text}\n\t\t\t\t</text>\n\t\t\t);\n\t}\n}\n\n/** The scene's nodes as SVG elements, keyed so React reconciles a data update in place. */\nexport function SvgSceneNodes({\n\tscene,\n\tclipPrefix,\n}: {\n\tscene: ChartScene;\n\tclipPrefix: string;\n}) {\n\tconst hatches = [...hatchColors(scene.nodes)];\n\treturn (\n\t\t<>\n\t\t\t{hatches.length > 0 ? (\n\t\t\t\t<defs>\n\t\t\t\t\t{hatches.map((color) => (\n\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\tkey={color}\n\t\t\t\t\t\t\tid={hatchId(clipPrefix, color)}\n\t\t\t\t\t\t\twidth={HATCH_STEP}\n\t\t\t\t\t\t\theight={HATCH_STEP}\n\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t\tpatternTransform=\"rotate(45)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\tx1={0}\n\t\t\t\t\t\t\t\ty1={0}\n\t\t\t\t\t\t\t\tx2={0}\n\t\t\t\t\t\t\t\ty2={HATCH_STEP}\n\t\t\t\t\t\t\t\tstroke={color}\n\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</pattern>\n\t\t\t\t\t))}\n\t\t\t\t</defs>\n\t\t\t) : null}\n\t\t\t{scene.nodes.map((node) => (\n\t\t\t\t<SceneElement key={node.key} node={node} clipPrefix={clipPrefix} />\n\t\t\t))}\n\t\t</>\n\t);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voila.dev/chart",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.109",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Charts as data: a definition of marks, channels and scales, drawn to SVG or Canvas, keyboard and screen-reader accessible. The core has no dependencies; the heavy layouts (geo, hierarchy, sankey…) sit behind their own subpaths.",
|
|
6
6
|
"license": "MIT",
|