@panoboard/core 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/dist/cache/cache.d.ts +11 -0
  2. package/dist/cache/cache.d.ts.map +1 -0
  3. package/dist/cache/cache.js +42 -0
  4. package/dist/cache/cache.js.map +1 -0
  5. package/dist/cache/client.d.ts +9 -0
  6. package/dist/cache/client.d.ts.map +1 -0
  7. package/dist/cache/client.js +63 -0
  8. package/dist/cache/client.js.map +1 -0
  9. package/dist/cache/index.d.ts +4 -0
  10. package/dist/cache/index.d.ts.map +1 -0
  11. package/dist/cache/index.js +17 -0
  12. package/dist/cache/index.js.map +1 -0
  13. package/dist/cache/keys.d.ts +2 -0
  14. package/dist/cache/keys.d.ts.map +1 -0
  15. package/dist/cache/keys.js +26 -0
  16. package/dist/cache/keys.js.map +1 -0
  17. package/dist/components/DashboardCard.d.ts +15 -0
  18. package/dist/components/DashboardCard.d.ts.map +1 -0
  19. package/dist/components/DashboardCard.js +80 -0
  20. package/dist/components/DashboardCard.js.map +1 -0
  21. package/dist/components/DashboardShell.d.ts +11 -0
  22. package/dist/components/DashboardShell.d.ts.map +1 -0
  23. package/dist/components/DashboardShell.js +115 -0
  24. package/dist/components/DashboardShell.js.map +1 -0
  25. package/dist/components/EmptyState.d.ts +6 -0
  26. package/dist/components/EmptyState.d.ts.map +1 -0
  27. package/dist/components/EmptyState.js +29 -0
  28. package/dist/components/EmptyState.js.map +1 -0
  29. package/dist/components/ErrorPage.d.ts +14 -0
  30. package/dist/components/ErrorPage.d.ts.map +1 -0
  31. package/dist/components/ErrorPage.js +132 -0
  32. package/dist/components/ErrorPage.js.map +1 -0
  33. package/dist/components/FilterBar.d.ts +8 -0
  34. package/dist/components/FilterBar.d.ts.map +1 -0
  35. package/dist/components/FilterBar.js +70 -0
  36. package/dist/components/FilterBar.js.map +1 -0
  37. package/dist/components/PanelGrid.d.ts +9 -0
  38. package/dist/components/PanelGrid.d.ts.map +1 -0
  39. package/dist/components/PanelGrid.js +26 -0
  40. package/dist/components/PanelGrid.js.map +1 -0
  41. package/dist/components/PanelWrapper.d.ts +8 -0
  42. package/dist/components/PanelWrapper.d.ts.map +1 -0
  43. package/dist/components/PanelWrapper.js +154 -0
  44. package/dist/components/PanelWrapper.js.map +1 -0
  45. package/dist/components/filters/BooleanFilter.d.ts +8 -0
  46. package/dist/components/filters/BooleanFilter.d.ts.map +1 -0
  47. package/dist/components/filters/BooleanFilter.js +36 -0
  48. package/dist/components/filters/BooleanFilter.js.map +1 -0
  49. package/dist/components/filters/CalendarGrid.d.ts +8 -0
  50. package/dist/components/filters/CalendarGrid.d.ts.map +1 -0
  51. package/dist/components/filters/CalendarGrid.js +159 -0
  52. package/dist/components/filters/CalendarGrid.js.map +1 -0
  53. package/dist/components/filters/DateRangeFilter.d.ts +10 -0
  54. package/dist/components/filters/DateRangeFilter.d.ts.map +1 -0
  55. package/dist/components/filters/DateRangeFilter.js +80 -0
  56. package/dist/components/filters/DateRangeFilter.js.map +1 -0
  57. package/dist/components/filters/FilterChips.d.ts +8 -0
  58. package/dist/components/filters/FilterChips.d.ts.map +1 -0
  59. package/dist/components/filters/FilterChips.js +94 -0
  60. package/dist/components/filters/FilterChips.js.map +1 -0
  61. package/dist/components/filters/MultiSelectFilter.d.ts +17 -0
  62. package/dist/components/filters/MultiSelectFilter.d.ts.map +1 -0
  63. package/dist/components/filters/MultiSelectFilter.js +80 -0
  64. package/dist/components/filters/MultiSelectFilter.js.map +1 -0
  65. package/dist/components/filters/NumberFilter.d.ts +10 -0
  66. package/dist/components/filters/NumberFilter.d.ts.map +1 -0
  67. package/dist/components/filters/NumberFilter.js +47 -0
  68. package/dist/components/filters/NumberFilter.js.map +1 -0
  69. package/dist/components/filters/SelectFilter.d.ts +16 -0
  70. package/dist/components/filters/SelectFilter.d.ts.map +1 -0
  71. package/dist/components/filters/SelectFilter.js +71 -0
  72. package/dist/components/filters/SelectFilter.js.map +1 -0
  73. package/dist/components/filters/TextFilter.d.ts +8 -0
  74. package/dist/components/filters/TextFilter.d.ts.map +1 -0
  75. package/dist/components/filters/TextFilter.js +57 -0
  76. package/dist/components/filters/TextFilter.js.map +1 -0
  77. package/dist/components/filters/useDropdown.d.ts +7 -0
  78. package/dist/components/filters/useDropdown.d.ts.map +1 -0
  79. package/dist/components/filters/useDropdown.js +41 -0
  80. package/dist/components/filters/useDropdown.js.map +1 -0
  81. package/dist/components/filters/useFilterUpdate.d.ts +2 -0
  82. package/dist/components/filters/useFilterUpdate.d.ts.map +1 -0
  83. package/dist/components/filters/useFilterUpdate.js +30 -0
  84. package/dist/components/filters/useFilterUpdate.js.map +1 -0
  85. package/dist/components/index.d.ts +59 -0
  86. package/dist/components/index.d.ts.map +1 -0
  87. package/dist/components/index.js +75 -0
  88. package/dist/components/index.js.map +1 -0
  89. package/dist/components/panels/AreaChart.d.ts +7 -0
  90. package/dist/components/panels/AreaChart.d.ts.map +1 -0
  91. package/dist/components/panels/AreaChart.js +88 -0
  92. package/dist/components/panels/AreaChart.js.map +1 -0
  93. package/dist/components/panels/BarChart.d.ts +7 -0
  94. package/dist/components/panels/BarChart.d.ts.map +1 -0
  95. package/dist/components/panels/BarChart.js +99 -0
  96. package/dist/components/panels/BarChart.js.map +1 -0
  97. package/dist/components/panels/BoxPlotChart.d.ts +7 -0
  98. package/dist/components/panels/BoxPlotChart.d.ts.map +1 -0
  99. package/dist/components/panels/BoxPlotChart.js +41 -0
  100. package/dist/components/panels/BoxPlotChart.js.map +1 -0
  101. package/dist/components/panels/BulletChart.d.ts +7 -0
  102. package/dist/components/panels/BulletChart.d.ts.map +1 -0
  103. package/dist/components/panels/BulletChart.js +46 -0
  104. package/dist/components/panels/BulletChart.js.map +1 -0
  105. package/dist/components/panels/BumpChart.d.ts +7 -0
  106. package/dist/components/panels/BumpChart.d.ts.map +1 -0
  107. package/dist/components/panels/BumpChart.js +38 -0
  108. package/dist/components/panels/BumpChart.js.map +1 -0
  109. package/dist/components/panels/CalendarHeatmap.d.ts +7 -0
  110. package/dist/components/panels/CalendarHeatmap.d.ts.map +1 -0
  111. package/dist/components/panels/CalendarHeatmap.js +41 -0
  112. package/dist/components/panels/CalendarHeatmap.js.map +1 -0
  113. package/dist/components/panels/ChartTooltip.d.ts +48 -0
  114. package/dist/components/panels/ChartTooltip.d.ts.map +1 -0
  115. package/dist/components/panels/ChartTooltip.js +129 -0
  116. package/dist/components/panels/ChartTooltip.js.map +1 -0
  117. package/dist/components/panels/DonutChart.d.ts +7 -0
  118. package/dist/components/panels/DonutChart.d.ts.map +1 -0
  119. package/dist/components/panels/DonutChart.js +40 -0
  120. package/dist/components/panels/DonutChart.js.map +1 -0
  121. package/dist/components/panels/FunnelChart.d.ts +7 -0
  122. package/dist/components/panels/FunnelChart.d.ts.map +1 -0
  123. package/dist/components/panels/FunnelChart.js +32 -0
  124. package/dist/components/panels/FunnelChart.js.map +1 -0
  125. package/dist/components/panels/HeatmapChart.d.ts +7 -0
  126. package/dist/components/panels/HeatmapChart.d.ts.map +1 -0
  127. package/dist/components/panels/HeatmapChart.js +41 -0
  128. package/dist/components/panels/HeatmapChart.js.map +1 -0
  129. package/dist/components/panels/IframePanel.d.ts +6 -0
  130. package/dist/components/panels/IframePanel.d.ts.map +1 -0
  131. package/dist/components/panels/IframePanel.js +5 -0
  132. package/dist/components/panels/IframePanel.js.map +1 -0
  133. package/dist/components/panels/ImagePanel.d.ts +7 -0
  134. package/dist/components/panels/ImagePanel.d.ts.map +1 -0
  135. package/dist/components/panels/ImagePanel.js +9 -0
  136. package/dist/components/panels/ImagePanel.js.map +1 -0
  137. package/dist/components/panels/LineChart.d.ts +7 -0
  138. package/dist/components/panels/LineChart.d.ts.map +1 -0
  139. package/dist/components/panels/LineChart.js +87 -0
  140. package/dist/components/panels/LineChart.js.map +1 -0
  141. package/dist/components/panels/ListPanel.d.ts +7 -0
  142. package/dist/components/panels/ListPanel.d.ts.map +1 -0
  143. package/dist/components/panels/ListPanel.js +24 -0
  144. package/dist/components/panels/ListPanel.js.map +1 -0
  145. package/dist/components/panels/MarkdownPanel.d.ts +7 -0
  146. package/dist/components/panels/MarkdownPanel.d.ts.map +1 -0
  147. package/dist/components/panels/MarkdownPanel.js +39 -0
  148. package/dist/components/panels/MarkdownPanel.js.map +1 -0
  149. package/dist/components/panels/MetricPanel.d.ts +7 -0
  150. package/dist/components/panels/MetricPanel.d.ts.map +1 -0
  151. package/dist/components/panels/MetricPanel.js +23 -0
  152. package/dist/components/panels/MetricPanel.js.map +1 -0
  153. package/dist/components/panels/PanelEmpty.d.ts +2 -0
  154. package/dist/components/panels/PanelEmpty.d.ts.map +1 -0
  155. package/dist/components/panels/PanelEmpty.js +27 -0
  156. package/dist/components/panels/PanelEmpty.js.map +1 -0
  157. package/dist/components/panels/PanelError.d.ts +7 -0
  158. package/dist/components/panels/PanelError.d.ts.map +1 -0
  159. package/dist/components/panels/PanelError.js +21 -0
  160. package/dist/components/panels/PanelError.js.map +1 -0
  161. package/dist/components/panels/PanelSkeleton.d.ts +6 -0
  162. package/dist/components/panels/PanelSkeleton.d.ts.map +1 -0
  163. package/dist/components/panels/PanelSkeleton.js +24 -0
  164. package/dist/components/panels/PanelSkeleton.js.map +1 -0
  165. package/dist/components/panels/PieChart.d.ts +7 -0
  166. package/dist/components/panels/PieChart.d.ts.map +1 -0
  167. package/dist/components/panels/PieChart.js +40 -0
  168. package/dist/components/panels/PieChart.js.map +1 -0
  169. package/dist/components/panels/RadarChart.d.ts +7 -0
  170. package/dist/components/panels/RadarChart.d.ts.map +1 -0
  171. package/dist/components/panels/RadarChart.js +50 -0
  172. package/dist/components/panels/RadarChart.js.map +1 -0
  173. package/dist/components/panels/RadialBarChart.d.ts +7 -0
  174. package/dist/components/panels/RadialBarChart.d.ts.map +1 -0
  175. package/dist/components/panels/RadialBarChart.js +49 -0
  176. package/dist/components/panels/RadialBarChart.js.map +1 -0
  177. package/dist/components/panels/SankeyChart.d.ts +7 -0
  178. package/dist/components/panels/SankeyChart.d.ts.map +1 -0
  179. package/dist/components/panels/SankeyChart.js +39 -0
  180. package/dist/components/panels/SankeyChart.js.map +1 -0
  181. package/dist/components/panels/ScatterChart.d.ts +7 -0
  182. package/dist/components/panels/ScatterChart.d.ts.map +1 -0
  183. package/dist/components/panels/ScatterChart.js +54 -0
  184. package/dist/components/panels/ScatterChart.js.map +1 -0
  185. package/dist/components/panels/StatPanel.d.ts +8 -0
  186. package/dist/components/panels/StatPanel.d.ts.map +1 -0
  187. package/dist/components/panels/StatPanel.js +40 -0
  188. package/dist/components/panels/StatPanel.js.map +1 -0
  189. package/dist/components/panels/StreamChart.d.ts +7 -0
  190. package/dist/components/panels/StreamChart.d.ts.map +1 -0
  191. package/dist/components/panels/StreamChart.js +54 -0
  192. package/dist/components/panels/StreamChart.js.map +1 -0
  193. package/dist/components/panels/SunburstChart.d.ts +7 -0
  194. package/dist/components/panels/SunburstChart.d.ts.map +1 -0
  195. package/dist/components/panels/SunburstChart.js +60 -0
  196. package/dist/components/panels/SunburstChart.js.map +1 -0
  197. package/dist/components/panels/TablePanel.d.ts +7 -0
  198. package/dist/components/panels/TablePanel.d.ts.map +1 -0
  199. package/dist/components/panels/TablePanel.js +79 -0
  200. package/dist/components/panels/TablePanel.js.map +1 -0
  201. package/dist/components/panels/TreemapChart.d.ts +7 -0
  202. package/dist/components/panels/TreemapChart.d.ts.map +1 -0
  203. package/dist/components/panels/TreemapChart.js +59 -0
  204. package/dist/components/panels/TreemapChart.js.map +1 -0
  205. package/dist/components/panels/VideoPanel.d.ts +15 -0
  206. package/dist/components/panels/VideoPanel.d.ts.map +1 -0
  207. package/dist/components/panels/VideoPanel.js +25 -0
  208. package/dist/components/panels/VideoPanel.js.map +1 -0
  209. package/dist/components/panels/WaffleChart.d.ts +7 -0
  210. package/dist/components/panels/WaffleChart.d.ts.map +1 -0
  211. package/dist/components/panels/WaffleChart.js +46 -0
  212. package/dist/components/panels/WaffleChart.js.map +1 -0
  213. package/dist/components/panels/index.d.ts +3 -0
  214. package/dist/components/panels/index.d.ts.map +1 -0
  215. package/dist/components/panels/index.js +60 -0
  216. package/dist/components/panels/index.js.map +1 -0
  217. package/dist/components/panels/nivo-theme.d.ts +95 -0
  218. package/dist/components/panels/nivo-theme.d.ts.map +1 -0
  219. package/dist/components/panels/nivo-theme.js +140 -0
  220. package/dist/components/panels/nivo-theme.js.map +1 -0
  221. package/dist/components/panels/semantic-colors.d.ts +7 -0
  222. package/dist/components/panels/semantic-colors.d.ts.map +1 -0
  223. package/dist/components/panels/semantic-colors.js +100 -0
  224. package/dist/components/panels/semantic-colors.js.map +1 -0
  225. package/dist/components/ui/Button.d.ts +9 -0
  226. package/dist/components/ui/Button.d.ts.map +1 -0
  227. package/dist/components/ui/Button.js +40 -0
  228. package/dist/components/ui/Button.js.map +1 -0
  229. package/dist/components/ui/Tabs.d.ts +11 -0
  230. package/dist/components/ui/Tabs.d.ts.map +1 -0
  231. package/dist/components/ui/Tabs.js +28 -0
  232. package/dist/components/ui/Tabs.js.map +1 -0
  233. package/dist/connectors/bigquery.d.ts +26 -0
  234. package/dist/connectors/bigquery.d.ts.map +1 -0
  235. package/dist/connectors/bigquery.js +113 -0
  236. package/dist/connectors/bigquery.js.map +1 -0
  237. package/dist/connectors/index.d.ts +17 -0
  238. package/dist/connectors/index.d.ts.map +1 -0
  239. package/dist/connectors/index.js +23 -0
  240. package/dist/connectors/index.js.map +1 -0
  241. package/dist/connectors/params.d.ts +15 -0
  242. package/dist/connectors/params.d.ts.map +1 -0
  243. package/dist/connectors/params.js +46 -0
  244. package/dist/connectors/params.js.map +1 -0
  245. package/dist/connectors/postgres.d.ts +29 -0
  246. package/dist/connectors/postgres.d.ts.map +1 -0
  247. package/dist/connectors/postgres.js +130 -0
  248. package/dist/connectors/postgres.js.map +1 -0
  249. package/dist/connectors/redshift-data.d.ts +25 -0
  250. package/dist/connectors/redshift-data.d.ts.map +1 -0
  251. package/dist/connectors/redshift-data.js +237 -0
  252. package/dist/connectors/redshift-data.js.map +1 -0
  253. package/dist/connectors/redshift.d.ts +29 -0
  254. package/dist/connectors/redshift.d.ts.map +1 -0
  255. package/dist/connectors/redshift.js +138 -0
  256. package/dist/connectors/redshift.js.map +1 -0
  257. package/dist/connectors/registry.d.ts +7 -0
  258. package/dist/connectors/registry.d.ts.map +1 -0
  259. package/dist/connectors/registry.js +30 -0
  260. package/dist/connectors/registry.js.map +1 -0
  261. package/dist/connectors/snowflake.d.ts +37 -0
  262. package/dist/connectors/snowflake.d.ts.map +1 -0
  263. package/dist/connectors/snowflake.js +181 -0
  264. package/dist/connectors/snowflake.js.map +1 -0
  265. package/dist/connectors/types.d.ts +41 -0
  266. package/dist/connectors/types.d.ts.map +1 -0
  267. package/dist/connectors/types.js +15 -0
  268. package/dist/connectors/types.js.map +1 -0
  269. package/dist/connectors/url-parsers.d.ts +13 -0
  270. package/dist/connectors/url-parsers.d.ts.map +1 -0
  271. package/dist/connectors/url-parsers.js +95 -0
  272. package/dist/connectors/url-parsers.js.map +1 -0
  273. package/dist/connectors/url.d.ts +36 -0
  274. package/dist/connectors/url.d.ts.map +1 -0
  275. package/dist/connectors/url.js +139 -0
  276. package/dist/connectors/url.js.map +1 -0
  277. package/dist/filters/cascade.d.ts +13 -0
  278. package/dist/filters/cascade.d.ts.map +1 -0
  279. package/dist/filters/cascade.js +32 -0
  280. package/dist/filters/cascade.js.map +1 -0
  281. package/dist/filters/daterange.d.ts +8 -0
  282. package/dist/filters/daterange.d.ts.map +1 -0
  283. package/dist/filters/daterange.js +119 -0
  284. package/dist/filters/daterange.js.map +1 -0
  285. package/dist/filters/index.d.ts +7 -0
  286. package/dist/filters/index.d.ts.map +1 -0
  287. package/dist/filters/index.js +18 -0
  288. package/dist/filters/index.js.map +1 -0
  289. package/dist/filters/resolver.d.ts +3 -0
  290. package/dist/filters/resolver.d.ts.map +1 -0
  291. package/dist/filters/resolver.js +122 -0
  292. package/dist/filters/resolver.js.map +1 -0
  293. package/dist/filters/validation.d.ts +17 -0
  294. package/dist/filters/validation.d.ts.map +1 -0
  295. package/dist/filters/validation.js +84 -0
  296. package/dist/filters/validation.js.map +1 -0
  297. package/dist/formats.d.ts +4 -0
  298. package/dist/formats.d.ts.map +1 -0
  299. package/dist/formats.js +127 -0
  300. package/dist/formats.js.map +1 -0
  301. package/dist/index.d.ts +13 -0
  302. package/dist/index.d.ts.map +1 -0
  303. package/dist/index.js +37 -0
  304. package/dist/index.js.map +1 -0
  305. package/dist/interfaces/auth-provider.d.ts +22 -0
  306. package/dist/interfaces/auth-provider.d.ts.map +1 -0
  307. package/dist/interfaces/auth-provider.js +15 -0
  308. package/dist/interfaces/auth-provider.js.map +1 -0
  309. package/dist/interfaces/dashboard-store.d.ts +17 -0
  310. package/dist/interfaces/dashboard-store.d.ts.map +1 -0
  311. package/dist/interfaces/dashboard-store.js +15 -0
  312. package/dist/interfaces/dashboard-store.js.map +1 -0
  313. package/dist/interfaces/datasource-store.d.ts +6 -0
  314. package/dist/interfaces/datasource-store.d.ts.map +1 -0
  315. package/dist/interfaces/datasource-store.js +15 -0
  316. package/dist/interfaces/datasource-store.js.map +1 -0
  317. package/dist/interfaces/index.d.ts +4 -0
  318. package/dist/interfaces/index.d.ts.map +1 -0
  319. package/dist/interfaces/index.js +15 -0
  320. package/dist/interfaces/index.js.map +1 -0
  321. package/dist/locale/context.d.ts +6 -0
  322. package/dist/locale/context.d.ts.map +1 -0
  323. package/dist/locale/context.js +23 -0
  324. package/dist/locale/context.js.map +1 -0
  325. package/dist/locale/index.d.ts +2 -0
  326. package/dist/locale/index.d.ts.map +1 -0
  327. package/dist/locale/index.js +15 -0
  328. package/dist/locale/index.js.map +1 -0
  329. package/dist/query/array-expansion.d.ts +5 -0
  330. package/dist/query/array-expansion.d.ts.map +1 -0
  331. package/dist/query/array-expansion.js +39 -0
  332. package/dist/query/array-expansion.js.map +1 -0
  333. package/dist/query/index.d.ts +8 -0
  334. package/dist/query/index.d.ts.map +1 -0
  335. package/dist/query/index.js +20 -0
  336. package/dist/query/index.js.map +1 -0
  337. package/dist/query/pipeline.d.ts +27 -0
  338. package/dist/query/pipeline.d.ts.map +1 -0
  339. package/dist/query/pipeline.js +49 -0
  340. package/dist/query/pipeline.js.map +1 -0
  341. package/dist/query/strategy/http.d.ts +7 -0
  342. package/dist/query/strategy/http.d.ts.map +1 -0
  343. package/dist/query/strategy/http.js +26 -0
  344. package/dist/query/strategy/http.js.map +1 -0
  345. package/dist/query/strategy/index.d.ts +4 -0
  346. package/dist/query/strategy/index.d.ts.map +1 -0
  347. package/dist/query/strategy/index.js +32 -0
  348. package/dist/query/strategy/index.js.map +1 -0
  349. package/dist/query/strategy/sql.d.ts +7 -0
  350. package/dist/query/strategy/sql.d.ts.map +1 -0
  351. package/dist/query/strategy/sql.js +40 -0
  352. package/dist/query/strategy/sql.js.map +1 -0
  353. package/dist/query/strategy/types.d.ts +6 -0
  354. package/dist/query/strategy/types.d.ts.map +1 -0
  355. package/dist/query/strategy/types.js +15 -0
  356. package/dist/query/strategy/types.js.map +1 -0
  357. package/dist/query/template.d.ts +7 -0
  358. package/dist/query/template.d.ts.map +1 -0
  359. package/dist/query/template.js +36 -0
  360. package/dist/query/template.js.map +1 -0
  361. package/dist/schemas/config.d.ts +74 -0
  362. package/dist/schemas/config.d.ts.map +1 -0
  363. package/dist/schemas/config.js +129 -0
  364. package/dist/schemas/config.js.map +1 -0
  365. package/dist/schemas/dashboard.d.ts +716 -0
  366. package/dist/schemas/dashboard.d.ts.map +1 -0
  367. package/dist/schemas/dashboard.js +314 -0
  368. package/dist/schemas/dashboard.js.map +1 -0
  369. package/dist/schemas/datasource.d.ts +252 -0
  370. package/dist/schemas/datasource.d.ts.map +1 -0
  371. package/dist/schemas/datasource.js +186 -0
  372. package/dist/schemas/datasource.js.map +1 -0
  373. package/dist/schemas/index.d.ts +5 -0
  374. package/dist/schemas/index.d.ts.map +1 -0
  375. package/dist/schemas/index.js +18 -0
  376. package/dist/schemas/index.js.map +1 -0
  377. package/dist/schemas/theme.d.ts +36 -0
  378. package/dist/schemas/theme.d.ts.map +1 -0
  379. package/dist/schemas/theme.js +48 -0
  380. package/dist/schemas/theme.js.map +1 -0
  381. package/dist/startup/index.d.ts +3 -0
  382. package/dist/startup/index.d.ts.map +1 -0
  383. package/dist/startup/index.js +15 -0
  384. package/dist/startup/index.js.map +1 -0
  385. package/dist/startup/sql-lint.d.ts +13 -0
  386. package/dist/startup/sql-lint.d.ts.map +1 -0
  387. package/dist/startup/sql-lint.js +86 -0
  388. package/dist/startup/sql-lint.js.map +1 -0
  389. package/dist/theme/builtin.d.ts +5 -0
  390. package/dist/theme/builtin.d.ts.map +1 -0
  391. package/dist/theme/builtin.js +102 -0
  392. package/dist/theme/builtin.js.map +1 -0
  393. package/dist/theme/context.d.ts +7 -0
  394. package/dist/theme/context.d.ts.map +1 -0
  395. package/dist/theme/context.js +26 -0
  396. package/dist/theme/context.js.map +1 -0
  397. package/dist/theme/index.d.ts +3 -0
  398. package/dist/theme/index.d.ts.map +1 -0
  399. package/dist/theme/index.js +16 -0
  400. package/dist/theme/index.js.map +1 -0
  401. package/dist/theme/loader-export.d.ts +2 -0
  402. package/dist/theme/loader-export.d.ts.map +1 -0
  403. package/dist/theme/loader-export.js +15 -0
  404. package/dist/theme/loader-export.js.map +1 -0
  405. package/dist/theme/loader.d.ts +11 -0
  406. package/dist/theme/loader.d.ts.map +1 -0
  407. package/dist/theme/loader.js +60 -0
  408. package/dist/theme/loader.js.map +1 -0
  409. package/package.json +148 -0
