From d6195b4ecc89a6506985e17313b580d570b03b77 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Wed, 30 Sep 2026 00:08:16 -0300 Subject: lapis_plain: lapis on flat grounds, with its framed and shadowed tags and its file-name shadow No dot grid under the text and no stripes behind the focused tag; every colour, the gold frames and vermilion shadows of the plaques, the rules, the scroll column's checker and the title shadow stay lapis's. It follows lapis in the ring and the Themes picker. Co-Authored-By: Claude Opus 5.5 --- docs/themes.md | 5 +- src/colors.zig | 19 ++++++- src/themes/lapis_plain.zig | 81 +++++++++++++++++++++++++++ test/gui_monkey.py | 2 +- test/snapshots/theme.golden | 2 + test/snapshots/theme.snap | 7 ++- test/snapshots/themesel.golden | 123 ++++++++++++++++++++++++----------------- test/snapshots/themesel.snap | 9 ++- 8 files changed, 190 insertions(+), 58 deletions(-) create mode 100644 src/themes/lapis_plain.zig diff --git a/docs/themes.md b/docs/themes.md index c7204173..db6349c4 100644 --- a/docs/themes.md +++ b/docs/themes.md @@ -6,10 +6,13 @@ terminals together. `orchard` is the initial theme. Execute `Theme ` anywhere, or open `Themes` with `SPC t t` and select a theme's command. Put the same command in your [startup configuration](config.md) to keep a preference. `NextColor` cycles through the native themes first, -then `acme` and `lapis`, the [faithful ports](#faithful-ports), the legacy +then `acme`, `lapis` and `lapis_plain`, the [faithful ports](#faithful-ports), the legacy `helix` and `dark`, and the imported palettes. `Themes` shows the same order in sections: `Pardes themes`, one per ported family, `Legacy themes` and `Imported themes (helix, zed)`; its navigation skips the section headings. +`lapis` draws its ornament in the GUI; `lapis_plain` is the same theme on +flat grounds (no dot grid under the text, no stripes behind the focused +tag), with lapis's framed and shadowed tags and its file-name shadow. See the [Agave visual review](ui-review.md) for the original six-palette gallery. | Theme | Character | Page | Accent | diff --git a/src/colors.zig b/src/colors.zig index b6da0d2c..c78043cc 100644 --- a/src/colors.zig +++ b/src/colors.zig @@ -106,7 +106,7 @@ test "every native theme's separators stand off its page, and its focus tint off } test "every faithful port meets pardes's chrome floors in its own colours, with nothing left to derive" { - const first = comptime indexOfTheme("lapis") + 1; + const first = comptime indexOfTheme("lapis_plain") + 1; const last = comptime indexOfTheme("helix"); for (themes[first..last]) |*th| { const chrome = ChromeTheme.fromTheme(th); @@ -394,6 +394,7 @@ const curated = struct { pub const orchard_black = @import("themes/orchard_black.zig"); pub const acme = @import("themes/acme.zig"); pub const lapis = @import("themes/lapis.zig"); + pub const lapis_plain = @import("themes/lapis_plain.zig"); // Faithful ports of well-known themes, a family at a time (src/themes/ // .zig says where each value came from): `theme_groups`. pub const dark_plus = @import("themes/dark_plus.zig"); @@ -565,6 +566,22 @@ test "the picker's sections run in ring order and cover it" { try std.testing.expect(groupAt(native_count) != null); } +test "lapis_plain is lapis on flat grounds, framed and shadowed as lapis" { + const lapis = themes[indexOfTheme("lapis")]; + const plain = themes[indexOfTheme("lapis_plain")]; + try std.testing.expectEqual(indexOfTheme("lapis") + 1, indexOfTheme("lapis_plain")); + var same = plain; + same.name = lapis.name; + same.decor = lapis.decor; + try std.testing.expectEqualDeep(lapis, same); + const decor = plain.decor.?; + try std.testing.expect(decor.page_dots == null and decor.tag_stripe == null); + try std.testing.expectEqualDeep(lapis.decor.?.tag_border, decor.tag_border); + try std.testing.expectEqualDeep(lapis.decor.?.tag_shadow, decor.tag_shadow); + try std.testing.expectEqualDeep(lapis.decor.?.title_shadow, decor.title_shadow); + try std.testing.expectEqualDeep(lapis.decor.?.rail_checker, decor.rail_checker); +} + /// Original and classic-inspired Pardes palettes precede retained imports. pub const native_theme_count = 15; diff --git a/src/themes/lapis_plain.zig b/src/themes/lapis_plain.zig new file mode 100644 index 00000000..5b4c48dd --- /dev/null +++ b/src/themes/lapis_plain.zig @@ -0,0 +1,81 @@ +//! Lapis plain: lapis (src/themes/lapis.zig) with flat grounds. The page +//! under the text is lapis-deep with no dot grid, and the focused tag's +//! plaque is its tint with no gold stripes behind its words; the rest is +//! lapis's own: every colour, the gold frames and vermilion shadows of the +//! tag plaques, the gold rules, the checker in the scroll column and the +//! file name's vermilion offset shadow. +pub const theme = .{ + .name = "lapis_plain", + // --lapis-deep, --vellum + .bg = .{ 0x0a, 0x10, 0x30 }, + .fg = .{ 0xee, 0xe6, 0xd2 }, + // A gold highlight in lapis ink, as the directory's current entry. + .sel_bg = .{ 0xe8, 0xc4, 0x6a }, + .sel_fg = .{ 0x0f, 0x1a, 0x4a }, + // --lapis, --vellum-dim + .tag_bg = .{ 0x0f, 0x1a, 0x4a }, + .tag_fg = .{ 0x9a, 0xa6, 0xd9 }, + .tag_name_fg = .{ 0xe8, 0xc4, 0x6a }, + .tag_active_name_fg = .{ 0xf2, 0xd2, 0x80 }, + // The plaques' hover lapis, taken a step further: 1.5:1 off the tag. + .tag_active_bg = .{ 0x25, 0x39, 0x7d }, + .tag_active_fg = .{ 0xee, 0xe6, 0xd2 }, + .box = .{ 0xe8, 0xc4, 0x6a }, + .box_dim = .{ 0x3a, 0x4a, 0x8a }, + .box_border = .{ 0x9a, 0xa6, 0xd9 }, + .box_dirty = .{ 0xff, 0x6a, 0x4a }, + .column_box = .{ 0xff, 0x6a, 0x4a }, + .column_box_dim = .{ 0x8a, 0x3a, 0x3a }, + // Rubrics: vermilion keywords, gilded strings, the code window's green + // for numbers, vellum-dim comments. + .kw = .{ 0xff, 0x6a, 0x4a }, + .str = .{ 0xe8, 0xc4, 0x6a }, + .num = .{ 0xe7, 0xff, 0xe0 }, + .comment = .{ 0x9a, 0xa6, 0xd9 }, + .lineno = .{ 0x5a, 0x6a, 0xa8 }, + .lineno_active = .{ 0x6a, 0x7a, 0xb8 }, + // --lapis-ink under a gold thumb (the page's scrollbar-color). + .scroll_track = .{ 0x05, 0x0a, 0x24 }, + .scroll_thumb = .{ 0xe8, 0xc4, 0x6a }, + // Gold rules, a vermilion hairline between a tag and its text. + .border = .{ 0xe8, 0xc4, 0x6a }, + // An empty column is the page, not a slab of gold leaf. + .empty_col = .{ 0x0a, 0x10, 0x30 }, + .tag_rule = .{ 0xd4, 0x41, 0x2f }, + .search_bg = .{ 0x6a, 0x2a, 0x1c }, + .search_fg = .{ 0xff, 0xd0, 0xb0 }, + .diagnostic_error = .{ 0xff, 0x6a, 0x4a }, + .diagnostic_warning = .{ 0xe8, 0xc4, 0x6a }, + .diagnostic_info = .{ 0x9a, 0xc6, 0xff }, + .diagnostic_hint = .{ 0xa8, 0xe0, 0xc0 }, + .decor = .{ + .rail_checker = .{ 0xe8, 0xc4, 0x6a }, + .rail_checker_px = 3, + // The trail: a 2px gold frame and a 5px vermilion shadow; the + // focused plaque filled flat. + .tag_border = .{ 0xe8, 0xc4, 0x6a }, + .tag_border_px = 2, + .tag_shadow = .{ 0xd4, 0x41, 0x2f }, + .tag_shadow_px = 5, + .title_shadow = .{ 0xd4, 0x41, 0x2f }, + .title_shadow_px = 2, + }, + .palette = .{ + .{ 0x0a, 0x10, 0x30 }, + .{ 0xff, 0x6a, 0x4a }, + .{ 0xa8, 0xe0, 0xc0 }, + .{ 0xe8, 0xc4, 0x6a }, + .{ 0x9a, 0xc6, 0xff }, + .{ 0xd8, 0xa0, 0xe8 }, + .{ 0x8a, 0xd8, 0xd8 }, + .{ 0xee, 0xe6, 0xd2 }, + .{ 0x9a, 0xa6, 0xd9 }, + .{ 0xff, 0x9a, 0x6a }, + .{ 0xc8, 0xf0, 0xd8 }, + .{ 0xff, 0xde, 0x90 }, + .{ 0xc0, 0xdc, 0xff }, + .{ 0xe8, 0xc0, 0xf4 }, + .{ 0xb0, 0xec, 0xec }, + .{ 0xff, 0xf8, 0xe8 }, + }, +}; diff --git a/test/gui_monkey.py b/test/gui_monkey.py index 2b32f050..540c377a 100644 --- a/test/gui_monkey.py +++ b/test/gui_monkey.py @@ -25,7 +25,7 @@ from fs import session # noqa: E402 MOTIONS = ['off', 'crisp', 'smooth', 'bouncy', 'playful'] LIFTS = ['off', 'shadow', 'rim', 'auto'] BLOOMS = ['0', '2'] -THEMES = ['lapis', 'forge', 'acme', 'dusk', 'daybreak'] +THEMES = ['lapis', 'lapis_plain', 'forge', 'acme', 'dusk', 'daybreak'] W, H = 1280, 840 diff --git a/test/snapshots/theme.golden b/test/snapshots/theme.golden index 351f8905..cbd5ee61 100644 --- a/test/snapshots/theme.golden +++ b/test/snapshots/theme.golden @@ -586,6 +586,8 @@ |28: 0-0 d,#e8c46a, 1-49 d,#0a1030, 50-50 d,#e8c46a, 51-99 d,#0a1030, |29: 0-0 d,#e8c46a, 1-49 d,#0a1030, 50-50 d,#e8c46a, 51-99 d,#0a1030, |30: 0-0 d,#e8c46a, 1-49 d,#0a1030, 50-50 d,#e8c46a, 51-99 d,#0a1030, +== snap lapis-plain grid=100x31 cursor=4,6 +== style lapis-plain grid=100x31 == snap dark-plus grid=100x31 cursor=4,6 == style dark-plus grid=100x31 |0: 0-75 #a7a7a7,#3c3c3c, 76-84 #d4d4d4,#264f78, 85-99 #d4d4d4,#3c3c3c, diff --git a/test/snapshots/theme.snap b/test/snapshots/theme.snap index 4cb360d3..2a046ef3 100644 --- a/test/snapshots/theme.snap +++ b/test/snapshots/theme.snap @@ -109,11 +109,16 @@ snapstyle lapis press middle @NextColor 1 release middle @NextColor 1 stable 700 10000 +snap lapis-plain +snapstyle lapis-plain +press middle @NextColor 1 +release middle @NextColor 1 +stable 700 10000 snap dark-plus snapstyle dark-plus press middle @NextColor 1 release middle @NextColor 1 stable 700 10000 -# After orchard_black: acme and lapis, then the first faithful ports. +# After orchard_black: acme, lapis and lapis_plain, then the first faithful ports. snap solarized-dark snapstyle solarized-dark diff --git a/test/snapshots/themesel.golden b/test/snapshots/themesel.golden index a82d88f5..253fc73a 100644 --- a/test/snapshots/themesel.golden +++ b/test/snapshots/themesel.golden @@ -482,7 +482,7 @@ |27: 16 Theme orchard_black |28: 17 Theme acme |29: 18 Theme lapis -|30: 19 +|30: 19 Theme lapis_plain == style step-orchard-black grid=100x31 |0: 0-99 #b2c3b8,#1d2824, |1: 0-1 d,#887455, 2-2 d,#314738, 3-99 #becfc4,#314738, @@ -514,7 +514,7 @@ |27: 0-0 d,#111813, 1-1 d,#000000, 2-3 d,#000000,b 4-6 #616f64,#000000,b 7-99 #f2f8ef,#000000, |28: 0-0 d,#111813, 1-3 d,#000000, 4-6 #59675c,#000000, 7-99 #f2f8ef,#000000, |29: 0-0 d,#111813, 1-3 d,#000000, 4-6 #59675c,#000000, 7-99 #f2f8ef,#000000, -|30: 0-0 d,#111813, 1-3 d,#000000, 4-99 #59675c,#000000, +|30: 0-0 d,#111813, 1-3 d,#000000, 4-6 #59675c,#000000, 7-99 #f2f8ef,#000000, == snap step-acme grid=100x31 cursor=7,27 |17: 7 Theme atelier Theme |18: 8 Theme forge @@ -528,8 +528,8 @@ |26: 16 Theme orchard_black |27: 17 Theme acme |28: 18 Theme lapis -|29: 19 -|30: 20 # Visual Studio Code +|29: 19 Theme lapis_plain +|30: 20 == style step-acme grid=100x31 |0: 0-99 #000000,#eaffff, |1: 0-1 d,#8888cc, 2-2 d,#eaffff, 3-99 #000000,#eaffff, @@ -560,8 +560,8 @@ |26: 0-0 d,#99994c, 1-3 d,#ffffea, 4-6 #999980,#ffffea, 7-99 #000000,#ffffea, |27: 0-0 d,#99994c, 1-1 d,#ffffea, 2-3 d,#ffffea,b 4-6 #999980,#ffffea,b 7-99 #000000,#ffffea, |28: 0-0 d,#99994c, 1-3 d,#ffffea, 4-6 #999980,#ffffea, 7-99 #000000,#ffffea, -|29: 0-0 d,#99994c, 1-3 d,#ffffea, 4-99 #999980,#ffffea, -|30: 0-0 d,#99994c, 1-3 d,#ffffea, 4-6 #999980,#ffffea, 7-99 #000000,#ffffea, +|29: 0-0 d,#99994c, 1-3 d,#ffffea, 4-6 #999980,#ffffea, 7-99 #000000,#ffffea, +|30: 0-0 d,#99994c, 1-3 d,#ffffea, 4-99 #999980,#ffffea, == snap step-lapis grid=100x31 cursor=7,27 |17: 8 Theme forge Theme |18: 9 Theme lagoon @@ -574,9 +574,9 @@ |25: 16 Theme orchard_black |26: 17 Theme acme |27: 18 Theme lapis -|28: 19 -|29: 20 # Visual Studio Code -|30: 21 Theme dark_plus +|28: 19 Theme lapis_plain +|29: 20 +|30: 21 # Visual Studio Code == style step-lapis grid=100x31 |0: 0-99 #9aa6d9,#0f1a4a, |1: 0-1 d,#8a3a3a, 2-2 d,#25397d, 3-99 #eee6d2,#25397d, @@ -606,24 +606,43 @@ |25: 0-0 d,#050a24, 1-3 d,#0a1030, 4-6 #5a6aa8,#0a1030, 7-99 #eee6d2,#0a1030, |26: 0-0 d,#050a24, 1-3 d,#0a1030, 4-6 #5a6aa8,#0a1030, 7-99 #eee6d2,#0a1030, |27: 0-0 d,#050a24, 1-1 d,#0a1030, 2-3 d,#0a1030,b 4-6 #6a7ab8,#0a1030,b 7-99 #eee6d2,#0a1030, +|28: 0-0 d,#050a24, 1-3 d,#0a1030, 4-6 #5a6aa8,#0a1030, 7-99 #eee6d2,#0a1030, +|29: 0-0 d,#050a24, 1-3 d,#0a1030, 4-99 #5a6aa8,#0a1030, +|30: 0-0 d,#050a24, 1-3 d,#0a1030, 4-6 #5a6aa8,#0a1030, 7-99 #eee6d2,#0a1030, +== snap step-lapis-plain grid=100x31 cursor=7,27 +|17: 9 Theme lagoon Theme +|18: 10 Theme solarium +|19: 11 Theme spectrum +|20: 12 Theme harvest +|21: 13 Theme clay +|22: 14 Theme forge_black +|23: 15 Theme forge_soft +|24: 16 Theme orchard_black +|25: 17 Theme acme +|26: 18 Theme lapis +|27: 19 Theme lapis_plain +|28: 20 +|29: 21 # Visual Studio Code +|30: 22 Theme dark_plus +== style step-lapis-plain grid=100x31 +|18: 0-0 d,#050a24, 1-3 d,#0a1030, 4-6 #5a6aa8,#0a1030, 7-99 #eee6d2,#0a1030, |28: 0-0 d,#050a24, 1-3 d,#0a1030, 4-99 #5a6aa8,#0a1030, |29: 0-0 d,#050a24, 1-3 d,#0a1030, 4-6 #5a6aa8,#0a1030, 7-99 #eee6d2,#0a1030, -|30: 0-0 d,#050a24, 1-3 d,#0a1030, 4-6 #5a6aa8,#0a1030, 7-99 #eee6d2,#0a1030, == snap step-dark-plus grid=100x31 cursor=7,27 -|17: 11 Theme spectrum Theme -|18: 12 Theme harvest -|19: 13 Theme clay -|20: 14 Theme forge_black -|21: 15 Theme forge_soft -|22: 16 Theme orchard_black -|23: 17 Theme acme -|24: 18 Theme lapis -|25: 19 -|26: 20 # Visual Studio Code -|27: 21 Theme dark_plus -|28: 22 -|29: 23 # Solarized -|30: 24 Theme solarized_dark +|17: 12 Theme harvest Theme +|18: 13 Theme clay +|19: 14 Theme forge_black +|20: 15 Theme forge_soft +|21: 16 Theme orchard_black +|22: 17 Theme acme +|23: 18 Theme lapis +|24: 19 Theme lapis_plain +|25: 20 +|26: 21 # Visual Studio Code +|27: 22 Theme dark_plus +|28: 23 +|29: 24 # Solarized +|30: 25 Theme solarized_dark == style step-dark-plus grid=100x31 |0: 0-99 #a7a7a7,#3c3c3c, |1: 0-1 d,#458276, 2-2 d,#1e1e1e, 3-99 #ffffff,#1e1e1e, @@ -657,20 +676,20 @@ |29: 0-3 d,#1e1e1e, 4-6 #858585,#1e1e1e, 7-99 #d4d4d4,#1e1e1e, |30: 0-3 d,#1e1e1e, 4-6 #858585,#1e1e1e, 7-99 #d4d4d4,#1e1e1e, == snap step-solarized-dark grid=100x31 cursor=7,27 -|17: 14 Theme forge_black Theme -|18: 15 Theme forge_soft -|19: 16 Theme orchard_black -|20: 17 Theme acme -|21: 18 Theme lapis -|22: 19 -|23: 20 # Visual Studio Code -|24: 21 Theme dark_plus -|25: 22 -|26: 23 # Solarized -|27: 24 Theme solarized_dark -|28: 25 Theme solarized_light -|29: 26 -|30: 27 # Dracula +|17: 15 Theme forge_soft Theme +|18: 16 Theme orchard_black +|19: 17 Theme acme +|20: 18 Theme lapis +|21: 19 Theme lapis_plain +|22: 20 +|23: 21 # Visual Studio Code +|24: 22 Theme dark_plus +|25: 23 +|26: 24 # Solarized +|27: 25 Theme solarized_dark +|28: 26 Theme solarized_light +|29: 27 +|30: 28 # Dracula == style step-solarized-dark grid=100x31 |0: 0-99 #01090b,#657b83, |1: 0-1 d,#758a41, 2-2 d,#93a1a1, 3-99 #073642,#93a1a1, @@ -737,20 +756,20 @@ |29: 0-3 d,#1e1e1e, 4-99 #858585,#1e1e1e, |30: 0-3 d,#1e1e1e, 4-6 #858585,#1e1e1e, 7-99 #d4d4d4,#1e1e1e, == snap tail grid=100x31 cursor=7,29 -|17: 326 Theme wolf_alabaster_dark -|18: 327 Theme wolf_alabaster_dark_bg -|19: 328 Theme wolf_alabaster_dark_mono -|20: 329 Theme wolf_alabaster_light -|21: 330 Theme wolf_alabaster_light_bg -|22: 331 Theme wolf_alabaster_light_mono -|23: 332 Theme yellowed -|24: 333 Theme yo -|25: 334 Theme yo_berry -|26: 335 Theme yo_light -|27: 336 Theme zed_onedark -|28: 337 Theme zed_onelight -|29: 338 Theme zenburn -|30: 339 +|17: 327 Theme wolf_alabaster_dark +|18: 328 Theme wolf_alabaster_dark_bg +|19: 329 Theme wolf_alabaster_dark_mono +|20: 330 Theme wolf_alabaster_light +|21: 331 Theme wolf_alabaster_light_bg +|22: 332 Theme wolf_alabaster_light_mono +|23: 333 Theme yellowed +|24: 334 Theme yo +|25: 335 Theme yo_berry +|26: 336 Theme yo_light +|27: 337 Theme zed_onedark +|28: 338 Theme zed_onelight +|29: 339 Theme zenburn +|30: 340 == snap picked grid=100x31 cursor=7,3 |16: 14 line 14 |17: 15 line 15 diff --git a/test/snapshots/themesel.snap b/test/snapshots/themesel.snap index 01e4dc5e..1d61bf6a 100644 --- a/test/snapshots/themesel.snap +++ b/test/snapshots/themesel.snap @@ -11,7 +11,7 @@ # and nothing to cancel: the row you ran is the theme you have. # # The whole ring is in the buffer, in sections: the fifteen native themes, -# acme and lapis, the faithful ports a family at a time, the legacy helix and +# acme, lapis and lapis_plain, the faithful ports a family at a time, the legacy helix and # dark, then everything exported from the vendored helix .toml and zed .json # files, sorted. The colors below are # read with snapstyle, so this proves the generated themes are real data and @@ -82,7 +82,7 @@ key tab stable 700 15000 snap step-clay snapstyle step-clay -# The three native contrast variants precede acme and lapis, and then the first +# The three native contrast variants precede acme, lapis and lapis_plain, and then the first # ported family's section. Its heading # and blank separator are not stops in the n/N command walk. key n @@ -113,6 +113,11 @@ snapstyle step-lapis key n key tab stable 700 15000 +snap step-lapis-plain +snapstyle step-lapis-plain +key n +key tab +stable 700 15000 snap step-dark-plus snapstyle step-dark-plus # across the Visual Studio Code section into Solarized: a section heading and -- cgit v1.3