Files
livewire-material/resources/views/showcase/sections/icons.blade.php
T
Andreas Reinhold / reiniandClaude Opus 5 79ca9a28b4 Stop drawing each section's title twice on its page
Plan step 38 review: the frame's structural rule that kept a section's
own <h2> for screen readers (Tailwind's [&>section>h2]:sr-only before,
a showcase.css rule during the rewrite) was removed as dead weight
once every section had a real heading, so each page drew its title
twice, the <h1> and an identical headline under it. The <h2>s are
md-visually-hidden again, the frame's comment says why, and the
section page test asserts it. The Layout section's description said
"window size classes"; M3's term is breakpoints.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qwx5USif3wFFmxtHg5U1g9
2026-09-15 06:10:01 +02:00

56 lines
2.9 KiB
PHP

<x-livewire-material::stack
as="section"
id="icons"
gap="space300"
x-data="{
names: [],
query: '',
filled: false,
optical20: false,
async load() {
this.names = await (await fetch('{{ route('livewire-material.symbols', [], false) }}')).json();
},
get matches() {
const query = this.query.trim().toLowerCase().replaceAll(' ', '_');
return (query === '' ? this.names : this.names.filter((name) => name.includes(query))).slice(0, 120);
},
}"
x-intersect.once="load()"
>
<h2 class="md-visually-hidden">Icons</h2>
<p class="md-type-body-md md-ink-variant">
Every Material Symbol (Rounded, 400, grade 0) as <code>&lt;x-icon name="…" /&gt;</code>, outlined or <code>filled</code>,
drawn from the optical size 24 cut or for an icon 20px or smaller, where 24's strokes would look thin —
the 20 cut: <code>&lt;x-icon name="…" optical="20" /&gt;</code>.
</p>
<p class="md-type-body-md md-ink-variant" data-test="when-to-use">
<code>filled</code> means active or selected; <code>optical="20"</code> when an icon is drawn at 20px or less; one weight per group. An icon takes the size and colour of the text beside it. An icon-only control carries an accessible name; a decorative icon is hidden.
</p>
<x-livewire-material::row gap="space200" wrap align="center">
<x-livewire-material::input icon="search" type="search" x-model.debounce.150ms="query" placeholder="Search {{ number_format(count(\NoNameWeb\LivewireMaterial\Support\SvgFile::symbolNames())) }} symbols" full />
<x-livewire-material::checkbox label="Filled" x-model="filled" />
<x-livewire-material::checkbox label="Optical size 20" x-model="optical20" />
</x-livewire-material::row>
<x-livewire-material::grid as="ul" min-item="120px" gap="space100">
<template x-for="name in matches" x-bind:key="name">
<x-livewire-material::surface as="li" level="surface-container" corner="md" padding="space100">
<x-livewire-material::stack gap="space100" align="center">
<span
data-md-showcase-icon-mask
x-bind:data-md-showcase-icon-size="optical20 ? '20' : null"
x-bind:style="{
mask: `url('{{ rtrim(route('livewire-material.showcase', [], false), '/') }}/symbols/${filled ? 'filled' : 'outlined'}/${name}.svg${optical20 ? '?optical=20' : ''}') center / contain no-repeat`,
}"
></span>
<code class="md-type-label-sm md-ink-variant md-text-center" x-text="name"></code>
</x-livewire-material::stack>
</x-livewire-material::surface>
</template>
</x-livewire-material::grid>
</x-livewire-material::stack>