@@ -0,0 +1,132 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Copyright 2026 Mataki Labs LLC
3
+ //
4
+ // Licensed under the Business Source License 1.1 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ import { useEffect, useState } from "react";
16
+ import { useTheme } from "../theme/context";
17
+ function useThemeSafe() {
18
+ try {
19
+ return useTheme();
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ export function ErrorPage({ code, title, description, icon = "not-found", primaryLabel = "Dashboards", primaryHref = "/dashboards", secondaryLabel = "Home", secondaryHref = "/", header, footer, }) {
26
+ const theme = useThemeSafe();
27
+ const [path, setPath] = useState("");
28
+ const timestamp = new Date().toLocaleTimeString("en-US", {
29
+ hour12: false,
30
+ hour: "2-digit",
31
+ minute: "2-digit",
32
+ second: "2-digit",
33
+ });
34
+ useEffect(() => {
35
+ document.title = `${code} — ${title} | Panoboard`;
36
+ setPath(window.location.pathname);
37
+ }, []);
38
+ const is404 = code === 404;
39
+ const pageBg = theme?.surfaces.page ?? "";
40
+ return (_jsxs("div", { className: `ep-root ${pageBg}`, children: [_jsx("style", { children: STYLES }), header, _jsxs("div", { className: "ep-page", children: [_jsx("div", { className: "ep-grid", "aria-hidden": "true" }), _jsx("div", { className: "ep-ghost ep-ghost-1", "aria-hidden": "true", children: _jsxs("div", { className: "ep-ghost-card", children: [_jsxs("div", { className: "ep-ghost-header", children: [_jsx("div", { className: "ep-ghost-dot" }), _jsx("div", { className: "ep-ghost-line w-40" })] }), _jsxs("div", { className: "ep-ghost-chart", children: [_jsx("div", { className: "ep-bar", style: { height: "60%" } }), _jsx("div", { className: "ep-bar", style: { height: "40%" } }), _jsx("div", { className: "ep-bar", style: { height: "80%" } }), _jsx("div", { className: "ep-bar", style: { height: "55%" } }), _jsx("div", { className: "ep-bar", style: { height: "70%" } })] })] }) }), _jsx("div", { className: "ep-ghost ep-ghost-2", "aria-hidden": "true", children: _jsxs("div", { className: "ep-ghost-card", children: [_jsxs("div", { className: "ep-ghost-header", children: [_jsx("div", { className: "ep-ghost-dot" }), _jsx("div", { className: "ep-ghost-line w-50" })] }), _jsxs("div", { className: "ep-ghost-chart", children: [_jsx("div", { className: "ep-bar", style: { height: "45%" } }), _jsx("div", { className: "ep-bar", style: { height: "75%" } }), _jsx("div", { className: "ep-bar", style: { height: "35%" } }), _jsx("div", { className: "ep-bar", style: { height: "90%" } }), _jsx("div", { className: "ep-bar", style: { height: "50%" } })] })] }) }), _jsx("div", { className: "ep-ghost ep-ghost-3", "aria-hidden": "true", children: _jsxs("div", { className: "ep-ghost-card", children: [_jsxs("div", { className: "ep-ghost-header", children: [_jsx("div", { className: "ep-ghost-dot" }), _jsx("div", { className: "ep-ghost-line w-60" })] }), _jsxs("div", { className: "ep-ghost-stat", children: [_jsx("div", { className: "ep-ghost-line w-30", style: { height: 24 } }), _jsx("div", { className: "ep-ghost-line w-50", style: { height: 8 } })] })] }) }), _jsxs("div", { className: "ep-rings", "aria-hidden": "true", children: [_jsx("div", { className: "ep-ring ep-ring-1" }), _jsx("div", { className: "ep-ring ep-ring-2" }), _jsx("div", { className: "ep-ring ep-ring-3" })] }), _jsxs("main", { className: "ep-content", children: [_jsxs("div", { className: "ep-code", children: [_jsx("span", { className: "ep-digit", children: String(code)[0] }), _jsx("span", { className: "ep-icon-wrap", children: _jsx("svg", { className: "ep-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: icon === "lock" ? (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }), _jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })] })) : is404 ? (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "12", y1: "8", x2: "12", y2: "12" }), _jsx("line", { x1: "12", y1: "12", x2: "15", y2: "15" }), _jsx("line", { x1: "2", y1: "12", x2: "4", y2: "12" }), _jsx("line", { x1: "20", y1: "12", x2: "22", y2: "12" }), _jsx("line", { x1: "12", y1: "2", x2: "12", y2: "4" })] })) : (_jsx("polygon", { points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2" })) }) }), _jsx("span", { className: "ep-digit", children: String(code)[2] })] }), _jsx("h1", { className: "ep-headline", children: title }), _jsx("p", { className: "ep-subtext", children: description }), _jsxs("div", { className: "ep-actions", children: [_jsxs("a", { href: primaryHref, className: "ep-btn-primary", children: [_jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "3", width: "7", height: "7" }), _jsx("rect", { x: "14", y: "3", width: "7", height: "7" }), _jsx("rect", { x: "3", y: "14", width: "7", height: "7" }), _jsx("rect", { x: "14", y: "14", width: "7", height: "7" })] }), primaryLabel] }), _jsxs("a", { href: secondaryHref, className: "ep-btn-secondary", children: [secondaryLabel, _jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }), _jsx("polyline", { points: "12 5 19 12 12 19" })] })] })] }), _jsxs("div", { className: "ep-terminal", children: [_jsxs("div", { className: "ep-terminal-header", children: [_jsxs("div", { className: "ep-terminal-dots", children: [_jsx("span", { className: "ep-dot ep-dot-red" }), _jsx("span", { className: "ep-dot ep-dot-yellow" }), _jsx("span", { className: "ep-dot ep-dot-green" })] }), _jsx("span", { className: "ep-terminal-title", children: "panoboard logs" })] }), _jsxs("div", { className: "ep-terminal-body", children: [_jsx("span", { className: "ep-log-time", children: timestamp }), " ", _jsx("span", { className: "ep-log-warn", children: "WARN" }), " ", is404 ? "Route not found" : icon === "lock" ? "Access denied" : "Unhandled exception", _jsx("br", {}), _jsx("span", { className: "ep-log-time", children: timestamp }), " ", _jsx("span", { className: "ep-log-info", children: "INFO" }), " Path:", " ", _jsx("span", { className: "ep-log-path", children: path || "/" }), _jsx("br", {}), _jsx("span", { className: "ep-log-time", children: timestamp }), " ", _jsx("span", { className: "ep-log-info", children: "INFO" }), " Try", " ", _jsx("a", { href: "/dashboards", className: "ep-log-link", children: "/dashboards" }), _jsx("br", {}), _jsx("span", { className: "ep-log-time", children: timestamp }), " ", _jsx("span", { className: "ep-log-ok", children: "OK" }), " ", _jsx("span", { className: "ep-cursor", children: "_" })] })] })] })] }), footer] }));
41
+ }
42
+ const STYLES = `
43
+ .ep-root { display: flex; flex-direction: column; min-height: 100vh; }
44
+ .ep-page {
45
+ position: relative; display: flex; align-items: center; justify-content: center;
46
+ flex: 1; overflow: hidden; background: var(--ep-bg, #020617);
47
+ font-family: "Inter", system-ui, -apple-system, sans-serif;
48
+ -webkit-font-smoothing: antialiased;
49
+ }
50
+
51
+ .ep-grid {
52
+ position: absolute; inset: -60px;
53
+ background-image:
54
+ linear-gradient(var(--ep-grid-line, #1e293b) 1px, transparent 1px),
55
+ linear-gradient(90deg, var(--ep-grid-line, #1e293b) 1px, transparent 1px);
56
+ background-size: 60px 60px; opacity: 0.5;
57
+ mask-image: radial-gradient(ellipse 60% 50% at 50% 50%, black 20%, transparent 70%);
58
+ -webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 50%, black 20%, transparent 70%);
59
+ animation: ep-grid-drift 20s linear infinite;
60
+ }
61
+ @keyframes ep-grid-drift { from { transform: translate(0,0); } to { transform: translate(60px,60px); } }
62
+
63
+ .ep-rings { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-58%); pointer-events: none; }
64
+ .ep-ring {
65
+ position: absolute; border-radius: 50%; border: 2px solid var(--ep-accent, #6366f1);
66
+ top: 50%; left: 50%; transform: translate(-50%,-50%); opacity: 0;
67
+ animation: ep-pulse 4s ease-out infinite;
68
+ }
69
+ .ep-ring-1 { width: 200px; height: 200px; animation-delay: 0s; }
70
+ .ep-ring-2 { width: 340px; height: 340px; animation-delay: 1.3s; }
71
+ .ep-ring-3 { width: 480px; height: 480px; animation-delay: 2.6s; }
72
+ @keyframes ep-pulse { 0% { opacity: .5; transform: translate(-50%,-50%) scale(.8); } 100% { opacity: 0; transform: translate(-50%,-50%) scale(1.3); } }
73
+
74
+ .ep-ghost { position: absolute; pointer-events: none; animation: ep-float 12s ease-in-out infinite; }
75
+ .ep-ghost-1 { top: 12%; left: 6%; animation-delay: 0s; opacity: .15; }
76
+ .ep-ghost-2 { top: 60%; right: 5%; animation-delay: 4s; opacity: .12; }
77
+ .ep-ghost-3 { top: 25%; right: 12%; animation-delay: 8s; opacity: .10; }
78
+ .ep-ghost-card { padding: 14px 18px; border-radius: 12px; border: 1px solid rgba(148,163,184,.12); background: rgba(15,23,42,.8); width: 180px; }
79
+ .ep-ghost-header { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
80
+ .ep-ghost-dot { width: 8px; height: 8px; border-radius: 50%; background: rgba(99,102,241,.4); flex-shrink: 0; }
81
+ .ep-ghost-line { height: 6px; border-radius: 3px; background: rgba(148,163,184,.12); }
82
+ .ep-ghost-chart { display: flex; align-items: flex-end; gap: 6px; height: 48px; }
83
+ .ep-bar { flex: 1; border-radius: 3px 3px 0 0; background: rgba(99,102,241,.15); }
84
+ .ep-ghost-stat { display: flex; flex-direction: column; gap: 8px; }
85
+ .w-30 { width: 30%; } .w-40 { width: 40%; } .w-50 { width: 50%; } .w-60 { width: 60%; }
86
+ @keyframes ep-float {
87
+ 0%,100% { transform: translateY(0) rotate(-1deg); opacity: inherit; }
88
+ 25% { transform: translateY(-20px) rotate(1deg); }
89
+ 50% { transform: translateY(-8px) rotate(-.5deg); opacity: .06; }
90
+ 75% { transform: translateY(-25px) rotate(.5deg); }
91
+ }
92
+
93
+ .ep-content {
94
+ position: relative; z-index: 10; display: flex; flex-direction: column; align-items: center;
95
+ text-align: center; padding: 2rem; max-width: 600px; animation: ep-fade-up .8s ease-out both;
96
+ }
97
+ @keyframes ep-fade-up { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
98
+
99
+ .ep-code { display: flex; align-items: center; gap: .1em; margin-bottom: 1.5rem; line-height: 1; }
100
+ .ep-digit { font-size: clamp(5rem,15vw,10rem); font-weight: 900; letter-spacing: -.04em; color: rgba(226,232,240,.08); }
101
+ .ep-icon-wrap { display: flex; align-items: center; justify-content: center; width: clamp(4rem,12vw,7.5rem); height: clamp(4rem,12vw,7.5rem); }
102
+ .ep-icon { width: clamp(3rem,9vw,5.5rem); height: clamp(3rem,9vw,5.5rem); color: #6366f1; animation: ep-icon-pulse 3s ease-in-out infinite; }
103
+ @keyframes ep-icon-pulse { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.08); opacity: .7; } }
104
+
105
+ .ep-headline { font-size: clamp(1.75rem,5vw,2.5rem); font-weight: 800; color: #e2e8f0; letter-spacing: -.03em; margin-bottom: .75rem; }
106
+ .ep-subtext { font-size: 1.05rem; line-height: 1.7; color: #64748b; margin-bottom: 2.5rem; }
107
+
108
+ .ep-actions { display: flex; gap: 1rem; margin-bottom: 3rem; flex-wrap: wrap; justify-content: center; }
109
+ .ep-btn-primary, .ep-btn-secondary { display: inline-flex; align-items: center; gap: .5rem; padding: .85rem 1.75rem; border-radius: .75rem; font-weight: 700; font-size: .95rem; text-decoration: none; transition: all .2s; }
110
+ .ep-btn-primary { background: #6366f1; color: #fff; box-shadow: 0 4px 24px rgba(99,102,241,.25); }
111
+ .ep-btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 32px rgba(99,102,241,.35); }
112
+ .ep-btn-secondary { background: rgba(15,23,42,.8); color: #e2e8f0; border: 1px solid rgba(148,163,184,.15); }
113
+ .ep-btn-secondary:hover { border-color: #6366f1; color: #6366f1; }
114
+
115
+ .ep-terminal { width: 100%; max-width: 480px; border-radius: .75rem; overflow: hidden; border: 1px solid rgba(148,163,184,.12); text-align: left; animation: ep-fade-up .8s ease-out .3s both; }
116
+ .ep-terminal-header { display: flex; align-items: center; gap: 10px; padding: 10px 16px; background: rgba(15,23,42,.8); border-bottom: 1px solid rgba(148,163,184,.12); }
117
+ .ep-terminal-dots { display: flex; gap: 6px; }
118
+ .ep-dot { width: 10px; height: 10px; border-radius: 50%; }
119
+ .ep-dot-red { background: #ef4444; opacity: .7; }
120
+ .ep-dot-yellow { background: #eab308; opacity: .7; }
121
+ .ep-dot-green { background: #22c55e; opacity: .7; }
122
+ .ep-terminal-title { font-family: "JetBrains Mono", monospace; font-size: .7rem; color: #64748b; letter-spacing: .02em; }
123
+ .ep-terminal-body { padding: 16px 20px; font-family: "JetBrains Mono", monospace; font-size: .78rem; line-height: 2; background: rgba(10,15,30,.9); color: #94a3b8; }
124
+ .ep-log-time { color: #475569; } .ep-log-warn { color: #f59e0b; font-weight: 700; }
125
+ .ep-log-info { color: #6366f1; font-weight: 700; } .ep-log-ok { color: #22c55e; font-weight: 700; }
126
+ .ep-log-path { color: #e2e8f0; } .ep-log-link { color: #6366f1; text-decoration: underline; text-underline-offset: 2px; }
127
+ .ep-cursor { animation: ep-blink 1s step-end infinite; color: #6366f1; }
128
+ @keyframes ep-blink { 0%,100% { opacity: 1; } 50% { opacity: 0; } }
129
+
130
+ @media (max-width: 640px) { .ep-ghost { display: none; } .ep-ring-3 { display: none; } .ep-terminal { max-width: 100%; } }
131
+ `;
132
+ //# sourceMappingURL=ErrorPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorPage.js","sourceRoot":"","sources":["../../src/components/ErrorPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Filter } from "../schemas/dashboard";
2
+ interface FilterBarProps {
3
+ filters: Filter[];
4
+ filterState: Record<string, unknown>;
5
+ }
6
+ export declare function FilterBar({ filters, filterState }: FilterBarProps): import("react/jsx-runtime").JSX.Element | null;
7
+ export {};
8
+ //# sourceMappingURL=FilterBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBar.d.ts","sourceRoot":"","sources":["../../src/components/FilterBar.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAQnD,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,cAAc,kDA4IjE"}
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright 2026 Mataki Labs LLC
3
+ //
4
+ // Licensed under the Business Source License 1.1 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ import { useState } from "react";
16
+ import { useSearchParams, useParams } from "react-router";
17
+ import { SlidersHorizontal } from "lucide-react";
18
+ import { useTheme } from "../theme/context";
19
+ import { DateRangeFilter } from "./filters/DateRangeFilter";
20
+ import { SelectFilter } from "./filters/SelectFilter";
21
+ import { TextFilter } from "./filters/TextFilter";
22
+ import { NumberFilter } from "./filters/NumberFilter";
23
+ import { BooleanFilter } from "./filters/BooleanFilter";
24
+ import { MultiSelectFilter } from "./filters/MultiSelectFilter";
25
+ export function FilterBar({ filters, filterState }) {
26
+ const [mobileExpanded, setMobileExpanded] = useState(false);
27
+ const [searchParams] = useSearchParams();
28
+ const params = useParams();
29
+ const slug = params.slug ?? "";
30
+ const theme = useTheme();
31
+ // Filter out hidden filters
32
+ const visibleFilters = filters.filter((f) => !("hidden" in f && f.hidden));
33
+ if (visibleFilters.length === 0)
34
+ return null;
35
+ // Count active filters (those with non-empty values in filterState)
36
+ const activeCount = Object.values(filterState).filter((v) => v !== undefined && v !== null && v !== "").length;
37
+ return (_jsxs("div", { "data-filter-bar": true, children: [_jsxs("button", { type: "button", className: `md:hidden flex items-center gap-2 text-sm ${theme.typography.muted} ${theme.filters.background} rounded-lg px-3 py-2`, onClick: () => setMobileExpanded(!mobileExpanded), children: [_jsx(SlidersHorizontal, { className: "w-4 h-4" }), "Filters", activeCount > 0 ? ` (${activeCount})` : ""] }), _jsx("div", { className: `${mobileExpanded ? "flex" : "hidden md:flex"} flex-nowrap overflow-x-auto md:flex-wrap md:overflow-x-visible gap-3`, children: visibleFilters.map((filter) => {
38
+ const label = filter.label ?? filter.id;
39
+ switch (filter.type) {
40
+ case "daterange":
41
+ return (_jsx(DateRangeFilter, { id: filter.id, label: label, defaultValue: filter.default, presets: filter
42
+ .presets, allowCustom: filter
43
+ .allow_custom }, filter.id));
44
+ case "select":
45
+ return (_jsx(SelectFilter, { id: filter.id, label: label, defaultValue: filter.default, includeAll: filter.include_all, options: filter.options, optionsQuery: !!filter.options_query }, filter.id));
46
+ case "text":
47
+ return (_jsx(TextFilter, { id: filter.id, label: label, placeholder: filter.placeholder }, filter.id));
48
+ case "integer":
49
+ return (_jsx(NumberFilter, { id: filter.id, label: label, min: filter.minimum, max: filter.maximum, defaultValue: filter.default }, filter.id));
50
+ case "number":
51
+ return (_jsx(NumberFilter, { id: filter.id, label: label, min: filter.minimum, max: filter.maximum, defaultValue: filter.default }, filter.id));
52
+ case "boolean":
53
+ return (_jsx(BooleanFilter, { id: filter.id, label: label, defaultValue: filter.default }, filter.id));
54
+ case "array": {
55
+ // Parse current comma-separated URL value into array
56
+ const rawVal = searchParams.get(filter.id) ?? "";
57
+ const currentValues = rawVal
58
+ ? rawVal
59
+ .split(",")
60
+ .map((v) => v.trim())
61
+ .filter(Boolean)
62
+ : [];
63
+ return (_jsx(MultiSelectFilter, { slug: slug, filter: filter, value: currentValues }, filter.id));
64
+ }
65
+ default:
66
+ return null;
67
+ }
68
+ }) })] }));
69
+ }
70
+ //# sourceMappingURL=FilterBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBar.js","sourceRoot":"","sources":["../../src/components/FilterBar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Panel } from "../schemas/dashboard";
2
+ interface PanelGridProps {
3
+ panels: Panel[];
4
+ slug: string;
5
+ filterParams: string;
6
+ }
7
+ export declare function PanelGrid({ panels, slug, filterParams }: PanelGridProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=PanelGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelGrid.d.ts","sourceRoot":"","sources":["../../src/components/PanelGrid.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGlD,UAAU,cAAc;IACtB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,cAAc,2CAiBvE"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { PanelWrapper } from "./PanelWrapper";
3
+ export function PanelGrid({ panels, slug, filterParams }) {
4
+ return (_jsx("div", { className: "grid grid-cols-1 md:grid-cols-6 xl:grid-cols-12 gap-4 auto-rows-[minmax(80px,auto)]", children: panels.map((panel) => {
5
+ const mdSpan = Math.min(panel.width, 6);
6
+ return (_jsx(PanelCell, { panel: panel, mdSpan: mdSpan, slug: slug, filterParams: filterParams }, panel.id));
7
+ }) }));
8
+ }
9
+ function PanelCell({ panel, mdSpan, slug, filterParams, }) {
10
+ const mdRowSpan = Math.max(panel.height, 1);
11
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: `
12
+ @media (min-width: 768px) {
13
+ [data-panel-id="${panel.id}"] {
14
+ grid-column: span ${mdSpan};
15
+ grid-row: span ${mdRowSpan};
16
+ }
17
+ }
18
+ @media (min-width: 1280px) {
19
+ [data-panel-id="${panel.id}"] {
20
+ grid-column: ${panel.col} / span ${panel.width};
21
+ grid-row: ${panel.row} / span ${panel.height};
22
+ }
23
+ }
24
+ ` }), _jsx("div", { "data-panel-id": panel.id, children: _jsx(PanelWrapper, { slug: slug, panel: panel, filterParams: filterParams }) })] }));
25
+ }
26
+ //# sourceMappingURL=PanelGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelGrid.js","sourceRoot":"","sources":["../../src/components/PanelGrid.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAkB;IACtE,OAAO,CACL,cAAK,SAAS,EAAC,qFAAqF,YACjG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACxC,OAAO,CACL,KAAC,SAAS,IAER,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,YAAY,IAJrB,KAAK,CAAC,EAAE,CAKb,CACH,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EACjB,KAAK,EACL,MAAM,EACN,IAAI,EACJ,YAAY,GAMb;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,CACL,8BACE,0BAAQ;;4BAEc,KAAK,CAAC,EAAE;gCACJ,MAAM;6BACT,SAAS;;;;4BAIV,KAAK,CAAC,EAAE;2BACT,KAAK,CAAC,GAAG,WAAW,KAAK,CAAC,KAAK;wBAClC,KAAK,CAAC,GAAG,WAAW,KAAK,CAAC,MAAM;;;OAGjD,GAAS,EACV,+BAAoB,KAAK,CAAC,EAAE,YAC1B,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,GAAI,GAClE,IACL,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface PanelWrapperProps {
2
+ slug: string;
3
+ panel: Record<string, unknown>;
4
+ filterParams?: string;
5
+ }
6
+ export declare function PanelWrapper({ slug, panel }: PanelWrapperProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=PanelWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelWrapper.d.ts","sourceRoot":"","sources":["../../src/components/PanelWrapper.tsx"],"names":[],"mappings":"AA8BA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,iBAAiB,2CAe9D"}
@@ -0,0 +1,154 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright 2026 Mataki Labs LLC
3
+ //
4
+ // Licensed under the Business Source License 1.1 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ import { Suspense, useEffect } from "react";
16
+ import { useLoaderData, useFetcher, useSearchParams } from "react-router";
17
+ import { useTheme, ThemeProvider } from "../theme/context";
18
+ import { PanelSkeleton } from "./panels/PanelSkeleton";
19
+ import { PanelError } from "./panels/PanelError";
20
+ import { PanelEmpty } from "./panels/PanelEmpty";
21
+ import { StatPanel } from "./panels/StatPanel";
22
+ import { TablePanel } from "./panels/TablePanel";
23
+ import { MetricPanel } from "./panels/MetricPanel";
24
+ import { ListPanel } from "./panels/ListPanel";
25
+ import { ImagePanel } from "./panels/ImagePanel";
26
+ import { MarkdownPanel } from "./panels/MarkdownPanel";
27
+ import { IframePanel } from "./panels/IframePanel";
28
+ import { panelRegistry } from "./panels/index";
29
+ export function PanelWrapper({ slug, panel }) {
30
+ // Read panelThemes from the dashboard route loader
31
+ const loaderData = useLoaderData();
32
+ const panelThemes = loaderData?.panelThemes;
33
+ const panelTheme = panelThemes?.[panel.id];
34
+ const inner = _jsx(PanelWrapperInner, { slug: slug, panel: panel });
35
+ if (panelTheme) {
36
+ return _jsx(ThemeProvider, { theme: panelTheme, children: inner });
37
+ }
38
+ return inner;
39
+ }
40
+ function PanelWrapperInner({ slug, panel }) {
41
+ const theme = useTheme();
42
+ return (_jsxs("div", { className: `${theme.surfaces.panel} border ${theme.surfaces.panelBorder} rounded-xl h-full flex flex-col relative`, children: [_jsx("div", { className: "px-5 pt-4 pb-2", children: _jsx("h3", { className: `${theme.typography.panelTitle} uppercase tracking-wide truncate`, children: panel.title }) }), _jsx("div", { className: "flex-1 px-5 pb-5 min-h-0", children: _jsx(Suspense, { fallback: _jsx(PanelSkeleton, { type: panel.type }), children: _jsx(PanelContent, { slug: slug, panel: panel }) }) })] }));
43
+ }
44
+ function PanelContent({ slug, panel }) {
45
+ const fetcher = useFetcher();
46
+ const [searchParams] = useSearchParams();
47
+ const qString = searchParams.toString();
48
+ const panelId = panel.id;
49
+ const url = `/api/panels/${slug}/${panelId}${qString ? `?${qString}` : ""}`;
50
+ // Trigger the load on mount and when filters change
51
+ useEffect(() => {
52
+ fetcher.load(url);
53
+ // eslint-disable-next-line react-hooks/exhaustive-deps
54
+ }, [url]);
55
+ // Comparison data fetcher (only for stat panels with comparison enabled)
56
+ const compFetcher = useFetcher();
57
+ const stat = panel.stat;
58
+ const compUrl = stat?.comparison
59
+ ? `/api/panels/${slug}/${panelId}?${qString ? `${qString}&` : ""}_comparison=1`
60
+ : null;
61
+ useEffect(() => {
62
+ if (compUrl) {
63
+ compFetcher.load(compUrl);
64
+ }
65
+ // eslint-disable-next-line react-hooks/exhaustive-deps
66
+ }, [compUrl]);
67
+ // Loading state — Suspense fallback handles initial skeleton,
68
+ // but show skeleton for subsequent re-loads too
69
+ if (fetcher.state === "loading" || fetcher.data === undefined) {
70
+ return _jsx(PanelSkeleton, { type: panel.type });
71
+ }
72
+ const data = fetcher.data;
73
+ const comparisonData = compFetcher.data ?? null;
74
+ // Error from the API response
75
+ if (data?.error || data?.message) {
76
+ const message = String(data?.message ?? data?.error ?? "Query failed");
77
+ return _jsx(PanelError, { message: message, onRetry: () => fetcher.load(url) });
78
+ }
79
+ // Empty result set
80
+ if (data?.rowCount === 0) {
81
+ return _jsx(PanelEmpty, {});
82
+ }
83
+ return renderPanel(panel, data, comparisonData);
84
+ }
85
+ function renderPanel(panel, data, comparisonData) {
86
+ switch (panel.type) {
87
+ case "stat":
88
+ return (_jsx(StatPanel, { panel: panel, data: data, comparisonData: comparisonData }));
89
+ case "table":
90
+ return _jsx(TablePanel, { panel: panel, data: data });
91
+ case "metric":
92
+ return _jsx(MetricPanel, { panel: panel, data: data });
93
+ case "list":
94
+ return _jsx(ListPanel, { panel: panel, data: data });
95
+ case "image":
96
+ return _jsx(ImagePanel, { panel: panel, data: data });
97
+ case "markdown":
98
+ return _jsx(MarkdownPanel, { panel: panel, data: data });
99
+ case "iframe":
100
+ return _jsx(IframePanel, { panel: panel });
101
+ default: {
102
+ const panelType = panel.type;
103
+ const ChartComponent = panelRegistry[panelType];
104
+ if (ChartComponent) {
105
+ const chartConfig = {
106
+ ...(panel.chart ?? panel[panelType] ?? {}),
107
+ };
108
+ // Pass value_format from panel config if present
109
+ if (!chartConfig.value_format && panel.value_format) {
110
+ chartConfig.value_format = panel.value_format;
111
+ }
112
+ // Auto-detect x/y/series from column metadata when not explicitly configured
113
+ if (data.columns) {
114
+ const cols = data.columns;
115
+ if (!chartConfig.x) {
116
+ const dateOrStringCol = cols.find((c) => c.type === "date" || c.type === "string");
117
+ if (dateOrStringCol)
118
+ chartConfig.x = dateOrStringCol.name;
119
+ }
120
+ if (!chartConfig.y) {
121
+ const numberCols = cols.filter((c) => c.type === "number");
122
+ if (numberCols.length >= 1)
123
+ chartConfig.y = numberCols[0].name;
124
+ }
125
+ // If there's a string column that isn't the x axis, use as series
126
+ if (!chartConfig.series) {
127
+ const stringCols = cols.filter((c) => c.type === "string" && c.name !== chartConfig.x);
128
+ if (stringCols.length >= 1)
129
+ chartConfig.series = stringCols[0].name;
130
+ }
131
+ }
132
+ // Format date columns as short dates and coerce numbers
133
+ const rows = data.rows.map((row) => {
134
+ const out = { ...row };
135
+ for (const col of (data.columns ?? [])) {
136
+ if (col.type === "date" && out[col.name]) {
137
+ const d = new Date(out[col.name]);
138
+ if (!isNaN(d.getTime())) {
139
+ out[col.name] = `${d.getMonth() + 1}/${d.getDate()}`;
140
+ }
141
+ }
142
+ if (col.type === "number" && out[col.name] != null) {
143
+ out[col.name] = Number(out[col.name]);
144
+ }
145
+ }
146
+ return out;
147
+ });
148
+ return (_jsx("div", { style: { height: "100%", minHeight: 240 }, children: _jsx(ChartComponent, { data: rows, config: chartConfig }) }));
149
+ }
150
+ return (_jsxs("div", { className: "text-current/50 text-sm", children: ["Panel type '", panel.type, "' coming soon"] }));
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=PanelWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelWrapper.js","sourceRoot":"","sources":["../../src/components/PanelWrapper.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface BooleanFilterProps {
2
+ id: string;
3
+ label: string;
4
+ defaultValue?: boolean;
5
+ }
6
+ export declare function BooleanFilter({ id, label, defaultValue }: BooleanFilterProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=BooleanFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BooleanFilter.d.ts","sourceRoot":"","sources":["../../../src/components/filters/BooleanFilter.tsx"],"names":[],"mappings":"AAkBA,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,kBAAkB,2CAuC5E"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright 2026 Mataki Labs LLC
3
+ //
4
+ // Licensed under the Business Source License 1.1 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // https://github.com/panoboard/panoboard/blob/main/LICENSE
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ import { useSearchParams } from "react-router";
16
+ import { useFilterUpdate } from "./useFilterUpdate";
17
+ import { useTheme } from "../../theme/context";
18
+ export function BooleanFilter({ id, label, defaultValue }) {
19
+ const updateFilter = useFilterUpdate();
20
+ const [searchParams] = useSearchParams();
21
+ const theme = useTheme();
22
+ const raw = searchParams.get(id);
23
+ const isOn = raw !== null ? raw === "true" : (defaultValue ?? false);
24
+ function handleToggle() {
25
+ const newValue = !isOn;
26
+ // If toggling back to default, remove the param
27
+ if (newValue === (defaultValue ?? false)) {
28
+ updateFilter(id, null);
29
+ }
30
+ else {
31
+ updateFilter(id, String(newValue));
32
+ }
33
+ }
34
+ return (_jsxs("button", { type: "button", onClick: handleToggle, className: `flex items-center gap-2 ${theme.filters.background} border ${theme.filters.border} rounded-lg px-3 py-2 hover:opacity-90 transition cursor-default`, children: [_jsx("div", { className: `relative w-9 h-5 rounded-full transition-colors ${isOn ? "bg-indigo-500" : "bg-slate-600"}`, children: _jsx("div", { className: `absolute top-0.5 w-4 h-4 rounded-full bg-white shadow transition-transform ${isOn ? "translate-x-4" : "translate-x-0.5"}` }) }), _jsx("span", { className: `text-sm ${theme.filters.text}`, children: label })] }));
35
+ }
36
+ //# sourceMappingURL=BooleanFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BooleanFilter.js","sourceRoot":"","sources":["../../../src/components/filters/BooleanFilter.tsx"],"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,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAQ/C,MAAM,UAAU,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAsB;IAC3E,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,CAAC,YAAY,CAAC,GAAG,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC;IAErE,SAAS,YAAY;QACnB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC;QACvB,gDAAgD;QAChD,IAAI,QAAQ,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,CAAC;YACzC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,2BAA2B,KAAK,CAAC,OAAO,CAAC,UAAU,WAAW,KAAK,CAAC,OAAO,CAAC,MAAM,kEAAkE,aAG/J,cACE,SAAS,EAAE,mDACT,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAC3B,EAAE,YAEF,cACE,SAAS,EAAE,8EACT,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAC3B,EAAE,GACF,GACE,EACN,eAAM,SAAS,EAAE,WAAW,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,YAAG,KAAK,GAAQ,IACzD,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface CalendarGridProps {
2
+ onRangeSelect: (start: string, end: string) => void;
3
+ startDate?: string;
4
+ endDate?: string;
5
+ }
6
+ export declare function CalendarGrid({ onRangeSelect, startDate, endDate, }: CalendarGridProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=CalendarGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarGrid.d.ts","sourceRoot":"","sources":["../../../src/components/filters/CalendarGrid.tsx"],"names":[],"mappings":"AAkBA,UAAU,iBAAiB;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoCD,wBAAgB,YAAY,CAAC,EAC3B,aAAa,EACb,SAAS,EACT,OAAO,GACR,EAAE,iBAAiB,2CAsKnB"}