@zvndev/darkmown 0.20.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +13 -0
  3. package/README.md +115 -5
  4. package/docs/spec-alignment.md +16 -3
  5. package/package.json +3 -3
  6. package/site/_/base.skin +372 -0
  7. package/site/_/base.wd +4 -0
  8. package/site/_/footer.wd +14 -0
  9. package/site/_/metrics.json +13 -0
  10. package/site/_/nav.skin +35 -12
  11. package/site/_/nav.wd +8 -10
  12. package/site/_/products.json +10 -0
  13. package/site/pages/app.wd +1 -1
  14. package/site/pages/carousel/index.js +82 -0
  15. package/site/pages/carousel/index.skin +185 -0
  16. package/site/pages/carousel/index.wd +109 -0
  17. package/site/pages/carousel/slide-1.jpg +0 -0
  18. package/site/pages/carousel/slide-2.jpg +0 -0
  19. package/site/pages/carousel/slide-3.jpg +0 -0
  20. package/site/pages/carousel/slide-4.jpg +0 -0
  21. package/site/pages/carousel/slide-5.jpg +0 -0
  22. package/site/pages/compass/index.skin +247 -0
  23. package/site/pages/compass/index.wd +194 -0
  24. package/site/pages/docs/index.skin +48 -28
  25. package/site/pages/docs/index.wd +71 -5
  26. package/site/pages/folio/-style.skin +375 -0
  27. package/site/pages/folio/-style.wd +6 -0
  28. package/site/pages/folio/cart.skin +309 -0
  29. package/site/pages/folio/cart.wd +201 -0
  30. package/site/pages/folio/index.skin +24 -0
  31. package/site/pages/folio/index.wd +167 -0
  32. package/site/pages/forge/index.skin +676 -0
  33. package/site/pages/forge/index.wd +330 -0
  34. package/site/pages/index.skin +135 -144
  35. package/site/pages/index.wd +17 -5
  36. package/site/pages/ledger/index.skin +257 -0
  37. package/site/pages/ledger/index.wd +174 -0
  38. package/site/pages/media/clip-poster.jpg +0 -0
  39. package/site/pages/media/clip.mp4 +0 -0
  40. package/site/pages/media/index.skin +82 -0
  41. package/site/pages/media/index.wd +84 -0
  42. package/site/pages/media/tone.mp3 +0 -0
  43. package/site/pages/pulse/index.skin +434 -0
  44. package/site/pages/pulse/index.wd +178 -0
  45. package/site/pages/showcase/index.skin +130 -0
  46. package/site/pages/showcase/index.wd +168 -0
  47. package/src/compiler/body.js +26 -1
  48. package/src/compiler/context.js +1 -1
  49. package/src/compiler/directives.js +199 -3
  50. package/src/compiler/format.js +244 -0
  51. package/src/compiler/interpolation.js +35 -1
  52. package/src/compiler/loops.js +95 -24
  53. package/src/compiler/markdown.js +16 -7
  54. package/src/compiler/predicates.js +35 -2
  55. package/src/headers.js +5 -0
  56. package/src/runtime.js +168 -14
  57. package/src/skin.js +9 -1
