@epilot/spark-ui 1.0.0-alpha.3 → 1.0.0-alpha.5

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 (229) hide show
  1. package/dist/accent-colors-Ch2J0EEY.js +13 -0
  2. package/dist/accent-colors-Ch2J0EEY.js.map +1 -0
  3. package/dist/accent-colors-CjHCf8fH.cjs +18 -0
  4. package/dist/accent-colors-CjHCf8fH.cjs.map +1 -0
  5. package/dist/components/accordion.cjs +1 -1
  6. package/dist/components/accordion.d.ts +1 -1
  7. package/dist/components/accordion.js +1 -1
  8. package/dist/components/attachment.d.cts +1 -1
  9. package/dist/components/attachment.d.ts +1 -1
  10. package/dist/components/badge.cjs +12 -7
  11. package/dist/components/badge.cjs.map +1 -1
  12. package/dist/components/badge.d.cts +5 -1
  13. package/dist/components/badge.d.ts +5 -1
  14. package/dist/components/badge.js +12 -7
  15. package/dist/components/badge.js.map +1 -1
  16. package/dist/components/bar-chart.cjs +60 -56
  17. package/dist/components/bar-chart.cjs.map +1 -1
  18. package/dist/components/bar-chart.d.cts +7 -2
  19. package/dist/components/bar-chart.d.ts +7 -2
  20. package/dist/components/bar-chart.js +60 -56
  21. package/dist/components/bar-chart.js.map +1 -1
  22. package/dist/components/battery-progress-row.cjs +10 -16
  23. package/dist/components/battery-progress-row.cjs.map +1 -1
  24. package/dist/components/battery-progress-row.d.cts +1 -1
  25. package/dist/components/battery-progress-row.d.ts +2 -2
  26. package/dist/components/battery-progress-row.js +10 -16
  27. package/dist/components/battery-progress-row.js.map +1 -1
  28. package/dist/components/bubble.d.cts +1 -1
  29. package/dist/components/bubble.d.ts +1 -1
  30. package/dist/components/button.cjs +5 -2
  31. package/dist/components/button.cjs.map +1 -1
  32. package/dist/components/button.d.cts +16 -7
  33. package/dist/components/button.d.ts +16 -7
  34. package/dist/components/button.js +5 -2
  35. package/dist/components/button.js.map +1 -1
  36. package/dist/components/callout.d.cts +1 -1
  37. package/dist/components/callout.d.ts +1 -1
  38. package/dist/components/card.d.cts +1 -1
  39. package/dist/components/card.d.ts +1 -1
  40. package/dist/components/chart.cjs +1 -1
  41. package/dist/components/chart.cjs.map +1 -1
  42. package/dist/components/chart.js +1 -1
  43. package/dist/components/chart.js.map +1 -1
  44. package/dist/components/checkbox.cjs +30 -23
  45. package/dist/components/checkbox.cjs.map +1 -1
  46. package/dist/components/checkbox.d.cts +5 -1
  47. package/dist/components/checkbox.d.ts +5 -1
  48. package/dist/components/checkbox.js +30 -23
  49. package/dist/components/checkbox.js.map +1 -1
  50. package/dist/components/circular-gauge.d.ts +1 -1
  51. package/dist/components/day-of-week-picker.cjs +2 -2
  52. package/dist/components/day-of-week-picker.cjs.map +1 -1
  53. package/dist/components/day-of-week-picker.js +2 -2
  54. package/dist/components/day-of-week-picker.js.map +1 -1
  55. package/dist/components/device-card.d.ts +1 -1
  56. package/dist/components/donut-chart.cjs +3 -3
  57. package/dist/components/donut-chart.cjs.map +1 -1
  58. package/dist/components/donut-chart.js +3 -3
  59. package/dist/components/donut-chart.js.map +1 -1
  60. package/dist/components/energy-bar-chart.cjs +2 -1
  61. package/dist/components/energy-bar-chart.cjs.map +1 -1
  62. package/dist/components/energy-bar-chart.d.ts +1 -1
  63. package/dist/components/energy-bar-chart.js +2 -1
  64. package/dist/components/energy-bar-chart.js.map +1 -1
  65. package/dist/components/energy-breakdown.cjs +1 -1
  66. package/dist/components/energy-breakdown.cjs.map +1 -1
  67. package/dist/components/energy-breakdown.js +1 -1
  68. package/dist/components/energy-breakdown.js.map +1 -1
  69. package/dist/components/energy-history-chart.cjs +14 -6
  70. package/dist/components/energy-history-chart.cjs.map +1 -1
  71. package/dist/components/energy-history-chart.d.cts +11 -3
  72. package/dist/components/energy-history-chart.d.ts +11 -3
  73. package/dist/components/energy-history-chart.js +14 -6
  74. package/dist/components/energy-history-chart.js.map +1 -1
  75. package/dist/components/feed-in-hero.d.ts +1 -1
  76. package/dist/components/field.cjs +1 -1
  77. package/dist/components/field.d.cts +1 -1
  78. package/dist/components/field.d.ts +1 -1
  79. package/dist/components/field.js +1 -1
  80. package/dist/components/info-block.d.cts +1 -1
  81. package/dist/components/info-block.d.ts +1 -1
  82. package/dist/components/input-group.cjs +1 -1
  83. package/dist/components/input-group.js +1 -1
  84. package/dist/components/input-otp.cjs +1 -1
  85. package/dist/components/input-otp.js +1 -1
  86. package/dist/components/input.cjs +1 -1
  87. package/dist/components/input.d.cts +1 -1
  88. package/dist/components/input.d.ts +1 -1
  89. package/dist/components/input.js +1 -1
  90. package/dist/components/line-chart.cjs +61 -19
  91. package/dist/components/line-chart.cjs.map +1 -1
  92. package/dist/components/line-chart.d.cts +7 -0
  93. package/dist/components/line-chart.d.ts +7 -0
  94. package/dist/components/line-chart.js +61 -19
  95. package/dist/components/line-chart.js.map +1 -1
  96. package/dist/components/metering-row.d.ts +1 -1
  97. package/dist/components/money-saved-block.cjs +1 -1
  98. package/dist/components/money-saved-block.cjs.map +1 -1
  99. package/dist/components/money-saved-block.js +1 -1
  100. package/dist/components/money-saved-block.js.map +1 -1
  101. package/dist/components/number-flow.d.ts +1 -1
  102. package/dist/components/power-history-chart.cjs +23 -44
  103. package/dist/components/power-history-chart.cjs.map +1 -1
  104. package/dist/components/power-history-chart.d.cts +10 -1
  105. package/dist/components/power-history-chart.d.ts +10 -1
  106. package/dist/components/power-history-chart.js +24 -45
  107. package/dist/components/power-history-chart.js.map +1 -1
  108. package/dist/components/power-history.cjs +1 -1
  109. package/dist/components/power-history.cjs.map +1 -1
  110. package/dist/components/power-history.js +1 -1
  111. package/dist/components/power-history.js.map +1 -1
  112. package/dist/components/power-network.cjs +36 -11
  113. package/dist/components/power-network.cjs.map +1 -1
  114. package/dist/components/power-network.js +36 -11
  115. package/dist/components/power-network.js.map +1 -1
  116. package/dist/components/progress.cjs +1 -1
  117. package/dist/components/progress.cjs.map +1 -1
  118. package/dist/components/progress.js +1 -1
  119. package/dist/components/progress.js.map +1 -1
  120. package/dist/components/radio-card-group.cjs +26 -1
  121. package/dist/components/radio-card-group.cjs.map +1 -1
  122. package/dist/components/radio-card-group.js +26 -1
  123. package/dist/components/radio-card-group.js.map +1 -1
  124. package/dist/components/radio.cjs +11 -4
  125. package/dist/components/radio.cjs.map +1 -1
  126. package/dist/components/radio.d.cts +15 -3
  127. package/dist/components/radio.d.ts +15 -3
  128. package/dist/components/radio.js +11 -4
  129. package/dist/components/radio.js.map +1 -1
  130. package/dist/components/sankey-chart.cjs +12 -45
  131. package/dist/components/sankey-chart.cjs.map +1 -1
  132. package/dist/components/sankey-chart.d.cts +8 -0
  133. package/dist/components/sankey-chart.d.ts +9 -1
  134. package/dist/components/sankey-chart.js +12 -45
  135. package/dist/components/sankey-chart.js.map +1 -1
  136. package/dist/components/schedule-list.cjs +3 -3
  137. package/dist/components/schedule-list.cjs.map +1 -1
  138. package/dist/components/schedule-list.js +3 -3
  139. package/dist/components/schedule-list.js.map +1 -1
  140. package/dist/components/segmented-control.cjs +44 -0
  141. package/dist/components/segmented-control.cjs.map +1 -0
  142. package/dist/components/segmented-control.d.cts +33 -0
  143. package/dist/components/segmented-control.d.ts +33 -0
  144. package/dist/components/segmented-control.js +40 -0
  145. package/dist/components/segmented-control.js.map +1 -0
  146. package/dist/components/select.cjs +1 -1
  147. package/dist/components/select.d.cts +1 -1
  148. package/dist/components/select.d.ts +1 -1
  149. package/dist/components/select.js +1 -1
  150. package/dist/components/separator.cjs +1 -1
  151. package/dist/components/separator.cjs.map +1 -1
  152. package/dist/components/separator.js +1 -1
  153. package/dist/components/separator.js.map +1 -1
  154. package/dist/components/series-legend.cjs +1 -1
  155. package/dist/components/series-legend.cjs.map +1 -1
  156. package/dist/components/series-legend.js +1 -1
  157. package/dist/components/series-legend.js.map +1 -1
  158. package/dist/components/slider.cjs +6 -19
  159. package/dist/components/slider.cjs.map +1 -1
  160. package/dist/components/slider.d.cts +0 -13
  161. package/dist/components/slider.d.ts +0 -13
  162. package/dist/components/slider.js +6 -19
  163. package/dist/components/slider.js.map +1 -1
  164. package/dist/components/solar-forecast-chart.cjs +4 -3
  165. package/dist/components/solar-forecast-chart.cjs.map +1 -1
  166. package/dist/components/solar-forecast-chart.d.cts +4 -1
  167. package/dist/components/solar-forecast-chart.d.ts +4 -1
  168. package/dist/components/solar-forecast-chart.js +4 -3
  169. package/dist/components/solar-forecast-chart.js.map +1 -1
  170. package/dist/components/stepper.cjs +2 -2
  171. package/dist/components/stepper.cjs.map +1 -1
  172. package/dist/components/stepper.js +2 -2
  173. package/dist/components/stepper.js.map +1 -1
  174. package/dist/components/switch.cjs +8 -3
  175. package/dist/components/switch.cjs.map +1 -1
  176. package/dist/components/switch.d.cts +9 -4
  177. package/dist/components/switch.d.ts +9 -4
  178. package/dist/components/switch.js +8 -3
  179. package/dist/components/switch.js.map +1 -1
  180. package/dist/components/tabs.cjs +4 -4
  181. package/dist/components/tabs.cjs.map +1 -1
  182. package/dist/components/tabs.js +4 -4
  183. package/dist/components/tabs.js.map +1 -1
  184. package/dist/components/theme.cjs +1 -1
  185. package/dist/components/theme.d.cts +1 -1
  186. package/dist/components/theme.d.ts +1 -1
  187. package/dist/components/theme.js +1 -1
  188. package/dist/components/time-picker.cjs +1 -1
  189. package/dist/components/time-picker.cjs.map +1 -1
  190. package/dist/components/time-picker.js +1 -1
  191. package/dist/components/time-picker.js.map +1 -1
  192. package/dist/components/tooltip.cjs +1 -1
  193. package/dist/components/tooltip.cjs.map +1 -1
  194. package/dist/components/tooltip.js +1 -1
  195. package/dist/components/tooltip.js.map +1 -1
  196. package/dist/hooks/use-reduced-motion.cjs +22 -0
  197. package/dist/hooks/use-reduced-motion.cjs.map +1 -0
  198. package/dist/hooks/use-reduced-motion.d.cts +7 -0
  199. package/dist/hooks/use-reduced-motion.d.ts +7 -0
  200. package/dist/hooks/use-reduced-motion.js +20 -0
  201. package/dist/hooks/use-reduced-motion.js.map +1 -0
  202. package/dist/{input-box-variants-Dr1K7uYE.js → input-box-variants-DcajYXvo.js} +1 -1
  203. package/dist/{input-box-variants-Dr1K7uYE.js.map → input-box-variants-DcajYXvo.js.map} +1 -1
  204. package/dist/{input-box-variants-BMDdwvqg.cjs → input-box-variants-ZCtgs-1S.cjs} +1 -1
  205. package/dist/{input-box-variants-BMDdwvqg.cjs.map → input-box-variants-ZCtgs-1S.cjs.map} +1 -1
  206. package/dist/{number-flow-DSbucQ_K.d.ts → number-flow-D9zsxH0-.d.ts} +1 -1
  207. package/dist/styles/index.css +39 -0
  208. package/dist/styles/spark-default.css +123 -40
  209. package/dist/styles/theme.css +78 -0
  210. package/dist/{theme-B3WtiByA.js → theme-8PDO9E0S.js} +2 -2
  211. package/dist/theme-8PDO9E0S.js.map +1 -0
  212. package/dist/{theme-C9_OSe0S.cjs → theme-ClRJhexF.cjs} +2 -2
  213. package/dist/theme-ClRJhexF.cjs.map +1 -0
  214. package/dist/{theme-types-DoROIXpi.d.ts → theme-types-BDdoRxXa.d.ts} +2 -3
  215. package/dist/{theme-types-r20EJfEC.d.cts → theme-types-BwSJKdsB.d.cts} +2 -3
  216. package/dist/{tones-DyCkL71h.d.ts → tones-PXJGlSpe.d.ts} +1 -1
  217. package/dist/utils/build-sankey-nodes.cjs +16 -3
  218. package/dist/utils/build-sankey-nodes.cjs.map +1 -1
  219. package/dist/utils/build-sankey-nodes.js +16 -3
  220. package/dist/utils/build-sankey-nodes.js.map +1 -1
  221. package/dist/utils/chart-scale.cjs +43 -0
  222. package/dist/utils/chart-scale.cjs.map +1 -0
  223. package/dist/utils/chart-scale.d.cts +22 -0
  224. package/dist/utils/chart-scale.d.ts +22 -0
  225. package/dist/utils/chart-scale.js +41 -0
  226. package/dist/utils/chart-scale.js.map +1 -0
  227. package/package.json +1 -1
  228. package/dist/theme-B3WtiByA.js.map +0 -1
  229. package/dist/theme-C9_OSe0S.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"money-saved-block.js","names":[],"sources":["../../src/components/money-saved-block.tsx"],"sourcesContent":["import { MaterialSymbol } from '../icons/material-symbol'\nimport { SectionTitle, StateValue } from './typography'\n\nconst MoneySavedContainer = ({\n children,\n ariaLabel = 'Money saved today',\n}: {\n children: React.ReactNode\n /** Override the accessible label for the container. Defaults to `\"Money saved today\"`. */\n ariaLabel?: string\n}) => {\n return (\n <div\n aria-label={ariaLabel}\n className=\"flex items-center justify-between gap-4\"\n >\n {children}\n </div>\n )\n}\n\nconst MoneySavedContent = ({ children }: { children: React.ReactNode }) => {\n return <div className=\"flex flex-col gap-1\">{children}</div>\n}\n\nconst MoneySavedTitle = ({ children }: { children: React.ReactNode }) => {\n return <SectionTitle>{children}</SectionTitle>\n}\n\nconst MoneySavedValue = ({ children }: { children: React.ReactNode }) => {\n return <StateValue>{children}</StateValue>\n}\n\nconst MoneySavedDelta = ({ children }: { children: React.ReactNode }) => {\n return (\n <span className=\"flex items-end gap-1 text-sm text-base-success-solid\">\n <MaterialSymbol className=\"rotate-180 text-[14px]\" name=\"swap_vert\" />\n <span className=\"tabular-nums\">{children}</span>\n </span>\n )\n}\n\nconst MoneySavedGaugeContainer = ({\n children,\n}: {\n children: React.ReactNode\n}) => {\n return (\n <div className=\"relative top-2 flex flex-col items-end gap-1\">\n {children}\n </div>\n )\n}\n\nconst MoneySavedGaugeContent = ({\n autarkyProgress,\n autarkyLabel,\n autarkyCaption = 'Autarky',\n gaugeWidth,\n gaugeHeight,\n gaugeArcPath,\n gaugeStrokeWidth,\n}: {\n autarkyProgress: number\n autarkyLabel: string\n /** Override the caption shown beneath the gauge. Defaults to `\"Autarky\"`. */\n autarkyCaption?: React.ReactNode\n gaugeWidth: number\n gaugeHeight: number\n gaugeArcPath: string\n gaugeStrokeWidth: number\n}) => {\n return (\n <>\n <svg\n className=\"h-[44px] w-[76px]\"\n viewBox={`0 0 ${gaugeWidth} ${gaugeHeight}`}\n aria-hidden=\"true\"\n >\n <path\n d={gaugeArcPath}\n fill=\"none\"\n stroke=\"var(--gray-a5)\"\n strokeWidth={gaugeStrokeWidth}\n strokeLinecap=\"round\"\n pathLength={1}\n />\n <path\n d={gaugeArcPath}\n fill=\"none\"\n stroke=\"var(--green-a9)\"\n strokeWidth={gaugeStrokeWidth}\n strokeLinecap=\"round\"\n pathLength={1}\n strokeDasharray={`${autarkyProgress} 1`}\n />\n </svg>\n <span className=\"absolute inset-0 flex items-center justify-center text-sm font-semibold text-gray\">\n {autarkyLabel}\n </span>\n <span className=\"mx-auto text-xs text-gray-light\">{autarkyCaption}</span>\n </>\n )\n}\n\nexport {\n MoneySavedContainer,\n MoneySavedContent,\n MoneySavedTitle,\n MoneySavedValue,\n MoneySavedDelta,\n MoneySavedGaugeContainer,\n MoneySavedGaugeContent,\n}\n"],"mappings":";;;;;AAGA,MAAM,uBAAuB,EAC3B,UACA,YAAY,0BAKR;AACJ,QACE,oBAAC,OAAD;EACE,cAAY;EACZ,WAAU;EAET;EACG,CAAA;;AAIV,MAAM,qBAAqB,EAAE,eAA8C;AACzE,QAAO,oBAAC,OAAD;EAAK,WAAU;EAAuB;EAAe,CAAA;;AAG9D,MAAM,mBAAmB,EAAE,eAA8C;AACvE,QAAO,oBAAC,cAAD,EAAe,UAAwB,CAAA;;AAGhD,MAAM,mBAAmB,EAAE,eAA8C;AACvE,QAAO,oBAAC,YAAD,EAAa,UAAsB,CAAA;;AAG5C,MAAM,mBAAmB,EAAE,eAA8C;AACvE,QACE,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,oBAAC,gBAAD;GAAgB,WAAU;GAAyB,MAAK;GAAc,CAAA,EACtE,oBAAC,QAAD;GAAM,WAAU;GAAgB;GAAgB,CAAA,CAC3C;;;AAIX,MAAM,4BAA4B,EAChC,eAGI;AACJ,QACE,oBAAC,OAAD;EAAK,WAAU;EACZ;EACG,CAAA;;AAIV,MAAM,0BAA0B,EAC9B,iBACA,cACA,iBAAiB,WACjB,YACA,aACA,cACA,uBAUI;AACJ,QACE,qBAAA,UAAA,EAAA,UAAA;EACE,qBAAC,OAAD;GACE,WAAU;GACV,SAAS,OAAO,WAAW,GAAG;GAC9B,eAAY;aAHd,CAKE,oBAAC,QAAD;IACE,GAAG;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,eAAc;IACd,YAAY;IACZ,CAAA,EACF,oBAAC,QAAD;IACE,GAAG;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,eAAc;IACd,YAAY;IACZ,iBAAiB,GAAG,gBAAgB;IACpC,CAAA,CACE;;EACN,oBAAC,QAAD;GAAM,WAAU;aACb;GACI,CAAA;EACP,oBAAC,QAAD;GAAM,WAAU;aAAmC;GAAsB,CAAA;EACxE,EAAA,CAAA"}
