@revivejs/angular-infinity-charts 2.0.0 → 21.0.0

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 (61) hide show
  1. package/dist/LICENSE +21 -0
  2. package/dist/README.md +254 -0
  3. package/dist/fesm2022/revivejs-angular-infinity-charts.mjs +520 -0
  4. package/dist/fesm2022/revivejs-angular-infinity-charts.mjs.map +1 -0
  5. package/dist/types/revivejs-angular-infinity-charts.d.ts +300 -0
  6. package/docs/.nojekyll +0 -0
  7. package/docs/angular-2/app/app.component.css +325 -0
  8. package/docs/angular-2/app/app.component.html +185 -0
  9. package/docs/angular-2/app/app.component.ts +243 -0
  10. package/docs/angular-2/app/app.module.ts +18 -0
  11. package/docs/angular-2/app/data/api.ts +14 -0
  12. package/docs/angular-2/app/data/release-line.ts +7 -0
  13. package/docs/angular-2/app/playground.component.css +250 -0
  14. package/docs/angular-2/app/playground.component.html +112 -0
  15. package/docs/angular-2/app/playground.component.ts +428 -0
  16. package/docs/angular-2/index.html +31 -0
  17. package/docs/angular-2/main.ts +8 -0
  18. package/docs/angular-2/styles.css +47 -0
  19. package/docs/angular-2/systemjs.config.js +55 -0
  20. package/docs/angular-21/180.8cbb300931475cea.js +1 -0
  21. package/docs/angular-21/323.8cbb300931475cea.js +1 -0
  22. package/docs/angular-21/37.8cbb300931475cea.js +1 -0
  23. package/docs/angular-21/3rdpartylicenses.txt +402 -0
  24. package/docs/angular-21/418.8cbb300931475cea.js +1 -0
  25. package/docs/angular-21/541.120110ba2fead634.js +1 -0
  26. package/docs/angular-21/561.8cbb300931475cea.js +1 -0
  27. package/docs/angular-21/639.5c36f0da162f2724.js +1 -0
  28. package/docs/angular-21/704.8cbb300931475cea.js +1 -0
  29. package/docs/angular-21/799.8cbb300931475cea.js +1 -0
  30. package/docs/angular-21/84.5baca81d04c90457.js +1 -0
  31. package/docs/angular-21/942.8cbb300931475cea.js +1 -0
  32. package/docs/angular-21/common.4fd5fdcf7b48f062.js +1 -0
  33. package/docs/angular-21/index.html +19 -0
  34. package/docs/angular-21/main.4daffff4ca1c294e.js +1 -0
  35. package/docs/angular-21/polyfills.37944fe611f86dfa.js +1 -0
  36. package/docs/angular-21/runtime.4d8a748cbea51380.js +1 -0
  37. package/docs/angular-21/styles.d345eaa39dd99983.css +1 -0
  38. package/docs/index.html +289 -0
  39. package/package.json +90 -17
  40. /package/{index.d.ts → docs/angular-2/vendor/angular-infinity-charts/index.d.ts} +0 -0
  41. /package/{index.js → docs/angular-2/vendor/angular-infinity-charts/index.js} +0 -0
  42. /package/{index.js.map → docs/angular-2/vendor/angular-infinity-charts/index.js.map} +0 -0
  43. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartComponent.d.ts +0 -0
  44. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartComponent.js +0 -0
  45. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartComponent.js.map +0 -0
  46. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartController.d.ts +0 -0
  47. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartController.js +0 -0
  48. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartController.js.map +0 -0
  49. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartDirective.d.ts +0 -0
  50. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartDirective.js +0 -0
  51. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartDirective.js.map +0 -0
  52. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartService.d.ts +0 -0
  53. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartService.js +0 -0
  54. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/InfinityChartService.js.map +0 -0
  55. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/public_api.d.ts +0 -0
  56. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/public_api.js +0 -0
  57. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/public_api.js.map +0 -0
  58. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/types.d.ts +0 -0
  59. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/types.js +0 -0
  60. /package/{src → docs/angular-2/vendor/angular-infinity-charts/src}/types.js.map +0 -0
  61. /package/{vendor → docs/angular-2/vendor}/infinity-charts/index.js +0 -0
