Z User commited on
Commit
c549b2f
·
1 Parent(s): 10c5bcc

sync work in progress

Browse files
public/dssl/index.js CHANGED
@@ -18,7 +18,7 @@ import { parse } from './parser.js';
18
  import { resolve, DEFAULT_TOKENS } from './resolver.js';
19
  import { DsslEngine } from './engine.js';
20
 
21
- export const VERSION = '0.3.2';
22
 
23
  let counter = 0;
24
  const engines = new Map();
 
18
  import { resolve, DEFAULT_TOKENS } from './resolver.js';
19
  import { DsslEngine } from './engine.js';
20
 
21
+ export const VERSION = '0.3.3';
22
 
23
  let counter = 0;
24
  const engines = new Map();
public/styles/docs.dssl CHANGED
@@ -8,15 +8,17 @@
8
 
9
  .page-title {
10
  fluid: 30, 44
11
- font-weight: 800
12
- letter-spacing: -0.03em
 
13
  margin: space.2 0 space.2
14
  }
15
 
16
  .page-sub {
 
17
  color: color.muted
18
  font-size: 16.5
19
- line-height: 1.65
20
  max-width: 640
21
  }
22
 
@@ -88,9 +90,10 @@
88
  }
89
 
90
  .doc-lead {
 
91
  color: color.muted
92
  font-size: 15.5
93
- line-height: 1.7
94
  margin: 0
95
  }
96
 
@@ -190,7 +193,7 @@
190
 
191
  .doc-btn:hover {
192
  border-color: color.accent/50
193
- translate: 0 -1px
194
  shadow: sm
195
  }
196
 
@@ -207,8 +210,8 @@
207
  }
208
 
209
  .doc-card:hover {
210
- translate: 0 -4px
211
- shadow: lg
212
  }
213
 
214
  .doc-card-title {
@@ -249,7 +252,6 @@
249
  background: color.accent
250
  border-color: color.accent
251
  color: color.accent-ink
252
- translate: 0 -3px
253
  shadow: md
254
  }
255
  }
@@ -272,8 +274,7 @@
272
  }
273
 
274
  .tok-dot:hover {
275
- translate: 0 -3px
276
- shadow: md
277
  border-color: color.accent/40
278
  color: color.accent
279
  }
 
8
 
9
  .page-title {
10
  fluid: 30, 44
11
+ font-family: font.serif
12
+ font-weight: 650
13
+ letter-spacing: -0.01em
14
  margin: space.2 0 space.2
15
  }
16
 
17
  .page-sub {
18
+ font-family: font.serif
19
  color: color.muted
20
  font-size: 16.5
21
+ line-height: 1.7
22
  max-width: 640
23
  }
24
 
 
90
  }
91
 
92
  .doc-lead {
93
+ font-family: font.serif
94
  color: color.muted
95
  font-size: 15.5
96
+ line-height: 1.75
97
  margin: 0
98
  }
99
 
 
193
 
194
  .doc-btn:hover {
195
  border-color: color.accent/50
196
+ background: color.card
197
  shadow: sm
198
  }
199
 
 
210
  }
211
 
212
  .doc-card:hover {
213
+ shadow: md
214
+ border-color: color.ink/38
215
  }
216
 
217
  .doc-card-title {
 
252
  background: color.accent
253
  border-color: color.accent
254
  color: color.accent-ink
 
255
  shadow: md
256
  }
257
  }
 
274
  }
275
 
276
  .tok-dot:hover {
277
+ shadow: sm
 
278
  border-color: color.accent/40
279
  color: color.accent
280
  }
public/styles/home.dssl CHANGED
@@ -16,7 +16,7 @@
16
  right: -160
17
  size: 560
18
  circle: 560
19
- background: radial-gradient(circle, color.accent/16, transparent 65%)
20
  pointer-events: none
21
  }
22
 
@@ -26,7 +26,7 @@
26
  left: -200
27
  size: 520
28
  circle: 520
29
- background: radial-gradient(circle, color.accent/9, transparent 60%)
30
  pointer-events: none
31
  }
32
 
@@ -49,20 +49,22 @@
49
 
