@apipass/design-system 7.2.0 → 7.4.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 (24) hide show
  1. package/dist/lib/embedded-styles.js +2 -2
  2. package/dist/lib/style.css +1 -1
  3. package/dist/lib/ui/components/charts/TopList/TopList.cjs +1 -1
  4. package/dist/lib/ui/components/charts/TopList/TopList.cjs.map +1 -1
  5. package/dist/lib/ui/components/charts/TopList/TopList.js +49 -45
  6. package/dist/lib/ui/components/charts/TopList/TopList.js.map +1 -1
  7. package/dist/lib/ui/components/charts/TopList/top-list-option.cjs +1 -1
  8. package/dist/lib/ui/components/charts/TopList/top-list-option.cjs.map +1 -1
  9. package/dist/lib/ui/components/charts/TopList/top-list-option.js +148 -106
  10. package/dist/lib/ui/components/charts/TopList/top-list-option.js.map +1 -1
  11. package/dist/lib/ui/components/charts/chart-theme.cjs +1 -1
  12. package/dist/lib/ui/components/charts/chart-theme.cjs.map +1 -1
  13. package/dist/lib/ui/components/charts/chart-theme.js +6 -4
  14. package/dist/lib/ui/components/charts/chart-theme.js.map +1 -1
  15. package/dist/lib/ui/primitives/Button/Button.cjs.map +1 -1
  16. package/dist/lib/ui/primitives/Button/Button.js.map +1 -1
  17. package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.cjs +1 -1
  18. package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.cjs.map +1 -1
  19. package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.js +23 -23
  20. package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.js.map +1 -1
  21. package/dist/types/ui/components/charts/TopList/top-list-option.d.ts +1 -0
  22. package/dist/types/ui/components/charts/chart-theme.d.ts +2 -0
  23. package/dist/types/ui/primitives/Button/Button.d.ts +3 -3
  24. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("react/jsx-runtime"),w=require("../../../../vendor/clsx/dist/clsx.cjs"),c=require("react"),C=require("../chart-palette.cjs"),_=require("../useChartInstance.cjs"),g=require("./top-list-option.cjs");;/* empty css */const x=["value"],q=C.CHART_SERIES_COLOR_TOKENS[0];function M(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}function A(t,u){const a=new Set(t.map(e=>e.id)),o=u.filter(e=>a.has(e)),d=t.map(e=>e.id).filter(e=>!o.includes(e));return[...o,...d]}function j({items:t,sort:u="desc",total:a,valueDisplay:o=x,valueFormatter:d,colorToken:e=q,className:L,...T}){const{containerRef:f,chart:p,theme:l,resolveSeriesColor:h}=_.useChartInstance(),R=c.useRef(!1),v=c.useRef([]),[O,m]=c.useState(0);c.useEffect(()=>{const r=f.current;if(!r)return;const s=new ResizeObserver(()=>m(r.clientHeight));return s.observe(r),()=>s.disconnect()},[f]);const S=O>0,E=g.labeledRowStepFor(O,t.length),I=c.useMemo(()=>{const r=h(e),s=[];return t.forEach(i=>{const n=(i.colorToken?h(i.colorToken):void 0)??r;n&&s.push([i.id,n])}),Object.fromEntries(s)},[t,e,l,h]);return c.useEffect(()=>{if(!p||!l||!S)return;const r=R.current&&!M();v.current=A(t,v.current);const s=new Map(t.map(n=>[n.id,n])),i=v.current.map(n=>s.get(n));p.setOption(g.buildTopListOption({items:i,sort:u,total:a,valueDisplay:o,theme:l,colorsByItemId:I,animate:r,labeledRowStep:E,valueFormatter:d}),{replaceMerge:["series","yAxis"]}),R.current=!0},[p,l,t,u,a,o,I,S,E,d]),b.jsx("div",{className:w.clsx("top-list",L),...T,children:b.jsx("div",{ref:f,className:"top-list__canvas"})})}exports.TopList=j;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("react/jsx-runtime"),w=require("../../../../vendor/clsx/dist/clsx.cjs"),c=require("react"),_=require("../chart-palette.cjs"),q=require("../useChartInstance.cjs"),x=require("./top-list-option.cjs");;/* empty css */const M=["value"],P=_.CHART_SERIES_COLOR_TOKENS[0];function A(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}function j(t,a){const u=new Set(t.map(e=>e.id)),o=a.filter(e=>u.has(e)),d=t.map(e=>e.id).filter(e=>!o.includes(e));return[...o,...d]}function y({items:t,sort:a="desc",total:u,valueDisplay:o=M,valueFormatter:d,colorToken:e=P,className:C,...L}){const{containerRef:f,chart:p,theme:l,resolveSeriesColor:h}=q.useChartInstance(),R=c.useRef(!1),v=c.useRef([]),[O,T]=c.useState(0),[S,m]=c.useState(0);c.useEffect(()=>{const s=f.current;if(!s)return;const r=new ResizeObserver(()=>{T(s.clientHeight),m(s.clientWidth)});return r.observe(s),()=>r.disconnect()},[f]);const E=O>0,I=x.labeledRowStepFor(O,t.length),b=c.useMemo(()=>{const s=h(e),r=[];return t.forEach(i=>{const n=(i.colorToken?h(i.colorToken):void 0)??s;n&&r.push([i.id,n])}),Object.fromEntries(r)},[t,e,l,h]);return c.useEffect(()=>{if(!p||!l||!E)return;const s=R.current&&!A();v.current=j(t,v.current);const r=new Map(t.map(n=>[n.id,n])),i=v.current.map(n=>r.get(n));p.setOption(x.buildTopListOption({items:i,sort:a,total:u,valueDisplay:o,theme:l,colorsByItemId:b,animate:s,labeledRowStep:I,canvasWidthPx:S,valueFormatter:d}),{replaceMerge:["series","yAxis"]}),R.current=!0},[p,l,t,a,u,o,b,E,I,S,d]),g.jsx("div",{className:w.clsx("top-list",C),...L,children:g.jsx("div",{ref:f,className:"top-list__canvas"})})}exports.TopList=y;
