@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.
- package/dist/annotations/executor.d.ts +32 -0
- package/dist/annotations/executor.d.ts.map +1 -0
- package/dist/annotations/executor.js +74 -0
- package/dist/annotations/executor.js.map +1 -0
- package/dist/annotations/index.d.ts +2 -0
- package/dist/annotations/index.d.ts.map +1 -0
- package/dist/annotations/index.js +15 -0
- package/dist/annotations/index.js.map +1 -0
- package/dist/cache/keys.d.ts.map +1 -1
- package/dist/cache/keys.js +4 -4
- package/dist/cache/keys.js.map +1 -1
- package/dist/components/ConfigErrorBanner.d.ts +7 -0
- package/dist/components/ConfigErrorBanner.d.ts.map +1 -0
- package/dist/components/ConfigErrorBanner.js +43 -0
- package/dist/components/ConfigErrorBanner.js.map +1 -0
- package/dist/components/CrosshairContext.d.ts +13 -0
- package/dist/components/CrosshairContext.d.ts.map +1 -0
- package/dist/components/CrosshairContext.js +37 -0
- package/dist/components/CrosshairContext.js.map +1 -0
- package/dist/components/DashboardCard.d.ts +2 -1
- package/dist/components/DashboardCard.d.ts.map +1 -1
- package/dist/components/DashboardCard.js +11 -4
- package/dist/components/DashboardCard.js.map +1 -1
- package/dist/components/DashboardDescription.d.ts +19 -0
- package/dist/components/DashboardDescription.d.ts.map +1 -0
- package/dist/components/DashboardDescription.js +61 -0
- package/dist/components/DashboardDescription.js.map +1 -0
- package/dist/components/DashboardLinks.d.ts +8 -0
- package/dist/components/DashboardLinks.d.ts.map +1 -0
- package/dist/components/DashboardLinks.js +53 -0
- package/dist/components/DashboardLinks.js.map +1 -0
- package/dist/components/DashboardShell.d.ts +5 -1
- package/dist/components/DashboardShell.d.ts.map +1 -1
- package/dist/components/DashboardShell.js +42 -25
- package/dist/components/DashboardShell.js.map +1 -1
- package/dist/components/EmptyState.d.ts.map +1 -1
- package/dist/components/EmptyState.js +7 -1
- package/dist/components/EmptyState.js.map +1 -1
- package/dist/components/ErrorPage.d.ts.map +1 -1
- package/dist/components/ErrorPage.js +22 -33
- package/dist/components/ErrorPage.js.map +1 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +21 -5
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/NotificationCenter.d.ts +6 -0
- package/dist/components/NotificationCenter.d.ts.map +1 -0
- package/dist/components/NotificationCenter.js +67 -0
- package/dist/components/NotificationCenter.js.map +1 -0
- package/dist/components/NotificationIndicator.d.ts +6 -0
- package/dist/components/NotificationIndicator.d.ts.map +1 -0
- package/dist/components/NotificationIndicator.js +27 -0
- package/dist/components/NotificationIndicator.js.map +1 -0
- package/dist/components/PanelGrid.js +2 -2
- package/dist/components/PanelGrid.js.map +1 -1
- package/dist/components/PanelWrapper.d.ts +2 -1
- package/dist/components/PanelWrapper.d.ts.map +1 -1
- package/dist/components/PanelWrapper.js +101 -16
- package/dist/components/PanelWrapper.js.map +1 -1
- package/dist/components/RefreshContext.d.ts +3 -0
- package/dist/components/RefreshContext.d.ts.map +1 -0
- package/dist/components/RefreshContext.js +7 -0
- package/dist/components/RefreshContext.js.map +1 -0
- package/dist/components/RefreshControl.d.ts +17 -0
- package/dist/components/RefreshControl.d.ts.map +1 -0
- package/dist/components/RefreshControl.js +72 -0
- package/dist/components/RefreshControl.js.map +1 -0
- package/dist/components/SectionGrid.d.ts +9 -0
- package/dist/components/SectionGrid.d.ts.map +1 -0
- package/dist/components/SectionGrid.js +76 -0
- package/dist/components/SectionGrid.js.map +1 -0
- package/dist/components/SectionHeader.d.ts +8 -0
- package/dist/components/SectionHeader.d.ts.map +1 -0
- package/dist/components/SectionHeader.js +21 -0
- package/dist/components/SectionHeader.js.map +1 -0
- package/dist/components/TagPills.d.ts +7 -0
- package/dist/components/TagPills.d.ts.map +1 -0
- package/dist/components/TagPills.js +41 -0
- package/dist/components/TagPills.js.map +1 -0
- package/dist/components/filters/BooleanFilter.d.ts.map +1 -1
- package/dist/components/filters/BooleanFilter.js +1 -3
- package/dist/components/filters/BooleanFilter.js.map +1 -1
- package/dist/components/filters/CalendarGrid.d.ts.map +1 -1
- package/dist/components/filters/CalendarGrid.js +1 -1
- package/dist/components/filters/CalendarGrid.js.map +1 -1
- package/dist/components/filters/DateRangeFilter.d.ts.map +1 -1
- package/dist/components/filters/DateRangeFilter.js +4 -6
- package/dist/components/filters/DateRangeFilter.js.map +1 -1
- package/dist/components/filters/FilterChips.d.ts.map +1 -1
- package/dist/components/filters/FilterChips.js +71 -10
- package/dist/components/filters/FilterChips.js.map +1 -1
- package/dist/components/filters/IntervalFilter.d.ts +9 -0
- package/dist/components/filters/IntervalFilter.d.ts.map +1 -0
- package/dist/components/filters/IntervalFilter.js +29 -0
- package/dist/components/filters/IntervalFilter.js.map +1 -0
- package/dist/components/filters/MultiSelectFilter.d.ts.map +1 -1
- package/dist/components/filters/MultiSelectFilter.js +1 -3
- package/dist/components/filters/MultiSelectFilter.js.map +1 -1
- package/dist/components/filters/NumberFilter.d.ts.map +1 -1
- package/dist/components/filters/NumberFilter.js +5 -1
- package/dist/components/filters/NumberFilter.js.map +1 -1
- package/dist/components/filters/SelectFilter.d.ts +2 -1
- package/dist/components/filters/SelectFilter.d.ts.map +1 -1
- package/dist/components/filters/SelectFilter.js +9 -10
- package/dist/components/filters/SelectFilter.js.map +1 -1
- package/dist/components/filters/TextFilter.d.ts.map +1 -1
- package/dist/components/filters/TextFilter.js +5 -1
- package/dist/components/filters/TextFilter.js.map +1 -1
- package/dist/components/index.d.ts +12 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +15 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/panels/AnnotationLayer.d.ts +28 -0
- package/dist/components/panels/AnnotationLayer.d.ts.map +1 -0
- package/dist/components/panels/AnnotationLayer.js +102 -0
- package/dist/components/panels/AnnotationLayer.js.map +1 -0
- package/dist/components/panels/AreaChart.d.ts +3 -1
- package/dist/components/panels/AreaChart.d.ts.map +1 -1
- package/dist/components/panels/AreaChart.js +86 -5
- package/dist/components/panels/AreaChart.js.map +1 -1
- package/dist/components/panels/BarChart.d.ts.map +1 -1
- package/dist/components/panels/BarChart.js +61 -7
- package/dist/components/panels/BarChart.js.map +1 -1
- package/dist/components/panels/ChartTooltip.d.ts.map +1 -1
- package/dist/components/panels/ChartTooltip.js +9 -48
- package/dist/components/panels/ChartTooltip.js.map +1 -1
- package/dist/components/panels/DataLinks.d.ts +35 -0
- package/dist/components/panels/DataLinks.d.ts.map +1 -0
- package/dist/components/panels/DataLinks.js +67 -0
- package/dist/components/panels/DataLinks.js.map +1 -0
- package/dist/components/panels/GaugePanel.d.ts +7 -0
- package/dist/components/panels/GaugePanel.d.ts.map +1 -0
- package/dist/components/panels/GaugePanel.js +116 -0
- package/dist/components/panels/GaugePanel.js.map +1 -0
- package/dist/components/panels/HistogramPanel.d.ts +18 -0
- package/dist/components/panels/HistogramPanel.d.ts.map +1 -0
- package/dist/components/panels/HistogramPanel.js +92 -0
- package/dist/components/panels/HistogramPanel.js.map +1 -0
- package/dist/components/panels/LineChart.d.ts +3 -1
- package/dist/components/panels/LineChart.d.ts.map +1 -1
- package/dist/components/panels/LineChart.js +89 -5
- package/dist/components/panels/LineChart.js.map +1 -1
- package/dist/components/panels/ListPanel.d.ts.map +1 -1
- package/dist/components/panels/ListPanel.js +1 -1
- package/dist/components/panels/ListPanel.js.map +1 -1
- package/dist/components/panels/MarkdownPanel.d.ts +15 -1
- package/dist/components/panels/MarkdownPanel.d.ts.map +1 -1
- package/dist/components/panels/MarkdownPanel.js +70 -7
- package/dist/components/panels/MarkdownPanel.js.map +1 -1
- package/dist/components/panels/MetricPanel.d.ts.map +1 -1
- package/dist/components/panels/MetricPanel.js +1 -1
- package/dist/components/panels/MetricPanel.js.map +1 -1
- package/dist/components/panels/PanelEmpty.d.ts.map +1 -1
- package/dist/components/panels/PanelEmpty.js +1 -1
- package/dist/components/panels/PanelEmpty.js.map +1 -1
- package/dist/components/panels/PanelError.d.ts.map +1 -1
- package/dist/components/panels/PanelError.js +4 -1
- package/dist/components/panels/PanelError.js.map +1 -1
- package/dist/components/panels/PanelSkeleton.js +2 -2
- package/dist/components/panels/PanelSkeleton.js.map +1 -1
- package/dist/components/panels/ScatterChart.d.ts +15 -1
- package/dist/components/panels/ScatterChart.d.ts.map +1 -1
- package/dist/components/panels/ScatterChart.js +96 -26
- package/dist/components/panels/ScatterChart.js.map +1 -1
- package/dist/components/panels/Sparkline.d.ts +21 -0
- package/dist/components/panels/Sparkline.d.ts.map +1 -0
- package/dist/components/panels/Sparkline.js +53 -0
- package/dist/components/panels/Sparkline.js.map +1 -0
- package/dist/components/panels/StatPanel.d.ts +3 -1
- package/dist/components/panels/StatPanel.d.ts.map +1 -1
- package/dist/components/panels/StatPanel.js +33 -4
- package/dist/components/panels/StatPanel.js.map +1 -1
- package/dist/components/panels/TablePanel.d.ts +2 -1
- package/dist/components/panels/TablePanel.d.ts.map +1 -1
- package/dist/components/panels/TablePanel.js +96 -6
- package/dist/components/panels/TablePanel.js.map +1 -1
- package/dist/components/panels/VideoPanel.d.ts.map +1 -1
- package/dist/components/panels/VideoPanel.js +1 -1
- package/dist/components/panels/VideoPanel.js.map +1 -1
- package/dist/components/panels/nivo-theme.d.ts +1 -44
- package/dist/components/panels/nivo-theme.d.ts.map +1 -1
- package/dist/components/panels/nivo-theme.js +9 -104
- package/dist/components/panels/nivo-theme.js.map +1 -1
- package/dist/components/panels/semantic-colors.d.ts.map +1 -1
- package/dist/components/panels/semantic-colors.js +2 -39
- package/dist/components/panels/semantic-colors.js.map +1 -1
- package/dist/components/ui/Button.d.ts +1 -1
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js +6 -9
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Tabs.d.ts.map +1 -1
- package/dist/components/ui/Tabs.js +1 -1
- package/dist/components/ui/Tabs.js.map +1 -1
- package/dist/connectors/bigquery.d.ts.map +1 -1
- package/dist/connectors/bigquery.js +6 -1
- package/dist/connectors/bigquery.js.map +1 -1
- package/dist/connectors/postgres.d.ts.map +1 -1
- package/dist/connectors/postgres.js +3 -0
- package/dist/connectors/postgres.js.map +1 -1
- package/dist/connectors/redshift.d.ts.map +1 -1
- package/dist/connectors/redshift.js +3 -0
- package/dist/connectors/redshift.js.map +1 -1
- package/dist/contexts/NotificationContext.d.ts +10 -0
- package/dist/contexts/NotificationContext.d.ts.map +1 -0
- package/dist/contexts/NotificationContext.js +24 -0
- package/dist/contexts/NotificationContext.js.map +1 -0
- package/dist/filters/daterange.d.ts +1 -1
- package/dist/filters/daterange.d.ts.map +1 -1
- package/dist/filters/daterange.js +54 -9
- package/dist/filters/daterange.js.map +1 -1
- package/dist/filters/index.d.ts +2 -0
- package/dist/filters/index.d.ts.map +1 -1
- package/dist/filters/index.js +2 -0
- package/dist/filters/index.js.map +1 -1
- package/dist/filters/interval.d.ts +13 -0
- package/dist/filters/interval.d.ts.map +1 -0
- package/dist/filters/interval.js +40 -0
- package/dist/filters/interval.js.map +1 -0
- package/dist/filters/resolver.d.ts +1 -1
- package/dist/filters/resolver.d.ts.map +1 -1
- package/dist/filters/resolver.js +28 -2
- package/dist/filters/resolver.js.map +1 -1
- package/dist/flattenTabs.d.ts +8 -0
- package/dist/flattenTabs.d.ts.map +1 -0
- package/dist/flattenTabs.js +24 -0
- package/dist/flattenTabs.js.map +1 -0
- package/dist/formats.d.ts +1 -1
- package/dist/formats.d.ts.map +1 -1
- package/dist/formats.js +19 -9
- package/dist/formats.js.map +1 -1
- package/dist/hooks/useNotifications.d.ts +5 -0
- package/dist/hooks/useNotifications.d.ts.map +1 -0
- package/dist/hooks/useNotifications.js +48 -0
- package/dist/hooks/useNotifications.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/interpolation.d.ts +10 -0
- package/dist/interpolation.d.ts.map +1 -0
- package/dist/interpolation.js +64 -0
- package/dist/interpolation.js.map +1 -0
- package/dist/panels/conditional.d.ts +12 -0
- package/dist/panels/conditional.d.ts.map +1 -0
- package/dist/panels/conditional.js +90 -0
- package/dist/panels/conditional.js.map +1 -0
- package/dist/panels/index.d.ts +11 -0
- package/dist/panels/index.d.ts.map +1 -0
- package/dist/panels/index.js +19 -0
- package/dist/panels/index.js.map +1 -0
- package/dist/panels/mappings.d.ts +40 -0
- package/dist/panels/mappings.d.ts.map +1 -0
- package/dist/panels/mappings.js +83 -0
- package/dist/panels/mappings.js.map +1 -0
- package/dist/panels/overrides.d.ts +37 -0
- package/dist/panels/overrides.d.ts.map +1 -0
- package/dist/panels/overrides.js +57 -0
- package/dist/panels/overrides.js.map +1 -0
- package/dist/panels/threshold-layers.d.ts +18 -0
- package/dist/panels/threshold-layers.d.ts.map +1 -0
- package/dist/panels/threshold-layers.js +35 -0
- package/dist/panels/threshold-layers.js.map +1 -0
- package/dist/panels/thresholds.d.ts +36 -0
- package/dist/panels/thresholds.d.ts.map +1 -0
- package/dist/panels/thresholds.js +81 -0
- package/dist/panels/thresholds.js.map +1 -0
- package/dist/schemas/annotations.d.ts +34 -0
- package/dist/schemas/annotations.d.ts.map +1 -0
- package/dist/schemas/annotations.js +19 -0
- package/dist/schemas/annotations.js.map +1 -0
- package/dist/schemas/config.d.ts +1 -0
- package/dist/schemas/config.d.ts.map +1 -1
- package/dist/schemas/config.js +1 -0
- package/dist/schemas/config.js.map +1 -1
- package/dist/schemas/dashboard.d.ts +5861 -235
- package/dist/schemas/dashboard.d.ts.map +1 -1
- package/dist/schemas/dashboard.js +173 -10
- package/dist/schemas/dashboard.js.map +1 -1
- package/dist/schemas/index.d.ts +6 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +6 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/mappings.d.ts +46 -0
- package/dist/schemas/mappings.d.ts.map +1 -0
- package/dist/schemas/mappings.js +46 -0
- package/dist/schemas/mappings.js.map +1 -0
- package/dist/schemas/overrides.d.ts +77 -0
- package/dist/schemas/overrides.d.ts.map +1 -0
- package/dist/schemas/overrides.js +38 -0
- package/dist/schemas/overrides.js.map +1 -0
- package/dist/schemas/theme.d.ts +89 -7
- package/dist/schemas/theme.d.ts.map +1 -1
- package/dist/schemas/theme.js +40 -24
- package/dist/schemas/theme.js.map +1 -1
- package/dist/schemas/thresholds.d.ts +19 -0
- package/dist/schemas/thresholds.d.ts.map +1 -0
- package/dist/schemas/thresholds.js +31 -0
- package/dist/schemas/thresholds.js.map +1 -0
- package/dist/schemas/transforms.d.ts +54 -0
- package/dist/schemas/transforms.d.ts.map +1 -0
- package/dist/schemas/transforms.js +51 -0
- package/dist/schemas/transforms.js.map +1 -0
- package/dist/startup/sql-lint.d.ts.map +1 -1
- package/dist/startup/sql-lint.js +3 -2
- package/dist/startup/sql-lint.js.map +1 -1
- package/dist/theme/builtin.d.ts.map +1 -1
- package/dist/theme/builtin.js +56 -62
- package/dist/theme/builtin.js.map +1 -1
- package/dist/theme/colors.d.ts +11 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/theme/colors.js +71 -0
- package/dist/theme/colors.js.map +1 -0
- package/dist/theme/context.d.ts.map +1 -1
- package/dist/theme/context.js +16 -3
- package/dist/theme/context.js.map +1 -1
- package/dist/theme/loader-export.d.ts +1 -1
- package/dist/theme/loader-export.d.ts.map +1 -1
- package/dist/theme/loader-export.js +1 -1
- package/dist/theme/loader-export.js.map +1 -1
- package/dist/theme/loader.d.ts +8 -3
- package/dist/theme/loader.d.ts.map +1 -1
- package/dist/theme/loader.js +24 -13
- package/dist/theme/loader.js.map +1 -1
- package/dist/transforms/computed.d.ts +11 -0
- package/dist/transforms/computed.d.ts.map +1 -0
- package/dist/transforms/computed.js +24 -0
- package/dist/transforms/computed.js.map +1 -0
- package/dist/transforms/engine.d.ts +17 -0
- package/dist/transforms/engine.d.ts.map +1 -0
- package/dist/transforms/engine.js +65 -0
- package/dist/transforms/engine.js.map +1 -0
- package/dist/transforms/expression.d.ts +9 -0
- package/dist/transforms/expression.d.ts.map +1 -0
- package/dist/transforms/expression.js +306 -0
- package/dist/transforms/expression.js.map +1 -0
- package/dist/transforms/filter.d.ts +11 -0
- package/dist/transforms/filter.d.ts.map +1 -0
- package/dist/transforms/filter.js +10 -0
- package/dist/transforms/filter.js.map +1 -0
- package/dist/transforms/index.d.ts +10 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +9 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/limit.d.ts +11 -0
- package/dist/transforms/limit.d.ts.map +1 -0
- package/dist/transforms/limit.js +4 -0
- package/dist/transforms/limit.js.map +1 -0
- package/dist/transforms/percentage.d.ts +11 -0
- package/dist/transforms/percentage.d.ts.map +1 -0
- package/dist/transforms/percentage.js +25 -0
- package/dist/transforms/percentage.js.map +1 -0
- package/dist/transforms/rename.d.ts +11 -0
- package/dist/transforms/rename.d.ts.map +1 -0
- package/dist/transforms/rename.js +17 -0
- package/dist/transforms/rename.js.map +1 -0
- package/dist/transforms/sort.d.ts +11 -0
- package/dist/transforms/sort.d.ts.map +1 -0
- package/dist/transforms/sort.js +21 -0
- package/dist/transforms/sort.js.map +1 -0
- package/dist/types/config-error.d.ts +16 -0
- package/dist/types/config-error.d.ts.map +1 -0
- package/dist/types/config-error.js +2 -0
- package/dist/types/config-error.js.map +1 -0
- package/dist/types/notification.d.ts +19 -0
- package/dist/types/notification.d.ts.map +1 -0
- package/dist/types/notification.js +15 -0
- package/dist/types/notification.js.map +1 -0
- package/package.json +11 -1
|
@@ -15,21 +15,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
15
15
|
import { useEffect, useCallback, useState } from "react";
|
|
16
16
|
import { useRevalidator, useSearchParams } from "react-router";
|
|
17
17
|
import { Maximize2, Minimize2 } from "lucide-react";
|
|
18
|
-
import {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const value = parseInt(match[1], 10);
|
|
24
|
-
switch (match[2]) {
|
|
25
|
-
case "m":
|
|
26
|
-
return value * 60;
|
|
27
|
-
case "h":
|
|
28
|
-
return value * 3600;
|
|
29
|
-
default:
|
|
30
|
-
return value;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
18
|
+
import { DashboardDescription } from "./DashboardDescription";
|
|
19
|
+
import { TagPills } from "./TagPills";
|
|
20
|
+
import { DashboardLinks } from "./DashboardLinks";
|
|
21
|
+
import { RefreshControl, parseRefreshParam } from "./RefreshControl";
|
|
22
|
+
import { RefreshProvider } from "./RefreshContext";
|
|
33
23
|
function formatCountdown(seconds) {
|
|
34
24
|
if (seconds <= 0)
|
|
35
25
|
return "0s";
|
|
@@ -39,12 +29,16 @@ function formatCountdown(seconds) {
|
|
|
39
29
|
const s = seconds % 60;
|
|
40
30
|
return s > 0 ? `${m}m ${s}s` : `${m}m`;
|
|
41
31
|
}
|
|
42
|
-
export function DashboardShell({ title, description, refresh, filters, children, }) {
|
|
43
|
-
const theme = useTheme();
|
|
32
|
+
export function DashboardShell({ title, description, tags, links, filterParams, refresh, filters, children, }) {
|
|
44
33
|
const revalidator = useRevalidator();
|
|
45
34
|
const [searchParams, setSearchParams] = useSearchParams();
|
|
46
|
-
|
|
47
|
-
const
|
|
35
|
+
// Determine active refresh: URL ?refresh= overrides YAML default
|
|
36
|
+
const urlRefresh = searchParams.get("refresh");
|
|
37
|
+
const activeRefreshValue = urlRefresh ?? (refresh ? refresh.replace(/^(\d+)$/, "$1s") : "off");
|
|
38
|
+
const activeRefreshSeconds = parseRefreshParam(activeRefreshValue);
|
|
39
|
+
const [countdown, setCountdown] = useState(activeRefreshSeconds);
|
|
40
|
+
const [paused, setPaused] = useState(false);
|
|
41
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
48
42
|
const isRefreshing = revalidator.state === "loading";
|
|
49
43
|
const isFullscreen = searchParams.get("fullscreen") === "1";
|
|
50
44
|
const [hintHidden, setHintHidden] = useState(false);
|
|
@@ -71,6 +65,7 @@ export function DashboardShell({ title, description, refresh, filters, children,
|
|
|
71
65
|
};
|
|
72
66
|
}, [isFullscreen, setSearchParams]);
|
|
73
67
|
const doRefresh = useCallback(() => {
|
|
68
|
+
setRefreshKey((k) => k + 1);
|
|
74
69
|
revalidator.revalidate();
|
|
75
70
|
}, [revalidator]);
|
|
76
71
|
const toggleFullscreen = useCallback(() => {
|
|
@@ -85,15 +80,35 @@ export function DashboardShell({ title, description, refresh, filters, children,
|
|
|
85
80
|
return next;
|
|
86
81
|
}, { preventScrollReset: true });
|
|
87
82
|
}, [setSearchParams]);
|
|
83
|
+
const handleChangeInterval = useCallback((value) => {
|
|
84
|
+
setSearchParams((prev) => {
|
|
85
|
+
const next = new URLSearchParams(prev);
|
|
86
|
+
if (value === "off") {
|
|
87
|
+
next.delete("refresh");
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
next.set("refresh", value);
|
|
91
|
+
}
|
|
92
|
+
return next;
|
|
93
|
+
}, { preventScrollReset: true });
|
|
94
|
+
setPaused(false);
|
|
95
|
+
}, [setSearchParams]);
|
|
96
|
+
const handleTogglePause = useCallback(() => {
|
|
97
|
+
setPaused((prev) => !prev);
|
|
98
|
+
}, []);
|
|
99
|
+
// Reset countdown when interval changes
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
setCountdown(activeRefreshSeconds);
|
|
102
|
+
}, [activeRefreshSeconds]);
|
|
88
103
|
// Reset countdown when refresh completes (cleanup runs on transition from loading)
|
|
89
104
|
useEffect(() => {
|
|
90
105
|
if (!isRefreshing)
|
|
91
106
|
return;
|
|
92
|
-
return () => setCountdown(
|
|
93
|
-
}, [isRefreshing,
|
|
107
|
+
return () => setCountdown(activeRefreshSeconds);
|
|
108
|
+
}, [isRefreshing, activeRefreshSeconds]);
|
|
94
109
|
// Countdown tick
|
|
95
110
|
useEffect(() => {
|
|
96
|
-
if (
|
|
111
|
+
if (activeRefreshSeconds <= 0 || isRefreshing || paused)
|
|
97
112
|
return;
|
|
98
113
|
const interval = setInterval(() => {
|
|
99
114
|
setCountdown((prev) => {
|
|
@@ -105,10 +120,12 @@ export function DashboardShell({ title, description, refresh, filters, children,
|
|
|
105
120
|
});
|
|
106
121
|
}, 1000);
|
|
107
122
|
return () => clearInterval(interval);
|
|
108
|
-
}, [
|
|
109
|
-
return (_jsxs("div", { className: "px-6 py-6 flex-1", children: [_jsxs("div", { className: "flex flex-col xl:flex-row xl:items-start gap-4 mb-6", children: [_jsxs("div", { className: "shrink-0", children: [_jsx("h1", { className:
|
|
123
|
+
}, [activeRefreshSeconds, isRefreshing, paused, doRefresh]);
|
|
124
|
+
return (_jsxs("div", { className: "px-6 py-6 flex-1", children: [_jsxs("div", { className: "flex flex-col xl:flex-row xl:items-start gap-4 mb-6", children: [_jsxs("div", { className: "shrink-0", children: [_jsx("h1", { className: "text-3xl font-extrabold", style: { color: "var(--text-title)", letterSpacing: "-0.03em" }, children: title }), description && _jsx(DashboardDescription, { description: description }), tags && tags.length > 0 && (_jsx("div", { className: "mt-2", children: _jsx(TagPills, { tags: tags, linkBase: "/dashboards" }) })), links && links.length > 0 && (_jsx("div", { className: "mt-2", children: _jsx(DashboardLinks, { links: links, filterParams: filterParams ?? "" }) }))] }), _jsxs("div", { className: "flex items-start gap-3 xl:ml-auto xl:mt-1", children: [filters, _jsxs("div", { className: "shrink-0 flex items-center gap-2", children: [_jsx("button", { onClick: doRefresh, disabled: isRefreshing, className: "btn-primary rounded-[10px] px-4 py-2 text-sm font-medium", children: isRefreshing ? "Refreshing\u2026" : "Refresh Now" }), _jsx(RefreshControl, { currentValue: activeRefreshValue, isRefreshing: isRefreshing, isPaused: paused, onChangeInterval: handleChangeInterval, onTogglePause: handleTogglePause }), activeRefreshSeconds > 0 && (_jsx("span", { className: "text-xs whitespace-nowrap", style: { color: "var(--text-muted)" }, children: isRefreshing
|
|
110
125
|
? "Refreshing\u2026"
|
|
111
|
-
:
|
|
126
|
+
: paused
|
|
127
|
+
? "Paused"
|
|
128
|
+
: `Refreshes in ${formatCountdown(countdown)}` })), !isFullscreen && (_jsx("button", { onClick: toggleFullscreen, title: "Full screen", className: "rounded-lg p-2 transition", style: { backgroundColor: "var(--filter-bg)", color: "var(--text-muted)" }, children: _jsx(Maximize2, { className: "w-4 h-4" }) }))] })] })] }), _jsx(RefreshProvider, { value: refreshKey, children: children }), isFullscreen && (_jsxs("div", { className: "fixed top-0 inset-x-0 z-50 flex justify-center group", children: [_jsx("div", { className: "h-4 w-64" }), _jsxs("button", { onClick: toggleFullscreen, style: { background: "rgba(0, 0, 0, 0.85)" }, className: `absolute top-0 flex items-center gap-2 text-white rounded-b-lg px-4 py-2 text-sm font-medium shadow-lg backdrop-blur-sm transition-transform duration-300 ease-in-out ${hintVisible
|
|
112
129
|
? "translate-y-0"
|
|
113
130
|
: "-translate-y-full group-hover:translate-y-0"}`, children: [_jsx(Minimize2, { className: "w-4 h-4" }), "Exit Full Screen"] })] }))] }));
|
|
114
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardShell.js","sourceRoot":"","sources":["../../src/components/DashboardShell.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,EAAkB,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"DashboardShell.js","sourceRoot":"","sources":["../../src/components/DashboardShell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAkBA,UAAU,eAAe;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EAAE,WAAgB,EAAE,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../src/components/EmptyState.tsx"],"names":[],"mappings":"AAkBA,UAAU,eAAe;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EAAE,WAAgB,EAAE,EAAE,eAAe,2CAuI/D"}
|
|
@@ -24,6 +24,12 @@ export function EmptyState({ exampleYaml = "" }) {
|
|
|
24
24
|
setTimeout(() => setCopied(false), 2000);
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
|
-
return (_jsx("div", { className: "flex items-center justify-center py-16", children: _jsxs("div", { className: "max-w-xl w-full text-center", children: [_jsxs("div", { className: "relative mb-10", children: [_jsx("div", { className: "absolute -inset-4
|
|
27
|
+
return (_jsx("div", { className: "flex items-center justify-center py-16", children: _jsxs("div", { className: "max-w-xl w-full text-center", children: [_jsxs("div", { className: "relative mb-10", children: [_jsx("div", { className: "absolute -inset-4 rounded-full blur-3xl opacity-20", style: { backgroundColor: theme.primary } }), _jsx("div", { className: "relative flex justify-center", children: _jsx("div", { className: "w-64 h-64 rounded-2xl border-2 border-dashed flex flex-col items-center justify-center overflow-hidden", style: {
|
|
28
|
+
backgroundColor: theme.panel.header,
|
|
29
|
+
borderColor: theme.panel.border,
|
|
30
|
+
}, children: _jsxs("div", { className: "w-48 space-y-3 p-6 opacity-60", children: [_jsxs("div", { className: "flex gap-2", children: [_jsx("div", { className: "h-2 w-8 rounded", style: { backgroundColor: `${theme.primary}66` } }), _jsx("div", { className: "h-2 w-12 rounded", style: { backgroundColor: `${theme.panel.border}99` } })] }), _jsxs("div", { className: "flex gap-2 pl-4", children: [_jsx("div", { className: "h-2 w-16 rounded", style: { backgroundColor: `${theme.primary}66` } }), _jsx("div", { className: "h-2 w-6 rounded", style: { backgroundColor: `${theme.panel.border}99` } })] }), _jsxs("div", { className: "flex gap-2 pl-4", children: [_jsx("div", { className: "h-2 w-10 rounded", style: { backgroundColor: `${theme.primary}66` } }), _jsx("div", { className: "h-2 w-20 rounded", style: { backgroundColor: `${theme.panel.border}99` } })] }), _jsx("div", { className: "flex gap-2 pt-2", children: _jsx("div", { className: "h-2 w-24 rounded", style: { backgroundColor: `${theme.primary}66` } }) }), _jsxs("div", { className: "flex gap-2 pl-4", children: [_jsx("div", { className: "h-2 w-8 rounded", style: { backgroundColor: `${theme.primary}66` } }), _jsx("div", { className: "h-2 w-16 rounded", style: { backgroundColor: `${theme.panel.border}99` } })] })] }) }) })] }), _jsx("h1", { className: "text-3xl! font-bold! mb-3", style: { color: theme.typography.title }, children: "No dashboards found" }), _jsxs("p", { className: "text-lg mb-10 max-w-md mx-auto leading-relaxed", style: { color: theme.typography.muted }, children: ["Define your first dashboard in a", " ", _jsx("code", { className: "px-1.5 py-0.5 rounded font-mono text-sm italic", style: {
|
|
31
|
+
backgroundColor: theme.panel.header,
|
|
32
|
+
color: theme.primary,
|
|
33
|
+
}, children: "YAML" }), " ", "file to get started."] }), _jsxs("div", { className: "flex flex-col sm:flex-row items-center justify-center gap-4", children: [_jsxs("a", { href: "https://panoboard.dev/docs", target: "_blank", rel: "noopener noreferrer", className: "btn-primary w-full sm:w-auto px-8 py-3 rounded-lg flex items-center justify-center gap-2 font-bold", children: [_jsx(BookOpen, { className: "w-5 h-5" }), "View Documentation"] }), _jsxs("button", { onClick: handleCopy, className: "btn-secondary w-full sm:w-auto px-8 py-3 rounded-lg flex items-center justify-center gap-2 font-bold", children: [copied ? (_jsx(Check, { className: "w-5 h-5", style: { color: "var(--status-positive)" } })) : (_jsx(Copy, { className: "w-5 h-5" })), copied ? "Copied!" : "Copy Example YAML"] })] })] }) }));
|
|
28
34
|
}
|
|
29
35
|
//# sourceMappingURL=EmptyState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../src/components/EmptyState.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,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM5C,MAAM,UAAU,UAAU,CAAC,EAAE,WAAW,GAAG,EAAE,EAAmB;IAC9D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,SAAS,UAAU;QACjB,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACnD,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,wCAAwC,YACrD,eAAK,SAAS,EAAC,6BAA6B,aAE1C,eAAK,SAAS,EAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../src/components/EmptyState.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,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM5C,MAAM,UAAU,UAAU,CAAC,EAAE,WAAW,GAAG,EAAE,EAAmB;IAC9D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,SAAS,UAAU;QACjB,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACnD,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,wCAAwC,YACrD,eAAK,SAAS,EAAC,6BAA6B,aAE1C,eAAK,SAAS,EAAC,gBAAgB,aAE7B,cACE,SAAS,EAAC,oDAAoD,EAC9D,KAAK,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,GACzC,EACF,cAAK,SAAS,EAAC,8BAA8B,YAC3C,cACE,SAAS,EAAC,wGAAwG,EAClH,KAAK,EAAE;oCACL,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;oCACnC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;iCAChC,YAGD,eAAK,SAAS,EAAC,+BAA+B,aAC5C,eAAK,SAAS,EAAC,YAAY,aACzB,cACE,SAAS,EAAC,iBAAiB,EAC3B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,GAChD,EACF,cACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,GACrD,IACE,EACN,eAAK,SAAS,EAAC,iBAAiB,aAC9B,cACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,GAChD,EACF,cACE,SAAS,EAAC,iBAAiB,EAC3B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,GACrD,IACE,EACN,eAAK,SAAS,EAAC,iBAAiB,aAC9B,cACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,GAChD,EACF,cACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,GACrD,IACE,EACN,cAAK,SAAS,EAAC,iBAAiB,YAC9B,cACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,GAChD,GACE,EACN,eAAK,SAAS,EAAC,iBAAiB,aAC9B,cACE,SAAS,EAAC,iBAAiB,EAC3B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,GAChD,EACF,cACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,GACrD,IACE,IACF,GACF,GACF,IACF,EAGN,aACE,SAAS,EAAC,2BAA2B,EACrC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,oCAGrC,EACL,aACE,SAAS,EAAC,gDAAgD,EAC1D,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,iDAEP,GAAG,EACpC,eACE,SAAS,EAAC,gDAAgD,EAC1D,KAAK,EAAE;gCACL,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;gCACnC,KAAK,EAAE,KAAK,CAAC,OAAO;6BACrB,qBAGI,EAAC,GAAG,4BAET,EAGJ,eAAK,SAAS,EAAC,6DAA6D,aAC1E,aACE,IAAI,EAAC,4BAA4B,EACjC,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,oGAAoG,aAE9G,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,0BAE9B,EACJ,kBACE,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,sGAAsG,aAE/G,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,KAAK,IACJ,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAC1C,CACH,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,CAC7B,EACA,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,IAClC,IACL,IACF,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorPage.d.ts","sourceRoot":"","sources":["../../src/components/ErrorPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ErrorPage.d.ts","sourceRoot":"","sources":["../../src/components/ErrorPage.tsx"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,IAAkB,EAClB,YAA2B,EAC3B,WAA2B,EAC3B,cAAuB,EACvB,aAAmB,EACnB,MAAM,EACN,MAAM,GACP,EAAE,cAAc,2CAyKhB"}
|
|
@@ -13,17 +13,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
13
13
|
// See the License for the specific language governing permissions and
|
|
14
14
|
// limitations under the License.
|
|
15
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
16
|
export function ErrorPage({ code, title, description, icon = "not-found", primaryLabel = "Dashboards", primaryHref = "/dashboards", secondaryLabel = "Home", secondaryHref = "/", header, footer, }) {
|
|
26
|
-
const theme = useThemeSafe();
|
|
27
17
|
const [path, setPath] = useState("");
|
|
28
18
|
const timestamp = new Date().toLocaleTimeString("en-US", {
|
|
29
19
|
hour12: false,
|
|
@@ -36,14 +26,13 @@ export function ErrorPage({ code, title, description, icon = "not-found", primar
|
|
|
36
26
|
setPath(window.location.pathname);
|
|
37
27
|
}, [code, title]);
|
|
38
28
|
const is404 = code === 404;
|
|
39
|
-
|
|
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] }));
|
|
29
|
+
return (_jsxs("div", { className: "ep-root", 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
30
|
}
|
|
42
31
|
const STYLES = `
|
|
43
32
|
.ep-root { display: flex; flex-direction: column; min-height: 100vh; }
|
|
44
33
|
.ep-page {
|
|
45
34
|
position: relative; display: flex; align-items: center; justify-content: center;
|
|
46
|
-
flex: 1; overflow: hidden; background: var(--
|
|
35
|
+
flex: 1; overflow: hidden; background: var(--surface-page);
|
|
47
36
|
font-family: "Inter", system-ui, -apple-system, sans-serif;
|
|
48
37
|
-webkit-font-smoothing: antialiased;
|
|
49
38
|
}
|
|
@@ -51,8 +40,8 @@ const STYLES = `
|
|
|
51
40
|
.ep-grid {
|
|
52
41
|
position: absolute; inset: -60px;
|
|
53
42
|
background-image:
|
|
54
|
-
linear-gradient(var(--
|
|
55
|
-
linear-gradient(90deg, var(--
|
|
43
|
+
linear-gradient(var(--panel-border) 1px, transparent 1px),
|
|
44
|
+
linear-gradient(90deg, var(--panel-border) 1px, transparent 1px);
|
|
56
45
|
background-size: 60px 60px; opacity: 0.5;
|
|
57
46
|
mask-image: radial-gradient(ellipse 60% 50% at 50% 50%, black 20%, transparent 70%);
|
|
58
47
|
-webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 50%, black 20%, transparent 70%);
|
|
@@ -62,7 +51,7 @@ const STYLES = `
|
|
|
62
51
|
|
|
63
52
|
.ep-rings { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-58%); pointer-events: none; }
|
|
64
53
|
.ep-ring {
|
|
65
|
-
position: absolute; border-radius: 50%; border: 2px solid var(--
|
|
54
|
+
position: absolute; border-radius: 50%; border: 2px solid var(--primary);
|
|
66
55
|
top: 50%; left: 50%; transform: translate(-50%,-50%); opacity: 0;
|
|
67
56
|
animation: ep-pulse 4s ease-out infinite;
|
|
68
57
|
}
|
|
@@ -75,7 +64,7 @@ const STYLES = `
|
|
|
75
64
|
.ep-ghost-1 { top: 12%; left: 6%; animation-delay: 0s; opacity: .15; }
|
|
76
65
|
.ep-ghost-2 { top: 60%; right: 5%; animation-delay: 4s; opacity: .12; }
|
|
77
66
|
.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:
|
|
67
|
+
.ep-ghost-card { padding: 14px 18px; border-radius: 12px; border: 1px solid rgba(148,163,184,.12); background: var(--panel-surface); width: 180px; }
|
|
79
68
|
.ep-ghost-header { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
|
|
80
69
|
.ep-ghost-dot { width: 8px; height: 8px; border-radius: 50%; background: rgba(99,102,241,.4); flex-shrink: 0; }
|
|
81
70
|
.ep-ghost-line { height: 6px; border-radius: 3px; background: rgba(148,163,184,.12); }
|
|
@@ -97,34 +86,34 @@ const STYLES = `
|
|
|
97
86
|
@keyframes ep-fade-up { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
|
|
98
87
|
|
|
99
88
|
.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:
|
|
89
|
+
.ep-digit { font-size: clamp(5rem,15vw,10rem); font-weight: 900; letter-spacing: -.04em; color: var(--text-title); opacity: 0.08; }
|
|
101
90
|
.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:
|
|
91
|
+
.ep-icon { width: clamp(3rem,9vw,5.5rem); height: clamp(3rem,9vw,5.5rem); color: var(--primary); animation: ep-icon-pulse 3s ease-in-out infinite; }
|
|
103
92
|
@keyframes ep-icon-pulse { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.08); opacity: .7; } }
|
|
104
93
|
|
|
105
|
-
.ep-headline { font-size: clamp(1.75rem,5vw,2.5rem); font-weight: 800; color:
|
|
106
|
-
.ep-subtext { font-size: 1.05rem; line-height: 1.7; color:
|
|
94
|
+
.ep-headline { font-size: clamp(1.75rem,5vw,2.5rem); font-weight: 800; color: var(--text-title); letter-spacing: -.03em; margin-bottom: .75rem; }
|
|
95
|
+
.ep-subtext { font-size: 1.05rem; line-height: 1.7; color: var(--text-muted); margin-bottom: 2.5rem; }
|
|
107
96
|
|
|
108
97
|
.ep-actions { display: flex; gap: 1rem; margin-bottom: 3rem; flex-wrap: wrap; justify-content: center; }
|
|
109
98
|
.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:
|
|
111
|
-
.ep-btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 32px
|
|
112
|
-
.ep-btn-secondary { background:
|
|
113
|
-
.ep-btn-secondary:hover { border-color:
|
|
99
|
+
.ep-btn-primary { background: var(--primary); color: #fff; box-shadow: 0 4px 24px color-mix(in srgb, var(--primary) 25%, transparent); }
|
|
100
|
+
.ep-btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 32px color-mix(in srgb, var(--primary) 35%, transparent); }
|
|
101
|
+
.ep-btn-secondary { background: var(--panel-surface); color: var(--text-title); border: 1px solid var(--panel-border); }
|
|
102
|
+
.ep-btn-secondary:hover { border-color: var(--primary); color: var(--primary); }
|
|
114
103
|
|
|
115
|
-
.ep-terminal { width: 100%; max-width: 480px; border-radius: .75rem; overflow: hidden; border: 1px solid
|
|
116
|
-
.ep-terminal-header { display: flex; align-items: center; gap: 10px; padding: 10px 16px; background:
|
|
104
|
+
.ep-terminal { width: 100%; max-width: 480px; border-radius: .75rem; overflow: hidden; border: 1px solid var(--panel-border); text-align: left; animation: ep-fade-up .8s ease-out .3s both; }
|
|
105
|
+
.ep-terminal-header { display: flex; align-items: center; gap: 10px; padding: 10px 16px; background: var(--panel-surface); border-bottom: 1px solid var(--panel-border); }
|
|
117
106
|
.ep-terminal-dots { display: flex; gap: 6px; }
|
|
118
107
|
.ep-dot { width: 10px; height: 10px; border-radius: 50%; }
|
|
119
108
|
.ep-dot-red { background: #ef4444; opacity: .7; }
|
|
120
109
|
.ep-dot-yellow { background: #eab308; opacity: .7; }
|
|
121
110
|
.ep-dot-green { background: #22c55e; opacity: .7; }
|
|
122
|
-
.ep-terminal-title { font-family: "JetBrains Mono", monospace; font-size: .7rem; color:
|
|
123
|
-
.ep-terminal-body { padding: 16px 20px; font-family: "JetBrains Mono", monospace; font-size: .78rem; line-height: 2; background:
|
|
124
|
-
.ep-log-time { color:
|
|
125
|
-
.ep-log-info { color:
|
|
126
|
-
.ep-log-path { color:
|
|
127
|
-
.ep-cursor { animation: ep-blink 1s step-end infinite; color:
|
|
111
|
+
.ep-terminal-title { font-family: "JetBrains Mono", monospace; font-size: .7rem; color: var(--text-muted); letter-spacing: .02em; }
|
|
112
|
+
.ep-terminal-body { padding: 16px 20px; font-family: "JetBrains Mono", monospace; font-size: .78rem; line-height: 2; background: var(--panel-surface); color: var(--text-muted); opacity: 0.9; }
|
|
113
|
+
.ep-log-time { color: var(--text-muted); opacity: 0.6; } .ep-log-warn { color: #f59e0b; font-weight: 700; }
|
|
114
|
+
.ep-log-info { color: var(--primary); font-weight: 700; } .ep-log-ok { color: #22c55e; font-weight: 700; }
|
|
115
|
+
.ep-log-path { color: var(--text-title); } .ep-log-link { color: var(--primary); text-decoration: underline; text-underline-offset: 2px; }
|
|
116
|
+
.ep-cursor { animation: ep-blink 1s step-end infinite; color: var(--primary); }
|
|
128
117
|
@keyframes ep-blink { 0%,100% { opacity: 1; } 50% { opacity: 0; } }
|
|
129
118
|
|
|
130
119
|
@media (max-width: 640px) { .ep-ghost { display: none; } .ep-ring-3 { display: none; } .ep-terminal { max-width: 100%; } }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorPage.js","sourceRoot":"","sources":["../../src/components/ErrorPage.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,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ErrorPage.js","sourceRoot":"","sources":["../../src/components/ErrorPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBar.d.ts","sourceRoot":"","sources":["../../src/components/FilterBar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FilterBar.d.ts","sourceRoot":"","sources":["../../src/components/FilterBar.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AASnD,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,kDAwLjE"}
|
|
@@ -15,34 +15,46 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
15
15
|
import { useState } from "react";
|
|
16
16
|
import { useSearchParams, useParams } from "react-router";
|
|
17
17
|
import { SlidersHorizontal } from "lucide-react";
|
|
18
|
-
import { useTheme } from "../theme/context";
|
|
19
18
|
import { DateRangeFilter } from "./filters/DateRangeFilter";
|
|
20
19
|
import { SelectFilter } from "./filters/SelectFilter";
|
|
21
20
|
import { TextFilter } from "./filters/TextFilter";
|
|
22
21
|
import { NumberFilter } from "./filters/NumberFilter";
|
|
23
22
|
import { BooleanFilter } from "./filters/BooleanFilter";
|
|
24
23
|
import { MultiSelectFilter } from "./filters/MultiSelectFilter";
|
|
24
|
+
import { IntervalFilter } from "./filters/IntervalFilter";
|
|
25
25
|
export function FilterBar({ filters, filterState }) {
|
|
26
26
|
const [mobileExpanded, setMobileExpanded] = useState(false);
|
|
27
27
|
const [searchParams] = useSearchParams();
|
|
28
28
|
const params = useParams();
|
|
29
29
|
const slug = params.slug ?? "";
|
|
30
|
-
const theme = useTheme();
|
|
31
30
|
// Filter out hidden filters
|
|
32
31
|
const visibleFilters = filters.filter((f) => !("hidden" in f && f.hidden));
|
|
33
32
|
if (visibleFilters.length === 0)
|
|
34
33
|
return null;
|
|
35
34
|
// Count active filters (those with non-empty values in filterState)
|
|
36
35
|
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:
|
|
36
|
+
return (_jsxs("div", { "data-filter-bar": true, children: [_jsxs("button", { type: "button", className: "md:hidden flex items-center gap-2 text-sm rounded-lg px-3 py-2", style: { color: "var(--text-muted)", backgroundColor: "var(--filter-bg)" }, 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 transition-all duration-200`, children: visibleFilters.map((filter) => {
|
|
38
37
|
const label = filter.label ?? filter.id;
|
|
39
38
|
switch (filter.type) {
|
|
40
39
|
case "daterange":
|
|
41
40
|
return (_jsx(DateRangeFilter, { id: filter.id, label: label, defaultValue: filter.default, presets: filter
|
|
42
41
|
.presets, allowCustom: filter
|
|
43
42
|
.allow_custom }, filter.id));
|
|
44
|
-
case "select":
|
|
45
|
-
|
|
43
|
+
case "select": {
|
|
44
|
+
const isMulti = "multi" in filter &&
|
|
45
|
+
filter.multi;
|
|
46
|
+
if (isMulti) {
|
|
47
|
+
const rawVal = searchParams.get(filter.id) ?? "";
|
|
48
|
+
const currentValues = rawVal
|
|
49
|
+
? rawVal
|
|
50
|
+
.split(",")
|
|
51
|
+
.map((v) => v.trim())
|
|
52
|
+
.filter(Boolean)
|
|
53
|
+
: [];
|
|
54
|
+
return (_jsx(MultiSelectFilter, { slug: slug, filter: filter, value: currentValues }, filter.id));
|
|
55
|
+
}
|
|
56
|
+
return (_jsx(SelectFilter, { id: filter.id, label: label, defaultValue: filter.default, includeAll: filter.include_all, options: filter.options, optionsQuery: !!filter.options_query, optionsQueryParams: filter.options_query?.params, refreshOn: filter.refresh_on }, filter.id));
|
|
57
|
+
}
|
|
46
58
|
case "text":
|
|
47
59
|
return (_jsx(TextFilter, { id: filter.id, label: label, placeholder: filter.placeholder }, filter.id));
|
|
48
60
|
case "integer":
|
|
@@ -62,6 +74,10 @@ export function FilterBar({ filters, filterState }) {
|
|
|
62
74
|
: [];
|
|
63
75
|
return (_jsx(MultiSelectFilter, { slug: slug, filter: filter, value: currentValues }, filter.id));
|
|
64
76
|
}
|
|
77
|
+
case "interval": {
|
|
78
|
+
const intervalFilter = filter;
|
|
79
|
+
return (_jsx(IntervalFilter, { id: filter.id, label: label, presets: intervalFilter.presets, defaultValue: intervalFilter.default }, filter.id));
|
|
80
|
+
}
|
|
65
81
|
default:
|
|
66
82
|
return null;
|
|
67
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBar.js","sourceRoot":"","sources":["../../src/components/FilterBar.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,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"FilterBar.js","sourceRoot":"","sources":["../../src/components/FilterBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationCenter.d.ts","sourceRoot":"","sources":["../../src/components/NotificationCenter.tsx"],"names":[],"mappings":"AAoBA,UAAU,uBAAuB;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAmGD,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,uBAAuB,2CA4ChF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 { ChevronDown, ChevronUp, CheckCircle, Link as LinkIcon } from "lucide-react";
|
|
17
|
+
import { useNotificationContext } from "../contexts/NotificationContext";
|
|
18
|
+
import { useTheme } from "../theme/context";
|
|
19
|
+
const TYPE_LABELS = {
|
|
20
|
+
datasource: "DATASOURCE",
|
|
21
|
+
config: "CONFIG",
|
|
22
|
+
filter: "FILTER",
|
|
23
|
+
theme: "THEME",
|
|
24
|
+
};
|
|
25
|
+
const TYPE_COLORS = {
|
|
26
|
+
datasource: "bg-red-500/20 text-red-300 border-red-500/30",
|
|
27
|
+
config: "bg-amber-500/20 text-amber-300 border-amber-500/30",
|
|
28
|
+
filter: "bg-blue-500/20 text-blue-300 border-blue-500/30",
|
|
29
|
+
theme: "bg-purple-500/20 text-purple-300 border-purple-500/30",
|
|
30
|
+
};
|
|
31
|
+
function timeAgo(isoString) {
|
|
32
|
+
const seconds = Math.floor((Date.now() - new Date(isoString).getTime()) / 1000);
|
|
33
|
+
if (seconds < 60)
|
|
34
|
+
return "just now";
|
|
35
|
+
const minutes = Math.floor(seconds / 60);
|
|
36
|
+
if (minutes < 60)
|
|
37
|
+
return `${minutes}m ago`;
|
|
38
|
+
const hours = Math.floor(minutes / 60);
|
|
39
|
+
if (hours < 24)
|
|
40
|
+
return `${hours}h ago`;
|
|
41
|
+
const days = Math.floor(hours / 24);
|
|
42
|
+
return `${days}d ago`;
|
|
43
|
+
}
|
|
44
|
+
function NotificationCard({ notification }) {
|
|
45
|
+
const [expanded, setExpanded] = useState(false);
|
|
46
|
+
const theme = useTheme();
|
|
47
|
+
const badgeColor = TYPE_COLORS[notification.type];
|
|
48
|
+
return (_jsxs("div", { className: "rounded-lg p-3 border", style: {
|
|
49
|
+
backgroundColor: theme.panel.surface,
|
|
50
|
+
borderColor: theme.panel.border,
|
|
51
|
+
}, children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: `text-[10px] font-bold uppercase tracking-wider px-1.5 py-0.5 rounded border shrink-0 ${badgeColor}`, children: TYPE_LABELS[notification.type] }), _jsx("div", { className: "flex-1 min-w-0", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-sm font-medium truncate", style: { color: theme.typography.label }, children: notification.title }), _jsx("span", { className: "text-xs shrink-0", style: { color: theme.typography.muted }, children: timeAgo(notification.firstSeen) })] }) }), _jsx("button", { type: "button", onClick: () => setExpanded(!expanded), className: "hover:opacity-80 transition shrink-0", style: { color: theme.typography.muted }, "aria-label": "Toggle details", children: expanded ? _jsx(ChevronUp, { className: "w-3.5 h-3.5" }) : _jsx(ChevronDown, { className: "w-3.5 h-3.5" }) })] }), expanded && (_jsxs("div", { className: "mt-2 pl-0", children: [_jsx("p", { className: "text-xs wrap-break-word", style: { color: theme.typography.muted }, children: notification.message }), notification.detail && notification.detail !== notification.message && (_jsx("pre", { className: "text-xs mt-1.5 whitespace-pre-wrap wrap-break-word opacity-70", style: { color: theme.typography.muted }, children: notification.detail })), notification.dashboard && (_jsxs("a", { href: `/dashboards/${notification.dashboard}`, className: "inline-flex items-center gap-1 text-xs mt-1.5", style: { color: theme.typography.link }, children: [_jsx(LinkIcon, { className: "w-3 h-3" }), notification.dashboard] }))] }))] }));
|
|
52
|
+
}
|
|
53
|
+
export function NotificationCenter({ onClose: _onClose }) {
|
|
54
|
+
const { notifications } = useNotificationContext();
|
|
55
|
+
const theme = useTheme();
|
|
56
|
+
// Sort: errors first, then by firstSeen descending
|
|
57
|
+
const sorted = [...notifications].sort((a, b) => {
|
|
58
|
+
if (a.severity !== b.severity)
|
|
59
|
+
return a.severity === "error" ? -1 : 1;
|
|
60
|
+
return new Date(b.firstSeen).getTime() - new Date(a.firstSeen).getTime();
|
|
61
|
+
});
|
|
62
|
+
return (_jsxs("div", { className: "absolute top-full right-0 mt-2 w-80 rounded-xl shadow-xl z-50 overflow-hidden border", style: {
|
|
63
|
+
backgroundColor: theme.panel.surface,
|
|
64
|
+
borderColor: theme.panel.border,
|
|
65
|
+
}, children: [_jsx("div", { className: "px-4 py-2.5 border-b", style: { borderColor: theme.panel.border }, children: _jsx("span", { className: "text-sm font-medium", style: { color: theme.typography.label }, children: "Notifications" }) }), _jsx("div", { className: "max-h-80 overflow-y-auto p-2 space-y-2", children: sorted.length === 0 ? (_jsxs("div", { className: "flex items-center justify-center gap-2 py-6", children: [_jsx(CheckCircle, { className: "w-4 h-4", style: { color: "var(--status-positive)" } }), _jsx("span", { className: "text-sm", style: { color: theme.typography.muted }, children: "All systems operational" })] })) : (sorted.map((n) => _jsx(NotificationCard, { notification: n }, n.id))) })] }));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=NotificationCenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationCenter.js","sourceRoot":"","sources":["../../src/components/NotificationCenter.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,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAO5C,MAAM,WAAW,GAAqC;IACpD,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,WAAW,GAAqC;IACpD,UAAU,EAAE,8CAA8C;IAC1D,MAAM,EAAE,oDAAoD;IAC5D,MAAM,EAAE,iDAAiD;IACzD,KAAK,EAAE,uDAAuD;CAC/D,CAAC;AAEF,SAAS,OAAO,CAAC,SAAiB;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAChF,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,UAAU,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,YAAY,EAAkC;IACxE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAElD,OAAO,CACL,eACE,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE;YACL,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;YACpC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;SAChC,aAED,eAAK,SAAS,EAAC,wBAAwB,aACrC,eACE,SAAS,EAAE,wFAAwF,UAAU,EAAE,YAE9G,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAC1B,EACP,cAAK,SAAS,EAAC,gBAAgB,YAC7B,eAAK,SAAS,EAAC,yBAAyB,aACtC,eACE,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,YAEvC,YAAY,CAAC,KAAK,GACd,EACP,eAAM,SAAS,EAAC,kBAAkB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,YACxE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,GAC3B,IACH,GACF,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EACrC,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,gBAC7B,gBAAgB,YAE1B,QAAQ,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,SAAS,EAAC,aAAa,GAAG,GACpF,IACL,EAEL,QAAQ,IAAI,CACX,eAAK,SAAS,EAAC,WAAW,aACxB,YAAG,SAAS,EAAC,yBAAyB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,YAC5E,YAAY,CAAC,OAAO,GACnB,EACH,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,OAAO,IAAI,CACtE,cACE,SAAS,EAAC,+DAA+D,EACzE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,YAEvC,YAAY,CAAC,MAAM,GAChB,CACP,EACA,YAAY,CAAC,SAAS,IAAI,CACzB,aACE,IAAI,EAAE,eAAe,YAAY,CAAC,SAAS,EAAE,EAC7C,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,aAEvC,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,EAC/B,YAAY,CAAC,SAAS,IACrB,CACL,IACG,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAA2B;IAC/E,MAAM,EAAE,aAAa,EAAE,GAAG,sBAAsB,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,mDAAmD;IACnD,MAAM,MAAM,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9C,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,eACE,SAAS,EAAC,sFAAsF,EAChG,KAAK,EAAE;YACL,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;YACpC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;SAChC,aAED,cACE,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,YAE1C,eAAM,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,8BAEvE,GACH,EAEN,cAAK,SAAS,EAAC,wCAAwC,YACpD,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACrB,eAAK,SAAS,EAAC,6CAA6C,aAC1D,KAAC,WAAW,IACV,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAC1C,EACF,eAAM,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,wCAE3D,IACH,CACP,CAAC,CAAC,CAAC,CACF,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAC,gBAAgB,IAAY,YAAY,EAAE,CAAC,IAArB,CAAC,CAAC,EAAE,CAAqB,CAAC,CACpE,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
interface NotificationIndicatorProps {
|
|
2
|
+
onClick: () => void;
|
|
3
|
+
}
|
|
4
|
+
export declare function NotificationIndicator({ onClick }: NotificationIndicatorProps): import("react/jsx-runtime").JSX.Element | null;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=NotificationIndicator.d.ts.map
|