@burdenoff/microfe-bigconsole 2026.613.4 → 2026.613.6

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.
@@ -4,129 +4,149 @@ import "../../store/index.js";
4
4
  import n from "./SavedViewsDropdown/SavedViewsDropdown.js";
5
5
  import "./SavedViewsDropdown/index.js";
6
6
  import { memo as r, useCallback as i } from "react";
7
- import { Clipboard as a, Download as o, Eye as s, Minus as c, PanelLeft as l, PanelLeftClose as u, Pencil as d, Plus as f, RotateCcw as p, Save as m, Share2 as h } from "lucide-react";
8
- import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
9
- import { Button as y, Spinner as b, Tooltip as x, TooltipContent as S, TooltipProvider as C, TooltipTrigger as w } from "@burdenoff/fe-libs/ui";
7
+ import { Clipboard as a, Download as o, Eye as s, FileText as c, Image as l, Minus as u, PanelLeft as d, PanelLeftClose as f, Pencil as p, Plus as m, RotateCcw as h, Save as g, Share2 as _ } from "lucide-react";
8
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
9
+ import { Button as x, Spinner as S, Tooltip as C, TooltipContent as w, TooltipProvider as T, TooltipTrigger as E } from "@burdenoff/fe-libs/ui";
10
10
  //#region src/bigconsole/components/dashboard/DashboardToolbar.tsx
11
- var T = r(function({ dashboardId: r, title: T, onAddWidget: E, onTogglePalette: D, isPaletteOpen: O = !1, onPaste: k, onSave: A, isSaving: j = !1, onExport: M, onShare: N }) {
12
- let P = t((e) => e.viewMode === "edit"), F = t((e) => e.toggleViewMode), I = t((e) => e.zoomLevel), L = t((e) => e.setZoomLevel), R = !!e((e) => e.clipboardWidgetId), z = i(() => {
13
- R && k && k();
14
- }, [R, k]);
15
- return /* @__PURE__ */ _(C, { children: /* @__PURE__ */ v("div", {
11
+ var D = r(function({ dashboardId: r, title: D, onAddWidget: O, onTogglePalette: k, isPaletteOpen: A = !1, onPaste: j, onSave: M, isSaving: N = !1, onExport: P, onExportImage: F, onExportPdf: I, isExportingImage: L = !1, onShare: R }) {
12
+ let z = t((e) => e.viewMode === "edit"), B = t((e) => e.toggleViewMode), V = t((e) => e.zoomLevel), H = t((e) => e.setZoomLevel), U = !!e((e) => e.clipboardWidgetId), W = i(() => {
13
+ U && j && j();
14
+ }, [U, j]);
15
+ return /* @__PURE__ */ y(T, { children: /* @__PURE__ */ b("div", {
16
16
  className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-2 px-4 py-2 bg-background border-b",
17
17
  children: [
18
- /* @__PURE__ */ v("div", {
18
+ /* @__PURE__ */ b("div", {
19
19
  className: "flex min-w-0 items-center gap-4",
20
- children: [T && /* @__PURE__ */ _("h1", {
20
+ children: [D && /* @__PURE__ */ y("h1", {
21
21
  className: "min-w-0 truncate text-lg font-semibold",
22
- title: T,
23
- children: T
24
- }), r && /* @__PURE__ */ _(n, { dashboardId: r })]
22
+ title: D,
23
+ children: D
24
+ }), r && /* @__PURE__ */ y(n, { dashboardId: r })]
25
25
  }),
26
- /* @__PURE__ */ v("div", {
26
+ /* @__PURE__ */ b("div", {
27
27
  className: "flex flex-shrink-0 items-center gap-1",
28
28
  children: [
29
- /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(w, {
29
+ /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
30
30
  asChild: !0,
31
- children: /* @__PURE__ */ _(y, {
31
+ children: /* @__PURE__ */ y(x, {
32
32
  variant: "ghost",
33
33
  size: "icon-sm",
34
- onClick: () => L(Math.max(50, I - 10)),
35
- disabled: I <= 50,
36
- children: /* @__PURE__ */ _(c, { className: "size-4" })
34
+ onClick: () => H(Math.max(50, V - 10)),
35
+ disabled: V <= 50,
36
+ children: /* @__PURE__ */ y(u, { className: "size-4" })
37
37
  })
38
- }), /* @__PURE__ */ _(S, { children: "Zoom out" })] }),
39
- /* @__PURE__ */ v("span", {
38
+ }), /* @__PURE__ */ y(w, { children: "Zoom out" })] }),
39
+ /* @__PURE__ */ b("span", {
40
40
  className: "text-sm text-muted-foreground w-12 text-center",
41
- children: [I, "%"]
41
+ children: [V, "%"]
42
42
  }),
43
- /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(w, {
43
+ /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
44
44
  asChild: !0,
45
- children: /* @__PURE__ */ _(y, {
45
+ children: /* @__PURE__ */ y(x, {
46
46
  variant: "ghost",
47
47
  size: "icon-sm",
48
- onClick: () => L(Math.min(200, I + 10)),
49
- disabled: I >= 200,
50
- children: /* @__PURE__ */ _(f, { className: "size-4" })
48
+ onClick: () => H(Math.min(200, V + 10)),
49
+ disabled: V >= 200,
50
+ children: /* @__PURE__ */ y(m, { className: "size-4" })
51
51
  })
52
- }), /* @__PURE__ */ _(S, { children: "Zoom in" })] }),
53
- /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(w, {
52
+ }), /* @__PURE__ */ y(w, { children: "Zoom in" })] }),
53
+ /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
54
54
  asChild: !0,
55
- children: /* @__PURE__ */ v(y, {
55
+ children: /* @__PURE__ */ b(x, {
56
56
  variant: "ghost",
57
57
  size: "sm",
58
- onClick: () => L(100),
59
- children: [/* @__PURE__ */ _(p, { className: "size-3.5 mr-1" }), "Reset"]
58
+ onClick: () => H(100),
59
+ children: [/* @__PURE__ */ y(h, { className: "size-3.5 mr-1" }), "Reset"]
60
60
  })
61
- }), /* @__PURE__ */ _(S, { children: "Reset zoom to 100%" })] })
61
+ }), /* @__PURE__ */ y(w, { children: "Reset zoom to 100%" })] })
62
62
  ]
63
63
  }),
64
- /* @__PURE__ */ v("div", {
64
+ /* @__PURE__ */ b("div", {
65
65
  className: "flex flex-wrap items-center justify-end gap-2",
66
66
  children: [
67
- P && /* @__PURE__ */ v(g, { children: [
68
- D && /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(w, {
67
+ z && /* @__PURE__ */ b(v, { children: [
68
+ k && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
69
69
  asChild: !0,
70
- children: /* @__PURE__ */ v(y, {
71
- variant: O ? "secondary" : "outline",
70
+ children: /* @__PURE__ */ b(x, {
71
+ variant: A ? "secondary" : "outline",
72
72
  size: "sm",
73
- onClick: D,
74
- children: [_(O ? u : l, { className: "size-4" }), "Widgets"]
73
+ onClick: k,
74
+ children: [y(A ? f : d, { className: "size-4" }), "Widgets"]
75
75
  })
76
- }), /* @__PURE__ */ _(S, { children: O ? "Hide widget palette" : "Show widget palette for drag & drop" })] }),
77
- /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(w, {
76
+ }), /* @__PURE__ */ y(w, { children: A ? "Hide widget palette" : "Show widget palette for drag & drop" })] }),
77
+ /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
78
78
  asChild: !0,
79
- children: /* @__PURE__ */ v(y, {
79
+ children: /* @__PURE__ */ b(x, {
80
80
  variant: "ghost",
81
81
  size: "sm",
82
- onClick: z,
83
- disabled: !R,
84
- children: [/* @__PURE__ */ _(a, { className: "size-4" }), "Paste"]
82
+ onClick: W,
83
+ disabled: !U,
84
+ children: [/* @__PURE__ */ y(a, { className: "size-4" }), "Paste"]
85
85
  })
86
- }), /* @__PURE__ */ _(S, { children: "Paste widget from clipboard" })] }),
87
- /* @__PURE__ */ v(y, {
86
+ }), /* @__PURE__ */ y(w, { children: "Paste widget from clipboard" })] }),
87
+ /* @__PURE__ */ b(x, {
88
88
  size: "sm",
89
- onClick: E,
90
- children: [/* @__PURE__ */ _(f, { className: "size-4" }), "Add Widget"]
89
+ onClick: O,
90
+ children: [/* @__PURE__ */ y(m, { className: "size-4" }), "Add Widget"]
91
91
  })
92
92
  ] }),
