@apipass/design-system 5.8.0 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/lib/charts.index.cjs +1 -1
  2. package/dist/lib/charts.index.js +11 -8
  3. package/dist/lib/charts.index.js.map +1 -1
  4. package/dist/lib/embedded-styles.js +2 -2
  5. package/dist/lib/lib.index.cjs +1 -1
  6. package/dist/lib/lib.index.js +183 -182
  7. package/dist/lib/style.css +1 -1
  8. package/dist/lib/ui/components/DataTable/DataTable.cjs +1 -1
  9. package/dist/lib/ui/components/DataTable/DataTable.cjs.map +1 -1
  10. package/dist/lib/ui/components/DataTable/DataTable.js +157 -124
  11. package/dist/lib/ui/components/DataTable/DataTable.js.map +1 -1
  12. package/dist/lib/ui/components/charts/BarChart/bar-chart-option.cjs +1 -1
  13. package/dist/lib/ui/components/charts/BarChart/bar-chart-option.cjs.map +1 -1
  14. package/dist/lib/ui/components/charts/BarChart/bar-chart-option.js +75 -104
  15. package/dist/lib/ui/components/charts/BarChart/bar-chart-option.js.map +1 -1
  16. package/dist/lib/ui/components/charts/ChartLegend/ChartLegend.cjs +1 -1
  17. package/dist/lib/ui/components/charts/ChartLegend/ChartLegend.cjs.map +1 -1
  18. package/dist/lib/ui/components/charts/ChartLegend/ChartLegend.js +27 -26
  19. package/dist/lib/ui/components/charts/ChartLegend/ChartLegend.js.map +1 -1
  20. package/dist/lib/ui/components/charts/PieChart/PieChart.cjs +2 -0
  21. package/dist/lib/ui/components/charts/PieChart/PieChart.cjs.map +1 -0
  22. package/dist/lib/ui/components/charts/PieChart/PieChart.js +177 -0
  23. package/dist/lib/ui/components/charts/PieChart/PieChart.js.map +1 -0
  24. package/dist/lib/ui/components/charts/PieChart/pie-chart-option.cjs +2 -0
  25. package/dist/lib/ui/components/charts/PieChart/pie-chart-option.cjs.map +1 -0
  26. package/dist/lib/ui/components/charts/PieChart/pie-chart-option.js +124 -0
  27. package/dist/lib/ui/components/charts/PieChart/pie-chart-option.js.map +1 -0
  28. package/dist/lib/ui/components/charts/PieChart/pie-chart-slices.cjs +2 -0
  29. package/dist/lib/ui/components/charts/PieChart/pie-chart-slices.cjs.map +1 -0
  30. package/dist/lib/ui/components/charts/PieChart/pie-chart-slices.js +65 -0
  31. package/dist/lib/ui/components/charts/PieChart/pie-chart-slices.js.map +1 -0
  32. package/dist/lib/ui/components/charts/chart-color-tone.cjs +2 -0
  33. package/dist/lib/ui/components/charts/chart-color-tone.cjs.map +1 -0
  34. package/dist/lib/ui/components/charts/chart-color-tone.js +14 -0
  35. package/dist/lib/ui/components/charts/chart-color-tone.js.map +1 -0
  36. package/dist/lib/ui/components/charts/chart-label-color.cjs +2 -0
  37. package/dist/lib/ui/components/charts/chart-label-color.cjs.map +1 -0
  38. package/dist/lib/ui/components/charts/chart-label-color.js +35 -0
  39. package/dist/lib/ui/components/charts/chart-label-color.js.map +1 -0
  40. package/dist/lib/ui/components/charts/chart-palette.cjs +1 -1
  41. package/dist/lib/ui/components/charts/chart-palette.cjs.map +1 -1
  42. package/dist/lib/ui/components/charts/chart-palette.js +2 -1
  43. package/dist/lib/ui/components/charts/chart-palette.js.map +1 -1
  44. package/dist/lib/ui/components/charts/chart-theme.cjs +1 -1
  45. package/dist/lib/ui/components/charts/chart-theme.cjs.map +1 -1
  46. package/dist/lib/ui/components/charts/chart-theme.js +4 -3
  47. package/dist/lib/ui/components/charts/chart-theme.js.map +1 -1
  48. package/dist/lib/ui/components/charts/echarts-modules.cjs +1 -1
  49. package/dist/lib/ui/components/charts/echarts-modules.cjs.map +1 -1
  50. package/dist/lib/ui/components/charts/echarts-modules.js +11 -9
  51. package/dist/lib/ui/components/charts/echarts-modules.js.map +1 -1
  52. package/dist/lib/ui/primitives/Accordion/Accordion.cjs +1 -1
  53. package/dist/lib/ui/primitives/Accordion/Accordion.cjs.map +1 -1
  54. package/dist/lib/ui/primitives/Accordion/Accordion.js +26 -20
  55. package/dist/lib/ui/primitives/Accordion/Accordion.js.map +1 -1
  56. package/dist/types/charts.index.d.ts +1 -0
  57. package/dist/types/ui/components/DataTable/DataTable.d.ts +15 -2
  58. package/dist/types/ui/components/charts/ChartLegend/ChartLegend.d.ts +1 -0
  59. package/dist/types/ui/components/charts/PieChart/PieChart.d.ts +32 -0
  60. package/dist/types/ui/components/charts/PieChart/pie-chart-option.d.ts +13 -0
  61. package/dist/types/ui/components/charts/PieChart/pie-chart-slices.d.ts +30 -0
  62. package/dist/types/ui/components/charts/chart-color-tone.d.ts +1 -0
  63. package/dist/types/ui/components/charts/chart-label-color.d.ts +2 -0
  64. package/dist/types/ui/components/charts/chart-palette.d.ts +1 -0
  65. package/dist/types/ui/components/charts/chart-theme.d.ts +1 -0
  66. package/dist/types/ui/primitives/Accordion/Accordion.d.ts +4 -1
  67. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PieChart.cjs","sources":["../../../../../../src/ui/components/charts/PieChart/PieChart.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n ChartLegend,\n type ChartLegendItem,\n type ChartLegendLabels,\n} from \"../ChartLegend/ChartLegend\";\nimport {\n useChartLegend,\n type ChartLegendSeries,\n type ChartLegendState,\n} from \"../ChartLegend/use-chart-legend\";\nimport { CHART_NEUTRAL_COLOR_TOKEN } from \"../chart-palette\";\nimport { useChartInstance, type ChartInstance } from \"../useChartInstance\";\nimport {\n buildPieChartOption,\n formatShare,\n type PieChartLabelContent,\n type PieChartShape,\n} from \"./pie-chart-option\";\nimport {\n buildPieSlices,\n displayNameOf,\n findParentSlice,\n findSlice,\n totalOf,\n type PieChartNode,\n type PieSlice,\n} from \"./pie-chart-slices\";\nimport \"./pie-chart.css\";\n\nexport type { PieChartNode } from \"./pie-chart-slices\";\nexport type { PieChartLabelContent, PieChartShape } from \"./pie-chart-option\";\n\nexport type PieChartLegendMode = \"inline\" | \"none\";\n\nexport type PieChartLegendPosition = \"bottom\" | \"right\" | \"top\" | \"left\";\n\nexport type PieChartLegendValue = \"percent\" | \"value\";\n\nexport type PieChartShowTotal = \"auto\" | \"on\" | \"off\";\n\nexport interface PieChartLabels {\n others: string;\n total: string;\n backToPrevious: (categoryName: string) => string;\n}\n\nconst DEFAULT_LABELS: PieChartLabels = {\n others: \"Others\",\n total: \"Total\",\n backToPrevious: (categoryName: string) => `Back from ${categoryName}`,\n};\n\nconst MIN_SIZE_FOR_AUTO_TOTAL_PX: number = 200;\n\nconst DEFAULT_LABEL_CONTENT: PieChartLabelContent[] = [\"percent\"];\n\nconst NO_LEGEND_VALUES: PieChartLegendValue[] = [];\n\nexport type PieChartProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n data: PieChartNode[];\n shape?: PieChartShape;\n labelContent?: PieChartLabelContent[];\n showTotal?: PieChartShowTotal;\n total?: number;\n valueFormatter?: (value: number) => string;\n legend?: PieChartLegendMode;\n legendPosition?: PieChartLegendPosition;\n legendValues?: PieChartLegendValue[];\n onSeriesColorChange?: (seriesId: string, colorToken: string | null) => void;\n onFocusChange?: (focusedNodeId: string | null) => void;\n legendLabels?: Partial<ChartLegendLabels>;\n labels?: Partial<PieChartLabels>;\n};\n\nfunction legendDetail(\n slice: PieSlice | undefined,\n legendValues: PieChartLegendValue[],\n formatValue: (value: number) => string,\n): string | undefined {\n if (!slice || legendValues.length === 0) return undefined;\n const hasPercent: boolean = legendValues.includes(\"percent\");\n const hasValue: boolean = legendValues.includes(\"value\");\n if (hasPercent && hasValue) return `${formatValue(slice.value)} (${formatShare(slice.share)})`;\n return hasValue ? formatValue(slice.value) : formatShare(slice.share);\n}\n\nfunction useMinSide(element: HTMLElement | null): number {\n const [minSide, setMinSide] = useState<number>(0);\n\n useLayoutEffect(() => {\n if (!element) return undefined;\n const observer: ResizeObserver = new ResizeObserver(() =>\n setMinSide(Math.min(element.clientWidth, element.clientHeight)),\n );\n observer.observe(element);\n return () => observer.disconnect();\n }, [element]);\n\n return minSide;\n}\n\nexport function PieChart({\n data,\n shape = \"donut\",\n labelContent = DEFAULT_LABEL_CONTENT,\n showTotal = \"auto\",\n total,\n valueFormatter,\n legend = \"inline\",\n legendPosition = \"bottom\",\n legendValues = NO_LEGEND_VALUES,\n onSeriesColorChange,\n onFocusChange,\n legendLabels,\n labels,\n className,\n ...props\n}: PieChartProps) {\n const { containerRef, chart, theme, resolveSeriesColor }: ChartInstance = useChartInstance();\n const resolvedLabels: PieChartLabels = { ...DEFAULT_LABELS, ...labels };\n const [focusedNodeId, setFocusedNodeId] = useState<string | null>(null);\n const [stageElement, setStageElement] = useState<HTMLDivElement | null>(null);\n const stageMinSide: number = useMinSide(stageElement);\n\n const legendSeries: ChartLegendSeries[] = useMemo(\n () =>\n data.map((node: PieChartNode) => ({\n id: node.id,\n name: displayNameOf(node, resolvedLabels.others),\n colorToken: node.colorToken ?? (node.isOthers ? CHART_NEUTRAL_COLOR_TOKEN : undefined),\n })),\n [data, resolvedLabels.others],\n );\n\n const {\n items,\n colorsBySeriesId,\n colorTokensBySeriesId,\n hiddenSeriesIds,\n toggleSeries,\n }: ChartLegendState = useChartLegend(\n legendSeries,\n theme?.seriesColors ?? [],\n resolveSeriesColor,\n );\n\n const visibleSlices: PieSlice[] = useMemo(\n () =>\n buildPieSlices({\n nodes: data.filter((node: PieChartNode) => !hiddenSeriesIds.has(node.id)),\n colorsByRootId: colorsBySeriesId,\n fallbackColor: theme?.neutralColor ?? \"#9ca3af\",\n othersName: resolvedLabels.others,\n }),\n [data, hiddenSeriesIds, colorsBySeriesId, theme, resolvedLabels.others],\n );\n\n const focusedSlice: PieSlice | undefined = useMemo(\n () => (focusedNodeId === null ? undefined : findSlice(visibleSlices, focusedNodeId)),\n [visibleSlices, focusedNodeId],\n );\n\n const drawnSlices: PieSlice[] = focusedSlice ? focusedSlice.children : visibleSlices;\n\n const updateFocus = useCallback(\n (nextFocusedNodeId: string | null): void => {\n setFocusedNodeId(nextFocusedNodeId);\n onFocusChange?.(nextFocusedNodeId);\n },\n [onFocusChange],\n );\n\n useEffect(() => {\n if (focusedNodeId !== null && !focusedSlice) updateFocus(null);\n }, [focusedNodeId, focusedSlice, updateFocus]);\n\n useEffect(() => {\n if (!chart || !theme) return;\n chart.setOption(\n buildPieChartOption({ slices: drawnSlices, shape, labelContent, theme, valueFormatter }),\n { notMerge: true },\n );\n }, [chart, theme, drawnSlices, shape, labelContent, valueFormatter]);\n\n useEffect(() => {\n if (!chart) return undefined;\n\n function drillIntoClickedSlice(params: { data?: unknown }): void {\n const clickedId: unknown = (params.data as { id?: unknown } | null | undefined)?.id;\n if (typeof clickedId !== \"string\") return;\n const clickedSlice: PieSlice | undefined = findSlice(drawnSlices, clickedId);\n if (clickedSlice && clickedSlice.children.length > 0) updateFocus(clickedSlice.id);\n }\n\n chart.on(\"click\", drillIntoClickedSlice);\n return () => {\n chart.off(\"click\", drillIntoClickedSlice);\n };\n }, [chart, drawnSlices, updateFocus]);\n\n function formatValue(value: number): string {\n return valueFormatter ? valueFormatter(value) : String(value);\n }\n\n const legendItems: ChartLegendItem[] = items.map((item: ChartLegendItem) => ({\n ...item,\n detail: legendDetail(\n visibleSlices.find((slice: PieSlice) => slice.id === item.id),\n legendValues,\n formatValue,\n ),\n }));\n\n const isTotalVisible: boolean =\n showTotal === \"on\" || (showTotal === \"auto\" && stageMinSide >= MIN_SIZE_FOR_AUTO_TOTAL_PX);\n const centerTotal: number = focusedSlice ? focusedSlice.value : (total ?? totalOf(visibleSlices));\n const parentOfFocusedSlice: PieSlice | undefined = focusedSlice\n ? findParentSlice(visibleSlices, focusedSlice.id)\n : undefined;\n const isLegendVisible: boolean = legend !== \"none\" && data.length > 0;\n\n const centerContent = (\n <>\n <span className=\"pie-chart__total-value\">{formatValue(centerTotal)}</span>\n <span className=\"pie-chart__total-caption\">\n {focusedSlice ? focusedSlice.name : resolvedLabels.total}\n </span>\n </>\n );\n\n function goBack(): void {\n updateFocus(parentOfFocusedSlice ? parentOfFocusedSlice.id : null);\n }\n\n function renderDonutCenter() {\n if (focusedSlice) {\n return (\n <button\n type=\"button\"\n className=\"pie-chart__center pie-chart__center--button\"\n aria-label={resolvedLabels.backToPrevious(focusedSlice.name)}\n onClick={goBack}\n >\n {isTotalVisible && centerContent}\n </button>\n );\n }\n return isTotalVisible && <div className=\"pie-chart__center\">{centerContent}</div>;\n }\n\n function renderPieFooter() {\n if (focusedSlice) {\n return (\n <button\n type=\"button\"\n className=\"pie-chart__footer pie-chart__footer--button\"\n aria-label={resolvedLabels.backToPrevious(focusedSlice.name)}\n onClick={goBack}\n >\n {focusedSlice.name}\n {isTotalVisible && `: ${formatValue(centerTotal)}`}\n </button>\n );\n }\n return (\n isTotalVisible && (\n <div className=\"pie-chart__footer\">{`${resolvedLabels.total}: ${formatValue(centerTotal)}`}</div>\n )\n );\n }\n\n return (\n <div\n className={clsx(\"pie-chart\", `pie-chart--legend-${legendPosition}`, className)}\n {...props}\n >\n {isLegendVisible && (\n <ChartLegend\n className=\"pie-chart__legend\"\n items={legendItems}\n onToggle={toggleSeries}\n onColorChange={onSeriesColorChange}\n colorTokensBySeriesId={colorTokensBySeriesId}\n labels={legendLabels}\n />\n )}\n <div className=\"pie-chart__body\">\n <div ref={setStageElement} className=\"pie-chart__stage\">\n <div ref={containerRef} className=\"pie-chart__canvas\" />\n {shape === \"donut\" && renderDonutCenter()}\n </div>\n {shape === \"pie\" && renderPieFooter()}\n </div>\n </div>\n );\n}\n"],"names":["DEFAULT_LABELS","categoryName","MIN_SIZE_FOR_AUTO_TOTAL_PX","DEFAULT_LABEL_CONTENT","NO_LEGEND_VALUES","legendDetail","slice","legendValues","formatValue","hasPercent","hasValue","formatShare","useMinSide","element","minSide","setMinSide","useState","useLayoutEffect","observer","PieChart","data","shape","labelContent","showTotal","total","valueFormatter","legend","legendPosition","onSeriesColorChange","onFocusChange","legendLabels","labels","className","props","containerRef","chart","theme","resolveSeriesColor","useChartInstance","resolvedLabels","focusedNodeId","setFocusedNodeId","stageElement","setStageElement","stageMinSide","legendSeries","useMemo","node","displayNameOf","CHART_NEUTRAL_COLOR_TOKEN","items","colorsBySeriesId","colorTokensBySeriesId","hiddenSeriesIds","toggleSeries","useChartLegend","visibleSlices","buildPieSlices","focusedSlice","findSlice","drawnSlices","updateFocus","useCallback","nextFocusedNodeId","useEffect","buildPieChartOption","drillIntoClickedSlice","params","clickedId","_a","clickedSlice","value","legendItems","item","isTotalVisible","centerTotal","totalOf","parentOfFocusedSlice","findParentSlice","isLegendVisible","centerContent","jsxs","Fragment","jsx","goBack","renderDonutCenter","renderPieFooter","clsx","ChartLegend"],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { jsxs as h, Fragment as re, jsx as a } from "react/jsx-runtime";
