@embeddable.com/remarkable-ui 0.1.50 → 0.1.51
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/BarChartDefaultHorizontalPro.js +18 -17
- package/dist/BarChartDefaultHorizontalPro.js.map +1 -1
- package/dist/BarChartDefaultPro.js +18 -17
- package/dist/BarChartDefaultPro.js.map +1 -1
- package/dist/BarChartGroupedHorizontalPro.js +20 -19
- package/dist/BarChartGroupedHorizontalPro.js.map +1 -1
- package/dist/BarChartGroupedPro.js +20 -19
- package/dist/BarChartGroupedPro.js.map +1 -1
- package/dist/BarChartStackedHorizontalPro.js +24 -23
- package/dist/BarChartStackedHorizontalPro.js.map +1 -1
- package/dist/BarChartStackedPro.js +24 -23
- package/dist/BarChartStackedPro.js.map +1 -1
- package/dist/{ChartCard-k190CXR0.js → ChartCard-D-0O5ugW.js} +19 -19
- package/dist/{ChartCard-k190CXR0.js.map → ChartCard-D-0O5ugW.js.map} +1 -1
- package/dist/{ComparisonPeriod.type.emb-Dgl2VM4_.js → ComparisonPeriod.type.emb-CYp3nw-9.js} +2 -2
- package/dist/{ComparisonPeriod.type.emb-Dgl2VM4_.js.map → ComparisonPeriod.type.emb-CYp3nw-9.js.map} +1 -1
- package/dist/ComparisonPeriodSelectFieldPro.js +8 -8
- package/dist/DateRangeSelectFieldPro.js +2 -2
- package/dist/DonutChartPro.js +2 -2
- package/dist/DonutLabelChartPro.js +2 -2
- package/dist/{EditorCard-BNBH4Y9F.js → EditorCard-BhC7oToX.js} +18 -18
- package/dist/{EditorCard-BNBH4Y9F.js.map → EditorCard-BhC7oToX.js.map} +1 -1
- package/dist/{HeatMap-ylrlKLQI.js → HeatMap-By9_uzV_.js} +2 -2
- package/dist/{HeatMap-ylrlKLQI.js.map → HeatMap-By9_uzV_.js.map} +1 -1
- package/dist/HeatMapPro.js +18 -18
- package/dist/{KpiChart-DJ5el66E.js → KpiChart-CS9s8nJ4.js} +10 -10
- package/dist/{KpiChart-DJ5el66E.js.map → KpiChart-CS9s8nJ4.js.map} +1 -1
- package/dist/KpiChartNumberComparisonPro.js +29 -29
- package/dist/KpiChartNumberPro.js +4 -4
- package/dist/LineChartComparisonDefaultPro.js +13 -13
- package/dist/LineChartDefaultPro.js +10 -10
- package/dist/LineChartGroupedPro.js +6 -6
- package/dist/MultiSelectFieldPro.js +2 -2
- package/dist/PieChartPro.js +2 -2
- package/dist/{PivotTable-awuBNY8c.js → PivotTable-Cx4WG6MV.js} +2 -2
- package/dist/{PivotTable-awuBNY8c.js.map → PivotTable-Cx4WG6MV.js.map} +1 -1
- package/dist/PivotTablePro.js +18 -18
- package/dist/{SingleSelectField-CY0TwkyW.js → SingleSelectField-DlVCi5Ej.js} +15 -15
- package/dist/{SingleSelectField-CY0TwkyW.js.map → SingleSelectField-DlVCi5Ej.js.map} +1 -1
- package/dist/SingleSelectFieldPro.js +2 -2
- package/dist/TableChartPaginated.js +27 -27
- package/dist/bars.utils-DTdoPs5N.js +146 -0
- package/dist/bars.utils-DTdoPs5N.js.map +1 -0
- package/dist/{charts.utils-LgE4AEAw.js → charts.utils-D9TXwxGs.js} +3 -3
- package/dist/{charts.utils-LgE4AEAw.js.map → charts.utils-D9TXwxGs.js.map} +1 -1
- package/dist/{component.constants-D0ea4CW4.js → component.constants-DCOqCFoY.js} +3283 -3127
- package/dist/component.constants-DCOqCFoY.js.map +1 -0
- package/dist/embeddable-components.json +11 -11
- package/dist/{formatter.utils-DBUd3PfE.js → formatter.utils-B80iNq9Q.js} +2 -2
- package/dist/{formatter.utils-DBUd3PfE.js.map → formatter.utils-B80iNq9Q.js.map} +1 -1
- package/dist/{index-DuWcnytb.js → index--tdFwk_H.js} +7 -7
- package/dist/{index-DuWcnytb.js.map → index--tdFwk_H.js.map} +1 -1
- package/dist/{index-D_TXLv5w.js → index-BcPj51g3.js} +22 -22
- package/dist/{index-D_TXLv5w.js.map → index-BcPj51g3.js.map} +1 -1
- package/dist/{index-DGb59RGF.js → index-C3o3AQpK.js} +9 -9
- package/dist/{index-DGb59RGF.js.map → index-C3o3AQpK.js.map} +1 -1
- package/dist/{index-BGf7vP5k.js → index-CmE__sUg.js} +8 -8
- package/dist/{index-BGf7vP5k.js.map → index-CmE__sUg.js.map} +1 -1
- package/dist/{index-BpujEeVe.js → index-D4oPbYPT.js} +7 -7
- package/dist/{index-BpujEeVe.js.map → index-D4oPbYPT.js.map} +1 -1
- package/dist/{index-C_G6mJoE.js → index-DpIR-B0R.js} +18 -18
- package/dist/{index-C_G6mJoE.js.map → index-DpIR-B0R.js.map} +1 -1
- package/dist/index.js +142 -135
- package/dist/{pies.utils-DpY3U9c2.js → pies.utils-DEkgZgVk.js} +6 -6
- package/dist/{pies.utils-DpY3U9c2.js.map → pies.utils-DEkgZgVk.js.map} +1 -1
- package/dist/remarkable-ui/index.d.ts +4 -1
- package/dist/remarkable-ui/index.d.ts.map +1 -1
- package/dist/{timeRange.utils-B9kyLPq_.js → timeRange.utils-u1NZ0u7o.js} +2 -2
- package/dist/{timeRange.utils-B9kyLPq_.js.map → timeRange.utils-u1NZ0u7o.js.map} +1 -1
- package/package.json +1 -1
- package/dist/bars.utils-cZSSvRai.js +0 -311
- package/dist/bars.utils-cZSSvRai.js.map +0 -1
- package/dist/component.constants-D0ea4CW4.js.map +0 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useEffect as
|
|
3
|
-
import { useTheme as
|
|
1
|
+
import { a0 as u, j as a, a3 as y, i as m, a5 as g, a6 as _, a9 as p, aa as h, F as x, aK as f } from "./component.constants-DCOqCFoY.js";
|
|
2
|
+
import { useEffect as C } from "react";
|
|
3
|
+
import { useTheme as b } from "@embeddable.com/react";
|
|
4
4
|
/**
|
|
5
5
|
* @license @tabler/icons-react v3.35.0 - MIT
|
|
6
6
|
*
|
|
7
7
|
* This source code is licensed under the MIT license.
|
|
8
8
|
* See the LICENSE file in the root directory of this source tree.
|
|
9
9
|
*/
|
|
10
|
-
const
|
|
10
|
+
const j = [["path", { d: "M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0", key: "svg-0" }], ["path", { d: "M21 21l-6 -6", key: "svg-1" }]], $ = u("outline", "search", "Search", j), S = "_listOptions_2o1ip_1", v = "_disabled_2o1ip_6", c = {
|
|
11
11
|
listOptions: S,
|
|
12
12
|
disabled: v
|
|
13
|
-
},
|
|
13
|
+
}, A = ({ children: t, disabled: s, ...e }) => /* @__PURE__ */ a.jsx("div", { className: y(c.listOptions, s && c.disabled), ...e, children: t }), L = "_category_1p6u3_1", N = "_categoryLabel_1p6u3_11", n = {
|
|
14
14
|
category: L,
|
|
15
15
|
categoryLabel: N
|
|
16
|
-
},
|
|
17
|
-
function
|
|
16
|
+
}, B = ({ label: t }) => /* @__PURE__ */ a.jsx("div", { className: n.category, children: /* @__PURE__ */ a.jsx("span", { className: n.categoryLabel, children: t }) });
|
|
17
|
+
function D(t, s = 300) {
|
|
18
18
|
let e;
|
|
19
19
|
return (...r) => {
|
|
20
20
|
clearTimeout(e), e = setTimeout(() => {
|
|
@@ -22,7 +22,7 @@ function B(t, s = 300) {
|
|
|
22
22
|
}, s);
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
-
const
|
|
25
|
+
const F = (t) => {
|
|
26
26
|
const s = t.reduce((e, r) => {
|
|
27
27
|
if ("category" in r && r.category) {
|
|
28
28
|
const o = r.category;
|
|
@@ -32,7 +32,7 @@ const D = (t) => {
|
|
|
32
32
|
}, {});
|
|
33
33
|
return Object.keys(s).length === 0 ? null : s;
|
|
34
34
|
}, H = (t, s) => {
|
|
35
|
-
|
|
35
|
+
C(() => {
|
|
36
36
|
t && setTimeout(() => {
|
|
37
37
|
var e;
|
|
38
38
|
(e = s.current) == null || e.focus();
|
|
@@ -41,14 +41,14 @@ const D = (t) => {
|
|
|
41
41
|
}, O = "_error_1xvr5_1", T = "_card_1xvr5_7", i = {
|
|
42
42
|
error: O,
|
|
43
43
|
card: T
|
|
44
|
-
},
|
|
44
|
+
}, K = ({
|
|
45
45
|
title: t,
|
|
46
46
|
subtitle: s,
|
|
47
47
|
children: e,
|
|
48
48
|
errorMessage: r,
|
|
49
49
|
...o
|
|
50
50
|
}) => {
|
|
51
|
-
const l =
|
|
51
|
+
const l = b();
|
|
52
52
|
m(l);
|
|
53
53
|
const d = () => r ? /* @__PURE__ */ a.jsx(
|
|
54
54
|
h,
|
|
@@ -65,12 +65,12 @@ const D = (t) => {
|
|
|
65
65
|
] });
|
|
66
66
|
};
|
|
67
67
|
export {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
68
|
+
K as E,
|
|
69
|
+
$ as I,
|
|
70
|
+
A as S,
|
|
71
|
+
B as a,
|
|
72
|
+
D as d,
|
|
73
|
+
F as g,
|
|
74
74
|
H as u
|
|
75
75
|
};
|
|
76
|
-
//# sourceMappingURL=EditorCard-
|
|
76
|
+
//# sourceMappingURL=EditorCard-BhC7oToX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorCard-
|
|
1
|
+
{"version":3,"file":"EditorCard-BhC7oToX.js","sources":["../node_modules/@tabler/icons-react/dist/esm/icons/IconSearch.mjs","../src/remarkable-ui/editors/select/shared/SelectList/SelectListOptions/SelectListOptions.tsx","../src/remarkable-ui/editors/select/shared/SelectList/SelectListOptions/SelectListCategory/SelectListCategory.tsx","../src/remarkable-ui/utils/debounce.utils.ts","../src/remarkable-ui/editors/select/shared/SelectList/selectList.utils.ts","../src/remarkable-ui/editors/select/shared/useSelectSearchFocus.hook.ts","../src/remarkable-pro/components/editors/shared/EditorCard/EditorCard.tsx"],"sourcesContent":["/**\n * @license @tabler/icons-react v3.35.0 - MIT\n *\n * This source code is licensed under the MIT license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createReactComponent from '../createReactComponent.mjs';\n\nconst __iconNode = [[\"path\", { \"d\": \"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M21 21l-6 -6\", \"key\": \"svg-1\" }]];\nconst IconSearch = createReactComponent(\"outline\", \"search\", \"Search\", __iconNode);\n\nexport { __iconNode, IconSearch as default };\n//# sourceMappingURL=IconSearch.mjs.map\n","import { FC } from 'react';\nimport styles from './SelectListOptions.module.css';\nimport clsx from 'clsx';\n\nexport type SelectListOptionsProps = React.HTMLAttributes<HTMLDivElement> & {\n children: React.ReactNode;\n disabled?: boolean;\n};\n\nexport const SelectListOptions: FC<SelectListOptionsProps> = ({ children, disabled, ...props }) => {\n return (\n <div className={clsx(styles.listOptions, disabled && styles.disabled)} {...props}>\n {children}\n </div>\n );\n};\n","import { FC } from 'react';\nimport styles from './SelectListCategory.module.css';\n\ntype SelectListCategoryProps = {\n label: string;\n};\n\nexport const SelectListCategory: FC<SelectListCategoryProps> = ({ label }) => {\n return (\n <div className={styles.category}>\n <span className={styles.categoryLabel}>{label}</span>\n </div>\n );\n};\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce<T extends (...args: any[]) => void>(\n fn: T,\n delay = 300,\n): (...args: Parameters<T>) => void {\n let timer: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n fn(...args);\n }, delay);\n };\n}\n","import {\n SelectListOptionProps,\n SelectListOptionPropsWithCategory,\n} from './SelectListOptions/SelectListOption/SelectListOption';\n\ntype GroupedOptions = {\n [category: string]: SelectListOptionPropsWithCategory[];\n};\n\nexport const groupOptionsByCategory = (\n options: (SelectListOptionProps | SelectListOptionPropsWithCategory)[],\n): GroupedOptions | null => {\n const result = options.reduce<GroupedOptions>((acc, option) => {\n if ('category' in option && option.category) {\n const category = option.category;\n if (!acc[category]) {\n acc[category] = [];\n }\n acc[category].push(option);\n }\n return acc;\n }, {});\n\n // Return null if no categories were found\n return Object.keys(result).length === 0 ? null : result;\n};\n","import { useEffect } from 'react';\n\nexport const useSelectSearchFocus = (\n isOpen: boolean,\n searchFieldRef: React.RefObject<HTMLInputElement | null>,\n) => {\n useEffect(() => {\n if (isOpen) {\n setTimeout(() => {\n (searchFieldRef.current as unknown as HTMLInputElement)?.focus();\n }, 100);\n }\n }, [isOpen, searchFieldRef]);\n};\n","import { useTheme } from '@embeddable.com/react';\nimport { i18n, i18nSetup } from '../../../../theme/i18n/i18n';\nimport styles from './EditorCard.module.css';\nimport { FC } from 'react';\nimport { Theme } from '../../../../theme/theme.types';\nimport { Card, CardContent, CardContentInfo, CardHeader } from '../../../../../remarkable-ui';\nimport { IconAlertCircle } from '@tabler/icons-react';\n\ntype EditorCardProps = {\n title?: string;\n subtitle?: string;\n children: React.ReactNode;\n errorMessage?: string;\n};\n\nexport const EditorCard: FC<EditorCardProps> = ({\n title,\n subtitle,\n children,\n errorMessage,\n ...props\n}) => {\n const theme: Theme = useTheme() as Theme;\n i18nSetup(theme);\n\n const getDisplay = () => {\n if (errorMessage) {\n return (\n <CardContentInfo\n className={styles.error}\n icon={IconAlertCircle}\n title={i18n.t('editors.errorTitle')}\n message={errorMessage}\n />\n );\n }\n\n return children;\n };\n\n return (\n <Card className={styles.card} {...props}>\n <CardHeader title={title} subtitle={subtitle} />\n <CardContent>{getDisplay()}</CardContent>\n </Card>\n );\n};\n"],"names":["__iconNode","IconSearch","createReactComponent","SelectListOptions","children","disabled","props","jsx","clsx","styles","SelectListCategory","label","debounce","fn","delay","timer","args","groupOptionsByCategory","options","result","acc","option","category","useSelectSearchFocus","isOpen","searchFieldRef","useEffect","_a","EditorCard","title","subtitle","errorMessage","theme","useTheme","i18nSetup","getDisplay","CardContentInfo","IconAlertCircle","i18n","Card","CardHeader","CardContent"],"mappings":";;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa,CAAC,CAAC,QAAQ,EAAE,GAAK,8CAA8C,KAAO,QAAO,CAAE,GAAG,CAAC,QAAQ,EAAE,GAAK,gBAAgB,KAAO,QAAO,CAAE,CAAC,GAChJC,IAAaC,EAAqB,WAAW,UAAU,UAAUF,CAAU;;;GCDpEG,IAAgD,CAAC,EAAE,UAAAC,GAAU,UAAAC,GAAU,GAAGC,QAEnFC,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAWC,EAAKC,EAAO,aAAaJ,KAAYI,EAAO,QAAQ,GAAI,GAAGH,GACxE,UAAAF,EAAA,CACH;;;GCNSM,IAAkD,CAAC,EAAE,OAAAC,QAE9DJ,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAWE,EAAO,UACrB,UAAAF,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAWE,EAAO,eAAgB,UAAAE,EAAA,CAAM,GAChD;ACVG,SAASC,EACdC,GACAC,IAAQ,KAC0B;AAClC,MAAIC;AACJ,SAAO,IAAIC,MAAwB;AACjC,iBAAaD,CAAK,GAClBA,IAAQ,WAAW,MAAM;AACvB,MAAAF,EAAG,GAAGG,CAAI;AAAA,IACZ,GAAGF,CAAK;AAAA,EACV;AACF;ACHO,MAAMG,IAAyB,CACpCC,MAC0B;AAC1B,QAAMC,IAASD,EAAQ,OAAuB,CAACE,GAAKC,MAAW;AAC7D,QAAI,cAAcA,KAAUA,EAAO,UAAU;AAC3C,YAAMC,IAAWD,EAAO;AACxB,MAAKD,EAAIE,CAAQ,MACfF,EAAIE,CAAQ,IAAI,CAAA,IAElBF,EAAIE,CAAQ,EAAE,KAAKD,CAAM;AAAA,IAC3B;AACA,WAAOD;AAAA,EACT,GAAG,CAAA,CAAE;AAGL,SAAO,OAAO,KAAKD,CAAM,EAAE,WAAW,IAAI,OAAOA;AACnD,GCvBaI,IAAuB,CAClCC,GACAC,MACG;AACH,EAAAC,EAAU,MAAM;AACd,IAAIF,KACF,WAAW,MAAM;;AACd,OAAAG,IAAAF,EAAe,YAAf,QAAAE,EAAwD;AAAA,IAC3D,GAAG,GAAG;AAAA,EAEV,GAAG,CAACH,GAAQC,CAAc,CAAC;AAC7B;;;GCEaG,IAAkC,CAAC;AAAA,EAC9C,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAA1B;AAAA,EACA,cAAA2B;AAAA,EACA,GAAGzB;AACL,MAAM;AACJ,QAAM0B,IAAeC,EAAA;AACrB,EAAAC,EAAUF,CAAK;AAEf,QAAMG,IAAa,MACbJ,IAEAxB,gBAAAA,EAAAA;AAAAA,IAAC6B;AAAA,IAAA;AAAA,MACC,WAAW3B,EAAO;AAAA,MAClB,MAAM4B;AAAA,MACN,OAAOC,EAAK,EAAE,oBAAoB;AAAA,MAClC,SAASP;AAAA,IAAA;AAAA,EAAA,IAKR3B;AAGT,gCACGmC,GAAA,EAAK,WAAW9B,EAAO,MAAO,GAAGH,GAChC,UAAA;AAAA,IAAAC,gBAAAA,EAAAA,IAACiC,GAAA,EAAW,OAAAX,GAAc,UAAAC,EAAA,CAAoB;AAAA,IAC9CvB,gBAAAA,EAAAA,IAACkC,GAAA,EAAa,UAAAN,EAAA,EAAW,CAAE;AAAA,EAAA,GAC7B;AAEJ;","x_google_ignoreList":[0]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as f,
|
|
1
|
+
import { j as f, a3 as M } from "./component.constants-DCOqCFoY.js";
|
|
2
2
|
import { useMemo as F, useCallback as z } from "react";
|
|
3
3
|
import { g as $ } from "./tables.utils-D7KXdM2S.js";
|
|
4
4
|
const Q = "_heatMapContainer_o9smx_1", U = "_tableContainer_o9smx_6", q = "_fullWidth_o9smx_22", J = "_table_o9smx_6", Y = "_heatMapCell_o9smx_61", Z = "_header_o9smx_84", h = {
|
|
@@ -220,4 +220,4 @@ const Q = "_heatMapContainer_o9smx_1", U = "_tableContainer_o9smx_6", q = "_full
|
|
|
220
220
|
export {
|
|
221
221
|
gt as H
|
|
222
222
|
};
|
|
223
|
-
//# sourceMappingURL=HeatMap-
|
|
223
|
+
//# sourceMappingURL=HeatMap-By9_uzV_.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeatMap-ylrlKLQI.js","sources":["../src/remarkable-ui/charts/tables/HeatMap/HeatMap.utils.ts","../src/remarkable-ui/charts/tables/HeatMap/HeatMap.tsx"],"sourcesContent":["import { HeatMapPropsMeasure, HeatMapPropsThreshold } from './HeatMap.types';\n\n/* -------------------------------------------------------------------------- */\n/* Core math + tiny helpers */\n/* -------------------------------------------------------------------------- */\n\nconst clamp01 = (x: number) => (x < 0 ? 0 : x > 1 ? 1 : x);\nconst easeOutQuad = (x: number) => 1 - (1 - x) * (1 - x);\nconst lerp = (a: number, b: number, t: number) => a + (b - a) * t;\n\n/** Max darkening applied for values outside the domain (0..1). Lower = lighter tails. */\nconst OUTSIDE_DARKEN_MAX = 0.35;\n/** Darkest color to lerp toward when outside domain (kept as const for tree-shakeability). */\nconst LERP_DARKEST_COLOR = '#000000';\nconst LERP_LIGHTEST_COLOR = '#FFFFFF';\n\nexport const idOf = (v: unknown) => String(v ?? '');\n\n/* -------------------------------------------------------------------------- */\n/* Color parsing / conversion */\n/* - Resolves hex/rgb/hsl/named/var(...) to a hex string (#rrggbb) */\n/* - Memoized to avoid repeated DOM work */\n/* -------------------------------------------------------------------------- */\n\nconst CSS_RGB_REGEX = /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i;\nconst COLOR_CACHE = new Map<string, string>();\n\n/** Normalizes short or long hex to lowercase #rrggbb; returns input if not hex. */\nconst normalizeHex = (hex: string) => {\n if (!hex || hex[0] !== '#') return hex;\n const v = hex.slice(1).toLowerCase();\n if (v.length === 3) return `#${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\n if (v.length === 6) return `#${v}`;\n return hex.toLowerCase();\n};\n\n/**\n * Resolves any CSS color (hex, rgb/rgba, hsl/hsla, named, var(--token)) into #rrggbb.\n * SSR-safe: returns input unchanged if `document` is not available.\n */\nconst resolveCssColorToHex = (input: string): string => {\n if (!input) return input;\n const cached = COLOR_CACHE.get(input);\n if (cached) return cached;\n\n // Quick-path for hex.\n if (input.startsWith('#')) {\n const hex = normalizeHex(input);\n COLOR_CACHE.set(input, hex);\n return hex;\n }\n\n if (typeof document === 'undefined') {\n // SSR: cannot resolve computed styles → return as-is (caller should accept).\n return input;\n }\n\n // Use the browser to compute final color (resolves var(...), named, hsl, etc.)\n const el = document.createElement('span');\n el.style.color = input;\n document.body.appendChild(el);\n const computed = getComputedStyle(el).color || '';\n el.remove();\n\n // Expect \"rgb(...)\" or \"rgba(...)\" now.\n const m = computed.match(CSS_RGB_REGEX);\n if (!m) return input;\n\n const [, r = '0', g = '0', b = '0'] = m;\n const toHex = (n: string) => Number(n).toString(16).padStart(2, '0');\n const hex = `#${toHex(r)}${toHex(g)}${toHex(b)}`.toLowerCase();\n COLOR_CACHE.set(input, hex);\n return hex;\n};\n\nconst hexToRgb = (color: string) => {\n const hex = normalizeHex(resolveCssColorToHex(color)).slice(1);\n // Guard against bad inputs\n if (hex.length !== 6) return { r: 0, g: 0, b: 0 };\n const i = parseInt(hex, 16);\n return { r: (i >> 16) & 255, g: (i >> 8) & 255, b: i & 255 };\n};\n\nconst rgbToHex = (r: number, g: number, b: number) => {\n const to = (x: number) => Math.round(x).toString(16).padStart(2, '0');\n return `#${to(r)}${to(g)}${to(b)}`;\n};\n\n/** Linear interpolation between two colors (0..1). */\nexport const lerpColor = (a: string, b: string, t: number) => {\n const A = hexToRgb(a);\n const B = hexToRgb(b);\n return rgbToHex(lerp(A.r, B.r, t), lerp(A.g, B.g, t), lerp(A.b, B.b, t));\n};\n\n/** YIQ perceived brightness, used to pick white/black text. */\nconst getBrightness = (color: string) => {\n const { r, g, b } = hexToRgb(color);\n return (r * 299 + g * 587 + b * 114) / 1000;\n};\n\n/** Returns '#FFFFFF' for dark backgrounds, '#212129' for light ones. */\nexport const getCellColor = (backgroundColor: string) => {\n return getBrightness(backgroundColor) < 150 ? '#FFFFFF' : '#212129';\n};\n\n/* -------------------------------------------------------------------------- */\n/* Scales / thresholds */\n/* -------------------------------------------------------------------------- */\n\n/** Creates a diverging scale: t∈[0..1] → color blended across [min→mid→max]. */\nconst makeDiverging = (minC: string, midC: string, maxC: string, midpoint = 0.5) => {\n const m = clamp01(midpoint);\n return (t: number) => {\n const x = clamp01(t);\n return x <= m\n ? lerpColor(minC, midC, m === 0 ? 1 : x / m)\n : lerpColor(midC, maxC, (x - m) / (1 - m));\n };\n};\n\n/** Parses \"NN%\" → 0..1; otherwise null. */\nconst parsePercentString = (s: string): number | null => {\n const t = s.trim();\n if (!t.endsWith('%')) return null;\n const n = Number.parseFloat(t.slice(0, -1));\n return Number.isFinite(n) ? clamp01(n / 100) : null;\n};\n\n/**\n * Converts a flexible threshold into a RAW domain value.\n * - number → raw value\n * - \"NN%\" → percentage of [rawMin..rawMax]\n * - undefined/invalid → fallback\n */\nexport const thresholdToRaw = (\n t: HeatMapPropsThreshold,\n rawMin: number,\n rawMax: number,\n fallback: number,\n): number => {\n if (t == null) return fallback;\n if (typeof t === 'number' && Number.isFinite(t)) return t;\n const asPct = typeof t === 'string' ? parsePercentString(t) : null;\n if (asPct != null) return rawMin + asPct * (rawMax - rawMin);\n\n // Last-chance: numeric string without %\n const maybe = Number(t as unknown as string);\n return Number.isFinite(maybe) ? maybe : fallback;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Cell value helpers */\n/* -------------------------------------------------------------------------- */\n\nconst toFiniteOrSelf = (v: number | string | undefined): number | string | undefined => {\n if (v == null) return v;\n const n = Number(v);\n return Number.isFinite(n) ? n : v;\n};\n\n/**\n * Normalizes the raw cell value for display/compute:\n * - if nullish, uses `displayNullAs` (if numeric string, coerces to number)\n * - if numeric-like, returns as number\n * - otherwise returns original string\n */\nexport const getCellValue = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n displayNullAs: string | number | undefined,\n): string | number | undefined => {\n const fallback =\n displayNullAs && Number.isFinite(Number(displayNullAs)) ? Number(displayNullAs) : displayNullAs;\n return toFiniteOrSelf(value ?? fallback);\n};\n\n/** Returns the background color for a given cell value using a prepared mapper. */\nexport const getCellBackground = (\n value: number | string | undefined,\n colorForValue: (t: number) => string,\n): string => {\n if (typeof value !== 'number' || !Number.isFinite(value)) return 'white';\n return colorForValue(value);\n};\n\n/** Formats the cell’s display text (respects showValues & measure.format). */\nexport const getCellDisplayValue = (\n value: number | string | undefined,\n showValues: boolean,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measure: HeatMapPropsMeasure<any>,\n) => {\n if (!showValues) return null;\n if (typeof value === 'string' || value == null || Number.isNaN(value as number)) return value;\n return measure?.format ? measure.format(Number(value)) : value;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Color mapper factory */\n/* -------------------------------------------------------------------------- */\n\n/** Returns midpoint in [0..1] for the diverging scale given raw min/max. */\nconst getMidPoint = (domainMin: number, domainMax: number) => {\n const range = domainMax - domainMin;\n if (range === 0) return 0.5;\n return ((domainMin + domainMax) / 2 - domainMin) / range;\n};\n\n/**\n * Builds a fast `(value:number) => color` mapper.\n *\n * Behavior:\n * - Inside [domainMin..domainMax]: interpolate via diverging scale.\n * - Below domain: darken from `minColor` toward black, eased & capped.\n * - Above domain: darken from `maxColor` toward black, eased & capped.\n * - Degenerate domain: always returns mid color.\n */\nexport const createColorForValue = ({\n domainMin,\n domainMax,\n rawMin,\n rawMax,\n minColor,\n midColor,\n maxColor,\n}: {\n domainMin: number;\n domainMax: number;\n rawMin: number;\n rawMax: number;\n minColor: string;\n midColor: string;\n maxColor: string;\n}) => {\n const midPoint = getMidPoint(domainMin, domainMax);\n const scale = makeDiverging(minColor, midColor, maxColor, midPoint);\n\n const leftTailLen = Math.max(1e-6, domainMin - rawMin);\n const rightTailLen = Math.max(1e-6, rawMax - domainMax);\n const domRange = domainMax - domainMin;\n\n if (domRange === 0) {\n // Degenerate domain → fixed color\n const mid = scale(0.5);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return (_v: number) => mid;\n }\n\n return (v: number) => {\n if (!Number.isFinite(v)) return scale(0.5);\n\n const t = (v - domainMin) / domRange;\n\n if (t <= 0) {\n const dist = Math.max(0, domainMin - v) / leftTailLen;\n const strength = easeOutQuad(clamp01(dist)) * OUTSIDE_DARKEN_MAX;\n return strength > 0 ? lerpColor(minColor, LERP_LIGHTEST_COLOR, strength) : minColor;\n }\n\n if (t >= 1) {\n const dist = Math.max(0, v - domainMax) / rightTailLen;\n const strength = easeOutQuad(clamp01(dist)) * OUTSIDE_DARKEN_MAX;\n return strength > 0 ? lerpColor(maxColor, LERP_DARKEST_COLOR, strength) : maxColor;\n }\n\n return scale(t);\n };\n};\n","import { useMemo, useCallback } from 'react';\nimport styles from './HeatMap.module.css';\nimport clsx from 'clsx';\nimport { HeatMapProps } from './HeatMap.types';\nimport {\n createColorForValue,\n getCellBackground,\n getCellColor,\n getCellDisplayValue,\n getCellValue,\n idOf,\n thresholdToRaw,\n} from './HeatMap.utils';\nimport { getTableCellWidthStyle } from '../tables.utils';\n\nexport const HeatMap = <T extends Record<string, unknown>>({\n data,\n showValues = false,\n className,\n columnDimension,\n rowDimension,\n measure,\n minThreshold,\n maxThreshold,\n minColor,\n midColor,\n maxColor,\n columnWidth,\n firstColumnWidth,\n displayNullAs,\n}: HeatMapProps<T>) => {\n // 1. Get raw min/max from data\n const { rawMin, rawMax } = useMemo(() => {\n let min = Infinity;\n let max = -Infinity;\n for (const d of data) {\n const value = getCellValue(d[measure.key], displayNullAs);\n\n if (value != null && typeof value === 'number' && Number.isFinite(value)) {\n if (value < min) min = value;\n if (value > max) max = value;\n }\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return { rawMin: 0, rawMax: 0 };\n return { rawMin: min, rawMax: max };\n }, [data, measure.key, displayNullAs]);\n\n // 2. Resolve thresholds to a raw domain\n const { domainMin, domainMax } = useMemo(() => {\n const domMin = thresholdToRaw(minThreshold, rawMin, rawMax, rawMin);\n const domMax = thresholdToRaw(maxThreshold, rawMin, rawMax, rawMax);\n return domMin <= domMax\n ? { domainMin: domMin, domainMax: domMax }\n : { domainMin: domMax, domainMax: domMin };\n }, [minThreshold, maxThreshold, rawMin, rawMax]);\n\n const columnValues = useMemo(\n () =>\n Array.from(\n new Set(\n data\n .map((d) => d[columnDimension.key])\n .filter((v) => v != null)\n .map(idOf),\n ),\n ),\n [data, columnDimension.key],\n );\n\n const rowValues = useMemo(\n () =>\n Array.from(\n new Set(\n data\n .map((d) => d[rowDimension.key])\n .filter((v) => v != null)\n .map(idOf),\n ),\n ),\n [data, rowDimension.key],\n );\n\n // 3. Store data in a map for fast lookup\n const cellMap = useMemo(() => {\n const map = new Map<string, Map<string, Record<string, unknown>>>();\n for (const d of data) {\n const r = idOf(d[rowDimension.key]);\n const c = idOf(d[columnDimension.key]);\n if (!map.has(r)) map.set(r, new Map());\n map.get(r)!.set(c, d as Record<string, unknown>);\n }\n return map;\n }, [data, rowDimension.key, columnDimension.key]);\n\n // 4. Create color scale function\n const colorForValue = useCallback(\n (v: number) => {\n return createColorForValue({\n domainMin,\n domainMax,\n rawMin,\n rawMax,\n minColor,\n midColor,\n maxColor,\n })(v);\n },\n [domainMin, domainMax, rawMin, rawMax, minColor, midColor, maxColor],\n );\n\n return (\n <div className={clsx(styles.heatMapContainer, className)}>\n <div\n className={clsx(\n styles.tableContainer,\n (!columnWidth || !firstColumnWidth) && styles.fullWidth,\n )}\n >\n <table className={styles.table} aria-label=\"Heat map\">\n <thead>\n <tr>\n <th\n className={clsx(styles.heatMapCell, styles.header)}\n style={getTableCellWidthStyle(firstColumnWidth)}\n >\n {measure.label}\n </th>\n {columnValues.map((cv, index) => (\n <th\n key={`col-${cv}-${index}`}\n className={clsx(styles.heatMapCell, styles.header)}\n style={getTableCellWidthStyle(columnWidth)}\n >\n {columnDimension.format ? columnDimension.format(cv) : cv}\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody>\n {rowValues.map((rv) => (\n <tr key={`row-${rv}`}>\n <th\n className={clsx(styles.heatMapCell, styles.header)}\n scope=\"row\"\n style={getTableCellWidthStyle(firstColumnWidth)}\n >\n {rowDimension.format ? rowDimension.format(rv) : rv}\n </th>\n\n {columnValues.map((cv) => {\n const obj = cellMap.get(rv)?.get(cv);\n const value = getCellValue(obj?.[measure.key], displayNullAs);\n const background = getCellBackground(value, colorForValue);\n const color = getCellColor(background);\n\n return (\n <td\n key={`cell-${rv}-${cv}`}\n className={clsx(styles.heatMapCell)}\n style={{\n background,\n color,\n ...getTableCellWidthStyle(columnWidth),\n }}\n >\n {getCellDisplayValue(value, showValues, measure)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n"],"names":["clamp01","x","easeOutQuad","lerp","a","b","t","OUTSIDE_DARKEN_MAX","LERP_DARKEST_COLOR","LERP_LIGHTEST_COLOR","idOf","v","CSS_RGB_REGEX","COLOR_CACHE","normalizeHex","hex","resolveCssColorToHex","input","cached","el","computed","m","r","g","toHex","n","hexToRgb","color","i","rgbToHex","to","lerpColor","A","B","getBrightness","getCellColor","backgroundColor","makeDiverging","minC","midC","maxC","midpoint","parsePercentString","s","thresholdToRaw","rawMin","rawMax","fallback","asPct","maybe","toFiniteOrSelf","getCellValue","value","displayNullAs","getCellBackground","colorForValue","getCellDisplayValue","showValues","measure","getMidPoint","domainMin","domainMax","range","createColorForValue","minColor","midColor","maxColor","midPoint","scale","leftTailLen","rightTailLen","domRange","mid","_v","dist","strength","HeatMap","data","className","columnDimension","rowDimension","minThreshold","maxThreshold","columnWidth","firstColumnWidth","useMemo","min","max","domMin","domMax","columnValues","d","rowValues","cellMap","map","c","useCallback","clsx","styles","jsx","getTableCellWidthStyle","cv","index","rv","obj","_a","background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HeatMap-By9_uzV_.js","sources":["../src/remarkable-ui/charts/tables/HeatMap/HeatMap.utils.ts","../src/remarkable-ui/charts/tables/HeatMap/HeatMap.tsx"],"sourcesContent":["import { HeatMapPropsMeasure, HeatMapPropsThreshold } from './HeatMap.types';\n\n/* -------------------------------------------------------------------------- */\n/* Core math + tiny helpers */\n/* -------------------------------------------------------------------------- */\n\nconst clamp01 = (x: number) => (x < 0 ? 0 : x > 1 ? 1 : x);\nconst easeOutQuad = (x: number) => 1 - (1 - x) * (1 - x);\nconst lerp = (a: number, b: number, t: number) => a + (b - a) * t;\n\n/** Max darkening applied for values outside the domain (0..1). Lower = lighter tails. */\nconst OUTSIDE_DARKEN_MAX = 0.35;\n/** Darkest color to lerp toward when outside domain (kept as const for tree-shakeability). */\nconst LERP_DARKEST_COLOR = '#000000';\nconst LERP_LIGHTEST_COLOR = '#FFFFFF';\n\nexport const idOf = (v: unknown) => String(v ?? '');\n\n/* -------------------------------------------------------------------------- */\n/* Color parsing / conversion */\n/* - Resolves hex/rgb/hsl/named/var(...) to a hex string (#rrggbb) */\n/* - Memoized to avoid repeated DOM work */\n/* -------------------------------------------------------------------------- */\n\nconst CSS_RGB_REGEX = /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i;\nconst COLOR_CACHE = new Map<string, string>();\n\n/** Normalizes short or long hex to lowercase #rrggbb; returns input if not hex. */\nconst normalizeHex = (hex: string) => {\n if (!hex || hex[0] !== '#') return hex;\n const v = hex.slice(1).toLowerCase();\n if (v.length === 3) return `#${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`;\n if (v.length === 6) return `#${v}`;\n return hex.toLowerCase();\n};\n\n/**\n * Resolves any CSS color (hex, rgb/rgba, hsl/hsla, named, var(--token)) into #rrggbb.\n * SSR-safe: returns input unchanged if `document` is not available.\n */\nconst resolveCssColorToHex = (input: string): string => {\n if (!input) return input;\n const cached = COLOR_CACHE.get(input);\n if (cached) return cached;\n\n // Quick-path for hex.\n if (input.startsWith('#')) {\n const hex = normalizeHex(input);\n COLOR_CACHE.set(input, hex);\n return hex;\n }\n\n if (typeof document === 'undefined') {\n // SSR: cannot resolve computed styles → return as-is (caller should accept).\n return input;\n }\n\n // Use the browser to compute final color (resolves var(...), named, hsl, etc.)\n const el = document.createElement('span');\n el.style.color = input;\n document.body.appendChild(el);\n const computed = getComputedStyle(el).color || '';\n el.remove();\n\n // Expect \"rgb(...)\" or \"rgba(...)\" now.\n const m = computed.match(CSS_RGB_REGEX);\n if (!m) return input;\n\n const [, r = '0', g = '0', b = '0'] = m;\n const toHex = (n: string) => Number(n).toString(16).padStart(2, '0');\n const hex = `#${toHex(r)}${toHex(g)}${toHex(b)}`.toLowerCase();\n COLOR_CACHE.set(input, hex);\n return hex;\n};\n\nconst hexToRgb = (color: string) => {\n const hex = normalizeHex(resolveCssColorToHex(color)).slice(1);\n // Guard against bad inputs\n if (hex.length !== 6) return { r: 0, g: 0, b: 0 };\n const i = parseInt(hex, 16);\n return { r: (i >> 16) & 255, g: (i >> 8) & 255, b: i & 255 };\n};\n\nconst rgbToHex = (r: number, g: number, b: number) => {\n const to = (x: number) => Math.round(x).toString(16).padStart(2, '0');\n return `#${to(r)}${to(g)}${to(b)}`;\n};\n\n/** Linear interpolation between two colors (0..1). */\nexport const lerpColor = (a: string, b: string, t: number) => {\n const A = hexToRgb(a);\n const B = hexToRgb(b);\n return rgbToHex(lerp(A.r, B.r, t), lerp(A.g, B.g, t), lerp(A.b, B.b, t));\n};\n\n/** YIQ perceived brightness, used to pick white/black text. */\nconst getBrightness = (color: string) => {\n const { r, g, b } = hexToRgb(color);\n return (r * 299 + g * 587 + b * 114) / 1000;\n};\n\n/** Returns '#FFFFFF' for dark backgrounds, '#212129' for light ones. */\nexport const getCellColor = (backgroundColor: string) => {\n return getBrightness(backgroundColor) < 150 ? '#FFFFFF' : '#212129';\n};\n\n/* -------------------------------------------------------------------------- */\n/* Scales / thresholds */\n/* -------------------------------------------------------------------------- */\n\n/** Creates a diverging scale: t∈[0..1] → color blended across [min→mid→max]. */\nconst makeDiverging = (minC: string, midC: string, maxC: string, midpoint = 0.5) => {\n const m = clamp01(midpoint);\n return (t: number) => {\n const x = clamp01(t);\n return x <= m\n ? lerpColor(minC, midC, m === 0 ? 1 : x / m)\n : lerpColor(midC, maxC, (x - m) / (1 - m));\n };\n};\n\n/** Parses \"NN%\" → 0..1; otherwise null. */\nconst parsePercentString = (s: string): number | null => {\n const t = s.trim();\n if (!t.endsWith('%')) return null;\n const n = Number.parseFloat(t.slice(0, -1));\n return Number.isFinite(n) ? clamp01(n / 100) : null;\n};\n\n/**\n * Converts a flexible threshold into a RAW domain value.\n * - number → raw value\n * - \"NN%\" → percentage of [rawMin..rawMax]\n * - undefined/invalid → fallback\n */\nexport const thresholdToRaw = (\n t: HeatMapPropsThreshold,\n rawMin: number,\n rawMax: number,\n fallback: number,\n): number => {\n if (t == null) return fallback;\n if (typeof t === 'number' && Number.isFinite(t)) return t;\n const asPct = typeof t === 'string' ? parsePercentString(t) : null;\n if (asPct != null) return rawMin + asPct * (rawMax - rawMin);\n\n // Last-chance: numeric string without %\n const maybe = Number(t as unknown as string);\n return Number.isFinite(maybe) ? maybe : fallback;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Cell value helpers */\n/* -------------------------------------------------------------------------- */\n\nconst toFiniteOrSelf = (v: number | string | undefined): number | string | undefined => {\n if (v == null) return v;\n const n = Number(v);\n return Number.isFinite(n) ? n : v;\n};\n\n/**\n * Normalizes the raw cell value for display/compute:\n * - if nullish, uses `displayNullAs` (if numeric string, coerces to number)\n * - if numeric-like, returns as number\n * - otherwise returns original string\n */\nexport const getCellValue = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n displayNullAs: string | number | undefined,\n): string | number | undefined => {\n const fallback =\n displayNullAs && Number.isFinite(Number(displayNullAs)) ? Number(displayNullAs) : displayNullAs;\n return toFiniteOrSelf(value ?? fallback);\n};\n\n/** Returns the background color for a given cell value using a prepared mapper. */\nexport const getCellBackground = (\n value: number | string | undefined,\n colorForValue: (t: number) => string,\n): string => {\n if (typeof value !== 'number' || !Number.isFinite(value)) return 'white';\n return colorForValue(value);\n};\n\n/** Formats the cell’s display text (respects showValues & measure.format). */\nexport const getCellDisplayValue = (\n value: number | string | undefined,\n showValues: boolean,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measure: HeatMapPropsMeasure<any>,\n) => {\n if (!showValues) return null;\n if (typeof value === 'string' || value == null || Number.isNaN(value as number)) return value;\n return measure?.format ? measure.format(Number(value)) : value;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Color mapper factory */\n/* -------------------------------------------------------------------------- */\n\n/** Returns midpoint in [0..1] for the diverging scale given raw min/max. */\nconst getMidPoint = (domainMin: number, domainMax: number) => {\n const range = domainMax - domainMin;\n if (range === 0) return 0.5;\n return ((domainMin + domainMax) / 2 - domainMin) / range;\n};\n\n/**\n * Builds a fast `(value:number) => color` mapper.\n *\n * Behavior:\n * - Inside [domainMin..domainMax]: interpolate via diverging scale.\n * - Below domain: darken from `minColor` toward black, eased & capped.\n * - Above domain: darken from `maxColor` toward black, eased & capped.\n * - Degenerate domain: always returns mid color.\n */\nexport const createColorForValue = ({\n domainMin,\n domainMax,\n rawMin,\n rawMax,\n minColor,\n midColor,\n maxColor,\n}: {\n domainMin: number;\n domainMax: number;\n rawMin: number;\n rawMax: number;\n minColor: string;\n midColor: string;\n maxColor: string;\n}) => {\n const midPoint = getMidPoint(domainMin, domainMax);\n const scale = makeDiverging(minColor, midColor, maxColor, midPoint);\n\n const leftTailLen = Math.max(1e-6, domainMin - rawMin);\n const rightTailLen = Math.max(1e-6, rawMax - domainMax);\n const domRange = domainMax - domainMin;\n\n if (domRange === 0) {\n // Degenerate domain → fixed color\n const mid = scale(0.5);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return (_v: number) => mid;\n }\n\n return (v: number) => {\n if (!Number.isFinite(v)) return scale(0.5);\n\n const t = (v - domainMin) / domRange;\n\n if (t <= 0) {\n const dist = Math.max(0, domainMin - v) / leftTailLen;\n const strength = easeOutQuad(clamp01(dist)) * OUTSIDE_DARKEN_MAX;\n return strength > 0 ? lerpColor(minColor, LERP_LIGHTEST_COLOR, strength) : minColor;\n }\n\n if (t >= 1) {\n const dist = Math.max(0, v - domainMax) / rightTailLen;\n const strength = easeOutQuad(clamp01(dist)) * OUTSIDE_DARKEN_MAX;\n return strength > 0 ? lerpColor(maxColor, LERP_DARKEST_COLOR, strength) : maxColor;\n }\n\n return scale(t);\n };\n};\n","import { useMemo, useCallback } from 'react';\nimport styles from './HeatMap.module.css';\nimport clsx from 'clsx';\nimport { HeatMapProps } from './HeatMap.types';\nimport {\n createColorForValue,\n getCellBackground,\n getCellColor,\n getCellDisplayValue,\n getCellValue,\n idOf,\n thresholdToRaw,\n} from './HeatMap.utils';\nimport { getTableCellWidthStyle } from '../tables.utils';\n\nexport const HeatMap = <T extends Record<string, unknown>>({\n data,\n showValues = false,\n className,\n columnDimension,\n rowDimension,\n measure,\n minThreshold,\n maxThreshold,\n minColor,\n midColor,\n maxColor,\n columnWidth,\n firstColumnWidth,\n displayNullAs,\n}: HeatMapProps<T>) => {\n // 1. Get raw min/max from data\n const { rawMin, rawMax } = useMemo(() => {\n let min = Infinity;\n let max = -Infinity;\n for (const d of data) {\n const value = getCellValue(d[measure.key], displayNullAs);\n\n if (value != null && typeof value === 'number' && Number.isFinite(value)) {\n if (value < min) min = value;\n if (value > max) max = value;\n }\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return { rawMin: 0, rawMax: 0 };\n return { rawMin: min, rawMax: max };\n }, [data, measure.key, displayNullAs]);\n\n // 2. Resolve thresholds to a raw domain\n const { domainMin, domainMax } = useMemo(() => {\n const domMin = thresholdToRaw(minThreshold, rawMin, rawMax, rawMin);\n const domMax = thresholdToRaw(maxThreshold, rawMin, rawMax, rawMax);\n return domMin <= domMax\n ? { domainMin: domMin, domainMax: domMax }\n : { domainMin: domMax, domainMax: domMin };\n }, [minThreshold, maxThreshold, rawMin, rawMax]);\n\n const columnValues = useMemo(\n () =>\n Array.from(\n new Set(\n data\n .map((d) => d[columnDimension.key])\n .filter((v) => v != null)\n .map(idOf),\n ),\n ),\n [data, columnDimension.key],\n );\n\n const rowValues = useMemo(\n () =>\n Array.from(\n new Set(\n data\n .map((d) => d[rowDimension.key])\n .filter((v) => v != null)\n .map(idOf),\n ),\n ),\n [data, rowDimension.key],\n );\n\n // 3. Store data in a map for fast lookup\n const cellMap = useMemo(() => {\n const map = new Map<string, Map<string, Record<string, unknown>>>();\n for (const d of data) {\n const r = idOf(d[rowDimension.key]);\n const c = idOf(d[columnDimension.key]);\n if (!map.has(r)) map.set(r, new Map());\n map.get(r)!.set(c, d as Record<string, unknown>);\n }\n return map;\n }, [data, rowDimension.key, columnDimension.key]);\n\n // 4. Create color scale function\n const colorForValue = useCallback(\n (v: number) => {\n return createColorForValue({\n domainMin,\n domainMax,\n rawMin,\n rawMax,\n minColor,\n midColor,\n maxColor,\n })(v);\n },\n [domainMin, domainMax, rawMin, rawMax, minColor, midColor, maxColor],\n );\n\n return (\n <div className={clsx(styles.heatMapContainer, className)}>\n <div\n className={clsx(\n styles.tableContainer,\n (!columnWidth || !firstColumnWidth) && styles.fullWidth,\n )}\n >\n <table className={styles.table} aria-label=\"Heat map\">\n <thead>\n <tr>\n <th\n className={clsx(styles.heatMapCell, styles.header)}\n style={getTableCellWidthStyle(firstColumnWidth)}\n >\n {measure.label}\n </th>\n {columnValues.map((cv, index) => (\n <th\n key={`col-${cv}-${index}`}\n className={clsx(styles.heatMapCell, styles.header)}\n style={getTableCellWidthStyle(columnWidth)}\n >\n {columnDimension.format ? columnDimension.format(cv) : cv}\n </th>\n ))}\n </tr>\n </thead>\n\n <tbody>\n {rowValues.map((rv) => (\n <tr key={`row-${rv}`}>\n <th\n className={clsx(styles.heatMapCell, styles.header)}\n scope=\"row\"\n style={getTableCellWidthStyle(firstColumnWidth)}\n >\n {rowDimension.format ? rowDimension.format(rv) : rv}\n </th>\n\n {columnValues.map((cv) => {\n const obj = cellMap.get(rv)?.get(cv);\n const value = getCellValue(obj?.[measure.key], displayNullAs);\n const background = getCellBackground(value, colorForValue);\n const color = getCellColor(background);\n\n return (\n <td\n key={`cell-${rv}-${cv}`}\n className={clsx(styles.heatMapCell)}\n style={{\n background,\n color,\n ...getTableCellWidthStyle(columnWidth),\n }}\n >\n {getCellDisplayValue(value, showValues, measure)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n"],"names":["clamp01","x","easeOutQuad","lerp","a","b","t","OUTSIDE_DARKEN_MAX","LERP_DARKEST_COLOR","LERP_LIGHTEST_COLOR","idOf","v","CSS_RGB_REGEX","COLOR_CACHE","normalizeHex","hex","resolveCssColorToHex","input","cached","el","computed","m","r","g","toHex","n","hexToRgb","color","i","rgbToHex","to","lerpColor","A","B","getBrightness","getCellColor","backgroundColor","makeDiverging","minC","midC","maxC","midpoint","parsePercentString","s","thresholdToRaw","rawMin","rawMax","fallback","asPct","maybe","toFiniteOrSelf","getCellValue","value","displayNullAs","getCellBackground","colorForValue","getCellDisplayValue","showValues","measure","getMidPoint","domainMin","domainMax","range","createColorForValue","minColor","midColor","maxColor","midPoint","scale","leftTailLen","rightTailLen","domRange","mid","_v","dist","strength","HeatMap","data","className","columnDimension","rowDimension","minThreshold","maxThreshold","columnWidth","firstColumnWidth","useMemo","min","max","domMin","domMax","columnValues","d","rowValues","cellMap","map","c","useCallback","clsx","styles","jsx","getTableCellWidthStyle","cv","index","rv","obj","_a","background"],"mappings":"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"}
|
package/dist/HeatMapPro.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { i as
|
|
1
|
+
import { i as v, r as F, j as u, d as S, w as A, b as d, t as j, c as N, R as i, S as l, I as P, J as c, A as q, o as E } from "./component.constants-DCOqCFoY.js";
|
|
2
2
|
import { useTheme as k, defineComponent as B } from "@embeddable.com/react";
|
|
3
|
-
import { C as G } from "./ChartCard-
|
|
3
|
+
import { C as G } from "./ChartCard-D-0O5ugW.js";
|
|
4
4
|
import "react";
|
|
5
|
-
import { H as
|
|
6
|
-
import { g as C } from "./formatter.utils-
|
|
5
|
+
import { H as I } from "./HeatMap-By9_uzV_.js";
|
|
6
|
+
import { g as C } from "./formatter.utils-B80iNq9Q.js";
|
|
7
7
|
import { u as h } from "./charts.fillGaps.hooks-5WclK2CD.js";
|
|
8
|
-
const
|
|
8
|
+
const O = (e, a) => {
|
|
9
9
|
const n = C(a);
|
|
10
10
|
return {
|
|
11
11
|
key: e.measure.name,
|
|
@@ -19,10 +19,10 @@ const I = (e, a) => {
|
|
|
19
19
|
label: n.dimensionOrMeasureTitle(e.dimension),
|
|
20
20
|
format: (o) => n.data(e.dimension, o)
|
|
21
21
|
};
|
|
22
|
-
},
|
|
22
|
+
}, J = (e) => {
|
|
23
23
|
const a = k();
|
|
24
|
-
|
|
25
|
-
const { description: n, title: o } =
|
|
24
|
+
v(a);
|
|
25
|
+
const { description: n, title: o } = F(e), {
|
|
26
26
|
measure: m,
|
|
27
27
|
rowDimension: r,
|
|
28
28
|
columnDimension: s,
|
|
@@ -41,7 +41,7 @@ const I = (e, a) => {
|
|
|
41
41
|
}), t = h({
|
|
42
42
|
results: y,
|
|
43
43
|
dimension: r
|
|
44
|
-
}),
|
|
44
|
+
}), R = O({ measure: m }, a), V = p({ dimension: r }, a), W = p({ dimension: s }, a);
|
|
45
45
|
return /* @__PURE__ */ u.jsx(
|
|
46
46
|
G,
|
|
47
47
|
{
|
|
@@ -51,12 +51,12 @@ const I = (e, a) => {
|
|
|
51
51
|
dimensionsAndMeasures: [r, s, m],
|
|
52
52
|
errorMessage: t == null ? void 0 : t.error,
|
|
53
53
|
children: /* @__PURE__ */ u.jsx(
|
|
54
|
-
|
|
54
|
+
I,
|
|
55
55
|
{
|
|
56
56
|
data: t.data ?? [],
|
|
57
|
-
measure:
|
|
58
|
-
rowDimension:
|
|
59
|
-
columnDimension:
|
|
57
|
+
measure: R,
|
|
58
|
+
rowDimension: V,
|
|
59
|
+
columnDimension: W,
|
|
60
60
|
maxColor: b,
|
|
61
61
|
midColor: g,
|
|
62
62
|
minColor: f,
|
|
@@ -70,13 +70,13 @@ const I = (e, a) => {
|
|
|
70
70
|
)
|
|
71
71
|
}
|
|
72
72
|
);
|
|
73
|
-
},
|
|
73
|
+
}, _ = {
|
|
74
74
|
name: "HeatMapPro",
|
|
75
75
|
label: "Heat Map",
|
|
76
76
|
category: "Table Charts",
|
|
77
77
|
inputs: [
|
|
78
|
-
A,
|
|
79
78
|
S,
|
|
79
|
+
A,
|
|
80
80
|
{
|
|
81
81
|
...d,
|
|
82
82
|
label: "Row Dimension",
|
|
@@ -120,7 +120,7 @@ const I = (e, a) => {
|
|
|
120
120
|
},
|
|
121
121
|
q
|
|
122
122
|
]
|
|
123
|
-
},
|
|
123
|
+
}, Z = B(J, _, {
|
|
124
124
|
props: (e) => ({
|
|
125
125
|
...e,
|
|
126
126
|
results: E({
|
|
@@ -132,7 +132,7 @@ const I = (e, a) => {
|
|
|
132
132
|
})
|
|
133
133
|
});
|
|
134
134
|
export {
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
Z as default,
|
|
136
|
+
_ as meta
|
|
137
137
|
};
|
|
138
138
|
//# sourceMappingURL=HeatMapPro.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a0 as j, j as n, a3 as x, a4 as d } from "./component.constants-DCOqCFoY.js";
|
|
2
2
|
/**
|
|
3
3
|
* @license @tabler/icons-react v3.35.0 - MIT
|
|
4
4
|
*
|
|
@@ -28,14 +28,14 @@ const m = [["path", { d: "M3 17l6 -6l4 4l8 -8", key: "svg-0" }], ["path", { d: "
|
|
|
28
28
|
invertChangeColors: C = !1,
|
|
29
29
|
comparisonLabel: c,
|
|
30
30
|
valueFormatter: p,
|
|
31
|
-
percentageDecimalPlaces:
|
|
32
|
-
className:
|
|
31
|
+
percentageDecimalPlaces: g = 1,
|
|
32
|
+
className: h
|
|
33
33
|
}) => {
|
|
34
34
|
const s = e - i, t = s > 0;
|
|
35
35
|
let a;
|
|
36
|
-
r ? a = `${(i === 0 ? 0 : s / i * 100).toFixed(
|
|
36
|
+
r ? a = `${(i === 0 ? 0 : s / i * 100).toFixed(g)}%` : a = p ? p(s) : s.toString();
|
|
37
37
|
const l = `${t ? "+" : ""}${a}`, _ = t ? f : y;
|
|
38
|
-
return /* @__PURE__ */ n.jsxs("div", { className: x(
|
|
38
|
+
return /* @__PURE__ */ n.jsxs("div", { className: x(h, o.kpiChartChangeContainer), children: [
|
|
39
39
|
/* @__PURE__ */ n.jsxs("div", { className: x(o.kpiChangeBadge, I(t, C)), children: [
|
|
40
40
|
/* @__PURE__ */ n.jsx(_, {}),
|
|
41
41
|
/* @__PURE__ */ n.jsx(d, { children: l })
|
|
@@ -49,15 +49,15 @@ const m = [["path", { d: "M3 17l6 -6l4 4l8 -8", key: "svg-0" }], ["path", { d: "
|
|
|
49
49
|
comparisonLabel: C,
|
|
50
50
|
invertChangeColors: c,
|
|
51
51
|
showChangeAsPercentage: p,
|
|
52
|
-
percentageDecimalPlaces:
|
|
53
|
-
equalComparisonLabel:
|
|
52
|
+
percentageDecimalPlaces: g = 1,
|
|
53
|
+
equalComparisonLabel: h = "No change",
|
|
54
54
|
valueFontSize: s,
|
|
55
55
|
valueFormatter: t
|
|
56
56
|
}) => {
|
|
57
57
|
const a = r !== void 0, l = a && r === e, _ = e === void 0 ? "" : t ? t(e) : e;
|
|
58
58
|
return /* @__PURE__ */ n.jsxs("div", { className: k.kpiChartContainer, children: [
|
|
59
59
|
/* @__PURE__ */ n.jsx(d, { style: { fontSize: s }, children: _ }),
|
|
60
|
-
/* @__PURE__ */ n.jsx("div", { className: k.kpiComparisonContainer, style: { fontSize: i }, children: l ? /* @__PURE__ */ n.jsx(d, { children:
|
|
60
|
+
/* @__PURE__ */ n.jsx("div", { className: k.kpiComparisonContainer, style: { fontSize: i }, children: l ? /* @__PURE__ */ n.jsx(d, { children: h }) : /* @__PURE__ */ n.jsx(
|
|
61
61
|
K,
|
|
62
62
|
{
|
|
63
63
|
changeFontSize: i,
|
|
@@ -65,7 +65,7 @@ const m = [["path", { d: "M3 17l6 -6l4 4l8 -8", key: "svg-0" }], ["path", { d: "
|
|
|
65
65
|
comparisonLabel: C,
|
|
66
66
|
comparisonValue: r,
|
|
67
67
|
invertChangeColors: c,
|
|
68
|
-
percentageDecimalPlaces:
|
|
68
|
+
percentageDecimalPlaces: g,
|
|
69
69
|
showChangeAsPercentage: p,
|
|
70
70
|
value: e,
|
|
71
71
|
valueFormatter: t
|
|
@@ -76,4 +76,4 @@ const m = [["path", { d: "M3 17l6 -6l4 4l8 -8", key: "svg-0" }], ["path", { d: "
|
|
|
76
76
|
export {
|
|
77
77
|
S as K
|
|
78
78
|
};
|
|
79
|
-
//# sourceMappingURL=KpiChart-
|
|
79
|
+
//# sourceMappingURL=KpiChart-CS9s8nJ4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KpiChart-
|
|
1
|
+
{"version":3,"file":"KpiChart-CS9s8nJ4.js","sources":["../node_modules/@tabler/icons-react/dist/esm/icons/IconTrendingDown.mjs","../node_modules/@tabler/icons-react/dist/esm/icons/IconTrendingUp.mjs","../src/remarkable-ui/charts/kpis/components/KpiChartChange.tsx","../src/remarkable-ui/charts/kpis/KpiChart.tsx"],"sourcesContent":["/**\n * @license @tabler/icons-react v3.35.0 - MIT\n *\n * This source code is licensed under the MIT license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createReactComponent from '../createReactComponent.mjs';\n\nconst __iconNode = [[\"path\", { \"d\": \"M3 7l6 6l4 -4l8 8\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M21 10l0 7l-7 0\", \"key\": \"svg-1\" }]];\nconst IconTrendingDown = createReactComponent(\"outline\", \"trending-down\", \"TrendingDown\", __iconNode);\n\nexport { __iconNode, IconTrendingDown as default };\n//# sourceMappingURL=IconTrendingDown.mjs.map\n","/**\n * @license @tabler/icons-react v3.35.0 - MIT\n *\n * This source code is licensed under the MIT license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createReactComponent from '../createReactComponent.mjs';\n\nconst __iconNode = [[\"path\", { \"d\": \"M3 17l6 -6l4 4l8 -8\", \"key\": \"svg-0\" }], [\"path\", { \"d\": \"M14 7l7 0l0 7\", \"key\": \"svg-1\" }]];\nconst IconTrendingUp = createReactComponent(\"outline\", \"trending-up\", \"TrendingUp\", __iconNode);\n\nexport { __iconNode, IconTrendingUp as default };\n//# sourceMappingURL=IconTrendingUp.mjs.map\n","import { FC } from 'react';\nimport styles from './KpiChartChange.module.css';\nimport clsx from 'clsx';\nimport { Typography } from '../../../shared/Typography/Typography';\nimport { IconTrendingDown, IconTrendingUp } from '@tabler/icons-react';\nimport { KpiChartProps } from '../KpiChart.types';\n\nconst getChangeClass = (isPositive: boolean, invertChangeColors: boolean) => {\n if (isPositive) return invertChangeColors ? styles.negative : styles.positive;\n return invertChangeColors ? styles.positive : styles.negative;\n};\n\ntype KpiChartChangeProps = KpiChartProps & { className?: string };\n\nexport const KpiChartChange: FC<KpiChartChangeProps> = ({\n value,\n comparisonValue = 0,\n showChangeAsPercentage,\n invertChangeColors = false,\n comparisonLabel,\n valueFormatter,\n percentageDecimalPlaces = 1,\n className,\n}) => {\n const difference = value - comparisonValue;\n const isPositive = difference > 0;\n\n let differenceLabel: string;\n\n if (showChangeAsPercentage) {\n const percentage = comparisonValue === 0 ? 0 : (difference / comparisonValue) * 100;\n differenceLabel = `${percentage.toFixed(percentageDecimalPlaces)}%`;\n } else {\n differenceLabel = valueFormatter ? valueFormatter(difference) : difference.toString();\n }\n\n const displayValue = `${isPositive ? '+' : ''}${differenceLabel}`;\n\n const Icon = isPositive ? IconTrendingUp : IconTrendingDown;\n\n return (\n <div className={clsx(className, styles.kpiChartChangeContainer)}>\n <div className={clsx(styles.kpiChangeBadge, getChangeClass(isPositive, invertChangeColors))}>\n <Icon />\n <Typography>{displayValue}</Typography>\n </div>\n {comparisonLabel && <Typography>{comparisonLabel}</Typography>}\n </div>\n );\n};\n","import { FC } from 'react';\nimport { Typography } from '../../shared/Typography/Typography';\nimport styles from './KpiChart.module.css';\nimport { KpiChartChange } from './components/KpiChartChange';\nimport { KpiChartProps } from './KpiChart.types';\nimport clsx from 'clsx';\n\nexport const KpiChart: FC<KpiChartProps> = ({\n value,\n changeFontSize,\n comparisonValue,\n comparisonLabel,\n invertChangeColors,\n showChangeAsPercentage,\n percentageDecimalPlaces = 1,\n equalComparisonLabel = 'No change',\n valueFontSize,\n valueFormatter,\n}) => {\n const hasComparisonValue = comparisonValue !== undefined;\n const equalComparison = hasComparisonValue && comparisonValue === value;\n\n const displayValue = value === undefined ? '' : valueFormatter ? valueFormatter(value) : value;\n\n return (\n <div className={styles.kpiChartContainer}>\n <Typography style={{ fontSize: valueFontSize }}>{displayValue}</Typography>\n <div className={styles.kpiComparisonContainer} style={{ fontSize: changeFontSize }}>\n {equalComparison ? (\n <Typography>{equalComparisonLabel}</Typography>\n ) : (\n <KpiChartChange\n changeFontSize={changeFontSize}\n className={clsx(!hasComparisonValue && styles.kpiChangeHidden)}\n comparisonLabel={comparisonLabel}\n comparisonValue={comparisonValue}\n invertChangeColors={invertChangeColors}\n percentageDecimalPlaces={percentageDecimalPlaces}\n showChangeAsPercentage={showChangeAsPercentage}\n value={value}\n valueFormatter={valueFormatter}\n />\n )}\n </div>\n </div>\n );\n};\n"],"names":["__iconNode","IconTrendingDown","createReactComponent","IconTrendingUp","getChangeClass","isPositive","invertChangeColors","styles","KpiChartChange","value","comparisonValue","showChangeAsPercentage","comparisonLabel","valueFormatter","percentageDecimalPlaces","className","difference","differenceLabel","displayValue","Icon","clsx","jsxs","jsx","Typography","KpiChart","changeFontSize","equalComparisonLabel","valueFontSize","hasComparisonValue","equalComparison"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
import { useTheme as j, defineComponent as w } from "@embeddable.com/react";
|
|
2
|
-
import { i as A, r as
|
|
3
|
-
import { C as
|
|
4
|
-
import { useEffect as
|
|
5
|
-
import { K as
|
|
6
|
-
import { g as
|
|
7
|
-
import { g as
|
|
8
|
-
import { C as
|
|
9
|
-
const
|
|
2
|
+
import { i as A, r as q, F as l, j as y, d as B, w as E, G as I, H as J, t as M, c as Y, I as b, J as c, o as v } from "./component.constants-DCOqCFoY.js";
|
|
3
|
+
import { C as G } from "./ChartCard-D-0O5ugW.js";
|
|
4
|
+
import { useEffect as H } from "react";
|
|
5
|
+
import { K as O } from "./KpiChart-CS9s8nJ4.js";
|
|
6
|
+
import { g as $ } from "./formatter.utils-B80iNq9Q.js";
|
|
7
|
+
import { g as k, a as Q } from "./timeRange.utils-u1NZ0u7o.js";
|
|
8
|
+
import { C as U } from "./ComparisonPeriod.type.emb-CYp3nw-9.js";
|
|
9
|
+
const W = (e) => {
|
|
10
10
|
var d, C, P, h, u, f;
|
|
11
11
|
const a = j();
|
|
12
12
|
A(a);
|
|
13
|
-
const { title: i, description: n } =
|
|
13
|
+
const { title: i, description: n } = q(e), {
|
|
14
14
|
changeFontSize: D,
|
|
15
15
|
comparisonPeriod: s,
|
|
16
16
|
comparisonDateRange: R,
|
|
17
|
-
displayChangeAsPercentage:
|
|
18
|
-
fontSize:
|
|
17
|
+
displayChangeAsPercentage: F,
|
|
18
|
+
fontSize: N,
|
|
19
19
|
measure: t,
|
|
20
20
|
primaryDateRange: p,
|
|
21
21
|
results: r,
|
|
22
22
|
resultsComparison: o,
|
|
23
|
-
reversePositiveNegativeColors:
|
|
23
|
+
reversePositiveNegativeColors: S,
|
|
24
24
|
percentageDecimalPlaces: z,
|
|
25
25
|
setComparisonDateRange: K
|
|
26
26
|
} = e;
|
|
27
|
-
|
|
28
|
-
const m =
|
|
27
|
+
H(() => {
|
|
28
|
+
const m = k(
|
|
29
29
|
p,
|
|
30
30
|
s,
|
|
31
31
|
a
|
|
32
32
|
);
|
|
33
33
|
K(m);
|
|
34
34
|
}, [s, JSON.stringify(p), a]);
|
|
35
|
-
const L = (C = (d = r.data) == null ? void 0 : d[0]) == null ? void 0 : C[t.name], T = R ? (h = (P = o == null ? void 0 : o.data) == null ? void 0 : P[0]) == null ? void 0 : h[t.name] : void 0, V =
|
|
35
|
+
const L = (C = (d = r.data) == null ? void 0 : d[0]) == null ? void 0 : C[t.name], T = R ? (h = (P = o == null ? void 0 : o.data) == null ? void 0 : P[0]) == null ? void 0 : h[t.name] : void 0, V = $(a), x = (m) => V.data(t, m), _ = `vs ${Q(s, a).toLowerCase()}`, g = {
|
|
36
36
|
isLoading: !!(r.isLoading || o != null && o.isLoading),
|
|
37
37
|
data: !(r != null && r.data) && !(o != null && o.data) ? void 0 : [
|
|
38
38
|
...(u = r.data) != null && u.length ? [{ label: l.t("charts.primaryPeriod"), ...r.data[0] }] : [],
|
|
@@ -40,7 +40,7 @@ const G = (e) => {
|
|
|
40
40
|
]
|
|
41
41
|
};
|
|
42
42
|
return /* @__PURE__ */ y.jsx(
|
|
43
|
-
|
|
43
|
+
G,
|
|
44
44
|
{
|
|
45
45
|
data: g,
|
|
46
46
|
dimensionsAndMeasures: [
|
|
@@ -57,31 +57,31 @@ const G = (e) => {
|
|
|
57
57
|
subtitle: n,
|
|
58
58
|
title: i,
|
|
59
59
|
children: /* @__PURE__ */ y.jsx(
|
|
60
|
-
|
|
60
|
+
O,
|
|
61
61
|
{
|
|
62
62
|
value: L,
|
|
63
63
|
comparisonValue: g.isLoading ? void 0 : T,
|
|
64
64
|
valueFormatter: x,
|
|
65
|
-
valueFontSize:
|
|
65
|
+
valueFontSize: N,
|
|
66
66
|
changeFontSize: D,
|
|
67
|
-
invertChangeColors:
|
|
68
|
-
showChangeAsPercentage:
|
|
67
|
+
invertChangeColors: S,
|
|
68
|
+
showChangeAsPercentage: F,
|
|
69
69
|
comparisonLabel: _,
|
|
70
70
|
percentageDecimalPlaces: z
|
|
71
71
|
}
|
|
72
72
|
)
|
|
73
73
|
}
|
|
74
74
|
);
|
|
75
|
-
},
|
|
75
|
+
}, X = {
|
|
76
76
|
name: "KpiChartNumberComparisonPro",
|
|
77
77
|
label: "Kpi Chart - Number Comparison",
|
|
78
78
|
category: "Kpi Charts",
|
|
79
79
|
inputs: [
|
|
80
|
-
q,
|
|
81
80
|
B,
|
|
82
|
-
|
|
81
|
+
E,
|
|
82
|
+
{ ...I, name: "timeProperty", label: "Time Property" },
|
|
83
83
|
{
|
|
84
|
-
...
|
|
84
|
+
...J,
|
|
85
85
|
name: "primaryDateRange",
|
|
86
86
|
label: "Primary Date Range",
|
|
87
87
|
description: "You can also connect this to a date range selector using its variable",
|
|
@@ -89,13 +89,13 @@ const G = (e) => {
|
|
|
89
89
|
},
|
|
90
90
|
{
|
|
91
91
|
name: "comparisonPeriod",
|
|
92
|
-
type:
|
|
92
|
+
type: U,
|
|
93
93
|
label: "Comparison Period",
|
|
94
94
|
description: "You can also connect this to a comparison period selector using its variable",
|
|
95
95
|
category: "Component Data"
|
|
96
96
|
},
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
M,
|
|
98
|
+
Y,
|
|
99
99
|
{
|
|
100
100
|
...b,
|
|
101
101
|
name: "displayChangeAsPercentage",
|
|
@@ -123,7 +123,7 @@ const G = (e) => {
|
|
|
123
123
|
required: !0
|
|
124
124
|
}
|
|
125
125
|
]
|
|
126
|
-
}, se = w(
|
|
126
|
+
}, se = w(W, X, {
|
|
127
127
|
/* @ts-expect-error - to be fixed in @embeddable.com/react */
|
|
128
128
|
props: (e, [a, i]) => ({
|
|
129
129
|
...e,
|
|
@@ -157,6 +157,6 @@ const G = (e) => {
|
|
|
157
157
|
});
|
|
158
158
|
export {
|
|
159
159
|
se as default,
|
|
160
|
-
|
|
160
|
+
X as meta
|
|
161
161
|
};
|
|
162
162
|
//# sourceMappingURL=KpiChartNumberComparisonPro.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useTheme as h, defineComponent as f } from "@embeddable.com/react";
|
|
2
|
-
import { i as C, r as b, j as m, d as K, w as g, t as x, c as F,
|
|
3
|
-
import { C as j } from "./ChartCard-
|
|
2
|
+
import { i as C, r as b, j as m, d as K, w as g, t as x, c as F, J as N, o as S } from "./component.constants-DCOqCFoY.js";
|
|
3
|
+
import { C as j } from "./ChartCard-D-0O5ugW.js";
|
|
4
4
|
import "react";
|
|
5
|
-
import { K as v } from "./KpiChart-
|
|
6
|
-
import { g as z } from "./formatter.utils-
|
|
5
|
+
import { K as v } from "./KpiChart-CS9s8nJ4.js";
|
|
6
|
+
import { g as z } from "./formatter.utils-B80iNq9Q.js";
|
|
7
7
|
const P = (e) => {
|
|
8
8
|
var s, o;
|
|
9
9
|
const a = h();
|