50
  .hero-title {
51
  fluid: 40, 62
52
- font-weight: 800
53
- line-height: 1.04
54
- letter-spacing: -0.035em
 
55
  margin: space.3 0 space.4
56
  }
57
 
58
  .hero-title em {
59
- font-style: normal
60
  color: color.accent
61
  }
62
 
63
  .hero-sub {
 
64
  font-size: 17.5
65
- line-height: 1.7
66
  color: color.muted
67
  margin: 0 0 space.5
68
  }
@@ -84,7 +86,7 @@
84
  inline-size: 4
85
  aspect-ratio: 1
86
  background: color.ok
87
- radius: full
88
  display: inline-block
89
  margin-right: 7
90
  vertical-align: 1
@@ -104,7 +106,7 @@
104
 
105
  .demo-tab {
106
  padding: 7 14
107
- radius: full
108
  font-size: 13
109
  font-weight: 600
110
  color: color.muted
@@ -116,7 +118,7 @@
116
 
117
  .demo-tab:hover {
118
  color: color.ink
119
- translate: 0 -1px
120
  }
121
 
122
  .demo-tab[aria-pressed="true"] {
@@ -176,9 +178,8 @@ motion rise-in {
176
  }
177
 
178
  .demo-card:hover {
179
- translate: 0 -5px
180
- shadow: lg
181
- border-color: color.accent/40
182
  }
183
 
184
  .demo-swatch {
@@ -211,7 +212,7 @@ motion rise-in {
211
  color: color.accent
212
  background: color.accent/12
213
  padding: 3 9
214
- radius: full
215
  }
216
 
217
  // states demo: a real focusable button styled by focus-visible
@@ -227,7 +228,7 @@ motion rise-in {
227
  border: none
228
  }
229
 
230
- .demo-btn:hover { translate: 0 -2px; shadow: md }
231
 
232
  // motion demo
233
  .demo-motion {
 
16
  right: -160
17
  size: 560
18
  circle: 560
19
+ background: radial-gradient(circle, color.accent/12, transparent 65%)
20
  pointer-events: none
21
  }
22
 
 
26
  left: -200
27
  size: 520
28
  circle: 520
29
+ background: radial-gradient(circle, color.accent/6, transparent 60%)
30
  pointer-events: none
31
  }
32
 
 
49
 
50
  .hero-title {
51
  fluid: 40, 62
52
+ font-family: font.serif
53
+ font-weight: 650
54
+ line-height: 1.08
55
+ letter-spacing: -0.015em
56
  margin: space.3 0 space.4
57
  }
58
 
59
  .hero-title em {
60
+ font-style: italic
61
  color: color.accent
62
  }
63
 
64
  .hero-sub {
65
+ font-family: font.serif
66
  font-size: 17.5
67
+ line-height: 1.75
68
  color: color.muted
69
  margin: 0 0 space.5
70
  }
 
86
  inline-size: 4
87
  aspect-ratio: 1
88
  background: color.ok
89
+ radius: 0
90
  display: inline-block
91
  margin-right: 7
92
  vertical-align: 1
 
106
 
107
  .demo-tab {
108
  padding: 7 14
109
+ radius: sm
110
  font-size: 13
111
  font-weight: 600
112
  color: color.muted
 
118
 
119
  .demo-tab:hover {
120
  color: color.ink
121
+ border-color: color.ink/40
122
  }
123
 
124
  .demo-tab[aria-pressed="true"] {
 
178
  }
179
 
180
  .demo-card:hover {
181
+ shadow: md
182
+ border-color: color.ink/38
 
183
  }
184
 
185
  .demo-swatch {
 
212
  color: color.accent
213
  background: color.accent/12
214
  padding: 3 9
215
+ radius: sm
216
  }
217
 
218
  // states demo: a real focusable button styled by focus-visible
 
228
  border: none
229
  }
230
 
231
+ .demo-btn:hover { shadow: md; filter: brightness(1.15) }
232
 
233
  // motion demo
234
  .demo-motion {
public/styles/site.dssl CHANGED
@@ -58,9 +58,9 @@ select { use focus-ring }
58
  position: sticky
59
  top: 0
60
  z: 50
61
- background: color.paper/82
62
- backdrop-filter: blur(14) saturate(1.5)
63
- border-bottom: 1 solid color.line
64
  transition: 200
65
  }
66
 
@@ -72,17 +72,19 @@ select { use focus-ring }
72
 
73
  .nav-logo {
74
  row: gap 2 center
75
- font-weight: 800
76
- font-size: 21
77
- letter-spacing: -0.02em
 
78
  color: color.ink
79
  transition: 120
80
  }
81
 
82
  .logo-mark {
83
- font-family: font.mono
84
  color: color.accent
85
- font-weight: 700
 
86
  margin-right: 6
87
  }
88
 
@@ -145,7 +147,7 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
145
  font-size: 11.5
146
  color: color.muted
147
  border: 1 solid color.line
148
- radius: full
149
  padding: 4 10
150
  background: color.card/60
151
  }
@@ -206,13 +208,13 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
206
  }
