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.
- package/README.md +400 -0
- package/dist/AIOPsDashboard.d.ts +131 -0
- package/dist/AIOPsDashboard.d.ts.map +1 -0
- package/dist/components/Carousel.d.ts +64 -0
- package/dist/components/Carousel.d.ts.map +1 -0
- package/dist/components/CarouselContext.d.ts +27 -0
- package/dist/components/CarouselContext.d.ts.map +1 -0
- package/dist/components/ComponentDialog.d.ts +10 -0
- package/dist/components/ComponentDialog.d.ts.map +1 -0
- package/dist/components/ComponentDrillView.d.ts +98 -0
- package/dist/components/ComponentDrillView.d.ts.map +1 -0
- package/dist/components/Database3D.d.ts +38 -0
- package/dist/components/Database3D.d.ts.map +1 -0
- package/dist/components/DatabaseNode.d.ts +25 -0
- package/dist/components/DatabaseNode.d.ts.map +1 -0
- package/dist/components/HistoricalGraphPanel.d.ts +61 -0
- package/dist/components/HistoricalGraphPanel.d.ts.map +1 -0
- package/dist/components/HoloBase.d.ts +41 -0
- package/dist/components/HoloBase.d.ts.map +1 -0
- package/dist/components/Human3D.d.ts +27 -0
- package/dist/components/Human3D.d.ts.map +1 -0
- package/dist/components/HumanNode.d.ts +16 -0
- package/dist/components/HumanNode.d.ts.map +1 -0
- package/dist/components/Internal3DComponents.d.ts +132 -0
- package/dist/components/Internal3DComponents.d.ts.map +1 -0
- package/dist/components/MessageServer3D.d.ts +44 -0
- package/dist/components/MessageServer3D.d.ts.map +1 -0
- package/dist/components/MessageServerNode.d.ts +27 -0
- package/dist/components/MessageServerNode.d.ts.map +1 -0
- package/dist/components/NodeCallout.d.ts +31 -0
- package/dist/components/NodeCallout.d.ts.map +1 -0
- package/dist/components/Server3D.d.ts +45 -0
- package/dist/components/Server3D.d.ts.map +1 -0
- package/dist/components/ServerNode.d.ts +27 -0
- package/dist/components/ServerNode.d.ts.map +1 -0
- package/dist/components/Service.d.ts +119 -0
- package/dist/components/Service.d.ts.map +1 -0
- package/dist/components/ServiceDialog.d.ts +33 -0
- package/dist/components/ServiceDialog.d.ts.map +1 -0
- package/dist/components/ServiceNode.d.ts +105 -0
- package/dist/components/ServiceNode.d.ts.map +1 -0
- package/dist/components/SvgConnection.d.ts +44 -0
- package/dist/components/SvgConnection.d.ts.map +1 -0
- package/dist/components/SyncBridge.d.ts +31 -0
- package/dist/components/SyncBridge.d.ts.map +1 -0
- package/dist/components/WebDispatcher3D.d.ts +40 -0
- package/dist/components/WebDispatcher3D.d.ts.map +1 -0
- package/dist/components/WebDispatcherNode.d.ts +26 -0
- package/dist/components/WebDispatcherNode.d.ts.map +1 -0
- package/dist/components/index.d.ts +86 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/data/CredentialsModal.d.ts +7 -0
- package/dist/data/CredentialsModal.d.ts.map +1 -0
- package/dist/data/DataProvider.d.ts +61 -0
- package/dist/data/DataProvider.d.ts.map +1 -0
- package/dist/data/index.d.ts +4 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7512 -0
- package/dist/services/ExchangeService.d.ts +54 -0
- package/dist/services/ExchangeService.d.ts.map +1 -0
- package/dist/services/SAPService.d.ts +56 -0
- package/dist/services/SAPService.d.ts.map +1 -0
- package/dist/services/index.d.ts +35 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/sapSubComponents.d.ts +28 -0
- package/dist/services/sapSubComponents.d.ts.map +1 -0
- package/dist/theme.d.ts +76 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/types.d.ts +192 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/vite.svg +1 -0
- 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"}
|