diff --git a/CHANGELOG.md b/CHANGELOG.md index ab70ee6..953e62f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,33 @@ All notable changes to gtheme are documented here. The format follows ## [Unreleased] +- **Shared render templates: readable text on accent fills.** The GTK accent + override now puts the theme's dark `bg` on accent-filled widgets instead of + `fg_bright` (ivory-on-brass/orange was ~2.2:1; ink is 7–7.6:1), and the + derived Ptyxis *Light* scheme no longer emits near-invisible white slots + (`Color7` → `comment`, `Color15` → `ansi_black`, cursor/bell/superuser text + → `bg`; the Dark superuser badge too). Both bundled themes rebuilt. + +- **New bundled theme: `hyperclass`** (HYPERCLASS — Gilded Void), the + collection's luxury liner: first class aboard a starliner crossing the + void. Champagne brass (`#C9A24A`, the desaturated "expensive gold" band — + never slot-machine `#FFD700`) as hairline trim on deep-space ink, warm + ivory text, one ice vein for anything technical; every contrast ratio + audited (body text 14:1, all six ANSI hues ≥ 5.9:1 in their canonical hue + slots). Applied across wallpaper, GTK, GNOME accent/icons, Ptyxis, + Alacritty, starship, btop, micro, fastfetch, cava, fish, dash-to-dock, + Tiling Shell, blur-my-shell — and Burn My Windows, whose windows now + open/close through a champagne hexagon lattice (profile shipped, exactly + one effect enabled). Three terminal instruments under + `~/.local/share/gtheme/assets/hyperclass/bin` (fish shortcuts in + parentheses): a brass ASCII orrery that is a working clock — hours, + minutes and a smooth seconds moon on engraved orbits (`orrery`), a + truecolor hyperspace starfield jump (`warp`), and a self-printing + art-deco boarding pass to a random exoplanet (`boarding`). Three seeded + procedural wallpapers — an art-deco sunburst marque, first light over a + ringed gas giant, and the jump itself — rotate on an unhurried GNOME + crossfade; the numpy generator is included under `assets/`. + - **The collection is now `magma`** (MAGMA — Obsidian Flow), replacing `nsx`, `jojo` and `shoji`. A single all-in dark rice: obsidian-glass surfaces with molten orange / lava gold accents and one cool teal vein, applied across diff --git a/README.md b/README.md index 26d9c1c..c8add22 100644 --- a/README.md +++ b/README.md @@ -233,6 +233,7 @@ Found a boundary escape? See [SECURITY.md](SECURITY.md). | | theme | | |---|---|---| +| ![hyperclass palette](docs/media/palette-hyperclass.svg) | **hyperclass** | HYPERCLASS — Gilded Void: first class aboard a starliner; champagne brass trim on deep-space ink, ivory starlight, one vein of ice. Ships an ASCII orrery that is a working clock (`orrery`), a truecolor hyperspace jump (`warp`), a self-printing art-deco boarding pass (`boarding`), three procedural wallpapers on a slow crossfade, and a champagne hexagon Burn-My-Windows profile | | ![magma palette](docs/media/palette-magma.svg) | **magma** | MAGMA — Obsidian Flow: obsidian glass, molten orange, lava gold, one cool teal vein. Ships a live lava-lamp fluid sim for the terminal (`lavalamp`), plus `embers`, `erupt` and `thermal`, and three procedural wallpapers on a slow crossfade | Contribute yours: `gtheme publish ` prints the exact PR steps, and diff --git a/docs/media/palette-hyperclass.svg b/docs/media/palette-hyperclass.svg new file mode 100644 index 0000000..135a8f5 --- /dev/null +++ b/docs/media/palette-hyperclass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/gtheme/templates/gtk.css.j2 b/src/gtheme/templates/gtk.css.j2 index f2f0d32..f903285 100644 --- a/src/gtheme/templates/gtk.css.j2 +++ b/src/gtheme/templates/gtk.css.j2 @@ -1,11 +1,13 @@ /* {{ title }} — generated by gtheme. libadwaita / GTK4 accent override. */ :root { --accent-bg-color: {{ accent }}; - --accent-fg-color: {{ fg_bright }}; + /* text ON accent-filled widgets: both bundled accents are mid-light, so the + theme's own dark bg is the readable pairing (ivory-on-accent is ~2.2:1) */ + --accent-fg-color: {{ bg }}; --accent-color: {{ accent_bright }}; } /* GTK3 fallback */ @define-color accent_color {{ accent_bright }}; @define-color accent_bg_color {{ accent }}; -@define-color accent_fg_color {{ fg_bright }}; +@define-color accent_fg_color {{ bg }}; diff --git a/src/gtheme/templates/ptyxis.palette.j2 b/src/gtheme/templates/ptyxis.palette.j2 index e0e2c06..a5335b1 100644 --- a/src/gtheme/templates/ptyxis.palette.j2 +++ b/src/gtheme/templates/ptyxis.palette.j2 @@ -13,7 +13,7 @@ TitlebarForeground={{ fg }} BellBackground={{ warn|default(yellow) }} BellForeground={{ bg }} SuperuserBackground={{ accent }} -SuperuserForeground={{ fg_bright }} +SuperuserForeground={{ bg }} RemoteBackground={{ surface2 }} RemoteForeground={{ fg }} Color0={{ ansi_black }} @@ -37,13 +37,13 @@ Color15={{ bright_white }} Foreground={{ bg }} Background={{ fg_bright }} Cursor={{ accent }} -CursorForeground={{ fg_bright }} +CursorForeground={{ bg }} TitlebarBackground={{ fg }} TitlebarForeground={{ bg }} BellBackground={{ warn|default(yellow) }} -BellForeground={{ fg_bright }} +BellForeground={{ bg }} SuperuserBackground={{ accent }} -SuperuserForeground={{ fg_bright }} +SuperuserForeground={{ bg }} RemoteBackground={{ fg }} RemoteForeground={{ bg }} Color0={{ ansi_black }} @@ -53,7 +53,7 @@ Color3={{ yellow|darken(15) }} Color4={{ blue|darken(15) }} Color5={{ magenta|darken(15) }} Color6={{ cyan|darken(15) }} -Color7={{ ansi_white }} +Color7={{ comment }} Color8={{ bright_black }} Color9={{ red }} Color10={{ green }} @@ -61,4 +61,4 @@ Color11={{ yellow }} Color12={{ blue }} Color13={{ magenta }} Color14={{ cyan }} -Color15=#FFFFFF +Color15={{ ansi_black }} diff --git a/themes/hyperclass/assets/wallpaper-gen.py b/themes/hyperclass/assets/wallpaper-gen.py new file mode 100644 index 0000000..f8db00c --- /dev/null +++ b/themes/hyperclass/assets/wallpaper-gen.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python3 +"""Procedural wallpaper generator for the HYPERCLASS theme. + +The three shipped wallpapers are rendered by this script (seeded, so the +output is reproducible byte-for-byte on the same numpy). Re-run it to render +at another resolution: + + python3 wallpaper-gen.py [WIDTH HEIGHT] [OUTDIR] + +Needs numpy (authoring-time only — the theme itself never runs this). +The materials are the palette's: champagne brass trim on deep-space ink, +ivory starlight, one vein of ice. Gold is line weight, never fill weight — +the luxury is the emptiness. +""" +import struct +import sys +import zlib +from pathlib import Path + +import numpy as np + +# Cabin materials (palette.toml, as float RGB). +INK = np.array([18, 21, 31], dtype=np.float64) # bg #12151F +INK_DEEP = np.array([13, 15, 23], dtype=np.float64) +BRASS = np.array([201, 162, 74], dtype=np.float64) # accent #C9A24A +CHAMPAGNE = np.array([235, 217, 168], dtype=np.float64) # #EBD9A8 +IVORY = np.array([234, 227, 209], dtype=np.float64) # fg #EAE3D1 +STARLIGHT = np.array([251, 246, 231], dtype=np.float64) # fg_bright #FBF6E7 +ICE = np.array([169, 218, 232], dtype=np.float64) # #A9DAE8 +INDIGO = np.array([46, 56, 92], dtype=np.float64) # nebula wash + + +def write_png(path, rgb): + """Minimal RGB8 PNG writer (filter 0), no dependencies beyond zlib.""" + h, w, _ = rgb.shape + raw = b"".join(b"\x00" + rgb[y].astype(np.uint8).tobytes() for y in range(h)) + + def chunk(tag, data): + block = tag + data + return struct.pack(">I", len(data)) + block + struct.pack(">I", zlib.crc32(block)) + + png = (b"\x89PNG\r\n\x1a\n" + + chunk(b"IHDR", struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0)) + + chunk(b"IDAT", zlib.compress(raw, 9)) + + chunk(b"IEND", b"")) + Path(path).write_bytes(png) + + +def value_noise(rng, h, w, res): + """Smooth value noise: a random lattice sampled with quintic fade.""" + lat = rng.random((res + 2, res * w // max(h, 1) + 2)) + ys = np.linspace(0, res, h, endpoint=False) + xs = np.linspace(0, lat.shape[1] - 2, w, endpoint=False) + yi, xi = ys.astype(int), xs.astype(int) + yf, xf = ys - yi, xs - xi + fy = (yf * yf * yf * (yf * (yf * 6 - 15) + 10))[:, None] + fx = (xf * xf * xf * (xf * (xf * 6 - 15) + 10))[None, :] + a = lat[np.ix_(yi, xi)] + b = lat[np.ix_(yi, xi + 1)] + c = lat[np.ix_(yi + 1, xi)] + d = lat[np.ix_(yi + 1, xi + 1)] + return a * (1 - fx) * (1 - fy) + b * fx * (1 - fy) + c * (1 - fx) * fy + d * fx * fy + + +def fbm(rng, h, w, octaves=5, base_res=4): + total = np.zeros((h, w)) + amp, norm = 1.0, 0.0 + for o in range(octaves): + total += amp * value_noise(rng, h, w, base_res * (2 ** o)) + norm += amp + amp *= 0.5 + return total / norm + + +def vignette(h, w, strength=0.30): + y = np.linspace(-1, 1, h)[:, None] + x = np.linspace(-1, 1, w)[None, :] + return 1.0 - strength * np.clip(x * x * 0.9 + y * y * 0.8, 0, 1) + + +def splat(img, x, y, radius, colour, gain): + """Additive gaussian bloom into a local window (fast star/streak stamp).""" + h, w, _ = img.shape + r = max(radius * 3.0, 2.0) + x0, x1 = max(int(x - r), 0), min(int(x + r) + 1, w) + y0, y1 = max(int(y - r), 0), min(int(y + r) + 1, h) + if x0 >= x1 or y0 >= y1: + return + yy = np.arange(y0, y1)[:, None] - y + xx = np.arange(x0, x1)[None, :] - x + bloom = np.exp(-(xx * xx + yy * yy) / (2 * radius * radius)) + img[y0:y1, x0:x1] += bloom[..., None] * colour * gain + + +def star_cross(img, x, y, arm, colour, gain): + """A four-point star: soft core + thin horizontal/vertical flare arms.""" + splat(img, x, y, arm * 0.28, colour, gain) + h, w, _ = img.shape + x0, x1 = max(int(x - arm * 3), 0), min(int(x + arm * 3) + 1, w) + y0, y1 = max(int(y - arm * 3), 0), min(int(y + arm * 3) + 1, h) + if x0 >= x1 or y0 >= y1: + return + yy = np.arange(y0, y1)[:, None] - y + xx = np.arange(x0, x1)[None, :] - x + flare = (np.exp(-(yy * yy) / 1.2) * np.exp(-np.abs(xx) / arm) + + np.exp(-(xx * xx) / 1.2) * np.exp(-np.abs(yy) / arm)) + img[y0:y1, x0:x1] += flare[..., None] * colour * gain * 0.55 + + +def starfield(img, rng, n, y_max=1.0, ice_bias=0.10): + """Fine star grain: mostly ivory pinpricks, some champagne, a few ice.""" + h, w, _ = img.shape + for _ in range(n): + x, y = rng.random() * w, rng.random() ** 1.1 * h * y_max + u = rng.random() + colour = ICE if u < ice_bias else (CHAMPAGNE if u < ice_bias + 0.22 else IVORY) + mag = rng.random() ** 2.6 # dim stars dominate + splat(img, x, y, 0.6 + mag * 1.1, colour, 0.10 + mag * 0.55) + + +def gilded_void(w, h): + """The hero: an art-deco sunburst in brass hairlines low on an ink field. + + Vast negative space by design — the marque rises like a theatre curtain + call at the bottom of the frame and the void does the rest. + """ + rng = np.random.default_rng(7) + img = np.zeros((h, w, 3)) + # ink field, a shade deeper at the top so the stars have depth to hang in + ys = np.linspace(0, 1, h)[:, None, None] + img += INK_DEEP + (INK - INK_DEEP) * np.clip(ys * 1.4, 0, 1) + + starfield(img, rng, n=(w * h) // 11000, y_max=0.85) + for _ in range(6): # a few marquee stars + x, y = rng.random() * w, rng.random() * h * 0.55 + star_cross(img, x, y, 5.0 + rng.random() * 5.0, + ICE if rng.random() < 0.3 else STARLIGHT, 0.5) + + # the sunburst origin, low-centre; all geometry hangs off polar coords + cx, cy = w * 0.5, h * 0.80 + yy = (np.arange(h)[:, None] - cy) + xx = (np.arange(w)[None, :] - cx) + r = np.sqrt(xx * xx + yy * yy) + 1e-6 + theta = np.arctan2(yy, xx) # -pi..pi, 0 = east + + # a soft brass halo breathing around the origin (the only "fill", kept faint) + img += np.exp(-(r / (0.16 * h)) ** 2)[..., None] * BRASS * 0.10 + + # rays: a deco fan of hairlines, alternating long/medium/short + n_rays = 30 + px = max(w / 2560.0, 0.8) # hairline width in px + lengths = {0: 0.52, 1: 0.30, 2: 0.40, 3: 0.30} # of h, pattern L M S M + up = yy < 0 # rays live above origin + ray_sum = np.zeros((h, w)) + for k in range(n_rays + 1): + phi = -np.pi * k / n_rays # 180° fan, west to east + L = lengths[k % 4] * h + delta = np.arctan2(np.sin(theta - phi), np.cos(theta - phi)) + thin = np.exp(-0.5 * (delta * r / (1.5 * px)) ** 2) + taper = np.clip(1 - r / L, 0, 1) ** 0.7 * np.clip(r / (0.05 * h) - 0.4, 0, 1) + ray_sum += thin * taper + ray_sum = np.clip(ray_sum, 0, 1) * up + img += ray_sum[..., None] * BRASS * 0.85 + # a wider, dimmer glow pass so the hairlines shimmer instead of etch + glow = np.zeros((h, w)) + for k in range(n_rays + 1): + phi = -np.pi * k / n_rays + L = lengths[k % 4] * h + delta = np.arctan2(np.sin(theta - phi), np.cos(theta - phi)) + wide = np.exp(-0.5 * (delta * r / (6.0 * px)) ** 2) + glow += wide * np.clip(1 - r / L, 0, 1) + img += (np.clip(glow, 0, 1) * up)[..., None] * BRASS * 0.10 + + # concentric champagne arcs: the rising marque's engraved collar + for j, (rad, alpha) in enumerate(((0.050, 0.55), (0.066, 0.40), (0.082, 0.28))): + band = np.exp(-0.5 * ((r - rad * h) / (1.1 * px)) ** 2) * up + img += band[..., None] * CHAMPAGNE * alpha + + # the sun itself: a small half-disc, champagne rimmed with brass + disc = np.clip(1 - r / (0.036 * h), 0, 1) ** 0.6 * up + img += disc[..., None] * (CHAMPAGNE * 0.85 + BRASS * 0.15) * 0.9 + ring = np.exp(-0.5 * ((r - 0.040 * h) / (1.2 * px)) ** 2) * up + img += ring[..., None] * BRASS * 0.7 + + # horizon hairline either side of the marque, fading out + horiz = np.exp(-0.5 * (yy / (0.9 * px)) ** 2) * np.exp(-np.abs(xx) / (0.30 * w)) + img += (horiz * (r > 0.05 * h))[..., None] * BRASS * 0.45 + + img *= vignette(h, w, 0.26)[..., None] + img += (rng.random((h, w, 1)) - 0.5) * 2.0 # anti-banding grain + return np.clip(img, 0, 255) + + +def first_light(w, h): + """The window seat: a ringed gas giant catching dawn, mostly silhouette.""" + rng = np.random.default_rng(19) + img = np.zeros((h, w, 3)) + ys = np.linspace(0, 1, h)[:, None, None] + img += INK_DEEP + (INK - INK_DEEP) * (0.4 + 0.6 * ys) + + # nebula wash, upper left, kept to a whisper + neb = fbm(rng, h, w, octaves=6, base_res=3) + fade = (np.linspace(1, 0, h)[:, None] ** 1.6) * (np.linspace(1, 0.15, w)[None, :]) + img += (neb ** 2.2 * fade)[..., None] * INDIGO * 0.55 + + starfield(img, rng, n=(w * h) // 6500, y_max=1.0) + for _ in range(5): + x, y = rng.random() * w, rng.random() * h * 0.5 + star_cross(img, x, y, 4.0 + rng.random() * 6.0, STARLIGHT, 0.45) + + # the planet: a huge ink sphere low-right, lit by a dawn we cannot see + pcx, pcy, pr = w * 0.72, h * 0.90, 0.36 * h + yy = (np.arange(h)[:, None] - pcy) + xx = (np.arange(w)[None, :] - pcx) + d = np.sqrt(xx * xx + yy * yy) + inside = d < pr + # limb-darkened night side: barely lighter than the void + depth = np.sqrt(np.clip(1 - (d / pr) ** 2, 0, 1)) + night = (INK * 0.55 + INDIGO * 0.20) + img = np.where(inside[..., None], night * (0.5 + 0.5 * depth[..., None]), img) + # faint banded weather, visible only where the rim light reaches + bands = fbm(rng, h, w, octaves=4, base_res=6) + lat = np.clip((yy / pr + 1) * 3.0, 0, 6) + stripes = 0.5 + 0.5 * np.sin(lat * 3.1 + bands * 2.0) + # rim light: dawn breaks over the upper-left limb + lx, ly = -0.62, -0.78 # toward the dawn (upper-left) + nx, ny = xx / pr, yy / pr + ndotl = np.clip(nx * lx + ny * ly, 0, 1) + rim = np.clip(1 - d / pr, 0, 1) + crescent = (np.exp(-rim / 0.085) * ndotl ** 2.4) * inside + img += crescent[..., None] * (CHAMPAGNE * 0.8 + BRASS * 0.2) * 1.5 + img += (crescent * stripes * 0.6)[..., None] * BRASS + # atmosphere: an ice-thin veil hugging the limb, warmest where lit + atmo = np.exp(-np.abs(d - pr) / (0.012 * h)) * (~inside) + img += atmo[..., None] * ICE * 0.30 + img += (atmo * ndotl ** 2)[..., None] * CHAMPAGNE * 0.55 + + # the rings: brass hairline ellipses, tilted; far side hides behind the disc + ang = np.deg2rad(-22.0) + ca, sa = np.cos(ang), np.sin(ang) + rx = xx * ca + yy * sa + ry = -xx * sa + yy * ca + front = ry > 0 # near side passes in front + # gradient of light along the rings: brightest toward the dawn (upper-left) + ring_lit = np.clip(-rx / (pr * 2.2) + 0.55, 0.25, 1.0) + for frac, alpha, width in ((1.36, 0.85, 1.8), (1.50, 0.55, 1.4), + (1.66, 0.70, 2.4), (1.84, 0.38, 1.4)): + a_, b_ = pr * frac, pr * frac * 0.22 + e = np.sqrt((rx / a_) ** 2 + (ry / b_) ** 2) + band = np.exp(-0.5 * ((e - 1.0) / (width * 1.2 / b_)) ** 2) + visible = front | (~inside) + img += (band * visible * ring_lit)[..., None] * BRASS * alpha + img += (band * visible * ring_lit ** 3)[..., None] * CHAMPAGNE * alpha * 0.45 + + # a distant companion moon, ice-lit, upper left — the destination + splat(img, w * 0.17, h * 0.22, 2.2, ICE, 1.3) + splat(img, w * 0.17, h * 0.22, 6.0, ICE, 0.12) + + img *= vignette(h, w, 0.30)[..., None] + img += (rng.random((h, w, 1)) - 0.5) * 2.0 + return np.clip(img, 0, 255) + + +def warp_transit(w, h): + """Mid-jump through the void: starlight drawn into champagne threads.""" + rng = np.random.default_rng(31) + img = np.zeros((h, w, 3)) + img += INK_DEEP + + # the blue-shift: a cold breath of ice at the vanishing point + cx, cy = w * 0.42, h * 0.50 + yy = (np.arange(h)[:, None] - cy) + xx = (np.arange(w)[None, :] - cx) + r = np.sqrt(xx * xx + yy * yy) + img += np.exp(-(r / (0.14 * h)) ** 2)[..., None] * ICE * 0.10 + img += np.exp(-(r / (0.035 * h)) ** 2)[..., None] * STARLIGHT * 0.14 + + diag = np.hypot(w, h) + n = 430 + for i in range(n): + ang = rng.random() * 2 * np.pi + # heads cluster mid-frame; tails reach back toward the point + head_r = (0.06 + rng.random() ** 1.5 * 0.62) * diag + length = head_r * (0.22 + rng.random() * 0.45) + u = rng.random() + colour = (ICE if u < 0.06 else BRASS if u < 0.22 + else CHAMPAGNE if u < 0.55 else IVORY) + gain = 0.22 + rng.random() ** 2 * 0.9 + big = rng.random() < 0.04 # the near misses + girth = (1.8 if big else 0.75) + head_r / diag * 1.6 + steps = max(int(length / 2.5), 6) + for s in range(steps): + t = s / (steps - 1) + rr = head_r - length * (1 - t) + x = cx + np.cos(ang) * rr + y = cy + np.sin(ang) * rr + if not (-20 < x < w + 20 and -20 < y < h + 20): + continue + # comet law: brightest at the head, thread fades astern + splat(img, x, y, girth * (0.55 + 0.45 * t), colour, gain * t * t * 0.42) + # the head itself: a hard bright point, still wearing its colour + hx, hy = cx + np.cos(ang) * head_r, cy + np.sin(ang) * head_r + if 0 <= hx < w and 0 <= hy < h: + splat(img, hx, hy, girth * 0.8, colour * 0.65 + STARLIGHT * 0.35, gain * 0.9) + + img *= vignette(h, w, 0.36)[..., None] + img += (rng.random((h, w, 1)) - 0.5) * 2.0 + return np.clip(img, 0, 255) + + +def main(): + args = sys.argv[1:] + w, h = (int(args[0]), int(args[1])) if len(args) >= 2 else (2560, 1440) + outdir = Path(args[2]) if len(args) >= 3 else Path(__file__).parent.parent / "files" / "wallpaper" + outdir.mkdir(parents=True, exist_ok=True) + for name, fn in (("gilded-void", gilded_void), + ("first-light", first_light), + ("warp-transit", warp_transit)): + img = fn(w, h) + write_png(outdir / f"{name}.png", img) + print(f"wrote {outdir / (name + '.png')} ({w}x{h})") + + +if __name__ == "__main__": + main() diff --git a/themes/hyperclass/files/alacritty/alacritty.toml b/themes/hyperclass/files/alacritty/alacritty.toml new file mode 100644 index 0000000..32d97f0 --- /dev/null +++ b/themes/hyperclass/files/alacritty/alacritty.toml @@ -0,0 +1,49 @@ +# HYPERCLASS — Gilded Void: the window seat. +# Colours live in hyperclass.toml (generated from palette.toml — edit that). + +[general] +import = ["~/.config/alacritty/hyperclass.toml"] + +[env] +TERM = "xterm-256color" + +[window] +# A whisper of the void through the glass; blur-my-shell frosts it on GNOME, +# `blur` covers compositors with native support. +opacity = 0.92 +blur = true +dynamic_padding = true +# Generous negative space is a luxury signal — the cabin is never cramped. +padding = { x = 18, y = 16 } +decorations_theme_variant = "Dark" + +[font] +size = 11.5 + +# Iosevka: narrow, tall, machine-age letterforms — the closest a terminal +# font gets to art-deco signage. +[font.normal] +family = "Iosevka Nerd Font Mono" +style = "Regular" + +[font.bold] +family = "Iosevka Nerd Font Mono" +style = "Bold" + +[font.italic] +family = "Iosevka Nerd Font Mono" +style = "Italic" + +[cursor] +unfocused_hollow = true +# A steady brass block — a cursor with the confidence not to blink. +style = { shape = "Block", blinking = "Off" } + +[scrolling] +history = 10000 + +# Shift+Enter sends ESC + CR (escaped newline) +[[keyboard.bindings]] +key = "Return" +mods = "Shift" +chars = "\u001B\r" diff --git a/themes/hyperclass/files/alacritty/hyperclass.toml b/themes/hyperclass/files/alacritty/hyperclass.toml new file mode 100644 index 0000000..70c10e9 --- /dev/null +++ b/themes/hyperclass/files/alacritty/hyperclass.toml @@ -0,0 +1,35 @@ +# HYPERCLASS — Gilded Void — generated by gtheme from palette.toml. Edit the palette, not this file. + +[colors.primary] +background = "#12151F" +foreground = "#EAE3D1" +dim_foreground = "#C2BCAB" +bright_foreground = "#FBF6E7" + +[colors.cursor] +text = "#12151F" +cursor = "#C9A24A" + +[colors.selection] +text = "#EAE3D1" +background = "#2A3046" + +[colors.normal] +black = "#242A3C" +red = "#E2707F" +green = "#86C28F" +yellow = "#D9B45C" +blue = "#85ABE3" +magenta = "#B79BE0" +cyan = "#7CC5CE" +white = "#D3CDBE" + +[colors.bright] +black = "#6E7488" +red = "#F18E9B" +green = "#A3D8A9" +yellow = "#EDCD82" +blue = "#A6C4F2" +magenta = "#CFB6EF" +cyan = "#9ADEE6" +white = "#FBF6E7" diff --git a/themes/hyperclass/files/ascii/quotes.txt b/themes/hyperclass/files/ascii/quotes.txt new file mode 100644 index 0000000..880f288 --- /dev/null +++ b/themes/hyperclass/files/ascii/quotes.txt @@ -0,0 +1,24 @@ +The dark is not empty. It is merely well behaved. — The Captain, night shift +We do not decorate the void; it came furnished. — Complimentary Brochure +The view never changes, which is precisely the luxury of it. — The Observation Lounge +The void asks nothing of you. Return the courtesy. — The Captain +Outside, nothing happens beautifully, and at great length. — Complimentary Brochure +In freefall the bubbles rise in every direction at once; we consider it an improvement. — The Sommelier +The champagne does not spill; it merely relocates with enthusiasm. — Cabin Services +We chill the wine to the temperature just beyond the hull, then add a single degree of mercy. — The Sommelier +Every bubble is a small rebellion against the vacuum; we serve them by the flute. — The Wine List +We have never been late. We have, on occasion, arrived before the invitation. — The Purser +A light-year is a long way to be punctual, and yet. — The Ship's Chronometer +Dinner is at eight, regardless of which star it is eight beneath. — The Maître d' +Time dilates; the reservation does not. — The Head Waiter +We keep three clocks: the ship's, the port's, and the one you will wish you had trusted. — The Purser +Should the hull breach, kindly finish your sentence first. — Cabin Services +In the unlikely event of catastrophe, the string quartet will continue. — The Bandleader +A micrometeorite passed during breakfast; the eggs were unaffected. — The Breakfast Service +The engines are on fire, in the sense that they always are. — Engineering +The lifeboats are polished weekly and, we trust, ornamental. — The Deck Steward +The nearest star is unsurvivable and, from this distance, quite flattering. — The Observation Lounge +First class is not a location. It is a temperature. — The First-Class Handbook +The brass is polished nightly by someone who believes it matters. It does. — Housekeeping +Ring twice for anything; once, if it can wait a century. — The Concierge +We remember your name across the whole dark; it is the least the dark allows. — The Night Steward diff --git a/themes/hyperclass/files/ascii/starliner.txt b/themes/hyperclass/files/ascii/starliner.txt new file mode 100644 index 0000000..c95cf59 --- /dev/null +++ b/themes/hyperclass/files/ascii/starliner.txt @@ -0,0 +1,11 @@ + ✦ + ✦ ▗▟▛ + ╌╌╌ ▗▟█▛ ▁▂▃▄▅▅▄▃▂▁ + ╌╌╌╌ ▂▃▄▟████████████████████████████████▙▄▂ + ╌╌╌╌ ▂▄▟█████████████ · · · · · ██████████████▙▄▖ + ╌╌╌╌ ▂▟████████████████████████████████████████████████████▙▖ ➜ + ╌╌╌╌ ▝▀▜█████████████ · · · · · ██████████████▛▀▘ + ╌╌╌╌ ▝▀▀▜████████████████████████████████▛▀▘ + ╌╌╌ ▝▜█▙ ▔▀▀▀▀▀▀▀▀▀▀▔ + ✦ ▝▜▙ hyperclass + ✦ diff --git a/themes/hyperclass/files/ascii/sunburst.txt b/themes/hyperclass/files/ascii/sunburst.txt new file mode 100644 index 0000000..4262c16 --- /dev/null +++ b/themes/hyperclass/files/ascii/sunburst.txt @@ -0,0 +1,8 @@ + ╲ │ ╱ + ╲ ╲ │ ╱ ╱ + ╲ ╲ ╲ │ ╱ ╱ ╱ + ╲ ╲ ╲ │ ╱ ╱ ╱ + ╲ ╲ ╲│╱ ╱ ╱ + ╲╲│╱╱ + │ + ✦────────────────────◟▂◞────────────────────✦ diff --git a/themes/hyperclass/files/bin/hyperclass-boarding b/themes/hyperclass/files/bin/hyperclass-boarding new file mode 100755 index 0000000..0ec5b77 --- /dev/null +++ b/themes/hyperclass/files/bin/hyperclass-boarding @@ -0,0 +1,366 @@ +#!/usr/bin/env python3 +"""hyperclass-boarding — print your first-class boarding pass. + +An engraved deco pass card, dealt inline like a receipt: no fullscreen, no +alternate screen, so it stays in the scrollback after you disembark. On a TTY +each line "decrypts" — dim grey scramble resolving left-to-right into brass, +ivory and one cool vein of ice — then the cursor rests just below the card. +Piped, --plain, or NO_COLOR: the finished card prints at once, exit 0. + +Design law of the house: gold is TRIM, never a fill; ice is the technical +readout (the light-years); the rest is tuned to recede. Ctrl-C mid-reveal +still leaves a complete, clean card. +""" +import getpass +import hashlib +import os +import random +import re +import socket +import sys +import time +from datetime import date + +ESC = "\x1b" +RESET = f"{ESC}[0m" +HIDE, SHOW = f"{ESC}[?25l", f"{ESC}[?25h" + +# Gilded Void materials (palette.toml is the single source of truth). +BRASS = (201, 162, 74) # #C9A24A the signature gold — trim only +CHAMPAGNE = (235, 217, 168) # #EBD9A8 the bright chrome, key values +IVORY = (234, 227, 209) # #EAE3D1 body starlight +FG_DIM = (194, 188, 171) # #C2BCAB +GREY = (110, 116, 136) # #6E7488 the engraving that recedes +ICE = (169, 218, 232) # #A9DAE8 the one cool vein — system/technical +EMERALD = (88, 181, 141) # #58B58D status: on time + +# A style is (rgb, bold, italic); None means an unstyled (plain) cell. +def st(rgb, bold=False, italic=False): + return (rgb, bold, italic) + +GREY_S = st(GREY) +GREY_I = st(GREY, italic=True) +IVORY_S = st(IVORY) +DIM_S = st(FG_DIM) +BRASS_S = st(BRASS) +CHAMP_S = st(CHAMPAGNE) +CHAMP_B = st(CHAMPAGNE, bold=True) +ICE_S = st(ICE) +EMERALD_S = st(EMERALD) +SCRAMBLE_S = st(GREY) + +# Geometry — a ~62-col card. Every row is exactly OUTER wide by construction. +OUTER = 62 +INNER = OUTER - 2 # between the ║ / ◆ posts +MARGIN = 2 # generous breathing room; restraint reads expensive +CONTENT = INNER - 2 * MARGIN # 56 — the field bed +LABEL_W = 21 # fits the longest letterspaced label (DESTINATION) +GAP = 3 +VALUE_W = CONTENT - LABEL_W - GAP # 32 + +# Real exoplanets, real-ish distances (light-years). The pilot picks one. +DESTINATIONS = [ + ("Kepler-186f", "582 ly"), + ("TRAPPIST-1e", "40.7 ly"), + ("Proxima Centauri b", "4.24 ly"), + ("55 Cancri e", "41 ly"), + ("HD 189733 b", "64.5 ly"), + ("Gliese 667 Cc", "23.6 ly"), + ("WASP-12b", "1410 ly"), + ("Kepler-452b", "1800 ly"), + ("LHS 1140 b", "49 ly"), + ("K2-18b", "124 ly"), +] +GATE_NAMES = ["AURUM", "LUMEN", "SOLIS", "VESPER", "MERIDIAN", + "HELIOS", "ASTRA", "ORION", "CELESTE", "ZENITH"] +AMENITIES = "lounge access · orrery deck · complimentary starlight" + +# Width-1 deco glyphs for the "decrypting" shimmer — nothing double-width. +SCRAMBLE = "·•✦◆❖─═╌║▌▐▍▊∴" +BARCODE = "█▐▌▊▍" # the strip alphabet +_ANSI_RE = re.compile(r"\x1b\[[0-9;]*[A-Za-z]") + + +def sgr(style): + (r, g, b), bold, italic = style + pre = ("1;" if bold else "") + ("3;" if italic else "") + return f"{ESC}[{pre}38;2;{r};{g};{b}m" + + +def strip_ansi(s): + return _ANSI_RE.sub("", s) + + +# --- cell helpers: a line is a list of (char, style|None) of length OUTER ----- + +def run(text, style): + return [(c, style) for c in text] + + +def pad(n): + return [(" ", None)] * n + + +def letterspace(word): + return " ".join(word) + + +def fit_runs(runs, width): + """Trim styled runs to `width` cells, eliding with … if they overflow.""" + out, used = [], 0 + for text, style in runs: + if used + len(text) <= width: + out.append((text, style)) + used += len(text) + else: + room = width - used + if room > 0: + out.append((text[: max(room - 1, 0)] + "…", style)) + break + return out + + +def center56(cells): + left = (CONTENT - len(cells)) // 2 + return pad(left) + cells + pad(CONTENT - len(cells) - left) + + +def wrap(cells56): + """Post a 56-wide content bed between brass ║ walls with margins.""" + return ([("║", BRASS_S)] + pad(MARGIN) + cells56 + + pad(MARGIN) + [("║", BRASS_S)]) + + +def border(): + # Champagne corner diamonds, brass double rule between. + return [("◆", CHAMP_S)] + run("═" * INNER, BRASS_S) + [("◆", CHAMP_S)] + + +def blank(): + return [("║", BRASS_S)] + pad(INNER) + [("║", BRASS_S)] + + +def divider(): + # A thin brass hairline with a champagne diamond at its heart. + left = (CONTENT - 1) // 2 + d = run("─" * left, BRASS_S) + [("◆", CHAMP_S)] + run("─" * (CONTENT - 1 - left), BRASS_S) + return wrap(d) + + +def marquee(): + core = "H Y P E R C L A S S" + tick = [("·", BRASS_S), (" ", None), ("✦", BRASS_S), (" ", None), ("·", BRASS_S)] + seg = tick + pad(3) + run(core, CHAMP_B) + pad(3) + tick + return wrap(center56(seg)) + + +def field(label, value_runs): + lab = letterspace(label) # small-caps, letterspaced + labcells = pad(LABEL_W - len(lab)) + run(lab, GREY_S) # right-aligned + vcells = [] + for text, style in fit_runs(value_runs, VALUE_W): + vcells += run(text, style) + vcells += pad(VALUE_W - len(vcells)) + return wrap(labcells + pad(GAP) + vcells) + + +def barcode(rng): + cells = [] + for _ in range(CONTENT): + if rng.random() < 0.16: + cells.append((" ", None)) # the quiet gaps + else: + cells.append((rng.choice(BARCODE), IVORY_S)) + return wrap(cells) + + +def polite(name, fallback): + """Title-case a login/host into a name fit for the passenger manifest.""" + words = re.sub(r"[._\-]+", " ", name).split() + return " ".join(w.capitalize() for w in words) or fallback + + +def build_card(): + user = getpass.getuser() or "guest" + host = (socket.gethostname() or "starliner").split(".")[0] + user_t = polite(user, "Guest") + host_t = polite(host, "Starliner") + + # Gate is wayfinding, so it stays deterministic per vessel. + h = int(hashlib.sha256(host.encode("utf-8", "replace")).hexdigest(), 16) + gate = f"{GATE_NAMES[h % len(GATE_NAMES)]} {(h // len(GATE_NAMES)) % 12 + 1}" + + dest_name, dist = random.choice(DESTINATIONS) + dep = time.strftime("%H:%M", time.localtime()) + + # Serial + barcode ride the same day-stable seed (date + passenger). + today = date.today().isoformat() + digest = hashlib.sha256(f"{user}|{today}".encode("utf-8", "replace")).hexdigest().upper() + code = f"{digest[:4]}-{digest[4:8]}-{digest[8:10]}" + rng = random.Random(int(digest, 16)) + + passenger = [(user_t, CHAMP_B), ("@", GREY_S), (host_t, DIM_S)] + + lines = [ + border(), + blank(), + marquee(), + blank(), + divider(), + blank(), + field("PASSENGER", passenger), + field("VESSEL", [("GILDED VOID", CHAMP_B)]), + field("CLASS", [("FIRST", CHAMP_B), (" — CABIN 12A", IVORY_S)]), + field("GATE", [(gate, IVORY_S)]), + field("DESTINATION", [(dest_name, CHAMP_B), (" · ", GREY_S), (dist, ICE_S)]), + field("DEPARTURE", [(dep, IVORY_S), (" · ", GREY_S), ("on time", EMERALD_S)]), + field("BAGGAGE", [("weightless", IVORY_S)]), + blank(), + wrap(center56(run(AMENITIES, GREY_I))), + blank(), + divider(), + blank(), + barcode(rng), + wrap(center56(run(f"S E R I A L {code}", GREY_S))), + blank(), + border(), + ] + return lines + + +# --- rendering --------------------------------------------------------------- + +def render_line(cells, color): + if not color: + return "".join(ch for ch, _ in cells) + out, cur = [], object() # sentinel: force a leading style write + for ch, style in cells: + if style != cur: + out.append(RESET) + if style is not None: + out.append(sgr(style)) + cur = style + out.append(ch) + out.append(RESET) + return "".join(out) + + +def emit_instant(lines, color): + parts = ["\n"] + for ln in lines: + parts.append(render_line(ln, color) + "\n") + sys.stdout.write("".join(parts)) + sys.stdout.flush() + + +def animate_line(cells): + """~120ms reveal: dim scramble locking in left-to-right, then resolve.""" + if all(ch == " " for ch, _ in cells): + sys.stdout.write("\n") + sys.stdout.flush() + time.sleep(0.018) + return + n, steps = len(cells), 7 + scramble_pre = RESET + sgr(SCRAMBLE_S) + for s in range(1, steps + 1): + locked = (n * s) // steps + buf = ["\r"] + for i, (ch, style) in enumerate(cells): + if ch == " ": + buf.append(" ") + elif i < locked: + buf.append(RESET + sgr(style) + ch) + else: + buf.append(scramble_pre + random.choice(SCRAMBLE)) + buf.append(RESET) + sys.stdout.write("".join(buf)) + sys.stdout.flush() + time.sleep(0.12 / steps) + sys.stdout.write("\r" + render_line(cells, True) + f"{ESC}[K\n") + sys.stdout.flush() + + +def emit_animated(lines): + sys.stdout.write("\n" + HIDE) + sys.stdout.flush() + completed = 0 + try: + for ln in lines: + animate_line(ln) + completed += 1 + except KeyboardInterrupt: + # Disembarking early still leaves a whole card: finish the rest at once. + buf = ["\r"] + for ln in lines[completed:]: + buf.append(render_line(ln, True) + f"{ESC}[K\n") + sys.stdout.write("".join(buf)) + finally: + sys.stdout.write(RESET + SHOW) + sys.stdout.flush() + + +HELP = """hyperclass-boarding — print your first-class boarding pass. + +usage: hyperclass-boarding [--plain] [--no-anim] + + --plain no colour, no animation (also honoured via NO_COLOR) + --no-anim colour, but print the finished card at once + -h, --help this note + +Not a TTY, --plain, or NO_COLOR set: the finished card prints instantly. +""" + + +def selftest(): + """Every rendered card line must be exactly OUTER visible cells wide.""" + ok = True + for i, ln in enumerate(build_card()): + for colored in (True, False): + vis = strip_ansi(render_line(ln, colored)) + if len(vis) != OUTER: + ok = False + sys.stdout.write(f"line {i} ({'colour' if colored else 'plain'}) " + f"width {len(vis)} != {OUTER}: {vis!r}\n") + sys.stdout.write("selftest OK\n" if ok else "selftest FAIL\n") + return 0 if ok else 1 + + +def main(argv): + if "-h" in argv or "--help" in argv: + sys.stdout.write(HELP) + return 0 + if "--selftest" in argv: + return selftest() + + plain = "--plain" in argv + no_anim = "--no-anim" in argv + no_color = os.environ.get("NO_COLOR") is not None + is_tty = sys.stdout.isatty() + + use_color = is_tty and not plain and not no_color + do_anim = use_color and not no_anim + if do_anim: + # The in-place reveal redraws each row with \r — on a terminal + # narrower than the card, wrapped rows would self-overwrite, so a + # tight cabin gets the finished card dealt instantly instead. + try: + if os.get_terminal_size().columns < OUTER: + do_anim = False + except OSError: + do_anim = False + + lines = build_card() + if do_anim: + emit_animated(lines) + else: + emit_instant(lines, use_color) + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main(sys.argv[1:])) + except KeyboardInterrupt: + # Any late Ctrl-C: leave the terminal as we found it. + sys.stdout.write(RESET + SHOW + "\n") + sys.exit(0) diff --git a/themes/hyperclass/files/bin/hyperclass-orrery b/themes/hyperclass/files/bin/hyperclass-orrery new file mode 100755 index 0000000..fcf5d64 --- /dev/null +++ b/themes/hyperclass/files/bin/hyperclass-orrery @@ -0,0 +1,198 @@ +#!/usr/bin/env python3 +"""hyperclass-orrery — the brass planetarium clock. + +A working orrery in the observation lounge: three bodies circle an ivory +sun on engraved orbit rings, and the orrery IS the clock — the outer brass +giant is the hour hand (12 h), the champagne planet the minute hand, the +swift ice moon sweeps the seconds. Brass ticks at the quarters, Roman +numerals on the bezel. ~15 fps truecolor, quits on any key. Ctrl-C safe. +""" +import math +import os +import select +import shutil +import signal +import sys +import termios +import time +import tty + +# Cabin materials (palette.toml). +BRASS = (201, 162, 74) +CHAMPAGNE = (235, 217, 168) +IVORY = (234, 227, 209) +STARLIGHT = (251, 246, 231) +ICE = (169, 218, 232) +GREY = (110, 116, 136) # comment — the engraving that recedes + +ESC = "\x1b" +HIDE, SHOW = f"{ESC}[?25l", f"{ESC}[?25h" +ALT_ON, ALT_OFF = f"{ESC}[?1049h", f"{ESC}[?1049l" +RESET = f"{ESC}[0m" +ASPECT = 0.5 # cells are ~2x taller than wide + +# (ring radius fraction, period s, glyph, colour, trail dots, trail spacing rad) +ORBITS = ( + (0.42, 60.0, "•", ICE, 9, 0.070), # the seconds moon + (0.70, 3600.0, "◆", CHAMPAGNE, 6, 0.050), # the minutes planet + (0.95, 12 * 3600.0, "●", BRASS, 5, 0.040), # the hours giant +) +NUMERALS = {0: "XII", 3: "III", 6: "VI", 9: "IX"} + + +def dim(colour, k): + return tuple(int(c * k) for c in colour) + + +def fg(colour): + r, g, b = colour + return f"{ESC}[38;2;{r};{g};{b}m" + + +def put(cells, x, y, ch, colour, w, h): + """Plot into a {pos: (ch, colour)} cell map; later plots win.""" + xi, yi = int(round(x)), int(round(y)) + if 0 <= xi < w and 0 <= yi < h - 1: + cells[(yi, xi)] = (ch, colour) + + +def emit(cells): + return "".join(f"{ESC}[{y + 1};{x + 1}H{fg(c)}{ch}" + for (y, x), (ch, c) in cells.items()) + + +def face_geometry(w, h): + cx, cy = w / 2.0, (h - 1) / 2.0 + radius = max(min(cx - 6, (cy - 1.5) / ASPECT) * 0.92, 4.0) + return cx, cy, radius + + +def static_layer(w, h): + """Everything that never moves: stars, bezel, rings, numerals, plate.""" + cells = {} + cx, cy, radius = face_geometry(w, h) + + seed = 0x5DEECE66D # deterministic stars, stable per size + for _ in range(max(12, (w * h) // 240)): + seed = (seed * 6364136223846793005 + 1442695040888963407) & (2**64 - 1) + put(cells, (seed >> 8) % w, (seed >> 32) % h, "·", + dim(IVORY, 0.22 + 0.3 * ((seed >> 48) % 100) / 100), w, h) + + for k in range(96): # the engraved bezel + a = k / 96 * 2 * math.pi - math.pi / 2 + x = cx + radius * math.cos(a) + y = cy + radius * ASPECT * math.sin(a) + if k % 8 == 0: + hour_idx = k // 8 + if hour_idx in NUMERALS: + label = NUMERALS[hour_idx] + nx = cx + (radius + 4.0) * math.cos(a) - len(label) / 2 + 0.5 + # keep VI off the engraved plate row on short terminals + ny = min(cy + (radius * ASPECT + 1.6) * math.sin(a), h - 3) + for i, ch in enumerate(label): + put(cells, nx + i, ny, ch, dim(BRASS, 0.8), w, h) + put(cells, x, y, "◆", dim(BRASS, 0.9), w, h) + elif k % 2 == 0: + put(cells, x, y, "·", dim(GREY, 0.8), w, h) + + for r_frac, *_ in ORBITS[:2]: # quiet dotted inner orbits + r = radius * r_frac + for k in range(0, 72, 2): + a = k / 72 * 2 * math.pi + put(cells, cx + r * math.cos(a), cy + r * ASPECT * math.sin(a), + "·", dim(GREY, 0.5), w, h) + + plate = "H Y P E R C L A S S · O R R E R Y" + for i, ch in enumerate(plate): + put(cells, cx - len(plate) / 2 + 0.5 + i, h - 2, ch, dim(BRASS, 0.75), w, h) + note = "any key disembarks" + for i, ch in enumerate(note): + put(cells, w - len(note) - 2 + i, h - 2, ch, dim(GREY, 0.7), w, h) + return cells + + +def dynamic_layer(w, h, now): + """The moving parts: sun pulse, three bodies with wakes, the timestamp.""" + cells = {} + cx, cy, radius = face_geometry(w, h) + + pulse = 0.75 + 0.25 * math.sin(now * 1.8) # the sun breathes + for hx, hy in ((-2, 0), (2, 0), (0, -1), (0, 1)): + put(cells, cx + hx, cy + hy, "·", dim(CHAMPAGNE, 0.55 * pulse), w, h) + put(cells, cx, cy, "☉", dim(STARLIGHT, 0.8 + 0.2 * pulse), w, h) + + lt = time.localtime(now) + hands = ( + now % 60.0, # smooth seconds sweep + lt.tm_min * 60 + lt.tm_sec, + (lt.tm_hour % 12) * 3600 + lt.tm_min * 60 + lt.tm_sec, + ) + for (r_frac, period, glyph, colour, trail, spacing), t_val in zip(ORBITS, hands): + r = radius * r_frac + # clock convention: 12 is up, hands sweep clockwise + a = (t_val % period) / period * 2 * math.pi - math.pi / 2 + for i in range(trail, 0, -1): # wake astern + ta = a - i * spacing + put(cells, cx + r * math.cos(ta), cy + r * ASPECT * math.sin(ta), + "·", dim(colour, max(0.55 * (1 - i / (trail + 1)), 0.14)), w, h) + put(cells, cx + r * math.cos(a), cy + r * ASPECT * math.sin(a), + glyph, colour, w, h) + + stamp = time.strftime("%H:%M:%S", lt) + " · ship time" + for i, ch in enumerate(stamp): + put(cells, 2 + i, h - 2, ch, dim(GREY, 0.9), w, h) + return cells + + +def main(): + fd = sys.stdin.fileno() + old = termios.tcgetattr(fd) + + def _term(*_): # SIGTERM lands in the same restore path + raise KeyboardInterrupt + signal.signal(signal.SIGTERM, _term) + + sys.stdout.write(ALT_ON + HIDE) + prev_dynamic, static_cells, size = {}, None, (0, 0) + try: + tty.setcbreak(fd) + while True: + w, h = shutil.get_terminal_size() + if (w, h) != size: + size = (w, h) + static_cells = static_layer(w, h) + sys.stdout.write(f"{ESC}[2J" + emit(static_cells)) + prev_dynamic = {} + dyn = dynamic_layer(w, h, time.time()) + out = [] + for pos in prev_dynamic: # heal what the hands crossed + if pos in dyn: + continue + y, x = pos + if pos in static_cells: + ch, c = static_cells[pos] + out.append(f"{ESC}[{y + 1};{x + 1}H{fg(c)}{ch}") + else: + out.append(f"{ESC}[{y + 1};{x + 1}H ") + out.append(emit(dyn)) + sys.stdout.write("".join(out) + RESET) + sys.stdout.flush() + prev_dynamic = dyn + # ~15 fps, and any key ends the observation + r, _, _ = select.select([sys.stdin], [], [], 1 / 15) + if r: + os.read(fd, 64) + return + except KeyboardInterrupt: + pass + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old) + sys.stdout.write(RESET + SHOW + ALT_OFF) + sys.stdout.flush() + + +if __name__ == "__main__": + if not sys.stdout.isatty() or not sys.stdin.isatty(): + print("hyperclass-orrery needs a TTY (it draws full-screen).") + sys.exit(0) + main() diff --git a/themes/hyperclass/files/bin/hyperclass-warp b/themes/hyperclass/files/bin/hyperclass-warp new file mode 100755 index 0000000..4f19522 --- /dev/null +++ b/themes/hyperclass/files/bin/hyperclass-warp @@ -0,0 +1,244 @@ +#!/usr/bin/env python3 +"""hyperclass-warp — engage hyperspace from the first-class cabin. + +A fullscreen truecolor warp: stars are born at the vanishing point (a touch +above centre), accelerate radially outward on perspective rails and draw +lengthening streaks as they gather speed. Two seconds of unhurried drift, then +the jump — and it holds. Any key disembarks. Ctrl-C (and SIGTERM) safe. +""" +import math +import os +import random +import select +import shutil +import signal +import sys +import termios +import time +import tty + +# Gilded Void materials (palette.toml is the single source of truth). +IVORY = (234, 227, 209) # #EAE3D1 body starlight, the common star +STARLIGHT = (251, 246, 231) # #FBF6E7 its brightest grade +CHAMPAGNE = (235, 217, 168) # #EBD9A8 ~25% of the field +BRASS = (201, 162, 74) # #C9A24A the signature gold — trim, ~10%, never a fill +ICE = (169, 218, 232) # #A9DAE8 the one cool vein — rare, ~4% +GREY = (110, 116, 136) # #6E7488 engraving that recedes + +ESC = "\x1b" +HIDE, SHOW = f"{ESC}[?25l", f"{ESC}[?25h" +ALT_ON, ALT_OFF = f"{ESC}[?1049h", f"{ESC}[?1049l" +CLEAR = f"{ESC}[2J" +RESET = f"{ESC}[0m" + +FPS = 30.0 +ASPECT = 0.55 # cells are ~2x taller than wide — squash y so the void reads round +ZMAX = 5.0 # the far plane; new stars are born here, near the vanishing point +ZNEAR = 0.34 # past this a star has flown by the porthole — recycle it +DRIFT = 0.45 # gentle approach (depth units/s) before the jump +WARP = 5.6 # the money shot +JUMP_AT = 2.0 # seconds of drift before... +JUMP_DUR = 0.7 # ...easing up to full warp +STREAK_MAX = 12 # longest trail we bother drawing +LIT_CAP = 440 # cap lit cells per frame for speed (closest stars win the budget) + + +def fg(col): + return f"{ESC}[38;2;{col[0]};{col[1]};{col[2]}m" + + +def dim(col, k): + return (int(col[0] * k), int(col[1] * k), int(col[2] * k)) + + +def blend(a, b, t): + return tuple(int(a[i] + (b[i] - a[i]) * t) for i in range(3)) + + +def new_star(z=ZMAX): + """A star as [ux, uy, z, prev_px, prev_py, colour, point_glyph]. + + ux/uy fix its heading on the view plane; dividing by z gives perspective, so + a shrinking z races the star outward along a straight radial from centre.""" + while True: + ux = random.uniform(-1.0, 1.0) + uy = random.uniform(-1.0, 1.0) + if ux * ux + uy * uy > 0.0025: # keep a dead zone off the exact vanishing point + break + r = random.random() + if r < 0.04: + col = ICE + elif r < 0.14: + col = BRASS + elif r < 0.39: + col = CHAMPAGNE + else: + col = blend(IVORY, STARLIGHT, random.random()) + return [ux, uy, z, None, None, col, "✦" if random.random() < 0.6 else "*"] + + +def make_field(w, h): + n = max(40, min((w * h) // 160, 230)) + # scatter starting depths so the void is already full when the doors open + return [new_star(random.uniform(0.9, ZMAX)) for _ in range(n)] + + +def geometry(w, h): + cx = w / 2.0 + cy = h * 0.44 # vanishing point sits a touch above centre + sx = w * 0.55 + return cx, cy, sx, sx * ASPECT + + +def project(s, cx, cy, sx, sy): + return cx + (s[0] / s[2]) * sx, cy + (s[1] / s[2]) * sy + + +def put(cells, x, y, ch, col, w, h): + xi, yi = int(round(x)), int(round(y)) + if 0 <= xi < w and 0 <= yi < h: + cells[(yi, xi)] = (ch, col) + + +def orient(dx, dy): + """The streak glyph, aligned to the cell path (terminal y runs downward).""" + ax, ay = abs(dx), abs(dy) + if ay <= 0.4 * ax: + return "─" + if ax <= 0.4 * ay: + return "│" + return "╱" if (dx > 0) != (dy > 0) else "╲" + + +def warp_v(t): + if t < JUMP_AT: + return DRIFT + if t < JUMP_AT + JUMP_DUR: + p = (t - JUMP_AT) / JUMP_DUR + return DRIFT + (WARP - DRIFT) * (p * p * (3 - 2 * p)) # smoothstep into the jump + return WARP + + +def advance(stars, v, dt, w, h, cx, cy, sx, sy): + """Pull every star one step closer; recycle any that have flown past.""" + m = 3 + for i, s in enumerate(stars): + s[2] -= v * dt + if s[2] <= ZNEAR: + stars[i] = new_star() + continue + px, py = project(s, cx, cy, sx, sy) + if px < -m or px > w + m or py < -m or py > h + m: + stars[i] = new_star() + + +def render(stars, w, h, cx, cy, sx, sy): + cells = {} + stars.sort(key=lambda s: s[2]) # closest first — the big streaks make the cap + full = False + for s in stars: + px, py = project(s, cx, cy, sx, sy) + if s[3] is None: # freshly spawned: no trail on its first frame + s[3], s[4] = px, py + ppx, ppy = s[3], s[4] + dx, dy = px - ppx, py - ppy + dist = math.hypot(dx, dy) + closeness = max(0.0, min((ZMAX - s[2]) / (ZMAX - 1.0), 1.0)) + k = 0.30 + 0.70 * closeness # dim near the vanishing point, bright at the rim + if not full: + if dist < 0.9: # too slow to streak: a single point of light + if closeness < 0.34: + put(cells, px, py, "·", dim(s[5], 0.30 + 0.35 * closeness), w, h) + else: + put(cells, px, py, s[6], dim(s[5], k), w, h) + else: + g = orient(dx, dy) + n = min(int(dist) + 1, STREAK_MAX) + for j in range(n): # tail (dim) astern → head (bright) at the star + f = j / (n - 1) if n > 1 else 1.0 + put(cells, ppx + dx * f, ppy + dy * f, + g, dim(s[5], k * (0.20 + 0.80 * f)), w, h) + if len(cells) >= LIT_CAP: + full = True + s[3], s[4] = px, py # advance the trail anchor even past the cap + return cells + + +def footer(cells, w, h): + """A faint engraved plate — brass hairline text that the void shows through.""" + if h < 6 or w < 34: + return + plate = "H Y P E R C L A S S · H Y P E R S P A C E" + if len(plate) <= w - 4: + x0 = (w - len(plate)) // 2 + for i, ch in enumerate(plate): + if ch != " ": + cells[(h - 2, x0 + i)] = (ch, dim(BRASS, 0.55)) + note = "any key to disembark" + if len(note) <= w - 4: + for i, ch in enumerate(note): + if ch != " ": + cells[(h - 1, 2 + i)] = (ch, dim(GREY, 0.7)) + + +def main(): + fd = sys.stdin.fileno() + old = termios.tcgetattr(fd) + + def _term(*_): # SIGTERM lands in the same restore path as a key + raise KeyboardInterrupt + signal.signal(signal.SIGTERM, _term) + + sys.stdout.write(ALT_ON + HIDE) + sys.stdout.flush() + stars, size, prev = [], (0, 0), {} + t0 = last = time.monotonic() + try: + tty.setcbreak(fd) + while True: + now = time.monotonic() + w, h = shutil.get_terminal_size() + cx, cy, sx, sy = geometry(w, h) + if (w, h) != size: # boarding or resize: fresh void, clear once + size = (w, h) + stars = make_field(w, h) + sys.stdout.write(CLEAR) + prev = {} + dt = min(now - last, 0.1) # clamp so a stall or resize can't teleport stars + last = now + v = warp_v(now - t0) + advance(stars, v, dt, w, h, cx, cy, sx, sy) + cells = render(stars, w, h, cx, cy, sx, sy) + footer(cells, w, h) + + out = [f"{ESC}[H"] + for pos in prev: # heal the cells that went dark this frame + if pos not in cells: + y, x = pos + out.append(f"{ESC}[{y + 1};{x + 1}H ") + for (y, x), (ch, c) in cells.items(): + out.append(f"{ESC}[{y + 1};{x + 1}H{fg(c)}{ch}") + out.append(RESET) + sys.stdout.write("".join(out)) + sys.stdout.flush() + prev = cells + + # pace to ~30 fps; any key ends the jump + budget = 1.0 / FPS - (time.monotonic() - now) + r, _, _ = select.select([sys.stdin], [], [], max(budget, 0.0)) + if r: + os.read(fd, 64) + return + except KeyboardInterrupt: + pass + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old) + sys.stdout.write(RESET + SHOW + ALT_OFF) + sys.stdout.flush() + + +if __name__ == "__main__": + if not sys.stdout.isatty() or not sys.stdin.isatty(): + print("hyperclass-warp needs a TTY — it engages the whole screen.") + sys.exit(0) + main() diff --git a/themes/hyperclass/files/btop/btop.conf b/themes/hyperclass/files/btop/btop.conf new file mode 100644 index 0000000..8cd04cc --- /dev/null +++ b/themes/hyperclass/files/btop/btop.conf @@ -0,0 +1,35 @@ +#? Config file for btop v.1.4.7 — HYPERCLASS Gilded Void. +#? btop fills in any option not listed here with its default and rewrites +#? this file on exit; only the settings the theme cares about are pinned. + +#* The engraved brass instrument panel (generated from palette.toml). +color_theme = "hyperclass" + +#* False so the terminal's glass (opacity + blur) shows through the gauges. +theme_background = false + +#* The palette is authored in 24-bit; never quantise the brass. +truecolor = true + +#* Rounded bezels on the gauge boxes, like every good instrument cluster. +rounded_corners = true + +#* Braille graphs: the finest engraving line available in a font. +graph_symbol = "braille" + +#* All four gauges on the panel: engines, reserves, comms, manifest. +shown_boxes = "cpu mem net proc" + +#* An unhurried sweep — first class does not fidget. +update_ms = 1500 + +#* Processes as a tree, sorted by hunger. +proc_tree = false +proc_sorting = "cpu lazy" +proc_gradient = true + +#* Battery meter for those riding coach (laptops). +show_battery = true + +#* Celsius, as on all civilised vessels. +temp_scale = "celsius" diff --git a/themes/hyperclass/files/btop/hyperclass.theme b/themes/hyperclass/files/btop/hyperclass.theme new file mode 100644 index 0000000..5741d4c --- /dev/null +++ b/themes/hyperclass/files/btop/hyperclass.theme @@ -0,0 +1,54 @@ +# HYPERCLASS — Gilded Void — generated by gtheme btop theme. + +theme[main_bg]="#12151F" +theme[main_fg]="#EAE3D1" +theme[title]="#FBF6E7" +theme[hi_fg]="#C9A24A" +theme[selected_bg]="#2A3046" +theme[selected_fg]="#FBF6E7" +theme[inactive_fg]="#6E7488" +theme[graph_text]="#C2BCAB" +theme[meter_bg]="#232838" +theme[proc_misc]="#E9CD8A" + +theme[cpu_box]="#232838" +theme[mem_box]="#232838" +theme[net_box]="#232838" +theme[proc_box]="#232838" +theme[div_line]="#232838" + +theme[temp_start]="#86C28F" +theme[temp_mid]="#D9B45C" +theme[temp_end]="#E2707F" + +theme[cpu_start]="#8FC6D8" +theme[cpu_mid]="#D98E48" +theme[cpu_end]="#E2707F" + +theme[free_start]="#86C28F" +theme[free_mid]="#6b9b72" +theme[free_end]="#507456" + +theme[cached_start]="#85ABE3" +theme[cached_mid]="#6a89b6" +theme[cached_end]="#506788" + +theme[available_start]="#7CC5CE" +theme[available_mid]="#639ea5" +theme[available_end]="#4a767c" + +theme[used_start]="#86C28F" +theme[used_mid]="#D9B45C" +theme[used_end]="#E2707F" + +theme[download_start]="#C9A24A" +theme[download_mid]="#a2b48c" +theme[download_end]="#7CC5CE" + +theme[upload_start]="#B79BE0" +theme[upload_mid]="#cc86b0" +theme[upload_end]="#E2707F" + +theme[process_start]="#8FC6D8" +theme[process_mid]="#C9A24A" +theme[process_end]="#E9CD8A" diff --git a/themes/hyperclass/files/burn-my-windows/hyperclass.conf b/themes/hyperclass/files/burn-my-windows/hyperclass.conf new file mode 100644 index 0000000..d19171e --- /dev/null +++ b/themes/hyperclass/files/burn-my-windows/hyperclass.conf @@ -0,0 +1,23 @@ +# HYPERCLASS — Gilded Void profile for the Burn My Windows GNOME extension. +# Windows arrive and depart through a champagne hexagon lattice — the airlock +# iris. GLib keyfile read by the extension's GSettings keyfile backend; the +# gtheme manifest points the extension's `active-profile` dconf key here. +# +# BMW picks RANDOMLY among all enabled effects, so exactly one may be true — +# fire defaults to true in the extension's schema and must be pinned false. +[burn-my-windows-profile] +profile-app='' +profile-animation-type=0 +profile-window-type=0 +profile-color-scheme=0 +profile-power-mode=0 +profile-power-profile=0 +profile-high-priority=false +fire-enable-effect=false +hexagon-enable-effect=true +hexagon-animation-time=750 +hexagon-scale=2.0 +hexagon-line-width=1.5 +hexagon-line-color='rgba(235, 217, 168, 0.62)' +hexagon-glow-color='rgba(201, 162, 74, 0.35)' +hexagon-additive-blending=true diff --git a/themes/hyperclass/files/cava/config b/themes/hyperclass/files/cava/config new file mode 100644 index 0000000..0c7b77d --- /dev/null +++ b/themes/hyperclass/files/cava/config @@ -0,0 +1,30 @@ +# HYPERCLASS — Gilded Void cava config. +# The lounge band's VU meter: bars rise from brass through champagne to +# ivory foam. Requires cava >= 0.10 (integer noise_reduction; older cava +# wants the 0.77 float form and an explicit gradient_count). + +[general] +framerate = 60 +bars = 0 +bar_width = 2 +bar_spacing = 1 +sleep_timer = 3 + +[output] +method = ncurses +channels = stereo + +[color] +# cava counts the gradient stops itself — five are defined below. +gradient = 1 +# brass -> old gold -> champagne -> pearl -> ivory +gradient_color_1 = '#C9A24A' +gradient_color_2 = '#D9BC6E' +gradient_color_3 = '#EBD9A8' +gradient_color_4 = '#F3E8C8' +gradient_color_5 = '#FBF6E7' + +[smoothing] +noise_reduction = 77 +monstercat = 1 +waves = 0 diff --git a/themes/hyperclass/files/fastfetch/config.jsonc b/themes/hyperclass/files/fastfetch/config.jsonc new file mode 100644 index 0000000..223e0d7 --- /dev/null +++ b/themes/hyperclass/files/fastfetch/config.jsonc @@ -0,0 +1,83 @@ +// ── HYPERCLASS ─ fastfetch ───────────────────────────────────────── +// Gilded Void · champagne brass on deep-space ink · one vein of ice. +// Install both halves: ~/.config/fastfetch/config.jsonc +// ~/.config/fastfetch/hyperclass-logo.txt +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + + "logo": { + "type": "file", + "source": "~/.config/fastfetch/hyperclass-logo.txt", + // $1..$5 in the emblem land here. SGR truecolor so the brass never quantises. + "color": { + "1": "38;2;201;162;74", // brass — hull trim & glyphs + "2": "38;2;235;217;168", // champagne — sunburst rays / sheen + "3": "38;2;169;218;232", // ice — the lit viewport, the one cool vein + "4": "38;2;110;116;136", // grey-blue — recessed rays + "5": "38;2;234;227;209" // ivory — starlight + }, + "padding": { "top": 1, "left": 2, "right": 4 } + }, + + "display": { + // Generous spacing reads expensive; the cabin is never cramped. + "separator": " ", + "key": { "width": 14 }, + "color": { + "keys": "38;2;201;162;74", // brass — every label is trim, not fill + "output": "38;2;234;227;209" // warm ivory values + }, + "percent": { + "type": 3, // hairline gauge + number + "color": { + "green": "38;2;88;181;141", // emerald + "yellow": "38;2;217;142;72", // muted amber (kept clear of the gold) + "red": "38;2;226;112;127" // velvet rose + } + }, + "bar": { + // nested char/border options need fastfetch >= 2.50 (older releases + // used flat charElapsed/borderLeft keys and will ignore these) + "width": 10, + "char": { "elapsed": "━", "total": "─" }, // one engraved rule, filled vs bare + "border": { "left": "", "right": "" }, + "color": { + "elapsed": "38;2;169;218;232", // ice — a system readout glows cool + "total": "38;2;110;116;136" // recessed track + } + } + }, + + "modules": [ + { + "type": "title", + // user@host — champagne guest · ash at-sign · brass vessel name + "color": { "user": "38;2;235;217;168", "at": "38;2;110;116;136", "host": "38;2;201;162;74" } + }, + { + "type": "separator", + "string": "─", // a single brass hairline — the deco divider + "outputColor": "38;2;201;162;74" + }, + { "type": "os", "key": " OS" }, + { "type": "host", "key": " VESSEL" }, + { "type": "kernel", "key": " KERNEL" }, + { "type": "uptime", "key": " EN ROUTE" }, + { "type": "packages", "key": " PACKAGES" }, + { "type": "shell", "key": " SHELL" }, + { "type": "de", "key": " DESKTOP" }, + { "type": "wm", "key": " HELM" }, + { "type": "terminal", "key": " CABIN" }, + { "type": "font", "key": " FONT" }, + { "type": "cpu", "key": " CPU", "temp": true }, + { "type": "gpu", "key": " GPU", "temp": true }, + { "type": "memory", "key": "󰍛 MEMORY" }, + { "type": "disk", "key": " DISK" }, + "break", + { + "type": "colors", + "symbol": "circle", + "paddingLeft": 2 + } + ] +} diff --git a/themes/hyperclass/files/fastfetch/hyperclass-logo.txt b/themes/hyperclass/files/fastfetch/hyperclass-logo.txt new file mode 100644 index 0000000..15eaef9 --- /dev/null +++ b/themes/hyperclass/files/fastfetch/hyperclass-logo.txt @@ -0,0 +1,16 @@ +$5 ✦ $4·$5 ✦ +$2 ✧$4 ╲ │ ╱$2 ✧ +$4 ╲ ╲ $2│$4 ╱ ╱ +$4 ╲ ╲ $1▟▙$4 ╱ ╱ +$2 ▟$1████$2▙ +$1 ▟██████▙ +$1 ████████ +$1 ██$3▬▬▬▬$1██ +$1 ████████ +$1 ▐██████▌ +$4 ╱ $1▐██████▌$4 ╲ +$4 ╱ ╱ $1▜████▛$4 ╲ ╲ +$4 ╱ ╱ $1▝▙▟▟▘$4 ╲ ╲ +$5 ✦ $4·$5 $4·$5 ✦ +$2 ✦ $1──────────────── $2✦ +$1 『 $2G I L D E D V O I D $1』 diff --git a/themes/hyperclass/files/fish/config.fish b/themes/hyperclass/files/fish/config.fish new file mode 100644 index 0000000..8c29827 --- /dev/null +++ b/themes/hyperclass/files/fish/config.fish @@ -0,0 +1,119 @@ +# CachyOS-only base config; guarded so it doesn't error on other distros. +test -f /usr/share/cachyos-fish-config/cachyos-config.fish +and source /usr/share/cachyos-fish-config/cachyos-config.fish + +fish_add_path "$HOME/.local/bin" + +# ────────────────────────────────────────────────────────────── +# HYPERCLASS — Gilded Void +# champagne brass on deep-space ink · one vein of ice +# loaded after CachyOS config +# ────────────────────────────────────────────────────────────── + +# Greeting — a small boarding-lounge card + one random quote +# (overrides the CachyOS fastfetch greeting; run `fastfetch` manually) +function fish_greeting + set_color C9A24A + echo ' ✦ ═══════════════════════ ✦' + set_color --bold EBD9A8 + echo ' 『 G I L D E D V O I D 』' + set_color C9A24A + echo ' ◆ ─────────────────────── ◆' + set_color normal + set_color --italics 6E7488 + echo ' now boarding — first class to anywhere.' + set_color normal + set -l qf $HOME/.local/share/gtheme/assets/hyperclass/ascii/quotes.txt + if test -r $qf + set -l line (shuf -n1 $qf 2>/dev/null) + if test -n "$line" + set -l parts (string split --max 1 ' — ' -- $line) + echo + set_color --italics 6E7488 + echo -n ' “'$parts[1]'”' + if set -q parts[2] + set_color C9A24A + echo -n ' — '$parts[2] + end + set_color normal + echo + end + end +end + +# Starship prompt (defined last so it wins the prompt) +if type -q starship + starship init fish | source +end + +# bat — follows the terminal's Gilded Void ANSI palette +set -gx BAT_THEME "ansi" +if type -q bat + alias cat='bat --style=plain --paging=never' + alias catn='bat' # cat with line numbers + git gutter + function help --description 'colorized --help' + $argv --help 2>&1 | bat --plain --language=help + end +end + +# fd preferred over find; eza tree shortcut (ls/la/ll/lt come from CachyOS) +type -q fd; and alias find='fd' +type -q eza; and alias tree='eza --tree --icons --group-directories-first' + +# eza icons everywhere +set -gx EZA_ICONS_AUTO 1 + +# micro — render exact Gilded Void hex colors +set -gx MICRO_TRUECOLOR 1 + +# fzf — Gilded Void palette: brass trim on ink, one vein of ice for the header +set -gx FZF_DEFAULT_OPTS "\ +--height 60% --layout=reverse --border rounded --margin=1 --padding=1 \ +--color=bg:#12151F,fg:#EAE3D1,bg+:#2A3046,fg+:#FBF6E7 \ +--color=hl:#C9A24A,hl+:#E9CD8A,prompt:#C9A24A,pointer:#C9A24A \ +--color=marker:#EBD9A8,info:#6E7488,header:#8FC6D8,border:#232838 \ +--color=spinner:#EBD9A8 \ +--prompt='✦ ' --pointer='❯' --marker='◆' --separator='─' --scrollbar='│'" +type -q fd; and set -gx FZF_DEFAULT_COMMAND 'fd --hidden --strip-cwd-prefix --exclude .git' + +# fish syntax highlighting — Gilded Void palette +set -g fish_color_command C9A24A --bold +set -g fish_color_keyword B79BE0 +set -g fish_color_quote EBD9A8 +set -g fish_color_error E2707F +set -g fish_color_param EAE3D1 +set -g fish_color_comment 6E7488 --italics +set -g fish_color_operator 8FC6D8 +set -g fish_color_end B79BE0 +set -g fish_color_autosuggestion 6E7488 +set -g fish_color_valid_path A9DAE8 --underline +set -g fish_color_selection --background=2A3046 +set -g fish_color_search_match --background=2A3046 + +# completion pager — Gilded Void +set -g fish_pager_color_progress 12151F --background=C9A24A +set -g fish_pager_color_prefix C9A24A +set -g fish_pager_color_description 6E7488 + +# Cabin service — Gilded Void terminal toys +function orrery --description 'the brass planetarium clock (any key quits)' + $HOME/.local/share/gtheme/assets/hyperclass/bin/hyperclass-orrery $argv +end + +function warp --description 'engage hyperspace (any key quits)' + $HOME/.local/share/gtheme/assets/hyperclass/bin/hyperclass-warp $argv +end + +function boarding --description 'print your boarding pass' + $HOME/.local/share/gtheme/assets/hyperclass/bin/hyperclass-boarding $argv +end + +function lounge --description 'the house band (cava)' + if type -q cava + cava + else + set_color --italics 6E7488 + echo ' the house band is not aboard this voyage — install cava.' + set_color normal + end +end diff --git a/themes/hyperclass/files/gtk/gtk.css b/themes/hyperclass/files/gtk/gtk.css new file mode 100644 index 0000000..aa96086 --- /dev/null +++ b/themes/hyperclass/files/gtk/gtk.css @@ -0,0 +1,13 @@ +/* HYPERCLASS — Gilded Void — generated by gtheme. libadwaita / GTK4 accent override. */ +:root { + --accent-bg-color: #C9A24A; + /* text ON accent-filled widgets: both bundled accents are mid-light, so the + theme's own dark bg is the readable pairing (ivory-on-accent is ~2.2:1) */ + --accent-fg-color: #12151F; + --accent-color: #E9CD8A; +} + +/* GTK3 fallback */ +@define-color accent_color #E9CD8A; +@define-color accent_bg_color #C9A24A; +@define-color accent_fg_color #12151F; diff --git a/themes/hyperclass/files/micro/hyperclass.micro b/themes/hyperclass/files/micro/hyperclass.micro new file mode 100644 index 0000000..c5d409b --- /dev/null +++ b/themes/hyperclass/files/micro/hyperclass.micro @@ -0,0 +1,54 @@ +# HYPERCLASS — Gilded Void — generated by gtheme micro colorscheme. + +color-link default "#EAE3D1,#12151F" +color-link comment "italic #6E7488" +color-link ignore "#6E7488" + +color-link identifier "#EAE3D1" +color-link identifier.class "#85ABE3" +color-link identifier.var "#EAE3D1" + +color-link constant "#D9B45C" +color-link constant.number "#EDCD82" +color-link constant.string "#86C28F" + +color-link symbol "#C9A24A" +color-link symbol.operator "#C9A24A" +color-link symbol.brackets "#C2BCAB" +color-link symbol.tag "#F18E9B" + +color-link type "#85ABE3" +color-link type.keyword "#B79BE0" +color-link type.extended "default" + +color-link special "#B79BE0" +color-link statement "#B79BE0" +color-link preproc "#7CC5CE" + +color-link underlined "underline #7CC5CE" +color-link error "bold #F18E9B" +color-link todo "bold #EDCD82" + +color-link diff-added "#86C28F" +color-link diff-modified "#D9B45C" +color-link diff-deleted "#E2707F" + +color-link gutter-error "#F18E9B" +color-link gutter-warning "#EDCD82" + +color-link statusline "#EAE3D1,#232838" +color-link tabbar "#EAE3D1,#232838" +color-link indent-char "#232838" +color-link line-number "#6E7488,#12151F" +color-link current-line-number "#C9A24A,#12151F" + +color-link cursor-line "#1A1E2C" +color-link color-column "#1A1E2C" +color-link match-brace "#12151F,#D98E48" +color-link selection "#EAE3D1,#2A3046" +color-link hlsearch "#12151F,#D98E48" + +color-link divider "#232838" +color-link scrollbar "#6E7488" +color-link message "#EAE3D1,#12151F" +color-link error-message "bold #F18E9B,#12151F" diff --git a/themes/hyperclass/files/micro/settings.json b/themes/hyperclass/files/micro/settings.json new file mode 100644 index 0000000..3cca9f3 --- /dev/null +++ b/themes/hyperclass/files/micro/settings.json @@ -0,0 +1,3 @@ +{ + "colorscheme": "hyperclass" +} diff --git a/themes/hyperclass/files/ptyxis/Hyperclass.palette b/themes/hyperclass/files/ptyxis/Hyperclass.palette new file mode 100644 index 0000000..4da3ff9 --- /dev/null +++ b/themes/hyperclass/files/ptyxis/Hyperclass.palette @@ -0,0 +1,64 @@ +# HYPERCLASS — Gilded Void — generated by gtheme from palette.toml. + +[Palette] +Name=Hyperclass + +[Dark] +Foreground=#EAE3D1 +Background=#12151F +Cursor=#C9A24A +CursorForeground=#12151F +TitlebarBackground=#1A1E2C +TitlebarForeground=#EAE3D1 +BellBackground=#D98E48 +BellForeground=#12151F +SuperuserBackground=#C9A24A +SuperuserForeground=#12151F +RemoteBackground=#232838 +RemoteForeground=#EAE3D1 +Color0=#242A3C +Color1=#E2707F +Color2=#86C28F +Color3=#D9B45C +Color4=#85ABE3 +Color5=#B79BE0 +Color6=#7CC5CE +Color7=#D3CDBE +Color8=#6E7488 +Color9=#F18E9B +Color10=#A3D8A9 +Color11=#EDCD82 +Color12=#A6C4F2 +Color13=#CFB6EF +Color14=#9ADEE6 +Color15=#FBF6E7 + +[Light] +Foreground=#12151F +Background=#FBF6E7 +Cursor=#C9A24A +CursorForeground=#12151F +TitlebarBackground=#EAE3D1 +TitlebarForeground=#12151F +BellBackground=#D98E48 +BellForeground=#12151F +SuperuserBackground=#C9A24A +SuperuserForeground=#12151F +RemoteBackground=#EAE3D1 +RemoteForeground=#12151F +Color0=#242A3C +Color1=#cb6572 +Color2=#72a57a +Color3=#b8994e +Color4=#7191c1 +Color5=#9c84be +Color6=#69a7af +Color7=#6E7488 +Color8=#6E7488 +Color9=#E2707F +Color10=#86C28F +Color11=#D9B45C +Color12=#85ABE3 +Color13=#B79BE0 +Color14=#7CC5CE +Color15=#242A3C diff --git a/themes/hyperclass/files/shell/hyperclass-emblem.svg b/themes/hyperclass/files/shell/hyperclass-emblem.svg new file mode 100644 index 0000000..deac644 --- /dev/null +++ b/themes/hyperclass/files/shell/hyperclass-emblem.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/hyperclass/files/starship.toml b/themes/hyperclass/files/starship.toml new file mode 100644 index 0000000..33c7ab5 --- /dev/null +++ b/themes/hyperclass/files/starship.toml @@ -0,0 +1,120 @@ +# HYPERCLASS — Gilded Void prompt. +# Two lines, no powerline pills: gold is trim, not fill. Line 1 is the +# instrument readout (where you are, what's checked out, what's running, +# how long the last command took); line 2 is a single engraved chevron. +# Font: Iosevka Nerd Font (complete build — Powerline, Seti-UI and Devicons +# glyph sets are all present in every "complete" Nerd Font release). + +"$schema" = 'https://starship.rs/config-schema.json' + +# No network-dependent modules; keep the readout instant. +command_timeout = 500 +scan_timeout = 30 +add_newline = true + +palette = 'hyperclass' + +format = """ +$username\ +$hostname\ +$directory\ +$git_branch\ +$git_status\ +$nodejs\ +$python\ +$rust\ +$golang\ +$cmd_duration\ +$line_break\ +$character""" + +# Ship's clock, starboard side — the one thing that always shows. +right_format = """$time""" + +[palettes.hyperclass] +accent = '#C9A24A' # champagne brass — trim only, never a fill +ice = '#A9DAE8' # the one cool vein: technical chrome +info = '#8FC6D8' # a shade further into the vein, for git's readout +warn = '#D98E48' # muted amber, distinct from the gold +error = '#E2707F' # velvet rose +comment = '#6E7488' # recessed grey-blue +platinum = '#C3C8D4' # hull metal — only surfaces over SSH + +[username] +disabled = false +show_always = false # root or a foreign login only — otherwise silent +style_user = 'fg:platinum' +style_root = 'bold fg:platinum' +format = '[$user]($style)' + +[hostname] +ssh_only = true # the starliner only announces the vessel name in transit +style = 'fg:platinum' +format = '[@$hostname ]($style)' +trim_at = '.' + +[directory] +style = 'bold fg:accent' +format = '[$path]($style)[$read_only]($read_only_style)' +truncation_length = 3 +truncation_symbol = '…/' +truncate_to_repo = true +read_only = ' ◆' +read_only_style = 'fg:comment' + +[git_branch] +symbol = '' +style = 'fg:info' +format = '[ ╌ $symbol $branch]($style)' + +[git_status] +style = 'fg:warn' +format = '[( $all_status$ahead_behind)]($style)' +conflicted = '✕${count}' +ahead = '↑${count}' +behind = '↓${count}' +diverged = '↕${count}' +up_to_date = '' +untracked = '?${count}' +stashed = '✦${count}' +modified = '~${count}' +staged = '+${count}' +renamed = '»${count}' +deleted = '-${count}' + +# Toolchain readouts — only surface in a repo that actually uses them. +[nodejs] +symbol = '' +style = 'fg:ice' +format = '[ · $symbol $version]($style)' + +[python] +symbol = '' +style = 'fg:ice' +format = '[ · $symbol $version]($style)' + +[rust] +symbol = '' +style = 'fg:ice' +format = '[ · $symbol $version]($style)' + +[golang] +symbol = '' +style = 'fg:ice' +format = '[ · $symbol $version]($style)' + +[cmd_duration] +min_time = 2000 +style = 'fg:comment' +format = '[ · $duration adrift]($style)' + +[character] +success_symbol = '[❯](bold fg:accent)' +error_symbol = '[❯](bold fg:error)' +vimcmd_symbol = '[❮](bold fg:ice)' + +[time] +disabled = false +time_format = '%H:%M' +style = 'fg:comment' +format = '[✦ $time]($style)' diff --git a/themes/hyperclass/files/wallpaper/first-light.png b/themes/hyperclass/files/wallpaper/first-light.png new file mode 100644 index 0000000..b9294b2 Binary files /dev/null and b/themes/hyperclass/files/wallpaper/first-light.png differ diff --git a/themes/hyperclass/files/wallpaper/gilded-void.png b/themes/hyperclass/files/wallpaper/gilded-void.png new file mode 100644 index 0000000..a770b58 Binary files /dev/null and b/themes/hyperclass/files/wallpaper/gilded-void.png differ diff --git a/themes/hyperclass/files/wallpaper/hyperclass-slideshow.xml b/themes/hyperclass/files/wallpaper/hyperclass-slideshow.xml new file mode 100644 index 0000000..1ad4670 --- /dev/null +++ b/themes/hyperclass/files/wallpaper/hyperclass-slideshow.xml @@ -0,0 +1,42 @@ + + + + + 2026 + 01 + 01 + 00 + 00 + 00 + + + 900.0 + {{ home }}/.local/share/backgrounds/hyperclass/gilded-void.png + + + 12.0 + {{ home }}/.local/share/backgrounds/hyperclass/gilded-void.png + {{ home }}/.local/share/backgrounds/hyperclass/first-light.png + + + 900.0 + {{ home }}/.local/share/backgrounds/hyperclass/first-light.png + + + 12.0 + {{ home }}/.local/share/backgrounds/hyperclass/first-light.png + {{ home }}/.local/share/backgrounds/hyperclass/warp-transit.png + + + 900.0 + {{ home }}/.local/share/backgrounds/hyperclass/warp-transit.png + + + 12.0 + {{ home }}/.local/share/backgrounds/hyperclass/warp-transit.png + {{ home }}/.local/share/backgrounds/hyperclass/gilded-void.png + + diff --git a/themes/hyperclass/files/wallpaper/warp-transit.png b/themes/hyperclass/files/wallpaper/warp-transit.png new file mode 100644 index 0000000..d4040b0 Binary files /dev/null and b/themes/hyperclass/files/wallpaper/warp-transit.png differ diff --git a/themes/hyperclass/palette.toml b/themes/hyperclass/palette.toml new file mode 100644 index 0000000..ef4d6d9 --- /dev/null +++ b/themes/hyperclass/palette.toml @@ -0,0 +1,50 @@ +# HYPERCLASS — Gilded Void palette. ~12 named roles drive the render engine. +# First class aboard a starliner: champagne brass on deep-space ink, ivory +# starlight, one vein of ice so the gold has something cool to shine against. +# +# Craft notes (kept deliberately, they are the theme): +# - bg is ink with a blue lean, never pure black (flagship schemes sit at +# HSL L 9-23%; this is the dark end of that band). +# - the gold is the desaturated #C69B3C..#D4AF37 "expensive" band — bright +# #FFD700 is the slot-machine failure mode. +# - two saturated accent families only: warm brass, cool ice. Everything +# else is tuned to recede. +bg = "#12151F" +surface1 = "#1A1E2C" +surface2 = "#232838" +fg = "#EAE3D1" +fg_bright = "#FBF6E7" +fg_dim = "#C2BCAB" +accent = "#C9A24A" +accent_bright = "#E9CD8A" +warn = "#D98E48" +error = "#E2707F" +info = "#8FC6D8" +selection = "#2A3046" +comment = "#6E7488" +cursor = "#C9A24A" +# cabin materials (available to templates/overrides) — each one is consumed +# somewhere in the theme; nothing decorative rides for free. +champagne = "#EBD9A8" +gold = "#C9A24A" +platinum = "#C3C8D4" +ice = "#A9DAE8" +emerald = "#58B58D" + +# ANSI terminal hues (drive the generated alacritty/ptyxis/btop palettes) +ansi_black = "#242A3C" +red = "#E2707F" +green = "#86C28F" +yellow = "#D9B45C" +blue = "#85ABE3" +magenta = "#B79BE0" +cyan = "#7CC5CE" +ansi_white = "#D3CDBE" +bright_black = "#6E7488" +bright_red = "#F18E9B" +bright_green = "#A3D8A9" +bright_yellow = "#EDCD82" +bright_blue = "#A6C4F2" +bright_magenta = "#CFB6EF" +bright_cyan = "#9ADEE6" +bright_white = "#FBF6E7" diff --git a/themes/hyperclass/theme.toml b/themes/hyperclass/theme.toml new file mode 100644 index 0000000..5877928 --- /dev/null +++ b/themes/hyperclass/theme.toml @@ -0,0 +1,385 @@ +# HYPERCLASS — Gilded Void desktop theme. +# Palette in palette.toml; terminal/monitor/editor/gtk render from it. +# +# The conceit: the shell chrome is the starliner's cool platinum hull +# (GNOME accent 'slate'), the apps are the warm champagne cabin (gtk.css +# gold accent), and the terminal is the panoramic window seat. + +[meta] +name = "hyperclass" +title = "HYPERCLASS — Gilded Void" +description = "First class aboard a starliner crossing the void: champagne brass on deep-space ink, ivory starlight, one vein of ice. Ships an orrery clock, a hyperspace warp and a self-printing boarding pass for the terminal." +author = "blyatiful1" +version = "1.0.0" + +[requires] +packages = ["alacritty", "starship", "btop", "micro", "fastfetch", "cava", "papirus-icon-theme", "papirus-folders", "ptyxis"] +extensions = ["dash-to-dock@micxgx.gmail.com", "blur-my-shell@aunetx", "just-perfection-desktop@just-perfection", "logomenu@aryan_k", "tilingshell@ferrarodomenico.com", "burn-my-windows@schneegans.github.com"] +fonts = ["Iosevka Nerd Font"] + +[build] +managed = ["terminal", "monitor", "editor", "gtk"] + +[[files]] +component = "wallpaper" +src = "files/wallpaper/first-light.png" +dest = "~/.local/share/backgrounds/hyperclass/first-light.png" + +[[files]] +component = "wallpaper" +src = "files/wallpaper/gilded-void.png" +dest = "~/.local/share/backgrounds/hyperclass/gilded-void.png" + +[[files]] +component = "wallpaper" +src = "files/wallpaper/warp-transit.png" +dest = "~/.local/share/backgrounds/hyperclass/warp-transit.png" + +[[files]] +component = "wallpaper" +src = "files/wallpaper/hyperclass-slideshow.xml" +dest = "~/.local/share/backgrounds/hyperclass/hyperclass-slideshow.xml" +# Rendered through {{ home }} substitution at apply time so the slideshow +# resolves to the running user's backgrounds dir, not the author's. +template = true + +[[files]] +component = "terminal" +src = "files/ptyxis/Hyperclass.palette" +dest = "~/.local/share/org.gnome.Ptyxis/palettes/Hyperclass.palette" + +[[files]] +component = "terminal" +src = "files/alacritty/hyperclass.toml" +dest = "~/.config/alacritty/hyperclass.toml" + +[[files]] +component = "terminal" +src = "files/alacritty/alacritty.toml" +dest = "~/.config/alacritty/alacritty.toml" + +[[files]] +component = "prompt" +src = "files/starship.toml" +dest = "~/.config/starship.toml" + +[[files]] +component = "monitor" +src = "files/btop/hyperclass.theme" +dest = "~/.config/btop/themes/hyperclass.theme" + +[[files]] +component = "monitor" +src = "files/btop/btop.conf" +dest = "~/.config/btop/btop.conf" + +[[files]] +component = "editor" +src = "files/micro/hyperclass.micro" +dest = "~/.config/micro/colorschemes/hyperclass.micro" + +[[files]] +component = "editor" +src = "files/micro/settings.json" +dest = "~/.config/micro/settings.json" + +[[files]] +component = "fastfetch" +src = "files/fastfetch/hyperclass-logo.txt" +dest = "~/.config/fastfetch/hyperclass-logo.txt" + +[[files]] +component = "fastfetch" +src = "files/fastfetch/config.jsonc" +dest = "~/.config/fastfetch/config.jsonc" + +[[files]] +component = "visualizer" +src = "files/cava/config" +dest = "~/.config/cava/config" + +[[files]] +component = "gtk" +src = "files/gtk/gtk.css" +dest = "~/.config/gtk-4.0/gtk.css" + +[[files]] +component = "gtk" +src = "files/gtk/gtk.css" +dest = "~/.config/gtk-3.0/gtk.css" + +[[files]] +component = "shell" +src = "files/shell/hyperclass-emblem.svg" +dest = "~/.local/share/gtheme/assets/hyperclass/hyperclass-emblem.svg" + +# Burn My Windows reads effect profiles from this exact directory; the +# active-profile dconf key below points at this file (written first — files +# are applied before settings). +[[files]] +component = "effects" +src = "files/burn-my-windows/hyperclass.conf" +dest = "~/.config/burn-my-windows/profiles/hyperclass.conf" + +[[files]] +component = "shell-cfg" +src = "files/fish/config.fish" +dest = "~/.config/fish/config.fish" + +# NOTE: runtime payload lives under assets/, NOT ~/.local/share/gtheme/themes/ +# — that namespace is owned by `gtheme install` and is rmtree'd on update/remove. +[[files]] +component = "commands" +src = "files/bin" +dest = "~/.local/share/gtheme/assets/hyperclass/bin" +mode = "755" + +[[files]] +component = "ascii" +src = "files/ascii" +dest = "~/.local/share/gtheme/assets/hyperclass/ascii" + +[[settings]] +component = "desktop" +backend = "gsettings" +# Cool platinum hull for the shell chrome; the warm champagne accent lives in +# the apps via gtk.css. GNOME has no gold accent — slate is the understated +# metal that doesn't fight the brass. +key = "org.gnome.desktop.interface accent-color" +value = "'slate'" + +[[settings]] +component = "desktop" +backend = "gsettings" +# NOTE: this is a dark design; vanilla GNOME defaults to the light scheme, so +# without prefer-dark the theme looks half-applied on a stock install. +key = "org.gnome.desktop.interface color-scheme" +value = "'prefer-dark'" + +[[settings]] +component = "desktop" +backend = "gsettings" +key = "org.gnome.desktop.interface icon-theme" +# Papirus-Dark with folders recoloured to brass (papirus-folders -C yellow -t +# Papirus-Dark). Package install + recolour are a one-time step; see +# [requires].packages. +value = "'Papirus-Dark'" + +[[settings]] +component = "terminal" +backend = "dconf" +key = "/org/gnome/Ptyxis/Profiles/{{ ptyxis_default_profile }}/palette" +value = "'Hyperclass'" + +[[settings]] +component = "terminal" +backend = "dconf" +# A whisper of the wallpaper through the window seat; pairs with the +# blur-my-shell whitelist below. +key = "/org/gnome/Ptyxis/Profiles/{{ ptyxis_default_profile }}/opacity" +value = "0.92" + +[[settings]] +component = "terminal" +backend = "gsettings" +key = "org.gnome.Ptyxis use-system-font" +value = "false" + +[[settings]] +component = "terminal" +backend = "gsettings" +# Iosevka: narrow, tall, unapologetically art-deco letterforms. +key = "org.gnome.Ptyxis font-name" +value = "'Iosevka Nerd Font Mono 11'" + +[[settings]] +component = "wallpaper" +backend = "gsettings" +key = "org.gnome.desktop.background picture-uri" +value = "'file://{{ home }}/.local/share/backgrounds/hyperclass/hyperclass-slideshow.xml'" + +[[settings]] +component = "wallpaper" +backend = "gsettings" +key = "org.gnome.desktop.background picture-uri-dark" +value = "'file://{{ home }}/.local/share/backgrounds/hyperclass/hyperclass-slideshow.xml'" + +[[settings]] +component = "wallpaper" +backend = "gsettings" +key = "org.gnome.desktop.background picture-options" +value = "'zoom'" + +[[settings]] +component = "wallpaper" +backend = "gsettings" +key = "org.gnome.desktop.background primary-color" +value = "'#12151F'" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/dock-position" +value = "'BOTTOM'" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/transparency-mode" +value = "'FIXED'" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/custom-background-color" +value = "true" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/background-color" +value = "'#1A1E2C'" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/background-opacity" +value = "0.68" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/running-indicator-style" +value = "'DOTS'" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/custom-theme-customize-running-dots" +value = "true" + +[[settings]] +component = "dock" +backend = "dconf" +# Brass dot, champagne rim: the cabin's call buttons. +key = "/org/gnome/shell/extensions/dash-to-dock/custom-theme-running-dots-color" +value = "'#C9A24A'" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/custom-theme-running-dots-border-color" +value = "'#EBD9A8'" + +[[settings]] +component = "dock" +backend = "dconf" +key = "/org/gnome/shell/extensions/dash-to-dock/custom-theme-running-dots-border-width" +value = "1" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/blur-my-shell/dash-to-dock/override-background" +value = "false" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/Logo-menu/use-custom-icon" +value = "true" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/Logo-menu/custom-icon-path" +value = "'{{ home }}/.local/share/gtheme/assets/hyperclass/hyperclass-emblem.svg'" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/Logo-menu/symbolic-icon" +value = "false" + +[[settings]] +component = "shell" +backend = "dconf" +# Boot straight to the view, not the overview. +key = "/org/gnome/shell/extensions/just-perfection/startup-status" +value = "0" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/tilingshell/enable-window-border" +value = "true" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/tilingshell/window-border-width" +value = "uint32 2" + +[[settings]] +component = "shell" +backend = "dconf" +# The focused window wears the gold hairline — trim, not fill. +key = "/org/gnome/shell/extensions/tilingshell/window-border-color" +value = "'#C9A24A'" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/blur-my-shell/applications/blur" +value = "true" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/blur-my-shell/applications/enable-all" +value = "false" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/blur-my-shell/applications/whitelist" +value = "['Alacritty', 'org.gnome.Ptyxis']" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/blur-my-shell/applications/sigma" +value = "30" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/blur-my-shell/applications/static-blur" +value = "false" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/blur-my-shell/applications/dynamic-opacity" +value = "false" + +[[settings]] +component = "shell" +backend = "dconf" +key = "/org/gnome/shell/extensions/blur-my-shell/applications/corner-radius" +value = "14" + +[[settings]] +component = "effects" +backend = "gsettings" +# Burn My Windows opens/closes windows through a champagne hexagon lattice +# (the airlock iris). The profile file above disables every other effect — +# BMW picks randomly among all enabled ones, so exactly one stays true. +# active-profile must be the profile's ABSOLUTE path; files are applied +# before settings, so the .conf exists by the time this key lands. +key = "org.gnome.shell.extensions.burn-my-windows active-profile" +value = "'{{ home }}/.config/burn-my-windows/profiles/hyperclass.conf'" + +# NOTE: rounded-window-corners@fxgn (Reborn) is deliberately NOT used — it is +# broken on GNOME 50 (shader crash strands shadow actors on the Shell stage). +# Native libadwaita rounding covers window top-corners. diff --git a/themes/index.json b/themes/index.json index 5b655bd..7fe5cd0 100644 --- a/themes/index.json +++ b/themes/index.json @@ -1,6 +1,30 @@ { "version": 1, "themes": [ + { + "name": "hyperclass", + "title": "HYPERCLASS \u2014 Gilded Void", + "description": "First class aboard a starliner crossing the void: champagne brass on deep-space ink, ivory starlight, one vein of ice. Ships an orrery clock, a hyperspace warp and a self-printing boarding pass for the terminal.", + "author": "blyatiful1", + "version": "1.0.0", + "components": [ + "wallpaper", + "terminal", + "prompt", + "monitor", + "editor", + "fastfetch", + "visualizer", + "gtk", + "shell", + "effects", + "shell-cfg", + "commands", + "ascii", + "desktop", + "dock" + ] + }, { "name": "magma", "title": "MAGMA \u2014 Obsidian Flow", diff --git a/themes/magma/files/gtk/gtk.css b/themes/magma/files/gtk/gtk.css index 688e113..5e8b710 100644 --- a/themes/magma/files/gtk/gtk.css +++ b/themes/magma/files/gtk/gtk.css @@ -1,11 +1,13 @@ /* MAGMA — Obsidian Flow — generated by gtheme. libadwaita / GTK4 accent override. */ :root { --accent-bg-color: #FF6D3A; - --accent-fg-color: #FFF6E8; + /* text ON accent-filled widgets: both bundled accents are mid-light, so the + theme's own dark bg is the readable pairing (ivory-on-accent is ~2.2:1) */ + --accent-fg-color: #0D0A0F; --accent-color: #FFA05C; } /* GTK3 fallback */ @define-color accent_color #FFA05C; @define-color accent_bg_color #FF6D3A; -@define-color accent_fg_color #FFF6E8; +@define-color accent_fg_color #0D0A0F; diff --git a/themes/magma/files/ptyxis/Magma.palette b/themes/magma/files/ptyxis/Magma.palette index 06b52a1..6d4fd6a 100644 --- a/themes/magma/files/ptyxis/Magma.palette +++ b/themes/magma/files/ptyxis/Magma.palette @@ -13,7 +13,7 @@ TitlebarForeground=#F2E5D5 BellBackground=#FFB454 BellForeground=#0D0A0F SuperuserBackground=#FF6D3A -SuperuserForeground=#FFF6E8 +SuperuserForeground=#0D0A0F RemoteBackground=#261826 RemoteForeground=#F2E5D5 Color0=#241823 @@ -37,13 +37,13 @@ Color15=#FFF6E8 Foreground=#0D0A0F Background=#FFF6E8 Cursor=#FF6D3A -CursorForeground=#FFF6E8 +CursorForeground=#0D0A0F TitlebarBackground=#F2E5D5 TitlebarForeground=#0D0A0F BellBackground=#FFB454 -BellForeground=#FFF6E8 +BellForeground=#0D0A0F SuperuserBackground=#FF6D3A -SuperuserForeground=#FFF6E8 +SuperuserForeground=#0D0A0F RemoteBackground=#F2E5D5 RemoteForeground=#0D0A0F Color0=#241823 @@ -53,7 +53,7 @@ Color3=#d99947 Color4=#518bc4 Color5=#9669c5 Color6=#3ba99a -Color7=#D8C8B8 +Color7=#7A6470 Color8=#6B5462 Color9=#F25050 Color10=#A8C64E @@ -61,4 +61,4 @@ Color11=#FFB454 Color12=#5FA3E6 Color13=#B07BE8 Color14=#45C7B5 -Color15=#FFFFFF +Color15=#241823