207
 
208
  .btn-primary:hover {
209
- translate: 0 -2px
210
  shadow: md
 
211
  }
212
 
213
  .btn-primary:active {
214
- translate: 0 0
215
  shadow: sm
 
216
  transition: 60
217
  }
218
 
@@ -224,8 +226,7 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
224
 
225
  .btn-ghost:hover {
226
  background: color.line/45
227
- translate: 0 -2px
228
- shadow: sm
229
  }
230
 
231
  .btn-sm {
@@ -244,9 +245,8 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
244
  }
245
 
246
  .card-hover:hover {
247
- translate: 0 -3px
248
- shadow: lg
249
- border-color: color.accent/35
250
  }
251
 
252
  .kicker {
@@ -260,7 +260,7 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
260
  }
261
 
262
  .kicker::before {
263
- content: "//"
264
  color: color.accent/55
265
  }
266
 
@@ -269,16 +269,18 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
269
  }
270
 
271
  .section-title {
272
- font-size: 30
273
- font-weight: 750
274
- letter-spacing: -0.025em
 
275
  margin: space.2 0 space.3
276
  }
277
 
278
  .section-sub {
 
279
  color: color.muted
280
  font-size: 16.5
281
- line-height: 1.65
282
  max-width: 640
283
  }
284
 
@@ -358,8 +360,9 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
358
  }
359
 
360
  .prose p {
 
361
  margin: 0 0 space.4
362
- line-height: 1.8
363
  color: color.ink/88
364
  font-size: 16
365
  }
@@ -367,16 +370,18 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
367
  .prose p:last-child { margin-bottom: 0 }
368
 
369
  .prose h2 {
370
- font-size: 26
371
- font-weight: 750
372
- letter-spacing: -0.02em
 
373
  margin: space.7 0 space.3
374
  scroll-margin-top: 88
375
  }
376
 
377
  .prose h3 {
378
- font-size: 19
379
- font-weight: 700
 
380
  margin: space.5 0 space.2
381
  scroll-margin-top: 88
382
  }
@@ -396,13 +401,13 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
396
  }
397
 
398
  .prose li::before {
399
- content: ""
400
  position: absolute
401
  left: 0
402
- top: 9
403
- size: 6
404
- circle: 6
405
- background: color.accent
406
  }
407
 
408
  .prose strong {
@@ -439,7 +444,7 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
439
 
440
  .footer {
441
  margin-top: auto
442
- border-top: 1 solid color.line
443
  padding: space.6 0 space.5
444
  background: color.card/40
445
  }
@@ -461,9 +466,10 @@ html:not([data-theme-mode="dark"]):not([data-theme-mode="light"]) .theme-btn {
461
 
462
  .footer-fine {
463
  color: color.muted
464
- font-size: 12
465
- font-family: font.mono
466
- letter-spacing: 0.02em
 
467
  }
468
 
469
  .footer-links {
 
58
  position: sticky
59
  top: 0
60
  z: 50
61
+ background: color.paper/92
62
+ backdrop-filter: blur(10)
63
+ border-bottom: 1 solid color.ink/30
64
  transition: 200
65
  }
66
 
 
72
 
73
  .nav-logo {
74
  row: gap 2 center
75
+ font-family: font.serif
76
+ font-weight: 700
77
+ font-size: 22
78
+ letter-spacing: 0
79
  color: color.ink
80
  transition: 120
81
  }
82
 
83
  .logo-mark {
84
+ font-family: font.serif
85
  color: color.accent
86
+ font-weight: 400
87
+ font-size: 24
88
  margin-right: 6
89
  }
90
 
 
147
  font-size: 11.5
148
  color: color.muted
149
  border: 1 solid color.line
150
+ radius: sm
151
  padding: 4 10
152
  background: color.card/60
153
  }
 
208
  }
