@datalabz_/dashboard-kit 4.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 (6) hide show
  1. package/README.md +156 -0
  2. package/package.json +15 -0
  3. package/v4.css +694 -0
  4. package/v4.js +1093 -0
  5. package/wrapper.css +326 -0
  6. package/wrapper.js +310 -0
package/v4.css ADDED
@@ -0,0 +1,694 @@
1
+ /* DashboardKit v4.css — inner dashboard stylesheet */
2
+
3
+ /* ── Tokens ─────────────────────────────────────────────────────────────────── */
4
+ :root {
5
+ --bg: #0f1115;
6
+ --surface: #161922;
7
+ --raised: #1c2030;
8
+ --border: #2a2f3e;
9
+ --row_even: #14171f;
10
+ --row_odd: #1a1d27;
11
+ --text: #e6e8ee;
12
+ --muted: #8a90a3;
13
+ --brand: #0b8f84;
14
+ --info: #3498db;
15
+ --ok: #2ea043;
16
+ --warn: #f7ad2b;
17
+ --err: #ff4d4f;
18
+ }
19
+ :root[data-theme="light"] {
20
+ --bg: #ffffff;
21
+ --surface: #f7f8fa;
22
+ --raised: #eef1f5;
23
+ --border: #d9d9d9;
24
+ --row_even: #ffffff;
25
+ --row_odd: #f5f6f8;
26
+ --text: #000000;
27
+ --muted: #666666;
28
+ --brand: #0b8f84;
29
+ --info: #1677ff;
30
+ --ok: #1a7a3a;
31
+ --warn: #ad6800;
32
+ --err: #cf1322;
33
+ }
34
+
35
+ /* ── Scrollbar ───────────────────────────────────────────────────────────────── */
36
+ * {
37
+ scrollbar-width: thin;
38
+ scrollbar-color: var(--border) transparent;
39
+ }
40
+ ::-webkit-scrollbar {
41
+ width: 6px;
42
+ height: 6px;
43
+ }
44
+ ::-webkit-scrollbar-track {
45
+ background: transparent;
46
+ }
47
+ ::-webkit-scrollbar-thumb {
48
+ background: var(--border);
49
+ border-radius: 3px;
50
+ }
51
+ ::-webkit-scrollbar-thumb:hover {
52
+ background: var(--muted);
53
+ }
54
+
55
+ /* ── Reset + base ────────────────────────────────────────────────────────────── */
56
+ *,
57
+ *::before,
58
+ *::after {
59
+ box-sizing: border-box;
60
+ }
61
+ [hidden] {
62
+ display: none !important;
63
+ }
64
+ html,
65
+ body {
66
+ margin: 0;
67
+ padding: 0;
68
+ height: 100%;
69
+ background: var(--bg);
70
+ color: var(--text);
71
+ font:
72
+ 13px/1.45 "Roboto",
73
+ system-ui,
74
+ -apple-system,
75
+ "Segoe UI",
76
+ Helvetica,
77
+ Arial,
78
+ sans-serif;
79
+ }
80
+ body {
81
+ display: flex;
82
+ flex-direction: column;
83
+ min-height: 100vh;
84
+ }
85
+
86
+ /* ── Header ──────────────────────────────────────────────────────────────────── */
87
+ header {
88
+ background: var(--surface);
89
+ border-bottom: 1px solid var(--border);
90
+ padding: 7px 14px;
91
+ display: flex;
92
+ align-items: center;
93
+ gap: 10px;
94
+ flex-wrap: wrap;
95
+ flex-shrink: 0;
96
+ }
97
+ .dk-title {
98
+ font-weight: 600;
99
+ font-size: 13px;
100
+ white-space: nowrap;
101
+ }
102
+ .dk-spacer {
103
+ flex: 1;
104
+ min-width: 8px;
105
+ }
106
+ header label {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ gap: 5px;
110
+ color: var(--muted);
111
+ font-size: 12px;
112
+ }
113
+ header input,
114
+ header select {
115
+ background: var(--raised);
116
+ color: var(--text);
117
+ border: 1px solid var(--border);
118
+ border-radius: 4px;
119
+ padding: 0 7px;
120
+ height: 24px;
121
+ font: inherit;
122
+ }
123
+ header button {
124
+ background: var(--brand);
125
+ color: #fff;
126
+ border: 1px solid var(--brand);
127
+ border-radius: 4px;
128
+ padding: 0 10px;
129
+ height: 24px;
130
+ font: inherit;
131
+ font-size: 12px;
132
+ cursor: pointer;
133
+ }
134
+ header button:hover:not(:disabled) {
135
+ background: color-mix(in srgb, var(--brand) 85%, white);
136
+ }
137
+ header button:disabled,
138
+ header input:disabled,
139
+ header select:disabled {
140
+ opacity: 0.5;
141
+ cursor: default;
142
+ }
143
+
144
+ /* ── Status pill ─────────────────────────────────────────────────────────────── */
145
+ .dk-pill {
146
+ padding: 3px 10px;
147
+ border-radius: 999px;
148
+ font-size: 11px;
149
+ white-space: nowrap;
150
+ background: color-mix(in srgb, var(--muted) 20%, transparent);
151
+ color: var(--muted);
152
+ }
153
+ .dk-pill.loading {
154
+ background: color-mix(in srgb, var(--info) 18%, transparent);
155
+ color: var(--info);
156
+ }
157
+ .dk-pill.ok {
158
+ background: color-mix(in srgb, var(--ok) 18%, transparent);
159
+ color: var(--ok);
160
+ }
161
+ .dk-pill.error {
162
+ background: color-mix(in srgb, var(--err) 18%, transparent);
163
+ color: var(--err);
164
+ }
165
+
166
+ /* ── Tabs ────────────────────────────────────────────────────────────────────── */
167
+ nav.dk-tabs {
168
+ background: var(--surface);
169
+ border-bottom: 1px solid var(--border);
170
+ display: flex;
171
+ padding: 0 14px;
172
+ flex-shrink: 0;
173
+ position: sticky;
174
+ top: 0;
175
+ z-index: 15;
176
+ overflow-x: auto;
177
+ }
178
+ nav.dk-tabs button {
179
+ background: transparent;
180
+ color: var(--muted);
181
+ border: none;
182
+ border-bottom: 2px solid transparent;
183
+ padding: 8px 12px;
184
+ font: inherit;
185
+ font-size: 12px;
186
+ cursor: pointer;
187
+ white-space: nowrap;
188
+ display: inline-flex;
189
+ align-items: center;
190
+ gap: 4px;
191
+ }
192
+ nav.dk-tabs button:hover {
193
+ color: var(--text);
194
+ }
195
+ nav.dk-tabs button.active {
196
+ color: var(--text);
197
+ border-bottom-color: var(--brand);
198
+ }
199
+ .dk-badge {
200
+ background: color-mix(in srgb, var(--err) 18%, transparent);
201
+ color: var(--err);
202
+ border-radius: 999px;
203
+ font-size: 10px;
204
+ padding: 0 5px;
205
+ min-width: 16px;
206
+ text-align: center;
207
+ }
208
+
209
+ /* ── Panels ──────────────────────────────────────────────────────────────────── */
210
+ .dk-content {
211
+ flex: 1;
212
+ overflow-y: auto;
213
+ padding: 14px;
214
+ }
215
+ .dk-panel {
216
+ display: none;
217
+ }
218
+ .dk-panel.active {
219
+ display: block;
220
+ }
221
+
222
+ /* ── Section states ──────────────────────────────────────────────────────────── */
223
+ .dk-loading {
224
+ padding: 32px;
225
+ text-align: center;
226
+ color: var(--muted);
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ gap: 8px;
231
+ }
232
+ .dk-spinner {
233
+ display: inline-block;
234
+ width: 16px;
235
+ height: 16px;
236
+ flex-shrink: 0;
237
+ border: 2px solid var(--border);
238
+ border-top-color: var(--brand);
239
+ border-radius: 50%;
240
+ animation: dk-spin 0.7s linear infinite;
241
+ }
242
+ @keyframes dk-spin {
243
+ to {
244
+ transform: rotate(360deg);
245
+ }
246
+ }
247
+ .dk-empty {
248
+ padding: 32px;
249
+ text-align: center;
250
+ color: var(--muted);
251
+ font-size: 13px;
252
+ }
253
+ .dk-error {
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: flex-start;
257
+ align-items: center;
258
+ flex-wrap: wrap;
259
+ gap: 10px 16px;
260
+ background: color-mix(in srgb, var(--err) 12%, transparent);
261
+ color: var(--err);
262
+ border: 1px solid color-mix(in srgb, var(--err) 35%, transparent);
263
+ border-radius: 6px;
264
+ padding: 12px 16px;
265
+ margin-bottom: 12px;
266
+ }
267
+ .dk-error-report-btn {
268
+ display: none;
269
+ align-items: center;
270
+ gap: 6px;
271
+ background: var(--brand);
272
+ color: #fff;
273
+ border: 1px solid var(--brand);
274
+ border-radius: 6px;
275
+ padding: 0 14px;
276
+ height: 30px;
277
+ font: inherit;
278
+ font-size: 13px;
279
+ font-weight: 600;
280
+ white-space: nowrap;
281
+ cursor: pointer;
282
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
283
+ }
284
+ /* Only the chat artifact panel sends CHAT_MODE — hidden for standalone files
285
+ and the BackOffice wrapper, where there's no chat to send the error to. */
286
+ :root[data-chat-mode="true"] .dk-error-report-btn {
287
+ display: inline-flex;
288
+ }
289
+ .dk-error-report-btn:hover:not(:disabled) {
290
+ background: color-mix(in srgb, var(--brand) 85%, white);
291
+ }
292
+ .dk-error-report-btn:disabled {
293
+ opacity: 0.6;
294
+ cursor: default;
295
+ }
296
+
297
+ /* ── Table ───────────────────────────────────────────────────────────────────── */
298
+ .dk-table-wrap {
299
+ overflow-x: auto;
300
+ margin-bottom: 14px;
301
+ }
302
+ .dk-toolbar {
303
+ display: flex;
304
+ align-items: center;
305
+ height: 24px;
306
+ }
307
+ .dk-table-title {
308
+ font-size: 12px;
309
+ font-weight: 600;
310
+ }
311
+ table.dk-table {
312
+ width: 100%;
313
+ border-collapse: collapse;
314
+ font-size: 12px;
315
+ white-space: nowrap;
316
+ }
317
+ table.dk-table thead th {
318
+ background: var(--raised);
319
+ color: var(--muted);
320
+ font-weight: 500;
321
+ padding: 6px 10px;
322
+ text-align: left;
323
+ border: 1px solid var(--border);
324
+ position: sticky;
325
+ top: 0;
326
+ z-index: 2;
327
+ }
328
+ table.dk-table thead th .dk-th-inner {
329
+ display: inline-flex;
330
+ align-items: center;
331
+ gap: 4px;
332
+ }
333
+ table.dk-table thead th.num {
334
+ text-align: left;
335
+ }
336
+ table.dk-table tbody td {
337
+ padding: 5px 10px;
338
+ border: 1px solid var(--border);
339
+ }
340
+ table.dk-table tbody td.num {
341
+ text-align: left;
342
+ font-variant-numeric: tabular-nums;
343
+ font-family: monospace, monospace;
344
+ }
345
+ table.dk-table tbody tr:nth-child(even) td {
346
+ background: var(--row_even);
347
+ }
348
+ table.dk-table tbody tr:nth-child(odd) td {
349
+ background: var(--row_odd);
350
+ }
351
+ table.dk-table tbody tr:hover td {
352
+ background: color-mix(in srgb, var(--brand) 15%, transparent);
353
+ }
354
+ table.dk-table tbody tr.dk-totals-row td {
355
+ background: color-mix(in srgb, var(--brand) 25%, var(--surface));
356
+ font-weight: 600;
357
+ }
358
+ .dk-csv-btn {
359
+ background: transparent;
360
+ color: var(--muted);
361
+ border: 1px solid var(--border);
362
+ border-radius: 3px;
363
+ padding: 0 7px;
364
+ height: 20px;
365
+ font-size: 11px;
366
+ cursor: pointer;
367
+ margin-bottom: 2px;
368
+ margin-left: auto;
369
+ }
370
+ .dk-csv-btn:hover {
371
+ color: var(--text);
372
+ border-color: var(--brand);
373
+ }
374
+
375
+ /* ── Table column sorting ─────────────────────────────────────────────────────── */
376
+ table.dk-table thead th[data-dk-sort-key] {
377
+ cursor: pointer;
378
+ user-select: none;
379
+ position: relative;
380
+ padding-right: 20px;
381
+ }
382
+ table.dk-table thead th[data-dk-sort-key]:hover {
383
+ color: var(--text);
384
+ background: color-mix(in srgb, var(--brand) 10%, var(--raised));
385
+ }
386
+ table.dk-table thead th[data-dk-sort-key]::after {
387
+ content: "⇅";
388
+ font-size: 9px;
389
+ opacity: 0.3;
390
+ position: absolute;
391
+ right: 6px;
392
+ top: 50%;
393
+ transform: translateY(-50%);
394
+ }
395
+ table.dk-table thead th.dk-sort-asc::after {
396
+ content: "▲";
397
+ opacity: 1;
398
+ color: var(--info);
399
+ }
400
+ table.dk-table thead th.dk-sort-desc::after {
401
+ content: "▼";
402
+ opacity: 1;
403
+ color: var(--info);
404
+ }
405
+
406
+ /* ── KPI strip ───────────────────────────────────────────────────────────────── */
407
+ .dk-kpi-strip {
408
+ display: flex;
409
+ flex-wrap: wrap;
410
+ gap: 10px;
411
+ margin-bottom: 14px;
412
+ }
413
+ .dk-kpi {
414
+ background: var(--surface);
415
+ border: 1px solid var(--border);
416
+ border-radius: 6px;
417
+ padding: 10px 14px;
418
+ flex: 1;
419
+ position: relative;
420
+ }
421
+ .dk-kpi > .dk-tip {
422
+ position: absolute;
423
+ top: 4px;
424
+ right: 4px;
425
+ }
426
+ .dk-kpi-label {
427
+ color: var(--muted);
428
+ font-size: 11px;
429
+ margin-bottom: 4px;
430
+ white-space: nowrap;
431
+ }
432
+ .dk-kpi-value {
433
+ font-size: 15px;
434
+ font-weight: 600;
435
+ font-variant-numeric: tabular-nums;
436
+ white-space: nowrap;
437
+ }
438
+
439
+ /* ── Tooltip icon ─────────────────────────────────────────────────────────────── */
440
+ .dk-tip {
441
+ display: inline-flex;
442
+ align-items: center;
443
+ justify-content: center;
444
+ width: 10px;
445
+ height: 10px;
446
+ border-radius: 50%;
447
+ border: 1px solid var(--info);
448
+ color: var(--info);
449
+ font-size: 8px;
450
+ font-style: italic;
451
+ font-family: serif;
452
+ line-height: 1;
453
+ cursor: default;
454
+ flex-shrink: 0;
455
+ vertical-align: middle;
456
+ transition:
457
+ color 0.12s,
458
+ border-color 0.12s;
459
+ }
460
+ .dk-tip:hover {
461
+ color: color-mix(in srgb, var(--info) 70%, white);
462
+ border-color: color-mix(in srgb, var(--info) 70%, white);
463
+ }
464
+ #dk-tt {
465
+ position: fixed;
466
+ z-index: 9999;
467
+ background: var(--text);
468
+ color: var(--bg);
469
+ padding: 4px 10px;
470
+ border-radius: 4px;
471
+ font-size: 11px;
472
+ font-weight: 400;
473
+ white-space: nowrap;
474
+ pointer-events: none;
475
+ opacity: 0;
476
+ transition: opacity 0.12s;
477
+ display: none;
478
+ }
479
+
480
+ /* ── Card ────────────────────────────────────────────────────────────────────── */
481
+ .dk-card {
482
+ background: var(--surface);
483
+ border: 1px solid var(--border);
484
+ border-radius: 6px;
485
+ padding: 12px;
486
+ margin-bottom: 12px;
487
+ }
488
+ .dk-card-header {
489
+ margin: -12px -12px 12px;
490
+ padding: 8px 12px;
491
+ border-bottom: 1px solid var(--border);
492
+ border-radius: 6px 6px 0 0;
493
+ font-size: 13px;
494
+ font-weight: 600;
495
+ }
496
+
497
+ /* ── Two-column layout ───────────────────────────────────────────────────────── */
498
+ .dk-two-col {
499
+ display: grid;
500
+ grid-template-columns: 1fr 1fr;
501
+ gap: 12px;
502
+ margin-bottom: 12px;
503
+ }
504
+ @media (max-width: 1000px) {
505
+ .dk-two-col {
506
+ grid-template-columns: 1fr;
507
+ }
508
+ }
509
+
510
+ /* ── Scrollable container ────────────────────────────────────────────────────── */
511
+ .dk-scroll {
512
+ max-height: 480px;
513
+ overflow: auto;
514
+ }
515
+
516
+ /* ── Totals strip ────────────────────────────────────────────────────────────── */
517
+ .dk-totals-strip {
518
+ display: flex;
519
+ flex-wrap: wrap;
520
+ gap: 18px;
521
+ justify-content: space-between;
522
+ background: var(--raised);
523
+ padding: 10px 12px;
524
+ border-radius: 6px;
525
+ border: 1px solid var(--border);
526
+ margin-bottom: 12px;
527
+ }
528
+ .dk-totals-strip .dk-field {
529
+ display: flex;
530
+ flex-direction: column;
531
+ }
532
+ .dk-totals-strip .dk-field-label {
533
+ font-size: 11px;
534
+ color: var(--muted);
535
+ text-transform: uppercase;
536
+ letter-spacing: 0.5px;
537
+ }
538
+ .dk-totals-strip .dk-field-value {
539
+ font-size: 14px;
540
+ font-weight: 600;
541
+ font-variant-numeric: tabular-nums;
542
+ margin-top: 2px;
543
+ }
544
+
545
+ /* ── Info grid (key/value pairs) ─────────────────────────────────────────────── */
546
+ .dk-info-grid {
547
+ display: grid;
548
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
549
+ gap: 6px 14px;
550
+ margin-bottom: 8px;
551
+ }
552
+ .dk-info-row {
553
+ display: flex;
554
+ justify-content: space-between;
555
+ border-bottom: 1px solid var(--border);
556
+ padding: 4px 0;
557
+ font-size: 12px;
558
+ gap: 8px;
559
+ }
560
+ .dk-info-row .dk-lbl {
561
+ color: var(--muted);
562
+ white-space: nowrap;
563
+ }
564
+ .dk-info-row .dk-val {
565
+ font-family: monospace, monospace;
566
+ text-align: right;
567
+ word-break: break-word;
568
+ }
569
+
570
+ /* ── Semantic colors ─────────────────────────────────────────────────────────── */
571
+ .pos {
572
+ color: var(--ok);
573
+ }
574
+ .neg {
575
+ color: var(--err);
576
+ }
577
+
578
+ /* ── System Info ─────────────────────────────────────────────────────────────── */
579
+ .dk-sysinfo {
580
+ display: flex;
581
+ flex-direction: column;
582
+ gap: 14px;
583
+ }
584
+ .dk-sysinfo h3 {
585
+ font-size: 11px;
586
+ font-weight: 600;
587
+ color: var(--muted);
588
+ text-transform: uppercase;
589
+ letter-spacing: 0.05em;
590
+ margin: 0 0 8px;
591
+ }
592
+ .dk-sys-table {
593
+ width: 100%;
594
+ border-collapse: collapse;
595
+ font-size: 12px;
596
+ }
597
+ .dk-sys-table td {
598
+ padding: 4px 8px;
599
+ border-bottom: 1px solid var(--border);
600
+ vertical-align: top;
601
+ }
602
+ .dk-sys-table td:first-child {
603
+ color: var(--muted);
604
+ white-space: nowrap;
605
+ width: 190px;
606
+ }
607
+ .dk-cors-hint {
608
+ background: color-mix(in srgb, var(--warn) 12%, transparent);
609
+ border: 1px solid color-mix(in srgb, var(--warn) 35%, transparent);
610
+ color: var(--warn);
611
+ border-radius: 4px;
612
+ padding: 10px 14px;
613
+ font-size: 12px;
614
+ }
615
+ details.dk-call {
616
+ background: var(--surface);
617
+ border: 1px solid var(--border);
618
+ border-radius: 4px;
619
+ margin-bottom: 4px;
620
+ }
621
+ details.dk-call summary {
622
+ padding: 7px 10px;
623
+ cursor: pointer;
624
+ font-size: 12px;
625
+ display: flex;
626
+ gap: 10px;
627
+ align-items: center;
628
+ flex-wrap: wrap;
629
+ list-style: none;
630
+ }
631
+ details.dk-call summary::-webkit-details-marker {
632
+ display: none;
633
+ }
634
+ .dk-call-body {
635
+ padding: 10px;
636
+ border-top: 1px solid var(--border);
637
+ }
638
+ .dk-call-body pre {
639
+ margin: 4px 0;
640
+ white-space: pre-wrap;
641
+ word-break: break-all;
642
+ font-size: 11px;
643
+ color: var(--muted);
644
+ background: var(--raised);
645
+ padding: 6px 8px;
646
+ border-radius: 3px;
647
+ }
648
+ .dk-resp-head {
649
+ font-size: 11px;
650
+ color: var(--muted);
651
+ margin: 8px 0 4px;
652
+ display: flex;
653
+ align-items: center;
654
+ justify-content: flex-start;
655
+ gap: 6px;
656
+ }
657
+ .dk-resp-toggle {
658
+ display: inline-flex;
659
+ align-items: center;
660
+ justify-content: center;
661
+ width: 14px;
662
+ height: 14px;
663
+ padding: 0;
664
+ border: 1px solid var(--border);
665
+ border-radius: 3px;
666
+ background: var(--surface);
667
+ font-size: 11px;
668
+ line-height: 1;
669
+ color: var(--muted);
670
+ cursor: pointer;
671
+ }
672
+ .dk-s-ok {
673
+ color: var(--ok);
674
+ font-weight: 600;
675
+ font-size: 11px;
676
+ }
677
+ .dk-s-err {
678
+ color: var(--err);
679
+ font-weight: 600;
680
+ font-size: 11px;
681
+ }
682
+ .dk-s-net {
683
+ color: var(--warn);
684
+ font-weight: 600;
685
+ font-size: 11px;
686
+ }
687
+
688
+ /* ── Wait message (before postMessage arrives) ───────────────────────────────── */
689
+ .dk-wait {
690
+ padding: 40px;
691
+ text-align: center;
692
+ color: var(--muted);
693
+ font-style: italic;
694
+ }