Z User commited on
Commit ·
c549b2f
1
Parent(s): 10c5bcc
sync work in progress
Browse files- public/dssl/index.js +1 -1
- public/styles/docs.dssl +11 -10
- public/styles/home.dssl +16 -15
- public/styles/site.dssl +42 -36
- public/styles/tokens.dssl +79 -61
- src/app/layout.tsx +2 -2
- src/components/dssl/SiteRoot.tsx +10 -6
- src/components/dssl/views/ChangelogView.tsx +13 -0
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.
|
| 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-
|
| 12 |
-
|
|
|
|
| 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.
|
| 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.
|
| 94 |
margin: 0
|
| 95 |
}
|
| 96 |
|
|
@@ -190,7 +193,7 @@
|
|
| 190 |
|
| 191 |
.doc-btn:hover {
|
| 192 |
border-color: color.accent/50
|
| 193 |
-
|
| 194 |
shadow: sm
|
| 195 |
}
|
| 196 |
|
|
@@ -207,8 +210,8 @@
|
|
| 207 |
}
|
| 208 |
|
| 209 |
.doc-card:hover {
|
| 210 |
-
|
| 211 |
-
|
| 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 |
-
|
| 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/
|
| 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/
|
| 30 |
pointer-events: none
|
| 31 |
}
|
| 32 |
|
|
@@ -49,20 +49,22 @@
|
|
| 49 |
|
| 50 |
.hero-title {
|
| 51 |
fluid: 40, 62
|
| 52 |
-
font-
|
| 53 |
-
|
| 54 |
-
|
|
|
|
| 55 |
margin: space.3 0 space.4
|
| 56 |
}
|
| 57 |
|
| 58 |
.hero-title em {
|
| 59 |
-
font-style:
|
| 60 |
color: color.accent
|
| 61 |
}
|
| 62 |
|
| 63 |
.hero-sub {
|
|
|
|
| 64 |
font-size: 17.5
|
| 65 |
-
line-height: 1.
|
| 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:
|
| 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:
|
| 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 |
-
|
| 120 |
}
|
| 121 |
|
| 122 |
.demo-tab[aria-pressed="true"] {
|
|
@@ -176,9 +178,8 @@ motion rise-in {
|
|
| 176 |
}
|
| 177 |
|
| 178 |
.demo-card:hover {
|
| 179 |
-
|
| 180 |
-
|
| 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:
|
| 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 {
|
| 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/
|
| 62 |
-
backdrop-filter: blur(
|
| 63 |
-
border-bottom: 1 solid color.
|
| 64 |
transition: 200
|
| 65 |
}
|
| 66 |
|
|
@@ -72,17 +72,19 @@ select { use focus-ring }
|
|
| 72 |
|
| 73 |
.nav-logo {
|
| 74 |
row: gap 2 center
|
| 75 |
-
font-
|
| 76 |
-
font-
|
| 77 |
-
|
|
|
|
| 78 |
color: color.ink
|
| 79 |
transition: 120
|
| 80 |
}
|
| 81 |
|
| 82 |
.logo-mark {
|
| 83 |
-
font-family: font.
|
| 84 |
color: color.accent
|
| 85 |
-
font-weight:
|
|
|
|
| 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:
|
| 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 |
-
|
| 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 |
-
|
| 248 |
-
|
| 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-
|
| 273 |
-
font-
|
| 274 |
-
|
|
|
|
| 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.
|
| 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.
|
| 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-
|
| 371 |
-
font-
|
| 372 |
-
|
|
|
|
| 373 |
margin: space.7 0 space.3
|
| 374 |
scroll-margin-top: 88
|
| 375 |
}
|
| 376 |
|
| 377 |
.prose h3 {
|
| 378 |
-
font-
|
| 379 |
-
font-
|
|
|
|
| 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:
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 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.
|
| 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.
|
| 466 |
-
|
|
|
|
| 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: #
|
| 10 |
-
card: #
|
| 11 |
-
ink: #
|
| 12 |
-
muted: #
|
| 13 |
-
line: #
|
| 14 |
-
accent:
|
| 15 |
-
accent-ink: #
|
| 16 |
-
ok: #
|
| 17 |
-
err: #
|
| 18 |
-
code-bg: #
|
| 19 |
-
code-ink: #
|
| 20 |
-
code-line: #
|
| 21 |
-
code-key: #
|
| 22 |
-
code-sel: #
|
| 23 |
-
code-prop: #
|
| 24 |
-
code-str: #
|
| 25 |
-
code-num: #
|
| 26 |
-
code-com: #
|
| 27 |
}
|
| 28 |
radius {
|
| 29 |
-
sm:
|
| 30 |
-
md:
|
| 31 |
-
lg:
|
| 32 |
-
xl:
|
| 33 |
full: 999
|
| 34 |
}
|
| 35 |
shadow {
|
| 36 |
-
sm: 0 1 2 color.ink/
|
| 37 |
-
md: 0 2
|
| 38 |
-
lg: 0
|
| 39 |
}
|
| 40 |
}
|
| 41 |
|
| 42 |
// ---- dark palette (shared) ---------------------------------------------
|
|
|
|
| 43 |
|
| 44 |
behavior palette-dark {
|
| 45 |
tokens {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
color {
|
| 47 |
-
paper: #
|
| 48 |
-
card: #
|
| 49 |
-
ink: #
|
| 50 |
-
muted: #
|
| 51 |
-
line: #
|
| 52 |
-
accent:
|
| 53 |
-
accent-ink: #
|
| 54 |
-
ok: #
|
| 55 |
-
err: #
|
| 56 |
-
code-bg: #
|
| 57 |
-
code-ink: #
|
| 58 |
-
code-line: #
|
| 59 |
-
code-key: #
|
| 60 |
-
code-sel: #
|
| 61 |
-
code-prop: #
|
| 62 |
-
code-str: #
|
| 63 |
-
code-num: #
|
| 64 |
-
code-com: #
|
| 65 |
}
|
| 66 |
}
|
| 67 |
}
|
|
@@ -80,25 +93,30 @@ behavior palette-dark {
|
|
| 80 |
|
| 81 |
behavior palette-light {
|
| 82 |
tokens {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
color {
|
| 84 |
-
paper: #
|
| 85 |
-
card: #
|
| 86 |
-
ink: #
|
| 87 |
-
muted: #
|
| 88 |
-
line: #
|
| 89 |
-
accent:
|
| 90 |
-
accent-ink: #
|
| 91 |
-
ok: #
|
| 92 |
-
err: #
|
| 93 |
-
code-bg: #
|
| 94 |
-
code-ink: #
|
| 95 |
-
code-line: #
|
| 96 |
-
code-key: #
|
| 97 |
-
code-sel: #
|
| 98 |
-
code-prop: #
|
| 99 |
-
code-str: #
|
| 100 |
-
code-num: #
|
| 101 |
-
code-com: #
|
| 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: #
|
| 23 |
-
@media (prefers-color-scheme: dark) { html { background: #
|
| 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">{"
|
| 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.
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
| 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.
|
| 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>
|
|
|
|
| 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() {
|