93
- /* @__PURE__ */ _(y, {
94
- variant: P ? "secondary" : "outline",
93
+ /* @__PURE__ */ y(x, {
94
+ variant: z ? "secondary" : "outline",
95
95
  size: "sm",
96
- onClick: F,
97
- children: P ? /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(s, { className: "size-4" }), "Preview"] }) : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(d, { className: "size-4" }), "Edit"] })
96
+ onClick: B,
97
+ children: z ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(s, { className: "size-4" }), "Preview"] }) : /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(p, { className: "size-4" }), "Edit"] })
98
98
  }),
99
- A && /* @__PURE__ */ _(y, {
99
+ M && /* @__PURE__ */ y(x, {
100
100
  variant: "outline",
101
101
  size: "sm",
102
- onClick: A,
103
- disabled: j,
104
- children: j ? /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(b, { className: "size-4" }), "Saving..."] }) : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(m, { className: "size-4" }), "Save"] })
102
+ onClick: M,
103
+ disabled: N,
104
+ children: N ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(S, { className: "size-4" }), "Saving..."] }) : /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(g, { className: "size-4" }), "Save"] })
105
105
  }),
106
- N && /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(w, {
106
+ R && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
107
107
  asChild: !0,
108
- children: /* @__PURE__ */ v(y, {
108
+ children: /* @__PURE__ */ b(x, {
109
109
  variant: "outline",
110
110
  size: "sm",
111
- onClick: N,
112
- children: [/* @__PURE__ */ _(h, { className: "size-4" }), "Share"]
111
+ onClick: R,
112
+ children: [/* @__PURE__ */ y(_, { className: "size-4" }), "Share"]
113
113
  })
114
- }), /* @__PURE__ */ _(S, { children: "Share dashboard with others" })] }),
115
- M && /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(w, {
114
+ }), /* @__PURE__ */ y(w, { children: "Share dashboard with others" })] }),
115
+ P && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
116
116
  asChild: !0,
