Add cards, lists, dialogs, sheets and the rest of M3's containment
tests / lint (push) Failing after 2m6s
tests / feature (8.4) (push) Successful in 1m3s
tests / feature (8.5) (push) Successful in 1m7s
tests / browser (safari, webkit) (push) Successful in 3m14s
tests / browser (chrome, chromium) (push) Successful in 2m9s
tests / browser (firefox, firefox) (push) Successful in 2m29s
tests / lint (push) Failing after 2m6s
tests / feature (8.4) (push) Successful in 1m3s
tests / feature (8.5) (push) Successful in 1m7s
tests / browser (safari, webkit) (push) Successful in 3m14s
tests / browser (chrome, chromium) (push) Successful in 2m9s
tests / browser (firefox, firefox) (push) Successful in 2m29s
<x-card> (filled, elevated, outlined), <x-list> and <x-list-item> (plain or M3 Expressive's segmented list), <x-divider>, <x-collapse> on <details>, <x-modal> on the native <dialog>, <x-drawer> as a side sheet or list-detail pane, and <x-bottom-sheet> with drag to dismiss. Dialogs and sheets bind to a Livewire flag or id and write back false or null on close, or use the surrounding Alpine scope. Rows open from anywhere on them through data-list-row and data-list-open. DesignGuard now also reports Blade directives written inside a component tag, where they do not compile. Browser test helpers wait for a complete document with Alpine and Livewire running: in Firefox, networkidle alone could return before a repeated visit had loaded. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V9NnLxnPp8vaaurb3Z1MFy
This commit is contained in:
co-authored by
Claude Opus 5
parent
e57063b0f4
commit
fef20a9178
@@ -102,6 +102,10 @@ class DesignGuard
|
||||
foreach ($this->iconNames($contents) as [$line, $name]) {
|
||||
$violations[] = "{$where}:{$line} unknown Material Symbol `{$name}`";
|
||||
}
|
||||
|
||||
foreach ($this->directivesInComponentTags($contents) as [$line, $directive]) {
|
||||
$violations[] = "{$where}:{$line} Blade directive `{$directive}` inside a component tag, where it does not compile";
|
||||
}
|
||||
}
|
||||
|
||||
foreach (explode("\n", $contents) as $index => $text) {
|
||||
@@ -250,6 +254,30 @@ class DesignGuard
|
||||
return $unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Blade compiles a component tag before its directives, so `<x-icon @class([...])>` or
|
||||
* `x-show="ok(@js($v))"` on a component reaches the browser as literal text. Use `:class`
|
||||
* and `{{ }}` there instead.
|
||||
*
|
||||
* @return list<array{0: int, 1: string}>
|
||||
*/
|
||||
protected function directivesInComponentTags(string $contents): array
|
||||
{
|
||||
preg_match_all('/<x-[\w.:-]+((?:[^>"]|"[^"]*")*)>/s', $contents, $tags, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
|
||||
|
||||
$found = [];
|
||||
|
||||
foreach ($tags as $tag) {
|
||||
preg_match_all('/(?<![\w@])@(class|style|js|json|if|unless|isset|foreach|disabled|checked|selected|readonly|required|entangle)\b/', $tag[1][0], $directives, PREG_OFFSET_CAPTURE);
|
||||
|
||||
foreach ($directives[0] as [$directive, $offset]) {
|
||||
$found[] = [substr_count(substr($contents, 0, $tag[1][1] + $offset), "\n") + 1, $directive];
|
||||
}
|
||||
}
|
||||
|
||||
return $found;
|
||||
}
|
||||
|
||||
protected function relative(string $path): string
|
||||
{
|
||||
$base = rtrim(base_path(), '/').'/';
|
||||
|
||||
Reference in New Issue
Block a user