1
+ {"version":3,"file":"money-saved-block.js","names":[],"sources":["../../src/components/money-saved-block.tsx"],"sourcesContent":["import { MaterialSymbol } from '../icons/material-symbol'\nimport { SectionTitle, StateValue } from './typography'\n\nconst MoneySavedContainer = ({\n children,\n ariaLabel = 'Money saved today',\n}: {\n children: React.ReactNode\n /** Override the accessible label for the container. Defaults to `\"Money saved today\"`. */\n ariaLabel?: string\n}) => {\n return (\n <div\n aria-label={ariaLabel}\n className=\"flex items-center justify-between gap-4\"\n >\n {children}\n </div>\n )\n}\n\nconst MoneySavedContent = ({ children }: { children: React.ReactNode }) => {\n return <div className=\"flex flex-col gap-1\">{children}</div>\n}\n\nconst MoneySavedTitle = ({ children }: { children: React.ReactNode }) => {\n return <SectionTitle>{children}</SectionTitle>\n}\n\nconst MoneySavedValue = ({ children }: { children: React.ReactNode }) => {\n return <StateValue>{children}</StateValue>\n}\n\nconst MoneySavedDelta = ({ children }: { children: React.ReactNode }) => {\n return (\n <span className=\"flex items-end gap-1 text-sm text-base-success-solid\">\n <MaterialSymbol className=\"rotate-180 text-[14px]\" name=\"swap_vert\" />\n <span className=\"tabular-nums\">{children}</span>\n </span>\n )\n}\n\nconst MoneySavedGaugeContainer = ({\n children,\n}: {\n children: React.ReactNode\n}) => {\n return (\n <div className=\"relative top-2 flex flex-col items-end gap-1\">\n {children}\n </div>\n )\n}\n\nconst MoneySavedGaugeContent = ({\n autarkyProgress,\n autarkyLabel,\n autarkyCaption = 'Autarky',\n gaugeWidth,\n gaugeHeight,\n gaugeArcPath,\n gaugeStrokeWidth,\n}: {\n autarkyProgress: number\n autarkyLabel: string\n /** Override the caption shown beneath the gauge. Defaults to `\"Autarky\"`. */\n autarkyCaption?: React.ReactNode\n gaugeWidth: number\n gaugeHeight: number\n gaugeArcPath: string\n gaugeStrokeWidth: number\n}) => {\n return (\n <>\n <svg\n className=\"h-[44px] w-[76px]\"\n viewBox={`0 0 ${gaugeWidth} ${gaugeHeight}`}\n aria-hidden=\"true\"\n >\n <path\n d={gaugeArcPath}\n fill=\"none\"\n stroke=\"var(--neutral-a5)\"\n strokeWidth={gaugeStrokeWidth}\n strokeLinecap=\"round\"\n pathLength={1}\n />\n <path\n d={gaugeArcPath}\n fill=\"none\"\n stroke=\"var(--green-a9)\"\n strokeWidth={gaugeStrokeWidth}\n strokeLinecap=\"round\"\n pathLength={1}\n strokeDasharray={`${autarkyProgress} 1`}\n />\n </svg>\n <span className=\"absolute inset-0 flex items-center justify-center text-sm font-semibold text-gray\">\n {autarkyLabel}\n </span>\n <span className=\"mx-auto text-xs text-gray-light\">{autarkyCaption}</span>\n </>\n )\n}\n\nexport {\n MoneySavedContainer,\n MoneySavedContent,\n MoneySavedTitle,\n MoneySavedValue,\n MoneySavedDelta,\n MoneySavedGaugeContainer,\n MoneySavedGaugeContent,\n}\n"],"mappings":";;;;;AAGA,MAAM,uBAAuB,EAC3B,UACA,YAAY,0BAKR;AACJ,QACE,oBAAC,OAAD;EACE,cAAY;EACZ,WAAU;EAET;EACG,CAAA;;AAIV,MAAM,qBAAqB,EAAE,eAA8C;AACzE,QAAO,oBAAC,OAAD;EAAK,WAAU;EAAuB;EAAe,CAAA;;AAG9D,MAAM,mBAAmB,EAAE,eAA8C;AACvE,QAAO,oBAAC,cAAD,EAAe,UAAwB,CAAA;;AAGhD,MAAM,mBAAmB,EAAE,eAA8C;AACvE,QAAO,oBAAC,YAAD,EAAa,UAAsB,CAAA;;AAG5C,MAAM,mBAAmB,EAAE,eAA8C;AACvE,QACE,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,oBAAC,gBAAD;GAAgB,WAAU;GAAyB,MAAK;GAAc,CAAA,EACtE,oBAAC,QAAD;GAAM,WAAU;GAAgB;GAAgB,CAAA,CAC3C;;;AAIX,MAAM,4BAA4B,EAChC,eAGI;AACJ,QACE,oBAAC,OAAD;EAAK,WAAU;EACZ;EACG,CAAA;;AAIV,MAAM,0BAA0B,EAC9B,iBACA,cACA,iBAAiB,WACjB,YACA,aACA,cACA,uBAUI;AACJ,QACE,qBAAA,UAAA,EAAA,UAAA;EACE,qBAAC,OAAD;GACE,WAAU;GACV,SAAS,OAAO,WAAW,GAAG;GAC9B,eAAY;aAHd,CAKE,oBAAC,QAAD;IACE,GAAG;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,eAAc;IACd,YAAY;IACZ,CAAA,EACF,oBAAC,QAAD;IACE,GAAG;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,eAAc;IACd,YAAY;IACZ,iBAAiB,GAAG,gBAAgB;IACpC,CAAA,CACE;;EACN,oBAAC,QAAD;GAAM,WAAU;aACb;GACI,CAAA;EACP,oBAAC,QAAD;GAAM,WAAU;aAAmC;GAAsB,CAAA;EACxE,EAAA,CAAA"}
@@ -1,4 +1,4 @@
1
1
  "use client";
