@allegrocdp/preview 0.1.0-dev.10

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.
@@ -0,0 +1,1272 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Allegro Preview</title>
7
+ <link
8
+ rel="icon"
9
+ type="image/svg+xml"
10
+ href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 135 135' fill='none'><path d='M124.905 25L25.325 58.47L33.195 75.59L118.655 42.12L124.905 25Z' fill='%238E8AF1'/><path d='M112.395 58.98L41.025 92.72L48.895 109.84L106.235 75.59L112.395 58.97V58.98Z' fill='%238E8AF1'/><path d='M124.995 25H10.005L17.845 42.12H118.665L124.995 25Z' fill='%23423CE8'/><path d='M112.395 58.98L25.325 58.47L33.195 75.59H106.235L112.395 58.97V58.98Z' fill='%23423CE8'/><path d='M99.875 92.72H41.025L48.895 109.84H93.515L99.875 92.72Z' fill='%23423CE8'/></svg>"
11
+ />
12
+ <style>
13
+ *,
14
+ *::before,
15
+ *::after {
16
+ box-sizing: border-box;
17
+ margin: 0;
18
+ padding: 0;
19
+ }
20
+
21
+ :root {
22
+ /* Sidebar — light mode */
23
+ --sb-bg: #f8fafc;
24
+ --sb-border: rgba(0, 0, 0, 0.07);
25
+ --sb-text: #475569;
26
+ --sb-text-active: #0f172a;
27
+ --sb-label: #4b5563;
28
+ --sb-active: rgba(99, 102, 241, 0.1);
29
+ --sb-accent: #6366f1;
30
+ --sb-input-bg: rgba(0, 0, 0, 0.04);
31
+ --sb-input-border: rgba(0, 0, 0, 0.12);
32
+
33
+ --bg: #f1f5f9;
34
+ --surface: #ffffff;
35
+ --surface-raised: #f8fafc;
36
+ --border: #e2e8f0;
37
+ --text: #0f172a;
38
+ --text-muted: #64748b;
39
+ --text-subtle: #94a3b8;
40
+ --accent: #6366f1;
41
+ --accent-hover: #4f46e5;
42
+ --accent-fg: #ffffff;
43
+ --toolbar: #ffffff;
44
+ --toolbar-border: #e2e8f0;
45
+ --tab-active-bg: #6366f1;
46
+ --tab-active-fg: #ffffff;
47
+ --tab-hover: #f1f5f9;
48
+ --badge-bg: #e0e7ff;
49
+ --badge-fg: #4338ca;
50
+ --card-border: #e2e8f0;
51
+ --card-hover: #f8fafc;
52
+ --card-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
53
+ }
54
+
55
+ [data-theme='dark'] {
56
+ /* Sidebar — dark mode (WCAG AA compliant) */
57
+ --sb-bg: #0c111d;
58
+ --sb-border: rgba(255, 255, 255, 0.07);
59
+ --sb-text: #8899b0; /* 6.6:1 on --sb-bg ✓ */
60
+ --sb-text-active: #f0f4ff; /* 17:1 on --sb-bg ✓ */
61
+ --sb-label: #7b92b2; /* 6.0:1 on --sb-bg ✓ (was #3d5068 = 2.3:1) */
62
+ --sb-active: rgba(129, 140, 248, 0.14);
63
+ --sb-accent: #818cf8;
64
+ --sb-input-bg: rgba(255, 255, 255, 0.05);
65
+ --sb-input-border: rgba(255, 255, 255, 0.1);
66
+
67
+ --bg: #020617;
68
+ --surface: #0f172a;
69
+ --surface-raised: #1e293b;
70
+ --border: #1e293b;
71
+ --text: #f1f5f9;
72
+ --text-muted: #94a3b8;
73
+ --text-subtle: #475569;
74
+ --toolbar: #0f172a;
75
+ --toolbar-border: #1e293b;
76
+ --tab-hover: #1e293b;
77
+ --badge-bg: rgba(99, 102, 241, 0.2);
78
+ --badge-fg: #a5b4fc;
79
+ --card-border: #1e293b;
80
+ --card-hover: #1e293b;
81
+ --card-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
82
+ }
83
+
84
+ html,
85
+ body {
86
+ height: 100%;
87
+ }
88
+
89
+ body {
90
+ display: flex;
91
+ font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', system-ui, sans-serif;
92
+ font-size: 13px;
93
+ background: var(--bg);
94
+ color: var(--text);
95
+ -webkit-font-smoothing: antialiased;
96
+ }
97
+
98
+ /* ── Sidebar ─────────────────────────────────────────── */
99
+
100
+ .sidebar {
101
+ width: 232px;
102
+ flex-shrink: 0;
103
+ background: var(--sb-bg);
104
+ border-right: 1px solid var(--sb-border);
105
+ display: flex;
106
+ flex-direction: column;
107
+ height: 100vh;
108
+ overflow: hidden;
109
+ }
110
+
111
+ .sidebar-header {
112
+ display: flex;
113
+ align-items: center;
114
+ gap: 8px;
115
+ padding: 13px 14px;
116
+ border-bottom: 1px solid var(--sb-border);
117
+ flex-shrink: 0;
118
+ }
119
+
120
+ .sidebar-logo {
121
+ display: flex;
122
+ align-items: center;
123
+ gap: 7px;
124
+ color: var(--sb-text-active);
125
+ font-weight: 600;
126
+ font-size: 13px;
127
+ letter-spacing: -0.01em;
128
+ flex: 1;
129
+ }
130
+
131
+ .theme-toggle {
132
+ background: none;
133
+ border: 1px solid var(--sb-border);
134
+ border-radius: 6px;
135
+ color: var(--sb-text);
136
+ cursor: pointer;
137
+ padding: 5px 6px;
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ line-height: 1;
142
+ transition:
143
+ color 0.15s,
144
+ border-color 0.15s;
145
+ }
146
+
147
+ .theme-toggle:hover {
148
+ color: var(--sb-text-active);
149
+ border-color: rgba(255, 255, 255, 0.18);
150
+ }
151
+
152
+ .sidebar-scroll {
153
+ flex: 1;
154
+ overflow-y: auto;
155
+ overflow-x: hidden;
156
+ display: flex;
157
+ flex-direction: column;
158
+ gap: 0;
159
+ }
160
+
161
+ .sidebar-scroll::-webkit-scrollbar {
162
+ width: 4px;
163
+ }
164
+ .sidebar-scroll::-webkit-scrollbar-track {
165
+ background: transparent;
166
+ }
167
+ .sidebar-scroll::-webkit-scrollbar-thumb {
168
+ background: var(--sb-border);
169
+ border-radius: 4px;
170
+ }
171
+
172
+ .sb-section {
173
+ flex-shrink: 0;
174
+ }
175
+
176
+ .sb-section-label {
177
+ padding: 14px 16px 5px;
178
+ font-size: 10px;
179
+ font-weight: 700;
180
+ text-transform: uppercase;
181
+ letter-spacing: 0.09em;
182
+ color: var(--sb-label);
183
+ }
184
+
185
+ .sb-section-header {
186
+ display: flex;
187
+ align-items: center;
188
+ padding: 14px 10px 5px 16px;
189
+ }
190
+
191
+ .sb-section-header .sb-section-label {
192
+ padding: 0;
193
+ flex: 1;
194
+ }
195
+
196
+ .new-template-btn {
197
+ display: flex;
198
+ align-items: center;
199
+ justify-content: center;
200
+ width: 20px;
201
+ height: 20px;
202
+ border-radius: 4px;
203
+ border: 1px solid var(--sb-border);
204
+ background: none;
205
+ color: var(--sb-label);
206
+ cursor: pointer;
207
+ font-size: 16px;
208
+ line-height: 1;
209
+ padding: 0;
210
+ transition:
211
+ color 0.15s,
212
+ border-color 0.15s,
213
+ background 0.15s;
214
+ }
215
+
216
+ .new-template-btn:hover {
217
+ color: var(--sb-text-active);
218
+ border-color: rgba(255, 255, 255, 0.18);
219
+ background: rgba(255, 255, 255, 0.05);
220
+ }
221
+
222
+ /* ── Create template modal ──────────────────────────────── */
223
+
224
+ .modal-backdrop {
225
+ position: fixed;
226
+ inset: 0;
227
+ background: rgba(0, 0, 0, 0.55);
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: center;
231
+ z-index: 100;
232
+ }
233
+
234
+ .modal-backdrop.hidden {
235
+ display: none;
236
+ }
237
+
238
+ .modal {
239
+ background: var(--sb-bg);
240
+ border: 1px solid rgba(255, 255, 255, 0.12);
241
+ border-radius: 10px;
242
+ padding: 20px;
243
+ width: 320px;
244
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5);
245
+ }
246
+
247
+ .modal-title {
248
+ font-size: 13px;
249
+ font-weight: 600;
250
+ color: var(--sb-text-active);
251
+ margin-bottom: 14px;
252
+ }
253
+
254
+ .modal-field {
255
+ display: flex;
256
+ flex-direction: column;
257
+ gap: 5px;
258
+ margin-bottom: 14px;
259
+ }
260
+
261
+ .modal-label {
262
+ font-size: 11px;
263
+ font-weight: 500;
264
+ color: var(--sb-text);
265
+ }
266
+
267
+ .modal-input {
268
+ background: var(--sb-input-bg);
269
+ border: 1px solid var(--sb-input-border);
270
+ border-radius: 6px;
271
+ padding: 7px 9px;
272
+ font-size: 12px;
273
+ color: var(--sb-text-active);
274
+ font-family: 'SF Mono', 'Fira Code', monospace;
275
+ outline: none;
276
+ transition: border-color 0.15s;
277
+ }
278
+
279
+ .modal-input:focus {
280
+ border-color: var(--sb-accent);
281
+ }
282
+ .modal-input.invalid {
283
+ border-color: #f87171;
284
+ }
285
+
286
+ .modal-error {
287
+ font-size: 11px;
288
+ color: #f87171;
289
+ min-height: 15px;
290
+ }
291
+
292
+ .modal-actions {
293
+ display: flex;
294
+ justify-content: flex-end;
295
+ gap: 8px;
296
+ margin-top: 4px;
297
+ }
298
+
299
+ .modal-btn {
300
+ border-radius: 6px;
301
+ border: 1px solid transparent;
302
+ padding: 6px 14px;
303
+ font-size: 12px;
304
+ font-weight: 500;
305
+ font-family: inherit;
306
+ cursor: pointer;
307
+ transition:
308
+ background 0.12s,
309
+ color 0.12s,
310
+ border-color 0.12s;
311
+ }
312
+
313
+ .modal-btn-cancel {
314
+ background: none;
315
+ border-color: var(--sb-border);
316
+ color: var(--sb-text);
317
+ }
318
+
319
+ .modal-btn-cancel:hover {
320
+ background: rgba(255, 255, 255, 0.05);
321
+ color: var(--sb-text-active);
322
+ }
323
+
324
+ .modal-btn-create {
325
+ background: var(--sb-accent);
326
+ color: #fff;
327
+ }
328
+
329
+ .modal-btn-create:hover {
330
+ background: #6366f1;
331
+ }
332
+ .modal-btn-create:disabled {
333
+ opacity: 0.4;
334
+ cursor: default;
335
+ }
336
+
337
+ /* Template list */
338
+
339
+ .template-nav {
340
+ display: flex;
341
+ flex-direction: column;
342
+ gap: 1px;
343
+ padding: 2px 8px 8px;
344
+ }
345
+
346
+ .template-nav:empty::after {
347
+ content: 'No templates found';
348
+ display: block;
349
+ padding: 4px 8px 8px;
350
+ color: var(--sb-label);
351
+ font-size: 12px;
352
+ }
353
+
354
+ .template-nav-item {
355
+ display: flex;
356
+ align-items: center;
357
+ gap: 8px;
358
+ padding: 6px 10px;
359
+ border-radius: 6px;
360
+ cursor: pointer;
361
+ color: var(--sb-text);
362
+ font-size: 13px;
363
+ border: none;
364
+ background: none;
365
+ text-align: left;
366
+ width: 100%;
367
+ transition:
368
+ background 0.1s,
369
+ color 0.1s;
370
+ }
371
+
372
+ .template-nav-item:hover {
373
+ background: rgba(255, 255, 255, 0.05);
374
+ color: var(--sb-text-active);
375
+ }
376
+ .template-nav-item.active {
377
+ background: var(--sb-active);
378
+ color: var(--sb-text-active);
379
+ }
380
+
381
+ .template-nav-dot {
382
+ width: 6px;
383
+ height: 6px;
384
+ border-radius: 50%;
385
+ background: var(--sb-label);
386
+ flex-shrink: 0;
387
+ transition: background 0.1s;
388
+ }
389
+
390
+ .template-nav-item.active .template-nav-dot {
391
+ background: var(--sb-accent);
392
+ }
393
+
394
+ .template-nav-name {
395
+ overflow: hidden;
396
+ text-overflow: ellipsis;
397
+ white-space: nowrap;
398
+ flex: 1;
399
+ }
400
+
401
+ /* Tenant section */
402
+
403
+ .sb-divider {
404
+ height: 1px;
405
+ background: var(--sb-border);
406
+ margin: 2px 0;
407
+ }
408
+
409
+ .tenant-input-wrap {
410
+ padding: 2px 10px 10px;
411
+ }
412
+
413
+ .tenant-input {
414
+ width: 100%;
415
+ background: var(--sb-input-bg);
416
+ border: 1px solid var(--sb-input-border);
417
+ border-radius: 6px;
418
+ padding: 6px 8px;
419
+ font-size: 12px;
420
+ color: var(--sb-text-active);
421
+ outline: none;
422
+ font-family: 'SF Mono', 'Fira Code', monospace;
423
+ transition: border-color 0.15s;
424
+ }
425
+
426
+ .tenant-input::placeholder {
427
+ color: var(--sb-label);
428
+ font-family: inherit;
429
+ }
430
+ .tenant-input:focus {
431
+ border-color: var(--sb-accent);
432
+ }
433
+
434
+ .tenant-hint {
435
+ font-size: 10px;
436
+ color: var(--sb-label);
437
+ margin-top: 4px;
438
+ padding: 0 2px;
439
+ }
440
+
441
+ .tenant-active-badge {
442
+ display: inline-flex;
443
+ align-items: center;
444
+ gap: 4px;
445
+ font-size: 10px;
446
+ color: #4ade80;
447
+ margin-top: 4px;
448
+ padding: 0 2px;
449
+ }
450
+
451
+ .tenant-active-badge::before {
452
+ content: '';
453
+ display: inline-block;
454
+ width: 5px;
455
+ height: 5px;
456
+ border-radius: 50%;
457
+ background: #4ade80;
458
+ }
459
+
460
+ /* Cookies section */
461
+
462
+ .cookie-section-wrap {
463
+ padding: 2px 10px 10px;
464
+ }
465
+
466
+ .cookie-checkbox-row {
467
+ display: flex;
468
+ align-items: center;
469
+ gap: 8px;
470
+ margin-bottom: 6px;
471
+ }
472
+
473
+ .cookie-checkbox-row input[type='checkbox'] {
474
+ width: 14px;
475
+ height: 14px;
476
+ accent-color: var(--sb-accent);
477
+ flex-shrink: 0;
478
+ cursor: pointer;
479
+ }
480
+
481
+ .cookie-checkbox-label {
482
+ font-size: 12px;
483
+ color: var(--sb-text);
484
+ cursor: pointer;
485
+ }
486
+
487
+ .cookie-auth-area {
488
+ margin-top: 6px;
489
+ }
490
+
491
+ .cookie-auth-hint {
492
+ font-size: 10px;
493
+ color: var(--sb-label);
494
+ padding: 0 2px;
495
+ }
496
+
497
+ .cookie-list {
498
+ display: flex;
499
+ flex-direction: column;
500
+ gap: 4px;
501
+ margin-bottom: 5px;
502
+ }
503
+
504
+ .cookie-row {
505
+ display: flex;
506
+ align-items: center;
507
+ gap: 6px;
508
+ padding: 5px 7px;
509
+ background: rgba(74, 222, 128, 0.08);
510
+ border: 1px solid rgba(74, 222, 128, 0.2);
511
+ border-radius: 5px;
512
+ }
513
+
514
+ .cookie-auth-dot {
515
+ width: 5px;
516
+ height: 5px;
517
+ border-radius: 50%;
518
+ background: #4ade80;
519
+ flex-shrink: 0;
520
+ }
521
+
522
+ .cookie-row-info {
523
+ flex: 1;
524
+ min-width: 0;
525
+ }
526
+
527
+ .cookie-row-label {
528
+ font-size: 10px;
529
+ font-weight: 600;
530
+ color: var(--sb-label);
531
+ text-transform: uppercase;
532
+ letter-spacing: 0.05em;
533
+ }
534
+
535
+ .cookie-row-value {
536
+ font-size: 11px;
537
+ color: var(--sb-text-active);
538
+ font-family: 'SF Mono', 'Fira Code', monospace;
539
+ overflow: hidden;
540
+ text-overflow: ellipsis;
541
+ white-space: nowrap;
542
+ }
543
+
544
+ .cookie-view-btn {
545
+ background: none;
546
+ border: 1px solid var(--sb-border);
547
+ border-radius: 4px;
548
+ padding: 2px 6px;
549
+ font-size: 10px;
550
+ font-family: inherit;
551
+ color: var(--sb-text);
552
+ cursor: pointer;
553
+ white-space: nowrap;
554
+ transition:
555
+ color 0.12s,
556
+ border-color 0.12s;
557
+ }
558
+
559
+ .cookie-view-btn:hover {
560
+ color: var(--sb-text-active);
561
+ border-color: var(--sb-accent);
562
+ }
563
+
564
+ .cookie-clear-btn {
565
+ display: flex;
566
+ align-items: center;
567
+ gap: 4px;
568
+ background: none;
569
+ border: 1px solid var(--sb-border);
570
+ border-radius: 5px;
571
+ padding: 4px 8px;
572
+ font-size: 11px;
573
+ font-family: inherit;
574
+ color: var(--sb-text);
575
+ cursor: pointer;
576
+ width: 100%;
577
+ justify-content: center;
578
+ margin-top: 4px;
579
+ transition:
580
+ color 0.12s,
581
+ border-color 0.12s,
582
+ background 0.12s;
583
+ }
584
+
585
+ .cookie-clear-btn:hover {
586
+ color: #f87171;
587
+ border-color: rgba(248, 113, 113, 0.4);
588
+ background: rgba(248, 113, 113, 0.05);
589
+ }
590
+
591
+ /* JWT payload modal */
592
+
593
+ .jwt-modal {
594
+ background: var(--sb-bg);
595
+ border: 1px solid rgba(255, 255, 255, 0.12);
596
+ border-radius: 10px;
597
+ padding: 20px;
598
+ width: 480px;
599
+ max-width: 90vw;
600
+ max-height: 80vh;
601
+ display: flex;
602
+ flex-direction: column;
603
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5);
604
+ }
605
+
606
+ .jwt-modal-header {
607
+ display: flex;
608
+ align-items: center;
609
+ justify-content: space-between;
610
+ margin-bottom: 12px;
611
+ }
612
+
613
+ .jwt-modal-title {
614
+ font-size: 13px;
615
+ font-weight: 600;
616
+ color: var(--sb-text-active);
617
+ }
618
+
619
+ .jwt-modal-close {
620
+ background: none;
621
+ border: 1px solid var(--sb-border);
622
+ border-radius: 5px;
623
+ padding: 3px 7px;
624
+ font-size: 12px;
625
+ font-family: inherit;
626
+ color: var(--sb-text);
627
+ cursor: pointer;
628
+ transition: color 0.12s;
629
+ }
630
+
631
+ .jwt-modal-close:hover {
632
+ color: var(--sb-text-active);
633
+ }
634
+
635
+ .jwt-payload {
636
+ flex: 1;
637
+ overflow-y: auto;
638
+ background: var(--sb-input-bg);
639
+ border: 1px solid var(--sb-input-border);
640
+ border-radius: 6px;
641
+ padding: 10px 12px;
642
+ font-size: 11px;
643
+ font-family: 'SF Mono', 'Fira Code', monospace;
644
+ color: var(--sb-text-active);
645
+ white-space: pre;
646
+ line-height: 1.6;
647
+ }
648
+
649
+ /* Fields section */
650
+
651
+ .fields-scroll {
652
+ flex: 1;
653
+ overflow-y: auto;
654
+ padding: 2px 10px 20px;
655
+ min-height: 0;
656
+ }
657
+
658
+ .fields-scroll::-webkit-scrollbar {
659
+ width: 4px;
660
+ }
661
+ .fields-scroll::-webkit-scrollbar-track {
662
+ background: transparent;
663
+ }
664
+ .fields-scroll::-webkit-scrollbar-thumb {
665
+ background: var(--sb-border);
666
+ border-radius: 4px;
667
+ }
668
+
669
+ .field-group {
670
+ display: flex;
671
+ flex-direction: column;
672
+ gap: 4px;
673
+ margin-bottom: 10px;
674
+ }
675
+
676
+ .field-label {
677
+ font-size: 11px;
678
+ font-weight: 500;
679
+ color: var(--sb-text);
680
+ padding: 0 2px;
681
+ }
682
+
683
+ .field-input {
684
+ width: 100%;
685
+ background: var(--sb-input-bg);
686
+ border: 1px solid var(--sb-input-border);
687
+ border-radius: 5px;
688
+ padding: 5px 8px;
689
+ font-size: 12px;
690
+ color: var(--sb-text-active);
691
+ outline: none;
692
+ font-family: inherit;
693
+ transition: border-color 0.15s;
694
+ }
695
+
696
+ .field-input:focus {
697
+ border-color: var(--sb-accent);
698
+ }
699
+
700
+ textarea.field-input {
701
+ resize: vertical;
702
+ min-height: 54px;
703
+ }
704
+
705
+ .field-checkbox-row {
706
+ display: flex;
707
+ align-items: center;
708
+ gap: 8px;
709
+ margin-bottom: 10px;
710
+ }
711
+
712
+ .field-checkbox-row input[type='checkbox'] {
713
+ width: 14px;
714
+ height: 14px;
715
+ accent-color: var(--sb-accent);
716
+ flex-shrink: 0;
717
+ }
718
+
719
+ .no-fields {
720
+ padding: 4px 2px;
721
+ color: var(--sb-label);
722
+ font-size: 12px;
723
+ }
724
+
725
+ .field-error {
726
+ padding: 6px 8px;
727
+ margin-bottom: 10px;
728
+ background: rgba(239, 68, 68, 0.12);
729
+ border: 1px solid rgba(239, 68, 68, 0.25);
730
+ border-radius: 4px;
731
+ color: #f87171;
732
+ font-size: 11px;
733
+ line-height: 1.4;
734
+ }
735
+
736
+ /* ── Main ─────────────────────────────────────────────── */
737
+
738
+ .main {
739
+ flex: 1;
740
+ display: flex;
741
+ flex-direction: column;
742
+ height: 100vh;
743
+ overflow: hidden;
744
+ min-width: 0;
745
+ }
746
+
747
+ .toolbar {
748
+ background: var(--toolbar);
749
+ border-bottom: 1px solid var(--toolbar-border);
750
+ padding: 0 16px;
751
+ display: flex;
752
+ align-items: center;
753
+ gap: 10px;
754
+ height: 48px;
755
+ flex-shrink: 0;
756
+ }
757
+
758
+ .tab-group {
759
+ display: flex;
760
+ align-items: center;
761
+ gap: 2px;
762
+ background: var(--surface-raised);
763
+ border: 1px solid var(--border);
764
+ border-radius: 8px;
765
+ padding: 3px;
766
+ }
767
+
768
+ .tab-btn {
769
+ border: none;
770
+ background: none;
771
+ border-radius: 5px;
772
+ padding: 5px 11px;
773
+ font-size: 12px;
774
+ font-weight: 500;
775
+ cursor: pointer;
776
+ color: var(--text-muted);
777
+ font-family: inherit;
778
+ transition:
779
+ background 0.12s,
780
+ color 0.12s;
781
+ white-space: nowrap;
782
+ }
783
+
784
+ .tab-btn:hover {
785
+ background: var(--tab-hover);
786
+ color: var(--text);
787
+ }
788
+ .tab-btn.active {
789
+ background: var(--tab-active-bg);
790
+ color: var(--tab-active-fg);
791
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
792
+ }
793
+ .tab-btn:disabled {
794
+ opacity: 0.35;
795
+ cursor: default;
796
+ pointer-events: none;
797
+ }
798
+
799
+ .toolbar-sep {
800
+ width: 1px;
801
+ height: 20px;
802
+ background: var(--border);
803
+ }
804
+
805
+ .device-group {
806
+ display: flex;
807
+ align-items: center;
808
+ gap: 2px;
809
+ margin-left: auto;
810
+ }
811
+
812
+ .device-btn {
813
+ border: 1px solid transparent;
814
+ background: none;
815
+ border-radius: 6px;
816
+ padding: 5px 9px;
817
+ font-size: 12px;
818
+ font-weight: 500;
819
+ cursor: pointer;
820
+ color: var(--text-muted);
821
+ font-family: inherit;
822
+ display: flex;
823
+ align-items: center;
824
+ gap: 5px;
825
+ transition:
826
+ background 0.12s,
827
+ color 0.12s,
828
+ border-color 0.12s;
829
+ }
830
+
831
+ .device-btn:hover {
832
+ background: var(--tab-hover);
833
+ color: var(--text);
834
+ }
835
+ .device-btn.active {
836
+ background: var(--surface-raised);
837
+ color: var(--text);
838
+ border-color: var(--border);
839
+ }
840
+ .device-btn:disabled {
841
+ opacity: 0.35;
842
+ cursor: default;
843
+ pointer-events: none;
844
+ }
845
+
846
+ .template-badge {
847
+ background: var(--badge-bg);
848
+ color: var(--badge-fg);
849
+ font-size: 11px;
850
+ font-weight: 600;
851
+ padding: 2px 7px;
852
+ border-radius: 4px;
853
+ max-width: 180px;
854
+ overflow: hidden;
855
+ text-overflow: ellipsis;
856
+ white-space: nowrap;
857
+ }
858
+
859
+ /* ── Preview area ─────────────────────────────────────── */
860
+
861
+ .preview-area {
862
+ flex: 1;
863
+ overflow: auto;
864
+ background: var(--bg);
865
+ }
866
+
867
+ /* Selector screen */
868
+
869
+ .selector-screen {
870
+ display: flex;
871
+ flex-direction: column;
872
+ align-items: center;
873
+ justify-content: center;
874
+ min-height: 100%;
875
+ padding: 48px 32px;
876
+ }
877
+
878
+ .selector-eyebrow {
879
+ font-size: 11px;
880
+ font-weight: 700;
881
+ text-transform: uppercase;
882
+ letter-spacing: 0.09em;
883
+ color: var(--accent);
884
+ margin-bottom: 10px;
885
+ }
886
+
887
+ .selector-heading {
888
+ font-size: 22px;
889
+ font-weight: 700;
890
+ color: var(--text);
891
+ margin-bottom: 6px;
892
+ letter-spacing: -0.02em;
893
+ }
894
+
895
+ .selector-sub {
896
+ font-size: 13px;
897
+ color: var(--text-muted);
898
+ margin-bottom: 36px;
899
+ }
900
+
901
+ .selector-grid {
902
+ display: grid;
903
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
904
+ gap: 12px;
905
+ width: 100%;
906
+ max-width: 700px;
907
+ }
908
+
909
+ .selector-card {
910
+ background: var(--surface);
911
+ border: 1px solid var(--card-border);
912
+ border-radius: 10px;
913
+ padding: 18px 16px 14px;
914
+ cursor: pointer;
915
+ text-align: left;
916
+ font-family: inherit;
917
+ display: flex;
918
+ flex-direction: column;
919
+ gap: 6px;
920
+ box-shadow: var(--card-shadow);
921
+ transition:
922
+ border-color 0.15s,
923
+ box-shadow 0.15s,
924
+ transform 0.1s;
925
+ }
926
+
927
+ .selector-card:hover {
928
+ border-color: var(--accent);
929
+ box-shadow:
930
+ 0 0 0 3px rgba(99, 102, 241, 0.12),
931
+ var(--card-shadow);
932
+ transform: translateY(-1px);
933
+ }
934
+
935
+ .selector-card-icon {
936
+ width: 32px;
937
+ height: 32px;
938
+ border-radius: 8px;
939
+ background: var(--badge-bg);
940
+ display: flex;
941
+ align-items: center;
942
+ justify-content: center;
943
+ margin-bottom: 4px;
944
+ }
945
+
946
+ .selector-card-icon svg {
947
+ color: var(--accent);
948
+ }
949
+
950
+ .selector-card-name {
951
+ font-size: 13px;
952
+ font-weight: 600;
953
+ color: var(--text);
954
+ overflow: hidden;
955
+ text-overflow: ellipsis;
956
+ white-space: nowrap;
957
+ }
958
+
959
+ .selector-card-slug {
960
+ font-size: 11px;
961
+ color: var(--text-subtle);
962
+ font-family: 'SF Mono', 'Fira Code', monospace;
963
+ }
964
+
965
+ .selector-empty {
966
+ display: flex;
967
+ flex-direction: column;
968
+ align-items: center;
969
+ gap: 10px;
970
+ color: var(--text-subtle);
971
+ font-size: 13px;
972
+ padding: 60px;
973
+ }
974
+
975
+ /* Live preview area — full-width (default) */
976
+
977
+ .preview-stage {
978
+ min-height: 100%;
979
+ }
980
+
981
+ /* Breakpoint mode — centers a fixed-width frame */
982
+ .preview-stage--breakpoint {
983
+ display: flex;
984
+ align-items: flex-start;
985
+ justify-content: center;
986
+ padding: 32px 28px;
987
+ min-width: fit-content;
988
+ }
989
+
990
+ .preview-scaler {
991
+ flex-shrink: 0;
992
+ }
993
+
994
+ .preview-frame-wrapper {
995
+ background: #fff;
996
+ overflow: hidden;
997
+ }
998
+
999
+ .preview-stage--breakpoint .preview-frame-wrapper {
1000
+ border-radius: 8px;
1001
+ box-shadow:
1002
+ 0 0 0 1px rgba(0, 0, 0, 0.07),
1003
+ 0 4px 24px rgba(0, 0, 0, 0.09);
1004
+ }
1005
+
1006
+ .preview-frame-wrapper iframe {
1007
+ border: none;
1008
+ display: block;
1009
+ }
1010
+ </style>
1011
+ <script type="module" crossorigin src="/assets/app-D1XS_DDX.js"></script>
1012
+ </head>
1013
+ <body>
1014
+ <aside class="sidebar">
1015
+ <div class="sidebar-header">
1016
+ <div class="sidebar-logo">
1017
+ <svg width="18" height="18" viewBox="0 0 135 135" fill="none">
1018
+ <path d="M124.905 25L25.325 58.47L33.195 75.59L118.655 42.12L124.905 25Z" fill="#8E8AF1" />
1019
+ <path
1020
+ d="M112.395 58.98L41.025 92.72L48.895 109.84L106.235 75.59L112.395 58.97V58.98Z"
1021
+ fill="#8E8AF1"
1022
+ />
1023
+ <path d="M124.995 25H10.005L17.845 42.12H118.665L124.995 25Z" fill="#423CE8" />
1024
+ <path
1025
+ d="M112.395 58.98L25.325 58.47L33.195 75.59H106.235L112.395 58.97V58.98Z"
1026
+ fill="#423CE8"
1027
+ />
1028
+ <path d="M99.875 92.72H41.025L48.895 109.84H93.515L99.875 92.72Z" fill="#423CE8" />
1029
+ </svg>
1030
+ Allegro Preview
1031
+ </div>
1032
+ <button class="theme-toggle" id="theme-toggle" title="Toggle dark mode">
1033
+ <svg
1034
+ id="theme-icon-sun"
1035
+ width="14"
1036
+ height="14"
1037
+ viewBox="0 0 24 24"
1038
+ fill="none"
1039
+ stroke="currentColor"
1040
+ stroke-width="2"
1041
+ stroke-linecap="round"
1042
+ stroke-linejoin="round"
1043
+ >
1044
+ <circle cx="12" cy="12" r="4" />
1045
+ <line x1="12" y1="2" x2="12" y2="6" />
1046
+ <line x1="12" y1="18" x2="12" y2="22" />
1047
+ <line x1="4.22" y1="4.22" x2="7.05" y2="7.05" />
1048
+ <line x1="16.95" y1="16.95" x2="19.78" y2="19.78" />
1049
+ <line x1="2" y1="12" x2="6" y2="12" />
1050
+ <line x1="18" y1="12" x2="22" y2="12" />
1051
+ <line x1="4.22" y1="19.78" x2="7.05" y2="16.95" />
1052
+ <line x1="16.95" y1="7.05" x2="19.78" y2="4.22" />
1053
+ </svg>
1054
+ <svg
1055
+ id="theme-icon-moon"
1056
+ width="14"
1057
+ height="14"
1058
+ viewBox="0 0 24 24"
1059
+ fill="none"
1060
+ stroke="currentColor"
1061
+ stroke-width="2"
1062
+ stroke-linecap="round"
1063
+ stroke-linejoin="round"
1064
+ style="display: none"
1065
+ >
1066
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" />
1067
+ </svg>
1068
+ </button>
1069
+ </div>
1070
+
1071
+ <div class="sidebar-scroll">
1072
+ <div class="sb-section">
1073
+ <div class="sb-section-header">
1074
+ <span class="sb-section-label">Templates</span>
1075
+ <button class="new-template-btn" id="new-template-btn" title="New template">+</button>
1076
+ </div>
1077
+ <nav class="template-nav" id="template-nav"></nav>
1078
+ </div>
1079
+
1080
+ <div class="sb-divider"></div>
1081
+
1082
+ <div class="sb-section">
1083
+ <div class="sb-section-label">Tenant SDK</div>
1084
+ <div class="tenant-input-wrap">
1085
+ <input
1086
+ class="tenant-input"
1087
+ id="tenant-input"
1088
+ type="text"
1089
+ placeholder="tenant.allegro.alley.dev"
1090
+ autocomplete="off"
1091
+ spellcheck="false"
1092
+ />
1093
+ <div id="tenant-status" class="tenant-hint">Loads /client.js on the preview page</div>
1094
+ </div>
1095
+ </div>
1096
+
1097
+ <div class="sb-divider"></div>
1098
+
1099
+ <div class="sb-section">
1100
+ <div class="sb-section-label">Cookies</div>
1101
+ <div class="cookie-section-wrap">
1102
+ <div class="cookie-checkbox-row">
1103
+ <input type="checkbox" id="block-cookies-checkbox" checked />
1104
+ <label class="cookie-checkbox-label" for="block-cookies-checkbox">Block cookies</label>
1105
+ </div>
1106
+ <div id="cookie-auth-area" class="cookie-auth-area" style="display: none">
1107
+ <div id="cookie-auth-user" class="cookie-list" style="display: none"></div>
1108
+ <div id="cookie-auth-hint" class="cookie-auth-hint">No session cookie found.</div>
1109
+ <button class="cookie-clear-btn" id="cookie-clear-btn">
1110
+ <svg
1111
+ width="10"
1112
+ height="10"
1113
+ viewBox="0 0 24 24"
1114
+ fill="none"
1115
+ stroke="currentColor"
1116
+ stroke-width="2.5"
1117
+ stroke-linecap="round"
1118
+ stroke-linejoin="round"
1119
+ >
1120
+ <polyline points="3 6 5 6 21 6"></polyline>
1121
+ <path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"></path>
1122
+ <path d="M10 11v6M14 11v6"></path>
1123
+ </svg>
1124
+ Clear cookies
1125
+ </button>
1126
+ </div>
1127
+ </div>
1128
+ </div>
1129
+
1130
+ <div class="sb-divider"></div>
1131
+
1132
+ <div class="sb-section-label" style="padding-top: 12px">Fields</div>
1133
+ <div class="fields-scroll" id="field-list">
1134
+ <p class="no-fields">Select a template to edit fields.</p>
1135
+ </div>
1136
+ </div>
1137
+ </aside>
1138
+
1139
+ <div class="main">
1140
+ <div class="toolbar">
1141
+ <div class="tab-group" id="tab-group">
1142
+ <button class="tab-btn active" data-tab="standalone" disabled>Standalone</button>
1143
+ <button class="tab-btn" data-tab="append" disabled>Article &middot; Append</button>
1144
+ <button class="tab-btn" data-tab="cut" disabled>Article &middot; Cut</button>
1145
+ </div>
1146
+ <div class="toolbar-sep"></div>
1147
+ <span class="template-badge" id="toolbar-badge" style="opacity: 0.4">No template selected</span>
1148
+ <div class="device-group" id="device-group">
1149
+ <button class="device-btn active" data-device="full" disabled title="Full width">
1150
+ <svg
1151
+ width="13"
1152
+ height="13"
1153
+ viewBox="0 0 24 24"
1154
+ fill="none"
1155
+ stroke="currentColor"
1156
+ stroke-width="2"
1157
+ stroke-linecap="round"
1158
+ stroke-linejoin="round"
1159
+ >
1160
+ <path
1161
+ d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"
1162
+ />
1163
+ </svg>
1164
+ Full
1165
+ </button>
1166
+ <button class="device-btn" data-device="desktop" disabled title="Desktop (1280px)">
1167
+ <svg
1168
+ width="13"
1169
+ height="13"
1170
+ viewBox="0 0 24 24"
1171
+ fill="none"
1172
+ stroke="currentColor"
1173
+ stroke-width="2"
1174
+ stroke-linecap="round"
1175
+ stroke-linejoin="round"
1176
+ >
1177
+ <rect x="2" y="3" width="20" height="14" rx="2" />
1178
+ <line x1="8" y1="21" x2="16" y2="21" />
1179
+ <line x1="12" y1="17" x2="12" y2="21" />
1180
+ </svg>
1181
+ Desktop
1182
+ </button>
1183
+ <button class="device-btn" data-device="tablet" disabled title="Tablet (768px)">
1184
+ <svg
1185
+ width="13"
1186
+ height="13"
1187
+ viewBox="0 0 24 24"
1188
+ fill="none"
1189
+ stroke="currentColor"
1190
+ stroke-width="2"
1191
+ stroke-linecap="round"
1192
+ stroke-linejoin="round"
1193
+ >
1194
+ <rect x="4" y="2" width="16" height="20" rx="2" />
1195
+ <line x1="12" y1="18" x2="12.01" y2="18" />
1196
+ </svg>
1197
+ Tablet
1198
+ </button>
1199
+ <button class="device-btn" data-device="mobile" disabled title="Mobile (390px)">
1200
+ <svg
1201
+ width="11"
1202
+ height="13"
1203
+ viewBox="0 0 24 24"
1204
+ fill="none"
1205
+ stroke="currentColor"
1206
+ stroke-width="2"
1207
+ stroke-linecap="round"
1208
+ stroke-linejoin="round"
1209
+ >
1210
+ <rect x="5" y="2" width="14" height="20" rx="2" />
1211
+ <line x1="12" y1="18" x2="12.01" y2="18" />
1212
+ </svg>
1213
+ Mobile
1214
+ </button>
1215
+ </div>
1216
+ <div class="toolbar-sep"></div>
1217
+ <button class="device-btn" id="new-window-btn" disabled title="Open in new window">
1218
+ <svg
1219
+ width="13"
1220
+ height="13"
1221
+ viewBox="0 0 24 24"
1222
+ fill="none"
1223
+ stroke="currentColor"
1224
+ stroke-width="2"
1225
+ stroke-linecap="round"
1226
+ stroke-linejoin="round"
1227
+ >
1228
+ <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
1229
+ <polyline points="15 3 21 3 21 9" />
1230
+ <line x1="10" y1="14" x2="21" y2="3" />
1231
+ </svg>
1232
+ New Window
1233
+ </button>
1234
+ </div>
1235
+
1236
+ <div class="preview-area" id="preview-area"></div>
1237
+ </div>
1238
+
1239
+ <div class="modal-backdrop hidden" id="jwt-modal-backdrop">
1240
+ <div class="jwt-modal" role="dialog" aria-modal="true" aria-labelledby="jwt-modal-title">
1241
+ <div class="jwt-modal-header">
1242
+ <div class="jwt-modal-title" id="jwt-modal-title">JWT Payload</div>
1243
+ <button class="jwt-modal-close" id="jwt-modal-close-btn">Close</button>
1244
+ </div>
1245
+ <pre class="jwt-payload" id="jwt-payload-content"></pre>
1246
+ </div>
1247
+ </div>
1248
+
1249
+ <div class="modal-backdrop hidden" id="create-modal-backdrop">
1250
+ <div class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-title">
1251
+ <div class="modal-title" id="modal-title">New Template</div>
1252
+ <div class="modal-field">
1253
+ <label class="modal-label" for="modal-slug-input">Template slug</label>
1254
+ <input
1255
+ class="modal-input"
1256
+ id="modal-slug-input"
1257
+ type="text"
1258
+ placeholder="my-template"
1259
+ autocomplete="off"
1260
+ spellcheck="false"
1261
+ />
1262
+ <div class="modal-error" id="modal-error"></div>
1263
+ </div>
1264
+ <div class="modal-actions">
1265
+ <button class="modal-btn modal-btn-cancel" id="modal-cancel-btn">Cancel</button>
1266
+ <button class="modal-btn modal-btn-create" id="modal-create-btn">Create</button>
1267
+ </div>
1268
+ </div>
1269
+ </div>
1270
+
1271
+ </body>
1272
+ </html>