@@ -0,0 +1,300 @@
1
+ import * as i0 from '@angular/core';
2
+ import { AfterViewInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges, ModuleWithProviders } from '@angular/core';
3
+
4
+ type AngularInfinityChartType = 'line' | 'area' | 'stacked-area' | 'bar' | 'bar-3d' | 'combo' | 'sparkline' | 'scatter' | 'gauge' | 'gauge-semicircle' | 'radial-progress' | 'thermometer' | 'thermometer-horizontal' | 'battery' | 'pie' | 'donut';
5
+ type AngularInfinityThemeMode = 'light' | 'dark' | 'custom';
6
+ type AngularInfinityLegendPosition = 'top' | 'right' | 'bottom' | 'left';
7
+ type AngularInfinityLegendAlign = 'start' | 'center' | 'end';
8
+ type AngularInfinityValue = number | string | Date;
9
+ interface AngularInfinityTitleOptions {
10
+ text?: string;
11
+ subtitle?: string;
12
+ align?: AngularInfinityLegendAlign;
13
+ }
14
+ interface AngularInfinityAxisOptions {
15
+ show?: boolean;
16
+ title?: string;
17
+ tickCount?: number;
18
+ min?: number;
19
+ max?: number;
20
+ nice?: boolean;
21
+ format?: (value: number | string) => string;
22
+ }
23
+ interface AngularInfinityGridOptions {
24
+ show?: boolean;
25
+ x?: boolean;
26
+ y?: boolean;
27
+ color?: string;
28
+ opacity?: number;
29
+ }
30
+ interface AngularInfinityLegendOptions {
31
+ show?: boolean;
32
+ position?: AngularInfinityLegendPosition;
33
+ align?: AngularInfinityLegendAlign;
34
+ }
35
+ interface AngularInfinityLayoutOptions {
36
+ padding?: any;
37
+ plotPadding?: any;
38
+ cornerRadius?: number;
39
+ background?: string;
40
+ }
41
+ interface AngularInfinityChartColorOverrides {
42
+ background?: string;
43
+ surface?: string;
44
+ surfaceAlt?: string;
45
+ plotBackground?: string;
46
+ plotBorder?: string;
47
+ border?: string;
48
+ grid?: string;
49
+ axis?: string;
50
+ text?: string;
51
+ mutedText?: string;
52
+ title?: string;
53
+ legendText?: string;
54
+ tooltipBackground?: string;
55
+ tooltipText?: string;
56
+ pointStroke?: string;
57
+ threshold?: string;
58
+ gaugeTrack?: string;
59
+ gaugeNeedle?: string;
60
+ interactiveGlow?: string;
61
+ shadow?: string;
62
+ }
63
+ interface AngularInfinityAnimationOptions {
64
+ enabled?: boolean;
65
+ duration?: number;
66
+ easing?: string;
67
+ stagger?: number;
68
+ mode?: 'subtle' | 'expressive' | 'none';
69
+ }
70
+ interface AngularInfinityResponsiveOptions {
71
+ enabled?: boolean;
72
+ debounceMs?: number;
73
+ minHeight?: number;
74
+ }
75
+ interface AngularInfinityInteractionOptions {
76
+ enabled?: boolean;
77
+ tooltip?: boolean;
78
+ hover?: boolean;
79
+ click?: boolean;
80
+ }
81
+ interface AngularInfinityRealtimeOptions {
82
+ enabled?: boolean;
83
+ maxPoints?: number;
84
+ batchWindowMs?: number;
85
+ preserveDomain?: boolean;
86
+ }
87
+ interface AngularInfinityChartThreshold {
88
+ id?: string;
89
+ axis?: 'x' | 'y';
90
+ value: number;
91
+ label?: string;
92
+ color?: string;
93
+ dasharray?: string;
94
+ }
95
+ interface AngularInfinityGaugeBandInput {
96
+ from: number;
97
+ to: number;
98
+ color?: string;
99
+ label?: string;
100
+ }
101
+ interface AngularInfinityGaugeOptions {
102
+ min?: number;
103
+ max?: number;
104
+ unit?: string;
105
+ label?: string;
106
+ startAngle?: number;
107
+ endAngle?: number;
108
+ needle?: boolean;
109
+ trackColor?: string;
110
+ bands?: AngularInfinityGaugeBandInput[];
111
+ valueFormatter?: (value: number) => string;
112
+ }
113
+ interface AngularInfinityThemeTokens {
114
+ name?: string;
115
+ mode?: AngularInfinityThemeMode;
116
+ background?: string;
117
+ surface?: string;
118
+ surfaceAlt?: string;
119
+ plotBackground?: string;
120
+ plotBorder?: string;
121
+ border?: string;
122
+ grid?: string;
123
+ axis?: string;
124
+ text?: string;
125
+ mutedText?: string;
126
+ title?: string;
127
+ legendText?: string;
128
+ shadow?: string;
129
+ palette?: string[];
130
+ fontFamily?: string;
131
+ fontSize?: number;
132
+ tooltipBackground?: string;
133
+ tooltipText?: string;
134
+ pointStroke?: string;
135
+ threshold?: string;
136
+ gaugeTrack?: string;
137
+ gaugeNeedle?: string;
138
+ interactiveGlow?: string;
139
+ }
140
+ type AngularInfinityThemeInput = 'light' | 'dark' | AngularInfinityThemeTokens;
141
+ interface AngularInfinityCartesianPoint {
142
+ x?: AngularInfinityValue;
143
+ y: number;
144
+ label?: string;
145
+ }
146
+ type AngularInfinityCartesianValueInput = number | AngularInfinityCartesianPoint;
147
+ interface AngularInfinityCartesianSeriesInput {
148
+ id?: string;
149
+ name?: string;
150
+ color?: string;
151
+ type?: 'line' | 'area' | 'bar' | 'scatter';
152
+ data: AngularInfinityCartesianValueInput[];
153
+ }
154
+ interface AngularInfinityDonutSliceInput {
155
+ id?: string;
156
+ label: string;
157
+ value: number;
158
+ color?: string;
159
+ }
160
+ interface AngularInfinityLabeledValueInput {
161
+ label: string;
162
+ value: number;
163
+ color?: string;
164
+ }
165
+ type AngularInfinityChartDataInput = number[] | AngularInfinityCartesianValueInput[] | AngularInfinityDonutSliceInput[] | AngularInfinityLabeledValueInput[] | any;
166
+ type AngularInfinitySeriesCollectionInput = AngularInfinityCartesianSeriesInput[] | AngularInfinityDonutSliceInput[];
167
+ interface AngularInfinityChartPlugin {
168
+ id: string;
169
+ hooks?: any;
170
+ }
171
+ interface AngularInfinityChartConfig {
172
+ container?: HTMLElement | string;
173
+ type?: AngularInfinityChartType | string;
174
+ width?: number;
175
+ height?: number;
176
+ title?: string | AngularInfinityTitleOptions;
177
+ labels?: string[];
178
+ data?: AngularInfinityChartDataInput;
179
+ series?: AngularInfinitySeriesCollectionInput;
180
+ theme?: AngularInfinityThemeInput;
181
+ showNumber?: boolean;
182
+ showLegend?: boolean;
183
+ showTooltip?: boolean;
184
+ xAxis?: AngularInfinityAxisOptions;
185
+ yAxis?: AngularInfinityAxisOptions;
186
+ grid?: AngularInfinityGridOptions;
187
+ legend?: AngularInfinityLegendOptions;
188
+ layout?: AngularInfinityLayoutOptions;
189
+ colors?: AngularInfinityChartColorOverrides;
190
+ thresholds?: AngularInfinityChartThreshold[];
191
+ gauge?: AngularInfinityGaugeOptions;
192
+ animation?: AngularInfinityAnimationOptions;
193
+ responsive?: AngularInfinityResponsiveOptions;
194
+ interaction?: AngularInfinityInteractionOptions;
195
+ realtime?: AngularInfinityRealtimeOptions;
196
+ plugins?: AngularInfinityChartPlugin[];
197
+ [key: string]: any;
198
+ }
199
+ interface AngularInfinityChartPublicApi {
200
+ ready(): Promise<void>;
201
+ update(config: AngularInfinityChartConfig): void;
202
+ updateSeries(series: AngularInfinitySeriesCollectionInput): void;
203
+ appendData(point: any): void;
204
+ appendBatch(points: any[]): void;
205
+ replaceData(data: AngularInfinityChartDataInput): void;
206
+ resize(width?: number, height?: number): void;
207
+ setTheme(theme: AngularInfinityThemeInput): void;
208
+ registerPlugin(plugin: AngularInfinityChartPlugin): void;
209
+ on(event: string, handler: (payload?: unknown) => void): () => void;
210
+ destroy(): void;
211
+ }
212
+ interface AngularInfinityChartEvent {
213
+ host: HTMLElement;
214
+ chart: AngularInfinityChartPublicApi | null;
215
+ config: AngularInfinityChartConfig;
216
+ }
217
+
218
+ declare class InfinityChartComponent implements AfterViewInit, OnChanges, OnDestroy {
219
+ private static nextHostId;
220
+ config: AngularInfinityChartConfig;
221
+ create: EventEmitter<AngularInfinityChartEvent>;
222
+ ready: EventEmitter<AngularInfinityChartEvent>;
223
+ updated: EventEmitter<AngularInfinityChartEvent>;
224
+ resized: EventEmitter<AngularInfinityChartEvent>;
225
+ destroyed: EventEmitter<AngularInfinityChartEvent>;
226
+ hostId: string;
227
+ private controller;
228
+ private initialized;
229
+ private hooks;
230
+ constructor();
231
+ ngAfterViewInit(): void;
232
+ ngOnChanges(changes: SimpleChanges): void;
233
+ ngOnDestroy(): void;
234
+ update(config: AngularInfinityChartConfig): Promise<void>;
235
+ resize(width?: number, height?: number): void;
236
+ updateSeries(series: AngularInfinitySeriesCollectionInput): void;
237
+ appendData(point: any): void;
238
+ appendBatch(points: any[]): void;
239
+ replaceData(data: AngularInfinityChartDataInput): void;
240
+ setTheme(theme: AngularInfinityThemeInput): void;
241
+ registerPlugin(plugin: AngularInfinityChartPlugin): void;
242
+ getChart(): AngularInfinityChartPublicApi | null;
243
+ private ensureController;
244
+ private resolveHostElement;
245
+ static ɵfac: i0.ɵɵFactoryDeclaration<InfinityChartComponent, never>;
246
+ static ɵcmp: i0.ɵɵComponentDeclaration<InfinityChartComponent, "revive-infinity-chart", never, { "config": { "alias": "config"; "required": false; }; }, { "create": "create"; "ready": "ready"; "updated": "updated"; "resized": "resized"; "destroyed": "destroyed"; }, never, never, false, never>;
247
+ }
248
+
249
+ declare class InfinityChartDirective implements AfterViewInit, OnChanges, OnDestroy {
250
+ private static nextHostId;
251
+ config: AngularInfinityChartConfig;
252
+ create: EventEmitter<AngularInfinityChartEvent>;
253
+ ready: EventEmitter<AngularInfinityChartEvent>;
254
+ updated: EventEmitter<AngularInfinityChartEvent>;
255
+ resized: EventEmitter<AngularInfinityChartEvent>;
256
+ destroyed: EventEmitter<AngularInfinityChartEvent>;
257
+ hostId: string;
258
+ private controller;
259
+ private initialized;
260
+ private hooks;
261
+ constructor();
262
+ ngAfterViewInit(): void;
263
+ ngOnChanges(changes: SimpleChanges): void;
264
+ ngOnDestroy(): void;
265
+ update(config: AngularInfinityChartConfig): Promise<void>;
266
+ resize(width?: number, height?: number): void;
267
+ updateSeries(series: AngularInfinitySeriesCollectionInput): void;
268
+ appendData(point: any): void;
269
+ appendBatch(points: any[]): void;
270
+ replaceData(data: AngularInfinityChartDataInput): void;
271
+ setTheme(theme: AngularInfinityThemeInput): void;
272
+ registerPlugin(plugin: AngularInfinityChartPlugin): void;
273
+ getChart(): AngularInfinityChartPublicApi | null;
274
+ private ensureController;
275
+ private resolveHostElement;
276
+ static ɵfac: i0.ɵɵFactoryDeclaration<InfinityChartDirective, never>;
277
+ static ɵdir: i0.ɵɵDirectiveDeclaration<InfinityChartDirective, "[reviveInfinityChart]", never, { "config": { "alias": "reviveInfinityChart"; "required": false; }; }, { "create": "create"; "ready": "ready"; "updated": "updated"; "resized": "resized"; "destroyed": "destroyed"; }, never, never, false, never>;
278
+ }
279
+
280
+ declare class InfinityChartService {
281
+ create(target: HTMLElement, config?: AngularInfinityChartConfig): AngularInfinityChartPublicApi;
282
+ load(type: string): Promise<void>;
283
+ preload(types: string[]): Promise<void>;
284
+ loadAll(): Promise<void>;
285
+ registerPlugin(plugin: AngularInfinityChartPlugin): void;
286
+ registerPack(pack: any): void;
287
+ destroy(chart: AngularInfinityChartPublicApi | null): void;
288
+ static ɵfac: i0.ɵɵFactoryDeclaration<InfinityChartService, never>;
289
+ static ɵprov: i0.ɵɵInjectableDeclaration<InfinityChartService>;
290
+ }
291
+
292
+ declare class InfinityChartsModule {
293
+ static forRoot(): ModuleWithProviders<InfinityChartsModule>;
294
+ static ɵfac: i0.ɵɵFactoryDeclaration<InfinityChartsModule, never>;
295
+ static ɵmod: i0.ɵɵNgModuleDeclaration<InfinityChartsModule, [typeof InfinityChartComponent, typeof InfinityChartDirective], never, [typeof InfinityChartComponent, typeof InfinityChartDirective]>;
296
+ static ɵinj: i0.ɵɵInjectorDeclaration<InfinityChartsModule>;
297
+ }
298
+
299
+ export { InfinityChartComponent, InfinityChartDirective, InfinityChartService, InfinityChartsModule };
300
+ export type { AngularInfinityChartConfig, AngularInfinityChartDataInput, AngularInfinityChartEvent, AngularInfinityChartPlugin, AngularInfinityChartPublicApi, AngularInfinityChartType, AngularInfinitySeriesCollectionInput, AngularInfinityThemeInput };
package/docs/.nojekyll ADDED
File without changes
@@ -0,0 +1,325 @@
1
+ .shell {
2
+ padding: 28px;
3
+ color: #0f172a;
4
+ }
5
+
6
+ .hero {
7
+ display: grid;
8
+ grid-template-columns: minmax(0, 1.25fr) minmax(320px, 0.75fr);
9
+ gap: 24px;
10
+ }
11
+
12
+ .hero-card,
13
+ .panel,
14
+ .sidebar-card {
15
+ border: 1px solid rgba(15, 23, 42, 0.08);
16
+ border-radius: 28px;
17
+ background: rgba(255, 255, 255, 0.92);
18
+ box-shadow: 0 20px 60px rgba(15, 23, 42, 0.08);
19
+ }
20
+
21
+ .hero-card {
22
+ padding: 28px;
23
+ }
24
+
25
+ .badge {
26
+ display: inline-flex;
27
+ align-items: center;
28
+ padding: 8px 12px;
29
+ border-radius: 999px;
30
+ border: 1px solid rgba(15, 23, 42, 0.08);
31
+ background: rgba(37, 99, 235, 0.08);
32
+ color: #1d4ed8;
33
+ font-size: 12px;
34
+ font-weight: 700;
35
+ }
36
+
37
+ h1,
38
+ h2,
39
+ h3,
40
+ p,
41
+ pre {
42
+ margin-top: 0;
43
+ }
44
+
45
+ .hero-main h1 {
46
+ margin: 16px 0 12px;
47
+ font-size: 52px;
48
+ line-height: 0.95;
49
+ letter-spacing: -0.04em;
50
+ }
51
+
52
+ .hero-main p,
53
+ .panel-header p,
54
+ .api-card p,
55
+ .demo-card p {
56
+ color: #475569;
57
+ line-height: 1.7;
58
+ }
59
+
60
+ .feature-grid {
61
+ display: grid;
62
+ grid-template-columns: repeat(2, minmax(0, 1fr));
63
+ gap: 14px;
64
+ margin-top: 22px;
65
+ }
66
+
67
+ .feature {
68
+ padding: 16px;
69
+ border-radius: 18px;
70
+ border: 1px solid rgba(15, 23, 42, 0.08);
71
+ background: rgba(248, 250, 252, 0.92);
72
+ color: #475569;
73
+ line-height: 1.6;
74
+ }
75
+
76
+ .feature strong {
77
+ display: block;
78
+ margin-bottom: 6px;
79
+ color: #0f172a;
80
+ }
81
+
82
+ .cta-row,
83
+ .controls {
84
+ display: flex;
85
+ flex-wrap: wrap;
86
+ gap: 12px;
87
+ margin-top: 22px;
88
+ }
89
+
90
+ .btn,
91
+ button {
92
+ display: inline-flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ gap: 8px;
96
+ padding: 11px 16px;
97
+ border-radius: 999px;
98
+ border: 1px solid transparent;
99
+ cursor: pointer;
100
+ font: inherit;
101
+ text-decoration: none;
102
+ }
103
+
104
+ .btn,
105
+ button {
106
+ background: linear-gradient(135deg, #38bdf8, #2563eb);
107
+ color: #ffffff;
108
+ font-weight: 700;
109
+ }
110
+
111
+ .btn.secondary,
112
+ .ghost-button {
113
+ background: rgba(255, 255, 255, 0.92);
114
+ color: #0f172a;
115
+ border-color: rgba(15, 23, 42, 0.08);
116
+ }
117
+
118
+ .ghost-button {
119
+ padding: 8px 12px;
120
+ }
121
+
122
+ .step {
123
+ display: grid;
124
+ grid-template-columns: 36px minmax(0, 1fr);
125
+ gap: 14px;
126
+ margin-top: 16px;
127
+ }
128
+
129
+ .step-num {
130
+ display: inline-grid;
131
+ place-items: center;
132
+ width: 36px;
133
+ height: 36px;
134
+ border-radius: 999px;
135
+ background: #dbeafe;
136
+ color: #1d4ed8;
137
+ font-weight: 700;
138
+ }
139
+
140
+ pre,
141
+ .code {
142
+ overflow: auto;
143
+ padding: 14px 16px;
144
+ border-radius: 18px;
145
+ background: #0f172a;
146
+ color: #dbeafe;
147
+ line-height: 1.6;
148
+ font-family: "SFMono-Regular", Consolas, monospace;
149
+ font-size: 13px;
150
+ }
151
+
152
+ .layout {
153
+ display: grid;
154
+ grid-template-columns: minmax(0, 1fr) 320px;
155
+ gap: 24px;
156
+ margin-top: 28px;
157
+ }
158
+
159
+ .panels {
160
+ display: grid;
161
+ gap: 24px;
162
+ }
163
+
164
+ .panel {
165
+ padding: 24px;
166
+ }
167
+
168
+ .panel-header {
169
+ display: flex;
170
+ align-items: start;
171
+ justify-content: space-between;
172
+ gap: 14px;
173
+ margin-bottom: 18px;
174
+ }
175
+
176
+ .panel-header h2 {
177
+ margin-bottom: 8px;
178
+ }
179
+
180
+ .demo-grid {
181
+ display: grid;
182
+ gap: 16px;
183
+ grid-template-columns: repeat(2, minmax(0, 1fr));
184
+ }
185
+
186
+ .demo-card {
187
+ padding: 20px;
188
+ border-radius: 22px;
189
+ border: 1px solid rgba(15, 23, 42, 0.08);
190
+ background: #f8fbff;
191
+ }
192
+
193
+ .chart-frame,
194
+ .chart-slot,
195
+ .service-slot {
196
+ display: block;
197
+ width: 100%;
198
+ min-height: 220px;
199
+ border-radius: 20px;
200
+ border: 1px solid rgba(15, 23, 42, 0.08);
201
+ background: rgba(255, 255, 255, 0.98);
202
+ overflow: hidden;
203
+ }
204
+
205
+ .analytics-card,
206
+ .service-shell {
207
+ padding: 18px;
208
+ border-radius: 22px;
209
+ border: 1px solid rgba(15, 23, 42, 0.08);
210
+ background: rgba(255, 255, 255, 0.98);
211
+ }
212
+
213
+ .analytics-card.is-dark {
214
+ background: linear-gradient(180deg, #111b2f, #091323);
215
+ border-color: rgba(148, 163, 184, 0.16);
216
+ color: #f8fbff;
217
+ }
218
+
219
+ .analytics-card.is-dark .analytics-head span {
220
+ color: #93a5be;
221
+ }
222
+
223
+ .analytics-head {
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: space-between;
227
+ gap: 14px;
228
+ margin-bottom: 16px;
229
+ }
230
+
231
+ .analytics-head span {
232
+ color: #64748b;
233
+ font-size: 13px;
234
+ letter-spacing: 0.04em;
235
+ text-transform: uppercase;
236
+ }
237
+
238
+ .analytics-head strong {
239
+ font-size: 14px;
240
+ }
241
+
242
+ .service-shell {
243
+ min-height: 320px;
244
+ }
245
+
246
+ .service-slot {
247
+ min-height: 280px;
248
+ }
249
+
250
+ .api-grid {
251
+ display: grid;
252
+ gap: 16px;
253
+ grid-template-columns: repeat(3, minmax(0, 1fr));
254
+ }
255
+
256
+ .api-card {
257
+ padding: 20px;
258
+ border-radius: 22px;
259
+ border: 1px solid rgba(15, 23, 42, 0.08);
260
+ background: #f8fbff;
261
+ }
262
+
263
+ .sidebar {
264
+ display: grid;
265
+ gap: 24px;
266
+ align-content: start;
267
+ }
268
+
269
+ .sidebar-card {
270
+ padding: 22px;
271
+ }
272
+
273
+ .log-list {
274
+ display: grid;
275
+ gap: 10px;
276
+ }
277
+
278
+ .log-item {
279
+ padding: 12px 14px;
280
+ border-radius: 16px;
281
+ background: rgba(248, 250, 252, 0.98);
282
+ border: 1px solid rgba(15, 23, 42, 0.06);
283
+ color: #334155;
284
+ font-size: 13px;
285
+ line-height: 1.6;
286
+ }
287
+
288
+ .release-meta {
289
+ display: grid;
290
+ gap: 12px;
291
+ margin: 0;
292
+ padding: 0;
293
+ list-style: none;
294
+ color: #334155;
295
+ }
296
+
297
+ .release-meta strong {
298
+ color: #0f172a;
299
+ }
300
+
301
+ @media (max-width: 1080px) {
302
+ .hero,
303
+ .layout {
304
+ grid-template-columns: 1fr;
305
+ }
306
+
307
+ .api-grid,
308
+ .demo-grid {
309
+ grid-template-columns: 1fr;
310
+ }
311
+ }
312
+
313
+ @media (max-width: 720px) {
314
+ .shell {
315
+ padding: 16px;
316
+ }
317
+
318
+ .hero-main h1 {
319
+ font-size: 38px;
320
+ }
321
+
322
+ .feature-grid {
323
+ grid-template-columns: 1fr;
324
+ }
325
+ }