2
2
  //# sourceMappingURL=TopList.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TopList.cjs","sources":["../../../../../../src/ui/components/charts/TopList/TopList.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { type ComponentPropsWithoutRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CHART_SERIES_COLOR_TOKENS } from \"../chart-palette\";\nimport { useChartInstance, type ChartInstance } from \"../useChartInstance\";\nimport {\n buildTopListOption,\n labeledRowStepFor,\n type TopListItem,\n type TopListSort,\n type TopListValueDisplay,\n} from \"./top-list-option\";\nimport \"./top-list.css\";\n\nexport type { TopListItem, TopListSort, TopListValueDisplay } from \"./top-list-option\";\n\nexport type TopListProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n items: TopListItem[];\n sort?: TopListSort;\n total?: number;\n valueDisplay?: TopListValueDisplay[];\n valueFormatter?: (value: number) => string;\n colorToken?: string;\n};\n\nconst DEFAULT_VALUE_DISPLAY: TopListValueDisplay[] = [\"value\"];\n\nconst DEFAULT_COLOR_TOKEN: string = CHART_SERIES_COLOR_TOKENS[0];\n\nfunction prefersReducedMotion(): boolean {\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction keepFirstSeenOrder(items: TopListItem[], previousOrder: string[]): string[] {\n const currentIds: Set<string> = new Set(items.map((item: TopListItem) => item.id));\n const survivingIds: string[] = previousOrder.filter((id: string) => currentIds.has(id));\n const newIds: string[] = items\n .map((item: TopListItem) => item.id)\n .filter((id: string) => !survivingIds.includes(id));\n return [...survivingIds, ...newIds];\n}\n\nexport function TopList({\n items,\n sort = \"desc\",\n total,\n valueDisplay = DEFAULT_VALUE_DISPLAY,\n valueFormatter,\n colorToken = DEFAULT_COLOR_TOKEN,\n className,\n ...props\n}: TopListProps) {\n const { containerRef, chart, theme, resolveSeriesColor }: ChartInstance = useChartInstance();\n const hasDrawnRef = useRef<boolean>(false);\n const categoryOrderRef = useRef<string[]>([]);\n const [canvasHeightPx, setCanvasHeightPx] = useState<number>(0);\n\n useEffect(() => {\n const canvas: HTMLDivElement | null = containerRef.current;\n if (!canvas) return undefined;\n const observer: ResizeObserver = new ResizeObserver(() => setCanvasHeightPx(canvas.clientHeight));\n observer.observe(canvas);\n return () => observer.disconnect();\n }, [containerRef]);\n\n const isCanvasMeasured: boolean = canvasHeightPx > 0;\n const labeledRowStep: number = labeledRowStepFor(canvasHeightPx, items.length);\n\n const colorsByItemId: Record<string, string> = useMemo(() => {\n const defaultColor: string | undefined = resolveSeriesColor(colorToken);\n const entries: Array<[string, string]> = [];\n items.forEach((item: TopListItem) => {\n const color: string | undefined =\n (item.colorToken ? resolveSeriesColor(item.colorToken) : undefined) ?? defaultColor;\n if (color) entries.push([item.id, color]);\n });\n return Object.fromEntries(entries);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, colorToken, theme, resolveSeriesColor]);\n\n useEffect(() => {\n if (!chart || !theme || !isCanvasMeasured) return;\n const animate: boolean = hasDrawnRef.current && !prefersReducedMotion();\n categoryOrderRef.current = keepFirstSeenOrder(items, categoryOrderRef.current);\n const itemsById: Map<string, TopListItem> = new Map(\n items.map((item: TopListItem) => [item.id, item]),\n );\n const stableItems: TopListItem[] = categoryOrderRef.current.map(\n (id: string) => itemsById.get(id) as TopListItem,\n );\n chart.setOption(\n buildTopListOption({\n items: stableItems,\n sort,\n total,\n valueDisplay,\n theme,\n colorsByItemId,\n animate,\n labeledRowStep,\n valueFormatter,\n }),\n { replaceMerge: [\"series\", \"yAxis\"] },\n );\n hasDrawnRef.current = true;\n }, [\n chart,\n theme,\n items,\n sort,\n total,\n valueDisplay,\n colorsByItemId,\n isCanvasMeasured,\n labeledRowStep,\n valueFormatter,\n ]);\n\n return (\n <div className={clsx(\"top-list\", className)} {...props}>\n <div ref={containerRef} className=\"top-list__canvas\" />\n </div>\n );\n}\n"],"names":["DEFAULT_VALUE_DISPLAY","DEFAULT_COLOR_TOKEN","CHART_SERIES_COLOR_TOKENS","prefersReducedMotion","keepFirstSeenOrder","items","previousOrder","currentIds","item","survivingIds","id","newIds","TopList","sort","total","valueDisplay","valueFormatter","colorToken","className","props","containerRef","chart","theme","resolveSeriesColor","useChartInstance","hasDrawnRef","useRef","categoryOrderRef","canvasHeightPx","setCanvasHeightPx","useState","useEffect","canvas","observer","isCanvasMeasured","labeledRowStep","labeledRowStepFor","colorsByItemId","useMemo","defaultColor","entries","color","animate","itemsById","stableItems","buildTopListOption","jsx","clsx"],"mappings":"mUAwBA,MAAMA,EAA+C,CAAC,OAAO,EAEvDC,EAA8BC,EAAAA,0BAA0B,CAAC,EAE/D,SAASC,GAAgC,CACvC,OAAO,OAAO,WAAW,kCAAkC,EAAE,OAC/D,CAEA,SAASC,EAAmBC,EAAsBC,EAAmC,CACnF,MAAMC,EAA0B,IAAI,IAAIF,EAAM,IAAKG,GAAsBA,EAAK,EAAE,CAAC,EAC3EC,EAAyBH,EAAc,OAAQI,GAAeH,EAAW,IAAIG,CAAE,CAAC,EAChFC,EAAmBN,EACtB,IAAKG,GAAsBA,EAAK,EAAE,EAClC,OAAQE,GAAe,CAACD,EAAa,SAASC,CAAE,CAAC,EACpD,MAAO,CAAC,GAAGD,EAAc,GAAGE,CAAM,CACpC,CAEO,SAASC,EAAQ,CACtB,MAAAP,EACA,KAAAQ,EAAO,OACP,MAAAC,EACA,aAAAC,EAAef,EACf,eAAAgB,EACA,WAAAC,EAAahB,EACb,UAAAiB,EACA,GAAGC,CACL,EAAiB,CACf,KAAM,CAAE,aAAAC,EAAc,MAAAC,EAAO,MAAAC,EAAO,mBAAAC,CAAA,EAAsCC,EAAAA,iBAAA,EACpEC,EAAcC,EAAAA,OAAgB,EAAK,EACnCC,EAAmBD,EAAAA,OAAiB,EAAE,EACtC,CAACE,EAAgBC,CAAiB,EAAIC,EAAAA,SAAiB,CAAC,EAE9DC,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAgCZ,EAAa,QACnD,GAAI,CAACY,EAAQ,OACb,MAAMC,EAA2B,IAAI,eAAe,IAAMJ,EAAkBG,EAAO,YAAY,CAAC,EAChG,OAAAC,EAAS,QAAQD,CAAM,EAChB,IAAMC,EAAS,WAAA,CACxB,EAAG,CAACb,CAAY,CAAC,EAEjB,MAAMc,EAA4BN,EAAiB,EAC7CO,EAAyBC,EAAAA,kBAAkBR,EAAgBvB,EAAM,MAAM,EAEvEgC,EAAyCC,EAAAA,QAAQ,IAAM,CAC3D,MAAMC,EAAmChB,EAAmBN,CAAU,EAChEuB,EAAmC,CAAA,EACzC,OAAAnC,EAAM,QAASG,GAAsB,CACnC,MAAMiC,GACHjC,EAAK,WAAae,EAAmBf,EAAK,UAAU,EAAI,SAAc+B,EACrEE,GAAOD,EAAQ,KAAK,CAAChC,EAAK,GAAIiC,CAAK,CAAC,CAC1C,CAAC,EACM,OAAO,YAAYD,CAAO,CAEnC,EAAG,CAACnC,EAAOY,EAAYK,EAAOC,CAAkB,CAAC,EAEjDQ,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACV,GAAS,CAACC,GAAS,CAACY,EAAkB,OAC3C,MAAMQ,EAAmBjB,EAAY,SAAW,CAACtB,EAAA,EACjDwB,EAAiB,QAAUvB,EAAmBC,EAAOsB,EAAiB,OAAO,EAC7E,MAAMgB,EAAsC,IAAI,IAC9CtC,EAAM,IAAKG,GAAsB,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAA,EAE5CoC,EAA6BjB,EAAiB,QAAQ,IACzDjB,GAAeiC,EAAU,IAAIjC,CAAE,CAAA,EAElCW,EAAM,UACJwB,qBAAmB,CACjB,MAAOD,EACP,KAAA/B,EACA,MAAAC,EACA,aAAAC,EACA,MAAAO,EACA,eAAAe,EACA,QAAAK,EACA,eAAAP,EACA,eAAAnB,CAAA,CACD,EACD,CAAE,aAAc,CAAC,SAAU,OAAO,CAAA,CAAE,EAEtCS,EAAY,QAAU,EACxB,EAAG,CACDJ,EACAC,EACAjB,EACAQ,EACAC,EACAC,EACAsB,EACAH,EACAC,EACAnB,CAAA,CACD,EAGC8B,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,KAAK,WAAY7B,CAAS,EAAI,GAAGC,EAC/C,eAAC,MAAA,CAAI,IAAKC,EAAc,UAAU,mBAAmB,EACvD,CAEJ"}
