hx-cdn-forge 2.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.
package/dist/index.css ADDED
@@ -0,0 +1,504 @@
1
+ /* src/react/CDNNodeSelector/styles.css */
2
+ .cdn-node-selector {
3
+ --cdn-font-family:
4
+ -apple-system,
5
+ BlinkMacSystemFont,
6
+ "Segoe UI",
7
+ "Roboto",
8
+ "Helvetica Neue",
9
+ sans-serif;
10
+ --cdn-font-size: 14px;
11
+ --cdn-font-size-sm: 12px;
12
+ --cdn-font-size-xs: 11px;
13
+ --cdn-radius: 12px;
14
+ --cdn-radius-sm: 8px;
15
+ --cdn-radius-pill: 999px;
16
+ --cdn-spacing-xs: 4px;
17
+ --cdn-spacing-sm: 8px;
18
+ --cdn-spacing-md: 12px;
19
+ --cdn-spacing-lg: 16px;
20
+ --cdn-transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
21
+ --cdn-bg: #ffffff;
22
+ --cdn-bg-hover: #f8fafc;
23
+ --cdn-bg-active: #eff6ff;
24
+ --cdn-bg-dropdown: #ffffff;
25
+ --cdn-bg-badge: #f1f5f9;
26
+ --cdn-bg-card: #ffffff;
27
+ --cdn-bg-card-hover: #f1f5f9;
28
+ --cdn-border: #e2e8f0;
29
+ --cdn-border-hover: #93c5fd;
30
+ --cdn-border-focus: #3b82f6;
31
+ --cdn-border-card: #e2e8f0;
32
+ --cdn-text: #1e293b;
33
+ --cdn-text-secondary: #64748b;
34
+ --cdn-text-muted: #94a3b8;
35
+ --cdn-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
36
+ --cdn-shadow-lg: 0 12px 48px -6px rgba(0, 0, 0, 0.12), 0 6px 16px -4px rgba(0, 0, 0, 0.06);
37
+ --cdn-shadow-focus: 0 0 0 3px rgba(59, 130, 246, 0.15);
38
+ --cdn-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.04);
39
+ --cdn-shadow-card-hover: 0 4px 12px rgba(0, 0, 0, 0.08);
40
+ --cdn-excellent-bg: #dcfce7;
41
+ --cdn-excellent-text: #166534;
42
+ --cdn-good-bg: #dbeafe;
43
+ --cdn-good-text: #1e40af;
44
+ --cdn-normal-bg: #fef9c3;
45
+ --cdn-normal-text: #854d0e;
46
+ --cdn-slow-bg: #fee2e2;
47
+ --cdn-slow-text: #991b1b;
48
+ --cdn-failed-bg: #fef2f2;
49
+ --cdn-failed-text: #dc2626;
50
+ --cdn-testing-bg: #f1f5f9;
51
+ --cdn-testing-text: #64748b;
52
+ --cdn-idle-bg: #f8fafc;
53
+ --cdn-idle-text: #94a3b8;
54
+ --cdn-accent: #3b82f6;
55
+ --cdn-accent-light: #eff6ff;
56
+ position: relative;
57
+ font-family: var(--cdn-font-family);
58
+ font-size: var(--cdn-font-size);
59
+ min-width: 260px;
60
+ color: var(--cdn-text);
61
+ -webkit-font-smoothing: antialiased;
62
+ -moz-osx-font-smoothing: grayscale;
63
+ }
64
+ .cdn-node-selector[data-theme=dark],
65
+ .cdn-node-selector.cdn-dark {
66
+ --cdn-bg: #1e293b;
67
+ --cdn-bg-hover: #334155;
68
+ --cdn-bg-active: #1e3a5f;
69
+ --cdn-bg-dropdown: #1e293b;
70
+ --cdn-bg-badge: #334155;
71
+ --cdn-bg-card: #283548;
72
+ --cdn-bg-card-hover: #334155;
73
+ --cdn-border: #475569;
74
+ --cdn-border-hover: #60a5fa;
75
+ --cdn-border-focus: #3b82f6;
76
+ --cdn-border-card: #3b4d64;
77
+ --cdn-text: #f1f5f9;
78
+ --cdn-text-secondary: #94a3b8;
79
+ --cdn-text-muted: #64748b;
80
+ --cdn-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
81
+ --cdn-shadow-lg: 0 12px 48px -6px rgba(0, 0, 0, 0.5), 0 6px 16px -4px rgba(0, 0, 0, 0.3);
82
+ --cdn-shadow-focus: 0 0 0 3px rgba(59, 130, 246, 0.3);
83
+ --cdn-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.2);
84
+ --cdn-shadow-card-hover: 0 4px 12px rgba(0, 0, 0, 0.3);
85
+ --cdn-excellent-bg: #052e16;
86
+ --cdn-excellent-text: #86efac;
87
+ --cdn-good-bg: #172554;
88
+ --cdn-good-text: #93c5fd;
89
+ --cdn-normal-bg: #422006;
90
+ --cdn-normal-text: #fde047;
91
+ --cdn-slow-bg: #450a0a;
92
+ --cdn-slow-text: #fca5a5;
93
+ --cdn-failed-bg: #450a0a;
94
+ --cdn-failed-text: #f87171;
95
+ --cdn-testing-bg: #334155;
96
+ --cdn-testing-text: #94a3b8;
97
+ --cdn-idle-bg: #334155;
98
+ --cdn-idle-text: #64748b;
99
+ --cdn-accent: #60a5fa;
100
+ --cdn-accent-light: #1e3a5f;
101
+ }
102
+ @media (prefers-color-scheme: dark) {
103
+ .cdn-node-selector:not([data-theme=light]):not(.cdn-light) {
104
+ --cdn-bg: #1e293b;
105
+ --cdn-bg-hover: #334155;
106
+ --cdn-bg-active: #1e3a5f;
107
+ --cdn-bg-dropdown: #1e293b;
108
+ --cdn-bg-badge: #334155;
109
+ --cdn-bg-card: #283548;
110
+ --cdn-bg-card-hover: #334155;
111
+ --cdn-border: #475569;
112
+ --cdn-border-hover: #60a5fa;
113
+ --cdn-border-focus: #3b82f6;
114
+ --cdn-border-card: #3b4d64;
115
+ --cdn-text: #f1f5f9;
116
+ --cdn-text-secondary: #94a3b8;
117
+ --cdn-text-muted: #64748b;
118
+ --cdn-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
119
+ --cdn-shadow-lg: 0 12px 48px -6px rgba(0, 0, 0, 0.5), 0 6px 16px -4px rgba(0, 0, 0, 0.3);
120
+ --cdn-shadow-focus: 0 0 0 3px rgba(59, 130, 246, 0.3);
121
+ --cdn-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.2);
122
+ --cdn-shadow-card-hover: 0 4px 12px rgba(0, 0, 0, 0.3);
123
+ --cdn-excellent-bg: #052e16;
124
+ --cdn-excellent-text: #86efac;
125
+ --cdn-good-bg: #172554;
126
+ --cdn-good-text: #93c5fd;
127
+ --cdn-normal-bg: #422006;
128
+ --cdn-normal-text: #fde047;
129
+ --cdn-slow-bg: #450a0a;
130
+ --cdn-slow-text: #fca5a5;
131
+ --cdn-failed-bg: #450a0a;
132
+ --cdn-failed-text: #f87171;
133
+ --cdn-testing-bg: #334155;
134
+ --cdn-testing-text: #94a3b8;
135
+ --cdn-idle-bg: #334155;
136
+ --cdn-idle-text: #64748b;
137
+ --cdn-accent: #60a5fa;
138
+ --cdn-accent-light: #1e3a5f;
139
+ }
140
+ }
141
+ .cdn-node-selector.cdn-compact {
142
+ --cdn-font-size: 13px;
143
+ --cdn-font-size-sm: 11px;
144
+ min-width: 220px;
145
+ }
146
+ .cdn-compact .cdn-current-node {
147
+ padding: var(--cdn-spacing-sm) var(--cdn-spacing-md);
148
+ }
149
+ .cdn-compact .cdn-node-option {
150
+ padding: var(--cdn-spacing-sm);
151
+ }
152
+ .cdn-selector-title {
153
+ font-size: var(--cdn-font-size-sm);
154
+ font-weight: 600;
155
+ color: var(--cdn-text-secondary);
156
+ margin-bottom: var(--cdn-spacing-sm);
157
+ padding-left: 2px;
158
+ letter-spacing: 0.04em;
159
+ text-transform: uppercase;
160
+ }
161
+ .cdn-selector-container {
162
+ position: relative;
163
+ display: flex;
164
+ gap: var(--cdn-spacing-sm);
165
+ align-items: stretch;
166
+ }
167
+ .cdn-current-node {
168
+ flex: 1;
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: space-between;
172
+ gap: var(--cdn-spacing-sm);
173
+ padding: var(--cdn-spacing-md) var(--cdn-spacing-lg);
174
+ background: var(--cdn-bg);
175
+ border: 1.5px solid var(--cdn-border);
176
+ border-radius: var(--cdn-radius);
177
+ cursor: pointer;
178
+ transition:
179
+ border-color var(--cdn-transition),
180
+ box-shadow var(--cdn-transition),
181
+ background var(--cdn-transition);
182
+ text-align: left;
183
+ box-shadow: var(--cdn-shadow);
184
+ outline: none;
185
+ }
186
+ .cdn-current-node:hover:not(:disabled) {
187
+ border-color: var(--cdn-border-hover);
188
+ box-shadow: var(--cdn-shadow-focus);
189
+ }
190
+ .cdn-current-node:focus-visible:not(:disabled) {
191
+ border-color: var(--cdn-border-focus);
192
+ box-shadow: var(--cdn-shadow-focus);
193
+ }
194
+ .cdn-current-node:disabled {
195
+ opacity: 0.5;
196
+ cursor: not-allowed;
197
+ }
198
+ .cdn-node-info {
199
+ display: flex;
200
+ flex-direction: column;
201
+ gap: 2px;
202
+ flex: 1;
203
+ min-width: 0;
204
+ }
205
+ .cdn-node-name {
206
+ font-weight: 600;
207
+ color: var(--cdn-text);
208
+ white-space: nowrap;
209
+ overflow: hidden;
210
+ text-overflow: ellipsis;
211
+ font-size: var(--cdn-font-size);
212
+ }
213
+ .cdn-node-region {
214
+ font-size: var(--cdn-font-size-xs);
215
+ color: var(--cdn-text-muted);
216
+ display: inline-flex;
217
+ align-items: center;
218
+ gap: 4px;
219
+ }
220
+ .cdn-node-region::before {
221
+ content: "";
222
+ display: inline-block;
223
+ width: 6px;
224
+ height: 6px;
225
+ border-radius: 50%;
226
+ background: var(--cdn-text-muted);
227
+ flex-shrink: 0;
228
+ }
229
+ .cdn-region-china .cdn-node-region::before {
230
+ background: #ef4444;
231
+ }
232
+ .cdn-region-asia .cdn-node-region::before {
233
+ background: #f59e0b;
234
+ }
235
+ .cdn-region-global .cdn-node-region::before {
236
+ background: #3b82f6;
237
+ }
238
+ .cdn-latency {
239
+ font-size: var(--cdn-font-size-xs);
240
+ font-weight: 600;
241
+ padding: 2px 8px;
242
+ border-radius: var(--cdn-radius-pill);
243
+ white-space: nowrap;
244
+ flex-shrink: 0;
245
+ letter-spacing: 0.01em;
246
+ font-variant-numeric: tabular-nums;
247
+ transition: background var(--cdn-transition), color var(--cdn-transition);
248
+ }
249
+ .latency-excellent {
250
+ background: var(--cdn-excellent-bg);
251
+ color: var(--cdn-excellent-text);
252
+ }
253
+ .latency-good {
254
+ background: var(--cdn-good-bg);
255
+ color: var(--cdn-good-text);
256
+ }
257
+ .latency-normal {
258
+ background: var(--cdn-normal-bg);
259
+ color: var(--cdn-normal-text);
260
+ }
261
+ .latency-slow {
262
+ background: var(--cdn-slow-bg);
263
+ color: var(--cdn-slow-text);
264
+ }
265
+ .latency-failed {
266
+ background: var(--cdn-failed-bg);
267
+ color: var(--cdn-failed-text);
268
+ }
269
+ .latency-idle {
270
+ background: var(--cdn-idle-bg);
271
+ color: var(--cdn-idle-text);
272
+ }
273
+ .latency-testing {
274
+ background: var(--cdn-testing-bg);
275
+ color: var(--cdn-testing-text);
276
+ animation: cdn-pulse 1.2s ease-in-out infinite;
277
+ }
278
+ @keyframes cdn-pulse {
279
+ 0%, 100% {
280
+ opacity: 1;
281
+ }
282
+ 50% {
283
+ opacity: 0.4;
284
+ }
285
+ }
286
+ .cdn-current-node.cdn-auto-selecting {
287
+ border-color: var(--cdn-accent);
288
+ border-style: dashed;
289
+ animation: cdn-auto-selecting-border 1.5s ease-in-out infinite;
290
+ }
291
+ @keyframes cdn-auto-selecting-border {
292
+ 0%, 100% {
293
+ border-color: var(--cdn-accent);
294
+ }
295
+ 50% {
296
+ border-color: var(--cdn-border);
297
+ }
298
+ }
299
+ .cdn-auto-selecting-text {
300
+ color: var(--cdn-accent) !important;
301
+ animation: cdn-pulse 1.2s ease-in-out infinite;
302
+ }
303
+ .cdn-selector-arrow {
304
+ display: inline-flex;
305
+ align-items: center;
306
+ justify-content: center;
307
+ width: 20px;
308
+ height: 20px;
309
+ color: var(--cdn-text-muted);
310
+ transition: transform var(--cdn-transition);
311
+ flex-shrink: 0;
312
+ }
313
+ .cdn-selector-arrow svg {
314
+ width: 14px;
315
+ height: 14px;
316
+ }
317
+ .cdn-selector-arrow.cdn-arrow-open {
318
+ transform: rotate(180deg);
319
+ }
320
+ .cdn-refresh-button {
321
+ display: inline-flex;
322
+ align-items: center;
323
+ justify-content: center;
324
+ width: 44px;
325
+ min-width: 44px;
326
+ background: var(--cdn-bg);
327
+ border: 1.5px solid var(--cdn-border);
328
+ border-radius: var(--cdn-radius);
329
+ cursor: pointer;
330
+ transition:
331
+ border-color var(--cdn-transition),
332
+ background var(--cdn-transition),
333
+ box-shadow var(--cdn-transition),
334
+ color var(--cdn-transition);
335
+ color: var(--cdn-text-secondary);
336
+ box-shadow: var(--cdn-shadow);
337
+ outline: none;
338
+ padding: 0;
339
+ }
340
+ .cdn-refresh-button:hover:not(:disabled) {
341
+ border-color: var(--cdn-border-hover);
342
+ background: var(--cdn-accent-light);
343
+ color: var(--cdn-accent);
344
+ box-shadow: var(--cdn-shadow-focus);
345
+ }
346
+ .cdn-refresh-button:focus-visible:not(:disabled) {
347
+ border-color: var(--cdn-border-focus);
348
+ box-shadow: var(--cdn-shadow-focus);
349
+ }
350
+ .cdn-refresh-button:disabled {
351
+ opacity: 0.5;
352
+ cursor: not-allowed;
353
+ }
354
+ .cdn-refresh-button svg {
355
+ width: 16px;
356
+ height: 16px;
357
+ }
358
+ .cdn-refresh-button.cdn-refreshing svg {
359
+ animation: cdn-spin 0.8s linear infinite;
360
+ }
361
+ @keyframes cdn-spin {
362
+ from {
363
+ transform: rotate(0deg);
364
+ }
365
+ to {
366
+ transform: rotate(360deg);
367
+ }
368
+ }
369
+ .cdn-node-list {
370
+ position: absolute;
371
+ top: calc(100% + 8px);
372
+ left: 0;
373
+ right: 0;
374
+ background: var(--cdn-bg-dropdown);
375
+ border: 1.5px solid var(--cdn-border);
376
+ border-radius: var(--cdn-radius);
377
+ box-shadow: var(--cdn-shadow-lg);
378
+ max-height: 420px;
379
+ overflow-y: auto;
380
+ z-index: 1000;
381
+ padding: var(--cdn-spacing-sm);
382
+ display: grid;
383
+ grid-template-columns: repeat(2, 1fr);
384
+ gap: var(--cdn-spacing-sm);
385
+ animation: cdn-dropdown-enter 0.18s ease-out;
386
+ transform-origin: top;
387
+ }
388
+ @keyframes cdn-dropdown-enter {
389
+ from {
390
+ opacity: 0;
391
+ transform: translateY(-6px) scale(0.98);
392
+ }
393
+ to {
394
+ opacity: 1;
395
+ transform: translateY(0) scale(1);
396
+ }
397
+ }
398
+ .cdn-node-option {
399
+ display: flex;
400
+ flex-direction: column;
401
+ gap: var(--cdn-spacing-xs);
402
+ padding: var(--cdn-spacing-md);
403
+ background: var(--cdn-bg-card);
404
+ border: 1.5px solid var(--cdn-border-card);
405
+ border-radius: var(--cdn-radius-sm);
406
+ cursor: pointer;
407
+ transition:
408
+ background var(--cdn-transition),
409
+ border-color var(--cdn-transition),
410
+ box-shadow var(--cdn-transition),
411
+ transform 0.1s ease;
412
+ text-align: left;
413
+ outline: none;
414
+ color: var(--cdn-text);
415
+ box-shadow: var(--cdn-shadow-card);
416
+ position: relative;
417
+ overflow: hidden;
418
+ min-height: 72px;
419
+ }
420
+ .cdn-node-option:hover:not(:disabled) {
421
+ background: var(--cdn-bg-card-hover);
422
+ border-color: var(--cdn-border-hover);
423
+ box-shadow: var(--cdn-shadow-card-hover);
424
+ transform: translateY(-1px);
425
+ }
426
+ .cdn-node-option:active:not(:disabled) {
427
+ transform: scale(0.98) translateY(0);
428
+ }
429
+ .cdn-node-option:focus-visible:not(:disabled) {
430
+ border-color: var(--cdn-accent);
431
+ box-shadow: var(--cdn-shadow-focus);
432
+ }
433
+ .cdn-node-option.cdn-node-selected {
434
+ background: var(--cdn-accent-light);
435
+ border-color: var(--cdn-accent);
436
+ box-shadow: 0 0 0 1px var(--cdn-accent), var(--cdn-shadow-card);
437
+ }
438
+ .cdn-node-option.cdn-node-selected .cdn-node-name {
439
+ color: var(--cdn-accent);
440
+ }
441
+ .cdn-node-option.cdn-node-selected::before {
442
+ content: "";
443
+ position: absolute;
444
+ top: 0;
445
+ left: 0;
446
+ width: 3px;
447
+ height: 100%;
448
+ background: var(--cdn-accent);
449
+ border-radius: 2px 0 0 2px;
450
+ }
451
+ .cdn-node-option:disabled {
452
+ opacity: 0.4;
453
+ cursor: not-allowed;
454
+ }
455
+ .cdn-node-option .cdn-node-info {
456
+ flex-direction: column;
457
+ gap: 3px;
458
+ }
459
+ .cdn-node-option .cdn-node-name {
460
+ font-size: var(--cdn-font-size);
461
+ }
462
+ .cdn-node-option .cdn-latency {
463
+ position: absolute;
464
+ top: var(--cdn-spacing-sm);
465
+ right: var(--cdn-spacing-sm);
466
+ }
467
+ .cdn-node-desc {
468
+ font-size: var(--cdn-font-size-xs);
469
+ color: var(--cdn-text-muted);
470
+ margin-top: 1px;
471
+ white-space: nowrap;
472
+ overflow: hidden;
473
+ text-overflow: ellipsis;
474
+ line-height: 1.3;
475
+ }
476
+ .cdn-no-nodes {
477
+ grid-column: 1 / -1;
478
+ padding: 32px var(--cdn-spacing-lg);
479
+ text-align: center;
480
+ color: var(--cdn-text-muted);
481
+ font-size: var(--cdn-font-size-sm);
482
+ }
483
+ .cdn-backdrop {
484
+ position: fixed;
485
+ inset: 0;
486
+ z-index: 999;
487
+ }
488
+ .cdn-node-list::-webkit-scrollbar {
489
+ width: 5px;
490
+ }
491
+ .cdn-node-list::-webkit-scrollbar-track {
492
+ background: transparent;
493
+ }
494
+ .cdn-node-list::-webkit-scrollbar-thumb {
495
+ background: var(--cdn-border);
496
+ border-radius: 3px;
497
+ }
498
+ .cdn-node-list::-webkit-scrollbar-thumb:hover {
499
+ background: var(--cdn-text-muted);
500
+ }
501
+ .cdn-node-list {
502
+ scrollbar-width: thin;
503
+ scrollbar-color: var(--cdn-border) transparent;
504
+ }