@carto/ps-react-ui 4.9.1 → 4.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/category-Dnd2_j0x.js +719 -0
  2. package/dist/category-Dnd2_j0x.js.map +1 -0
  3. package/dist/change-column-BiuuHCDN.js +1156 -0
  4. package/dist/change-column-BiuuHCDN.js.map +1 -0
  5. package/dist/chat.js +1507 -0
  6. package/dist/chat.js.map +1 -0
  7. package/dist/components.js +122 -120
  8. package/dist/components.js.map +1 -1
  9. package/dist/copy-button-DGL1tyli.js +26 -0
  10. package/dist/copy-button-DGL1tyli.js.map +1 -0
  11. package/dist/{data-zoom-layout-0QSptXG_.js → data-zoom-layout--YiY6ko_.js} +4 -3
  12. package/dist/{data-zoom-layout-0QSptXG_.js.map → data-zoom-layout--YiY6ko_.js.map} +1 -1
  13. package/dist/{download-config-CzmjOT2T.js → download-config-oJIFZ2WC.js} +9 -8
  14. package/dist/{download-config-CzmjOT2T.js.map → download-config-oJIFZ2WC.js.map} +1 -1
  15. package/dist/{spread-Y9R1f5dm.js → spread-CPis22AE.js} +4 -3
  16. package/dist/{spread-Y9R1f5dm.js.map → spread-CPis22AE.js.map} +1 -1
  17. package/dist/types/chat/bubbles/chat-error-message.d.ts +2 -0
  18. package/dist/types/chat/bubbles/chat-suggestion-button.d.ts +2 -0
  19. package/dist/types/chat/bubbles/chat-user-message.d.ts +2 -0
  20. package/dist/types/chat/bubbles/index.d.ts +4 -0
  21. package/dist/types/chat/const.d.ts +4 -0
  22. package/dist/types/chat/containers/chat-content.d.ts +2 -0
  23. package/dist/types/chat/containers/chat-footer.d.ts +2 -0
  24. package/dist/types/chat/containers/chat-header.d.ts +2 -0
  25. package/dist/types/chat/containers/chat-starter.d.ts +2 -0
  26. package/dist/types/chat/containers/index.d.ts +4 -0
  27. package/dist/types/chat/containers/styles.d.ts +93 -0
  28. package/dist/types/chat/feedback/chat-loader.d.ts +2 -0
  29. package/dist/types/chat/feedback/chat-rating-action.d.ts +2 -0
  30. package/dist/types/chat/feedback/chat-thinking.d.ts +2 -0
  31. package/dist/types/chat/feedback/chat-tool-code-area.d.ts +2 -0
  32. package/dist/types/chat/feedback/chat-tool-full-view-dialog.d.ts +2 -0
  33. package/dist/types/chat/feedback/chat-tool-group.d.ts +2 -0
  34. package/dist/types/chat/feedback/chat-tool-trace.d.ts +3 -0
  35. package/dist/types/chat/feedback/get-tool-label.d.ts +2 -0
  36. package/dist/types/chat/feedback/index.d.ts +8 -0
  37. package/dist/types/chat/feedback/styles.d.ts +211 -0
  38. package/dist/types/chat/index.d.ts +20 -0
  39. package/dist/types/chat/types.d.ts +184 -0
  40. package/dist/types/chat/use-typewriter.d.ts +30 -0
  41. package/dist/types/components/copy-button/copy-button.d.ts +2 -0
  42. package/dist/types/components/copy-button/types.d.ts +6 -0
  43. package/dist/types/components/index.d.ts +2 -0
  44. package/dist/types/widgets/actions/brush-toggle/style.d.ts +1 -1
  45. package/dist/types/widgets/actions/shared/styles.d.ts +1 -1
  46. package/dist/types/widgets/actions/zoom-toggle/style.d.ts +1 -1
  47. package/dist/types/widgets/echart/types.d.ts +1 -1
  48. package/dist/types/widgets/toolbar-actions/styles.d.ts +1 -1
  49. package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +1 -1
  50. package/dist/types/widgets-v2/actions/change-column/style.d.ts +1 -1
  51. package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +1 -1
  52. package/dist/types/widgets-v2/actions/index.d.ts +1 -0
  53. package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +1 -1
  54. package/dist/types/widgets-v2/actions/relative-data/style.d.ts +1 -1
  55. package/dist/types/widgets-v2/actions/searcher/style.d.ts +1 -1
  56. package/dist/types/widgets-v2/actions/show-all/index.d.ts +2 -0
  57. package/dist/types/widgets-v2/actions/show-all/labels.d.ts +5 -0
  58. package/dist/types/widgets-v2/actions/show-all/show-all.d.ts +33 -0
  59. package/dist/types/widgets-v2/actions/show-all/style.d.ts +8 -0
  60. package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +1 -1
  61. package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +1 -1
  62. package/dist/types/widgets-v2/category/category-ui.d.ts +9 -2
  63. package/dist/types/widgets-v2/category/category.d.ts +9 -2
  64. package/dist/types/widgets-v2/category/components/category-row-other.d.ts +19 -6
  65. package/dist/types/widgets-v2/category/style.d.ts +21 -2
  66. package/dist/types/widgets-v2/category/types.d.ts +2 -0
  67. package/dist/types/widgets-v2/index.d.ts +3 -2
  68. package/dist/types/widgets-v2/selection-summary/labels.d.ts +7 -2
  69. package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +13 -6
  70. package/dist/types/widgets-v2/selection-summary/style.d.ts +15 -0
  71. package/dist/widgets/actions.js +115 -114
  72. package/dist/widgets/actions.js.map +1 -1
  73. package/dist/widgets/bar.js +1 -1
  74. package/dist/widgets/category.js +9 -8
  75. package/dist/widgets/category.js.map +1 -1
  76. package/dist/widgets/formula.js +11 -10
  77. package/dist/widgets/formula.js.map +1 -1
  78. package/dist/widgets/histogram.js +7 -6
  79. package/dist/widgets/histogram.js.map +1 -1
  80. package/dist/widgets/markdown.js +9 -8
  81. package/dist/widgets/markdown.js.map +1 -1
  82. package/dist/widgets/pie.js +1 -1
  83. package/dist/widgets/scatterplot.js +1 -1
  84. package/dist/widgets/spread.js +9 -8
  85. package/dist/widgets/spread.js.map +1 -1
  86. package/dist/widgets/table.js +17 -16
  87. package/dist/widgets/table.js.map +1 -1
  88. package/dist/widgets/timeseries.js +1 -1
  89. package/dist/widgets/utils.js +1 -1
  90. package/dist/widgets/wrapper.js +3 -2
  91. package/dist/widgets/wrapper.js.map +1 -1
  92. package/dist/widgets-v2/actions.js +41 -37
  93. package/dist/widgets-v2/bar.js +8 -7
  94. package/dist/widgets-v2/bar.js.map +1 -1
  95. package/dist/widgets-v2/category.js +22 -21
  96. package/dist/widgets-v2/category.js.map +1 -1
  97. package/dist/widgets-v2/formula.js +23 -22
  98. package/dist/widgets-v2/formula.js.map +1 -1
  99. package/dist/widgets-v2/histogram.js +10 -9
  100. package/dist/widgets-v2/histogram.js.map +1 -1
  101. package/dist/widgets-v2/markdown.js +9 -8
  102. package/dist/widgets-v2/markdown.js.map +1 -1
  103. package/dist/widgets-v2/pie.js +7 -6
  104. package/dist/widgets-v2/pie.js.map +1 -1
  105. package/dist/widgets-v2/scatterplot.js +9 -8
  106. package/dist/widgets-v2/scatterplot.js.map +1 -1
  107. package/dist/widgets-v2/spread.js +9 -8
  108. package/dist/widgets-v2/spread.js.map +1 -1
  109. package/dist/widgets-v2/table.js +16 -15
  110. package/dist/widgets-v2/table.js.map +1 -1
  111. package/dist/widgets-v2/timeseries.js +8 -7
  112. package/dist/widgets-v2/timeseries.js.map +1 -1
  113. package/dist/widgets-v2/utils.js +1 -1
  114. package/dist/widgets-v2.js +276 -271
  115. package/dist/widgets-v2.js.map +1 -1
  116. package/package.json +7 -3
  117. package/src/chat/bubbles/chat-agent-message.test.tsx +30 -0
  118. package/src/chat/bubbles/chat-agent-message.tsx +11 -0
  119. package/src/chat/bubbles/chat-error-message.test.tsx +40 -0
  120. package/src/chat/bubbles/chat-error-message.tsx +47 -0
  121. package/src/chat/bubbles/chat-suggestion-button.test.tsx +24 -0
  122. package/src/chat/bubbles/chat-suggestion-button.tsx +27 -0
  123. package/src/chat/bubbles/chat-user-message.test.tsx +27 -0
  124. package/src/chat/bubbles/chat-user-message.tsx +27 -0
  125. package/src/chat/bubbles/index.ts +4 -0
  126. package/src/chat/bubbles/styles.ts +148 -0
  127. package/src/chat/const.ts +4 -0
  128. package/src/chat/containers/chat-content.test.tsx +269 -0
  129. package/src/chat/containers/chat-content.tsx +142 -0
  130. package/src/chat/containers/chat-footer.test.tsx +34 -0
  131. package/src/chat/containers/chat-footer.tsx +78 -0
  132. package/src/chat/containers/chat-header.test.tsx +28 -0
  133. package/src/chat/containers/chat-header.tsx +29 -0
  134. package/src/chat/containers/chat-starter.test.tsx +32 -0
  135. package/src/chat/containers/chat-starter.tsx +75 -0
  136. package/src/chat/containers/index.ts +4 -0
  137. package/src/chat/containers/styles.ts +96 -0
  138. package/src/chat/feedback/chat-actions-container.test.tsx +64 -0
  139. package/src/chat/feedback/chat-actions-container.tsx +7 -0
  140. package/src/chat/feedback/chat-loader.test.tsx +10 -0
  141. package/src/chat/feedback/chat-loader.tsx +31 -0
  142. package/src/chat/feedback/chat-rating-action.tsx +43 -0
  143. package/src/chat/feedback/chat-thinking.test.tsx +15 -0
  144. package/src/chat/feedback/chat-thinking.tsx +23 -0
  145. package/src/chat/feedback/chat-tool-code-area.test.tsx +23 -0
  146. package/src/chat/feedback/chat-tool-code-area.tsx +71 -0
  147. package/src/chat/feedback/chat-tool-full-view-dialog.test.tsx +39 -0
  148. package/src/chat/feedback/chat-tool-full-view-dialog.tsx +121 -0
  149. package/src/chat/feedback/chat-tool-group.test.tsx +84 -0
  150. package/src/chat/feedback/chat-tool-group.tsx +156 -0
  151. package/src/chat/feedback/chat-tool-trace.test.tsx +81 -0
  152. package/src/chat/feedback/chat-tool-trace.tsx +192 -0
  153. package/src/chat/feedback/get-tool-label.test.tsx +91 -0
  154. package/src/chat/feedback/get-tool-label.ts +13 -0
  155. package/src/chat/feedback/index.ts +8 -0
  156. package/src/chat/feedback/styles.ts +229 -0
  157. package/src/chat/index.ts +59 -0
  158. package/src/chat/types.ts +215 -0
  159. package/src/chat/use-typewriter.test.tsx +38 -0
  160. package/src/chat/use-typewriter.ts +82 -0
  161. package/src/components/copy-button/copy-button.test.tsx +41 -0
  162. package/src/components/copy-button/copy-button.tsx +31 -0
  163. package/src/components/copy-button/types.ts +10 -0
  164. package/src/components/index.ts +3 -0
  165. package/src/widgets/echart/types.ts +1 -1
  166. package/src/widgets-v2/actions/index.ts +8 -0
  167. package/src/widgets-v2/actions/show-all/index.ts +7 -0
  168. package/src/widgets-v2/actions/show-all/labels.ts +8 -0
  169. package/src/widgets-v2/actions/show-all/show-all.test.tsx +50 -0
  170. package/src/widgets-v2/actions/show-all/show-all.tsx +72 -0
  171. package/src/widgets-v2/actions/show-all/style.ts +8 -0
  172. package/src/widgets-v2/category/category-ui.test.tsx +26 -10
  173. package/src/widgets-v2/category/category-ui.tsx +13 -3
  174. package/src/widgets-v2/category/category.test.tsx +4 -4
  175. package/src/widgets-v2/category/category.tsx +10 -1
  176. package/src/widgets-v2/category/components/category-row-other.test.tsx +36 -7
  177. package/src/widgets-v2/category/components/category-row-other.tsx +64 -13
  178. package/src/widgets-v2/category/style.ts +35 -4
  179. package/src/widgets-v2/category/types.ts +2 -0
  180. package/src/widgets-v2/index.ts +3 -0
  181. package/src/widgets-v2/selection-summary/labels.ts +8 -4
  182. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +15 -9
  183. package/src/widgets-v2/selection-summary/selection-summary.tsx +42 -22
  184. package/src/widgets-v2/selection-summary/style.ts +15 -0
  185. package/dist/category-DwaeYjpX.js +0 -656
  186. package/dist/category-DwaeYjpX.js.map +0 -1
  187. package/dist/change-column-B4IT0rh6.js +0 -1110
  188. package/dist/change-column-B4IT0rh6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"formula.js","sources":["../../src/widgets-v2/formula/skeleton.tsx","../../src/widgets-v2/formula/download.tsx"],"sourcesContent":["import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n gap: 3,\n alignItems: 'baseline',\n minHeight: 64,\n py: 1,\n },\n block: { width: 120, height: 36 },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface FormulaSkeletonProps {\n count?: number\n}\n\nexport function FormulaSkeleton({ count = 1 }: FormulaSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`row-${i}`} variant='rectangular' sx={styles.block} />\n ))}\n </Box>\n )\n}\n","import {\n CSVIcon,\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { FormulaWidgetData } from './types'\n\nexport interface FormulaDownloadConfigArgs {\n filename: string\n getData: () => FormulaWidgetData\n /**\n * Optional getter for the widget's capture element (registered by\n * `Widget.State`). When provided, a PNG item is prepended.\n */\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}\n\n/**\n * Builds download items for the Formula widget. Always includes a CSV item\n * with one row per KPI (`prefix`, `value`, `suffix`, `note`, `delta`).\n * When `getCaptureEl` is supplied, prepends a PNG item that rasterises the\n * captured element via `html2canvas`.\n */\nexport function createFormulaDownloadConfig(\n args: FormulaDownloadConfigArgs,\n): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'CSV',\n icon: <CSVIcon fontSize='small' />,\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = [\n ['series', 'prefix', 'value', 'suffix', 'note', 'delta'],\n ]\n for (const d of data) {\n rows.push([\n d.series?.name ?? '',\n d.prefix ?? '',\n d.value,\n d.suffix ?? '',\n d.note ?? '',\n d.delta?.value ?? '',\n ])\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["styles","root","display","gap","alignItems","minHeight","py","block","width","height","FormulaSkeleton","t0","$","_c","count","t1","undefined","t2","Box","Array","from","length","map","_temp","_","i","jsx","Skeleton","createFormulaDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","backgroundColor","pngBackgroundColor","id","label","icon","CSVIcon","resolve","data","getData","rows","d","series","name","prefix","value","suffix","note","delta","handle","downloadToCSV","Promise","url","revoke"],"mappings":";;;;;;;;;;;;AAGA,MAAMA,IAAS;AAAA,EACbC,MAAM;AAAA,IACJC,SAAS;AAAA,IACTC,KAAK;AAAA,IACLC,YAAY;AAAA,IACZC,WAAW;AAAA,IACXC,IAAI;AAAA,EAAA;AAAA,EAENC,OAAO;AAAA,IAAEC,OAAO;AAAA,IAAKC,QAAQ;AAAA,EAAA;AAC/B;AAMO,SAAAC,EAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAyB;AAAA,IAAAC,OAAAC;AAAAA,EAAAA,IAAAJ,GAAEG,IAAAC,MAAAC,SAAA,IAAAD;AAAS,MAAAE;AAAA,SAAAL,SAAAE,KAEvCG,sBAACC,GAAA,EAAQ,IAAAlB,EAAMC,MACZkB,gBAAKC,KAAM;AAAA,IAAAC,QAAUP;AAAAA,EAAAA,CAAO,EAACQ,IAAKC,CAElC,GACH,GAAMX,OAAAE,GAAAF,OAAAK,KAAAA,IAAAL,EAAA,CAAA,GAJNK;AAIM;AANH,SAAAM,EAAAC,GAAAC,GAAA;AAAA,SAIC,gBAAAC,EAACC,KAAkC,SAAA,eAAkB,IAAA3B,EAAMO,MAAAA,GAA5C,OAAOkB,CAAC,EAA0C;AAAI;ACItE,SAASG,EACdC,GACgB;AAChB,QAAMC,IAAwB,CAAA;AAC9B,SAAID,EAAKE,gBACPD,EAAME,KACJC,EAAqB;AAAA,IACnBC,UAAUL,EAAKK;AAAAA,IACfH,cAAcF,EAAKE;AAAAA,IACnBI,YAAYN,EAAKO;AAAAA,IACjBC,iBAAiBR,EAAKS;AAAAA,EAAAA,CACvB,CACH,GAEFR,EAAME,KAAK;AAAA,IACTO,IAAI;AAAA,IACJC,OAAO;AAAA,IACPC,MAAM,gBAAAf,EAACgB,GAAA,EAAQ,UAAS,QAAA,CAAO;AAAA,IAC/BC,SAASA,MAAM;AACb,YAAMC,IAAOf,EAAKgB,QAAAA,GACZC,IAAoB,CACxB,CAAC,UAAU,UAAU,SAAS,UAAU,QAAQ,OAAO,CAAC;AAE1D,iBAAWC,KAAKH;AACdE,QAAAA,EAAKd,KAAK,CACRe,EAAEC,QAAQC,QAAQ,IAClBF,EAAEG,UAAU,IACZH,EAAEI,OACFJ,EAAEK,UAAU,IACZL,EAAEM,QAAQ,IACVN,EAAEO,OAAOH,SAAS,EAAE,CACrB;AAEH,YAAMI,IAASC,EAAcV,CAAI;AACjC,aAAOW,QAAQd,QAAQ;AAAA,QACrBe,KAAKH,EAAOG;AAAAA,QACZxB,UAAU,GAAGL,EAAKK,QAAQ;AAAA,QAC1ByB,QAAQJ,EAAOI;AAAAA,MAAAA,CAChB;AAAA,IACH;AAAA,EAAA,CACD,GACM7B;AACT;"}
1
+ {"version":3,"file":"formula.js","sources":["../../src/widgets-v2/formula/skeleton.tsx","../../src/widgets-v2/formula/download.tsx"],"sourcesContent":["import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n gap: 3,\n alignItems: 'baseline',\n minHeight: 64,\n py: 1,\n },\n block: { width: 120, height: 36 },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface FormulaSkeletonProps {\n count?: number\n}\n\nexport function FormulaSkeleton({ count = 1 }: FormulaSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`row-${i}`} variant='rectangular' sx={styles.block} />\n ))}\n </Box>\n )\n}\n","import {\n CSVIcon,\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { FormulaWidgetData } from './types'\n\nexport interface FormulaDownloadConfigArgs {\n filename: string\n getData: () => FormulaWidgetData\n /**\n * Optional getter for the widget's capture element (registered by\n * `Widget.State`). When provided, a PNG item is prepended.\n */\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}\n\n/**\n * Builds download items for the Formula widget. Always includes a CSV item\n * with one row per KPI (`prefix`, `value`, `suffix`, `note`, `delta`).\n * When `getCaptureEl` is supplied, prepends a PNG item that rasterises the\n * captured element via `html2canvas`.\n */\nexport function createFormulaDownloadConfig(\n args: FormulaDownloadConfigArgs,\n): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'CSV',\n icon: <CSVIcon fontSize='small' />,\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = [\n ['series', 'prefix', 'value', 'suffix', 'note', 'delta'],\n ]\n for (const d of data) {\n rows.push([\n d.series?.name ?? '',\n d.prefix ?? '',\n d.value,\n d.suffix ?? '',\n d.note ?? '',\n d.delta?.value ?? '',\n ])\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["styles","root","display","gap","alignItems","minHeight","py","block","width","height","FormulaSkeleton","t0","$","_c","count","t1","undefined","t2","Box","Array","from","length","map","_temp","_","i","jsx","Skeleton","createFormulaDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","backgroundColor","pngBackgroundColor","id","label","icon","CSVIcon","resolve","data","getData","rows","d","series","name","prefix","value","suffix","note","delta","handle","downloadToCSV","Promise","url","revoke"],"mappings":";;;;;;;;;;;;;AAGA,MAAMA,IAAS;AAAA,EACbC,MAAM;AAAA,IACJC,SAAS;AAAA,IACTC,KAAK;AAAA,IACLC,YAAY;AAAA,IACZC,WAAW;AAAA,IACXC,IAAI;AAAA,EAAA;AAAA,EAENC,OAAO;AAAA,IAAEC,OAAO;AAAA,IAAKC,QAAQ;AAAA,EAAA;AAC/B;AAMO,SAAAC,EAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAyB;AAAA,IAAAC,OAAAC;AAAAA,EAAAA,IAAAJ,GAAEG,IAAAC,MAAAC,SAAA,IAAAD;AAAS,MAAAE;AAAA,SAAAL,SAAAE,KAEvCG,sBAACC,GAAA,EAAQ,IAAAlB,EAAMC,MACZkB,gBAAKC,KAAM;AAAA,IAAAC,QAAUP;AAAAA,EAAAA,CAAO,EAACQ,IAAKC,CAElC,GACH,GAAMX,OAAAE,GAAAF,OAAAK,KAAAA,IAAAL,EAAA,CAAA,GAJNK;AAIM;AANH,SAAAM,EAAAC,GAAAC,GAAA;AAAA,SAIC,gBAAAC,EAACC,KAAkC,SAAA,eAAkB,IAAA3B,EAAMO,MAAAA,GAA5C,OAAOkB,CAAC,EAA0C;AAAI;ACItE,SAASG,EACdC,GACgB;AAChB,QAAMC,IAAwB,CAAA;AAC9B,SAAID,EAAKE,gBACPD,EAAME,KACJC,EAAqB;AAAA,IACnBC,UAAUL,EAAKK;AAAAA,IACfH,cAAcF,EAAKE;AAAAA,IACnBI,YAAYN,EAAKO;AAAAA,IACjBC,iBAAiBR,EAAKS;AAAAA,EAAAA,CACvB,CACH,GAEFR,EAAME,KAAK;AAAA,IACTO,IAAI;AAAA,IACJC,OAAO;AAAA,IACPC,MAAM,gBAAAf,EAACgB,GAAA,EAAQ,UAAS,QAAA,CAAO;AAAA,IAC/BC,SAASA,MAAM;AACb,YAAMC,IAAOf,EAAKgB,QAAAA,GACZC,IAAoB,CACxB,CAAC,UAAU,UAAU,SAAS,UAAU,QAAQ,OAAO,CAAC;AAE1D,iBAAWC,KAAKH;AACdE,QAAAA,EAAKd,KAAK,CACRe,EAAEC,QAAQC,QAAQ,IAClBF,EAAEG,UAAU,IACZH,EAAEI,OACFJ,EAAEK,UAAU,IACZL,EAAEM,QAAQ,IACVN,EAAEO,OAAOH,SAAS,EAAE,CACrB;AAEH,YAAMI,IAASC,EAAcV,CAAI;AACjC,aAAOW,QAAQd,QAAQ;AAAA,QACrBe,KAAKH,EAAOG;AAAAA,QACZxB,UAAU,GAAGL,EAAKK,QAAQ;AAAA,QAC1ByB,QAAQJ,EAAOI;AAAAA,MAAAA,CAChB;AAAA,IACH;AAAA,EAAA,CACD,GACM7B;AACT;"}
@@ -10,6 +10,7 @@ import "react";
10
10
  import "html2canvas";
11
11
  import "../lasso-tool-CDFj4zKY.js";
12
12
  import "../cjs-D4KH3azB.js";
13
+ import "@carto/ps-utils";
13
14
  import "@dnd-kit/core";
14
15
  import "@dnd-kit/sortable";
15
16
  import "@dnd-kit/utilities";
@@ -22,7 +23,7 @@ import "zustand/middleware";
22
23
  import "zustand/react/shallow";
23
24
  import { Z as O } from "../transforms-Cdx4fkU5.js";
24
25
  import { m as q, r as U } from "../resolve-theme-color-BdojIw0K.js";
25
- import { p as J } from "../data-zoom-layout-0QSptXG_.js";
26
+ import { p as J } from "../data-zoom-layout--YiY6ko_.js";
26
27
  import "@mui/icons-material/FileDownload";
27
28
  import { a as K } from "../exports-Cx-f6m6U.js";
28
29
  import "@mui/icons-material/ImageOutlined";
@@ -116,7 +117,7 @@ function X({
116
117
  }
117
118
  };
118
119
  }
119
- function _e(e) {
120
+ function $e(e) {
120
121
  const {
121
122
  theme: t,
122
123
  formatter: a,
@@ -272,7 +273,7 @@ const w = {
272
273
  height: `${e}%`,
273
274
  minWidth: 8
274
275
  });
275
- function $e(e) {
276
+ function je(e) {
276
277
  const t = Y(15), {
277
278
  bins: a
278
279
  } = e, o = a === void 0 ? 12 : a;
@@ -306,7 +307,7 @@ function re(e) {
306
307
  function oe(e, t) {
307
308
  return /* @__PURE__ */ b(k, { variant: "rectangular", sx: te(e) }, `bar-${t}`);
308
309
  }
309
- function je(e) {
310
+ function De(e) {
310
311
  const t = [];
311
312
  return e.getCaptureEl && t.push(Q({
312
313
  filename: e.filename,
@@ -335,7 +336,7 @@ function je(e) {
335
336
  }
336
337
  }), t;
337
338
  }
338
- const De = (e) => Array.isArray(e) ? e.map((t) => {
339
+ const He = (e) => Array.isArray(e) ? e.map((t) => {
339
340
  if (!ie(t)) return t;
340
341
  const a = t.reduce((o, i) => o + Math.abs(i), 0);
341
342
  return a <= 0 ? t : t.map((o) => o / a * 100);
@@ -344,10 +345,10 @@ function ie(e) {
344
345
  return Array.isArray(e) ? e.every((t) => typeof t == "number" && Number.isFinite(t)) : !1;
345
346
  }
346
347
  export {
347
- $e as HistogramSkeleton,
348
- je as createHistogramDownloadConfig,
349
- _e as createHistogramOptionFactory,
348
+ je as HistogramSkeleton,
349
+ De as createHistogramDownloadConfig,
350
+ $e as createHistogramOptionFactory,
350
351
  X as histogramOptions,
351
- De as toRelativeHistogramData
352
+ He as toRelativeHistogramData
352
353
  };
353
354
  //# sourceMappingURL=histogram.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"histogram.js","sources":["../../src/widgets-v2/histogram/options.ts","../../src/widgets-v2/histogram/skeleton.tsx","../../src/widgets-v2/histogram/download.ts","../../src/widgets-v2/histogram/transforms.ts"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport { ZOOM_LAYOUT } from '../actions/zoom-toggle'\nimport type { OptionFactory } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n HistogramEChartsOption,\n HistogramOptionFactoryInput,\n HistogramOptionsInput,\n HistogramWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a histogram widget — axes,\n * grid, tooltip, value-axis label formatter, themed legend. Mirrors\n * {@link import('../bar/options').barOptions} so the two widgets share v1\n * look-and-feel: themed dark tooltip with positioner, CARTO color palette,\n * structural legend (`show` toggled by the merger based on series count),\n * y-axis labels rendered inside the plot via the `niceNum` closure pattern.\n *\n * Intentional deviations from bar (histogram-specific):\n * - **No `xAxis.axisLabel.formatter`.** Bin labels are pre-formatted in\n * the merger via `formatNumber(lo)–formatNumber(hi)` and optionally\n * the consumer's `labelFormatter`. The strings on the axis are\n * already display-ready, so there's nothing to post-format here.\n * - **Tooltip formatter reads the array-tuple row shape.** The dataset\n * uses positional `encode: { x: 0, y: 1 }`, so `item.value` comes in\n * as `[binLabel, count]` rather than bar's `{ name, value }` object.\n *\n * Intentionally data-agnostic: no series, no dataset, no x-axis category\n * data (those depend on data + ticks and are added by the option factory's\n * merge phase via {@link createHistogramOptionFactory}).\n */\nexport function histogramOptions({\n theme,\n formatter,\n}: HistogramOptionsInput): HistogramEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1 + bar).\n let niceMin = 0\n let niceMax = 1\n\n return {\n grid: {\n left: parseInt(theme.spacing(1)),\n top: parseInt(theme.spacing(3)),\n right: parseInt(theme.spacing(1)),\n // Default: no legend. Merger bumps this when there are >1 series.\n ...buildGridConfig(false, theme),\n containLabel: true,\n },\n tooltip: {\n trigger: 'axis',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n axisPointer: { type: 'line' },\n position: createTooltipPositioner(theme),\n formatter: buildHistogramTooltipFormatter(formatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count. Histogram doesn't accept `labelFormatter` at the\n // options layer (bin labels are pre-formatted in the merger), so we\n // skip the legend `labelFormatter` argument too.\n legend: {\n ...buildLegendConfig({ hasLegend: false }),\n },\n axisPointer: { lineStyle: { color: theme.palette.grey[400] } },\n color: [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n xAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n margin: 0,\n hideOverlap: true,\n },\n },\n yAxis: {\n type: 'value',\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n show: true,\n showMaxLabel: true,\n showMinLabel: true,\n verticalAlign: 'bottom',\n inside: true,\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n } as HistogramEChartsOption\n}\n\n/**\n * Returns the histogram widget's {@link OptionFactory} — one closure that\n * owns BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link histogramOptions}, optionally merging\n * the consumer-supplied `optionsOverride`. Called once by Provider to\n * seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`HistogramWidgetData` — `number[][]`) into the option via the\n * dataset API. Each series gets its own dataset of `[binLabel, count]`\n * pairs derived from `ticks`; series reference their dataset by\n * `datasetIndex` and are encoded by column position. Reactive\n * `ctx.formatter` (driven by RelativeData → `%`) plus `niceMin`/`niceMax`\n * are re-derived here so the y-axis label formatter and the tooltip\n * pick up live store values, mirroring bar.\n */\nexport function createHistogramOptionFactory(\n options: HistogramOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, ticks, series, labelFormatter, selection } = options\n const optionsOverride = options.optionsOverride\n const selectionSet =\n selection && selection.length > 0 ? new Set<number>(selection) : null\n\n const binLabels: string[] = []\n for (let i = 0; i < ticks.length - 1; i++) {\n const lo = ticks[i]!\n const hi = ticks[i + 1]!\n const raw = `${formatNumber(lo)}–${formatNumber(hi)}`\n binLabels.push(labelFormatter ? labelFormatter(raw) : raw)\n }\n\n return (option, data, ctx) => {\n if (option == null) {\n const structural = histogramOptions({ theme, formatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr: HistogramWidgetData = Array.isArray(data)\n ? (data as HistogramWidgetData)\n : []\n if (seriesArr.length === 0 || binLabels.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n\n const hasLegend = seriesArr.length > 1\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n // Reactive (live store) formatter from ctx — distinct from the\n // closure-time `formatter` captured for the structural-build branch\n // above. RelativeData can install a percent formatter on the store\n // after the factory was constructed; the merge phase reads `ctx` to\n // pick that up.\n const liveFormatter = ctx?.formatter\n\n const { niceMinVal, niceMaxVal } = computeHistogramNiceBounds(seriesArr)\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push\n // the slider above the legend (if any) and reserve room in the grid.\n const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)\n const fallbackBottom =\n typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24\n const baseBottom = hasLegend ? 56 : fallbackBottom\n const gridBottom = dataZoomLayout\n ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap\n : baseBottom\n\n // Dim non-selected bins via `series.itemStyle.color`. Per-row\n // `itemStyle` on dataset sources is silently ignored when\n // `series.encode` is in play.\n //\n // We *always* emit `itemStyle.color` (a passthrough when nothing is\n // selected), not conditionally — dropping the key between renders\n // would let ECharts' default merge keep the previous callback alive\n // and bins would stay dimmed forever after an external clear. Always\n // emitting lets normal merge swap the callback in place, no\n // `replaceMerge` and no entry-animation flash on selection on/off.\n const dimItemStyle = {\n color: (params: CallbackDataParams) => {\n const base = params.color as string\n if (!selectionSet) return base\n return selectionSet.has(params.dataIndex)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n },\n }\n\n return {\n ...option,\n dataset: seriesArr.map((counts) => ({\n source: binLabels.map(\n (label, i) => [label, counts[i] ?? 0] as [string, number],\n ),\n })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 0, y: 1 },\n barCategoryGap: '0%',\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: { ...baseGrid, bottom: gridBottom },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: niceMinVal,\n max: niceMaxVal,\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return liveFormatter ? liveFormatter(value) : String(value)\n },\n },\n } as EChartsOption['yAxis'],\n tooltip: {\n ...baseTooltip,\n formatter: buildHistogramTooltipFormatter(liveFormatter),\n },\n } as EChartsOption\n }\n}\n\n/**\n * Tooltip formatter for the histogram's positional `[binLabel, count]`\n * row shape. ECharts surfaces the x-axis category through `item.name`\n * (already pre-formatted by the bin-label generator), and `item.value`\n * comes in as the array tuple — distinct from bar's `{ name, value }`\n * object row.\n */\nfunction buildHistogramTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as [string, number] | undefined\n const raw = row?.[1]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n return {\n name: String(item.name ?? ''),\n seriesName,\n marker,\n value: formattedValue,\n }\n })\n}\n\nfunction computeHistogramNiceBounds(seriesArr: HistogramWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let max = -Infinity\n for (const counts of seriesArr) {\n for (const v of counts) {\n if (typeof v !== 'number' || !Number.isFinite(v)) continue\n if (v > max) max = v\n }\n }\n return {\n niceMinVal: 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\nfunction formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n)\n return Number(n.toFixed(2)).toString()\n}\n","import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n grid: {\n display: 'flex',\n alignItems: 'flex-end',\n flex: '1 1 auto',\n gap: 0.5,\n width: '100%',\n },\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n height: ({ spacing }) => spacing(5),\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(1.5),\n },\n} satisfies Record<string, SxProps<Theme>>\n\nconst barSx = (height: number): SxProps<Theme> => ({\n flex: 1,\n height: `${height}%`,\n minWidth: 8,\n})\n\nexport interface HistogramSkeletonProps {\n bins?: number\n}\n\n/**\n * Loading state for the Histogram widget. Mirrors Bar's skeleton structure\n * — a grid of bars (bin-shaped silhouette, anchored to the bottom) plus a\n * legend stub — so the placeholder reads consistently with Bar.\n */\nexport function HistogramSkeleton({ bins = 12 }: HistogramSkeletonProps) {\n // Sample heights mimicking a typical bell-shaped distribution.\n const heights = Array.from({ length: bins }, (_, i) => {\n const t = i / Math.max(1, bins - 1)\n return Math.round(20 + 80 * Math.exp(-((t - 0.5) ** 2) * 8))\n })\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {heights.map((h, i) => (\n <Skeleton key={`bar-${i}`} variant='rectangular' sx={barSx(h)} />\n ))}\n </Box>\n <Box sx={styles.legend}>\n {[0, 1].map((i) => (\n <Box key={`legend-${i}`} sx={styles.legendItem}>\n <Skeleton variant='circular' width={8} height={8} />\n <Skeleton width={48} height={8} />\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { HistogramWidgetData } from './types'\n\n/**\n * Download menu items for histograms. Always includes a CSV item with\n * `bin_low, bin_high, series_1_count, series_2_count, …` columns (one row\n * per bin). When `getCaptureEl` is supplied, prepends a PNG item that\n * rasterises the captured element via `html2canvas`.\n */\nexport function createHistogramDownloadConfig(args: {\n filename: string\n getData: () => HistogramWidgetData\n getTicks: () => readonly number[]\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'Download as CSV',\n resolve: () => {\n const data = args.getData()\n const ticks = args.getTicks()\n const seriesCount = data.length\n const header: unknown[] = ['bin_low', 'bin_high']\n for (let i = 0; i < seriesCount; i++) {\n header.push(args.seriesNames?.[i] ?? `series_${i + 1}`)\n }\n const rows: unknown[][] = [header]\n for (let bin = 0; bin < Math.max(0, ticks.length - 1); bin++) {\n const row: unknown[] = [ticks[bin], ticks[bin + 1]]\n for (let s = 0; s < seriesCount; s++) row.push(data[s]?.[bin] ?? 0)\n rows.push(row)\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n","/**\n * Histogram-specific `RelativeData` transform. Histogram data is\n * `number[][]` — each series is a flat list of bin counts. This\n * rewrites each count to its share of the series total (0–100), so\n * pairing with `createPercentFormatter` renders the y-axis as\n * percentages.\n *\n * Pass to `<Widget.RelativeData transform={toRelativeHistogramData} />`.\n *\n * The denominator is the sum of |value| across the series so mixed-sign\n * inputs produce sane signed shares-of-magnitude. A series whose total\n * magnitude is zero (all-zero or empty input) is returned unchanged so\n * a stalled or empty data set doesn't show misleading 0% values. Inputs\n * whose shape isn't `number[][]` fall through untouched (same defensive\n * shape-check pattern as the default transform).\n */\nexport const toRelativeHistogramData = (input: unknown): unknown => {\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!isFlatNumberArray(series)) return series\n const total = series.reduce((acc, v) => acc + Math.abs(v), 0)\n if (total <= 0) return series\n return series.map((v) => (v / total) * 100)\n })\n}\n\nfunction isFlatNumberArray(v: unknown): v is number[] {\n if (!Array.isArray(v)) return false\n return v.every((item) => typeof item === 'number' && Number.isFinite(item))\n}\n"],"names":["histogramOptions","theme","formatter","niceMin","niceMax","grid","left","parseInt","spacing","top","right","buildGridConfig","containLabel","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","textStyle","color","common","white","fontSize","fontFamily","typography","caption","axisPointer","type","position","createTooltipPositioner","buildHistogramTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","String","createHistogramOptionFactory","options","ticks","series","labelFormatter","selection","optionsOverride","selectionSet","length","Set","binLabels","i","lo","hi","raw","formatNumber","push","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","seriesTemplates","broadcastTemplate","baseYAxis","baseGrid","baseTooltip","baseLegend","liveFormatter","niceMinVal","niceMaxVal","computeHistogramNiceBounds","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","has","dataIndex","echarts","modifyAlpha","map","counts","source","label","_","template","overrideColor","resolveThemeColor","datasetIndex","name","encode","x","y","barCategoryGap","emphasis","focus","itemStyle","createTooltipFormatter","item","formattedValue","marker","seriesName","v","Number","isFinite","n","isInteger","toFixed","toString","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","legendItem","barSx","minWidth","HistogramSkeleton","t0","$","_c","bins","t1","undefined","T0","T1","t2","t3","t4","heights","from","t","Math","round","exp","Box","_temp","t5","jsx","t6","Symbol","for","_temp2","t7","i_1","jsxs","Skeleton","h","i_0","createHistogramDownloadConfig","args","items","getCaptureEl","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","getTicks","seriesCount","header","seriesNames","rows","bin","row","s","handle","downloadToCSV","Promise","url","revoke","toRelativeHistogramData","input","isFlatNumberArray","total","reduce","acc","abs","every"],"mappings":"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"}
1
+ {"version":3,"file":"histogram.js","sources":["../../src/widgets-v2/histogram/options.ts","../../src/widgets-v2/histogram/skeleton.tsx","../../src/widgets-v2/histogram/download.ts","../../src/widgets-v2/histogram/transforms.ts"],"sourcesContent":["import type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport { ZOOM_LAYOUT } from '../actions/zoom-toggle'\nimport type { OptionFactory } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport { positionDataZoomForLegend } from '../utils/data-zoom-layout'\nimport type {\n HistogramEChartsOption,\n HistogramOptionFactoryInput,\n HistogramOptionsInput,\n HistogramWidgetData,\n} from './types'\n\n/**\n * Builds the **structural** ECharts option for a histogram widget — axes,\n * grid, tooltip, value-axis label formatter, themed legend. Mirrors\n * {@link import('../bar/options').barOptions} so the two widgets share v1\n * look-and-feel: themed dark tooltip with positioner, CARTO color palette,\n * structural legend (`show` toggled by the merger based on series count),\n * y-axis labels rendered inside the plot via the `niceNum` closure pattern.\n *\n * Intentional deviations from bar (histogram-specific):\n * - **No `xAxis.axisLabel.formatter`.** Bin labels are pre-formatted in\n * the merger via `formatNumber(lo)–formatNumber(hi)` and optionally\n * the consumer's `labelFormatter`. The strings on the axis are\n * already display-ready, so there's nothing to post-format here.\n * - **Tooltip formatter reads the array-tuple row shape.** The dataset\n * uses positional `encode: { x: 0, y: 1 }`, so `item.value` comes in\n * as `[binLabel, count]` rather than bar's `{ name, value }` object.\n *\n * Intentionally data-agnostic: no series, no dataset, no x-axis category\n * data (those depend on data + ticks and are added by the option factory's\n * merge phase via {@link createHistogramOptionFactory}).\n */\nexport function histogramOptions({\n theme,\n formatter,\n}: HistogramOptionsInput): HistogramEChartsOption {\n // Closure shared between yAxis min/max callbacks and the label formatter,\n // so only the rounded extents are labelled (matches v1 + bar).\n let niceMin = 0\n let niceMax = 1\n\n return {\n grid: {\n left: parseInt(theme.spacing(1)),\n top: parseInt(theme.spacing(3)),\n right: parseInt(theme.spacing(1)),\n // Default: no legend. Merger bumps this when there are >1 series.\n ...buildGridConfig(false, theme),\n containLabel: true,\n },\n tooltip: {\n trigger: 'axis',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n axisPointer: { type: 'line' },\n position: createTooltipPositioner(theme),\n formatter: buildHistogramTooltipFormatter(formatter),\n },\n // Legend styling baked here; `show` is toggled by the merger based on\n // series count. Histogram doesn't accept `labelFormatter` at the\n // options layer (bin labels are pre-formatted in the merger), so we\n // skip the legend `labelFormatter` argument too.\n legend: {\n ...buildLegendConfig({ hasLegend: false }),\n },\n axisPointer: { lineStyle: { color: theme.palette.grey[400] } },\n color: [\n theme.palette.secondary.main,\n ...Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n ],\n xAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n margin: 0,\n hideOverlap: true,\n },\n },\n yAxis: {\n type: 'value',\n min: (extent: { min: number }) => {\n niceMin = extent.min < 0 ? niceNum(extent.min) : 0\n return niceMin\n },\n max: (extent: { min: number; max: number }) => {\n niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)\n return niceMax\n },\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n show: true,\n showMaxLabel: true,\n showMinLabel: true,\n verticalAlign: 'bottom',\n inside: true,\n formatter: (value: number) => {\n if (value !== niceMax && value !== niceMin) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n } as HistogramEChartsOption\n}\n\n/**\n * Returns the histogram widget's {@link OptionFactory} — one closure that\n * owns BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link histogramOptions}, optionally merging\n * the consumer-supplied `optionsOverride`. Called once by Provider to\n * seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`HistogramWidgetData` — `number[][]`) into the option via the\n * dataset API. Each series gets its own dataset of `[binLabel, count]`\n * pairs derived from `ticks`; series reference their dataset by\n * `datasetIndex` and are encoded by column position. Reactive\n * `ctx.formatter` (driven by RelativeData → `%`) plus `niceMin`/`niceMax`\n * are re-derived here so the y-axis label formatter and the tooltip\n * pick up live store values, mirroring bar.\n */\nexport function createHistogramOptionFactory(\n options: HistogramOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, ticks, series, labelFormatter, selection } = options\n const optionsOverride = options.optionsOverride\n const selectionSet =\n selection && selection.length > 0 ? new Set<number>(selection) : null\n\n const binLabels: string[] = []\n for (let i = 0; i < ticks.length - 1; i++) {\n const lo = ticks[i]!\n const hi = ticks[i + 1]!\n const raw = `${formatNumber(lo)}–${formatNumber(hi)}`\n binLabels.push(labelFormatter ? labelFormatter(raw) : raw)\n }\n\n return (option, data, ctx) => {\n if (option == null) {\n const structural = histogramOptions({ theme, formatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr: HistogramWidgetData = Array.isArray(data)\n ? (data as HistogramWidgetData)\n : []\n if (seriesArr.length === 0 || binLabels.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n\n const hasLegend = seriesArr.length > 1\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseYAxis =\n typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)\n ? option.yAxis\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n // Reactive (live store) formatter from ctx — distinct from the\n // closure-time `formatter` captured for the structural-build branch\n // above. RelativeData can install a percent formatter on the store\n // after the factory was constructed; the merge phase reads `ctx` to\n // pick that up.\n const liveFormatter = ctx?.formatter\n\n const { niceMinVal, niceMaxVal } = computeHistogramNiceBounds(seriesArr)\n\n // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push\n // the slider above the legend (if any) and reserve room in the grid.\n const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)\n const fallbackBottom =\n typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24\n const baseBottom = hasLegend ? 56 : fallbackBottom\n const gridBottom = dataZoomLayout\n ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap\n : baseBottom\n\n // Dim non-selected bins via `series.itemStyle.color`. Per-row\n // `itemStyle` on dataset sources is silently ignored when\n // `series.encode` is in play.\n //\n // We *always* emit `itemStyle.color` (a passthrough when nothing is\n // selected), not conditionally — dropping the key between renders\n // would let ECharts' default merge keep the previous callback alive\n // and bins would stay dimmed forever after an external clear. Always\n // emitting lets normal merge swap the callback in place, no\n // `replaceMerge` and no entry-animation flash on selection on/off.\n const dimItemStyle = {\n color: (params: CallbackDataParams) => {\n const base = params.color as string\n if (!selectionSet) return base\n return selectionSet.has(params.dataIndex)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n },\n }\n\n return {\n ...option,\n dataset: seriesArr.map((counts) => ({\n source: binLabels.map(\n (label, i) => [label, counts[i] ?? 0] as [string, number],\n ),\n })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n ...(typeof template === 'object' ? template : {}),\n type: 'bar' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n encode: { x: 0, y: 1 },\n barCategoryGap: '0%',\n emphasis: { focus: 'series' },\n itemStyle: dimItemStyle,\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n legend: { ...baseLegend, show: hasLegend },\n grid: { ...baseGrid, bottom: gridBottom },\n ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),\n yAxis: {\n ...baseYAxis,\n min: niceMinVal,\n max: niceMaxVal,\n axisLabel: {\n ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return liveFormatter ? liveFormatter(value) : String(value)\n },\n },\n } as EChartsOption['yAxis'],\n tooltip: {\n ...baseTooltip,\n formatter: buildHistogramTooltipFormatter(liveFormatter),\n },\n } as EChartsOption\n }\n}\n\n/**\n * Tooltip formatter for the histogram's positional `[binLabel, count]`\n * row shape. ECharts surfaces the x-axis category through `item.name`\n * (already pre-formatted by the bin-label generator), and `item.value`\n * comes in as the array tuple — distinct from bar's `{ name, value }`\n * object row.\n */\nfunction buildHistogramTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const row = item.value as [string, number] | undefined\n const raw = row?.[1]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n return {\n name: String(item.name ?? ''),\n seriesName,\n marker,\n value: formattedValue,\n }\n })\n}\n\nfunction computeHistogramNiceBounds(seriesArr: HistogramWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let max = -Infinity\n for (const counts of seriesArr) {\n for (const v of counts) {\n if (typeof v !== 'number' || !Number.isFinite(v)) continue\n if (v > max) max = v\n }\n }\n return {\n niceMinVal: 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\nfunction formatNumber(n: number): string {\n if (Number.isInteger(n)) return String(n)\n return Number(n.toFixed(2)).toString()\n}\n","import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n height: ({ spacing }) => spacing(38),\n },\n grid: {\n display: 'flex',\n alignItems: 'flex-end',\n flex: '1 1 auto',\n gap: 0.5,\n width: '100%',\n },\n legend: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n height: ({ spacing }) => spacing(5),\n },\n legendItem: {\n display: 'flex',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(1.5),\n },\n} satisfies Record<string, SxProps<Theme>>\n\nconst barSx = (height: number): SxProps<Theme> => ({\n flex: 1,\n height: `${height}%`,\n minWidth: 8,\n})\n\nexport interface HistogramSkeletonProps {\n bins?: number\n}\n\n/**\n * Loading state for the Histogram widget. Mirrors Bar's skeleton structure\n * — a grid of bars (bin-shaped silhouette, anchored to the bottom) plus a\n * legend stub — so the placeholder reads consistently with Bar.\n */\nexport function HistogramSkeleton({ bins = 12 }: HistogramSkeletonProps) {\n // Sample heights mimicking a typical bell-shaped distribution.\n const heights = Array.from({ length: bins }, (_, i) => {\n const t = i / Math.max(1, bins - 1)\n return Math.round(20 + 80 * Math.exp(-((t - 0.5) ** 2) * 8))\n })\n return (\n <Box sx={styles.container}>\n <Box sx={styles.grid}>\n {heights.map((h, i) => (\n <Skeleton key={`bar-${i}`} variant='rectangular' sx={barSx(h)} />\n ))}\n </Box>\n <Box sx={styles.legend}>\n {[0, 1].map((i) => (\n <Box key={`legend-${i}`} sx={styles.legendItem}>\n <Skeleton variant='circular' width={8} height={8} />\n <Skeleton width={48} height={8} />\n </Box>\n ))}\n </Box>\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { HistogramWidgetData } from './types'\n\n/**\n * Download menu items for histograms. Always includes a CSV item with\n * `bin_low, bin_high, series_1_count, series_2_count, …` columns (one row\n * per bin). When `getCaptureEl` is supplied, prepends a PNG item that\n * rasterises the captured element via `html2canvas`.\n */\nexport function createHistogramDownloadConfig(args: {\n filename: string\n getData: () => HistogramWidgetData\n getTicks: () => readonly number[]\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'Download as CSV',\n resolve: () => {\n const data = args.getData()\n const ticks = args.getTicks()\n const seriesCount = data.length\n const header: unknown[] = ['bin_low', 'bin_high']\n for (let i = 0; i < seriesCount; i++) {\n header.push(args.seriesNames?.[i] ?? `series_${i + 1}`)\n }\n const rows: unknown[][] = [header]\n for (let bin = 0; bin < Math.max(0, ticks.length - 1); bin++) {\n const row: unknown[] = [ticks[bin], ticks[bin + 1]]\n for (let s = 0; s < seriesCount; s++) row.push(data[s]?.[bin] ?? 0)\n rows.push(row)\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n","/**\n * Histogram-specific `RelativeData` transform. Histogram data is\n * `number[][]` — each series is a flat list of bin counts. This\n * rewrites each count to its share of the series total (0–100), so\n * pairing with `createPercentFormatter` renders the y-axis as\n * percentages.\n *\n * Pass to `<Widget.RelativeData transform={toRelativeHistogramData} />`.\n *\n * The denominator is the sum of |value| across the series so mixed-sign\n * inputs produce sane signed shares-of-magnitude. A series whose total\n * magnitude is zero (all-zero or empty input) is returned unchanged so\n * a stalled or empty data set doesn't show misleading 0% values. Inputs\n * whose shape isn't `number[][]` fall through untouched (same defensive\n * shape-check pattern as the default transform).\n */\nexport const toRelativeHistogramData = (input: unknown): unknown => {\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!isFlatNumberArray(series)) return series\n const total = series.reduce((acc, v) => acc + Math.abs(v), 0)\n if (total <= 0) return series\n return series.map((v) => (v / total) * 100)\n })\n}\n\nfunction isFlatNumberArray(v: unknown): v is number[] {\n if (!Array.isArray(v)) return false\n return v.every((item) => typeof item === 'number' && Number.isFinite(item))\n}\n"],"names":["histogramOptions","theme","formatter","niceMin","niceMax","grid","left","parseInt","spacing","top","right","buildGridConfig","containLabel","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","textStyle","color","common","white","fontSize","fontFamily","typography","caption","axisPointer","type","position","createTooltipPositioner","buildHistogramTooltipFormatter","legend","buildLegendConfig","hasLegend","lineStyle","secondary","main","Object","values","qualitative","bold","xAxis","axisLine","show","axisTick","axisLabel","margin","hideOverlap","yAxis","min","extent","niceNum","max","splitLine","black","divider","overlineDelicate","showMaxLabel","showMinLabel","verticalAlign","inside","value","String","createHistogramOptionFactory","options","ticks","series","labelFormatter","selection","optionsOverride","selectionSet","length","Set","binLabels","i","lo","hi","raw","formatNumber","push","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","seriesTemplates","broadcastTemplate","baseYAxis","baseGrid","baseTooltip","baseLegend","liveFormatter","niceMinVal","niceMaxVal","computeHistogramNiceBounds","dataZoomLayout","positionDataZoomForLegend","dataZoom","fallbackBottom","bottom","baseBottom","gridBottom","ZOOM_LAYOUT","sliderHeight","sliderGap","dimItemStyle","params","base","has","dataIndex","echarts","modifyAlpha","map","counts","source","label","_","template","overrideColor","resolveThemeColor","datasetIndex","name","encode","x","y","barCategoryGap","emphasis","focus","itemStyle","createTooltipFormatter","item","formattedValue","marker","seriesName","v","Number","isFinite","n","isInteger","toFixed","toString","styles","container","display","alignItems","justifyContent","flexDirection","gap","height","flex","width","legendItem","barSx","minWidth","HistogramSkeleton","t0","$","_c","bins","t1","undefined","T0","T1","t2","t3","t4","heights","from","t","Math","round","exp","Box","_temp","t5","jsx","t6","Symbol","for","_temp2","t7","i_1","jsxs","Skeleton","h","i_0","createHistogramDownloadConfig","args","items","getCaptureEl","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","getTicks","seriesCount","header","seriesNames","rows","bin","row","s","handle","downloadToCSV","Promise","url","revoke","toRelativeHistogramData","input","isFlatNumberArray","total","reduce","acc","abs","every"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { M as j, a as B, b as E } from "../markdown-BD1jcknS.js";
1
+ import { M as B, a as E, b as P } from "../markdown-BD1jcknS.js";
2
2
  import { jsx as a } from "react/jsx-runtime";
3
3
  import { c as p } from "react/compiler-runtime";
4
4
  import { Box as s, Skeleton as c } from "@mui/material";
@@ -7,6 +7,7 @@ import "@mui/icons-material/FileDownload";
7
7
  import "../lasso-tool-CDFj4zKY.js";
8
8
  import "../cjs-D4KH3azB.js";
9
9
  import "@mui/icons-material";
10
+ import "@carto/ps-utils";
10
11
  import "html2canvas";
11
12
  import "@mui/icons-material/ImageOutlined";
12
13
  import { b as d } from "../png-item-CS4z1iSH.js";
@@ -22,7 +23,7 @@ const m = {
22
23
  height: 18
23
24
  })
24
25
  };
25
- function y(o) {
26
+ function D(o) {
26
27
  const t = p(2), {
27
28
  lines: r
28
29
  } = o, n = r === void 0 ? 5 : r;
@@ -36,7 +37,7 @@ function y(o) {
36
37
  e = t[1];
37
38
  return e;
38
39
  }
39
- function D(o) {
40
+ function U(o) {
40
41
  const t = [];
41
42
  return o.getCaptureEl && t.push(d({
42
43
  filename: o.filename,
@@ -59,10 +60,10 @@ function D(o) {
59
60
  }), t;
60
61
  }
61
62
  export {
62
- j as Markdown,
63
- B as MarkdownContent,
64
- y as MarkdownSkeleton,
65
- E as MarkdownUI,
66
- D as createMarkdownDownloadConfig
63
+ B as Markdown,
64
+ E as MarkdownContent,
65
+ D as MarkdownSkeleton,
66
+ P as MarkdownUI,
67
+ U as createMarkdownDownloadConfig
67
68
  };
68
69
  //# sourceMappingURL=markdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sources":["../../src/widgets-v2/markdown/skeleton.tsx","../../src/widgets-v2/markdown/download.ts"],"sourcesContent":["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 buildPngDownloadItem,\n toCsvString,\n triggerLinkDownload,\n type DownloadItem,\n} from '../actions/download'\nimport type { MarkdownWidgetData } from './types'\n\n/**\n * Download menu items for the Markdown widget. Always includes a `.md`\n * item that saves the markdown source verbatim. When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createMarkdownDownloadConfig(args: {\n filename: string\n getData: () => MarkdownWidgetData\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'md',\n label: 'Download as Markdown',\n resolve: () => {\n const data = args.getData()\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 return items\n}\n\n// Re-export pure helpers consumers may want when building a custom Download item.\nexport { toCsvString, triggerLinkDownload }\n"],"names":["styles","root","display","flexDirection","gap","py","line","width","height","MarkdownSkeleton","t0","$","_c","lines","t1","undefined","t2","widths","Box","Array","from","length","map","_","i","jsx","Skeleton","createMarkdownDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","backgroundColor","pngBackgroundColor","id","label","resolve","data","getData","blob","Blob","content","type","url","URL","createObjectURL","Promise","revoke","revokeObjectURL"],"mappings":";;;;;;;;;;;;AAGA,MAAMA,IAAS;AAAA,EACbC,MAAM;AAAA,IACJC,SAAS;AAAA,IACTC,eAAe;AAAA,IACfC,KAAK;AAAA,IACLC,IAAI;AAAA,EAAA;AAAA,EAENC,MAAMA,CAACC,OAAmC;AAAA,IAAEA,OAAAA;AAAAA,IAAOC,QAAQ;AAAA,EAAA;AAC7D;AAMO,SAAAC,EAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAA0B;AAAA,IAAAC,OAAAC;AAAAA,EAAAA,IAAAJ,GAAEG,IAAAC,MAAAC,SAAA,IAAAD;AAAS,MAAAE;AAAA,MAAAL,SAAAE,GAAA;AAE1C,UAAAI,IAAe,CAAC,QAAQ,OAAO,OAAO,OAAO,KAAK;AAEhDD,IAAAA,sBAACE,GAAA,EAAQ,IAAAlB,EAAMC,MACZkB,gBAAKC,KAAM;AAAA,MAAAC,QAAUR;AAAAA,IAAAA,CAAO,EAACS,IAAK,CAAAC,GAAAC,MACjC,gBAAAC,EAACC,GAAA,EAES,SAAA,eACJ,IAAA1B,EAAMM,KAAMW,EAAOO,IAAIP,EAAMI,MAAO,KAAxB,KAAkC,KAF7C,QAAQG,CAAC,EAEqC,CAEtD,EAAA,CACH,GAAMb,OAAAE,GAAAF,OAAAK;AAAAA,EAAA;AAAAA,IAAAA,IAAAL,EAAA,CAAA;AAAA,SARNK;AAQM;ACfH,SAASW,EAA6BC,GAM1B;AACjB,QAAMC,IAAwB,CAAA;AAC9B,SAAID,EAAKE,gBACPD,EAAME,KACJC,EAAqB;AAAA,IACnBC,UAAUL,EAAKK;AAAAA,IACfH,cAAcF,EAAKE;AAAAA,IACnBI,YAAYN,EAAKO;AAAAA,IACjBC,iBAAiBR,EAAKS;AAAAA,EAAAA,CACvB,CACH,GAEFR,EAAME,KAAK;AAAA,IACTO,IAAI;AAAA,IACJC,OAAO;AAAA,IACPC,SAASA,MAAM;AACb,YAAMC,IAAOb,EAAKc,QAAAA,GACZC,IAAO,IAAIC,KAAK,CAACH,EAAKI,WAAW,EAAE,GAAG;AAAA,QAC1CC,MAAM;AAAA,MAAA,CACP,GACKC,IAAMC,IAAIC,gBAAgBN,CAAI;AACpC,aAAOO,QAAQV,QAAQ;AAAA,QACrBO,KAAAA;AAAAA,QACAd,UAAU,GAAGL,EAAKK,QAAQ;AAAA,QAC1BkB,QAAQA,MAAMH,IAAII,gBAAgBL,CAAG;AAAA,MAAA,CACtC;AAAA,IACH;AAAA,EAAA,CACD,GACMlB;AACT;"}
1
+ {"version":3,"file":"markdown.js","sources":["../../src/widgets-v2/markdown/skeleton.tsx","../../src/widgets-v2/markdown/download.ts"],"sourcesContent":["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 buildPngDownloadItem,\n toCsvString,\n triggerLinkDownload,\n type DownloadItem,\n} from '../actions/download'\nimport type { MarkdownWidgetData } from './types'\n\n/**\n * Download menu items for the Markdown widget. Always includes a `.md`\n * item that saves the markdown source verbatim. When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createMarkdownDownloadConfig(args: {\n filename: string\n getData: () => MarkdownWidgetData\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'md',\n label: 'Download as Markdown',\n resolve: () => {\n const data = args.getData()\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 return items\n}\n\n// Re-export pure helpers consumers may want when building a custom Download item.\nexport { toCsvString, triggerLinkDownload }\n"],"names":["styles","root","display","flexDirection","gap","py","line","width","height","MarkdownSkeleton","t0","$","_c","lines","t1","undefined","t2","widths","Box","Array","from","length","map","_","i","jsx","Skeleton","createMarkdownDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","backgroundColor","pngBackgroundColor","id","label","resolve","data","getData","blob","Blob","content","type","url","URL","createObjectURL","Promise","revoke","revokeObjectURL"],"mappings":";;;;;;;;;;;;;AAGA,MAAMA,IAAS;AAAA,EACbC,MAAM;AAAA,IACJC,SAAS;AAAA,IACTC,eAAe;AAAA,IACfC,KAAK;AAAA,IACLC,IAAI;AAAA,EAAA;AAAA,EAENC,MAAMA,CAACC,OAAmC;AAAA,IAAEA,OAAAA;AAAAA,IAAOC,QAAQ;AAAA,EAAA;AAC7D;AAMO,SAAAC,EAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAA0B;AAAA,IAAAC,OAAAC;AAAAA,EAAAA,IAAAJ,GAAEG,IAAAC,MAAAC,SAAA,IAAAD;AAAS,MAAAE;AAAA,MAAAL,SAAAE,GAAA;AAE1C,UAAAI,IAAe,CAAC,QAAQ,OAAO,OAAO,OAAO,KAAK;AAEhDD,IAAAA,sBAACE,GAAA,EAAQ,IAAAlB,EAAMC,MACZkB,gBAAKC,KAAM;AAAA,MAAAC,QAAUR;AAAAA,IAAAA,CAAO,EAACS,IAAK,CAAAC,GAAAC,MACjC,gBAAAC,EAACC,GAAA,EAES,SAAA,eACJ,IAAA1B,EAAMM,KAAMW,EAAOO,IAAIP,EAAMI,MAAO,KAAxB,KAAkC,KAF7C,QAAQG,CAAC,EAEqC,CAEtD,EAAA,CACH,GAAMb,OAAAE,GAAAF,OAAAK;AAAAA,EAAA;AAAAA,IAAAA,IAAAL,EAAA,CAAA;AAAA,SARNK;AAQM;ACfH,SAASW,EAA6BC,GAM1B;AACjB,QAAMC,IAAwB,CAAA;AAC9B,SAAID,EAAKE,gBACPD,EAAME,KACJC,EAAqB;AAAA,IACnBC,UAAUL,EAAKK;AAAAA,IACfH,cAAcF,EAAKE;AAAAA,IACnBI,YAAYN,EAAKO;AAAAA,IACjBC,iBAAiBR,EAAKS;AAAAA,EAAAA,CACvB,CACH,GAEFR,EAAME,KAAK;AAAA,IACTO,IAAI;AAAA,IACJC,OAAO;AAAA,IACPC,SAASA,MAAM;AACb,YAAMC,IAAOb,EAAKc,QAAAA,GACZC,IAAO,IAAIC,KAAK,CAACH,EAAKI,WAAW,EAAE,GAAG;AAAA,QAC1CC,MAAM;AAAA,MAAA,CACP,GACKC,IAAMC,IAAIC,gBAAgBN,CAAI;AACpC,aAAOO,QAAQV,QAAQ;AAAA,QACrBO,KAAAA;AAAAA,QACAd,UAAU,GAAGL,EAAKK,QAAQ;AAAA,QAC1BkB,QAAQA,MAAMH,IAAII,gBAAgBL,CAAG;AAAA,MAAA,CACtC;AAAA,IACH;AAAA,EAAA,CACD,GACMlB;AACT;"}
@@ -10,6 +10,7 @@ import "react";
10
10
  import "html2canvas";
11
11
  import "../lasso-tool-CDFj4zKY.js";
12
12
  import "../cjs-D4KH3azB.js";
13
+ import "@carto/ps-utils";
13
14
  import "@dnd-kit/core";
14
15
  import "@dnd-kit/sortable";
15
16
  import "@dnd-kit/utilities";
@@ -103,7 +104,7 @@ function _({
103
104
  }]
104
105
  };
105
106
  }
106
- function ve(e) {
107
+ function he(e) {
107
108
  const {
108
109
  theme: r,
109
110
  formatter: t,
@@ -340,7 +341,7 @@ const F = {
340
341
  borderRadius: "50%"
341
342
  }
342
343
  };
343
- function he(e) {
344
+ function Se(e) {
344
345
  const r = O(2), {
345
346
  count: t
346
347
  } = e, n = t === void 0 ? 1 : t;
@@ -352,7 +353,7 @@ function he(e) {
352
353
  function G(e, r) {
353
354
  return /* @__PURE__ */ I($, { variant: "circular", sx: F.donut }, `donut-${r}`);
354
355
  }
355
- function Se(e) {
356
+ function xe(e) {
356
357
  const r = [];
357
358
  return e.getCaptureEl && r.push(z({
358
359
  filename: e.filename,
@@ -379,9 +380,9 @@ function Se(e) {
379
380
  }), r;
380
381
  }
381
382
  export {
382
- he as PieSkeleton,
383
- Se as createPieDownloadConfig,
384
- ve as createPieOptionFactory,
383
+ Se as PieSkeleton,
384
+ xe as createPieDownloadConfig,
385
+ he as createPieOptionFactory,
385
386
  _ as pieOptions
386
387
  };
387
388
  //# sourceMappingURL=pie.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pie.js","sources":["../../src/widgets-v2/pie/options.ts","../../src/widgets-v2/pie/skeleton.tsx","../../src/widgets-v2/pie/download.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n buildSeriesLabelConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport type { OptionFactory, OptionFactoryContext } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport type { WidgetSeries } from '../types'\nimport type {\n PieEChartsOption,\n PieOptionFactoryInput,\n PieOptionsInput,\n PieWidgetData,\n} from './types'\n\nconst DEFAULT_RADIUS: readonly [string, string] = ['58%', '74%']\n\n/**\n * Builds the **structural** ECharts option for a pie / donut widget.\n * Mirrors v1's pie look-and-feel: themed legend (`buildLegendConfig`),\n * themed tooltip via `createTooltipPositioner` / `createTooltipFormatter`,\n * `qualitative.bold` color palette, slice borders against the paper\n * background, hover-emphasis disabled, and a centered rich-text label.\n *\n * Layered like Bar / Histogram:\n * - **Theme-aware bits** live here on a series template (slice border,\n * center-label rich style sizes, emphasis-disabled).\n * - **Reactive bits** (tooltip value formatter, center-label text,\n * selection-driven dim) are re-emitted by\n * {@link createPieOptionFactory} at fusion time so RelativeData's\n * percent override flows through.\n */\nexport function pieOptions({\n theme,\n formatter,\n labelFormatter,\n}: PieOptionsInput): PieEChartsOption {\n return {\n legend: {\n ...buildLegendConfig({ hasLegend: true, labelFormatter }),\n // Pie reads better with a centered legend (the donut is radially\n // symmetric — left-aligning the legend below it visually unbalances\n // the chart). Override `buildLegendConfig`'s `type: 'scroll'` with\n // `'plain'` so long category lists wrap to multiple rows instead\n // of clipping the last visible item against the chart container.\n // The wider `itemGap` gives chips breathing room in the typical\n // 3–6 category case.\n left: 'center',\n type: 'scroll',\n itemGap: 16,\n },\n tooltip: {\n // Pie uses item-trigger (no axis); the rest of the styling mirrors\n // bar/histogram so the dashboard reads consistently — dark\n // grey[900] bg, white caption-font text, padded, with the shared\n // overflow-aware positioner.\n trigger: 'item',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n position: createTooltipPositioner(theme),\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n // V1 used `qualitative.bold` only (no `secondary.main` prefix) because\n // pie slices are categorical — each slice deserves a distinct palette\n // entry from the start, not a primary highlight.\n color: Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n // Pie template. The merger spreads this into each per-data series it\n // emits — borderColor / borderWidth / emphasis-disabled / label rich\n // sizes all survive through.\n series: [\n {\n type: 'pie',\n colorBy: 'data',\n avoidLabelOverlap: true,\n selectedOffset: 0,\n emphasis: { disabled: true },\n itemStyle: {\n borderColor: theme.palette.background.paper,\n borderWidth: 1,\n },\n label: {\n show: true,\n position: 'center',\n rich: {\n b: { fontSize: 16, fontWeight: 'normal', lineHeight: 20 },\n c: { fontSize: 28, fontWeight: 'bold', lineHeight: 27 },\n },\n },\n },\n ],\n }\n}\n\n/**\n * Returns the pie widget's {@link OptionFactory} — one closure that owns\n * BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link pieOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`PieWidgetData`) into the option via the dataset API. Single-series\n * → donut (one dataset, `series[i].encode = { itemName: 'name', value: 'value' }`).\n * Multi-series → horizontal-bar fallback (mirrors v1 pie). Reactive\n * formatters from `ctx` drive the tooltip + center label at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n */\nexport function createPieOptionFactory(\n options: PieOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride, series } = options\n const radius = options.radius ?? DEFAULT_RADIUS\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n return (option, data, ctx) => {\n if (option == null) {\n const structural = pieOptions({ theme, formatter, labelFormatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr = Array.isArray(data) ? (data as PieWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n if (seriesArr.length > 1) {\n return buildMultiSeriesBarFusion(\n option,\n seriesArr,\n theme,\n series,\n ctx,\n selectionSet,\n )\n }\n return buildSingleSeriesPieFusion(\n option,\n seriesArr,\n radius,\n series,\n ctx,\n selectionSet,\n )\n }\n}\n\n/**\n * Single-series donut fusion. Spreads the structural pie series template\n * into per-data series with center/radius/encoding, wires the reactive\n * center-label / tooltip formatters and the per-data palette-aware\n * selection-dim callback.\n */\nfunction buildSingleSeriesPieFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n radius: readonly [string, string],\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n // Pie wants `colorBy: 'data'` — each slice draws from the option's\n // `color` palette by data index. But installing an `itemStyle.color`\n // callback disables ECharts' automatic per-data cycling, and\n // `params.color` collapses to the series color (so every slice goes\n // the same color). We re-implement the per-data palette resolution\n // here so the multicolor look survives selection-driven dimming.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const resolvePaletteColor = (params: CallbackDataParams): string => {\n const swatch =\n palette.length > 0\n ? palette[params.dataIndex % palette.length]\n : undefined\n return swatch ?? (params.color as string)\n }\n\n // Always emit `itemStyle.color` (passthrough when nothing is selected),\n // not conditionally — same anti-stale-callback rationale as bar /\n // histogram. The slice border + width come from the structural\n // template's `itemStyle` and survive via the spread below.\n const colorFn = (params: CallbackDataParams): string => {\n const base = resolvePaletteColor(params)\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n // Center label formatter — lives in the merger because it reads\n // reactive `formatter` / `labelFormatter` from ctx. The rich tags\n // `{c|…}` and `{b|…}` reference the rich styles baked into the\n // structural label template.\n const labelTextFormatter = (params: CallbackDataParams): string => {\n const { name } = params\n const encodeIndex = params.encode?.value?.[0]\n if (encodeIndex === undefined) return ''\n const value = (Object.values(params.data ?? {}) as unknown[]).at(\n encodeIndex,\n )\n // `value` here is the resolved dataset cell — for pie data it's a\n // `string | number` primitive. Anything else is a misuse we won't\n // dress up with `String(...)` (would render \"[object Object]\").\n const formattedValue =\n typeof value === 'number'\n ? formatter\n ? formatter(value)\n : String(value)\n : typeof value === 'string'\n ? value\n : ''\n const formattedName = labelFormatter\n ? String(labelFormatter(name ?? ''))\n : String(name ?? '')\n return `{c|${formattedValue}}\\n\\n{b|${formattedName}}`\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const templateObj = typeof template === 'object' ? template : {}\n const templateLabel = (templateObj as { label?: object }).label ?? {}\n const templateItemStyle =\n (templateObj as { itemStyle?: object }).itemStyle ?? {}\n return {\n ...templateObj,\n type: 'pie' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n radius: [...radius],\n // Lift the donut up so the bottom-anchored legend has the\n // vertical real estate to wrap to multiple rows for long\n // category lists — at exactly `50%` the bottom slices crowd\n // the chips and `type: 'plain'` legends can't expand upward\n // without overlapping the donut.\n center: ['50%', '38%'] as [string, string],\n encode: { itemName: 'name', value: 'value' },\n label: {\n ...templateLabel,\n formatter: labelTextFormatter,\n },\n itemStyle: {\n ...templateItemStyle,\n color: colorFn,\n },\n }\n }),\n // Legend always shows for pie (mirrors v1) — slice names drive the\n // entries, so even a single donut benefits from a category list.\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n }\n}\n\n/**\n * Multi-series horizontal-bar fusion. Mirrors v1 pie's \"pie data with\n * >1 series collapses into a horizontal bar chart\" behavior — side-by-\n * side donuts don't read well when you're comparing the same categories\n * across cohorts, so swap to a value-on-x / category-on-y bar layout.\n *\n * Pie data shape is identical to bar's (`{ name, value }[][]`), so the\n * same dataset feeds either layout without transformation.\n */\nfunction buildMultiSeriesBarFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n theme: Theme,\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)\n\n // Per-series palette — multi-series bars take one color per series\n // (not per-data, unlike donut slices). Same anti-stale-callback rule:\n // always emit the callback so a transition to/from a selection\n // replaces the previous closure cleanly.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const barColorFn = (params: CallbackDataParams): string => {\n const seriesIdx = params.seriesIndex ?? 0\n const seriesSwatch =\n palette.length > 0 ? palette[seriesIdx % palette.length] : undefined\n const base = (seriesSwatch ?? params.color) as string\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n grid: {\n ...baseGrid,\n ...buildGridConfig(true, theme),\n right: parseInt(theme.spacing(4)),\n containLabel: true,\n },\n // Drop pie-specific structural keys that shouldn't render in the\n // bar fallback. ECharts ignores undefined keys, so this is a clean\n // override.\n series: seriesArr.map((_, i) => {\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n datasetIndex: i,\n type: 'bar' as const,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n ...buildSeriesLabelConfig(formatter, 'x'),\n itemStyle: { color: barColorFn },\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n xAxis: {\n type: 'value',\n // Closures over the pre-computed nice bounds — ECharts calls them\n // once per render to resolve the axis extents.\n min: () => niceMinVal,\n max: () => niceMaxVal,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n // Value labels render BELOW the axis line (default placement),\n // NOT inside the plot. Bar/histogram use `inside: true` +\n // `verticalAlign: 'bottom'` for their *vertical* y-axis where the\n // axis is the left wall — labels inside read like grid annotations.\n // A horizontal bar chart's value axis is the x-axis, and `inside`\n // there pushes the max label *behind* the bar (it visually\n // disappears once a bar reaches the right edge). Use the default\n // below-the-axis placement so the rounded extents stay readable.\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n showMaxLabel: true,\n showMinLabel: true,\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n yAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n ...(labelFormatter && {\n formatter: (value: string | number) => String(labelFormatter(value)),\n }),\n },\n },\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n trigger: 'axis',\n formatter: buildHorizontalBarTooltipFormatter(formatter, labelFormatter),\n },\n } as EChartsOption\n}\n\n/**\n * Tooltip formatter for the horizontal-bar fallback. Reads the value by\n * `encode.x` dimension index (v1 parity) so it stays robust to\n * downstream changes that rename dataset columns.\n */\nfunction buildHorizontalBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.x?.at(0)\n const dimName =\n encodeIndex !== undefined ? item.dimensionNames?.[encodeIndex] : undefined\n const row =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (item.value as Record<string, string | number>)\n : undefined\n const raw = dimName && row ? row[dimName] : undefined\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n\n/**\n * Min/max bounds over every datum's `.value` across all series. Used by\n * the horizontal-bar fallback's x-axis label formatter so we only render\n * labels at the rounded extents (matches v1 + bar / histogram).\n */\nfunction computeNiceBounds(seriesArr: PieWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n return {\n niceMinVal: min < 0 ? niceNum(min) : 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\n/**\n * Tooltip formatter for pie slices. `item.value` is the dataset row\n * object (e.g. `{ name: 'A', value: 10 }`); we pull the value by\n * `encode.value`'s dimension index, formatted via the reactive `formatter`\n * if present. Slice name passes through `labelFormatter`.\n */\nfunction buildPieTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.value?.at(0) ?? 1\n const values =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (Object.values(item.value) as (string | number)[])\n : []\n const raw = values[encodeIndex]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n py: 1,\n gap: 2,\n },\n donut: {\n width: 160,\n height: 160,\n borderRadius: '50%',\n },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface PieSkeletonProps {\n count?: number\n}\n\nexport function PieSkeleton({ count = 1 }: PieSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`donut-${i}`} variant='circular' sx={styles.donut} />\n ))}\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { PieWidgetData } from './types'\n\n/**\n * Download menu items for the Pie widget. Always includes a CSV item with\n * `series, name, value` columns (one row per slice; series labels come from\n * `seriesNames` if provided, else `series_<n>`). When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createPieDownloadConfig(args: {\n filename: string\n getData: () => PieWidgetData\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'Download as CSV',\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = [['series', 'name', 'value']]\n for (const [i, series] of data.entries()) {\n const seriesName = args.seriesNames?.[i] ?? `series_${i + 1}`\n for (const slice of series) {\n rows.push([seriesName, slice.name, slice.value])\n }\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["DEFAULT_RADIUS","pieOptions","theme","formatter","labelFormatter","legend","buildLegendConfig","hasLegend","left","type","itemGap","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","parseInt","spacing","textStyle","color","common","white","fontSize","fontFamily","typography","caption","position","createTooltipPositioner","buildPieTooltipFormatter","Object","values","qualitative","bold","series","colorBy","avoidLabelOverlap","selectedOffset","emphasis","disabled","itemStyle","borderColor","background","paper","label","show","rich","b","fontWeight","lineHeight","c","createPieOptionFactory","options","optionsOverride","radius","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","buildMultiSeriesBarFusion","buildSingleSeriesPieFusion","seriesTemplates","broadcastTemplate","baseTooltip","baseLegend","resolvePaletteColor","params","dataIndex","undefined","colorFn","base","name","value","has","echarts","modifyAlpha","labelTextFormatter","encodeIndex","encode","at","formattedValue","String","formattedName","map","s","source","_","i","template","templateObj","templateLabel","templateItemStyle","datasetIndex","center","itemName","baseGrid","grid","niceMinVal","niceMaxVal","computeNiceBounds","barColorFn","seriesIdx","seriesIndex","buildGridConfig","right","containLabel","overrideColor","resolveThemeColor","barMaxWidth","focus","buildSeriesLabelConfig","xAxis","min","max","axisLine","axisTick","splitLine","lineStyle","black","divider","axisLabel","overlineDelicate","margin","showMaxLabel","showMinLabel","yAxis","buildHorizontalBarTooltipFormatter","createTooltipFormatter","item","x","dimName","dimensionNames","row","raw","marker","seriesName","d","Number","isFinite","niceNum","styles","root","display","alignItems","justifyContent","minHeight","py","gap","donut","width","height","borderRadius","PieSkeleton","t0","$","_c","count","t1","t2","Box","from","_temp","jsx","Skeleton","createPieDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","rows","entries","seriesNames","slice","handle","downloadToCSV","Promise","url","revoke"],"mappings":"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"}
1
+ {"version":3,"file":"pie.js","sources":["../../src/widgets-v2/pie/options.ts","../../src/widgets-v2/pie/skeleton.tsx","../../src/widgets-v2/pie/download.ts"],"sourcesContent":["import type { Theme } from '@mui/material'\nimport type { EChartsOption } from 'echarts'\nimport * as echarts from 'echarts'\nimport type { CallbackDataParams } from 'echarts/types/dist/shared'\nimport {\n buildGridConfig,\n buildLegendConfig,\n buildSeriesLabelConfig,\n createTooltipFormatter,\n createTooltipPositioner,\n niceNum,\n} from '../../widgets/utils/chart-config'\nimport type { OptionFactory, OptionFactoryContext } from '../echart'\nimport { mergeOptions, resolveThemeColor } from '../utils'\nimport type { WidgetSeries } from '../types'\nimport type {\n PieEChartsOption,\n PieOptionFactoryInput,\n PieOptionsInput,\n PieWidgetData,\n} from './types'\n\nconst DEFAULT_RADIUS: readonly [string, string] = ['58%', '74%']\n\n/**\n * Builds the **structural** ECharts option for a pie / donut widget.\n * Mirrors v1's pie look-and-feel: themed legend (`buildLegendConfig`),\n * themed tooltip via `createTooltipPositioner` / `createTooltipFormatter`,\n * `qualitative.bold` color palette, slice borders against the paper\n * background, hover-emphasis disabled, and a centered rich-text label.\n *\n * Layered like Bar / Histogram:\n * - **Theme-aware bits** live here on a series template (slice border,\n * center-label rich style sizes, emphasis-disabled).\n * - **Reactive bits** (tooltip value formatter, center-label text,\n * selection-driven dim) are re-emitted by\n * {@link createPieOptionFactory} at fusion time so RelativeData's\n * percent override flows through.\n */\nexport function pieOptions({\n theme,\n formatter,\n labelFormatter,\n}: PieOptionsInput): PieEChartsOption {\n return {\n legend: {\n ...buildLegendConfig({ hasLegend: true, labelFormatter }),\n // Pie reads better with a centered legend (the donut is radially\n // symmetric — left-aligning the legend below it visually unbalances\n // the chart). Override `buildLegendConfig`'s `type: 'scroll'` with\n // `'plain'` so long category lists wrap to multiple rows instead\n // of clipping the last visible item against the chart container.\n // The wider `itemGap` gives chips breathing room in the typical\n // 3–6 category case.\n left: 'center',\n type: 'scroll',\n itemGap: 16,\n },\n tooltip: {\n // Pie uses item-trigger (no axis); the rest of the styling mirrors\n // bar/histogram so the dashboard reads consistently — dark\n // grey[900] bg, white caption-font text, padded, with the shared\n // overflow-aware positioner.\n trigger: 'item',\n backgroundColor: theme.palette.grey[900],\n borderWidth: 0,\n padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],\n textStyle: {\n color: theme.palette.common.white,\n fontSize: 11,\n fontFamily: theme.typography.caption.fontFamily,\n },\n position: createTooltipPositioner(theme),\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n // V1 used `qualitative.bold` only (no `secondary.main` prefix) because\n // pie slices are categorical — each slice deserves a distinct palette\n // entry from the start, not a primary highlight.\n color: Object.values(\n (theme.palette as { qualitative?: { bold?: Record<string, string> } })\n .qualitative?.bold ?? {},\n ),\n // Pie template. The merger spreads this into each per-data series it\n // emits — borderColor / borderWidth / emphasis-disabled / label rich\n // sizes all survive through.\n series: [\n {\n type: 'pie',\n colorBy: 'data',\n avoidLabelOverlap: true,\n selectedOffset: 0,\n emphasis: { disabled: true },\n itemStyle: {\n borderColor: theme.palette.background.paper,\n borderWidth: 1,\n },\n label: {\n show: true,\n position: 'center',\n rich: {\n b: { fontSize: 16, fontWeight: 'normal', lineHeight: 20 },\n c: { fontSize: 28, fontWeight: 'bold', lineHeight: 27 },\n },\n },\n },\n ],\n }\n}\n\n/**\n * Returns the pie widget's {@link OptionFactory} — one closure that owns\n * BOTH phases of option construction:\n *\n * - **Structural phase** (`option == null`) — builds the theme-aware\n * structural option via {@link pieOptions}, optionally merging the\n * consumer-supplied `optionsOverride` on top. Called once by Provider\n * to seed `rawOptions` in the store.\n * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`\n * (`PieWidgetData`) into the option via the dataset API. Single-series\n * → donut (one dataset, `series[i].encode = { itemName: 'name', value: 'value' }`).\n * Multi-series → horizontal-bar fallback (mirrors v1 pie). Reactive\n * formatters from `ctx` drive the tooltip + center label at fusion\n * time so RelativeData's percent formatter flows through without a\n * structural rebuild.\n */\nexport function createPieOptionFactory(\n options: PieOptionFactoryInput,\n): OptionFactory {\n const { theme, formatter, labelFormatter, optionsOverride, series } = options\n const radius = options.radius ?? DEFAULT_RADIUS\n const selection = options.selection\n const selectionSet =\n selection && selection.length > 0\n ? new Set<string | number>(selection)\n : null\n return (option, data, ctx) => {\n if (option == null) {\n const structural = pieOptions({ theme, formatter, labelFormatter })\n return optionsOverride\n ? (mergeOptions(\n structural as unknown as Record<string, unknown>,\n optionsOverride as Partial<Record<string, unknown>>,\n ) as EChartsOption)\n : structural\n }\n\n const seriesArr = Array.isArray(data) ? (data as PieWidgetData) : []\n if (seriesArr.length === 0) {\n return { ...option, dataset: [], series: [] }\n }\n if (seriesArr.length > 1) {\n return buildMultiSeriesBarFusion(\n option,\n seriesArr,\n theme,\n series,\n ctx,\n selectionSet,\n )\n }\n return buildSingleSeriesPieFusion(\n option,\n seriesArr,\n radius,\n series,\n ctx,\n selectionSet,\n )\n }\n}\n\n/**\n * Single-series donut fusion. Spreads the structural pie series template\n * into per-data series with center/radius/encoding, wires the reactive\n * center-label / tooltip formatters and the per-data palette-aware\n * selection-dim callback.\n */\nfunction buildSingleSeriesPieFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n radius: readonly [string, string],\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const seriesTemplates = Array.isArray(option.series) ? option.series : []\n const broadcastTemplate = seriesTemplates[0] ?? {}\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n // Pie wants `colorBy: 'data'` — each slice draws from the option's\n // `color` palette by data index. But installing an `itemStyle.color`\n // callback disables ECharts' automatic per-data cycling, and\n // `params.color` collapses to the series color (so every slice goes\n // the same color). We re-implement the per-data palette resolution\n // here so the multicolor look survives selection-driven dimming.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const resolvePaletteColor = (params: CallbackDataParams): string => {\n const swatch =\n palette.length > 0\n ? palette[params.dataIndex % palette.length]\n : undefined\n return swatch ?? (params.color as string)\n }\n\n // Always emit `itemStyle.color` (passthrough when nothing is selected),\n // not conditionally — same anti-stale-callback rationale as bar /\n // histogram. The slice border + width come from the structural\n // template's `itemStyle` and survive via the spread below.\n const colorFn = (params: CallbackDataParams): string => {\n const base = resolvePaletteColor(params)\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n // Center label formatter — lives in the merger because it reads\n // reactive `formatter` / `labelFormatter` from ctx. The rich tags\n // `{c|…}` and `{b|…}` reference the rich styles baked into the\n // structural label template.\n const labelTextFormatter = (params: CallbackDataParams): string => {\n const { name } = params\n const encodeIndex = params.encode?.value?.[0]\n if (encodeIndex === undefined) return ''\n const value = (Object.values(params.data ?? {}) as unknown[]).at(\n encodeIndex,\n )\n // `value` here is the resolved dataset cell — for pie data it's a\n // `string | number` primitive. Anything else is a misuse we won't\n // dress up with `String(...)` (would render \"[object Object]\").\n const formattedValue =\n typeof value === 'number'\n ? formatter\n ? formatter(value)\n : String(value)\n : typeof value === 'string'\n ? value\n : ''\n const formattedName = labelFormatter\n ? String(labelFormatter(name ?? ''))\n : String(name ?? '')\n return `{c|${formattedValue}}\\n\\n{b|${formattedName}}`\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n series: seriesArr.map((_, i) => {\n const template =\n (seriesTemplates[i] as object | undefined) ??\n (broadcastTemplate as object)\n const templateObj = typeof template === 'object' ? template : {}\n const templateLabel = (templateObj as { label?: object }).label ?? {}\n const templateItemStyle =\n (templateObj as { itemStyle?: object }).itemStyle ?? {}\n return {\n ...templateObj,\n type: 'pie' as const,\n datasetIndex: i,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n radius: [...radius],\n // Lift the donut up so the bottom-anchored legend has the\n // vertical real estate to wrap to multiple rows for long\n // category lists — at exactly `50%` the bottom slices crowd\n // the chips and `type: 'plain'` legends can't expand upward\n // without overlapping the donut.\n center: ['50%', '38%'] as [string, string],\n encode: { itemName: 'name', value: 'value' },\n label: {\n ...templateLabel,\n formatter: labelTextFormatter,\n },\n itemStyle: {\n ...templateItemStyle,\n color: colorFn,\n },\n }\n }),\n // Legend always shows for pie (mirrors v1) — slice names drive the\n // entries, so even a single donut benefits from a category list.\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n formatter: buildPieTooltipFormatter(formatter, labelFormatter),\n },\n }\n}\n\n/**\n * Multi-series horizontal-bar fusion. Mirrors v1 pie's \"pie data with\n * >1 series collapses into a horizontal bar chart\" behavior — side-by-\n * side donuts don't read well when you're comparing the same categories\n * across cohorts, so swap to a value-on-x / category-on-y bar layout.\n *\n * Pie data shape is identical to bar's (`{ name, value }[][]`), so the\n * same dataset feeds either layout without transformation.\n */\nfunction buildMultiSeriesBarFusion(\n option: EChartsOption,\n seriesArr: PieWidgetData,\n theme: Theme,\n series: readonly WidgetSeries[] | undefined,\n ctx: OptionFactoryContext | undefined,\n selectionSet: Set<string | number> | null,\n): EChartsOption {\n const baseTooltip =\n typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)\n ? option.tooltip\n : {}\n const baseLegend =\n typeof option.legend === 'object' && !Array.isArray(option.legend)\n ? option.legend\n : {}\n const baseGrid =\n typeof option.grid === 'object' && !Array.isArray(option.grid)\n ? option.grid\n : {}\n const formatter = ctx?.formatter\n const labelFormatter = ctx?.labelFormatter\n\n const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)\n\n // Per-series palette — multi-series bars take one color per series\n // (not per-data, unlike donut slices). Same anti-stale-callback rule:\n // always emit the callback so a transition to/from a selection\n // replaces the previous closure cleanly.\n const palette = Array.isArray(option.color)\n ? (option.color as readonly (string | undefined)[])\n : []\n const barColorFn = (params: CallbackDataParams): string => {\n const seriesIdx = params.seriesIndex ?? 0\n const seriesSwatch =\n palette.length > 0 ? palette[seriesIdx % palette.length] : undefined\n const base = (seriesSwatch ?? params.color) as string\n if (!selectionSet) return base\n const datum = params.value as { name?: string | number } | undefined\n const name = datum?.name ?? params.name\n return name != null && selectionSet.has(name)\n ? base\n : echarts.color.modifyAlpha(base, 0.15)\n }\n\n return {\n ...option,\n dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),\n grid: {\n ...baseGrid,\n ...buildGridConfig(true, theme),\n right: parseInt(theme.spacing(4)),\n containLabel: true,\n },\n // Drop pie-specific structural keys that shouldn't render in the\n // bar fallback. ECharts ignores undefined keys, so this is a clean\n // override.\n series: seriesArr.map((_, i) => {\n const overrideColor = resolveThemeColor(theme, series?.[i]?.color)\n return {\n datasetIndex: i,\n type: 'bar' as const,\n name: series?.[i]?.name ?? `Series ${i + 1}`,\n barMaxWidth: 100,\n emphasis: { focus: 'series' },\n ...buildSeriesLabelConfig(formatter, 'x'),\n itemStyle: { color: barColorFn },\n ...(overrideColor ? { color: overrideColor } : {}),\n }\n }),\n xAxis: {\n type: 'value',\n // Closures over the pre-computed nice bounds — ECharts calls them\n // once per render to resolve the axis extents.\n min: () => niceMinVal,\n max: () => niceMaxVal,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: {\n show: true,\n lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },\n },\n // Value labels render BELOW the axis line (default placement),\n // NOT inside the plot. Bar/histogram use `inside: true` +\n // `verticalAlign: 'bottom'` for their *vertical* y-axis where the\n // axis is the left wall — labels inside read like grid annotations.\n // A horizontal bar chart's value axis is the x-axis, and `inside`\n // there pushes the max label *behind* the bar (it visually\n // disappears once a bar reaches the right edge). Use the default\n // below-the-axis placement so the rounded extents stay readable.\n axisLabel: {\n fontSize: theme.typography.overlineDelicate?.fontSize,\n fontFamily: theme.typography.overlineDelicate?.fontFamily,\n margin: parseInt(theme.spacing(1)),\n showMaxLabel: true,\n showMinLabel: true,\n formatter: (value: number) => {\n if (value !== niceMaxVal && value !== niceMinVal) return ''\n if (value === 0) return ''\n return formatter ? formatter(value) : String(value)\n },\n },\n },\n yAxis: {\n type: 'category',\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: {\n padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],\n ...(labelFormatter && {\n formatter: (value: string | number) => String(labelFormatter(value)),\n }),\n },\n },\n legend: { ...baseLegend, show: true },\n tooltip: {\n ...baseTooltip,\n trigger: 'axis',\n formatter: buildHorizontalBarTooltipFormatter(formatter, labelFormatter),\n },\n } as EChartsOption\n}\n\n/**\n * Tooltip formatter for the horizontal-bar fallback. Reads the value by\n * `encode.x` dimension index (v1 parity) so it stays robust to\n * downstream changes that rename dataset columns.\n */\nfunction buildHorizontalBarTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.x?.at(0)\n const dimName =\n encodeIndex !== undefined ? item.dimensionNames?.[encodeIndex] : undefined\n const row =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (item.value as Record<string, string | number>)\n : undefined\n const raw = dimName && row ? row[dimName] : undefined\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n\n/**\n * Min/max bounds over every datum's `.value` across all series. Used by\n * the horizontal-bar fallback's x-axis label formatter so we only render\n * labels at the rounded extents (matches v1 + bar / histogram).\n */\nfunction computeNiceBounds(seriesArr: PieWidgetData): {\n niceMinVal: number\n niceMaxVal: number\n} {\n let min = 0\n let max = -Infinity\n for (const series of seriesArr) {\n for (const d of series) {\n if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue\n if (d.value < min) min = d.value\n if (d.value > max) max = d.value\n }\n }\n return {\n niceMinVal: min < 0 ? niceNum(min) : 0,\n niceMaxVal: max <= 0 ? 1 : niceNum(max),\n }\n}\n\n/**\n * Tooltip formatter for pie slices. `item.value` is the dataset row\n * object (e.g. `{ name: 'A', value: 10 }`); we pull the value by\n * `encode.value`'s dimension index, formatted via the reactive `formatter`\n * if present. Slice name passes through `labelFormatter`.\n */\nfunction buildPieTooltipFormatter(\n formatter: ((value: number) => string) | undefined,\n labelFormatter: ((value: string | number) => string | number) | undefined,\n) {\n return createTooltipFormatter((item) => {\n const encodeIndex = item.encode?.value?.at(0) ?? 1\n const values =\n item.value && typeof item.value === 'object' && !Array.isArray(item.value)\n ? (Object.values(item.value) as (string | number)[])\n : []\n const raw = values[encodeIndex]\n const formattedValue =\n typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')\n const marker = typeof item.marker === 'string' ? item.marker : ''\n const seriesName = item.seriesName ? `${item.seriesName}: ` : ''\n const name = labelFormatter\n ? String(labelFormatter(item.name ?? ''))\n : String(item.name ?? '')\n return { name, seriesName, marker, value: formattedValue }\n })\n}\n","import { Box, Skeleton } from '@mui/material'\nimport type { SxProps, Theme } from '@mui/material'\n\nconst styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n py: 1,\n gap: 2,\n },\n donut: {\n width: 160,\n height: 160,\n borderRadius: '50%',\n },\n} satisfies Record<string, SxProps<Theme>>\n\nexport interface PieSkeletonProps {\n count?: number\n}\n\nexport function PieSkeleton({ count = 1 }: PieSkeletonProps) {\n return (\n <Box sx={styles.root}>\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={`donut-${i}`} variant='circular' sx={styles.donut} />\n ))}\n </Box>\n )\n}\n","import {\n buildPngDownloadItem,\n downloadToCSV,\n type DownloadItem,\n} from '../actions/download'\nimport type { PieWidgetData } from './types'\n\n/**\n * Download menu items for the Pie widget. Always includes a CSV item with\n * `series, name, value` columns (one row per slice; series labels come from\n * `seriesNames` if provided, else `series_<n>`). When `getCaptureEl` is\n * supplied, prepends a PNG item that rasterises the captured element via\n * `html2canvas`.\n */\nexport function createPieDownloadConfig(args: {\n filename: string\n getData: () => PieWidgetData\n seriesNames?: readonly string[]\n getCaptureEl?: () => HTMLElement | null\n pngPixelRatio?: number\n pngBackgroundColor?: string | null\n}): DownloadItem[] {\n const items: DownloadItem[] = []\n if (args.getCaptureEl) {\n items.push(\n buildPngDownloadItem({\n filename: args.filename,\n getCaptureEl: args.getCaptureEl,\n pixelRatio: args.pngPixelRatio,\n backgroundColor: args.pngBackgroundColor,\n }),\n )\n }\n items.push({\n id: 'csv',\n label: 'Download as CSV',\n resolve: () => {\n const data = args.getData()\n const rows: unknown[][] = [['series', 'name', 'value']]\n for (const [i, series] of data.entries()) {\n const seriesName = args.seriesNames?.[i] ?? `series_${i + 1}`\n for (const slice of series) {\n rows.push([seriesName, slice.name, slice.value])\n }\n }\n const handle = downloadToCSV(rows)\n return Promise.resolve({\n url: handle.url,\n filename: `${args.filename}.csv`,\n revoke: handle.revoke,\n })\n },\n })\n return items\n}\n"],"names":["DEFAULT_RADIUS","pieOptions","theme","formatter","labelFormatter","legend","buildLegendConfig","hasLegend","left","type","itemGap","tooltip","trigger","backgroundColor","palette","grey","borderWidth","padding","parseInt","spacing","textStyle","color","common","white","fontSize","fontFamily","typography","caption","position","createTooltipPositioner","buildPieTooltipFormatter","Object","values","qualitative","bold","series","colorBy","avoidLabelOverlap","selectedOffset","emphasis","disabled","itemStyle","borderColor","background","paper","label","show","rich","b","fontWeight","lineHeight","c","createPieOptionFactory","options","optionsOverride","radius","selection","selectionSet","length","Set","option","data","ctx","structural","mergeOptions","seriesArr","Array","isArray","dataset","buildMultiSeriesBarFusion","buildSingleSeriesPieFusion","seriesTemplates","broadcastTemplate","baseTooltip","baseLegend","resolvePaletteColor","params","dataIndex","undefined","colorFn","base","name","value","has","echarts","modifyAlpha","labelTextFormatter","encodeIndex","encode","at","formattedValue","String","formattedName","map","s","source","_","i","template","templateObj","templateLabel","templateItemStyle","datasetIndex","center","itemName","baseGrid","grid","niceMinVal","niceMaxVal","computeNiceBounds","barColorFn","seriesIdx","seriesIndex","buildGridConfig","right","containLabel","overrideColor","resolveThemeColor","barMaxWidth","focus","buildSeriesLabelConfig","xAxis","min","max","axisLine","axisTick","splitLine","lineStyle","black","divider","axisLabel","overlineDelicate","margin","showMaxLabel","showMinLabel","yAxis","buildHorizontalBarTooltipFormatter","createTooltipFormatter","item","x","dimName","dimensionNames","row","raw","marker","seriesName","d","Number","isFinite","niceNum","styles","root","display","alignItems","justifyContent","minHeight","py","gap","donut","width","height","borderRadius","PieSkeleton","t0","$","_c","count","t1","t2","Box","from","_temp","jsx","Skeleton","createPieDownloadConfig","args","items","getCaptureEl","push","buildPngDownloadItem","filename","pixelRatio","pngPixelRatio","pngBackgroundColor","id","resolve","getData","rows","entries","seriesNames","slice","handle","downloadToCSV","Promise","url","revoke"],"mappings":"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"}
@@ -10,6 +10,7 @@ import "react";
10
10
  import "html2canvas";
11
11
  import "../lasso-tool-CDFj4zKY.js";
12
12
  import "../cjs-D4KH3azB.js";
13
+ import "@carto/ps-utils";
13
14
  import "@dnd-kit/core";
14
15
  import "@dnd-kit/sortable";
15
16
  import "@dnd-kit/utilities";
@@ -125,7 +126,7 @@ function ee({
125
126
  }
126
127
  };
127
128
  }
128
- function Oe(e) {
129
+ function ze(e) {
129
130
  const {
130
131
  theme: t,
131
132
  xFormatter: r,
@@ -328,7 +329,7 @@ const v = {
328
329
  height: r,
329
330
  borderRadius: "50%"
330
331
  });
331
- function ze(e) {
332
+ function _e(e) {
332
333
  const t = q(15), {
333
334
  count: r
334
335
  } = e, i = r === void 0 ? 24 : r;
@@ -367,7 +368,7 @@ function le(e, t) {
367
368
  size: n
368
369
  };
369
370
  }
370
- function _e(e) {
371
+ function Be(e) {
371
372
  const t = [];
372
373
  return e.getCaptureEl && t.push(Q({
373
374
  filename: e.filename,
@@ -393,7 +394,7 @@ function _e(e) {
393
394
  }
394
395
  }), t;
395
396
  }
396
- const Be = (e) => Array.isArray(e) ? e.map((t) => {
397
+ const Re = (e) => Array.isArray(e) ? e.map((t) => {
397
398
  if (!ce(t)) return t;
398
399
  const r = t.reduce((i, [, n]) => i + Math.abs(n), 0);
399
400
  return r <= 0 ? t : t.map(([i, n]) => [i, n / r * 100]);
@@ -402,10 +403,10 @@ function ce(e) {
402
403
  return Array.isArray(e) ? e.every((t) => Array.isArray(t) && t.length === 2 && typeof t[0] == "number" && Number.isFinite(t[0]) && typeof t[1] == "number" && Number.isFinite(t[1])) : !1;
403
404
  }
404
405
  export {
405
- ze as ScatterplotSkeleton,
406
- _e as createScatterplotDownloadConfig,
407
- Oe as createScatterplotOptionFactory,
406
+ _e as ScatterplotSkeleton,
407
+ Be as createScatterplotDownloadConfig,
408
+ ze as createScatterplotOptionFactory,
408
409
  ee as scatterplotOptions,
409
- Be as toRelativeScatterplotData
410
+ Re as toRelativeScatterplotData
410
411
  };
411
412
  //# sourceMappingURL=scatterplot.js.map