@ -8,8 +8,8 @@
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * /
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * /
: root {
: root {
--font : ' Inter Variable', 'Segoe UI' , system-ui , -apple-system , sans-serif ;
--font : ' Geist Variable', 'Segoe UI' , system-ui , -apple-system , sans-serif ;
--mono : ' JetBrains Mono Variable', 'Cascadia Mono' , Consolas , monospace ;
--mono : ' Geist Mono Variable', 'Cascadia Mono' , Consolas , monospace ;
--radius-sm : 4px ;
--radius-sm : 4px ;
--radius : 6px ;
--radius : 6px ;
@ -85,6 +85,37 @@
[ data-theme = 'dark' ] [ data-accent = 'rose' ] { --accent : #e57ba3 ; --accent-strong : #d4608c ; }
[ data-theme = 'dark' ] [ data-accent = 'rose' ] { --accent : #e57ba3 ; --accent-strong : #d4608c ; }
[ data-theme = 'dark' ] [ data-accent = 'amber' ] { --accent : #d9a247 ; --accent-strong : #c08a2e ; }
[ data-theme = 'dark' ] [ data-accent = 'amber' ] { --accent : #d9a247 ; --accent-strong : #c08a2e ; }
/ * = = = = = = = = = = = = = = = = = palette ( neutral ground ) = = = = = = = = = = = = = = = = =
A second theme axis alongside mode + accent : the neutral greys . ` warm ` ( the
default , defined in the base light / dark blocks above ) needs no attribute ; the
others override only the neutral tokens , per mode . Accent stays orthogonal , and
the soft state colours are color-mix over --bg-raised / --accent so they follow .
Applied as < html data-palette = … > by theme . ts ; selectable in Settings → Appearance . * /
[ data-palette = 'slate' ] [ data-theme = 'light' ] {
--bg : # f4f5f8 ; --bg-raised : # ffffff ; --bg-hover : # eceef3 ; --bg-inset : # eef0f4 ;
--border : # e1e4ea ; --border-strong : # ccd1da ; --text : # 191c22 ; --text-dim : # 5a616d ; --scrollbar : # ccd1da ;
}
[ data-palette = 'slate' ] [ data-theme = 'dark' ] {
--bg : # 0f1217 ; --bg-raised : # 171b21 ; --bg-hover : # 1f242b ; --bg-inset : # 0b0e12 ;
--border : # 262c34 ; --border-strong : # 363d47 ; --text : # e6e9ef ; --text-dim : # 98a0ac ; --scrollbar : # 363d47 ;
}
[ data-palette = 'graphite' ] [ data-theme = 'light' ] {
--bg : # f3f5f5 ; --bg-raised : # ffffff ; --bg-hover : # e9eded ; --bg-inset : # eef1f1 ;
--border : # e0e5e5 ; --border-strong : # ccd3d3 ; --text : # 14191a ; --text-dim : # 566060 ; --scrollbar : # ccd3d3 ;
}
[ data-palette = 'graphite' ] [ data-theme = 'dark' ] {
--bg : # 101315 ; --bg-raised : # 191d1f ; --bg-hover : # 222729 ; --bg-inset : # 0b0e0f ;
--border : # 272d2f ; --border-strong : # 383f42 ; --text : # e7eaeb ; --text-dim : # 929a9c ; --scrollbar : # 383f42 ;
}
[ data-palette = 'zinc' ] [ data-theme = 'light' ] {
--bg : # fafafa ; --bg-raised : # ffffff ; --bg-hover : # f1f1f2 ; --bg-inset : # f4f4f5 ;
--border : # e4e4e7 ; --border-strong : # d1d1d6 ; --text : # 18181b ; --text-dim : # 70707a ; --scrollbar : # d1d1d6 ;
}
[ data-palette = 'zinc' ] [ data-theme = 'dark' ] {
--bg : # 0b0b0d ; --bg-raised : # 161618 ; --bg-hover : # 202023 ; --bg-inset : # 0e0e10 ;
--border : # 26262a ; --border-strong : # 37373d ; --text : # ededf0 ; --text-dim : # 9a9aa3 ; --scrollbar : # 37373d ;
}
/* ================= base ================= */
/* ================= base ================= */
* { box-sizing : border-box ; }
* { box-sizing : border-box ; }
html , body , # root { height : 100 % ; margin : 0 ; }
html , body , # root { height : 100 % ; margin : 0 ; }
@ -92,7 +123,6 @@ body {
background : var ( --bg ) ;
background : var ( --bg ) ;
color : var ( --text ) ;
color : var ( --text ) ;
font : 400 14px / 1 . 5 var ( --font ) ;
font : 400 14px / 1 . 5 var ( --font ) ;
font-feature-settings : 'cv05' , 'cv11' ;
-webkit-font-smoothing : antialiased ;
-webkit-font-smoothing : antialiased ;
transition : background var ( --speed ) ease , color var ( --speed ) ease ;
transition : background var ( --speed ) ease , color var ( --speed ) ease ;
}
}
@ -355,7 +385,22 @@ table.wf tbody tr.tone-ok:hover td { filter: brightness(0.97); }
}
}
/* ================= theme switcher ================= */
/* ================= theme switcher ================= */
. wf-themer { display : flex ; align-items : center ; gap : 6 px ; }
. wf-themer { display : flex ; flex-direction : column ; align-items : flex-start ; gap : 12 px ; }
. wf-themer . themer-row { display : flex ; align-items : center ; gap : 7 px ; flex-wrap : wrap ; }
. wf-themer . themer-lbl {
width : 62px ; flex : none ; font-size : 11px ; font-weight : 700 ;
text-transform : uppercase ; letter-spacing : 0 . 06em ; color : var ( --text-dim ) ;
}
. wf-themer . pchip {
display : inline-flex ; align-items : center ; gap : 7px ;
border : 1px solid var ( --border ) ; background : var ( --bg-raised ) ; color : var ( --text-dim ) ;
border-radius : 999px ; padding : 4px 13px 4px 5px ; cursor : pointer ;
font : 600 12 . 5px var ( --font ) ;
transition : border-color var ( --speed ) , color var ( --speed ) , background var ( --speed ) ;
}
. wf-themer . pchip : hover { border-color : var ( - - border - strong ) ; color : var ( - - text ) ; }
. wf-themer . pchip . active { border-color : var ( - - accent ) ; color : var ( - - text ) ; background : var ( - - accent - soft ) ; }
. wf-themer . pswatch { width : 18 px ; height : 18 px ; border-radius : 5 px ; border : 1 px solid var ( - - border - strong ) ; flex : none ; }
. wf-themer . swatch {
. wf-themer . swatch {
width : 16px ; height : 16px ; border-radius : 50 % ; cursor : pointer ;
width : 16px ; height : 16px ; border-radius : 50 % ; cursor : pointer ;
border : 2px solid transparent ; padding : 0 ;
border : 2px solid transparent ; padding : 0 ;