react-dashstream 0.0.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.
Files changed (75) hide show
  1. package/README.md +400 -0
  2. package/dist/AIOPsDashboard.d.ts +131 -0
  3. package/dist/AIOPsDashboard.d.ts.map +1 -0
  4. package/dist/components/Carousel.d.ts +64 -0
  5. package/dist/components/Carousel.d.ts.map +1 -0
  6. package/dist/components/CarouselContext.d.ts +27 -0
  7. package/dist/components/CarouselContext.d.ts.map +1 -0
  8. package/dist/components/ComponentDialog.d.ts +10 -0
  9. package/dist/components/ComponentDialog.d.ts.map +1 -0
  10. package/dist/components/ComponentDrillView.d.ts +98 -0
  11. package/dist/components/ComponentDrillView.d.ts.map +1 -0
  12. package/dist/components/Database3D.d.ts +38 -0
  13. package/dist/components/Database3D.d.ts.map +1 -0
  14. package/dist/components/DatabaseNode.d.ts +25 -0
  15. package/dist/components/DatabaseNode.d.ts.map +1 -0
  16. package/dist/components/HistoricalGraphPanel.d.ts +61 -0
  17. package/dist/components/HistoricalGraphPanel.d.ts.map +1 -0
  18. package/dist/components/HoloBase.d.ts +41 -0
  19. package/dist/components/HoloBase.d.ts.map +1 -0
  20. package/dist/components/Human3D.d.ts +27 -0
  21. package/dist/components/Human3D.d.ts.map +1 -0
  22. package/dist/components/HumanNode.d.ts +16 -0
  23. package/dist/components/HumanNode.d.ts.map +1 -0
  24. package/dist/components/Internal3DComponents.d.ts +132 -0
  25. package/dist/components/Internal3DComponents.d.ts.map +1 -0
  26. package/dist/components/MessageServer3D.d.ts +44 -0
  27. package/dist/components/MessageServer3D.d.ts.map +1 -0
  28. package/dist/components/MessageServerNode.d.ts +27 -0
  29. package/dist/components/MessageServerNode.d.ts.map +1 -0
  30. package/dist/components/NodeCallout.d.ts +31 -0
  31. package/dist/components/NodeCallout.d.ts.map +1 -0
  32. package/dist/components/Server3D.d.ts +45 -0
  33. package/dist/components/Server3D.d.ts.map +1 -0
  34. package/dist/components/ServerNode.d.ts +27 -0
  35. package/dist/components/ServerNode.d.ts.map +1 -0
  36. package/dist/components/Service.d.ts +119 -0
  37. package/dist/components/Service.d.ts.map +1 -0
  38. package/dist/components/ServiceDialog.d.ts +33 -0
  39. package/dist/components/ServiceDialog.d.ts.map +1 -0
  40. package/dist/components/ServiceNode.d.ts +105 -0
  41. package/dist/components/ServiceNode.d.ts.map +1 -0
  42. package/dist/components/SvgConnection.d.ts +44 -0
  43. package/dist/components/SvgConnection.d.ts.map +1 -0
  44. package/dist/components/SyncBridge.d.ts +31 -0
  45. package/dist/components/SyncBridge.d.ts.map +1 -0
  46. package/dist/components/WebDispatcher3D.d.ts +40 -0
  47. package/dist/components/WebDispatcher3D.d.ts.map +1 -0
  48. package/dist/components/WebDispatcherNode.d.ts +26 -0
  49. package/dist/components/WebDispatcherNode.d.ts.map +1 -0
  50. package/dist/components/index.d.ts +86 -0
  51. package/dist/components/index.d.ts.map +1 -0
  52. package/dist/data/CredentialsModal.d.ts +7 -0
  53. package/dist/data/CredentialsModal.d.ts.map +1 -0
  54. package/dist/data/DataProvider.d.ts +61 -0
  55. package/dist/data/DataProvider.d.ts.map +1 -0
  56. package/dist/data/index.d.ts +4 -0
  57. package/dist/data/index.d.ts.map +1 -0
  58. package/dist/index.css +1 -0
  59. package/dist/index.d.ts +10 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +7512 -0
  62. package/dist/services/ExchangeService.d.ts +54 -0
  63. package/dist/services/ExchangeService.d.ts.map +1 -0
  64. package/dist/services/SAPService.d.ts +56 -0
  65. package/dist/services/SAPService.d.ts.map +1 -0
  66. package/dist/services/index.d.ts +35 -0
  67. package/dist/services/index.d.ts.map +1 -0
  68. package/dist/services/sapSubComponents.d.ts +28 -0
  69. package/dist/services/sapSubComponents.d.ts.map +1 -0
  70. package/dist/theme.d.ts +76 -0
  71. package/dist/theme.d.ts.map +1 -0
  72. package/dist/types.d.ts +192 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/vite.svg +1 -0
  75. package/package.json +56 -0
