@panoboard/core 1.2.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/dist/annotations/executor.d.ts +32 -0
  2. package/dist/annotations/executor.d.ts.map +1 -0
  3. package/dist/annotations/executor.js +74 -0
  4. package/dist/annotations/executor.js.map +1 -0
  5. package/dist/annotations/index.d.ts +2 -0
  6. package/dist/annotations/index.d.ts.map +1 -0
  7. package/dist/annotations/index.js +15 -0
  8. package/dist/annotations/index.js.map +1 -0
  9. package/dist/cache/keys.d.ts.map +1 -1
  10. package/dist/cache/keys.js +4 -4
  11. package/dist/cache/keys.js.map +1 -1
  12. package/dist/components/ConfigErrorBanner.d.ts +7 -0
  13. package/dist/components/ConfigErrorBanner.d.ts.map +1 -0
  14. package/dist/components/ConfigErrorBanner.js +43 -0
  15. package/dist/components/ConfigErrorBanner.js.map +1 -0
  16. package/dist/components/CrosshairContext.d.ts +13 -0
  17. package/dist/components/CrosshairContext.d.ts.map +1 -0
  18. package/dist/components/CrosshairContext.js +37 -0
  19. package/dist/components/CrosshairContext.js.map +1 -0
  20. package/dist/components/DashboardCard.d.ts +2 -1
  21. package/dist/components/DashboardCard.d.ts.map +1 -1
  22. package/dist/components/DashboardCard.js +11 -4
  23. package/dist/components/DashboardCard.js.map +1 -1
  24. package/dist/components/DashboardDescription.d.ts +19 -0
  25. package/dist/components/DashboardDescription.d.ts.map +1 -0
  26. package/dist/components/DashboardDescription.js +61 -0
  27. package/dist/components/DashboardDescription.js.map +1 -0
  28. package/dist/components/DashboardLinks.d.ts +8 -0
  29. package/dist/components/DashboardLinks.d.ts.map +1 -0
  30. package/dist/components/DashboardLinks.js +53 -0
  31. package/dist/components/DashboardLinks.js.map +1 -0
  32. package/dist/components/DashboardShell.d.ts +5 -1
  33. package/dist/components/DashboardShell.d.ts.map +1 -1
  34. package/dist/components/DashboardShell.js +42 -25
  35. package/dist/components/DashboardShell.js.map +1 -1
  36. package/dist/components/EmptyState.d.ts.map +1 -1
  37. package/dist/components/EmptyState.js +7 -1
  38. package/dist/components/EmptyState.js.map +1 -1
  39. package/dist/components/ErrorPage.d.ts.map +1 -1
  40. package/dist/components/ErrorPage.js +22 -33
  41. package/dist/components/ErrorPage.js.map +1 -1
  42. package/dist/components/FilterBar.d.ts.map +1 -1
  43. package/dist/components/FilterBar.js +21 -5
  44. package/dist/components/FilterBar.js.map +1 -1
  45. package/dist/components/NotificationCenter.d.ts +6 -0
  46. package/dist/components/NotificationCenter.d.ts.map +1 -0
  47. package/dist/components/NotificationCenter.js +67 -0
  48. package/dist/components/NotificationCenter.js.map +1 -0
  49. package/dist/components/NotificationIndicator.d.ts +6 -0
  50. package/dist/components/NotificationIndicator.d.ts.map +1 -0
  51. package/dist/components/NotificationIndicator.js +27 -0
  52. package/dist/components/NotificationIndicator.js.map +1 -0
  53. package/dist/components/PanelGrid.js +2 -2
  54. package/dist/components/PanelGrid.js.map +1 -1
  55. package/dist/components/PanelWrapper.d.ts +2 -1
  56. package/dist/components/PanelWrapper.d.ts.map +1 -1
  57. package/dist/components/PanelWrapper.js +101 -16
  58. package/dist/components/PanelWrapper.js.map +1 -1
  59. package/dist/components/RefreshContext.d.ts +3 -0
  60. package/dist/components/RefreshContext.d.ts.map +1 -0
  61. package/dist/components/RefreshContext.js +7 -0
  62. package/dist/components/RefreshContext.js.map +1 -0
  63. package/dist/components/RefreshControl.d.ts +17 -0
  64. package/dist/components/RefreshControl.d.ts.map +1 -0
  65. package/dist/components/RefreshControl.js +72 -0
  66. package/dist/components/RefreshControl.js.map +1 -0
  67. package/dist/components/SectionGrid.d.ts +9 -0
  68. package/dist/components/SectionGrid.d.ts.map +1 -0
  69. package/dist/components/SectionGrid.js +76 -0
  70. package/dist/components/SectionGrid.js.map +1 -0
  71. package/dist/components/SectionHeader.d.ts +8 -0
  72. package/dist/components/SectionHeader.d.ts.map +1 -0
  73. package/dist/components/SectionHeader.js +21 -0
  74. package/dist/components/SectionHeader.js.map +1 -0
  75. package/dist/components/TagPills.d.ts +7 -0
  76. package/dist/components/TagPills.d.ts.map +1 -0
  77. package/dist/components/TagPills.js +41 -0
  78. package/dist/components/TagPills.js.map +1 -0
  79. package/dist/components/filters/BooleanFilter.d.ts.map +1 -1
  80. package/dist/components/filters/BooleanFilter.js +1 -3
  81. package/dist/components/filters/BooleanFilter.js.map +1 -1
  82. package/dist/components/filters/CalendarGrid.d.ts.map +1 -1
  83. package/dist/components/filters/CalendarGrid.js +1 -1
  84. package/dist/components/filters/CalendarGrid.js.map +1 -1
  85. package/dist/components/filters/DateRangeFilter.d.ts.map +1 -1
  86. package/dist/components/filters/DateRangeFilter.js +4 -6
  87. package/dist/components/filters/DateRangeFilter.js.map +1 -1
  88. package/dist/components/filters/FilterChips.d.ts.map +1 -1
  89. package/dist/components/filters/FilterChips.js +71 -10
  90. package/dist/components/filters/FilterChips.js.map +1 -1
  91. package/dist/components/filters/IntervalFilter.d.ts +9 -0
  92. package/dist/components/filters/IntervalFilter.d.ts.map +1 -0
  93. package/dist/components/filters/IntervalFilter.js +29 -0
  94. package/dist/components/filters/IntervalFilter.js.map +1 -0
  95. package/dist/components/filters/MultiSelectFilter.d.ts.map +1 -1
  96. package/dist/components/filters/MultiSelectFilter.js +1 -3
  97. package/dist/components/filters/MultiSelectFilter.js.map +1 -1
  98. package/dist/components/filters/NumberFilter.d.ts.map +1 -1
  99. package/dist/components/filters/NumberFilter.js +5 -1
  100. package/dist/components/filters/NumberFilter.js.map +1 -1
  101. package/dist/components/filters/SelectFilter.d.ts +2 -1
  102. package/dist/components/filters/SelectFilter.d.ts.map +1 -1
  103. package/dist/components/filters/SelectFilter.js +9 -10
  104. package/dist/components/filters/SelectFilter.js.map +1 -1
  105. package/dist/components/filters/TextFilter.d.ts.map +1 -1
  106. package/dist/components/filters/TextFilter.js +5 -1
  107. package/dist/components/filters/TextFilter.js.map +1 -1
  108. package/dist/components/index.d.ts +12 -1
  109. package/dist/components/index.d.ts.map +1 -1
  110. package/dist/components/index.js +15 -1
  111. package/dist/components/index.js.map +1 -1
  112. package/dist/components/panels/AnnotationLayer.d.ts +28 -0
  113. package/dist/components/panels/AnnotationLayer.d.ts.map +1 -0
  114. package/dist/components/panels/AnnotationLayer.js +102 -0
  115. package/dist/components/panels/AnnotationLayer.js.map +1 -0
  116. package/dist/components/panels/AreaChart.d.ts +3 -1
  117. package/dist/components/panels/AreaChart.d.ts.map +1 -1
  118. package/dist/components/panels/AreaChart.js +86 -5
  119. package/dist/components/panels/AreaChart.js.map +1 -1
  120. package/dist/components/panels/BarChart.d.ts.map +1 -1
  121. package/dist/components/panels/BarChart.js +61 -7
  122. package/dist/components/panels/BarChart.js.map +1 -1
  123. package/dist/components/panels/ChartTooltip.d.ts.map +1 -1
  124. package/dist/components/panels/ChartTooltip.js +9 -48
  125. package/dist/components/panels/ChartTooltip.js.map +1 -1
  126. package/dist/components/panels/DataLinks.d.ts +35 -0
  127. package/dist/components/panels/DataLinks.d.ts.map +1 -0
  128. package/dist/components/panels/DataLinks.js +67 -0
  129. package/dist/components/panels/DataLinks.js.map +1 -0
  130. package/dist/components/panels/GaugePanel.d.ts +7 -0
  131. package/dist/components/panels/GaugePanel.d.ts.map +1 -0
  132. package/dist/components/panels/GaugePanel.js +116 -0
  133. package/dist/components/panels/GaugePanel.js.map +1 -0
  134. package/dist/components/panels/HistogramPanel.d.ts +18 -0
  135. package/dist/components/panels/HistogramPanel.d.ts.map +1 -0
  136. package/dist/components/panels/HistogramPanel.js +92 -0
  137. package/dist/components/panels/HistogramPanel.js.map +1 -0
  138. package/dist/components/panels/LineChart.d.ts +3 -1
  139. package/dist/components/panels/LineChart.d.ts.map +1 -1
  140. package/dist/components/panels/LineChart.js +89 -5
  141. package/dist/components/panels/LineChart.js.map +1 -1
  142. package/dist/components/panels/ListPanel.d.ts.map +1 -1
  143. package/dist/components/panels/ListPanel.js +1 -1
  144. package/dist/components/panels/ListPanel.js.map +1 -1
  145. package/dist/components/panels/MarkdownPanel.d.ts +15 -1
  146. package/dist/components/panels/MarkdownPanel.d.ts.map +1 -1
  147. package/dist/components/panels/MarkdownPanel.js +70 -7
  148. package/dist/components/panels/MarkdownPanel.js.map +1 -1
  149. package/dist/components/panels/MetricPanel.d.ts.map +1 -1
  150. package/dist/components/panels/MetricPanel.js +1 -1
  151. package/dist/components/panels/MetricPanel.js.map +1 -1
  152. package/dist/components/panels/PanelEmpty.d.ts.map +1 -1
  153. package/dist/components/panels/PanelEmpty.js +1 -1
  154. package/dist/components/panels/PanelEmpty.js.map +1 -1
  155. package/dist/components/panels/PanelError.d.ts.map +1 -1
  156. package/dist/components/panels/PanelError.js +4 -1
  157. package/dist/components/panels/PanelError.js.map +1 -1
  158. package/dist/components/panels/PanelSkeleton.js +2 -2
  159. package/dist/components/panels/PanelSkeleton.js.map +1 -1
  160. package/dist/components/panels/ScatterChart.d.ts +15 -1
  161. package/dist/components/panels/ScatterChart.d.ts.map +1 -1
  162. package/dist/components/panels/ScatterChart.js +96 -26
  163. package/dist/components/panels/ScatterChart.js.map +1 -1
  164. package/dist/components/panels/Sparkline.d.ts +21 -0
  165. package/dist/components/panels/Sparkline.d.ts.map +1 -0
  166. package/dist/components/panels/Sparkline.js +53 -0
  167. package/dist/components/panels/Sparkline.js.map +1 -0
  168. package/dist/components/panels/StatPanel.d.ts +3 -1
  169. package/dist/components/panels/StatPanel.d.ts.map +1 -1
  170. package/dist/components/panels/StatPanel.js +33 -4
  171. package/dist/components/panels/StatPanel.js.map +1 -1
  172. package/dist/components/panels/TablePanel.d.ts +2 -1
  173. package/dist/components/panels/TablePanel.d.ts.map +1 -1
  174. package/dist/components/panels/TablePanel.js +96 -6
  175. package/dist/components/panels/TablePanel.js.map +1 -1
  176. package/dist/components/panels/VideoPanel.d.ts.map +1 -1
  177. package/dist/components/panels/VideoPanel.js +1 -1
  178. package/dist/components/panels/VideoPanel.js.map +1 -1
  179. package/dist/components/panels/nivo-theme.d.ts +1 -44
  180. package/dist/components/panels/nivo-theme.d.ts.map +1 -1
  181. package/dist/components/panels/nivo-theme.js +9 -104
  182. package/dist/components/panels/nivo-theme.js.map +1 -1
  183. package/dist/components/panels/semantic-colors.d.ts.map +1 -1
  184. package/dist/components/panels/semantic-colors.js +2 -39
  185. package/dist/components/panels/semantic-colors.js.map +1 -1
  186. package/dist/components/ui/Button.d.ts +1 -1
  187. package/dist/components/ui/Button.d.ts.map +1 -1
  188. package/dist/components/ui/Button.js +6 -9
  189. package/dist/components/ui/Button.js.map +1 -1
  190. package/dist/components/ui/Tabs.d.ts.map +1 -1
  191. package/dist/components/ui/Tabs.js +1 -1
  192. package/dist/components/ui/Tabs.js.map +1 -1
  193. package/dist/connectors/bigquery.d.ts.map +1 -1
  194. package/dist/connectors/bigquery.js +6 -1
  195. package/dist/connectors/bigquery.js.map +1 -1
  196. package/dist/connectors/postgres.d.ts.map +1 -1
  197. package/dist/connectors/postgres.js +3 -0
  198. package/dist/connectors/postgres.js.map +1 -1
  199. package/dist/connectors/redshift.d.ts.map +1 -1
  200. package/dist/connectors/redshift.js +3 -0
  201. package/dist/connectors/redshift.js.map +1 -1
  202. package/dist/contexts/NotificationContext.d.ts +10 -0
  203. package/dist/contexts/NotificationContext.d.ts.map +1 -0
  204. package/dist/contexts/NotificationContext.js +24 -0
  205. package/dist/contexts/NotificationContext.js.map +1 -0
  206. package/dist/filters/daterange.d.ts +1 -1
  207. package/dist/filters/daterange.d.ts.map +1 -1
  208. package/dist/filters/daterange.js +54 -9
  209. package/dist/filters/daterange.js.map +1 -1
  210. package/dist/filters/index.d.ts +2 -0
  211. package/dist/filters/index.d.ts.map +1 -1
  212. package/dist/filters/index.js +2 -0
  213. package/dist/filters/index.js.map +1 -1
  214. package/dist/filters/interval.d.ts +13 -0
  215. package/dist/filters/interval.d.ts.map +1 -0
  216. package/dist/filters/interval.js +40 -0
  217. package/dist/filters/interval.js.map +1 -0
  218. package/dist/filters/resolver.d.ts +1 -1
  219. package/dist/filters/resolver.d.ts.map +1 -1
  220. package/dist/filters/resolver.js +28 -2
  221. package/dist/filters/resolver.js.map +1 -1
  222. package/dist/flattenTabs.d.ts +8 -0
  223. package/dist/flattenTabs.d.ts.map +1 -0
  224. package/dist/flattenTabs.js +24 -0
  225. package/dist/flattenTabs.js.map +1 -0
  226. package/dist/formats.d.ts +1 -1
  227. package/dist/formats.d.ts.map +1 -1
  228. package/dist/formats.js +19 -9
  229. package/dist/formats.js.map +1 -1
  230. package/dist/hooks/useNotifications.d.ts +5 -0
  231. package/dist/hooks/useNotifications.d.ts.map +1 -0
  232. package/dist/hooks/useNotifications.js +48 -0
  233. package/dist/hooks/useNotifications.js.map +1 -0
  234. package/dist/index.d.ts +4 -0
  235. package/dist/index.d.ts.map +1 -1
  236. package/dist/index.js +4 -0
  237. package/dist/index.js.map +1 -1
  238. package/dist/interpolation.d.ts +10 -0
  239. package/dist/interpolation.d.ts.map +1 -0
  240. package/dist/interpolation.js +64 -0
  241. package/dist/interpolation.js.map +1 -0
  242. package/dist/panels/conditional.d.ts +12 -0
  243. package/dist/panels/conditional.d.ts.map +1 -0
  244. package/dist/panels/conditional.js +90 -0
  245. package/dist/panels/conditional.js.map +1 -0
  246. package/dist/panels/index.d.ts +11 -0
  247. package/dist/panels/index.d.ts.map +1 -0
  248. package/dist/panels/index.js +19 -0
  249. package/dist/panels/index.js.map +1 -0
  250. package/dist/panels/mappings.d.ts +40 -0
  251. package/dist/panels/mappings.d.ts.map +1 -0
  252. package/dist/panels/mappings.js +83 -0
  253. package/dist/panels/mappings.js.map +1 -0
  254. package/dist/panels/overrides.d.ts +37 -0
  255. package/dist/panels/overrides.d.ts.map +1 -0
  256. package/dist/panels/overrides.js +57 -0
  257. package/dist/panels/overrides.js.map +1 -0
  258. package/dist/panels/threshold-layers.d.ts +18 -0
  259. package/dist/panels/threshold-layers.d.ts.map +1 -0
  260. package/dist/panels/threshold-layers.js +35 -0
  261. package/dist/panels/threshold-layers.js.map +1 -0
  262. package/dist/panels/thresholds.d.ts +36 -0
  263. package/dist/panels/thresholds.d.ts.map +1 -0
  264. package/dist/panels/thresholds.js +81 -0
  265. package/dist/panels/thresholds.js.map +1 -0
  266. package/dist/schemas/annotations.d.ts +34 -0
  267. package/dist/schemas/annotations.d.ts.map +1 -0
  268. package/dist/schemas/annotations.js +19 -0
  269. package/dist/schemas/annotations.js.map +1 -0
  270. package/dist/schemas/config.d.ts +1 -0
  271. package/dist/schemas/config.d.ts.map +1 -1
  272. package/dist/schemas/config.js +1 -0
  273. package/dist/schemas/config.js.map +1 -1
  274. package/dist/schemas/dashboard.d.ts +5861 -235
  275. package/dist/schemas/dashboard.d.ts.map +1 -1
  276. package/dist/schemas/dashboard.js +173 -10
  277. package/dist/schemas/dashboard.js.map +1 -1
  278. package/dist/schemas/index.d.ts +6 -1
  279. package/dist/schemas/index.d.ts.map +1 -1
  280. package/dist/schemas/index.js +6 -1
  281. package/dist/schemas/index.js.map +1 -1
  282. package/dist/schemas/mappings.d.ts +46 -0
  283. package/dist/schemas/mappings.d.ts.map +1 -0
  284. package/dist/schemas/mappings.js +46 -0
  285. package/dist/schemas/mappings.js.map +1 -0
  286. package/dist/schemas/overrides.d.ts +77 -0
  287. package/dist/schemas/overrides.d.ts.map +1 -0
  288. package/dist/schemas/overrides.js +38 -0
  289. package/dist/schemas/overrides.js.map +1 -0
  290. package/dist/schemas/theme.d.ts +89 -7
  291. package/dist/schemas/theme.d.ts.map +1 -1
  292. package/dist/schemas/theme.js +40 -24
  293. package/dist/schemas/theme.js.map +1 -1
  294. package/dist/schemas/thresholds.d.ts +19 -0
  295. package/dist/schemas/thresholds.d.ts.map +1 -0
  296. package/dist/schemas/thresholds.js +31 -0
  297. package/dist/schemas/thresholds.js.map +1 -0
  298. package/dist/schemas/transforms.d.ts +54 -0
  299. package/dist/schemas/transforms.d.ts.map +1 -0
  300. package/dist/schemas/transforms.js +51 -0
  301. package/dist/schemas/transforms.js.map +1 -0
  302. package/dist/startup/sql-lint.d.ts.map +1 -1
  303. package/dist/startup/sql-lint.js +3 -2
  304. package/dist/startup/sql-lint.js.map +1 -1
  305. package/dist/theme/builtin.d.ts.map +1 -1
  306. package/dist/theme/builtin.js +56 -62
  307. package/dist/theme/builtin.js.map +1 -1
  308. package/dist/theme/colors.d.ts +11 -0
  309. package/dist/theme/colors.d.ts.map +1 -0
  310. package/dist/theme/colors.js +71 -0
  311. package/dist/theme/colors.js.map +1 -0
  312. package/dist/theme/context.d.ts.map +1 -1
  313. package/dist/theme/context.js +16 -3
  314. package/dist/theme/context.js.map +1 -1
  315. package/dist/theme/loader-export.d.ts +1 -1
  316. package/dist/theme/loader-export.d.ts.map +1 -1
  317. package/dist/theme/loader-export.js +1 -1
  318. package/dist/theme/loader-export.js.map +1 -1
  319. package/dist/theme/loader.d.ts +8 -3
  320. package/dist/theme/loader.d.ts.map +1 -1
  321. package/dist/theme/loader.js +24 -13
  322. package/dist/theme/loader.js.map +1 -1
  323. package/dist/transforms/computed.d.ts +11 -0
  324. package/dist/transforms/computed.d.ts.map +1 -0
  325. package/dist/transforms/computed.js +24 -0
  326. package/dist/transforms/computed.js.map +1 -0
  327. package/dist/transforms/engine.d.ts +17 -0
  328. package/dist/transforms/engine.d.ts.map +1 -0
  329. package/dist/transforms/engine.js +65 -0
  330. package/dist/transforms/engine.js.map +1 -0
  331. package/dist/transforms/expression.d.ts +9 -0
  332. package/dist/transforms/expression.d.ts.map +1 -0
  333. package/dist/transforms/expression.js +306 -0
  334. package/dist/transforms/expression.js.map +1 -0
  335. package/dist/transforms/filter.d.ts +11 -0
  336. package/dist/transforms/filter.d.ts.map +1 -0
  337. package/dist/transforms/filter.js +10 -0
  338. package/dist/transforms/filter.js.map +1 -0
  339. package/dist/transforms/index.d.ts +10 -0
  340. package/dist/transforms/index.d.ts.map +1 -0
  341. package/dist/transforms/index.js +9 -0
  342. package/dist/transforms/index.js.map +1 -0
  343. package/dist/transforms/limit.d.ts +11 -0
  344. package/dist/transforms/limit.d.ts.map +1 -0
  345. package/dist/transforms/limit.js +4 -0
  346. package/dist/transforms/limit.js.map +1 -0
  347. package/dist/transforms/percentage.d.ts +11 -0
  348. package/dist/transforms/percentage.d.ts.map +1 -0
  349. package/dist/transforms/percentage.js +25 -0
  350. package/dist/transforms/percentage.js.map +1 -0
  351. package/dist/transforms/rename.d.ts +11 -0
  352. package/dist/transforms/rename.d.ts.map +1 -0
  353. package/dist/transforms/rename.js +17 -0
  354. package/dist/transforms/rename.js.map +1 -0
  355. package/dist/transforms/sort.d.ts +11 -0
  356. package/dist/transforms/sort.d.ts.map +1 -0
  357. package/dist/transforms/sort.js +21 -0
  358. package/dist/transforms/sort.js.map +1 -0
  359. package/dist/types/config-error.d.ts +16 -0
  360. package/dist/types/config-error.d.ts.map +1 -0
  361. package/dist/types/config-error.js +2 -0
  362. package/dist/types/config-error.js.map +1 -0
  363. package/dist/types/notification.d.ts +19 -0
  364. package/dist/types/notification.d.ts.map +1 -0
  365. package/dist/types/notification.js +15 -0
  366. package/dist/types/notification.js.map +1 -0
  367. package/package.json +11 -1
