tests / lint (push) Successful in 1m0s
tests / feature (8.4) (push) Successful in 1m0s
tests / feature (8.5) (push) Successful in 1m1s
tests / browser (safari, webkit) (push) Successful in 1m59s
tests / browser (chrome, chromium) (push) Successful in 1m49s
tests / browser (firefox, firefox) (push) Successful in 1m54s
Colour, shape, type, elevation and motion as tokens and Tailwind utilities; `php artisan material:scheme`, which generates an app's colour roles with Google's material-color-utilities (spec 2025); the theme head script with light, dark and system and its Alpine store; Google Sans Flex; every Material Symbol (4,135, outlined and filled) drawn by <x-icon> without blade-icons; all 35 M3 Expressive shapes, ported from androidx, as <x-shape>; the x-figure directive; the Toasts concern; DesignGuard for applications' tests; and a showcase with every token, both themes side by side and an icon search. Colour utilities are `@theme inline`, so a section with its own data-theme repaints; without it they resolve once on :root. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V9NnLxnPp8vaaurb3Z1MFy
48 lines
2.2 KiB
PHP
48 lines
2.2 KiB
PHP
<section
|
|
id="icons"
|
|
class="scroll-mt-24 space-y-6"
|
|
x-data="{
|
|
names: {{ json_encode(\NoNameWeb\LivewireMaterial\Support\SvgFile::symbolNames()) }},
|
|
base: '{{ rtrim(route('livewire-material.showcase', [], false), '/') }}/symbols',
|
|
query: '',
|
|
filled: false,
|
|
get matches() {
|
|
const query = this.query.trim().toLowerCase().replaceAll(' ', '_');
|
|
|
|
return (query === '' ? this.names : this.names.filter((name) => name.includes(query))).slice(0, 120);
|
|
},
|
|
}"
|
|
>
|
|
<h2 class="type-headline-md">Icons</h2>
|
|
|
|
<p class="max-w-3xl type-body-md text-on-surface-variant">
|
|
Every Material Symbol (Rounded, 400, grade 0, 24px) as <code><x-icon name="…" /></code>, outlined or <code>filled</code>.
|
|
</p>
|
|
|
|
<div class="flex flex-wrap items-center gap-4">
|
|
<label class="flex min-w-72 flex-1 items-center gap-2 rounded-corner-xs border border-outline px-3 py-2 focus-within:outline-3 focus-within:outline-secondary">
|
|
<x-icon name="search" class="size-5 text-on-surface-variant" />
|
|
<input type="search" x-model.debounce.150ms="query" placeholder="Search {{ number_format(count(\NoNameWeb\LivewireMaterial\Support\SvgFile::symbolNames())) }} symbols" class="w-full bg-transparent type-body-lg outline-none" />
|
|
</label>
|
|
|
|
<label class="flex items-center gap-2 type-label-lg">
|
|
<input type="checkbox" x-model="filled" class="size-4 accent-primary" />
|
|
Filled
|
|
</label>
|
|
</div>
|
|
|
|
<ul class="grid grid-cols-[repeat(auto-fill,minmax(7.5rem,1fr))] gap-2">
|
|
<template x-for="name in matches" x-bind:key="name">
|
|
<li class="flex flex-col items-center gap-2 rounded-corner-md bg-surface-container p-3 text-center">
|
|
<span
|
|
class="size-6 bg-current"
|
|
x-bind:style="{
|
|
mask: `url('${base}/${filled ? 'filled' : 'outlined'}/${name}.svg') center / contain no-repeat`,
|
|
}"
|
|
></span>
|
|
<code class="w-full break-all type-label-sm text-on-surface-variant" x-text="name"></code>
|
|
</li>
|
|
</template>
|
|
</ul>
|
|
</section>
|