117
- children: /* @__PURE__ */ v(y, {
117
+ children: /* @__PURE__ */ b(x, {
118
118
  variant: "outline",
119
119
  size: "sm",
120
- onClick: M,
121
- children: [/* @__PURE__ */ _(o, { className: "size-4" }), "Export"]
120
+ onClick: P,
121
+ children: [/* @__PURE__ */ y(o, { className: "size-4" }), "Export"]
122
122
  })
123
- }), /* @__PURE__ */ _(S, { children: "Export dashboard to JSON" })] })
123
+ }), /* @__PURE__ */ y(w, { children: "Export dashboard to JSON" })] }),
124
+ F && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
125
+ asChild: !0,
126
+ children: /* @__PURE__ */ y(x, {
127
+ variant: "outline",
128
+ size: "icon-sm",
129
+ onClick: F,
130
+ disabled: L,
131
+ children: y(L ? S : l, { className: "size-4" })
132
+ })
133
+ }), /* @__PURE__ */ y(w, { children: "Export board as PNG image" })] }),
134
+ I && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, {
135
+ asChild: !0,
136
+ children: /* @__PURE__ */ y(x, {
137
+ variant: "outline",
138
+ size: "icon-sm",
139
+ onClick: I,
140
+ disabled: L,
141
+ children: /* @__PURE__ */ y(c, { className: "size-4" })
142
+ })
143
+ }), /* @__PURE__ */ y(w, { children: "Export board as PDF" })] })
124
144
  ]
125
145
  })
126
146
  ]
127
147
  }) });
128
148
  });
129
149
  //#endregion
130
- export { T as default };
150
+ export { D as default };
131
151
 