@@ -0,0 +1,90 @@
1
+ // Copyright 2026 Mataki Labs LLC
2
+ //
3
+ // Licensed under the Business Source License 1.1 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ function parseWhen(when) {
15
+ const match = when
16
+ .trim()
17
+ .match(/^(>=|<=|!=|==|>|<)\s*(.+)$/);
18
+ if (!match)
19
+ return undefined;
20
+ const operator = match[1];
21
+ let operand = match[2].trim();
22
+ const strMatch = operand.match(/^['"](.*)['"]$/);
23
+ if (strMatch) {
24
+ operand = strMatch[1];
25
+ }
26
+ else {
27
+ const num = Number(operand);
28
+ if (!isNaN(num)) {
29
+ operand = num;
30
+ }
31
+ }
32
+ return { operator, operand };
33
+ }
34
+ export function evaluateConditional(value, rules) {
35
+ if (!rules || rules.length === 0)
36
+ return undefined;
37
+ if (value === null || value === undefined)
38
+ return undefined;
39
+ for (const rule of rules) {
40
+ const parsed = parseWhen(rule.when);
41
+ if (!parsed)
42
+ continue;
43
+ const { operator, operand } = parsed;
44
+ if (typeof operand === "string") {
45
+ const strVal = String(value);
46
+ switch (operator) {
47
+ case "==":
48
+ if (strVal === operand)
49
+ return rule.style;
50
+ break;
51
+ case "!=":
52
+ if (strVal !== operand)
53
+ return rule.style;
54
+ break;
55
+ }
56
+ continue;
57
+ }
58
+ const numVal = Number(value);
59
+ if (isNaN(numVal))
60
+ continue;
61
+ switch (operator) {
62
+ case ">":
63
+ if (numVal > operand)
64
+ return rule.style;
65
+ break;
66
+ case ">=":
67
+ if (numVal >= operand)
68
+ return rule.style;
69
+ break;
70
+ case "<":
71
+ if (numVal < operand)
72
+ return rule.style;
73
+ break;
74
+ case "<=":
75
+ if (numVal <= operand)
76
+ return rule.style;
77
+ break;
78
+ case "==":
79
+ if (numVal === operand)
80
+ return rule.style;
81
+ break;
82
+ case "!=":
83
+ if (numVal !== operand)
84
+ return rule.style;
85
+ break;
86
+ }
87
+ }
88
+ return undefined;
89
+ }
90
+ //# sourceMappingURL=conditional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional.js","sourceRoot":"","sources":["../../src/panels/conditional.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { resolveThresholdColor, resolveSemanticHex } from "./thresholds";
2
+ export type { ThresholdConfig, ThresholdStep } from "./thresholds";
3
+ export { resolveOverrides, simpleGlobMatch } from "./overrides";
4
+ export type { FieldOverride, OverrideMatch, OverrideProperties, ResolvedOverrideProperties, } from "./overrides";
5
+ export { applyMappings } from "./mappings";
6
+ export type { ValueMapping, ValueMappingExact, ValueMappingRange, ValueMappingNull, ValueMappingRegex, MappingResult, } from "./mappings";
7
+ export { evaluateConditional } from "./conditional";
8
+ export type { ConditionalRule, ConditionalStyle } from "./conditional";
9
+ export { buildThresholdBands } from "./threshold-layers";
10
+ export type { ThresholdBand, ChartBounds } from "./threshold-layers";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/panels/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EACV,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,19 @@
1
+ // Copyright 2026 Mataki Labs LLC
2
+ //
3
+ // Licensed under the Business Source License 1.1 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ export { resolveThresholdColor, resolveSemanticHex } from "./thresholds";
15
+ export { resolveOverrides, simpleGlobMatch } from "./overrides";
16
+ export { applyMappings } from "./mappings";
17
+ export { evaluateConditional } from "./conditional";
18
+ export { buildThresholdBands } from "./threshold-layers";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/panels/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGzE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQhE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAU3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface ValueMappingExact {
2
+ type: "value";
3
+ match: number | string | boolean;
4
+ text: string;
5
+ color?: string;
6
+ }
7
+ export interface ValueMappingRange {
8
+ type: "range";
9
+ from: number;
10
+ to: number;
11
+ text: string;
12
+ color?: string;
13
+ }
14
+ export interface ValueMappingNull {
15
+ type: "null";
16
+ text: string;
17
+ color?: string;
18
+ }
19
+ export interface ValueMappingRegex {
20
+ type: "regex";
21
+ pattern: string;
22
+ text: string;
23
+ color?: string;
24
+ }
25
+ export type ValueMapping = ValueMappingExact | ValueMappingRange | ValueMappingNull | ValueMappingRegex;
26
+ export interface MappingResult {
27
+ text: string;
28
+ color?: string;
29
+ }
30
+ /**
31
+ * Apply value mappings to a raw value.
32
+ *
33
+ * Evaluation order follows the spec: value > range > regex > null.
34
+ * Within each type, mappings are evaluated in declaration order.
35
+ * First match wins.
36
+ *
37
+ * Returns { text, color } if a mapping matches, or undefined if none match.
38
+ */
39
+ export declare function applyMappings(value: unknown, mappings: ValueMapping[] | undefined): MappingResult | undefined;
40
+ //# sourceMappingURL=mappings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappings.d.ts","sourceRoot":"","sources":["../../src/panels/mappings.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,EAAE,GAAG,SAAS,GACnC,aAAa,GAAG,SAAS,CAgE3B"}
@@ -0,0 +1,83 @@
1
+ // Copyright 2026 Mataki Labs LLC
2
+ //
3
+ // Licensed under the Business Source License 1.1 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ /**
15
+ * Apply value mappings to a raw value.
16
+ *
17
+ * Evaluation order follows the spec: value > range > regex > null.
18
+ * Within each type, mappings are evaluated in declaration order.
19
+ * First match wins.
20
+ *
21
+ * Returns { text, color } if a mapping matches, or undefined if none match.
22
+ */
23
+ export function applyMappings(value, mappings) {
24
+ if (!mappings || mappings.length === 0)
25
+ return undefined;
26
+ // Group mappings by type for ordered evaluation
27
+ const byType = {
28
+ value: [],
29
+ range: [],
30
+ regex: [],
31
+ null: [],
32
+ };
33
+ for (const m of mappings) {
34
+ if (byType[m.type]) {
35
+ byType[m.type].push(m);
36
+ }
37
+ }
38
+ // 1. Check value (exact match) mappings first
39
+ for (const m of byType.value) {
40
+ const vm = m;
41
+ // Loose comparison for number/string coercion (e.g., "0" == 0)
42
+ if (value === vm.match || String(value) === String(vm.match)) {
43
+ return { text: vm.text, color: vm.color };
44
+ }
45
+ }
46
+ // 2. Check range mappings
47
+ if (value !== null && value !== undefined) {
48
+ const num = Number(value);
49
+ if (!isNaN(num)) {
50
+ for (const m of byType.range) {
51
+ const rm = m;
52
+ if (num >= rm.from && num <= rm.to) {
53
+ return { text: rm.text, color: rm.color };
54
+ }
55
+ }
56
+ }
57
+ }
58
+ // 3. Check regex mappings
59
+ if (value !== null && value !== undefined) {
60
+ const str = String(value);
61
+ for (const m of byType.regex) {
62
+ const rxm = m;
63
+ try {
64
+ const regex = new RegExp(rxm.pattern);
65
+ if (regex.test(str)) {
66
+ return { text: rxm.text, color: rxm.color };
67
+ }
68
+ }
69
+ catch {
70
+ // Invalid regex — skip
71
+ }
72
+ }
73
+ }
74
+ // 4. Check null mappings
75
+ if (value === null || value === undefined) {
76
+ for (const m of byType.null) {
77
+ const nm = m;
78
+ return { text: nm.text, color: nm.color };
79
+ }
80
+ }
81
+ return undefined;
82
+ }
83
+ //# sourceMappingURL=mappings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappings.js","sourceRoot":"","sources":["../../src/panels/mappings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { ThresholdConfig } from "./thresholds";
2
+ export interface OverrideMatch {
3
+ field?: string;
4
+ pattern?: string;
5
+ }
6
+ export interface OverrideProperties {
7
+ format?: string;
8
+ decimals?: number;
9
+ label?: string;
10
+ color?: string;
11
+ min?: number;
12
+ max?: number;
13
+ unit?: string;
14
+ thresholds?: ThresholdConfig;
15
+ }
16
+ export interface FieldOverride {
17
+ match: OverrideMatch;
18
+ properties: OverrideProperties;
19
+ }
20
+ export type ResolvedOverrideProperties = OverrideProperties;
21
+ /**
22
+ * Simple glob matching with `*` wildcards only.
23
+ * No full glob semantics — just `*` matching zero or more characters.
24
+ */
25
+ export declare function simpleGlobMatch(pattern: string, value: string): boolean;
26
+ /**
27
+ * Resolve override properties for a given field name.
28
+ *
29
+ * Matches overrides in order. For each override:
30
+ * - `match.field` matches by exact field name
31
+ * - `match.pattern` matches by simple glob (`*` wildcards)
32
+ *
33
+ * Properties are merged in order — later matches override earlier ones.
34
+ * Returns a merged properties object (all fields optional).
35
+ */
36
+ export declare function resolveOverrides(fieldName: string, overrides: FieldOverride[] | undefined): ResolvedOverrideProperties;
37
+ //# sourceMappingURL=overrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overrides.d.ts","sourceRoot":"","sources":["../../src/panels/overrides.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAGD,MAAM,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAOvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,aAAa,EAAE,GAAG,SAAS,GACrC,0BAA0B,CA0B5B"}
@@ -0,0 +1,57 @@
1
+ // Copyright 2026 Mataki Labs LLC
2
+ //
3
+ // Licensed under the Business Source License 1.1 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ /**
15
+ * Simple glob matching with `*` wildcards only.
16
+ * No full glob semantics — just `*` matching zero or more characters.
17
+ */
18
+ export function simpleGlobMatch(pattern, value) {
19
+ // Convert glob pattern to regex: escape special regex chars, replace * with .*
20
+ const escaped = pattern
21
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
22
+ .replace(/\*/g, ".*");
23
+ const regex = new RegExp(`^${escaped}$`);
24
+ return regex.test(value);
25
+ }
26
+ /**
27
+ * Resolve override properties for a given field name.
28
+ *
29
+ * Matches overrides in order. For each override:
30
+ * - `match.field` matches by exact field name
31
+ * - `match.pattern` matches by simple glob (`*` wildcards)
32
+ *
33
+ * Properties are merged in order — later matches override earlier ones.
34
+ * Returns a merged properties object (all fields optional).
35
+ */
36
+ export function resolveOverrides(fieldName, overrides) {
37
+ if (!overrides || overrides.length === 0) {
38
+ return {};
39
+ }
40
+ const merged = {};
41
+ for (const override of overrides) {
42
+ let matches = false;
43
+ if (override.match.field && override.match.field === fieldName) {
44
+ matches = true;
45
+ }
46
+ else if (override.match.pattern &&
47
+ simpleGlobMatch(override.match.pattern, fieldName)) {
48
+ matches = true;
49
+ }
50
+ if (matches) {
51
+ // Merge properties — later values overwrite earlier ones
52
+ Object.assign(merged, override.properties);
53
+ }
54
+ }
55
+ return merged;
56
+ }
57
+ //# sourceMappingURL=overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/panels/overrides.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AA4BjC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAa;IAC5D,+EAA+E;IAC/E,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,SAAsC;IAEtC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAA+B,EAAE,CAAC;IAE9C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/D,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IACL,QAAQ,CAAC,KAAK,CAAC,OAAO;YACtB,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,EAClD,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,yDAAyD;YACzD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ThresholdConfig } from "./thresholds";
2
+ export interface ThresholdBand {
3
+ y0: number;
4
+ y1: number;
5
+ color: string;
6
+ }
7
+ export interface ChartBounds {
8
+ yMin: number;
9
+ yMax: number;
10
+ }
11
+ /**
12
+ * Build horizontal threshold bands for rendering behind chart data.
13
+ *
14
+ * Each band spans from step[i].value to step[i+1].value (or yMax for the last step).
15
+ * Bands are clamped to the chart's visible y-axis range.
16
+ */
17
+ export declare function buildThresholdBands(thresholds: ThresholdConfig | undefined, bounds: ChartBounds): ThresholdBand[];
18
+ //# sourceMappingURL=threshold-layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threshold-layers.d.ts","sourceRoot":"","sources":["../../src/panels/threshold-layers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,eAAe,GAAG,SAAS,EACvC,MAAM,EAAE,WAAW,GAClB,aAAa,EAAE,CAmBjB"}
@@ -0,0 +1,35 @@
1
+ // Copyright 2026 Mataki Labs LLC
2
+ //
3
+ // Licensed under the Business Source License 1.1 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ /**
15
+ * Build horizontal threshold bands for rendering behind chart data.
16
+ *
17
+ * Each band spans from step[i].value to step[i+1].value (or yMax for the last step).
18
+ * Bands are clamped to the chart's visible y-axis range.
19
+ */
20
+ export function buildThresholdBands(thresholds, bounds) {
21
+ if (!thresholds || !thresholds.steps || thresholds.steps.length === 0) {
22
+ return [];
23
+ }
24
+ const sorted = [...thresholds.steps].sort((a, b) => a.value - b.value);
25
+ const bands = [];
26
+ for (let i = 0; i < sorted.length; i++) {
27
+ const step = sorted[i];
28
+ const nextValue = i < sorted.length - 1 ? sorted[i + 1].value : bounds.yMax;
29
+ const y0 = Math.min(Math.max(step.value, bounds.yMin), bounds.yMax);
30
+ const y1 = Math.min(nextValue, bounds.yMax);
31
+ bands.push({ y0, y1, color: step.color });
32
+ }
33
+ return bands;
34
+ }
35
+ //# sourceMappingURL=threshold-layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threshold-layers.js","sourceRoot":"","sources":["../../src/panels/threshold-layers.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAejC;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAuC,EACvC,MAAmB;IAEnB,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAE5E,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAE5C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Theme } from "../schemas/theme";
2
+ export interface ThresholdStep {
3
+ value: number;
4
+ color: string;
5
+ }
6
+ export interface ThresholdConfig {
7
+ mode: "absolute" | "percentage";
8
+ steps: ThresholdStep[];
9
+ }
10
+ /**
11
+ * Resolve a semantic color name (green, red, yellow, muted) or hex string
12
+ * to a concrete hex color using the current theme.
13
+ *
14
+ * Theme status values are raw hex strings — no extraction needed.
15
+ */
16
+ export declare function resolveSemanticHex(color: string, theme: Theme): string;
17
+ /**
18
+ * Given a numeric value and a ThresholdConfig, return the color name
19
+ * of the matching threshold step.
20
+ *
21
+ * Steps are matched highest-value-first: the step with the highest `value`
22
+ * that is <= the input value wins. Returns the semantic color name (not hex) —
23
+ * callers use `resolveSemanticHex` to convert to a concrete color.
24
+ *
25
+ * **Mode behavior:**
26
+ * - `absolute` — the raw value is compared directly against threshold step values.
27
+ * - `percentage` — the value is assumed to already be a percentage on a 0–100 scale.
28
+ * This function does **not** normalize or scale the value itself. Callers must
29
+ * pre-compute the percentage before passing it in. For example, if the metric
30
+ * maximum is 200 and the current reading is 150, pass `75` (i.e. 150/200*100),
31
+ * not `150`.
32
+ *
33
+ * Returns undefined if thresholds is undefined, steps are empty, or value is non-numeric.
34
+ */
35
+ export declare function resolveThresholdColor(value: unknown, thresholds: ThresholdConfig | undefined): string | undefined;
36
+ //# sourceMappingURL=thresholds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thresholds.d.ts","sourceRoot":"","sources":["../../src/panels/thresholds.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,GAAG,YAAY,CAAC;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAiBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAKtE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,eAAe,GAAG,SAAS,GACtC,MAAM,GAAG,SAAS,CAyBpB"}
@@ -0,0 +1,81 @@
1
+ // Copyright 2026 Mataki Labs LLC
2
+ //
3
+ // Licensed under the Business Source License 1.1 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ /**
15
+ * Color name → theme status key mapping.
16
+ * Semantic names resolve through the theme; hex values pass through.
17
+ */
18
+ const SEMANTIC_COLOR_MAP = {
19
+ green: "positive",
20
+ red: "negative",
21
+ yellow: "warning",
22
+ orange: "warning",
23
+ muted: "neutral",
24
+ gray: "neutral",
25
+ grey: "neutral",
26
+ blue: "neutral",
27
+ };
28
+ /**
29
+ * Resolve a semantic color name (green, red, yellow, muted) or hex string
30
+ * to a concrete hex color using the current theme.
31
+ *
32
+ * Theme status values are raw hex strings — no extraction needed.
33
+ */
34
+ export function resolveSemanticHex(color, theme) {
35
+ if (/^#[0-9a-fA-F]{3,8}$/.test(color))
36
+ return color;
37
+ const statusKey = SEMANTIC_COLOR_MAP[color.toLowerCase()];
38
+ if (statusKey)
39
+ return theme.status[statusKey];
40
+ return "#94a3b8";
41
+ }
42
+ /**
43
+ * Given a numeric value and a ThresholdConfig, return the color name
44
+ * of the matching threshold step.
45
+ *
46
+ * Steps are matched highest-value-first: the step with the highest `value`
47
+ * that is <= the input value wins. Returns the semantic color name (not hex) —
48
+ * callers use `resolveSemanticHex` to convert to a concrete color.
49
+ *
50
+ * **Mode behavior:**
51
+ * - `absolute` — the raw value is compared directly against threshold step values.
52
+ * - `percentage` — the value is assumed to already be a percentage on a 0–100 scale.
53
+ * This function does **not** normalize or scale the value itself. Callers must
54
+ * pre-compute the percentage before passing it in. For example, if the metric
55
+ * maximum is 200 and the current reading is 150, pass `75` (i.e. 150/200*100),
56
+ * not `150`.
57
+ *
58
+ * Returns undefined if thresholds is undefined, steps are empty, or value is non-numeric.
59
+ */
60
+ export function resolveThresholdColor(value, thresholds) {
61
+ if (!thresholds || !thresholds.steps || thresholds.steps.length === 0) {
62
+ return undefined;
63
+ }
64
+ const num = typeof value === "number" ? value : Number(value);
65
+ if (value === null || value === undefined || isNaN(num)) {
66
+ return undefined;
67
+ }
68
+ // For percentage mode, the value is used directly (assumed 0-100 scale)
69
+ const compareValue = num;
70
+ // Sort steps ascending by value
71
+ const sorted = [...thresholds.steps].sort((a, b) => a.value - b.value);
72
+ // Walk from highest to lowest, return first step where value >= step.value
73
+ for (let i = sorted.length - 1; i >= 0; i--) {
74
+ if (compareValue >= sorted[i].value) {
75
+ return sorted[i].color;
76
+ }
77
+ }
78
+ // Value is below all steps — return the lowest step's color
79
+ return sorted[0].color;
80
+ }
81
+ //# sourceMappingURL=thresholds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thresholds.js","sourceRoot":"","sources":["../../src/panels/thresholds.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAcjC;;;GAGG;AACH,MAAM,kBAAkB,GAA0C;IAChE,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAY;IAC5D,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,UAAuC;IAEvC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,wEAAwE;IACxE,MAAM,YAAY,GAAG,GAAG,CAAC;IAEzB,gCAAgC;IAChC,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAEvE,2EAA2E;IAC3E,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,YAAY,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACzB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ export declare const annotationSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodString;
5
+ datasource: z.ZodString;
6
+ query: z.ZodObject<{
7
+ sql: z.ZodString;
8
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
9
+ filter: z.ZodString;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ ctx: z.ZodString;
12
+ }, z.core.$strip>]>>>;
13
+ }, z.core.$strip>;
14
+ color: z.ZodDefault<z.ZodString>;
15
+ enabled: z.ZodDefault<z.ZodBoolean>;
16
+ }, z.core.$strip>;
17
+ export declare const annotationsSchema: z.ZodArray<z.ZodObject<{
18
+ id: z.ZodString;
19
+ name: z.ZodString;
20
+ datasource: z.ZodString;
21
+ query: z.ZodObject<{
22
+ sql: z.ZodString;
23
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
24
+ filter: z.ZodString;
25
+ }, z.core.$strip>, z.ZodObject<{
26
+ ctx: z.ZodString;
27
+ }, z.core.$strip>]>>>;
28
+ }, z.core.$strip>;
29
+ color: z.ZodDefault<z.ZodString>;
30
+ enabled: z.ZodDefault<z.ZodBoolean>;
31
+ }, z.core.$strip>>;
32
+ export type Annotation = z.infer<typeof annotationSchema>;
33
+ export type Annotations = z.infer<typeof annotationsSchema>;
34
+ //# sourceMappingURL=annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/schemas/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;iBAO3B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;kBAA4B,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ const paramBindingSchema = z.union([
3
+ z.object({ filter: z.string() }),
4
+ z.object({ ctx: z.string() }),
5
+ ]);
6
+ const annotationQuerySchema = z.object({
7
+ sql: z.string(),
8
+ params: z.record(z.string(), paramBindingSchema).optional(),
9
+ });
10
+ export const annotationSchema = z.object({
11
+ id: z.string(),
12
+ name: z.string(),
13
+ datasource: z.string(),
14
+ query: annotationQuerySchema,
15
+ color: z.string().default("blue"),
16
+ enabled: z.boolean().default(true),
17
+ });
18
+ export const annotationsSchema = z.array(annotationSchema);
19
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/schemas/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC;IACjC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAChC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;CAC9B,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,QAAQ,EAAE;CAC5D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,KAAK,EAAE,qBAAqB;IAC5B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC"}
@@ -69,6 +69,7 @@ export declare const configSchema: z.ZodObject<{
69
69
  deep_sql_lint: z.ZodDefault<z.ZodBoolean>;
70
70
  required: z.ZodDefault<z.ZodBoolean>;
71
71
  }, z.core.$strict>>;
72
+ health_check_interval: z.ZodDefault<z.ZodString>;
72
73
  }, z.core.$strict>;
73
74
  export type Config = z.infer<typeof configSchema>;
74
75
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/schemas/config.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqHxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAWd,CAAC;AAEZ,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/schemas/config.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqHxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAYd,CAAC;AAEZ,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}