2
2
 
3
- import { n as NumberFlow, r as NumberFlowProps, t as Format } from "../number-flow-DSbucQ_K.js";
3
+ import { n as NumberFlow, r as NumberFlowProps, t as Format } from "../number-flow-D9zsxH0-.js";
4
4
  export { Format, NumberFlowProps, NumberFlow as default };
@@ -1,8 +1,10 @@
1
1
  "use client";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require_chunk = require("../chunk-aJGBMT86.cjs");
4
+ const require_hooks_use_reduced_motion = require("../hooks/use-reduced-motion.cjs");
4
5
  require("../utils/chars.cjs");
5
6
  const require_utils_format = require("../utils/format.cjs");
7
+ const require_utils_chart_scale = require("../utils/chart-scale.cjs");
6
8
  const require_components_chart = require("./chart.cjs");
7
9
  const require_components_series_legend = require("./series-legend.cjs");
8
10
  const require_components_typography = require("./typography.cjs");
@@ -32,7 +34,7 @@ const SERIES_COLORS = {
32
34
  solar: "var(--orange-a9)",
33
35
  grid: "var(--blue-9)",
34
36
  battery: "var(--green-a9)",
35
- consumption: "var(--gray-12)"
37
+ consumption: "var(--neutral-12)"
36
38
  };
37
39
  const PADDING_TOP = 20;
38
40
  const PADDING_BOTTOM = 28;
@@ -41,32 +43,6 @@ const Y_AXIS_GUTTER = 34;
41
43
  const X_TICK_COUNT = 6;
42
44
  const DEFAULT_HEIGHT = 260;
43
45
  const tBisector = (0, _visx_vendor_d3_array.bisector)((d) => d.t);
44
- function niceStep(rough) {
45
- const normalized = rough === 0 ? 1 : rough;
46
- const magnitude = Math.pow(10, Math.floor(Math.log10(normalized)));
47
- return ([
48
- 1,
49
- 2,
50
- 2.5,
51
- 5,
52
- 10
53
- ].find((value) => value * magnitude >= normalized) ?? 10) * magnitude;
54
- }
55
- function buildAreaYTicks(min, max) {
56
- const step = niceStep((max - min || 1) / 4);
57
- const lo = Math.floor(min / step) * step;
58
- const hi = Math.ceil(max / step) * step;
59
- const ticks = [];
60
- for (let value = lo; value <= hi + step * .001; value += step) ticks.push(Number(value.toFixed(6)));
61
- return {
62
- ticks,
63
- lo,
64
- hi
65
- };
66
- }
67
- function formatYTick(value) {
68
- return Math.abs(value) >= 10 ? require_utils_format.integerFormat.format(value) : require_utils_format.oneDecimalFormat.format(value);
69
- }
70
46
  /**
71
47
  * Diverging "power sources" area chart over a continuous time axis: solar
72
48
  * (orange), grid (blue) and battery (green) areas around a zero baseline, with
@@ -74,10 +50,13 @@ function formatYTick(value) {
74
50
  * charging) dip below zero. For instantaneous power (day view). A legend at the
75
51
  * top toggles each series on/off; the y-axis rescales to the visible ones. visx.
76
52
  */
