@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.
- package/dist/cache/cache.d.ts +11 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +42 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/client.d.ts +9 -0
- package/dist/cache/client.d.ts.map +1 -0
- package/dist/cache/client.js +63 -0
- package/dist/cache/client.js.map +1 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +17 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/keys.d.ts +2 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +26 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/components/DashboardCard.d.ts +15 -0
- package/dist/components/DashboardCard.d.ts.map +1 -0
- package/dist/components/DashboardCard.js +80 -0
- package/dist/components/DashboardCard.js.map +1 -0
- package/dist/components/DashboardShell.d.ts +11 -0
- package/dist/components/DashboardShell.d.ts.map +1 -0
- package/dist/components/DashboardShell.js +115 -0
- package/dist/components/DashboardShell.js.map +1 -0
- package/dist/components/EmptyState.d.ts +6 -0
- package/dist/components/EmptyState.d.ts.map +1 -0
- package/dist/components/EmptyState.js +29 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/ErrorPage.d.ts +14 -0
- package/dist/components/ErrorPage.d.ts.map +1 -0
- package/dist/components/ErrorPage.js +132 -0
- package/dist/components/ErrorPage.js.map +1 -0
- package/dist/components/FilterBar.d.ts +8 -0
- package/dist/components/FilterBar.d.ts.map +1 -0
- package/dist/components/FilterBar.js +70 -0
- package/dist/components/FilterBar.js.map +1 -0
- package/dist/components/PanelGrid.d.ts +9 -0
- package/dist/components/PanelGrid.d.ts.map +1 -0
- package/dist/components/PanelGrid.js +26 -0
- package/dist/components/PanelGrid.js.map +1 -0
- package/dist/components/PanelWrapper.d.ts +8 -0
- package/dist/components/PanelWrapper.d.ts.map +1 -0
- package/dist/components/PanelWrapper.js +154 -0
- package/dist/components/PanelWrapper.js.map +1 -0
- package/dist/components/filters/BooleanFilter.d.ts +8 -0
- package/dist/components/filters/BooleanFilter.d.ts.map +1 -0
- package/dist/components/filters/BooleanFilter.js +36 -0
- package/dist/components/filters/BooleanFilter.js.map +1 -0
- package/dist/components/filters/CalendarGrid.d.ts +8 -0
- package/dist/components/filters/CalendarGrid.d.ts.map +1 -0
- package/dist/components/filters/CalendarGrid.js +159 -0
- package/dist/components/filters/CalendarGrid.js.map +1 -0
- package/dist/components/filters/DateRangeFilter.d.ts +10 -0
- package/dist/components/filters/DateRangeFilter.d.ts.map +1 -0
- package/dist/components/filters/DateRangeFilter.js +80 -0
- package/dist/components/filters/DateRangeFilter.js.map +1 -0
- package/dist/components/filters/FilterChips.d.ts +8 -0
- package/dist/components/filters/FilterChips.d.ts.map +1 -0
- package/dist/components/filters/FilterChips.js +94 -0
- package/dist/components/filters/FilterChips.js.map +1 -0
- package/dist/components/filters/MultiSelectFilter.d.ts +17 -0
- package/dist/components/filters/MultiSelectFilter.d.ts.map +1 -0
- package/dist/components/filters/MultiSelectFilter.js +80 -0
- package/dist/components/filters/MultiSelectFilter.js.map +1 -0
- package/dist/components/filters/NumberFilter.d.ts +10 -0
- package/dist/components/filters/NumberFilter.d.ts.map +1 -0
- package/dist/components/filters/NumberFilter.js +47 -0
- package/dist/components/filters/NumberFilter.js.map +1 -0
- package/dist/components/filters/SelectFilter.d.ts +16 -0
- package/dist/components/filters/SelectFilter.d.ts.map +1 -0
- package/dist/components/filters/SelectFilter.js +71 -0
- package/dist/components/filters/SelectFilter.js.map +1 -0
- package/dist/components/filters/TextFilter.d.ts +8 -0
- package/dist/components/filters/TextFilter.d.ts.map +1 -0
- package/dist/components/filters/TextFilter.js +57 -0
- package/dist/components/filters/TextFilter.js.map +1 -0
- package/dist/components/filters/useDropdown.d.ts +7 -0
- package/dist/components/filters/useDropdown.d.ts.map +1 -0
- package/dist/components/filters/useDropdown.js +41 -0
- package/dist/components/filters/useDropdown.js.map +1 -0
- package/dist/components/filters/useFilterUpdate.d.ts +2 -0
- package/dist/components/filters/useFilterUpdate.d.ts.map +1 -0
- package/dist/components/filters/useFilterUpdate.js +30 -0
- package/dist/components/filters/useFilterUpdate.js.map +1 -0
- package/dist/components/index.d.ts +59 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +75 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/panels/AreaChart.d.ts +7 -0
- package/dist/components/panels/AreaChart.d.ts.map +1 -0
- package/dist/components/panels/AreaChart.js +88 -0
- package/dist/components/panels/AreaChart.js.map +1 -0
- package/dist/components/panels/BarChart.d.ts +7 -0
- package/dist/components/panels/BarChart.d.ts.map +1 -0
- package/dist/components/panels/BarChart.js +99 -0
- package/dist/components/panels/BarChart.js.map +1 -0
- package/dist/components/panels/BoxPlotChart.d.ts +7 -0
- package/dist/components/panels/BoxPlotChart.d.ts.map +1 -0
- package/dist/components/panels/BoxPlotChart.js +41 -0
- package/dist/components/panels/BoxPlotChart.js.map +1 -0
- package/dist/components/panels/BulletChart.d.ts +7 -0
- package/dist/components/panels/BulletChart.d.ts.map +1 -0
- package/dist/components/panels/BulletChart.js +46 -0
- package/dist/components/panels/BulletChart.js.map +1 -0
- package/dist/components/panels/BumpChart.d.ts +7 -0
- package/dist/components/panels/BumpChart.d.ts.map +1 -0
- package/dist/components/panels/BumpChart.js +38 -0
- package/dist/components/panels/BumpChart.js.map +1 -0
- package/dist/components/panels/CalendarHeatmap.d.ts +7 -0
- package/dist/components/panels/CalendarHeatmap.d.ts.map +1 -0
- package/dist/components/panels/CalendarHeatmap.js +41 -0
- package/dist/components/panels/CalendarHeatmap.js.map +1 -0
- package/dist/components/panels/ChartTooltip.d.ts +48 -0
- package/dist/components/panels/ChartTooltip.d.ts.map +1 -0
- package/dist/components/panels/ChartTooltip.js +129 -0
- package/dist/components/panels/ChartTooltip.js.map +1 -0
- package/dist/components/panels/DonutChart.d.ts +7 -0
- package/dist/components/panels/DonutChart.d.ts.map +1 -0
- package/dist/components/panels/DonutChart.js +40 -0
- package/dist/components/panels/DonutChart.js.map +1 -0
- package/dist/components/panels/FunnelChart.d.ts +7 -0
- package/dist/components/panels/FunnelChart.d.ts.map +1 -0
- package/dist/components/panels/FunnelChart.js +32 -0
- package/dist/components/panels/FunnelChart.js.map +1 -0
- package/dist/components/panels/HeatmapChart.d.ts +7 -0
- package/dist/components/panels/HeatmapChart.d.ts.map +1 -0
- package/dist/components/panels/HeatmapChart.js +41 -0
- package/dist/components/panels/HeatmapChart.js.map +1 -0
- package/dist/components/panels/IframePanel.d.ts +6 -0
- package/dist/components/panels/IframePanel.d.ts.map +1 -0
- package/dist/components/panels/IframePanel.js +5 -0
- package/dist/components/panels/IframePanel.js.map +1 -0
- package/dist/components/panels/ImagePanel.d.ts +7 -0
- package/dist/components/panels/ImagePanel.d.ts.map +1 -0
- package/dist/components/panels/ImagePanel.js +9 -0
- package/dist/components/panels/ImagePanel.js.map +1 -0
- package/dist/components/panels/LineChart.d.ts +7 -0
- package/dist/components/panels/LineChart.d.ts.map +1 -0
- package/dist/components/panels/LineChart.js +87 -0
- package/dist/components/panels/LineChart.js.map +1 -0
- package/dist/components/panels/ListPanel.d.ts +7 -0
- package/dist/components/panels/ListPanel.d.ts.map +1 -0
- package/dist/components/panels/ListPanel.js +24 -0
- package/dist/components/panels/ListPanel.js.map +1 -0
- package/dist/components/panels/MarkdownPanel.d.ts +7 -0
- package/dist/components/panels/MarkdownPanel.d.ts.map +1 -0
- package/dist/components/panels/MarkdownPanel.js +39 -0
- package/dist/components/panels/MarkdownPanel.js.map +1 -0
- package/dist/components/panels/MetricPanel.d.ts +7 -0
- package/dist/components/panels/MetricPanel.d.ts.map +1 -0
- package/dist/components/panels/MetricPanel.js +23 -0
- package/dist/components/panels/MetricPanel.js.map +1 -0
- package/dist/components/panels/PanelEmpty.d.ts +2 -0
- package/dist/components/panels/PanelEmpty.d.ts.map +1 -0
- package/dist/components/panels/PanelEmpty.js +27 -0
- package/dist/components/panels/PanelEmpty.js.map +1 -0
- package/dist/components/panels/PanelError.d.ts +7 -0
- package/dist/components/panels/PanelError.d.ts.map +1 -0
- package/dist/components/panels/PanelError.js +21 -0
- package/dist/components/panels/PanelError.js.map +1 -0
- package/dist/components/panels/PanelSkeleton.d.ts +6 -0
- package/dist/components/panels/PanelSkeleton.d.ts.map +1 -0
- package/dist/components/panels/PanelSkeleton.js +24 -0
- package/dist/components/panels/PanelSkeleton.js.map +1 -0
- package/dist/components/panels/PieChart.d.ts +7 -0
- package/dist/components/panels/PieChart.d.ts.map +1 -0
- package/dist/components/panels/PieChart.js +40 -0
- package/dist/components/panels/PieChart.js.map +1 -0
- package/dist/components/panels/RadarChart.d.ts +7 -0
- package/dist/components/panels/RadarChart.d.ts.map +1 -0
- package/dist/components/panels/RadarChart.js +50 -0
- package/dist/components/panels/RadarChart.js.map +1 -0
- package/dist/components/panels/RadialBarChart.d.ts +7 -0
- package/dist/components/panels/RadialBarChart.d.ts.map +1 -0
- package/dist/components/panels/RadialBarChart.js +49 -0
- package/dist/components/panels/RadialBarChart.js.map +1 -0
- package/dist/components/panels/SankeyChart.d.ts +7 -0
- package/dist/components/panels/SankeyChart.d.ts.map +1 -0
- package/dist/components/panels/SankeyChart.js +39 -0
- package/dist/components/panels/SankeyChart.js.map +1 -0
- package/dist/components/panels/ScatterChart.d.ts +7 -0
- package/dist/components/panels/ScatterChart.d.ts.map +1 -0
- package/dist/components/panels/ScatterChart.js +54 -0
- package/dist/components/panels/ScatterChart.js.map +1 -0
- package/dist/components/panels/StatPanel.d.ts +8 -0
- package/dist/components/panels/StatPanel.d.ts.map +1 -0
- package/dist/components/panels/StatPanel.js +40 -0
- package/dist/components/panels/StatPanel.js.map +1 -0
- package/dist/components/panels/StreamChart.d.ts +7 -0
- package/dist/components/panels/StreamChart.d.ts.map +1 -0
- package/dist/components/panels/StreamChart.js +54 -0
- package/dist/components/panels/StreamChart.js.map +1 -0
- package/dist/components/panels/SunburstChart.d.ts +7 -0
- package/dist/components/panels/SunburstChart.d.ts.map +1 -0
- package/dist/components/panels/SunburstChart.js +60 -0
- package/dist/components/panels/SunburstChart.js.map +1 -0
- package/dist/components/panels/TablePanel.d.ts +7 -0
- package/dist/components/panels/TablePanel.d.ts.map +1 -0
- package/dist/components/panels/TablePanel.js +79 -0
- package/dist/components/panels/TablePanel.js.map +1 -0
- package/dist/components/panels/TreemapChart.d.ts +7 -0
- package/dist/components/panels/TreemapChart.d.ts.map +1 -0
- package/dist/components/panels/TreemapChart.js +59 -0
- package/dist/components/panels/TreemapChart.js.map +1 -0
- package/dist/components/panels/VideoPanel.d.ts +15 -0
- package/dist/components/panels/VideoPanel.d.ts.map +1 -0
- package/dist/components/panels/VideoPanel.js +25 -0
- package/dist/components/panels/VideoPanel.js.map +1 -0
- package/dist/components/panels/WaffleChart.d.ts +7 -0
- package/dist/components/panels/WaffleChart.d.ts.map +1 -0
- package/dist/components/panels/WaffleChart.js +46 -0
- package/dist/components/panels/WaffleChart.js.map +1 -0
- package/dist/components/panels/index.d.ts +3 -0
- package/dist/components/panels/index.d.ts.map +1 -0
- package/dist/components/panels/index.js +60 -0
- package/dist/components/panels/index.js.map +1 -0
- package/dist/components/panels/nivo-theme.d.ts +95 -0
- package/dist/components/panels/nivo-theme.d.ts.map +1 -0
- package/dist/components/panels/nivo-theme.js +140 -0
- package/dist/components/panels/nivo-theme.js.map +1 -0
- package/dist/components/panels/semantic-colors.d.ts +7 -0
- package/dist/components/panels/semantic-colors.d.ts.map +1 -0
- package/dist/components/panels/semantic-colors.js +100 -0
- package/dist/components/panels/semantic-colors.js.map +1 -0
- package/dist/components/ui/Button.d.ts +9 -0
- package/dist/components/ui/Button.d.ts.map +1 -0
- package/dist/components/ui/Button.js +40 -0
- package/dist/components/ui/Button.js.map +1 -0
- package/dist/components/ui/Tabs.d.ts +11 -0
- package/dist/components/ui/Tabs.d.ts.map +1 -0
- package/dist/components/ui/Tabs.js +28 -0
- package/dist/components/ui/Tabs.js.map +1 -0
- package/dist/connectors/bigquery.d.ts +26 -0
- package/dist/connectors/bigquery.d.ts.map +1 -0
- package/dist/connectors/bigquery.js +113 -0
- package/dist/connectors/bigquery.js.map +1 -0
- package/dist/connectors/index.d.ts +17 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +23 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/params.d.ts +15 -0
- package/dist/connectors/params.d.ts.map +1 -0
- package/dist/connectors/params.js +46 -0
- package/dist/connectors/params.js.map +1 -0
- package/dist/connectors/postgres.d.ts +29 -0
- package/dist/connectors/postgres.d.ts.map +1 -0
- package/dist/connectors/postgres.js +130 -0
- package/dist/connectors/postgres.js.map +1 -0
- package/dist/connectors/redshift-data.d.ts +25 -0
- package/dist/connectors/redshift-data.d.ts.map +1 -0
- package/dist/connectors/redshift-data.js +237 -0
- package/dist/connectors/redshift-data.js.map +1 -0
- package/dist/connectors/redshift.d.ts +29 -0
- package/dist/connectors/redshift.d.ts.map +1 -0
- package/dist/connectors/redshift.js +138 -0
- package/dist/connectors/redshift.js.map +1 -0
- package/dist/connectors/registry.d.ts +7 -0
- package/dist/connectors/registry.d.ts.map +1 -0
- package/dist/connectors/registry.js +30 -0
- package/dist/connectors/registry.js.map +1 -0
- package/dist/connectors/snowflake.d.ts +37 -0
- package/dist/connectors/snowflake.d.ts.map +1 -0
- package/dist/connectors/snowflake.js +181 -0
- package/dist/connectors/snowflake.js.map +1 -0
- package/dist/connectors/types.d.ts +41 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +15 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/connectors/url-parsers.d.ts +13 -0
- package/dist/connectors/url-parsers.d.ts.map +1 -0
- package/dist/connectors/url-parsers.js +95 -0
- package/dist/connectors/url-parsers.js.map +1 -0
- package/dist/connectors/url.d.ts +36 -0
- package/dist/connectors/url.d.ts.map +1 -0
- package/dist/connectors/url.js +139 -0
- package/dist/connectors/url.js.map +1 -0
- package/dist/filters/cascade.d.ts +13 -0
- package/dist/filters/cascade.d.ts.map +1 -0
- package/dist/filters/cascade.js +32 -0
- package/dist/filters/cascade.js.map +1 -0
- package/dist/filters/daterange.d.ts +8 -0
- package/dist/filters/daterange.d.ts.map +1 -0
- package/dist/filters/daterange.js +119 -0
- package/dist/filters/daterange.js.map +1 -0
- package/dist/filters/index.d.ts +7 -0
- package/dist/filters/index.d.ts.map +1 -0
- package/dist/filters/index.js +18 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/filters/resolver.d.ts +3 -0
- package/dist/filters/resolver.d.ts.map +1 -0
- package/dist/filters/resolver.js +122 -0
- package/dist/filters/resolver.js.map +1 -0
- package/dist/filters/validation.d.ts +17 -0
- package/dist/filters/validation.d.ts.map +1 -0
- package/dist/filters/validation.js +84 -0
- package/dist/filters/validation.js.map +1 -0
- package/dist/formats.d.ts +4 -0
- package/dist/formats.d.ts.map +1 -0
- package/dist/formats.js +127 -0
- package/dist/formats.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/auth-provider.d.ts +22 -0
- package/dist/interfaces/auth-provider.d.ts.map +1 -0
- package/dist/interfaces/auth-provider.js +15 -0
- package/dist/interfaces/auth-provider.js.map +1 -0
- package/dist/interfaces/dashboard-store.d.ts +17 -0
- package/dist/interfaces/dashboard-store.d.ts.map +1 -0
- package/dist/interfaces/dashboard-store.js +15 -0
- package/dist/interfaces/dashboard-store.js.map +1 -0
- package/dist/interfaces/datasource-store.d.ts +6 -0
- package/dist/interfaces/datasource-store.d.ts.map +1 -0
- package/dist/interfaces/datasource-store.js +15 -0
- package/dist/interfaces/datasource-store.js.map +1 -0
- package/dist/interfaces/index.d.ts +4 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +15 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/locale/context.d.ts +6 -0
- package/dist/locale/context.d.ts.map +1 -0
- package/dist/locale/context.js +23 -0
- package/dist/locale/context.js.map +1 -0
- package/dist/locale/index.d.ts +2 -0
- package/dist/locale/index.d.ts.map +1 -0
- package/dist/locale/index.js +15 -0
- package/dist/locale/index.js.map +1 -0
- package/dist/query/array-expansion.d.ts +5 -0
- package/dist/query/array-expansion.d.ts.map +1 -0
- package/dist/query/array-expansion.js +39 -0
- package/dist/query/array-expansion.js.map +1 -0
- package/dist/query/index.d.ts +8 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +20 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/pipeline.d.ts +27 -0
- package/dist/query/pipeline.d.ts.map +1 -0
- package/dist/query/pipeline.js +49 -0
- package/dist/query/pipeline.js.map +1 -0
- package/dist/query/strategy/http.d.ts +7 -0
- package/dist/query/strategy/http.d.ts.map +1 -0
- package/dist/query/strategy/http.js +26 -0
- package/dist/query/strategy/http.js.map +1 -0
- package/dist/query/strategy/index.d.ts +4 -0
- package/dist/query/strategy/index.d.ts.map +1 -0
- package/dist/query/strategy/index.js +32 -0
- package/dist/query/strategy/index.js.map +1 -0
- package/dist/query/strategy/sql.d.ts +7 -0
- package/dist/query/strategy/sql.d.ts.map +1 -0
- package/dist/query/strategy/sql.js +40 -0
- package/dist/query/strategy/sql.js.map +1 -0
- package/dist/query/strategy/types.d.ts +6 -0
- package/dist/query/strategy/types.d.ts.map +1 -0
- package/dist/query/strategy/types.js +15 -0
- package/dist/query/strategy/types.js.map +1 -0
- package/dist/query/template.d.ts +7 -0
- package/dist/query/template.d.ts.map +1 -0
- package/dist/query/template.js +36 -0
- package/dist/query/template.js.map +1 -0
- package/dist/schemas/config.d.ts +74 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +129 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/schemas/dashboard.d.ts +716 -0
- package/dist/schemas/dashboard.d.ts.map +1 -0
- package/dist/schemas/dashboard.js +314 -0
- package/dist/schemas/dashboard.js.map +1 -0
- package/dist/schemas/datasource.d.ts +252 -0
- package/dist/schemas/datasource.d.ts.map +1 -0
- package/dist/schemas/datasource.js +186 -0
- package/dist/schemas/datasource.js.map +1 -0
- package/dist/schemas/index.d.ts +5 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +18 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/theme.d.ts +36 -0
- package/dist/schemas/theme.d.ts.map +1 -0
- package/dist/schemas/theme.js +48 -0
- package/dist/schemas/theme.js.map +1 -0
- package/dist/startup/index.d.ts +3 -0
- package/dist/startup/index.d.ts.map +1 -0
- package/dist/startup/index.js +15 -0
- package/dist/startup/index.js.map +1 -0
- package/dist/startup/sql-lint.d.ts +13 -0
- package/dist/startup/sql-lint.d.ts.map +1 -0
- package/dist/startup/sql-lint.js +86 -0
- package/dist/startup/sql-lint.js.map +1 -0
- package/dist/theme/builtin.d.ts +5 -0
- package/dist/theme/builtin.d.ts.map +1 -0
- package/dist/theme/builtin.js +102 -0
- package/dist/theme/builtin.js.map +1 -0
- package/dist/theme/context.d.ts +7 -0
- package/dist/theme/context.d.ts.map +1 -0
- package/dist/theme/context.js +26 -0
- package/dist/theme/context.js.map +1 -0
- package/dist/theme/index.d.ts +3 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +16 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/loader-export.d.ts +2 -0
- package/dist/theme/loader-export.d.ts.map +1 -0
- package/dist/theme/loader-export.js +15 -0
- package/dist/theme/loader-export.js.map +1 -0
- package/dist/theme/loader.d.ts +11 -0
- package/dist/theme/loader.d.ts.map +1 -0
- package/dist/theme/loader.js +60 -0
- package/dist/theme/loader.js.map +1 -0
- 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"}
|