132
152
  //# sourceMappingURL=DashboardToolbar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardToolbar.js","names":[],"sources":["../../../../src/bigconsole/components/dashboard/DashboardToolbar.tsx"],"sourcesContent":["/**\n * DashboardToolbar Component\n *\n * Toolbar for dashboard actions and controls.\n * Uses fe-libs shared components for consistent styling.\n * Phase 2: Added SavedViewsDropdown and Share button.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n Clipboard,\n Eye,\n Pencil,\n Save,\n Download,\n Minus,\n RotateCcw,\n Share2,\n LayoutGrid,\n PanelLeftClose,\n PanelLeft,\n} from 'lucide-react';\nimport { useDashboardStore, useWidgetStore } from '../../store';\nimport { SavedViewsDropdown } from './SavedViewsDropdown';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DashboardToolbarProps {\n /** Dashboard ID for saved views */\n dashboardId?: string;\n /** Dashboard title */\n title?: string;\n /** Callback to add widget */\n onAddWidget: () => void;\n /** Callback to toggle widget palette */\n onTogglePalette?: () => void;\n /** Whether palette is open */\n isPaletteOpen?: boolean;\n /** Callback to paste widget */\n onPaste?: () => void;\n /** Callback to save dashboard */\n onSave?: () => void;\n /** Whether save is in progress */\n isSaving?: boolean;\n /** Callback to export dashboard */\n onExport?: () => void;\n /** Callback to open share dialog */\n onShare?: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const DashboardToolbar: FC<DashboardToolbarProps> = memo(function DashboardToolbar({\n dashboardId,\n title,\n onAddWidget,\n onTogglePalette,\n isPaletteOpen = false,\n onPaste,\n onSave,\n isSaving = false,\n onExport,\n onShare,\n}) {\n const isEditMode = useDashboardStore((state) => state.viewMode === 'edit');\n const toggleViewMode = useDashboardStore((state) => state.toggleViewMode);\n const zoomLevel = useDashboardStore((state) => state.zoomLevel);\n const setZoomLevel = useDashboardStore((state) => state.setZoomLevel);\n\n const clipboardWidgetId = useWidgetStore((state) => state.clipboardWidgetId);\n const hasClipboard = !!clipboardWidgetId;\n\n // Handle paste - use provided callback or fallback\n const handlePaste = useCallback(() => {\n if (hasClipboard && onPaste) {\n onPaste();\n }\n }, [hasClipboard, onPaste]);\n\n return (\n <TooltipProvider>\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 px-4 py-2 bg-background border-b\">\n {/* Left section */}\n <div className=\"flex min-w-0 items-center gap-4\">\n {title && (\n <h1 className=\"min-w-0 truncate text-lg font-semibold\" title={title}>\n {title}\n </h1>\n )}\n {/* Saved Views Dropdown */}\n {dashboardId && <SavedViewsDropdown dashboardId={dashboardId} />}\n </div>\n\n {/* Center section - Zoom controls */}\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setZoomLevel(Math.max(50, zoomLevel - 10))}\n disabled={zoomLevel <= 50}\n >\n <Minus className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Zoom out</TooltipContent>\n </Tooltip>\n\n <span className=\"text-sm text-muted-foreground w-12 text-center\">{zoomLevel}%</span>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setZoomLevel(Math.min(200, zoomLevel + 10))}\n disabled={zoomLevel >= 200}\n >\n <Plus className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Zoom in</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setZoomLevel(100)}>\n <RotateCcw className=\"size-3.5 mr-1\" />\n Reset\n </Button>\n </TooltipTrigger>\n <TooltipContent>Reset zoom to 100%</TooltipContent>\n </Tooltip>\n </div>\n\n {/* Right section - Actions */}\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {isEditMode && (\n <>\n {/* Widget Palette Toggle */}\n {onTogglePalette && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant={isPaletteOpen ? 'secondary' : 'outline'} size=\"sm\" onClick={onTogglePalette}>\n {isPaletteOpen ? <PanelLeftClose className=\"size-4\" /> : <PanelLeft className=\"size-4\" />}\n Widgets\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {isPaletteOpen ? 'Hide widget palette' : 'Show widget palette for drag & drop'}\n </TooltipContent>\n </Tooltip>\n )}\n\n {/* Paste */}\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" onClick={handlePaste} disabled={!hasClipboard}>\n <Clipboard className=\"size-4\" />\n Paste\n </Button>\n </TooltipTrigger>\n <TooltipContent>Paste widget from clipboard</TooltipContent>\n </Tooltip>\n\n {/* Add Widget (Dialog) */}\n <Button size=\"sm\" onClick={onAddWidget}>\n <Plus className=\"size-4\" />\n Add Widget\n </Button>\n </>\n )}\n\n {/* Edit/View Mode Toggle */}\n <Button variant={isEditMode ? 'secondary' : 'outline'} size=\"sm\" onClick={toggleViewMode}>\n {isEditMode ? (\n <>\n <Eye className=\"size-4\" />\n Preview\n </>\n ) : (\n <>\n <Pencil className=\"size-4\" />\n Edit\n </>\n )}\n </Button>\n\n {/* Save */}\n {onSave && (\n <Button variant=\"outline\" size=\"sm\" onClick={onSave} disabled={isSaving}>\n {isSaving ? (\n <>\n <Spinner className=\"size-4\" />\n Saving...\n </>\n ) : (\n <>\n <Save className=\"size-4\" />\n Save\n </>\n )}\n </Button>\n )}\n\n {/* Share */}\n {onShare && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={onShare}>\n <Share2 className=\"size-4\" />\n Share\n </Button>\n </TooltipTrigger>\n <TooltipContent>Share dashboard with others</TooltipContent>\n </Tooltip>\n )}\n\n {/* Export */}\n {onExport && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={onExport}>\n <Download className=\"size-4\" />\n Export\n </Button>\n </TooltipTrigger>\n <TooltipContent>Export dashboard to JSON</TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </TooltipProvider>\n );\n});\n\nexport default DashboardToolbar;\n"],"mappings":";;;;;;;;;;AA4DA,IAAa,IAA8C,EAAK,SAA0B,EACxF,gBACA,UACA,gBACA,oBACA,mBAAgB,IAChB,YACA,WACA,cAAW,IACX,aACA,cACC;CACD,IAAM,IAAa,GAAmB,MAAU,EAAM,aAAa,OAAO,EACpE,IAAiB,GAAmB,MAAU,EAAM,eAAe,EACnE,IAAY,GAAmB,MAAU,EAAM,UAAU,EACzD,IAAe,GAAmB,MAAU,EAAM,aAAa,EAG/D,IAAe,CAAC,CADI,GAAgB,MAAU,EAAM,kBAAkB,EAItE,IAAc,QAAkB;AACpC,EAAI,KAAgB,KAClB,GAAS;IAEV,CAAC,GAAc,EAAQ,CAAC;AAE3B,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,KACC,kBAAC,MAAD;KAAI,WAAU;KAAgD;eAC3D;KACE,CAAA,EAGN,KAAe,kBAAC,GAAD,EAAiC,gBAAe,CAAA,CAC5D;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAgB,SAAA;gBACd,kBAAC,GAAD;OACE,SAAQ;OACR,MAAK;OACL,eAAe,EAAa,KAAK,IAAI,IAAI,IAAY,GAAG,CAAC;OACzD,UAAU,KAAa;iBAEvB,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;OACrB,CAAA;MACM,CAAA,EACjB,kBAAC,GAAD,EAAA,UAAgB,YAAyB,CAAA,CACjC,EAAA,CAAA;KAEV,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CAAkE,GAAU,IAAQ;;KAEpF,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAgB,SAAA;gBACd,kBAAC,GAAD;OACE,SAAQ;OACR,MAAK;OACL,eAAe,EAAa,KAAK,IAAI,KAAK,IAAY,GAAG,CAAC;OAC1D,UAAU,KAAa;iBAEvB,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;OACpB,CAAA;MACM,CAAA,EACjB,kBAAC,GAAD,EAAA,UAAgB,WAAwB,CAAA,CAChC,EAAA,CAAA;KAEV,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAgB,SAAA;gBACd,kBAAC,GAAD;OAAQ,SAAQ;OAAQ,MAAK;OAAK,eAAe,EAAa,IAAI;iBAAlE,CACE,kBAAC,GAAD,EAAW,WAAU,iBAAkB,CAAA,EAAA,QAEhC;;MACM,CAAA,EACjB,kBAAC,GAAD,EAAA,UAAgB,sBAAmC,CAAA,CAC3C,EAAA,CAAA;KACN;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,KACC,kBAAA,GAAA,EAAA,UAAA;MAEG,KACC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;OAAgB,SAAA;iBACd,kBAAC,GAAD;QAAQ,SAAS,IAAgB,cAAc;QAAW,MAAK;QAAK,SAAS;kBAA7E,CACmB,EAAhB,IAAiB,IAAwC,GAAzC,EAAgB,WAAU,UAAW,CAAmC,EAAC,UAEnF;;OACM,CAAA,EACjB,kBAAC,GAAD,EAAA,UACG,IAAgB,wBAAwB,uCAC1B,CAAA,CACT,EAAA,CAAA;MAIZ,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;OAAgB,SAAA;iBACd,kBAAC,GAAD;QAAQ,SAAQ;QAAQ,MAAK;QAAK,SAAS;QAAa,UAAU,CAAC;kBAAnE,CACE,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA,EAAA,QAEzB;;OACM,CAAA,EACjB,kBAAC,GAAD,EAAA,UAAgB,+BAA4C,CAAA,CACpD,EAAA,CAAA;MAGV,kBAAC,GAAD;OAAQ,MAAK;OAAK,SAAS;iBAA3B,CACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAAA,aAEpB;;MACR,EAAA,CAAA;KAIL,kBAAC,GAAD;MAAQ,SAAS,IAAa,cAAc;MAAW,MAAK;MAAK,SAAS;gBACvE,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAK,WAAU,UAAW,CAAA,EAAA,UAEzB,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA,EAAA,OAE5B,EAAA,CAAA;MAEE,CAAA;KAGR,KACC,kBAAC,GAAD;MAAQ,SAAQ;MAAU,MAAK;MAAK,SAAS;MAAQ,UAAU;gBAC5D,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAS,WAAU,UAAW,CAAA,EAAA,YAE7B,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAAA,OAE1B,EAAA,CAAA;MAEE,CAAA;KAIV,KACC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAgB,SAAA;gBACd,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,SAAS;iBAA7C,CACE,kBAAC,GAAD,EAAQ,WAAU,UAAW,CAAA,EAAA,QAEtB;;MACM,CAAA,EACjB,kBAAC,GAAD,EAAA,UAAgB,+BAA4C,CAAA,CACpD,EAAA,CAAA;KAIX,KACC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAgB,SAAA;gBACd,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,SAAS;iBAA7C,CACE,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA,EAAA,SAExB;;MACM,CAAA,EACjB,kBAAC,GAAD,EAAA,UAAgB,4BAAyC,CAAA,CACjD,EAAA,CAAA;KAER;;GACF;KACU,CAAA;EAEpB"}
