@carto/ps-react-ui 6.4.0 → 6.5.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.
Files changed (93) hide show
  1. package/dist/{actions-DyWNwvLu.js → actions-D_PVFZaM.js} +4 -4
  2. package/dist/{actions-DyWNwvLu.js.map → actions-D_PVFZaM.js.map} +1 -1
  3. package/dist/{category-BHBd5Pcc.js → category-UIGvFN3D.js} +4 -4
  4. package/dist/{category-BHBd5Pcc.js.map → category-UIGvFN3D.js.map} +1 -1
  5. package/dist/chat.js +472 -470
  6. package/dist/chat.js.map +1 -1
  7. package/dist/{components-CTUpdQuj.js → components-DDJU4m0t.js} +8 -8
  8. package/dist/components-DDJU4m0t.js.map +1 -0
  9. package/dist/components.js +2 -2
  10. package/dist/{download-B4sykOFm.js → download-DIj1Iz0t.js} +2 -2
  11. package/dist/{download-B4sykOFm.js.map → download-DIj1Iz0t.js.map} +1 -1
  12. package/dist/{formula-DJS-JLpk.js → formula-CSHhAoyW.js} +4 -4
  13. package/dist/{formula-DJS-JLpk.js.map → formula-CSHhAoyW.js.map} +1 -1
  14. package/dist/{item-color-B7xkIpDZ.js → item-color-7o7pFBR2.js} +26 -18
  15. package/dist/item-color-7o7pFBR2.js.map +1 -0
  16. package/dist/markdown-B8lLR-NY.js +106 -0
  17. package/dist/markdown-B8lLR-NY.js.map +1 -0
  18. package/dist/{spread-CQwFIwuz.js → spread-BRfPPIep.js} +3 -3
  19. package/dist/{spread-CQwFIwuz.js.map → spread-BRfPPIep.js.map} +1 -1
  20. package/dist/style-DTLuIo84.js +87 -0
  21. package/dist/style-DTLuIo84.js.map +1 -0
  22. package/dist/{styles-BCEBm7xh.js → styles-yKcpfyNV.js} +5 -5
  23. package/dist/styles-yKcpfyNV.js.map +1 -0
  24. package/dist/{table-DEdW_fDj.js → table-Col_FRvb.js} +2 -2
  25. package/dist/{table-DEdW_fDj.js.map → table-Col_FRvb.js.map} +1 -1
  26. package/dist/theme/tailwind.css +373 -0
  27. package/dist/theme.js +123 -0
  28. package/dist/theme.js.map +1 -0
  29. package/dist/types/components/lasso-tool/styles.d.ts +4 -4
  30. package/dist/types/theme/create-carto-theme.d.ts +7 -0
  31. package/dist/types/theme/deep-merge.d.ts +6 -0
  32. package/dist/types/theme/generate-tailwind-css.d.ts +8 -0
  33. package/dist/types/theme/index.d.ts +2 -0
  34. package/dist/types/widgets/markdown/style.d.ts +74 -0
  35. package/dist/types/widgets/utils/spacing-px.d.ts +13 -0
  36. package/dist/types/widgets/wrapper/collapsed-context.d.ts +7 -0
  37. package/dist/{utils-C-eWwOhE.js → utils-Dw4y8tiq.js} +2 -2
  38. package/dist/{utils-C-eWwOhE.js.map → utils-Dw4y8tiq.js.map} +1 -1
  39. package/dist/widgets/actions.js +3 -3
  40. package/dist/widgets/bar.js +54 -54
  41. package/dist/widgets/bar.js.map +1 -1
  42. package/dist/widgets/category.js +1 -1
  43. package/dist/widgets/formula.js +1 -1
  44. package/dist/widgets/histogram.js +70 -70
  45. package/dist/widgets/histogram.js.map +1 -1
  46. package/dist/widgets/markdown.js +1 -1
  47. package/dist/widgets/pie.js +78 -78
  48. package/dist/widgets/pie.js.map +1 -1
  49. package/dist/widgets/scatterplot.js +82 -82
  50. package/dist/widgets/scatterplot.js.map +1 -1
  51. package/dist/widgets/spread.js +1 -1
  52. package/dist/widgets/table.js +1 -1
  53. package/dist/widgets/timeseries.js +62 -62
  54. package/dist/widgets/timeseries.js.map +1 -1
  55. package/dist/widgets/utils.js +1 -1
  56. package/dist/widgets.js +309 -299
  57. package/dist/widgets.js.map +1 -1
  58. package/dist/{zoom-toggle-MmLjMTEw.js → zoom-toggle-DqrV_0Ji.js} +2 -2
  59. package/dist/{zoom-toggle-MmLjMTEw.js.map → zoom-toggle-DqrV_0Ji.js.map} +1 -1
  60. package/package.json +10 -3
  61. package/src/chat/bubbles/styles.ts +2 -0
  62. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +4 -4
  63. package/src/components/lasso-tool/lasso-tool-inline.tsx +6 -6
  64. package/src/components/lasso-tool/styles.ts +4 -4
  65. package/src/theme/create-carto-theme.test.ts +53 -0
  66. package/src/theme/create-carto-theme.ts +21 -0
  67. package/src/theme/deep-merge.test.ts +25 -0
  68. package/src/theme/deep-merge.ts +22 -0
  69. package/src/theme/generate-tailwind-css.test.ts +87 -0
  70. package/src/theme/generate-tailwind-css.ts +178 -0
  71. package/src/theme/index.ts +2 -0
  72. package/src/theme/tailwind-compile.test.ts +71 -0
  73. package/src/theme/tailwind.css +373 -0
  74. package/src/widgets/bar/options.ts +7 -6
  75. package/src/widgets/histogram/options.ts +7 -6
  76. package/src/widgets/markdown/style.ts +40 -0
  77. package/src/widgets/note/widget-note.tsx +4 -1
  78. package/src/widgets/pie/options.ts +5 -4
  79. package/src/widgets/scatterplot/options.ts +7 -6
  80. package/src/widgets/timeseries/options.ts +7 -6
  81. package/src/widgets/toolbox/toolbox.test.tsx +28 -0
  82. package/src/widgets/toolbox/toolbox.tsx +9 -0
  83. package/src/widgets/utils/css-variables-theme.test.ts +32 -0
  84. package/src/widgets/utils/option-builders.ts +4 -6
  85. package/src/widgets/utils/spacing-px.test.ts +42 -0
  86. package/src/widgets/utils/spacing-px.ts +24 -0
  87. package/src/widgets/wrapper/collapsed-context.ts +12 -0
  88. package/src/widgets/wrapper/widget-wrapper.tsx +6 -1
  89. package/dist/components-CTUpdQuj.js.map +0 -1
  90. package/dist/item-color-B7xkIpDZ.js.map +0 -1
  91. package/dist/markdown-DmvLi3vx.js +0 -159
  92. package/dist/markdown-DmvLi3vx.js.map +0 -1
  93. package/dist/styles-BCEBm7xh.js.map +0 -1
