From 4755a4f3626131de89fc2bef7248992eb5ba6ecc Mon Sep 17 00:00:00 2001 From: nexxo Date: Wed, 29 Jul 2026 13:43:56 +0200 Subject: [PATCH] Redesign the pre-launch placeholder, and fix its wordmark and mark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported from a phone on status.clupilot.com, which serves this page because the site is still switched to private. Two real defects behind the complaint: The wordmark read "Clu Pilot Cloud". `gap` on a flex container applies between EVERY child and a bare text node is a child — so an inline-flex row wrapped around "Clu", Pilot and " Cloud" put nine pixels between each of them. The wordmark is one element now and the gap only ever separates it from the mark. The logo was a plain gradient tile with nothing in it, which reads as an image that failed to load. That is a poor thing to leave somebody with on a page whose whole message is "we are building this properly". The real mark — cloud plus autopilot ascent — is inlined; it has to be in the file because this page renders when the asset build may not exist at all. The redesign itself: the card is gone. The page is now a centred composition on the open ground — the state as a pill above everything, the mark, the headline at the size the rest of the site uses, and the three promises the paragraph was already making set as their own line so there is something to look at besides one block of text. One warm bloom behind it, drawn as a gradient rather than a blurred disc, which banded into visible rings. Still self-contained, and still the only page exempt from the shared stylesheet: it is served mid-deploy and on a fresh install, where @vite would throw instead of rendering the reassurance somebody came for. Co-Authored-By: Claude Opus 5 --- VERSION | 2 +- lang/de/coming_soon.php | 9 ++ lang/en/coming_soon.php | 9 ++ resources/views/coming-soon.blade.php | 167 +++++++++++++++++-------- tests/Feature/SiteDesignSystemTest.php | 30 +++++ 5 files changed, 165 insertions(+), 52 deletions(-) diff --git a/VERSION b/VERSION index 95b25ae..3336003 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.6 +1.3.7 diff --git a/lang/de/coming_soon.php b/lang/de/coming_soon.php index 7bc21c1..366bc12 100644 --- a/lang/de/coming_soon.php +++ b/lang/de/coming_soon.php @@ -6,4 +6,13 @@ return [ 'contact' => 'Fragen beantworten wir gern:', 'label' => 'Betriebszustand', 'state' => 'In Vorbereitung', + + // The three promises already made in the body text, set as their own line + // so the page has something to look at besides one paragraph. + 'points' => [ + 'operated' => 'Betreut', + 'backed_up' => 'Täglich gesichert', + 'current' => 'Aktuell gehalten', + ], + 'write' => 'Schreiben Sie uns', ]; diff --git a/lang/en/coming_soon.php b/lang/en/coming_soon.php index ca10487..cfd9990 100644 --- a/lang/en/coming_soon.php +++ b/lang/en/coming_soon.php @@ -6,4 +6,13 @@ return [ 'contact' => 'Questions are welcome:', 'label' => 'Service status', 'state' => 'Being prepared', + + // The three promises already made in the body text, set as their own line + // so the page has something to look at besides one paragraph. + 'points' => [ + 'operated' => 'Operated', + 'backed_up' => 'Backed up daily', + 'current' => 'Kept current', + ], + 'write' => 'Write to us', ]; diff --git a/resources/views/coming-soon.blade.php b/resources/views/coming-soon.blade.php index 9e1a8a5..4e82f36 100644 --- a/resources/views/coming-soon.blade.php +++ b/resources/views/coming-soon.blade.php @@ -12,83 +12,148 @@ Self-contained on purpose: this is shown while the application is mid-deploy or freshly installed, which is exactly when the Vite manifest may not exist. Pulling it in through @vite would throw an exception instead of rendering - the reassurance the visitor came for. + the reassurance the visitor came for. Every value below is a copy of a token + from resources/css/portal-tokens.css, which is the price of that. The fonts are the site's own static files. If they are missing the page - degrades to a system serif and still reads correctly. + degrades to a system sans and still reads correctly. --}} @verbatim @endverbatim
-
-
- {{ __('coming_soon.label') }} - {{ __('coming_soon.state') }} -
-
- CluPilot Cloud -

{{ __('coming_soon.title') }}

-

{{ __('coming_soon.body') }}

-

{{ __('coming_soon.contact') }} - office@clupilot.com -

-
+ {{ __('coming_soon.state') }} + +
+ {{-- The real mark — cloud plus autopilot ascent — not the plain gradient + tile that stood here. A brand square with nothing in it reads as an + image that failed to load, which on a "we are still building" page is + the last impression to leave. --}} + + CluPilot Cloud
+ +

{{ __('coming_soon.title') }}

+

{{ __('coming_soon.body') }}

+ +
+ @foreach (['operated', 'backed_up', 'current'] as $point) + + + {{ __("coming_soon.points.{$point}") }} + + @endforeach +
+ +
+

{{ __('coming_soon.contact') }}

+ + + office@clupilot.com + +
+ +

clupilot.com

diff --git a/tests/Feature/SiteDesignSystemTest.php b/tests/Feature/SiteDesignSystemTest.php index f346b51..19ad938 100644 --- a/tests/Feature/SiteDesignSystemTest.php +++ b/tests/Feature/SiteDesignSystemTest.php @@ -94,3 +94,33 @@ it('does not leave the old marketing stylesheet behind anywhere', function () { ->not->toContain('Plex Serif'); } }); + +it('does not space the wordmark out into separate words', function () { + // It went out reading "Clu Pilot Cloud". `gap` on a flex container applies + // between EVERY child, and a bare text node is a child — so an inline-flex + // row wrapped around "Clu", Pilot and " Cloud" put nine pixels + // between each of them. + // + // The rule that prevents it: the mark and the wordmark are the only two + // children of the flex row, and the wordmark is one element. + $source = File::get(resource_path('views/coming-soon.blade.php')); + + expect($source)->toContain('CluPilot') + ->and($source)->not->toContain('CluPilot'); +}); + +it('draws the actual mark on the placeholder, not an empty tile', function () { + // It was a plain gradient square. A brand tile with nothing in it reads as + // an image that failed to load — on a "we are still building" page that is + // the last impression to leave. + // + // Inlined rather than pulled from x-ui.logo: this page renders when the + // asset build may not exist, and a Blade component is fine but the SVG has + // to be in the file either way. + $source = File::get(resource_path('views/coming-soon.blade.php')); + + expect($source)->toContain('viewBox="0 0 64 64"') + // The ascent triangle — the part that makes it a mark rather than a + // rounded rectangle. + ->and($source)->toContain('M32 17 44 44l-12-6-12 6z'); +});