1
+ {"version":3,"file":"DashboardToolbar.js","names":[],"sources":["../../../../src/bigconsole/components/dashboard/DashboardToolbar.tsx"],"sourcesContent":["/**\n * DashboardToolbar Component\n *\n * Toolbar for dashboard actions and controls.\n * Uses fe-libs shared components for consistent styling.\n * Phase 2: Added SavedViewsDropdown and Share button.\n */\n\nimport { type FC, memo, useCallback } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@burdenoff/fe-libs/ui';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport {\n Plus,\n Clipboard,\n Eye,\n Pencil,\n Save,\n Download,\n Minus,\n RotateCcw,\n Share2,\n PanelLeftClose,\n PanelLeft,\n Image as ImageIcon,\n FileText,\n} from 'lucide-react';\nimport { useDashboardStore, useWidgetStore } from '../../store';\nimport { SavedViewsDropdown } from './SavedViewsDropdown';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DashboardToolbarProps {\n /** Dashboard ID for saved views */\n dashboardId?: string;\n /** Dashboard title */\n title?: string;\n /** Callback to add widget */\n onAddWidget: () => void;\n /** Callback to toggle widget palette */\n onTogglePalette?: () => void;\n /** Whether palette is open */\n isPaletteOpen?: boolean;\n /** Callback to paste widget */\n onPaste?: () => void;\n /** Callback to save dashboard */\n onSave?: () => void;\n /** Whether save is in progress */\n isSaving?: boolean;\n /** Callback to export dashboard (JSON console definition) */\n onExport?: () => void;\n /** Callback to export the board as a PNG image */\n onExportImage?: () => void;\n /** Callback to export the board as a PDF */\n onExportPdf?: () => void;\n /** Whether an image/PDF export is in progress */\n isExportingImage?: boolean;\n /** Callback to open share dialog */\n onShare?: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const DashboardToolbar: FC<DashboardToolbarProps> = memo(function DashboardToolbar({\n dashboardId,\n title,\n onAddWidget,\n onTogglePalette,\n isPaletteOpen = false,\n onPaste,\n onSave,\n isSaving = false,\n onExport,\n onExportImage,\n onExportPdf,\n isExportingImage = false,\n onShare,\n}) {\n const isEditMode = useDashboardStore((state) => state.viewMode === 'edit');\n const toggleViewMode = useDashboardStore((state) => state.toggleViewMode);\n const zoomLevel = useDashboardStore((state) => state.zoomLevel);\n const setZoomLevel = useDashboardStore((state) => state.setZoomLevel);\n\n const clipboardWidgetId = useWidgetStore((state) => state.clipboardWidgetId);\n const hasClipboard = !!clipboardWidgetId;\n\n // Handle paste - use provided callback or fallback\n const handlePaste = useCallback(() => {\n if (hasClipboard && onPaste) {\n onPaste();\n }\n }, [hasClipboard, onPaste]);\n\n return (\n <TooltipProvider>\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 px-4 py-2 bg-background border-b\">\n {/* Left section */}\n <div className=\"flex min-w-0 items-center gap-4\">\n {title && (\n <h1 className=\"min-w-0 truncate text-lg font-semibold\" title={title}>\n {title}\n </h1>\n )}\n {/* Saved Views Dropdown */}\n {dashboardId && <SavedViewsDropdown dashboardId={dashboardId} />}\n </div>\n\n {/* Center section - Zoom controls */}\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setZoomLevel(Math.max(50, zoomLevel - 10))}\n disabled={zoomLevel <= 50}\n >\n <Minus className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Zoom out</TooltipContent>\n </Tooltip>\n\n <span className=\"text-sm text-muted-foreground w-12 text-center\">{zoomLevel}%</span>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => setZoomLevel(Math.min(200, zoomLevel + 10))}\n disabled={zoomLevel >= 200}\n >\n <Plus className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Zoom in</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setZoomLevel(100)}>\n <RotateCcw className=\"size-3.5 mr-1\" />\n Reset\n </Button>\n </TooltipTrigger>\n <TooltipContent>Reset zoom to 100%</TooltipContent>\n </Tooltip>\n </div>\n\n {/* Right section - Actions */}\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {isEditMode && (\n <>\n {/* Widget Palette Toggle */}\n {onTogglePalette && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant={isPaletteOpen ? 'secondary' : 'outline'} size=\"sm\" onClick={onTogglePalette}>\n {isPaletteOpen ? <PanelLeftClose className=\"size-4\" /> : <PanelLeft className=\"size-4\" />}\n Widgets\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {isPaletteOpen ? 'Hide widget palette' : 'Show widget palette for drag & drop'}\n </TooltipContent>\n </Tooltip>\n )}\n\n {/* Paste */}\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" onClick={handlePaste} disabled={!hasClipboard}>\n <Clipboard className=\"size-4\" />\n Paste\n </Button>\n </TooltipTrigger>\n <TooltipContent>Paste widget from clipboard</TooltipContent>\n </Tooltip>\n\n {/* Add Widget (Dialog) */}\n <Button size=\"sm\" onClick={onAddWidget}>\n <Plus className=\"size-4\" />\n Add Widget\n </Button>\n </>\n )}\n\n {/* Edit/View Mode Toggle */}\n <Button variant={isEditMode ? 'secondary' : 'outline'} size=\"sm\" onClick={toggleViewMode}>\n {isEditMode ? (\n <>\n <Eye className=\"size-4\" />\n Preview\n </>\n ) : (\n <>\n <Pencil className=\"size-4\" />\n Edit\n </>\n )}\n </Button>\n\n {/* Save */}\n {onSave && (\n <Button variant=\"outline\" size=\"sm\" onClick={onSave} disabled={isSaving}>\n {isSaving ? (\n <>\n <Spinner className=\"size-4\" />\n Saving...\n </>\n ) : (\n <>\n <Save className=\"size-4\" />\n Save\n </>\n )}\n </Button>\n )}\n\n {/* Share */}\n {onShare && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={onShare}>\n <Share2 className=\"size-4\" />\n Share\n </Button>\n </TooltipTrigger>\n <TooltipContent>Share dashboard with others</TooltipContent>\n </Tooltip>\n )}\n\n {/* Export — JSON definition */}\n {onExport && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={onExport}>\n <Download className=\"size-4\" />\n Export\n </Button>\n </TooltipTrigger>\n <TooltipContent>Export dashboard to JSON</TooltipContent>\n </Tooltip>\n )}\n\n {/* Export — board PNG */}\n {onExportImage && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"icon-sm\" onClick={onExportImage} disabled={isExportingImage}>\n {isExportingImage ? <Spinner className=\"size-4\" /> : <ImageIcon className=\"size-4\" />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>Export board as PNG image</TooltipContent>\n </Tooltip>\n )}\n\n {/* Export — board PDF */}\n {onExportPdf && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"icon-sm\" onClick={onExportPdf} disabled={isExportingImage}>\n <FileText className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Export board as PDF</TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </TooltipProvider>\n );\n});\n\nexport default DashboardToolbar;\n"],"mappings":"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"}
@@ -21,13 +21,24 @@ function m(e) {
21
21
  return typeof e == "number" && Number.isFinite(e);
22
22
  }
