react-aiops 0.0.1 → 0.0.3
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 +270 -0
- package/dist/AIOPsDashboard.d.ts +3 -1
- package/dist/AIOPsDashboard.d.ts.map +1 -1
- package/dist/components/Carousel.d.ts +3 -1
- package/dist/components/Carousel.d.ts.map +1 -1
- package/dist/index.css +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2229 -2136
- package/package.json +8 -4
package/README.md
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# react-aiops
|
|
2
|
+
|
|
3
|
+
Holographic 3D infrastructure monitoring dashboard for React. Pure CSS-3D components — no WebGL, no canvas, no dependencies beyond React.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
npm install react-aiops
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import "react-aiops/dist/index.css";
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Quickstart (absolute minimum)
|
|
16
|
+
|
|
17
|
+
A single server on screen in 5 lines:
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import "react-aiops/dist/index.css";
|
|
21
|
+
import { Server3D } from "react-aiops";
|
|
22
|
+
|
|
23
|
+
export default function App() {
|
|
24
|
+
return <Server3D status="online" cpuLoad={42} memLoad={60} />;
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Minimal dashboard
|
|
31
|
+
|
|
32
|
+
A full rotating carousel with one service — no config objects, no state management:
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import "react-aiops/dist/index.css";
|
|
36
|
+
import { AIOPsDashboard, SAPService } from "react-aiops";
|
|
37
|
+
|
|
38
|
+
export default function App() {
|
|
39
|
+
return (
|
|
40
|
+
<AIOPsDashboard>
|
|
41
|
+
<SAPService
|
|
42
|
+
config={{
|
|
43
|
+
name: "SAP HR",
|
|
44
|
+
wdStatus: "online",
|
|
45
|
+
msStatus: "online",
|
|
46
|
+
srv1Status: "online",
|
|
47
|
+
srv2Status: "online",
|
|
48
|
+
srv3Status: "online",
|
|
49
|
+
pdbStatus: "online",
|
|
50
|
+
sdbStatus: "online",
|
|
51
|
+
dbSync: true,
|
|
52
|
+
}}
|
|
53
|
+
/>
|
|
54
|
+
</AIOPsDashboard>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Click a service to expand its topology. Click a component to drill into its internals.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Full-featured dashboard
|
|
64
|
+
|
|
65
|
+
Multiple services, mixed statuses, service dialog metadata:
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
import "react-aiops/dist/index.css";
|
|
69
|
+
import {
|
|
70
|
+
AIOPsDashboard,
|
|
71
|
+
SAPService,
|
|
72
|
+
ExchangeService,
|
|
73
|
+
computeSAPServiceStatus,
|
|
74
|
+
computeSAPDialogMetrics,
|
|
75
|
+
computeSAPDialogAlerts,
|
|
76
|
+
computeExchangeServiceStatus,
|
|
77
|
+
computeExchangeDialogMetrics,
|
|
78
|
+
computeExchangeDialogAlerts,
|
|
79
|
+
} from "react-aiops";
|
|
80
|
+
import type { SAPServiceConfig, ExchangeServiceConfig, ServiceMeta } from "react-aiops";
|
|
81
|
+
|
|
82
|
+
const sapHR: SAPServiceConfig = {
|
|
83
|
+
name: "SAP HR",
|
|
84
|
+
wdStatus: "online",
|
|
85
|
+
msStatus: "online",
|
|
86
|
+
srv1Status: "online",
|
|
87
|
+
srv2Status: "warning",
|
|
88
|
+
srv3Status: "online",
|
|
89
|
+
pdbStatus: "online",
|
|
90
|
+
sdbStatus: "online",
|
|
91
|
+
dbSync: true,
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const exchange: ExchangeServiceConfig = {
|
|
95
|
+
name: "Exchange",
|
|
96
|
+
dispStatus: "critical",
|
|
97
|
+
srv1Status: "online",
|
|
98
|
+
srv2Status: "online",
|
|
99
|
+
srv3Status: "offline",
|
|
100
|
+
pdbStatus: "online",
|
|
101
|
+
sdbStatus: "warning",
|
|
102
|
+
dbSync: false,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const services: ServiceMeta[] = [
|
|
106
|
+
{
|
|
107
|
+
name: sapHR.name,
|
|
108
|
+
status: computeSAPServiceStatus(sapHR),
|
|
109
|
+
dbSync: sapHR.dbSync,
|
|
110
|
+
metrics: computeSAPDialogMetrics(sapHR),
|
|
111
|
+
alerts: computeSAPDialogAlerts(sapHR),
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: exchange.name,
|
|
115
|
+
status: computeExchangeServiceStatus(exchange),
|
|
116
|
+
dbSync: exchange.dbSync,
|
|
117
|
+
metrics: computeExchangeDialogMetrics(exchange),
|
|
118
|
+
alerts: computeExchangeDialogAlerts(exchange),
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
|
|
122
|
+
export default function App() {
|
|
123
|
+
return (
|
|
124
|
+
<AIOPsDashboard services={services} brandName="MY AIOPS" brandTag="LIVE">
|
|
125
|
+
<SAPService config={sapHR} />
|
|
126
|
+
<ExchangeService config={exchange} />
|
|
127
|
+
</AIOPsDashboard>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Components
|
|
135
|
+
|
|
136
|
+
### Layout
|
|
137
|
+
|
|
138
|
+
| Component | Description |
|
|
139
|
+
|---|---|
|
|
140
|
+
| `AIOPsDashboard` | Full dashboard shell with header, carousel, and state management. Drop services in as children. |
|
|
141
|
+
| `Carousel` | Low-level carousel container. Use this if you want to manage view state yourself. |
|
|
142
|
+
| `Service` | Service container — positions child nodes on a 3D orbit and draws connection lines. |
|
|
143
|
+
| `ServiceNode` | Positions a 3D component in the topology with floating animation, scan line, and labels. |
|
|
144
|
+
|
|
145
|
+
### 3D Hardware Models
|
|
146
|
+
|
|
147
|
+
| Component | Props | Description |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| `Server3D` | `status`, `cpuLoad`, `memLoad`, `name` | Vertical server tower with LEDs, drive bays, CPU/memory bars. |
|
|
150
|
+
| `Database3D` | `status`, `capacity`, `name` | Three-platter database cylinder with status LEDs and capacity bar. |
|
|
151
|
+
| `WebDispatcher3D` | `status`, `traffic`, `activeRoutes`, `name` | Flat network appliance with 8 port LEDs and traffic metrics. |
|
|
152
|
+
| `MessageServer3D` | `status`, `queueDepth`, `msgsPerSec`, `instances`, `name` | Message server with ABAP instance LEDs and queue metrics. |
|
|
153
|
+
| `Human3D` | `status`, `scale` | SVG wireframe person icon for user/actor nodes. |
|
|
154
|
+
|
|
155
|
+
All 3D components share these optional props: `rotateX`, `rotateY`, `rotateZ`, `scale`, `autoRotate`.
|
|
156
|
+
|
|
157
|
+
### Status Indicators
|
|
158
|
+
|
|
159
|
+
| Component | Props | Description |
|
|
160
|
+
|---|---|---|
|
|
161
|
+
| `SyncBridge` | `synced`, `latencyMs` | Database replication status bridge (synced/lag with latency). |
|
|
162
|
+
| `NodeCallout` | `status`, `title`, `msg`, `ex`, `ey`, `offsetX`, `offsetY` | Alert callout with leader line for unhealthy nodes. |
|
|
163
|
+
| `HoloBase` | `size`, `color`, `widthRatio` | Neon holographic base platform. |
|
|
164
|
+
| `SvgConnection` | `x1`, `y1`, `x2`, `y2`, `show` | Animated dashed SVG connection line. |
|
|
165
|
+
|
|
166
|
+
### Dialogs
|
|
167
|
+
|
|
168
|
+
| Component | Description |
|
|
169
|
+
|---|---|
|
|
170
|
+
| `ServiceDialog` | Service-level statistics panel (auto-rendered by Carousel). |
|
|
171
|
+
| `ComponentDialog` | Component drill-down with sub-component internals and sparkline graphs. |
|
|
172
|
+
|
|
173
|
+
### Drill-down Internals
|
|
174
|
+
|
|
175
|
+
These render inside `ComponentDialog` when a component is drilled into:
|
|
176
|
+
|
|
177
|
+
`CPU3D`, `Memory3D`, `DriveBay3D`, `NetworkBlock3D`, `ThreadPool3D`, `Platter3D`, `Port3D`, `HistoricalGraphPanel`, `ComponentDrillView`
|
|
178
|
+
|
|
179
|
+
### Pre-built Services
|
|
180
|
+
|
|
181
|
+
| Component | Topology |
|
|
182
|
+
|---|---|
|
|
183
|
+
| `SAPService` | Users → Web Dispatcher + Message Server → 3 App Servers → Primary DB + Standby DB |
|
|
184
|
+
| `ExchangeService` | Users → Dispatcher → 3 App Servers → Primary DB + Standby DB |
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Building a custom service
|
|
189
|
+
|
|
190
|
+
Compose library primitives to create any topology:
|
|
191
|
+
|
|
192
|
+
```tsx
|
|
193
|
+
import {
|
|
194
|
+
Service,
|
|
195
|
+
ServiceNode,
|
|
196
|
+
Server3D,
|
|
197
|
+
Database3D,
|
|
198
|
+
NodeCallout,
|
|
199
|
+
SyncBridge,
|
|
200
|
+
} from "react-aiops";
|
|
201
|
+
|
|
202
|
+
function MyService() {
|
|
203
|
+
return (
|
|
204
|
+
<Service
|
|
205
|
+
name="My Service"
|
|
206
|
+
status="online"
|
|
207
|
+
connections={[
|
|
208
|
+
{ from: [330, 200], to: [200, 350], visibleAtPhase: 3 },
|
|
209
|
+
{ from: [330, 200], to: [460, 350], visibleAtPhase: 3 },
|
|
210
|
+
]}
|
|
211
|
+
>
|
|
212
|
+
<ServiceNode
|
|
213
|
+
ex={200} ey={350}
|
|
214
|
+
compactOffset={{ x: -30, y: -20 }}
|
|
215
|
+
zIndex={8}
|
|
216
|
+
label="SRV-01" subLabel="APP SERVER"
|
|
217
|
+
componentInfo={{ type: "server", name: "SRV-01", status: "online" }}
|
|
218
|
+
>
|
|
219
|
+
<Server3D status="online" cpuLoad={42} memLoad={60} />
|
|
220
|
+
</ServiceNode>
|
|
221
|
+
|
|
222
|
+
<ServiceNode
|
|
223
|
+
ex={460} ey={350}
|
|
224
|
+
compactOffset={{ x: 30, y: -20 }}
|
|
225
|
+
zIndex={7}
|
|
226
|
+
label="DB-01" subLabel="PRIMARY"
|
|
227
|
+
componentInfo={{ type: "database", name: "DB-01", status: "online" }}
|
|
228
|
+
>
|
|
229
|
+
<Database3D status="online" capacity={55} />
|
|
230
|
+
</ServiceNode>
|
|
231
|
+
</Service>
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Status types
|
|
239
|
+
|
|
240
|
+
```ts
|
|
241
|
+
type ComponentStatus = "online" | "warning" | "critical" | "offline";
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Each status maps to a color/glow pair via `STATUS_CFG`:
|
|
245
|
+
|
|
246
|
+
| Status | Color | Glow |
|
|
247
|
+
|---|---|---|
|
|
248
|
+
| `online` | `#00e5ff` | cyan |
|
|
249
|
+
| `warning` | `#ff8c00` | orange |
|
|
250
|
+
| `critical` | `#ff2255` | red |
|
|
251
|
+
| `offline` | `#1e3a5a` | dim blue |
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Theme constants
|
|
256
|
+
|
|
257
|
+
```ts
|
|
258
|
+
import { STATUS_CFG, HOLO_CYAN, HOLO_BLUE, HOLO_SURFACE, HOLO_GLASS, makeFaceStyles } from "react-aiops";
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
- `STATUS_CFG` — status-to-color lookup
|
|
262
|
+
- `HOLO_CYAN` / `HOLO_BLUE` — accent colors
|
|
263
|
+
- `HOLO_SURFACE` / `HOLO_GLASS` — CSS gradient backgrounds
|
|
264
|
+
- `makeFaceStyles(W, H, D)` — generates CSS transforms for 6 faces of a 3D box
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## License
|
|
269
|
+
|
|
270
|
+
MIT
|
package/dist/AIOPsDashboard.d.ts
CHANGED
|
@@ -29,6 +29,8 @@ export interface AIOPsDashboardProps {
|
|
|
29
29
|
* Each entry should match a child service component by `name`.
|
|
30
30
|
*/
|
|
31
31
|
services?: ServiceMeta[];
|
|
32
|
+
/** Optional background image URL. */
|
|
33
|
+
backgroundImage?: string;
|
|
32
34
|
/**
|
|
33
35
|
* Service components to display in the carousel.
|
|
34
36
|
* Each child should be a service component (e.g. `<SAPService>`)
|
|
@@ -42,5 +44,5 @@ export interface AIOPsDashboardProps {
|
|
|
42
44
|
* Renders a branded header, a 3D carousel of services, and a
|
|
43
45
|
* controls footer. All interaction state is self-contained.
|
|
44
46
|
*/
|
|
45
|
-
export default function AIOPsDashboard({ brandName, brandTag, services, children, }: AIOPsDashboardProps): import("react/jsx-runtime").JSX.Element;
|
|
47
|
+
export default function AIOPsDashboard({ brandName, brandTag, services, backgroundImage, children, }: AIOPsDashboardProps): import("react/jsx-runtime").JSX.Element;
|
|
46
48
|
//# sourceMappingURL=AIOPsDashboard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIOPsDashboard.d.ts","sourceRoot":"","sources":["../src/AIOPsDashboard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAgC,eAAe,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"AIOPsDashboard.d.ts","sourceRoot":"","sources":["../src/AIOPsDashboard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAgC,eAAe,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAM1F;;;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,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;;;;OAIG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B;AAMD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACnC,SAA0B,EAC1B,QAAuB,EACvB,QAAa,EACb,eAAe,EACf,QAAQ,GACX,EAAE,mBAAmB,2CAkJrB"}
|
|
@@ -4,6 +4,8 @@ import { ServiceDialogMetric, ServiceDialogAlert } from './ServiceDialog';
|
|
|
4
4
|
export interface CarouselProps {
|
|
5
5
|
/** Service components to display in the carousel. Each must be a `<Service>`. */
|
|
6
6
|
children: React.ReactNode;
|
|
7
|
+
/** Optional logo URL displayed in the center of the carousel. */
|
|
8
|
+
logoUrl?: string;
|
|
7
9
|
/** Current view state of the carousel. */
|
|
8
10
|
viewState: ViewState;
|
|
9
11
|
/** Current expansion animation phase (0–6). */
|
|
@@ -56,5 +58,5 @@ export interface CarouselProps {
|
|
|
56
58
|
* Positions child services on a 3D elliptical orbit, manages the
|
|
57
59
|
* rotation animation, and renders overlay dialogs.
|
|
58
60
|
*/
|
|
59
|
-
export default function Carousel({ children, viewState, animPhase, selectedSystem, selectedComponent, drillAnimPhase, rotateY, autoRotateComponents, componentScale, drillZoom, autoRotateCarousel, carouselSpeed, width, height, onSelectSystem, onBackgroundClick: _onBackgroundClick, onComponentClick, onCloseDrill, selectedSystemStatus, selectedSystemDbSync, selectedSystemMetrics, selectedSystemAlerts, }: CarouselProps): import("react/jsx-runtime").JSX.Element;
|
|
61
|
+
export default function Carousel({ children, logoUrl, viewState, animPhase, selectedSystem, selectedComponent, drillAnimPhase, rotateY, autoRotateComponents, componentScale, drillZoom, autoRotateCarousel, carouselSpeed, width, height, onSelectSystem, onBackgroundClick: _onBackgroundClick, onComponentClick, onCloseDrill, selectedSystemStatus, selectedSystemDbSync, selectedSystemMetrics, selectedSystemAlerts, }: CarouselProps): import("react/jsx-runtime").JSX.Element;
|
|
60
62
|
//# sourceMappingURL=Carousel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../src/components/Carousel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../src/components/Carousel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE/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,+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,YAAY,EACZ,oBAA+B,EAC/B,oBAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,GACvB,EAAE,aAAa,2CAmGf"}
|
package/dist/index.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@keyframes holo-ring-pulse{0%,to{transform:scaleY(.22) scale(1)}50%{transform:scaleY(.22) scale(.965)}}@keyframes holo-beam-pulse{0%{opacity:.75;filter:brightness(1)}40%{opacity:1;filter:brightness(1.35)}70%{opacity:.55;filter:brightness(.7)}to{opacity:.75;filter:brightness(1)}}@keyframes holo-scan{0%{top:-3px;opacity:0}6%{opacity:1}90%{opacity:.6}to{top:110%;opacity:0}}@keyframes holo-led-blink{0%,88%,to{opacity:1}93%{opacity:.15}}@keyframes holo-float{0%,to{transform:translateY(0)}50%{transform:translateY(-7px)}}@keyframes holo-base-spin{0%{transform:translate(-50%) scaleY(.22) rotate(0)}to{transform:translate(-50%) scaleY(.22) rotate(360deg)}}@keyframes component-drill-pulse{0%,to{box-shadow:0 0 #f253}50%{box-shadow:0 0 12px 2px #ff225526}}@keyframes comp-dialog-border-glow{0%,to{border-color:var(--dialog-color, #00e5ff)33;box-shadow:0 0 30px var(--dialog-color, #00e5ff) 18,0 12px 60px #000000bf,inset 0 0 40px #0006}50%{border-color:var(--dialog-color, #00e5ff)66;box-shadow:0 0 50px var(--dialog-color, #00e5ff) 30,0 12px 60px #000000bf,inset 0 0 40px #0006}}@keyframes comp-dialog-icon-pop{0%{opacity:0;transform:scale(.3) translateY(14px)}60%{opacity:1;transform:scale(1.08) translateY(-3px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes comp-dialog-metric-fill{0%{transform:scaleX(0)}to{transform:scaleX(1)}}.app{display:grid;grid-template-rows:52px 1fr;width:100%;height:100vh;overflow:hidden;position:relative;background:#020810;color:#c8dff0;font-family:Segoe UI,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased}.app-header{display:flex;align-items:center;gap:18px;padding:0 24px;border-bottom:1px solid rgba(0,229,255,.08);background:#020810eb;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);position:relative;z-index:10}.hdr-brand{display:flex;align-items:center;gap:8px}.brand-pulse{width:7px;height:7px;border-radius:50%;background:#00e5ff;box-shadow:0 0 8px #00e5ff,0 0 18px #00e5ff80;animation:holo-led-blink 2s linear infinite}.brand-text{font-size:10px;font-weight:700;letter-spacing:.22em;text-transform:uppercase;color:#00e5ff;opacity:.7}.hdr-right{display:flex;align-items:center;gap:8px;margin-left:auto}.hdr-tag{font-size:9px;letter-spacing:.2em;color:#00e5ff59;border:1px solid rgba(0,229,255,.15);padding:3px 8px;border-radius:2px}.scene{display:flex;flex-direction:column;align-items:center;overflow:hidden;padding:0;position:relative;z-index:1;gap:0;background:transparent}.float-node{display:flex;flex-direction:column;align-items:center;position:relative}.float-node--interactive:before{content:"";position:absolute;inset:-40px -35px -15px}.float-body{position:relative;animation:holo-float 4s ease-in-out infinite}.scan-line{position:absolute;top:0;left:0;right:0;height:1.5px;animation:holo-scan 3.5s linear infinite;pointer-events:none;z-index:10}.node-tag{font-size:24px;letter-spacing:.2em;text-transform:uppercase;font-family:Courier New,monospace;margin-top:14px;text-align:center;text-shadow:0 0 6px currentColor}.node-subtag{font-size:11px;letter-spacing:.15em;text-transform:uppercase;font-family:Courier New,monospace;margin-top:4px;text-align:center}.sync-bridge{display:flex;flex-direction:column;align-items:center;justify-content:center;width:110px;gap:6px;flex-shrink:0;font-family:Courier New,monospace}.sync-arrows{display:flex;align-items:center;width:100%;gap:4px}.sync-line{flex:1;height:2px;border-radius:1px;animation:holo-beam-pulse 1.8s ease-in-out infinite}.sync-status{font-size:8px;letter-spacing:.18em;text-transform:uppercase;text-align:center}.sync-latency{font-size:6.5px;letter-spacing:.1em;text-align:center;font-family:Courier New,monospace}.base-ring{position:absolute;top:50%;left:50%;border-style:solid;border-radius:50%;transform:translate(-50%,-50%) scaleY(.22);animation:holo-ring-pulse 2.5s ease-in-out infinite}.base-hotspot{position:absolute;top:50%;left:50%;width:8%;height:8%;border-radius:50%;transform:translate(-50%,-50%) scaleY(.22);background:radial-gradient(circle,#ffffff 0%,#ff8c00 35%,transparent 70%);box-shadow:0 0 20px #ff8c00,0 0 40px #ff8c0080}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,OAAO,EACH,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,cAAc,GACjB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACzE,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,OAAO,EACH,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,UAAU,EACV,cAAc,GACjB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|