@prismiq/react 0.1.0 → 0.1.1
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/{CustomSQLEditor-BXB4rf1q.d.cts → CustomSQLEditor-CYlOtecq.d.ts} +10 -3
- package/dist/{CustomSQLEditor-DYeId0Gp.d.ts → CustomSQLEditor-d84v_Cgp.d.cts} +10 -3
- package/dist/{DashboardDialog-LHmrtNQU.d.cts → DashboardDialog-CZD8I-6z.d.cts} +4 -4
- package/dist/{DashboardDialog-B3vYC5Gs.d.ts → DashboardDialog-DBNTVVSp.d.ts} +4 -4
- package/dist/{accessibility-2yy5yqRR.d.cts → accessibility-Bu2mNtaB.d.cts} +1 -1
- package/dist/{accessibility-2yy5yqRR.d.ts → accessibility-Bu2mNtaB.d.ts} +1 -1
- package/dist/charts/index.cjs +27 -27
- package/dist/charts/index.d.cts +2 -2
- package/dist/charts/index.d.ts +2 -2
- package/dist/charts/index.js +2 -2
- package/dist/{chunk-MOAEEF5P.js → chunk-3LDRRDJ6.js} +185 -91
- package/dist/chunk-3LDRRDJ6.js.map +1 -0
- package/dist/{chunk-NK7HKX2J.cjs → chunk-73TPDGXB.cjs} +7 -7
- package/dist/{chunk-NK7HKX2J.cjs.map → chunk-73TPDGXB.cjs.map} +1 -1
- package/dist/{chunk-UPYINBZU.js → chunk-ET7GCREP.js} +502 -46
- package/dist/chunk-ET7GCREP.js.map +1 -0
- package/dist/{chunk-2H5WTH4K.js → chunk-FQ23KG6G.js} +3 -3
- package/dist/{chunk-2H5WTH4K.js.map → chunk-FQ23KG6G.js.map} +1 -1
- package/dist/{chunk-4AVL6GQK.cjs → chunk-KXB2IZI2.cjs} +36 -9
- package/dist/chunk-KXB2IZI2.cjs.map +1 -0
- package/dist/{chunk-EX74SI67.js → chunk-LBE6GIBC.js} +36 -9
- package/dist/chunk-LBE6GIBC.js.map +1 -0
- package/dist/{chunk-NY6TZLST.cjs → chunk-URJH4H6G.cjs} +505 -49
- package/dist/chunk-URJH4H6G.cjs.map +1 -0
- package/dist/{chunk-FEABEF3J.cjs → chunk-VQDFS6VS.cjs} +374 -280
- package/dist/chunk-VQDFS6VS.cjs.map +1 -0
- package/dist/components/index.cjs +55 -55
- package/dist/components/index.d.cts +2 -2
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.js +2 -2
- package/dist/dashboard/index.cjs +36 -36
- package/dist/dashboard/index.d.cts +3 -3
- package/dist/dashboard/index.d.ts +3 -3
- package/dist/dashboard/index.js +4 -4
- package/dist/export/index.d.cts +1 -1
- package/dist/export/index.d.ts +1 -1
- package/dist/{index-C-Qcuu4Y.d.cts → index-CvKj3SWO.d.cts} +2 -2
- package/dist/{index-rPc7ijt8.d.ts → index-DXGLs1yY.d.ts} +2 -2
- package/dist/index.cjs +127 -127
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -9
- package/dist/index.d.ts +30 -9
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/{types-WrCbOeAV.d.cts → types-j0kPJ9Hz.d.cts} +16 -1
- package/dist/{types-WrCbOeAV.d.ts → types-j0kPJ9Hz.d.ts} +16 -1
- package/dist/utils/index.cjs +15 -15
- package/dist/utils/index.d.cts +5 -21
- package/dist/utils/index.d.ts +5 -21
- package/dist/utils/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-4AVL6GQK.cjs.map +0 -1
- package/dist/chunk-EX74SI67.js.map +0 -1
- package/dist/chunk-FEABEF3J.cjs.map +0 -1
- package/dist/chunk-MOAEEF5P.js.map +0 -1
- package/dist/chunk-NY6TZLST.cjs.map +0 -1
- package/dist/chunk-UPYINBZU.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { D as DatabaseSchema, c as TableSchema, a as QueryDefinition, V as ValidationResult, Q as QueryResult, S as SQLValidationResult,
|
|
2
|
-
export { A as AggregationType,
|
|
3
|
-
import { P as PrismiqTheme, T as ThemeMode, D as DeepPartial, a as ThemeContextValue, C as ChartDataOptions, b as ChartDataResult } from './index-
|
|
4
|
-
export { A as AreaChart,
|
|
1
|
+
import { D as DatabaseSchema, c as TableSchema, d as DataSourceMeta, a as QueryDefinition, V as ValidationResult, Q as QueryResult, S as SQLValidationResult, e as Dashboard, f as DashboardCreate, g as DashboardUpdate, W as WidgetCreate, h as Widget, i as WidgetUpdate, j as WidgetPositionUpdate, k as SavedQuery, l as SavedQueryCreate, m as SavedQueryUpdate, P as PinnedDashboard, n as PinnedDashboardsResponse, R as Relationship, o as WidgetPosition } from './types-j0kPJ9Hz.js';
|
|
2
|
+
export { A as AggregationType, p as ColumnSchema, q as ColumnSelection, r as DashboardPinContextsResponse, E as ExecuteSQLRequest, F as FilterDefinition, s as FilterOperator, G as GroupByDefinition, J as JoinDefinition, t as JoinType, b as QueryTable, u as SortDefinition, v as SortDirection } from './types-j0kPJ9Hz.js';
|
|
3
|
+
import { P as PrismiqTheme, T as ThemeMode, D as DeepPartial, a as ThemeContextValue, C as ChartDataOptions, b as ChartDataResult } from './index-DXGLs1yY.js';
|
|
4
|
+
export { A as AreaChart, c as AreaChartProps, d as AxisFormat, B as BarChart, e as BarChartProps, f as BaseChartProps, g as ChartClickParams, h as ChartDataPoint, i as ChartSeries, j as ChartSuggestion, k as ChartType, E as EChartWrapper, l as EChartWrapperProps, L as LegendPosition, m as LineChart, n as LineChartProps, M as MetricCard, o as MetricCardProps, p as PieChart, q as PieChartProps, R as ReferenceLineConfig, S as ScatterChart, r as ScatterChartProps, s as Sparkline, t as SparklineProps, u as TrendConfig, v as TrendIndicator, w as TrendIndicatorProps, x as applyThemeToOption, y as createChartTheme, z as createGradientColor, F as dataPointsToChartData, G as formatAxisLabel, H as formatCompact, I as formatMetricValue, J as getChartColors, K as isChartDataEmpty, N as queryResultToChartData, O as suggestChartType, Q as toChartData } from './index-DXGLs1yY.js';
|
|
5
5
|
import { ReactNode, CSSProperties } from 'react';
|
|
6
|
-
export {
|
|
6
|
+
export { A as AggregationPicker, a as AggregationPickerProps, B as Badge, b as BadgeProps, c as Button, d as ButtonProps, C as Checkbox, e as CheckboxProps, f as ColumnNode, g as ColumnNodeProps, h as ColumnSelector, i as ColumnSelectorProps, j as CustomSQLEditor, k as CustomSQLEditorProps, D as Dialog, l as DialogFooter, m as DialogFooterProps, n as DialogHeader, o as DialogHeaderProps, p as DialogProps, q as Dropdown, r as DropdownItem, s as DropdownItemProps, t as DropdownProps, u as DropdownSeparator, v as DropdownSeparatorProps, E as EmptyDashboard, w as EmptyDashboardProps, x as EmptyState, y as EmptyStateProps, z as ErrorBoundary, F as ErrorBoundaryProps, G as ErrorFallback, H as ErrorFallbackProps, I as FilterBuilder, J as FilterBuilderProps, K as FilterRow, L as FilterRowProps, M as FilterValueInput, N as FilterValueInputProps, O as Icon, P as IconName, Q as IconProps, R as Input, S as InputProps, T as NoData, U as NoDataProps, V as NoResults, W as NoResultsProps, X as Pagination, Y as PaginationProps, Z as QueryBuilder, _ as QueryBuilderProps, $ as QueryBuilderState, a0 as QueryBuilderToolbar, a1 as QueryBuilderToolbarProps, a2 as QueryPreview, a3 as QueryPreviewProps, a4 as ResultsTable, a5 as ResultsTableProps, a6 as SavedQueryPicker, a7 as SavedQueryPickerProps, a8 as SchemaExplorer, a9 as SchemaExplorerProps, aa as Select, ab as SelectOption, ac as SelectProps, ad as SelectedColumn, ae as SelectedColumnProps, af as Skeleton, ag as SkeletonChart, ah as SkeletonChartProps, ai as SkeletonMetricCard, aj as SkeletonMetricCardProps, ak as SkeletonProps, al as SkeletonTable, am as SkeletonTableProps, an as SkeletonText, ao as SkeletonTextProps, ap as SortBuilder, aq as SortBuilderProps, ar as SortRow, as as SortRowProps, at as TableCell, au as TableCellProps, av as TableHeader, aw as TableHeaderProps, ax as TableNode, ay as TableNodeProps, az as TableRow, aA as TableRowProps, aB as Tooltip, aC as TooltipProps, aD as WidgetErrorBoundary, aE as WidgetErrorBoundaryProps } from './CustomSQLEditor-CYlOtecq.js';
|
|
7
7
|
export { ExcelCellStyle, ExcelExportOptions, ExportData, ExportOptions, UseExportOptions, UseExportResult, downloadFile, exportMultipleSheets, exportToCSV, exportToExcel, generateCSV, useExport } from './export/index.js';
|
|
8
|
-
export {
|
|
9
|
-
export { A as ArrowNavigationOptions, F as FocusTrapOptions, S as SkipLinkProps,
|
|
8
|
+
export { d as Dashboard, e as DashboardCard, f as DashboardCardProps, g as DashboardContext, h as DashboardContextValue, i as DashboardDefinition, j as DashboardDialog, k as DashboardDialogProps, l as DashboardEditor, m as DashboardEditorContextValue, n as DashboardEditorProps, o as DashboardFilter, p as DashboardFilterType, D as DashboardLayout, q as DashboardLayoutComponent, r as DashboardLayoutProps, s as DashboardList, t as DashboardListProps, u as DashboardProps, v as DashboardProvider, w as DashboardProviderProps, x as DateRangeFilter, y as DateRangeFilterProps, z as DateRangeValue, E as EditorToolbar, A as EditorToolbarProps, F as FilterBar, B as FilterBarProps, C as FilterOption, G as FilterValue, M as MultiSelectFilter, H as MultiSelectFilterProps, N as NumberRangeValue, S as SelectFilter, I as SelectFilterProps, T as TextFilter, J as TextFilterProps, U as UseAutoRefreshOptions, K as UseAutoRefreshResult, O as UseDashboardFiltersResult, P as UseFullscreenResult, Q as UseWidgetResult, V as Widget, c as WidgetConfig, X as WidgetContent, Y as WidgetContentProps, W as WidgetDefinition, _ as WidgetEditor, $ as WidgetEditorProps, a0 as WidgetHeader, a1 as WidgetHeaderProps, a3 as WidgetPalette, a4 as WidgetPaletteProps, a as WidgetPosition, a5 as WidgetProps, b as WidgetType, a6 as useAutoRefresh, a7 as useDashboard, a8 as useDashboardFilters, a9 as useFullscreen, aa as useWidget } from './DashboardDialog-DBNTVVSp.js';
|
|
9
|
+
export { A as ArrowNavigationOptions, F as FocusTrapOptions, S as SkipLinkProps, U as UseArrowNavigationResult, a as UseFocusTrapResult, b as announceToScreenReader, f as focusVisibleStyles, s as skipLinkFocusStyles, c as skipLinkStyles, u as useArrowNavigation, d as useFocusTrap, e as useFocusVisible, g as useRovingTabIndex } from './accessibility-Bu2mNtaB.js';
|
|
10
10
|
export { BREAKPOINTS, Breakpoint, ClientOnly, ClientOnlyProps, WindowSize, getLocalStorage, getWindowHeight, getWindowWidth, isBrowser, isServer, removeLocalStorage, setLocalStorage, useBreakpoint, useIsBreakpoint, useIsClient, useMediaQuery, useWindowSize } from './ssr/index.js';
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -79,6 +79,9 @@ declare class PrismiqClient {
|
|
|
79
79
|
constructor(config: ClientConfig);
|
|
80
80
|
/**
|
|
81
81
|
* Make an authenticated request to the API.
|
|
82
|
+
*
|
|
83
|
+
* @param path - API path (starting with /)
|
|
84
|
+
* @param options - Fetch options including signal for cancellation
|
|
82
85
|
*/
|
|
83
86
|
private request;
|
|
84
87
|
/**
|
|
@@ -147,6 +150,15 @@ declare class PrismiqClient {
|
|
|
147
150
|
* @returns Array of sample values.
|
|
148
151
|
*/
|
|
149
152
|
getColumnSample(tableName: string, columnName: string, limit?: number): Promise<unknown[]>;
|
|
153
|
+
/**
|
|
154
|
+
* Get data source metadata including display names and descriptions.
|
|
155
|
+
*
|
|
156
|
+
* Returns metadata for all exposed tables/views that can be used
|
|
157
|
+
* to show user-friendly names in the UI instead of raw table names.
|
|
158
|
+
*
|
|
159
|
+
* @returns Array of data source metadata.
|
|
160
|
+
*/
|
|
161
|
+
getDataSources(): Promise<DataSourceMeta[]>;
|
|
150
162
|
/**
|
|
151
163
|
* Validate a query without executing it.
|
|
152
164
|
*
|
|
@@ -166,9 +178,10 @@ declare class PrismiqClient {
|
|
|
166
178
|
*
|
|
167
179
|
* @param query - The query definition to execute.
|
|
168
180
|
* @param bypassCache - If true, bypass cache and re-execute query.
|
|
181
|
+
* @param signal - Optional AbortSignal for cancellation.
|
|
169
182
|
* @returns The query result with all rows and cache metadata.
|
|
170
183
|
*/
|
|
171
|
-
executeQuery(query: QueryDefinition, bypassCache?: boolean): Promise<QueryResult>;
|
|
184
|
+
executeQuery(query: QueryDefinition, bypassCache?: boolean, signal?: AbortSignal): Promise<QueryResult>;
|
|
172
185
|
/**
|
|
173
186
|
* Execute a query with a limited result set for previewing.
|
|
174
187
|
*
|
|
@@ -420,6 +433,8 @@ interface AnalyticsContextValue {
|
|
|
420
433
|
client: PrismiqClient;
|
|
421
434
|
/** The database schema, or null if not yet loaded. */
|
|
422
435
|
schema: DatabaseSchema | null;
|
|
436
|
+
/** Data source metadata (display names, descriptions), or empty array if not loaded. */
|
|
437
|
+
dataSources: DataSourceMeta[];
|
|
423
438
|
/** Whether the schema is currently loading. */
|
|
424
439
|
isLoading: boolean;
|
|
425
440
|
/** Error that occurred during schema loading, if any. */
|
|
@@ -515,12 +530,18 @@ interface UseSchemaResult {
|
|
|
515
530
|
tables: TableSchema[];
|
|
516
531
|
/** List of relationships between tables. */
|
|
517
532
|
relationships: Relationship[];
|
|
533
|
+
/** Data source metadata (display names, descriptions). */
|
|
534
|
+
dataSources: DataSourceMeta[];
|
|
518
535
|
/** Whether the schema is currently loading. */
|
|
519
536
|
isLoading: boolean;
|
|
520
537
|
/** Error that occurred during schema loading, if any. */
|
|
521
538
|
error: Error | null;
|
|
522
539
|
/** Get a table by name. */
|
|
523
540
|
getTable: (name: string) => TableSchema | undefined;
|
|
541
|
+
/** Get the display name for a table (returns table name if no display name configured). */
|
|
542
|
+
getDisplayName: (tableName: string) => string;
|
|
543
|
+
/** Get the description for a table (returns empty string if no description configured). */
|
|
544
|
+
getDescription: (tableName: string) => string;
|
|
524
545
|
}
|
|
525
546
|
/**
|
|
526
547
|
* Hook for accessing the database schema.
|
|
@@ -1432,4 +1453,4 @@ declare function PinnedDashboardView({ context, selectedDashboard, onBack, onSel
|
|
|
1432
1453
|
|
|
1433
1454
|
declare const VERSION = "0.1.0";
|
|
1434
1455
|
|
|
1435
|
-
export { type AnalyticsCallbacks, type AnalyticsContextValue, AnalyticsProvider, type AnalyticsProviderProps, ChartDataOptions, ChartDataResult, type ClientConfig, DashboardCreate, DashboardUpdate, DatabaseSchema, DeepPartial, type MutationState, PinButton, type PinButtonProps, type PinContextOption, PinMenu, type PinMenuProps, type PinMutationState, PinnedDashboard, type PinnedDashboardItemActions, PinnedDashboardList, type PinnedDashboardListProps, PinnedDashboardView, type PinnedDashboardViewProps, PinnedDashboardsResponse, PrismiqClient, PrismiqError, PrismiqTheme, QueryDefinition, QueryResult, Relationship, SQLValidationResult, SavedQuery, SavedQueryCreate, SavedQueryUpdate, TableSchema, ThemeContextValue, ThemeMode, ThemeProvider, type ThemeProviderProps, type UseCustomSQLOptions, type UseCustomSQLResult, type UseDashboardMutationsResult, type UseDashboardOptions, type UseDashboardPinStatusOptions, type UseDashboardPinStatusResult, type UseDashboardResult, type UseDashboardsOptions, type UseDashboardsResult, type UsePinMutationsResult, type UsePinnedDashboardsOptions, type UsePinnedDashboardsResult, type UseQueryOptions, type UseQueryResult, type UseSavedQueriesOptions, type UseSavedQueriesResult, type UseSchemaResult, VERSION, ValidationResult, darkTheme, lightTheme, useAnalytics, useAnalyticsCallbacks, useChartData, useCustomSQL, useDashboard as useDashboardData, useDashboardMutations, useDashboardPinStatus, useDashboards, usePinMutations, usePinnedDashboards, useQuery, useSavedQueries, useSchema, useTheme };
|
|
1456
|
+
export { type AnalyticsCallbacks, type AnalyticsContextValue, AnalyticsProvider, type AnalyticsProviderProps, ChartDataOptions, ChartDataResult, type ClientConfig, DashboardCreate, DashboardUpdate, DataSourceMeta, DatabaseSchema, DeepPartial, type MutationState, PinButton, type PinButtonProps, type PinContextOption, PinMenu, type PinMenuProps, type PinMutationState, PinnedDashboard, type PinnedDashboardItemActions, PinnedDashboardList, type PinnedDashboardListProps, PinnedDashboardView, type PinnedDashboardViewProps, PinnedDashboardsResponse, PrismiqClient, PrismiqError, PrismiqTheme, QueryDefinition, QueryResult, Relationship, SQLValidationResult, SavedQuery, SavedQueryCreate, SavedQueryUpdate, TableSchema, ThemeContextValue, ThemeMode, ThemeProvider, type ThemeProviderProps, type UseCustomSQLOptions, type UseCustomSQLResult, type UseDashboardMutationsResult, type UseDashboardOptions, type UseDashboardPinStatusOptions, type UseDashboardPinStatusResult, type UseDashboardResult, type UseDashboardsOptions, type UseDashboardsResult, type UsePinMutationsResult, type UsePinnedDashboardsOptions, type UsePinnedDashboardsResult, type UseQueryOptions, type UseQueryResult, type UseSavedQueriesOptions, type UseSavedQueriesResult, type UseSchemaResult, VERSION, ValidationResult, darkTheme, lightTheme, useAnalytics, useAnalyticsCallbacks, useChartData, useCustomSQL, useDashboard as useDashboardData, useDashboardMutations, useDashboardPinStatus, useDashboards, usePinMutations, usePinnedDashboards, useQuery, useSavedQueries, useSchema, useTheme };
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Dashboard } from './chunk-
|
|
2
|
-
export { Dashboard, DashboardCard, DashboardContext, DashboardDialog, DashboardEditor, DashboardLayout as DashboardLayoutComponent, DashboardList, DashboardProvider, DateRangeFilter, EditorToolbar, FilterBar, MultiSelectFilter, SelectFilter, TextFilter, Widget, WidgetContent, WidgetEditor, WidgetHeader, WidgetPalette, useAutoRefresh, useDashboard, useDashboardFilters, useFullscreen, useWidget } from './chunk-
|
|
3
|
-
export { AreaChart, BarChart, EChartWrapper, LineChart, MetricCard, PieChart, ScatterChart, Sparkline, TrendIndicator, applyThemeToOption, createChartTheme, createGradientColor, dataPointsToChartData, formatAxisLabel, formatCompact, formatMetricValue, getChartColors, isChartDataEmpty, queryResultToChartData, suggestChartType, toChartData } from './chunk-
|
|
4
|
-
import { useDashboardPinStatus, usePinMutations, usePinnedDashboards } from './chunk-
|
|
5
|
-
export { AggregationPicker, AnalyticsProvider, Badge, Button, Checkbox, ColumnNode, ColumnSelector, CustomSQLEditor, Dialog, DialogFooter, DialogHeader, Dropdown, DropdownItem, DropdownSeparator, EmptyDashboard, EmptyState, ErrorBoundary, ErrorFallback, FilterBuilder, FilterRow, FilterValueInput, Icon, Input, NoData, NoResults, Pagination, PrismiqClient, PrismiqError, QueryBuilder, QueryBuilderToolbar, QueryPreview, ResultsTable, SavedQueryPicker, SchemaExplorer, Select, SelectedColumn, Skeleton, SkeletonChart, SkeletonMetricCard, SkeletonTable, SkeletonText, SortBuilder, SortRow, TableCell, TableHeader, TableNode, TableRow, Tooltip, WidgetErrorBoundary, useAnalytics, useAnalyticsCallbacks, useChartData, useCustomSQL, useDashboard as useDashboardData, useDashboardMutations, useDashboardPinStatus, useDashboards, usePinMutations, usePinnedDashboards, useQuery, useSavedQueries, useSchema } from './chunk-
|
|
1
|
+
import { Dashboard } from './chunk-3LDRRDJ6.js';
|
|
2
|
+
export { Dashboard, DashboardCard, DashboardContext, DashboardDialog, DashboardEditor, DashboardLayout as DashboardLayoutComponent, DashboardList, DashboardProvider, DateRangeFilter, EditorToolbar, FilterBar, MultiSelectFilter, SelectFilter, TextFilter, Widget, WidgetContent, WidgetEditor, WidgetHeader, WidgetPalette, useAutoRefresh, useDashboard, useDashboardFilters, useFullscreen, useWidget } from './chunk-3LDRRDJ6.js';
|
|
3
|
+
export { AreaChart, BarChart, EChartWrapper, LineChart, MetricCard, PieChart, ScatterChart, Sparkline, TrendIndicator, applyThemeToOption, createChartTheme, createGradientColor, dataPointsToChartData, formatAxisLabel, formatCompact, formatMetricValue, getChartColors, isChartDataEmpty, queryResultToChartData, suggestChartType, toChartData } from './chunk-FQ23KG6G.js';
|
|
4
|
+
import { useDashboardPinStatus, usePinMutations, usePinnedDashboards } from './chunk-ET7GCREP.js';
|
|
5
|
+
export { AggregationPicker, AnalyticsProvider, Badge, Button, Checkbox, ColumnNode, ColumnSelector, CustomSQLEditor, Dialog, DialogFooter, DialogHeader, Dropdown, DropdownItem, DropdownSeparator, EmptyDashboard, EmptyState, ErrorBoundary, ErrorFallback, FilterBuilder, FilterRow, FilterValueInput, Icon, Input, NoData, NoResults, Pagination, PrismiqClient, PrismiqError, QueryBuilder, QueryBuilderToolbar, QueryPreview, ResultsTable, SavedQueryPicker, SchemaExplorer, Select, SelectedColumn, Skeleton, SkeletonChart, SkeletonMetricCard, SkeletonTable, SkeletonText, SortBuilder, SortRow, TableCell, TableHeader, TableNode, TableRow, Tooltip, WidgetErrorBoundary, useAnalytics, useAnalyticsCallbacks, useChartData, useCustomSQL, useDashboard as useDashboardData, useDashboardMutations, useDashboardPinStatus, useDashboards, usePinMutations, usePinnedDashboards, useQuery, useSavedQueries, useSchema } from './chunk-ET7GCREP.js';
|
|
6
6
|
export { ThemeProvider, darkTheme, lightTheme, useTheme } from './chunk-T6STUE7E.js';
|
|
7
7
|
export { downloadFile, exportMultipleSheets, exportToCSV, exportToExcel, generateCSV, useExport } from './chunk-WWTT2OJ5.js';
|
|
8
8
|
export { BREAKPOINTS, ClientOnly, getLocalStorage, getWindowHeight, getWindowWidth, isBrowser, isServer, removeLocalStorage, setLocalStorage, useBreakpoint, useIsBreakpoint, useIsClient, useMediaQuery, useWindowSize } from './chunk-JTCBZDHY.js';
|
|
9
|
-
export { announceToScreenReader, focusVisibleStyles, skipLinkFocusStyles, skipLinkStyles, useArrowNavigation, useFocusTrap, useFocusVisible, useRovingTabIndex } from './chunk-
|
|
9
|
+
export { announceToScreenReader, focusVisibleStyles, skipLinkFocusStyles, skipLinkStyles, useArrowNavigation, useFocusTrap, useFocusVisible, useRovingTabIndex } from './chunk-LBE6GIBC.js';
|
|
10
10
|
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
11
11
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
12
12
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pins/PinButton.tsx","../src/pins/PinMenu.tsx","../src/pins/PinnedDashboardList.tsx","../src/pins/PinnedDashboardView.tsx","../src/index.ts"],"names":["errorStyles","PinIcon","jsxs","jsx","useState","useCallback","error","UnpinIcon","containerStyles","titleStyles","unpinButtonStyles","contentStyles","errorBannerStyles"],"mappings":";;;;;;;;;;;;AAuCA,IAAM,OAAA,GAAU,CAAC,EAAE,MAAA,EAAQ,MAAK,qBAC9B,IAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM,SAAS,cAAA,GAAiB,MAAA;AAAA,IAChC,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,UAAA,EAAW,CAAA;AAAA,sBACnB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qLAAA,EAAsL;AAAA;AAAA;AAChM,CAAA;AAOF,IAAM,UAAA,GAA4B;AAAA,EAChC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,2BAAA;AAAA,EACL,UAAA,EAAY,0BAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,uCAAA;AAAA,EACR,eAAA,EAAiB,8BAAA;AAAA,EACjB,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,2DAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,UAAA,GAAyE;AAAA,EAC7E,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,2BAAA;AAAA,IACT,QAAA,EAAU,6BAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,2BAAA;AAAA,IACT,QAAA,EAAU,+BAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,EAAA,EAAI;AAAA,IACF,OAAA,EAAS,2BAAA;AAAA,IACT,QAAA,EAAU,6BAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,SAAA,EAAW;AAAA;AAEf,CAAA;AAEA,IAAM,YAAA,GAA8B;AAAA,EAClC,eAAA,EAAiB,6CAAA;AAAA,EACjB,WAAA,EAAa,8BAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,cAAA,GAAgC;AAAA,EACpC,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,SAAA,GAAiE;AAAA,EACrE,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAuBO,SAAS,SAAA,CAAU;AAAA,EACxB,WAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR,UAAA,GAAa,OAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,IAAA;AAAA,EACP,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAe,WAAW,aAAA,EAAe,OAAA,KAAY,qBAAA,CAAsB;AAAA,IAC3F;AAAA,GACD,CAAA;AACD,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,aAAA,KAAkB,eAAA,EAAgB;AAC7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAuB,IAAI,CAAA;AAGjE,EAAA,MAAM,QAAA,GAAW,cAAc,OAAO,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,iBAAiB,aAAA,CAAc,SAAA;AAEjD,EAAA,MAAM,WAAA,GAAc,YAAY,YAAY;AAC1C,IAAA,IAAI,SAAA,EAAW;AAEf,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,CAAM,aAAa,OAAO,CAAA;AAChC,QAAA,WAAA,GAAc,KAAK,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,CAAI,aAAa,OAAO,CAAA;AAC9B,QAAA,WAAA,GAAc,IAAI,CAAA;AAAA,MACpB;AAEA,MAAA,MAAM,OAAA,EAAQ;AAAA,IAChB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,EAAS,QAAA,EAAU,WAAW,GAAA,EAAK,KAAA,EAAO,WAAA,EAAa,OAAO,CAAC,CAAA;AAEhF,EAAA,MAAMA,YAAAA,GAA6B;AAAA,IACjC,WAAA,EAAa,4BAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,MAAM,cAAA,GAAgC;AAAA,IACpC,GAAG,UAAA;AAAA,IACH,GAAG,WAAW,IAAI,CAAA;AAAA,IAClB,GAAI,QAAA,GAAW,YAAA,GAAe,EAAC;AAAA,IAC/B,GAAI,SAAA,GAAY,cAAA,GAAiB,EAAC;AAAA,IAClC,GAAI,WAAA,GAAcA,YAAAA,GAAc,EAAC;AAAA,IACjC,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,QAAA,GAAW,UAAU,IAAI,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAe,WAAW,UAAA,GAAa,KAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,WAAA,GAAc,CAAA,OAAA,EAAU,WAAA,CAAY,OAAO,CAAA,CAAA,GAAK,MAAA;AACrE,EAAA,MAAM,eAAA,GAAkB,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,MAAA,CAAA;AACnE,EAAA,MAAM,YAAA,GAAe,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,MAAA,CAAA;AAEhE,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,EAOH,CAAA;AAAA,oBACA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU,SAAA;AAAA,QACV,SAAA;AAAA,QACA,KAAA,EAAO,cAAA;AAAA,QACP,cAAA,EAAc,QAAA;AAAA,QACd,YAAA,EAAY,eAAA;AAAA,QACZ,cAAA,EAAc,cAAc,IAAA,GAAO,MAAA;AAAA,QACnC,KAAA,EAAO,YAAA;AAAA,QAEN,QAAA,EAAA;AAAA,UAAA,SAAA,mBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,cAAA;AAAA,gBACT,KAAA,EAAO,QAAA;AAAA,gBACP,MAAA,EAAQ,QAAA;AAAA,gBACR,MAAA,EAAQ,wBAAA;AAAA,gBACR,gBAAA,EAAkB,aAAA;AAAA,gBAClB,YAAA,EAAc,KAAA;AAAA,gBACd,SAAA,EAAW;AAAA;AACb;AAAA,8BAGF,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,MAAM,QAAA,EAAU,CAAA;AAAA,UAE5C,CAAC,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,EAAa;AAAA;AAAA;AAAA;AACpC,GAAA,EACF,CAAA;AAEJ;ACxNA,IAAM,iBAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,2CAAA;AAAA,EACjB,KAAA,EAAO,4BAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,YAAA,EAAc;AAChB,CAAA;AAiCA,IAAMC,QAAAA,GAAU,CAAC,EAAE,IAAA,uBACjBC,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,sBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qLAAA,EAAsL;AAAA;AAAA;AAChM,CAAA;AAGF,IAAM,eAAA,GAAkB,CAAC,EAAE,IAAA,uBACzBA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AACzB,CAAA;AAGF,IAAM,SAAA,GAAY,CAAC,EAAE,IAAA,uBACnBA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAA,EAAkB;AAAA;AAC5B,CAAA;AAOF,IAAM,aAAA,GAA+B;AAAA,EACnC,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,+BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,uCAAA;AAAA,EACR,eAAA,EAAiB,8BAAA;AAAA,EACjB,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,4CAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,UAAA,GAA4B;AAAA,EAChC,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,MAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,2BAAA;AAAA,EACX,QAAA,EAAU,GAAA;AAAA,EACV,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,SAAA,EAAW,4DAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,cAAA,GAAgC;AAAA,EACpC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,2BAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,wBAAA;AAAA,EACZ,MAAA,EAAQ,MAAA;AAAA,EACR,eAAA,EAAiB,aAAA;AAAA,EACjB,KAAA,EAAO,MAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,cAAA,GAAgC;AAAA,EACpC,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,uCAAA;AAAA,EACR,eAAA,EAAiB,8BAAA;AAAA,EACjB,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,qBAAA,GAAuC;AAAA,EAC3C,GAAG,cAAA;AAAA,EACH,eAAA,EAAiB,8BAAA;AAAA,EACjB,WAAA,EAAa,8BAAA;AAAA,EACb,KAAA,EAAO;AACT,CAAA;AAuBO,SAAS,OAAA,CAAQ;AAAA,EACtB,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACjE,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAEhD,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,aAAA,KAAkB,qBAAA,CAAsB;AAAA,IAC5E;AAAA,GACD,CAAA;AACD,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,aAAA,KAAkB,eAAA,EAAgB;AAE7D,EAAA,MAAM,SAAA,GAAY,iBAAiB,aAAA,CAAc,SAAA;AAGjD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,MAAA,IAAI,YAAA,CAAa,WAAW,CAAC,YAAA,CAAa,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAAG;AAChF,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAyB;AAC7C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,YAAY,CAAA;AACjD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,YAAY,CAAA;AAAA,IACnE;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,YAAA,GAAeC,WAAAA,CAAY,CAAC,GAAA,KAAgB;AAChD,IAAA,OAAO,YAAY;AACjB,MAAA,IAAI,SAAA,EAAW;AAEf,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,SAAS,GAAG,CAAA;AAC3B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,KAAA,CAAM,aAAa,GAAG,CAAA;AAC5B,UAAA,WAAA,GAAc,KAAK,KAAK,CAAA;AAAA,QAC1B,CAAA,MAAO;AACL,UAAA,MAAM,GAAA,CAAI,aAAa,GAAG,CAAA;AAC1B,UAAA,WAAA,GAAc,KAAK,IAAI,CAAA;AAAA,QACzB;AACA,QAAA,MAAM,OAAA,EAAQ;AAAA,MAChB,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAA,EAAqC,GAAA,EAAK,GAAG,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,QAAA,EAAU,WAAW,GAAA,EAAK,KAAA,EAAO,WAAA,EAAa,OAAO,CAAC,CAAA;AAGvE,EAAA,MAAM,WAAA,GAAc,SAAS,MAAA,CAAO,CAAC,QAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA;AAE/D,EAAA,uBACEH,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA;AAAA,MACA,OAAO,EAAE,QAAA,EAAU,YAAY,OAAA,EAAS,cAAA,EAAgB,GAAG,KAAA,EAAM;AAAA,MAEjE,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,YAChC,KAAA,EAAO,aAAA;AAAA,YACP,eAAA,EAAc,MAAA;AAAA,YACd,eAAA,EAAe,MAAA;AAAA,YAEf,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAACF,QAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,8BACnBC,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,gBAAA,KAAA;AAAA,gBAAI,WAAA,GAAc,CAAA,GAAI,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,CAAA,GAAM;AAAA,eAAA,EAAG,CAAA;AAAA,8BACrDC,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AAAA,SAC7B;AAAA,QAEC,0BACCD,IAAAA,CAAC,SAAI,KAAA,EAAO,UAAA,EAAY,MAAK,MAAA,EAC1B,QAAA,EAAA;AAAA,UAAA,WAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAmB,QAAA,EAAA;AAAA,YAAA,UAAA;AAAA,YACpB,WAAA,CAAY;AAAA,WAAA,EACvB,CAAA;AAAA,UAED,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ;AACrB,YAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC9B,YAAA,uBACEA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,kBAAA;AAAA,gBACL,cAAA,EAAc,MAAA;AAAA,gBACd,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAAA,gBAC5B,QAAA,EAAU,SAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,GAAG,cAAA;AAAA,kBACH,OAAA,EAAS,YAAY,GAAA,GAAM;AAAA,iBAC7B;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,GAAS,qBAAA,GAAwB,cAAA,EAC3C,QAAA,EAAA,MAAA,oBAAUA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,CAAA,EAClC,CAAA;AAAA,kBACC,GAAA,CAAI,IAAA,oBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAO,EAAI,QAAA,EAAA,GAAA,CAAI,IAAA,EAAK,CAAA;AAAA,kCACzDA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM;AAAA;AAAA,eAAA;AAAA,cAfZ,GAAA,CAAI;AAAA,aAgBX;AAAA,UAEJ,CAAC;AAAA,SAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACnSA,IAAM,aAAA,GAAgB,sBACpBD,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAK,CAAA,EAAE,GAAA,EAAI,GAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA;AAAA,sBACvCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,GAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA;AAAA,sBACxCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,GAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,CAAA;AAAA,sBACzCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,GAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI;AAAA;AAAA;AAC1C,CAAA;AAGF,IAAM,SAAA,GAAY,sBAChBD,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,sBACrBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,sBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iGAAA,EAAkG,CAAA;AAAA,sBAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB,CAAA;AAAA,sBAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB;AAAA;AAAA;AAC/B,CAAA;AAOF,IAAM,eAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,UAAA,GAA4B;AAAA,EAChC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,8BAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,eAAA,GAAiC;AAAA,EACrC,eAAA,EAAiB,6CAAA;AAAA,EACjB,WAAA,EAAa,8BAAA;AAAA,EACb,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,iBAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,eAAA,EAAiB,6CAAA;AAAA,EACjB,KAAA,EAAO,8BAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,aAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,WAAA,GAA6B;AAAA,EACjC,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,+BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,iBAAA,GAAmC;AAAA,EACvC,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,SAAA,EAAW,2BAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,iBAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,uBAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,qCAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,gBAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS,2BAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,aAAA,GAA+B;AAAA,EACnC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,WAAA,GAA6B;AAAA,EACjC,OAAA,EAAS,2BAAA;AAAA,EACT,eAAA,EAAiB,2CAAA;AAAA,EACjB,KAAA,EAAO,4BAAA;AAAA,EACP,YAAA,EAAc,0BAAA;AAAA,EACd,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAwBO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,EAAE,YAAY,SAAA,EAAW,KAAA,EAAO,SAAQ,GAAI,mBAAA,CAAoB,EAAE,OAAA,EAAS,CAAA;AACjF,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,aAAA,KAAkB,eAAA,EAAgB;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIC,SAAuB,IAAI,CAAA;AAE/D,EAAA,MAAM,WAAA,GAAcC,WAAAA;AAAA,IAClB,CAAC,WAAA,KAAwB;AACvB,MAAA,OAAO,OAAO,KAAA,KAA4B;AACxC,QAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,CAAM,aAAa,OAAO,CAAA;AAChC,UAAA,MAAM,OAAA,EAAQ;AAAA,QAChB,SAAS,GAAA,EAAK;AACZ,UAAA,MAAMC,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,UAAA,aAAA,CAAcA,MAAK,CAAA;AACnB,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,WAAA,EAAa,GAAG,CAAA;AAAA,QAC9D;AAAA,MACF,CAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,OAAO;AAAA,GAC1B;AAGA,EAAA,MAAM,iBAAA,GAAoBD,WAAAA;AAAA,IACxB,CAAC,WAAA,KAA+C;AAC9C,MAAA,OAAO,YAAY;AACjB,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,CAAM,aAAa,OAAO,CAAA;AAChC,UAAA,MAAM,OAAA,EAAQ;AAAA,QAChB,SAAS,GAAA,EAAK;AACZ,UAAA,MAAMC,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,UAAA,aAAA,CAAcA,MAAK,CAAA;AACnB,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,WAAA,EAAa,GAAG,CAAA;AAC5D,UAAA,MAAMA,MAAAA;AAAA,QACR;AAAA,MACF,CAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,OAAO;AAAA,GAC1B;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA,EAOH,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,eACV,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,cAAA;AAAA,YACT,KAAA,EAAO,EAAA;AAAA,YACP,MAAA,EAAQ,EAAA;AAAA,YACR,MAAA,EAAQ,uCAAA;AAAA,YACR,cAAA,EAAgB,8BAAA;AAAA,YAChB,YAAA,EAAc,KAAA;AAAA,YACd,SAAA,EAAW;AAAA;AACb;AAAA,OACF,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAM,EAC/D,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,WAAA,EAAa,QAAA,EAAA;AAAA,MAAA,oCAAA;AAAA,MACY,KAAA,CAAM;AAAA,KAAA,EAC3C,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,WAAA,GAAc,UAAA,mBAClBA,IAAAA,CAAC,SAAI,KAAA,EAAO,EAAE,GAAG,WAAA,EAAa,SAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,UAAA,EAAY,UAAS,EACnG,QAAA,EAAA;AAAA,oBAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,MAAA,mBAAA;AAAA,MAAkB,UAAA,CAAW;AAAA,KAAA,EAAQ,CAAA;AAAA,oBAC3CC,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,QACjC,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,MAAA;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,MAAA,EAAQ,SAAA;AAAA,UACR,KAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU,6BAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QACA,YAAA,EAAW,eAAA;AAAA,QACZ,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA,GACE,IAAA;AAEJ,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,IACxD,QAAA,EAAA,UAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,gBAAA,EACV,QAAA,EAAA;AAAA,sBAAAC,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,sBACfA,IAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,iCAAA,IAAqC,QAAA,EAAA,sBAAA,EAEzD;AAAA,KAAA,EACF,CAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,KAAA,EAAM,EAC9D,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,IACA,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc;AAC7B,MAAA,MAAM,OAAA,GAAsC;AAAA,QAC1C,KAAA,EAAO,iBAAA,CAAkB,SAAA,CAAU,EAAE;AAAA,OACvC;AAEA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,uBACEC,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,QAAA,CAAS,SAAS,CAAA;AAAA,YACjC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,CAAA;AAAA,YACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,QAAA,CAAS,SAAS,CAAA;AAAA,cACpB;AAAA,YACF,CAAA;AAAA,YAEC,QAAA,EAAA,UAAA,CAAW,WAAW,OAAO;AAAA,WAAA;AAAA,UAXzB,SAAA,CAAU;AAAA,SAYjB;AAAA,MAEJ;AAEA,MAAA,uBACED,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,UAAA;AAAA,UACP,OAAA,EAAS,MAAM,QAAA,CAAS,SAAS,CAAA;AAAA,UACjC,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,YAAA,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,aAAA,CAAc,KAAA,EAAO,eAAe,CAAA;AAAA,UACtD,CAAA;AAAA,UACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,YAAA,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,aAAA,CAAc,KAAA,EAAO,UAAU,CAAA;AAAA,UACjD,CAAA;AAAA,UACA,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,QAAA,CAAS,SAAS,CAAA;AAAA,YACpB;AAAA,UACF,CAAA;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,mBACV,QAAA,kBAAAA,GAAAA,CAAC,iBAAc,CAAA,EACjB,CAAA;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,WAAA,EAAc,oBAAU,IAAA,EAAK,CAAA;AAAA,cACvC,SAAA,CAAU,+BACTA,GAAAA,CAAC,OAAE,KAAA,EAAO,iBAAA,EAAoB,oBAAU,WAAA,EAAY;AAAA,aAAA,EAExD,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,WAAA,CAAY,SAAA,CAAU,EAAE,CAAA;AAAA,gBACjC,UAAU,aAAA,CAAc,SAAA;AAAA,gBACxB,KAAA,EAAO;AAAA,kBACL,GAAG,iBAAA;AAAA,kBACH,OAAA,EAAS,aAAA,CAAc,SAAA,GAAY,GAAA,GAAM;AAAA,iBAC3C;AAAA,gBACA,KAAA,EAAM,OAAA;AAAA,gBACN,YAAA,EAAW,iBAAA;AAAA,gBAEX,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA;AACb;AAAA,SAAA;AAAA,QAvCK,SAAA,CAAU;AAAA,OAwCjB;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ;AC5WA,IAAM,QAAA,GAAW,sBACfD,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,sBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA;AAAA;AAC3B,CAAA;AAGF,IAAMI,UAAAA,GAAY,sBAChBL,IAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IAEf,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,sBACrBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,sBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iGAAA,EAAkG,CAAA;AAAA,sBAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB,CAAA;AAAA,sBAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB;AAAA;AAAA;AAC/B,CAAA;AAOF,IAAMK,gBAAAA,GAAiC;AAAA,EACrC,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,YAAA,GAA8B;AAAA,EAClC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,2BAAA;AAAA,EACT,YAAA,EAAc,uCAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,gBAAA,GAAkC;AAAA,EACtC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,YAAAA,GAA6B;AAAA,EACjC,IAAA,EAAM,CAAA;AAAA,EACN,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,kBAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS,qDAAA;AAAA,EACT,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,eAAA,EAAiB,aAAA;AAAA,EACjB,MAAA,EAAQ,uCAAA;AAAA,EACR,YAAA,EAAc,0BAAA;AAAA,EACd,KAAA,EAAO,iCAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA;AAEA,IAAMC,cAAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,mBAAA,GAAqC;AAAA,EACzC,OAAA,EAAS;AACX,CAAA;AAEA,IAAMC,kBAAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,qDAAA;AAAA,EACT,eAAA,EAAiB,2CAAA;AAAA,EACjB,KAAA,EAAO,4BAAA;AAAA,EACP,UAAA,EAAY,0BAAA;AAAA,EACZ,QAAA,EAAU,6BAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,cAAA,EAAgB,eAAA;AAAA,EAChB,UAAA,EAAY;AACd,CAAA;AA8BO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,iBAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA,GAAY,MAAA;AAAA,EACZ,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,aAAA,KAAkB,eAAA,EAAgB;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIR,SAAuB,IAAI,CAAA;AAE/D,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,CAAM,iBAAA,CAAkB,EAAA,EAAI,OAAO,CAAA;AACzC,MAAA,MAAA,EAAO;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,iBAAA,CAAkB,EAAA,EAAI,GAAG,CAAA;AAAA,IACvE;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA,uBACED,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGK,gBAAAA,EAAiB,GAAG,KAAA,IACzD,QAAA,kBAAAL,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,qBACV,QAAA,kBAAAA,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA;AAAA,OAEJ,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAGM,gBAAAA,EAAiB,GAAG,KAAA,EAAM,EAC9D,QAAA,EAAA;AAAA,IAAA,UAAA,oBACCN,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOU,kBAAAA,EACV,QAAA,EAAA;AAAA,sBAAAV,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,mBAAA;AAAA,QAAkB,UAAA,CAAW;AAAA,OAAA,EAAQ,CAAA;AAAA,sBAC3CC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,UACjC,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,MAAA;AAAA,YACZ,MAAA,EAAQ,MAAA;AAAA,YACR,MAAA,EAAQ,SAAA;AAAA,YACR,KAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAU,6BAAA;AAAA,YACV,UAAA,EAAY;AAAA,WACd;AAAA,UACA,YAAA,EAAW,eAAA;AAAA,UACZ,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEFD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,KAAA,EAAO,gBAAA;AAAA,UAEP,QAAA,EAAA;AAAA,4BAAAC,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,4BACVA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,EAAU;AAAA;AAAA;AAAA,OACnB;AAAA,sBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAOM,YAAAA,EAAc,4BAAkB,IAAA,EAAK,CAAA;AAAA,MAC/C,6BACCP,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,UAAU,aAAA,CAAc,SAAA;AAAA,UACxB,KAAA,EAAO;AAAA,YACL,GAAGQ,kBAAAA;AAAA,YACH,OAAA,EAAS,aAAA,CAAc,SAAA,GAAY,GAAA,GAAM;AAAA,WAC3C;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAP,GAAAA,CAACI,YAAA,EAAU,CAAA;AAAA,4BACXJ,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,OAAA,EAAK;AAAA;AAAA;AAAA;AACb,KAAA,EAEJ,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOQ,cAAAA,EACV,QAAA,kBAAAR,GAAAA,CAAC,SAAA,EAAA,EAAU,EAAA,EAAI,iBAAA,CAAkB,EAAA,EAAI,CAAA,EACvC;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACgPO,IAAM,OAAA,GAAU","file":"index.js","sourcesContent":["/**\n * PinButton component.\n *\n * A button to pin/unpin a dashboard to a specific context.\n */\n\nimport { useCallback, useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { useDashboardPinStatus, usePinMutations } from '../hooks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PinButtonProps {\n /** Dashboard ID to pin/unpin. */\n dashboardId: string;\n /** Context to pin to (e.g., \"accounts\", \"dashboard\"). */\n context: string;\n /** Label text (default: \"Pin\"). */\n label?: string;\n /** Label when pinned (default: \"Unpin\"). */\n unpinLabel?: string;\n /** Show as icon only (no label). */\n iconOnly?: boolean;\n /** Size variant. */\n size?: 'sm' | 'md' | 'lg';\n /** Called after pin/unpin completes. */\n onPinChange?: (isPinned: boolean) => void;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst PinIcon = ({ filled, size }: { filled: boolean; size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6a2 2 0 0 1 2-2h0a2 2 0 0 0 2-2H5a2 2 0 0 0 2 2h0a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontWeight: 500,\n borderRadius: 'var(--prismiq-radius-md)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s, opacity 0.15s',\n outline: 'none',\n};\n\nconst sizeStyles: Record<NonNullable<PinButtonProps['size']>, CSSProperties> = {\n sm: {\n padding: 'var(--prismiq-spacing-xs)',\n fontSize: 'var(--prismiq-font-size-sm)',\n minWidth: 28,\n minHeight: 28,\n },\n md: {\n padding: 'var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-base)',\n minWidth: 36,\n minHeight: 36,\n },\n lg: {\n padding: 'var(--prismiq-spacing-md)',\n fontSize: 'var(--prismiq-font-size-lg)',\n minWidth: 44,\n minHeight: 44,\n },\n};\n\nconst pinnedStyles: CSSProperties = {\n backgroundColor: 'var(--prismiq-color-primary-light, #e3f2fd)',\n borderColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-primary)',\n};\n\nconst disabledStyles: CSSProperties = {\n opacity: 0.5,\n cursor: 'not-allowed',\n};\n\nconst iconSizes: Record<NonNullable<PinButtonProps['size']>, number> = {\n sm: 14,\n md: 16,\n lg: 20,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Button to pin/unpin a dashboard to a context.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <PinButton dashboardId={dashboard.id} context=\"accounts\" />\n *\n * // Icon only with custom label\n * <PinButton\n * dashboardId={dashboard.id}\n * context=\"dashboard\"\n * iconOnly\n * onPinChange={(isPinned) => console.log('Pinned:', isPinned)}\n * />\n * ```\n */\nexport function PinButton({\n dashboardId,\n context,\n label = 'Pin',\n unpinLabel = 'Unpin',\n iconOnly = false,\n size = 'md',\n onPinChange,\n className,\n style,\n}: PinButtonProps): ReactNode {\n const { isPinned: checkIsPinned, isLoading: statusLoading, refetch } = useDashboardPinStatus({\n dashboardId,\n });\n const { pin, unpin, state: mutationState } = usePinMutations();\n const [actionError, setActionError] = useState<Error | null>(null);\n\n // Use fetched state directly to avoid race conditions with optimistic updates\n const isPinned = checkIsPinned(context);\n const isLoading = statusLoading || mutationState.isLoading;\n\n const handleClick = useCallback(async () => {\n if (isLoading) return;\n\n setActionError(null);\n try {\n if (isPinned) {\n await unpin(dashboardId, context);\n onPinChange?.(false);\n } else {\n await pin(dashboardId, context);\n onPinChange?.(true);\n }\n // Refresh status after mutation\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setActionError(error);\n console.error('Failed to toggle pin:', err);\n }\n }, [dashboardId, context, isPinned, isLoading, pin, unpin, onPinChange, refetch]);\n\n const errorStyles: CSSProperties = {\n borderColor: 'var(--prismiq-color-error)',\n color: 'var(--prismiq-color-error)',\n };\n\n const combinedStyles: CSSProperties = {\n ...baseStyles,\n ...sizeStyles[size],\n ...(isPinned ? pinnedStyles : {}),\n ...(isLoading ? disabledStyles : {}),\n ...(actionError ? errorStyles : {}),\n ...style,\n };\n\n const iconSize = iconSizes[size];\n const displayLabel = isPinned ? unpinLabel : label;\n const errorMessage = actionError ? `Error: ${actionError.message}` : undefined;\n const accessibleLabel = errorMessage ?? (iconOnly ? displayLabel : undefined);\n const tooltipTitle = errorMessage ?? (iconOnly ? displayLabel : undefined);\n\n return (\n <>\n <style>\n {`\n @keyframes prismiq-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isLoading}\n className={className}\n style={combinedStyles}\n aria-pressed={isPinned}\n aria-label={accessibleLabel}\n aria-invalid={actionError ? true : undefined}\n title={tooltipTitle}\n >\n {isLoading ? (\n <span\n style={{\n display: 'inline-block',\n width: iconSize,\n height: iconSize,\n border: '2px solid currentColor',\n borderRightColor: 'transparent',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.6s linear infinite',\n }}\n />\n ) : (\n <PinIcon filled={isPinned} size={iconSize} />\n )}\n {!iconOnly && <span>{displayLabel}</span>}\n </button>\n </>\n );\n}\n","/**\n * PinMenu component.\n *\n * A dropdown menu showing multiple pin contexts with checkboxes.\n */\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\n\nimport { useDashboardPinStatus, usePinMutations } from '../hooks';\n\n// ============================================================================\n// Error Banner Styles\n// ============================================================================\n\nconst errorBannerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n borderRadius: 'var(--prismiq-radius-sm)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-xs)',\n marginBottom: 'var(--prismiq-spacing-xs)',\n};\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Configuration for a pin context option. */\nexport interface PinContextOption {\n /** Unique context identifier (e.g., \"accounts\", \"dashboard\"). */\n id: string;\n /** Display label for the context. */\n label: string;\n /** Optional icon to display. */\n icon?: ReactNode;\n}\n\nexport interface PinMenuProps {\n /** Dashboard ID to pin/unpin. */\n dashboardId: string;\n /** Available contexts to pin to. */\n contexts: PinContextOption[];\n /** Called after pin state changes. */\n onPinChange?: (context: string, isPinned: boolean) => void;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst PinIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6a2 2 0 0 1 2-2h0a2 2 0 0 0 2-2H5a2 2 0 0 0 2 2h0a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst ChevronDownIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\nconst CheckIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst triggerStyles: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n borderRadius: 'var(--prismiq-radius-md)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s',\n outline: 'none',\n};\n\nconst menuStyles: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 'var(--prismiq-spacing-xs)',\n minWidth: 200,\n padding: 'var(--prismiq-spacing-xs)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n boxShadow: 'var(--prismiq-shadow-lg, 0 10px 15px -3px rgba(0,0,0,0.1))',\n zIndex: 50,\n};\n\nconst menuItemStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text)',\n borderRadius: 'var(--prismiq-radius-sm)',\n cursor: 'pointer',\n transition: 'background-color 0.15s',\n border: 'none',\n backgroundColor: 'transparent',\n width: '100%',\n textAlign: 'left',\n};\n\nconst checkboxStyles: CSSProperties = {\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--prismiq-radius-sm)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n flexShrink: 0,\n};\n\nconst checkedCheckboxStyles: CSSProperties = {\n ...checkboxStyles,\n backgroundColor: 'var(--prismiq-color-primary)',\n borderColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-text-inverse)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Dropdown menu showing multiple pin contexts with checkboxes.\n *\n * @example\n * ```tsx\n * const PIN_CONTEXTS = [\n * { id: 'dashboard', label: 'Dashboard' },\n * { id: 'accounts', label: 'Accounts' },\n * ];\n *\n * <PinMenu\n * dashboardId={dashboard.id}\n * contexts={PIN_CONTEXTS}\n * onPinChange={(ctx, pinned) => console.log(ctx, pinned)}\n * />\n * ```\n */\nexport function PinMenu({\n dashboardId,\n contexts,\n onPinChange,\n className,\n style,\n}: PinMenuProps): ReactNode {\n const [isOpen, setIsOpen] = useState(false);\n const [toggleError, setToggleError] = useState<Error | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { isPinned, refetch, isLoading: statusLoading } = useDashboardPinStatus({\n dashboardId,\n });\n const { pin, unpin, state: mutationState } = usePinMutations();\n\n const isLoading = statusLoading || mutationState.isLoading;\n\n // Clear error when menu closes\n useEffect(() => {\n if (!isOpen) {\n setToggleError(null);\n }\n }, [isOpen]);\n\n // Close menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Close on escape\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n const handleToggle = useCallback((ctx: string) => {\n return async () => {\n if (isLoading) return;\n\n setToggleError(null);\n try {\n const pinned = isPinned(ctx);\n if (pinned) {\n await unpin(dashboardId, ctx);\n onPinChange?.(ctx, false);\n } else {\n await pin(dashboardId, ctx);\n onPinChange?.(ctx, true);\n }\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setToggleError(error);\n console.error('Failed to toggle pin for context:', ctx, err);\n }\n };\n }, [dashboardId, isPinned, isLoading, pin, unpin, onPinChange, refetch]);\n\n // Count pinned contexts\n const pinnedCount = contexts.filter((ctx) => isPinned(ctx.id)).length;\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{ position: 'relative', display: 'inline-block', ...style }}\n >\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n style={triggerStyles}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n >\n <PinIcon size={16} />\n <span>Pin{pinnedCount > 0 ? ` (${pinnedCount})` : ''}</span>\n <ChevronDownIcon size={14} />\n </button>\n\n {isOpen && (\n <div style={menuStyles} role=\"menu\">\n {toggleError && (\n <div style={errorBannerStyles}>\n Failed: {toggleError.message}\n </div>\n )}\n {contexts.map((ctx) => {\n const pinned = isPinned(ctx.id);\n return (\n <button\n key={ctx.id}\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={pinned}\n onClick={handleToggle(ctx.id)}\n disabled={isLoading}\n style={{\n ...menuItemStyles,\n opacity: isLoading ? 0.5 : 1,\n }}\n >\n <span style={pinned ? checkedCheckboxStyles : checkboxStyles}>\n {pinned && <CheckIcon size={12} />}\n </span>\n {ctx.icon && <span style={{ display: 'flex' }}>{ctx.icon}</span>}\n <span>{ctx.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","/**\n * PinnedDashboardList component.\n *\n * Displays a list of dashboards pinned to a context.\n */\n\nimport { useCallback, useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { usePinnedDashboards, usePinMutations } from '../hooks';\nimport type { Dashboard } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Props for custom rendering of a list item. */\nexport interface PinnedDashboardItemActions {\n /** Unpin this dashboard from the context. Returns a promise. */\n unpin: () => Promise<void>;\n}\n\nexport interface PinnedDashboardListProps {\n /** Context to show pins for (e.g., \"accounts\", \"dashboard\"). */\n context: string;\n /** Called when user selects a dashboard. */\n onSelect: (dashboard: Dashboard) => void;\n /** Custom empty state element. */\n emptyState?: ReactNode;\n /** Custom render function for each item. */\n renderItem?: (dashboard: Dashboard, actions: PinnedDashboardItemActions) => ReactNode;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst DashboardIcon = (): ReactNode => (\n <svg\n width={20}\n height={20}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </svg>\n);\n\nconst UnpinIcon = (): ReactNode => (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 2 22 22\" />\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9\" />\n <path d=\"M15 6V4a2 2 0 0 1 2-2\" />\n <path d=\"M9 4a2 2 0 0 0-2 2\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst itemStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-md)',\n padding: 'var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n};\n\nconst itemHoverStyles: CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface-hover, #f5f5f5)',\n borderColor: 'var(--prismiq-color-primary)',\n boxShadow: 'var(--prismiq-shadow-sm, 0 1px 2px rgba(0,0,0,0.05))',\n};\n\nconst iconWrapperStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 40,\n height: 40,\n backgroundColor: 'var(--prismiq-color-primary-light, #e3f2fd)',\n color: 'var(--prismiq-color-primary)',\n borderRadius: 'var(--prismiq-radius-md)',\n flexShrink: 0,\n};\n\nconst contentStyles: CSSProperties = {\n flex: 1,\n minWidth: 0,\n};\n\nconst titleStyles: CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst descriptionStyles: CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n margin: 0,\n marginTop: 'var(--prismiq-spacing-xs)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst unpinButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n padding: 0,\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n borderRadius: 'var(--prismiq-radius-sm)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n flexShrink: 0,\n};\n\nconst emptyStateStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n textAlign: 'center',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst loadingStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n};\n\nconst errorStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n borderRadius: 'var(--prismiq-radius-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * List of dashboards pinned to a context.\n *\n * @example\n * ```tsx\n * function AccountsDashboards() {\n * const [selected, setSelected] = useState<Dashboard | null>(null);\n *\n * return (\n * <PinnedDashboardList\n * context=\"accounts\"\n * onSelect={setSelected}\n * emptyState={<p>No pinned dashboards</p>}\n * />\n * );\n * }\n * ```\n */\nexport function PinnedDashboardList({\n context,\n onSelect,\n emptyState,\n renderItem,\n className,\n style,\n}: PinnedDashboardListProps): ReactNode {\n const { dashboards, isLoading, error, refetch } = usePinnedDashboards({ context });\n const { unpin, state: mutationState } = usePinMutations();\n const [unpinError, setUnpinError] = useState<Error | null>(null);\n\n const handleUnpin = useCallback(\n (dashboardId: string) => {\n return async (event: React.MouseEvent) => {\n event.stopPropagation();\n setUnpinError(null);\n try {\n await unpin(dashboardId, context);\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', dashboardId, err);\n }\n };\n },\n [context, unpin, refetch]\n );\n\n // Create async unpin handler for renderItem actions\n const createUnpinAction = useCallback(\n (dashboardId: string): (() => Promise<void>) => {\n return async () => {\n setUnpinError(null);\n try {\n await unpin(dashboardId, context);\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', dashboardId, err);\n throw error; // Re-throw so caller can handle if needed\n }\n };\n },\n [context, unpin, refetch]\n );\n\n if (isLoading) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <style>\n {`\n @keyframes prismiq-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n <div style={loadingStyles}>\n <span\n style={{\n display: 'inline-block',\n width: 24,\n height: 24,\n border: '2px solid var(--prismiq-color-border)',\n borderTopColor: 'var(--prismiq-color-primary)',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.6s linear infinite',\n }}\n />\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={errorStyles}>\n Failed to load pinned dashboards: {error.message}\n </div>\n </div>\n );\n }\n\n // Show unpin error as a dismissible message\n const errorBanner = unpinError ? (\n <div style={{ ...errorStyles, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <span>Failed to unpin: {unpinError.message}</span>\n <button\n type=\"button\"\n onClick={() => setUnpinError(null)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n fontSize: 'var(--prismiq-font-size-lg)',\n lineHeight: 1,\n }}\n aria-label=\"Dismiss error\"\n >\n ×\n </button>\n </div>\n ) : null;\n\n if (!dashboards || dashboards.length === 0) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {emptyState || (\n <div style={emptyStateStyles}>\n <DashboardIcon />\n <p style={{ margin: 'var(--prismiq-spacing-sm) 0 0 0' }}>\n No pinned dashboards\n </p>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {errorBanner}\n {dashboards.map((dashboard) => {\n const actions: PinnedDashboardItemActions = {\n unpin: createUnpinAction(dashboard.id),\n };\n\n if (renderItem) {\n return (\n <div\n key={dashboard.id}\n onClick={() => onSelect(dashboard)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(dashboard);\n }\n }}\n >\n {renderItem(dashboard, actions)}\n </div>\n );\n }\n\n return (\n <div\n key={dashboard.id}\n style={itemStyles}\n onClick={() => onSelect(dashboard)}\n onMouseEnter={(e) => {\n Object.assign(e.currentTarget.style, itemHoverStyles);\n }}\n onMouseLeave={(e) => {\n Object.assign(e.currentTarget.style, itemStyles);\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(dashboard);\n }\n }}\n >\n <div style={iconWrapperStyles}>\n <DashboardIcon />\n </div>\n <div style={contentStyles}>\n <h3 style={titleStyles}>{dashboard.name}</h3>\n {dashboard.description && (\n <p style={descriptionStyles}>{dashboard.description}</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleUnpin(dashboard.id)}\n disabled={mutationState.isLoading}\n style={{\n ...unpinButtonStyles,\n opacity: mutationState.isLoading ? 0.5 : 1,\n }}\n title=\"Unpin\"\n aria-label=\"Unpin dashboard\"\n >\n <UnpinIcon />\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * PinnedDashboardView component.\n *\n * Full view with pinned dashboard list and selected dashboard display.\n */\n\nimport { useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { Dashboard } from '../dashboard';\nimport { usePinMutations } from '../hooks';\nimport type { Dashboard as DashboardType } from '../types';\n\nimport { PinnedDashboardList } from './PinnedDashboardList';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PinnedDashboardViewProps {\n /** Context this view is for (for unpin action). */\n context: string;\n /** Dashboard to display (null = show list). */\n selectedDashboard: DashboardType | null;\n /** Called when user clicks back or closes. */\n onBack: () => void;\n /** Called when user selects from list. */\n onSelect: (dashboard: DashboardType) => void;\n /** Show unpin button in header. */\n showUnpin?: boolean;\n /** Custom back button label. */\n backLabel?: string;\n /** Custom empty state for list. */\n emptyState?: ReactNode;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst BackIcon = (): ReactNode => (\n <svg\n width={20}\n height={20}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 12H5\" />\n <path d=\"m12 19-7-7 7-7\" />\n </svg>\n);\n\nconst UnpinIcon = (): ReactNode => (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 2 22 22\" />\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9\" />\n <path d=\"M15 6V4a2 2 0 0 1 2-2\" />\n <path d=\"M9 4a2 2 0 0 0-2 2\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n};\n\nconst headerStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-md)',\n padding: 'var(--prismiq-spacing-md)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst backButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s',\n};\n\nconst titleStyles: CSSProperties = {\n flex: 1,\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-lg)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst unpinButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n backgroundColor: 'transparent',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n};\n\nconst contentStyles: CSSProperties = {\n flex: 1,\n overflow: 'auto',\n};\n\nconst listContainerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n};\n\nconst errorBannerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Full view with pinned dashboard list and dashboard display.\n *\n * When no dashboard is selected, shows the list. When a dashboard\n * is selected, shows the dashboard with a back button.\n *\n * @example\n * ```tsx\n * function AccountsDashboardSection() {\n * const [selected, setSelected] = useState<Dashboard | null>(null);\n *\n * return (\n * <PinnedDashboardView\n * context=\"accounts\"\n * selectedDashboard={selected}\n * onSelect={setSelected}\n * onBack={() => setSelected(null)}\n * backLabel=\"Back to Accounts\"\n * emptyState={<p>Pin dashboards from Analytics.</p>}\n * />\n * );\n * }\n * ```\n */\nexport function PinnedDashboardView({\n context,\n selectedDashboard,\n onBack,\n onSelect,\n showUnpin = true,\n backLabel = 'Back',\n emptyState,\n className,\n style,\n}: PinnedDashboardViewProps): ReactNode {\n const { unpin, state: mutationState } = usePinMutations();\n const [unpinError, setUnpinError] = useState<Error | null>(null);\n\n const handleUnpin = async () => {\n if (!selectedDashboard) return;\n setUnpinError(null);\n try {\n await unpin(selectedDashboard.id, context);\n onBack();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', selectedDashboard.id, err);\n }\n };\n\n // Show list when no dashboard selected\n if (!selectedDashboard) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={listContainerStyles}>\n <PinnedDashboardList\n context={context}\n onSelect={onSelect}\n emptyState={emptyState}\n />\n </div>\n </div>\n );\n }\n\n // Show selected dashboard with header\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {unpinError && (\n <div style={errorBannerStyles}>\n <span>Failed to unpin: {unpinError.message}</span>\n <button\n type=\"button\"\n onClick={() => setUnpinError(null)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n fontSize: 'var(--prismiq-font-size-lg)',\n lineHeight: 1,\n }}\n aria-label=\"Dismiss error\"\n >\n ×\n </button>\n </div>\n )}\n <div style={headerStyles}>\n <button\n type=\"button\"\n onClick={onBack}\n style={backButtonStyles}\n >\n <BackIcon />\n <span>{backLabel}</span>\n </button>\n <h2 style={titleStyles}>{selectedDashboard.name}</h2>\n {showUnpin && (\n <button\n type=\"button\"\n onClick={handleUnpin}\n disabled={mutationState.isLoading}\n style={{\n ...unpinButtonStyles,\n opacity: mutationState.isLoading ? 0.5 : 1,\n }}\n >\n <UnpinIcon />\n <span>Unpin</span>\n </button>\n )}\n </div>\n <div style={contentStyles}>\n <Dashboard id={selectedDashboard.id} />\n </div>\n </div>\n );\n}\n","/**\n * @prismiq/react - React SDK for Prismiq embedded analytics\n *\n * @example\n * ```tsx\n * import {\n * AnalyticsProvider,\n * ThemeProvider,\n * QueryBuilder,\n * BarChart,\n * Dashboard,\n * useQuery\n * } from '@prismiq/react';\n *\n * function App() {\n * return (\n * <ThemeProvider>\n * <AnalyticsProvider config={{ endpoint: 'https://api.example.com' }}>\n * <Dashboard id=\"my-dashboard\" />\n * </AnalyticsProvider>\n * </ThemeProvider>\n * );\n * }\n * ```\n *\n * For modular imports (smaller bundle size):\n * ```tsx\n * import { BarChart } from '@prismiq/react/charts';\n * import { Dashboard } from '@prismiq/react/dashboard';\n * import { useIsClient } from '@prismiq/react/ssr';\n * import { useFocusTrap } from '@prismiq/react/utils';\n * import { exportToCSV } from '@prismiq/react/export';\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n // Schema types\n ColumnSchema,\n TableSchema,\n Relationship,\n DatabaseSchema,\n // Query types\n QueryTable,\n JoinType,\n JoinDefinition,\n AggregationType,\n ColumnSelection,\n FilterOperator,\n FilterDefinition,\n SortDirection,\n SortDefinition,\n GroupByDefinition,\n QueryDefinition,\n // Result types\n QueryResult,\n ValidationResult,\n // Saved query types\n SavedQuery,\n SavedQueryCreate,\n SavedQueryUpdate,\n // Custom SQL types\n ExecuteSQLRequest,\n SQLValidationResult,\n // Pin types\n PinnedDashboard,\n PinnedDashboardsResponse,\n DashboardPinContextsResponse,\n // Dashboard mutation types\n DashboardCreate,\n DashboardUpdate,\n} from './types';\n\n// ============================================================================\n// API Client\n// ============================================================================\n\nexport { PrismiqClient, PrismiqError } from './api';\nexport type { ClientConfig } from './api';\n\n// ============================================================================\n// Theme\n// ============================================================================\n\nexport { ThemeProvider, useTheme, lightTheme, darkTheme } from './theme';\nexport type {\n PrismiqTheme,\n ThemeMode,\n ThemeContextValue,\n ThemeProviderProps,\n DeepPartial,\n} from './theme';\n\n// ============================================================================\n// Context\n// ============================================================================\n\nexport { AnalyticsProvider, useAnalytics, useAnalyticsCallbacks } from './context';\nexport type {\n AnalyticsContextValue,\n AnalyticsProviderProps,\n AnalyticsCallbacks,\n} from './context';\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport {\n useSchema,\n useQuery,\n useChartData,\n useDashboards,\n useDashboard as useDashboardData,\n useDashboardMutations,\n useSavedQueries,\n useCustomSQL,\n usePinnedDashboards,\n usePinMutations,\n useDashboardPinStatus,\n} from './hooks';\nexport type {\n UseSchemaResult,\n UseQueryResult,\n UseQueryOptions,\n UseDashboardsOptions,\n UseDashboardsResult,\n UseDashboardOptions,\n UseDashboardResult,\n MutationState,\n UseDashboardMutationsResult,\n UseSavedQueriesOptions,\n UseSavedQueriesResult,\n UseCustomSQLOptions,\n UseCustomSQLResult,\n UsePinnedDashboardsOptions,\n UsePinnedDashboardsResult,\n PinMutationState,\n UsePinMutationsResult,\n UseDashboardPinStatusOptions,\n UseDashboardPinStatusResult,\n} from './hooks';\n\n// ============================================================================\n// Charts\n// ============================================================================\n\nexport {\n // Base wrapper\n EChartWrapper,\n // Chart components\n MetricCard,\n TrendIndicator,\n Sparkline,\n BarChart,\n LineChart,\n AreaChart,\n PieChart,\n ScatterChart,\n // Auto suggest\n suggestChartType,\n // Utilities\n queryResultToChartData,\n dataPointsToChartData,\n toChartData,\n createChartTheme,\n applyThemeToOption,\n formatAxisLabel,\n formatCompact,\n formatMetricValue,\n getChartColors,\n createGradientColor,\n isChartDataEmpty,\n} from './charts';\n\nexport type {\n // Data types\n ChartDataPoint,\n ChartSeries,\n // Base props\n BaseChartProps,\n ChartClickParams,\n ReferenceLineConfig,\n AxisFormat,\n LegendPosition,\n EChartWrapperProps,\n // Chart-specific props\n BarChartProps,\n LineChartProps,\n AreaChartProps,\n PieChartProps,\n ScatterChartProps,\n // MetricCard\n TrendConfig,\n MetricCardProps,\n TrendIndicatorProps,\n SparklineProps,\n // Hook types\n ChartDataOptions,\n ChartDataResult,\n // Auto suggest\n ChartType,\n ChartSuggestion,\n} from './charts';\n\n// ============================================================================\n// UI Components\n// ============================================================================\n\nexport {\n // Base UI\n Button,\n Input,\n Select,\n Checkbox,\n Badge,\n Tooltip,\n Dropdown,\n DropdownItem,\n DropdownSeparator,\n Icon,\n Dialog,\n DialogHeader,\n DialogFooter,\n // Skeleton Loading\n Skeleton,\n SkeletonText,\n SkeletonChart,\n SkeletonTable,\n SkeletonMetricCard,\n // Error Boundaries\n ErrorBoundary,\n ErrorFallback,\n WidgetErrorBoundary,\n // Empty States\n EmptyState,\n NoData,\n NoResults,\n EmptyDashboard,\n // Schema Explorer\n SchemaExplorer,\n TableNode,\n ColumnNode,\n // Column Selector\n ColumnSelector,\n SelectedColumn,\n // Filter Builder\n FilterBuilder,\n FilterRow,\n FilterValueInput,\n // Sort Builder\n SortBuilder,\n SortRow,\n // Aggregation Picker\n AggregationPicker,\n // Results Table\n ResultsTable,\n TableHeader,\n TableRow,\n TableCell,\n Pagination,\n // Query Builder\n QueryBuilder,\n QueryBuilderToolbar,\n QueryPreview,\n // Saved Queries\n SavedQueryPicker,\n // Custom SQL\n CustomSQLEditor,\n} from './components';\n\nexport type {\n // Base UI\n ButtonProps,\n InputProps,\n SelectProps,\n SelectOption,\n CheckboxProps,\n BadgeProps,\n TooltipProps,\n DropdownProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n IconProps,\n IconName,\n DialogProps,\n DialogHeaderProps,\n DialogFooterProps,\n // Skeleton Loading\n SkeletonProps,\n SkeletonTextProps,\n SkeletonChartProps,\n SkeletonTableProps,\n SkeletonMetricCardProps,\n // Error Boundaries\n ErrorBoundaryProps,\n ErrorFallbackProps,\n WidgetErrorBoundaryProps,\n // Empty States\n EmptyStateProps,\n NoDataProps,\n NoResultsProps,\n EmptyDashboardProps,\n // Schema Explorer\n SchemaExplorerProps,\n TableNodeProps,\n ColumnNodeProps,\n // Column Selector\n ColumnSelectorProps,\n SelectedColumnProps,\n // Filter Builder\n FilterBuilderProps,\n FilterRowProps,\n FilterValueInputProps,\n // Sort Builder\n SortBuilderProps,\n SortRowProps,\n // Aggregation Picker\n AggregationPickerProps,\n // Results Table\n ResultsTableProps,\n TableHeaderProps,\n TableRowProps,\n TableCellProps,\n PaginationProps,\n // Query Builder\n QueryBuilderProps,\n QueryBuilderState,\n QueryBuilderToolbarProps,\n QueryPreviewProps,\n // Saved Queries\n SavedQueryPickerProps,\n // Custom SQL\n CustomSQLEditorProps,\n} from './components';\n\n// ============================================================================\n// Export Utilities\n// ============================================================================\n\nexport {\n // CSV export\n exportToCSV,\n generateCSV,\n downloadFile,\n // Excel export\n exportToExcel,\n exportMultipleSheets,\n // Hook\n useExport,\n} from './export';\n\nexport type {\n ExportOptions,\n ExcelExportOptions,\n ExcelCellStyle,\n ExportData,\n UseExportOptions,\n UseExportResult,\n} from './export';\n\n// ============================================================================\n// Dashboard\n// ============================================================================\n\nexport {\n // Main components\n Dashboard,\n DashboardProvider,\n DashboardLayoutComponent,\n // Widget components\n Widget,\n WidgetHeader,\n WidgetContent,\n // Filter components\n FilterBar,\n DateRangeFilter,\n SelectFilter,\n MultiSelectFilter,\n TextFilter,\n // Editor components\n DashboardEditor,\n EditorToolbar,\n WidgetPalette,\n WidgetEditor,\n // List components\n DashboardList,\n DashboardCard,\n DashboardDialog,\n // Hooks\n useDashboard,\n useDashboardFilters,\n useWidget,\n useAutoRefresh,\n useFullscreen,\n // Context\n DashboardContext,\n} from './dashboard';\n\nexport type {\n // Widget types\n WidgetType,\n WidgetPosition,\n WidgetConfig,\n WidgetDefinition,\n // Filter types\n DashboardFilterType,\n FilterOption,\n DashboardFilter,\n FilterValue,\n DateRangeValue,\n NumberRangeValue,\n // Dashboard types\n DashboardLayout,\n DashboardDefinition,\n // Context types\n DashboardContextValue,\n DashboardEditorContextValue,\n // Component props\n DashboardProviderProps,\n DashboardProps,\n DashboardEditorProps,\n DashboardLayoutProps,\n WidgetProps,\n WidgetHeaderProps,\n FilterBarProps,\n DateRangeFilterProps,\n SelectFilterProps,\n MultiSelectFilterProps,\n TextFilterProps,\n WidgetPaletteProps,\n WidgetEditorProps,\n WidgetContentProps,\n EditorToolbarProps,\n // List component props\n DashboardListProps,\n DashboardCardProps,\n DashboardDialogProps,\n // Hook result types\n UseDashboardFiltersResult,\n UseWidgetResult,\n UseAutoRefreshOptions,\n UseAutoRefreshResult,\n UseFullscreenResult,\n} from './dashboard';\n\n// ============================================================================\n// Accessibility Utilities\n// ============================================================================\n\nexport {\n useFocusTrap,\n useArrowNavigation,\n useRovingTabIndex,\n useFocusVisible,\n announceToScreenReader,\n focusVisibleStyles,\n skipLinkStyles,\n skipLinkFocusStyles,\n} from './utils';\n\nexport type {\n FocusTrapOptions,\n ArrowNavigationOptions,\n UseFocusTrapResult,\n UseArrowNavigationResult,\n SkipLinkProps,\n} from './utils';\n\n// ============================================================================\n// SSR Utilities\n// ============================================================================\n\nexport {\n useIsClient,\n ClientOnly,\n getWindowWidth,\n getWindowHeight,\n isBrowser,\n isServer,\n getLocalStorage,\n setLocalStorage,\n removeLocalStorage,\n useWindowSize,\n useMediaQuery,\n useBreakpoint,\n useIsBreakpoint,\n BREAKPOINTS,\n} from './ssr';\n\nexport type {\n ClientOnlyProps,\n WindowSize,\n Breakpoint,\n} from './ssr';\n\n// ============================================================================\n// Pin Components\n// ============================================================================\n\nexport {\n PinButton,\n PinMenu,\n PinnedDashboardList,\n PinnedDashboardView,\n} from './pins';\n\nexport type {\n PinButtonProps,\n PinMenuProps,\n PinContextOption,\n PinnedDashboardListProps,\n PinnedDashboardItemActions,\n PinnedDashboardViewProps,\n} from './pins';\n\n// ============================================================================\n// Version\n// ============================================================================\n\nexport const VERSION = '0.1.0';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/pins/PinButton.tsx","../src/pins/PinMenu.tsx","../src/pins/PinnedDashboardList.tsx","../src/pins/PinnedDashboardView.tsx","../src/index.ts"],"names":["errorStyles","PinIcon","jsxs","jsx","useState","useCallback","error","UnpinIcon","containerStyles","titleStyles","unpinButtonStyles","contentStyles","errorBannerStyles"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * PinButton component.\n *\n * A button to pin/unpin a dashboard to a specific context.\n */\n\nimport { useCallback, useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { useDashboardPinStatus, usePinMutations } from '../hooks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PinButtonProps {\n /** Dashboard ID to pin/unpin. */\n dashboardId: string;\n /** Context to pin to (e.g., \"accounts\", \"dashboard\"). */\n context: string;\n /** Label text (default: \"Pin\"). */\n label?: string;\n /** Label when pinned (default: \"Unpin\"). */\n unpinLabel?: string;\n /** Show as icon only (no label). */\n iconOnly?: boolean;\n /** Size variant. */\n size?: 'sm' | 'md' | 'lg';\n /** Called after pin/unpin completes. */\n onPinChange?: (isPinned: boolean) => void;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst PinIcon = ({ filled, size }: { filled: boolean; size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6a2 2 0 0 1 2-2h0a2 2 0 0 0 2-2H5a2 2 0 0 0 2 2h0a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontWeight: 500,\n borderRadius: 'var(--prismiq-radius-md)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s, opacity 0.15s',\n outline: 'none',\n};\n\nconst sizeStyles: Record<NonNullable<PinButtonProps['size']>, CSSProperties> = {\n sm: {\n padding: 'var(--prismiq-spacing-xs)',\n fontSize: 'var(--prismiq-font-size-sm)',\n minWidth: 28,\n minHeight: 28,\n },\n md: {\n padding: 'var(--prismiq-spacing-sm)',\n fontSize: 'var(--prismiq-font-size-base)',\n minWidth: 36,\n minHeight: 36,\n },\n lg: {\n padding: 'var(--prismiq-spacing-md)',\n fontSize: 'var(--prismiq-font-size-lg)',\n minWidth: 44,\n minHeight: 44,\n },\n};\n\nconst pinnedStyles: CSSProperties = {\n backgroundColor: 'var(--prismiq-color-primary-light, #e3f2fd)',\n borderColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-primary)',\n};\n\nconst disabledStyles: CSSProperties = {\n opacity: 0.5,\n cursor: 'not-allowed',\n};\n\nconst iconSizes: Record<NonNullable<PinButtonProps['size']>, number> = {\n sm: 14,\n md: 16,\n lg: 20,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Button to pin/unpin a dashboard to a context.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <PinButton dashboardId={dashboard.id} context=\"accounts\" />\n *\n * // Icon only with custom label\n * <PinButton\n * dashboardId={dashboard.id}\n * context=\"dashboard\"\n * iconOnly\n * onPinChange={(isPinned) => console.log('Pinned:', isPinned)}\n * />\n * ```\n */\nexport function PinButton({\n dashboardId,\n context,\n label = 'Pin',\n unpinLabel = 'Unpin',\n iconOnly = false,\n size = 'md',\n onPinChange,\n className,\n style,\n}: PinButtonProps): ReactNode {\n const { isPinned: checkIsPinned, isLoading: statusLoading, refetch } = useDashboardPinStatus({\n dashboardId,\n });\n const { pin, unpin, state: mutationState } = usePinMutations();\n const [actionError, setActionError] = useState<Error | null>(null);\n\n // Use fetched state directly to avoid race conditions with optimistic updates\n const isPinned = checkIsPinned(context);\n const isLoading = statusLoading || mutationState.isLoading;\n\n const handleClick = useCallback(async () => {\n if (isLoading) return;\n\n setActionError(null);\n try {\n if (isPinned) {\n await unpin(dashboardId, context);\n onPinChange?.(false);\n } else {\n await pin(dashboardId, context);\n onPinChange?.(true);\n }\n // Refresh status after mutation\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setActionError(error);\n console.error('Failed to toggle pin:', err);\n }\n }, [dashboardId, context, isPinned, isLoading, pin, unpin, onPinChange, refetch]);\n\n const errorStyles: CSSProperties = {\n borderColor: 'var(--prismiq-color-error)',\n color: 'var(--prismiq-color-error)',\n };\n\n const combinedStyles: CSSProperties = {\n ...baseStyles,\n ...sizeStyles[size],\n ...(isPinned ? pinnedStyles : {}),\n ...(isLoading ? disabledStyles : {}),\n ...(actionError ? errorStyles : {}),\n ...style,\n };\n\n const iconSize = iconSizes[size];\n const displayLabel = isPinned ? unpinLabel : label;\n const errorMessage = actionError ? `Error: ${actionError.message}` : undefined;\n const accessibleLabel = errorMessage ?? (iconOnly ? displayLabel : undefined);\n const tooltipTitle = errorMessage ?? (iconOnly ? displayLabel : undefined);\n\n return (\n <>\n <style>\n {`\n @keyframes prismiq-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isLoading}\n className={className}\n style={combinedStyles}\n aria-pressed={isPinned}\n aria-label={accessibleLabel}\n aria-invalid={actionError ? true : undefined}\n title={tooltipTitle}\n >\n {isLoading ? (\n <span\n style={{\n display: 'inline-block',\n width: iconSize,\n height: iconSize,\n border: '2px solid currentColor',\n borderRightColor: 'transparent',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.6s linear infinite',\n }}\n />\n ) : (\n <PinIcon filled={isPinned} size={iconSize} />\n )}\n {!iconOnly && <span>{displayLabel}</span>}\n </button>\n </>\n );\n}\n","/**\n * PinMenu component.\n *\n * A dropdown menu showing multiple pin contexts with checkboxes.\n */\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\n\nimport { useDashboardPinStatus, usePinMutations } from '../hooks';\n\n// ============================================================================\n// Error Banner Styles\n// ============================================================================\n\nconst errorBannerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-sm)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n borderRadius: 'var(--prismiq-radius-sm)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-xs)',\n marginBottom: 'var(--prismiq-spacing-xs)',\n};\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Configuration for a pin context option. */\nexport interface PinContextOption {\n /** Unique context identifier (e.g., \"accounts\", \"dashboard\"). */\n id: string;\n /** Display label for the context. */\n label: string;\n /** Optional icon to display. */\n icon?: ReactNode;\n}\n\nexport interface PinMenuProps {\n /** Dashboard ID to pin/unpin. */\n dashboardId: string;\n /** Available contexts to pin to. */\n contexts: PinContextOption[];\n /** Called after pin state changes. */\n onPinChange?: (context: string, isPinned: boolean) => void;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst PinIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6a2 2 0 0 1 2-2h0a2 2 0 0 0 2-2H5a2 2 0 0 0 2 2h0a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst ChevronDownIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\nconst CheckIcon = ({ size }: { size: number }): ReactNode => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst triggerStyles: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n borderRadius: 'var(--prismiq-radius-md)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s',\n outline: 'none',\n};\n\nconst menuStyles: CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: 'var(--prismiq-spacing-xs)',\n minWidth: 200,\n padding: 'var(--prismiq-spacing-xs)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n boxShadow: 'var(--prismiq-shadow-lg, 0 10px 15px -3px rgba(0,0,0,0.1))',\n zIndex: 50,\n};\n\nconst menuItemStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text)',\n borderRadius: 'var(--prismiq-radius-sm)',\n cursor: 'pointer',\n transition: 'background-color 0.15s',\n border: 'none',\n backgroundColor: 'transparent',\n width: '100%',\n textAlign: 'left',\n};\n\nconst checkboxStyles: CSSProperties = {\n width: 16,\n height: 16,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'var(--prismiq-radius-sm)',\n border: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n flexShrink: 0,\n};\n\nconst checkedCheckboxStyles: CSSProperties = {\n ...checkboxStyles,\n backgroundColor: 'var(--prismiq-color-primary)',\n borderColor: 'var(--prismiq-color-primary)',\n color: 'var(--prismiq-color-text-inverse)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Dropdown menu showing multiple pin contexts with checkboxes.\n *\n * @example\n * ```tsx\n * const PIN_CONTEXTS = [\n * { id: 'dashboard', label: 'Dashboard' },\n * { id: 'accounts', label: 'Accounts' },\n * ];\n *\n * <PinMenu\n * dashboardId={dashboard.id}\n * contexts={PIN_CONTEXTS}\n * onPinChange={(ctx, pinned) => console.log(ctx, pinned)}\n * />\n * ```\n */\nexport function PinMenu({\n dashboardId,\n contexts,\n onPinChange,\n className,\n style,\n}: PinMenuProps): ReactNode {\n const [isOpen, setIsOpen] = useState(false);\n const [toggleError, setToggleError] = useState<Error | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { isPinned, refetch, isLoading: statusLoading } = useDashboardPinStatus({\n dashboardId,\n });\n const { pin, unpin, state: mutationState } = usePinMutations();\n\n const isLoading = statusLoading || mutationState.isLoading;\n\n // Clear error when menu closes\n useEffect(() => {\n if (!isOpen) {\n setToggleError(null);\n }\n }, [isOpen]);\n\n // Close menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Close on escape\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen]);\n\n const handleToggle = useCallback((ctx: string) => {\n return async () => {\n if (isLoading) return;\n\n setToggleError(null);\n try {\n const pinned = isPinned(ctx);\n if (pinned) {\n await unpin(dashboardId, ctx);\n onPinChange?.(ctx, false);\n } else {\n await pin(dashboardId, ctx);\n onPinChange?.(ctx, true);\n }\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setToggleError(error);\n console.error('Failed to toggle pin for context:', ctx, err);\n }\n };\n }, [dashboardId, isPinned, isLoading, pin, unpin, onPinChange, refetch]);\n\n // Count pinned contexts\n const pinnedCount = contexts.filter((ctx) => isPinned(ctx.id)).length;\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{ position: 'relative', display: 'inline-block', ...style }}\n >\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n style={triggerStyles}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n >\n <PinIcon size={16} />\n <span>Pin{pinnedCount > 0 ? ` (${pinnedCount})` : ''}</span>\n <ChevronDownIcon size={14} />\n </button>\n\n {isOpen && (\n <div style={menuStyles} role=\"menu\">\n {toggleError && (\n <div style={errorBannerStyles}>\n Failed: {toggleError.message}\n </div>\n )}\n {contexts.map((ctx) => {\n const pinned = isPinned(ctx.id);\n return (\n <button\n key={ctx.id}\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={pinned}\n onClick={handleToggle(ctx.id)}\n disabled={isLoading}\n style={{\n ...menuItemStyles,\n opacity: isLoading ? 0.5 : 1,\n }}\n >\n <span style={pinned ? checkedCheckboxStyles : checkboxStyles}>\n {pinned && <CheckIcon size={12} />}\n </span>\n {ctx.icon && <span style={{ display: 'flex' }}>{ctx.icon}</span>}\n <span>{ctx.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","/**\n * PinnedDashboardList component.\n *\n * Displays a list of dashboards pinned to a context.\n */\n\nimport { useCallback, useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { usePinnedDashboards, usePinMutations } from '../hooks';\nimport type { Dashboard } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Props for custom rendering of a list item. */\nexport interface PinnedDashboardItemActions {\n /** Unpin this dashboard from the context. Returns a promise. */\n unpin: () => Promise<void>;\n}\n\nexport interface PinnedDashboardListProps {\n /** Context to show pins for (e.g., \"accounts\", \"dashboard\"). */\n context: string;\n /** Called when user selects a dashboard. */\n onSelect: (dashboard: Dashboard) => void;\n /** Custom empty state element. */\n emptyState?: ReactNode;\n /** Custom render function for each item. */\n renderItem?: (dashboard: Dashboard, actions: PinnedDashboardItemActions) => ReactNode;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst DashboardIcon = (): ReactNode => (\n <svg\n width={20}\n height={20}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </svg>\n);\n\nconst UnpinIcon = (): ReactNode => (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 2 22 22\" />\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9\" />\n <path d=\"M15 6V4a2 2 0 0 1 2-2\" />\n <path d=\"M9 4a2 2 0 0 0-2 2\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst itemStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-md)',\n padding: 'var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n};\n\nconst itemHoverStyles: CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface-hover, #f5f5f5)',\n borderColor: 'var(--prismiq-color-primary)',\n boxShadow: 'var(--prismiq-shadow-sm, 0 1px 2px rgba(0,0,0,0.05))',\n};\n\nconst iconWrapperStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 40,\n height: 40,\n backgroundColor: 'var(--prismiq-color-primary-light, #e3f2fd)',\n color: 'var(--prismiq-color-primary)',\n borderRadius: 'var(--prismiq-radius-md)',\n flexShrink: 0,\n};\n\nconst contentStyles: CSSProperties = {\n flex: 1,\n minWidth: 0,\n};\n\nconst titleStyles: CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-base)',\n fontWeight: 500,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst descriptionStyles: CSSProperties = {\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n margin: 0,\n marginTop: 'var(--prismiq-spacing-xs)',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst unpinButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 32,\n height: 32,\n padding: 0,\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n borderRadius: 'var(--prismiq-radius-sm)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n flexShrink: 0,\n};\n\nconst emptyStateStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n textAlign: 'center',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst loadingStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 'var(--prismiq-spacing-xl)',\n};\n\nconst errorStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n borderRadius: 'var(--prismiq-radius-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * List of dashboards pinned to a context.\n *\n * @example\n * ```tsx\n * function AccountsDashboards() {\n * const [selected, setSelected] = useState<Dashboard | null>(null);\n *\n * return (\n * <PinnedDashboardList\n * context=\"accounts\"\n * onSelect={setSelected}\n * emptyState={<p>No pinned dashboards</p>}\n * />\n * );\n * }\n * ```\n */\nexport function PinnedDashboardList({\n context,\n onSelect,\n emptyState,\n renderItem,\n className,\n style,\n}: PinnedDashboardListProps): ReactNode {\n const { dashboards, isLoading, error, refetch } = usePinnedDashboards({ context });\n const { unpin, state: mutationState } = usePinMutations();\n const [unpinError, setUnpinError] = useState<Error | null>(null);\n\n const handleUnpin = useCallback(\n (dashboardId: string) => {\n return async (event: React.MouseEvent) => {\n event.stopPropagation();\n setUnpinError(null);\n try {\n await unpin(dashboardId, context);\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', dashboardId, err);\n }\n };\n },\n [context, unpin, refetch]\n );\n\n // Create async unpin handler for renderItem actions\n const createUnpinAction = useCallback(\n (dashboardId: string): (() => Promise<void>) => {\n return async () => {\n setUnpinError(null);\n try {\n await unpin(dashboardId, context);\n await refetch();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', dashboardId, err);\n throw error; // Re-throw so caller can handle if needed\n }\n };\n },\n [context, unpin, refetch]\n );\n\n if (isLoading) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <style>\n {`\n @keyframes prismiq-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n <div style={loadingStyles}>\n <span\n style={{\n display: 'inline-block',\n width: 24,\n height: 24,\n border: '2px solid var(--prismiq-color-border)',\n borderTopColor: 'var(--prismiq-color-primary)',\n borderRadius: '50%',\n animation: 'prismiq-spin 0.6s linear infinite',\n }}\n />\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={errorStyles}>\n Failed to load pinned dashboards: {error.message}\n </div>\n </div>\n );\n }\n\n // Show unpin error as a dismissible message\n const errorBanner = unpinError ? (\n <div style={{ ...errorStyles, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <span>Failed to unpin: {unpinError.message}</span>\n <button\n type=\"button\"\n onClick={() => setUnpinError(null)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n fontSize: 'var(--prismiq-font-size-lg)',\n lineHeight: 1,\n }}\n aria-label=\"Dismiss error\"\n >\n ×\n </button>\n </div>\n ) : null;\n\n if (!dashboards || dashboards.length === 0) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {emptyState || (\n <div style={emptyStateStyles}>\n <DashboardIcon />\n <p style={{ margin: 'var(--prismiq-spacing-sm) 0 0 0' }}>\n No pinned dashboards\n </p>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {errorBanner}\n {dashboards.map((dashboard) => {\n const actions: PinnedDashboardItemActions = {\n unpin: createUnpinAction(dashboard.id),\n };\n\n if (renderItem) {\n return (\n <div\n key={dashboard.id}\n onClick={() => onSelect(dashboard)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(dashboard);\n }\n }}\n >\n {renderItem(dashboard, actions)}\n </div>\n );\n }\n\n return (\n <div\n key={dashboard.id}\n style={itemStyles}\n onClick={() => onSelect(dashboard)}\n onMouseEnter={(e) => {\n Object.assign(e.currentTarget.style, itemHoverStyles);\n }}\n onMouseLeave={(e) => {\n Object.assign(e.currentTarget.style, itemStyles);\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(dashboard);\n }\n }}\n >\n <div style={iconWrapperStyles}>\n <DashboardIcon />\n </div>\n <div style={contentStyles}>\n <h3 style={titleStyles}>{dashboard.name}</h3>\n {dashboard.description && (\n <p style={descriptionStyles}>{dashboard.description}</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleUnpin(dashboard.id)}\n disabled={mutationState.isLoading}\n style={{\n ...unpinButtonStyles,\n opacity: mutationState.isLoading ? 0.5 : 1,\n }}\n title=\"Unpin\"\n aria-label=\"Unpin dashboard\"\n >\n <UnpinIcon />\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * PinnedDashboardView component.\n *\n * Full view with pinned dashboard list and selected dashboard display.\n */\n\nimport { useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { Dashboard } from '../dashboard';\nimport { usePinMutations } from '../hooks';\nimport type { Dashboard as DashboardType } from '../types';\n\nimport { PinnedDashboardList } from './PinnedDashboardList';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PinnedDashboardViewProps {\n /** Context this view is for (for unpin action). */\n context: string;\n /** Dashboard to display (null = show list). */\n selectedDashboard: DashboardType | null;\n /** Called when user clicks back or closes. */\n onBack: () => void;\n /** Called when user selects from list. */\n onSelect: (dashboard: DashboardType) => void;\n /** Show unpin button in header. */\n showUnpin?: boolean;\n /** Custom back button label. */\n backLabel?: string;\n /** Custom empty state for list. */\n emptyState?: ReactNode;\n /** Custom class name. */\n className?: string;\n /** Custom styles. */\n style?: CSSProperties;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nconst BackIcon = (): ReactNode => (\n <svg\n width={20}\n height={20}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 12H5\" />\n <path d=\"m12 19-7-7 7-7\" />\n </svg>\n);\n\nconst UnpinIcon = (): ReactNode => (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 2 22 22\" />\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9\" />\n <path d=\"M15 6V4a2 2 0 0 1 2-2\" />\n <path d=\"M9 4a2 2 0 0 0-2 2\" />\n </svg>\n);\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n};\n\nconst headerStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-md)',\n padding: 'var(--prismiq-spacing-md)',\n borderBottom: '1px solid var(--prismiq-color-border)',\n backgroundColor: 'var(--prismiq-color-surface)',\n};\n\nconst backButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 500,\n backgroundColor: 'transparent',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n color: 'var(--prismiq-color-text)',\n cursor: 'pointer',\n transition: 'background-color 0.15s',\n};\n\nconst titleStyles: CSSProperties = {\n flex: 1,\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-lg)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst unpinButtonStyles: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n backgroundColor: 'transparent',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-md)',\n color: 'var(--prismiq-color-text-muted)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n};\n\nconst contentStyles: CSSProperties = {\n flex: 1,\n overflow: 'auto',\n};\n\nconst listContainerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-md)',\n};\n\nconst errorBannerStyles: CSSProperties = {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-error-light, #ffebee)',\n color: 'var(--prismiq-color-error)',\n fontFamily: 'var(--prismiq-font-sans)',\n fontSize: 'var(--prismiq-font-size-sm)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Full view with pinned dashboard list and dashboard display.\n *\n * When no dashboard is selected, shows the list. When a dashboard\n * is selected, shows the dashboard with a back button.\n *\n * @example\n * ```tsx\n * function AccountsDashboardSection() {\n * const [selected, setSelected] = useState<Dashboard | null>(null);\n *\n * return (\n * <PinnedDashboardView\n * context=\"accounts\"\n * selectedDashboard={selected}\n * onSelect={setSelected}\n * onBack={() => setSelected(null)}\n * backLabel=\"Back to Accounts\"\n * emptyState={<p>Pin dashboards from Analytics.</p>}\n * />\n * );\n * }\n * ```\n */\nexport function PinnedDashboardView({\n context,\n selectedDashboard,\n onBack,\n onSelect,\n showUnpin = true,\n backLabel = 'Back',\n emptyState,\n className,\n style,\n}: PinnedDashboardViewProps): ReactNode {\n const { unpin, state: mutationState } = usePinMutations();\n const [unpinError, setUnpinError] = useState<Error | null>(null);\n\n const handleUnpin = async () => {\n if (!selectedDashboard) return;\n setUnpinError(null);\n try {\n await unpin(selectedDashboard.id, context);\n onBack();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setUnpinError(error);\n console.error('Failed to unpin dashboard:', selectedDashboard.id, err);\n }\n };\n\n // Show list when no dashboard selected\n if (!selectedDashboard) {\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n <div style={listContainerStyles}>\n <PinnedDashboardList\n context={context}\n onSelect={onSelect}\n emptyState={emptyState}\n />\n </div>\n </div>\n );\n }\n\n // Show selected dashboard with header\n return (\n <div className={className} style={{ ...containerStyles, ...style }}>\n {unpinError && (\n <div style={errorBannerStyles}>\n <span>Failed to unpin: {unpinError.message}</span>\n <button\n type=\"button\"\n onClick={() => setUnpinError(null)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: 'inherit',\n fontSize: 'var(--prismiq-font-size-lg)',\n lineHeight: 1,\n }}\n aria-label=\"Dismiss error\"\n >\n ×\n </button>\n </div>\n )}\n <div style={headerStyles}>\n <button\n type=\"button\"\n onClick={onBack}\n style={backButtonStyles}\n >\n <BackIcon />\n <span>{backLabel}</span>\n </button>\n <h2 style={titleStyles}>{selectedDashboard.name}</h2>\n {showUnpin && (\n <button\n type=\"button\"\n onClick={handleUnpin}\n disabled={mutationState.isLoading}\n style={{\n ...unpinButtonStyles,\n opacity: mutationState.isLoading ? 0.5 : 1,\n }}\n >\n <UnpinIcon />\n <span>Unpin</span>\n </button>\n )}\n </div>\n <div style={contentStyles}>\n <Dashboard id={selectedDashboard.id} />\n </div>\n </div>\n );\n}\n","/**\n * @prismiq/react - React SDK for Prismiq embedded analytics\n *\n * @example\n * ```tsx\n * import {\n * AnalyticsProvider,\n * ThemeProvider,\n * QueryBuilder,\n * BarChart,\n * Dashboard,\n * useQuery\n * } from '@prismiq/react';\n *\n * function App() {\n * return (\n * <ThemeProvider>\n * <AnalyticsProvider config={{ endpoint: 'https://api.example.com' }}>\n * <Dashboard id=\"my-dashboard\" />\n * </AnalyticsProvider>\n * </ThemeProvider>\n * );\n * }\n * ```\n *\n * For modular imports (smaller bundle size):\n * ```tsx\n * import { BarChart } from '@prismiq/react/charts';\n * import { Dashboard } from '@prismiq/react/dashboard';\n * import { useIsClient } from '@prismiq/react/ssr';\n * import { useFocusTrap } from '@prismiq/react/utils';\n * import { exportToCSV } from '@prismiq/react/export';\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n // Schema types\n ColumnSchema,\n TableSchema,\n Relationship,\n DatabaseSchema,\n DataSourceMeta,\n // Query types\n QueryTable,\n JoinType,\n JoinDefinition,\n AggregationType,\n ColumnSelection,\n FilterOperator,\n FilterDefinition,\n SortDirection,\n SortDefinition,\n GroupByDefinition,\n QueryDefinition,\n // Result types\n QueryResult,\n ValidationResult,\n // Saved query types\n SavedQuery,\n SavedQueryCreate,\n SavedQueryUpdate,\n // Custom SQL types\n ExecuteSQLRequest,\n SQLValidationResult,\n // Pin types\n PinnedDashboard,\n PinnedDashboardsResponse,\n DashboardPinContextsResponse,\n // Dashboard mutation types\n DashboardCreate,\n DashboardUpdate,\n} from './types';\n\n// ============================================================================\n// API Client\n// ============================================================================\n\nexport { PrismiqClient, PrismiqError } from './api';\nexport type { ClientConfig } from './api';\n\n// ============================================================================\n// Theme\n// ============================================================================\n\nexport { ThemeProvider, useTheme, lightTheme, darkTheme } from './theme';\nexport type {\n PrismiqTheme,\n ThemeMode,\n ThemeContextValue,\n ThemeProviderProps,\n DeepPartial,\n} from './theme';\n\n// ============================================================================\n// Context\n// ============================================================================\n\nexport { AnalyticsProvider, useAnalytics, useAnalyticsCallbacks } from './context';\nexport type {\n AnalyticsContextValue,\n AnalyticsProviderProps,\n AnalyticsCallbacks,\n} from './context';\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport {\n useSchema,\n useQuery,\n useChartData,\n useDashboards,\n useDashboard as useDashboardData,\n useDashboardMutations,\n useSavedQueries,\n useCustomSQL,\n usePinnedDashboards,\n usePinMutations,\n useDashboardPinStatus,\n} from './hooks';\nexport type {\n UseSchemaResult,\n UseQueryResult,\n UseQueryOptions,\n UseDashboardsOptions,\n UseDashboardsResult,\n UseDashboardOptions,\n UseDashboardResult,\n MutationState,\n UseDashboardMutationsResult,\n UseSavedQueriesOptions,\n UseSavedQueriesResult,\n UseCustomSQLOptions,\n UseCustomSQLResult,\n UsePinnedDashboardsOptions,\n UsePinnedDashboardsResult,\n PinMutationState,\n UsePinMutationsResult,\n UseDashboardPinStatusOptions,\n UseDashboardPinStatusResult,\n} from './hooks';\n\n// ============================================================================\n// Charts\n// ============================================================================\n\nexport {\n // Base wrapper\n EChartWrapper,\n // Chart components\n MetricCard,\n TrendIndicator,\n Sparkline,\n BarChart,\n LineChart,\n AreaChart,\n PieChart,\n ScatterChart,\n // Auto suggest\n suggestChartType,\n // Utilities\n queryResultToChartData,\n dataPointsToChartData,\n toChartData,\n createChartTheme,\n applyThemeToOption,\n formatAxisLabel,\n formatCompact,\n formatMetricValue,\n getChartColors,\n createGradientColor,\n isChartDataEmpty,\n} from './charts';\n\nexport type {\n // Data types\n ChartDataPoint,\n ChartSeries,\n // Base props\n BaseChartProps,\n ChartClickParams,\n ReferenceLineConfig,\n AxisFormat,\n LegendPosition,\n EChartWrapperProps,\n // Chart-specific props\n BarChartProps,\n LineChartProps,\n AreaChartProps,\n PieChartProps,\n ScatterChartProps,\n // MetricCard\n TrendConfig,\n MetricCardProps,\n TrendIndicatorProps,\n SparklineProps,\n // Hook types\n ChartDataOptions,\n ChartDataResult,\n // Auto suggest\n ChartType,\n ChartSuggestion,\n} from './charts';\n\n// ============================================================================\n// UI Components\n// ============================================================================\n\nexport {\n // Base UI\n Button,\n Input,\n Select,\n Checkbox,\n Badge,\n Tooltip,\n Dropdown,\n DropdownItem,\n DropdownSeparator,\n Icon,\n Dialog,\n DialogHeader,\n DialogFooter,\n // Skeleton Loading\n Skeleton,\n SkeletonText,\n SkeletonChart,\n SkeletonTable,\n SkeletonMetricCard,\n // Error Boundaries\n ErrorBoundary,\n ErrorFallback,\n WidgetErrorBoundary,\n // Empty States\n EmptyState,\n NoData,\n NoResults,\n EmptyDashboard,\n // Schema Explorer\n SchemaExplorer,\n TableNode,\n ColumnNode,\n // Column Selector\n ColumnSelector,\n SelectedColumn,\n // Filter Builder\n FilterBuilder,\n FilterRow,\n FilterValueInput,\n // Sort Builder\n SortBuilder,\n SortRow,\n // Aggregation Picker\n AggregationPicker,\n // Results Table\n ResultsTable,\n TableHeader,\n TableRow,\n TableCell,\n Pagination,\n // Query Builder\n QueryBuilder,\n QueryBuilderToolbar,\n QueryPreview,\n // Saved Queries\n SavedQueryPicker,\n // Custom SQL\n CustomSQLEditor,\n} from './components';\n\nexport type {\n // Base UI\n ButtonProps,\n InputProps,\n SelectProps,\n SelectOption,\n CheckboxProps,\n BadgeProps,\n TooltipProps,\n DropdownProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n IconProps,\n IconName,\n DialogProps,\n DialogHeaderProps,\n DialogFooterProps,\n // Skeleton Loading\n SkeletonProps,\n SkeletonTextProps,\n SkeletonChartProps,\n SkeletonTableProps,\n SkeletonMetricCardProps,\n // Error Boundaries\n ErrorBoundaryProps,\n ErrorFallbackProps,\n WidgetErrorBoundaryProps,\n // Empty States\n EmptyStateProps,\n NoDataProps,\n NoResultsProps,\n EmptyDashboardProps,\n // Schema Explorer\n SchemaExplorerProps,\n TableNodeProps,\n ColumnNodeProps,\n // Column Selector\n ColumnSelectorProps,\n SelectedColumnProps,\n // Filter Builder\n FilterBuilderProps,\n FilterRowProps,\n FilterValueInputProps,\n // Sort Builder\n SortBuilderProps,\n SortRowProps,\n // Aggregation Picker\n AggregationPickerProps,\n // Results Table\n ResultsTableProps,\n TableHeaderProps,\n TableRowProps,\n TableCellProps,\n PaginationProps,\n // Query Builder\n QueryBuilderProps,\n QueryBuilderState,\n QueryBuilderToolbarProps,\n QueryPreviewProps,\n // Saved Queries\n SavedQueryPickerProps,\n // Custom SQL\n CustomSQLEditorProps,\n} from './components';\n\n// ============================================================================\n// Export Utilities\n// ============================================================================\n\nexport {\n // CSV export\n exportToCSV,\n generateCSV,\n downloadFile,\n // Excel export\n exportToExcel,\n exportMultipleSheets,\n // Hook\n useExport,\n} from './export';\n\nexport type {\n ExportOptions,\n ExcelExportOptions,\n ExcelCellStyle,\n ExportData,\n UseExportOptions,\n UseExportResult,\n} from './export';\n\n// ============================================================================\n// Dashboard\n// ============================================================================\n\nexport {\n // Main components\n Dashboard,\n DashboardProvider,\n DashboardLayoutComponent,\n // Widget components\n Widget,\n WidgetHeader,\n WidgetContent,\n // Filter components\n FilterBar,\n DateRangeFilter,\n SelectFilter,\n MultiSelectFilter,\n TextFilter,\n // Editor components\n DashboardEditor,\n EditorToolbar,\n WidgetPalette,\n WidgetEditor,\n // List components\n DashboardList,\n DashboardCard,\n DashboardDialog,\n // Hooks\n useDashboard,\n useDashboardFilters,\n useWidget,\n useAutoRefresh,\n useFullscreen,\n // Context\n DashboardContext,\n} from './dashboard';\n\nexport type {\n // Widget types\n WidgetType,\n WidgetPosition,\n WidgetConfig,\n WidgetDefinition,\n // Filter types\n DashboardFilterType,\n FilterOption,\n DashboardFilter,\n FilterValue,\n DateRangeValue,\n NumberRangeValue,\n // Dashboard types\n DashboardLayout,\n DashboardDefinition,\n // Context types\n DashboardContextValue,\n DashboardEditorContextValue,\n // Component props\n DashboardProviderProps,\n DashboardProps,\n DashboardEditorProps,\n DashboardLayoutProps,\n WidgetProps,\n WidgetHeaderProps,\n FilterBarProps,\n DateRangeFilterProps,\n SelectFilterProps,\n MultiSelectFilterProps,\n TextFilterProps,\n WidgetPaletteProps,\n WidgetEditorProps,\n WidgetContentProps,\n EditorToolbarProps,\n // List component props\n DashboardListProps,\n DashboardCardProps,\n DashboardDialogProps,\n // Hook result types\n UseDashboardFiltersResult,\n UseWidgetResult,\n UseAutoRefreshOptions,\n UseAutoRefreshResult,\n UseFullscreenResult,\n} from './dashboard';\n\n// ============================================================================\n// Accessibility Utilities\n// ============================================================================\n\nexport {\n useFocusTrap,\n useArrowNavigation,\n useRovingTabIndex,\n useFocusVisible,\n announceToScreenReader,\n focusVisibleStyles,\n skipLinkStyles,\n skipLinkFocusStyles,\n} from './utils';\n\nexport type {\n FocusTrapOptions,\n ArrowNavigationOptions,\n UseFocusTrapResult,\n UseArrowNavigationResult,\n SkipLinkProps,\n} from './utils';\n\n// ============================================================================\n// SSR Utilities\n// ============================================================================\n\nexport {\n useIsClient,\n ClientOnly,\n getWindowWidth,\n getWindowHeight,\n isBrowser,\n isServer,\n getLocalStorage,\n setLocalStorage,\n removeLocalStorage,\n useWindowSize,\n useMediaQuery,\n useBreakpoint,\n useIsBreakpoint,\n BREAKPOINTS,\n} from './ssr';\n\nexport type {\n ClientOnlyProps,\n WindowSize,\n Breakpoint,\n} from './ssr';\n\n// ============================================================================\n// Pin Components\n// ============================================================================\n\nexport {\n PinButton,\n PinMenu,\n PinnedDashboardList,\n PinnedDashboardView,\n} from './pins';\n\nexport type {\n PinButtonProps,\n PinMenuProps,\n PinContextOption,\n PinnedDashboardListProps,\n PinnedDashboardItemActions,\n PinnedDashboardViewProps,\n} from './pins';\n\n// ============================================================================\n// Version\n// ============================================================================\n\nexport const VERSION = '0.1.0';\n"]}
|
|
@@ -54,6 +54,19 @@ interface DatabaseSchema {
|
|
|
54
54
|
/** Foreign key relationships between tables. */
|
|
55
55
|
relationships: Relationship[];
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Metadata for a data source (table/view) including display name and description.
|
|
59
|
+
*/
|
|
60
|
+
interface DataSourceMeta {
|
|
61
|
+
/** Unique identifier for the data source. */
|
|
62
|
+
id: string;
|
|
63
|
+
/** PostgreSQL table/view name. */
|
|
64
|
+
table: string;
|
|
65
|
+
/** Human-readable display name for the UI. */
|
|
66
|
+
title: string;
|
|
67
|
+
/** Description or subtitle explaining the data source. */
|
|
68
|
+
subtitle: string;
|
|
69
|
+
}
|
|
57
70
|
/**
|
|
58
71
|
* A table reference in a query.
|
|
59
72
|
*/
|
|
@@ -106,6 +119,8 @@ interface ColumnSelection {
|
|
|
106
119
|
alias?: string;
|
|
107
120
|
/** Date truncation unit for date/timestamp columns. */
|
|
108
121
|
date_trunc?: DateTruncInterval;
|
|
122
|
+
/** Date format string for formatting date values in output. */
|
|
123
|
+
date_format?: string;
|
|
109
124
|
}
|
|
110
125
|
/**
|
|
111
126
|
* SQL filter operators.
|
|
@@ -566,4 +581,4 @@ interface DashboardPinContextsResponse {
|
|
|
566
581
|
contexts: string[];
|
|
567
582
|
}
|
|
568
583
|
|
|
569
|
-
export type { AggregationType as A, CalculatedField as C, DatabaseSchema as D, ExecuteSQLRequest as E,
|
|
584
|
+
export type { AggregationType as A, CalculatedField as C, DatabaseSchema as D, ExecuteSQLRequest as E, FilterDefinition as F, GroupByDefinition as G, JoinDefinition as J, PinnedDashboard as P, QueryResult as Q, Relationship as R, SQLValidationResult as S, TimeSeriesConfig as T, ValidationResult as V, WidgetCreate as W, QueryDefinition as a, QueryTable as b, TableSchema as c, DataSourceMeta as d, Dashboard as e, DashboardCreate as f, DashboardUpdate as g, Widget as h, WidgetUpdate as i, WidgetPositionUpdate as j, SavedQuery as k, SavedQueryCreate as l, SavedQueryUpdate as m, PinnedDashboardsResponse as n, WidgetPosition as o, ColumnSchema as p, ColumnSelection as q, DashboardPinContextsResponse as r, FilterOperator as s, JoinType as t, SortDefinition as u, SortDirection as v };
|