From cdcaddaabe7edbc116414e2d112a55cd52f16373 Mon Sep 17 00:00:00 2001 From: funman300 Date: Thu, 7 May 2026 18:42:29 -0700 Subject: [PATCH] feat(engine): add Terminal cursor block to splash overlay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Splash now renders the design system's signature `▌` cyan terminal- cursor glyph (96px) above the wordmark, matching docs/ui-mockups/ splash-mobile.html. The cursor uses ACCENT_PRIMARY and fades on the same per-frame alpha schedule as the title and subtitle so the brand beat still dissolves as a single layer. Did NOT pull in the mockup's full boot-loader treatment (scanline overlay, ✓ check log lines, progress bar, ROOT@SOLITAIRE prompt) — those are aesthetic features that warrant their own commit, not this token-port pass. The splash already consumed every relevant ui_theme token; the cursor glyph is the single highest-signal visual element the spec called for. Co-Authored-By: Claude Opus 4.7 --- solitaire_engine/src/splash_plugin.rs | 49 ++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/solitaire_engine/src/splash_plugin.rs b/solitaire_engine/src/splash_plugin.rs index 5b8b4b6..6d5dd0a 100644 --- a/solitaire_engine/src/splash_plugin.rs +++ b/solitaire_engine/src/splash_plugin.rs @@ -101,6 +101,15 @@ struct SplashTitle; #[derive(Component, Debug)] struct SplashSubtitle; +/// Marker on the cyan "terminal cursor" block (`▌`) painted above the +/// title. Visual signature of the Terminal design system per +/// `docs/ui-mockups/design-system.md` — the same `#6fc2ef` block +/// appears on the card-back theme, on the splash, and (per spec) is +/// the project's cursor motif. Faded together with the rest of the +/// splash so the dissolve still reads as one layer. +#[derive(Component, Debug)] +struct SplashCursor; + // --------------------------------------------------------------------------- // Systems // --------------------------------------------------------------------------- @@ -129,6 +138,14 @@ fn spawn_splash( } let font_handle = font_res.map(|f| f.0.clone()).unwrap_or_default(); + let cursor_font = TextFont { + font: font_handle.clone(), + // Larger than TYPE_DISPLAY so the cursor block reads as the + // signature element above the wordmark. Hand-tuned literal — + // a one-off display character outside the regular text scale. + font_size: 96.0, + ..default() + }; let title_font = TextFont { font: font_handle.clone(), font_size: TYPE_DISPLAY, @@ -171,6 +188,12 @@ fn spawn_splash( GlobalZIndex(Z_SPLASH), )) .with_children(|root| { + root.spawn(( + SplashCursor, + Text::new("\u{258C}"), // ▌ — the Terminal cursor block. + cursor_font, + TextColor(initial_title), + )); root.spawn(( SplashTitle, Text::new("Solitaire Quest"), @@ -219,12 +242,23 @@ fn splash_alpha(age: Duration) -> Option { /// scrim + text alpha, despawning the splash once the timeline /// finishes. Despawns with descendants so the title and subtitle leave /// the world together. +#[allow(clippy::type_complexity)] fn advance_splash( mut commands: Commands, time: Res