Extract the scheme stylesheet shape for ErrorPage to reuse
SchemeCommand::levels()/selectors()/blocks() move to a new SchemeStylesheet, and Scheme gains forStylesheet(), which resolves a scheme (and every profile) at all three contrast levels together. Plan step 40's fallback needs to draw the same colours material:scheme writes, without duplicating its selector logic. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qwx5USif3wFFmxtHg5U1g9
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
513e344912
commit
3b9a889e7c
@@ -7,6 +7,7 @@ use Illuminate\Filesystem\Filesystem;
|
||||
use Illuminate\Support\Facades\Process;
|
||||
use Illuminate\Support\Str;
|
||||
use JsonException;
|
||||
use NoNameWeb\LivewireMaterial\Support\SchemeStylesheet;
|
||||
use Symfony\Component\Console\Attribute\AsCommand;
|
||||
|
||||
#[AsCommand(name: 'material:scheme')]
|
||||
@@ -225,7 +226,7 @@ class SchemeCommand extends Command
|
||||
$states,
|
||||
);
|
||||
|
||||
$blocks = $this->levels($scheme);
|
||||
$blocks = SchemeStylesheet::levels($scheme);
|
||||
|
||||
return <<<CSS
|
||||
/*
|
||||
@@ -288,76 +289,12 @@ class SchemeCommand extends Command
|
||||
|
||||
CSS;
|
||||
|
||||
$css .= "\n".$this->levels($profiles[$default]);
|
||||
$css .= "\n".SchemeStylesheet::levels($profiles[$default]);
|
||||
|
||||
foreach ($profiles as $name => $profile) {
|
||||
$css .= "\n".$this->levels($profile, "[data-scheme='{$name}']");
|
||||
$css .= "\n".SchemeStylesheet::levels($profile, "[data-scheme='{$name}']");
|
||||
}
|
||||
|
||||
return $css;
|
||||
}
|
||||
|
||||
/**
|
||||
* One scheme, whole: the standard level first, then M3's medium and high under
|
||||
* data-contrast. A level's blocks are the standard ones with one more attribute, so they
|
||||
* outrank them wherever both match, and the light blocks of a level come before its dark
|
||||
* ones as in every other pair here. The nested `[data-contrast='high'] [data-theme='light']`
|
||||
* form keeps a light panel inside a high-contrast dark page on the level the page asked for
|
||||
* — the plain `[data-theme='light']` block would otherwise take it back to standard.
|
||||
*
|
||||
* @param array{contrast: array<string, mixed>, light: array<string, string>, dark: array<string, string>} $scheme
|
||||
*/
|
||||
protected function levels(array $scheme, string $prefix = ''): string
|
||||
{
|
||||
[$light, $dark] = $this->selectors($prefix);
|
||||
|
||||
$css = $this->blocks($light, $dark, $scheme);
|
||||
|
||||
foreach (array_keys(self::LEVELS) as $level) {
|
||||
[$light, $dark] = $this->selectors($prefix."[data-contrast='{$level}']");
|
||||
|
||||
/** @var array{light: array<string, string>, dark: array<string, string>} $roles */
|
||||
$roles = $scheme['contrast'][$level];
|
||||
|
||||
$css .= "\n".$this->blocks($light, $dark, $roles);
|
||||
}
|
||||
|
||||
return $css;
|
||||
}
|
||||
|
||||
/**
|
||||
* The light and the dark selectors of one block, under the given prefix. Without a prefix
|
||||
* the plain blocks stand on `:root` and on the attribute alone; with one, the prefix is on
|
||||
* <html> and the theme may be on <html> or on a panel inside it, so both forms are written.
|
||||
*
|
||||
* @return array{list<string>, list<string>}
|
||||
*/
|
||||
protected function selectors(string $prefix): array
|
||||
{
|
||||
if ($prefix === '') {
|
||||
return [[':root', "[data-theme='light']"], ["[data-theme='dark']"]];
|
||||
}
|
||||
|
||||
return [
|
||||
[$prefix, "{$prefix}[data-theme='light']", "{$prefix} [data-theme='light']"],
|
||||
["{$prefix}[data-theme='dark']", "{$prefix} [data-theme='dark']"],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* A light and a dark block of roles under the given selectors.
|
||||
*
|
||||
* @param list<string> $light
|
||||
* @param list<string> $dark
|
||||
* @param array{light: array<string, string>, dark: array<string, string>} $scheme
|
||||
*/
|
||||
protected function blocks(array $light, array $dark, array $scheme): string
|
||||
{
|
||||
$roles = fn (array $roles): string => collect($roles)
|
||||
->map(fn (string $hex, string $role): string => " --md-sys-color-{$role}: {$hex};")
|
||||
->implode("\n");
|
||||
|
||||
return implode(",\n", $light)." {\n color-scheme: light;\n\n".$roles($scheme['light'])."\n}\n\n"
|
||||
.implode(",\n", $dark)." {\n color-scheme: dark;\n\n".$roles($scheme['dark'])."\n}\n";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user