package/README.md ADDED
@@ -0,0 +1,400 @@
1
+ # dashstream
2
+
3
+ Holographic 3D infrastructure monitoring dashboard for React. Pure CSS-3D — no WebGL, no canvas, no dependencies beyond React.
4
+
5
+ ```
6
+ npm install dashstream
7
+ ```
8
+
9
+ ---
10
+
11
+ ## Quick start
12
+
13
+ ```tsx
14
+ import "dashstream/dist/index.css";
15
+ import { AIOPsDashboard, Service, ServerNode, DatabaseNode } from "dashstream";
16
+ import type { ServiceMeta } from "dashstream";
17
+
18
+ const services: ServiceMeta[] = [
19
+ {
20
+ name: "My Service",
21
+ status: "online",
22
+ metrics: [
23
+ { label: "Service Health", value: "99.9%", color: "#00ff88" },
24
+ { label: "Avg Response Time", value: "14ms", color: "#00e5ff" },
25
+ ],
26
+ alerts: [{ level: "info", message: "All Systems Nominal" }],
27
+ },
28
+ ];
29
+
30
+ export default function App() {
31
+ return (
32
+ <AIOPsDashboard brandName="MY DASHBOARD" services={services}>
33
+ <Service
34
+ name="My Service"
35
+ status="online"
36
+ connections={[
37
+ { from: [330, 200], to: [200, 380], visibleAtPhase: 3 },
38
+ { from: [330, 200], to: [460, 380], visibleAtPhase: 3 },
39
+ ]}
40
+ >
41
+ <ServerNode
42
+ ex={200}
43
+ ey={380}
44
+ compactOffset={{ x: -30, y: -20 }}
45
+ zIndex={8}
46
+ name="SRV-01"
47
+ subLabel="APP SERVER"
48
+ status="online"
49
+ cpuLoad={42}
50
+ memLoad={60}
51
+ />
52
+ <DatabaseNode
53
+ ex={460}
54
+ ey={380}
55
+ compactOffset={{ x: 30, y: -20 }}
56
+ zIndex={7}
57
+ name="DB-01"
58
+ subLabel="PRIMARY"
59
+ status="online"
60
+ capacity={55}
61
+ />
62
+ </Service>
63
+ </AIOPsDashboard>
64
+ );
65
+ }
66
+ ```
67
+
68
+ Click a service to expand its topology. Click a component to drill into its internals.
69
+
70
+ ---
71
+
72
+ ## Full example — multi-service, multi-layer
73
+
74
+ Two services with different topologies rotating in a 3D carousel.
75
+ This is the example included in `example/Dashboard.tsx` inside this package.
76
+
77
+ ```tsx
78
+ import "dashstream/dist/index.css";
79
+ import { AIOPsDashboard, Service, HumanNode, WebDispatcherNode, ServerNode, DatabaseNode } from "dashstream";
80
+ import type { ServiceMeta } from "dashstream";
81
+
82
+ // ── Service metadata (drives the stats dialog) ──────────────────────────
83
+
84
+ const services: ServiceMeta[] = [
85
+ {
86
+ name: "Payment Gateway",
87
+ status: "critical",
88
+ metrics: [
89
+ { label: "Service Health", value: "76.3%", color: "#ff8c00" },
90
+ { label: "Avg Response Time", value: "243ms", color: "#ff8c00" },
91
+ { label: "Active Connections", value: "1,847", color: "#bb55ff" },
92
+ { label: "Request Throughput", value: "3.2k req/s", color: "#00e5ff" },
93
+ { label: "Error Rate", value: "3.81%", color: "#ff2255" },
94
+ ],
95
+ alerts: [{ level: "critical", message: "SRV-01 CPU at 99% — immediate action required" }],
96
+ },
97
+ {
98
+ name: "Auth Service",
99
+ status: "online",
100
+ metrics: [
101
+ { label: "Service Health", value: "99.9%", color: "#00ff88" },
102
+ { label: "Avg Response Time", value: "11ms", color: "#00e5ff" },
103
+ { label: "Active Sessions", value: "8,421", color: "#bb55ff" },
104
+ { label: "Auth Rate", value: "920 req/s", color: "#00e5ff" },
105
+ { label: "Failed Logins", value: "0.03%", color: "#00ff88" },
106
+ ],
107
+ alerts: [{ level: "info", message: "All Systems Nominal" }],
108
+ },
109
+ ];
110
+
111
+ // ── Payment Gateway — 4-layer topology ──────────────────────────────────
112
+
113
+ function PaymentGateway({ name }: { name: string }) {
114
+ return (
115
+ <Service
116
+ name={name}
117
+ status="critical"
118
+ connections={[
119
+ { from: [330, 100], to: [330, 230], visibleAtPhase: 2, color: "#00e5ff" },
120
+ { from: [330, 230], to: [200, 380], visibleAtPhase: 3 },
121
+ { from: [330, 230], to: [460, 380], visibleAtPhase: 3 },
122
+ { from: [200, 380], to: [330, 520], visibleAtPhase: 4, color: "#ff8c00" },
123
+ { from: [460, 380], to: [330, 520], visibleAtPhase: 4, color: "#ff8c00" },
124
+ ]}
125
+ >
126
+ <HumanNode
127
+ ex={330}
128
+ ey={100}
129
+ compactOffset={{ x: 0, y: -50 }}
130
+ zIndex={10}
131
+ visibleAtPhase={2}
132
+ color="#00e5ff"
133
+ scale={1.5}
134
+ />
135
+ <WebDispatcherNode
136
+ ex={330}
137
+ ey={230}
138
+ compactOffset={{ x: 0, y: -25 }}
139
+ zIndex={9}
140
+ name="GATEWAY"
141
+ subLabel="HTTP LAYER"
142
+ status="online"
143
+ traffic={82}
144
+ activeRoutes={6}
145
+ visibleAtPhase={2}
146
+ />
147
+ <ServerNode
148
+ ex={200}
149
+ ey={380}
150
+ compactOffset={{ x: -30, y: 10 }}
151
+ zIndex={8}
152
+ name="SRV-01"
153
+ subLabel="PROCESSOR"
154
+ status="critical"
155
+ cpuLoad={99}
156
+ memLoad={64}
157
+ alert={{ offsetX: -160, offsetY: -60, align: "left" }}
158
+ />
159
+ <ServerNode
160
+ ex={460}
161
+ ey={380}
162
+ compactOffset={{ x: 30, y: 10 }}
163
+ zIndex={8}
164
+ name="SRV-02"
165
+ subLabel="PROCESSOR"
166
+ delay="0.4s"
167
+ status="online"
168
+ cpuLoad={38}
169
+ memLoad={51}
170
+ />
171
+ <DatabaseNode
172
+ ex={330}
173
+ ey={520}
174
+ compactOffset={{ x: 0, y: 40 }}
175
+ zIndex={7}
176
+ name="PG-DB"
177
+ subLabel="PRIMARY"
178
+ color="#ff8c00"
179
+ status="online"
180
+ capacity={61}
181
+ />
182
+ </Service>
183
+ );
184
+ }
185
+
186
+ // ── Auth Service — 2-layer topology ─────────────────────────────────────
187
+
188
+ function AuthService({ name }: { name: string }) {
189
+ return (
190
+ <Service
191
+ name={name}
192
+ status="online"
193
+ connections={[
194
+ { from: [200, 200], to: [200, 380], visibleAtPhase: 3 },
195
+ { from: [460, 200], to: [460, 380], visibleAtPhase: 3 },
196
+ { from: [200, 380], to: [330, 520], visibleAtPhase: 4, color: "#ff8c00" },
197
+ { from: [460, 380], to: [330, 520], visibleAtPhase: 4, color: "#ff8c00" },
198
+ ]}
199
+ >
200
+ <ServerNode
201
+ ex={200}
202
+ ey={380}
203
+ compactOffset={{ x: -30, y: -20 }}
204
+ zIndex={8}
205
+ name="AUTH-01"
206
+ subLabel="IDENTITY"
207
+ status="online"
208
+ cpuLoad={34}
209
+ memLoad={48}
210
+ />
211
+ <ServerNode
212
+ ex={460}
213
+ ey={380}
214
+ compactOffset={{ x: 30, y: -20 }}
215
+ zIndex={8}
216
+ name="AUTH-02"
217
+ subLabel="SESSION"
218
+ delay="0.4s"
219
+ status="online"
220
+ cpuLoad={29}
221
+ memLoad={42}
222
+ />
223
+ <DatabaseNode
224
+ ex={330}
225
+ ey={520}
226
+ compactOffset={{ x: 0, y: 20 }}
227
+ zIndex={7}
228
+ name="AUTH-DB"
229
+ subLabel="PRIMARY"
230
+ color="#ff8c00"
231
+ status="online"
232
+ capacity={37}
233
+ />
234
+ </Service>
235
+ );
236
+ }
237
+
238
+ // ── Dashboard ───────────────────────────────────────────────────────────
239
+
240
+ export default function App() {
241
+ return (
242
+ <AIOPsDashboard brandName="DASHSTREAM" brandTag="EXAMPLE" services={services}>
243
+ <PaymentGateway name="Payment Gateway" />
244
+ <AuthService name="Auth Service" />
245
+ </AIOPsDashboard>
246
+ );
247
+ }
248
+ ```
249
+
250
+ ---
251
+
252
+ ## Components
253
+
254
+ ### Layout
255
+
256
+ | Component | Description |
257
+ | ---------------- | -------------------------------------------------------------------------------------------------------------- |
258
+ | `AIOPsDashboard` | Full dashboard shell — header, carousel, and state management. Drop services in as children. |
259
+ | `Service` | Service container — positions child nodes on a 3D orbit and draws connection lines between them. |
260
+ | `ServiceNode` | Low-level positioned wrapper with floating animation, scan line, and labels. Used by the compound nodes below. |
261
+
262
+ ### Compound nodes (recommended)
263
+
264
+ These combine `ServiceNode` + 3D model + `componentInfo` into a single element:
265
+
266
+ | Component | Key props | Description |
267
+ | ------------------- | ------------------------------------------------- | ------------------------------------------------------- |
268
+ | `ServerNode` | `status`, `cpuLoad`, `memLoad`, `brandLabel` | Application server tower with LEDs and CPU/memory bars. |
269
+ | `DatabaseNode` | `status`, `capacity` | Three-platter database cylinder with capacity bar. |
270
+ | `WebDispatcherNode` | `status`, `traffic`, `activeRoutes` | Network appliance with 8 port LEDs and traffic metrics. |
271
+ | `MessageServerNode` | `status`, `queueDepth`, `msgsPerSec`, `instances` | Message server with instance LEDs and queue metrics. |
272
+ | `HumanNode` | `status`, `scale` | SVG wireframe person icon for user/actor nodes. |
273
+
274
+ All compound nodes share: `ex`, `ey`, `compactOffset`, `zIndex`, `name`, `subLabel`, `color`, `delay`, `visibleAtPhase`, `alert`.
275
+
276
+ ### 3D models (low-level)
277
+
278
+ If you need full control, use the raw 3D models inside a `ServiceNode`:
279
+
280
+ `Server3D`, `Database3D`, `WebDispatcher3D`, `MessageServer3D`, `Human3D`
281
+
282
+ All 3D models accept: `rotateX`, `rotateY`, `rotateZ`, `scale`, `autoRotate`.
283
+
284
+ ### Status indicators
285
+
286
+ | Component | Props | Description |
287
+ | --------------- | ------------------------------------ | ---------------------------------------------------------------- |
288
+ | `SyncBridge` | `synced`, `latencyMs` | Database replication bridge between primary and standby. |
289
+ | `NodeCallout` | `status`, `title`, `msg`, `ex`, `ey` | Alert callout with leader line (auto-rendered by `ServiceNode`). |
290
+ | `HoloBase` | `size`, `color`, `widthRatio` | Neon holographic base platform (auto-rendered by `Service`). |
291
+ | `SvgConnection` | `x1`, `y1`, `x2`, `y2`, `show` | Animated dashed SVG connection line. |
292
+
293
+ ### Dialogs
294
+
295
+ | Component | Description |
296
+ | ----------------- | ----------------------------------------------------------------------------------------------- |
297
+ | `ServiceDialog` | Service-level stats panel — shows metrics and alerts. Auto-rendered when a service is expanded. |
298
+ | `ComponentDialog` | Component drill-down with sub-component internals and sparkline graphs. |
299
+
300
+ ### Drill-down internals
301
+
302
+ Rendered inside `ComponentDialog` when a component is inspected:
303
+
304
+ `CPU3D`, `Memory3D`, `DriveBay3D`, `NetworkBlock3D`, `ThreadPool3D`, `Platter3D`, `Port3D`, `HistoricalGraphPanel`, `ComponentDrillView`
305
+
306
+ ### Pre-built services
307
+
308
+ | Component | Topology |
309
+ | ----------------- | --------------------------------------------------------------------------------- |
310
+ | `SAPService` | Users → Web Dispatcher + Message Server → 3 App Servers → Primary DB + Standby DB |
311
+ | `ExchangeService` | Users → Dispatcher → 3 App Servers → Primary DB + Standby DB |
312
+
313
+ ---
314
+
315
+ ## Building a custom service
316
+
317
+ Compose compound nodes inside a `Service` container. Each node needs:
318
+
319
+ - **`ex`, `ey`** — Position in the expanded topology (pixels from top-left of scene).
320
+ - **`compactOffset`** — Offset from the service center in the compact carousel view.
321
+ - **`zIndex`** — Stacking order (higher tiers get higher values).
322
+ - **`visibleAtPhase`** — When the node fades in during expansion (0–6). Use `2` for top-tier nodes, `3` for middle, etc.
323
+
324
+ Define connection lines between nodes via the `connections` prop on `Service`:
325
+
326
+ ```tsx
327
+ connections={[
328
+ { from: [x1, y1], to: [x2, y2], visibleAtPhase: 3 },
329
+ { from: [x1, y1], to: [x2, y2], visibleAtPhase: 4, color: "#ff8c00" },
330
+ ]}
331
+ ```
332
+
333
+ ### Alerts
334
+
335
+ Nodes automatically detect threshold breaches and render alert callouts. Default thresholds:
336
+
337
+ - **Warning** at 70%
338
+ - **Critical** at 85%
339
+
340
+ Position the callout with the `alert` prop:
341
+
342
+ ```tsx
343
+ <ServerNode
344
+ alert={{ offsetX: -160, offsetY: -60, align: "left" }}
345
+ cpuLoad={99}
346
+ ...
347
+ />
348
+ ```
349
+
350
+ ### Service dialog
351
+
352
+ Pass `ServiceMeta` objects to `AIOPsDashboard` via the `services` prop to populate the stats panel that appears when a service is expanded:
353
+
354
+ ```tsx
355
+ const services: ServiceMeta[] = [
356
+ {
357
+ name: "My Service",
358
+ status: "online",
359
+ metrics: [
360
+ { label: "Service Health", value: "99.9%", color: "#00ff88" },
361
+ { label: "Avg Response Time", value: "14ms", color: "#00e5ff" },
362
+ ],
363
+ alerts: [{ level: "info", message: "All Systems Nominal" }],
364
+ },
365
+ ];
366
+ ```
367
+
368
+ ---
369
+
370
+ ## Status types
371
+
372
+ ```ts
373
+ type ComponentStatus = "online" | "warning" | "critical" | "offline";
374
+ ```
375
+
376
+ | Status | Color | Glow |
377
+ | ---------- | --------- | -------- |
378
+ | `online` | `#00e5ff` | cyan |
379
+ | `warning` | `#ff8c00` | orange |
380
+ | `critical` | `#ff2255` | red |
381
+ | `offline` | `#1e3a5a` | dim blue |
382
+
383
+ ---
384
+
385
+ ## Theme constants
386
+
387
+ ```ts
388
+ import { STATUS_CFG, HOLO_CYAN, HOLO_BLUE, HOLO_SURFACE, HOLO_GLASS, makeFaceStyles } from "dashstream";
389
+ ```
390
+
391
+ - `STATUS_CFG` — status-to-color lookup table
392
+ - `HOLO_CYAN` / `HOLO_BLUE` — accent colors
393
+ - `HOLO_SURFACE` / `HOLO_GLASS` — CSS gradient backgrounds for 3D faces
394
+ - `makeFaceStyles(W, H, D)` — generates CSS transforms for the 6 faces of a 3D box
395
+
396
+ ---
397
+
398
+ ## License
399
+
400
+ MIT
@@ -0,0 +1,131 @@
1
+ import { default as React } from 'react';
2
+ import { DataBindings } from './data/DataProvider';
3
+ import { ComponentStatus } from './types';
4
+ import { ServiceDialogMetric, ServiceDialogAlert } from './components/ServiceDialog';
5
+ /**
6
+ * Minimal metadata for each service in the carousel.
7
+ * Used to populate the {@link ServiceDialog} when a service is selected.
8
+ */
9
+ export interface ServiceMeta {
10
+ /** Service display name (must match the service component's `name`). */
11
+ name: string;
12
+ /** Overall health status of this service. */
13
+ status: ComponentStatus;
14
+ /** Whether the service's databases are in sync. Defaults to `true`. */
15
+ dbSync?: boolean;
16
+ /** Service-level KPI metrics for the stats dialog. */
17
+ metrics?: ServiceDialogMetric[];
18
+ /** System alerts for the stats dialog. */
19
+ alerts?: ServiceDialogAlert[];
20
+ }
21
+ /**
22
+ * Binds a single ServiceDialog metric row to a PromQL query.
23
+ * Resolved values are displayed in the service stats panel.
24
+ */
25
+ export interface ServiceMetricBinding {
26
+ label: string;
27
+ query: string;
28
+ unit?: string;
29
+ color?: string;
30
+ transform?: (raw: unknown) => string;
31
+ }
32
+ export interface AIOPsDashboardProps {
33
+ /** Dashboard title displayed in the header. */
34
+ title?: string;
35
+ /** Brand name shown with the pulse indicator. Defaults to `"BUSAUD AIOps"`. */
36
+ brandName?: string;
37
+ /** Tag badge in the header corner. Defaults to `"3D MONITOR"`. */
38
+ brandTag?: string;
39
+ /**
40
+ * Metadata for each service — used for the service-level stats dialog.
41
+ * Each entry should match a child service component by `name`.
42
+ */
43
+ services?: ServiceMeta[];
44
+ /** Optional background image URL. */
45
+ backgroundImage?: string;
46
+ /** Optional logo/image URL displayed in the center of the carousel orbit. */
47
+ logoUrl?: string;
48
+ /** Angular speed of the carousel rotation (radians per frame). Defaults to `0.006`. */
49
+ carouselSpeed?: number;
50
+ /** Font family applied to the entire dashboard. Defaults to the library default. */
51
+ fontFamily?: string;
52
+ /**
53
+ * Enables the live-data pipeline.
54
+ *
55
+ * When `true` (and `dataEndpoint` + `dataBindings` are provided),
56
+ * the dashboard wraps itself in a {@link DataProvider}, shows the
57
+ * credentials modal on first load, and begins polling for live
58
+ * metric values.
59
+ *
60
+ * Without this flag the dashboard renders with static / default
61
+ * data only — no network requests, no credentials prompt.
62
+ *
63
+ * @default false
64
+ */
65
+ liveData?: boolean;
66
+ /**
67
+ * Base URL of the PromQL-compatible endpoint.
68
+ * Only used when `liveData` is `true`.
69
+ *
70
+ * Queries are sent as `GET <endpoint>?query=<promQL>`.
71
+ */
72
+ dataEndpoint?: string;
73
+ /**
74
+ * Maps **service name → prop name → PromQL query**.
75
+ *
76
+ * Each binding is either a bare query string (uses the global
77
+ * `dataTransform`) or `{ query, transform }` for per-binding control.
78
+ *
79
+ * The package automatically injects resolved values as props into
80
+ * the matching child service component (matched by `name`).
81
+ *
82
+ * @example
83
+ * ```tsx
84
+ * dataBindings={{
85
+ * "Service Alpha": {
86
+ * cpuLoad: 'cpu_usage{instance="srv-01"}',
87
+ * status: {
88
+ * query: 'up{instance="srv-01"}',
89
+ * transform: (v) => (v > 0 ? "online" : "offline"),
90
+ * },
91
+ * },
92
+ * }}
93
+ * ```
94
+ */
95
+ dataBindings?: DataBindings;
96
+ /**
97
+ * Global transform applied to every raw endpoint response before it is
98
+ * injected as a prop. Individual bindings can override this with their
99
+ * own `transform`.
100
+ *
101
+ * Defaults to a Prometheus-aware extractor that returns the scalar
102
+ * value from instant-vector or scalar responses.
103
+ */
104
+ dataTransform?: (raw: unknown) => unknown;
105
+ /** Override the default 60 s polling interval (in milliseconds). */
106
+ dataRefreshInterval?: number;
107
+ /**
108
+ * Maps **service name → array of metric bindings** for the service
109
+ * stats dialog. Each binding fetches a PromQL value and displays
110
+ * it as a KPI row in the {@link ServiceDialog}.
111
+ *
112
+ * @example
113
+ * ```tsx
114
+ * serviceDataBindings={{
115
+ * "ServiceX": [
116
+ * { label: "Uptime", query: 'uptime{svc="x"}', unit: "%", color: "#00ff88" },
117
+ * { label: "Latency", query: 'latency{svc="x"}', unit: "ms", color: "#00e5ff" },
118
+ * ],
119
+ * }}
120
+ * ```
121
+ */
122
+ serviceDataBindings?: Record<string, ServiceMetricBinding[]>;
123
+ /**
124
+ * Service components to display in the carousel.
125
+ * Each child should be a service component (e.g. `<SAPService>`)
126
+ * that internally renders the library `<Service>` container.
127
+ */
128
+ children: React.ReactNode;
129
+ }
130
+ export default function AIOPsDashboard(props: AIOPsDashboardProps): import("react/jsx-runtime").JSX.Element;
131
+ //# sourceMappingURL=AIOPsDashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIOPsDashboard.d.ts","sourceRoot":"","sources":["../src/AIOPsDashboard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAyC,MAAM,OAAO,CAAC;AAI9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAgC,eAAe,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,aAAa,CAAC;AAMrB;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,EAAE,eAAe,CAAC;IACxB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAChC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAChC,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC7D;;;;OAIG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B;AAMD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA4BhE"}
@@ -0,0 +1,64 @@
1
+ import { default as React } from 'react';
2
+ import { ViewState, SelectedComponent, ComponentStatus } from '../types';
3
+ import { ServiceDialogMetric, ServiceDialogAlert } from './ServiceDialog';
4
+ export interface CarouselProps {
5
+ /** Service components to display in the carousel. Each must be a `<Service>`. */
6
+ children: React.ReactNode;
7
+ /** Optional logo URL displayed in the center of the carousel. */
8
+ logoUrl?: string;
9
+ /** Current view state of the carousel. */
10
+ viewState: ViewState;
11
+ /** Current expansion animation phase (0–6). */
12
+ animPhase: number;
13
+ /** Name of the currently selected/expanded system, or `null`. */
14
+ selectedSystem: string | null;
15
+ /** Currently selected component for drill-down, or `null`. */
16
+ selectedComponent: SelectedComponent | null;
17
+ /** Drill-down animation phase (0–1). */
18
+ drillAnimPhase: number;
19
+ /** Y-axis rotation for all 3D components (degrees). */
20
+ rotateY?: number;
21
+ /** Whether 3D components auto-rotate around the Y axis. */
22
+ autoRotateComponents?: boolean;
23
+ /** Scale factor for components in expanded view (0.3–1.5). */
24
+ componentScale?: number;
25
+ /** Zoom factor when drilling into a component (1.5–6). Defaults to `3.3`. */
26
+ drillZoom?: number;
27
+ /** Whether the carousel auto-rotates when in compact view. Defaults to `true`. */
28
+ autoRotateCarousel?: boolean;
29
+ /** Angular speed of the carousel rotation (radians per frame). Defaults to `0.006`. */
30
+ carouselSpeed?: number;
31
+ /** Width of the scene container in pixels. Defaults to `660`. */
32
+ width?: number;
33
+ /** Height of the scene container in pixels. Defaults to `600`. */
34
+ height?: number;
35
+ /** Called when a service is clicked in compact view. */
36
+ onSelectSystem: (name: string) => void;
37
+ /** Called when the background is clicked (collapse or close drill). */
38
+ onBackgroundClick: () => void;
39
+ /** Called when a component node is clicked for drill-down. */
40
+ onComponentClick: (info: SelectedComponent) => void;
41
+ /** Called when a selected component's live data updates (no animation reset). */
42
+ onComponentDataUpdate?: (info: SelectedComponent) => void;
43
+ /** Called when the drill-down view close button is clicked. */
44
+ onCloseDrill: () => void;
45
+ /**
46
+ * Overall status of the currently selected system.
47
+ * Used to populate the {@link ServiceDialog}. Defaults to `"online"`.
48
+ */
49
+ selectedSystemStatus?: ComponentStatus;
50
+ /** Whether the selected system's databases are in sync. Defaults to `true`. */
51
+ selectedSystemDbSync?: boolean;
52
+ /** Service-level KPI metrics for the stats dialog. */
53
+ selectedSystemMetrics?: ServiceDialogMetric[];
54
+ /** System alerts for the stats dialog. */
55
+ selectedSystemAlerts?: ServiceDialogAlert[];
56
+ }
57
+ /**
58
+ * Grand carousel container.
59
+ *
60
+ * Positions child services on a 3D elliptical orbit, manages the
61
+ * rotation animation, and renders overlay dialogs.
62
+ */
63
+ export default function Carousel({ children, logoUrl, viewState, animPhase, selectedSystem, selectedComponent, drillAnimPhase, rotateY, autoRotateComponents, componentScale, drillZoom, autoRotateCarousel, carouselSpeed, width, height, onSelectSystem, onBackgroundClick: _onBackgroundClick, onComponentClick, onComponentDataUpdate, onCloseDrill, selectedSystemStatus, selectedSystemDbSync, selectedSystemMetrics, selectedSystemAlerts, }: CarouselProps): import("react/jsx-runtime").JSX.Element;
64
+ //# sourceMappingURL=Carousel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../src/components/Carousel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAI/E,MAAM,WAAW,aAAa;IAC1B,iFAAiF;IACjF,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAE1B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IAIjB,0CAA0C;IAC1C,SAAS,EAAE,SAAS,CAAC;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8DAA8D;IAC9D,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IAIvB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IAIvB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAIhB,wDAAwD;IACxD,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,uEAAuE;IACvE,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,8DAA8D;IAC9D,gBAAgB,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD,iFAAiF;IACjF,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1D,+DAA+D;IAC/D,YAAY,EAAE,MAAM,IAAI,CAAC;IAIzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,eAAe,CAAC;IACvC,+EAA+E;IAC/E,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9C,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC7B,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,OAAY,EACZ,oBAA2B,EAC3B,cAAqB,EACrB,SAAe,EACf,kBAAyB,EACzB,aAAqB,EACrB,KAAW,EACX,MAAY,EACZ,cAAc,EACd,iBAAiB,EAAE,kBAAkB,EACrC,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,oBAA+B,EAC/B,oBAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,GACvB,EAAE,aAAa,2CAiJf"}
@@ -0,0 +1,27 @@
1
+ import { ViewState, SelectedComponent } from '../types';
2
+ import { ServiceDialogAlert } from './ServiceDialog';
3
+ export interface CarouselContextValue {
4
+ totalSystems: number;
5
+ carouselRotation: number;
6
+ viewState: ViewState;
7
+ animPhase: number;
8
+ selectedSystem: string | null;
9
+ selectedComponent: SelectedComponent | null;
10
+ rotateY: number;
11
+ autoRotateComponents: boolean;
12
+ componentScale: number;
13
+ drillZoom: number;
14
+ onSelectSystem: (name: string) => void;
15
+ onComponentClick: (info: SelectedComponent) => void;
16
+ onComponentDataUpdate?: (info: SelectedComponent) => void;
17
+ containerWidth: number;
18
+ onNodeAlertsChange?: (serviceName: string, alerts: ServiceDialogAlert[]) => void;
19
+ }
20
+ export interface CarouselItemContextValue {
21
+ index: number;
22
+ }
23
+ export declare const CarouselContext: import('react').Context<CarouselContextValue | null>;
24
+ export declare const CarouselItemContext: import('react').Context<CarouselItemContextValue>;
25
+ export declare function useCarouselContext(): CarouselContextValue | null;
26
+ export declare function useCarouselItemContext(): CarouselItemContextValue;
27
+ //# sourceMappingURL=CarouselContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CarouselContext.d.ts","sourceRoot":"","sources":["../../src/components/CarouselContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;CACpF;AAED,MAAM,WAAW,wBAAwB;IACrC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,eAAe,sDAAmD,CAAC;AAChF,eAAO,MAAM,mBAAmB,mDAAwD,CAAC;AAEzF,wBAAgB,kBAAkB,gCAEjC;AAED,wBAAgB,sBAAsB,6BAErC"}
@@ -0,0 +1,10 @@
1
+ import { SelectedComponent } from '../types';
2
+ export interface ComponentDialogProps {
3
+ component: SelectedComponent;
4
+ onClose: () => void;
5
+ visible: boolean;
6
+ sceneWidth?: number;
7
+ sceneHeight?: number;
8
+ }
9
+ export default function ComponentDialog({ component, onClose, visible, sceneWidth, sceneHeight, }: ComponentDialogProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=ComponentDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComponentDialog.d.ts","sourceRoot":"","sources":["../../src/components/ComponentDialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAC;AAIzE,MAAM,WAAW,oBAAoB;IACjC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AA2BD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACpC,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAgB,EAChB,WAAiB,GACpB,EAAE,oBAAoB,2CAoVtB"}