77
- function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlightAt, title, className, height = DEFAULT_HEIGHT }) {
53
+ function PowerHistoryChart({ data, unit, formatX, formatTooltipX, formatValue, labels, omitSeries, highlightAt, title, className, height = DEFAULT_HEIGHT }) {
54
+ const fmtTooltipX = formatTooltipX ?? formatX;
78
55
  const containerRef = (0, react.useRef)(null);
56
+ const reducedMotion = require_hooks_use_reduced_motion.useReducedMotion();
79
57
  const [width, setWidth] = (0, react.useState)(0);
80
58
  const [hiddenSeries, setHiddenSeries] = (0, react.useState)(() => /* @__PURE__ */ new Set());
59
+ const omitted = (0, react.useMemo)(() => new Set(omitSeries), [omitSeries]);
81
60
  const toggleSeries = (0, react.useCallback)((id) => {
82
61
  setHiddenSeries((prev) => {
83
62
  const next = new Set(prev);
@@ -86,7 +65,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
86
65
  return next;
87
66
  });
88
67
  }, []);
89
- const isHidden = (0, react.useCallback)((key) => hiddenSeries.has(key), [hiddenSeries]);
68
+ const isHidden = (0, react.useCallback)((key) => omitted.has(key) || hiddenSeries.has(key), [hiddenSeries, omitted]);
90
69
  const { showTooltip, hideTooltip, tooltipData, tooltipLeft, tooltipTop, tooltipOpen } = (0, _visx_tooltip.useTooltip)();
91
70
  (0, react.useEffect)(() => {
92
71
  const element = containerRef.current;
@@ -106,13 +85,13 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
106
85
  let min = 0;
107
86
  let max = 0;
108
87
  for (const d of data) {
109
- if (!hiddenSeries.has("solar")) max = Math.max(max, d.solar);
110
- if (!hiddenSeries.has("consumption")) max = Math.max(max, d.consumption);
111
- if (!hiddenSeries.has("grid")) {
88
+ if (!isHidden("solar")) max = Math.max(max, d.solar);
89
+ if (!isHidden("consumption")) max = Math.max(max, d.consumption);
90
+ if (!isHidden("grid")) {
112
91
  max = Math.max(max, d.grid);
113
92
  min = Math.min(min, d.grid);
114
93
  }
115
- if (!hiddenSeries.has("battery")) {
94
+ if (!isHidden("battery")) {
116
95
  max = Math.max(max, d.battery);
117
96
  min = Math.min(min, d.battery);
118
97
  }
@@ -121,8 +100,8 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
121
100
  yMin: min,
122
101
  yMax: max
123
102
  };
124
- }, [data, hiddenSeries]);
125
- const { ticks: yTicks, lo, hi } = (0, react.useMemo)(() => buildAreaYTicks(yMin, yMax), [yMin, yMax]);
103
+ }, [data, isHidden]);
104
+ const { ticks: yTicks, min: lo, max: hi } = (0, react.useMemo)(() => require_utils_chart_scale.buildYAxisScale(yMin, yMax), [yMin, yMax]);
126
105
  const plotRight = Math.max(Y_AXIS_GUTTER, width - PADDING_RIGHT);
127
106
  const xScale = (0, react.useMemo)(() => (0, _visx_scale.scaleLinear)({
128
107
  domain: [tMin, tMax === tMin ? tMin + 1 : tMax],
@@ -163,7 +142,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
163
142
  showTooltip,
164
143
  xScale
165
144
  ]);
166
- const legendItems = SERIES_KEYS.map((key) => ({
145
+ const legendItems = SERIES_KEYS.filter((key) => !omitted.has(key)).map((key) => ({
167
146
  id: key,
168
147
  label: labels[key],
169
148
  color: SERIES_COLORS[key]
@@ -229,15 +208,15 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
229
208
  x2: plotRight,
230
209
  y1: y,
231
210
  y2: y,
232
- stroke: "var(--gray-a4)",
211
+ stroke: "var(--neutral-a4)",
233
212
  strokeWidth: 1
234
213
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
235
214
  x: Y_AXIS_GUTTER - 7,
236
215
  y: y + 3,
237
216
  textAnchor: "end",
238
- fill: "var(--gray-a11)",
217
+ fill: "var(--neutral-a11)",
239
218
  fontSize: 10,
240
- children: formatYTick(tick)
219
+ children: require_utils_chart_scale.formatYAxisTick(tick)
241
220
  })] }, `y-tick-${tick}`);
242
221
  }),
243
222
  AREA_KEYS.filter((key) => !isHidden(key)).map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_visx_shape.Area, {
@@ -272,7 +251,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
272
251
  x2: plotRight,
273
252
  y1: yScale(0),
274
253
  y2: yScale(0),
275
- stroke: "var(--slate-a6)",
254
+ stroke: "var(--neutral-a6)",
276
255
  strokeWidth: 1
277
256
  }),
278
257
  showHighlight && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
@@ -289,7 +268,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
289
268
  x: xScale(tick),
290
269
  y: height - PADDING_BOTTOM + 16,
291
270
  textAnchor: "middle",
292
- fill: "var(--gray-a11)",
271
+ fill: "var(--neutral-a11)",
293
272
  fontSize: 10,
294
273
  children: formatX(tick)
295
274
  }, `x-tick-${tick}`)),
@@ -299,7 +278,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
299
278
  x2: xScale(tooltipData.t),
300
279
  y1: PADDING_TOP,
301
280
  y2: height - PADDING_BOTTOM,
302
- stroke: "var(--slate-a6)",
281
+ stroke: "var(--neutral-a6)",
303
282
  strokeDasharray: "4 4",
304
283
  pointerEvents: "none"
305
284
  }),
@@ -341,10 +320,10 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
341
320
  left: tooltipPos.left,
342
321
  top: tooltipPos.top,
343
322
  opacity: tooltipOpen && tooltipData ? 1 : 0,
344
- transition: "left 140ms ease-out, top 140ms ease-out, opacity 140ms ease-out"
323
+ transition: reducedMotion ? "opacity 140ms ease-out" : "left 140ms ease-out, top 140ms ease-out, opacity 140ms ease-out"
345
324
  },
346
325
  children: tooltipData && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components_chart.ChartTooltipCard, {
347
- label: formatX(tooltipData.t),
326
+ label: fmtTooltipX(tooltipData.t),
348
327
  rows: tooltipRows
349
328
  })