1
+ {"version":3,"file":"TopList.cjs","sources":["../../../../../../src/ui/components/charts/TopList/TopList.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { type ComponentPropsWithoutRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CHART_SERIES_COLOR_TOKENS } from \"../chart-palette\";\nimport { useChartInstance, type ChartInstance } from \"../useChartInstance\";\nimport {\n buildTopListOption,\n labeledRowStepFor,\n type TopListItem,\n type TopListSort,\n type TopListValueDisplay,\n} from \"./top-list-option\";\nimport \"./top-list.css\";\n\nexport type { TopListItem, TopListSort, TopListValueDisplay } from \"./top-list-option\";\n\nexport type TopListProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n items: TopListItem[];\n sort?: TopListSort;\n total?: number;\n valueDisplay?: TopListValueDisplay[];\n valueFormatter?: (value: number) => string;\n colorToken?: string;\n};\n\nconst DEFAULT_VALUE_DISPLAY: TopListValueDisplay[] = [\"value\"];\n\nconst DEFAULT_COLOR_TOKEN: string = CHART_SERIES_COLOR_TOKENS[0];\n\nfunction prefersReducedMotion(): boolean {\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction keepFirstSeenOrder(items: TopListItem[], previousOrder: string[]): string[] {\n const currentIds: Set<string> = new Set(items.map((item: TopListItem) => item.id));\n const survivingIds: string[] = previousOrder.filter((id: string) => currentIds.has(id));\n const newIds: string[] = items\n .map((item: TopListItem) => item.id)\n .filter((id: string) => !survivingIds.includes(id));\n return [...survivingIds, ...newIds];\n}\n\nexport function TopList({\n items,\n sort = \"desc\",\n total,\n valueDisplay = DEFAULT_VALUE_DISPLAY,\n valueFormatter,\n colorToken = DEFAULT_COLOR_TOKEN,\n className,\n ...props\n}: TopListProps) {\n const { containerRef, chart, theme, resolveSeriesColor }: ChartInstance = useChartInstance();\n const hasDrawnRef = useRef<boolean>(false);\n const categoryOrderRef = useRef<string[]>([]);\n const [canvasHeightPx, setCanvasHeightPx] = useState<number>(0);\n const [canvasWidthPx, setCanvasWidthPx] = useState<number>(0);\n\n useEffect(() => {\n const canvas: HTMLDivElement | null = containerRef.current;\n if (!canvas) return undefined;\n const observer: ResizeObserver = new ResizeObserver(() => {\n setCanvasHeightPx(canvas.clientHeight);\n setCanvasWidthPx(canvas.clientWidth);\n });\n observer.observe(canvas);\n return () => observer.disconnect();\n }, [containerRef]);\n\n const isCanvasMeasured: boolean = canvasHeightPx > 0;\n const labeledRowStep: number = labeledRowStepFor(canvasHeightPx, items.length);\n\n const colorsByItemId: Record<string, string> = useMemo(() => {\n const defaultColor: string | undefined = resolveSeriesColor(colorToken);\n const entries: Array<[string, string]> = [];\n items.forEach((item: TopListItem) => {\n const color: string | undefined =\n (item.colorToken ? resolveSeriesColor(item.colorToken) : undefined) ?? defaultColor;\n if (color) entries.push([item.id, color]);\n });\n return Object.fromEntries(entries);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, colorToken, theme, resolveSeriesColor]);\n\n useEffect(() => {\n if (!chart || !theme || !isCanvasMeasured) return;\n const animate: boolean = hasDrawnRef.current && !prefersReducedMotion();\n categoryOrderRef.current = keepFirstSeenOrder(items, categoryOrderRef.current);\n const itemsById: Map<string, TopListItem> = new Map(\n items.map((item: TopListItem) => [item.id, item]),\n );\n const stableItems: TopListItem[] = categoryOrderRef.current.map(\n (id: string) => itemsById.get(id) as TopListItem,\n );\n chart.setOption(\n buildTopListOption({\n items: stableItems,\n sort,\n total,\n valueDisplay,\n theme,\n colorsByItemId,\n animate,\n labeledRowStep,\n canvasWidthPx,\n valueFormatter,\n }),\n { replaceMerge: [\"series\", \"yAxis\"] },\n );\n hasDrawnRef.current = true;\n }, [\n chart,\n theme,\n items,\n sort,\n total,\n valueDisplay,\n colorsByItemId,\n isCanvasMeasured,\n labeledRowStep,\n canvasWidthPx,\n valueFormatter,\n ]);\n\n return (\n <div className={clsx(\"top-list\", className)} {...props}>\n <div ref={containerRef} className=\"top-list__canvas\" />\n </div>\n );\n}\n"],"names":["DEFAULT_VALUE_DISPLAY","DEFAULT_COLOR_TOKEN","CHART_SERIES_COLOR_TOKENS","prefersReducedMotion","keepFirstSeenOrder","items","previousOrder","currentIds","item","survivingIds","id","newIds","TopList","sort","total","valueDisplay","valueFormatter","colorToken","className","props","containerRef","chart","theme","resolveSeriesColor","useChartInstance","hasDrawnRef","useRef","categoryOrderRef","canvasHeightPx","setCanvasHeightPx","useState","canvasWidthPx","setCanvasWidthPx","useEffect","canvas","observer","isCanvasMeasured","labeledRowStep","labeledRowStepFor","colorsByItemId","useMemo","defaultColor","entries","color","animate","itemsById","stableItems","buildTopListOption","jsx","clsx"],"mappings":"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"}
@@ -1,61 +1,64 @@
1
- import { jsx as I } from "react/jsx-runtime";
2
- import { clsx as C } from "../../../../vendor/clsx/dist/clsx.js";
3
- import { useRef as S, useState as L, useEffect as w, useMemo as T } from "react";
4
- import { CHART_SERIES_COLOR_TOKENS as x } from "../chart-palette.js";
5
- import { useChartInstance as A } from "../useChartInstance.js";
6
- import { labeledRowStepFor as M, buildTopListOption as H } from "./top-list-option.js";
1
+ import { jsx as S } from "react/jsx-runtime";
2
+ import { clsx as T } from "../../../../vendor/clsx/dist/clsx.js";
3
+ import { useRef as w, useState as C, useEffect as _, useMemo as A } from "react";
4
+ import { CHART_SERIES_COLOR_TOKENS as M } from "../chart-palette.js";
5
+ import { useChartInstance as P } from "../useChartInstance.js";
6
+ import { labeledRowStepFor as H, buildTopListOption as N } from "./top-list-option.js";
7
7
  /* empty css */