209
 
210
  .btn-primary:hover {
 
211
  shadow: md
212
+ filter: brightness(1.12)
213
  }
214
 
215
  .btn-primary:active {
 
216
  shadow: sm
217
+ filter: brightness(0.96)
218
  transition: 60
219
  }
220
 
 
226
 
227
  .btn-ghost:hover {
228
  background: color.line/45
229
+ border-color: color.ink/35
 
230
  }
231
 
232
  .btn-sm {
 
245
  }
246
 
247
  .card-hover:hover {
248
+ shadow: md
249
+ border-color: color.ink/38
 
250
  }
251
 
252
  .kicker {
 
260
  }
261
 
262
  .kicker::before {
263
+ content: "§"
264
  color: color.accent/55
265
  }
266
 
 
269
  }
270
 
271
  .section-title {
272
+ font-family: font.serif
273
+ font-size: 31
274
+ font-weight: 650
275
+ letter-spacing: -0.01em
276
  margin: space.2 0 space.3
277
  }
278
 
279
  .section-sub {
280
+ font-family: font.serif
281
  color: color.muted
282
  font-size: 16.5
283
+ line-height: 1.7
284
  max-width: 640
285
  }
286
 
 
360
  }
361
 
362
  .prose p {
363
+ font-family: font.serif
364
  margin: 0 0 space.4
365
+ line-height: 1.85
366
  color: color.ink/88
367
  font-size: 16
368
  }
 
370
  .prose p:last-child { margin-bottom: 0 }
371
 
372
  .prose h2 {
373
+ font-family: font.serif
374
+ font-size: 27
375
+ font-weight: 650
376
+ letter-spacing: -0.01em
377
  margin: space.7 0 space.3
378
  scroll-margin-top: 88
379
  }
380
 
381
  .prose h3 {
382
+ font-family: font.serif
383
+ font-size: 19.5
384
+ font-weight: 650
385
  margin: space.5 0 space.2
386
  scroll-margin-top: 88
387
  }
 
401
  }
402
 
403
  .prose li::before {
404
+ content: "—"
405
  position: absolute
406
  left: 0
407
+ top: 0
408
+ background: none
409
+ color: color.accent/70
410
+ font-family: font.serif
411
  }
412
 