23
23
  function h(e) {
24
+ return e >= .66 ? "var(--color-status-error)" : e >= .33 ? "var(--color-status-warning)" : "var(--color-status-info)";
25
+ }
26
+ function g(e) {
27
+ let t = document.createElement("div"), n = document.createElement("div");
28
+ if (n.style.fontWeight = "600", n.textContent = e.popup || e.name || "Location", t.appendChild(n), m(e.value)) {
29
+ let n = document.createElement("div");
30
+ n.textContent = e.value.toLocaleString(), t.appendChild(n);
31
+ }
32
+ return t;
33
+ }
34
+ function _(e) {
24
35
  let t = e;
25
36
  return t && m(t.lat) && m(t.lng) ? {
26
37
  lat: t.lat,
27
38
  lng: t.lng
28
39
  } : void 0;
29
40
  }
30
- function g(e, t) {
41
+ function v(e, t) {
31
42
  let n = Array.isArray(e) ? void 0 : e, r = Array.isArray(e) ? e : e?.markers, i = Array.isArray(r) ? r.filter((e) => e && m(e.lat) && m(e.lng)) : [], a = (n?.geoJson ?? t.geoJson) || void 0, o = t.regionIdField || "id", s = /* @__PURE__ */ new Map(), c = n?.regions ?? t.regions;
32
43
  if (Array.isArray(c)) for (let e of c) {
33
44
  if (!e) continue;
@@ -39,18 +50,18 @@ function g(e, t) {
39
50
  }
40
51
  return {
41
52
  markers: i,
42
- center: h(n?.center),
53
+ center: _(n?.center),
43
54
  zoom: m(n?.zoom) ? n?.zoom : void 0,
44
- fallbackCenter: h(t.center),
55
+ fallbackCenter: _(t.center),
45
56
  fallbackZoom: m(t.zoom) ? t.zoom : void 0,
46
57
  geoJson: a && Array.isArray(a.features) ? a : void 0,
47
58
  regionValues: s
48
59
  };
49
60
  }
50
- var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
51
- let f = r(null), h = r(null), _ = r(null), [v, y] = i("loading"), b = n(() => e?.config ?? {}, [e?.config]), x = b.showMarkers !== !1, S = b.regionIdField || "id", { markers: C, center: w, zoom: T, fallbackCenter: E, fallbackZoom: D, geoJson: O, regionValues: k } = n(() => g(c, b), [c, b]), A = !!(O && k.size > 0), j = r(() => void 0);
61
+ var y = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
62
+ let f = r(null), _ = r(null), y = r(null), [b, x] = i("loading"), S = n(() => e?.config ?? {}, [e?.config]), C = S.showMarkers !== !1, w = S.mapMode === "heat", T = S.regionIdField || "id", { markers: E, center: D, zoom: O, fallbackCenter: k, fallbackZoom: A, geoJson: j, regionValues: M } = n(() => v(c, S), [c, S]), N = !!(j && M.size > 0), P = r(() => void 0);
52
63
  return t(() => {
53
- j.current = (e) => {
64
+ P.current = (e) => {
54
65
  u ? u(e) : l && l(e);
55
66
  };
56
67
  }, [l, u]), t(() => {
@@ -70,30 +81,30 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
70
81
  maxZoom: 18
71
82
  }), r = !1;
72
83
  n.on("tileload", () => {
73
- r = !0, y((e) => e === "error" ? "ready" : e);
84
+ r = !0, x((e) => e === "error" ? "ready" : e);
74
85
  }), n.on("tileerror", () => {
75
- r || y("error");
76
- }), n.addTo(t), h.current = t, _.current = null, y("ready");
86
+ r || x("error");
87
+ }), n.addTo(t), _.current = t, y.current = null, x("ready");
77
88
  } catch {
78
- y("error");
89
+ x("error");
79
90
  return;
80
91
  }