@@ -0,0 +1,106 @@
1
+ import { n as e } from "./style-DTLuIo84.js";
2
+ import { D as t, S as n } from "./stores-DcBOZlU3.js";
3
+ import { t as r } from "./markdown-content-BpAH_V6S.js";
4
+ import { i, o as a, t as o } from "./download-DIj1Iz0t.js";
5
+ import { c as s } from "react/compiler-runtime";
6
+ import { Box as c, Skeleton as l, Typography as u } from "@mui/material";
7
+ import { jsx as d } from "react/jsx-runtime";
8
+ //#region src/widgets/markdown/markdown-ui.tsx
9
+ var f = {
10
+ h1: (e) => p(e, "h4"),
11
+ h2: (e) => p(e, "h5"),
12
+ h3: (e) => p(e, "h6"),
13
+ h4: (e) => p(e, "subtitle1"),
14
+ h5: (e) => p(e, "subtitle2"),
15
+ h6: (e) => p(e, "subtitle2"),
16
+ p: ({ children: t }) => /* @__PURE__ */ d(u, {
17
+ variant: "body2",
18
+ component: "p",
19
+ sx: e.paragraph,
20
+ children: t
21
+ })
22
+ };
23
+ function p(t, n) {
24
+ return /* @__PURE__ */ d(u, {
25
+ variant: n,
26
+ component: "div",
27
+ sx: e.heading,
28
+ children: t.children
29
+ });
30
+ }
31
+ function m(t) {
32
+ let n = s(2), { content: i } = t, a;
33
+ return n[0] === i ? a = n[1] : (a = /* @__PURE__ */ d(c, {
34
+ sx: e.root,
35
+ children: /* @__PURE__ */ d(r, {
36
+ content: i,
37
+ components: f,
38
+ allowHtml: !0,
39
+ allowImages: !0
40
+ })
41
+ }), n[0] = i, n[1] = a), a;
42
+ }
43
+ //#endregion
44
+ //#region src/widgets/markdown/markdown.tsx
45
+ function h() {
46
+ let e = s(2), r = t(), i = n(r, g), a;
47
+ return e[0] === i ? a = e[1] : (a = /* @__PURE__ */ d(m, { content: i }), e[0] = i, e[1] = a), a;
48
+ }
49
+ function g(e) {
50
+ return e.data?.content ?? "";
51
+ }
52
+ //#endregion
53
+ //#region src/widgets/markdown/skeleton.tsx
54
+ var _ = {
55
+ root: {
56
+ display: "flex",
57
+ flexDirection: "column",
58
+ gap: 1,
59
+ py: 1
60
+ },
61
+ line: (e) => ({
62
+ width: e,
63
+ height: 18
64
+ })
65
+ };
66
+ function v(e) {
67
+ let t = s(2), { lines: n } = e, r = n === void 0 ? 5 : n, i;
68
+ if (t[0] !== r) {
69
+ let e = [
70
+ "100%",
71
+ "95%",
72
+ "90%",
73
+ "85%",
74
+ "70%"
75
+ ];
76
+ i = /* @__PURE__ */ d(c, {
77
+ sx: _.root,
78
+ children: Array.from({ length: r }).map((t, n) => /* @__PURE__ */ d(l, {
79
+ variant: "rectangular",
80
+ sx: _.line(e[n % e.length] ?? "85%")
81
+ }, `line-${n}`))
82
+ }), t[0] = r, t[1] = i;
83
+ } else i = t[1];
84
+ return i;
85
+ }
86
+ //#endregion
87
+ //#region src/widgets/markdown/download.tsx
88
+ function y(e) {
89
+ return o(e, {
90
+ id: i.markdown,
91
+ label: "Markdown",
92
+ icon: /* @__PURE__ */ d(a, { fontSize: "small" }),
93
+ resolve: (t) => {
94
+ let n = e.getData(t), r = new Blob([n.content ?? ""], { type: "text/markdown;charset=utf-8;" }), i = URL.createObjectURL(r);
95
+ return Promise.resolve({
96
+ url: i,
97
+ filename: `${e.filename}.md`,
98
+ revoke: () => URL.revokeObjectURL(i)
99
+ });
100
+ }
101
+ });
102
+ }
103
+ //#endregion
104
+ export { m as i, v as n, h as r, y as t };
105
+
106
+ //# sourceMappingURL=markdown-B8lLR-NY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-B8lLR-NY.js","names":["{ content }: MarkdownUIProps","<Box sx={styles.root}>\n <MarkdownContent\n content={content}\n components={components}\n allowHtml\n allowImages\n />\n </Box>","styles","_c","(s) => {\n const data = s.data as MarkdownWidgetData | undefined\n return data?.content ?? ''\n }","<MarkdownUI content={content} />","_c","{ lines = 5 }: MarkdownSkeletonProps","lines = 5","<Box sx={styles.root}>\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton\n key={`line-${i}`}\n variant='rectangular'\n sx={styles.line(widths[i % widths.length] ?? '85%')}\n />\n ))}\n </Box>","_c","styles$1","useWidgetId","useWidget","MarkdownContent","MarkdownIcon","withPngItem","components","mdHeading","props","Typography","MarkdownUI","$","c","t0","t1","content","Box","Markdown","id","_temp","s","styles","MarkdownSkeleton","lines","t2","widths","Skeleton","i","createMarkdownDownloadConfig","args","DOWNLOAD_ITEM_IDS","data","ctx","blob","url"],"sources":["../src/widgets/markdown/markdown-ui.tsx","../src/widgets/markdown/markdown.tsx","../src/widgets/markdown/skeleton.tsx","../src/widgets/markdown/download.tsx"],"sourcesContent":["import { Box, Typography, type TypographyProps } from '@mui/material'\nimport type { Components } from 'react-markdown'\nimport { MarkdownContent } from './markdown-content'\nimport { styles } from './style'\n\nexport interface MarkdownUIProps {\n content: string\n}\n\n/** MUI-styled element mapping for `react-markdown`. */\nconst components: Components = {\n h1: (props) => mdHeading(props, 'h4'),\n h2: (props) => mdHeading(props, 'h5'),\n h3: (props) => mdHeading(props, 'h6'),\n h4: (props) => mdHeading(props, 'subtitle1'),\n h5: (props) => mdHeading(props, 'subtitle2'),\n h6: (props) => mdHeading(props, 'subtitle2'),\n p: ({ children }) => (\n <Typography variant='body2' component='p' sx={styles.paragraph}>\n {children}\n </Typography>\n ),\n}\n\nfunction mdHeading(\n props: { children?: React.ReactNode },\n variant: TypographyProps['variant'],\n) {\n return (\n <Typography variant={variant} component='div' sx={styles.heading}>\n {props.children}\n </Typography>\n )\n}\n\n/**\n * Pure presentational component for the Markdown widget. Delegates the\n * `react-markdown` engine to {@link MarkdownContent} and supplies a\n * document-style MUI element mapping (body2 paragraphs, real heading\n * typography). Opts INTO raw HTML and inline images — the Markdown widget is\n * the one slot in the library where authors can ship rich content. Caption\n * slots like `Note` keep the conservative defaults.\n */\nexport function MarkdownUI({ content }: MarkdownUIProps) {\n return (\n <Box sx={styles.root}>\n <MarkdownContent\n content={content}\n components={components}\n allowHtml\n allowImages\n />\n </Box>\n )\n}\n","import { useWidgetId, useWidget } from '../stores'\nimport { MarkdownUI } from './markdown-ui'\nimport type { MarkdownWidgetData } from './types'\n\n/**\n * Stateful Markdown bridge — reads `data.content` (post-pipeline) from the\n * per-widget store and forwards it to the pure {@link MarkdownUI}. Sits\n * inside `<Widget.Provider>`.\n */\nexport function Markdown() {\n const id = useWidgetId()\n const content = useWidget(id, (s) => {\n const data = s.data as MarkdownWidgetData | undefined\n return data?.content ?? ''\n })\n return <MarkdownUI content={content} />\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n py: 1,\n },\n line: (width: string): SxProps<Theme> => ({ width, height: 18 }),\n} as const\n\nexport interface MarkdownSkeletonProps {\n lines?: number\n}\n\nexport function MarkdownSkeleton({ lines = 5 }: MarkdownSkeletonProps) {\n // Vary widths to mimic prose.\n const widths = ['100%', '95%', '90%', '85%', '70%']\n return (\n <Box sx={styles.root}>\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton\n key={`line-${i}`}\n variant='rectangular'\n sx={styles.line(widths[i % widths.length] ?? '85%')}\n />\n ))}\n </Box>\n )\n}\n","import {\n DOWNLOAD_ITEM_IDS,\n MarkdownIcon,\n withPngItem,\n toCsvString,\n triggerLinkDownload,\n type DownloadItem,\n type WidgetDownloadArgs,\n} from '../actions/download'\nimport type { MarkdownWidgetData } from './types'\n\n/**\n * Download menu items for the Markdown widget. Always includes a `.md` item\n * that saves the markdown source verbatim. When `getCaptureEl` is given,\n * prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createMarkdownDownloadConfig(\n args: WidgetDownloadArgs<MarkdownWidgetData>,\n): DownloadItem[] {\n return withPngItem(args, {\n id: DOWNLOAD_ITEM_IDS.markdown,\n label: 'Markdown',\n icon: <MarkdownIcon fontSize='small' />,\n resolve: (ctx) => {\n const data = args.getData(ctx)\n const blob = new Blob([data.content ?? ''], {\n type: 'text/markdown;charset=utf-8;',\n })\n const url = URL.createObjectURL(blob)\n return Promise.resolve({\n url,\n filename: `${args.filename}.md`,\n revoke: () => URL.revokeObjectURL(url),\n })\n },\n })\n}\n\n// Re-export pure helpers consumers may want when building a custom Download item.\nexport { toCsvString, triggerLinkDownload }\n"],"mappings":";;;;;;;;AAUA,IAAMiB,IAAyB;CAC7B,KAAK,MAAUC,EAAUC,GAAO,IAAI;CACpC,KAAK,MAAUD,EAAUC,GAAO,IAAI;CACpC,KAAK,MAAUD,EAAUC,GAAO,IAAI;CACpC,KAAK,MAAUD,EAAUC,GAAO,WAAW;CAC3C,KAAK,MAAUD,EAAUC,GAAO,WAAW;CAC3C,KAAK,MAAUD,EAAUC,GAAO,WAAW;CAC3C,IAAI,EAAE,kBACJ,kBAACC,GAAD;EAAY,SAAQ;EAAQ,WAAU;EAAI,IAAIlB,EAAO;EAClD;CACS,CAAA;AAEhB;AAEA,SAASgB,EACP,GACA,GACA;CACA,OACE,kBAACE,GAAD;EAAqB;EAAS,WAAU;EAAM,IAAIlB,EAAO;EACtD,UAAAiB,EAAM;CACG,CAAA;AAEhB;AAUA,SAAgBE,EAAA,GAAyC;eAA9B,EAAE,eAAFrB,GAEvBC;CADF,OAGeqB,EAAA,OAAAI,gBAFb,IAAA,kBAACC,GAAD;EAAK,IAAIzB,EAAO;EACd,UAAA,kBAACY,GAAD;GACW;GACG;GACZ,WAAA;GACA,aAAA;EACD,CAAA;CACE,CAAA,GALQ,EAAA,KAAAY,cAFbzB;AASJ;;;AC7CA,SAAgB2B,IAAW;eACnBC,IAAKjB,EAAY,GACjBc,IAAUb,EAAUgB,GAAIzB,CAG7B,GACMC;CAAP,OAA4BiB,EAAA,OAAAI,gBAArB,IAAA,kBAACL,GAAD,EAAqB,WAAU,CAAA,GAAV,EAAA,KAAAK,cAArBrB;AACT;AALgC,SAAAyB,EAAC,GAAM;CAEnC,OADaC,EAAE,MACF,WAAW;AAC1B;;;ACXF,IAAMC,IAAS;CACb,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,IAAI;CACN;CACA,OAAO,OAAmC;EAAE;EAAO,QAAQ;CAAG;AAChE;AAMA,SAAgBC,EAAA,GAAuD;eAAtC,EAAE,OAAAR,MAAFlB,GAAE2B,IAAAT,MAAA,KAAA,IAAQ,IAARjB,GAI/BC;CACwB,IAAAa,EAAA,OAAAY,GAAA;EAH1B,IAAME,IAAS;GAAC;GAAQ;GAAO;GAAO;GAAO;EAAK;EAEhD,IAAA,kBAACT,GAAD;GAAK,IAAIK,EAAO;GACb,UAAA,MAAM,KAAK,EAAE,QAAQE,EAAM,CAAC,CAAC,CAAC,KAAK,GAAG,MACrC,kBAACG,GAAD;IAEE,SAAQ;IACR,IAAIL,EAAO,KAAKI,EAAOE,IAAIF,EAAO,WAAW,KAAK;GACnD,GAHM,QAAQE,GAGd,CACF;EACE,CAAA,GAPmB,EAAA,KAAAJ;;CAF1B,OACEzB;AAUJ;;;ACdA,SAAgB8B,EACd,GACgB;CAChB,OAAOvB,EAAYwB,GAAM;EACvB,IAAIC,EAAkB;EACtB,OAAO;EACP,MAAM,kBAAC1B,GAAD,EAAc,UAAS,QAAS,CAAA;EACtC,UAAU,MAAQ;GAChB,IAAM2B,IAAOF,EAAK,QAAQG,CAAG,GACvBC,IAAO,IAAI,KAAK,CAACF,EAAK,WAAW,EAAE,GAAG,EAC1C,MAAM,+BACR,CAAC,GACKG,IAAM,IAAI,gBAAgBD,CAAI;GACpC,OAAO,QAAQ,QAAQ;IACrB;IACA,UAAU,GAAGJ,EAAK,SAAS;IAC3B,cAAc,IAAI,gBAAgBK,CAAG;GACvC,CAAC;EACH;CACF,CAAC;AACH"}
@@ -1,6 +1,6 @@
1
1
  import { C as e, D as t } from "./stores-DcBOZlU3.js";