@@ -0,0 +1,676 @@
1
+ /* ===================================================================
2
+ Forge — interactive plan / pricing configurator.
3
+ A confident, modern SaaS identity layered ON TOP of /base.skin
4
+ (tokens + .card + .source-reveal). Vivid violet brand, big rounded
5
+ cards, a gradient price that dominates the rail, and selectable
6
+ tier / feature cards whose ON state is unmistakable.
7
+
8
+ IMPORTANT: the :button / :submit directives emit *bare* <button>
9
+ elements (no .btn class), so every interactive element here is
10
+ styled by targeting `button` directly inside its container — not
11
+ `.btn`. That mismatch is why the old buttons fell back to ugly
12
+ browser defaults; this file fixes it.
13
+
14
+ Everything is scoped to .app-forge so it never leaks into the
15
+ shared design system. The accent lives in one token — --brand —
16
+ with a dark-mode override, so light and dark both stay premium.
17
+ =================================================================== */
18
+
19
+ .app-forge
20
+ --brand #6d5ae6
21
+ --brand-deep #5a47d6
22
+ --brand-ink #4636b8
23
+ --brand-soft #f1eefe
24
+ --brand-tint #f7f5ff
25
+ --brand-line #e0dafc
26
+ --brand-grad linear-gradient(135deg, #7d6bff 0%, #6d5ae6 45%, #8b5cf6 100%)
27
+ --brand-glow rgba(109, 90, 230, .28)
28
+ --brand-shadow rgba(80, 60, 200, .35)
29
+ --on-bg #ffffff
30
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif
31
+
32
+ @media (prefers-color-scheme: dark)
33
+ .app-forge
34
+ --brand #9b8bff
35
+ --brand-deep #b3a6ff
36
+ --brand-ink #cfc6ff
37
+ --brand-soft #1d1830
38
+ --brand-tint #181426
39
+ --brand-line #2c2548
40
+ --brand-grad linear-gradient(135deg, #a594ff 0%, #9b8bff 45%, #b78bff 100%)
41
+ --brand-glow rgba(155, 139, 255, .32)
42
+ --brand-shadow rgba(120, 100, 255, .4)
43
+ --on-bg #1a1626
44
+
45
+ /* Confident sans headings, tighter than the serif default. */
46
+ .app-forge h1, .app-forge h2, .app-forge h3
47
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif
48
+ letter-spacing -.02em
49
+
50
+ .app-forge .eyebrow
51
+ color $brand
52
+
53
+ .app-forge a
54
+ color $brand-deep
55
+
56
+ /* ── Shared button reset for this app ───────────────────────────────
57
+ :button emits a bare <button> — give every one of them the pill
58
+ foundation here, then specialize per zone below. */
59
+ .app-forge button
60
+ font-family system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif
61
+ font-size .95rem
62
+ font-weight 600
63
+ line-height 1
64
+ display inline-flex
65
+ align-items center
66
+ justify-content center
67
+ gap .45rem
68
+ cursor pointer
69
+ border 1.5px solid transparent
70
+ radius 12px
71
+ padding .8rem 1.15rem
72
+ transition transform .14s ease, box-shadow .18s ease, background .18s ease, border-color .18s ease, color .18s ease
73
+ -webkit-tap-highlight-color transparent
74
+
75
+ .app-forge button:active
76
+ transform translateY(1px) scale(.99)
77
+
78
+ .app-forge button:focus-visible
79
+ outline none
80
+ box-shadow 0 0 0 4px $brand-glow
81
+
82
+ /* ── Hero ───────────────────────────────────────────────────────── */
83
+
84
+ .forge-hero
85
+ text-align center
86
+ max-width 760px
87
+ margin 0 auto
88
+ padding 1rem 0 .5rem
89
+
90
+ .forge-hero h1
91
+ font-size clamp(2.7rem, 6.5vw, 4.5rem)
92
+ font-weight 760
93
+ margin .25rem 0 .5rem
94
+ line-height 1.02
95
+ background var(--brand-grad)
96
+ -webkit-background-clip text
97
+ background-clip text
98
+ color transparent
99
+
100
+ .forge-hero p
101
+ margin-left auto
102
+ margin-right auto
103
+ color $ink-soft
104
+ font-size 1.14rem
105
+
106
+ .forge-trust
107
+ display flex
108
+ flex-wrap wrap
109
+ gap .5rem .65rem
110
+ justify-content center
111
+ margin 1.5rem 0 .5rem
112
+
113
+ .forge-trust-item
114
+ display inline-flex
115
+ align-items center
116
+ gap .4rem
117
+ font-size .82rem
118
+ font-weight 600
119
+ color $ink-soft
120
+ padding .42rem .9rem
121
+ background $panel
122
+ border 1px solid $brand-line
123
+ radius 999px
124
+
125
+ .forge-trust-item::before
126
+ content "✓"
127
+ color $brand
128
+ font-weight 800
129
+
130
+ /* ── Layout: build column + sticky summary rail ─────────────────── */
131
+
132
+ .forge-layout
133
+ display grid
134
+ grid-template-columns minmax(0, 1fr) 360px
135
+ gap 2.25rem
136
+ align-items start
137
+ margin-top 3rem
138
+
139
+ @media (max-width: 900px)
140
+ .forge-layout
141
+ grid-template-columns 1fr
142
+
143
+ .forge-build h2
144
+ font-size 1.55rem
145
+ margin 2.8rem 0 1.1rem
146
+ font-weight 720
147
+ display flex
148
+ align-items center
149
+ gap .65rem
150
+
151
+ .forge-build h2:first-of-type
152
+ margin-top 0
153
+
154
+ /* Step number chip drawn from the "N · " prefix is left in the text;
155
+ give the heading a subtle brand underline accent instead. */
156
+ .forge-build h2::after
157
+ content ""
158
+ flex 1
159
+ height 1px
160
+ background linear-gradient(90deg, $brand-line, transparent)
161
+
162
+ /* ── Tier selector ──────────────────────────────────────────────── */
163
+
164
+ .tier-grid
165
+ display grid
166
+ grid-template-columns repeat(3, 1fr)
167
+ gap 1rem
168
+
169
+ @media (max-width: 620px)
170
+ .tier-grid
171
+ grid-template-columns 1fr
172
+
173
+ .app-forge .tier
174
+ position relative
175
+ border 1.5px solid $line
176
+ radius 20px
177
+ padding 1.5rem 1.4rem
178
+ background $panel
179
+ box-shadow 0 1px 2px rgba(28,24,20,.04)
180
+ transition border-color .18s ease, box-shadow .2s ease, transform .18s ease, background .2s ease
181
+ cursor default
182
+ overflow hidden
183
+
184
+ .app-forge .tier:hover
185
+ border-color $brand-line
186
+ transform translateY(-2px)
187
+ box-shadow 0 16px 36px -24px $brand-shadow
188
+
189
+ .app-forge .tier h3
190
+ margin 0 0 .4rem
191
+ font-size 1.2rem
192
+
193
+ .app-forge .tier p
194
+ font-size .92rem
195
+ color $muted
196
+ margin .5rem 0 1.2rem
197
+
198
+ .app-forge .tier p:first-of-type
199
+ color $ink
200
+ margin-bottom .85rem
201
+
202
+ .app-forge .tier p strong
203
+ font-size 1.55rem
204
+ font-weight 760
205
+ color $ink
206
+ letter-spacing -.02em
207
+
208
+ /* Default (unselected) select button — bold outline, brand text. */
209
+ .app-forge .tier button
210
+ width 100%
211
+ margin 0
212
+ background $panel
213
+ border-color $brand-line
214
+ color $brand-deep
215
+
216
+ .app-forge .tier button:hover
217
+ border-color $brand
218
+ background $brand-tint
219
+ transform translateY(-1px)
220
+
221
+ /* Active tier — driven by `.on when base == N`. Filled, lifted, ringed. */
222
+ .app-forge .tier.on
223
+ border-color $brand
224
+ background $brand-tint
225
+ box-shadow 0 0 0 2px $brand, 0 22px 44px -22px $brand-shadow
226
+ transform translateY(-3px)
227
+
228
+ .app-forge .tier.on h3
229
+ color $brand-ink
230
+
231
+ /* The active tier's button becomes a solid gradient primary. */
232
+ .app-forge .tier.on button
233
+ background var(--brand-grad)
234
+ border-color transparent
235
+ color #fff
236
+ box-shadow 0 10px 24px -10px $brand-shadow
237
+
238
+ .app-forge .tier.on button:hover
239
+ filter brightness(1.06)
240
+ transform translateY(-1px)
241
+
242
+ /* "Current" badge in the corner of the active card. */
243
+ .tier-active
244
+ position absolute
245
+ top 1rem
246
+ right 1rem
247
+ font-size .64rem
248
+ font-weight 800
249
+ text-transform uppercase
250
+ letter-spacing .08em
251
+ color #fff
252
+ background var(--brand-grad)
253
+ padding .3rem .6rem
254
+ radius 999px
255
+ box-shadow 0 6px 16px -8px $brand-shadow
256
+
257
+ .tier-active p
258
+ margin 0
259
+
260
+ /* ── Seats stepper ──────────────────────────────────────────────── */
261
+
262
+ .app-forge .seats-card
263
+ display flex
264
+ flex-wrap wrap
265
+ align-items center
266
+ justify-content space-between
267
+ gap 1rem
268
+ border 1.5px solid $brand-line
269
+ radius 18px
270
+ padding 1.4rem 1.5rem
271
+ background linear-gradient(180deg, $brand-tint, $panel 70%)
272
+
273
+ .seat-stepper
274
+ display inline-flex
275
+ align-items center
276
+ gap .85rem
277
+ background $panel
278
+ border 1.5px solid $brand-line
279
+ radius 999px
280
+ padding .4rem
281
+
282
+ /* Round, brand-tinted +/- pills with a number between them. */
283
+ .app-forge .seat-stepper button
284
+ margin 0
285
+ width 2.85rem
286
+ height 2.85rem
287
+ padding 0
288
+ font-size 1.5rem
289
+ font-weight 500
290
+ radius 999px
291
+ background var(--brand-grad)
292
+ border-color transparent
293
+ color #fff
294
+ box-shadow 0 6px 16px -8px $brand-shadow
295
+
296
+ .app-forge .seat-stepper button:hover
297
+ filter brightness(1.08)
298
+ transform translateY(-1px)
299
+ box-shadow 0 12px 24px -10px $brand-shadow
300
+
301
+ .seat-count
302
+ min-width 6.5rem
303
+ text-align center
304
+ font-size 1rem
305
+ color $ink-soft
306
+
307
+ .seat-count strong
308
+ display block
309
+ font-size 1.7rem
310
+ font-weight 780
311
+ color $brand-deep
312
+ letter-spacing -.02em
313
+ line-height 1.1
314
+
315
+ .seat-meta
316
+ font-size .98rem
317
+ color $ink-soft
318
+
319
+ .seat-meta strong
320
+ color $brand-deep
321
+ font-weight 700
322
+
323
+ .seat-hint
324
+ flex-basis 100%
325
+ margin-top .5rem
326
+ font-size .85rem
327
+ color $muted
328
+ padding-top .8rem
329
+ border-top 1px dashed $brand-line
330
+
331
+ /* ── Feature toggles — the key fix ──────────────────────────────── */
332
+
333
+ .feature-grid
334
+ display grid
335
+ gap 1rem
336
+
337
+ .app-forge .feature
338
+ position relative
339
+ border 1.5px solid $line
340
+ radius 18px
341
+ padding 1.4rem 1.5rem
342
+ background $panel
343
+ box-shadow 0 1px 2px rgba(28,24,20,.04)
344
+ transition border-color .18s ease, box-shadow .2s ease, background .2s ease, transform .18s ease
345
+
346
+ .app-forge .feature:hover
347
+ border-color $brand-line
348
+ transform translateY(-1px)
349
+
350
+ .feature-head
351
+ display flex
352
+ align-items center
353
+ justify-content space-between
354
+ gap 1rem
355
+
356
+ .app-forge .feature-head h3
357
+ margin 0
358
+ font-size 1.12rem
359
+ display flex
360
+ align-items center
361
+ gap .55rem
362
+
363
+ .feature-head strong
364
+ font-size 1rem
365
+ font-weight 700
366
+ color $brand-deep
367
+ white-space nowrap
368
+ background $brand-soft
369
+ border 1px solid $brand-line
370
+ padding .25rem .6rem
371
+ radius 999px
372
+
373
+ .app-forge .feature p
374
+ margin .6rem 0 1.1rem
375
+ font-size .92rem
376
+ color $muted
377
+
378
+ /* OFF state — outline "Add +" button on a plain card. */
379
+ .app-forge .feature button
380
+ margin 0
381
+ background $panel
382
+ border-color $brand-line
383
+ color $brand-deep
384
+
385
+ .app-forge .feature button:hover
386
+ border-color $brand
387
+ background $brand-tint
388
+ transform translateY(-1px)
389
+
390
+ /* ON state — `.on when <flag>`: brand ring + tint, unmistakable. */
391
+ .app-forge .feature.on
392
+ border-color $brand
393
+ background $brand-tint
394
+ box-shadow 0 0 0 2px $brand, 0 18px 40px -24px $brand-shadow
395
+
396
+ /* A check dot appears before the title when the feature is on. */
397
+ .app-forge .feature.on .feature-head h3::before
398
+ content "✓"
399
+ display inline-flex
400
+ align-items center
401
+ justify-content center
402
+ width 1.35rem
403
+ height 1.35rem
404
+ font-size .8rem
405
+ font-weight 900
406
+ color #fff
407
+ background var(--brand-grad)
408
+ radius 999px
409
+ box-shadow 0 4px 12px -4px $brand-shadow
410
+
411
+ /* When ON, the "Remove" button is the filled "Added" affordance. */
412
+ .app-forge .feature.on button
413
+ background var(--brand-grad)
414
+ border-color transparent
415
+ color #fff
416
+ box-shadow 0 10px 24px -12px $brand-shadow
417
+
418
+ .app-forge .feature.on button:hover
419
+ filter brightness(1.06)
420
+ border-color transparent
421
+ background var(--brand-grad)
422
+ transform translateY(-1px)
423
+
424
+ /* The "On — counted in your total" badge above the button. */
425
+ .feature-state
426
+ display inline-flex
427
+ align-items center
428
+ gap .45rem
429
+ font-size .76rem
430
+ font-weight 800
431
+ text-transform uppercase
432
+ letter-spacing .05em
433
+ color $brand-deep
434
+ margin-bottom .8rem
435
+ background $brand-soft
436
+ border 1px solid $brand-line
437
+ padding .35rem .7rem
438
+ radius 999px
439
+
440
+ .feature-state.is-on::before
441
+ content ""
442
+ width .5rem
443
+ height .5rem
444
+ radius 999px
445
+ background $brand
446
+ box-shadow 0 0 0 3px $brand-glow
447
+
448
+ /* ── Upsell hints ───────────────────────────────────────────────── */
449
+
450
+ .forge-hints
451
+ display grid
452
+ gap .6rem
453
+ margin-top 1.4rem
454
+
455
+ .hint
456
+ font-size .9rem
457
+ line-height 1.5
458
+ padding .9rem 1.1rem
459
+ radius 14px
460
+ border 1px solid $line
461
+ border-left 3px solid $muted
462
+ background $panel
463
+ color $ink-soft
464
+
465
+ .hint strong
466
+ color $ink
467
+
468
+ .hint-suggest
469
+ border-left-color $brand
470
+ background $brand-soft
471
+
472
+ .hint-suggest strong
473
+ color $brand-deep
474
+
475
+ .hint-good
476
+ border-left-color #1f9d6b
477
+ background rgba(31, 157, 107, .08)
478
+
479
+ .hint-unlock
480
+ border-left-color $gold
481
+ background rgba(182, 130, 43, .1)
482
+
483
+ .hint-unlock strong
484
+ color $gold
485
+
486
+ /* ── Sticky summary rail ────────────────────────────────────────── */
487
+
488
+ .forge-summary
489
+ position sticky
490
+ top 1.5rem
491
+
492
+ .summary-card
493
+ border 1.5px solid $brand-line
494
+ radius 24px
495
+ padding 1.6rem 1.6rem 1.5rem
496
+ background $panel
497
+ box-shadow 0 24px 60px -34px $brand-shadow, 0 1px 2px rgba(28,24,20,.05)
498
+
499
+ .summary-card h3
500
+ margin 0 0 .35rem
501
+ font-size .78rem
502
+ text-transform uppercase
503
+ letter-spacing .12em
504
+ color $muted
505
+ font-weight 800
506
+
507
+ /* The price block — a big gradient number that dominates the rail. */
508
+ .price-block
509
+ display flex
510
+ align-items baseline
511
+ flex-wrap wrap
512
+ gap .35rem
513
+ margin .5rem 0 1.2rem
514
+
515
+ .price-now
516
+ font-size clamp(3rem, 9vw, 4rem)
517
+ font-weight 820
518
+ line-height 1
519
+ letter-spacing -.04em
520
+ background var(--brand-grad)
521
+ -webkit-background-clip text
522
+ background-clip text
523
+ color transparent
524
+
525
+ .price-now strong
526
+ font-weight 820
527
+ color inherit
528
+
529
+ .price-unit
530
+ font-size .95rem
531
+ color $muted
532
+ font-weight 600
533
+
534
+ .summary-lines
535
+ display grid
536
+ gap .6rem
537
+ padding 1.1rem 0
538
+ border-top 1px solid $line
539
+ border-bottom 1px solid $line
540
+
541
+ .summary-line
542
+ display flex
543
+ justify-content space-between
544
+ font-size .92rem
545
+ color $ink-soft
546
+
547
+ .annual-block
548
+ margin 1.1rem 0
549
+ font-size .9rem
550
+ line-height 1.55
551
+ color $ink-soft
552
+ padding .9rem 1rem
553
+ background $brand-soft
554
+ border 1px solid $brand-line
555
+ radius 14px
556
+
557
+ .annual-block strong
558
+ color $brand-deep
559
+ font-weight 750
560
+
561
+ .summary-cta
562
+ margin .5rem 0 .9rem
563
+
564
+ /* Reset = quiet ghost button. */
565
+ .app-forge .summary-cta button
566
+ width 100%
567
+ margin 0
568
+ background transparent
569
+ border-color $line
570
+ color $muted
571
+ font-weight 650
572
+
573
+ .app-forge .summary-cta button:hover
574
+ border-color $brand
575
+ color $brand-deep
576
+ background $brand-tint
577
+
578
+ .summary-card p
579
+ font-size .8rem
580
+ color $muted
581
+ margin .2rem 0 0
582
+ max-width none
583
+
584
+ /* ── Checkout ───────────────────────────────────────────────────── */
585
+
586
+ .checkout-card
587
+ border 1.5px solid $brand-line
588
+ radius 24px
589
+ padding 1.8rem
590
+ background linear-gradient(165deg, $brand-soft, $panel 65%)
591
+ max-width 560px
592
+ margin-top 1rem
593
+ box-shadow 0 20px 50px -32px $brand-shadow
594
+
595
+ .app-forge .checkout-card form
596
+ display flex
597
+ flex-direction column
598
+ gap .25rem
599
+
600
+ .app-forge .checkout-card input
601
+ font-size 1rem
602
+ padding .85rem .95rem
603
+ border 1.5px solid $brand-line
604
+ background $panel
605
+ color $ink
606
+ radius 14px
607
+ width 100%
608
+ margin .35rem 0
609
+ transition border-color .15s ease, box-shadow .15s ease
610
+
611
+ .app-forge .checkout-card input:focus
612
+ outline none
613
+ border-color $brand
614
+ box-shadow 0 0 0 4px $brand-glow
615
+
616
+ /* Strong, filled "Start trial" submit. */
617
+ .app-forge .checkout-card button
618
+ margin .7rem 0 0
619
+ width 100%
620
+ padding .95rem 1.2rem
621
+ font-size 1.02rem
622
+ font-weight 700
623
+ background var(--brand-grad)
624
+ border-color transparent
625
+ color #fff
626
+ radius 14px
627
+ box-shadow 0 14px 32px -14px $brand-shadow
628
+
629
+ .app-forge .checkout-card button:hover
630
+ filter brightness(1.06)
631
+ transform translateY(-2px)
632
+ box-shadow 0 20px 40px -16px $brand-shadow
633
+
634
+ .checkout-note
635
+ margin-top 1rem
636
+ font-size .88rem
637
+ color $ink-soft
638
+
639
+ .checkout-note strong
640
+ color $brand-deep
641
+
642
+ .receipt
643
+ margin-top 1.1rem
644
+ padding 1.3rem 1.4rem
645
+ border 1.5px solid $brand
646
+ background $brand-tint
647
+ radius 18px
648
+ box-shadow 0 0 0 2px $brand-glow
649
+
650
+ .receipt h3
651
+ margin 0 0 .4rem
652
+ font-size 1.2rem
653
+ color $brand-ink
654
+
655
+ .receipt p
656
+ margin .2rem 0
657
+ font-size .95rem
658
+ color $ink-soft
659
+
660
+ .receipt strong
661
+ color $brand-deep
662
+ font-weight 700
663
+
664
+ .checkout-error
665
+ margin-top 1rem
666
+ padding .9rem 1.1rem
667
+ radius 14px
668
+ border 1px solid $warm
669
+ border-left 3px solid $warm
670
+ background $warm-soft
671
+ color $warm
672
+ font-size .9rem
673
+
674
+ /* Source-reveal sits inside the violet wrapper — keep its summary on-brand. */
675
+ .app-forge .source-reveal summary
676
+ color $brand-deep