]*>/s', (string) test()->blade($blade), $matches);
return $matches[0] ?? '';
}
it('is an outlined assist chip, a button, by default', function () {
$html = (string) $this->blade('');
expect(chipTag('', 'button'))
->toContain('data-chip="assist"')
->toContain('type="button"')
->toContain('h-8')
->toContain('rounded-corner-sm')
->toContain('type-label-lg')
->toContain('border-outline-variant text-on-surface')
->toContain('ps-1.75 pe-3.75')
->and($html)
->toContain('me-2 size-4.5 text-primary')
->toContain('ms-2 size-4.5 text-primary')
->toContain('Add to calendar');
});
it('pads a chip without icons by 16px on both sides', function () {
expect(chipTag('', 'button'))->toContain('ps-3.75 pe-3.75');
});
it('falls back to an assist chip for a type it does not know', function () {
expect(chipTag('', 'button'))->toContain('data-chip="assist"');
});
it('draws an elevated chip on surface-container-low at elevation 1', function () {
expect(chipTag('', 'button'))
->toContain('border-transparent bg-surface-container-low text-on-surface shadow-elevation-1 hover:shadow-elevation-2')
->not->toContain('border-outline-variant');
});
it('greys a disabled chip, flat or elevated', function () {
expect(chipTag('', 'button'))
->toContain('disabled')
->toContain('border-on-surface/12 text-on-surface/38')
->and(chipTag('', 'button'))
->toContain('bg-on-surface/12 text-on-surface/38')
->and((string) $this->blade(''))
->not->toContain('text-primary');
});
it('links with wire:navigate, and a disabled link leaves the tab order', function () {
expect(chipTag('', 'a'))
->toContain('href="/directions"')
->toContain('wire:navigate')
->not->toContain('type=')
->and(chipTag('', 'a'))
->toContain('target="_blank"')
->toContain('rel="noopener"')
->not->toContain('wire:navigate')
->and(chipTag('', 'a'))
->toContain('aria-disabled="true"')
->toContain('tabindex="-1"')
->toContain('pointer-events-none');
});
it('draws a suggestion chip in on-surface-variant', function () {
expect(chipTag('', 'button'))
->toContain('data-chip="suggestion"')
->toContain('border-outline-variant text-on-surface-variant')
->and(chipTag('', 'button'))
->toContain('bg-surface-container-low text-on-surface-variant shadow-elevation-1');
});
it('attaches a plain tooltip', function () {
$html = (string) $this->blade('');
expect($html)
->toContain('popover="manual"')
->toContain('Share this file')
->toMatch('/
")
->toContain("id=\"{$describedBy[1]}\" class=\"mt-1 type-body-sm text-on-surface-variant\">Show only these")
->not->toContain('materialChipSet');
});
it('scrolls a chip set on one line with fading edges', function () {
expect((string) $this->blade(''))
->toContain('aria-label="Sort"')
->toContain('x-data="materialChipSet"')
->toContain('wire:ignore.self')
->toContain('overflow-x-auto')
->toContain('data-scroll-start:[--chip-fade-start:1.5rem]')
->not->toContain('flex-wrap');
});
it('binds filter chips to a Livewire array and shows the set\'s validation message in place of its hint', function () {
$component = new class extends Component
{
/** @var list */
public array $kinds = ['photos'];
public function save(): void
{
$this->validate(['kinds' => 'max:1'], ['kinds.max' => 'Pick one kind.']);
}
public function render(): string
{
return <<<'BLADE'
BLADE;
}
};
Livewire::test($component)
->assertSeeHtml('wire:model.live="kinds"')
->assertSeeHtml('value="photos" checked')
->assertDontSeeHtml('value="documents" checked')
->assertSee('Show only these')
->set('kinds', ['photos', 'documents'])
->assertSeeHtml('value="documents" checked')
->call('save')
->assertSee('Pick one kind.')
->assertDontSee('Show only these');
});