350
329
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"power-history-chart.cjs","names":["integerFormat","oneDecimalFormat","valueFormat","useMeasuredSize","clampTooltipPosition","SectionTitle","SeriesLegend","Area","curveMonotoneX","LinePath","ChartTooltipCard"],"sources":["../../src/components/power-history-chart.tsx"],"sourcesContent":["import { curveMonotoneX } from '@visx/curve'\nimport { localPoint } from '@visx/event'\nimport { scaleLinear } from '@visx/scale'\nimport { Area, LinePath } from '@visx/shape'\nimport { useTooltip } from '@visx/tooltip'\nimport { bisector } from '@visx/vendor/d3-array'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { NARROW_NBSP } from '../utils/chars'\nimport { cn } from '../utils/cn'\nimport {\n integerFormat,\n oneDecimalFormat,\n twoDecimalFormat as valueFormat,\n} from '../utils/format'\nimport {\n ChartTooltipCard,\n type ChartTooltipRow,\n clampTooltipPosition,\n useMeasuredSize,\n} from './chart'\nimport { SeriesLegend, type SeriesLegendItem } from './series-legend'\nimport { SectionTitle } from './typography'\n\nexport interface PowerHistoryPoint {\n /** Epoch milliseconds. */\n t: number\n solar: number\n /** Signed: positive = import, negative = feed-in. */\n grid: number\n /** Signed: positive = discharge, negative = charge. */\n battery: number\n consumption: number\n}\n\nexport interface PowerHistoryChartProps {\n data: PowerHistoryPoint[]\n /** Axis/tooltip unit, e.g. \"kW\". */\n unit: string\n formatX: (t: number) => string\n formatValue?: (value: number) => string\n labels: {\n solar: string\n grid: string\n battery: string\n consumption: string\n }\n /** Epoch ms to mark with the current-time dashed line (omit to hide). */\n highlightAt?: number\n title?: string\n className?: string\n height?: number\n}\n\nconst AREA_KEYS = ['solar', 'grid', 'battery'] as const\n\n// All toggleable series, in legend order. The areas (solar/grid/battery) plus\n// the consumption overlay line.\nconst SERIES_KEYS = ['solar', 'grid', 'battery', 'consumption'] as const\ntype SeriesKey = (typeof SERIES_KEYS)[number]\n\nconst SERIES_COLORS = {\n solar: 'var(--orange-a9)',\n grid: 'var(--blue-9)',\n battery: 'var(--green-a9)',\n consumption: 'var(--gray-12)',\n} as const\n\nconst PADDING_TOP = 20\nconst PADDING_BOTTOM = 28\nconst PADDING_RIGHT = 8\nconst Y_AXIS_GUTTER = 34\nconst X_TICK_COUNT = 6\nconst DEFAULT_HEIGHT = 260\n\nconst tBisector = bisector<PowerHistoryPoint, number>((d) => d.t)\n\nfunction niceStep(rough: number) {\n const normalized = rough === 0 ? 1 : rough\n const magnitude = Math.pow(10, Math.floor(Math.log10(normalized)))\n const steps = [1, 2, 2.5, 5, 10]\n return (\n (steps.find((value) => value * magnitude >= normalized) ?? 10) * magnitude\n )\n}\n\n// Nice y ticks that always include zero, supporting negative values (feed-in /\n// battery charging dip below the baseline).\nfunction buildAreaYTicks(min: number, max: number) {\n const step = niceStep((max - min || 1) / 4)\n const lo = Math.floor(min / step) * step\n const hi = Math.ceil(max / step) * step\n const ticks: number[] = []\n for (let value = lo; value <= hi + step * 0.001; value += step) {\n ticks.push(Number(value.toFixed(6)))\n }\n return { ticks, lo, hi }\n}\n\nfunction formatYTick(value: number) {\n return Math.abs(value) >= 10\n ? integerFormat.format(value)\n : oneDecimalFormat.format(value)\n}\n\n/**\n * Diverging \"power sources\" area chart over a continuous time axis: solar\n * (orange), grid (blue) and battery (green) areas around a zero baseline, with\n * consumption overlaid as a line. Negative values (grid feed-in, battery\n * charging) dip below zero. For instantaneous power (day view). A legend at the\n * top toggles each series on/off; the y-axis rescales to the visible ones. visx.\n */\nexport function PowerHistoryChart({\n data,\n unit,\n formatX,\n formatValue,\n labels,\n highlightAt,\n title,\n className,\n height = DEFAULT_HEIGHT,\n}: PowerHistoryChartProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [width, setWidth] = useState(0)\n const [hiddenSeries, setHiddenSeries] = useState<ReadonlySet<string>>(\n () => new Set(),\n )\n\n const toggleSeries = useCallback((id: string) => {\n setHiddenSeries((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n const isHidden = useCallback(\n (key: SeriesKey) => hiddenSeries.has(key),\n [hiddenSeries],\n )\n\n const {\n showTooltip,\n hideTooltip,\n tooltipData,\n tooltipLeft,\n tooltipTop,\n tooltipOpen,\n } = useTooltip<PowerHistoryPoint>()\n\n useEffect(() => {\n const element = containerRef.current\n if (!element) return\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (!entry) return\n setWidth(entry.contentRect.width)\n })\n\n resizeObserver.observe(element)\n return () => resizeObserver.disconnect()\n }, [])\n\n const fmtValue = (value: number) =>\n formatValue\n ? formatValue(value)\n : `${valueFormat.format(value)}${NARROW_NBSP}${unit}`\n\n const tMin = data.length ? (data[0]?.t ?? 0) : 0\n const tMax = data.length ? (data[data.length - 1]?.t ?? 0) : 0\n\n const { yMin, yMax } = useMemo(() => {\n let min = 0\n let max = 0\n for (const d of data) {\n if (!hiddenSeries.has('solar')) max = Math.max(max, d.solar)\n if (!hiddenSeries.has('consumption')) max = Math.max(max, d.consumption)\n if (!hiddenSeries.has('grid')) {\n max = Math.max(max, d.grid)\n min = Math.min(min, d.grid)\n }\n if (!hiddenSeries.has('battery')) {\n max = Math.max(max, d.battery)\n min = Math.min(min, d.battery)\n }\n }\n return { yMin: min, yMax: max }\n }, [data, hiddenSeries])\n\n const {\n ticks: yTicks,\n lo,\n hi,\n } = useMemo(() => buildAreaYTicks(yMin, yMax), [yMin, yMax])\n\n const plotRight = Math.max(Y_AXIS_GUTTER, width - PADDING_RIGHT)\n\n const xScale = useMemo(\n () =>\n scaleLinear<number>({\n domain: [tMin, tMax === tMin ? tMin + 1 : tMax],\n range: [Y_AXIS_GUTTER, plotRight],\n }),\n [tMin, tMax, plotRight],\n )\n\n const yScale = useMemo(\n () =>\n scaleLinear<number>({\n domain: [lo, hi === lo ? lo + 1 : hi],\n range: [height - PADDING_BOTTOM, PADDING_TOP],\n }),\n [lo, hi, height],\n )\n\n const xTicks = useMemo(() => {\n if (tMax <= tMin) return [tMin]\n return Array.from(\n { length: X_TICK_COUNT },\n (_, i) => tMin + (i / (X_TICK_COUNT - 1)) * (tMax - tMin),\n )\n }, [tMin, tMax])\n\n const handleTooltip = useCallback(\n (\n event:\n | React.TouchEvent<SVGRectElement>\n | React.MouseEvent<SVGRectElement>,\n ) => {\n const point = localPoint(event)\n if (!point || data.length === 0) return\n\n const xMs = xScale.invert(point.x)\n const index = tBisector.left(data, xMs, 1)\n const d0 = data[index - 1]\n const d1 = data[index]\n if (!d0) return\n\n const d = d1 && xMs - d0.t > d1.t - xMs ? d1 : d0\n showTooltip({\n tooltipData: d,\n tooltipLeft: xScale(d.t),\n tooltipTop: PADDING_TOP,\n })\n },\n [data, showTooltip, xScale],\n )\n\n const legendItems: SeriesLegendItem[] = SERIES_KEYS.map((key) => ({\n id: key,\n label: labels[key],\n color: SERIES_COLORS[key],\n }))\n\n const tooltipRows: ChartTooltipRow[] = tooltipData\n ? SERIES_KEYS.filter((key) => !isHidden(key)).map((key) => ({\n key,\n label: labels[key],\n color: SERIES_COLORS[key],\n value: fmtValue(tooltipData[key]),\n }))\n : []\n\n const showHighlight =\n highlightAt !== undefined && highlightAt >= tMin && highlightAt <= tMax\n\n const [tooltipRef, tooltipSize] = useMeasuredSize<HTMLDivElement>()\n const tooltipPos = clampTooltipPosition({\n anchorX: tooltipLeft ?? 0,\n anchorY: tooltipTop ?? PADDING_TOP,\n width,\n height,\n tipWidth: tooltipSize.width,\n tipHeight: tooltipSize.height,\n placement: 'beside',\n })\n\n return (\n <div className={cn('flex w-full flex-col gap-2', className)}>\n {title && <SectionTitle>{title}</SectionTitle>}\n <SeriesLegend\n items={legendItems}\n hiddenIds={hiddenSeries}\n onToggle={toggleSeries}\n />\n <span className=\"px-1 text-xs text-gray-light\">{unit}</span>\n <div ref={containerRef} className=\"relative w-full\" style={{ height }}>\n {width > 0 && (\n <svg width={width} height={height}>\n <defs>\n {AREA_KEYS.map((key) => (\n <linearGradient\n key={key}\n id={`power-history-fill-${key}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop\n offset=\"0%\"\n stopColor={SERIES_COLORS[key]}\n stopOpacity={0.35}\n />\n <stop\n offset=\"100%\"\n stopColor={SERIES_COLORS[key]}\n stopOpacity={0.04}\n />\n </linearGradient>\n ))}\n </defs>\n\n {yTicks.map((tick) => {\n const y = yScale(tick)\n return (\n <g key={`y-tick-${tick}`}>\n <line\n x1={Y_AXIS_GUTTER}\n x2={plotRight}\n y1={y}\n y2={y}\n stroke=\"var(--gray-a4)\"\n strokeWidth={1}\n />\n <text\n x={Y_AXIS_GUTTER - 7}\n y={y + 3}\n textAnchor=\"end\"\n fill=\"var(--gray-a11)\"\n fontSize={10}\n >\n {formatYTick(tick)}\n </text>\n </g>\n )\n })}\n\n {AREA_KEYS.filter((key) => !isHidden(key)).map((key) => (\n <Area<PowerHistoryPoint>\n key={`area-${key}`}\n data={data}\n x={(d) => xScale(d.t)}\n y0={yScale(0)}\n y1={(d) => yScale(d[key])}\n curve={curveMonotoneX}\n fill={`url(#power-history-fill-${key})`}\n stroke=\"transparent\"\n />\n ))}\n\n {AREA_KEYS.filter((key) => !isHidden(key)).map((key) => (\n <LinePath<PowerHistoryPoint>\n key={`line-${key}`}\n data={data}\n x={(d) => xScale(d.t)}\n y={(d) => yScale(d[key])}\n curve={curveMonotoneX}\n stroke={SERIES_COLORS[key]}\n strokeWidth={1.5}\n fill=\"none\"\n />\n ))}\n\n {!isHidden('consumption') && (\n <LinePath<PowerHistoryPoint>\n data={data}\n x={(d) => xScale(d.t)}\n y={(d) => yScale(d.consumption)}\n curve={curveMonotoneX}\n stroke={SERIES_COLORS.consumption}\n strokeWidth={1.5}\n fill=\"none\"\n />\n )}\n\n <line\n x1={Y_AXIS_GUTTER}\n x2={plotRight}\n y1={yScale(0)}\n y2={yScale(0)}\n stroke=\"var(--slate-a6)\"\n strokeWidth={1}\n />\n\n {showHighlight && (\n <line\n x1={xScale(highlightAt)}\n x2={xScale(highlightAt)}\n y1={PADDING_TOP}\n y2={height - PADDING_BOTTOM}\n stroke=\"var(--spark-a9)\"\n strokeWidth={1.5}\n strokeDasharray=\"5 4\"\n pointerEvents=\"none\"\n />\n )}\n\n {xTicks.map((tick) => (\n <text\n key={`x-tick-${tick}`}\n x={xScale(tick)}\n y={height - PADDING_BOTTOM + 16}\n textAnchor=\"middle\"\n fill=\"var(--gray-a11)\"\n fontSize={10}\n >\n {formatX(tick)}\n </text>\n ))}\n\n {tooltipOpen && tooltipData && (\n <>\n <line\n x1={xScale(tooltipData.t)}\n x2={xScale(tooltipData.t)}\n y1={PADDING_TOP}\n y2={height - PADDING_BOTTOM}\n stroke=\"var(--slate-a6)\"\n strokeDasharray=\"4 4\"\n pointerEvents=\"none\"\n />\n {AREA_KEYS.filter((key) => !isHidden(key)).map((key) => (\n <circle\n key={`dot-${key}`}\n cx={xScale(tooltipData.t)}\n cy={yScale(tooltipData[key])}\n r={3.5}\n fill={SERIES_COLORS[key]}\n stroke=\"white\"\n strokeWidth={1.5}\n pointerEvents=\"none\"\n />\n ))}\n {!isHidden('consumption') && (\n <circle\n cx={xScale(tooltipData.t)}\n cy={yScale(tooltipData.consumption)}\n r={3.5}\n fill={SERIES_COLORS.consumption}\n stroke=\"white\"\n strokeWidth={1.5}\n pointerEvents=\"none\"\n />\n )}\n </>\n )}\n\n <rect\n x={Y_AXIS_GUTTER}\n y={PADDING_TOP}\n width={Math.max(0, plotRight - Y_AXIS_GUTTER)}\n height={Math.max(0, height - PADDING_BOTTOM - PADDING_TOP)}\n fill=\"transparent\"\n onMouseMove={handleTooltip}\n onMouseLeave={hideTooltip}\n onTouchMove={handleTooltip}\n onTouchEnd={hideTooltip}\n />\n </svg>\n )}\n\n <div\n ref={tooltipRef}\n className=\"pointer-events-none absolute z-10\"\n style={{\n left: tooltipPos.left,\n top: tooltipPos.top,\n opacity: tooltipOpen && tooltipData ? 1 : 0,\n transition:\n 'left 140ms ease-out, top 140ms ease-out, opacity 140ms ease-out',\n }}\n >\n {tooltipData && (\n <ChartTooltipCard\n label={formatX(tooltipData.t)}\n rows={tooltipRows}\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"power-history-chart.cjs","names":["useReducedMotion","valueFormat","buildYAxisScale","useMeasuredSize","clampTooltipPosition","SectionTitle","SeriesLegend","formatYAxisTick","Area","curveMonotoneX","LinePath","ChartTooltipCard"],"sources":["../../src/components/power-history-chart.tsx"],"sourcesContent":["import { curveMonotoneX } from '@visx/curve'\nimport { localPoint } from '@visx/event'\nimport { scaleLinear } from '@visx/scale'\nimport { Area, LinePath } from '@visx/shape'\nimport { useTooltip } from '@visx/tooltip'\nimport { bisector } from '@visx/vendor/d3-array'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useReducedMotion } from '../hooks/use-reduced-motion'\nimport { NARROW_NBSP } from '../utils/chars'\nimport { buildYAxisScale, formatYAxisTick } from '../utils/chart-scale'\nimport { cn } from '../utils/cn'\nimport { twoDecimalFormat as valueFormat } from '../utils/format'\nimport {\n ChartTooltipCard,\n type ChartTooltipRow,\n clampTooltipPosition,\n useMeasuredSize,\n} from './chart'\nimport { SeriesLegend, type SeriesLegendItem } from './series-legend'\nimport { SectionTitle } from './typography'\n\nexport interface PowerHistoryPoint {\n /** Epoch milliseconds. */\n t: number\n solar: number\n /** Signed: positive = import, negative = feed-in. */\n grid: number\n /** Signed: positive = discharge, negative = charge. */\n battery: number\n consumption: number\n}\n\nexport interface PowerHistoryChartProps {\n data: PowerHistoryPoint[]\n /** Axis/tooltip unit, e.g. \"kW\". */\n unit: string\n formatX: (t: number) => string\n /** Tooltip time formatter. Defaults to `formatX`; use to keep the tooltip's\n * full clock time when the axis ticks are compact (hour-only). */\n formatTooltipX?: (t: number) => string\n formatValue?: (value: number) => string\n labels: {\n solar: string\n grid: string\n battery: string\n consumption: string\n }\n /** Series to drop entirely (no legend entry, area, or tooltip row). */\n omitSeries?: readonly PowerHistorySeriesKey[]\n /** Epoch ms to mark with the current-time dashed line (omit to hide). */\n highlightAt?: number\n title?: string\n className?: string\n height?: number\n}\n\nconst AREA_KEYS = ['solar', 'grid', 'battery'] as const\n\n// All toggleable series, in legend order. The areas (solar/grid/battery) plus\n// the consumption overlay line.\nconst SERIES_KEYS = ['solar', 'grid', 'battery', 'consumption'] as const\nexport type PowerHistorySeriesKey = (typeof SERIES_KEYS)[number]\ntype SeriesKey = PowerHistorySeriesKey\n\nconst SERIES_COLORS = {\n solar: 'var(--orange-a9)',\n grid: 'var(--blue-9)',\n battery: 'var(--green-a9)',\n consumption: 'var(--neutral-12)',\n} as const\n\nconst PADDING_TOP = 20\nconst PADDING_BOTTOM = 28\nconst PADDING_RIGHT = 8\nconst Y_AXIS_GUTTER = 34\nconst X_TICK_COUNT = 6\nconst DEFAULT_HEIGHT = 260\n\nconst tBisector = bisector<PowerHistoryPoint, number>((d) => d.t)\n\n/**\n * Diverging \"power sources\" area chart over a continuous time axis: solar\n * (orange), grid (blue) and battery (green) areas around a zero baseline, with\n * consumption overlaid as a line. Negative values (grid feed-in, battery\n * charging) dip below zero. For instantaneous power (day view). A legend at the\n * top toggles each series on/off; the y-axis rescales to the visible ones. visx.\n */\nexport function PowerHistoryChart({\n data,\n unit,\n formatX,\n formatTooltipX,\n formatValue,\n labels,\n omitSeries,\n highlightAt,\n title,\n className,\n height = DEFAULT_HEIGHT,\n}: PowerHistoryChartProps) {\n const fmtTooltipX = formatTooltipX ?? formatX\n const containerRef = useRef<HTMLDivElement>(null)\n const reducedMotion = useReducedMotion()\n const [width, setWidth] = useState(0)\n const [hiddenSeries, setHiddenSeries] = useState<ReadonlySet<string>>(\n () => new Set(),\n )\n const omitted = useMemo(() => new Set<SeriesKey>(omitSeries), [omitSeries])\n\n const toggleSeries = useCallback((id: string) => {\n setHiddenSeries((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n const isHidden = useCallback(\n (key: SeriesKey) => omitted.has(key) || hiddenSeries.has(key),\n [hiddenSeries, omitted],\n )\n\n const {\n showTooltip,\n hideTooltip,\n tooltipData,\n tooltipLeft,\n tooltipTop,\n tooltipOpen,\n } = useTooltip<PowerHistoryPoint>()\n\n useEffect(() => {\n const element = containerRef.current\n if (!element) return\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (!entry) return\n setWidth(entry.contentRect.width)\n })\n\n resizeObserver.observe(element)\n return () => resizeObserver.disconnect()\n }, [])\n\n const fmtValue = (value: number) =>\n formatValue\n ? formatValue(value)\n : `${valueFormat.format(value)}${NARROW_NBSP}${unit}`\n\n const tMin = data.length ? (data[0]?.t ?? 0) : 0\n const tMax = data.length ? (data[data.length - 1]?.t ?? 0) : 0\n\n const { yMin, yMax } = useMemo(() => {\n let min = 0\n let max = 0\n for (const d of data) {\n if (!isHidden('solar')) max = Math.max(max, d.solar)\n if (!isHidden('consumption')) max = Math.max(max, d.consumption)\n if (!isHidden('grid')) {\n max = Math.max(max, d.grid)\n min = Math.min(min, d.grid)\n }\n if (!isHidden('battery')) {\n max = Math.max(max, d.battery)\n min = Math.min(min, d.battery)\n }\n }\n return { yMin: min, yMax: max }\n }, [data, isHidden])\n\n const {\n ticks: yTicks,\n min: lo,\n max: hi,\n } = useMemo(() => buildYAxisScale(yMin, yMax), [yMin, yMax])\n\n const plotRight = Math.max(Y_AXIS_GUTTER, width - PADDING_RIGHT)\n\n const xScale = useMemo(\n () =>\n scaleLinear<number>({\n domain: [tMin, tMax === tMin ? tMin + 1 : tMax],\n range: [Y_AXIS_GUTTER, plotRight],\n }),\n [tMin, tMax, plotRight],\n )\n\n const yScale = useMemo(\n () =>\n scaleLinear<number>({\n domain: [lo, hi === lo ? lo + 1 : hi],\n range: [height - PADDING_BOTTOM, PADDING_TOP],\n }),\n [lo, hi, height],\n )\n\n const xTicks = useMemo(() => {\n if (tMax <= tMin) return [tMin]\n return Array.from(\n { length: X_TICK_COUNT },\n (_, i) => tMin + (i / (X_TICK_COUNT - 1)) * (tMax - tMin),\n )\n }, [tMin, tMax])\n\n const handleTooltip = useCallback(\n (\n event:\n | React.TouchEvent<SVGRectElement>\n | React.MouseEvent<SVGRectElement>,\n ) => {\n const point = localPoint(event)\n if (!point || data.length === 0) return\n\n const xMs = xScale.invert(point.x)\n const index = tBisector.left(data, xMs, 1)\n const d0 = data[index - 1]\n const d1 = data[index]\n if (!d0) return\n\n const d = d1 && xMs - d0.t > d1.t - xMs ? d1 : d0\n showTooltip({\n tooltipData: d,\n tooltipLeft: xScale(d.t),\n tooltipTop: PADDING_TOP,\n })\n },\n [data, showTooltip, xScale],\n )\n\n const legendItems: SeriesLegendItem[] = SERIES_KEYS.filter(\n (key) => !omitted.has(key),\n ).map((key) => ({\n id: key,\n label: labels[key],\n color: SERIES_COLORS[key],\n }))\n\n const tooltipRows: ChartTooltipRow[] = tooltipData\n ? SERIES_KEYS.filter((key) => !isHidden(key)).map((key) => ({\n key,\n label: labels[key],\n color: SERIES_COLORS[key],\n value: fmtValue(tooltipData[key]),\n }))\n : []\n\n const showHighlight =\n highlightAt !== undefined && highlightAt >= tMin && highlightAt <= tMax\n\n const [tooltipRef, tooltipSize] = useMeasuredSize<HTMLDivElement>()\n const tooltipPos = clampTooltipPosition({\n anchorX: tooltipLeft ?? 0,\n anchorY: tooltipTop ?? PADDING_TOP,\n width,\n height,\n tipWidth: tooltipSize.width,\n tipHeight: tooltipSize.height,\n placement: 'beside',\n })\n\n return (\n <div className={cn('flex w-full flex-col gap-2', className)}>\n {title && <SectionTitle>{title}</SectionTitle>}\n <SeriesLegend\n items={legendItems}\n hiddenIds={hiddenSeries}\n onToggle={toggleSeries}\n />\n <span className=\"px-1 text-xs text-gray-light\">{unit}</span>\n <div ref={containerRef} className=\"relative w-full\" style={{ height }}>\n {width > 0 && (\n <svg width={width} height={height}>\n <defs>\n {AREA_KEYS.map((key) => (\n <linearGradient\n key={key}\n id={`power-history-fill-${key}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop\n offset=\"0%\"\n stopColor={SERIES_COLORS[key]}\n stopOpacity={0.35}\n />\n <stop\n offset=\"100%\"\n stopColor={SERIES_COLORS[key]}\n stopOpacity={0.04}\n />\n </linearGradient>\n ))}\n </defs>\n\n {yTicks.map((tick) => {\n const y = yScale(tick)\n return (\n <g key={`y-tick-${tick}`}>\n <line\n x1={Y_AXIS_GUTTER}\n x2={plotRight}\n y1={y}\n y2={y}\n stroke=\"var(--neutral-a4)\"\n strokeWidth={1}\n />\n <text\n x={Y_AXIS_GUTTER - 7}\n y={y + 3}\n textAnchor=\"end\"\n fill=\"var(--neutral-a11)\"\n fontSize={10}\n >\n {formatYAxisTick(tick)}\n </text>\n </g>\n )\n })}\n\n {AREA_KEYS.filter((key) => !isHidden(key)).map((key) => (\n <Area<PowerHistoryPoint>\n key={`area-${key}`}\n data={data}\n x={(d) => xScale(d.t)}\n y0={yScale(0)}\n y1={(d) => yScale(d[key])}\n curve={curveMonotoneX}\n fill={`url(#power-history-fill-${key})`}\n stroke=\"transparent\"\n />\n ))}\n\n {AREA_KEYS.filter((key) => !isHidden(key)).map((key) => (\n <LinePath<PowerHistoryPoint>\n key={`line-${key}`}\n data={data}\n x={(d) => xScale(d.t)}\n y={(d) => yScale(d[key])}\n curve={curveMonotoneX}\n stroke={SERIES_COLORS[key]}\n strokeWidth={1.5}\n fill=\"none\"\n />\n ))}\n\n {!isHidden('consumption') && (\n <LinePath<PowerHistoryPoint>\n data={data}\n x={(d) => xScale(d.t)}\n y={(d) => yScale(d.consumption)}\n curve={curveMonotoneX}\n stroke={SERIES_COLORS.consumption}\n strokeWidth={1.5}\n fill=\"none\"\n />\n )}\n\n <line\n x1={Y_AXIS_GUTTER}\n x2={plotRight}\n y1={yScale(0)}\n y2={yScale(0)}\n stroke=\"var(--neutral-a6)\"\n strokeWidth={1}\n />\n\n {showHighlight && (\n <line\n x1={xScale(highlightAt)}\n x2={xScale(highlightAt)}\n y1={PADDING_TOP}\n y2={height - PADDING_BOTTOM}\n stroke=\"var(--spark-a9)\"\n strokeWidth={1.5}\n strokeDasharray=\"5 4\"\n pointerEvents=\"none\"\n />\n )}\n\n {xTicks.map((tick) => (\n <text\n key={`x-tick-${tick}`}\n x={xScale(tick)}\n y={height - PADDING_BOTTOM + 16}\n textAnchor=\"middle\"\n fill=\"var(--neutral-a11)\"\n fontSize={10}\n >\n {formatX(tick)}\n </text>\n ))}\n\n {tooltipOpen && tooltipData && (\n <>\n <line\n x1={xScale(tooltipData.t)}\n x2={xScale(tooltipData.t)}\n y1={PADDING_TOP}\n y2={height - PADDING_BOTTOM}\n stroke=\"var(--neutral-a6)\"\n strokeDasharray=\"4 4\"\n pointerEvents=\"none\"\n />\n {AREA_KEYS.filter((key) => !isHidden(key)).map((key) => (\n <circle\n key={`dot-${key}`}\n cx={xScale(tooltipData.t)}\n cy={yScale(tooltipData[key])}\n r={3.5}\n fill={SERIES_COLORS[key]}\n stroke=\"white\"\n strokeWidth={1.5}\n pointerEvents=\"none\"\n />\n ))}\n {!isHidden('consumption') && (\n <circle\n cx={xScale(tooltipData.t)}\n cy={yScale(tooltipData.consumption)}\n r={3.5}\n fill={SERIES_COLORS.consumption}\n stroke=\"white\"\n strokeWidth={1.5}\n pointerEvents=\"none\"\n />\n )}\n </>\n )}\n\n <rect\n x={Y_AXIS_GUTTER}\n y={PADDING_TOP}\n width={Math.max(0, plotRight - Y_AXIS_GUTTER)}\n height={Math.max(0, height - PADDING_BOTTOM - PADDING_TOP)}\n fill=\"transparent\"\n onMouseMove={handleTooltip}\n onMouseLeave={hideTooltip}\n onTouchMove={handleTooltip}\n onTouchEnd={hideTooltip}\n />\n </svg>\n )}\n\n <div\n ref={tooltipRef}\n className=\"pointer-events-none absolute z-10\"\n style={{\n left: tooltipPos.left,\n top: tooltipPos.top,\n opacity: tooltipOpen && tooltipData ? 1 : 0,\n transition: reducedMotion\n ? 'opacity 140ms ease-out'\n : 'left 140ms ease-out, top 140ms ease-out, opacity 140ms ease-out',\n }}\n >\n {tooltipData && (\n <ChartTooltipCard\n label={fmtTooltipX(tooltipData.t)}\n rows={tooltipRows}\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
@@ -18,6 +18,9 @@ interface PowerHistoryChartProps {
18
18
  /** Axis/tooltip unit, e.g. "kW". */
19
19
  unit: string;
20
20
  formatX: (t: number) => string;
21
+ /** Tooltip time formatter. Defaults to `formatX`; use to keep the tooltip's
22
+ * full clock time when the axis ticks are compact (hour-only). */
23
+ formatTooltipX?: (t: number) => string;
21
24
  formatValue?: (value: number) => string;
22
25
  labels: {
23
26
  solar: string;
@@ -25,12 +28,16 @@ interface PowerHistoryChartProps {
25
28
  battery: string;
26
29
  consumption: string;
27
30
  };
31
+ /** Series to drop entirely (no legend entry, area, or tooltip row). */
32
+ omitSeries?: readonly PowerHistorySeriesKey[];
28
33
  /** Epoch ms to mark with the current-time dashed line (omit to hide). */
29
34
  highlightAt?: number;
30
35
  title?: string;
31
36
  className?: string;
32
37
  height?: number;
33
38
  }
39
+ declare const SERIES_KEYS: readonly ["solar", "grid", "battery", "consumption"];
40
+ type PowerHistorySeriesKey = (typeof SERIES_KEYS)[number];
34
41
  /**
35
42
  * Diverging "power sources" area chart over a continuous time axis: solar
36
43
  * (orange), grid (blue) and battery (green) areas around a zero baseline, with
@@ -42,13 +49,15 @@ declare function PowerHistoryChart({
42
49
  data,
43
50
  unit,
44
51
  formatX,
52
+ formatTooltipX,
45
53
  formatValue,
46
54
  labels,
55
+ omitSeries,
47
56
  highlightAt,
48
57
  title,
49
58
  className,
50
59
  height
51
60
  }: PowerHistoryChartProps): _$react_jsx_runtime0.JSX.Element;
52
61
  //#endregion
53
- export { PowerHistoryChart, PowerHistoryChartProps, PowerHistoryPoint };
62
+ export { PowerHistoryChart, PowerHistoryChartProps, PowerHistoryPoint, PowerHistorySeriesKey };
54
63
  //# sourceMappingURL=power-history-chart.d.cts.map
@@ -18,6 +18,9 @@ interface PowerHistoryChartProps {
18
18
  /** Axis/tooltip unit, e.g. "kW". */
19
19
  unit: string;
20
20
  formatX: (t: number) => string;
21
+ /** Tooltip time formatter. Defaults to `formatX`; use to keep the tooltip's
22
+ * full clock time when the axis ticks are compact (hour-only). */
23
+ formatTooltipX?: (t: number) => string;
21
24
  formatValue?: (value: number) => string;
22
25
  labels: {
23
26
  solar: string;
@@ -25,12 +28,16 @@ interface PowerHistoryChartProps {
25
28
  battery: string;
26
29
  consumption: string;
27
30
  };
31
+ /** Series to drop entirely (no legend entry, area, or tooltip row). */
32
+ omitSeries?: readonly PowerHistorySeriesKey[];
28
33
  /** Epoch ms to mark with the current-time dashed line (omit to hide). */
29
34
  highlightAt?: number;
30
35
  title?: string;
31
36
  className?: string;
32
37
  height?: number;
33
38
  }
39
+ declare const SERIES_KEYS: readonly ["solar", "grid", "battery", "consumption"];
40
+ type PowerHistorySeriesKey = (typeof SERIES_KEYS)[number];
34
41
  /**
35
42
  * Diverging "power sources" area chart over a continuous time axis: solar
36
43
  * (orange), grid (blue) and battery (green) areas around a zero baseline, with
@@ -42,13 +49,15 @@ declare function PowerHistoryChart({
42
49
  data,
43
50
  unit,
44
51
  formatX,
52
+ formatTooltipX,
45
53
  formatValue,
46
54
  labels,
55
+ omitSeries,
47
56
  highlightAt,
48
57
  title,
49
58
  className,
50
59
  height
51
60
  }: PowerHistoryChartProps): _$react_jsx_runtime0.JSX.Element;
52
61
  //#endregion
53
- export { PowerHistoryChart, PowerHistoryChartProps, PowerHistoryPoint };
62
+ export { PowerHistoryChart, PowerHistoryChartProps, PowerHistoryPoint, PowerHistorySeriesKey };
54
63
  //# sourceMappingURL=power-history-chart.d.ts.map
@@ -1,7 +1,9 @@
1
1
  "use client";
2
+ import { useReducedMotion } from "../hooks/use-reduced-motion.js";
2
3
  import { cn } from "../utils/cn.js";
3
4
  import "../utils/chars.js";
4
- import { integerFormat, oneDecimalFormat, twoDecimalFormat } from "../utils/format.js";
5
+ import { twoDecimalFormat } from "../utils/format.js";
6
+ import { buildYAxisScale, formatYAxisTick } from "../utils/chart-scale.js";
5
7
  import { ChartTooltipCard, clampTooltipPosition, useMeasuredSize } from "./chart.js";
6
8
  import { SeriesLegend } from "./series-legend.js";
7
9
  import { SectionTitle } from "./typography.js";
@@ -29,7 +31,7 @@ const SERIES_COLORS = {
29
31
  solar: "var(--orange-a9)",
30
32
  grid: "var(--blue-9)",
31
33
  battery: "var(--green-a9)",
32
- consumption: "var(--gray-12)"
34
+ consumption: "var(--neutral-12)"
33
35
  };
34
36
  const PADDING_TOP = 20;
35
37
  const PADDING_BOTTOM = 28;
@@ -38,32 +40,6 @@ const Y_AXIS_GUTTER = 34;
38
40
  const X_TICK_COUNT = 6;
39
41
  const DEFAULT_HEIGHT = 260;
40
42
  const tBisector = bisector((d) => d.t);
41
- function niceStep(rough) {
42
- const normalized = rough === 0 ? 1 : rough;
43
- const magnitude = Math.pow(10, Math.floor(Math.log10(normalized)));
44
- return ([
45
- 1,
46
- 2,
47
- 2.5,
48
- 5,
49
- 10
50
- ].find((value) => value * magnitude >= normalized) ?? 10) * magnitude;
51
- }
52
- function buildAreaYTicks(min, max) {
53
- const step = niceStep((max - min || 1) / 4);
54
- const lo = Math.floor(min / step) * step;
55
- const hi = Math.ceil(max / step) * step;
56
- const ticks = [];
57
- for (let value = lo; value <= hi + step * .001; value += step) ticks.push(Number(value.toFixed(6)));
58
- return {
59
- ticks,
60
- lo,
61
- hi
62
- };
63
- }
64
- function formatYTick(value) {
65
- return Math.abs(value) >= 10 ? integerFormat.format(value) : oneDecimalFormat.format(value);
66
- }
67
43
  /**
68
44
  * Diverging "power sources" area chart over a continuous time axis: solar
69
45
  * (orange), grid (blue) and battery (green) areas around a zero baseline, with
@@ -71,10 +47,13 @@ function formatYTick(value) {
71
47
  * charging) dip below zero. For instantaneous power (day view). A legend at the
72
48
  * top toggles each series on/off; the y-axis rescales to the visible ones. visx.
73
49
  */
74
- function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlightAt, title, className, height = DEFAULT_HEIGHT }) {
50
+ function PowerHistoryChart({ data, unit, formatX, formatTooltipX, formatValue, labels, omitSeries, highlightAt, title, className, height = DEFAULT_HEIGHT }) {
51
+ const fmtTooltipX = formatTooltipX ?? formatX;
75
52
  const containerRef = useRef(null);
53
+ const reducedMotion = useReducedMotion();
76
54
  const [width, setWidth] = useState(0);
77
55
  const [hiddenSeries, setHiddenSeries] = useState(() => /* @__PURE__ */ new Set());
56
+ const omitted = useMemo(() => new Set(omitSeries), [omitSeries]);
78
57
  const toggleSeries = useCallback((id) => {
79
58
  setHiddenSeries((prev) => {
80
59
  const next = new Set(prev);
@@ -83,7 +62,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
83
62
  return next;
84
63
  });
85
64
  }, []);
86
- const isHidden = useCallback((key) => hiddenSeries.has(key), [hiddenSeries]);
65
+ const isHidden = useCallback((key) => omitted.has(key) || hiddenSeries.has(key), [hiddenSeries, omitted]);
87
66
  const { showTooltip, hideTooltip, tooltipData, tooltipLeft, tooltipTop, tooltipOpen } = useTooltip();
88
67
  useEffect(() => {
89
68
  const element = containerRef.current;
@@ -103,13 +82,13 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
103
82
  let min = 0;
104
83
  let max = 0;
105
84
  for (const d of data) {
106
- if (!hiddenSeries.has("solar")) max = Math.max(max, d.solar);
107
- if (!hiddenSeries.has("consumption")) max = Math.max(max, d.consumption);
108
- if (!hiddenSeries.has("grid")) {
85
+ if (!isHidden("solar")) max = Math.max(max, d.solar);
86
+ if (!isHidden("consumption")) max = Math.max(max, d.consumption);
87
+ if (!isHidden("grid")) {
109
88
  max = Math.max(max, d.grid);
110
89
  min = Math.min(min, d.grid);
111
90
  }
112
- if (!hiddenSeries.has("battery")) {
91
+ if (!isHidden("battery")) {
113
92
  max = Math.max(max, d.battery);
114
93
  min = Math.min(min, d.battery);
115
94
  }
@@ -118,8 +97,8 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
118
97
  yMin: min,
119
98
  yMax: max
120
99
  };
121
- }, [data, hiddenSeries]);
122
- const { ticks: yTicks, lo, hi } = useMemo(() => buildAreaYTicks(yMin, yMax), [yMin, yMax]);
100
+ }, [data, isHidden]);
101
+ const { ticks: yTicks, min: lo, max: hi } = useMemo(() => buildYAxisScale(yMin, yMax), [yMin, yMax]);
123
102
  const plotRight = Math.max(Y_AXIS_GUTTER, width - PADDING_RIGHT);
124
103
  const xScale = useMemo(() => scaleLinear({
125
104
  domain: [tMin, tMax === tMin ? tMin + 1 : tMax],
@@ -160,7 +139,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
160
139
  showTooltip,
161
140
  xScale
162
141
  ]);
163
- const legendItems = SERIES_KEYS.map((key) => ({
142
+ const legendItems = SERIES_KEYS.filter((key) => !omitted.has(key)).map((key) => ({
164
143
  id: key,
165
144
  label: labels[key],
166
145
  color: SERIES_COLORS[key]
@@ -226,15 +205,15 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
226
205
  x2: plotRight,
227
206
  y1: y,
228
207
  y2: y,
229
- stroke: "var(--gray-a4)",
208
+ stroke: "var(--neutral-a4)",
230
209
  strokeWidth: 1
231
210
  }), /* @__PURE__ */ jsx("text", {
232
211
  x: Y_AXIS_GUTTER - 7,
233
212
  y: y + 3,
234
213
  textAnchor: "end",
235
- fill: "var(--gray-a11)",
214
+ fill: "var(--neutral-a11)",
236
215
  fontSize: 10,
237
- children: formatYTick(tick)
216
+ children: formatYAxisTick(tick)
238
217
  })] }, `y-tick-${tick}`);
239
218
  }),
240
219
  AREA_KEYS.filter((key) => !isHidden(key)).map((key) => /* @__PURE__ */ jsx(Area, {
@@ -269,7 +248,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
269
248
  x2: plotRight,
270
249
  y1: yScale(0),
271
250
  y2: yScale(0),
272
- stroke: "var(--slate-a6)",
251
+ stroke: "var(--neutral-a6)",
273
252
  strokeWidth: 1
274
253
  }),
275
254
  showHighlight && /* @__PURE__ */ jsx("line", {
@@ -286,7 +265,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
286
265
  x: xScale(tick),
287
266
  y: height - PADDING_BOTTOM + 16,
288
267
  textAnchor: "middle",
289
- fill: "var(--gray-a11)",
268
+ fill: "var(--neutral-a11)",
290
269
  fontSize: 10,
291
270
  children: formatX(tick)
292
271
  }, `x-tick-${tick}`)),
@@ -296,7 +275,7 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
296
275
  x2: xScale(tooltipData.t),
297
276
  y1: PADDING_TOP,
298
277
  y2: height - PADDING_BOTTOM,
299
- stroke: "var(--slate-a6)",
278
+ stroke: "var(--neutral-a6)",
300
279
  strokeDasharray: "4 4",
301
280
  pointerEvents: "none"
302
281
  }),
@@ -338,10 +317,10 @@ function PowerHistoryChart({ data, unit, formatX, formatValue, labels, highlight
338
317
  left: tooltipPos.left,
339
318
  top: tooltipPos.top,
340
319
  opacity: tooltipOpen && tooltipData ? 1 : 0,
341
- transition: "left 140ms ease-out, top 140ms ease-out, opacity 140ms ease-out"
320
+ transition: reducedMotion ? "opacity 140ms ease-out" : "left 140ms ease-out, top 140ms ease-out, opacity 140ms ease-out"
342
321
  },
343
322
  children: tooltipData && /* @__PURE__ */ jsx(ChartTooltipCard, {
344
- label: formatX(tooltipData.t),
323
+ label: fmtTooltipX(tooltipData.t),
345
324
  rows: tooltipRows
346
325
  })
347
326
  })]