413
  .prose strong {
 
444
 
445
  .footer {
446
  margin-top: auto
447
+ border-top: 1 solid color.ink/30
448
  padding: space.6 0 space.5
449
  background: color.card/40
450
  }
 
466
 
467
  .footer-fine {
468
  color: color.muted
469
+ font-size: 12.5
470
+ font-family: font.serif
471
+ font-style: italic
472
+ letter-spacing: 0.01em
473
  }
474
 
475
  .footer-links {
public/styles/tokens.dssl CHANGED
@@ -1,67 +1,80 @@
1
  // =========================================================================
2
  // tokens.dssl — DSSL's own design tokens
 
 
3
  // The dark palette lives in a behavior and is `use`d by both the system
4
  // preference and the manual theme signal — define once, apply twice.
5
  // =========================================================================
6
 
7
  tokens {
 
 
 
 
 
8
  color {
9
- paper: #faf8f4
10
- card: #ffffff
11
- ink: #1a1721
12
- muted: #6d6680
13
- line: #e9e3d9
14
- accent: oklch(0.58 0.19 33)
15
- accent-ink: #fff6ee
16
- ok: #2e7d4f
17
- err: #b3372e
18
- code-bg: #211d2b
19
- code-ink: #ece9f4
20
- code-line: #37314a
21
- code-key: #f2a86c
22
- code-sel: #8fd0b2
23
- code-prop: #9ec1f0
24
- code-str: #d8b16e
25
- code-num: #d8a0df
26
- code-com: #857d9c
27
  }
28
  radius {
29
- sm: 8
30
- md: 14
31
- lg: 20
32
- xl: 28
33
  full: 999
34
  }
35
  shadow {
36
- sm: 0 1 2 color.ink/8, 0 1 3 color.ink/6
37
- md: 0 2 4 color.ink/10, 0 4 14 color.ink/8
38
- lg: 0 4 8 color.ink/12, 0 14 36 color.ink/12
39
  }
40
  }
41
 
42
  // ---- dark palette (shared) ---------------------------------------------
 
43
 
44
  behavior palette-dark {
45
  tokens {
 
 
 
 
 
46
  color {
47
- paper: #14111c
48
- card: #1d1927
49
- ink: #edeaf6
50
- muted: #a29ab8
51
- line: #2c2739
52
- accent: oklch(0.72 0.15 45)
53
- accent-ink: #241304
54
- ok: #6fc793
55
- err: #e5766a
56
- code-bg: #100e18
57
- code-ink: #e4e0f0
58
- code-line: #292438
59
- code-key: #f2a86c
60
- code-sel: #8fd0b2
61
- code-prop: #9ec1f0
62
- code-str: #d8b16e
63
- code-num: #d8a0df
64
- code-com: #6f6885
65
  }
66
  }
67
  }
@@ -80,25 +93,30 @@ behavior palette-dark {
80
 
81
  behavior palette-light {
82
  tokens {
 
 
 
 
 
83
  color {
84
- paper: #faf8f4
85
- card: #ffffff
86
- ink: #1a1721
87
- muted: #6d6680
88
- line: #e9e3d9
89
- accent: oklch(0.58 0.19 33)
90
- accent-ink: #fff6ee
91
- ok: #2e7d4f
92
- err: #b3372e
93
- code-bg: #211d2b
94
- code-ink: #ece9f4
95
- code-line: #37314a
96
- code-key: #f2a86c
97
- code-sel: #8fd0b2
98
- code-prop: #9ec1f0
99
- code-str: #d8b16e
100
- code-num: #d8a0df
101
- code-com: #857d9c
102
  }
103
  }
104
  }
 
1
  // =========================================================================
2
  // tokens.dssl — DSSL's own design tokens
3
+ // v0.3.3 "The Classic Edition": a print-era look — parchment paper, ink,
4
+ // oxblood accent, serif display type, squared corners, hairline rules.
5
  // The dark palette lives in a behavior and is `use`d by both the system
6
  // preference and the manual theme signal — define once, apply twice.
7
  // =========================================================================
8
 
9
  tokens {
10
+ font {
11
+ serif: "Charter", "Iowan Old Style", "Palatino Linotype", "Palatino", "Georgia", "Times New Roman", serif
12
+ sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif
13
+ mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace
14
+ }
15
  color {
16
+ paper: #f5f0e4
17
+ card: #fdfaf2
18
+ ink: #26201a
19
+ muted: #6f6250
20
+ line: #ddd2bc
21
+ accent: #8e2c1f
22
+ accent-ink: #f9efdd
23
+ ok: #3d6b46
24
+ err: #a83226
25
+ code-bg: #ece4cf
26
+ code-ink: #2b2318
27
+ code-line: #d8cbac
28
+ code-key: #8e3b1f
29
+ code-sel: #38614f
30
+ code-prop: #35566e
31
+ code-str: #7a6428
32
+ code-num: #77488c
33
+ code-com: #8d8069
34
  }
35
  radius {
36
+ sm: 2
37
+ md: 4
38
+ lg: 6
39
+ xl: 8
40
  full: 999
41
  }
42
  shadow {
43
+ sm: 0 1 2 color.ink/12
44
+ md: 0 2 6 color.ink/14
45
+ lg: 0 6 18 color.ink/16
46
  }
47
  }
48
 
49
  // ---- dark palette (shared) ---------------------------------------------
50
+ // classic dark = a candlelit study: deep walnut, parchment text, brass accent
51
 
52
  behavior palette-dark {
53
  tokens {
54
+ font {
55
+ serif: "Charter", "Iowan Old Style", "Palatino Linotype", "Palatino", "Georgia", "Times New Roman", serif
56
+ sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif
57
+ mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace
58
+ }
59
  color {
60
+ paper: #181310
61
+ card: #221b15
62
+ ink: #ece2cd
63
+ muted: #a5937a
64
+ line: #372d21
65
+ accent: #c98d52
66
+ accent-ink: #241402
67
+ ok: #7fae8a
68
+ err: #d97e6c
69
+ code-bg: #120e0b
70
+ code-ink: #e5d9bd
71
+ code-line: #2e261c
72
+ code-key: #d99a62
73
+ code-sel: #8fb8a2
74
+ code-prop: #92b4cc
75
+ code-str: #c9b47c
76
+ code-num: #b995c9
77
+ code-com: #87795f
78
  }
79
  }
80
  }
 
93
 
94
  behavior palette-light {
95
  tokens {
96
+ font {
97
+ serif: "Charter", "Iowan Old Style", "Palatino Linotype", "Palatino", "Georgia", "Times New Roman", serif
98
+ sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif
99
+ mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace
100
+ }
101
  color {
102
+ paper: #f5f0e4
103
+ card: #fdfaf2
104
+ ink: #26201a
105
+ muted: #6f6250
106
+ line: #ddd2bc
107
+ accent: #8e2c1f
108
+ accent-ink: #f9efdd
109
+ ok: #3d6b46
110
+ err: #a83226
111
+ code-bg: #ece4cf
112
+ code-ink: #2b2318
113
+ code-line: #d8cbac
114
+ code-key: #8e3b1f
115
+ code-sel: #38614f
116
+ code-prop: #35566e
117
+ code-str: #7a6428
118
+ code-num: #77488c
119
+ code-com: #8d8069
120
  }
121
  }
122
  }
src/app/layout.tsx CHANGED
@@ -19,8 +19,8 @@ export const viewport: Viewport = {
19
  // The ONLY non-DSSL styling in this app: a pre-paint shim so the very first
20
  // frame doesn't flash white before the DSSL engine boots (dark-mode respect).
21
  const prePaint = `
22
- html { background: #faf8f4; }
23
- @media (prefers-color-scheme: dark) { html { background: #14111c; } }
24
  `;
25
 
26
  // v0.3.2 — performance: the stylesheets ride INSIDE the HTML. The engine's
 
19
  // The ONLY non-DSSL styling in this app: a pre-paint shim so the very first
20
  // frame doesn't flash white before the DSSL engine boots (dark-mode respect).
21
  const prePaint = `
22
+ html { background: #f5f0e4; }
23
+ @media (prefers-color-scheme: dark) { html { background: #181310; } }
24
  `;
25
 
26
  // v0.3.2 — performance: the stylesheets ride INSIDE the HTML. The engine's
src/components/dssl/SiteRoot.tsx CHANGED
@@ -98,11 +98,11 @@ export default function SiteRoot() {
98
  }, []);
99
 
100
  return (
101
- <div className="site">
102
  <header className="nav">
103
  <div className="wrap nav-inner">
104
  <a href="#/" className="nav-logo" onClick={(e) => { e.preventDefault(); go("home"); }}>
105
- <span className="logo-mark">{"//"}</span>
106
  DSSL
107
  </a>
108
 
@@ -120,7 +120,7 @@ export default function SiteRoot() {
120
  </nav>
121
 
122
  <div className="nav-side">
123
- <span className="ver-badge">v0.3.2</span>
124
  <button type="button" className="theme-btn" onClick={cycleTheme} aria-label="Toggle color theme" title="Theme: auto / light / dark">
125
  <span className="icon-sun"><SunIcon /></span>
126
  <span className="icon-moon"><MoonIcon /></span>
@@ -132,7 +132,10 @@ export default function SiteRoot() {
132
  </div>
133
  </header>
134
 
135
- <main className="main" data-view={view}>
 
 
 
136
  {view === "home" && <HomeView go={go} />}
137
  {view === "docs" && <DocsView />}
138
  {view === "cheat" && <CheatSheetView />}
@@ -145,12 +148,13 @@ export default function SiteRoot() {
145
  <div className="wrap footer-inner">
146
  <div className="footer-col">
147
  <div className="footer-note">
148
- <strong>DSSL</strong> — domain specific style language. Built v0.1 → v0.3.2 while
149
  building this site; every feature it needed, it grew, and every bug you sent got
150
  fixed for real. This page runs on its own engine, no stylesheet attached.
151
  </div>
152
  <div className="footer-fine">
153
- © 2026 <strong>Firstlight</strong> — the studio that grows DSSL.
 
154
  </div>
155
  </div>
156
  <nav className="footer-links" aria-label="Footer">
 
98
  }, []);
99
 
100
  return (
101
+ <div className="site" data-view={view}>
102
  <header className="nav">
103
  <div className="wrap nav-inner">
104
  <a href="#/" className="nav-logo" onClick={(e) => { e.preventDefault(); go("home"); }}>
105
+ <span className="logo-mark">{"§"}</span>
106
  DSSL
107
  </a>
108
 
 
120
  </nav>
121
 
122
  <div className="nav-side">
123
+ <span className="ver-badge">v0.3.3</span>
124
  <button type="button" className="theme-btn" onClick={cycleTheme} aria-label="Toggle color theme" title="Theme: auto / light / dark">
125
  <span className="icon-sun"><SunIcon /></span>
126
  <span className="icon-moon"><MoonIcon /></span>
 
132
  </div>
133
  </header>
134
 
135
+ {/* data-view lives on the ROOT so the nav-active rules can reach the
136
+ header links — on <main> they never matched (main is a SIBLING of
137
+ the header, and descendant selectors only look down the tree) */}
138
+ <main className="main">
139
  {view === "home" && <HomeView go={go} />}
140
  {view === "docs" && <DocsView />}
141
  {view === "cheat" && <CheatSheetView />}
 
148
  <div className="wrap footer-inner">
149
  <div className="footer-col">
150
  <div className="footer-note">
151
+ <strong>DSSL</strong> — domain specific style language. Built v0.1 → v0.3.3 while
152
  building this site; every feature it needed, it grew, and every bug you sent got
153
  fixed for real. This page runs on its own engine, no stylesheet attached.
154
  </div>
155
  <div className="footer-fine">
156
+ © 2026 <strong>DSSL. inc</strong> — named after the product, because naming things
157
+ is hard.
158
  </div>
159
  </div>
160
  <nav className="footer-links" aria-label="Footer">
src/components/dssl/views/ChangelogView.tsx CHANGED
@@ -197,6 +197,19 @@ const base = rule.sel
197
  <style type="text/dssl" data-dssl-name="tokens.dssl">…</style>
198
  <script type="module" src="/dssl/boot.js"></script> <!-- in <head> -->`,
199
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  ];
201
 
202
  export default function ChangelogView() {
 
197
  <style type="text/dssl" data-dssl-name="tokens.dssl">…</style>
198
  <script type="module" src="/dssl/boot.js"></script> <!-- in <head> -->`,
199
  },
200
+ {
201
+ version: "v0.3.3",
202
+ date: "user feedback → release",
203
+ title: "The Classic Edition — and a company name",
204
+ why: "user request: “name the company DSSL. inc, make the website look more classic”",
205
+ kind: "add",
206
+ body:
207
+ "The company is called DSSL. inc. The founder describes the choice as boring; we describe it as honest — the company is named after the thing it ships, and now the footer says so. The re-skin went classic: serif display type (a Charter/Iowan/Palatino stack — no webfonts, still zero dependencies), parchment paper with ink text and an oxblood accent, squared corners, hairline rules instead of glow shadows, book-page code blocks, a candlelit dark mode, and calmer hovers — cards darken their border instead of flying off the page. The § now stands where the comment slash used to. Best part: the entire re-skin is ONE file. radius tokens went 14→4, the palette swapped, serif entered the font tokens — and all six views followed, because that is the whole argument DSSL makes about tokens.",
208
+ code: `// tokens.dssl — the only file the re-skin touched
209
+ radius { md: 14 → md: 4 }
210
+ color { paper: #faf8f4 → #f5f0e4, accent: oklch(…) → #8e2c1f }
211
+ font { serif: "Charter", "Iowan Old Style", "Palatino", … } // new`,
212
+ },
213
  ];
214
 
215
  export default function ChangelogView() {