@epilot/spark-ui 1.0.0-alpha.2 → 1.0.0-alpha.4

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 (561) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +2 -0
  3. package/README.md +7 -1
  4. package/dist/chunk-aJGBMT86.cjs +29 -0
  5. package/dist/components/accordion.cjs +57 -0
  6. package/dist/components/accordion.cjs.map +1 -0
  7. package/dist/components/accordion.d.cts +45 -0
  8. package/dist/components/accordion.d.ts +45 -0
  9. package/dist/components/accordion.js +51 -0
  10. package/dist/components/accordion.js.map +1 -0
  11. package/dist/components/alert-dialog.cjs +137 -0
  12. package/dist/components/alert-dialog.cjs.map +1 -0
  13. package/dist/components/alert-dialog.d.cts +63 -0
  14. package/dist/components/alert-dialog.d.ts +63 -0
  15. package/dist/components/alert-dialog.js +123 -0
  16. package/dist/components/alert-dialog.js.map +1 -0
  17. package/dist/components/attachment.cjs +119 -0
  18. package/dist/components/attachment.cjs.map +1 -0
  19. package/dist/components/attachment.d.cts +67 -0
  20. package/dist/components/attachment.d.ts +67 -0
  21. package/dist/components/attachment.js +108 -0
  22. package/dist/components/attachment.js.map +1 -0
  23. package/dist/components/badge.cjs +20 -0
  24. package/dist/components/badge.cjs.map +1 -0
  25. package/dist/components/badge.d.cts +12 -0
  26. package/dist/components/badge.d.ts +12 -0
  27. package/dist/components/badge.js +17 -0
  28. package/dist/components/badge.js.map +1 -0
  29. package/dist/components/bar-chart.cjs +520 -0
  30. package/dist/components/bar-chart.cjs.map +1 -0
  31. package/dist/components/bar-chart.d.cts +88 -0
  32. package/dist/components/bar-chart.d.ts +88 -0
  33. package/dist/components/bar-chart.js +518 -0
  34. package/dist/components/bar-chart.js.map +1 -0
  35. package/dist/components/battery-progress-row.cjs +140 -0
  36. package/dist/components/battery-progress-row.cjs.map +1 -0
  37. package/dist/components/battery-progress-row.d.cts +78 -0
  38. package/dist/components/battery-progress-row.d.ts +78 -0
  39. package/dist/components/battery-progress-row.js +129 -0
  40. package/dist/components/battery-progress-row.js.map +1 -0
  41. package/dist/components/breadcrumbs.cjs +65 -0
  42. package/dist/components/breadcrumbs.cjs.map +1 -0
  43. package/dist/components/breadcrumbs.d.cts +44 -0
  44. package/dist/components/breadcrumbs.d.ts +44 -0
  45. package/dist/components/breadcrumbs.js +58 -0
  46. package/dist/components/breadcrumbs.js.map +1 -0
  47. package/dist/components/bubble.cjs +84 -0
  48. package/dist/components/bubble.cjs.map +1 -0
  49. package/dist/components/bubble.d.cts +41 -0
  50. package/dist/components/bubble.d.ts +41 -0
  51. package/dist/components/bubble.js +78 -0
  52. package/dist/components/bubble.js.map +1 -0
  53. package/dist/components/button.cjs +54 -0
  54. package/dist/components/button.cjs.map +1 -0
  55. package/dist/components/button.d.cts +42 -0
  56. package/dist/components/button.d.ts +42 -0
  57. package/dist/components/button.js +50 -0
  58. package/dist/components/button.js.map +1 -0
  59. package/dist/components/calendar.cjs +58 -0
  60. package/dist/components/calendar.cjs.map +1 -0
  61. package/dist/components/calendar.d.cts +17 -0
  62. package/dist/components/calendar.d.ts +17 -0
  63. package/dist/components/calendar.js +55 -0
  64. package/dist/components/calendar.js.map +1 -0
  65. package/dist/components/callout.cjs +95 -0
  66. package/dist/components/callout.cjs.map +1 -0
  67. package/dist/components/callout.d.cts +39 -0
  68. package/dist/components/callout.d.ts +39 -0
  69. package/dist/components/callout.js +88 -0
  70. package/dist/components/callout.js.map +1 -0
  71. package/dist/components/card.cjs +86 -0
  72. package/dist/components/card.cjs.map +1 -0
  73. package/dist/components/card.d.cts +28 -0
  74. package/dist/components/card.d.ts +28 -0
  75. package/dist/components/card.js +76 -0
  76. package/dist/components/card.js.map +1 -0
  77. package/dist/components/chart.cjs +93 -0
  78. package/dist/components/chart.cjs.map +1 -0
  79. package/dist/components/chart.d.cts +83 -0
  80. package/dist/components/chart.d.ts +83 -0
  81. package/dist/components/chart.js +88 -0
  82. package/dist/components/chart.js.map +1 -0
  83. package/dist/components/checkbox.cjs +37 -0
  84. package/dist/components/checkbox.cjs.map +1 -0
  85. package/dist/components/checkbox.d.cts +22 -0
  86. package/dist/components/checkbox.d.ts +22 -0
  87. package/dist/components/checkbox.js +34 -0
  88. package/dist/components/checkbox.js.map +1 -0
  89. package/dist/components/circular-gauge.cjs +74 -0
  90. package/dist/components/circular-gauge.cjs.map +1 -0
  91. package/dist/components/circular-gauge.d.cts +38 -0
  92. package/dist/components/circular-gauge.d.ts +38 -0
  93. package/dist/components/circular-gauge.js +71 -0
  94. package/dist/components/circular-gauge.js.map +1 -0
  95. package/dist/components/day-of-week-picker.cjs +123 -0
  96. package/dist/components/day-of-week-picker.cjs.map +1 -0
  97. package/dist/components/day-of-week-picker.d.cts +39 -0
  98. package/dist/components/day-of-week-picker.d.ts +39 -0
  99. package/dist/components/day-of-week-picker.js +119 -0
  100. package/dist/components/day-of-week-picker.js.map +1 -0
  101. package/dist/components/device-card.cjs +118 -0
  102. package/dist/components/device-card.cjs.map +1 -0
  103. package/dist/components/device-card.d.cts +71 -0
  104. package/dist/components/device-card.d.ts +71 -0
  105. package/dist/components/device-card.js +104 -0
  106. package/dist/components/device-card.js.map +1 -0
  107. package/dist/components/dialog.cjs +115 -0
  108. package/dist/components/dialog.cjs.map +1 -0
  109. package/dist/components/dialog.d.cts +45 -0
  110. package/dist/components/dialog.d.ts +45 -0
  111. package/dist/components/dialog.js +103 -0
  112. package/dist/components/dialog.js.map +1 -0
  113. package/dist/components/donut-chart.cjs +71 -0
  114. package/dist/components/donut-chart.cjs.map +1 -0
  115. package/dist/components/donut-chart.d.cts +22 -0
  116. package/dist/components/donut-chart.d.ts +22 -0
  117. package/dist/components/donut-chart.js +69 -0
  118. package/dist/components/donut-chart.js.map +1 -0
  119. package/dist/components/drawer.cjs +95 -0
  120. package/dist/components/drawer.cjs.map +1 -0
  121. package/dist/components/drawer.d.cts +46 -0
  122. package/dist/components/drawer.d.ts +46 -0
  123. package/dist/components/drawer.js +83 -0
  124. package/dist/components/drawer.js.map +1 -0
  125. package/dist/components/dropdown-menu.cjs +165 -0
  126. package/dist/components/dropdown-menu.cjs.map +1 -0
  127. package/dist/components/dropdown-menu.d.cts +93 -0
  128. package/dist/components/dropdown-menu.d.ts +93 -0
  129. package/dist/components/dropdown-menu.js +148 -0
  130. package/dist/components/dropdown-menu.js.map +1 -0
  131. package/dist/components/empty-state.cjs +35 -0
  132. package/dist/components/empty-state.cjs.map +1 -0
  133. package/dist/components/empty-state.d.cts +22 -0
  134. package/dist/components/empty-state.d.ts +22 -0
  135. package/dist/components/empty-state.js +33 -0
  136. package/dist/components/empty-state.js.map +1 -0
  137. package/dist/components/energy-bar-chart.cjs +24 -0
  138. package/dist/components/energy-bar-chart.cjs.map +1 -0
  139. package/dist/components/energy-bar-chart.d.cts +43 -0
  140. package/dist/components/energy-bar-chart.d.ts +43 -0
  141. package/dist/components/energy-bar-chart.js +22 -0
  142. package/dist/components/energy-bar-chart.js.map +1 -0
  143. package/dist/components/energy-breakdown.cjs +81 -0
  144. package/dist/components/energy-breakdown.cjs.map +1 -0
  145. package/dist/components/energy-breakdown.d.cts +26 -0
  146. package/dist/components/energy-breakdown.d.ts +26 -0
  147. package/dist/components/energy-breakdown.js +79 -0
  148. package/dist/components/energy-breakdown.js.map +1 -0
  149. package/dist/components/energy-history-chart.cjs +64 -0
  150. package/dist/components/energy-history-chart.cjs.map +1 -0
  151. package/dist/components/energy-history-chart.d.cts +66 -0
  152. package/dist/components/energy-history-chart.d.ts +66 -0
  153. package/dist/components/energy-history-chart.js +62 -0
  154. package/dist/components/energy-history-chart.js.map +1 -0
  155. package/dist/components/feed-in-hero.cjs +56 -0
  156. package/dist/components/feed-in-hero.cjs.map +1 -0
  157. package/dist/components/feed-in-hero.d.cts +33 -0
  158. package/dist/components/feed-in-hero.d.ts +33 -0
  159. package/dist/components/feed-in-hero.js +51 -0
  160. package/dist/components/feed-in-hero.js.map +1 -0
  161. package/dist/components/field.cjs +257 -0
  162. package/dist/components/field.cjs.map +1 -0
  163. package/dist/components/field.d.cts +104 -0
  164. package/dist/components/field.d.ts +104 -0
  165. package/dist/components/field.js +243 -0
  166. package/dist/components/field.js.map +1 -0
  167. package/dist/components/icon.cjs +35 -0
  168. package/dist/components/icon.cjs.map +1 -0
  169. package/dist/components/icon.d.cts +27 -0
  170. package/dist/components/icon.d.ts +27 -0
  171. package/dist/components/icon.js +32 -0
  172. package/dist/components/icon.js.map +1 -0
  173. package/dist/components/info-block.cjs +75 -0
  174. package/dist/components/info-block.cjs.map +1 -0
  175. package/dist/components/info-block.d.cts +20 -0
  176. package/dist/components/info-block.d.ts +20 -0
  177. package/dist/components/info-block.js +65 -0
  178. package/dist/components/info-block.js.map +1 -0
  179. package/dist/components/input-group.cjs +164 -0
  180. package/dist/components/input-group.cjs.map +1 -0
  181. package/dist/components/input-group.d.cts +32 -0
  182. package/dist/components/input-group.d.ts +32 -0
  183. package/dist/components/input-group.js +158 -0
  184. package/dist/components/input-group.js.map +1 -0
  185. package/dist/components/input-otp.cjs +113 -0
  186. package/dist/components/input-otp.cjs.map +1 -0
  187. package/dist/components/input-otp.d.cts +22 -0
  188. package/dist/components/input-otp.d.ts +22 -0
  189. package/dist/components/input-otp.js +111 -0
  190. package/dist/components/input-otp.js.map +1 -0
  191. package/dist/components/input.cjs +112 -0
  192. package/dist/components/input.cjs.map +1 -0
  193. package/dist/components/input.d.cts +21 -0
  194. package/dist/components/input.d.ts +21 -0
  195. package/dist/components/input.js +109 -0
  196. package/dist/components/input.js.map +1 -0
  197. package/dist/components/label.cjs +18 -0
  198. package/dist/components/label.cjs.map +1 -0
  199. package/dist/components/label.d.cts +10 -0
  200. package/dist/components/label.d.ts +10 -0
  201. package/dist/components/label.js +15 -0
  202. package/dist/components/label.js.map +1 -0
  203. package/dist/components/layout.cjs +15 -0
  204. package/dist/components/layout.cjs.map +1 -0
  205. package/dist/components/layout.d.cts +12 -0
  206. package/dist/components/layout.d.ts +13 -0
  207. package/dist/components/layout.js +14 -0
  208. package/dist/components/layout.js.map +1 -0
  209. package/dist/components/line-chart.cjs +350 -0
  210. package/dist/components/line-chart.cjs.map +1 -0
  211. package/dist/components/line-chart.d.cts +78 -0
  212. package/dist/components/line-chart.d.ts +78 -0
  213. package/dist/components/line-chart.js +347 -0
  214. package/dist/components/line-chart.js.map +1 -0
  215. package/dist/components/list.cjs +132 -0
  216. package/dist/components/list.cjs.map +1 -0
  217. package/dist/components/list.d.cts +72 -0
  218. package/dist/components/list.d.ts +72 -0
  219. package/dist/components/list.js +122 -0
  220. package/dist/components/list.js.map +1 -0
  221. package/dist/components/marker.cjs +52 -0
  222. package/dist/components/marker.cjs.map +1 -0
  223. package/dist/components/marker.d.cts +29 -0
  224. package/dist/components/marker.d.ts +29 -0
  225. package/dist/components/marker.js +46 -0
  226. package/dist/components/marker.js.map +1 -0
  227. package/dist/components/message-scroller.cjs +73 -0
  228. package/dist/components/message-scroller.cjs.map +1 -0
  229. package/dist/components/message-scroller.d.cts +39 -0
  230. package/dist/components/message-scroller.d.ts +39 -0
  231. package/dist/components/message-scroller.js +62 -0
  232. package/dist/components/message-scroller.js.map +1 -0
  233. package/dist/components/message.cjs +60 -0
  234. package/dist/components/message.cjs.map +1 -0
  235. package/dist/components/message.d.cts +36 -0
  236. package/dist/components/message.d.ts +36 -0
  237. package/dist/components/message.js +52 -0
  238. package/dist/components/message.js.map +1 -0
  239. package/dist/components/metering-row.cjs +43 -0
  240. package/dist/components/metering-row.cjs.map +1 -0
  241. package/dist/components/metering-row.d.cts +32 -0
  242. package/dist/components/metering-row.d.ts +32 -0
  243. package/dist/components/metering-row.js +38 -0
  244. package/dist/components/metering-row.js.map +1 -0
  245. package/dist/components/money-saved-block.cjs +87 -0
  246. package/dist/components/money-saved-block.cjs.map +1 -0
  247. package/dist/components/money-saved-block.d.cts +57 -0
  248. package/dist/components/money-saved-block.d.ts +57 -0
  249. package/dist/components/money-saved-block.js +79 -0
  250. package/dist/components/money-saved-block.js.map +1 -0
  251. package/dist/components/number-flow.cjs +44 -0
  252. package/dist/components/number-flow.cjs.map +1 -0
  253. package/dist/components/number-flow.d.cts +4 -0
  254. package/dist/components/number-flow.d.ts +4 -0
  255. package/dist/components/number-flow.js +42 -0
  256. package/dist/components/number-flow.js.map +1 -0
  257. package/dist/components/on-off-button.cjs +36 -0
  258. package/dist/components/on-off-button.cjs.map +1 -0
  259. package/dist/components/on-off-button.d.cts +20 -0
  260. package/dist/components/on-off-button.d.ts +20 -0
  261. package/dist/components/on-off-button.js +34 -0
  262. package/dist/components/on-off-button.js.map +1 -0
  263. package/dist/components/onboarding-layout.cjs +68 -0
  264. package/dist/components/onboarding-layout.cjs.map +1 -0
  265. package/dist/components/onboarding-layout.d.cts +46 -0
  266. package/dist/components/onboarding-layout.d.ts +46 -0
  267. package/dist/components/onboarding-layout.js +60 -0
  268. package/dist/components/onboarding-layout.js.map +1 -0
  269. package/dist/components/page-header.cjs +50 -0
  270. package/dist/components/page-header.cjs.map +1 -0
  271. package/dist/components/page-header.d.cts +26 -0
  272. package/dist/components/page-header.d.ts +26 -0
  273. package/dist/components/page-header.js +44 -0
  274. package/dist/components/page-header.js.map +1 -0
  275. package/dist/components/page-spinner.cjs +19 -0
  276. package/dist/components/page-spinner.cjs.map +1 -0
  277. package/dist/components/page-spinner.d.cts +14 -0
  278. package/dist/components/page-spinner.d.ts +14 -0
  279. package/dist/components/page-spinner.js +17 -0
  280. package/dist/components/page-spinner.js.map +1 -0
  281. package/dist/components/period-tabs.cjs +79 -0
  282. package/dist/components/period-tabs.cjs.map +1 -0
  283. package/dist/components/period-tabs.d.cts +51 -0
  284. package/dist/components/period-tabs.d.ts +51 -0
  285. package/dist/components/period-tabs.js +73 -0
  286. package/dist/components/period-tabs.js.map +1 -0
  287. package/dist/components/popover.cjs +62 -0
  288. package/dist/components/popover.cjs.map +1 -0
  289. package/dist/components/popover.d.cts +29 -0
  290. package/dist/components/popover.d.ts +29 -0
  291. package/dist/components/popover.js +56 -0
  292. package/dist/components/popover.js.map +1 -0
  293. package/dist/components/power-history-chart.cjs +335 -0
  294. package/dist/components/power-history-chart.cjs.map +1 -0
  295. package/dist/components/power-history-chart.d.cts +63 -0
  296. package/dist/components/power-history-chart.d.ts +63 -0
  297. package/dist/components/power-history-chart.js +332 -0
  298. package/dist/components/power-history-chart.js.map +1 -0
  299. package/dist/components/power-history.cjs +115 -0
  300. package/dist/components/power-history.cjs.map +1 -0
  301. package/dist/components/power-history.d.cts +42 -0
  302. package/dist/components/power-history.d.ts +43 -0
  303. package/dist/components/power-history.js +114 -0
  304. package/dist/components/power-history.js.map +1 -0
  305. package/dist/components/power-network.cjs +530 -0
  306. package/dist/components/power-network.cjs.map +1 -0
  307. package/dist/components/power-network.d.cts +77 -0
  308. package/dist/components/power-network.d.ts +77 -0
  309. package/dist/components/power-network.js +523 -0
  310. package/dist/components/power-network.js.map +1 -0
  311. package/dist/components/progress.cjs +34 -0
  312. package/dist/components/progress.cjs.map +1 -0
  313. package/dist/components/progress.d.cts +17 -0
  314. package/dist/components/progress.d.ts +17 -0
  315. package/dist/components/progress.js +31 -0
  316. package/dist/components/progress.js.map +1 -0
  317. package/dist/components/radio-card-group.cjs +69 -0
  318. package/dist/components/radio-card-group.cjs.map +1 -0
  319. package/dist/components/radio-card-group.d.cts +21 -0
  320. package/dist/components/radio-card-group.d.ts +21 -0
  321. package/dist/components/radio-card-group.js +65 -0
  322. package/dist/components/radio-card-group.js.map +1 -0
  323. package/dist/components/radio.cjs +34 -0
  324. package/dist/components/radio.cjs.map +1 -0
  325. package/dist/components/radio.d.cts +21 -0
  326. package/dist/components/radio.d.ts +21 -0
  327. package/dist/components/radio.js +30 -0
  328. package/dist/components/radio.js.map +1 -0
  329. package/dist/components/reparent.cjs +55 -0
  330. package/dist/components/reparent.cjs.map +1 -0
  331. package/dist/components/reparent.d.cts +29 -0
  332. package/dist/components/reparent.d.ts +29 -0
  333. package/dist/components/reparent.js +49 -0
  334. package/dist/components/reparent.js.map +1 -0
  335. package/dist/components/sankey-chart.cjs +188 -0
  336. package/dist/components/sankey-chart.cjs.map +1 -0
  337. package/dist/components/sankey-chart.d.cts +66 -0
  338. package/dist/components/sankey-chart.d.ts +66 -0
  339. package/dist/components/sankey-chart.js +185 -0
  340. package/dist/components/sankey-chart.js.map +1 -0
  341. package/dist/components/schedule-editor.cjs +82 -0
  342. package/dist/components/schedule-editor.cjs.map +1 -0
  343. package/dist/components/schedule-editor.d.cts +25 -0
  344. package/dist/components/schedule-editor.d.ts +25 -0
  345. package/dist/components/schedule-editor.js +72 -0
  346. package/dist/components/schedule-editor.js.map +1 -0
  347. package/dist/components/schedule-list.cjs +110 -0
  348. package/dist/components/schedule-list.cjs.map +1 -0
  349. package/dist/components/schedule-list.d.cts +29 -0
  350. package/dist/components/schedule-list.d.ts +29 -0
  351. package/dist/components/schedule-list.js +99 -0
  352. package/dist/components/schedule-list.js.map +1 -0
  353. package/dist/components/scroll-area.cjs +53 -0
  354. package/dist/components/scroll-area.cjs.map +1 -0
  355. package/dist/components/scroll-area.d.cts +26 -0
  356. package/dist/components/scroll-area.d.ts +26 -0
  357. package/dist/components/scroll-area.js +44 -0
  358. package/dist/components/scroll-area.js.map +1 -0
  359. package/dist/components/segmented-control.cjs +44 -0
  360. package/dist/components/segmented-control.cjs.map +1 -0
  361. package/dist/components/segmented-control.d.cts +33 -0
  362. package/dist/components/segmented-control.d.ts +33 -0
  363. package/dist/components/segmented-control.js +40 -0
  364. package/dist/components/segmented-control.js.map +1 -0
  365. package/dist/components/select.cjs +136 -0
  366. package/dist/components/select.cjs.map +1 -0
  367. package/dist/components/select.d.cts +63 -0
  368. package/dist/components/select.d.ts +63 -0
  369. package/dist/components/select.js +124 -0
  370. package/dist/components/select.js.map +1 -0
  371. package/dist/components/separator.cjs +38 -0
  372. package/dist/components/separator.cjs.map +1 -0
  373. package/dist/components/separator.d.cts +13 -0
  374. package/dist/components/separator.d.ts +13 -0
  375. package/dist/components/separator.js +35 -0
  376. package/dist/components/separator.js.map +1 -0
  377. package/dist/components/series-legend.cjs +39 -0
  378. package/dist/components/series-legend.cjs.map +1 -0
  379. package/dist/components/series-legend.d.cts +31 -0
  380. package/dist/components/series-legend.d.ts +31 -0
  381. package/dist/components/series-legend.js +37 -0
  382. package/dist/components/series-legend.js.map +1 -0
  383. package/dist/components/sheet.cjs +102 -0
  384. package/dist/components/sheet.cjs.map +1 -0
  385. package/dist/components/sheet.d.cts +46 -0
  386. package/dist/components/sheet.d.ts +46 -0
  387. package/dist/components/sheet.js +90 -0
  388. package/dist/components/sheet.js.map +1 -0
  389. package/dist/components/skeleton.cjs +24 -0
  390. package/dist/components/skeleton.cjs.map +1 -0
  391. package/dist/components/skeleton.d.cts +24 -0
  392. package/dist/components/skeleton.d.ts +24 -0
  393. package/dist/components/skeleton.js +21 -0
  394. package/dist/components/skeleton.js.map +1 -0
  395. package/dist/components/slider.cjs +276 -0
  396. package/dist/components/slider.cjs.map +1 -0
  397. package/dist/components/slider.d.cts +150 -0
  398. package/dist/components/slider.d.ts +150 -0
  399. package/dist/components/slider.js +266 -0
  400. package/dist/components/slider.js.map +1 -0
  401. package/dist/components/smart-toggle-button.cjs +28 -0
  402. package/dist/components/smart-toggle-button.cjs.map +1 -0
  403. package/dist/components/smart-toggle-button.d.cts +18 -0
  404. package/dist/components/smart-toggle-button.d.ts +18 -0
  405. package/dist/components/smart-toggle-button.js +26 -0
  406. package/dist/components/smart-toggle-button.js.map +1 -0
  407. package/dist/components/solar-forecast-chart.cjs +106 -0
  408. package/dist/components/solar-forecast-chart.cjs.map +1 -0
  409. package/dist/components/solar-forecast-chart.d.cts +69 -0
  410. package/dist/components/solar-forecast-chart.d.ts +69 -0
  411. package/dist/components/solar-forecast-chart.js +100 -0
  412. package/dist/components/solar-forecast-chart.js.map +1 -0
  413. package/dist/components/sortable-list.cjs +69 -0
  414. package/dist/components/sortable-list.cjs.map +1 -0
  415. package/dist/components/sortable-list.d.cts +46 -0
  416. package/dist/components/sortable-list.d.ts +46 -0
  417. package/dist/components/sortable-list.js +67 -0
  418. package/dist/components/sortable-list.js.map +1 -0
  419. package/dist/components/spinner.cjs +42 -0
  420. package/dist/components/spinner.cjs.map +1 -0
  421. package/dist/components/spinner.d.cts +15 -0
  422. package/dist/components/spinner.d.ts +15 -0
  423. package/dist/components/spinner.js +39 -0
  424. package/dist/components/spinner.js.map +1 -0
  425. package/dist/components/stat-card.cjs +58 -0
  426. package/dist/components/stat-card.cjs.map +1 -0
  427. package/dist/components/stat-card.d.cts +36 -0
  428. package/dist/components/stat-card.d.ts +36 -0
  429. package/dist/components/stat-card.js +50 -0
  430. package/dist/components/stat-card.js.map +1 -0
  431. package/dist/components/stepper.cjs +79 -0
  432. package/dist/components/stepper.cjs.map +1 -0
  433. package/dist/components/stepper.d.cts +33 -0
  434. package/dist/components/stepper.d.ts +33 -0
  435. package/dist/components/stepper.js +76 -0
  436. package/dist/components/stepper.js.map +1 -0
  437. package/dist/components/switch.cjs +22 -0
  438. package/dist/components/switch.cjs.map +1 -0
  439. package/dist/components/switch.d.cts +28 -0
  440. package/dist/components/switch.d.ts +28 -0
  441. package/dist/components/switch.js +20 -0
  442. package/dist/components/switch.js.map +1 -0
  443. package/dist/components/tabs.cjs +175 -0
  444. package/dist/components/tabs.cjs.map +1 -0
  445. package/dist/components/tabs.d.cts +45 -0
  446. package/dist/components/tabs.d.ts +45 -0
  447. package/dist/components/tabs.js +167 -0
  448. package/dist/components/tabs.js.map +1 -0
  449. package/dist/components/theme.cjs +6 -0
  450. package/dist/components/theme.d.cts +38 -0
  451. package/dist/components/theme.d.ts +38 -0
  452. package/dist/components/theme.js +4 -0
  453. package/dist/components/thumbnail.cjs +54 -0
  454. package/dist/components/thumbnail.cjs.map +1 -0
  455. package/dist/components/thumbnail.d.cts +34 -0
  456. package/dist/components/thumbnail.d.ts +34 -0
  457. package/dist/components/thumbnail.js +51 -0
  458. package/dist/components/thumbnail.js.map +1 -0
  459. package/dist/components/time-picker.cjs +55 -0
  460. package/dist/components/time-picker.cjs.map +1 -0
  461. package/dist/components/time-picker.d.cts +41 -0
  462. package/dist/components/time-picker.d.ts +41 -0
  463. package/dist/components/time-picker.js +51 -0
  464. package/dist/components/time-picker.js.map +1 -0
  465. package/dist/components/toast.cjs +99 -0
  466. package/dist/components/toast.cjs.map +1 -0
  467. package/dist/components/toast.d.cts +18 -0
  468. package/dist/components/toast.d.ts +18 -0
  469. package/dist/components/toast.js +95 -0
  470. package/dist/components/toast.js.map +1 -0
  471. package/dist/components/tooltip.cjs +75 -0
  472. package/dist/components/tooltip.cjs.map +1 -0
  473. package/dist/components/tooltip.d.cts +47 -0
  474. package/dist/components/tooltip.d.ts +47 -0
  475. package/dist/components/tooltip.js +67 -0
  476. package/dist/components/tooltip.js.map +1 -0
  477. package/dist/components/typography.cjs +52 -0
  478. package/dist/components/typography.cjs.map +1 -0
  479. package/dist/components/typography.d.cts +32 -0
  480. package/dist/components/typography.d.ts +32 -0
  481. package/dist/components/typography.js +45 -0
  482. package/dist/components/typography.js.map +1 -0
  483. package/dist/hooks/use-container-width.cjs +22 -0
  484. package/dist/hooks/use-container-width.cjs.map +1 -0
  485. package/dist/hooks/use-container-width.d.cts +7 -0
  486. package/dist/hooks/use-container-width.d.ts +7 -0
  487. package/dist/hooks/use-container-width.js +20 -0
  488. package/dist/hooks/use-container-width.js.map +1 -0
  489. package/dist/icons/index.cjs +7 -0
  490. package/dist/icons/index.d.cts +4 -0
  491. package/dist/icons/index.d.ts +4 -0
  492. package/dist/icons/index.js +3 -0
  493. package/dist/icons/material-symbol.cjs +105 -0
  494. package/dist/icons/material-symbol.cjs.map +1 -0
  495. package/dist/icons/material-symbol.d.cts +23 -0
  496. package/dist/icons/material-symbol.d.ts +23 -0
  497. package/dist/icons/material-symbol.js +100 -0
  498. package/dist/icons/material-symbol.js.map +1 -0
  499. package/dist/input-box-variants-BMDdwvqg.cjs +40 -0
  500. package/dist/input-box-variants-BMDdwvqg.cjs.map +1 -0
  501. package/dist/input-box-variants-Dr1K7uYE.js +28 -0
  502. package/dist/input-box-variants-Dr1K7uYE.js.map +1 -0
  503. package/dist/number-flow-DMJouddg.d.cts +15 -0
  504. package/dist/number-flow-DSbucQ_K.d.ts +15 -0
  505. package/dist/styles/index.css +260 -0
  506. package/dist/styles/internal.css +5 -0
  507. package/dist/styles/material-symbol.css +22 -0
  508. package/dist/styles/spark-default.css +888 -0
  509. package/dist/styles/theme.css +620 -0
  510. package/dist/styles/utilities.css +557 -0
  511. package/dist/theme-C19BbKfO.js +574 -0
  512. package/dist/theme-C19BbKfO.js.map +1 -0
  513. package/dist/theme-CfFWrMEF.cjs +592 -0
  514. package/dist/theme-CfFWrMEF.cjs.map +1 -0
  515. package/dist/theme-types-DoROIXpi.d.ts +30 -0
  516. package/dist/theme-types-r20EJfEC.d.cts +30 -0
  517. package/dist/tones-DjgKOX3s.d.cts +8 -0
  518. package/dist/tones-DyCkL71h.d.ts +8 -0
  519. package/dist/utils/build-sankey-nodes.cjs +72 -0
  520. package/dist/utils/build-sankey-nodes.cjs.map +1 -0
  521. package/dist/utils/build-sankey-nodes.d.cts +27 -0
  522. package/dist/utils/build-sankey-nodes.d.ts +27 -0
  523. package/dist/utils/build-sankey-nodes.js +71 -0
  524. package/dist/utils/build-sankey-nodes.js.map +1 -0
  525. package/dist/utils/chars.cjs +18 -0
  526. package/dist/utils/chars.cjs.map +1 -0
  527. package/dist/utils/chars.d.cts +10 -0
  528. package/dist/utils/chars.d.ts +10 -0
  529. package/dist/utils/chars.js +14 -0
  530. package/dist/utils/chars.js.map +1 -0
  531. package/dist/utils/chart-scale.cjs +43 -0
  532. package/dist/utils/chart-scale.cjs.map +1 -0
  533. package/dist/utils/chart-scale.d.cts +22 -0
  534. package/dist/utils/chart-scale.d.ts +22 -0
  535. package/dist/utils/chart-scale.js +41 -0
  536. package/dist/utils/chart-scale.js.map +1 -0
  537. package/dist/utils/cn.cjs +10 -0
  538. package/dist/utils/cn.d.cts +4 -0
  539. package/dist/utils/cn.d.ts +4 -0
  540. package/dist/utils/cn.js +3 -0
  541. package/dist/utils/date-mask.cjs +45 -0
  542. package/dist/utils/date-mask.cjs.map +1 -0
  543. package/dist/utils/date-mask.d.cts +17 -0
  544. package/dist/utils/date-mask.d.ts +17 -0
  545. package/dist/utils/date-mask.js +41 -0
  546. package/dist/utils/date-mask.js.map +1 -0
  547. package/dist/utils/format.cjs +57 -0
  548. package/dist/utils/format.cjs.map +1 -0
  549. package/dist/utils/format.d.cts +23 -0
  550. package/dist/utils/format.d.ts +23 -0
  551. package/dist/utils/format.js +47 -0
  552. package/dist/utils/format.js.map +1 -0
  553. package/package.json +78 -63
  554. package/dist/index.cjs +0 -1631
  555. package/dist/index.cjs.map +0 -1
  556. package/dist/index.css +0 -1
  557. package/dist/index.d.cts +0 -299
  558. package/dist/index.d.ts +0 -299
  559. package/dist/index.js +0 -1518
  560. package/dist/index.js.map +0 -1
  561. package/dist/styles.js +0 -1