81
- let n = typeof ResizeObserver < "u" ? new ResizeObserver(() => h.current?.invalidateSize()) : void 0;
92
+ let n = typeof ResizeObserver < "u" ? new ResizeObserver(() => _.current?.invalidateSize()) : void 0;
82
93
  n?.observe(e);
83
94
  let r = window.setTimeout(() => t.invalidateSize(), 80);
84
95
  return () => {
85
- window.clearTimeout(r), n?.disconnect(), t.remove(), h.current = null;
96
+ window.clearTimeout(r), n?.disconnect(), t.remove(), _.current = null;
86
97
  };
87
98
  }, []), t(() => {
88
- let e = h.current;
99
+ let e = _.current;
89
100
  if (!e) return;
90
101
  let t = s.layerGroup(), n = null;
91
- if (O && k.size > 0) {
92
- let e = Array.from(k.values()).map((e) => e.value), r = Math.min(...e), i = Math.max(...e) - r || 1, a = (e) => {
93
- let t = e.properties ?? {}, n = e.id ?? t[S] ?? t.id ?? t.code;
94
- return n == null ? void 0 : k.get(String(n));
102
+ if (j && M.size > 0) {
103
+ let e = Array.from(M.values()).map((e) => e.value), r = Math.min(...e), i = Math.max(...e) - r || 1, a = (e) => {
104
+ let t = e.properties ?? {}, n = e.id ?? t[T] ?? t.id ?? t.code;
105
+ return n == null ? void 0 : M.get(String(n));
95
106
  };
96
- n = s.geoJSON(O, {
107
+ n = s.geoJSON(j, {
97
108
  style: (e) => {
98
109
  let t = e ? a(e) : void 0, n = t ? (t.value - r) / i : 0;
99
110
  return {
@@ -109,7 +120,7 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
109
120
  let e = document.createElement("div");
110
121
  e.textContent = n.value.toLocaleString(), i.appendChild(e);
111
122
  }
112
- t.bindPopup(i), t.on("click", () => j.current({
123
+ t.bindPopup(i), t.on("click", () => P.current({
113
124
  name: r,
114
125
  lat: NaN,
115
126
  lng: NaN,
@@ -118,7 +129,18 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
118
129
  }
119
130
  }), n.addTo(t);
120
131
  }
121
- if (x) for (let e of C) {
132
+ if (C && w) {
133
+ let e = E.map((e) => m(e.value) ? e.value : 1), n = e.reduce((e, t) => Math.min(e, t), Infinity), r = e.reduce((e, t) => Math.max(e, t), -Infinity) - n || 1;
134
+ E.forEach((i, a) => {
135
+ let o = (e[a] - n) / r, c = s.circleMarker([i.lat, i.lng], {
136
+ radius: 10 + o * 22,
137
+ fillColor: h(o),
138
+ fillOpacity: .25 + o * .35,
139
+ stroke: !1
140
+ }).addTo(t);
141
+ c.bindPopup(g(i)), c.on("click", () => P.current(i));
142
+ });
143
+ } else if (C) for (let e of E) {
122
144
  let n = document.createElement("div");
123
145
  Object.assign(n.style, {
124
146
  width: "14px",
@@ -134,51 +156,48 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
134
156
  html: n,
135
157
  iconSize: [14, 14],
136
158
  iconAnchor: [7, 14]
137
- }), i = s.marker([e.lat, e.lng], { icon: r }).addTo(t), a = document.createElement("div"), o = document.createElement("div");
138
- if (o.style.fontWeight = "600", o.textContent = e.popup || e.name || "Location", a.appendChild(o), m(e.value)) {
139
- let t = document.createElement("div");
140
- t.textContent = e.value.toLocaleString(), a.appendChild(t);
141
- }
142
- i.bindPopup(a), i.on("click", () => j.current(e));
159
+ }), i = s.marker([e.lat, e.lng], { icon: r }).addTo(t);
160
+ i.bindPopup(g(e)), i.on("click", () => P.current(e));
143
161
  }
144
162
  t.addTo(e);
145
163
  let r = JSON.stringify({
146
- m: C.map((e) => [e.lat, e.lng]),
147
- c: w ? [w.lat, w.lng] : null,
148
- z: T ?? null,
149
- fc: E ? [E.lat, E.lng] : null,
150
- fz: D ?? null,
151
- g: O ? k.size : 0
164
+ m: E.map((e) => [e.lat, e.lng]),
165
+ c: D ? [D.lat, D.lng] : null,
166
+ z: O ?? null,
167
+ fc: k ? [k.lat, k.lng] : null,
168
+ fz: A ?? null,
169
+ g: j ? M.size : 0
152
170
  });
153
- if (r !== _.current) if (_.current = r, w) e.setView([w.lat, w.lng], T ?? e.getZoom());
154
- else if (!C.length && n) {
171
+ if (r !== y.current) if (y.current = r, D) e.setView([D.lat, D.lng], O ?? e.getZoom());
172
+ else if (!E.length && n) {
155
173
  let t = n.getBounds();
156
174
  t.isValid() && e.fitBounds(t, {
157
175
  padding: [24, 24],
158
176
  maxZoom: 12
159
177
  });
160
- } else if (C.length === 1) e.setView([C[0].lat, C[0].lng], T ?? 8);
161
- else if (C.length > 1) {
162
- let t = s.latLngBounds(C.map((e) => [e.lat, e.lng]));
178
+ } else if (E.length === 1) e.setView([E[0].lat, E[0].lng], O ?? 8);
179
+ else if (E.length > 1) {
180
+ let t = s.latLngBounds(E.map((e) => [e.lat, e.lng]));
163
181
  e.fitBounds(t, {
164
182
  padding: [32, 32],
165
183
  maxZoom: 12
166
184
  });
167
- } else E ? e.setView([E.lat, E.lng], T ?? D ?? e.getZoom()) : m(T ?? D) && e.setZoom(T ?? D);
185
+ } else k ? e.setView([k.lat, k.lng], O ?? A ?? e.getZoom()) : m(O ?? A) && e.setZoom(O ?? A);
168
186
  let i = window.setTimeout(() => e.invalidateSize(), 0);
169
187
  return () => {
170
188
  window.clearTimeout(i), t.remove();
171
189
  };
172
190
  }, [
173
- C,
174
- w,
175
- T,
176
191
  E,
177
192
  D,
178
- x,
179
193
  O,
180
194
  k,
181
- S
195
+ A,
196
+ C,
197
+ w,
198
+ j,
199
+ M,
200
+ T
182
201
  ]), /* @__PURE__ */ o("div", {
183
202
  className: "relative h-full w-full overflow-hidden rounded-lg bg-bg-muted",
184
203
  children: [
@@ -186,7 +205,7 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
186
205
  ref: f,
187
206
  className: "h-full w-full"
188
207
  }),
189
- v !== "error" && C.length === 0 && !A && /* @__PURE__ */ a("div", {
208
+ b !== "error" && E.length === 0 && !N && /* @__PURE__ */ a("div", {
190
209
  className: "pointer-events-none absolute inset-0 z-[500] flex items-center justify-center bg-bg-muted/70 text-sm text-text-secondary",
191
210
  children: /* @__PURE__ */ o("div", {
192
211
  className: "text-center",
@@ -209,7 +228,7 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
209
228
  }), /* @__PURE__ */ a("p", { children: "No map data" })]
210
229
  })
211
230
  }),
212
- v === "error" && /* @__PURE__ */ a("div", {
231
+ b === "error" && /* @__PURE__ */ a("div", {
213
232
  className: "absolute inset-0 z-[500] flex items-center justify-center bg-bg-muted px-4 text-center text-sm text-text-secondary",
214
233
  children: "The map needs an internet connection and couldn’t load."
215
234
  })
@@ -217,6 +236,6 @@ var _ = e(function({ widget: e, data: c, onClick: l, onDrilldown: u }) {
217
236
  });
218
237
  });
219
238
  //#endregion
220
- export { _ as default };
239
+ export { y as default };
221
240
 
222
241
  //# sourceMappingURL=MapWidget.js.map