| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565 |
- /*
- * Spry CSS theme: "dwarf" — a GNOME libadwaita / Adwaita clone
- * ---------------------------------------------------------------------
- * Ported from the ARC Adwaita reference (libadwaita's own stylesheet):
- * flat 9px buttons with 17px side padding, bold labels and 7%/16%
- * currentColor hovers; opaque accent primaries that brighten 10% on
- * hover; filled borderless entries (#e6e6e7 / #38383c) with a 2px
- * accent focus edge; boxed-row cards (12px radius, shade hairline, no
- * shadow); a hairline-outlined progress trough; 46x26 switches; dim
- * caption column headers; GTK tab bars (the checked tab is a
- * view-surface card bridging the strip's hairline into the panel);
- * flat headerbar dialogs with a centred bold title; a link/accent
- * split (#0461be / #81d0ff text over the same #3584e4 accent_bg in
- * both modes). Shadows appear only on popovers and dialogs. Light +
- * dark: the Adwaita dark palette repeats verbatim in the forced-dark
- * and auto-dark blocks below.
- */
- /* Light scope (Adwaita light). -------------------------------------------- */
- [data-theme="dwarf"],
- html:has(#spry-theme-dwarf:checked) {
- color-scheme: light;
- /* Palette — libadwaita named colours (adwaita.scss) */
- --spry-bg: #fafafb; /* window_bg_color */
- --spry-bg-alt: #ebebed; /* sidebar_bg_color band */
- --spry-bg-inset: #e6e6e7; /* entry_bg fill: wells, code, disabled */
- --spry-surface: #ffffff; /* card / boxed rows */
- --spry-surface-hover: #f4f4f5;
- --spry-headerbar-bg: #ffffff; /* headerbar_bg_color */
- --spry-view-bg: #ffffff; /* view_bg_color: active tab card */
- --spry-dialog-bg: #fafafb; /* dialog_bg_color (AdwDialog, not popover white) */
- --spry-popover-bg: #ffffff; /* popover_bg_color */
- --spry-popover-border: transparent;
- --spry-fg: #323237; /* window_fg (opaque equivalent) */
- --spry-fg-muted: #5e5c64; /* secondary */
- --spry-border: rgb(0 0 6 / 0.12); /* headerbar-shade hairline: visible on light */
- --spry-border-strong: transparent; /* filled entries have no edge */
- --spry-headerbar-shade: rgb(0 0 6 / 0.12);
- --spry-switch-knob: #ffffff; /* slider_color */
- --spry-accent: #3584e4; /* accent_bg_color */
- --spry-accent-hover: color-mix(in srgb, var(--spry-accent) 90%, #fff);
- --spry-accent-fg: #ffffff; /* accent_fg_color */
- --spry-accent-soft: color-mix(in srgb, var(--spry-accent) 25%, transparent);
- --spry-danger: #c30000; /* destructive_color (text) */
- --spry-danger-bg: #e01b24; /* destructive_bg_color */
- --spry-danger-fg: #ffffff; /* destructive_fg_color */
- --spry-success: #1b8553; /* success_color */
- --spry-warning: #9c6e03; /* warning_color */
- --spry-info: #2190a4;
- --spry-link: #0461be; /* accent_color (text) */
- --spry-link-hover: color-mix(in srgb, var(--spry-link) 85%, #000);
- --spry-backdrop: rgb(0 0 6 / 0.14); /* dimming 14% */
- /* Overlay scrollbars, as GNOME draws them */
- scrollbar-width: thin;
- scrollbar-color: color-mix(in srgb, var(--spry-fg) 20%, transparent) transparent;
- /* Typography — Cantarell / Adwaita Sans, compact GTK metrics */
- --spry-font: Cantarell, "Adwaita Sans", system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans", "Liberation Sans", Arial, sans-serif;
- --spry-font-heading: var(--spry-font);
- --spry-font-mono: "Adwaita Mono", "Source Code Pro", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
- --spry-font-size: 0.95rem;
- --spry-line-height: 1.55;
- --spry-heading-weight: 700;
- /* Shape, depth, motion — flat controls; radii 9/12/15 like libadwaita */
- --spry-radius: 12px;
- --spry-radius-sm: 9px;
- --spry-radius-lg: 15px;
- --spry-radius-pill: 999px;
- --spry-border-width: 1px;
- --spry-shadow: none;
- --spry-shadow-lg: 0 0 0 1px rgb(0 0 0 / 0.05), 0 1px 5px 1px rgb(0 0 0 / 0.09),
- 0 2px 14px 3px rgb(0 0 0 / 0.05);
- --spry-popover-shadow: var(--spry-shadow-lg);
- --spry-glass: none;
- --spry-transition: 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
- /* Dialog motion: the AdwFloatingSheet spring (scale 0.8, damping 0.62 /
- stiffness 500, overshoot via linear()) for WINDOWS. Drawers and the
- modal backdrop opt out below — they settle without the bounce. */
- --spry-dialog-duration: 333ms;
- --spry-dialog-ease: linear(0, 0.0195, 0.0714, 0.1464, 0.2365, 0.3348, 0.4359, 0.5353, 0.6296, 0.7165, 0.7944, 0.8625, 0.9203, 0.968, 1.0062, 1.0355, 1.0568, 1.0712, 1.0797, 1.0833, 1.0829, 1.0795, 1.0739, 1.0668, 1.0588, 1.0504, 1.042, 1.0339, 1.0264, 1.0196, 1.0136, 1.0084, 1.0041, 1.0006, 0.9979, 0.9959, 1);
- --spry-dialog-close-duration: 128ms;
- --spry-dialog-close-ease: linear(0, 0.0148, 0.0549, 0.1141, 0.1868, 0.2684, 0.3547, 0.4422, 0.5284, 0.6108, 0.6881, 0.7588, 0.8225, 0.8785, 0.9268, 0.9677, 1);
- --spry-dialog-in: scale(0.8);
- /* Drawers slide home smoothly, no bounce */
- & :is(.drawer-left, .drawer-right) {
- --spry-dialog-duration: 200ms;
- --spry-dialog-ease: cubic-bezier(0.25, 0.46, 0.45, 0.94);
- --spry-dialog-close-duration: 150ms;
- --spry-dialog-close-ease: ease;
- }
- /* The modal backdrop fades on a plain ease, never the spring */
- & dialog::backdrop,
- & [popover]::backdrop {
- transition-duration: 200ms;
- transition-timing-function: ease;
- }
- & dialog[open]::backdrop,
- & :popover-open::backdrop {
- transition-duration: 200ms;
- transition-timing-function: ease;
- }
- /* Controls — filled, borderless entries (34px metrics) */
- --spry-control-bg: #e6e6e7;
- --spry-control-fg: var(--spry-fg);
- --spry-control-border: transparent;
- --spry-control-radius: var(--spry-radius-sm);
- --spry-control-padding-x: 0.55rem;
- --spry-control-padding-y: 0.4rem;
- --spry-focus-ring: inset 0 0 0 2px var(--spry-accent);
- /* Buttons — flat; hover/active are 7%/16% fills of the label colour */
- --spry-btn-bg: transparent;
- --spry-btn-fg: var(--spry-fg);
- --spry-btn-border: transparent;
- --spry-btn-bg-hover: color-mix(in srgb, var(--spry-fg) 7%, transparent);
- --spry-btn-bg-active: color-mix(in srgb, var(--spry-fg) 16%, transparent);
- /* Cards / tables / progress */
- --spry-card-bg: var(--spry-surface);
- --spry-card-border: rgb(0 0 6 / 0.07);
- --spry-card-padding: 0.75rem;
- --spry-card-shadow: none;
- --spry-table-header-bg: transparent;
- --spry-table-hover: color-mix(in srgb, var(--spry-fg) 4%, transparent);
- --spry-progress-bg: color-mix(in srgb, var(--spry-fg) 15%, transparent);
- --spry-progress-fg: var(--spry-accent);
- /* Text selection is a 25% accent wash, as in _colors.scss */
- & ::selection { background-color: color-mix(in srgb, var(--spry-accent) 25%, transparent); }
- /* Headings modest (title-1..4 scale); labels bold and compact */
- & :where(h1, .h1) { font-size: 1.5rem; font-weight: 800; }
- & :where(h2, .h2) { font-size: 1.3rem; font-weight: 800; }
- & :where(h3, .h3) { font-size: 1.15rem; }
- & :where(h4, .h4) { font-size: 1.05rem; }
- & :where(h5, .h5) { font-size: 0.95rem; }
- & :where(h6, .h6) { font-size: 0.82rem; text-transform: none; letter-spacing: normal; }
- & :is(.label, .field .label) { font-weight: 700; font-size: 0.9rem; }
- /* Buttons: 9px radius (core's --spry-control-radius) with libadwaita's
- 17px side padding and bold labels; :where keeps .btn-sm/.btn-lg (0,2,0)
- and the variant classes winning. .btn-lg alone is a pill, as in Adwaita. */
- & :where(.btn:not(.btn-link), input[type="submit"], input[type="reset"], input[type="button"]) {
- padding-inline: 1.06rem;
- font-weight: 700;
- }
- & :is(.btn, button, input[type="submit"], input[type="reset"], input[type="button"]).btn-lg {
- border-radius: var(--spry-radius-pill);
- }
- /* Opaque primaries darken 20% on press, as GTK's active overlay does */
- & .btn-primary:active {
- background: color-mix(in srgb, var(--spry-accent) 80%, #000);
- border-color: transparent;
- }
- /* Destructive is a flat destructive-bg fill (10% white hover, 20% black press);
- the outline action is a flat accent-coloured button */
- & .btn-danger {
- background: var(--spry-danger-bg);
- border-color: transparent;
- color: var(--spry-danger-fg);
- }
- & .btn-danger:hover {
- background: color-mix(in srgb, var(--spry-danger-bg) 90%, #fff);
- border-color: transparent;
- color: var(--spry-danger-fg);
- }
- & .btn-danger:active {
- background: color-mix(in srgb, var(--spry-danger-bg) 80%, #000);
- border-color: transparent;
- color: var(--spry-danger-fg);
- }
- & .btn-outline { background: transparent; border-color: transparent; color: var(--spry-link); }
- & .btn-outline:hover {
- background: color-mix(in srgb, var(--spry-accent) 10%, transparent);
- border-color: transparent;
- color: var(--spry-link);
- }
- & .btn-ghost:hover {
- background: color-mix(in srgb, var(--spry-fg) 7%, transparent);
- border-color: transparent;
- }
- /* Topbar as a headerbar: 47px banded bar, shade edge under it, flat bold
- nav; the brand reads as a window title (no accent on hover) */
- & .topbar {
- min-height: 2.938rem;
- background: var(--spry-headerbar-bg);
- border-bottom-color: var(--spry-headerbar-shade);
- }
- & .topbar-brand:hover { color: var(--spry-fg); }
- & .nav a { border-radius: var(--spry-radius-sm); font-weight: 700; color: var(--spry-fg); }
- & .nav a:hover { background: color-mix(in srgb, var(--spry-fg) 7%, transparent); color: var(--spry-fg); }
- & .nav a.active { background: color-mix(in srgb, var(--spry-fg) 10%, transparent); color: var(--spry-fg); }
- /* GtkDropDown selects are buttons: bold, with a raised hover fill */
- & select { font-weight: 700; }
- & select:hover { background: color-mix(in srgb, var(--spry-fg) 15%, var(--spry-control-bg)); }
- /* Sidebar rows: 36px, rounded, neutral 7% hover; the selected row is a
- neutral 10% fill (navigation-sidebars select with a shade, not accent) */
- & .menu a { min-height: 2.25rem; padding: 0.4rem 0.75rem; }
- & .menu a:hover { background: color-mix(in srgb, var(--spry-fg) 7%, transparent); color: var(--spry-fg); }
- & .menu a.active {
- background: color-mix(in srgb, var(--spry-fg) 10%, transparent);
- color: var(--spry-fg);
- border-radius: var(--spry-radius-sm);
- }
- /* Submenu and popover-menu items keep the neutral 10% menu hover; rows are
- 6px and the sheets carry the reference's 6px popover inset */
- & :where(.submenu, .popover-menu) { padding: 0.375rem; }
- & .submenu a:hover { background: color-mix(in srgb, var(--spry-fg) 10%, transparent); color: var(--spry-fg); }
- & .popover-menu a, & .popover-menu button { border-radius: 6px; }
- & .popover-menu a:hover, & .popover-menu button:hover {
- background: color-mix(in srgb, var(--spry-fg) 10%, transparent);
- color: var(--spry-fg);
- }
- /* kbd keeps an edge even though filled entries have none */
- & :where(kbd) {
- background: var(--spry-bg-inset);
- border-color: color-mix(in srgb, var(--spry-fg) 35%, transparent);
- }
- /* Switch: 46x26 track, 20px knob with the slider's drop shadow, 15% trough */
- & .switch .track {
- width: 2.875rem;
- height: 1.625rem;
- background: color-mix(in srgb, var(--spry-fg) 15%, transparent);
- }
- & .switch input:not(:checked):hover + .track {
- background: color-mix(in srgb, var(--spry-fg) 20%, transparent);
- }
- & .switch .track::after {
- top: 0.1875rem;
- width: 1.25rem;
- height: 1.25rem;
- background: var(--spry-switch-knob);
- box-shadow: 0 1px 3px rgb(0 0 6 / 0.2);
- }
- & .switch input:checked + .track::after { translate: 1.25rem 0; }
- /* Spinner: AdwSpinner — libadwaita's faint ring plus a round-capped arc whose
- ends ease apart and back together while it turns (the paintable's own
- constants and easing), drawn as an animated SVG mask over currentColor at
- the core's sizes; dark needs no extra colours */
- --spry-spinner-mask: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cstyle%3ec\
- ircle%7bfill:none;stroke:%23000;stroke-width:2;stroke-linecap:round%7dg%7btransform-origin:8px 8px;a\
- nimation:t 1.2s linear infinite%7d.a%7banimation:d 1.59s linear infinite%7d@keyframes t%7bto%7btrans\
- form:rotate(1turn)%7d%7d@keyframes d%7b0%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-17.5%7d\
- 1.25%25%7bstroke-dasharray:0.849 99.151;stroke-dashoffset:-16.938%7d2.5%25%7bstroke-dasharray:1.145 \
- 98.855;stroke-dashoffset:-16.375%7d3.75%25%7bstroke-dasharray:1.635 98.365;stroke-dashoffset:-15.812\
- %7d5%25%7bstroke-dasharray:2.315 97.685;stroke-dashoffset:-15.25%7d6.25%25%7bstroke-dasharray:3.179 \
- 96.821;stroke-dashoffset:-14.688%7d7.5%25%7bstroke-dasharray:4.22 95.78;stroke-dashoffset:-14.125%7d\
- 8.75%25%7bstroke-dasharray:5.427 94.57300000000001;stroke-dashoffset:-13.563%7d10%25%7bstroke-dashar\
- ray:6.79 93.21;stroke-dashoffset:-13%7d11.25%25%7bstroke-dasharray:8.297 91.703;stroke-dashoffset:-1\
- 2.438%7d12.5%25%7bstroke-dasharray:9.934 90.066;stroke-dashoffset:-11.875%7d13.75%25%7bstroke-dashar\
- ray:11.687 88.313;stroke-dashoffset:-11.313%7d15%25%7bstroke-dasharray:13.54 86.46000000000001;strok\
- e-dashoffset:-10.75%7d16.25%25%7bstroke-dasharray:15.421 84.57900000000001;stroke-dashoffset:-10.244\
- %7d17.5%25%7bstroke-dasharray:17.237 82.763;stroke-dashoffset:-9.868%7d18.75%25%7bstroke-dasharray:1\
- 8.971 81.029;stroke-dashoffset:-9.622%7d20%25%7bstroke-dasharray:20.607 79.393;stroke-dashoffset:-9.\
- 505%7d21.25%25%7bstroke-dasharray:22.129 77.871;stroke-dashoffset:-9.513%7d22.5%25%7bstroke-dasharra\
- y:23.522 76.47800000000001;stroke-dashoffset:-9.642%7d23.75%25%7bstroke-dasharray:24.77 75.23;stroke\
- -dashoffset:-9.89%7d25%25%7bstroke-dasharray:25.861 74.139;stroke-dashoffset:-10.251%7d26.25%25%7bst\
- roke-dasharray:26.782 73.218;stroke-dashoffset:-10.72%7d27.5%25%7bstroke-dasharray:27.521 72.479;str\
- oke-dashoffset:-11.29%7d28.75%25%7bstroke-dasharray:28.069 71.931;stroke-dashoffset:-11.955%7d30%25%\
- 7bstroke-dasharray:28.416 71.584;stroke-dashoffset:-12.707%7d31.25%25%7bstroke-dasharray:28.557 71.4\
- 43;stroke-dashoffset:-13.539%7d32.5%25%7bstroke-dasharray:28.485 71.515;stroke-dashoffset:-14.443%7d\
- 33.75%25%7bstroke-dasharray:28.197 71.803;stroke-dashoffset:-15.409%7d35%25%7bstroke-dasharray:27.69\
- 72.31;stroke-dashoffset:-16.429%7d36.25%25%7bstroke-dasharray:26.965 73.035;stroke-dashoffset:-17.4\
- 93%7d37.5%25%7bstroke-dasharray:26.023 73.977;stroke-dashoffset:-18.592%7d38.75%25%7bstroke-dasharra\
- y:24.867 75.133;stroke-dashoffset:-19.715%7d40%25%7bstroke-dasharray:23.503 76.497;stroke-dashoffset\
- :-20.853%7d41.25%25%7bstroke-dasharray:21.938 78.062;stroke-dashoffset:-21.995%7d42.5%25%7bstroke-da\
- sharray:20.243 79.757;stroke-dashoffset:-23.132%7d43.75%25%7bstroke-dasharray:18.559 81.441;stroke-d\
- ashoffset:-24.254%7d45%25%7bstroke-dasharray:16.9 83.1;stroke-dashoffset:-25.35%7d46.25%25%7bstroke-\
- dasharray:15.278 84.722;stroke-dashoffset:-26.41%7d47.5%25%7bstroke-dasharray:13.7 86.3;stroke-dasho\
- ffset:-27.425%7d48.75%25%7bstroke-dasharray:12.177 87.82300000000001;stroke-dashoffset:-28.386%7d50%\
- 25%7bstroke-dasharray:10.717 89.283;stroke-dashoffset:-29.283%7d51.25%25%7bstroke-dasharray:9.33 90.\
- 67;stroke-dashoffset:-30.108%7d52.5%25%7bstroke-dasharray:8.023 91.977;stroke-dashoffset:-30.852%7d5\
- 3.75%25%7bstroke-dasharray:6.804 93.196;stroke-dashoffset:-31.509%7d55%25%7bstroke-dasharray:5.681 9\
- 4.319;stroke-dashoffset:-32.069%7d56.25%25%7bstroke-dasharray:4.659 95.341;stroke-dashoffset:-32.528\
- %7d57.5%25%7bstroke-dasharray:3.746 96.254;stroke-dashoffset:-32.879%7d58.75%25%7bstroke-dasharray:2\
- .947 97.053;stroke-dashoffset:-33.115%7d60%25%7bstroke-dasharray:2.266 97.734;stroke-dashoffset:-33.\
- 234%7d61.25%25%7bstroke-dasharray:1.707 98.293;stroke-dashoffset:-33.23%7d62.5%25%7bstroke-dasharray\
- :1.274 98.726;stroke-dashoffset:-33.101%7d63.75%25%7bstroke-dasharray:0.97 99.03;stroke-dashoffset:-\
- 32.843%7d65%25%7bstroke-dasharray:0.795 99.205;stroke-dashoffset:-32.455%7d66.25%25%7bstroke-dasharr\
- ay:0.75 99.25;stroke-dashoffset:-31.937%7d67.5%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-3\
- 1.375%7d68.75%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-30.812%7d70%25%7bstroke-dasharray:\
- 0.75 99.25;stroke-dashoffset:-30.25%7d71.25%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-29.6\
- 87%7d72.5%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-29.125%7d73.75%25%7bstroke-dasharray:0\
- .75 99.25;stroke-dashoffset:-28.562%7d75%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-28%7d76\
- .25%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-27.437%7d77.5%25%7bstroke-dasharray:0.75 99.\
- 25;stroke-dashoffset:-26.875%7d78.75%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-26.313%7d80\
- %25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-25.75%7d81.25%25%7bstroke-dasharray:0.75 99.25;\
- stroke-dashoffset:-25.187%7d82.5%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-24.625%7d83.75%\
- 25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-24.062%7d85%25%7bstroke-dasharray:0.75 99.25;str\
- oke-dashoffset:-23.5%7d86.25%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-22.938%7d87.5%25%7b\
- stroke-dasharray:0.75 99.25;stroke-dashoffset:-22.375%7d88.75%25%7bstroke-dasharray:0.75 99.25;strok\
- e-dashoffset:-21.813%7d90%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-21.25%7d91.25%25%7bstr\
- oke-dasharray:0.75 99.25;stroke-dashoffset:-20.687%7d92.5%25%7bstroke-dasharray:0.75 99.25;stroke-da\
- shoffset:-20.125%7d93.75%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-19.563%7d95%25%7bstroke\
- -dasharray:0.75 99.25;stroke-dashoffset:-19%7d96.25%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffs\
- et:-18.437%7d97.5%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset:-17.875%7d98.75%25%7bstroke-das\
- harray:0.75 99.25;stroke-dashoffset:-17.313%7d100%25%7bstroke-dasharray:0.75 99.25;stroke-dashoffset\
- :-16.75%7d%7d%3c/style%3e%3ccircle cx='8' cy='8' r='7' stroke-opacity='.15'/%3e%3cg%3e%3ccircle clas\
- s='a' cx='8' cy='8' r='7' pathLength='100'/%3e%3c/g%3e%3c/svg%3e") center / contain no-repeat;
- & .spinner {
- border: 0;
- background-color: currentColor;
- -webkit-mask: var(--spry-spinner-mask);
- mask: var(--spry-spinner-mask);
- animation: none;
- }
- /* Progress: the trough carries a hairline outline for definition; the
- fill stays the plain accent, and the indeterminate pulse keeps it */
- /* Trough hairline as a REAL border: it participates in layout, so the
- value fill is sized inside it and can never paint taller than the
- track (element-level inset shadows and pseudo rings both leaked) */
- & progress {
- border: 1px solid var(--spry-border);
- border-radius: var(--spry-radius-sm);
- }
- /* Indeterminate: GTK's pulse is a square-ish block, not the rounded
- stadium the core default uses */
- & progress:indeterminate {
- /* GTK pulse: rounded rectangle, softer than the stadium */
- --spry-pulse-cap: 0.25em;
- background:
- radial-gradient(var(--spry-pulse-cap) var(--spry-pulse-cap) at var(--spry-pulse-cap) 50%, var(--spry-accent) 97%, transparent 100%) 0% 50% / 22% 100% no-repeat,
- radial-gradient(var(--spry-pulse-cap) var(--spry-pulse-cap) at calc(100% - var(--spry-pulse-cap)) 50%, var(--spry-accent) 97%, transparent 100%) 0% 50% / 22% 100% no-repeat,
- linear-gradient(90deg, transparent 0 var(--spry-pulse-cap), var(--spry-accent) var(--spry-pulse-cap) calc(100% - var(--spry-pulse-cap)), transparent calc(100% - var(--spry-pulse-cap))) 0% 50% / 22% 100% no-repeat,
- color-mix(in srgb, var(--spry-fg) 15%, transparent);
- animation: spry-pulse 1.4s linear infinite alternate;
- }
- /* Boxed rows: flat headers/footers on the hairline card; expander rows
- hover at 3%, like AdwExpanderRow */
- & .card-header, & .card-footer { background: transparent; }
- & summary:hover { background: color-mix(in srgb, var(--spry-fg) 3%, transparent); }
- /* Alerts are flat tinted boxes: no border, 12px via --spry-radius */
- & :where(.alert-danger, .alert-success, .alert-warning, .alert-info) { border-color: transparent; }
- & .alert-info { color: #155e70; }
- & .alert-success { color: #14683f; }
- & .alert-warning { color: #7d5a06; }
- & .badge { color: #034f9c; }
- & .hero-eyebrow { color: #0461be; }
- /* Invalid entries take the destructive focus edge, not a glow */
- & .is-invalid:focus { box-shadow: inset 0 0 0 2px var(--spry-danger) !important; }
- /* Column headers: dim caption headings, no band; row separators are
- the reference's 15% currentColor borders */
- & :where(th, td) { border-color: color-mix(in srgb, var(--spry-fg) 15%, transparent); }
- & :where(thead th) {
- background: transparent;
- text-transform: none;
- letter-spacing: normal;
- font-size: 0.82em;
- font-weight: 700;
- color: var(--spry-fg-muted);
- border-bottom: 1px solid var(--spry-border);
- }
- /* Tabs: a GTK tab bar — flat sidebar-coloured strip under top-rounded
- labels with neutral hovers; the checked label (core's nth-of-type
- mechanism, re-scoped so it wins the cascade over the core's
- underline) is a view-surface card, bold window-fg text, whose -1px
- margin bridges the strip's hairline so it connects to the panel. */
- & .tab-list { background: var(--spry-bg-alt); }
- & .tab-list label:hover {
- background: color-mix(in srgb, var(--spry-fg) 7%, transparent);
- color: var(--spry-fg);
- }
- & .tabs > input:nth-of-type(1):checked ~ .tab-list label:nth-of-type(1),
- & .tabs > input:nth-of-type(2):checked ~ .tab-list label:nth-of-type(2),
- & .tabs > input:nth-of-type(3):checked ~ .tab-list label:nth-of-type(3),
- & .tabs > input:nth-of-type(4):checked ~ .tab-list label:nth-of-type(4),
- & .tabs > input:nth-of-type(5):checked ~ .tab-list label:nth-of-type(5),
- & .tabs > input:nth-of-type(6):checked ~ .tab-list label:nth-of-type(6) {
- color: var(--spry-fg);
- font-weight: 700;
- background: var(--spry-view-bg);
- box-shadow: none;
- margin-bottom: -1px;
- }
- /* Dialogs as AdwDialogs: dialog-bg surface, soft dialog shadow, flat 47px
- headerbar with a centred bold title, 24px circular flat close button,
- borderless response area whose buttons carry AdwAlertDialog's 12px
- radius and 60px min-width */
- & :where(dialog) {
- background: var(--spry-dialog-bg);
- box-shadow:
- 0 0 14px 2px rgb(0 0 6 / 0.03),
- 0 0 5px 2px rgb(0 0 6 / 0.1),
- 0 0 0 1px rgb(0 0 0 / 0.05);
- }
- & .dialog-titlebar {
- min-height: 2.938rem;
- background: transparent;
- border-bottom-color: transparent;
- }
- & .dialog-title { font-weight: 700; text-align: center; }
- & .dialog-close {
- width: 1.5rem;
- height: 1.5rem;
- padding: 0;
- border-radius: 50%;
- background: color-mix(in srgb, var(--spry-fg) 10%, transparent);
- color: var(--spry-fg);
- }
- & .dialog-close:hover {
- background: color-mix(in srgb, var(--spry-fg) 15%, transparent);
- color: var(--spry-fg);
- }
- & .dialog-footer {
- gap: 0.75rem;
- padding: 0.75rem;
- background: transparent;
- border-top-color: transparent;
- }
- & .dialog-footer :is(.btn, button) { min-width: 3.75rem; border-radius: var(--spry-radius); }
- /* Drawers are sidebar panes: the sidebar band, not the popover white */
- & :is(.drawer-left, .drawer-right) { background: var(--spry-bg-alt); }
- /* Hero: a flat welcome page — window bg with a soft accent glow */
- & .hero {
- background:
- radial-gradient(60rem 24rem at 50% -8rem, var(--spry-accent-soft), transparent 70%),
- var(--spry-bg);
- border-block-color: transparent;
- }
- & .hero-title { font-weight: 800; }
- /* Avatars: the GNOME user-menu blue gradient with its pale-blue label */
- & .avatar { background: linear-gradient(#83b6ec, #337fdc); color: #cfe1f5; font-weight: 700; }
- /* OTP fields are large entries: the 12px large-entry radius */
- & .otp input { border-radius: var(--spry-radius); }
- /* Pagination: flat page buttons, neutral hovers, the current page a
- 10% fill with a bold label (no accent block) */
- & .pagination a:hover {
- background: color-mix(in srgb, var(--spry-fg) 7%, transparent);
- color: var(--spry-fg);
- }
- & .pagination [aria-current="page"] {
- background: color-mix(in srgb, var(--spry-fg) 10%, transparent);
- color: var(--spry-fg);
- font-weight: 700;
- }
- }
- /* Forced dark (Adwaita dark). --------------------------------------------- */
- [data-theme="dwarf"][data-mode="dark"],
- html:has(#spry-theme-dwarf:checked):has(#spry-mode-dark:checked),
- [data-theme="dwarf"]:has(#spry-mode-dark:checked) {
- color-scheme: dark;
- /* Light-on-dark counterparts of the light scope's text fixes */
- & .badge { color: #81d0ff; }
- & .hero-eyebrow { color: #81d0ff; }
- & .alert-info { color: #8fd8ea; }
- /* Palette — libadwaita named colours (adwaita-dark.scss) */
- --spry-bg: #222226; /* window_bg_color */
- --spry-bg-alt: #2e2e32; /* sidebar / headerbar band */
- --spry-bg-inset: #38383c; /* entry_bg fill */
- --spry-surface: #343437; /* card (opaque equivalent) */
- --spry-surface-hover: #3a3a3f;
- --spry-headerbar-bg: #2e2e32;
- --spry-view-bg: #1d1d20; /* view_bg_color */
- --spry-dialog-bg: #36363a; /* dialog_bg_color */
- --spry-popover-bg: #36363a; /* popover_bg_color */
- --spry-popover-border: rgb(255 255 255 / 0.07);
- --spry-fg: #ffffff;
- --spry-fg-muted: rgb(255 255 255 / 0.55); /* dim labels: fg at 55% */
- --spry-border: rgb(0 0 6 / 0.36);
- --spry-headerbar-shade: rgb(0 0 6 / 0.36);
- --spry-switch-knob: #d2d2d3; /* white 80% over the view bg */
- --spry-accent: #3584e4;
- --spry-accent-fg: #ffffff;
- --spry-danger: #ff938c; /* destructive_color */
- --spry-danger-bg: #c01c28; /* destructive_bg_color */
- --spry-danger-fg: #ffffff;
- --spry-success: #78e9ab; /* success_color */
- --spry-warning: #ffc252; /* warning_color */
- --spry-info: #2190a4;
- --spry-link: #81d0ff; /* accent_color */
- --spry-link-hover: color-mix(in srgb, var(--spry-link) 85%, #fff);
- --spry-backdrop: rgb(0 0 6 / 0.5); /* dimming 50% */
- --spry-shadow-lg: 0 0 0 1px rgb(0 0 0 / 0.4), 0 1px 5px 1px rgb(0 0 0 / 0.35),
- 0 2px 14px 3px rgb(0 0 0 / 0.25);
- --spry-control-bg: #38383c;
- --spry-card-bg: var(--spry-surface);
- --spry-card-border: rgb(0 0 6 / 0.36);
- }
- /* Auto dark (system preference unless overridden). ------------------------ */
- @media (prefers-color-scheme: dark) {
- [data-theme="dwarf"]:not([data-mode="light"]):not(:has(#spry-mode-light:checked)),
- html:has(#spry-theme-dwarf:checked):has(#spry-mode-auto:checked) {
- color-scheme: dark;
- & .badge { color: #81d0ff; }
- & .hero-eyebrow { color: #81d0ff; }
- & .alert-info { color: #8fd8ea; }
- /* Palette — libadwaita named colours (adwaita-dark.scss) */
- --spry-bg: #222226; /* window_bg_color */
- --spry-bg-alt: #2e2e32; /* sidebar / headerbar band */
- --spry-bg-inset: #38383c; /* entry_bg fill */
- --spry-surface: #343437; /* card (opaque equivalent) */
- --spry-surface-hover: #3a3a3f;
- --spry-headerbar-bg: #2e2e32;
- --spry-view-bg: #1d1d20; /* view_bg_color */
- --spry-dialog-bg: #36363a; /* dialog_bg_color */
- --spry-popover-bg: #36363a; /* popover_bg_color */
- --spry-popover-border: rgb(255 255 255 / 0.07);
- --spry-fg: #ffffff;
- --spry-fg-muted: rgb(255 255 255 / 0.55); /* dim labels: fg at 55% */
- --spry-border: rgb(0 0 6 / 0.36);
- --spry-headerbar-shade: rgb(0 0 6 / 0.36);
- --spry-switch-knob: #d2d2d3; /* white 80% over the view bg */
- --spry-accent: #3584e4;
- --spry-accent-fg: #ffffff;
- --spry-danger: #ff938c; /* destructive_color */
- --spry-danger-bg: #c01c28; /* destructive_bg_color */
- --spry-danger-fg: #ffffff;
- --spry-success: #78e9ab; /* success_color */
- --spry-warning: #ffc252; /* warning_color */
- --spry-info: #2190a4;
- --spry-link: #81d0ff; /* accent_color */
- --spry-link-hover: color-mix(in srgb, var(--spry-link) 85%, #fff);
- --spry-backdrop: rgb(0 0 6 / 0.5); /* dimming 50% */
- --spry-shadow-lg: 0 0 0 1px rgb(0 0 0 / 0.4), 0 1px 5px 1px rgb(0 0 0 / 0.35),
- 0 2px 14px 3px rgb(0 0 0 / 0.25);
- --spry-control-bg: #38383c;
- --spry-card-bg: var(--spry-surface);
- --spry-card-border: rgb(0 0 6 / 0.36);
- }
- }
|