@@ -0,0 +1,18 @@
1
+ "use client";
2
+
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
+
5
+ //#region src/components/smart-toggle-button.d.ts
6
+ interface SmartToggleButtonProps {
7
+ active: boolean;
8
+ disabled?: boolean;
9
+ onClick: () => void;
10
+ }
11
+ declare function SmartToggleButton({
12
+ active,
13
+ disabled,
14
+ onClick
15
+ }: SmartToggleButtonProps): _$react_jsx_runtime0.JSX.Element;
16
+ //#endregion
17
+ export { SmartToggleButton };
18
+ //# sourceMappingURL=smart-toggle-button.d.cts.map
@@ -0,0 +1,18 @@
1
+ "use client";
2
+
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
+
5
+ //#region src/components/smart-toggle-button.d.ts
6
+ interface SmartToggleButtonProps {
7
+ active: boolean;
8
+ disabled?: boolean;
9
+ onClick: () => void;
10
+ }
11
+ declare function SmartToggleButton({
12
+ active,
13
+ disabled,
14
+ onClick
15
+ }: SmartToggleButtonProps): _$react_jsx_runtime0.JSX.Element;
16
+ //#endregion
17
+ export { SmartToggleButton };
18
+ //# sourceMappingURL=smart-toggle-button.d.ts.map
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { cn } from "../utils/cn.js";
3
+ import { MaterialSymbol } from "../icons/material-symbol.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/components/smart-toggle-button.tsx
6
+ function SmartToggleButton({ active, disabled, onClick }) {
7
+ const handleClick = (event) => {
8
+ event.stopPropagation();
9
+ onClick();
10
+ };
11
+ return /* @__PURE__ */ jsxs("button", {
12
+ "aria-pressed": active,
13
+ className: cn("inline-flex min-w-9 cursor-pointer items-center gap-1.5 rounded-[max(var(--spark-rounded-md),var(--spark-rounded-full))] px-3 text-sm font-medium transition-colors max-sm:h-10 md:h-9 focus-visible:ring-primary focus-visible:ring-2 focus-visible:outline-none disabled:opacity-60 disabled:cursor-not-allowed", active ? "bg-base-accent-soft text-accent border border-transparent hover:bg-base-accent-soft/80" : "border-gray text-gray-light border hover:bg-base-gray-soft"),
14
+ disabled,
15
+ onClick: handleClick,
16
+ type: "button",
17
+ children: [/* @__PURE__ */ jsx(MaterialSymbol, {
18
+ className: "block text-[16px]! leading-none",
19
+ name: "auto_awesome"
20
+ }), "Smart"]
21
+ });
22
+ }
23
+ //#endregion
24
+ export { SmartToggleButton };
25
+
26
+ //# sourceMappingURL=smart-toggle-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-toggle-button.js","names":[],"sources":["../../src/components/smart-toggle-button.tsx"],"sourcesContent":["import type { MouseEvent } from 'react'\nimport { MaterialSymbol } from '../icons/material-symbol'\nimport { cn } from '../utils/cn'\n\ninterface SmartToggleButtonProps {\n active: boolean\n disabled?: boolean\n onClick: () => void\n}\n\nexport function SmartToggleButton({\n active,\n disabled,\n onClick,\n}: SmartToggleButtonProps) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation()\n onClick()\n }\n\n const base =\n 'inline-flex min-w-9 cursor-pointer items-center gap-1.5 rounded-[max(var(--spark-rounded-md),var(--spark-rounded-full))] px-3 text-sm font-medium transition-colors max-sm:h-10 md:h-9 focus-visible:ring-primary focus-visible:ring-2 focus-visible:outline-none disabled:opacity-60 disabled:cursor-not-allowed'\n const tone = active\n ? 'bg-base-accent-soft text-accent border border-transparent hover:bg-base-accent-soft/80'\n : 'border-gray text-gray-light border hover:bg-base-gray-soft'\n\n return (\n <button\n aria-pressed={active}\n className={cn(base, tone)}\n disabled={disabled}\n onClick={handleClick}\n type=\"button\"\n >\n <MaterialSymbol\n className=\"block text-[16px]! leading-none\"\n name=\"auto_awesome\"\n />\n Smart\n </button>\n )\n}\n"],"mappings":";;;;;AAUA,SAAgB,kBAAkB,EAChC,QACA,UACA,WACyB;CACzB,MAAM,eAAe,UAAyC;AAC5D,QAAM,iBAAiB;AACvB,WAAS;;AASX,QACE,qBAAC,UAAD;EACE,gBAAc;EACd,WAAW,GAAG,qTAPL,SACT,2FACA,6DAKyB;EACf;EACV,SAAS;EACT,MAAK;YALP,CAOE,oBAAC,gBAAD;GACE,WAAU;GACV,MAAK;GACL,CAAA,EAAA,QAEK"}
@@ -0,0 +1,106 @@
1
+ "use client";
2
+ Object.defineProperties(exports, {
3
+ __esModule: { value: true },
4
+ [Symbol.toStringTag]: { value: "Module" }
5
+ });
6
+ require("../chunk-aJGBMT86.cjs");
7
+ const require_icons_material_symbol = require("../icons/material-symbol.cjs");
8
+ require("../utils/chars.cjs");
9
+ const require_utils_format = require("../utils/format.cjs");
10
+ const require_components_line_chart = require("./line-chart.cjs");
11
+ let react = require("react");
12
+ let react_jsx_runtime = require("react/jsx-runtime");
13
+ let cnfast = require("cnfast");
14
+ //#region src/components/solar-forecast-chart.tsx
15
+ const DEFAULT_HEIGHT = 220;
16
+ const BASE_MARGIN = {
17
+ top: 8,
18
+ right: 8,
19
+ bottom: 28,
20
+ left: 34
21
+ };
22
+ /** Extra headroom for the weather icon row pinned above the plot. */
23
+ const WEATHER_ROW_HEIGHT = 24;
24
+ function defaultFormatValue(value) {
25
+ return `${require_utils_format.oneDecimalFormat.format(value)} kW`;
26
+ }
27
+ function defaultFormatTime(date) {
28
+ return date.getHours().toString().padStart(2, "0");
29
+ }
30
+ /**
31
+ * Responsive line plot of measured production (solid) against a forecast
32
+ * (dashed) over a day. Optionally overlays hourly weather icons and
33
+ * sunrise/sunset markers, all pinned to the same time axis. Sizes itself to its
34
+ * container; compose a title and any summary around it.
35
+ */
36
+ function SolarForecastChart({ produced, forecast, producedLabel = "Produced", forecastLabel = "Forecast", formatValue = defaultFormatValue, yAxisUnit = "kW", formatTime = defaultFormatTime, formatTooltipTime, weather, sunrise, sunset, formatMarkerTime, curve = "monotone", height = DEFAULT_HEIGHT, className }) {
37
+ const containerRef = (0, react.useRef)(null);
38
+ const [width, setWidth] = (0, react.useState)(0);
39
+ (0, react.useEffect)(() => {
40
+ const el = containerRef.current;
41
+ if (!el) return;
42
+ const ro = new ResizeObserver((entries) => {
43
+ const entry = entries[0];
44
+ if (entry) setWidth(entry.contentRect.width);
45
+ });
46
+ ro.observe(el);
47
+ return () => ro.disconnect();
48
+ }, []);
49
+ const hasWeather = weather != null && weather.length > 0;
50
+ const margin = {
51
+ ...BASE_MARGIN,
52
+ top: hasWeather ? BASE_MARGIN.top + WEATHER_ROW_HEIGHT : BASE_MARGIN.top
53
+ };
54
+ const formatMarker = formatMarkerTime ?? formatTooltipTime ?? formatTime;
55
+ const topContent = hasWeather ? weather.map((point, i) => ({
56
+ key: `weather-${point.date.valueOf()}-${i}`,
57
+ date: point.date,
58
+ content: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons_material_symbol.MaterialSymbol, {
59
+ name: point.icon,
60
+ className: "text-(length:--spark-icon-size,18px)! text-gray-light"
61
+ })
62
+ })) : void 0;
63
+ const referenceLines = [sunrise && {
64
+ key: "sunrise",
65
+ date: sunrise,
66
+ label: formatMarker(sunrise)
67
+ }, sunset && {
68
+ key: "sunset",
69
+ date: sunset,
70
+ label: formatMarker(sunset)
71
+ }].filter((x) => Boolean(x));
72
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
73
+ ref: containerRef,
74
+ className: (0, cnfast.cn)("w-full", className),
75
+ children: width > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components_line_chart.LineChart, {
76
+ width,
77
+ height,
78
+ margin,
79
+ curve,
80
+ series: [{
81
+ id: "produced",
82
+ data: produced,
83
+ label: producedLabel
84
+ }, {
85
+ id: "forecast",
86
+ data: forecast,
87
+ label: forecastLabel,
88
+ dashed: true
89
+ }],
90
+ showGrid: true,
91
+ xTickCount: 6,
92
+ yTickCount: 4,
93
+ yAxisUnit,
94
+ formatDate: formatTime,
95
+ formatTooltipDate: formatTooltipTime ?? formatTime,
96
+ formatValue,
97
+ referenceLines: referenceLines.length > 0 ? referenceLines : void 0,
98
+ topContent
99
+ })
100
+ });
101
+ }
102
+ //#endregion
103
+ exports.SolarForecastChart = SolarForecastChart;
104
+ exports.default = SolarForecastChart;
105
+
106
+ //# sourceMappingURL=solar-forecast-chart.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solar-forecast-chart.cjs","names":["oneDecimalFormat","MaterialSymbol","LineChart"],"sources":["../../src/components/solar-forecast-chart.tsx"],"sourcesContent":["import { type JSX, type ReactNode, useEffect, useRef, useState } from 'react'\nimport {\n MaterialSymbol,\n type MaterialSymbolIconName,\n} from '../icons/material-symbol'\nimport { NARROW_NBSP } from '../utils/chars'\nimport { cn } from '../utils/cn'\nimport { oneDecimalFormat } from '../utils/format'\nimport {\n LineChart,\n type LineChartCurve,\n type LineChartDatum,\n} from './line-chart'\n\nconst DEFAULT_HEIGHT = 220\n// `left` leaves room for the y-axis tick labels + unit (matches the 34px gutter\n// used by BarChart / PowerHistoryChart).\nconst BASE_MARGIN = { top: 8, right: 8, bottom: 28, left: 34 }\n/** Extra headroom for the weather icon row pinned above the plot. */\nconst WEATHER_ROW_HEIGHT = 24\n\nfunction defaultFormatValue(value: number): string {\n return `${oneDecimalFormat.format(value)}${NARROW_NBSP}kW`\n}\n\nfunction defaultFormatTime(date: Date): string {\n return date.getHours().toString().padStart(2, '0')\n}\n\nexport interface SolarForecastWeatherPoint {\n date: Date\n icon: MaterialSymbolIconName\n}\n\nexport interface SolarForecastChartProps {\n /** Measured production, drawn as the solid line. */\n produced: LineChartDatum[]\n /** Predicted production, drawn as the dashed line. */\n forecast: LineChartDatum[]\n /** Tooltip label for the produced series. */\n producedLabel?: ReactNode\n /** Tooltip label for the forecast series. */\n forecastLabel?: ReactNode\n /** Tooltip value formatter. Defaults to one-decimal kW (power). */\n formatValue?: (value: number) => string\n /** Unit shown once atop the y-axis; ticks render as plain numbers. Defaults to \"kW\". */\n yAxisUnit?: string\n /** X-axis tick formatter. Defaults to the zero-padded hour. */\n formatTime?: (date: Date) => string\n /** Tooltip time formatter. Defaults to `formatTime`. */\n formatTooltipTime?: (date: Date) => string\n /**\n * Hourly weather icons drawn along the top of the plot, aligned to the time\n * axis. Their dates must fall within the plotted day.\n */\n weather?: SolarForecastWeatherPoint[]\n /** Sunrise time, drawn as a labelled vertical marker on the plot. */\n sunrise?: Date\n /** Sunset time, drawn as a labelled vertical marker on the plot. */\n sunset?: Date\n /** Label formatter for the sunrise/sunset markers. Defaults to `formatTime`. */\n formatMarkerTime?: (date: Date) => string\n curve?: LineChartCurve\n height?: number\n className?: string\n}\n\n/**\n * Responsive line plot of measured production (solid) against a forecast\n * (dashed) over a day. Optionally overlays hourly weather icons and\n * sunrise/sunset markers, all pinned to the same time axis. Sizes itself to its\n * container; compose a title and any summary around it.\n */\nexport function SolarForecastChart({\n produced,\n forecast,\n producedLabel = 'Produced',\n forecastLabel = 'Forecast',\n formatValue = defaultFormatValue,\n yAxisUnit = 'kW',\n formatTime = defaultFormatTime,\n formatTooltipTime,\n weather,\n sunrise,\n sunset,\n formatMarkerTime,\n curve = 'monotone',\n height = DEFAULT_HEIGHT,\n className,\n}: SolarForecastChartProps): JSX.Element {\n const containerRef = useRef<HTMLDivElement>(null)\n const [width, setWidth] = useState(0)\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) setWidth(entry.contentRect.width)\n })\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const hasWeather = weather != null && weather.length > 0\n const margin = {\n ...BASE_MARGIN,\n top: hasWeather ? BASE_MARGIN.top + WEATHER_ROW_HEIGHT : BASE_MARGIN.top,\n }\n const formatMarker = formatMarkerTime ?? formatTooltipTime ?? formatTime\n\n const topContent = hasWeather\n ? weather.map((point, i) => ({\n key: `weather-${point.date.valueOf()}-${i}`,\n date: point.date,\n content: (\n <MaterialSymbol\n name={point.icon}\n className=\"text-(length:--spark-icon-size,18px)! text-gray-light\"\n />\n ),\n }))\n : undefined\n\n const referenceLines = [\n sunrise && { key: 'sunrise', date: sunrise, label: formatMarker(sunrise) },\n sunset && { key: 'sunset', date: sunset, label: formatMarker(sunset) },\n ].filter((x): x is { key: string; date: Date; label: string } => Boolean(x))\n\n return (\n <div ref={containerRef} className={cn('w-full', className)}>\n {width > 0 && (\n <LineChart\n width={width}\n height={height}\n margin={margin}\n curve={curve}\n series={[\n { id: 'produced', data: produced, label: producedLabel },\n {\n id: 'forecast',\n data: forecast,\n label: forecastLabel,\n dashed: true,\n },\n ]}\n showGrid\n xTickCount={6}\n yTickCount={4}\n yAxisUnit={yAxisUnit}\n formatDate={formatTime}\n formatTooltipDate={formatTooltipTime ?? formatTime}\n formatValue={formatValue}\n referenceLines={\n referenceLines.length > 0 ? referenceLines : undefined\n }\n topContent={topContent}\n />\n )}\n </div>\n )\n}\n\nexport default SolarForecastChart\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,iBAAiB;AAGvB,MAAM,cAAc;CAAE,KAAK;CAAG,OAAO;CAAG,QAAQ;CAAI,MAAM;CAAI;;AAE9D,MAAM,qBAAqB;AAE3B,SAAS,mBAAmB,OAAuB;AACjD,QAAO,GAAGA,qBAAAA,iBAAiB,OAAO,MAAM;;AAG1C,SAAS,kBAAkB,MAAoB;AAC7C,QAAO,KAAK,UAAU,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI;;;;;;;;AA+CpD,SAAgB,mBAAmB,EACjC,UACA,UACA,gBAAgB,YAChB,gBAAgB,YAChB,cAAc,oBACd,YAAY,MACZ,aAAa,mBACb,mBACA,SACA,SACA,QACA,kBACA,QAAQ,YACR,SAAS,gBACT,aACuC;CACvC,MAAM,gBAAA,GAAA,MAAA,QAAsC,KAAK;CACjD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAqB,EAAE;AAErC,EAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,KAAK,aAAa;AACxB,MAAI,CAAC,GAAI;EACT,MAAM,KAAK,IAAI,gBAAgB,YAAY;GACzC,MAAM,QAAQ,QAAQ;AACtB,OAAI,MAAO,UAAS,MAAM,YAAY,MAAM;IAC5C;AACF,KAAG,QAAQ,GAAG;AACd,eAAa,GAAG,YAAY;IAC3B,EAAE,CAAC;CAEN,MAAM,aAAa,WAAW,QAAQ,QAAQ,SAAS;CACvD,MAAM,SAAS;EACb,GAAG;EACH,KAAK,aAAa,YAAY,MAAM,qBAAqB,YAAY;EACtE;CACD,MAAM,eAAe,oBAAoB,qBAAqB;CAE9D,MAAM,aAAa,aACf,QAAQ,KAAK,OAAO,OAAO;EACzB,KAAK,WAAW,MAAM,KAAK,SAAS,CAAC,GAAG;EACxC,MAAM,MAAM;EACZ,SACE,iBAAA,GAAA,kBAAA,KAACC,8BAAAA,gBAAD;GACE,MAAM,MAAM;GACZ,WAAU;GACV,CAAA;EAEL,EAAE,GACH,KAAA;CAEJ,MAAM,iBAAiB,CACrB,WAAW;EAAE,KAAK;EAAW,MAAM;EAAS,OAAO,aAAa,QAAQ;EAAE,EAC1E,UAAU;EAAE,KAAK;EAAU,MAAM;EAAQ,OAAO,aAAa,OAAO;EAAE,CACvE,CAAC,QAAQ,MAAuD,QAAQ,EAAE,CAAC;AAE5E,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,KAAK;EAAc,YAAA,GAAA,OAAA,IAAc,UAAU,UAAU;YACvD,QAAQ,KACP,iBAAA,GAAA,kBAAA,KAACC,8BAAAA,WAAD;GACS;GACC;GACA;GACD;GACP,QAAQ,CACN;IAAE,IAAI;IAAY,MAAM;IAAU,OAAO;IAAe,EACxD;IACE,IAAI;IACJ,MAAM;IACN,OAAO;IACP,QAAQ;IACT,CACF;GACD,UAAA;GACA,YAAY;GACZ,YAAY;GACD;GACX,YAAY;GACZ,mBAAmB,qBAAqB;GAC3B;GACb,gBACE,eAAe,SAAS,IAAI,iBAAiB,KAAA;GAEnC;GACZ,CAAA;EAEA,CAAA"}
@@ -0,0 +1,69 @@
1
+ "use client";
2
+
3
+ import { MaterialSymbolIconName } from "../icons/material-symbol.cjs";
4
+ import { LineChartCurve, LineChartDatum } from "./line-chart.cjs";
5
+ import { JSX, ReactNode } from "react";
6
+
7
+ //#region src/components/solar-forecast-chart.d.ts
8
+ interface SolarForecastWeatherPoint {
9
+ date: Date;
10
+ icon: MaterialSymbolIconName;
11
+ }
12
+ interface SolarForecastChartProps {
13
+ /** Measured production, drawn as the solid line. */
14
+ produced: LineChartDatum[];
15
+ /** Predicted production, drawn as the dashed line. */
16
+ forecast: LineChartDatum[];
17
+ /** Tooltip label for the produced series. */
18
+ producedLabel?: ReactNode;
19
+ /** Tooltip label for the forecast series. */
20
+ forecastLabel?: ReactNode;
21
+ /** Tooltip value formatter. Defaults to one-decimal kW (power). */
22
+ formatValue?: (value: number) => string;
23
+ /** Unit shown once atop the y-axis; ticks render as plain numbers. Defaults to "kW". */
24
+ yAxisUnit?: string;
25
+ /** X-axis tick formatter. Defaults to the zero-padded hour. */
26
+ formatTime?: (date: Date) => string;
27
+ /** Tooltip time formatter. Defaults to `formatTime`. */
28
+ formatTooltipTime?: (date: Date) => string;
29
+ /**
30
+ * Hourly weather icons drawn along the top of the plot, aligned to the time
31
+ * axis. Their dates must fall within the plotted day.
32
+ */
33
+ weather?: SolarForecastWeatherPoint[];
34
+ /** Sunrise time, drawn as a labelled vertical marker on the plot. */
35
+ sunrise?: Date;
36
+ /** Sunset time, drawn as a labelled vertical marker on the plot. */
37
+ sunset?: Date;
38
+ /** Label formatter for the sunrise/sunset markers. Defaults to `formatTime`. */
39
+ formatMarkerTime?: (date: Date) => string;
40
+ curve?: LineChartCurve;
41
+ height?: number;
42
+ className?: string;
43
+ }
44
+ /**
45
+ * Responsive line plot of measured production (solid) against a forecast
46
+ * (dashed) over a day. Optionally overlays hourly weather icons and
47
+ * sunrise/sunset markers, all pinned to the same time axis. Sizes itself to its
48
+ * container; compose a title and any summary around it.
49
+ */
50
+ declare function SolarForecastChart({
51
+ produced,
52
+ forecast,
53
+ producedLabel,
54
+ forecastLabel,
55
+ formatValue,
56
+ yAxisUnit,
57
+ formatTime,
58
+ formatTooltipTime,
59
+ weather,
60
+ sunrise,
61
+ sunset,
62
+ formatMarkerTime,
63
+ curve,
64
+ height,
65
+ className
66
+ }: SolarForecastChartProps): JSX.Element;
67
+ //#endregion
68
+ export { SolarForecastChart, SolarForecastChart as default, SolarForecastChartProps, SolarForecastWeatherPoint };
69
+ //# sourceMappingURL=solar-forecast-chart.d.cts.map
@@ -0,0 +1,69 @@
1
+ "use client";
2
+
3
+ import { MaterialSymbolIconName } from "../icons/material-symbol.js";
4
+ import { LineChartCurve, LineChartDatum } from "./line-chart.js";
5
+ import { JSX, ReactNode } from "react";
6
+
7
+ //#region src/components/solar-forecast-chart.d.ts
8
+ interface SolarForecastWeatherPoint {
9
+ date: Date;
10
+ icon: MaterialSymbolIconName;
11
+ }
12
+ interface SolarForecastChartProps {
13
+ /** Measured production, drawn as the solid line. */
14
+ produced: LineChartDatum[];
15
+ /** Predicted production, drawn as the dashed line. */
16
+ forecast: LineChartDatum[];
17
+ /** Tooltip label for the produced series. */
18
+ producedLabel?: ReactNode;
19
+ /** Tooltip label for the forecast series. */
20
+ forecastLabel?: ReactNode;
21
+ /** Tooltip value formatter. Defaults to one-decimal kW (power). */
22
+ formatValue?: (value: number) => string;
23
+ /** Unit shown once atop the y-axis; ticks render as plain numbers. Defaults to "kW". */
24
+ yAxisUnit?: string;
25
+ /** X-axis tick formatter. Defaults to the zero-padded hour. */
26
+ formatTime?: (date: Date) => string;
27
+ /** Tooltip time formatter. Defaults to `formatTime`. */
28
+ formatTooltipTime?: (date: Date) => string;
29
+ /**
30
+ * Hourly weather icons drawn along the top of the plot, aligned to the time
31
+ * axis. Their dates must fall within the plotted day.
32
+ */
33
+ weather?: SolarForecastWeatherPoint[];
34
+ /** Sunrise time, drawn as a labelled vertical marker on the plot. */
35
+ sunrise?: Date;
36
+ /** Sunset time, drawn as a labelled vertical marker on the plot. */
37
+ sunset?: Date;
38
+ /** Label formatter for the sunrise/sunset markers. Defaults to `formatTime`. */
39
+ formatMarkerTime?: (date: Date) => string;
40
+ curve?: LineChartCurve;
41
+ height?: number;
42
+ className?: string;
43
+ }
44
+ /**
45
+ * Responsive line plot of measured production (solid) against a forecast
46
+ * (dashed) over a day. Optionally overlays hourly weather icons and
47
+ * sunrise/sunset markers, all pinned to the same time axis. Sizes itself to its
48
+ * container; compose a title and any summary around it.
49
+ */
50
+ declare function SolarForecastChart({
51
+ produced,
52
+ forecast,
53
+ producedLabel,
54
+ forecastLabel,
55
+ formatValue,
56
+ yAxisUnit,
57
+ formatTime,
58
+ formatTooltipTime,
59
+ weather,
60
+ sunrise,
61
+ sunset,
62
+ formatMarkerTime,
63
+ curve,
64
+ height,
65
+ className
66
+ }: SolarForecastChartProps): JSX.Element;
67
+ //#endregion
68
+ export { SolarForecastChart, SolarForecastChart as default, SolarForecastChartProps, SolarForecastWeatherPoint };
69
+ //# sourceMappingURL=solar-forecast-chart.d.ts.map
@@ -0,0 +1,100 @@
1
+ "use client";
2
+ import { cn } from "../utils/cn.js";
3
+ import { MaterialSymbol } from "../icons/material-symbol.js";
4
+ import "../utils/chars.js";
5
+ import { oneDecimalFormat } from "../utils/format.js";
6
+ import { LineChart } from "./line-chart.js";
7
+ import { useEffect, useRef, useState } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ //#region src/components/solar-forecast-chart.tsx
10
+ const DEFAULT_HEIGHT = 220;
11
+ const BASE_MARGIN = {
12
+ top: 8,
13
+ right: 8,
14
+ bottom: 28,
15
+ left: 34
16
+ };
17
+ /** Extra headroom for the weather icon row pinned above the plot. */
18
+ const WEATHER_ROW_HEIGHT = 24;
19
+ function defaultFormatValue(value) {
20
+ return `${oneDecimalFormat.format(value)} kW`;
21
+ }
22
+ function defaultFormatTime(date) {
23
+ return date.getHours().toString().padStart(2, "0");
24
+ }
25
+ /**
26
+ * Responsive line plot of measured production (solid) against a forecast
27
+ * (dashed) over a day. Optionally overlays hourly weather icons and
28
+ * sunrise/sunset markers, all pinned to the same time axis. Sizes itself to its
29
+ * container; compose a title and any summary around it.
30
+ */
31
+ function SolarForecastChart({ produced, forecast, producedLabel = "Produced", forecastLabel = "Forecast", formatValue = defaultFormatValue, yAxisUnit = "kW", formatTime = defaultFormatTime, formatTooltipTime, weather, sunrise, sunset, formatMarkerTime, curve = "monotone", height = DEFAULT_HEIGHT, className }) {
32
+ const containerRef = useRef(null);
33
+ const [width, setWidth] = useState(0);
34
+ useEffect(() => {
35
+ const el = containerRef.current;
36
+ if (!el) return;
37
+ const ro = new ResizeObserver((entries) => {
38
+ const entry = entries[0];
39
+ if (entry) setWidth(entry.contentRect.width);
40
+ });
41
+ ro.observe(el);
42
+ return () => ro.disconnect();
43
+ }, []);
44
+ const hasWeather = weather != null && weather.length > 0;
45
+ const margin = {
46
+ ...BASE_MARGIN,
47
+ top: hasWeather ? BASE_MARGIN.top + WEATHER_ROW_HEIGHT : BASE_MARGIN.top
48
+ };
49
+ const formatMarker = formatMarkerTime ?? formatTooltipTime ?? formatTime;
50
+ const topContent = hasWeather ? weather.map((point, i) => ({
51
+ key: `weather-${point.date.valueOf()}-${i}`,
52
+ date: point.date,
53
+ content: /* @__PURE__ */ jsx(MaterialSymbol, {
54
+ name: point.icon,
55
+ className: "text-(length:--spark-icon-size,18px)! text-gray-light"
56
+ })
57
+ })) : void 0;
58
+ const referenceLines = [sunrise && {
59
+ key: "sunrise",
60
+ date: sunrise,
61
+ label: formatMarker(sunrise)
62
+ }, sunset && {
63
+ key: "sunset",
64
+ date: sunset,
65
+ label: formatMarker(sunset)
66
+ }].filter((x) => Boolean(x));
67
+ return /* @__PURE__ */ jsx("div", {
68
+ ref: containerRef,
69
+ className: cn("w-full", className),
70
+ children: width > 0 && /* @__PURE__ */ jsx(LineChart, {
71
+ width,
72
+ height,
73
+ margin,
74
+ curve,
75
+ series: [{
76
+ id: "produced",
77
+ data: produced,
78
+ label: producedLabel
79
+ }, {
80
+ id: "forecast",
81
+ data: forecast,
82
+ label: forecastLabel,
83
+ dashed: true
84
+ }],
85
+ showGrid: true,
86
+ xTickCount: 6,
87
+ yTickCount: 4,
88
+ yAxisUnit,
89
+ formatDate: formatTime,
90
+ formatTooltipDate: formatTooltipTime ?? formatTime,
91
+ formatValue,
92
+ referenceLines: referenceLines.length > 0 ? referenceLines : void 0,
93
+ topContent
94
+ })
95
+ });
96
+ }
97
+ //#endregion
98
+ export { SolarForecastChart, SolarForecastChart as default };
99
+
100
+ //# sourceMappingURL=solar-forecast-chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solar-forecast-chart.js","names":[],"sources":["../../src/components/solar-forecast-chart.tsx"],"sourcesContent":["import { type JSX, type ReactNode, useEffect, useRef, useState } from 'react'\nimport {\n MaterialSymbol,\n type MaterialSymbolIconName,\n} from '../icons/material-symbol'\nimport { NARROW_NBSP } from '../utils/chars'\nimport { cn } from '../utils/cn'\nimport { oneDecimalFormat } from '../utils/format'\nimport {\n LineChart,\n type LineChartCurve,\n type LineChartDatum,\n} from './line-chart'\n\nconst DEFAULT_HEIGHT = 220\n// `left` leaves room for the y-axis tick labels + unit (matches the 34px gutter\n// used by BarChart / PowerHistoryChart).\nconst BASE_MARGIN = { top: 8, right: 8, bottom: 28, left: 34 }\n/** Extra headroom for the weather icon row pinned above the plot. */\nconst WEATHER_ROW_HEIGHT = 24\n\nfunction defaultFormatValue(value: number): string {\n return `${oneDecimalFormat.format(value)}${NARROW_NBSP}kW`\n}\n\nfunction defaultFormatTime(date: Date): string {\n return date.getHours().toString().padStart(2, '0')\n}\n\nexport interface SolarForecastWeatherPoint {\n date: Date\n icon: MaterialSymbolIconName\n}\n\nexport interface SolarForecastChartProps {\n /** Measured production, drawn as the solid line. */\n produced: LineChartDatum[]\n /** Predicted production, drawn as the dashed line. */\n forecast: LineChartDatum[]\n /** Tooltip label for the produced series. */\n producedLabel?: ReactNode\n /** Tooltip label for the forecast series. */\n forecastLabel?: ReactNode\n /** Tooltip value formatter. Defaults to one-decimal kW (power). */\n formatValue?: (value: number) => string\n /** Unit shown once atop the y-axis; ticks render as plain numbers. Defaults to \"kW\". */\n yAxisUnit?: string\n /** X-axis tick formatter. Defaults to the zero-padded hour. */\n formatTime?: (date: Date) => string\n /** Tooltip time formatter. Defaults to `formatTime`. */\n formatTooltipTime?: (date: Date) => string\n /**\n * Hourly weather icons drawn along the top of the plot, aligned to the time\n * axis. Their dates must fall within the plotted day.\n */\n weather?: SolarForecastWeatherPoint[]\n /** Sunrise time, drawn as a labelled vertical marker on the plot. */\n sunrise?: Date\n /** Sunset time, drawn as a labelled vertical marker on the plot. */\n sunset?: Date\n /** Label formatter for the sunrise/sunset markers. Defaults to `formatTime`. */\n formatMarkerTime?: (date: Date) => string\n curve?: LineChartCurve\n height?: number\n className?: string\n}\n\n/**\n * Responsive line plot of measured production (solid) against a forecast\n * (dashed) over a day. Optionally overlays hourly weather icons and\n * sunrise/sunset markers, all pinned to the same time axis. Sizes itself to its\n * container; compose a title and any summary around it.\n */\nexport function SolarForecastChart({\n produced,\n forecast,\n producedLabel = 'Produced',\n forecastLabel = 'Forecast',\n formatValue = defaultFormatValue,\n yAxisUnit = 'kW',\n formatTime = defaultFormatTime,\n formatTooltipTime,\n weather,\n sunrise,\n sunset,\n formatMarkerTime,\n curve = 'monotone',\n height = DEFAULT_HEIGHT,\n className,\n}: SolarForecastChartProps): JSX.Element {\n const containerRef = useRef<HTMLDivElement>(null)\n const [width, setWidth] = useState(0)\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) setWidth(entry.contentRect.width)\n })\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n const hasWeather = weather != null && weather.length > 0\n const margin = {\n ...BASE_MARGIN,\n top: hasWeather ? BASE_MARGIN.top + WEATHER_ROW_HEIGHT : BASE_MARGIN.top,\n }\n const formatMarker = formatMarkerTime ?? formatTooltipTime ?? formatTime\n\n const topContent = hasWeather\n ? weather.map((point, i) => ({\n key: `weather-${point.date.valueOf()}-${i}`,\n date: point.date,\n content: (\n <MaterialSymbol\n name={point.icon}\n className=\"text-(length:--spark-icon-size,18px)! text-gray-light\"\n />\n ),\n }))\n : undefined\n\n const referenceLines = [\n sunrise && { key: 'sunrise', date: sunrise, label: formatMarker(sunrise) },\n sunset && { key: 'sunset', date: sunset, label: formatMarker(sunset) },\n ].filter((x): x is { key: string; date: Date; label: string } => Boolean(x))\n\n return (\n <div ref={containerRef} className={cn('w-full', className)}>\n {width > 0 && (\n <LineChart\n width={width}\n height={height}\n margin={margin}\n curve={curve}\n series={[\n { id: 'produced', data: produced, label: producedLabel },\n {\n id: 'forecast',\n data: forecast,\n label: forecastLabel,\n dashed: true,\n },\n ]}\n showGrid\n xTickCount={6}\n yTickCount={4}\n yAxisUnit={yAxisUnit}\n formatDate={formatTime}\n formatTooltipDate={formatTooltipTime ?? formatTime}\n formatValue={formatValue}\n referenceLines={\n referenceLines.length > 0 ? referenceLines : undefined\n }\n topContent={topContent}\n />\n )}\n </div>\n )\n}\n\nexport default SolarForecastChart\n"],"mappings":";;;;;;;;;AAcA,MAAM,iBAAiB;AAGvB,MAAM,cAAc;CAAE,KAAK;CAAG,OAAO;CAAG,QAAQ;CAAI,MAAM;CAAI;;AAE9D,MAAM,qBAAqB;AAE3B,SAAS,mBAAmB,OAAuB;AACjD,QAAO,GAAG,iBAAiB,OAAO,MAAM;;AAG1C,SAAS,kBAAkB,MAAoB;AAC7C,QAAO,KAAK,UAAU,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI;;;;;;;;AA+CpD,SAAgB,mBAAmB,EACjC,UACA,UACA,gBAAgB,YAChB,gBAAgB,YAChB,cAAc,oBACd,YAAY,MACZ,aAAa,mBACb,mBACA,SACA,SACA,QACA,kBACA,QAAQ,YACR,SAAS,gBACT,aACuC;CACvC,MAAM,eAAe,OAAuB,KAAK;CACjD,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;AAErC,iBAAgB;EACd,MAAM,KAAK,aAAa;AACxB,MAAI,CAAC,GAAI;EACT,MAAM,KAAK,IAAI,gBAAgB,YAAY;GACzC,MAAM,QAAQ,QAAQ;AACtB,OAAI,MAAO,UAAS,MAAM,YAAY,MAAM;IAC5C;AACF,KAAG,QAAQ,GAAG;AACd,eAAa,GAAG,YAAY;IAC3B,EAAE,CAAC;CAEN,MAAM,aAAa,WAAW,QAAQ,QAAQ,SAAS;CACvD,MAAM,SAAS;EACb,GAAG;EACH,KAAK,aAAa,YAAY,MAAM,qBAAqB,YAAY;EACtE;CACD,MAAM,eAAe,oBAAoB,qBAAqB;CAE9D,MAAM,aAAa,aACf,QAAQ,KAAK,OAAO,OAAO;EACzB,KAAK,WAAW,MAAM,KAAK,SAAS,CAAC,GAAG;EACxC,MAAM,MAAM;EACZ,SACE,oBAAC,gBAAD;GACE,MAAM,MAAM;GACZ,WAAU;GACV,CAAA;EAEL,EAAE,GACH,KAAA;CAEJ,MAAM,iBAAiB,CACrB,WAAW;EAAE,KAAK;EAAW,MAAM;EAAS,OAAO,aAAa,QAAQ;EAAE,EAC1E,UAAU;EAAE,KAAK;EAAU,MAAM;EAAQ,OAAO,aAAa,OAAO;EAAE,CACvE,CAAC,QAAQ,MAAuD,QAAQ,EAAE,CAAC;AAE5E,QACE,oBAAC,OAAD;EAAK,KAAK;EAAc,WAAW,GAAG,UAAU,UAAU;YACvD,QAAQ,KACP,oBAAC,WAAD;GACS;GACC;GACA;GACD;GACP,QAAQ,CACN;IAAE,IAAI;IAAY,MAAM;IAAU,OAAO;IAAe,EACxD;IACE,IAAI;IACJ,MAAM;IACN,OAAO;IACP,QAAQ;IACT,CACF;GACD,UAAA;GACA,YAAY;GACZ,YAAY;GACD;GACX,YAAY;GACZ,mBAAmB,qBAAqB;GAC3B;GACb,gBACE,eAAe,SAAS,IAAI,iBAAiB,KAAA;GAEnC;GACZ,CAAA;EAEA,CAAA"}
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ require("../chunk-aJGBMT86.cjs");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+ let _dnd_kit_core = require("@dnd-kit/core");
6
+ let _dnd_kit_modifiers = require("@dnd-kit/modifiers");
7
+ let _dnd_kit_sortable = require("@dnd-kit/sortable");
8
+ let _dnd_kit_utilities = require("@dnd-kit/utilities");
9
+ let cnfast = require("cnfast");
10
+ //#region src/components/sortable-list.tsx
11
+ /**
12
+ * Vertical drag-and-drop sortable list built on @dnd-kit. Pointer, touch and
13
+ * keyboard sensors are wired up; dragging is constrained to the vertical axis
14
+ * within the list. The consumer owns row markup and decides which element is
15
+ * the handle via the `handle` argument of `renderItem`.
16
+ */
17
+ function SortableList({ items, getItemId, onReorder, renderItem, className }) {
18
+ const ids = items.map(getItemId);
19
+ const sensors = (0, _dnd_kit_core.useSensors)((0, _dnd_kit_core.useSensor)(_dnd_kit_core.PointerSensor, { activationConstraint: { distance: 5 } }), (0, _dnd_kit_core.useSensor)(_dnd_kit_core.TouchSensor, { activationConstraint: {
20
+ delay: 150,
21
+ tolerance: 5
22
+ } }), (0, _dnd_kit_core.useSensor)(_dnd_kit_core.KeyboardSensor, { coordinateGetter: _dnd_kit_sortable.sortableKeyboardCoordinates }));
23
+ const handleDragEnd = (event) => {
24
+ const { active, over } = event;
25
+ if (!over || active.id === over.id) return;
26
+ const oldIndex = ids.indexOf(String(active.id));
27
+ const newIndex = ids.indexOf(String(over.id));
28
+ if (oldIndex < 0 || newIndex < 0) return;
29
+ onReorder((0, _dnd_kit_sortable.arrayMove)(items, oldIndex, newIndex));
30
+ };
31
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_dnd_kit_core.DndContext, {
32
+ sensors,
33
+ collisionDetection: _dnd_kit_core.closestCenter,
34
+ modifiers: [_dnd_kit_modifiers.restrictToVerticalAxis, _dnd_kit_modifiers.restrictToParentElement],
35
+ onDragEnd: handleDragEnd,
36
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_dnd_kit_sortable.SortableContext, {
37
+ items: ids,
38
+ strategy: _dnd_kit_sortable.verticalListSortingStrategy,
39
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40
+ className: (0, cnfast.cn)("flex flex-col gap-2", className),
41
+ children: items.map((item, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SortableRow, {
42
+ id: getItemId(item),
43
+ children: (handle) => renderItem(item, handle, index)
44
+ }, getItemId(item)))
45
+ })
46
+ })
47
+ });
48
+ }
49
+ function SortableRow({ id, children }) {
50
+ const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = (0, _dnd_kit_sortable.useSortable)({ id });
51
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
52
+ ref: setNodeRef,
53
+ style: {
54
+ transform: _dnd_kit_utilities.CSS.Transform.toString(transform),
55
+ transition
56
+ },
57
+ className: (0, cnfast.cn)(isDragging && "relative z-10"),
58
+ children: children({
59
+ ref: setActivatorNodeRef,
60
+ attributes,
61
+ listeners,
62
+ isDragging
63
+ })
64
+ });
65
+ }
66
+ //#endregion
67
+ exports.SortableList = SortableList;
68
+
69
+ //# sourceMappingURL=sortable-list.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortable-list.cjs","names":["PointerSensor","TouchSensor","KeyboardSensor","sortableKeyboardCoordinates","DndContext","closestCenter","restrictToVerticalAxis","restrictToParentElement","SortableContext","verticalListSortingStrategy","CSS"],"sources":["../../src/components/sortable-list.tsx"],"sourcesContent":["import {\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n restrictToParentElement,\n restrictToVerticalAxis,\n} from '@dnd-kit/modifiers'\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport type { ReactNode } from 'react'\nimport { cn } from '../utils/cn'\n\ntype SortableHookResult = ReturnType<typeof useSortable>\n\n/**\n * Props to spread onto the element that should start a drag (the handle).\n * Attach `ref`, `attributes`, and `listeners` to a focusable element such as a\n * button to make it the drag handle; `isDragging` reflects the row's state.\n */\nexport interface SortableDragHandle {\n ref: SortableHookResult['setActivatorNodeRef']\n attributes: SortableHookResult['attributes']\n listeners: SortableHookResult['listeners']\n isDragging: boolean\n}\n\nexport interface SortableListProps<T> {\n items: T[]\n /** Stable unique id for an item. */\n getItemId: (item: T) => string\n /** Called with the reordered items after a drag completes. */\n onReorder: (items: T[]) => void\n /** Render a single row. Spread `handle` onto the drag-handle element. */\n renderItem: (item: T, handle: SortableDragHandle, index: number) => ReactNode\n /** Classes for the list container (defaults to a vertical flex with gap). */\n className?: string\n}\n\n/**\n * Vertical drag-and-drop sortable list built on @dnd-kit. Pointer, touch and\n * keyboard sensors are wired up; dragging is constrained to the vertical axis\n * within the list. The consumer owns row markup and decides which element is\n * the handle via the `handle` argument of `renderItem`.\n */\nexport function SortableList<T>({\n items,\n getItemId,\n onReorder,\n renderItem,\n className,\n}: SortableListProps<T>) {\n const ids = items.map(getItemId)\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(TouchSensor, {\n activationConstraint: { delay: 150, tolerance: 5 },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = ids.indexOf(String(active.id))\n const newIndex = ids.indexOf(String(over.id))\n if (oldIndex < 0 || newIndex < 0) return\n onReorder(arrayMove(items, oldIndex, newIndex))\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToVerticalAxis, restrictToParentElement]}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={ids} strategy={verticalListSortingStrategy}>\n <div className={cn('flex flex-col gap-2', className)}>\n {items.map((item, index) => (\n <SortableRow key={getItemId(item)} id={getItemId(item)}>\n {(handle) => renderItem(item, handle, index)}\n </SortableRow>\n ))}\n </div>\n </SortableContext>\n </DndContext>\n )\n}\n\ninterface SortableRowProps {\n id: string\n children: (handle: SortableDragHandle) => ReactNode\n}\n\nfunction SortableRow({ id, children }: SortableRowProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(isDragging && 'relative z-10')}\n >\n {children({\n ref: setActivatorNodeRef,\n attributes,\n listeners,\n isDragging,\n })}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAyDA,SAAgB,aAAgB,EAC9B,OACA,WACA,WACA,YACA,aACuB;CACvB,MAAM,MAAM,MAAM,IAAI,UAAU;CAEhC,MAAM,WAAA,GAAA,cAAA,aAAA,GAAA,cAAA,WACMA,cAAAA,eAAe,EAAE,sBAAsB,EAAE,UAAU,GAAG,EAAE,CAAC,GAAA,GAAA,cAAA,WACzDC,cAAAA,aAAa,EACrB,sBAAsB;EAAE,OAAO;EAAK,WAAW;EAAG,EACnD,CAAC,GAAA,GAAA,cAAA,WACQC,cAAAA,gBAAgB,EACxB,kBAAkBC,kBAAAA,6BACnB,CAAC,CACH;CAED,MAAM,iBAAiB,UAAwB;EAC7C,MAAM,EAAE,QAAQ,SAAS;AACzB,MAAI,CAAC,QAAQ,OAAO,OAAO,KAAK,GAAI;EACpC,MAAM,WAAW,IAAI,QAAQ,OAAO,OAAO,GAAG,CAAC;EAC/C,MAAM,WAAW,IAAI,QAAQ,OAAO,KAAK,GAAG,CAAC;AAC7C,MAAI,WAAW,KAAK,WAAW,EAAG;AAClC,aAAA,GAAA,kBAAA,WAAoB,OAAO,UAAU,SAAS,CAAC;;AAGjD,QACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,YAAD;EACW;EACT,oBAAoBC,cAAAA;EACpB,WAAW,CAACC,mBAAAA,wBAAwBC,mBAAAA,wBAAwB;EAC5D,WAAW;YAEX,iBAAA,GAAA,kBAAA,KAACC,kBAAAA,iBAAD;GAAiB,OAAO;GAAK,UAAUC,kBAAAA;aACrC,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,YAAA,GAAA,OAAA,IAAc,uBAAuB,UAAU;cACjD,MAAM,KAAK,MAAM,UAChB,iBAAA,GAAA,kBAAA,KAAC,aAAD;KAAmC,IAAI,UAAU,KAAK;gBAClD,WAAW,WAAW,MAAM,QAAQ,MAAM;KAChC,EAFI,UAAU,KAAK,CAEnB,CACd;IACE,CAAA;GACU,CAAA;EACP,CAAA;;AASjB,SAAS,YAAY,EAAE,IAAI,YAA8B;CACvD,MAAM,EACJ,YACA,WACA,YACA,qBACA,WACA,YACA,gBAAA,GAAA,kBAAA,aACc,EAAE,IAAI,CAAC;AAOvB,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,KAAK;EACL,OAAO;GAPT,WAAWC,mBAAAA,IAAI,UAAU,SAAS,UAAU;GAC5C;GAMc;EACZ,YAAA,GAAA,OAAA,IAAc,cAAc,gBAAgB;YAE3C,SAAS;GACR,KAAK;GACL;GACA;GACA;GACD,CAAC;EACE,CAAA"}
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
+ import { ReactNode } from "react";
5
+ import { useSortable } from "@dnd-kit/sortable";
6
+
7
+ //#region src/components/sortable-list.d.ts
8
+ type SortableHookResult = ReturnType<typeof useSortable>;
9
+ /**
10
+ * Props to spread onto the element that should start a drag (the handle).
11
+ * Attach `ref`, `attributes`, and `listeners` to a focusable element such as a
12
+ * button to make it the drag handle; `isDragging` reflects the row's state.
13
+ */
14
+ interface SortableDragHandle {
15
+ ref: SortableHookResult['setActivatorNodeRef'];
16
+ attributes: SortableHookResult['attributes'];
17
+ listeners: SortableHookResult['listeners'];
18
+ isDragging: boolean;
19
+ }
20
+ interface SortableListProps<T> {
21
+ items: T[];
22
+ /** Stable unique id for an item. */
23
+ getItemId: (item: T) => string;
24
+ /** Called with the reordered items after a drag completes. */
25
+ onReorder: (items: T[]) => void;
26
+ /** Render a single row. Spread `handle` onto the drag-handle element. */
27
+ renderItem: (item: T, handle: SortableDragHandle, index: number) => ReactNode;
28
+ /** Classes for the list container (defaults to a vertical flex with gap). */
29
+ className?: string;
30
+ }
31
+ /**
32
+ * Vertical drag-and-drop sortable list built on @dnd-kit. Pointer, touch and
33
+ * keyboard sensors are wired up; dragging is constrained to the vertical axis
34
+ * within the list. The consumer owns row markup and decides which element is
35
+ * the handle via the `handle` argument of `renderItem`.
36
+ */
37
+ declare function SortableList<T>({
38
+ items,
39
+ getItemId,
40
+ onReorder,
41
+ renderItem,
42
+ className
43
+ }: SortableListProps<T>): _$react_jsx_runtime0.JSX.Element;
44
+ //#endregion
45
+ export { SortableDragHandle, SortableList, SortableListProps };
46
+ //# sourceMappingURL=sortable-list.d.cts.map
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ import { ReactNode } from "react";
4
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
+ import { useSortable } from "@dnd-kit/sortable";
6
+
7
+ //#region src/components/sortable-list.d.ts
8
+ type SortableHookResult = ReturnType<typeof useSortable>;
9
+ /**
10
+ * Props to spread onto the element that should start a drag (the handle).
11
+ * Attach `ref`, `attributes`, and `listeners` to a focusable element such as a
12
+ * button to make it the drag handle; `isDragging` reflects the row's state.
13
+ */
14
+ interface SortableDragHandle {
15
+ ref: SortableHookResult['setActivatorNodeRef'];
16
+ attributes: SortableHookResult['attributes'];
17
+ listeners: SortableHookResult['listeners'];
18
+ isDragging: boolean;
19
+ }
20
+ interface SortableListProps<T> {
21
+ items: T[];
22
+ /** Stable unique id for an item. */
23
+ getItemId: (item: T) => string;
24
+ /** Called with the reordered items after a drag completes. */
25
+ onReorder: (items: T[]) => void;
26
+ /** Render a single row. Spread `handle` onto the drag-handle element. */
27
+ renderItem: (item: T, handle: SortableDragHandle, index: number) => ReactNode;
28
+ /** Classes for the list container (defaults to a vertical flex with gap). */
29
+ className?: string;
30
+ }
31
+ /**
32
+ * Vertical drag-and-drop sortable list built on @dnd-kit. Pointer, touch and
33
+ * keyboard sensors are wired up; dragging is constrained to the vertical axis
34
+ * within the list. The consumer owns row markup and decides which element is
35
+ * the handle via the `handle` argument of `renderItem`.
36
+ */
37
+ declare function SortableList<T>({
38
+ items,
39
+ getItemId,
40
+ onReorder,
41
+ renderItem,
42
+ className
43
+ }: SortableListProps<T>): _$react_jsx_runtime0.JSX.Element;
44
+ //#endregion
45
+ export { SortableDragHandle, SortableList, SortableListProps };
46
+ //# sourceMappingURL=sortable-list.d.ts.map