2
- import { n, t as r } from "./download-B4sykOFm.js";
3
- import { a as i, c as a, l as o, o as s, s as c, u as l } from "./formula-DJS-JLpk.js";
2
+ import { n, t as r } from "./download-DIj1Iz0t.js";
3
+ import { a as i, c as a, l as o, o as s, s as c, u as l } from "./formula-CSHhAoyW.js";
4
4
  import { c as u } from "react/compiler-runtime";
5
5
  import { Box as d, Skeleton as f } from "@mui/material";
6
6
  import { jsx as p, jsxs as m } from "react/jsx-runtime";
@@ -140,4 +140,4 @@ function T({ value: e, spread: t, variant: n = "percentage" }) {
140
140
  //#endregion
141
141
  export { g as a, b as i, w as n, h as o, S as r, T as t };
142
142
 
143
- //# sourceMappingURL=spread-CQwFIwuz.js.map
143
+ //# sourceMappingURL=spread-BRfPPIep.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spread-CQwFIwuz.js","names":["<Value color='inherit'>-</Value>","_c","{ items, formatter, ref }: SpreadUIProps","(n: number) => String(n)","items.map((item, i) => (\n // Composite of series name + min/max bounds for stability across\n // reorders; falls back to the index when bounds happen to collide.\n <Box\n key={`spread-${item.series?.name ?? ''}-${item.min}-${item.max}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>{fmt(item.min)}</Value>\n <Separator />\n <Value color={item.color}>{fmt(item.max)}</Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n </Box>\n ))","(item, i) => (\n // Composite of series name + min/max bounds for stability across\n // reorders; falls back to the index when bounds happen to collide.\n <Box\n key={`spread-${item.series?.name ?? ''}-${item.min}-${item.max}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>{fmt(item.min)}</Value>\n <Separator />\n <Value color={item.color}>{fmt(item.max)}</Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n </Box>\n )","<Box ref={ref} sx={styles.root}>\n {items.map((item, i) => (\n // Composite of series name + min/max bounds for stability across\n // reorders; falls back to the index when bounds happen to collide.\n <Box\n key={`spread-${item.series?.name ?? ''}-${item.min}-${item.max}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>{fmt(item.min)}</Value>\n <Separator />\n <Value color={item.color}>{fmt(item.max)}</Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n </Box>\n ))}\n </Box>","_c","_temp","styles","<SpreadUI items={slice.data} formatter={slice.formatter} />","data","formatter","_c","{ count = 1 }: SpreadSkeletonProps","count = 1","<Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Box key={`row-${i}`} sx={styles.row}>\n <Skeleton variant='rectangular' sx={styles.block} />\n </Box>\n ))}\n </Box>","(_, i) => (\n <Box key={`row-${i}`} sx={styles.row}>\n <Skeleton variant='rectangular' sx={styles.block} />\n </Box>\n )","_c","useWidgetShallow","useWidgetId","withPngItem","styles$1","Series","Prefix","Value","Suffix","Note","Separator","$","c","t0","SpreadUI","fmt","formatter","_temp$1","t1","items","t2","Box","item","i","ref","n","EMPTY_DATA","spreadSelector","s","Spread","id","slice","styles","SpreadSkeleton","count","_temp","Skeleton","createSpreadDownloadConfig","args","buildCsvDownloadItem","data","ctx","rows","getSpreadBand","offset","variant","spread","value","width"],"sources":["../src/widgets/spread/separator.tsx","../src/widgets/spread/spread-ui.tsx","../src/widgets/spread/spread.tsx","../src/widgets/spread/skeleton.tsx","../src/widgets/spread/download.ts","../src/widgets/spread/band.ts"],"sourcesContent":["import { Value } from '../formula'\n\n/**\n * Em-dash separator placed between a Spread row's `min` and `max` values.\n * Built from the Formula {@link Value} primitive so typography (h5/600,\n * baseline alignment) matches the numbers around it. Renders with\n * `text.secondary` so it visually recedes between the two bounds.\n */\nexport function Separator() {\n return <Value color='inherit'>-</Value>\n}\n","import { Box } from '@mui/material'\nimport type { Ref } from 'react'\nimport { Note, Prefix, Series, Suffix, Value } from '../formula'\nimport { styles } from '../formula/style'\nimport { Separator } from './separator'\nimport type { SpreadDataItem } from './types'\n\nexport interface SpreadUIProps {\n items: readonly SpreadDataItem[]\n /** Number formatter — applied to each item's `min` and `max`. */\n formatter?: (value: number) => string\n /** Forwarded to the root `<Box>` so consumers can capture the DOM (PNG export). */\n ref?: Ref<HTMLDivElement>\n}\n\n/**\n * Pure presentational component for the Spread widget. Each item renders as\n * a row containing (in order): optional `Series` avatar, a body with\n * `[prefix] min — max [suffix]` plus optional `Note`. Reuses the Formula\n * primitives ({@link Series}, {@link Prefix}, {@link Value}, {@link Suffix},\n * {@link Note}) and the Formula row styles so Spread and Formula stay\n * visually aligned when used together.\n */\nexport function SpreadUI({ items, formatter, ref }: SpreadUIProps) {\n const fmt = formatter ?? ((n: number) => String(n))\n return (\n <Box ref={ref} sx={styles.root}>\n {items.map((item, i) => (\n // Composite of series name + min/max bounds for stability across\n // reorders; falls back to the index when bounds happen to collide.\n <Box\n key={`spread-${item.series?.name ?? ''}-${item.min}-${item.max}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>{fmt(item.min)}</Value>\n <Separator />\n <Value color={item.color}>{fmt(item.max)}</Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n </Box>\n ))}\n </Box>\n )\n}\n","import { useWidgetId, useWidgetShallow } from '../stores'\nimport { SpreadUI } from './spread-ui'\nimport type { SpreadWidgetData } from './types'\n\ninterface SpreadSlice {\n data: SpreadWidgetData\n formatter?: (value: number) => string\n}\n\n// Stable empty-data sentinel — keeps the slice's `data` reference stable\n// when the underlying store value is null/undefined so the shallow-equality\n// gate in `useWidgetShallow` doesn't re-render every commit.\nconst EMPTY_DATA: SpreadWidgetData = Object.freeze([]) as SpreadWidgetData\n\nconst spreadSelector = (s: {\n data: unknown\n formatter?: (value: number) => string\n}): SpreadSlice => ({\n data: (s.data ?? EMPTY_DATA) as SpreadWidgetData,\n formatter: s.formatter,\n})\n\n/**\n * Stateful Spread bridge — reads `data` (post-pipeline) and `formatter` from\n * the per-widget store and forwards them to the pure {@link SpreadUI}.\n */\nexport function Spread() {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, spreadSelector)\n return <SpreadUI items={slice.data} formatter={slice.formatter} />\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n py: 1,\n },\n row: {\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n },\n block: { width: 200, height: 32 },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface SpreadSkeletonProps {\n count?: number\n}\n\n/**\n * Loading placeholder for the Spread widget. Renders `count` rows, each\n * sized for the `min — max` pair so the layout doesn't jump once data\n * resolves. Mirrors the row-per-item structure of {@link SpreadUI}.\n */\nexport function SpreadSkeleton({ count = 1 }: SpreadSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Box key={`row-${i}`} sx={styles.row}>\n <Skeleton variant='rectangular' sx={styles.block} />\n </Box>\n ))}\n </Box>\n )\n}\n","import {\n buildCsvDownloadItem,\n withPngItem,\n type DownloadItem,\n type WidgetDownloadArgs,\n} from '../actions/download'\nimport type { SpreadWidgetData } from './types'\n\n/**\n * Download menu items for the Spread widget. Always includes a CSV item with\n * `series, prefix, min, max, suffix, note` columns (one row per entry). When\n * `getCaptureEl` is given, prepends a PNG item that rasterises the captured\n * element via `html2canvas`.\n */\nexport function createSpreadDownloadConfig(\n args: WidgetDownloadArgs<SpreadWidgetData>,\n): DownloadItem[] {\n return withPngItem(\n args,\n buildCsvDownloadItem({\n filename: args.filename,\n getRows: (ctx) => {\n const data = args.getData(ctx)\n const rows: unknown[][] = [\n ['series', 'prefix', 'min', 'max', 'suffix', 'note'],\n ]\n for (const item of data) {\n rows.push([\n item.series?.name ?? '',\n item.prefix ?? '',\n item.min,\n item.max,\n item.suffix ?? '',\n item.note ?? '',\n ])\n }\n return rows\n },\n }),\n )\n}\n","/**\n * How a `spread` amount is applied to a centre value.\n *\n * - `percentage` — `spread` is a whole-number percentage of the centre\n * value, so `5` means +/-5%.\n * - `absolute` — `spread` is a raw offset in the value's own units.\n */\nexport type SpreadVariant = 'percentage' | 'absolute'\n\nexport interface GetSpreadBandOptions {\n /** The centre value the band is drawn around. */\n value: number\n /** Half-width of the band, read according to `variant`. */\n spread: number\n /** Defaults to `percentage`. */\n variant?: SpreadVariant\n}\n\n/**\n * Derives the `min` / `max` band around a centre value, for feeding a\n * {@link SpreadDataItem} from a single aggregated number (a prediction, a\n * target) plus a tolerance — rather than from a real column range.\n *\n * `spread` is read as a percentage by default, which is what a tolerance\n * almost always is: an absolute offset is meaningless without knowing the\n * value's magnitude, and gets visually lost on large values (+/-5 on a\n * prediction of 204,113 renders as a range indistinguishable from a single\n * number).\n *\n * @example\n * getSpreadBand({ value: 1000, spread: 5 })\n * // -> { min: 950, max: 1050 }\n * getSpreadBand({ value: 1000, spread: 5, variant: 'absolute' })\n * // -> { min: 995, max: 1005 }\n */\nexport function getSpreadBand({\n value,\n spread,\n variant = 'percentage',\n}: GetSpreadBandOptions): { min: number; max: number } {\n const offset = variant === 'absolute' ? spread : (spread / 100) * value\n // Keep `min <= max`: a percentage of a negative centre value (or a negative\n // `spread`) yields a negative offset, which would invert the band.\n const width = Math.abs(offset)\n\n return { min: value - width, max: value + width }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB4B,IAAY;eACnB5B;CAAP,2DAAQ,IAAA,kBAAAyB,GAAD;EAAO,OAAM;EAAU,UAAA;CAAQ,CAAA,yBAA/BzB;AACT;;;ACaA,SAAgBgC,EAAA,GAAmD;eAA1C,EAAE,UAAO,cAAW,WAApB9B,GACjB+B,IAAMC,KAAc/B,GAGrBC;CAakC,IAAAyB,EAAA,OAAAI,KAAAJ,EAAA,OAblCQ,GAAA;EAAUhC,IAAAA;EAawBwB,EAAA,OAAAI,gBAbxB,KAAC,GAAM,MAGhB,kBAACM,GAAD;GAEE,IAAI9B,EAAO;GAFb,UAAA,CAIG+B,EAAK,SACJ,kBAACjB,GAAD;IAAQ,MAAMiB,EAAK,OAAO;IAAM,OAAOA,EAAK,OAAO;GAAQ,CAAA,IACzD,MACJ,kBAACD,GAAD;IAAK,IAAI9B,EAAO;IAAhB,UAAA,CACE,kBAAC8B,GAAD;KAAK,IAAI9B,EAAO;KAAhB,UAAA;MACG+B,EAAK,SAAS,kBAAChB,GAAD,EAAA,UAASgB,EAAK,OAAe,CAAA,IAAI;MAChD,kBAACf,GAAD;OAAO,OAAOe,EAAK;OAAQ,UAAAP,EAAIO,EAAK,GAAG;MAAS,CAAA;MAChD,kBAACZ,GAAD,CAAY,CAAA;MACZ,kBAACH,GAAD;OAAO,OAAOe,EAAK;OAAQ,UAAAP,EAAIO,EAAK,GAAG;MAAS,CAAA;MAC/CA,EAAK,SAAS,kBAACd,GAAD,EAAA,UAASc,EAAK,OAAe,CAAA,IAAI;KAC7C;IACJ,CAAA,GAAAA,EAAK,OAAO,kBAACb,GAAD,EAAA,UAAOa,EAAK,KAAW,CAAA,IAAI,IACrC;GACF,CAAA,CAAA;EAhBE,GAAA,UAAUA,EAAK,QAAQ,QAAQ,GAAG,GAAGA,EAAK,IAAI,GAAGA,EAAK,IAAI,GAAGC,GAgB/D,GAP4B,EAAA,KAAAR,cAblC,IAAAI,EAAM,IAAIhC,CAqBV,GARkC,EAAA,KAAA4B,GAblC,EAAA,KAAAI;;CADH/B,IAAAA;CADF,OACYuB,EAAA,OAAAa,KAAAb,EAAA,OACPzB,KADH,IAAA,kBAACmC,GAAD;EAAU;EAAK,IAAI9B,EAAO;EACvBL,UAAAA;CAsBE,CAAA,GAvBK,EAAA,KAAAsC,GACPtC,EAAAA,KAAAA,yBADHE;AAyBJ;AA3B4B,SAAAE,EAAC,GAAA;CAAc,OAAA,OAAOmC,CAAC;;;;ACZnD,IAAMC,IAA+B,OAAO,OAAO,CAAC,CAAC,GAE/CC,KAAkB,OAGJ;CAClB,MAAOC,EAAE,QAAQF;CACjB,WAAWE,EAAE;AACf;AAMA,SAAgBC,IAAS;eACjBC,IAAK5B,EAAY,GACjB6B,IAAQ9B,EAAiB6B,GAAIH,CAAc,GAC1CnC;CAAP,OAA8BC,EAAAA,OAAAA,EAAAA,QAAAA,EAAAA,OAAuBC,EAAAA,aAA9C,IAAA,kBAACoB,GAAD;EAAU,OAAOiB,EAAM;EAAM,WAAWA,EAAM;CAAY,CAAA,GAAnCtC,EAAAA,KAAAA,EAAAA,MAAuBC,EAAAA,KAAAA,EAAAA,iCAA9CF;AACT;;;AC3BA,IAAMwC,IAAS;CACb,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,IAAI;CACN;CACA,KAAK;EACH,SAAS;EACT,YAAY;EACZ,KAAK;CACP;CACA,OAAO;EAAE,OAAO;EAAK,QAAQ;CAAG;AAClC;AAWA,SAAgBC,EAAA,GAAmD;eAApC,EAAE,OAAAf,MAAFtB,GAAEsC,IAAAhB,MAAA,KAAA,IAAQ,IAARrB,GAE7BC;CADF,OAE0Ba,EAAA,OAAAuB,gBADxB,IAAA,kBAACb,GAAD;EAAK,IAAIW,EAAO;EACb,UAAA,MAAM,KAAK,EAAE,QAAQE,EAAM,CAAC,CAAC,CAAC,IAAInC,CAIlC;CACE,CAAA,GALmB,EAAA,KAAAmC,cADxBpC;AAQJ;AAPyC,SAAAqC,EAAC,GAAG,GAAA;CACrC,OAAA,kBAACd,GAAD;EAAsB,IAAIW,EAAO;EAC/B,UAAA,kBAACI,GAAD;GAAU,SAAQ;GAAc,IAAIJ,EAAO;EAAQ,CAAA;CAChD,GAFK,OAAOT,GAEZ;;;;ACnBb,SAAgBc,EACd,GACgB;CAChB,OAAOlC,EACLmC,GACAC,EAAqB;EACnB,UAAUD,EAAK;EACf,UAAU,MAAQ;GAChB,IAAME,IAAOF,EAAK,QAAQG,CAAG,GACvBC,IAAoB,CACxB;IAAC;IAAU;IAAU;IAAO;IAAO;IAAU;GAAM,CACrD;GACA,KAAK,IAAMpB,KAAQkB,GACjB,EAAK,KAAK;IACRlB,EAAK,QAAQ,QAAQ;IACrBA,EAAK,UAAU;IACfA,EAAK;IACLA,EAAK;IACLA,EAAK,UAAU;IACfA,EAAK,QAAQ;GACf,CAAC;GAEH,OAAOoB;EACT;CACF,CAAC,CACH;AACF;;;ACLA,SAAgBC,EAAc,EAC5B,UACA,WACA,aAAU,gBAC2C;CACrD,IAAMC,IAASC,MAAY,aAAaC,IAAUA,IAAS,MAAOC,GAG5DC,IAAQ,KAAK,IAAIJ,CAAM;CAE7B,OAAO;EAAE,KAAKG,IAAQC;EAAO,KAAKD,IAAQC;CAAM;AAClD"}
1
+ {"version":3,"file":"spread-BRfPPIep.js","names":["<Value color='inherit'>-</Value>","_c","{ items, formatter, ref }: SpreadUIProps","(n: number) => String(n)","items.map((item, i) => (\n // Composite of series name + min/max bounds for stability across\n // reorders; falls back to the index when bounds happen to collide.\n <Box\n key={`spread-${item.series?.name ?? ''}-${item.min}-${item.max}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>{fmt(item.min)}</Value>\n <Separator />\n <Value color={item.color}>{fmt(item.max)}</Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n </Box>\n ))","(item, i) => (\n // Composite of series name + min/max bounds for stability across\n // reorders; falls back to the index when bounds happen to collide.\n <Box\n key={`spread-${item.series?.name ?? ''}-${item.min}-${item.max}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>{fmt(item.min)}</Value>\n <Separator />\n <Value color={item.color}>{fmt(item.max)}</Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n </Box>\n )","<Box ref={ref} sx={styles.root}>\n {items.map((item, i) => (\n // Composite of series name + min/max bounds for stability across\n // reorders; falls back to the index when bounds happen to collide.\n <Box\n key={`spread-${item.series?.name ?? ''}-${item.min}-${item.max}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>{fmt(item.min)}</Value>\n <Separator />\n <Value color={item.color}>{fmt(item.max)}</Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n </Box>\n ))}\n </Box>","_c","_temp","styles","<SpreadUI items={slice.data} formatter={slice.formatter} />","data","formatter","_c","{ count = 1 }: SpreadSkeletonProps","count = 1","<Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Box key={`row-${i}`} sx={styles.row}>\n <Skeleton variant='rectangular' sx={styles.block} />\n </Box>\n ))}\n </Box>","(_, i) => (\n <Box key={`row-${i}`} sx={styles.row}>\n <Skeleton variant='rectangular' sx={styles.block} />\n </Box>\n )","_c","useWidgetShallow","useWidgetId","withPngItem","styles$1","Series","Prefix","Value","Suffix","Note","Separator","$","c","t0","SpreadUI","fmt","formatter","_temp$1","t1","items","t2","Box","item","i","ref","n","EMPTY_DATA","spreadSelector","s","Spread","id","slice","styles","SpreadSkeleton","count","_temp","Skeleton","createSpreadDownloadConfig","args","buildCsvDownloadItem","data","ctx","rows","getSpreadBand","offset","variant","spread","value","width"],"sources":["../src/widgets/spread/separator.tsx","../src/widgets/spread/spread-ui.tsx","../src/widgets/spread/spread.tsx","../src/widgets/spread/skeleton.tsx","../src/widgets/spread/download.ts","../src/widgets/spread/band.ts"],"sourcesContent":["import { Value } from '../formula'\n\n/**\n * Em-dash separator placed between a Spread row's `min` and `max` values.\n * Built from the Formula {@link Value} primitive so typography (h5/600,\n * baseline alignment) matches the numbers around it. Renders with\n * `text.secondary` so it visually recedes between the two bounds.\n */\nexport function Separator() {\n return <Value color='inherit'>-</Value>\n}\n","import { Box } from '@mui/material'\nimport type { Ref } from 'react'\nimport { Note, Prefix, Series, Suffix, Value } from '../formula'\nimport { styles } from '../formula/style'\nimport { Separator } from './separator'\nimport type { SpreadDataItem } from './types'\n\nexport interface SpreadUIProps {\n items: readonly SpreadDataItem[]\n /** Number formatter — applied to each item's `min` and `max`. */\n formatter?: (value: number) => string\n /** Forwarded to the root `<Box>` so consumers can capture the DOM (PNG export). */\n ref?: Ref<HTMLDivElement>\n}\n\n/**\n * Pure presentational component for the Spread widget. Each item renders as\n * a row containing (in order): optional `Series` avatar, a body with\n * `[prefix] min — max [suffix]` plus optional `Note`. Reuses the Formula\n * primitives ({@link Series}, {@link Prefix}, {@link Value}, {@link Suffix},\n * {@link Note}) and the Formula row styles so Spread and Formula stay\n * visually aligned when used together.\n */\nexport function SpreadUI({ items, formatter, ref }: SpreadUIProps) {\n const fmt = formatter ?? ((n: number) => String(n))\n return (\n <Box ref={ref} sx={styles.root}>\n {items.map((item, i) => (\n // Composite of series name + min/max bounds for stability across\n // reorders; falls back to the index when bounds happen to collide.\n <Box\n key={`spread-${item.series?.name ?? ''}-${item.min}-${item.max}-${i}`}\n sx={styles.row}\n >\n {item.series ? (\n <Series name={item.series.name} color={item.series.color} />\n ) : null}\n <Box sx={styles.body}>\n <Box sx={styles.valueRow}>\n {item.prefix ? <Prefix>{item.prefix}</Prefix> : null}\n <Value color={item.color}>{fmt(item.min)}</Value>\n <Separator />\n <Value color={item.color}>{fmt(item.max)}</Value>\n {item.suffix ? <Suffix>{item.suffix}</Suffix> : null}\n </Box>\n {item.note ? <Note>{item.note}</Note> : null}\n </Box>\n </Box>\n ))}\n </Box>\n )\n}\n","import { useWidgetId, useWidgetShallow } from '../stores'\nimport { SpreadUI } from './spread-ui'\nimport type { SpreadWidgetData } from './types'\n\ninterface SpreadSlice {\n data: SpreadWidgetData\n formatter?: (value: number) => string\n}\n\n// Stable empty-data sentinel — keeps the slice's `data` reference stable\n// when the underlying store value is null/undefined so the shallow-equality\n// gate in `useWidgetShallow` doesn't re-render every commit.\nconst EMPTY_DATA: SpreadWidgetData = Object.freeze([]) as SpreadWidgetData\n\nconst spreadSelector = (s: {\n data: unknown\n formatter?: (value: number) => string\n}): SpreadSlice => ({\n data: (s.data ?? EMPTY_DATA) as SpreadWidgetData,\n formatter: s.formatter,\n})\n\n/**\n * Stateful Spread bridge — reads `data` (post-pipeline) and `formatter` from\n * the per-widget store and forwards them to the pure {@link SpreadUI}.\n */\nexport function Spread() {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, spreadSelector)\n return <SpreadUI items={slice.data} formatter={slice.formatter} />\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n py: 1,\n },\n row: {\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n },\n block: { width: 200, height: 32 },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface SpreadSkeletonProps {\n count?: number\n}\n\n/**\n * Loading placeholder for the Spread widget. Renders `count` rows, each\n * sized for the `min — max` pair so the layout doesn't jump once data\n * resolves. Mirrors the row-per-item structure of {@link SpreadUI}.\n */\nexport function SpreadSkeleton({ count = 1 }: SpreadSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Box key={`row-${i}`} sx={styles.row}>\n <Skeleton variant='rectangular' sx={styles.block} />\n </Box>\n ))}\n </Box>\n )\n}\n","import {\n buildCsvDownloadItem,\n withPngItem,\n type DownloadItem,\n type WidgetDownloadArgs,\n} from '../actions/download'\nimport type { SpreadWidgetData } from './types'\n\n/**\n * Download menu items for the Spread widget. Always includes a CSV item with\n * `series, prefix, min, max, suffix, note` columns (one row per entry). When\n * `getCaptureEl` is given, prepends a PNG item that rasterises the captured\n * element via `html2canvas`.\n */\nexport function createSpreadDownloadConfig(\n args: WidgetDownloadArgs<SpreadWidgetData>,\n): DownloadItem[] {\n return withPngItem(\n args,\n buildCsvDownloadItem({\n filename: args.filename,\n getRows: (ctx) => {\n const data = args.getData(ctx)\n const rows: unknown[][] = [\n ['series', 'prefix', 'min', 'max', 'suffix', 'note'],\n ]\n for (const item of data) {\n rows.push([\n item.series?.name ?? '',\n item.prefix ?? '',\n item.min,\n item.max,\n item.suffix ?? '',\n item.note ?? '',\n ])\n }\n return rows\n },\n }),\n )\n}\n","/**\n * How a `spread` amount is applied to a centre value.\n *\n * - `percentage` — `spread` is a whole-number percentage of the centre\n * value, so `5` means +/-5%.\n * - `absolute` — `spread` is a raw offset in the value's own units.\n */\nexport type SpreadVariant = 'percentage' | 'absolute'\n\nexport interface GetSpreadBandOptions {\n /** The centre value the band is drawn around. */\n value: number\n /** Half-width of the band, read according to `variant`. */\n spread: number\n /** Defaults to `percentage`. */\n variant?: SpreadVariant\n}\n\n/**\n * Derives the `min` / `max` band around a centre value, for feeding a\n * {@link SpreadDataItem} from a single aggregated number (a prediction, a\n * target) plus a tolerance — rather than from a real column range.\n *\n * `spread` is read as a percentage by default, which is what a tolerance\n * almost always is: an absolute offset is meaningless without knowing the\n * value's magnitude, and gets visually lost on large values (+/-5 on a\n * prediction of 204,113 renders as a range indistinguishable from a single\n * number).\n *\n * @example\n * getSpreadBand({ value: 1000, spread: 5 })\n * // -> { min: 950, max: 1050 }\n * getSpreadBand({ value: 1000, spread: 5, variant: 'absolute' })\n * // -> { min: 995, max: 1005 }\n */\nexport function getSpreadBand({\n value,\n spread,\n variant = 'percentage',\n}: GetSpreadBandOptions): { min: number; max: number } {\n const offset = variant === 'absolute' ? spread : (spread / 100) * value\n // Keep `min <= max`: a percentage of a negative centre value (or a negative\n // `spread`) yields a negative offset, which would invert the band.\n const width = Math.abs(offset)\n\n return { min: value - width, max: value + width }\n}\n"],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ //#region src/widgets/markdown/style.ts
2
+ var e = {
3
+ "& :where(ul, ol)": {
4
+ listStyle: "revert",
5
+ margin: "revert",
6
+ padding: "revert"
7
+ },
8
+ "& :where(a)": { textDecoration: "revert" },
9
+ "& :where(blockquote)": { margin: "revert" },
10
+ "& :where(code, kbd, samp)": { fontFamily: "revert" },
11
+ "& :where(img)": {
12
+ display: "revert",
13
+ verticalAlign: "revert",
14
+ maxWidth: "revert",
15
+ height: "revert"
16
+ },
17
+ "& :where(pre)": {
18
+ margin: "revert",
19
+ fontFamily: "revert",
20
+ fontSize: "revert"
21
+ },
22
+ "& :where(sub, sup)": {
23
+ fontSize: "revert",
24
+ lineHeight: "revert",
25
+ position: "revert",
26
+ verticalAlign: "revert"
27
+ }
28
+ }, t = {
29
+ root: {
30
+ ...e,
31
+ color: "text.primary",
32
+ "& a": { color: "primary.main" },
33
+ "& code": {
34
+ bgcolor: "action.hover",
35
+ px: .5,
36
+ borderRadius: .5,
37
+ fontFamily: "monospace",
38
+ fontSize: "0.875em"
39
+ },
40
+ "& pre": {
41
+ bgcolor: "action.hover",
42
+ p: 1.5,
43
+ borderRadius: 1,
44
+ overflowX: "auto"
45
+ },
46
+ "& blockquote": {
47
+ borderLeft: "3px solid",
48
+ borderColor: "divider",
49
+ pl: 1.5,
50
+ ml: 0,
51
+ color: "text.secondary",
52
+ fontStyle: "italic"
53
+ },
54
+ "& ul, & ol": {
55
+ pl: 3,
56
+ my: 1
57
+ },
58
+ "& li": { my: .25 },
59
+ "& hr": {
60
+ border: "none",
61
+ borderTop: "1px solid",
62
+ borderColor: "divider",
63
+ my: 1.5
64
+ },
65
+ "& table": {
66
+ borderCollapse: "collapse",
67
+ width: "100%"
68
+ },
69
+ "& th, & td": {
70
+ border: "1px solid",
71
+ borderColor: "divider",
72
+ px: 1,
73
+ py: .5,
74
+ textAlign: "left"
75
+ }
76
+ },
77
+ paragraph: { my: 1 },
78
+ heading: {
79
+ mt: 2,
80
+ mb: 1,
81
+ fontWeight: 600
82
+ }
83
+ };
84
+ //#endregion
85
+ export { t as n, e as t };
86
+
87
+ //# sourceMappingURL=style-DTLuIo84.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-DTLuIo84.js","names":["markdownElementDefaults","styles"],"sources":["../src/widgets/markdown/style.ts"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material'\nimport type { CSSObject } from '@mui/material/styles'\n\n/**\n * Browser defaults that rendered Markdown relies on, restated with `revert`\n * so a CSS reset in the app (Tailwind's preflight, for one) cannot strip\n * them: list bullets and indent, link underline, blockquote margins, inline\n * images, monospace fonts, `pre` margins, `sub`/`sup` placement. `revert`\n * rolls back to the browser's own value, so pages without a reset render\n * exactly as before.\n *\n * Wrapped in `:where()` so any element rule a consumer sets on top wins.\n */\nexport const markdownElementDefaults = {\n '& :where(ul, ol)': {\n listStyle: 'revert',\n margin: 'revert',\n padding: 'revert',\n },\n '& :where(a)': { textDecoration: 'revert' },\n '& :where(blockquote)': { margin: 'revert' },\n '& :where(code, kbd, samp)': { fontFamily: 'revert' },\n '& :where(img)': {\n display: 'revert',\n verticalAlign: 'revert',\n maxWidth: 'revert',\n height: 'revert',\n },\n '& :where(pre)': {\n margin: 'revert',\n fontFamily: 'revert',\n fontSize: 'revert',\n },\n '& :where(sub, sup)': {\n fontSize: 'revert',\n lineHeight: 'revert',\n position: 'revert',\n verticalAlign: 'revert',\n },\n} satisfies CSSObject\n\nexport const styles = {\n root: {\n ...markdownElementDefaults,\n color: 'text.primary',\n '& a': { color: 'primary.main' },\n '& code': {\n bgcolor: 'action.hover',\n px: 0.5,\n borderRadius: 0.5,\n fontFamily: 'monospace',\n fontSize: '0.875em',\n },\n '& pre': {\n bgcolor: 'action.hover',\n p: 1.5,\n borderRadius: 1,\n overflowX: 'auto',\n },\n '& blockquote': {\n borderLeft: '3px solid',\n borderColor: 'divider',\n pl: 1.5,\n ml: 0,\n color: 'text.secondary',\n fontStyle: 'italic',\n },\n '& ul, & ol': { pl: 3, my: 1 },\n '& li': { my: 0.25 },\n '& hr': {\n border: 'none',\n borderTop: '1px solid',\n borderColor: 'divider',\n my: 1.5,\n },\n '& table': { borderCollapse: 'collapse', width: '100%' },\n '& th, & td': {\n border: '1px solid',\n borderColor: 'divider',\n px: 1,\n py: 0.5,\n textAlign: 'left',\n },\n },\n paragraph: {\n my: 1,\n },\n heading: {\n mt: 2,\n mb: 1,\n fontWeight: 600,\n },\n} satisfies Record<string, SxProps<Theme>>\n"],"mappings":";AAaA,IAAaA,IAA0B;CACrC,oBAAoB;EAClB,WAAW;EACX,QAAQ;EACR,SAAS;CACX;CACA,eAAe,EAAE,gBAAgB,SAAS;CAC1C,wBAAwB,EAAE,QAAQ,SAAS;CAC3C,6BAA6B,EAAE,YAAY,SAAS;CACpD,iBAAiB;EACf,SAAS;EACT,eAAe;EACf,UAAU;EACV,QAAQ;CACV;CACA,iBAAiB;EACf,QAAQ;EACR,YAAY;EACZ,UAAU;CACZ;CACA,sBAAsB;EACpB,UAAU;EACV,YAAY;EACZ,UAAU;EACV,eAAe;CACjB;AACF,GAEaC,IAAS;CACpB,MAAM;EACJ,GAAGD;EACH,OAAO;EACP,OAAO,EAAE,OAAO,eAAe;EAC/B,UAAU;GACR,SAAS;GACT,IAAI;GACJ,cAAc;GACd,YAAY;GACZ,UAAU;EACZ;EACA,SAAS;GACP,SAAS;GACT,GAAG;GACH,cAAc;GACd,WAAW;EACb;EACA,gBAAgB;GACd,YAAY;GACZ,aAAa;GACb,IAAI;GACJ,IAAI;GACJ,OAAO;GACP,WAAW;EACb;EACA,cAAc;GAAE,IAAI;GAAG,IAAI;EAAE;EAC7B,QAAQ,EAAE,IAAI,IAAK;EACnB,QAAQ;GACN,QAAQ;GACR,WAAW;GACX,aAAa;GACb,IAAI;EACN;EACA,WAAW;GAAE,gBAAgB;GAAY,OAAO;EAAO;EACvD,cAAc;GACZ,QAAQ;GACR,aAAa;GACb,IAAI;GACJ,IAAI;GACJ,WAAW;EACb;CACF;CACA,WAAW,EACT,IAAI,EACN;CACA,SAAS;EACP,IAAI;EACJ,IAAI;EACJ,YAAY;CACd;AACF"}
@@ -41,7 +41,7 @@ var c = "calc(100dvh - 96px)", l = {
41
41
  justifyContent: "flex-start",
42
42
  overflow: "hidden",
43
43
  width: "fit-content",
44
- "&.inline": {
44
+ "&.PsLassoTools-inline": {
45
45
  flexDirection: "column",
46
46
  alignItems: "flex-start",
47
47
  gap: ({ spacing: e }) => e(1),
@@ -63,7 +63,7 @@ var c = "calc(100dvh - 96px)", l = {
63
63
  menu: {
64
64
  "&.MuiMenu-list": { maxHeight: c },
65
65
  paddingY: ({ spacing: e }) => e(1),
66
- "&.inline": {
66
+ "&.PsLassoTools-inline": {
67
67
  boxShadow: "none",
68
68
  backgroundColor: "transparent",
69
69
  borderRadius: ({ spacing: e }) => e(.5),
@@ -106,7 +106,7 @@ var c = "calc(100dvh - 96px)", l = {
106
106
  title: {
107
107
  paddingX: ({ spacing: e }) => e(2),
108
108
  paddingBottom: ({ spacing: e }) => e(.5),
109
- "&.inline": {
109
+ "&.PsLassoTools-inline": {
110
110
  paddingX: 0,
111
111
  paddingBottom: 0
112
112
  }
@@ -131,7 +131,7 @@ var c = "calc(100dvh - 96px)", l = {
131
131
  overflowX: "auto",
132
132
  scrollbarWidth: "none",
133
133
  paddingX: ({ spacing: e }) => e(1),
134
- "&.inline": {
134
+ "&.PsLassoTools-inline": {
135
135
  overflowX: "visible",
136
136
  flexWrap: "wrap"
137
137
  }
@@ -143,4 +143,4 @@ var c = "calc(100dvh - 96px)", l = {
143
143
  //#endregion
144
144
  export { l as n, o as r, s as t };
145
145
 
146
- //# sourceMappingURL=styles-BCEBm7xh.js.map
146
+ //# sourceMappingURL=styles-yKcpfyNV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-yKcpfyNV.js","names":["{\n copyText,\n onSuccess,\n onError,\n 'aria-label': ariaLabel,\n ...props\n}: CopyButtonProps","async function onCopy() {\n try {\n await copy(copyText)\n onSuccess?.()\n } catch (err) {\n onError?.(err as Error)\n }\n }","err","() => void onCopy()","<ContentCopyOutlined fontSize='small' />","<IconButton\n size='small'\n onClick={() => void onCopy()}\n aria-label={ariaLabel ?? 'Copy'}\n {...props}\n >\n <ContentCopyOutlined fontSize='small' />\n </IconButton>","ariaLabel ?? 'Copy'","_c","err","CopyButton","$","c","ariaLabel","copyText","onError","onSuccess","props","t0","t1","copy","t2","onCopy","t3","t4","ContentCopyOutlined","t5","IconButton","mergeSx","values","entry","MENU_MAX_HEIGHT","styles","spacing","palette","alpha"],"sources":["../src/components/copy-button/copy-button.tsx","../src/components/lasso-tool/styles.ts"],"sourcesContent":["import { IconButton } from '@mui/material'\nimport { ContentCopyOutlined } from '@mui/icons-material'\nimport type { CopyButtonProps } from './types'\nimport { copy } from '@carto/ps-utils'\n\nexport function CopyButton({\n copyText,\n onSuccess,\n onError,\n 'aria-label': ariaLabel,\n ...props\n}: CopyButtonProps) {\n async function onCopy() {\n try {\n await copy(copyText)\n onSuccess?.()\n } catch (err) {\n onError?.(err as Error)\n }\n }\n return (\n <IconButton\n size='small'\n onClick={() => void onCopy()}\n aria-label={ariaLabel ?? 'Copy'}\n {...props}\n >\n <ContentCopyOutlined fontSize='small' />\n </IconButton>\n )\n}\n","import { alpha, type SxProps, type Theme } from '@mui/material'\n\ntype SxEntry = Exclude<\n NonNullable<SxProps<Theme>>,\n readonly unknown[] | boolean\n>\n\n/**\n * Merges a component's own `sx` with the caller's. Needed because `SxProps` is\n * not always an object — a function or an array is silently dropped by an\n * object spread — and MUI's array form rejects falsy entries.\n */\nexport function mergeSx(...values: (SxProps<Theme> | undefined)[]): SxEntry[] {\n return values\n .flat()\n .filter((entry): entry is SxEntry => !!entry && entry !== true)\n}\n\n/**\n * Ceiling for the options menu, replacing the design system's fixed 312px.\n * `dvh` so it follows the mobile address bar.\n *\n * The 96px gutter is MUI's own allowance, and it is not decorative: MUI's\n * Popover measures the paper mid-`Grow` (at scale 0.75), underestimates its\n * height and then fails to shift it up, so a taller ceiling overflows the\n * bottom of a short viewport and the last entries become unreachable — with a\n * 32px gutter, \"Layer filters\" landed off-screen on a 420px-tall window. This\n * leaves room for the anchor offset instead. The whole menu fits from a 511px\n * viewport up and scrolls below that.\n */\nconst MENU_MAX_HEIGHT = 'calc(100dvh - 96px)'\n\nexport const styles = {\n container: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-start',\n overflow: 'hidden',\n width: 'fit-content',\n\n '&.PsLassoTools-inline': {\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: ({ spacing }) => spacing(1),\n // Horizontal separators between compound blocks. Blocks own no\n // `<Divider flexItem />` — omitting/reordering never orphans or doubles\n // rules. Vertical Dividers inside Modes/Actions stay in those blocks.\n '& > * + *': {\n borderTop: 1,\n borderColor: 'divider',\n paddingTop: ({ spacing }) => spacing(1),\n },\n },\n },\n actions: {\n icon: {\n width: ({ spacing }) => spacing(4),\n height: ({ spacing }) => spacing(4),\n borderRadius: 0,\n '.MuiTouchRipple-ripple .MuiTouchRipple-child': {\n borderRadius: 0,\n },\n },\n },\n options: {\n // The design system caps menus and their lists at 312px (\"defined by\n // design\"), but this menu is not a plain option list — interaction mode,\n // drawing tools, selection tools and layer filters add up to 415px, so the\n // last entries fell behind an unannounced scroll. Both the paper and the\n // list carry the cap, and the DS selectors are self-qualified (0,2,0), so\n // these have to be too.\n paper: { '&.MuiMenu-paper': { maxHeight: MENU_MAX_HEIGHT } },\n menu: {\n '&.MuiMenu-list': { maxHeight: MENU_MAX_HEIGHT },\n paddingY: ({ spacing }) => spacing(1),\n '&.PsLassoTools-inline': {\n boxShadow: 'none',\n backgroundColor: 'transparent',\n borderRadius: ({ spacing }) => spacing(0.5),\n\n '& .MuiDivider-root': {\n height: ({ spacing }) => spacing(4),\n\n '&.MuiToggleButtonGroup-groupedHorizontal': {\n height: ({ spacing }) => spacing(4),\n },\n '&.MuiToggleButtonGroup-groupedVertical': {\n height: 'auto',\n width: ({ spacing }) => spacing(4),\n margin: ({ spacing }) => `${spacing(0.5, 0, 1)} !important`,\n borderRadius: '0 !important',\n },\n },\n\n '& .MuiToggleButton-sizeSmall': {\n margin: 0,\n\n '&.MuiToggleButtonGroup-grouped:not(.MuiDivider-root)': {\n margin: 0,\n },\n '& + .MuiDivider-root.MuiToggleButtonGroup-groupedHorizontal': {\n height: ({ spacing }) => spacing(3),\n },\n '& + .MuiDivider-root.MuiToggleButtonGroup-groupedVertical': {\n height: 'auto',\n width: ({ spacing }) => spacing(3),\n },\n },\n\n '.MuiToggleButtonGroup-grouped:not(.MuiDivider-root)': {\n margin: 0,\n\n '&:first-of-type': {\n marginLeft: 0,\n },\n '&:not(:last-of-type)': {\n marginRight: ({ spacing }) => spacing(0.5),\n },\n },\n '&.MuiToggleButtonGroup-horizontal:not(.MuiDivider-root)': {\n '.MuiToggleButtonGroup-grouped': {\n margin: ({ spacing }) => spacing(0, 0.5),\n },\n },\n '&.MuiToggleButtonGroup-vertical:not(.MuiDivider-root)': {\n '.MuiToggleButtonGroup-grouped': {\n margin: ({ spacing }) => spacing(0, 0, 0.5),\n\n '&:not(:last-of-type)': {\n marginRight: 0,\n },\n '&:last-of-type': {\n marginBottom: 0,\n },\n },\n },\n },\n },\n icon: {\n borderRadius: 0,\n width: ({ spacing }) => spacing(3),\n },\n title: {\n paddingX: ({ spacing }) => spacing(2),\n paddingBottom: ({ spacing }) => spacing(0.5),\n\n '&.PsLassoTools-inline': {\n paddingX: 0,\n paddingBottom: 0,\n },\n },\n icons: {\n color: ({ palette }) => palette.text.primary,\n },\n tag: {\n borderRadius: ({ spacing }) => spacing(0.25),\n border: '1px solid',\n borderColor: ({ palette }) => palette.primary.main,\n paddingX: ({ spacing }) => spacing(0.5),\n color: ({ palette }) => palette.primary.main,\n backgroundColor: ({ palette }) => alpha(palette.primary.main, 0.08),\n },\n more: {\n width: ({ spacing }) => spacing(4),\n },\n },\n chip: {\n container: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.5),\n overflowX: 'auto',\n scrollbarWidth: 'none',\n paddingX: ({ spacing }) => spacing(1),\n\n '&.PsLassoTools-inline': {\n overflowX: 'visible',\n flexWrap: 'wrap',\n },\n },\n chip: {\n marginRight: ({ spacing }) => spacing(0.5),\n },\n disabled: {\n opacity: ({ palette }) => palette.action.disabledOpacity,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { C as e, D as t, S as n, p as r } from "./stores-DcBOZlU3.js";
2
- import { f as i, n as a, t as o } from "./download-B4sykOFm.js";
2
+ import { f as i, n as a, t as o } from "./download-DIj1Iz0t.js";
3
3
  import { c as ee } from "react/compiler-runtime";
4
4
  import { Box as s, Checkbox as c, IconButton as l, Skeleton as u, Table as d, TableBody as f, TableCell as p, TableContainer as m, TableHead as h, TablePagination as g, TableRow as _, TableSortLabel as v } from "@mui/material";
5
5
  import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
@@ -431,4 +431,4 @@ function oe(e, t, n = "id") {
431
431
  //#endregion
432
432
  export { M as a, F as c, j as d, O as f, B as i, N as l, D as m, V as n, I as o, k as p, ie as r, P as s, oe as t, L as u };
433
433
 
434
- //# sourceMappingURL=table-DEdW_fDj.js.map
434
+ //# sourceMappingURL=table-Col_FRvb.js.map