8
- const N = ["value"], y = x[0];
9
- function D() {
8
+ const y = ["value"], D = M[0];
9
+ function F() {
10
10
  return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
11
11
  }
12
- function F(r, i) {
13
- const a = new Set(r.map((e) => e.id)), s = i.filter((e) => a.has(e)), d = r.map((e) => e.id).filter((e) => !s.includes(e));
14
- return [...s, ...d];
12
+ function U(t, i) {
13
+ const a = new Set(t.map((e) => e.id)), o = i.filter((e) => a.has(e)), d = t.map((e) => e.id).filter((e) => !o.includes(e));
14
+ return [...o, ...d];
15
15
  }
16
- function V({
17
- items: r,
16
+ function Y({
17
+ items: t,
18
18
  sort: i = "desc",
19
19
  total: a,
20
- valueDisplay: s = N,
20
+ valueDisplay: o = y,
21
21
  valueFormatter: d,
22
- colorToken: e = y,
23
- className: _,
24
- ...b
22
+ colorToken: e = D,
23
+ className: b,
24
+ ...g
25
25
  }) {
26
- const { containerRef: f, chart: p, theme: u, resolveSeriesColor: l } = A(), h = S(!1), m = S([]), [v, g] = L(0);
27
- w(() => {
28
- const t = f.current;
29
- if (!t) return;
30
- const n = new ResizeObserver(() => g(t.clientHeight));
31
- return n.observe(t), () => n.disconnect();
26
+ const { containerRef: f, chart: p, theme: u, resolveSeriesColor: l } = P(), h = w(!1), m = w([]), [v, x] = C(0), [O, L] = C(0);
27
+ _(() => {
28
+ const r = f.current;
29
+ if (!r) return;
30
+ const n = new ResizeObserver(() => {
31
+ x(r.clientHeight), L(r.clientWidth);
32
+ });
33
+ return n.observe(r), () => n.disconnect();
32
34
  }, [f]);
33
- const O = v > 0, R = M(v, r.length), E = T(() => {
34
- const t = l(e), n = [];
35
- return r.forEach((c) => {
36
- const o = (c.colorToken ? l(c.colorToken) : void 0) ?? t;
37
- o && n.push([c.id, o]);
35
+ const R = v > 0, E = H(v, t.length), I = A(() => {
36
+ const r = l(e), n = [];
37
+ return t.forEach((c) => {
38
+ const s = (c.colorToken ? l(c.colorToken) : void 0) ?? r;
39
+ s && n.push([c.id, s]);
38
40
  }), Object.fromEntries(n);
39
- }, [r, e, u, l]);
40
- return w(() => {
41
- if (!p || !u || !O) return;
42
- const t = h.current && !D();
43
- m.current = F(r, m.current);
41
+ }, [t, e, u, l]);
42
+ return _(() => {
43
+ if (!p || !u || !R) return;
44
+ const r = h.current && !F();
45
+ m.current = U(t, m.current);
44
46
  const n = new Map(
45
- r.map((o) => [o.id, o])
47
+ t.map((s) => [s.id, s])
46
48
  ), c = m.current.map(
47
- (o) => n.get(o)
49
+ (s) => n.get(s)
48
50
  );
49
51
  p.setOption(
50
- H({
52
+ N({
51
53
  items: c,
52
54
  sort: i,
53
55
  total: a,
54
- valueDisplay: s,
56
+ valueDisplay: o,
55
57
  theme: u,
56
- colorsByItemId: E,
57
- animate: t,
58
- labeledRowStep: R,
58
+ colorsByItemId: I,
59
+ animate: r,
60
+ labeledRowStep: E,
61
+ canvasWidthPx: O,
59
62
  valueFormatter: d
60
63
  }),
61
64
  { replaceMerge: ["series", "yAxis"] }
@@ -63,17 +66,18 @@ function V({
63
66
  }, [
64
67
  p,
65
68
  u,
66
- r,
69
+ t,
67
70
  i,
68
71
  a,
69
- s,
72
+ o,
73
+ I,
74
+ R,
70
75
  E,
71
76
  O,
72
- R,
73
77
  d
74
- ]), /* @__PURE__ */ I("div", { className: C("top-list", _), ...b, children: /* @__PURE__ */ I("div", { ref: f, className: "top-list__canvas" }) });
78
+ ]), /* @__PURE__ */ S("div", { className: T("top-list", b), ...g, children: /* @__PURE__ */ S("div", { ref: f, className: "top-list__canvas" }) });
75
79
  }
76
80
  export {
77
- V as TopList
81
+ Y as TopList
78
82
  };
79
83
  //# sourceMappingURL=TopList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TopList.js","sources":["../../../../../../src/ui/components/charts/TopList/TopList.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { type ComponentPropsWithoutRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CHART_SERIES_COLOR_TOKENS } from \"../chart-palette\";\nimport { useChartInstance, type ChartInstance } from \"../useChartInstance\";\nimport {\n buildTopListOption,\n labeledRowStepFor,\n type TopListItem,\n type TopListSort,\n type TopListValueDisplay,\n} from \"./top-list-option\";\nimport \"./top-list.css\";\n\nexport type { TopListItem, TopListSort, TopListValueDisplay } from \"./top-list-option\";\n\nexport type TopListProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n items: TopListItem[];\n sort?: TopListSort;\n total?: number;\n valueDisplay?: TopListValueDisplay[];\n valueFormatter?: (value: number) => string;\n colorToken?: string;\n};\n\nconst DEFAULT_VALUE_DISPLAY: TopListValueDisplay[] = [\"value\"];\n\nconst DEFAULT_COLOR_TOKEN: string = CHART_SERIES_COLOR_TOKENS[0];\n\nfunction prefersReducedMotion(): boolean {\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction keepFirstSeenOrder(items: TopListItem[], previousOrder: string[]): string[] {\n const currentIds: Set<string> = new Set(items.map((item: TopListItem) => item.id));\n const survivingIds: string[] = previousOrder.filter((id: string) => currentIds.has(id));\n const newIds: string[] = items\n .map((item: TopListItem) => item.id)\n .filter((id: string) => !survivingIds.includes(id));\n return [...survivingIds, ...newIds];\n}\n\nexport function TopList({\n items,\n sort = \"desc\",\n total,\n valueDisplay = DEFAULT_VALUE_DISPLAY,\n valueFormatter,\n colorToken = DEFAULT_COLOR_TOKEN,\n className,\n ...props\n}: TopListProps) {\n const { containerRef, chart, theme, resolveSeriesColor }: ChartInstance = useChartInstance();\n const hasDrawnRef = useRef<boolean>(false);\n const categoryOrderRef = useRef<string[]>([]);\n const [canvasHeightPx, setCanvasHeightPx] = useState<number>(0);\n\n useEffect(() => {\n const canvas: HTMLDivElement | null = containerRef.current;\n if (!canvas) return undefined;\n const observer: ResizeObserver = new ResizeObserver(() => setCanvasHeightPx(canvas.clientHeight));\n observer.observe(canvas);\n return () => observer.disconnect();\n }, [containerRef]);\n\n const isCanvasMeasured: boolean = canvasHeightPx > 0;\n const labeledRowStep: number = labeledRowStepFor(canvasHeightPx, items.length);\n\n const colorsByItemId: Record<string, string> = useMemo(() => {\n const defaultColor: string | undefined = resolveSeriesColor(colorToken);\n const entries: Array<[string, string]> = [];\n items.forEach((item: TopListItem) => {\n const color: string | undefined =\n (item.colorToken ? resolveSeriesColor(item.colorToken) : undefined) ?? defaultColor;\n if (color) entries.push([item.id, color]);\n });\n return Object.fromEntries(entries);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, colorToken, theme, resolveSeriesColor]);\n\n useEffect(() => {\n if (!chart || !theme || !isCanvasMeasured) return;\n const animate: boolean = hasDrawnRef.current && !prefersReducedMotion();\n categoryOrderRef.current = keepFirstSeenOrder(items, categoryOrderRef.current);\n const itemsById: Map<string, TopListItem> = new Map(\n items.map((item: TopListItem) => [item.id, item]),\n );\n const stableItems: TopListItem[] = categoryOrderRef.current.map(\n (id: string) => itemsById.get(id) as TopListItem,\n );\n chart.setOption(\n buildTopListOption({\n items: stableItems,\n sort,\n total,\n valueDisplay,\n theme,\n colorsByItemId,\n animate,\n labeledRowStep,\n valueFormatter,\n }),\n { replaceMerge: [\"series\", \"yAxis\"] },\n );\n hasDrawnRef.current = true;\n }, [\n chart,\n theme,\n items,\n sort,\n total,\n valueDisplay,\n colorsByItemId,\n isCanvasMeasured,\n labeledRowStep,\n valueFormatter,\n ]);\n\n return (\n <div className={clsx(\"top-list\", className)} {...props}>\n <div ref={containerRef} className=\"top-list__canvas\" />\n </div>\n );\n}\n"],"names":["DEFAULT_VALUE_DISPLAY","DEFAULT_COLOR_TOKEN","CHART_SERIES_COLOR_TOKENS","prefersReducedMotion","keepFirstSeenOrder","items","previousOrder","currentIds","item","survivingIds","id","newIds","TopList","sort","total","valueDisplay","valueFormatter","colorToken","className","props","containerRef","chart","theme","resolveSeriesColor","useChartInstance","hasDrawnRef","useRef","categoryOrderRef","canvasHeightPx","setCanvasHeightPx","useState","useEffect","canvas","observer","isCanvasMeasured","labeledRowStep","labeledRowStepFor","colorsByItemId","useMemo","defaultColor","entries","color","animate","itemsById","stableItems","buildTopListOption","jsx","clsx"],"mappings":"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"}
1
+ {"version":3,"file":"TopList.js","sources":["../../../../../../src/ui/components/charts/TopList/TopList.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { type ComponentPropsWithoutRef, useEffect, useMemo, useRef, useState } from \"react\";\nimport { CHART_SERIES_COLOR_TOKENS } from \"../chart-palette\";\nimport { useChartInstance, type ChartInstance } from \"../useChartInstance\";\nimport {\n buildTopListOption,\n labeledRowStepFor,\n type TopListItem,\n type TopListSort,\n type TopListValueDisplay,\n} from \"./top-list-option\";\nimport \"./top-list.css\";\n\nexport type { TopListItem, TopListSort, TopListValueDisplay } from \"./top-list-option\";\n\nexport type TopListProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n items: TopListItem[];\n sort?: TopListSort;\n total?: number;\n valueDisplay?: TopListValueDisplay[];\n valueFormatter?: (value: number) => string;\n colorToken?: string;\n};\n\nconst DEFAULT_VALUE_DISPLAY: TopListValueDisplay[] = [\"value\"];\n\nconst DEFAULT_COLOR_TOKEN: string = CHART_SERIES_COLOR_TOKENS[0];\n\nfunction prefersReducedMotion(): boolean {\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction keepFirstSeenOrder(items: TopListItem[], previousOrder: string[]): string[] {\n const currentIds: Set<string> = new Set(items.map((item: TopListItem) => item.id));\n const survivingIds: string[] = previousOrder.filter((id: string) => currentIds.has(id));\n const newIds: string[] = items\n .map((item: TopListItem) => item.id)\n .filter((id: string) => !survivingIds.includes(id));\n return [...survivingIds, ...newIds];\n}\n\nexport function TopList({\n items,\n sort = \"desc\",\n total,\n valueDisplay = DEFAULT_VALUE_DISPLAY,\n valueFormatter,\n colorToken = DEFAULT_COLOR_TOKEN,\n className,\n ...props\n}: TopListProps) {\n const { containerRef, chart, theme, resolveSeriesColor }: ChartInstance = useChartInstance();\n const hasDrawnRef = useRef<boolean>(false);\n const categoryOrderRef = useRef<string[]>([]);\n const [canvasHeightPx, setCanvasHeightPx] = useState<number>(0);\n const [canvasWidthPx, setCanvasWidthPx] = useState<number>(0);\n\n useEffect(() => {\n const canvas: HTMLDivElement | null = containerRef.current;\n if (!canvas) return undefined;\n const observer: ResizeObserver = new ResizeObserver(() => {\n setCanvasHeightPx(canvas.clientHeight);\n setCanvasWidthPx(canvas.clientWidth);\n });\n observer.observe(canvas);\n return () => observer.disconnect();\n }, [containerRef]);\n\n const isCanvasMeasured: boolean = canvasHeightPx > 0;\n const labeledRowStep: number = labeledRowStepFor(canvasHeightPx, items.length);\n\n const colorsByItemId: Record<string, string> = useMemo(() => {\n const defaultColor: string | undefined = resolveSeriesColor(colorToken);\n const entries: Array<[string, string]> = [];\n items.forEach((item: TopListItem) => {\n const color: string | undefined =\n (item.colorToken ? resolveSeriesColor(item.colorToken) : undefined) ?? defaultColor;\n if (color) entries.push([item.id, color]);\n });\n return Object.fromEntries(entries);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, colorToken, theme, resolveSeriesColor]);\n\n useEffect(() => {\n if (!chart || !theme || !isCanvasMeasured) return;\n const animate: boolean = hasDrawnRef.current && !prefersReducedMotion();\n categoryOrderRef.current = keepFirstSeenOrder(items, categoryOrderRef.current);\n const itemsById: Map<string, TopListItem> = new Map(\n items.map((item: TopListItem) => [item.id, item]),\n );\n const stableItems: TopListItem[] = categoryOrderRef.current.map(\n (id: string) => itemsById.get(id) as TopListItem,\n );\n chart.setOption(\n buildTopListOption({\n items: stableItems,\n sort,\n total,\n valueDisplay,\n theme,\n colorsByItemId,\n animate,\n labeledRowStep,\n canvasWidthPx,\n valueFormatter,\n }),\n { replaceMerge: [\"series\", \"yAxis\"] },\n );\n hasDrawnRef.current = true;\n }, [\n chart,\n theme,\n items,\n sort,\n total,\n valueDisplay,\n colorsByItemId,\n isCanvasMeasured,\n labeledRowStep,\n canvasWidthPx,\n valueFormatter,\n ]);\n\n return (\n <div className={clsx(\"top-list\", className)} {...props}>\n <div ref={containerRef} className=\"top-list__canvas\" />\n </div>\n );\n}\n"],"names":["DEFAULT_VALUE_DISPLAY","DEFAULT_COLOR_TOKEN","CHART_SERIES_COLOR_TOKENS","prefersReducedMotion","keepFirstSeenOrder","items","previousOrder","currentIds","item","survivingIds","id","newIds","TopList","sort","total","valueDisplay","valueFormatter","colorToken","className","props","containerRef","chart","theme","resolveSeriesColor","useChartInstance","hasDrawnRef","useRef","categoryOrderRef","canvasHeightPx","setCanvasHeightPx","useState","canvasWidthPx","setCanvasWidthPx","useEffect","canvas","observer","isCanvasMeasured","labeledRowStep","labeledRowStepFor","colorsByItemId","useMemo","defaultColor","entries","color","animate","itemsById","stableItems","buildTopListOption","jsx","clsx"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("../chart-share.cjs");require("echarts/charts");require("echarts/components");const L=require("echarts/core");require("echarts/renderers");function M(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const B=M(L),h="–",b=160,E=12,O=88,w=56,c=16,C=20,p=4,S=8,T=800,f=12,V=14,N=1e-9,X=/[{}|]/g,k="top-list-values";function u(e){return e.value??0}function v(e){const t=Math.max(...e.map(u));return t>0?t:1}function U(e){const t=[...new Set(e.map(u))].sort((o,r)=>o-r),n=t.slice(1).map((o,r)=>o-t[r]);return n.length>0?Math.min(...n):1/0}function F(e){const t=v(e)*N,n=U(e)/(e.length+1);return Math.min(t,n)}function y(e){const t=F(e);return new Map(e.map((n,o)=>[n.id,u(n)+t*(e.length-o)]))}function m(e,t){const n=y(e),o=t==="desc"?-1:1,r=[...e].sort((a,i)=>o*(n.get(a.id)-n.get(i.id)));return new Map(r.map((a,i)=>[a.id,i+1]))}function A(e,t){return t??e.reduce((n,o)=>n+u(o),0)}function x(e,t){return t===0?0:u(e)/t}function g(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function D(e){return e.replace(X," ")}function H(e,t){const n=`${f}px ${t.fontFamily}`;return D(B.format.truncateText(e,b,n,"…"))}function I(e,t){return t===null?h:e.valueFormatter?e.valueFormatter(t):String(t)}function W(e,t){return e.value===null?h:_.formatShare(x(e,t))}function $(e){const t=[];return e.includes("value")&&t.push(O),e.includes("percent")&&t.push(w),t.length===0?0:t.reduce((n,o)=>n+o,0)+S}function j(e,t,n){const o=[];return e.valueDisplay.includes("value")&&o.push(`{value|${D(I(e,t.value))}}`),e.valueDisplay.includes("percent")&&o.push(`{percent|${W(t,n)}}`),o.join("")}function q(e,t){const n=(e-2*c)/t;return Math.max(1,Math.ceil(V/n))}function P(e,t){return e===void 0||(e-1)%t===0}function G(e,t){const{items:n,sort:o,theme:r}=e,a=m(n,o),i=e.labeledRowStep;return{type:"category",data:n.map(l=>l.id),inverse:o==="desc",animationDuration:0,animationDurationUpdate:e.animate?T:0,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:r.labelColor,fontSize:f,interval:0,align:"right",margin:E,formatter:l=>{if(!P(a.get(l),i))return"";const d=t.get(l);return d?H(d.name,r):""}}}}function z(e,t,n){return o=>{const r=t.get(o.name);if(!r)return"";const a=r.value===null?"":` · ${_.formatShare(x(r,n))}`,i=g(I(e,r.value));return`<div>${g(r.name)}</div><div><b>${i}</b>${a}</div>`}}function K(e,t,n){const{theme:o}=e,r=m(e.items,e.sort),a=e.labeledRowStep;return{show:e.valueDisplay.length>0,position:"right",distance:S,fontSize:f,formatter:i=>{if(!P(r.get(i.name),a))return"";const l=t.get(i.name);return l?j(e,l,n):""},rich:{value:{color:o.labelColor,fontWeight:600,padding:[0,8,0,0]},percent:{color:o.labelColor}}}}function Y(e){const{items:t,theme:n,colorsByItemId:o}=e,r=new Map(t.map(s=>[s.id,s])),a=A(t,e.total),i=v(t),l=y(t),d=$(e.valueDisplay),R=n.seriesColors[0];return{animation:!0,animationDuration:0,animationDurationUpdate:e.animate?T:0,animationEasing:"linear",animationEasingUpdate:"linear",textStyle:{fontFamily:n.fontFamily,color:n.labelColor},grid:{top:c,bottom:c,left:c+b+E,right:c+d,containLabel:!1},tooltip:{trigger:"item",backgroundColor:n.tooltipBackgroundColor,borderColor:n.tooltipBorderColor,textStyle:{color:n.labelColor},formatter:z(e,r,a)},xAxis:{type:"value",min:0,max:i,show:!1},yAxis:G(e,r),series:[{id:k,type:"bar",realtimeSort:!0,barMaxWidth:C,itemStyle:{borderRadius:[0,p,p,0]},data:t.map(s=>({id:s.id,name:s.id,value:[l.get(s.id),s.id],itemStyle:{color:o[s.id]??R}})),encode:{x:0,y:1},label:K(e,r,a)}]}}exports.buildTopListOption=Y;exports.labeledRowStepFor=q;exports.rankById=m;exports.resolveTotal=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("../chart-share.cjs");require("echarts/charts");require("echarts/components");const C=require("echarts/core");require("echarts/renderers");function L(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:()=>e[o]})}}return t.default=e,Object.freeze(t)}const O=L(C),_="–",w=12,M=8,B=88,k=56,u=16,d=4,p=6,c=3,v=800,f=13,V=26,N=1e-9,U=/[{}|]/g,X="top-list-values",W="top-list-tracks";function s(e){return e.value??0}function S(e){const t=Math.max(...e.map(s));return t>0?t:1}function G(e){const t=[...new Set(e.map(s))].sort((n,a)=>n-a),o=t.slice(1).map((n,a)=>n-t[a]);return o.length>0?Math.min(...o):1/0}function F(e){const t=S(e)*N,o=G(e)/(e.length+1);return Math.min(t,o)}function E(e){const t=F(e);return new Map(e.map((o,n)=>[o.id,s(o)+t*(e.length-n)]))}function m(e,t){const o=E(e),n=t==="desc"?-1:1,a=[...e].sort((l,i)=>n*(o.get(l.id)-o.get(i.id)));return new Map(a.map((l,i)=>[l.id,i+1]))}function T(e,t){return t??e.reduce((o,n)=>o+s(n),0)}function y(e,t){return t===0?0:s(e)/t}function g(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function x(e){return e.replace(U," ")}function H(e){const t=[];return e.includes("value")&&t.push(B),e.includes("percent")&&t.push(k),t.reduce((o,n)=>o+n,0)}function $(e){const t=e.canvasWidthPx-2*d-H(e.valueDisplay)-w;return Math.max(t,0)}function j(e,t){const o=`${f}px ${t.theme.fontFamily}`;return x(O.format.truncateText(e,$(t),o,"…"))}function A(e,t){return t===null?_:e.valueFormatter?e.valueFormatter(t):String(t)}function q(e,t){return e.value===null?_:b.formatShare(y(e,t))}function z(e,t,o){const n=[];return e.valueDisplay.includes("value")&&n.push(`{value|${x(A(e,t.value))}}`),e.valueDisplay.includes("percent")&&n.push(`{percent|${q(t,o)}}`),n.join("")}function K(e,t){const o=(e-2*u)/t;return Math.max(1,Math.ceil(V/o))}function D(e,t){return e===void 0||(e-1)%t===0}function Y(e){return{type:"category",data:e.items.map(t=>t.id),inverse:e.sort==="desc",animationDuration:0,animationDurationUpdate:e.animate?v:0,axisLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1}}}function Z(e,t,o){return n=>{const a=t.get(n.name);if(!a)return"";const l=a.value===null?"":` · ${b.formatShare(y(a,o))}`,i=g(A(e,a.value));return`<div>${g(a.name)}</div><div><b>${i}</b>${l}</div>`}}function I(){return[0,-9]}function J(e,t){const o=m(e.items,e.sort);return{show:!0,position:"insideLeft",distance:0,align:"left",verticalAlign:"bottom",offset:I(),color:e.theme.emphasizedLabelColor,backgroundColor:e.theme.tooltipBackgroundColor,fontSize:f,fontWeight:500,formatter:n=>{if(!D(o.get(n.name),e.labeledRowStep))return"";const a=t.get(n.name);return a?j(a.name,e):""}}}function Q(e,t,o){const{theme:n}=e,a=m(e.items,e.sort);return{show:e.valueDisplay.length>0,backgroundColor:n.tooltipBackgroundColor,position:"insideRight",distance:0,align:"right",verticalAlign:"bottom",offset:I(),fontSize:f,formatter:l=>{if(!D(a.get(l.name),e.labeledRowStep))return"";const i=t.get(l.name);return i?z(e,i,o):""},rich:{value:{color:n.labelColor,fontWeight:600,padding:[0,e.valueDisplay.includes("percent")?M:0,0,0]},percent:{color:n.labelColor}}}}function h(){return[c,c,c,c]}function ee(e){const{items:t,theme:o,colorsByItemId:n}=e,a=new Map(t.map(r=>[r.id,r])),l=T(t,e.total),i=S(t),P=E(t),R=o.seriesColors[0];return{animation:!0,animationDuration:0,animationDurationUpdate:e.animate?v:0,animationEasing:"linear",animationEasingUpdate:"linear",textStyle:{fontFamily:o.fontFamily,color:o.labelColor},grid:{top:u,bottom:u,left:d,right:d,containLabel:!1},tooltip:{trigger:"item",backgroundColor:o.tooltipBackgroundColor,borderColor:o.tooltipBorderColor,textStyle:{color:o.labelColor},formatter:Z(e,a,l)},xAxis:{type:"value",min:0,max:i,show:!1},yAxis:Y(e),series:[{id:W,type:"bar",silent:!0,barWidth:p,barGap:"-100%",itemStyle:{color:o.trackColor,borderRadius:h()},data:t.map(r=>({id:r.id,name:r.id,value:[i,r.id]})),encode:{x:0,y:1},label:Q(e,a,l)},{id:X,type:"bar",realtimeSort:!0,barWidth:p,barGap:"-100%",itemStyle:{borderRadius:h()},data:t.map(r=>({id:r.id,name:r.id,value:[P.get(r.id),r.id],itemStyle:{color:n[r.id]??R}})),encode:{x:0,y:1},label:J(e,a)}]}}exports.buildTopListOption=ee;exports.labeledRowStepFor=K;exports.rankById=m;exports.resolveTotal=T;
2
2
  //# sourceMappingURL=top-list-option.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"top-list-option.cjs","sources":["../../../../../../src/ui/components/charts/TopList/top-list-option.ts"],"sourcesContent":["import { formatShare } from \"../chart-share\";\nimport { echarts } from \"../echarts-modules\";\nimport type { ChartTheme } from \"../chart-theme\";\n\nexport interface TopListItem {\n id: string;\n name: string;\n value: number | null;\n colorToken?: string;\n}\n\nexport type TopListSort = \"desc\" | \"asc\";\n\nexport type TopListValueDisplay = \"value\" | \"percent\";\n\nexport interface TopListOptionInput {\n items: TopListItem[];\n sort: TopListSort;\n total?: number;\n valueDisplay: TopListValueDisplay[];\n theme: ChartTheme;\n colorsByItemId: Record<string, string>;\n animate: boolean;\n labeledRowStep: number;\n valueFormatter?: (value: number) => string;\n}\n\nconst EMPTY_VALUE_TEXT: string = \"–\";\n\nconst NAME_MAX_WIDTH_PX: number = 160;\n\nconst NAME_TO_BAR_GAP_PX: number = 12;\n\nconst VALUE_COLUMN_WIDTH_PX: number = 88;\n\nconst PERCENT_COLUMN_WIDTH_PX: number = 56;\n\nconst GRID_PADDING_PX: number = 16;\n\nconst BAR_MAX_WIDTH_PX: number = 20;\n\nconst BAR_RADIUS_PX: number = 4;\n\nconst BAR_END_LABEL_DISTANCE_PX: number = 8;\n\nconst UPDATE_ANIMATION_MS: number = 800;\n\nconst LABEL_FONT_SIZE_PX: number = 12;\n\nconst MIN_LABELED_ROW_HEIGHT_PX: number = 14;\n\nconst TIE_BREAK_RELATIVE_STEP: number = 1e-9;\n\nconst RICH_TEXT_RESERVED: RegExp = /[{}|]/g;\n\nconst VALUE_SERIES_ID: string = \"top-list-values\";\n\n\nfunction valueOf(item: TopListItem): number {\n return item.value ?? 0;\n}\n\nfunction maxValueOf(items: TopListItem[]): number {\n const maxValue: number = Math.max(...items.map(valueOf));\n return maxValue > 0 ? maxValue : 1;\n}\n\nfunction smallestGapBetweenDistinctValues(items: TopListItem[]): number {\n const distinctValues: number[] = [...new Set(items.map(valueOf))].sort(\n (first: number, second: number) => first - second,\n );\n const gaps: number[] = distinctValues\n .slice(1)\n .map((value: number, index: number) => value - distinctValues[index]);\n return gaps.length > 0 ? Math.min(...gaps) : Infinity;\n}\n\nfunction tieBreakStepOf(items: TopListItem[]): number {\n const relativeStep: number = maxValueOf(items) * TIE_BREAK_RELATIVE_STEP;\n const stepThatKeepsDistinctValuesApart: number =\n smallestGapBetweenDistinctValues(items) / (items.length + 1);\n return Math.min(relativeStep, stepThatKeepsDistinctValuesApart);\n}\n\nfunction plottedValuesById(items: TopListItem[]): Map<string, number> {\n const tieBreakStep: number = tieBreakStepOf(items);\n return new Map(\n items.map((item: TopListItem, position: number) => [\n item.id,\n valueOf(item) + tieBreakStep * (items.length - position),\n ]),\n );\n}\n\nexport function rankById(items: TopListItem[], sort: TopListSort): Map<string, number> {\n const plottedValues: Map<string, number> = plottedValuesById(items);\n const direction: number = sort === \"desc\" ? -1 : 1;\n const ranked: TopListItem[] = [...items].sort(\n (first: TopListItem, second: TopListItem) =>\n direction * ((plottedValues.get(first.id) as number) - (plottedValues.get(second.id) as number)),\n );\n return new Map(ranked.map((item: TopListItem, index: number) => [item.id, index + 1]));\n}\n\nexport function resolveTotal(items: TopListItem[], total?: number): number {\n return total ?? items.reduce((sum: number, item: TopListItem) => sum + valueOf(item), 0);\n}\n\nfunction shareOf(item: TopListItem, total: number): number {\n return total === 0 ? 0 : valueOf(item) / total;\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction plainRichText(text: string): string {\n return text.replace(RICH_TEXT_RESERVED, \" \");\n}\n\nfunction truncatedName(name: string, theme: ChartTheme): string {\n const font: string = `${LABEL_FONT_SIZE_PX}px ${theme.fontFamily}`;\n return plainRichText(echarts.format.truncateText(name, NAME_MAX_WIDTH_PX, font, \"…\"));\n}\n\nfunction formatValueText(input: TopListOptionInput, value: number | null): string {\n if (value === null) return EMPTY_VALUE_TEXT;\n return input.valueFormatter ? input.valueFormatter(value) : String(value);\n}\n\nfunction formatShareText(item: TopListItem, total: number): string {\n return item.value === null ? EMPTY_VALUE_TEXT : formatShare(shareOf(item, total));\n}\n\nfunction barEndLabelWidthPx(valueDisplay: TopListValueDisplay[]): number {\n const widths: number[] = [];\n if (valueDisplay.includes(\"value\")) widths.push(VALUE_COLUMN_WIDTH_PX);\n if (valueDisplay.includes(\"percent\")) widths.push(PERCENT_COLUMN_WIDTH_PX);\n if (widths.length === 0) return 0;\n return widths.reduce((sum: number, width: number) => sum + width, 0) + BAR_END_LABEL_DISTANCE_PX;\n}\n\nfunction barEndLabelText(input: TopListOptionInput, item: TopListItem, total: number): string {\n const parts: string[] = [];\n if (input.valueDisplay.includes(\"value\")) {\n parts.push(`{value|${plainRichText(formatValueText(input, item.value))}}`);\n }\n if (input.valueDisplay.includes(\"percent\")) {\n parts.push(`{percent|${formatShareText(item, total)}}`);\n }\n return parts.join(\"\");\n}\n\nexport function labeledRowStepFor(canvasHeightPx: number, itemCount: number): number {\n const rowHeightPx: number = (canvasHeightPx - 2 * GRID_PADDING_PX) / itemCount;\n return Math.max(1, Math.ceil(MIN_LABELED_ROW_HEIGHT_PX / rowHeightPx));\n}\n\nfunction isRowLabeled(rank: number | undefined, step: number): boolean {\n return rank === undefined || (rank - 1) % step === 0;\n}\n\nfunction categoryAxis(\n input: TopListOptionInput,\n itemsById: Map<string, TopListItem>,\n): Record<string, unknown> {\n const { items, sort, theme } = input;\n const ranks: Map<string, number> = rankById(items, sort);\n const step: number = input.labeledRowStep;\n return {\n type: \"category\",\n data: items.map((item: TopListItem) => item.id),\n inverse: sort === \"desc\",\n animationDuration: 0,\n animationDurationUpdate: input.animate ? UPDATE_ANIMATION_MS : 0,\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n color: theme.labelColor,\n fontSize: LABEL_FONT_SIZE_PX,\n interval: 0,\n align: \"right\",\n margin: NAME_TO_BAR_GAP_PX,\n formatter: (id: string) => {\n if (!isRowLabeled(ranks.get(id), step)) return \"\";\n const item: TopListItem | undefined = itemsById.get(id);\n return item ? truncatedName(item.name, theme) : \"\";\n },\n },\n };\n}\n\nfunction tooltipFormatter(\n input: TopListOptionInput,\n itemsById: Map<string, TopListItem>,\n total: number,\n): (params: { name: string }) => string {\n return (params: { name: string }) => {\n const item: TopListItem | undefined = itemsById.get(params.name);\n if (!item) return \"\";\n const share: string = item.value === null ? \"\" : ` · ${formatShare(shareOf(item, total))}`;\n const value: string = escapeHtml(formatValueText(input, item.value));\n return `<div>${escapeHtml(item.name)}</div><div><b>${value}</b>${share}</div>`;\n };\n}\n\nfunction barEndLabel(\n input: TopListOptionInput,\n itemsById: Map<string, TopListItem>,\n total: number,\n): Record<string, unknown> {\n const { theme } = input;\n const ranks: Map<string, number> = rankById(input.items, input.sort);\n const step: number = input.labeledRowStep;\n return {\n show: input.valueDisplay.length > 0,\n position: \"right\",\n distance: BAR_END_LABEL_DISTANCE_PX,\n fontSize: LABEL_FONT_SIZE_PX,\n formatter: (params: { name: string }) => {\n if (!isRowLabeled(ranks.get(params.name), step)) return \"\";\n const item: TopListItem | undefined = itemsById.get(params.name);\n return item ? barEndLabelText(input, item, total) : \"\";\n },\n rich: {\n value: { color: theme.labelColor, fontWeight: 600, padding: [0, 8, 0, 0] },\n percent: { color: theme.labelColor },\n },\n };\n}\n\nexport function buildTopListOption(input: TopListOptionInput): Record<string, unknown> {\n const { items, theme, colorsByItemId } = input;\n const itemsById: Map<string, TopListItem> = new Map(\n items.map((item: TopListItem) => [item.id, item]),\n );\n const total: number = resolveTotal(items, input.total);\n const maxValue: number = maxValueOf(items);\n const plottedValues: Map<string, number> = plottedValuesById(items);\n const reservedRightPx: number = barEndLabelWidthPx(input.valueDisplay);\n const fallbackColor: string = theme.seriesColors[0];\n \n return {\n animation: true,\n animationDuration: 0,\n animationDurationUpdate: input.animate ? UPDATE_ANIMATION_MS : 0,\n animationEasing: \"linear\",\n animationEasingUpdate: \"linear\",\n textStyle: { fontFamily: theme.fontFamily, color: theme.labelColor },\n grid: {\n top: GRID_PADDING_PX,\n bottom: GRID_PADDING_PX,\n left: GRID_PADDING_PX + NAME_MAX_WIDTH_PX + NAME_TO_BAR_GAP_PX,\n right: GRID_PADDING_PX + reservedRightPx,\n containLabel: false,\n },\n tooltip: {\n trigger: \"item\",\n backgroundColor: theme.tooltipBackgroundColor,\n borderColor: theme.tooltipBorderColor,\n textStyle: { color: theme.labelColor },\n formatter: tooltipFormatter(input, itemsById, total),\n },\n xAxis: { type: \"value\", min: 0, max: maxValue, show: false },\n yAxis: categoryAxis(input, itemsById),\n series: [\n {\n id: VALUE_SERIES_ID,\n type: \"bar\",\n realtimeSort: true,\n barMaxWidth: BAR_MAX_WIDTH_PX,\n itemStyle: { borderRadius: [0, BAR_RADIUS_PX, BAR_RADIUS_PX, 0] },\n data: items.map((item: TopListItem) => ({\n id: item.id,\n name: item.id,\n value: [plottedValues.get(item.id) as number, item.id],\n itemStyle: { color: colorsByItemId[item.id] ?? fallbackColor },\n })),\n encode: { x: 0, y: 1 },\n label: barEndLabel(input, itemsById, total),\n },\n ],\n };\n}\n"],"names":["EMPTY_VALUE_TEXT","NAME_MAX_WIDTH_PX","NAME_TO_BAR_GAP_PX","VALUE_COLUMN_WIDTH_PX","PERCENT_COLUMN_WIDTH_PX","GRID_PADDING_PX","BAR_MAX_WIDTH_PX","BAR_RADIUS_PX","BAR_END_LABEL_DISTANCE_PX","UPDATE_ANIMATION_MS","LABEL_FONT_SIZE_PX","MIN_LABELED_ROW_HEIGHT_PX","TIE_BREAK_RELATIVE_STEP","RICH_TEXT_RESERVED","VALUE_SERIES_ID","valueOf","item","maxValueOf","items","maxValue","smallestGapBetweenDistinctValues","distinctValues","first","second","gaps","value","index","tieBreakStepOf","relativeStep","stepThatKeepsDistinctValuesApart","plottedValuesById","tieBreakStep","position","rankById","sort","plottedValues","direction","ranked","resolveTotal","total","sum","shareOf","escapeHtml","text","plainRichText","truncatedName","name","theme","font","echarts","formatValueText","input","formatShareText","formatShare","barEndLabelWidthPx","valueDisplay","widths","width","barEndLabelText","parts","labeledRowStepFor","canvasHeightPx","itemCount","rowHeightPx","isRowLabeled","rank","step","categoryAxis","itemsById","ranks","id","tooltipFormatter","params","share","barEndLabel","buildTopListOption","colorsByItemId","reservedRightPx","fallbackColor"],"mappings":"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"}
1
+ {"version":3,"file":"top-list-option.cjs","sources":["../../../../../../src/ui/components/charts/TopList/top-list-option.ts"],"sourcesContent":["import { formatShare } from \"../chart-share\";\nimport { echarts } from \"../echarts-modules\";\nimport type { ChartTheme } from \"../chart-theme\";\n\nexport interface TopListItem {\n id: string;\n name: string;\n value: number | null;\n colorToken?: string;\n}\n\nexport type TopListSort = \"desc\" | \"asc\";\n\nexport type TopListValueDisplay = \"value\" | \"percent\";\n\nexport interface TopListOptionInput {\n items: TopListItem[];\n sort: TopListSort;\n total?: number;\n valueDisplay: TopListValueDisplay[];\n theme: ChartTheme;\n colorsByItemId: Record<string, string>;\n animate: boolean;\n labeledRowStep: number;\n canvasWidthPx: number;\n valueFormatter?: (value: number) => string;\n}\n\nconst EMPTY_VALUE_TEXT: string = \"–\";\n\nconst NAME_TO_VALUE_GAP_PX: number = 12;\n\nconst VALUE_TO_PERCENT_GAP_PX: number = 8;\n\nconst VALUE_COLUMN_WIDTH_PX: number = 88;\n\nconst PERCENT_COLUMN_WIDTH_PX: number = 56;\n\nconst GRID_PADDING_PX: number = 16;\n\nconst GRID_SIDE_PADDING_PX: number = 4;\n\nconst BAR_WIDTH_PX: number = 6;\n\nconst BAR_RADIUS_PX: number = 3;\n\nconst LABEL_TO_BAR_GAP_PX: number = 6;\n\nconst UPDATE_ANIMATION_MS: number = 800;\n\nconst LABEL_FONT_SIZE_PX: number = 13;\n\nconst MIN_LABELED_ROW_HEIGHT_PX: number = 26;\n\nconst TIE_BREAK_RELATIVE_STEP: number = 1e-9;\n\nconst RICH_TEXT_RESERVED: RegExp = /[{}|]/g;\n\nconst VALUE_SERIES_ID: string = \"top-list-values\";\n\nconst TRACK_SERIES_ID: string = \"top-list-tracks\";\n\nfunction valueOf(item: TopListItem): number {\n return item.value ?? 0;\n}\n\nfunction maxValueOf(items: TopListItem[]): number {\n const maxValue: number = Math.max(...items.map(valueOf));\n return maxValue > 0 ? maxValue : 1;\n}\n\nfunction smallestGapBetweenDistinctValues(items: TopListItem[]): number {\n const distinctValues: number[] = [...new Set(items.map(valueOf))].sort(\n (first: number, second: number) => first - second,\n );\n const gaps: number[] = distinctValues\n .slice(1)\n .map((value: number, index: number) => value - distinctValues[index]);\n return gaps.length > 0 ? Math.min(...gaps) : Infinity;\n}\n\nfunction tieBreakStepOf(items: TopListItem[]): number {\n const relativeStep: number = maxValueOf(items) * TIE_BREAK_RELATIVE_STEP;\n const stepThatKeepsDistinctValuesApart: number =\n smallestGapBetweenDistinctValues(items) / (items.length + 1);\n return Math.min(relativeStep, stepThatKeepsDistinctValuesApart);\n}\n\nfunction plottedValuesById(items: TopListItem[]): Map<string, number> {\n const tieBreakStep: number = tieBreakStepOf(items);\n return new Map(\n items.map((item: TopListItem, position: number) => [\n item.id,\n valueOf(item) + tieBreakStep * (items.length - position),\n ]),\n );\n}\n\nexport function rankById(items: TopListItem[], sort: TopListSort): Map<string, number> {\n const plottedValues: Map<string, number> = plottedValuesById(items);\n const direction: number = sort === \"desc\" ? -1 : 1;\n const ranked: TopListItem[] = [...items].sort(\n (first: TopListItem, second: TopListItem) =>\n direction * ((plottedValues.get(first.id) as number) - (plottedValues.get(second.id) as number)),\n );\n return new Map(ranked.map((item: TopListItem, index: number) => [item.id, index + 1]));\n}\n\nexport function resolveTotal(items: TopListItem[], total?: number): number {\n return total ?? items.reduce((sum: number, item: TopListItem) => sum + valueOf(item), 0);\n}\n\nfunction shareOf(item: TopListItem, total: number): number {\n return total === 0 ? 0 : valueOf(item) / total;\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction plainRichText(text: string): string {\n return text.replace(RICH_TEXT_RESERVED, \" \");\n}\n\nfunction valueColumnsWidthPx(valueDisplay: TopListValueDisplay[]): number {\n const widths: number[] = [];\n if (valueDisplay.includes(\"value\")) widths.push(VALUE_COLUMN_WIDTH_PX);\n if (valueDisplay.includes(\"percent\")) widths.push(PERCENT_COLUMN_WIDTH_PX);\n return widths.reduce((sum: number, width: number) => sum + width, 0);\n}\n\nfunction nameMaxWidthPx(input: TopListOptionInput): number {\n const availablePx: number =\n input.canvasWidthPx -\n 2 * GRID_SIDE_PADDING_PX -\n valueColumnsWidthPx(input.valueDisplay) -\n NAME_TO_VALUE_GAP_PX;\n return Math.max(availablePx, 0);\n}\n\nfunction truncatedName(name: string, input: TopListOptionInput): string {\n const font: string = `${LABEL_FONT_SIZE_PX}px ${input.theme.fontFamily}`;\n return plainRichText(echarts.format.truncateText(name, nameMaxWidthPx(input), font, \"…\"));\n}\n\nfunction formatValueText(input: TopListOptionInput, value: number | null): string {\n if (value === null) return EMPTY_VALUE_TEXT;\n return input.valueFormatter ? input.valueFormatter(value) : String(value);\n}\n\nfunction formatShareText(item: TopListItem, total: number): string {\n return item.value === null ? EMPTY_VALUE_TEXT : formatShare(shareOf(item, total));\n}\n\nfunction valueLabelText(input: TopListOptionInput, item: TopListItem, total: number): string {\n const parts: string[] = [];\n if (input.valueDisplay.includes(\"value\")) {\n parts.push(`{value|${plainRichText(formatValueText(input, item.value))}}`);\n }\n if (input.valueDisplay.includes(\"percent\")) {\n parts.push(`{percent|${formatShareText(item, total)}}`);\n }\n return parts.join(\"\");\n}\n\nexport function labeledRowStepFor(canvasHeightPx: number, itemCount: number): number {\n const rowHeightPx: number = (canvasHeightPx - 2 * GRID_PADDING_PX) / itemCount;\n return Math.max(1, Math.ceil(MIN_LABELED_ROW_HEIGHT_PX / rowHeightPx));\n}\n\nfunction isRowLabeled(rank: number | undefined, step: number): boolean {\n return rank === undefined || (rank - 1) % step === 0;\n}\n\nfunction categoryAxis(input: TopListOptionInput): Record<string, unknown> {\n return {\n type: \"category\",\n data: input.items.map((item: TopListItem) => item.id),\n inverse: input.sort === \"desc\",\n animationDuration: 0,\n animationDurationUpdate: input.animate ? UPDATE_ANIMATION_MS : 0,\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: { show: false },\n };\n}\n\nfunction tooltipFormatter(\n input: TopListOptionInput,\n itemsById: Map<string, TopListItem>,\n total: number,\n): (params: { name: string }) => string {\n return (params: { name: string }) => {\n const item: TopListItem | undefined = itemsById.get(params.name);\n if (!item) return \"\";\n const share: string = item.value === null ? \"\" : ` · ${formatShare(shareOf(item, total))}`;\n const value: string = escapeHtml(formatValueText(input, item.value));\n return `<div>${escapeHtml(item.name)}</div><div><b>${value}</b>${share}</div>`;\n };\n}\n\nfunction labelOffsetAboveBar(): number[] {\n return [0, -(BAR_WIDTH_PX / 2 + LABEL_TO_BAR_GAP_PX)];\n}\n\nfunction nameLabel(\n input: TopListOptionInput,\n itemsById: Map<string, TopListItem>,\n): Record<string, unknown> {\n const ranks: Map<string, number> = rankById(input.items, input.sort);\n return {\n show: true,\n position: \"insideLeft\",\n distance: 0,\n align: \"left\",\n verticalAlign: \"bottom\",\n offset: labelOffsetAboveBar(),\n color: input.theme.emphasizedLabelColor,\n backgroundColor: input.theme.tooltipBackgroundColor,\n fontSize: LABEL_FONT_SIZE_PX,\n fontWeight: 500,\n formatter: (params: { name: string }) => {\n if (!isRowLabeled(ranks.get(params.name), input.labeledRowStep)) return \"\";\n const item: TopListItem | undefined = itemsById.get(params.name);\n return item ? truncatedName(item.name, input) : \"\";\n },\n };\n}\n\nfunction valueLabel(\n input: TopListOptionInput,\n itemsById: Map<string, TopListItem>,\n total: number,\n): Record<string, unknown> {\n const { theme } = input;\n const ranks: Map<string, number> = rankById(input.items, input.sort);\n return {\n show: input.valueDisplay.length > 0,\n backgroundColor: theme.tooltipBackgroundColor,\n position: \"insideRight\",\n distance: 0,\n align: \"right\",\n verticalAlign: \"bottom\",\n offset: labelOffsetAboveBar(),\n fontSize: LABEL_FONT_SIZE_PX,\n formatter: (params: { name: string }) => {\n if (!isRowLabeled(ranks.get(params.name), input.labeledRowStep)) return \"\";\n const item: TopListItem | undefined = itemsById.get(params.name);\n return item ? valueLabelText(input, item, total) : \"\";\n },\n rich: {\n value: {\n color: theme.labelColor,\n fontWeight: 600,\n padding: [0, input.valueDisplay.includes(\"percent\") ? VALUE_TO_PERCENT_GAP_PX : 0, 0, 0],\n },\n percent: { color: theme.labelColor },\n },\n };\n}\n\nfunction barRadius(): number[] {\n return [BAR_RADIUS_PX, BAR_RADIUS_PX, BAR_RADIUS_PX, BAR_RADIUS_PX];\n}\n\nexport function buildTopListOption(input: TopListOptionInput): Record<string, unknown> {\n const { items, theme, colorsByItemId } = input;\n const itemsById: Map<string, TopListItem> = new Map(\n items.map((item: TopListItem) => [item.id, item]),\n );\n const total: number = resolveTotal(items, input.total);\n const maxValue: number = maxValueOf(items);\n const plottedValues: Map<string, number> = plottedValuesById(items);\n const fallbackColor: string = theme.seriesColors[0];\n\n return {\n animation: true,\n animationDuration: 0,\n animationDurationUpdate: input.animate ? UPDATE_ANIMATION_MS : 0,\n animationEasing: \"linear\",\n animationEasingUpdate: \"linear\",\n textStyle: { fontFamily: theme.fontFamily, color: theme.labelColor },\n grid: {\n top: GRID_PADDING_PX,\n bottom: GRID_PADDING_PX,\n left: GRID_SIDE_PADDING_PX,\n right: GRID_SIDE_PADDING_PX,\n containLabel: false,\n },\n tooltip: {\n trigger: \"item\",\n backgroundColor: theme.tooltipBackgroundColor,\n borderColor: theme.tooltipBorderColor,\n textStyle: { color: theme.labelColor },\n formatter: tooltipFormatter(input, itemsById, total),\n },\n xAxis: { type: \"value\", min: 0, max: maxValue, show: false },\n yAxis: categoryAxis(input),\n series: [\n {\n id: TRACK_SERIES_ID,\n type: \"bar\",\n silent: true,\n barWidth: BAR_WIDTH_PX,\n barGap: \"-100%\",\n itemStyle: { color: theme.trackColor, borderRadius: barRadius() },\n data: items.map((item: TopListItem) => ({\n id: item.id,\n name: item.id,\n value: [maxValue, item.id],\n })),\n encode: { x: 0, y: 1 },\n label: valueLabel(input, itemsById, total),\n },\n {\n id: VALUE_SERIES_ID,\n type: \"bar\",\n realtimeSort: true,\n barWidth: BAR_WIDTH_PX,\n barGap: \"-100%\",\n itemStyle: { borderRadius: barRadius() },\n data: items.map((item: TopListItem) => ({\n id: item.id,\n name: item.id,\n value: [plottedValues.get(item.id) as number, item.id],\n itemStyle: { color: colorsByItemId[item.id] ?? fallbackColor },\n })),\n encode: { x: 0, y: 1 },\n label: nameLabel(input, itemsById),\n },\n ],\n };\n}\n"],"names":["EMPTY_VALUE_TEXT","NAME_TO_VALUE_GAP_PX","VALUE_TO_PERCENT_GAP_PX","VALUE_COLUMN_WIDTH_PX","PERCENT_COLUMN_WIDTH_PX","GRID_PADDING_PX","GRID_SIDE_PADDING_PX","BAR_WIDTH_PX","BAR_RADIUS_PX","UPDATE_ANIMATION_MS","LABEL_FONT_SIZE_PX","MIN_LABELED_ROW_HEIGHT_PX","TIE_BREAK_RELATIVE_STEP","RICH_TEXT_RESERVED","VALUE_SERIES_ID","TRACK_SERIES_ID","valueOf","item","maxValueOf","items","maxValue","smallestGapBetweenDistinctValues","distinctValues","first","second","gaps","value","index","tieBreakStepOf","relativeStep","stepThatKeepsDistinctValuesApart","plottedValuesById","tieBreakStep","position","rankById","sort","plottedValues","direction","ranked","resolveTotal","total","sum","shareOf","escapeHtml","text","plainRichText","valueColumnsWidthPx","valueDisplay","widths","width","nameMaxWidthPx","input","availablePx","truncatedName","name","font","echarts","formatValueText","formatShareText","formatShare","valueLabelText","parts","labeledRowStepFor","canvasHeightPx","itemCount","rowHeightPx","isRowLabeled","rank","step","categoryAxis","tooltipFormatter","itemsById","params","share","labelOffsetAboveBar","nameLabel","ranks","valueLabel","theme","barRadius","buildTopListOption","colorsByItemId","fallbackColor"],"mappings":"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"}