From b7b4fb6dd6013671165a18523469f8685e311573 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Tue, 20 Oct 2026 01:58:27 +0100 Subject: [PATCH] Outline the wordmark's middle slash, as the web does The /dev/null wordmark's middle slash is now a hollow lane-0 outline, like the web's, using text-outline from NativePHP/mobile-air#549 and NativePHP/mobile-ui#142. It replaces the solid regular-weight slash #20 used because EDGE text couldn't stroke a glyph then. Main's lock already has a mobile-air combined head with #549. This moves nativephp/mobile-ui to the combined/dev-null-app head that has #142. Co-Authored-By: Claude Opus 5.5 --- composer.lock | 8 ++++---- resources/views/native/partials/commit-body.blade.php | 9 ++++----- tests/Feature/Screens/LogTest.php | 4 ++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/composer.lock b/composer.lock index ce20c6c..5774bb7 100644 --- a/composer.lock +++ b/composer.lock @@ -3009,12 +3009,12 @@ "source": { "type": "git", "url": "https://github.com/NativePHP/mobile-ui.git", - "reference": "b70ef421173c2c64061588aef7f2c3e2309400b3" + "reference": "a2e561128d5052b6f90f7e87069169372cc4cd32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/NativePHP/mobile-ui/zipball/b70ef421173c2c64061588aef7f2c3e2309400b3", - "reference": "b70ef421173c2c64061588aef7f2c3e2309400b3", + "url": "https://api.github.com/repos/NativePHP/mobile-ui/zipball/a2e561128d5052b6f90f7e87069169372cc4cd32", + "reference": "a2e561128d5052b6f90f7e87069169372cc4cd32", "shasum": "" }, "require": { @@ -3073,7 +3073,7 @@ "url": "https://nativephp.com/sponsor" } ], - "time": "2026-10-19T23:20:24+00:00" + "time": "2026-10-20T20:03:24+00:00" }, { "name": "nesbot/carbon", diff --git a/resources/views/native/partials/commit-body.blade.php b/resources/views/native/partials/commit-body.blade.php index 43b9764..7b628cf 100644 --- a/resources/views/native/partials/commit-body.blade.php +++ b/resources/views/native/partials/commit-body.blade.php @@ -4,10 +4,9 @@ The runs inside a paragraph sit flush left with no blank lines between them on purpose: under whitespace-pre-wrap any whitespace between those tags would print. Each line ends in a tag or a directive, whose newline PHP drops. - A standalone /dev/null is the wordmark, in semibold with tighter tracking like the web's. The web outlines its - middle slash in lane-0; EDGE text runs can't stroke a glyph, so that slash is solid lane-0 instead, in the regular - weight, which is nearer the outline's thin lines than a solid semibold slash or a faded one. iOS breaks lines - after a slash, so a word joiner (U+2060) after each one keeps the wordmark on one line. It never breaks before a + A standalone /dev/null is the wordmark, in semibold with tighter tracking like the web's, its middle slash a + hollow lane-0 outline. text-outline's 1pt is the web's max(1px, 0.035em) at body sizes. iOS breaks lines after a + slash, so a word joiner (U+2060) after each one keeps the wordmark on one line. It never breaks before a slash, even after a space, so a zero-width space (U+200B) after a space lets the line break there as a browser would; without it, a few wordmarks in a row can't wrap at all. VoiceOver skips both and still reads "/dev/null". @@ -44,7 +43,7 @@ @elseif ($run->isWordmark) @php($afterSpace = $loop->index > 0 && ctype_space(substr($block->runs[$loop->index - 1]->text, -1))) -@if ($afterSpace)​@endif/⁠dev⁠null +@if ($afterSpace)​@endif/⁠dev⁠null @else @endif diff --git a/tests/Feature/Screens/LogTest.php b/tests/Feature/Screens/LogTest.php index 5e26b20..36219e8 100644 --- a/tests/Feature/Screens/LogTest.php +++ b/tests/Feature/Screens/LogTest.php @@ -205,7 +205,7 @@ ]); }); -it('draws a standalone /dev/null as the wordmark: semibold, tight, its middle slash regular in lane-0, held on one line', function () { +it('draws a standalone /dev/null as the wordmark: semibold, tight, its middle slash a lane-0 outline, held on one line', function () { Http::fake(['devnull.test/*' => Http::response(pageJson([commitJson(['body' => 'Piped to /dev/null, not /dev/nullable (/dev/null)'])]))]); $screen = Native::visit('/log'); @@ -218,7 +218,7 @@ ["/\u{2060}dev", '/', "\u{2060}null"], ]) ->and($wordmarks[0]['props'])->toMatchArray(['font_name' => 'semibold', 'font_weight' => 5]) - ->and($slash)->toMatchArray(['font_name' => 'default', 'font_weight' => 3]) + ->and($slash)->toMatchArray(['text_outline' => 1.0])->not->toHaveKey('font_name') ->and(strtolower($slash['color']))->toBe(strtolower(config('native-ui.theme.light.lane-0'))) ->and(strtolower($slash['dark_color']))->toBe(strtolower(config('native-ui.theme.dark.lane-0'))); });