2
+ import { clsx as ne } from "../../../../vendor/clsx/dist/clsx.js";
3
+ import { useState as O, useMemo as k, useCallback as oe, useEffect as L, useLayoutEffect as ce } from "react";
4
+ import { ChartLegend as se } from "../ChartLegend/ChartLegend.js";
5
+ import { useChartLegend as le } from "../ChartLegend/use-chart-legend.js";
6
+ import { CHART_NEUTRAL_COLOR_TOKEN as ae } from "../chart-palette.js";
7
+ import { useChartInstance as de } from "../useChartInstance.js";
8
+ import { buildPieChartOption as ue, formatShare as M } from "./pie-chart-option.js";
9
+ import { displayNameOf as fe, buildPieSlices as he, findSlice as R, totalOf as me, findParentSlice as pe } from "./pie-chart-slices.js";
10
+ /* empty css */
11
+ const _e = {
12
+ others: "Others",
13
+ total: "Total",
14
+ backToPrevious: (e) => `Back from ${e}`
15
+ }, Se = 200, be = ["percent"], ve = [];
16
+ function Ne(e, r, c) {
17
+ if (!e || r.length === 0) return;
18
+ const s = r.includes("percent"), m = r.includes("value");
19
+ return s && m ? `${c(e.value)} (${M(e.share)})` : m ? c(e.value) : M(e.share);
20
+ }
21
+ function ge(e) {
22
+ const [r, c] = O(0);
23
+ return ce(() => {
24
+ if (!e) return;
25
+ const s = new ResizeObserver(
26
+ () => c(Math.min(e.clientWidth, e.clientHeight))
27
+ );
28
+ return s.observe(e), () => s.disconnect();
29
+ }, [e]), r;
30
+ }
31
+ function Be({
32
+ data: e,
33
+ shape: r = "donut",
34
+ labelContent: c = be,
35
+ showTotal: s = "auto",
36
+ total: m,
37
+ valueFormatter: p,
38
+ legend: $ = "inline",
39
+ legendPosition: D = "bottom",
40
+ legendValues: U = ve,
41
+ onSeriesColorChange: x,
42
+ onFocusChange: _,
43
+ legendLabels: j,
44
+ labels: H,
45
+ className: V,
46
+ ...w
47
+ }) {
48
+ const { containerRef: z, chart: l, theme: n, resolveSeriesColor: G } = de(), o = { ..._e, ...H }, [u, K] = O(null), [W, X] = O(null), Z = ge(W), q = k(
49
+ () => e.map((t) => ({
50
+ id: t.id,
51
+ name: fe(t, o.others),
52
+ colorToken: t.colorToken ?? (t.isOthers ? ae : void 0)
53
+ })),
54
+ [e, o.others]
55
+ ), {
56
+ items: J,
57
+ colorsBySeriesId: E,
58
+ colorTokensBySeriesId: Q,
59
+ hiddenSeriesIds: C,
60
+ toggleSeries: Y
61
+ } = le(
62
+ q,
63
+ (n == null ? void 0 : n.seriesColors) ?? [],
64
+ G
65
+ ), d = k(
66
+ () => he({
67
+ nodes: e.filter((t) => !C.has(t.id)),
68
+ colorsByRootId: E,
69
+ fallbackColor: (n == null ? void 0 : n.neutralColor) ?? "#9ca3af",
70
+ othersName: o.others
71
+ }),
72
+ [e, C, E, n, o.others]
73
+ ), i = k(
74
+ () => u === null ? void 0 : R(d, u),
75
+ [d, u]
76
+ ), S = i ? i.children : d, f = oe(
77
+ (t) => {
78
+ K(t), _ == null || _(t);
79
+ },
80
+ [_]
81
+ );
82
+ L(() => {
83
+ u !== null && !i && f(null);
84
+ }, [u, i, f]), L(() => {
85
+ !l || !n || l.setOption(
86
+ ue({ slices: S, shape: r, labelContent: c, theme: n, valueFormatter: p }),
87
+ { notMerge: !0 }
88
+ );
89
+ }, [l, n, S, r, c, p]), L(() => {
90
+ if (!l) return;
91
+ function t(g) {
92
+ var B;
93
+ const A = (B = g.data) == null ? void 0 : B.id;
94
+ if (typeof A != "string") return;
95
+ const T = R(S, A);
96
+ T && T.children.length > 0 && f(T.id);
97
+ }
98
+ return l.on("click", t), () => {
99
+ l.off("click", t);
100
+ };
101
+ }, [l, S, f]);
102
+ function b(t) {
103
+ return p ? p(t) : String(t);
104
+ }
105
+ const F = J.map((t) => ({
106
+ ...t,
107
+ detail: Ne(
108
+ d.find((g) => g.id === t.id),
109
+ U,
110
+ b
111
+ )
112
+ })), v = s === "on" || s === "auto" && Z >= Se, N = i ? i.value : m ?? me(d), I = i ? pe(d, i.id) : void 0, ee = $ !== "none" && e.length > 0, P = /* @__PURE__ */ h(re, { children: [
113
+ /* @__PURE__ */ a("span", { className: "pie-chart__total-value", children: b(N) }),
114
+ /* @__PURE__ */ a("span", { className: "pie-chart__total-caption", children: i ? i.name : o.total })
115
+ ] });
116
+ function y() {
117
+ f(I ? I.id : null);
118
+ }
119
+ function te() {
120
+ return i ? /* @__PURE__ */ a(
121
+ "button",
122
+ {
123
+ type: "button",
124
+ className: "pie-chart__center pie-chart__center--button",
125
+ "aria-label": o.backToPrevious(i.name),
126
+ onClick: y,
127
+ children: v && P
128
+ }
129
+ ) : v && /* @__PURE__ */ a("div", { className: "pie-chart__center", children: P });
130
+ }
131
+ function ie() {
132
+ return i ? /* @__PURE__ */ h(
133
+ "button",
134
+ {
135
+ type: "button",
136
+ className: "pie-chart__footer pie-chart__footer--button",
137
+ "aria-label": o.backToPrevious(i.name),
138
+ onClick: y,
139
+ children: [
140
+ i.name,
141
+ v && `: ${b(N)}`
142
+ ]
143
+ }
144
+ ) : v && /* @__PURE__ */ a("div", { className: "pie-chart__footer", children: `${o.total}: ${b(N)}` });
145
+ }
146
+ return /* @__PURE__ */ h(
147
+ "div",
148
+ {
149
+ className: ne("pie-chart", `pie-chart--legend-${D}`, V),
150
+ ...w,
151
+ children: [
152
+ ee && /* @__PURE__ */ a(
153
+ se,
154
+ {
155
+ className: "pie-chart__legend",
156
+ items: F,
157
+ onToggle: Y,
158
+ onColorChange: x,
159
+ colorTokensBySeriesId: Q,
160
+ labels: j
161
+ }
162
+ ),
163
+ /* @__PURE__ */ h("div", { className: "pie-chart__body", children: [
164
+ /* @__PURE__ */ h("div", { ref: X, className: "pie-chart__stage", children: [
165
+ /* @__PURE__ */ a("div", { ref: z, className: "pie-chart__canvas" }),
166
+ r === "donut" && te()
167
+ ] }),
168
+ r === "pie" && ie()
169
+ ] })
170
+ ]
171
+ }
172
+ );
173
+ }
174
+ export {
175
+ Be as PieChart
176
+ };
177
+ //# sourceMappingURL=PieChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PieChart.js","sources":["../../../../../../src/ui/components/charts/PieChart/PieChart.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n ChartLegend,\n type ChartLegendItem,\n type ChartLegendLabels,\n} from \"../ChartLegend/ChartLegend\";\nimport {\n useChartLegend,\n type ChartLegendSeries,\n type ChartLegendState,\n} from \"../ChartLegend/use-chart-legend\";\nimport { CHART_NEUTRAL_COLOR_TOKEN } from \"../chart-palette\";\nimport { useChartInstance, type ChartInstance } from \"../useChartInstance\";\nimport {\n buildPieChartOption,\n formatShare,\n type PieChartLabelContent,\n type PieChartShape,\n} from \"./pie-chart-option\";\nimport {\n buildPieSlices,\n displayNameOf,\n findParentSlice,\n findSlice,\n totalOf,\n type PieChartNode,\n type PieSlice,\n} from \"./pie-chart-slices\";\nimport \"./pie-chart.css\";\n\nexport type { PieChartNode } from \"./pie-chart-slices\";\nexport type { PieChartLabelContent, PieChartShape } from \"./pie-chart-option\";\n\nexport type PieChartLegendMode = \"inline\" | \"none\";\n\nexport type PieChartLegendPosition = \"bottom\" | \"right\" | \"top\" | \"left\";\n\nexport type PieChartLegendValue = \"percent\" | \"value\";\n\nexport type PieChartShowTotal = \"auto\" | \"on\" | \"off\";\n\nexport interface PieChartLabels {\n others: string;\n total: string;\n backToPrevious: (categoryName: string) => string;\n}\n\nconst DEFAULT_LABELS: PieChartLabels = {\n others: \"Others\",\n total: \"Total\",\n backToPrevious: (categoryName: string) => `Back from ${categoryName}`,\n};\n\nconst MIN_SIZE_FOR_AUTO_TOTAL_PX: number = 200;\n\nconst DEFAULT_LABEL_CONTENT: PieChartLabelContent[] = [\"percent\"];\n\nconst NO_LEGEND_VALUES: PieChartLegendValue[] = [];\n\nexport type PieChartProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n data: PieChartNode[];\n shape?: PieChartShape;\n labelContent?: PieChartLabelContent[];\n showTotal?: PieChartShowTotal;\n total?: number;\n valueFormatter?: (value: number) => string;\n legend?: PieChartLegendMode;\n legendPosition?: PieChartLegendPosition;\n legendValues?: PieChartLegendValue[];\n onSeriesColorChange?: (seriesId: string, colorToken: string | null) => void;\n onFocusChange?: (focusedNodeId: string | null) => void;\n legendLabels?: Partial<ChartLegendLabels>;\n labels?: Partial<PieChartLabels>;\n};\n\nfunction legendDetail(\n slice: PieSlice | undefined,\n legendValues: PieChartLegendValue[],\n formatValue: (value: number) => string,\n): string | undefined {\n if (!slice || legendValues.length === 0) return undefined;\n const hasPercent: boolean = legendValues.includes(\"percent\");\n const hasValue: boolean = legendValues.includes(\"value\");\n if (hasPercent && hasValue) return `${formatValue(slice.value)} (${formatShare(slice.share)})`;\n return hasValue ? formatValue(slice.value) : formatShare(slice.share);\n}\n\nfunction useMinSide(element: HTMLElement | null): number {\n const [minSide, setMinSide] = useState<number>(0);\n\n useLayoutEffect(() => {\n if (!element) return undefined;\n const observer: ResizeObserver = new ResizeObserver(() =>\n setMinSide(Math.min(element.clientWidth, element.clientHeight)),\n );\n observer.observe(element);\n return () => observer.disconnect();\n }, [element]);\n\n return minSide;\n}\n\nexport function PieChart({\n data,\n shape = \"donut\",\n labelContent = DEFAULT_LABEL_CONTENT,\n showTotal = \"auto\",\n total,\n valueFormatter,\n legend = \"inline\",\n legendPosition = \"bottom\",\n legendValues = NO_LEGEND_VALUES,\n onSeriesColorChange,\n onFocusChange,\n legendLabels,\n labels,\n className,\n ...props\n}: PieChartProps) {\n const { containerRef, chart, theme, resolveSeriesColor }: ChartInstance = useChartInstance();\n const resolvedLabels: PieChartLabels = { ...DEFAULT_LABELS, ...labels };\n const [focusedNodeId, setFocusedNodeId] = useState<string | null>(null);\n const [stageElement, setStageElement] = useState<HTMLDivElement | null>(null);\n const stageMinSide: number = useMinSide(stageElement);\n\n const legendSeries: ChartLegendSeries[] = useMemo(\n () =>\n data.map((node: PieChartNode) => ({\n id: node.id,\n name: displayNameOf(node, resolvedLabels.others),\n colorToken: node.colorToken ?? (node.isOthers ? CHART_NEUTRAL_COLOR_TOKEN : undefined),\n })),\n [data, resolvedLabels.others],\n );\n\n const {\n items,\n colorsBySeriesId,\n colorTokensBySeriesId,\n hiddenSeriesIds,\n toggleSeries,\n }: ChartLegendState = useChartLegend(\n legendSeries,\n theme?.seriesColors ?? [],\n resolveSeriesColor,\n );\n\n const visibleSlices: PieSlice[] = useMemo(\n () =>\n buildPieSlices({\n nodes: data.filter((node: PieChartNode) => !hiddenSeriesIds.has(node.id)),\n colorsByRootId: colorsBySeriesId,\n fallbackColor: theme?.neutralColor ?? \"#9ca3af\",\n othersName: resolvedLabels.others,\n }),\n [data, hiddenSeriesIds, colorsBySeriesId, theme, resolvedLabels.others],\n );\n\n const focusedSlice: PieSlice | undefined = useMemo(\n () => (focusedNodeId === null ? undefined : findSlice(visibleSlices, focusedNodeId)),\n [visibleSlices, focusedNodeId],\n );\n\n const drawnSlices: PieSlice[] = focusedSlice ? focusedSlice.children : visibleSlices;\n\n const updateFocus = useCallback(\n (nextFocusedNodeId: string | null): void => {\n setFocusedNodeId(nextFocusedNodeId);\n onFocusChange?.(nextFocusedNodeId);\n },\n [onFocusChange],\n );\n\n useEffect(() => {\n if (focusedNodeId !== null && !focusedSlice) updateFocus(null);\n }, [focusedNodeId, focusedSlice, updateFocus]);\n\n useEffect(() => {\n if (!chart || !theme) return;\n chart.setOption(\n buildPieChartOption({ slices: drawnSlices, shape, labelContent, theme, valueFormatter }),\n { notMerge: true },\n );\n }, [chart, theme, drawnSlices, shape, labelContent, valueFormatter]);\n\n useEffect(() => {\n if (!chart) return undefined;\n\n function drillIntoClickedSlice(params: { data?: unknown }): void {\n const clickedId: unknown = (params.data as { id?: unknown } | null | undefined)?.id;\n if (typeof clickedId !== \"string\") return;\n const clickedSlice: PieSlice | undefined = findSlice(drawnSlices, clickedId);\n if (clickedSlice && clickedSlice.children.length > 0) updateFocus(clickedSlice.id);\n }\n\n chart.on(\"click\", drillIntoClickedSlice);\n return () => {\n chart.off(\"click\", drillIntoClickedSlice);\n };\n }, [chart, drawnSlices, updateFocus]);\n\n function formatValue(value: number): string {\n return valueFormatter ? valueFormatter(value) : String(value);\n }\n\n const legendItems: ChartLegendItem[] = items.map((item: ChartLegendItem) => ({\n ...item,\n detail: legendDetail(\n visibleSlices.find((slice: PieSlice) => slice.id === item.id),\n legendValues,\n formatValue,\n ),\n }));\n\n const isTotalVisible: boolean =\n showTotal === \"on\" || (showTotal === \"auto\" && stageMinSide >= MIN_SIZE_FOR_AUTO_TOTAL_PX);\n const centerTotal: number = focusedSlice ? focusedSlice.value : (total ?? totalOf(visibleSlices));\n const parentOfFocusedSlice: PieSlice | undefined = focusedSlice\n ? findParentSlice(visibleSlices, focusedSlice.id)\n : undefined;\n const isLegendVisible: boolean = legend !== \"none\" && data.length > 0;\n\n const centerContent = (\n <>\n <span className=\"pie-chart__total-value\">{formatValue(centerTotal)}</span>\n <span className=\"pie-chart__total-caption\">\n {focusedSlice ? focusedSlice.name : resolvedLabels.total}\n </span>\n </>\n );\n\n function goBack(): void {\n updateFocus(parentOfFocusedSlice ? parentOfFocusedSlice.id : null);\n }\n\n function renderDonutCenter() {\n if (focusedSlice) {\n return (\n <button\n type=\"button\"\n className=\"pie-chart__center pie-chart__center--button\"\n aria-label={resolvedLabels.backToPrevious(focusedSlice.name)}\n onClick={goBack}\n >\n {isTotalVisible && centerContent}\n </button>\n );\n }\n return isTotalVisible && <div className=\"pie-chart__center\">{centerContent}</div>;\n }\n\n function renderPieFooter() {\n if (focusedSlice) {\n return (\n <button\n type=\"button\"\n className=\"pie-chart__footer pie-chart__footer--button\"\n aria-label={resolvedLabels.backToPrevious(focusedSlice.name)}\n onClick={goBack}\n >\n {focusedSlice.name}\n {isTotalVisible && `: ${formatValue(centerTotal)}`}\n </button>\n );\n }\n return (\n isTotalVisible && (\n <div className=\"pie-chart__footer\">{`${resolvedLabels.total}: ${formatValue(centerTotal)}`}</div>\n )\n );\n }\n\n return (\n <div\n className={clsx(\"pie-chart\", `pie-chart--legend-${legendPosition}`, className)}\n {...props}\n >\n {isLegendVisible && (\n <ChartLegend\n className=\"pie-chart__legend\"\n items={legendItems}\n onToggle={toggleSeries}\n onColorChange={onSeriesColorChange}\n colorTokensBySeriesId={colorTokensBySeriesId}\n labels={legendLabels}\n />\n )}\n <div className=\"pie-chart__body\">\n <div ref={setStageElement} className=\"pie-chart__stage\">\n <div ref={containerRef} className=\"pie-chart__canvas\" />\n {shape === \"donut\" && renderDonutCenter()}\n </div>\n {shape === \"pie\" && renderPieFooter()}\n </div>\n </div>\n );\n}\n"],"names":["DEFAULT_LABELS","categoryName","MIN_SIZE_FOR_AUTO_TOTAL_PX","DEFAULT_LABEL_CONTENT","NO_LEGEND_VALUES","legendDetail","slice","legendValues","formatValue","hasPercent","hasValue","formatShare","useMinSide","element","minSide","setMinSide","useState","useLayoutEffect","observer","PieChart","data","shape","labelContent","showTotal","total","valueFormatter","legend","legendPosition","onSeriesColorChange","onFocusChange","legendLabels","labels","className","props","containerRef","chart","theme","resolveSeriesColor","useChartInstance","resolvedLabels","focusedNodeId","setFocusedNodeId","stageElement","setStageElement","stageMinSide","legendSeries","useMemo","node","displayNameOf","CHART_NEUTRAL_COLOR_TOKEN","items","colorsBySeriesId","colorTokensBySeriesId","hiddenSeriesIds","toggleSeries","useChartLegend","visibleSlices","buildPieSlices","focusedSlice","findSlice","drawnSlices","updateFocus","useCallback","nextFocusedNodeId","useEffect","buildPieChartOption","drillIntoClickedSlice","params","clickedId","_a","clickedSlice","value","legendItems","item","isTotalVisible","centerTotal","totalOf","parentOfFocusedSlice","findParentSlice","isLegendVisible","centerContent","jsxs","Fragment","jsx","goBack","renderDonutCenter","renderPieFooter","clsx","ChartLegend"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const C=require("../chart-label-color.cjs"),p=require("./pie-chart-slices.cjs"),n=40,_=85,S=8,m=32,h=92,g=" > ",L=10,b=2,R=new Intl.NumberFormat(void 0,{style:"percent",maximumFractionDigits:1});function i(e){return R.format(e)}function d(e,t){return e.valueFormatter?e.valueFormatter(t):String(t)}function u(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function v(e,t){const o=[];return e.labelContent.includes("name")&&o.push(t.name),e.labelContent.includes("percent")&&o.push(i(t.share)),e.labelContent.includes("value")&&o.push(d(e,t.value)),o.join(" ")}function T(e,t){const o=u(t.path.join(g)),r=u(d(e,t.value));return`<div>${o}</div><div><b>${r}</b> · ${i(t.share)}</div>`}function s(e,t,o){return{id:t.id,name:t.name,value:t.value,itemStyle:{color:t.color},label:{color:C.labelColorOnFill(t.color)},labelText:v(e,t),tooltip:T(e,t),children:o?t.children.map(r=>s(e,r,!0)):void 0}}function I(e){const{theme:t}=e;return{trigger:"item",backgroundColor:t.tooltipBackgroundColor,borderColor:t.tooltipBorderColor,textStyle:{color:t.labelColor},formatter:o=>o.data.tooltip}}function a(e){return e.data.labelText}function f(e){return e.shape==="pie"?0:n}function N(e){return e.shape==="pie"?["0%",`${_}%`]:[`${n}%`,`${n+m}%`]}function y(e){const t=e.labelContent.length>0;return e.shape==="pie"?{show:t,position:"inside",formatter:a}:{show:t,position:"outside",color:e.theme.labelColor,formatter:a}}function A(e){const t=e.shape==="pie";return{type:"pie",radius:N(e),data:e.slices.map(o=>{const{label:r,...l}=s(e,o,!1);return t?{...l,label:r}:l}),itemStyle:{borderColor:e.theme.tooltipBackgroundColor,borderWidth:b},label:y(e),minShowLabelAngle:t?S:0,labelLine:{show:!t&&e.labelContent.length>0},labelLayout:{hideOverlap:!0},emphasis:{scale:!1}}}function P(e,t){const o=f(e),r=(h-o)/t,l=e.shape==="pie"?r:Math.min(m,r),E=Array.from({length:t},($,c)=>({r0:`${o+l*c}%`,r:`${o+l*(c+1)}%`}));return[{},...E]}function D(e){const t=e.labelContent.length>0;return{type:"sunburst",nodeClick:!1,sort:null,radius:[`${f(e)}%`,`${h}%`],data:e.slices.map(o=>s(e,o,!0)),levels:P(e,p.sliceDepth(e.slices)),itemStyle:{borderColor:e.theme.tooltipBackgroundColor,borderWidth:b},label:{show:t,rotate:"radial",minAngle:L,formatter:a},emphasis:{focus:"none"}}}function O(e){return e.some(t=>t.children.length>0)}function F(e){const{theme:t}=e;return{animation:!1,textStyle:{fontFamily:t.fontFamily,color:t.labelColor},tooltip:I(e),series:[O(e.slices)?D(e):A(e)]}}exports.buildPieChartOption=F;exports.formatShare=i;
2
+ //# sourceMappingURL=pie-chart-option.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-chart-option.cjs","sources":["../../../../../../src/ui/components/charts/PieChart/pie-chart-option.ts"],"sourcesContent":["import { labelColorOnFill } from \"../chart-label-color\";\nimport type { ChartTheme } from \"../chart-theme\";\nimport type { PieSlice } from \"./pie-chart-slices\";\nimport { sliceDepth } from \"./pie-chart-slices\";\n\nexport type PieChartLabelContent = \"name\" | \"percent\" | \"value\";\n\nexport type PieChartShape = \"donut\" | \"pie\";\n\nexport interface PieChartOptionInput {\n slices: PieSlice[];\n shape: PieChartShape;\n labelContent: PieChartLabelContent[];\n theme: ChartTheme;\n valueFormatter?: (value: number) => string;\n}\n\nconst DONUT_HOLE_RADIUS_PERCENT: number = 40;\n\nconst FULL_PIE_OUTER_RADIUS_PERCENT: number = 85;\n\nconst MIN_INSIDE_LABEL_ANGLE_DEGREES: number = 8;\n\nconst RING_THICKNESS_PERCENT: number = 32;\n\nconst OUTER_RADIUS_LIMIT_PERCENT: number = 92;\n\nconst PATH_SEPARATOR: string = \" > \";\n\nconst MIN_LABELED_ANGLE_DEGREES: number = 10;\n\nconst RING_BORDER_WIDTH_PX: number = 2;\n\nconst PERCENT_LABEL: Intl.NumberFormat = new Intl.NumberFormat(undefined, {\n style: \"percent\",\n maximumFractionDigits: 1,\n});\n\nexport function formatShare(share: number): string {\n return PERCENT_LABEL.format(share);\n}\n\nfunction formatValue(input: PieChartOptionInput, value: number): string {\n return input.valueFormatter ? input.valueFormatter(value) : String(value);\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction labelText(input: PieChartOptionInput, slice: PieSlice): string {\n const parts: string[] = [];\n if (input.labelContent.includes(\"name\")) parts.push(slice.name);\n if (input.labelContent.includes(\"percent\")) parts.push(formatShare(slice.share));\n if (input.labelContent.includes(\"value\")) parts.push(formatValue(input, slice.value));\n return parts.join(\" \");\n}\n\nfunction tooltipHtml(input: PieChartOptionInput, slice: PieSlice): string {\n const path: string = escapeHtml(slice.path.join(PATH_SEPARATOR));\n const value: string = escapeHtml(formatValue(input, slice.value));\n return `<div>${path}</div><div><b>${value}</b> · ${formatShare(slice.share)}</div>`;\n}\n\ninterface DataItem {\n id: string;\n name: string;\n value: number;\n itemStyle: { color: string };\n label?: { color: string };\n labelText: string;\n tooltip: string;\n children?: DataItem[];\n}\n\nfunction toDataItem(input: PieChartOptionInput, slice: PieSlice, withChildren: boolean): DataItem {\n return {\n id: slice.id,\n name: slice.name,\n value: slice.value,\n itemStyle: { color: slice.color },\n label: { color: labelColorOnFill(slice.color) },\n labelText: labelText(input, slice),\n tooltip: tooltipHtml(input, slice),\n children: withChildren\n ? slice.children.map((child: PieSlice) => toDataItem(input, child, true))\n : undefined,\n };\n}\n\nfunction tooltipOption(input: PieChartOptionInput): Record<string, unknown> {\n const { theme } = input;\n return {\n trigger: \"item\",\n backgroundColor: theme.tooltipBackgroundColor,\n borderColor: theme.tooltipBorderColor,\n textStyle: { color: theme.labelColor },\n formatter: (params: { data: DataItem }) => params.data.tooltip,\n };\n}\n\nfunction labelFormatter(params: { data: DataItem }): string {\n return params.data.labelText;\n}\n\nfunction holeRadiusPercent(input: PieChartOptionInput): number {\n return input.shape === \"pie\" ? 0 : DONUT_HOLE_RADIUS_PERCENT;\n}\n\nfunction pieRadius(input: PieChartOptionInput): [string, string] {\n if (input.shape === \"pie\") return [\"0%\", `${FULL_PIE_OUTER_RADIUS_PERCENT}%`];\n return [\n `${DONUT_HOLE_RADIUS_PERCENT}%`,\n `${DONUT_HOLE_RADIUS_PERCENT + RING_THICKNESS_PERCENT}%`,\n ];\n}\n\nfunction pieLabel(input: PieChartOptionInput): Record<string, unknown> {\n const show: boolean = input.labelContent.length > 0;\n if (input.shape === \"pie\") {\n return { show, position: \"inside\", formatter: labelFormatter };\n }\n return { show, position: \"outside\", color: input.theme.labelColor, formatter: labelFormatter };\n}\n\nfunction pieSeries(input: PieChartOptionInput): Record<string, unknown> {\n const isFullPie: boolean = input.shape === \"pie\";\n return {\n type: \"pie\",\n radius: pieRadius(input),\n data: input.slices.map((slice: PieSlice) => {\n const { label: fillLabel, ...item } = toDataItem(input, slice, false);\n return isFullPie ? { ...item, label: fillLabel } : item;\n }),\n itemStyle: { borderColor: input.theme.tooltipBackgroundColor, borderWidth: RING_BORDER_WIDTH_PX },\n label: pieLabel(input),\n minShowLabelAngle: isFullPie ? MIN_INSIDE_LABEL_ANGLE_DEGREES : 0,\n labelLine: { show: !isFullPie && input.labelContent.length > 0 },\n labelLayout: { hideOverlap: true },\n emphasis: { scale: false },\n };\n}\n\nfunction sunburstLevels(input: PieChartOptionInput, depth: number): Array<Record<string, unknown>> {\n const hole: number = holeRadiusPercent(input);\n const evenThickness: number = (OUTER_RADIUS_LIMIT_PERCENT - hole) / depth;\n const thickness: number =\n input.shape === \"pie\" ? evenThickness : Math.min(RING_THICKNESS_PERCENT, evenThickness);\n const rings: Array<Record<string, unknown>> = Array.from(\n { length: depth },\n (_unused, ringIndex: number) => ({\n r0: `${hole + thickness * ringIndex}%`,\n r: `${hole + thickness * (ringIndex + 1)}%`,\n }),\n );\n return [{}, ...rings];\n}\n\nfunction sunburstSeries(input: PieChartOptionInput): Record<string, unknown> {\n const hasLabels: boolean = input.labelContent.length > 0;\n return {\n type: \"sunburst\",\n nodeClick: false,\n sort: null,\n radius: [`${holeRadiusPercent(input)}%`, `${OUTER_RADIUS_LIMIT_PERCENT}%`],\n data: input.slices.map((slice: PieSlice) => toDataItem(input, slice, true)),\n levels: sunburstLevels(input, sliceDepth(input.slices)),\n itemStyle: { borderColor: input.theme.tooltipBackgroundColor, borderWidth: RING_BORDER_WIDTH_PX },\n label: {\n show: hasLabels,\n rotate: \"radial\",\n minAngle: MIN_LABELED_ANGLE_DEGREES,\n formatter: labelFormatter,\n },\n emphasis: { focus: \"none\" },\n };\n}\n\nfunction isHierarchical(slices: PieSlice[]): boolean {\n return slices.some((slice: PieSlice) => slice.children.length > 0);\n}\n\nexport function buildPieChartOption(input: PieChartOptionInput): Record<string, unknown> {\n const { theme } = input;\n return {\n animation: false,\n textStyle: { fontFamily: theme.fontFamily, color: theme.labelColor },\n tooltip: tooltipOption(input),\n series: [isHierarchical(input.slices) ? sunburstSeries(input) : pieSeries(input)],\n };\n}\n"],"names":["DONUT_HOLE_RADIUS_PERCENT","FULL_PIE_OUTER_RADIUS_PERCENT","MIN_INSIDE_LABEL_ANGLE_DEGREES","RING_THICKNESS_PERCENT","OUTER_RADIUS_LIMIT_PERCENT","PATH_SEPARATOR","MIN_LABELED_ANGLE_DEGREES","RING_BORDER_WIDTH_PX","PERCENT_LABEL","formatShare","share","formatValue","input","value","escapeHtml","text","labelText","slice","parts","tooltipHtml","path","toDataItem","withChildren","labelColorOnFill","child","tooltipOption","theme","params","labelFormatter","holeRadiusPercent","pieRadius","pieLabel","show","pieSeries","isFullPie","fillLabel","item","sunburstLevels","depth","hole","evenThickness","thickness","rings","_unused","ringIndex","sunburstSeries","hasLabels","sliceDepth","isHierarchical","slices","buildPieChartOption"],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { labelColorOnFill as p } from "../chart-label-color.js";
2
+ import { sliceDepth as C } from "./pie-chart-slices.js";
3
+ const n = 40, _ = 85, g = 8, u = 32, m = 92, R = " > ", L = 10, h = 2, S = new Intl.NumberFormat(void 0, {
4
+ style: "percent",
5
+ maximumFractionDigits: 1
6
+ });
7
+ function d(e) {
8
+ return S.format(e);
9
+ }
10
+ function f(e, t) {
11
+ return e.valueFormatter ? e.valueFormatter(t) : String(t);
12
+ }
13
+ function c(e) {
14
+ return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
15
+ }
16
+ function v(e, t) {
17
+ const o = [];
18
+ return e.labelContent.includes("name") && o.push(t.name), e.labelContent.includes("percent") && o.push(d(t.share)), e.labelContent.includes("value") && o.push(f(e, t.value)), o.join(" ");
19
+ }
20
+ function T(e, t) {
21
+ const o = c(t.path.join(R)), r = c(f(e, t.value));
22
+ return `<div>${o}</div><div><b>${r}</b> · ${d(t.share)}</div>`;
23
+ }
24
+ function s(e, t, o) {
25
+ return {
26
+ id: t.id,
27
+ name: t.name,
28
+ value: t.value,
29
+ itemStyle: { color: t.color },
30
+ label: { color: p(t.color) },
31
+ labelText: v(e, t),
32
+ tooltip: T(e, t),
33
+ children: o ? t.children.map((r) => s(e, r, !0)) : void 0
34
+ };
35
+ }
36
+ function I(e) {
37
+ const { theme: t } = e;
38
+ return {
39
+ trigger: "item",
40
+ backgroundColor: t.tooltipBackgroundColor,
41
+ borderColor: t.tooltipBorderColor,
42
+ textStyle: { color: t.labelColor },
43
+ formatter: (o) => o.data.tooltip
44
+ };
45
+ }
46
+ function a(e) {
47
+ return e.data.labelText;
48
+ }
49
+ function b(e) {
50
+ return e.shape === "pie" ? 0 : n;
51
+ }
52
+ function N(e) {
53
+ return e.shape === "pie" ? ["0%", `${_}%`] : [
54
+ `${n}%`,
55
+ `${n + u}%`
56
+ ];
57
+ }
58
+ function A(e) {
59
+ const t = e.labelContent.length > 0;
60
+ return e.shape === "pie" ? { show: t, position: "inside", formatter: a } : { show: t, position: "outside", color: e.theme.labelColor, formatter: a };
61
+ }
62
+ function D(e) {
63
+ const t = e.shape === "pie";
64
+ return {
65
+ type: "pie",
66
+ radius: N(e),
67
+ data: e.slices.map((o) => {
68
+ const { label: r, ...l } = s(e, o, !1);
69
+ return t ? { ...l, label: r } : l;
70
+ }),
71
+ itemStyle: { borderColor: e.theme.tooltipBackgroundColor, borderWidth: h },
72
+ label: A(e),
73
+ minShowLabelAngle: t ? g : 0,
74
+ labelLine: { show: !t && e.labelContent.length > 0 },
75
+ labelLayout: { hideOverlap: !0 },
76
+ emphasis: { scale: !1 }
77
+ };
78
+ }
79
+ function y(e, t) {
80
+ const o = b(e), r = (m - o) / t, l = e.shape === "pie" ? r : Math.min(u, r), E = Array.from(
81
+ { length: t },
82
+ (O, i) => ({
83
+ r0: `${o + l * i}%`,
84
+ r: `${o + l * (i + 1)}%`
85
+ })
86
+ );
87
+ return [{}, ...E];
88
+ }
89
+ function P(e) {
90
+ const t = e.labelContent.length > 0;
91
+ return {
92
+ type: "sunburst",
93
+ nodeClick: !1,
94
+ sort: null,
95
+ radius: [`${b(e)}%`, `${m}%`],
96
+ data: e.slices.map((o) => s(e, o, !0)),
97
+ levels: y(e, C(e.slices)),
98
+ itemStyle: { borderColor: e.theme.tooltipBackgroundColor, borderWidth: h },
99
+ label: {
100
+ show: t,
101
+ rotate: "radial",
102
+ minAngle: L,
103
+ formatter: a
104
+ },
105
+ emphasis: { focus: "none" }
106
+ };
107
+ }
108
+ function F(e) {
109
+ return e.some((t) => t.children.length > 0);
110
+ }
111
+ function k(e) {
112
+ const { theme: t } = e;
113
+ return {
114
+ animation: !1,
115
+ textStyle: { fontFamily: t.fontFamily, color: t.labelColor },
116
+ tooltip: I(e),
117
+ series: [F(e.slices) ? P(e) : D(e)]
118
+ };
119
+ }
120
+ export {
121
+ k as buildPieChartOption,
122
+ d as formatShare
123
+ };
124
+ //# sourceMappingURL=pie-chart-option.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-chart-option.js","sources":["../../../../../../src/ui/components/charts/PieChart/pie-chart-option.ts"],"sourcesContent":["import { labelColorOnFill } from \"../chart-label-color\";\nimport type { ChartTheme } from \"../chart-theme\";\nimport type { PieSlice } from \"./pie-chart-slices\";\nimport { sliceDepth } from \"./pie-chart-slices\";\n\nexport type PieChartLabelContent = \"name\" | \"percent\" | \"value\";\n\nexport type PieChartShape = \"donut\" | \"pie\";\n\nexport interface PieChartOptionInput {\n slices: PieSlice[];\n shape: PieChartShape;\n labelContent: PieChartLabelContent[];\n theme: ChartTheme;\n valueFormatter?: (value: number) => string;\n}\n\nconst DONUT_HOLE_RADIUS_PERCENT: number = 40;\n\nconst FULL_PIE_OUTER_RADIUS_PERCENT: number = 85;\n\nconst MIN_INSIDE_LABEL_ANGLE_DEGREES: number = 8;\n\nconst RING_THICKNESS_PERCENT: number = 32;\n\nconst OUTER_RADIUS_LIMIT_PERCENT: number = 92;\n\nconst PATH_SEPARATOR: string = \" > \";\n\nconst MIN_LABELED_ANGLE_DEGREES: number = 10;\n\nconst RING_BORDER_WIDTH_PX: number = 2;\n\nconst PERCENT_LABEL: Intl.NumberFormat = new Intl.NumberFormat(undefined, {\n style: \"percent\",\n maximumFractionDigits: 1,\n});\n\nexport function formatShare(share: number): string {\n return PERCENT_LABEL.format(share);\n}\n\nfunction formatValue(input: PieChartOptionInput, value: number): string {\n return input.valueFormatter ? input.valueFormatter(value) : String(value);\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction labelText(input: PieChartOptionInput, slice: PieSlice): string {\n const parts: string[] = [];\n if (input.labelContent.includes(\"name\")) parts.push(slice.name);\n if (input.labelContent.includes(\"percent\")) parts.push(formatShare(slice.share));\n if (input.labelContent.includes(\"value\")) parts.push(formatValue(input, slice.value));\n return parts.join(\" \");\n}\n\nfunction tooltipHtml(input: PieChartOptionInput, slice: PieSlice): string {\n const path: string = escapeHtml(slice.path.join(PATH_SEPARATOR));\n const value: string = escapeHtml(formatValue(input, slice.value));\n return `<div>${path}</div><div><b>${value}</b> · ${formatShare(slice.share)}</div>`;\n}\n\ninterface DataItem {\n id: string;\n name: string;\n value: number;\n itemStyle: { color: string };\n label?: { color: string };\n labelText: string;\n tooltip: string;\n children?: DataItem[];\n}\n\nfunction toDataItem(input: PieChartOptionInput, slice: PieSlice, withChildren: boolean): DataItem {\n return {\n id: slice.id,\n name: slice.name,\n value: slice.value,\n itemStyle: { color: slice.color },\n label: { color: labelColorOnFill(slice.color) },\n labelText: labelText(input, slice),\n tooltip: tooltipHtml(input, slice),\n children: withChildren\n ? slice.children.map((child: PieSlice) => toDataItem(input, child, true))\n : undefined,\n };\n}\n\nfunction tooltipOption(input: PieChartOptionInput): Record<string, unknown> {\n const { theme } = input;\n return {\n trigger: \"item\",\n backgroundColor: theme.tooltipBackgroundColor,\n borderColor: theme.tooltipBorderColor,\n textStyle: { color: theme.labelColor },\n formatter: (params: { data: DataItem }) => params.data.tooltip,\n };\n}\n\nfunction labelFormatter(params: { data: DataItem }): string {\n return params.data.labelText;\n}\n\nfunction holeRadiusPercent(input: PieChartOptionInput): number {\n return input.shape === \"pie\" ? 0 : DONUT_HOLE_RADIUS_PERCENT;\n}\n\nfunction pieRadius(input: PieChartOptionInput): [string, string] {\n if (input.shape === \"pie\") return [\"0%\", `${FULL_PIE_OUTER_RADIUS_PERCENT}%`];\n return [\n `${DONUT_HOLE_RADIUS_PERCENT}%`,\n `${DONUT_HOLE_RADIUS_PERCENT + RING_THICKNESS_PERCENT}%`,\n ];\n}\n\nfunction pieLabel(input: PieChartOptionInput): Record<string, unknown> {\n const show: boolean = input.labelContent.length > 0;\n if (input.shape === \"pie\") {\n return { show, position: \"inside\", formatter: labelFormatter };\n }\n return { show, position: \"outside\", color: input.theme.labelColor, formatter: labelFormatter };\n}\n\nfunction pieSeries(input: PieChartOptionInput): Record<string, unknown> {\n const isFullPie: boolean = input.shape === \"pie\";\n return {\n type: \"pie\",\n radius: pieRadius(input),\n data: input.slices.map((slice: PieSlice) => {\n const { label: fillLabel, ...item } = toDataItem(input, slice, false);\n return isFullPie ? { ...item, label: fillLabel } : item;\n }),\n itemStyle: { borderColor: input.theme.tooltipBackgroundColor, borderWidth: RING_BORDER_WIDTH_PX },\n label: pieLabel(input),\n minShowLabelAngle: isFullPie ? MIN_INSIDE_LABEL_ANGLE_DEGREES : 0,\n labelLine: { show: !isFullPie && input.labelContent.length > 0 },\n labelLayout: { hideOverlap: true },\n emphasis: { scale: false },\n };\n}\n\nfunction sunburstLevels(input: PieChartOptionInput, depth: number): Array<Record<string, unknown>> {\n const hole: number = holeRadiusPercent(input);\n const evenThickness: number = (OUTER_RADIUS_LIMIT_PERCENT - hole) / depth;\n const thickness: number =\n input.shape === \"pie\" ? evenThickness : Math.min(RING_THICKNESS_PERCENT, evenThickness);\n const rings: Array<Record<string, unknown>> = Array.from(\n { length: depth },\n (_unused, ringIndex: number) => ({\n r0: `${hole + thickness * ringIndex}%`,\n r: `${hole + thickness * (ringIndex + 1)}%`,\n }),\n );\n return [{}, ...rings];\n}\n\nfunction sunburstSeries(input: PieChartOptionInput): Record<string, unknown> {\n const hasLabels: boolean = input.labelContent.length > 0;\n return {\n type: \"sunburst\",\n nodeClick: false,\n sort: null,\n radius: [`${holeRadiusPercent(input)}%`, `${OUTER_RADIUS_LIMIT_PERCENT}%`],\n data: input.slices.map((slice: PieSlice) => toDataItem(input, slice, true)),\n levels: sunburstLevels(input, sliceDepth(input.slices)),\n itemStyle: { borderColor: input.theme.tooltipBackgroundColor, borderWidth: RING_BORDER_WIDTH_PX },\n label: {\n show: hasLabels,\n rotate: \"radial\",\n minAngle: MIN_LABELED_ANGLE_DEGREES,\n formatter: labelFormatter,\n },\n emphasis: { focus: \"none\" },\n };\n}\n\nfunction isHierarchical(slices: PieSlice[]): boolean {\n return slices.some((slice: PieSlice) => slice.children.length > 0);\n}\n\nexport function buildPieChartOption(input: PieChartOptionInput): Record<string, unknown> {\n const { theme } = input;\n return {\n animation: false,\n textStyle: { fontFamily: theme.fontFamily, color: theme.labelColor },\n tooltip: tooltipOption(input),\n series: [isHierarchical(input.slices) ? sunburstSeries(input) : pieSeries(input)],\n };\n}\n"],"names":["DONUT_HOLE_RADIUS_PERCENT","FULL_PIE_OUTER_RADIUS_PERCENT","MIN_INSIDE_LABEL_ANGLE_DEGREES","RING_THICKNESS_PERCENT","OUTER_RADIUS_LIMIT_PERCENT","PATH_SEPARATOR","MIN_LABELED_ANGLE_DEGREES","RING_BORDER_WIDTH_PX","PERCENT_LABEL","formatShare","share","formatValue","input","value","escapeHtml","text","labelText","slice","parts","tooltipHtml","path","toDataItem","withChildren","labelColorOnFill","child","tooltipOption","theme","params","labelFormatter","holeRadiusPercent","pieRadius","pieLabel","show","pieSeries","isFullPie","fillLabel","item","sunburstLevels","depth","hole","evenThickness","thickness","rings","_unused","ringIndex","sunburstSeries","hasLabels","sliceDepth","isHierarchical","slices","buildPieChartOption"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("../chart-color-tone.cjs"),O=.22;function S(e){return e!==null&&Number.isFinite(e)&&e>0}function N(e){return e.reduce((r,t)=>r+(t.value??0),0)}function P(e){return e.filter(r=>S(r.value))}function s(e,r){return e.name===""?r:e.name}function y(e,r,t){return r===void 0?t.colorsByRootId[e.id]??t.fallbackColor:e.isOthers?t.fallbackColor:v.lightenColor(r,O)}function a(e,r,t,n){const l=P(e),m=N(l);return l.map(i=>{const b=i.isOthers===!0,o=s(i,n.othersName),c=[...r,o],u=y(i,t,n);return{id:i.id,name:o,value:i.value,share:i.value/m,path:c,color:u,isOthers:b,children:a(i.children??[],c,u,n)}})}function T(e){return a(e.nodes,[],void 0,e)}function f(e,r){for(const t of e){if(t.id===r)return t;const n=f(t.children,r);if(n)return n}}function d(e,r){for(const t of e){if(t.children.some(l=>l.id===r))return t;const n=d(t.children,r);if(n)return n}}function h(e){return e.length===0?0:1+Math.max(...e.map(r=>h(r.children)))}function g(e){return e.reduce((r,t)=>r+t.value,0)}exports.buildPieSlices=T;exports.displayNameOf=s;exports.findParentSlice=d;exports.findSlice=f;exports.sliceDepth=h;exports.totalOf=g;
2
+ //# sourceMappingURL=pie-chart-slices.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-chart-slices.cjs","sources":["../../../../../../src/ui/components/charts/PieChart/pie-chart-slices.ts"],"sourcesContent":["import { lightenColor } from \"../chart-color-tone\";\n\nexport interface PieChartNode {\n id: string;\n name: string;\n value: number | null;\n // Nome de token, nunca hex, e só do primeiro nível: os filhos herdam o tom do pai.\n colorToken?: string;\n isOthers?: boolean;\n children?: PieChartNode[];\n}\n\nexport interface PieSlice {\n id: string;\n name: string;\n value: number;\n share: number;\n path: string[];\n color: string;\n isOthers: boolean;\n children: PieSlice[];\n}\n\nexport interface BuildPieSlicesInput {\n nodes: PieChartNode[];\n colorsByRootId: Record<string, string>;\n fallbackColor: string;\n othersName: string;\n}\n\nconst CHILD_LIGHTEN_STEP: number = 0.22;\n\nfunction isDrawableValue(value: number | null): value is number {\n return value !== null && Number.isFinite(value) && value > 0;\n}\n\nfunction sumValues(nodes: PieChartNode[]): number {\n return nodes.reduce((total: number, node: PieChartNode) => total + (node.value ?? 0), 0);\n}\n\nfunction drawableNodes(nodes: PieChartNode[]): PieChartNode[] {\n return nodes.filter((node: PieChartNode) => isDrawableValue(node.value));\n}\n\nexport function displayNameOf(node: PieChartNode, othersName: string): string {\n return node.name === \"\" ? othersName : node.name;\n}\n\nfunction colorOf(\n node: PieChartNode,\n parentColor: string | undefined,\n input: BuildPieSlicesInput,\n): string {\n if (parentColor === undefined) return input.colorsByRootId[node.id] ?? input.fallbackColor;\n if (node.isOthers) return input.fallbackColor;\n return lightenColor(parentColor, CHILD_LIGHTEN_STEP);\n}\n\nfunction buildLevel(\n nodes: PieChartNode[],\n parentPath: string[],\n parentColor: string | undefined,\n input: BuildPieSlicesInput,\n): PieSlice[] {\n const drawable: PieChartNode[] = drawableNodes(nodes);\n const levelTotal: number = sumValues(drawable);\n return drawable.map((node: PieChartNode): PieSlice => {\n const isOthers: boolean = node.isOthers === true;\n const name: string = displayNameOf(node, input.othersName);\n const path: string[] = [...parentPath, name];\n const color: string = colorOf(node, parentColor, input);\n return {\n id: node.id,\n name,\n value: node.value as number,\n share: (node.value as number) / levelTotal,\n path,\n color,\n isOthers,\n children: buildLevel(node.children ?? [], path, color, input),\n };\n });\n}\n\nexport function buildPieSlices(input: BuildPieSlicesInput): PieSlice[] {\n return buildLevel(input.nodes, [], undefined, input);\n}\n\nexport function findSlice(slices: PieSlice[], id: string): PieSlice | undefined {\n for (const slice of slices) {\n if (slice.id === id) return slice;\n const nested: PieSlice | undefined = findSlice(slice.children, id);\n if (nested) return nested;\n }\n return undefined;\n}\n\nexport function findParentSlice(slices: PieSlice[], id: string): PieSlice | undefined {\n for (const slice of slices) {\n if (slice.children.some((child: PieSlice) => child.id === id)) return slice;\n const nested: PieSlice | undefined = findParentSlice(slice.children, id);\n if (nested) return nested;\n }\n return undefined;\n}\n\nexport function sliceDepth(slices: PieSlice[]): number {\n if (slices.length === 0) return 0;\n return 1 + Math.max(...slices.map((slice: PieSlice) => sliceDepth(slice.children)));\n}\n\nexport function totalOf(slices: PieSlice[]): number {\n return slices.reduce((total: number, slice: PieSlice) => total + slice.value, 0);\n}\n"],"names":["CHILD_LIGHTEN_STEP","isDrawableValue","value","sumValues","nodes","total","node","drawableNodes","displayNameOf","othersName","colorOf","parentColor","input","lightenColor","buildLevel","parentPath","drawable","levelTotal","isOthers","name","path","color","buildPieSlices","findSlice","slices","id","slice","nested","findParentSlice","child","sliceDepth","totalOf"],"mappings":"2HA8BMA,EAA6B,IAEnC,SAASC,EAAgBC,EAAuC,CAC9D,OAAOA,IAAU,MAAQ,OAAO,SAASA,CAAK,GAAKA,EAAQ,CAC7D,CAEA,SAASC,EAAUC,EAA+B,CAChD,OAAOA,EAAM,OAAO,CAACC,EAAeC,IAAuBD,GAASC,EAAK,OAAS,GAAI,CAAC,CACzF,CAEA,SAASC,EAAcH,EAAuC,CAC5D,OAAOA,EAAM,OAAQE,GAAuBL,EAAgBK,EAAK,KAAK,CAAC,CACzE,CAEO,SAASE,EAAcF,EAAoBG,EAA4B,CAC5E,OAAOH,EAAK,OAAS,GAAKG,EAAaH,EAAK,IAC9C,CAEA,SAASI,EACPJ,EACAK,EACAC,EACQ,CACR,OAAID,IAAgB,OAAkBC,EAAM,eAAeN,EAAK,EAAE,GAAKM,EAAM,cACzEN,EAAK,SAAiBM,EAAM,cACzBC,EAAAA,aAAaF,EAAaX,CAAkB,CACrD,CAEA,SAASc,EACPV,EACAW,EACAJ,EACAC,EACY,CACZ,MAAMI,EAA2BT,EAAcH,CAAK,EAC9Ca,EAAqBd,EAAUa,CAAQ,EAC7C,OAAOA,EAAS,IAAKV,GAAiC,CACpD,MAAMY,EAAoBZ,EAAK,WAAa,GACtCa,EAAeX,EAAcF,EAAMM,EAAM,UAAU,EACnDQ,EAAiB,CAAC,GAAGL,EAAYI,CAAI,EACrCE,EAAgBX,EAAQJ,EAAMK,EAAaC,CAAK,EACtD,MAAO,CACL,GAAIN,EAAK,GACT,KAAAa,EACA,MAAOb,EAAK,MACZ,MAAQA,EAAK,MAAmBW,EAChC,KAAAG,EACA,MAAAC,EACA,SAAAH,EACA,SAAUJ,EAAWR,EAAK,UAAY,CAAA,EAAIc,EAAMC,EAAOT,CAAK,CAAA,CAEhE,CAAC,CACH,CAEO,SAASU,EAAeV,EAAwC,CACrE,OAAOE,EAAWF,EAAM,MAAO,CAAA,EAAI,OAAWA,CAAK,CACrD,CAEO,SAASW,EAAUC,EAAoBC,EAAkC,CAC9E,UAAWC,KAASF,EAAQ,CAC1B,GAAIE,EAAM,KAAOD,EAAI,OAAOC,EAC5B,MAAMC,EAA+BJ,EAAUG,EAAM,SAAUD,CAAE,EACjE,GAAIE,EAAQ,OAAOA,CACrB,CAEF,CAEO,SAASC,EAAgBJ,EAAoBC,EAAkC,CACpF,UAAWC,KAASF,EAAQ,CAC1B,GAAIE,EAAM,SAAS,KAAMG,GAAoBA,EAAM,KAAOJ,CAAE,EAAG,OAAOC,EACtE,MAAMC,EAA+BC,EAAgBF,EAAM,SAAUD,CAAE,EACvE,GAAIE,EAAQ,OAAOA,CACrB,CAEF,CAEO,SAASG,EAAWN,EAA4B,CACrD,OAAIA,EAAO,SAAW,EAAU,EACzB,EAAI,KAAK,IAAI,GAAGA,EAAO,IAAKE,GAAoBI,EAAWJ,EAAM,QAAQ,CAAC,CAAC,CACpF,CAEO,SAASK,EAAQP,EAA4B,CAClD,OAAOA,EAAO,OAAO,CAACnB,EAAeqB,IAAoBrB,EAAQqB,EAAM,MAAO,CAAC,CACjF"}
@@ -0,0 +1,65 @@
1
+ import { lightenColor as d } from "../chart-color-tone.js";
2
+ const h = 0.22;
3
+ function m(r) {
4
+ return r !== null && Number.isFinite(r) && r > 0;
5
+ }
6
+ function v(r) {
7
+ return r.reduce((e, n) => e + (n.value ?? 0), 0);
8
+ }
9
+ function b(r) {
10
+ return r.filter((e) => m(e.value));
11
+ }
12
+ function O(r, e) {
13
+ return r.name === "" ? e : r.name;
14
+ }
15
+ function N(r, e, n) {
16
+ return e === void 0 ? n.colorsByRootId[r.id] ?? n.fallbackColor : r.isOthers ? n.fallbackColor : d(e, h);
17
+ }
18
+ function s(r, e, n, t) {
19
+ const o = b(r), f = v(o);
20
+ return o.map((i) => {
21
+ const a = i.isOthers === !0, l = O(i, t.othersName), c = [...e, l], u = N(i, n, t);
22
+ return {
23
+ id: i.id,
24
+ name: l,
25
+ value: i.value,
26
+ share: i.value / f,
27
+ path: c,
28
+ color: u,
29
+ isOthers: a,
30
+ children: s(i.children ?? [], c, u, t)
31
+ };
32
+ });
33
+ }
34
+ function I(r) {
35
+ return s(r.nodes, [], void 0, r);
36
+ }
37
+ function S(r, e) {
38
+ for (const n of r) {
39
+ if (n.id === e) return n;
40
+ const t = S(n.children, e);
41
+ if (t) return t;
42
+ }
43
+ }
44
+ function w(r, e) {
45
+ for (const n of r) {
46
+ if (n.children.some((o) => o.id === e)) return n;
47
+ const t = w(n.children, e);
48
+ if (t) return t;
49
+ }
50
+ }
51
+ function C(r) {
52
+ return r.length === 0 ? 0 : 1 + Math.max(...r.map((e) => C(e.children)));
53
+ }
54
+ function L(r) {
55
+ return r.reduce((e, n) => e + n.value, 0);
56
+ }
57
+ export {
58
+ I as buildPieSlices,
59
+ O as displayNameOf,
60
+ w as findParentSlice,
61
+ S as findSlice,
62
+ C as sliceDepth,
63
+ L as totalOf
64
+ };
65
+ //# sourceMappingURL=pie-chart-slices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-chart-slices.js","sources":["../../../../../../src/ui/components/charts/PieChart/pie-chart-slices.ts"],"sourcesContent":["import { lightenColor } from \"../chart-color-tone\";\n\nexport interface PieChartNode {\n id: string;\n name: string;\n value: number | null;\n // Nome de token, nunca hex, e só do primeiro nível: os filhos herdam o tom do pai.\n colorToken?: string;\n isOthers?: boolean;\n children?: PieChartNode[];\n}\n\nexport interface PieSlice {\n id: string;\n name: string;\n value: number;\n share: number;\n path: string[];\n color: string;\n isOthers: boolean;\n children: PieSlice[];\n}\n\nexport interface BuildPieSlicesInput {\n nodes: PieChartNode[];\n colorsByRootId: Record<string, string>;\n fallbackColor: string;\n othersName: string;\n}\n\nconst CHILD_LIGHTEN_STEP: number = 0.22;\n\nfunction isDrawableValue(value: number | null): value is number {\n return value !== null && Number.isFinite(value) && value > 0;\n}\n\nfunction sumValues(nodes: PieChartNode[]): number {\n return nodes.reduce((total: number, node: PieChartNode) => total + (node.value ?? 0), 0);\n}\n\nfunction drawableNodes(nodes: PieChartNode[]): PieChartNode[] {\n return nodes.filter((node: PieChartNode) => isDrawableValue(node.value));\n}\n\nexport function displayNameOf(node: PieChartNode, othersName: string): string {\n return node.name === \"\" ? othersName : node.name;\n}\n\nfunction colorOf(\n node: PieChartNode,\n parentColor: string | undefined,\n input: BuildPieSlicesInput,\n): string {\n if (parentColor === undefined) return input.colorsByRootId[node.id] ?? input.fallbackColor;\n if (node.isOthers) return input.fallbackColor;\n return lightenColor(parentColor, CHILD_LIGHTEN_STEP);\n}\n\nfunction buildLevel(\n nodes: PieChartNode[],\n parentPath: string[],\n parentColor: string | undefined,\n input: BuildPieSlicesInput,\n): PieSlice[] {\n const drawable: PieChartNode[] = drawableNodes(nodes);\n const levelTotal: number = sumValues(drawable);\n return drawable.map((node: PieChartNode): PieSlice => {\n const isOthers: boolean = node.isOthers === true;\n const name: string = displayNameOf(node, input.othersName);\n const path: string[] = [...parentPath, name];\n const color: string = colorOf(node, parentColor, input);\n return {\n id: node.id,\n name,\n value: node.value as number,\n share: (node.value as number) / levelTotal,\n path,\n color,\n isOthers,\n children: buildLevel(node.children ?? [], path, color, input),\n };\n });\n}\n\nexport function buildPieSlices(input: BuildPieSlicesInput): PieSlice[] {\n return buildLevel(input.nodes, [], undefined, input);\n}\n\nexport function findSlice(slices: PieSlice[], id: string): PieSlice | undefined {\n for (const slice of slices) {\n if (slice.id === id) return slice;\n const nested: PieSlice | undefined = findSlice(slice.children, id);\n if (nested) return nested;\n }\n return undefined;\n}\n\nexport function findParentSlice(slices: PieSlice[], id: string): PieSlice | undefined {\n for (const slice of slices) {\n if (slice.children.some((child: PieSlice) => child.id === id)) return slice;\n const nested: PieSlice | undefined = findParentSlice(slice.children, id);\n if (nested) return nested;\n }\n return undefined;\n}\n\nexport function sliceDepth(slices: PieSlice[]): number {\n if (slices.length === 0) return 0;\n return 1 + Math.max(...slices.map((slice: PieSlice) => sliceDepth(slice.children)));\n}\n\nexport function totalOf(slices: PieSlice[]): number {\n return slices.reduce((total: number, slice: PieSlice) => total + slice.value, 0);\n}\n"],"names":["CHILD_LIGHTEN_STEP","isDrawableValue","value","sumValues","nodes","total","node","drawableNodes","displayNameOf","othersName","colorOf","parentColor","input","lightenColor","buildLevel","parentPath","drawable","levelTotal","isOthers","name","path","color","buildPieSlices","findSlice","slices","id","slice","nested","findParentSlice","child","sliceDepth","totalOf"],"mappings":";AA8BA,MAAMA,IAA6B;AAEnC,SAASC,EAAgBC,GAAuC;AAC9D,SAAOA,MAAU,QAAQ,OAAO,SAASA,CAAK,KAAKA,IAAQ;AAC7D;AAEA,SAASC,EAAUC,GAA+B;AAChD,SAAOA,EAAM,OAAO,CAACC,GAAeC,MAAuBD,KAASC,EAAK,SAAS,IAAI,CAAC;AACzF;AAEA,SAASC,EAAcH,GAAuC;AAC5D,SAAOA,EAAM,OAAO,CAACE,MAAuBL,EAAgBK,EAAK,KAAK,CAAC;AACzE;AAEO,SAASE,EAAcF,GAAoBG,GAA4B;AAC5E,SAAOH,EAAK,SAAS,KAAKG,IAAaH,EAAK;AAC9C;AAEA,SAASI,EACPJ,GACAK,GACAC,GACQ;AACR,SAAID,MAAgB,SAAkBC,EAAM,eAAeN,EAAK,EAAE,KAAKM,EAAM,gBACzEN,EAAK,WAAiBM,EAAM,gBACzBC,EAAaF,GAAaX,CAAkB;AACrD;AAEA,SAASc,EACPV,GACAW,GACAJ,GACAC,GACY;AACZ,QAAMI,IAA2BT,EAAcH,CAAK,GAC9Ca,IAAqBd,EAAUa,CAAQ;AAC7C,SAAOA,EAAS,IAAI,CAACV,MAAiC;AACpD,UAAMY,IAAoBZ,EAAK,aAAa,IACtCa,IAAeX,EAAcF,GAAMM,EAAM,UAAU,GACnDQ,IAAiB,CAAC,GAAGL,GAAYI,CAAI,GACrCE,IAAgBX,EAAQJ,GAAMK,GAAaC,CAAK;AACtD,WAAO;AAAA,MACL,IAAIN,EAAK;AAAA,MACT,MAAAa;AAAA,MACA,OAAOb,EAAK;AAAA,MACZ,OAAQA,EAAK,QAAmBW;AAAA,MAChC,MAAAG;AAAA,MACA,OAAAC;AAAA,MACA,UAAAH;AAAA,MACA,UAAUJ,EAAWR,EAAK,YAAY,CAAA,GAAIc,GAAMC,GAAOT,CAAK;AAAA,IAAA;AAAA,EAEhE,CAAC;AACH;AAEO,SAASU,EAAeV,GAAwC;AACrE,SAAOE,EAAWF,EAAM,OAAO,CAAA,GAAI,QAAWA,CAAK;AACrD;AAEO,SAASW,EAAUC,GAAoBC,GAAkC;AAC9E,aAAWC,KAASF,GAAQ;AAC1B,QAAIE,EAAM,OAAOD,EAAI,QAAOC;AAC5B,UAAMC,IAA+BJ,EAAUG,EAAM,UAAUD,CAAE;AACjE,QAAIE,EAAQ,QAAOA;AAAA,EACrB;AAEF;AAEO,SAASC,EAAgBJ,GAAoBC,GAAkC;AACpF,aAAWC,KAASF,GAAQ;AAC1B,QAAIE,EAAM,SAAS,KAAK,CAACG,MAAoBA,EAAM,OAAOJ,CAAE,EAAG,QAAOC;AACtE,UAAMC,IAA+BC,EAAgBF,EAAM,UAAUD,CAAE;AACvE,QAAIE,EAAQ,QAAOA;AAAA,EACrB;AAEF;AAEO,SAASG,EAAWN,GAA4B;AACrD,SAAIA,EAAO,WAAW,IAAU,IACzB,IAAI,KAAK,IAAI,GAAGA,EAAO,IAAI,CAACE,MAAoBI,EAAWJ,EAAM,QAAQ,CAAC,CAAC;AACpF;AAEO,SAASK,EAAQP,GAA4B;AAClD,SAAOA,EAAO,OAAO,CAACnB,GAAeqB,MAAoBrB,IAAQqB,EAAM,OAAO,CAAC;AACjF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./chart-label-color.cjs"),a=255;function i(e,n){const r=u.parseColorChannels(e);if(!r)return e;const[o,l,s]=r.map(t=>Math.round(t+(a-t)*n));return`rgb(${o}, ${l}, ${s})`}exports.lightenColor=i;
2
+ //# sourceMappingURL=chart-color-tone.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-color-tone.cjs","sources":["../../../../../src/ui/components/charts/chart-color-tone.ts"],"sourcesContent":["import { parseColorChannels } from \"./chart-label-color\";\n\nconst MAX_CHANNEL: number = 255;\n\nexport function lightenColor(color: string, amount: number): string {\n const channels: [number, number, number] | undefined = parseColorChannels(color);\n if (!channels) return color;\n const [red, green, blue] = channels.map((channel: number) =>\n Math.round(channel + (MAX_CHANNEL - channel) * amount),\n );\n return `rgb(${red}, ${green}, ${blue})`;\n}\n"],"names":["MAX_CHANNEL","lightenColor","color","amount","channels","parseColorChannels","red","green","blue","channel"],"mappings":"2HAEMA,EAAsB,IAErB,SAASC,EAAaC,EAAeC,EAAwB,CAClE,MAAMC,EAAiDC,EAAAA,mBAAmBH,CAAK,EAC/E,GAAI,CAACE,EAAU,OAAOF,EACtB,KAAM,CAACI,EAAKC,EAAOC,CAAI,EAAIJ,EAAS,IAAKK,GACvC,KAAK,MAAMA,GAAWT,EAAcS,GAAWN,CAAM,CAAA,EAEvD,MAAO,OAAOG,CAAG,KAAKC,CAAK,KAAKC,CAAI,GACtC"}
@@ -0,0 +1,14 @@
1
+ import { parseColorChannels as a } from "./chart-label-color.js";
2
+ const i = 255;
3
+ function p(r, o) {
4
+ const n = a(r);
5
+ if (!n) return r;
6
+ const [t, s, u] = n.map(
7
+ (e) => Math.round(e + (i - e) * o)
8
+ );
9
+ return `rgb(${t}, ${s}, ${u})`;
10
+ }
11
+ export {
12
+ p as lightenColor
13
+ };
14
+ //# sourceMappingURL=chart-color-tone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-color-tone.js","sources":["../../../../../src/ui/components/charts/chart-color-tone.ts"],"sourcesContent":["import { parseColorChannels } from \"./chart-label-color\";\n\nconst MAX_CHANNEL: number = 255;\n\nexport function lightenColor(color: string, amount: number): string {\n const channels: [number, number, number] | undefined = parseColorChannels(color);\n if (!channels) return color;\n const [red, green, blue] = channels.map((channel: number) =>\n Math.round(channel + (MAX_CHANNEL - channel) * amount),\n );\n return `rgb(${red}, ${green}, ${blue})`;\n}\n"],"names":["MAX_CHANNEL","lightenColor","color","amount","channels","parseColorChannels","red","green","blue","channel"],"mappings":";AAEA,MAAMA,IAAsB;AAErB,SAASC,EAAaC,GAAeC,GAAwB;AAClE,QAAMC,IAAiDC,EAAmBH,CAAK;AAC/E,MAAI,CAACE,EAAU,QAAOF;AACtB,QAAM,CAACI,GAAKC,GAAOC,CAAI,IAAIJ,EAAS;AAAA,IAAI,CAACK,MACvC,KAAK,MAAMA,KAAWT,IAAcS,KAAWN,CAAM;AAAA,EAAA;AAEvD,SAAO,OAAOG,CAAG,KAAKC,CAAK,KAAKC,CAAI;AACtC;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i="#ffffff",l="#1e1e1e",u=.0144,L=1;function f(t){const n=t/255;return n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4)}function s(t){const n=t.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);if(n){const r=n[1],o=r.length===3?r.split("").map(a=>a+a).join(""):r;return[0,2,4].map(a=>parseInt(o.slice(a,a+2),16))}const e=t.trim().match(/^rgba?\(\s*(\d+)[\s,]+(\d+)[\s,]+(\d+)/i);if(e)return[Number(e[1]),Number(e[2]),Number(e[3])]}function m(t){const n=s(t);if(!n)return;const[e,r,o]=n.map(f);return .2126*e+.7152*r+.0722*o}function c(t,n){return(t+.05)/(n+.05)}function d(t){const n=m(t);if(n===void 0)return i;const e=c(L,n);return c(n,u)>=e?l:i}exports.labelColorOnFill=d;exports.parseColorChannels=s;
2
+ //# sourceMappingURL=chart-label-color.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-label-color.cjs","sources":["../../../../../src/ui/components/charts/chart-label-color.ts"],"sourcesContent":["// O rótulo dentro da fatia é lido contra a cor da série, não contra o fundo da página: a paleta\n// de séries é a mesma nos dois temas, então quem decide entre texto claro e escuro é o\n// preenchimento. O branco que o ECharts usa por padrão reprova no contraste em toda a paleta —\n// 2,24:1 sobre a `yellow-500`.\nconst LABEL_ON_DARK_FILL: string = \"#ffffff\";\n\nconst LABEL_ON_LIGHT_FILL: string = \"#1e1e1e\";\n\nconst LABEL_ON_LIGHT_FILL_LUMINANCE: number = 0.0144;\n\nconst WHITE_LUMINANCE: number = 1;\n\nfunction channelLuminance(channel: number): number {\n const normalized: number = channel / 255;\n return normalized <= 0.03928\n ? normalized / 12.92\n : Math.pow((normalized + 0.055) / 1.055, 2.4);\n}\n\nexport function parseColorChannels(color: string): [number, number, number] | undefined {\n const hexMatch: RegExpMatchArray | null = color\n .trim()\n .match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (hexMatch) {\n const digits: string = hexMatch[1];\n const expanded: string =\n digits.length === 3\n ? digits\n .split(\"\")\n .map((digit: string) => digit + digit)\n .join(\"\")\n : digits;\n return [0, 2, 4].map((start: number) => parseInt(expanded.slice(start, start + 2), 16)) as [\n number,\n number,\n number,\n ];\n }\n\n const rgbMatch: RegExpMatchArray | null = color\n .trim()\n .match(/^rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/i);\n if (rgbMatch) {\n return [Number(rgbMatch[1]), Number(rgbMatch[2]), Number(rgbMatch[3])];\n }\n\n return undefined;\n}\n\nfunction relativeLuminance(color: string): number | undefined {\n const channels: [number, number, number] | undefined = parseColorChannels(color);\n if (!channels) return undefined;\n const [red, green, blue] = channels.map(channelLuminance);\n return 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n}\n\nfunction contrastRatio(lighter: number, darker: number): number {\n return (lighter + 0.05) / (darker + 0.05);\n}\n\nexport function labelColorOnFill(fillColor: string): string {\n const luminance: number | undefined = relativeLuminance(fillColor);\n if (luminance === undefined) return LABEL_ON_DARK_FILL;\n const againstLightText: number = contrastRatio(WHITE_LUMINANCE, luminance);\n const againstDarkText: number = contrastRatio(luminance, LABEL_ON_LIGHT_FILL_LUMINANCE);\n return againstDarkText >= againstLightText ? LABEL_ON_LIGHT_FILL : LABEL_ON_DARK_FILL;\n}\n"],"names":["LABEL_ON_DARK_FILL","LABEL_ON_LIGHT_FILL","LABEL_ON_LIGHT_FILL_LUMINANCE","WHITE_LUMINANCE","channelLuminance","channel","normalized","parseColorChannels","color","hexMatch","digits","expanded","digit","start","rgbMatch","relativeLuminance","channels","red","green","blue","contrastRatio","lighter","darker","labelColorOnFill","fillColor","luminance","againstLightText"],"mappings":"gFAIA,MAAMA,EAA6B,UAE7BC,EAA8B,UAE9BC,EAAwC,MAExCC,EAA0B,EAEhC,SAASC,EAAiBC,EAAyB,CACjD,MAAMC,EAAqBD,EAAU,IACrC,OAAOC,GAAc,OACjBA,EAAa,MACb,KAAK,KAAKA,EAAa,MAAS,MAAO,GAAG,CAChD,CAEO,SAASC,EAAmBC,EAAqD,CACtF,MAAMC,EAAoCD,EACvC,KAAA,EACA,MAAM,+BAA+B,EACxC,GAAIC,EAAU,CACZ,MAAMC,EAAiBD,EAAS,CAAC,EAC3BE,EACJD,EAAO,SAAW,EACdA,EACG,MAAM,EAAE,EACR,IAAKE,GAAkBA,EAAQA,CAAK,EACpC,KAAK,EAAE,EACVF,EACN,MAAO,CAAC,EAAG,EAAG,CAAC,EAAE,IAAKG,GAAkB,SAASF,EAAS,MAAME,EAAOA,EAAQ,CAAC,EAAG,EAAE,CAAC,CAKxF,CAEA,MAAMC,EAAoCN,EACvC,KAAA,EACA,MAAM,yCAAyC,EAClD,GAAIM,EACF,MAAO,CAAC,OAAOA,EAAS,CAAC,CAAC,EAAG,OAAOA,EAAS,CAAC,CAAC,EAAG,OAAOA,EAAS,CAAC,CAAC,CAAC,CAIzE,CAEA,SAASC,EAAkBP,EAAmC,CAC5D,MAAMQ,EAAiDT,EAAmBC,CAAK,EAC/E,GAAI,CAACQ,EAAU,OACf,KAAM,CAACC,EAAKC,EAAOC,CAAI,EAAIH,EAAS,IAAIZ,CAAgB,EACxD,MAAO,OAASa,EAAM,MAASC,EAAQ,MAASC,CAClD,CAEA,SAASC,EAAcC,EAAiBC,EAAwB,CAC9D,OAAQD,EAAU,MAASC,EAAS,IACtC,CAEO,SAASC,EAAiBC,EAA2B,CAC1D,MAAMC,EAAgCV,EAAkBS,CAAS,EACjE,GAAIC,IAAc,OAAW,OAAOzB,EACpC,MAAM0B,EAA2BN,EAAcjB,EAAiBsB,CAAS,EAEzE,OADgCL,EAAcK,EAAWvB,CAA6B,GAC5DwB,EAAmBzB,EAAsBD,CACrE"}
@@ -0,0 +1,35 @@
1
+ const o = "#ffffff", s = "#1e1e1e";
2
+ function L(t) {
3
+ const n = t / 255;
4
+ return n <= 0.03928 ? n / 12.92 : Math.pow((n + 0.055) / 1.055, 2.4);
5
+ }
6
+ function u(t) {
7
+ const n = t.trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
8
+ if (n) {
9
+ const r = n[1], i = r.length === 3 ? r.split("").map((a) => a + a).join("") : r;
10
+ return [0, 2, 4].map((a) => parseInt(i.slice(a, a + 2), 16));
11
+ }
12
+ const e = t.trim().match(/^rgba?\(\s*(\d+)[\s,]+(\d+)[\s,]+(\d+)/i);
13
+ if (e)
14
+ return [Number(e[1]), Number(e[2]), Number(e[3])];
15
+ }
16
+ function f(t) {
17
+ const n = u(t);
18
+ if (!n) return;
19
+ const [e, r, i] = n.map(L);
20
+ return 0.2126 * e + 0.7152 * r + 0.0722 * i;
21
+ }
22
+ function c(t, n) {
23
+ return (t + 0.05) / (n + 0.05);
24
+ }
25
+ function _(t) {
26
+ const n = f(t);
27
+ if (n === void 0) return o;
28
+ const e = c(1, n);
29
+ return c(n, 0.0144) >= e ? s : o;
30
+ }
31
+ export {
32
+ _ as labelColorOnFill,
33
+ u as parseColorChannels
34
+ };
35
+ //# sourceMappingURL=chart-label-color.js.map