@apipass/design-system 7.1.0 → 7.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/embedded-styles.js +2 -2
- package/dist/lib/style.css +1 -1
- package/dist/lib/ui/components/DataTable/DataTable.cjs +1 -1
- package/dist/lib/ui/components/DataTable/DataTable.cjs.map +1 -1
- package/dist/lib/ui/components/DataTable/DataTable.js +70 -69
- package/dist/lib/ui/components/DataTable/DataTable.js.map +1 -1
- package/dist/lib/ui/components/FormModal/FormModal.cjs +1 -1
- package/dist/lib/ui/components/FormModal/FormModal.cjs.map +1 -1
- package/dist/lib/ui/components/FormModal/FormModal.js +14 -15
- package/dist/lib/ui/components/FormModal/FormModal.js.map +1 -1
- package/dist/lib/ui/components/charts/TopList/TopList.cjs +1 -1
- package/dist/lib/ui/components/charts/TopList/TopList.cjs.map +1 -1
- package/dist/lib/ui/components/charts/TopList/TopList.js +49 -45
- package/dist/lib/ui/components/charts/TopList/TopList.js.map +1 -1
- package/dist/lib/ui/components/charts/TopList/top-list-option.cjs +1 -1
- package/dist/lib/ui/components/charts/TopList/top-list-option.cjs.map +1 -1
- package/dist/lib/ui/components/charts/TopList/top-list-option.js +148 -106
- package/dist/lib/ui/components/charts/TopList/top-list-option.js.map +1 -1
- package/dist/lib/ui/components/charts/chart-theme.cjs +1 -1
- package/dist/lib/ui/components/charts/chart-theme.cjs.map +1 -1
- package/dist/lib/ui/components/charts/chart-theme.js +6 -4
- package/dist/lib/ui/components/charts/chart-theme.js.map +1 -1
- package/dist/lib/ui/primitives/Dialog/Dialog.cjs +1 -1
- package/dist/lib/ui/primitives/Dialog/Dialog.cjs.map +1 -1
- package/dist/lib/ui/primitives/Dialog/Dialog.js +26 -16
- package/dist/lib/ui/primitives/Dialog/Dialog.js.map +1 -1
- package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.cjs +1 -1
- package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.cjs.map +1 -1
- package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.js +23 -23
- package/dist/lib/ui/primitives/JsonViewer/json-code-mirror.js.map +1 -1
- package/dist/lib/ui/primitives/Switch/Switch.cjs +1 -1
- package/dist/lib/ui/primitives/Switch/Switch.cjs.map +1 -1
- package/dist/lib/ui/primitives/Switch/Switch.js +25 -20
- package/dist/lib/ui/primitives/Switch/Switch.js.map +1 -1
- package/dist/types/ui/components/FormModal/FormModal.d.ts +2 -1
- package/dist/types/ui/components/charts/TopList/top-list-option.d.ts +1 -0
- package/dist/types/ui/components/charts/chart-theme.d.ts +2 -0
- package/dist/types/ui/primitives/Dialog/Dialog.d.ts +3 -1
- package/dist/types/ui/primitives/Switch/Switch.d.ts +5 -2
- package/package.json +1 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { jsx as r, jsxs as
|
|
2
|
-
import { clsx as h } from "../../../vendor/clsx/dist/clsx.js";
|
|
1
|
+
import { jsx as r, jsxs as a } from "react/jsx-runtime";
|
|
3
2
|
/* empty css */
|
|
4
|
-
import { DialogModal as
|
|
5
|
-
import { Flex as
|
|
3
|
+
import { DialogModal as h, Dialog as u, DialogTitle as D, DialogClose as y, DialogBody as P } from "../../primitives/Dialog/Dialog.js";
|
|
4
|
+
import { Flex as o } from "../../layout/Flex/Flex.js";
|
|
6
5
|
import { Button as n } from "../../primitives/Button/Button.js";
|
|
7
|
-
function
|
|
6
|
+
function B({
|
|
8
7
|
isOpen: l,
|
|
9
8
|
title: m,
|
|
10
9
|
submitLabel: t = "Save",
|
|
@@ -13,24 +12,24 @@ function M({
|
|
|
13
12
|
isSubmitDisabled: d = !1,
|
|
14
13
|
size: s = "medium",
|
|
15
14
|
onSubmit: f,
|
|
16
|
-
onClose:
|
|
15
|
+
onClose: i,
|
|
17
16
|
children: p
|
|
18
17
|
}) {
|
|
19
|
-
return l ? /* @__PURE__ */ r(
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
/* @__PURE__ */ r(
|
|
22
|
-
/* @__PURE__ */ r(y, { onPress:
|
|
18
|
+
return l ? /* @__PURE__ */ r(h, { isOpen: l, onOpenChange: (g) => !g && i(), children: /* @__PURE__ */ a(u, { className: "form-modal", size: s, children: [
|
|
19
|
+
/* @__PURE__ */ a(o, { direction: "row", alignPrimary: "space-between", alignSecondary: "center", children: [
|
|
20
|
+
/* @__PURE__ */ r(D, { children: m }),
|
|
21
|
+
/* @__PURE__ */ r(y, { onPress: i })
|
|
23
22
|
] }),
|
|
24
|
-
/* @__PURE__ */ r(P, { children: /* @__PURE__ */ r(
|
|
25
|
-
/* @__PURE__ */
|
|
26
|
-
|
|
23
|
+
/* @__PURE__ */ r(P, { children: /* @__PURE__ */ r(o, { direction: "column", gap: "300", children: p }) }),
|
|
24
|
+
/* @__PURE__ */ a(
|
|
25
|
+
o,
|
|
27
26
|
{
|
|
28
27
|
direction: "row",
|
|
29
28
|
gap: "200",
|
|
30
29
|
alignPrimary: "end",
|
|
31
30
|
className: "form-modal-footer",
|
|
32
31
|
children: [
|
|
33
|
-
/* @__PURE__ */ r(n, { variant: "neutral", onPress:
|
|
32
|
+
/* @__PURE__ */ r(n, { variant: "neutral", onPress: i, isDisabled: e, children: c }),
|
|
34
33
|
/* @__PURE__ */ r(
|
|
35
34
|
n,
|
|
36
35
|
{
|
|
@@ -46,6 +45,6 @@ function M({
|
|
|
46
45
|
] }) }) : null;
|
|
47
46
|
}
|
|
48
47
|
export {
|
|
49
|
-
|
|
48
|
+
B as FormModal
|
|
50
49
|
};
|
|
51
50
|
//# sourceMappingURL=FormModal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormModal.js","sources":["../../../../../src/ui/components/FormModal/FormModal.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"FormModal.js","sources":["../../../../../src/ui/components/FormModal/FormModal.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogBody,\n DialogClose,\n DialogModal,\n DialogTitle,\n type DialogSize,\n} from \"primitives\";\nimport { Flex } from \"layout\";\nimport type { ReactNode } from \"react\";\nimport \"./formmodal.css\";\n\nexport type FormModalSize = DialogSize;\n\nexport interface FormModalProps {\n isOpen: boolean;\n title: string;\n submitLabel?: string;\n cancelLabel?: string;\n isLoading?: boolean;\n isSubmitDisabled?: boolean;\n /**\n * Maximum width of the dialog. Defaults to `\"medium\"`, which preserves the\n * previous fixed width. Use `\"large\"`/`\"xlarge\"` for forms that embed wide\n * content such as tables.\n */\n size?: FormModalSize;\n onSubmit: () => void;\n onClose: () => void;\n children: ReactNode;\n}\n\nexport function FormModal({\n isOpen,\n title,\n submitLabel = \"Save\",\n cancelLabel = \"Cancel\",\n isLoading = false,\n isSubmitDisabled = false,\n size = \"medium\",\n onSubmit,\n onClose,\n children,\n}: FormModalProps) {\n if (!isOpen) return null;\n\n return (\n <DialogModal isOpen={isOpen} onOpenChange={(open) => !open && onClose()}>\n <Dialog className=\"form-modal\" size={size}>\n <Flex direction=\"row\" alignPrimary=\"space-between\" alignSecondary=\"center\">\n <DialogTitle>{title}</DialogTitle>\n <DialogClose onPress={onClose} />\n </Flex>\n <DialogBody>\n <Flex direction=\"column\" gap=\"300\">\n {children}\n </Flex>\n </DialogBody>\n <Flex\n direction=\"row\"\n gap=\"200\"\n alignPrimary=\"end\"\n className=\"form-modal-footer\"\n >\n <Button variant=\"neutral\" onPress={onClose} isDisabled={isLoading}>\n {cancelLabel}\n </Button>\n <Button\n variant=\"primary\"\n onPress={onSubmit}\n isDisabled={isSubmitDisabled || isLoading}\n >\n {isLoading ? \"...\" : submitLabel}\n </Button>\n </Flex>\n </Dialog>\n </DialogModal>\n );\n}\n"],"names":["FormModal","isOpen","title","submitLabel","cancelLabel","isLoading","isSubmitDisabled","size","onSubmit","onClose","children","jsx","DialogModal","open","jsxs","Dialog","Flex","DialogTitle","DialogClose","DialogBody","Button"],"mappings":";;;;;AAiCO,SAASA,EAAU;AAAA,EACxB,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AAAA,EACZ,kBAAAC,IAAmB;AAAA,EACnB,MAAAC,IAAO;AAAA,EACP,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AACF,GAAmB;AACjB,SAAKT,IAGH,gBAAAU,EAACC,GAAA,EAAY,QAAAX,GAAgB,cAAc,CAACY,MAAS,CAACA,KAAQJ,EAAA,GAC5D,UAAA,gBAAAK,EAACC,GAAA,EAAO,WAAU,cAAa,MAAAR,GAC7B,UAAA;AAAA,IAAA,gBAAAO,EAACE,KAAK,WAAU,OAAM,cAAa,iBAAgB,gBAAe,UAChE,UAAA;AAAA,MAAA,gBAAAL,EAACM,KAAa,UAAAf,EAAA,CAAM;AAAA,MACpB,gBAAAS,EAACO,GAAA,EAAY,SAAST,EAAA,CAAS;AAAA,IAAA,GACjC;AAAA,IACA,gBAAAE,EAACQ,KACC,UAAA,gBAAAR,EAACK,GAAA,EAAK,WAAU,UAAS,KAAI,OAC1B,UAAAN,EAAA,CACH,EAAA,CACF;AAAA,IACA,gBAAAI;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAI;AAAA,QACJ,cAAa;AAAA,QACb,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAAL,EAACS,KAAO,SAAQ,WAAU,SAASX,GAAS,YAAYJ,GACrD,UAAAD,EAAA,CACH;AAAA,UACA,gBAAAO;AAAA,YAACS;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,SAASZ;AAAA,cACT,YAAYF,KAAoBD;AAAA,cAE/B,cAAY,QAAQF;AAAA,YAAA;AAAA,UAAA;AAAA,QACvB;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,EAAA,CACF,EAAA,CACF,IAhCkB;AAkCtB;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
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,
|
|
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
|
|
2
|
-
import { clsx as
|
|
3
|
-
import { useRef as
|
|
4
|
-
import { CHART_SERIES_COLOR_TOKENS as
|
|
5
|
-
import { useChartInstance as
|
|
6
|
-
import { labeledRowStepFor as
|
|
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
|
|
9
|
-
function
|
|
8
|
+
const y = ["value"], D = M[0];
|
|
9
|
+
function F() {
|
|
10
10
|
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
11
11
|
}
|
|
12
|
-
function
|
|
13
|
-
const a = new Set(
|
|
14
|
-
return [...
|
|
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
|
|
17
|
-
items:
|
|
16
|
+
function Y({
|
|
17
|
+
items: t,
|
|
18
18
|
sort: i = "desc",
|
|
19
19
|
total: a,
|
|
20
|
-
valueDisplay:
|
|
20
|
+
valueDisplay: o = y,
|
|
21
21
|
valueFormatter: d,
|
|
22
|
-
colorToken: e =
|
|
23
|
-
className:
|
|
24
|
-
...
|
|
22
|
+
colorToken: e = D,
|
|
23
|
+
className: b,
|
|
24
|
+
...g
|
|
25
25
|
}) {
|
|
26
|
-
const { containerRef: f, chart: p, theme: u, resolveSeriesColor: l } =
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
if (!
|
|
30
|
-
const n = new ResizeObserver(() =>
|
|
31
|
-
|
|
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
|
|
34
|
-
const
|
|
35
|
-
return
|
|
36
|
-
const
|
|
37
|
-
|
|
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
|
-
}, [
|
|
40
|
-
return
|
|
41
|
-
if (!p || !u || !
|
|
42
|
-
const
|
|
43
|
-
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
|
-
|
|
47
|
+
t.map((s) => [s.id, s])
|
|
46
48
|
), c = m.current.map(
|
|
47
|
-
(
|
|
49
|
+
(s) => n.get(s)
|
|
48
50
|
);
|
|
49
51
|
p.setOption(
|
|
50
|
-
|
|
52
|
+
N({
|
|
51
53
|
items: c,
|
|
52
54
|
sort: i,
|
|
53
55
|
total: a,
|
|
54
|
-
valueDisplay:
|
|
56
|
+
valueDisplay: o,
|
|
55
57
|
theme: u,
|
|
56
|
-
colorsByItemId:
|
|
57
|
-
animate:
|
|
58
|
-
labeledRowStep:
|
|
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
|
-
|
|
69
|
+
t,
|
|
67
70
|
i,
|
|
68
71
|
a,
|
|
69
|
-
|
|
72
|
+
o,
|
|
73
|
+
I,
|
|
74
|
+
R,
|
|
70
75
|
E,
|
|
71
76
|
O,
|
|
72
|
-
R,
|
|
73
77
|
d
|
|
74
|
-
]), /* @__PURE__ */
|
|
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
|
-
|
|
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":";;;;;;;AAwBA,MAAMA,IAA+C,CAAC,OAAO,GAEvDC,IAA8BC,EAA0B,CAAC;AAE/D,SAASC,IAAgC;AACvC,SAAO,OAAO,WAAW,kCAAkC,EAAE;AAC/D;AAEA,SAASC,EAAmBC,GAAsBC,GAAmC;AACnF,QAAMC,IAA0B,IAAI,IAAIF,EAAM,IAAI,CAACG,MAAsBA,EAAK,EAAE,CAAC,GAC3EC,IAAyBH,EAAc,OAAO,CAACI,MAAeH,EAAW,IAAIG,CAAE,CAAC,GAChFC,IAAmBN,EACtB,IAAI,CAACG,MAAsBA,EAAK,EAAE,EAClC,OAAO,CAACE,MAAe,CAACD,EAAa,SAASC,CAAE,CAAC;AACpD,SAAO,CAAC,GAAGD,GAAc,GAAGE,CAAM;AACpC;AAEO,SAASC,EAAQ;AAAA,EACtB,OAAAP;AAAA,EACA,MAAAQ,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,cAAAC,IAAef;AAAA,EACf,gBAAAgB;AAAA,EACA,YAAAC,IAAahB;AAAA,EACb,WAAAiB;AAAA,EACA,GAAGC;AACL,GAAiB;AACf,QAAM,EAAE,cAAAC,GAAc,OAAAC,GAAO,OAAAC,GAAO,oBAAAC,EAAA,IAAsCC,EAAA,GACpEC,IAAcC,EAAgB,EAAK,GACnCC,IAAmBD,EAAiB,EAAE,GACtC,CAACE,GAAgBC,CAAiB,IAAIC,EAAiB,CAAC;
|
|
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
|
|
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,"&").replace(/</g,"<").replace(/>/g,">")}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, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\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, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\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":"qgBA4BMA,EAA2B,IAE3BC,EAA+B,GAE/BC,EAAkC,EAElCC,EAAgC,GAEhCC,EAAkC,GAElCC,EAA0B,GAE1BC,EAA+B,EAE/BC,EAAuB,EAEvBC,EAAwB,EAIxBC,EAA8B,IAE9BC,EAA6B,GAE7BC,EAAoC,GAEpCC,EAAkC,KAElCC,EAA6B,SAE7BC,EAA0B,kBAE1BC,EAA0B,kBAEhC,SAASC,EAAQC,EAA2B,CAC1C,OAAOA,EAAK,OAAS,CACvB,CAEA,SAASC,EAAWC,EAA8B,CAChD,MAAMC,EAAmB,KAAK,IAAI,GAAGD,EAAM,IAAIH,CAAO,CAAC,EACvD,OAAOI,EAAW,EAAIA,EAAW,CACnC,CAEA,SAASC,EAAiCF,EAA8B,CACtE,MAAMG,EAA2B,CAAC,GAAG,IAAI,IAAIH,EAAM,IAAIH,CAAO,CAAC,CAAC,EAAE,KAChE,CAACO,EAAeC,IAAmBD,EAAQC,CAAA,EAEvCC,EAAiBH,EACpB,MAAM,CAAC,EACP,IAAI,CAACI,EAAeC,IAAkBD,EAAQJ,EAAeK,CAAK,CAAC,EACtE,OAAOF,EAAK,OAAS,EAAI,KAAK,IAAI,GAAGA,CAAI,EAAI,GAC/C,CAEA,SAASG,EAAeT,EAA8B,CACpD,MAAMU,EAAuBX,EAAWC,CAAK,EAAIP,EAC3CkB,EACJT,EAAiCF,CAAK,GAAKA,EAAM,OAAS,GAC5D,OAAO,KAAK,IAAIU,EAAcC,CAAgC,CAChE,CAEA,SAASC,EAAkBZ,EAA2C,CACpE,MAAMa,EAAuBJ,EAAeT,CAAK,EACjD,OAAO,IAAI,IACTA,EAAM,IAAI,CAACF,EAAmBgB,IAAqB,CACjDhB,EAAK,GACLD,EAAQC,CAAI,EAAIe,GAAgBb,EAAM,OAASc,EAAA,CAChD,CAAA,CAEL,CAEO,SAASC,EAASf,EAAsBgB,EAAwC,CACrF,MAAMC,EAAqCL,EAAkBZ,CAAK,EAC5DkB,EAAoBF,IAAS,OAAS,GAAK,EAC3CG,EAAwB,CAAC,GAAGnB,CAAK,EAAE,KACvC,CAACI,EAAoBC,IACnBa,GAAcD,EAAc,IAAIb,EAAM,EAAE,EAAgBa,EAAc,IAAIZ,EAAO,EAAE,EAAA,EAEvF,OAAO,IAAI,IAAIc,EAAO,IAAI,CAACrB,EAAmBU,IAAkB,CAACV,EAAK,GAAIU,EAAQ,CAAC,CAAC,CAAC,CACvF,CAEO,SAASY,EAAapB,EAAsBqB,EAAwB,CACzE,OAAOA,GAASrB,EAAM,OAAO,CAACsB,EAAaxB,IAAsBwB,EAAMzB,EAAQC,CAAI,EAAG,CAAC,CACzF,CAEA,SAASyB,EAAQzB,EAAmBuB,EAAuB,CACzD,OAAOA,IAAU,EAAI,EAAIxB,EAAQC,CAAI,EAAIuB,CAC3C,CAEA,SAASG,EAAWC,EAAsB,CACxC,OAAOA,EAAK,QAAQ,KAAM,OAAO,EAAE,QAAQ,KAAM,MAAM,EAAE,QAAQ,KAAM,MAAM,CAC/E,CAEA,SAASC,EAAcD,EAAsB,CAC3C,OAAOA,EAAK,QAAQ/B,EAAoB,GAAG,CAC7C,CAEA,SAASiC,EAAoBC,EAA6C,CACxE,MAAMC,EAAmB,CAAA,EACzB,OAAID,EAAa,SAAS,OAAO,GAAGC,EAAO,KAAK7C,CAAqB,EACjE4C,EAAa,SAAS,SAAS,GAAGC,EAAO,KAAK5C,CAAuB,EAClE4C,EAAO,OAAO,CAACP,EAAaQ,IAAkBR,EAAMQ,EAAO,CAAC,CACrE,CAEA,SAASC,EAAeC,EAAmC,CACzD,MAAMC,EACJD,EAAM,cACN,EAAI7C,EACJwC,EAAoBK,EAAM,YAAY,EACtClD,EACF,OAAO,KAAK,IAAImD,EAAa,CAAC,CAChC,CAEA,SAASC,EAAcC,EAAcH,EAAmC,CACtE,MAAMI,EAAe,GAAG7C,CAAkB,MAAMyC,EAAM,MAAM,UAAU,GACtE,OAAON,EAAcW,EAAQ,OAAO,aAAaF,EAAMJ,EAAeC,CAAK,EAAGI,EAAM,GAAG,CAAC,CAC1F,CAEA,SAASE,EAAgBN,EAA2BzB,EAA8B,CAChF,OAAIA,IAAU,KAAa1B,EACpBmD,EAAM,eAAiBA,EAAM,eAAezB,CAAK,EAAI,OAAOA,CAAK,CAC1E,CAEA,SAASgC,EAAgBzC,EAAmBuB,EAAuB,CACjE,OAAOvB,EAAK,QAAU,KAAOjB,EAAmB2D,EAAAA,YAAYjB,EAAQzB,EAAMuB,CAAK,CAAC,CAClF,CAEA,SAASoB,EAAeT,EAA2BlC,EAAmBuB,EAAuB,CAC3F,MAAMqB,EAAkB,CAAA,EACxB,OAAIV,EAAM,aAAa,SAAS,OAAO,GACrCU,EAAM,KAAK,UAAUhB,EAAcY,EAAgBN,EAAOlC,EAAK,KAAK,CAAC,CAAC,GAAG,EAEvEkC,EAAM,aAAa,SAAS,SAAS,GACvCU,EAAM,KAAK,YAAYH,EAAgBzC,EAAMuB,CAAK,CAAC,GAAG,EAEjDqB,EAAM,KAAK,EAAE,CACtB,CAEO,SAASC,EAAkBC,EAAwBC,EAA2B,CACnF,MAAMC,GAAuBF,EAAiB,EAAI1D,GAAmB2D,EACrE,OAAO,KAAK,IAAI,EAAG,KAAK,KAAKrD,EAA4BsD,CAAW,CAAC,CACvE,CAEA,SAASC,EAAaC,EAA0BC,EAAuB,CACrE,OAAOD,IAAS,SAAcA,EAAO,GAAKC,IAAS,CACrD,CAEA,SAASC,EAAalB,EAAoD,CACxE,MAAO,CACL,KAAM,WACN,KAAMA,EAAM,MAAM,IAAKlC,GAAsBA,EAAK,EAAE,EACpD,QAASkC,EAAM,OAAS,OACxB,kBAAmB,EACnB,wBAAyBA,EAAM,QAAU1C,EAAsB,EAC/D,SAAU,CAAE,KAAM,EAAA,EAClB,SAAU,CAAE,KAAM,EAAA,EAClB,UAAW,CAAE,KAAM,EAAA,CAAM,CAE7B,CAEA,SAAS6D,EACPnB,EACAoB,EACA/B,EACsC,CACtC,OAAQgC,GAA6B,CACnC,MAAMvD,EAAgCsD,EAAU,IAAIC,EAAO,IAAI,EAC/D,GAAI,CAACvD,EAAM,MAAO,GAClB,MAAMwD,EAAgBxD,EAAK,QAAU,KAAO,GAAK,MAAM0C,EAAAA,YAAYjB,EAAQzB,EAAMuB,CAAK,CAAC,CAAC,GAClFd,EAAgBiB,EAAWc,EAAgBN,EAAOlC,EAAK,KAAK,CAAC,EACnE,MAAO,QAAQ0B,EAAW1B,EAAK,IAAI,CAAC,iBAAiBS,CAAK,OAAO+C,CAAK,QACxE,CACF,CAEA,SAASC,GAAgC,CACvC,MAAO,CAAC,EAAG,EAAyC,CACtD,CAEA,SAASC,EACPxB,EACAoB,EACyB,CACzB,MAAMK,EAA6B1C,EAASiB,EAAM,MAAOA,EAAM,IAAI,EACnE,MAAO,CACL,KAAM,GACN,SAAU,aACV,SAAU,EACV,MAAO,OACP,cAAe,SACf,OAAQuB,EAAA,EACR,MAAOvB,EAAM,MAAM,qBACnB,gBAAiBA,EAAM,MAAM,uBAC7B,SAAUzC,EACV,WAAY,IACZ,UAAY8D,GAA6B,CACvC,GAAI,CAACN,EAAaU,EAAM,IAAIJ,EAAO,IAAI,EAAGrB,EAAM,cAAc,EAAG,MAAO,GACxE,MAAMlC,EAAgCsD,EAAU,IAAIC,EAAO,IAAI,EAC/D,OAAOvD,EAAOoC,EAAcpC,EAAK,KAAMkC,CAAK,EAAI,EAClD,CAAA,CAEJ,CAEA,SAAS0B,EACP1B,EACAoB,EACA/B,EACyB,CACzB,KAAM,CAAE,MAAAsC,GAAU3B,EACZyB,EAA6B1C,EAASiB,EAAM,MAAOA,EAAM,IAAI,EACnE,MAAO,CACL,KAAMA,EAAM,aAAa,OAAS,EAClC,gBAAiB2B,EAAM,uBACvB,SAAU,cACV,SAAU,EACV,MAAO,QACP,cAAe,SACf,OAAQJ,EAAA,EACR,SAAUhE,EACV,UAAY8D,GAA6B,CACvC,GAAI,CAACN,EAAaU,EAAM,IAAIJ,EAAO,IAAI,EAAGrB,EAAM,cAAc,EAAG,MAAO,GACxE,MAAMlC,EAAgCsD,EAAU,IAAIC,EAAO,IAAI,EAC/D,OAAOvD,EAAO2C,EAAeT,EAAOlC,EAAMuB,CAAK,EAAI,EACrD,EACA,KAAM,CACJ,MAAO,CACL,MAAOsC,EAAM,WACb,WAAY,IACZ,QAAS,CAAC,EAAG3B,EAAM,aAAa,SAAS,SAAS,EAAIjD,EAA0B,EAAG,EAAG,CAAC,CAAA,EAEzF,QAAS,CAAE,MAAO4E,EAAM,UAAA,CAAW,CACrC,CAEJ,CAEA,SAASC,GAAsB,CAC7B,MAAO,CAACvE,EAAeA,EAAeA,EAAeA,CAAa,CACpE,CAEO,SAASwE,GAAmB7B,EAAoD,CACrF,KAAM,CAAE,MAAAhC,EAAO,MAAA2D,EAAO,eAAAG,CAAA,EAAmB9B,EACnCoB,EAAsC,IAAI,IAC9CpD,EAAM,IAAKF,GAAsB,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAA,EAE5CuB,EAAgBD,EAAapB,EAAOgC,EAAM,KAAK,EAC/C/B,EAAmBF,EAAWC,CAAK,EACnCiB,EAAqCL,EAAkBZ,CAAK,EAC5D+D,EAAwBJ,EAAM,aAAa,CAAC,EAElD,MAAO,CACL,UAAW,GACX,kBAAmB,EACnB,wBAAyB3B,EAAM,QAAU1C,EAAsB,EAC/D,gBAAiB,SACjB,sBAAuB,SACvB,UAAW,CAAE,WAAYqE,EAAM,WAAY,MAAOA,EAAM,UAAA,EACxD,KAAM,CACJ,IAAKzE,EACL,OAAQA,EACR,KAAMC,EACN,MAAOA,EACP,aAAc,EAAA,EAEhB,QAAS,CACP,QAAS,OACT,gBAAiBwE,EAAM,uBACvB,YAAaA,EAAM,mBACnB,UAAW,CAAE,MAAOA,EAAM,UAAA,EAC1B,UAAWR,EAAiBnB,EAAOoB,EAAW/B,CAAK,CAAA,EAErD,MAAO,CAAE,KAAM,QAAS,IAAK,EAAG,IAAKpB,EAAU,KAAM,EAAA,EACrD,MAAOiD,EAAalB,CAAK,EACzB,OAAQ,CACN,CACE,GAAIpC,EACJ,KAAM,MACN,OAAQ,GACR,SAAUR,EACV,OAAQ,QACR,UAAW,CAAE,MAAOuE,EAAM,WAAY,aAAcC,GAAU,EAC9D,KAAM5D,EAAM,IAAKF,IAAuB,CACtC,GAAIA,EAAK,GACT,KAAMA,EAAK,GACX,MAAO,CAACG,EAAUH,EAAK,EAAE,CAAA,EACzB,EACF,OAAQ,CAAE,EAAG,EAAG,EAAG,CAAA,EACnB,MAAO4D,EAAW1B,EAAOoB,EAAW/B,CAAK,CAAA,EAE3C,CACE,GAAI1B,EACJ,KAAM,MACN,aAAc,GACd,SAAUP,EACV,OAAQ,QACR,UAAW,CAAE,aAAcwE,GAAU,EACrC,KAAM5D,EAAM,IAAKF,IAAuB,CACtC,GAAIA,EAAK,GACT,KAAMA,EAAK,GACX,MAAO,CAACmB,EAAc,IAAInB,EAAK,EAAE,EAAaA,EAAK,EAAE,EACrD,UAAW,CAAE,MAAOgE,EAAehE,EAAK,EAAE,GAAKiE,CAAA,CAAc,EAC7D,EACF,OAAQ,CAAE,EAAG,EAAG,EAAG,CAAA,EACnB,MAAOP,EAAUxB,EAAOoB,CAAS,CAAA,CACnC,CACF,CAEJ"}
|