jaml-ui 0.24.3 → 0.24.4

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/ui/jimbo.css CHANGED
@@ -1,1761 +1,1420 @@
1
- /* ═══════════════════════════════════════════════════════════════════════════
2
- jimbo.css — Jimbo Design System
3
- Balatro-inspired design tokens + component classes.
4
- Eyedropped from actual game shader output — not Lua hex values.
5
- ═══════════════════════════════════════════════════════════════════════════ */
6
-
7
- /* Global Scrollbar Hide */
8
- * {
9
- scrollbar-width: none !important;
10
- -ms-overflow-style: none !important;
11
- }
12
-
13
- *::-webkit-scrollbar {
14
- display: none !important;
15
- }
16
-
17
- /* ── Design Tokens (CSS Custom Properties) ─────────────────────────────── */
18
-
19
- :root {
20
- /* Colors — eyedropped from Balatro's rendered shader output */
21
- --j-red: #ff4c40;
22
- --j-blue: #0093ff;
23
- --j-green: #429f79;
24
- --j-orange: #ff9800;
25
- --j-gold: #e4b643;
26
- --j-purple: #9e74ce;
27
-
28
- --j-dark-red: #a02721;
29
- --j-dark-blue: #0057a1;
30
- --j-dark-orange: #a05b00;
31
- --j-dark-green: #215f46;
32
- --j-dark-purple: #5e437e;
33
-
34
- --j-dark-grey: #3a5055;
35
- --j-darkest: #1e2b2d;
36
- --j-grey: #708386;
37
- --j-teal-grey: #404c4e;
38
-
39
- --j-panel-edge: #1e2e32;
40
- --j-inner-border: #334461;
41
- --j-border-silver: #b9c2d2;
42
- --j-border-south: #777e89;
43
-
44
- --j-gold-text: #e4b643;
45
- --j-green-text: #35bd86;
46
- --j-orange-text: #ff8f00;
47
- --j-white: #ffffff;
48
- --j-black: #000000;
49
-
50
- --j-tarot-btn: #9e74ce;
51
- --j-planet-btn: #00a7ca;
52
- --j-spectral-btn: #2e76fd;
53
- --j-tarot-btn-dark: #5e437e;
54
- --j-planet-btn-dark: #00657c;
55
- --j-spectral-btn-dark: #14449e;
56
-
57
- /* Typography */
58
- --j-font: 'm6x11plus', 'Courier New', monospace;
59
- --j-text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
60
-
61
- /* Spacing */
62
- --j-space-xs: 2px;
63
- --j-space-sm: 4px;
64
- --j-space-md: 8px;
65
- --j-space-lg: 12px;
66
- --j-space-xl: 16px;
67
-
68
- /* Radii — Balatro is chunky, not bubbly. Never > 10px. */
69
- --j-radius-sm: 4px;
70
- --j-radius-md: 6px;
71
- --j-radius-lg: 8px;
72
- --j-radius-pill: 10px;
73
-
74
- /* Animation */
75
- --j-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
76
- --j-press-y: 3px;
77
- --j-press-speed: 55ms;
78
- }
79
-
80
-
81
- /* ── Base Text ─────────────────────────────────────────────────────────── */
82
-
83
- .j-text {
84
- font-family: var(--j-font);
85
- font-weight: 400;
86
- line-height: 1.2;
87
- text-shadow: var(--j-text-shadow);
88
- color: var(--j-white);
89
- }
90
-
91
- .j-text--no-shadow {
92
- text-shadow: none;
93
- }
94
-
95
- .j-text--upper {
96
- text-transform: uppercase;
97
- letter-spacing: 0.08em;
98
- }
99
-
100
- /* Font Dance Animation */
101
- .j-text--dance-container {
102
- display: inline-block;
103
- white-space: pre-wrap;
104
- }
105
-
106
- .j-font-dance-char {
107
- display: inline-block;
108
- animation: j-font-dance 1.5s infinite steps(2, end);
109
- }
110
-
111
- @keyframes j-font-dance {
112
-
113
- 0%,
114
- 100% {
115
- transform: translate(0, 0);
116
- }
117
-
118
- 25% {
119
- transform: translate(1px, -1px);
120
- }
121
-
122
- 50% {
123
- transform: translate(0, -2px);
124
- }
125
-
126
- 75% {
127
- transform: translate(-1px, -1px);
128
- }
129
- }
130
-
131
- /* Sizes (from DESIGN.md typography scale) */
132
- .j-text--display {
133
- font-size: 26px;
134
- letter-spacing: 0.04em;
135
- line-height: 1;
136
- }
137
-
138
- .j-text--xl {
139
- font-size: 24px;
140
- letter-spacing: 0.04em;
141
- }
142
-
143
- .j-text--lg {
144
- font-size: 18px;
145
- letter-spacing: 0.04em;
146
- }
147
-
148
- .j-text--heading {
149
- font-size: 14px;
150
- letter-spacing: 0.08em;
151
- line-height: 1.2;
152
- }
153
-
154
- .j-text--md {
155
- font-size: 14px;
156
- }
157
-
158
- .j-text--sm {
159
- font-size: 12px;
160
- }
161
-
162
- .j-text--body {
163
- font-size: 11px;
164
- letter-spacing: 0.05em;
165
- line-height: 1.3;
166
- }
167
-
168
- .j-text--xs {
169
- font-size: 10px;
170
- }
171
-
172
- .j-text--label {
173
- font-size: 9px;
174
- letter-spacing: 0.1em;
175
- line-height: 1;
176
- text-transform: uppercase;
177
- }
178
-
179
- .j-text--micro {
180
- font-size: 8px;
181
- letter-spacing: 0.08em;
182
- line-height: 1;
183
- }
184
-
185
- /* Tones */
186
- .j-text--default {
187
- color: var(--j-white);
188
- }
189
-
190
- .j-text--mult,
191
- .j-text--red {
192
- color: var(--j-red);
193
- }
194
-
195
- .j-text--chips,
196
- .j-text--blue {
197
- color: var(--j-blue);
198
- }
199
-
200
- .j-text--gold {
201
- color: var(--j-gold-text);
202
- }
203
-
204
- .j-text--green {
205
- color: var(--j-green-text);
206
- }
207
-
208
- .j-text--orange {
209
- color: var(--j-orange-text);
210
- }
211
-
212
- .j-text--purple {
213
- color: var(--j-purple);
214
- }
215
-
216
- .j-text--grey {
217
- color: var(--j-grey);
218
- }
219
-
220
-
221
- /* ── Panel ─────────────────────────────────────────────────────────────── */
222
-
223
- .j-panel {
224
- background-color: var(--j-dark-grey);
225
- border: 2px solid var(--j-border-silver);
226
- border-bottom-color: var(--j-border-south);
227
- border-radius: var(--j-radius-md);
228
- box-shadow: 0 3px 0 0 rgba(0, 0, 0, 0.55),
229
- inset 0 0 0 1px rgba(255, 255, 255, 0.04);
230
- padding: var(--j-space-lg);
231
- display: flex;
232
- flex-direction: column;
233
- align-items: stretch;
234
- overflow: visible;
235
- position: relative;
236
- }
237
-
238
- .j-panel__body {
239
- flex: 1;
240
- overflow: auto;
241
- }
242
-
243
- .j-panel__back {
244
- margin-top: var(--j-space-lg);
245
- padding-top: var(--j-space-md);
246
- flex-shrink: 0;
247
- }
248
-
249
- .j-inner-panel {
250
- background-color: var(--j-inner-border);
251
- border: 2px solid var(--j-panel-edge);
252
- border-radius: var(--j-radius-md);
253
- padding: var(--j-space-lg);
254
- }
255
-
256
-
257
- /* ── Button ────────────────────────────────────────────────────────────── */
258
- /* Chunky 3D press: black underside via drop shadow,
259
- press sinks the face +3px and collapses the shadow. */
260
-
261
- .j-btn {
262
- display: inline-block;
263
- position: relative;
264
- cursor: pointer;
265
- -webkit-user-select: none;
266
- user-select: none;
267
- }
268
-
269
- /* Invisible stable hit target to prevent hover jitter when the child transforms */
270
- .j-btn::after {
271
- content: '';
272
- position: absolute;
273
- inset: 0;
274
- background: transparent;
275
- z-index: 10;
276
- }
277
-
278
- .j-btn--full {
279
- width: 100%;
280
- }
281
-
282
- .j-btn--disabled {
283
- opacity: 0.55;
284
- cursor: not-allowed;
285
- }
286
-
287
- .j-btn__face {
288
- position: relative;
289
- border-radius: var(--j-radius-md);
290
- background: var(--j-btn-face-color, var(--j-orange));
291
- text-align: center;
292
- text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
293
- box-shadow: 0 var(--j-press-y) 0 0 rgba(0, 0, 0, 0.6);
294
- transform: translate(0, 0);
295
- transition: transform var(--j-press-speed) linear, box-shadow var(--j-press-speed) linear;
296
- }
297
-
298
- .j-btn[data-pressed="true"] .j-btn__face,
299
- .j-btn:active:not(:disabled):not(.j-btn--disabled) .j-btn__face {
300
- transform: translateY(var(--j-press-y));
301
- box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.6);
302
- }
303
-
304
- .j-btn:not(.j-btn--disabled):hover .j-btn__face {
305
- filter: brightness(1.1);
306
- }
307
-
308
- /* Sizes */
309
- .j-btn--xs .j-btn__face {
310
- padding: 4px 8px;
311
- font-size: 11px;
312
- }
313
-
314
- .j-btn--sm .j-btn__face {
315
- padding: 6px 12px;
316
- font-size: 13px;
317
- }
318
-
319
- .j-btn--md .j-btn__face {
320
- padding: 10px 18px;
321
- font-size: 16px;
322
- }
323
-
324
- .j-btn--lg .j-btn__face {
325
- padding: 8px 18px;
326
- font-size: 20px;
327
- }
328
-
329
- /* Tone colors — set via CSS custom properties */
330
- .j-btn--orange {
331
- --j-btn-face-color: var(--j-orange);
332
- }
333
-
334
- .j-btn--red {
335
- --j-btn-face-color: var(--j-red);
336
- }
337
-
338
- .j-btn--blue {
339
- --j-btn-face-color: var(--j-blue);
340
- }
341
-
342
- .j-btn--green {
343
- --j-btn-face-color: var(--j-green);
344
- }
345
-
346
- .j-btn--tarot {
347
- --j-btn-face-color: var(--j-tarot-btn);
348
- }
349
-
350
- .j-btn--planet {
351
- --j-btn-face-color: var(--j-planet-btn);
352
- }
353
-
354
- .j-btn--spectral {
355
- --j-btn-face-color: var(--j-spectral-btn);
356
- }
357
-
358
-
359
- /* ── Badge ─────────────────────────────────────────────────────────────── */
360
-
361
- .j-badge {
362
- display: inline-flex;
363
- align-items: center;
364
- border-radius: var(--j-radius-sm);
365
- font-family: var(--j-font);
366
- font-weight: 400;
367
- letter-spacing: 0.04em;
368
- white-space: nowrap;
369
- text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
370
- border: none;
371
- }
372
-
373
- .j-badge--sm {
374
- padding: 2px 6px;
375
- font-size: 10px;
376
- }
377
-
378
- .j-badge--md {
379
- padding: 4px 8px;
380
- font-size: 12px;
381
- }
382
-
383
- /* Badge tones flat, no shadow, no edges */
384
- .j-badge--dark {
385
- background: var(--j-darkest);
386
- color: var(--j-white);
387
- }
388
-
389
- .j-badge--blue {
390
- background: var(--j-blue);
391
- color: var(--j-white);
392
- }
393
-
394
- .j-badge--red {
395
- background: var(--j-red);
396
- color: var(--j-white);
397
- }
398
-
399
- .j-badge--green {
400
- background: var(--j-green);
401
- color: var(--j-white);
402
- }
403
-
404
- .j-badge--orange {
405
- background: var(--j-orange);
406
- color: var(--j-white);
407
- }
408
-
409
- .j-badge--purple {
410
- background: var(--j-purple);
411
- color: var(--j-white);
412
- }
413
-
414
-
415
- /* ── Tabs ──────────────────────────────────────────────────────────────── */
416
-
417
- .j-tabs {
418
- display: flex;
419
- gap: var(--j-space-md);
420
- align-items: flex-start;
421
- flex-wrap: nowrap;
422
- min-width: 0;
423
- overflow-x: auto;
424
- overflow-y: visible;
425
- padding-top: 12px;
426
- scrollbar-width: none;
427
- }
428
-
429
- .j-tab {
430
- display: flex;
431
- flex-direction: column;
432
- align-items: center;
433
- position: relative;
434
- flex: 0 0 auto;
435
- padding-top: 10px;
436
- }
437
-
438
- .j-tab__indicator {
439
- position: absolute;
440
- top: 0;
441
- left: 50%;
442
- width: 14px;
443
- height: 10px;
444
- transform: translateX(-50%);
445
- display: flex;
446
- align-items: center;
447
- justify-content: center;
448
- pointer-events: none;
449
- }
450
-
451
- .j-tab__indicator[data-active="true"] {
452
- animation: jimbo-bounce 0.8s cubic-bezier(0.68, 0, 0.68, 1) infinite;
453
- }
454
-
455
- .j-tab__indicator[data-active="false"] {
456
- opacity: 0;
457
- }
458
-
459
- .j-tab__btn {
460
- appearance: none;
461
- -webkit-appearance: none;
462
- border: none;
463
- outline: none;
464
- cursor: pointer;
465
- border-radius: var(--j-radius-lg);
466
- padding: 4px 12px;
467
- min-height: 28px;
468
- background-color: var(--j-red);
469
- box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.3);
470
- text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
471
- transition: none;
472
- display: inline-flex;
473
- align-items: center;
474
- justify-content: center;
475
- white-space: nowrap;
476
- color: var(--j-white);
477
- font-family: var(--j-font);
478
- font-size: 12px;
479
- line-height: 1;
480
- flex: 0 0 auto;
481
- }
482
-
483
- .j-tab__btn:hover,
484
- .j-tab__btn:active {
485
- background-color: var(--j-dark-red);
486
- }
487
-
488
- .j-tab__btn[data-pressed="true"] {
489
- transform: translateY(2px);
490
- box-shadow: none;
491
- }
492
-
493
- @keyframes jimbo-bounce {
494
-
495
- 0%,
496
- 100% {
497
- transform: translateY(0);
498
- }
499
-
500
- 50% {
501
- transform: translateY(-3px);
502
- }
503
- }
504
-
505
- /* Vertical tabs */
506
- .j-vtabs {
507
- display: flex;
508
- flex-direction: column;
509
- gap: var(--j-space-sm);
510
- }
511
-
512
- .j-vtab {
513
- border: none;
514
- cursor: pointer;
515
- border-radius: 8px 0 0 8px;
516
- padding: 16px 8px;
517
- background-color: var(--j-red);
518
- writing-mode: vertical-rl;
519
- text-orientation: mixed;
520
- transform: rotate(180deg);
521
- transition: none;
522
- }
523
-
524
-
525
- /* ── Toggle List ──────────────────────────────────────────────────────── */
526
-
527
- .j-toggle-list {
528
- display: flex;
529
- flex-direction: column;
530
- gap: var(--j-space-sm);
531
- }
532
-
533
- .j-toggle-list__title {
534
- font-family: var(--j-font);
535
- font-size: 12px;
536
- color: var(--j-grey);
537
- text-transform: uppercase;
538
- letter-spacing: 0.04em;
539
- margin-bottom: var(--j-space-sm);
540
- }
541
-
542
- .j-toggle-item {
543
- display: flex;
544
- align-items: center;
545
- gap: var(--j-space-md);
546
- padding: 6px 8px;
547
- background: rgba(255, 255, 255, 0.05);
548
- border: 1px solid rgba(0, 0, 0, 0.2);
549
- border-radius: var(--j-radius-sm);
550
- cursor: pointer;
551
- font-family: var(--j-font);
552
- color: var(--j-white);
553
- text-transform: uppercase;
554
- letter-spacing: 0.04em;
555
- text-align: left;
556
- justify-content: flex-start;
557
- }
558
-
559
- .j-toggle-check {
560
- width: 10px;
561
- height: 10px;
562
- flex-shrink: 0;
563
- border: 1px solid var(--j-dark-grey);
564
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5);
565
- }
566
-
567
- .j-toggle-check[data-on="true"] {
568
- background: var(--j-orange);
569
- }
570
-
571
- .j-toggle-check[data-on="false"] {
572
- background: var(--j-darkest);
573
- }
574
-
575
-
576
- /* ── Tooltip ──────────────────────────────────────────────────────────── */
577
-
578
- .j-tooltip {
579
- position: fixed;
580
- max-width: 280px;
581
- padding: 6px 10px;
582
- border-radius: var(--j-radius-md);
583
- background: var(--j-darkest);
584
- border: 2px solid var(--j-border-silver);
585
- box-shadow: 0 2px 0 rgba(0, 0, 0, 0.8);
586
- color: var(--j-white);
587
- pointer-events: none;
588
- z-index: 10000;
589
- transition: opacity 120ms ease;
590
- }
591
-
592
-
593
- /* ── Flank Nav ────────────────────────────────────────────────────────── */
594
-
595
- .j-flank {
596
- display: flex;
597
- align-items: stretch;
598
- justify-content: center;
599
- gap: var(--j-space-md);
600
- width: 100%;
601
- position: relative;
602
- }
603
-
604
- .j-flank__content {
605
- position: relative;
606
- flex: 1;
607
- min-width: 0;
608
- display: flex;
609
- flex-direction: column;
610
- }
611
-
612
- .j-flank__btn {
613
- flex-shrink: 0;
614
- width: 40px;
615
- margin: var(--j-press-y) 0;
616
- border: none;
617
- border-radius: var(--j-radius-lg);
618
- cursor: pointer;
619
- background-color: var(--j-red);
620
- color: var(--j-white);
621
- text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
622
- display: flex;
623
- align-items: center;
624
- justify-content: center;
625
- box-shadow: 0 var(--j-press-y) 0 0 var(--j-dark-red);
626
- transition: transform var(--j-press-speed) ease,
627
- box-shadow var(--j-press-speed) ease,
628
- background-color var(--j-press-speed) ease;
629
- }
630
-
631
- .j-flank__btn[data-pressed="true"] {
632
- transform: translateY(var(--j-press-y));
633
- box-shadow: none;
634
- }
635
-
636
- .j-flank__btn:disabled {
637
- background-color: var(--j-dark-red);
638
- cursor: default;
639
- box-shadow: none;
640
- }
641
-
642
-
643
- /* ── Copy Row ─────────────────────────────────────────────────────────── */
644
-
645
- .j-copy-row {
646
- display: flex;
647
- flex-direction: column;
648
- gap: var(--j-space-sm);
649
- }
650
-
651
- .j-copy-row__field {
652
- display: flex;
653
- align-items: center;
654
- gap: var(--j-space-md);
655
- }
656
-
657
- .j-copy-row__value {
658
- flex: 1;
659
- padding: 6px 10px;
660
- background: var(--j-darkest);
661
- border: 2px solid var(--j-panel-edge);
662
- border-radius: var(--j-radius-sm);
663
- word-break: break-all;
664
- }
665
-
666
- .j-copy-row__btn {
667
- font-family: var(--j-font);
668
- font-size: 11px;
669
- letter-spacing: 0.08em;
670
- border-radius: var(--j-radius-sm);
671
- padding: 4px 12px;
672
- cursor: pointer;
673
- flex-shrink: 0;
674
- transition: color 0.15s, background 0.15s, border-color 0.15s;
675
- }
676
-
677
- .j-copy-row__btn[data-copied="false"] {
678
- color: var(--j-gold-text);
679
- background: rgba(228, 182, 67, 0.12);
680
- border: 1px solid var(--j-gold-text);
681
- }
682
-
683
- .j-copy-row__btn[data-copied="true"] {
684
- color: var(--j-green-text);
685
- background: rgba(53, 189, 134, 0.12);
686
- border: 1px solid var(--j-green-text);
687
- }
688
-
689
-
690
- /* ── Code Block ───────────────────────────────────────────────────────── */
691
-
692
- .j-code-block {
693
- background-color: var(--j-darkest);
694
- border: 2px solid var(--j-panel-edge);
695
- border-radius: var(--j-radius-lg);
696
- box-shadow: 0 3px 0 0 rgba(0, 0, 0, 0.5);
697
- overflow: hidden;
698
- display: flex;
699
- flex-direction: column;
700
- }
701
-
702
- .j-code-block__header {
703
- padding: 8px 12px;
704
- display: flex;
705
- align-items: center;
706
- justify-content: space-between;
707
- border-bottom: 1px solid var(--j-inner-border);
708
- }
709
-
710
- .j-code-block__meta {
711
- display: flex;
712
- gap: 8px;
713
- align-items: center;
714
- }
715
-
716
- .j-code-block__filename {
717
- font-size: 10px;
718
- opacity: 0.6;
719
- }
720
-
721
- .j-code-block__lang {
722
- font-size: 9px;
723
- padding: 1px 6px;
724
- border-radius: 3px;
725
- background: rgba(0, 0, 0, 0.4);
726
- color: #60a5fa;
727
- }
728
-
729
- .j-code-block__copy {
730
- padding: 4px;
731
- background: none;
732
- border: none;
733
- cursor: pointer;
734
- display: flex;
735
- }
736
-
737
- .j-code-block__copy[data-copied="false"] {
738
- color: rgba(255, 255, 255, 0.5);
739
- }
740
-
741
- .j-code-block__copy[data-copied="true"] {
742
- color: #4ade80;
743
- }
744
-
745
- .j-code-block__pre {
746
- padding: 12px;
747
- overflow-x: auto;
748
- font-family: monospace;
749
- font-size: 0.875rem;
750
- line-height: 1.6;
751
- color: #f6f0d5;
752
- margin: 0;
753
- }
754
-
755
-
756
- /* ── Filter Bar ───────────────────────────────────────────────────────── */
757
-
758
- .j-filter-bar {
759
- display: flex;
760
- gap: 24px;
761
- padding: var(--j-space-xl);
762
- background-color: var(--j-dark-grey);
763
- border: 4px solid var(--j-border-silver);
764
- box-shadow: 0 3px 0 0 var(--j-border-south);
765
- border-radius: var(--j-radius-lg);
766
- position: relative;
767
- flex-wrap: wrap;
768
- }
769
-
770
- .j-filter-bar__field {
771
- flex: 1;
772
- min-width: 200px;
773
- position: relative;
774
- margin-top: 10px;
775
- }
776
-
777
- .j-filter-bar__pill {
778
- position: absolute;
779
- top: -14px;
780
- left: 16px;
781
- background-color: var(--j-red);
782
- border: 2px solid var(--j-dark-red);
783
- border-radius: var(--j-radius-md);
784
- padding: 4px 12px;
785
- z-index: 2;
786
- }
787
-
788
- .j-filter-bar__input {
789
- width: 100%;
790
- padding: 14px 16px 14px 48px;
791
- background-color: var(--j-darkest);
792
- border: none;
793
- border-bottom: 4px solid var(--j-panel-edge);
794
- border-radius: var(--j-radius-lg);
795
- color: var(--j-white);
796
- font-family: var(--j-font);
797
- font-size: 20px;
798
- letter-spacing: 0.08em;
799
- outline: none;
800
- }
801
-
802
- .j-filter-bar__search-icon {
803
- position: absolute;
804
- left: 0;
805
- top: 0;
806
- bottom: 0;
807
- width: 48px;
808
- display: flex;
809
- align-items: center;
810
- justify-content: center;
811
- pointer-events: none;
812
- color: var(--j-blue);
813
- z-index: 1;
814
- }
815
-
816
- .j-filter-bar__select {
817
- appearance: none;
818
- -webkit-appearance: none;
819
- -moz-appearance: none;
820
- background-color: var(--j-orange);
821
- color: var(--j-white);
822
- border: none;
823
- border-bottom: 4px solid var(--j-dark-orange);
824
- border-radius: var(--j-radius-lg);
825
- cursor: pointer;
826
- font-family: var(--j-font);
827
- font-size: 18px;
828
- letter-spacing: 0.08em;
829
- padding: 14px 48px 14px 24px;
830
- min-width: 200px;
831
- text-align: center;
832
- outline: none;
833
- }
834
-
835
- .j-filter-bar__sort-icon {
836
- position: absolute;
837
- right: 16px;
838
- top: 50%;
839
- transform: translateY(-50%);
840
- pointer-events: none;
841
- color: var(--j-white);
842
- opacity: 0.85;
843
- }
844
-
845
- /* ── FlankNav ───────────────────────────────────────────────────────────── */
846
-
847
- .j-flank {
848
- display: flex;
849
- align-items: center;
850
- justify-content: center;
851
- gap: var(--j-space-md);
852
- width: 100%;
853
- }
854
-
855
- .j-flank__content {
856
- flex: 1;
857
- display: flex;
858
- justify-content: center;
859
- }
860
-
861
- .j-flank__btn {
862
- background: var(--j-red);
863
- color: var(--j-white);
864
- border: none;
865
- border-radius: var(--j-radius-sm);
866
- padding: var(--j-space-sm) var(--j-space-xs);
867
- cursor: pointer;
868
- box-shadow: 0 var(--j-press-y) 0 var(--j-dark-grey);
869
- transition: transform 0.05s ease, box-shadow 0.05s ease, opacity 0.2s ease;
870
- display: flex;
871
- align-items: center;
872
- justify-content: center;
873
- }
874
-
875
- .j-flank__btn[data-pressed="true"] {
876
- transform: translateY(var(--j-press-y));
877
- box-shadow: 0 0 0 var(--j-dark-grey);
878
- }
879
-
880
- .j-flank__btn:disabled {
881
- opacity: 0.5;
882
- cursor: not-allowed;
883
- transform: none;
884
- box-shadow: 0 var(--j-press-y) 0 var(--j-dark-grey);
885
- }
886
-
887
-
888
- /* ── Modal ────────────────────────────────────────────────────────────── */
889
-
890
- .j-modal-overlay {
891
- position: fixed;
892
- inset: 0;
893
- z-index: 50;
894
- display: flex;
895
- align-items: center;
896
- justify-content: center;
897
- padding: var(--j-space-xl);
898
- background: rgba(0, 0, 0, 0.7);
899
- }
900
-
901
- .j-modal {
902
- width: 100%;
903
- max-width: 375px;
904
- max-height: 90vh;
905
- display: flex;
906
- flex-direction: column;
907
- }
908
-
909
- .j-modal__title {
910
- text-align: center;
911
- margin: 0 0 var(--j-space-xl);
912
- }
913
-
914
-
915
- /* ── Footer ───────────────────────────────────────────────────────────── */
916
-
917
- .j-footer {
918
- width: 100%;
919
- transition: opacity 200ms;
920
- }
921
-
922
- .j-footer--hidden {
923
- pointer-events: none;
924
- opacity: 0;
925
- }
926
-
927
- .j-footer__bar {
928
- width: 100%;
929
- border-top: 1px solid rgba(255, 255, 255, 0.1);
930
- background: rgba(0, 0, 0, 0.9);
931
- padding: 0 1rem 3px;
932
- text-align: center;
933
- }
934
-
935
- .j-footer__text {
936
- font-family: var(--j-font);
937
- font-size: clamp(11px, 0.8vw + 8px, 14px);
938
- display: flex;
939
- flex-wrap: wrap;
940
- align-items: center;
941
- justify-content: center;
942
- gap: 0 0.5rem;
943
- color: white;
944
- margin: 0;
945
- }
946
-
947
- .j-footer__link {
948
- color: var(--j-gold);
949
- text-decoration: none;
950
- }
951
-
952
-
953
- /* ── Floating ─────────────────────────────────────────────────────────── */
954
-
955
- .j-floating {
956
- position: absolute;
957
- z-index: 20;
958
- }
959
-
960
-
961
- /* ── Background (canvas is styled inline because it's fixed fullscreen) ── */
962
-
963
-
964
- /* ── GlowRing ─────────────────────────────────────────────────────────── */
965
-
966
- .j-glow--must {
967
- box-shadow: 0 0 0 2px var(--j-blue), 0 0 10px var(--j-blue);
968
- animation: j-glow-pulse 1.6s ease-in-out infinite;
969
- }
970
-
971
- .j-glow--should {
972
- box-shadow: 0 0 0 2px var(--j-gold), 0 0 10px var(--j-gold);
973
- animation: j-glow-pulse 1.6s ease-in-out infinite;
974
- }
975
-
976
- @keyframes j-glow-pulse {
977
-
978
- 0%,
979
- 100% {
980
- opacity: 0.55;
981
- }
982
-
983
- 50% {
984
- opacity: 1;
985
- }
986
- }
987
-
988
-
989
- /* ── Utility ──────────────────────────────────────────────────────────── */
990
-
991
- .j-flex {
992
- display: flex;
993
- }
994
-
995
- .j-flex-col {
996
- display: flex;
997
- flex-direction: column;
998
- }
999
-
1000
- .j-flex-wrap {
1001
- flex-wrap: wrap;
1002
- }
1003
-
1004
- .j-items-center {
1005
- align-items: center;
1006
- }
1007
-
1008
- .j-justify-center {
1009
- justify-content: center;
1010
- }
1011
-
1012
- .j-gap-xs {
1013
- gap: var(--j-space-xs);
1014
- }
1015
-
1016
- .j-gap-sm {
1017
- gap: var(--j-space-sm);
1018
- }
1019
-
1020
- .j-gap-md {
1021
- gap: var(--j-space-md);
1022
- }
1023
-
1024
- .j-gap-lg {
1025
- gap: var(--j-space-lg);
1026
- }
1027
-
1028
- .j-gap-xl {
1029
- gap: var(--j-space-xl);
1030
- }
1031
-
1032
- .j-w-full {
1033
- width: 100%;
1034
- }
1035
-
1036
- .j-shrink-0 {
1037
- flex-shrink: 0;
1038
- }
1039
-
1040
- .j-flex-1 {
1041
- flex: 1;
1042
- }
1043
-
1044
- .j-min-w-0 {
1045
- min-width: 0;
1046
- }
1047
-
1048
- .j-text-center {
1049
- text-align: center;
1050
- }
1051
-
1052
- .j-overflow-hidden {
1053
- overflow: hidden;
1054
- }
1055
-
1056
- .j-overflow-auto {
1057
- overflow: auto;
1058
- }
1059
-
1060
- .j-relative {
1061
- position: relative;
1062
- }
1063
-
1064
- /* Tone border utilities */
1065
- .j-border--red {
1066
- border-color: var(--j-red);
1067
- }
1068
-
1069
- .j-border--blue {
1070
- border-color: var(--j-blue);
1071
- }
1072
-
1073
- .j-border--green {
1074
- border-color: var(--j-green);
1075
- }
1076
-
1077
- .j-border--gold {
1078
- border-color: var(--j-gold);
1079
- }
1080
-
1081
- .j-border--orange {
1082
- border-color: var(--j-orange);
1083
- }
1084
-
1085
- .j-border--purple {
1086
- border-color: var(--j-purple);
1087
- }
1088
-
1089
- /* Tone background utilities */
1090
- .j-bg--red {
1091
- background-color: var(--j-red);
1092
- }
1093
-
1094
- .j-bg--blue {
1095
- background-color: var(--j-blue);
1096
- }
1097
-
1098
- .j-bg--green {
1099
- background-color: var(--j-green);
1100
- }
1101
-
1102
- .j-bg--gold {
1103
- background-color: var(--j-gold);
1104
- }
1105
-
1106
- .j-bg--orange {
1107
- background-color: var(--j-orange);
1108
- }
1109
-
1110
- .j-bg--purple {
1111
- background-color: var(--j-purple);
1112
- }
1113
-
1114
- .j-bg--dark-grey {
1115
- background-color: var(--j-dark-grey);
1116
- }
1117
-
1118
- .j-bg--darkest {
1119
- background-color: var(--j-darkest);
1120
- }
1121
-
1122
- /* ── App Shell ────────────────────────────────────────────────────────── */
1123
- /* Mobile-first 375px layout container for ALL Jimbo UI screens.
1124
- * Supports container queries for responsive breakpoints:
1125
- * compact ≤400px — iPhone SE, fixed 667px height, NO scroll
1126
- * cozy 401-750px — MCP inline / wider phones, flexible height, scroll OK
1127
- * wide 751px+ tablet/desktop, two-column layouts (future)
1128
- *
1129
- * Default = compact (hard lock). Add .j-app--fluid to unlock for MCP/desktop.
1130
- */
1131
-
1132
- .j-app {
1133
- container-type: inline-size;
1134
- container-name: jimbo;
1135
- width: 375px;
1136
- max-width: 375px;
1137
- height: 667px;
1138
- max-height: 667px;
1139
- margin: 0 auto;
1140
- display: flex;
1141
- flex-direction: column;
1142
- background: var(--j-darkest);
1143
- font-family: var(--j-font);
1144
- color: var(--j-white);
1145
- overflow: hidden;
1146
- position: relative;
1147
- }
1148
-
1149
- /* Fluid modifier unlocks the container for MCP / desktop contexts. */
1150
- .j-app--fluid {
1151
- width: 100%;
1152
- max-width: 750px;
1153
- height: auto;
1154
- max-height: none;
1155
- min-height: 400px;
1156
- }
1157
-
1158
- .j-app__content {
1159
- flex: 1;
1160
- min-height: 0;
1161
- overflow: hidden;
1162
- padding: var(--j-space-lg) var(--j-space-lg) var(--j-space-md);
1163
- display: flex;
1164
- flex-direction: column;
1165
- }
1166
-
1167
- .j-app__scroll {
1168
- flex: 1;
1169
- min-height: 0;
1170
- overflow-y: auto;
1171
- overflow-x: hidden;
1172
- padding: var(--j-space-lg) var(--j-space-lg) var(--j-space-md);
1173
- scrollbar-width: none;
1174
- -ms-overflow-style: none;
1175
- }
1176
-
1177
- .j-app__scroll::-webkit-scrollbar {
1178
- display: none;
1179
- }
1180
-
1181
- .j-app__footer {
1182
- flex-shrink: 0;
1183
- padding: var(--j-space-md) var(--j-space-lg) var(--j-space-md);
1184
- border-top: 2px solid var(--j-black);
1185
- background: var(--j-dark-grey);
1186
- display: flex;
1187
- flex-direction: column;
1188
- gap: var(--j-space-sm);
1189
- }
1190
-
1191
- /* ── Cozy Breakpoint (401px+) ──────────────────────────────────────── */
1192
- /* Only activates when j-app--fluid is used AND container is wide enough. */
1193
-
1194
- @container jimbo (min-width: 401px) {
1195
- .j-app__content {
1196
- padding: var(--j-space-xl) var(--j-space-xl) var(--j-space-lg);
1197
- }
1198
-
1199
- .j-app__scroll {
1200
- padding: var(--j-space-xl) var(--j-space-xl) var(--j-space-lg);
1201
- }
1202
-
1203
- .j-app__footer {
1204
- padding: var(--j-space-md) var(--j-space-xl) var(--j-space-lg);
1205
- }
1206
- }
1207
-
1208
- @container jimbo (min-width: 401px) {
1209
- .j-stat-grid__value {
1210
- font-size: 20px;
1211
- }
1212
-
1213
- .j-info-card {
1214
- padding: var(--j-space-md) var(--j-space-lg);
1215
- }
1216
-
1217
- .j-info-card__title {
1218
- font-size: 14px;
1219
- }
1220
-
1221
- .j-section-header__tag {
1222
- font-size: 12px;
1223
- }
1224
- }
1225
-
1226
-
1227
- /* ── Section Header ──────────────────────────────────────────────────── */
1228
- /* Colored tag + horizontal rule — reusable section divider. */
1229
-
1230
- .j-section-header {
1231
- display: flex;
1232
- align-items: center;
1233
- gap: var(--j-space-md);
1234
- margin-bottom: var(--j-space-md);
1235
- }
1236
-
1237
- .j-section-header__tag {
1238
- font-family: var(--j-font);
1239
- font-size: 11px;
1240
- letter-spacing: 2px;
1241
- padding: 2px 8px;
1242
- color: var(--j-white);
1243
- border-radius: 3px;
1244
- text-shadow: var(--j-text-shadow);
1245
- flex-shrink: 0;
1246
- }
1247
-
1248
- .j-section-header__rule {
1249
- flex: 1;
1250
- height: 2px;
1251
- border-radius: 1px;
1252
- opacity: 0.33;
1253
- }
1254
-
1255
-
1256
- /* ── Stat Grid ───────────────────────────────────────────────────────── */
1257
- /* 3-column stat bar — reusable primitive. */
1258
-
1259
- .j-stat-grid {
1260
- background: var(--j-dark-grey);
1261
- border-radius: var(--j-radius-md);
1262
- padding: var(--j-space-md);
1263
- border: 2px solid var(--j-panel-edge);
1264
- box-shadow: 0 2px 0 var(--j-black);
1265
- display: grid;
1266
- grid-template-columns: 1fr 1fr 1fr;
1267
- gap: var(--j-space-md);
1268
- text-align: center;
1269
- }
1270
-
1271
- .j-stat-grid__value {
1272
- font-family: var(--j-font);
1273
- font-size: 16px;
1274
- color: var(--j-gold-text);
1275
- text-shadow: var(--j-text-shadow);
1276
- }
1277
-
1278
- .j-stat-grid__label {
1279
- font-family: var(--j-font);
1280
- font-size: 9px;
1281
- color: var(--j-grey);
1282
- letter-spacing: 2px;
1283
- margin-top: 2px;
1284
- }
1285
-
1286
-
1287
- /* ── Info Card ───────────────────────────────────────────────────────── */
1288
- /* Generic clickable row card — used for filter lists, seed lists, etc. */
1289
-
1290
- .j-info-card {
1291
- background: var(--j-dark-grey);
1292
- border-radius: var(--j-radius-md);
1293
- padding: var(--j-space-md);
1294
- box-shadow: 0 2px 0 var(--j-black);
1295
- display: flex;
1296
- align-items: center;
1297
- gap: var(--j-space-md);
1298
- cursor: pointer;
1299
- border: 2px solid transparent;
1300
- }
1301
-
1302
- .j-info-card:hover {
1303
- filter: brightness(1.08);
1304
- }
1305
-
1306
- .j-info-card__body {
1307
- flex: 1;
1308
- min-width: 0;
1309
- }
1310
-
1311
- .j-info-card__title {
1312
- font-family: var(--j-font);
1313
- font-size: 13px;
1314
- color: var(--j-white);
1315
- letter-spacing: 1px;
1316
- text-shadow: var(--j-text-shadow);
1317
- overflow: hidden;
1318
- text-overflow: ellipsis;
1319
- white-space: nowrap;
1320
- }
1321
-
1322
- .j-info-card__sub {
1323
- font-family: var(--j-font);
1324
- font-size: 9px;
1325
- color: var(--j-gold-text);
1326
- letter-spacing: 1px;
1327
- margin-top: 2px;
1328
- }
1329
-
1330
- .j-info-card__aside {
1331
- text-align: right;
1332
- flex-shrink: 0;
1333
- }
1334
-
1335
-
1336
- /* ── Inset Box ───────────────────────────────────────────────────────── */
1337
- /* Dark recessed content area — for log output, recent finds, etc. */
1338
-
1339
- .j-inset {
1340
- background: var(--j-dark-grey);
1341
- border-radius: var(--j-radius-md);
1342
- padding: var(--j-space-md) var(--j-space-md);
1343
- border: 2px solid var(--j-panel-edge);
1344
- box-shadow: 0 2px 0 var(--j-black);
1345
- font-family: var(--j-font);
1346
- font-size: 11px;
1347
- color: var(--j-grey);
1348
- letter-spacing: 1px;
1349
- line-height: 1.7;
1350
- }
1351
-
1352
-
1353
- /* ── Wordmark ────────────────────────────────────────────────────────── */
1354
- /* Title + subtitle hero block. */
1355
-
1356
- .j-wordmark {
1357
- text-align: center;
1358
- margin-bottom: var(--j-space-xl);
1359
- }
1360
-
1361
- .j-wordmark__title {
1362
- font-family: var(--j-font);
1363
- font-size: 32px;
1364
- letter-spacing: 3px;
1365
- line-height: 1;
1366
- color: var(--j-gold-text);
1367
- text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.8);
1368
- }
1369
-
1370
- .j-wordmark__sub {
1371
- font-family: var(--j-font);
1372
- font-size: 14px;
1373
- letter-spacing: 4px;
1374
- color: var(--j-grey);
1375
- margin-top: 4px;
1376
- text-shadow: var(--j-text-shadow);
1377
- }
1378
-
1379
-
1380
- /* ── Seed Input ───────────────────────────────────────────────────────── */
1381
-
1382
- .j-seed-input {
1383
- display: flex;
1384
- flex-direction: column;
1385
- gap: var(--j-space-sm);
1386
- }
1387
-
1388
- .j-seed-input__field {
1389
- width: 100%;
1390
- padding: 8px 12px;
1391
- border-radius: var(--j-radius-md);
1392
- border: 2px solid var(--j-panel-edge);
1393
- background: var(--j-darkest);
1394
- color: var(--j-gold-text);
1395
- font-size: 18px;
1396
- font-family: var(--j-font);
1397
- font-weight: 400;
1398
- letter-spacing: 0.12em;
1399
- text-transform: uppercase;
1400
- text-shadow: var(--j-text-shadow);
1401
- outline: none;
1402
- transition: border-color 100ms ease;
1403
- box-sizing: border-box;
1404
- }
1405
-
1406
- .j-seed-input__field::placeholder {
1407
- color: var(--j-grey);
1408
- opacity: 0.6;
1409
- text-transform: uppercase;
1410
- letter-spacing: 0.06em;
1411
- font-size: 12px;
1412
- }
1413
-
1414
- .j-seed-input__field:focus {
1415
- border-color: var(--j-gold);
1416
- }
1417
-
1418
- .j-seed-input__field[data-valid="true"] {
1419
- border-color: var(--j-green);
1420
- }
1421
-
1422
- .j-seed-input__field[data-valid="false"] {
1423
- border-color: var(--j-red);
1424
- }
1425
-
1426
- .j-seed-input__field[data-valid="partial"] {
1427
- border-color: var(--j-panel-edge);
1428
- }
1429
-
1430
- .j-seed-input__hint {
1431
- font-family: var(--j-font);
1432
- font-size: 9px;
1433
- letter-spacing: 0.08em;
1434
- color: var(--j-grey);
1435
- text-shadow: var(--j-text-shadow);
1436
- }
1437
-
1438
-
1439
- /* ── Aesthetic Selector ──────────────────────────────────────────────── */
1440
-
1441
- .j-aesthetic-selector {
1442
- display: flex;
1443
- flex-direction: column;
1444
- gap: var(--j-space-sm);
1445
- }
1446
-
1447
- .j-aesthetic-selector__list {
1448
- display: flex;
1449
- flex-wrap: wrap;
1450
- gap: var(--j-space-sm);
1451
- }
1452
-
1453
- .j-aesthetic-pill {
1454
- padding: 4px 10px;
1455
- border-radius: var(--j-radius-md);
1456
- border: 2px solid var(--j-panel-edge);
1457
- background: var(--j-darkest);
1458
- color: var(--j-grey);
1459
- cursor: pointer;
1460
- font-size: 11px;
1461
- font-family: var(--j-font);
1462
- font-weight: 400;
1463
- letter-spacing: 0.04em;
1464
- text-shadow: var(--j-text-shadow);
1465
- transition: border-color 100ms ease, background 100ms ease, color 100ms ease;
1466
- box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.3);
1467
- }
1468
-
1469
- .j-aesthetic-pill:hover {
1470
- border-color: var(--j-gold);
1471
- color: var(--j-gold-text);
1472
- }
1473
-
1474
- .j-aesthetic-pill[data-active="true"] {
1475
- border-color: var(--j-gold);
1476
- background: rgba(228, 182, 67, 0.13);
1477
- color: var(--j-gold-text);
1478
- box-shadow: 0 0 0 1px var(--j-gold), 0 2px 0 0 rgba(0, 0, 0, 0.3);
1479
- }
1480
-
1481
-
1482
- /* ── Showcase ─────────────────────────────────────────────────────────── */
1483
-
1484
- .j-showcase {
1485
- width: 100%;
1486
- height: 100%;
1487
- background: var(--j-darkest);
1488
- display: flex;
1489
- flex-direction: column;
1490
- font-family: var(--j-font);
1491
- color: var(--j-white);
1492
- overflow: hidden;
1493
- }
1494
-
1495
- .j-showcase__scroll {
1496
- flex: 1;
1497
- min-height: 0;
1498
- overflow-y: auto;
1499
- padding: 18px 14px 10px;
1500
- }
1501
-
1502
- .j-showcase__wordmark {
1503
- text-align: center;
1504
- margin-bottom: 18px;
1505
- }
1506
-
1507
- .j-showcase__wordmark-title {
1508
- font-size: 32px;
1509
- letter-spacing: 3px;
1510
- line-height: 1;
1511
- color: var(--j-gold-text);
1512
- text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.8);
1513
- }
1514
-
1515
- .j-showcase__wordmark-sub {
1516
- font-size: 14px;
1517
- letter-spacing: 4px;
1518
- color: var(--j-grey);
1519
- margin-top: 4px;
1520
- text-shadow: var(--j-text-shadow);
1521
- }
1522
-
1523
- .j-showcase__stats {
1524
- background: var(--j-dark-grey);
1525
- border-radius: var(--j-radius-md);
1526
- padding: 10px;
1527
- border: 2px solid var(--j-panel-edge);
1528
- box-shadow: 0 2px 0 var(--j-black);
1529
- display: grid;
1530
- grid-template-columns: 1fr 1fr 1fr;
1531
- gap: var(--j-space-md);
1532
- text-align: center;
1533
- margin-bottom: var(--j-space-xl);
1534
- }
1535
-
1536
- .j-showcase__stat-value {
1537
- font-size: 16px;
1538
- color: var(--j-gold-text);
1539
- text-shadow: var(--j-text-shadow);
1540
- }
1541
-
1542
- .j-showcase__stat-label {
1543
- font-size: 9px;
1544
- color: var(--j-grey);
1545
- letter-spacing: 2px;
1546
- margin-top: 2px;
1547
- }
1548
-
1549
- .j-showcase__section-header {
1550
- display: flex;
1551
- align-items: center;
1552
- gap: var(--j-space-md);
1553
- margin-bottom: var(--j-space-md);
1554
- }
1555
-
1556
- .j-showcase__section-tag {
1557
- font-size: 11px;
1558
- letter-spacing: 2px;
1559
- padding: 2px 8px;
1560
- color: var(--j-white);
1561
- border-radius: 3px;
1562
- text-shadow: var(--j-text-shadow);
1563
- }
1564
-
1565
- .j-showcase__section-rule {
1566
- flex: 1;
1567
- height: 2px;
1568
- border-radius: 1px;
1569
- }
1570
-
1571
- .j-showcase__filter-list {
1572
- display: flex;
1573
- flex-direction: column;
1574
- gap: var(--j-space-md);
1575
- margin-bottom: var(--j-space-xl);
1576
- }
1577
-
1578
- .j-showcase__filter-card {
1579
- background: var(--j-dark-grey);
1580
- border-radius: var(--j-radius-md);
1581
- padding: 10px;
1582
- box-shadow: 0 2px 0 var(--j-black);
1583
- display: flex;
1584
- align-items: center;
1585
- gap: 10px;
1586
- cursor: pointer;
1587
- }
1588
-
1589
- .j-showcase__filter-sprites {
1590
- display: flex;
1591
- gap: 2px;
1592
- }
1593
-
1594
- .j-showcase__filter-sprite {
1595
- width: 30px;
1596
- height: 40px;
1597
- display: flex;
1598
- align-items: center;
1599
- justify-content: center;
1600
- }
1601
-
1602
- .j-showcase__filter-info {
1603
- flex: 1;
1604
- min-width: 0;
1605
- }
1606
-
1607
- .j-showcase__filter-name {
1608
- font-size: 13px;
1609
- color: var(--j-white);
1610
- letter-spacing: 1px;
1611
- text-shadow: var(--j-text-shadow);
1612
- overflow: hidden;
1613
- text-overflow: ellipsis;
1614
- white-space: nowrap;
1615
- }
1616
-
1617
- .j-showcase__filter-author {
1618
- font-size: 9px;
1619
- color: var(--j-gold-text);
1620
- letter-spacing: 1px;
1621
- margin-top: 2px;
1622
- }
1623
-
1624
- .j-showcase__filter-hits {
1625
- text-align: right;
1626
- }
1627
-
1628
- .j-showcase__filter-hits-value {
1629
- font-size: 14px;
1630
- text-shadow: var(--j-text-shadow);
1631
- }
1632
-
1633
- .j-showcase__filter-hits-label {
1634
- font-size: 8px;
1635
- color: var(--j-grey);
1636
- letter-spacing: 1px;
1637
- }
1638
-
1639
- .j-showcase__recent {
1640
- background: var(--j-dark-grey);
1641
- border-radius: var(--j-radius-md);
1642
- padding: 8px 10px;
1643
- border: 2px solid var(--j-panel-edge);
1644
- box-shadow: 0 2px 0 var(--j-black);
1645
- font-size: 11px;
1646
- color: var(--j-grey);
1647
- letter-spacing: 1px;
1648
- line-height: 1.7;
1649
- }
1650
-
1651
- .j-showcase__actions {
1652
- padding: 8px 10px 10px;
1653
- border-top: 2px solid var(--j-black);
1654
- background: var(--j-dark-grey);
1655
- display: flex;
1656
- flex-direction: column;
1657
- gap: 6px;
1658
- }
1659
-
1660
-
1661
- /* ── Footer suit animation ────────────────────────────────────────────── */
1662
-
1663
- .j-footer__suits {
1664
- display: inline-flex;
1665
- align-items: center;
1666
- }
1667
-
1668
- .j-footer__suit-stage {
1669
- position: relative;
1670
- display: inline-block;
1671
- width: 1.5em;
1672
- height: 1em;
1673
- vertical-align: middle;
1674
- }
1675
-
1676
- .j-footer__suit-char {
1677
- position: absolute;
1678
- inset: 0;
1679
- display: inline-flex;
1680
- align-items: center;
1681
- justify-content: center;
1682
- opacity: 0;
1683
- animation-duration: 5s;
1684
- animation-delay: 0s;
1685
- animation-iteration-count: infinite;
1686
- animation-timing-function: ease-out;
1687
- }
1688
-
1689
-
1690
- /* ── Copy row label ───────────────────────────────────────────────────── */
1691
-
1692
- .j-copy-row__label {
1693
- letter-spacing: 2px;
1694
- }
1695
-
1696
-
1697
- /* ── Motely version badge ─────────────────────────────────────────────── */
1698
-
1699
- .j-motely-badge {
1700
- display: inline-flex;
1701
- align-items: center;
1702
- gap: 6px;
1703
- }
1704
-
1705
- .j-motely-badge--chip {
1706
- padding: 3px 8px;
1707
- border-radius: var(--j-radius-sm);
1708
- background: var(--j-darkest);
1709
- border: 1px solid var(--j-panel-edge);
1710
- }
1711
-
1712
- /* ── Font Dance Animation ─────────────────────────────────────────────── */
1713
-
1714
- @keyframes j-font-dance {
1715
- 0% {
1716
- transform: translateY(0);
1717
- }
1718
-
1719
- 25% {
1720
- transform: translateY(-1px);
1721
- }
1722
-
1723
- 50% {
1724
- transform: translateY(0);
1725
- }
1726
-
1727
- 75% {
1728
- transform: translateY(1px);
1729
- }
1730
-
1731
- 100% {
1732
- transform: translateY(0);
1733
- }
1734
- }
1735
-
1736
- .j-text--dance-container {
1737
- display: inline-flex;
1738
- }
1739
-
1740
- .j-font-dance-char {
1741
- display: inline-block;
1742
- animation: j-font-dance 3s infinite ease-in-out;
1743
- }
1744
-
1745
- .hide-scrollbar {
1746
- scrollbar-width: none;
1747
- -ms-overflow-style: none;
1748
- }
1749
-
1750
- .hide-scrollbar::-webkit-scrollbar {
1751
- display: none;
1752
- }
1753
-
1754
- .j-juice-hover {
1755
- transition: transform 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
1756
- }
1757
-
1758
- .j-juice-hover:hover {
1759
- transform: scale(1.05) translateY(-2px);
1760
- z-index: 5;
1761
- }
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ jimbo.css — Jimbo Design System
3
+ Balatro-inspired design tokens + component classes.
4
+ Eyedropped from actual game shader output — not Lua hex values.
5
+ ═══════════════════════════════════════════════════════════════════════════ */
6
+
7
+ /* Global Scrollbar Hide */
8
+ * {
9
+ scrollbar-width: none !important;
10
+ -ms-overflow-style: none !important;
11
+ }
12
+ *::-webkit-scrollbar {
13
+ display: none !important;
14
+ }
15
+
16
+ /* ── Design Tokens (CSS Custom Properties) ─────────────────────────────── */
17
+
18
+ :root {
19
+ /* Colors — eyedropped from Balatro's rendered shader output */
20
+ --j-red: #ff4c40;
21
+ --j-blue: #0093ff;
22
+ --j-green: #429f79;
23
+ --j-orange: #ff9800;
24
+ --j-gold: #e4b643;
25
+ --j-purple: #9e74ce;
26
+
27
+ --j-dark-red: #a02721;
28
+ --j-dark-blue: #0057a1;
29
+ --j-dark-orange: #a05b00;
30
+ --j-dark-green: #215f46;
31
+ --j-dark-purple: #5e437e;
32
+
33
+ --j-dark-grey: #3a5055;
34
+ --j-darkest: #1e2b2d;
35
+ --j-grey: #708386;
36
+ --j-teal-grey: #404c4e;
37
+
38
+ --j-panel-edge: #1e2e32;
39
+ --j-inner-border: #334461;
40
+ --j-border-silver: #b9c2d2;
41
+ --j-border-south: #777e89;
42
+
43
+ --j-gold-text: #e4b643;
44
+ --j-green-text: #35bd86;
45
+ --j-orange-text: #ff8f00;
46
+ --j-white: #ffffff;
47
+ --j-black: #000000;
48
+
49
+ --j-tarot-btn: #9e74ce;
50
+ --j-planet-btn: #00a7ca;
51
+ --j-spectral-btn: #2e76fd;
52
+ --j-tarot-btn-dark: #5e437e;
53
+ --j-planet-btn-dark: #00657c;
54
+ --j-spectral-btn-dark: #14449e;
55
+
56
+ /* Typography */
57
+ --j-font: 'm6x11plus', 'Courier New', monospace;
58
+ --j-text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
59
+
60
+ /* Spacing */
61
+ --j-space-xs: 2px;
62
+ --j-space-sm: 4px;
63
+ --j-space-md: 8px;
64
+ --j-space-lg: 12px;
65
+ --j-space-xl: 16px;
66
+
67
+ /* Radii — Balatro is chunky, not bubbly. Never > 10px. */
68
+ --j-radius-sm: 4px;
69
+ --j-radius-md: 6px;
70
+ --j-radius-lg: 8px;
71
+ --j-radius-pill: 10px;
72
+
73
+ /* Animation */
74
+ --j-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
75
+ --j-press-y: 3px;
76
+ --j-press-speed: 55ms;
77
+ }
78
+
79
+
80
+ /* ── Base Text ─────────────────────────────────────────────────────────── */
81
+
82
+ .j-text {
83
+ font-family: var(--j-font);
84
+ font-weight: 400;
85
+ line-height: 1.2;
86
+ text-shadow: var(--j-text-shadow);
87
+ color: var(--j-white);
88
+ }
89
+ .j-text--no-shadow { text-shadow: none; }
90
+ .j-text--upper {
91
+ text-transform: uppercase;
92
+ letter-spacing: 0.08em;
93
+ }
94
+
95
+ /* Font Dance Animation */
96
+ .j-text--dance-container {
97
+ display: inline-block;
98
+ white-space: pre-wrap;
99
+ }
100
+
101
+ .j-font-dance-char {
102
+ display: inline-block;
103
+ animation: j-font-dance 1.5s infinite steps(2, end);
104
+ }
105
+
106
+ @keyframes j-font-dance {
107
+ 0%, 100% { transform: translate(0, 0); }
108
+ 25% { transform: translate(1px, -1px); }
109
+ 50% { transform: translate(0, -2px); }
110
+ 75% { transform: translate(-1px, -1px); }
111
+ }
112
+
113
+ /* Sizes (from DESIGN.md typography scale) */
114
+ .j-text--display { font-size: 26px; letter-spacing: 0.04em; line-height: 1; }
115
+ .j-text--xl { font-size: 24px; letter-spacing: 0.04em; }
116
+ .j-text--lg { font-size: 18px; letter-spacing: 0.04em; }
117
+ .j-text--heading { font-size: 14px; letter-spacing: 0.08em; line-height: 1.2; }
118
+ .j-text--md { font-size: 14px; }
119
+ .j-text--sm { font-size: 12px; }
120
+ .j-text--body { font-size: 11px; letter-spacing: 0.05em; line-height: 1.3; }
121
+ .j-text--xs { font-size: 10px; }
122
+ .j-text--label { font-size: 9px; letter-spacing: 0.1em; line-height: 1; text-transform: uppercase; }
123
+ .j-text--micro { font-size: 8px; letter-spacing: 0.08em; line-height: 1; }
124
+
125
+ /* Tones */
126
+ .j-text--default { color: var(--j-white); }
127
+ .j-text--mult,
128
+ .j-text--red { color: var(--j-red); }
129
+ .j-text--chips,
130
+ .j-text--blue { color: var(--j-blue); }
131
+ .j-text--gold { color: var(--j-gold-text); }
132
+ .j-text--green { color: var(--j-green-text); }
133
+ .j-text--orange { color: var(--j-orange-text); }
134
+ .j-text--purple { color: var(--j-purple); }
135
+ .j-text--grey { color: var(--j-grey); }
136
+
137
+
138
+ /* ── Panel ─────────────────────────────────────────────────────────────── */
139
+
140
+ .j-panel {
141
+ background-color: var(--j-dark-grey);
142
+ border: 2px solid var(--j-border-silver);
143
+ border-bottom-color: var(--j-border-south);
144
+ border-radius: var(--j-radius-md);
145
+ box-shadow: 0 3px 0 0 rgba(0, 0, 0, 0.55),
146
+ inset 0 0 0 1px rgba(255, 255, 255, 0.04);
147
+ padding: var(--j-space-lg);
148
+ display: flex;
149
+ flex-direction: column;
150
+ align-items: stretch;
151
+ overflow: visible;
152
+ position: relative;
153
+ }
154
+
155
+ .j-panel__body {
156
+ flex: 1;
157
+ overflow: auto;
158
+ }
159
+
160
+ .j-panel__back {
161
+ margin-top: var(--j-space-lg);
162
+ padding-top: var(--j-space-md);
163
+ flex-shrink: 0;
164
+ }
165
+
166
+ .j-inner-panel {
167
+ background-color: var(--j-inner-border);
168
+ border: 2px solid var(--j-panel-edge);
169
+ border-radius: var(--j-radius-md);
170
+ padding: var(--j-space-lg);
171
+ }
172
+
173
+
174
+ /* ── Button ────────────────────────────────────────────────────────────── */
175
+ /* Chunky 3D press: black underside via drop shadow,
176
+ press sinks the face +3px and collapses the shadow. */
177
+
178
+ .j-btn {
179
+ display: inline-block;
180
+ position: relative;
181
+ cursor: pointer;
182
+ -webkit-user-select: none;
183
+ user-select: none;
184
+ }
185
+ /* Invisible stable hit target to prevent hover jitter when the child transforms */
186
+ .j-btn::after {
187
+ content: '';
188
+ position: absolute;
189
+ inset: 0;
190
+ background: transparent;
191
+ z-index: 10;
192
+ }
193
+ .j-btn--full { width: 100%; }
194
+ .j-btn--disabled {
195
+ opacity: 0.55;
196
+ cursor: not-allowed;
197
+ }
198
+
199
+ .j-btn__face {
200
+ position: relative;
201
+ border-radius: var(--j-radius-md);
202
+ background: var(--j-btn-face-color, var(--j-orange));
203
+ text-align: center;
204
+ text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
205
+ box-shadow: 0 var(--j-press-y) 0 0 rgba(0, 0, 0, 0.6);
206
+ transform: translate(0, 0);
207
+ transition: transform var(--j-press-speed) linear, box-shadow var(--j-press-speed) linear;
208
+ }
209
+ .j-btn[data-pressed="true"] .j-btn__face,
210
+ .j-btn:active:not(:disabled):not(.j-btn--disabled) .j-btn__face {
211
+ transform: translateY(var(--j-press-y));
212
+ box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.6);
213
+ }
214
+ .j-btn:not(.j-btn--disabled):hover .j-btn__face {
215
+ filter: brightness(1.1);
216
+ }
217
+
218
+ /* Sizes */
219
+ .j-btn--xs .j-btn__face { padding: 4px 8px; font-size: 11px; }
220
+ .j-btn--sm .j-btn__face { padding: 6px 12px; font-size: 13px; }
221
+ .j-btn--md .j-btn__face { padding: 10px 18px; font-size: 16px; }
222
+ .j-btn--lg .j-btn__face { padding: 8px 18px; font-size: 20px; }
223
+
224
+ /* Tone colors — set via CSS custom properties */
225
+ .j-btn--orange { --j-btn-face-color: var(--j-orange); }
226
+ .j-btn--red { --j-btn-face-color: var(--j-red); }
227
+ .j-btn--blue { --j-btn-face-color: var(--j-blue); }
228
+ .j-btn--green { --j-btn-face-color: var(--j-green); }
229
+ .j-btn--tarot { --j-btn-face-color: var(--j-tarot-btn); }
230
+ .j-btn--planet { --j-btn-face-color: var(--j-planet-btn); }
231
+ .j-btn--spectral { --j-btn-face-color: var(--j-spectral-btn); }
232
+
233
+
234
+ /* ── Badge ─────────────────────────────────────────────────────────────── */
235
+
236
+ .j-badge {
237
+ display: inline-flex;
238
+ align-items: center;
239
+ border-radius: var(--j-radius-sm);
240
+ font-family: var(--j-font);
241
+ font-weight: 400;
242
+ letter-spacing: 0.04em;
243
+ white-space: nowrap;
244
+ text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
245
+ border: none;
246
+ }
247
+ .j-badge--sm { padding: 2px 6px; font-size: 10px; }
248
+ .j-badge--md { padding: 4px 8px; font-size: 12px; }
249
+
250
+ /* Badge tones — flat, no shadow, no edges */
251
+ .j-badge--dark { background: var(--j-darkest); color: var(--j-white); }
252
+ .j-badge--blue { background: var(--j-blue); color: var(--j-white); }
253
+ .j-badge--red { background: var(--j-red); color: var(--j-white); }
254
+ .j-badge--green { background: var(--j-green); color: var(--j-white); }
255
+ .j-badge--orange { background: var(--j-orange); color: var(--j-white); }
256
+ .j-badge--purple { background: var(--j-purple); color: var(--j-white); }
257
+
258
+
259
+ /* ── Tabs ──────────────────────────────────────────────────────────────── */
260
+
261
+ .j-tabs {
262
+ display: flex;
263
+ gap: var(--j-space-md);
264
+ align-items: flex-end;
265
+ flex-wrap: wrap;
266
+ }
267
+
268
+ .j-tab {
269
+ display: flex;
270
+ flex-direction: column;
271
+ align-items: center;
272
+ position: relative;
273
+ }
274
+
275
+ .j-tab__indicator {
276
+ margin-bottom: var(--j-space-sm);
277
+ display: flex;
278
+ justify-content: center;
279
+ }
280
+ .j-tab__indicator svg {
281
+ fill: var(--j-gold, #e4b643);
282
+ display: block;
283
+ }
284
+ .j-tab__indicator[data-active="true"] {
285
+ animation: jimbo-bounce 0.8s cubic-bezier(0.68, 0, 0.68, 1) infinite;
286
+ }
287
+ .j-tab__indicator[data-active="false"] {
288
+ visibility: hidden;
289
+ }
290
+
291
+ .j-tab__btn {
292
+ border: none;
293
+ cursor: pointer;
294
+ border-radius: var(--j-radius-sm);
295
+ padding: 4px 12px;
296
+ background-color: transparent;
297
+ box-shadow: none;
298
+ transition: none;
299
+ }
300
+ .j-tab__btn[data-active="true"] {
301
+ background-color: var(--j-gold);
302
+ box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.3);
303
+ }
304
+ .j-tab__btn[data-active="true"]:hover {
305
+ background-color: var(--j-gold);
306
+ }
307
+ .j-tab__btn[data-active="false"]:hover {
308
+ background-color: rgba(255, 255, 255, 0.06);
309
+ }
310
+ .j-tab__btn[data-pressed="true"] {
311
+ transform: translateY(2px);
312
+ box-shadow: none;
313
+ }
314
+
315
+ @keyframes jimbo-bounce {
316
+ 0%, 100% { transform: translateY(0); }
317
+ 50% { transform: translateY(-3px); }
318
+ }
319
+
320
+ /* Vertical tabs */
321
+ .j-vtabs {
322
+ display: flex;
323
+ flex-direction: column;
324
+ gap: var(--j-space-sm);
325
+ }
326
+
327
+ .j-vtab {
328
+ border: none;
329
+ cursor: pointer;
330
+ border-radius: 8px 0 0 8px;
331
+ padding: 16px 8px;
332
+ background-color: transparent;
333
+ writing-mode: vertical-rl;
334
+ text-orientation: mixed;
335
+ transform: rotate(180deg);
336
+ transition: none;
337
+ }
338
+ .j-vtab[data-active="true"] {
339
+ background-color: var(--j-gold, #e4b643);
340
+ color: var(--j-black, #000000);
341
+ }
342
+
343
+
344
+ /* ── Toggle List ──────────────────────────────────────────────────────── */
345
+
346
+ .j-toggle-list {
347
+ display: flex;
348
+ flex-direction: column;
349
+ gap: var(--j-space-sm);
350
+ }
351
+
352
+ .j-toggle-list__title {
353
+ font-family: var(--j-font);
354
+ font-size: 12px;
355
+ color: var(--j-grey);
356
+ text-transform: uppercase;
357
+ letter-spacing: 0.04em;
358
+ margin-bottom: var(--j-space-sm);
359
+ }
360
+
361
+ .j-toggle-item {
362
+ display: flex;
363
+ align-items: center;
364
+ gap: var(--j-space-md);
365
+ padding: 6px 8px;
366
+ background: rgba(255, 255, 255, 0.05);
367
+ border: 1px solid rgba(0, 0, 0, 0.2);
368
+ border-radius: var(--j-radius-sm);
369
+ cursor: pointer;
370
+ font-family: var(--j-font);
371
+ color: var(--j-white);
372
+ text-transform: uppercase;
373
+ letter-spacing: 0.04em;
374
+ text-align: left;
375
+ justify-content: flex-start;
376
+ }
377
+
378
+ .j-toggle-check {
379
+ width: 10px;
380
+ height: 10px;
381
+ flex-shrink: 0;
382
+ border: 1px solid var(--j-dark-grey);
383
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5);
384
+ }
385
+ .j-toggle-check[data-on="true"] { background: var(--j-orange); }
386
+ .j-toggle-check[data-on="false"] { background: var(--j-darkest); }
387
+
388
+
389
+ /* ── Tooltip ──────────────────────────────────────────────────────────── */
390
+
391
+ .j-tooltip {
392
+ position: fixed;
393
+ max-width: 280px;
394
+ padding: 6px 10px;
395
+ border-radius: var(--j-radius-md);
396
+ background: var(--j-darkest);
397
+ border: 2px solid var(--j-border-silver);
398
+ box-shadow: 0 2px 0 rgba(0, 0, 0, 0.8);
399
+ color: var(--j-white);
400
+ pointer-events: none;
401
+ z-index: 10000;
402
+ transition: opacity 120ms ease;
403
+ }
404
+
405
+
406
+ /* ── Flank Nav ────────────────────────────────────────────────────────── */
407
+
408
+ .j-flank {
409
+ display: flex;
410
+ align-items: stretch;
411
+ justify-content: center;
412
+ gap: var(--j-space-md);
413
+ width: 100%;
414
+ position: relative;
415
+ }
416
+
417
+ .j-flank__content {
418
+ position: relative;
419
+ flex: 1;
420
+ min-width: 0;
421
+ display: flex;
422
+ flex-direction: column;
423
+ }
424
+
425
+ .j-flank__btn {
426
+ flex-shrink: 0;
427
+ width: 40px;
428
+ margin: var(--j-press-y) 0;
429
+ border: none;
430
+ border-radius: var(--j-radius-lg);
431
+ cursor: pointer;
432
+ background-color: var(--j-red);
433
+ color: var(--j-white);
434
+ text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.8);
435
+ display: flex;
436
+ align-items: center;
437
+ justify-content: center;
438
+ box-shadow: 0 var(--j-press-y) 0 0 var(--j-dark-red);
439
+ transition: transform var(--j-press-speed) ease,
440
+ box-shadow var(--j-press-speed) ease,
441
+ background-color var(--j-press-speed) ease;
442
+ }
443
+ .j-flank__btn[data-pressed="true"] {
444
+ transform: translateY(var(--j-press-y));
445
+ box-shadow: none;
446
+ }
447
+ .j-flank__btn:disabled {
448
+ background-color: var(--j-dark-red);
449
+ cursor: default;
450
+ box-shadow: none;
451
+ }
452
+
453
+
454
+ /* ── Copy Row ─────────────────────────────────────────────────────────── */
455
+
456
+ .j-copy-row {
457
+ display: flex;
458
+ flex-direction: column;
459
+ gap: var(--j-space-sm);
460
+ }
461
+
462
+ .j-copy-row__field {
463
+ display: flex;
464
+ align-items: center;
465
+ gap: var(--j-space-md);
466
+ }
467
+
468
+ .j-copy-row__value {
469
+ flex: 1;
470
+ padding: 6px 10px;
471
+ background: var(--j-darkest);
472
+ border: 2px solid var(--j-panel-edge);
473
+ border-radius: var(--j-radius-sm);
474
+ word-break: break-all;
475
+ }
476
+
477
+ .j-copy-row__btn {
478
+ font-family: var(--j-font);
479
+ font-size: 11px;
480
+ letter-spacing: 0.08em;
481
+ border-radius: var(--j-radius-sm);
482
+ padding: 4px 12px;
483
+ cursor: pointer;
484
+ flex-shrink: 0;
485
+ transition: color 0.15s, background 0.15s, border-color 0.15s;
486
+ }
487
+ .j-copy-row__btn[data-copied="false"] {
488
+ color: var(--j-gold-text);
489
+ background: rgba(228, 182, 67, 0.12);
490
+ border: 1px solid var(--j-gold-text);
491
+ }
492
+ .j-copy-row__btn[data-copied="true"] {
493
+ color: var(--j-green-text);
494
+ background: rgba(53, 189, 134, 0.12);
495
+ border: 1px solid var(--j-green-text);
496
+ }
497
+
498
+
499
+ /* ── Code Block ───────────────────────────────────────────────────────── */
500
+
501
+ .j-code-block {
502
+ background-color: var(--j-darkest);
503
+ border: 2px solid var(--j-panel-edge);
504
+ border-radius: var(--j-radius-lg);
505
+ box-shadow: 0 3px 0 0 rgba(0, 0, 0, 0.5);
506
+ overflow: hidden;
507
+ display: flex;
508
+ flex-direction: column;
509
+ }
510
+
511
+ .j-code-block__header {
512
+ padding: 8px 12px;
513
+ display: flex;
514
+ align-items: center;
515
+ justify-content: space-between;
516
+ border-bottom: 1px solid var(--j-inner-border);
517
+ }
518
+
519
+ .j-code-block__meta {
520
+ display: flex;
521
+ gap: 8px;
522
+ align-items: center;
523
+ }
524
+
525
+ .j-code-block__filename {
526
+ font-size: 10px;
527
+ opacity: 0.6;
528
+ }
529
+
530
+ .j-code-block__lang {
531
+ font-size: 9px;
532
+ padding: 1px 6px;
533
+ border-radius: 3px;
534
+ background: rgba(0, 0, 0, 0.4);
535
+ color: #60a5fa;
536
+ }
537
+
538
+ .j-code-block__copy {
539
+ padding: 4px;
540
+ background: none;
541
+ border: none;
542
+ cursor: pointer;
543
+ display: flex;
544
+ }
545
+ .j-code-block__copy[data-copied="false"] { color: rgba(255, 255, 255, 0.5); }
546
+ .j-code-block__copy[data-copied="true"] { color: #4ade80; }
547
+
548
+ .j-code-block__pre {
549
+ padding: 12px;
550
+ overflow-x: auto;
551
+ font-family: monospace;
552
+ font-size: 0.875rem;
553
+ line-height: 1.6;
554
+ color: #f6f0d5;
555
+ margin: 0;
556
+ }
557
+
558
+
559
+ /* ── Filter Bar ───────────────────────────────────────────────────────── */
560
+
561
+ .j-filter-bar {
562
+ display: flex;
563
+ gap: 24px;
564
+ padding: var(--j-space-xl);
565
+ background-color: var(--j-dark-grey);
566
+ border: 4px solid var(--j-border-silver);
567
+ box-shadow: 0 3px 0 0 var(--j-border-south);
568
+ border-radius: var(--j-radius-lg);
569
+ position: relative;
570
+ flex-wrap: wrap;
571
+ }
572
+
573
+ .j-filter-bar__field {
574
+ flex: 1;
575
+ min-width: 200px;
576
+ position: relative;
577
+ margin-top: 10px;
578
+ }
579
+
580
+ .j-filter-bar__pill {
581
+ position: absolute;
582
+ top: -14px;
583
+ left: 16px;
584
+ background-color: var(--j-red);
585
+ border: 2px solid var(--j-dark-red);
586
+ border-radius: var(--j-radius-md);
587
+ padding: 4px 12px;
588
+ z-index: 2;
589
+ }
590
+
591
+ .j-filter-bar__input {
592
+ width: 100%;
593
+ padding: 14px 16px 14px 48px;
594
+ background-color: var(--j-darkest);
595
+ border: none;
596
+ border-bottom: 4px solid var(--j-panel-edge);
597
+ border-radius: var(--j-radius-lg);
598
+ color: var(--j-white);
599
+ font-family: var(--j-font);
600
+ font-size: 20px;
601
+ letter-spacing: 0.08em;
602
+ outline: none;
603
+ }
604
+
605
+ .j-filter-bar__search-icon {
606
+ position: absolute;
607
+ left: 0;
608
+ top: 0;
609
+ bottom: 0;
610
+ width: 48px;
611
+ display: flex;
612
+ align-items: center;
613
+ justify-content: center;
614
+ pointer-events: none;
615
+ color: var(--j-blue);
616
+ z-index: 1;
617
+ }
618
+
619
+ .j-filter-bar__select {
620
+ appearance: none;
621
+ -webkit-appearance: none;
622
+ -moz-appearance: none;
623
+ background-color: var(--j-orange);
624
+ color: var(--j-white);
625
+ border: none;
626
+ border-bottom: 4px solid var(--j-dark-orange);
627
+ border-radius: var(--j-radius-lg);
628
+ cursor: pointer;
629
+ font-family: var(--j-font);
630
+ font-size: 18px;
631
+ letter-spacing: 0.08em;
632
+ padding: 14px 48px 14px 24px;
633
+ min-width: 200px;
634
+ text-align: center;
635
+ outline: none;
636
+ }
637
+
638
+ .j-filter-bar__sort-icon {
639
+ position: absolute;
640
+ right: 16px;
641
+ top: 50%;
642
+ transform: translateY(-50%);
643
+ pointer-events: none;
644
+ color: var(--j-white);
645
+ opacity: 0.85;
646
+ }
647
+
648
+ /* ── FlankNav ───────────────────────────────────────────────────────────── */
649
+
650
+ .j-flank {
651
+ display: flex;
652
+ align-items: center;
653
+ justify-content: center;
654
+ gap: var(--j-space-md);
655
+ width: 100%;
656
+ }
657
+
658
+ .j-flank__content {
659
+ flex: 1;
660
+ display: flex;
661
+ justify-content: center;
662
+ }
663
+
664
+ .j-flank__btn {
665
+ background: var(--j-red);
666
+ color: var(--j-white);
667
+ border: none;
668
+ border-radius: var(--j-radius-sm);
669
+ padding: var(--j-space-sm) var(--j-space-xs);
670
+ cursor: pointer;
671
+ box-shadow: 0 var(--j-press-y) 0 var(--j-dark-grey);
672
+ transition: transform 0.05s ease, box-shadow 0.05s ease, opacity 0.2s ease;
673
+ display: flex;
674
+ align-items: center;
675
+ justify-content: center;
676
+ }
677
+
678
+ .j-flank__btn[data-pressed="true"] {
679
+ transform: translateY(var(--j-press-y));
680
+ box-shadow: 0 0 0 var(--j-dark-grey);
681
+ }
682
+
683
+ .j-flank__btn:disabled {
684
+ opacity: 0.5;
685
+ cursor: not-allowed;
686
+ transform: none;
687
+ box-shadow: 0 var(--j-press-y) 0 var(--j-dark-grey);
688
+ }
689
+
690
+
691
+ /* ── Modal ────────────────────────────────────────────────────────────── */
692
+
693
+ .j-modal-overlay {
694
+ position: fixed;
695
+ inset: 0;
696
+ z-index: 50;
697
+ display: flex;
698
+ align-items: center;
699
+ justify-content: center;
700
+ padding: var(--j-space-xl);
701
+ background: rgba(0, 0, 0, 0.7);
702
+ }
703
+
704
+ .j-modal {
705
+ width: 100%;
706
+ max-width: 375px;
707
+ max-height: 90vh;
708
+ display: flex;
709
+ flex-direction: column;
710
+ }
711
+
712
+ .j-modal__title {
713
+ text-align: center;
714
+ margin: 0 0 var(--j-space-xl);
715
+ }
716
+
717
+
718
+ /* ── Footer ───────────────────────────────────────────────────────────── */
719
+
720
+ .j-footer {
721
+ width: 100%;
722
+ transition: opacity 200ms;
723
+ }
724
+ .j-footer--hidden {
725
+ pointer-events: none;
726
+ opacity: 0;
727
+ }
728
+
729
+ .j-footer__bar {
730
+ width: 100%;
731
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
732
+ background: rgba(0, 0, 0, 0.9);
733
+ padding: 0 1rem 3px;
734
+ text-align: center;
735
+ }
736
+
737
+ .j-footer__text {
738
+ font-family: var(--j-font);
739
+ font-size: clamp(11px, 0.8vw + 8px, 14px);
740
+ display: flex;
741
+ flex-wrap: wrap;
742
+ align-items: center;
743
+ justify-content: center;
744
+ gap: 0 0.5rem;
745
+ color: white;
746
+ margin: 0;
747
+ }
748
+
749
+ .j-footer__link {
750
+ color: var(--j-gold);
751
+ text-decoration: none;
752
+ }
753
+
754
+
755
+ /* ── Floating ─────────────────────────────────────────────────────────── */
756
+
757
+ .j-floating { position: absolute; z-index: 20; }
758
+
759
+
760
+ /* ── Background (canvas is styled inline because it's fixed fullscreen) ── */
761
+
762
+
763
+ /* ── GlowRing ─────────────────────────────────────────────────────────── */
764
+
765
+ .j-glow--must {
766
+ box-shadow: 0 0 0 2px var(--j-blue), 0 0 10px var(--j-blue);
767
+ animation: j-glow-pulse 1.6s ease-in-out infinite;
768
+ }
769
+ .j-glow--should {
770
+ box-shadow: 0 0 0 2px var(--j-gold), 0 0 10px var(--j-gold);
771
+ animation: j-glow-pulse 1.6s ease-in-out infinite;
772
+ }
773
+
774
+ @keyframes j-glow-pulse {
775
+ 0%, 100% { opacity: 0.55; }
776
+ 50% { opacity: 1; }
777
+ }
778
+
779
+
780
+ /* ── Utility ──────────────────────────────────────────────────────────── */
781
+
782
+ .j-flex { display: flex; }
783
+ .j-flex-col { display: flex; flex-direction: column; }
784
+ .j-flex-wrap { flex-wrap: wrap; }
785
+ .j-items-center { align-items: center; }
786
+ .j-justify-center { justify-content: center; }
787
+ .j-gap-xs { gap: var(--j-space-xs); }
788
+ .j-gap-sm { gap: var(--j-space-sm); }
789
+ .j-gap-md { gap: var(--j-space-md); }
790
+ .j-gap-lg { gap: var(--j-space-lg); }
791
+ .j-gap-xl { gap: var(--j-space-xl); }
792
+ .j-w-full { width: 100%; }
793
+ .j-shrink-0 { flex-shrink: 0; }
794
+ .j-flex-1 { flex: 1; }
795
+ .j-min-w-0 { min-width: 0; }
796
+ .j-text-center { text-align: center; }
797
+ .j-overflow-hidden { overflow: hidden; }
798
+ .j-overflow-auto { overflow: auto; }
799
+ .j-relative { position: relative; }
800
+
801
+ /* Tone border utilities */
802
+ .j-border--red { border-color: var(--j-red); }
803
+ .j-border--blue { border-color: var(--j-blue); }
804
+ .j-border--green { border-color: var(--j-green); }
805
+ .j-border--gold { border-color: var(--j-gold); }
806
+ .j-border--orange { border-color: var(--j-orange); }
807
+ .j-border--purple { border-color: var(--j-purple); }
808
+
809
+ /* Tone background utilities */
810
+ .j-bg--red { background-color: var(--j-red); }
811
+ .j-bg--blue { background-color: var(--j-blue); }
812
+ .j-bg--green { background-color: var(--j-green); }
813
+ .j-bg--gold { background-color: var(--j-gold); }
814
+ .j-bg--orange { background-color: var(--j-orange); }
815
+ .j-bg--purple { background-color: var(--j-purple); }
816
+ .j-bg--dark-grey { background-color: var(--j-dark-grey); }
817
+ .j-bg--darkest { background-color: var(--j-darkest); }
818
+
819
+ /* ── App Shell ────────────────────────────────────────────────────────── */
820
+ /* Mobile-first 375px layout container for ALL Jimbo UI screens.
821
+ * Supports container queries for responsive breakpoints:
822
+ * compact ≤400px — iPhone SE, fixed 667px height, NO scroll
823
+ * cozy 401-750px MCP inline / wider phones, flexible height, scroll OK
824
+ * wide 751px+ — tablet/desktop, two-column layouts (future)
825
+ *
826
+ * Default = compact (hard lock). Add .j-app--fluid to unlock for MCP/desktop.
827
+ */
828
+
829
+ .j-app {
830
+ container-type: inline-size;
831
+ container-name: jimbo;
832
+ width: 375px;
833
+ max-width: 375px;
834
+ height: 667px;
835
+ max-height: 667px;
836
+ margin: 0 auto;
837
+ display: flex;
838
+ flex-direction: column;
839
+ background: var(--j-darkest);
840
+ font-family: var(--j-font);
841
+ color: var(--j-white);
842
+ overflow: hidden;
843
+ position: relative;
844
+ }
845
+
846
+ /* Fluid modifier — unlocks the container for MCP / desktop contexts. */
847
+ .j-app--fluid {
848
+ width: 100%;
849
+ max-width: 750px;
850
+ height: auto;
851
+ max-height: none;
852
+ min-height: 400px;
853
+ }
854
+
855
+ .j-app__content {
856
+ flex: 1;
857
+ min-height: 0;
858
+ overflow: hidden;
859
+ padding: var(--j-space-lg) var(--j-space-lg) var(--j-space-md);
860
+ display: flex;
861
+ flex-direction: column;
862
+ }
863
+
864
+ .j-app__scroll {
865
+ flex: 1;
866
+ min-height: 0;
867
+ overflow-y: auto;
868
+ overflow-x: hidden;
869
+ padding: var(--j-space-lg) var(--j-space-lg) var(--j-space-md);
870
+ scrollbar-width: none;
871
+ -ms-overflow-style: none;
872
+ }
873
+ .j-app__scroll::-webkit-scrollbar { display: none; }
874
+
875
+ .j-app__footer {
876
+ flex-shrink: 0;
877
+ padding: var(--j-space-md) var(--j-space-lg) var(--j-space-md);
878
+ border-top: 2px solid var(--j-black);
879
+ background: var(--j-dark-grey);
880
+ display: flex;
881
+ flex-direction: column;
882
+ gap: var(--j-space-sm);
883
+ }
884
+
885
+ /* ── Cozy Breakpoint (401px+) ──────────────────────────────────────── */
886
+ /* Only activates when j-app--fluid is used AND container is wide enough. */
887
+
888
+ @container jimbo (min-width: 401px) {
889
+ .j-app__content {
890
+ padding: var(--j-space-xl) var(--j-space-xl) var(--j-space-lg);
891
+ }
892
+ .j-app__scroll {
893
+ padding: var(--j-space-xl) var(--j-space-xl) var(--j-space-lg);
894
+ }
895
+ .j-app__footer {
896
+ padding: var(--j-space-md) var(--j-space-xl) var(--j-space-lg);
897
+ }
898
+ }
899
+
900
+ @container jimbo (min-width: 401px) {
901
+ .j-stat-grid__value {
902
+ font-size: 20px;
903
+ }
904
+ .j-info-card {
905
+ padding: var(--j-space-md) var(--j-space-lg);
906
+ }
907
+ .j-info-card__title {
908
+ font-size: 14px;
909
+ }
910
+ .j-section-header__tag {
911
+ font-size: 12px;
912
+ }
913
+ }
914
+
915
+
916
+ /* ── Section Header ──────────────────────────────────────────────────── */
917
+ /* Colored tag + horizontal rule — reusable section divider. */
918
+
919
+ .j-section-header {
920
+ display: flex;
921
+ align-items: center;
922
+ gap: var(--j-space-md);
923
+ margin-bottom: var(--j-space-md);
924
+ }
925
+
926
+ .j-section-header__tag {
927
+ font-family: var(--j-font);
928
+ font-size: 11px;
929
+ letter-spacing: 2px;
930
+ padding: 2px 8px;
931
+ color: var(--j-white);
932
+ border-radius: 3px;
933
+ text-shadow: var(--j-text-shadow);
934
+ flex-shrink: 0;
935
+ }
936
+
937
+ .j-section-header__rule {
938
+ flex: 1;
939
+ height: 2px;
940
+ border-radius: 1px;
941
+ opacity: 0.33;
942
+ }
943
+
944
+
945
+ /* ── Stat Grid ───────────────────────────────────────────────────────── */
946
+ /* 3-column stat bar — reusable primitive. */
947
+
948
+ .j-stat-grid {
949
+ background: var(--j-dark-grey);
950
+ border-radius: var(--j-radius-md);
951
+ padding: var(--j-space-md);
952
+ border: 2px solid var(--j-panel-edge);
953
+ box-shadow: 0 2px 0 var(--j-black);
954
+ display: grid;
955
+ grid-template-columns: 1fr 1fr 1fr;
956
+ gap: var(--j-space-md);
957
+ text-align: center;
958
+ }
959
+
960
+ .j-stat-grid__value {
961
+ font-family: var(--j-font);
962
+ font-size: 16px;
963
+ color: var(--j-gold-text);
964
+ text-shadow: var(--j-text-shadow);
965
+ }
966
+
967
+ .j-stat-grid__label {
968
+ font-family: var(--j-font);
969
+ font-size: 9px;
970
+ color: var(--j-grey);
971
+ letter-spacing: 2px;
972
+ margin-top: 2px;
973
+ }
974
+
975
+
976
+ /* ── Info Card ───────────────────────────────────────────────────────── */
977
+ /* Generic clickable row card — used for filter lists, seed lists, etc. */
978
+
979
+ .j-info-card {
980
+ background: var(--j-dark-grey);
981
+ border-radius: var(--j-radius-md);
982
+ padding: var(--j-space-md);
983
+ box-shadow: 0 2px 0 var(--j-black);
984
+ display: flex;
985
+ align-items: center;
986
+ gap: var(--j-space-md);
987
+ cursor: pointer;
988
+ border: 2px solid transparent;
989
+ }
990
+ .j-info-card:hover {
991
+ filter: brightness(1.08);
992
+ }
993
+
994
+ .j-info-card__body {
995
+ flex: 1;
996
+ min-width: 0;
997
+ }
998
+
999
+ .j-info-card__title {
1000
+ font-family: var(--j-font);
1001
+ font-size: 13px;
1002
+ color: var(--j-white);
1003
+ letter-spacing: 1px;
1004
+ text-shadow: var(--j-text-shadow);
1005
+ overflow: hidden;
1006
+ text-overflow: ellipsis;
1007
+ white-space: nowrap;
1008
+ }
1009
+
1010
+ .j-info-card__sub {
1011
+ font-family: var(--j-font);
1012
+ font-size: 9px;
1013
+ color: var(--j-gold-text);
1014
+ letter-spacing: 1px;
1015
+ margin-top: 2px;
1016
+ }
1017
+
1018
+ .j-info-card__aside {
1019
+ text-align: right;
1020
+ flex-shrink: 0;
1021
+ }
1022
+
1023
+
1024
+ /* ── Inset Box ───────────────────────────────────────────────────────── */
1025
+ /* Dark recessed content area — for log output, recent finds, etc. */
1026
+
1027
+ .j-inset {
1028
+ background: var(--j-dark-grey);
1029
+ border-radius: var(--j-radius-md);
1030
+ padding: var(--j-space-md) var(--j-space-md);
1031
+ border: 2px solid var(--j-panel-edge);
1032
+ box-shadow: 0 2px 0 var(--j-black);
1033
+ font-family: var(--j-font);
1034
+ font-size: 11px;
1035
+ color: var(--j-grey);
1036
+ letter-spacing: 1px;
1037
+ line-height: 1.7;
1038
+ }
1039
+
1040
+
1041
+ /* ── Wordmark ────────────────────────────────────────────────────────── */
1042
+ /* Title + subtitle hero block. */
1043
+
1044
+ .j-wordmark {
1045
+ text-align: center;
1046
+ margin-bottom: var(--j-space-xl);
1047
+ }
1048
+
1049
+ .j-wordmark__title {
1050
+ font-family: var(--j-font);
1051
+ font-size: 32px;
1052
+ letter-spacing: 3px;
1053
+ line-height: 1;
1054
+ color: var(--j-gold-text);
1055
+ text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.8);
1056
+ }
1057
+
1058
+ .j-wordmark__sub {
1059
+ font-family: var(--j-font);
1060
+ font-size: 14px;
1061
+ letter-spacing: 4px;
1062
+ color: var(--j-grey);
1063
+ margin-top: 4px;
1064
+ text-shadow: var(--j-text-shadow);
1065
+ }
1066
+
1067
+
1068
+ /* ── Seed Input ───────────────────────────────────────────────────────── */
1069
+
1070
+ .j-seed-input {
1071
+ display: flex;
1072
+ flex-direction: column;
1073
+ gap: var(--j-space-sm);
1074
+ }
1075
+
1076
+ .j-seed-input__field {
1077
+ width: 100%;
1078
+ padding: 8px 12px;
1079
+ border-radius: var(--j-radius-md);
1080
+ border: 2px solid var(--j-panel-edge);
1081
+ background: var(--j-darkest);
1082
+ color: var(--j-gold-text);
1083
+ font-size: 18px;
1084
+ font-family: var(--j-font);
1085
+ font-weight: 400;
1086
+ letter-spacing: 0.12em;
1087
+ text-transform: uppercase;
1088
+ text-shadow: var(--j-text-shadow);
1089
+ outline: none;
1090
+ transition: border-color 100ms ease;
1091
+ box-sizing: border-box;
1092
+ }
1093
+ .j-seed-input__field::placeholder {
1094
+ color: var(--j-grey);
1095
+ opacity: 0.6;
1096
+ text-transform: uppercase;
1097
+ letter-spacing: 0.06em;
1098
+ font-size: 12px;
1099
+ }
1100
+ .j-seed-input__field:focus {
1101
+ border-color: var(--j-gold);
1102
+ }
1103
+ .j-seed-input__field[data-valid="true"] {
1104
+ border-color: var(--j-green);
1105
+ }
1106
+ .j-seed-input__field[data-valid="false"] {
1107
+ border-color: var(--j-red);
1108
+ }
1109
+ .j-seed-input__field[data-valid="partial"] {
1110
+ border-color: var(--j-panel-edge);
1111
+ }
1112
+
1113
+ .j-seed-input__hint {
1114
+ font-family: var(--j-font);
1115
+ font-size: 9px;
1116
+ letter-spacing: 0.08em;
1117
+ color: var(--j-grey);
1118
+ text-shadow: var(--j-text-shadow);
1119
+ }
1120
+
1121
+
1122
+ /* ── Aesthetic Selector ──────────────────────────────────────────────── */
1123
+
1124
+ .j-aesthetic-selector {
1125
+ display: flex;
1126
+ flex-direction: column;
1127
+ gap: var(--j-space-sm);
1128
+ }
1129
+
1130
+ .j-aesthetic-selector__list {
1131
+ display: flex;
1132
+ flex-wrap: wrap;
1133
+ gap: var(--j-space-sm);
1134
+ }
1135
+
1136
+ .j-aesthetic-pill {
1137
+ padding: 4px 10px;
1138
+ border-radius: var(--j-radius-md);
1139
+ border: 2px solid var(--j-panel-edge);
1140
+ background: var(--j-darkest);
1141
+ color: var(--j-grey);
1142
+ cursor: pointer;
1143
+ font-size: 11px;
1144
+ font-family: var(--j-font);
1145
+ font-weight: 400;
1146
+ letter-spacing: 0.04em;
1147
+ text-shadow: var(--j-text-shadow);
1148
+ transition: border-color 100ms ease, background 100ms ease, color 100ms ease;
1149
+ box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.3);
1150
+ }
1151
+ .j-aesthetic-pill:hover {
1152
+ border-color: var(--j-gold);
1153
+ color: var(--j-gold-text);
1154
+ }
1155
+ .j-aesthetic-pill[data-active="true"] {
1156
+ border-color: var(--j-gold);
1157
+ background: rgba(228, 182, 67, 0.13);
1158
+ color: var(--j-gold-text);
1159
+ box-shadow: 0 0 0 1px var(--j-gold), 0 2px 0 0 rgba(0, 0, 0, 0.3);
1160
+ }
1161
+
1162
+
1163
+ /* ── Showcase ─────────────────────────────────────────────────────────── */
1164
+
1165
+ .j-showcase {
1166
+ width: 100%;
1167
+ height: 100%;
1168
+ background: var(--j-darkest);
1169
+ display: flex;
1170
+ flex-direction: column;
1171
+ font-family: var(--j-font);
1172
+ color: var(--j-white);
1173
+ overflow: hidden;
1174
+ }
1175
+
1176
+ .j-showcase__scroll {
1177
+ flex: 1;
1178
+ min-height: 0;
1179
+ overflow-y: auto;
1180
+ padding: 18px 14px 10px;
1181
+ }
1182
+
1183
+ .j-showcase__wordmark {
1184
+ text-align: center;
1185
+ margin-bottom: 18px;
1186
+ }
1187
+
1188
+ .j-showcase__wordmark-title {
1189
+ font-size: 32px;
1190
+ letter-spacing: 3px;
1191
+ line-height: 1;
1192
+ color: var(--j-gold-text);
1193
+ text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.8);
1194
+ }
1195
+
1196
+ .j-showcase__wordmark-sub {
1197
+ font-size: 14px;
1198
+ letter-spacing: 4px;
1199
+ color: var(--j-grey);
1200
+ margin-top: 4px;
1201
+ text-shadow: var(--j-text-shadow);
1202
+ }
1203
+
1204
+ .j-showcase__stats {
1205
+ background: var(--j-dark-grey);
1206
+ border-radius: var(--j-radius-md);
1207
+ padding: 10px;
1208
+ border: 2px solid var(--j-panel-edge);
1209
+ box-shadow: 0 2px 0 var(--j-black);
1210
+ display: grid;
1211
+ grid-template-columns: 1fr 1fr 1fr;
1212
+ gap: var(--j-space-md);
1213
+ text-align: center;
1214
+ margin-bottom: var(--j-space-xl);
1215
+ }
1216
+
1217
+ .j-showcase__stat-value {
1218
+ font-size: 16px;
1219
+ color: var(--j-gold-text);
1220
+ text-shadow: var(--j-text-shadow);
1221
+ }
1222
+
1223
+ .j-showcase__stat-label {
1224
+ font-size: 9px;
1225
+ color: var(--j-grey);
1226
+ letter-spacing: 2px;
1227
+ margin-top: 2px;
1228
+ }
1229
+
1230
+ .j-showcase__section-header {
1231
+ display: flex;
1232
+ align-items: center;
1233
+ gap: var(--j-space-md);
1234
+ margin-bottom: var(--j-space-md);
1235
+ }
1236
+
1237
+ .j-showcase__section-tag {
1238
+ font-size: 11px;
1239
+ letter-spacing: 2px;
1240
+ padding: 2px 8px;
1241
+ color: var(--j-white);
1242
+ border-radius: 3px;
1243
+ text-shadow: var(--j-text-shadow);
1244
+ }
1245
+
1246
+ .j-showcase__section-rule {
1247
+ flex: 1;
1248
+ height: 2px;
1249
+ border-radius: 1px;
1250
+ }
1251
+
1252
+ .j-showcase__filter-list {
1253
+ display: flex;
1254
+ flex-direction: column;
1255
+ gap: var(--j-space-md);
1256
+ margin-bottom: var(--j-space-xl);
1257
+ }
1258
+
1259
+ .j-showcase__filter-card {
1260
+ background: var(--j-dark-grey);
1261
+ border-radius: var(--j-radius-md);
1262
+ padding: 10px;
1263
+ box-shadow: 0 2px 0 var(--j-black);
1264
+ display: flex;
1265
+ align-items: center;
1266
+ gap: 10px;
1267
+ cursor: pointer;
1268
+ }
1269
+
1270
+ .j-showcase__filter-sprites {
1271
+ display: flex;
1272
+ gap: 2px;
1273
+ }
1274
+
1275
+ .j-showcase__filter-sprite {
1276
+ width: 30px;
1277
+ height: 40px;
1278
+ display: flex;
1279
+ align-items: center;
1280
+ justify-content: center;
1281
+ }
1282
+
1283
+ .j-showcase__filter-info {
1284
+ flex: 1;
1285
+ min-width: 0;
1286
+ }
1287
+
1288
+ .j-showcase__filter-name {
1289
+ font-size: 13px;
1290
+ color: var(--j-white);
1291
+ letter-spacing: 1px;
1292
+ text-shadow: var(--j-text-shadow);
1293
+ overflow: hidden;
1294
+ text-overflow: ellipsis;
1295
+ white-space: nowrap;
1296
+ }
1297
+
1298
+ .j-showcase__filter-author {
1299
+ font-size: 9px;
1300
+ color: var(--j-gold-text);
1301
+ letter-spacing: 1px;
1302
+ margin-top: 2px;
1303
+ }
1304
+
1305
+ .j-showcase__filter-hits {
1306
+ text-align: right;
1307
+ }
1308
+
1309
+ .j-showcase__filter-hits-value {
1310
+ font-size: 14px;
1311
+ text-shadow: var(--j-text-shadow);
1312
+ }
1313
+
1314
+ .j-showcase__filter-hits-label {
1315
+ font-size: 8px;
1316
+ color: var(--j-grey);
1317
+ letter-spacing: 1px;
1318
+ }
1319
+
1320
+ .j-showcase__recent {
1321
+ background: var(--j-dark-grey);
1322
+ border-radius: var(--j-radius-md);
1323
+ padding: 8px 10px;
1324
+ border: 2px solid var(--j-panel-edge);
1325
+ box-shadow: 0 2px 0 var(--j-black);
1326
+ font-size: 11px;
1327
+ color: var(--j-grey);
1328
+ letter-spacing: 1px;
1329
+ line-height: 1.7;
1330
+ }
1331
+
1332
+ .j-showcase__actions {
1333
+ padding: 8px 10px 10px;
1334
+ border-top: 2px solid var(--j-black);
1335
+ background: var(--j-dark-grey);
1336
+ display: flex;
1337
+ flex-direction: column;
1338
+ gap: 6px;
1339
+ }
1340
+
1341
+
1342
+ /* ── Footer suit animation ────────────────────────────────────────────── */
1343
+
1344
+ .j-footer__suits {
1345
+ display: inline-flex;
1346
+ align-items: center;
1347
+ }
1348
+
1349
+ .j-footer__suit-stage {
1350
+ position: relative;
1351
+ display: inline-block;
1352
+ width: 1.5em;
1353
+ height: 1em;
1354
+ vertical-align: middle;
1355
+ }
1356
+
1357
+ .j-footer__suit-char {
1358
+ position: absolute;
1359
+ inset: 0;
1360
+ display: inline-flex;
1361
+ align-items: center;
1362
+ justify-content: center;
1363
+ opacity: 0;
1364
+ animation-duration: 5s;
1365
+ animation-delay: 0s;
1366
+ animation-iteration-count: infinite;
1367
+ animation-timing-function: ease-out;
1368
+ }
1369
+
1370
+
1371
+ /* ── Copy row label ───────────────────────────────────────────────────── */
1372
+
1373
+ .j-copy-row__label {
1374
+ letter-spacing: 2px;
1375
+ }
1376
+
1377
+
1378
+ /* ── Motely version badge ─────────────────────────────────────────────── */
1379
+
1380
+ .j-motely-badge {
1381
+ display: inline-flex;
1382
+ align-items: center;
1383
+ gap: 6px;
1384
+ }
1385
+
1386
+ .j-motely-badge--chip {
1387
+ padding: 3px 8px;
1388
+ border-radius: var(--j-radius-sm);
1389
+ background: var(--j-darkest);
1390
+ border: 1px solid var(--j-panel-edge);
1391
+ }
1392
+
1393
+ /* ── Font Dance Animation ─────────────────────────────────────────────── */
1394
+
1395
+ @keyframes j-font-dance {
1396
+ 0% { transform: translateY(0); }
1397
+ 25% { transform: translateY(-1px); }
1398
+ 50% { transform: translateY(0); }
1399
+ 75% { transform: translateY(1px); }
1400
+ 100% { transform: translateY(0); }
1401
+ }
1402
+
1403
+ .j-text--dance-container {
1404
+ display: inline-flex;
1405
+ }
1406
+
1407
+ .j-font-dance-char {
1408
+ display: inline-block;
1409
+ animation: j-font-dance 3s infinite ease-in-out;
1410
+ }
1411
+
1412
+ .hide-scrollbar {
1413
+ scrollbar-width: none;
1414
+ -ms-overflow-style: none;
1415
+ }
1416
+ .hide-scrollbar::-webkit-scrollbar {
1417
+ display: none;
1418
+ }
1419
+ .j-juice-hover { transition: transform 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275); }
1420
+ .j-juice-hover:hover { transform: scale(1.05) translateY(-2px); z-index: 5; }